Merge pull request #92 from Vgr255/various-adds

Huge overhaul to the system to use accounts.
This commit is contained in:
Ryan Schmidt 2014-12-09 20:39:25 -06:00
commit ca8fe1ae86
4 changed files with 869 additions and 307 deletions

View File

@ -30,3 +30,7 @@ botconfig.DEBUG_MODE = args.debug if not botconfig.DISABLE_DEBUG_MODE else False
botconfig.VERBOSE_MODE = args.verbose botconfig.VERBOSE_MODE = args.verbose
botconfig.DEFAULT_MODULE = "sabotage" if args.sabotage else "wolfgame" botconfig.DEFAULT_MODULE = "sabotage" if args.sabotage else "wolfgame"
# Initialize Database
var.init_db()

File diff suppressed because it is too large Load Diff

View File

@ -37,11 +37,14 @@ WARN_IDLE_TIME = 180
PM_WARN_IDLE_TIME = 240 PM_WARN_IDLE_TIME = 240
PART_GRACE_TIME = 30 PART_GRACE_TIME = 30
QUIT_GRACE_TIME = 30 QUIT_GRACE_TIME = 30
ACC_GRACE_TIME = 30
# controls how many people it does in one /msg; only works for messages that are the same # controls how many people it does in one /msg; only works for messages that are the same
MAX_PRIVMSG_TARGETS = 4 MAX_PRIVMSG_TARGETS = 4
LEAVE_STASIS_PENALTY = 1 LEAVE_STASIS_PENALTY = 1
IDLE_STASIS_PENALTY = 1 IDLE_STASIS_PENALTY = 1
PART_STASIS_PENALTY = 1 PART_STASIS_PENALTY = 1
ACC_STASIS_PENALTY = 1
LEAVE_ON_LOGOUT = False # If True, the bot will consider a NickServ logout as a quit
QUIET_DEAD_PLAYERS = False QUIET_DEAD_PLAYERS = False
GOAT_HERDER = True GOAT_HERDER = True
@ -104,10 +107,16 @@ TOTEM_CHANCES = { "death": ( 1/8 , 1/15 ),
GAME_MODES = {} GAME_MODES = {}
AWAY = ['services.', 'services.int'] # cloaks of people who are away. AWAY = ['services.', 'services.int'] # cloaks of people who are away.
AWAY_ACCS = [] # accounts of people who are away
SIMPLE_NOTIFY = [] # cloaks of people who !simple, who don't want detailed instructions SIMPLE_NOTIFY = [] # cloaks of people who !simple, who don't want detailed instructions
SIMPLE_NOTIFY_ACCS = [] # same as above, except accounts. takes precedence
PREFER_NOTICE = [] # cloaks of people who !notice, who want everything /notice'd PREFER_NOTICE = [] # cloaks of people who !notice, who want everything /notice'd
PREFER_NOTICE_ACCS = [] # Same as above, except accounts. takes precedence
ACCOUNTS_ONLY = False # If True, will use only accounts for everything
STASISED = defaultdict(int) STASISED = defaultdict(int)
STASISED_ACCS = defaultdict(int)
# TODO: move this to a game mode called "fixed" once we implement a way to randomize roles (and have that game mode be called "random") # TODO: move this to a game mode called "fixed" once we implement a way to randomize roles (and have that game mode be called "random")
DEFAULT_ROLE = "villager" DEFAULT_ROLE = "villager"
@ -198,35 +207,38 @@ LYNCH_MESSAGES_NO_REVEAL = ("The villagers, after much debate, finally decide on
import botconfig, fnmatch import botconfig, fnmatch
RULES = (botconfig.CHANNEL + " channel rules: http://wolf.xnrand.com/rules") RULES = (botconfig.CHANNEL + " channel rules: http://wolf.xnrand.com/rules")
botconfig.DENY = {} # These are set in here ... for now DENY = {}
botconfig.ALLOW = {} ALLOW = {}
botconfig.DENY_ACCOUNTS = {} DENY_ACCOUNTS = {}
botconfig.ALLOW_ACCOUNTS = {} ALLOW_ACCOUNTS = {}
# Other settings: # Other settings:
OPT_IN_PING = False # instead of !away/!back, users can opt-in to be pinged OPT_IN_PING = False # instead of !away/!back, users can opt-in to be pinged
PING_IN = [] # cloaks of users who have opted in for ping PING_IN = [] # cloaks of users who have opted in for ping
PING_IN_ACCS = [] # accounts of people who have opted in for ping
is_role = lambda plyr, rol: rol in ROLES and plyr in ROLES[rol] is_role = lambda plyr, rol: rol in ROLES and plyr in ROLES[rol]
def is_admin(nick): def is_admin(nick):
if nick not in USERS.keys(): if nick not in USERS.keys():
return False return False
if [ptn for ptn in botconfig.OWNERS+botconfig.ADMINS if fnmatch.fnmatch(USERS[nick]["cloak"].lower(), ptn.lower())]: if USERS[nick]["account"] != "*": # Check only account
return True
if [ptn for ptn in botconfig.OWNERS_ACCOUNTS+botconfig.ADMINS_ACCOUNTS if fnmatch.fnmatch(USERS[nick]["account"].lower(), ptn.lower())]: if [ptn for ptn in botconfig.OWNERS_ACCOUNTS+botconfig.ADMINS_ACCOUNTS if fnmatch.fnmatch(USERS[nick]["account"].lower(), ptn.lower())]:
return True return True
if [ptn for ptn in botconfig.OWNERS+botconfig.ADMINS if fnmatch.fnmatch(USERS[nick]["cloak"].lower(), ptn.lower())]:
return True
return False return False
def is_owner(nick): def is_owner(nick):
if nick not in USERS.keys(): if nick not in USERS.keys():
return False return False
if [ptn for ptn in botconfig.OWNERS if fnmatch.fnmatch(USERS[nick]["cloak"].lower(), ptn.lower())]: if USERS[nick]["account"] != "*":
return True
if [ptn for ptn in botconfig.OWNERS_ACCOUNTS if fnmatch.fnmatch(USERS[nick]["account"].lower(), ptn.lower())]: if [ptn for ptn in botconfig.OWNERS_ACCOUNTS if fnmatch.fnmatch(USERS[nick]["account"].lower(), ptn.lower())]:
return True return True
if [ptn for ptn in botconfig.OWNERS if fnmatch.fnmatch(USERS[nick]["cloak"].lower(), ptn.lower())]:
return True
return False return False
def plural(role): def plural(role):
@ -662,45 +674,86 @@ c = conn.cursor()
def init_db(): def init_db():
with conn: with conn:
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS away (nick TEXT)') # whoops, i mean cloak, not nick c.execute('CREATE TABLE IF NOT EXISTS away (nick TEXT)') # whoops, i mean cloak, not nick
c.execute('CREATE TABLE IF NOT EXISTS simple_role_notify (cloak TEXT)') # people who understand each role c.execute('CREATE TABLE IF NOT EXISTS away_accs (acc TEXT)') # accounts of people who are away
c.execute('CREATE TABLE IF NOT EXISTS prefer_notice (cloak TEXT)') # people who prefer /notice c.execute('CREATE TABLE IF NOT EXISTS simple_role_notify (cloak TEXT)') # people who understand each role (hostmasks - backup)
c.execute('CREATE TABLE IF NOT EXISTS stasised (cloak TEXT, games INTEGER, UNIQUE(cloak))') # stasised people c.execute('CREATE TABLE IF NOT EXISTS simple_role_accs (acc TEXT)') # people who understand each role (accounts - primary)
c.execute('CREATE TABLE IF NOT EXISTS denied (cloak TEXT, command TEXT, UNIQUE(cloak, command))') # botconfig.DENY c.execute('CREATE TABLE IF NOT EXISTS prefer_notice (cloak TEXT)') # people who prefer /notice (hostmasks - backup)
c.execute('CREATE TABLE IF NOT EXISTS allowed (cloak TEXT, command TEXT, UNIQUE(cloak, command))') # botconfig.ALLOW c.execute('CREATE TABLE IF NOT EXISTS prefer_notice_acc (acc TEXT)') # people who prefer /notice (accounts - primary)
c.execute('CREATE TABLE IF NOT EXISTS stasised (cloak TEXT, games INTEGER, UNIQUE(cloak))') # stasised people (cloaks)
c.execute('CREATE TABLE IF NOT EXISTS stasised_accs (acc TEXT, games INTEGER, UNIQUE(acc))') # stasised people (accounts - takes precedence)
c.execute('CREATE TABLE IF NOT EXISTS denied (cloak TEXT, command TEXT, UNIQUE(cloak, command))') # DENY
c.execute('CREATE TABLE IF NOT EXISTS denied_accs (acc TEXT, command TEXT, UNIQUE(acc, command))') # DENY_ACCOUNTS
c.execute('CREATE TABLE IF NOT EXISTS allowed (cloak TEXT, command TEXT, UNIQUE(cloak, command))') # ALLOW
c.execute('CREATE TABLE IF NOT EXISTS allowed_accs (acc TEXT, command TEXT, UNIQUE(acc, command))') # ALLOW_ACCOUNTS
c.execute('SELECT * FROM away') c.execute('SELECT * FROM away')
for row in c: for row in c:
AWAY.append(row[0]) AWAY.append(row[0])
c.execute('SELECT * FROM away_accs')
for row in c:
AWAY_ACCS.append(row[0])
c.execute('SELECT * FROM simple_role_notify') c.execute('SELECT * FROM simple_role_notify')
for row in c: for row in c:
SIMPLE_NOTIFY.append(row[0]) SIMPLE_NOTIFY.append(row[0])
c.execute('SELECT * FROM simple_role_accs')
for row in c:
SIMPLE_NOTIFY_ACCS.append(row[0])
c.execute('SELECT * FROM prefer_notice') c.execute('SELECT * FROM prefer_notice')
for row in c: for row in c:
PREFER_NOTICE.append(row[0]) PREFER_NOTICE.append(row[0])
c.execute('SELECT * FROM prefer_notice_acc')
for row in c:
PREFER_NOTICE_ACCS.append(row[0])
c.execute('SELECT * FROM stasised') c.execute('SELECT * FROM stasised')
for row in c: for row in c:
STASISED[row[0]] = row[1] STASISED[row[0]] = row[1]
c.execute('SELECT * FROM stasised_accs')
for row in c:
STASISED_ACCS[row[0]] = row[1]
c.execute('SELECT * FROM denied') c.execute('SELECT * FROM denied')
for row in c: for row in c:
if row[0] not in botconfig.DENY: if row[0] not in DENY:
botconfig.DENY[row[0]] = [] DENY[row[0]] = []
botconfig.DENY[row[0]].append(row[1]) DENY[row[0]].append(row[1])
c.execute('SELECT * FROM denied_accs')
for row in c:
if row[0] not in DENY_ACCOUNTS:
DENY_ACCOUNTS[row[0]] = []
DENY[row[0]].append(row[1])
c.execute('SELECT * FROM allowed') c.execute('SELECT * FROM allowed')
for row in c: for row in c:
if row[0] not in botconfig.ALLOW: if row[0] not in ALLOW:
botconfig.ALLOW[row[0]] = [] ALLOW[row[0]] = []
botconfig.ALLOW[row[0]].append(row[1]) ALLOW[row[0]].append(row[1])
c.execute('SELECT * FROM allowed_accs')
for row in c:
if row[0] not in ALLOW_ACCOUNTS:
ALLOW_ACCOUNTS[row[0]] = []
ALLOW_ACCOUNTS[row[0]].append(row[1])
# populate the roles table # populate the roles table
c.execute('DROP TABLE IF EXISTS roles') c.execute('DROP TABLE IF EXISTS roles')
@ -721,10 +774,15 @@ def init_db():
c.execute('CREATE TABLE IF NOT EXISTS ping (cloak text)') c.execute('CREATE TABLE IF NOT EXISTS ping (cloak text)')
c.execute('CREATE TABLE IF NOT EXISTS ping_accs (acc text)')
c.execute('SELECT * FROM ping') c.execute('SELECT * FROM ping')
for row in c: for row in c:
PING_IN.append(row[0]) PING_IN.append(row[0])
c.execute('SELECT * FROM ping_accs')
for row in c:
PING_IN_ACCS.append(row[0])
def remove_away(clk): def remove_away(clk):
with conn: with conn:
@ -734,6 +792,14 @@ def add_away(clk):
with conn: with conn:
c.execute('INSERT into away VALUES (?)', (clk,)) c.execute('INSERT into away VALUES (?)', (clk,))
def remove_away_acc(acc):
with conn:
c.execute('DELETE from away_accs where acc=?', (acc,))
def add_away_acc(acc):
with conn:
c.execute('INSERT into away_accs VALUES (?)', (acc,))
def remove_simple_rolemsg(clk): def remove_simple_rolemsg(clk):
with conn: with conn:
c.execute('DELETE from simple_role_notify where cloak=?', (clk,)) c.execute('DELETE from simple_role_notify where cloak=?', (clk,))
@ -742,6 +808,14 @@ def add_simple_rolemsg(clk):
with conn: with conn:
c.execute('INSERT into simple_role_notify VALUES (?)', (clk,)) c.execute('INSERT into simple_role_notify VALUES (?)', (clk,))
def remove_simple_rolemsg_acc(acc):
with conn:
c.execute('DELETE from simple_role_accs where acc=?', (acc,))
def add_simple_rolemsg_acc(acc):
with conn:
c.execute('INSERT into simple_role_accs VALUES (?)', (acc,))
def remove_prefer_notice(clk): def remove_prefer_notice(clk):
with conn: with conn:
c.execute('DELETE from prefer_notice where cloak=?', (clk,)) c.execute('DELETE from prefer_notice where cloak=?', (clk,))
@ -750,6 +824,14 @@ def add_prefer_notice(clk):
with conn: with conn:
c.execute('INSERT into prefer_notice VALUES (?)', (clk,)) c.execute('INSERT into prefer_notice VALUES (?)', (clk,))
def remove_prefer_notice_acc(acc):
with conn:
c.execute('DELETE from prefer_notice_acc where acc=?', (acc,))
def add_prefer_notice_acc(acc):
with conn:
c.execute('INSERT into prefer_notice_acc VALUES (?)', (acc,))
def remove_ping(clk): def remove_ping(clk):
with conn: with conn:
c.execute('DELETE from ping where cloak=?', (clk,)) c.execute('DELETE from ping where cloak=?', (clk,))
@ -758,6 +840,14 @@ def add_ping(clk):
with conn: with conn:
c.execute('INSERT into ping VALUES (?)', (clk,)) c.execute('INSERT into ping VALUES (?)', (clk,))
def remove_ping_acc(acc):
with conn:
c.execute('DELETE from ping_accs where acc=?', (acc,))
def add_ping_acc(acc):
with conn:
c.execute('INSSERT into ping_accs VALUES (?)', (acc,))
def set_stasis(clk, games): def set_stasis(clk, games):
with conn: with conn:
if games <= 0: if games <= 0:
@ -765,6 +855,13 @@ def set_stasis(clk, games):
else: else:
c.execute('INSERT OR REPLACE INTO stasised VALUES (?,?)', (clk, games)) c.execute('INSERT OR REPLACE INTO stasised VALUES (?,?)', (clk, games))
def set_stasis_acc(acc, games):
with conn:
if games <= 0:
c.execute('DELETE FROM stasised_accs WHERE acc=?', (acc,))
else:
c.execute('INSERT OR REPLACE INTO stasised_accs VALUES (?,?)', (acc, games))
def add_deny(clk, command): def add_deny(clk, command):
with conn: with conn:
c.execute('INSERT OR IGNORE INTO denied VALUES (?,?)', (clk, command)) c.execute('INSERT OR IGNORE INTO denied VALUES (?,?)', (clk, command))
@ -773,6 +870,14 @@ def remove_deny(clk, command):
with conn: with conn:
c.execute('DELETE FROM denied WHERE cloak=? AND command=?', (clk, command)) c.execute('DELETE FROM denied WHERE cloak=? AND command=?', (clk, command))
def add_deny_acc(acc, command):
with conn:
c.execute('INSERT OR IGNORE INTO denied_accs VALUES (?,?)', (acc, command))
def remove_deny_acc(acc, command):
with conn:
c.execute('DELETE FROM denied_accs WHERE acc=? AND command=?', (acc, command))
def add_allow(clk, command): def add_allow(clk, command):
with conn: with conn:
c.execute('INSERT OR IGNORE INTO allowed VALUES (?,?)', (clk, command)) c.execute('INSERT OR IGNORE INTO allowed VALUES (?,?)', (clk, command))
@ -781,6 +886,13 @@ def remove_allow(clk, command):
with conn: with conn:
c.execute('DELETE FROM allowed WHERE cloak=? AND command=?', (clk, command)) c.execute('DELETE FROM allowed WHERE cloak=? AND command=?', (clk, command))
def add_allow_acc(acc, command):
with conn:
c.execute('INSERT OR IGNORE INTO allowed_accs VALUES (?,?)', (acc, command))
def remove_allow_acc(acc, command):
with conn:
c.execute('DELETE FROM allowed_accs WHERE acc=? AND command=?', (acc, command))
def update_role_stats(acc, role, won, iwon): def update_role_stats(acc, role, won, iwon):
with conn: with conn:

View File

@ -45,36 +45,36 @@ def generate(fdict, permissions=True, **kwargs):
break break
if not allowed: if not allowed:
return return
if nick in var.USERS.keys(): if nick in var.USERS.keys() and var.USERS[nick]["account"] != "*":
acc = var.USERS[nick]["account"] acc = var.USERS[nick]["account"]
else: else:
acc = None acc = None
if "" in s: if "" in s:
return f(*largs) return f(*largs)
if cloak:
for pattern in botconfig.DENY.keys():
if fnmatch.fnmatch(cloak.lower(), pattern.lower()):
for cmdname in s:
if cmdname in botconfig.DENY[pattern]:
largs[0].notice(nick, "You do not have permission to use that command.")
return
for pattern in botconfig.ALLOW.keys():
if fnmatch.fnmatch(cloak.lower(), pattern.lower()):
for cmdname in s:
if cmdname in botconfig.ALLOW[pattern]:
return f(*largs) # no questions
if acc: if acc:
for pattern in botconfig.DENY_ACCOUNTS.keys(): for pattern in var.DENY_ACCOUNTS.keys():
if fnmatch.fnmatch(acc.lower(), pattern.lower()): if fnmatch.fnmatch(acc.lower(), pattern.lower()):
for cmdname in s: for cmdname in s:
if cmdname in botconfig.DENY_ACCOUNTS[pattern]: if cmdname in var.DENY_ACCOUNTS[pattern]:
largs[0].notice(nick, "You do not have permission to use that command.") largs[0].notice(nick, "You do not have permission to use that command.")
return return
for pattern in botconfig.ALLOW_ACCOUNTS.keys(): for pattern in var.ALLOW_ACCOUNTS.keys():
if fnmatch.fnmatch(acc.lower(), pattern.lower()): if fnmatch.fnmatch(acc.lower(), pattern.lower()):
for cmdname in s: for cmdname in s:
if cmdname in botconfig.ALLOW_ACCOUNTS[pattern]: if cmdname in var.ALLOW_ACCOUNTS[pattern]:
return f(*largs) return f(*largs)
if not var.ACCOUNTS_ONLY and cloak:
for pattern in var.DENY.keys():
if fnmatch.fnmatch(cloak.lower(), pattern.lower()):
for cmdname in s:
if cmdname in var.DENY[pattern]:
largs[0].notice(nick, "You do not have permission to use that command.")
return
for pattern in var.ALLOW.keys():
if fnmatch.fnmatch(cloak.lower(), pattern.lower()):
for cmdname in s:
if cmdname in var.ALLOW[pattern]:
return f(*largs) # no questions
if owner_only: if owner_only:
if var.is_owner(nick): if var.is_owner(nick):
return f(*largs) return f(*largs)