diff --git a/README.md b/README.md index 2e63c45..9b74303 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,16 @@ -Dependencies ------------- +This is the game bot for ##werewolf on freenode. It's a continutation of +[lycanthrope][1], which has become inactive. We have an active community, and +we'd love for you to join us! -- Python 3.2 or higher +# Running the bot -Configuration -------------- +If you wish to run your own copy of the bot, all you need is Python 3.2 or a +newer version. Copy `botconfig.py.example` to `botconfig.py` and modify the settings as needed. If desired, edit `settings/wolfgame.py` to modify game settings. -Starting the bot ----------------- +To start the bot, run `./wolfbot.py`. You can optionally use `--debug` or +`--verbose`. -To start the bot, you can simply execute `wolfbot.py`: - - $ ./wolfbot.py - -Debug mode can be enabled with the `--debug` argument: - - $ ./wolfbot.py --debug - -Verbose logging can be enabled with the `--verbose` argument: - - $ ./wolfbot.py --verbose - -Playing the game ----------------- - -You can find us in ``##werewolf`` on [freenode][1] [(webchat)][2]. The -bot is running there and we have an active community. We'd love for you to join -us! - -[1]: https://freenode.net/ -[2]: http://webchat.freenode.net?channels=%23%23werewolf +[1]: https://github.com/LycanthropeTheGreat/lycanthrope diff --git a/modules/common.py b/modules/common.py index fdc825f..310900a 100644 --- a/modules/common.py +++ b/modules/common.py @@ -113,9 +113,13 @@ def connect_callback(cli): prepare_stuff = hook("endofmotd", hookid=294)(prepare_stuff) def mustregain(cli, *blah): + if not botconfig.PASS: + return cli.ns_regain() def mustrelease(cli, *rest): + if not botconfig.PASS: + return # prevents the bot from trying to release without a password cli.ns_release() cli.nick(botconfig.NICK) diff --git a/modules/wolfgame.py b/modules/wolfgame.py index 1e3cf7d..0a05506 100644 --- a/modules/wolfgame.py +++ b/modules/wolfgame.py @@ -949,41 +949,43 @@ def chk_decision(cli, force = ""): break - -@cmd("votes") +@cmd('votes') def show_votes(cli, nick, chan, rest): """Displays the voting statistics.""" if var.PHASE in ("none", "join"): cli.notice(nick, "No game is currently running.") return - if var.PHASE != "day": + + if var.PHASE != 'day': cli.notice(nick, "Voting is only during the day.") return - if (var.LAST_VOTES and - var.LAST_VOTES + timedelta(seconds=var.VOTES_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_VOTES and var.VOTES_RATE_LIMIT and + var.LAST_VOTES + timedelta(seconds=var.VOTES_RATE_LIMIT) > + datetime.now()): + cli.notice(nick, ('This command is rate-limited. Please wait a while ' + 'before using it again.')) return - + pl = var.list_players() - if nick in pl: + if chan != nick and nick in pl: var.LAST_VOTES = datetime.now() if not var.VOTES.values(): - msg = nick+": No votes yet." - if nick in pl: - var.LAST_VOTES = None # reset - else: - votelist = ["{0}: {1} ({2})".format(votee, - len(var.VOTES[votee]), - " ".join(var.VOTES[votee])) - for votee in var.VOTES.keys()] - msg = "{0}: {1}".format(nick, ", ".join(votelist)) + msg = nick+ ': No votes yet.' - if nick in pl: + if nick in pl: + var.LAST_VOTES = None # reset + else: + votelist = ['{}: {} ({})'.format(votee, + len(var.VOTES[votee]), + ' '.join(var.VOTES[votee])) + for votee in var.VOTES.keys()] + msg = '{}: {}'.format(nick, ', '.join(votelist)) + + if chan == nick or nick in pl: cli.msg(chan, msg) else: cli.notice(nick, msg) @@ -991,15 +993,20 @@ def show_votes(cli, nick, chan, rest): pl = var.list_players() avail = len(pl) - len(var.WOUNDED) - len(var.ASLEEP) votesneeded = avail // 2 + 1 - the_message = ("{0}: \u0002{1}\u0002 players, \u0002{2}\u0002 votes "+ - "required to lynch, \u0002{3}\u0002 players available " + - "to vote.").format(nick, len(pl), votesneeded, avail) - if nick in pl: + the_message = ('{}: \u0002{}\u0002 players, \u0002{}\u0002 votes ' + 'required to lynch, \u0002{}\u0002 players available to ' + 'vote.').format(nick, len(pl), votesneeded, avail) + + if chan == nick or nick in pl: cli.msg(chan, the_message) else: cli.notice(nick, the_message) +@pmcmd('votes') +def show_votes_pm(cli, nick, rest): + show_votes(cli, nick, nick, rest) + def chk_traitor(cli): wcl = copy.copy(var.ROLES["wolf cub"]) @@ -5432,18 +5439,23 @@ if botconfig.DEBUG_MODE or botconfig.ALLOWED_NORMAL_MODE_COMMANDS: @cmd("fgame", admin_only=True) - def game(cli, nick, chan, rest): + def fgame(cli, nick, chan, rest): pl = var.list_players() - if var.PHASE == "none": - cli.notice(nick, "No game is currently running.") + + if var.PHASE == 'none': + cli.notice(nick, 'No game is currently running.') return - if var.PHASE != "join": - cli.notice(nick, "Werewolf is already in play.") + + if var.PHASE != 'join': + cli.notice(nick, 'Werewolf is already in play.') return - if nick not in pl: - cli.notice(nick, "You're currently not playing.") + + if nick not in pl and nick not in botconfig.ADMINS + botconfig.OWNERS: + cli.notice(nick, 'You\'re currently not playing.') return + rest = rest.strip().lower() + if rest: if cgamemode(cli, rest): cli.msg(chan, ("\u0002{0}\u0002 has changed the "+ @@ -5451,14 +5463,16 @@ if botconfig.DEBUG_MODE or botconfig.ALLOWED_NORMAL_MODE_COMMANDS: def fgame_help(args = ""): args = args.strip() + if not args: - return "Available game mode setters: "+ ", ".join(var.GAME_MODES.keys()) + return 'Available game mode setters: ' + ', '.join(var.GAME_MODES.keys()) elif args in var.GAME_MODES.keys(): return var.GAME_MODES[args].__doc__ else: - return "Game mode setter {0} not found.".format(args) + return 'Game mode setter \u0002{}\u0002 not found.'.format(args) - game.__doc__ = fgame_help + + fgame.__doc__ = fgame_help # DO NOT MAKE THIS A PMCOMMAND ALSO