From ae64979e344923e60235a85fa1b181e459d66fe2 Mon Sep 17 00:00:00 2001 From: Transfusion Date: Tue, 15 Jul 2014 21:23:41 +0800 Subject: [PATCH 01/15] Enable CTCP PING as per issue #37 --- modules/wolfgame.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index d6c1044..7a06f6f 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -2220,7 +2220,10 @@ def relay(cli, nick, rest): if (guy in var.PLAYERS and var.PLAYERS[guy]["cloak"] in var.SIMPLE_NOTIFY)], "\02{0}\02 says: {1}".format(nick, rest), True) - +@pmcmd("") +def ctcp_ping(cli, nick, msg): + if msg.startswith("\x01PING"): + cli.notice(nick, msg) def transition_night(cli): if var.PHASE == "night": @@ -2637,7 +2640,6 @@ def on_error(cli, pfx, msg): elif msg.startswith("Closing Link:"): raise SystemExit - @cmd("fstasis", admin_only=True) def fstasis(cli, nick, chan, rest): """Admin command for removing or setting stasis penalties.""" From 96afc582f475d0bba11e0f078876e69e0ba32666 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 20:34:46 +0200 Subject: [PATCH 02/15] Allow passing host to fstasis instead of just nick --- modules/wolfgame.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index 7a06f6f..ecc5a89 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -2649,11 +2649,14 @@ def fstasis(cli, nick, chan, rest): lusers = {k.lower(): v for k, v in var.USERS.items()} user = data[0].lower() - if user not in lusers: - pm(cli, nick, "Sorry, {0} cannot be found.".format(data[0])) - return + #if user not in lusers: + # pm(cli, nick, "Sorry, {0} cannot be found.".format(data[0])) + # return - cloak = lusers[user]['cloak'] + if user in lusers: + cloak = lusers[user]['cloak'] + else: + cloak = user if len(data) == 1: if cloak in var.STASISED: From 748e0d95dd1fbb82be7bdabae07b9c51406e53c1 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 20:52:50 +0200 Subject: [PATCH 03/15] Add total games to !pstats --- settings/wolfgame.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/settings/wolfgame.py b/settings/wolfgame.py index cce2d6c..6c0cdea 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -330,9 +330,11 @@ def get_player_totals(acc): row = c.fetchone() if row: role_totals.append("\u0002{0}\u0002: {1}".format(role, *row)) - return "\u0002{0}\u0002's totals | {1}".format(player[0], ", ".join(role_totals)) + c.execute("SELECT totalgames from rolestats WHERE player=? COLLATE NOCASE", (acc,)) + row = c.fetchone() + return "\u0002{0}\u0002's totals | {1} (total: \u0002{2}\u0002)".format(player[0], ", ".join(role_totals), row) else: - return "{0} has not played any games.".format(acc) + return "\u0002{0}\u0002 has not played any games.".format(acc) def get_game_stats(size): with conn: From ab4bd8c7997e4773cf459e23dfca9fbc7efe200e Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 20:59:11 +0200 Subject: [PATCH 04/15] Fix previous commit --- settings/wolfgame.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings/wolfgame.py b/settings/wolfgame.py index 6c0cdea..cc9c21e 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -330,9 +330,9 @@ def get_player_totals(acc): row = c.fetchone() if row: role_totals.append("\u0002{0}\u0002: {1}".format(role, *row)) - c.execute("SELECT totalgames from rolestats WHERE player=? COLLATE NOCASE", (acc,)) + c.execute("SELECT SUM(totalgames) from rolestats WHERE player=? COLLATE NOCASE", (acc,)) row = c.fetchone() - return "\u0002{0}\u0002's totals | {1} (total: \u0002{2}\u0002)".format(player[0], ", ".join(role_totals), row) + return "\u0002{0}\u0002's totals | {1} (total: \u0002{2}\u0002)".format(player[0], ", ".join(role_totals), *row) else: return "\u0002{0}\u0002 has not played any games.".format(acc) From e40cc817a3dced5e6188d0a6050e13df1a71a84e Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 21:00:53 +0200 Subject: [PATCH 05/15] Remove bold --- settings/wolfgame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/wolfgame.py b/settings/wolfgame.py index cc9c21e..2c15510 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -332,7 +332,7 @@ def get_player_totals(acc): role_totals.append("\u0002{0}\u0002: {1}".format(role, *row)) c.execute("SELECT SUM(totalgames) from rolestats WHERE player=? COLLATE NOCASE", (acc,)) row = c.fetchone() - return "\u0002{0}\u0002's totals | {1} (total: \u0002{2}\u0002)".format(player[0], ", ".join(role_totals), *row) + return "\u0002{0}\u0002's totals | {1} (total: {2})".format(player[0], ", ".join(role_totals), *row) else: return "\u0002{0}\u0002 has not played any games.".format(acc) From f3c682861110d37a16e39ca0e0bf71618299fa10 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 21:03:31 +0200 Subject: [PATCH 06/15] Improve !pstats output --- settings/wolfgame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/wolfgame.py b/settings/wolfgame.py index 2c15510..4a2d136 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -332,7 +332,7 @@ def get_player_totals(acc): role_totals.append("\u0002{0}\u0002: {1}".format(role, *row)) c.execute("SELECT SUM(totalgames) from rolestats WHERE player=? COLLATE NOCASE", (acc,)) row = c.fetchone() - return "\u0002{0}\u0002's totals | {1} (total: {2})".format(player[0], ", ".join(role_totals), *row) + return "\u0002{0}\u0002's totals | \u0002{1}\u0002 games | {2}".format(player[0], *row ", ".join(role_totals)) else: return "\u0002{0}\u0002 has not played any games.".format(acc) From 2d6f212bb3396d4b58df402b6ae4d71439cdd07e Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 21:06:43 +0200 Subject: [PATCH 07/15] Fix previous commit --- settings/wolfgame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/wolfgame.py b/settings/wolfgame.py index 4a2d136..1189de3 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -332,7 +332,7 @@ def get_player_totals(acc): role_totals.append("\u0002{0}\u0002: {1}".format(role, *row)) c.execute("SELECT SUM(totalgames) from rolestats WHERE player=? COLLATE NOCASE", (acc,)) row = c.fetchone() - return "\u0002{0}\u0002's totals | \u0002{1}\u0002 games | {2}".format(player[0], *row ", ".join(role_totals)) + return "\u0002{0}\u0002's totals | \u0002{1}\u0002 games | {2}".format(player[0], *row, ", ".join(role_totals)) else: return "\u0002{0}\u0002 has not played any games.".format(acc) From bb3d505637865885d289121aa4ad1f33ab0abb32 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 21:07:51 +0200 Subject: [PATCH 08/15] Fix previous commit (again) --- settings/wolfgame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/wolfgame.py b/settings/wolfgame.py index 1189de3..91ee071 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -332,7 +332,7 @@ def get_player_totals(acc): role_totals.append("\u0002{0}\u0002: {1}".format(role, *row)) c.execute("SELECT SUM(totalgames) from rolestats WHERE player=? COLLATE NOCASE", (acc,)) row = c.fetchone() - return "\u0002{0}\u0002's totals | \u0002{1}\u0002 games | {2}".format(player[0], *row, ", ".join(role_totals)) + return "\u0002{0}\u0002's totals | \u0002{1}\u0002 games | {2}".format(player[0], row[0], ", ".join(role_totals)) else: return "\u0002{0}\u0002 has not played any games.".format(acc) From af253593c3c6c702f57d9d0b2e313aace357671e Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 22:48:22 +0200 Subject: [PATCH 09/15] !pstats: fix total game count Cursed and gunner are secondary roles so they shouldn't be counted. --- settings/wolfgame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/wolfgame.py b/settings/wolfgame.py index 91ee071..f859c1d 100644 --- a/settings/wolfgame.py +++ b/settings/wolfgame.py @@ -330,7 +330,7 @@ def get_player_totals(acc): row = c.fetchone() if row: role_totals.append("\u0002{0}\u0002: {1}".format(role, *row)) - c.execute("SELECT SUM(totalgames) from rolestats WHERE player=? COLLATE NOCASE", (acc,)) + c.execute("SELECT SUM(totalgames) from rolestats WHERE player=? COLLATE NOCASE AND role!='cursed villager' AND role!='gunner'", (acc,)) row = c.fetchone() return "\u0002{0}\u0002's totals | \u0002{1}\u0002 games | {2}".format(player[0], row[0], ", ".join(role_totals)) else: From cce7c34cafd60bc6e1c50e2cac4c86c5310e4f3b Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 22:59:08 +0200 Subject: [PATCH 10/15] Disable !join until opped and try to regain op --- modules/wolfgame.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index ecc5a89..5070d55 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -145,8 +145,13 @@ def connect_callback(cli): cli.mode(botconfig.CHANNEL, "q") # unquiet all cli.mode(botconfig.CHANNEL, "-m") # remove -m mode from channel + + var.OPPED = True elif modeaction == "+o" and target == botconfig.NICK and var.PHASE != "none": decorators.unhook(HOOKS, 294) # forget about it + elif modeaction == "-o" and target == botconfig.NICK: + var.OPPED = False + cli.msg("ChanServ", "op " + botconfig.CHANNEL) cli.who(botconfig.CHANNEL, "%nuhaf") @@ -417,6 +422,10 @@ def join(cli, nick, chann_, rest): nick, _, __, cloak = parse_nick(nick) + if not var.OPPED: + cli.notice(nick, "Sorry, I'm not opped in {0}.".format(chan)) + return + try: cloak = var.USERS[nick]['cloak'] if cloak is not None and cloak in var.STASISED: @@ -1167,6 +1176,8 @@ def on_join(cli, raw_nick, chan, acc="*", rname=""): break if nick in var.DCED_PLAYERS.keys(): var.PLAYERS[nick] = var.DCED_PLAYERS.pop(nick) + if nick == "ChanServ" and not var.OPPED: + cli.msg("ChanServ", "op " + chan) @cmd("goat") def goat(cli, nick, chan, rest): From 53546b7a91a0717fcad85d96c58ff77126d41eca Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 23:04:23 +0200 Subject: [PATCH 11/15] Fix previous commit (maybe) --- modules/wolfgame.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index 5070d55..d25aa2b 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -92,6 +92,8 @@ var.LOGGER = WolfgameLogger(var.LOG_FILENAME, var.BARE_LOG_FILENAME) var.JOINED_THIS_GAME = [] # keeps track of who already joined this game at least once (cloaks) +var.OPPED = False # Keeps track of whether the bot is opped + if botconfig.DEBUG_MODE: var.NIGHT_TIME_LIMIT = 0 # 90 var.NIGHT_TIME_WARN = 0 @@ -1176,6 +1178,8 @@ def on_join(cli, raw_nick, chan, acc="*", rname=""): break if nick in var.DCED_PLAYERS.keys(): var.PLAYERS[nick] = var.DCED_PLAYERS.pop(nick) + if nick == botconfig.NICK: + var.OPPED = False if nick == "ChanServ" and not var.OPPED: cli.msg("ChanServ", "op " + chan) From 6378c9e1a9a356e8364616b2059ed177e0d5c75c Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Tue, 15 Jul 2014 23:17:22 +0200 Subject: [PATCH 12/15] Fix it for real now --- modules/wolfgame.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index d25aa2b..0c60eb1 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -136,21 +136,18 @@ def connect_callback(cli): @hook("mode", hookid=294) def on_give_me_ops(cli, blah, blahh, modeaction, target="", *other): - if modeaction == "+o" and target == botconfig.NICK and var.PHASE == "none": - - @hook("quietlistend", 294) - def on_quietlist_end(cli, svr, nick, chan, *etc): - if chan == botconfig.CHANNEL: - decorators.unhook(HOOKS, 294) - mass_mode(cli, cmodes) - - cli.mode(botconfig.CHANNEL, "q") # unquiet all - - cli.mode(botconfig.CHANNEL, "-m") # remove -m mode from channel - + if modeaction == "+o" and target == botconfig.NICK: var.OPPED = True - elif modeaction == "+o" and target == botconfig.NICK and var.PHASE != "none": - decorators.unhook(HOOKS, 294) # forget about it + + if var.PHASE == "none": + @hook("quietlistend", 294) + def on_quietlist_end(cli, svr, nick, chan, *etc): + if chan == botconfig.CHANNEL: + mass_mode(cli, cmodes) + + cli.mode(botconfig.CHANNEL, "q") # unquiet all + + cli.mode(botconfig.CHANNEL, "-m") # remove -m mode from channel elif modeaction == "-o" and target == botconfig.NICK: var.OPPED = False cli.msg("ChanServ", "op " + botconfig.CHANNEL) From 730f9a3b18812c87070aa8e372d4261c26fd76dc Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Wed, 16 Jul 2014 17:22:19 +0200 Subject: [PATCH 13/15] Revert "Add !q as an alias for !quit" This reverts commit 93546dee9d02317f8f1748a3d257eb628e04b3c4. --- modules/wolfgame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index 0c60eb1..ebd7aa5 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -1355,7 +1355,7 @@ hook("quit")(lambda cli, nick, *rest: leave(cli, "quit", nick, rest[0])) hook("kick")(lambda cli, nick, *rest: leave(cli, "kick", rest[1])) -@cmd("quit", "leave", "q") +@cmd("quit", "leave") def leave_game(cli, nick, chan, rest): """Quits the game.""" if var.PHASE == "none": From 304f16ce7ff5bc04e7ba2765e244ea8407aa74ff Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Thu, 17 Jul 2014 16:03:33 +0200 Subject: [PATCH 14/15] Fix !admins in PM --- modules/wolfgame.py | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index ebd7aa5..5cefae6 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -2874,53 +2874,56 @@ def is_admin(cloak): return bool([ptn for ptn in botconfig.OWNERS+botconfig.ADMINS if fnmatch.fnmatch(cloak.lower(), ptn.lower())]) -@cmd("admins", "ops") +@cmd('admins', 'ops') def show_admins(cli, nick, chan, rest): """Pings the admins that are available.""" + admins = [] pl = var.list_players() - if (var.LAST_ADMINS and - var.LAST_ADMINS + timedelta(seconds=var.ADMINS_RATE_LIMIT) > datetime.now()): - cli.notice(nick, ("This command is rate-limited. " + - "Please wait a while before using it again.")) + if (chan != nick and var.LAST_ADMINS and var.LAST_ADMINS + + timedelta(seconds=var.ADMINS_RATE_LIMIT) > datetime.now()): + cli.notice(nick, ('This command is rate-limited. Please wait a while ' + 'before using it again.')) return - if not (var.PHASE in ("day", "night") and nick not in pl): + if chan != nick or (var.PHASE in ('day', 'night') or nick in pl): var.LAST_ADMINS = datetime.now() if var.ADMIN_PINGING: return + var.ADMIN_PINGING = True - @hook("whoreply", hookid = 4) - def on_whoreply(cli, server, dunno, chan, dunno1, - cloak, dunno3, user, status, dunno4): + @hook('whoreply', hookid=4) + def on_whoreply(cli, server, _, chan, __, cloak, ___, user, status, ____): if not var.ADMIN_PINGING: return - if (is_admin(cloak) and 'G' not in status and - user != botconfig.NICK): + + if is_admin(cloak) and 'G' not in status and user != botconfig.NICK: admins.append(user) - @hook("endofwho", hookid = 4) + @hook('endofwho', hookid=4) def show(*args): if not var.ADMIN_PINGING: return + admins.sort(key=lambda x: x.lower()) if chan == nick: - pm(cli, nick, "Available admins: "+" ".join(admins)) - elif var.PHASE in ("day", "night") and nick not in pl: - cli.notice(nick, "Available admins: "+" ".join(admins)) + pm(cli, nick, 'Available admins: {}'.format(', '.join(admins))) + elif var.PHASE in ('day', 'night') and nick not in pl: + cli.notice(nick, 'Available admins: {}'.format(', '.join(admins))) else: - cli.msg(chan, "Available admins: "+" ".join(admins)) + cli.msg(chan, 'Available admins: {}'.format(', '.join(admins))) decorators.unhook(HOOKS, 4) var.ADMIN_PINGING = False - cli.who(chan) + cli.who(botconfig.CHANNEL) -@pmcmd("admins", "ops") + +@pmcmd('admins', 'ops') def show_admins_pm(cli, nick, rest): show_admins(cli, nick, nick, rest) From b93bf38894963440ab8534fb635012741f41e386 Mon Sep 17 00:00:00 2001 From: nyuszika7h Date: Thu, 17 Jul 2014 22:12:47 +0200 Subject: [PATCH 15/15] Prettify !revealroles --- modules/wolfgame.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index 5cefae6..2a4e047 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -3326,17 +3326,22 @@ if botconfig.DEBUG_MODE or botconfig.ALLOWED_NORMAL_MODE_COMMANDS: except Exception as e: cli.msg(chan, str(type(e))+":"+str(e)) - - @cmd("revealroles", admin_only=True) - def revroles(cli, nick, chan, rest): - if var.PHASE != "none": - cli.msg(chan, str(var.ROLES)) - if var.PHASE in ('night','day'): - cli.msg(chan, "Cursed: "+str(var.CURSED)) - cli.msg(chan, "Gunners: "+str(list(var.GUNNERS.keys()))) - - + @cmd('revealroles', admin_only=True) + def revealroles(cli, nick, chan, rest): + if var.PHASE == 'none': + cli.notice(nick, 'No game is currently running.') + return + + s = ' | '.join('\u0002{}\u0002: {}'.format(role,', '.join(players)) + for (role, players) in sorted(var.ROLES.items()) if players) + + if chan == nick: + pm(cli, nick, s) + else: + cli.msg(chan, s) + + @cmd("fgame", admin_only=True) def game(cli, nick, chan, rest): pl = var.list_players()