diff --git a/src/functions.py b/src/functions.py index 8bd6854..99a8df3 100644 --- a/src/functions.py +++ b/src/functions.py @@ -3,7 +3,11 @@ from src.events import Event from src import settings as var from src import users -__all__ = ["get_players", "get_all_players", "get_participants", "get_target", "get_main_role", "get_all_roles"] +__all__ = [ + "get_players", "get_all_players", "get_participants", + "get_target", + "get_main_role", "get_all_roles", "get_reveal_role" + ] def get_players(roles=None, *, mainroles=None): if mainroles is None: @@ -77,4 +81,28 @@ def get_main_role(user): def get_all_roles(user): return {role for role, users in var.ROLES.items() if user in users} +def get_reveal_role(user): + # FIXME: when amnesiac and clone are split, move this into an event + if var.HIDDEN_AMNESIAC and user in var.ORIGINAL_ROLES["amnesiac"]: + role = "amnesiac" + elif var.HIDDEN_CLONE and user in var.ORIGINAL_ROLES["clone"]: + role = "clone" + else: + role = get_main_role(user) + + evt = Event("get_reveal_role", {"role": role}) + evt.dispatch(var, user) + role = evt.data["role"] + + if var.ROLE_REVEAL != "team": + return role + + if role in var.WOLFTEAM_ROLES: + return "wolfteam player" + elif role in var.TRUE_NEUTRAL_ROLES: + return "neutral player" + else: + return "village member" + + # vim: set sw=4 expandtab: diff --git a/src/roles/dullahan.py b/src/roles/dullahan.py index a14ae2d..1adbbec 100644 --- a/src/roles/dullahan.py +++ b/src/roles/dullahan.py @@ -4,7 +4,7 @@ import random from collections import defaultdict, deque from src.utilities import * -from src.functions import get_players, get_all_players, get_target, get_main_role +from src.functions import get_players, get_all_players, get_target, get_main_role, get_reveal_role from src import users, channels, debuglog, errlog, plog from src.decorators import command, event_listener from src.messages import messages @@ -92,7 +92,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers): prots.popleft() if var.ROLE_REVEAL in ("on", "team"): - role = get_reveal_role(target.nick) + role = get_reveal_role(target) an = "n" if role.startswith(("a", "e", "i", "o", "u")) else "" channels.Main.send(messages["dullahan_die_success"].format(user, target, an, role)) else: diff --git a/src/roles/harlot.py b/src/roles/harlot.py index 463fb39..43de95f 100644 --- a/src/roles/harlot.py +++ b/src/roles/harlot.py @@ -8,7 +8,7 @@ import botconfig import src.settings as var from src.utilities import * from src import channels, users, debuglog, errlog, plog -from src.functions import get_players, get_all_players, get_main_role, get_target +from src.functions import get_players, get_all_players, get_main_role, get_reveal_role, get_target from src.decorators import command, event_listener from src.messages import messages from src.events import Event @@ -79,7 +79,7 @@ def on_transition_day_resolve_end(evt, var, victims): for hlt in VISITED: if VISITED[hlt] is victim and hlt not in evt.data["bitten"] and hlt not in evt.data["dead"]: if var.ROLE_REVEAL in ("on", "team"): - evt.data["message"].append(messages["visited_victim"].format(hlt, get_reveal_role(hlt.nick))) + evt.data["message"].append(messages["visited_victim"].format(hlt, get_reveal_role(hlt))) else: evt.data["message"].append(messages["visited_victim_noreveal"].format(hlt)) evt.data["bywolves"].add(hlt) diff --git a/src/roles/madscientist.py b/src/roles/madscientist.py index d44ee5b..29f6902 100644 --- a/src/roles/madscientist.py +++ b/src/roles/madscientist.py @@ -8,7 +8,7 @@ import botconfig import src.settings as var from src.utilities import * from src import channels, users, debuglog, errlog, plog -from src.functions import get_players, get_all_players, get_main_role +from src.functions import get_players, get_all_players, get_main_role, get_reveal_role from src.decorators import command, event_listener from src.messages import messages from src.events import Event @@ -103,9 +103,9 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers): if kill1: if kill2: if var.ROLE_REVEAL in ("on", "team"): - r1 = get_reveal_role(target1.nick) + r1 = get_reveal_role(target1) an1 = "n" if r1.startswith(("a", "e", "i", "o", "u")) else "" - r2 = get_reveal_role(target2.nick) + r2 = get_reveal_role(target2) an2 = "n" if r2.startswith(("a", "e", "i", "o", "u")) else "" tmsg = messages["mad_scientist_kill"].format(user, target1, an1, r1, target2, an2, r2) else: @@ -122,7 +122,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers): pl = evt.params.refresh_pl(pl) else: if var.ROLE_REVEAL in ("on", "team"): - r1 = get_reveal_role(target1.nick) + r1 = get_reveal_role(target1) an1 = "n" if r1.startswith(("a", "e", "i", "o", "u")) else "" tmsg = messages["mad_scientist_kill_single"].format(user, target1, an1, r1) else: @@ -134,7 +134,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers): else: if kill2: if var.ROLE_REVEAL in ("on", "team"): - r2 = get_reveal_role(target2.nick) + r2 = get_reveal_role(target2) an2 = "n" if r2.startswith(("a", "e", "i", "o", "u")) else "" tmsg = messages["mad_scientist_kill_single"].format(user, target2, an2, r2) else: diff --git a/src/roles/shaman.py b/src/roles/shaman.py index 0267948..4689ac1 100644 --- a/src/roles/shaman.py +++ b/src/roles/shaman.py @@ -7,7 +7,7 @@ import botconfig import src.settings as var from src.utilities import * from src import debuglog, errlog, plog, users, channels -from src.functions import get_players, get_all_players, get_main_role +from src.functions import get_players, get_all_players, get_main_role, get_reveal_role from src.decorators import cmd, event_listener from src.messages import messages from src.events import Event @@ -291,7 +291,7 @@ def on_chk_decision_lynch5(evt, cli, var, voters): return prots.popleft() if var.ROLE_REVEAL in ("on", "team"): - r1 = get_reveal_role(target) + r1 = get_reveal_role(users._get(target)) # FIXME an1 = "n" if r1.startswith(("a", "e", "i", "o", "u")) else "" tmsg = messages["totem_desperation"].format(votee, target, an1, r1) else: @@ -491,7 +491,7 @@ def on_transition_day_resolve6(evt, var, victim): prots.popleft() evt.data["dead"].append(loser) if var.ROLE_REVEAL in ("on", "team"): - role = get_reveal_role(loser.nick) + role = get_reveal_role(loser) an = "n" if role.startswith(("a", "e", "i", "o", "u")) else "" evt.data["message"].append(messages["totem_death"].format(victim, loser, an, role)) else: diff --git a/src/roles/skel.py b/src/roles/skel.py index 8c4518f..6921f43 100644 --- a/src/roles/skel.py +++ b/src/roles/skel.py @@ -8,6 +8,7 @@ import botconfig import src.settings as var from src.utilities import * from src import channels, users, debuglog, errlog, plog +from src.functions import get_players, get_all_players, get_main_role, get_reveal_role, get_target from src.decorators import command, event_listener from src.messages import messages from src.events import Event diff --git a/src/roles/succubus.py b/src/roles/succubus.py index 2366a82..d34513a 100644 --- a/src/roles/succubus.py +++ b/src/roles/succubus.py @@ -8,7 +8,7 @@ import botconfig import src.settings as var from src.utilities import * from src import channels, users, debuglog, errlog, plog -from src.functions import get_players, get_all_players, get_main_role, get_target +from src.functions import get_players, get_all_players, get_main_role, get_reveal_role, get_target from src.decorators import command, event_listener from src.messages import messages from src.events import Event @@ -209,7 +209,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers): comma = "," for e in entranced_alive: if var.ROLE_REVEAL in ("on", "team"): - role = get_reveal_role(e.nick) + role = get_reveal_role(e) an = "n" if role.startswith(("a", "e", "i", "o", "u")) else "" msg.append("\u0002{0}\u0002, a{1} \u0002{2}\u0002".format(e, an, role)) else: @@ -249,7 +249,7 @@ def on_transition_day_resolve_end(evt, var, victims): for succubus in VISITED: if VISITED[succubus] is victim and succubus not in evt.data["bitten"] and succubus not in evt.data["dead"]: if var.ROLE_REVEAL in ("on", "team"): - evt.data["message"].append(messages["visited_victim"].format(succubus, get_reveal_role(succubus.nick))) + evt.data["message"].append(messages["visited_victim"].format(succubus, get_reveal_role(succubus))) else: evt.data["message"].append(messages["visited_victim_noreveal"].format(succubus)) evt.data["bywolves"].add(succubus) diff --git a/src/roles/traitor.py b/src/roles/traitor.py index 492bfe0..ee412f5 100644 --- a/src/roles/traitor.py +++ b/src/roles/traitor.py @@ -13,7 +13,7 @@ from src.messages import messages from src.events import Event @event_listener("get_reveal_role") -def on_get_reveal_role(evt, var, nick): +def on_get_reveal_role(evt, var, user): # in team reveal, show traitor as wolfteam, otherwise team stats won't sync with how # they're revealed upon death. Team stats should show traitor as wolfteam or else # the stats are wrong in that they'll report one less wolf than actually exists, diff --git a/src/utilities.py b/src/utilities.py index 93a4f9b..d35a223 100644 --- a/src/utilities.py +++ b/src/utilities.py @@ -12,7 +12,7 @@ __all__ = ["pm", "is_fake_nick", "mass_mode", "mass_privmsg", "reply", "is_user_simple", "is_user_notice", "in_wolflist", "relay_wolfchat_command", "irc_lower", "irc_equals", "match_hostmask", "is_owner", "is_admin", "plural", "singular", "list_players", - "get_role", "get_roles", "get_reveal_role", "change_role", "role_order", "break_long_message", + "get_role", "get_roles", "change_role", "role_order", "break_long_message", "complete_match", "complete_one_match", "get_victim", "get_nick", "InvalidModeException"] # message either privmsg or notice, depending on user settings def pm(cli, target, message): @@ -314,30 +314,6 @@ def get_roles(*roles, rolemap=None): all_roles.append(rolemap[role]) return [u.nick for u in itertools.chain(*all_roles)] -def get_reveal_role(nick): - # FIXME: make the arg a user instead of a nick - from src import users - if var.HIDDEN_AMNESIAC and nick in var.ORIGINAL_ROLES["amnesiac"]: - role = "amnesiac" - elif var.HIDDEN_CLONE and nick in var.ORIGINAL_ROLES["clone"]: - role = "clone" - else: - role = get_role(nick) - - evt = Event("get_reveal_role", {"role": role}) - evt.dispatch(var, users._get(nick)) - role = evt.data["role"] - - if var.ROLE_REVEAL != "team": - return role - - if role in var.WOLFTEAM_ROLES: - return "wolfteam player" - elif role in var.TRUE_NEUTRAL_ROLES: - return "neutral player" - else: - return "village member" - # TODO: move this to functions.py def change_role(user, oldrole, newrole, set_final=True): var.ROLES[oldrole].remove(user) diff --git a/src/wolfgame.py b/src/wolfgame.py index 62ebb4f..f5cb33b 100644 --- a/src/wolfgame.py +++ b/src/wolfgame.py @@ -49,7 +49,7 @@ import src.settings as var from src.utilities import * from src import db, events, dispatcher, channels, users, hooks, logger, debuglog, errlog, plog from src.decorators import command, cmd, hook, handle_error, event_listener, COMMANDS -from src.functions import get_players, get_all_players, get_participants, get_main_role, get_all_roles +from src.functions import get_players, get_all_players, get_participants, get_main_role, get_all_roles, get_reveal_role from src.messages import messages from src.warnings import * from src.context import IRCContext @@ -1091,7 +1091,7 @@ def fleave(var, wrapper, message): msg = [messages["fquit_success"].format(wrapper.source, target)] if get_main_role(target) != "person" and var.ROLE_REVEAL in ("on", "team"): - msg.append(messages["fquit_goodbye"].format(get_reveal_role(target.nick))) + msg.append(messages["fquit_goodbye"].format(get_reveal_role(target))) if var.PHASE == "join": player_count = len(list_players()) - 1 to_say = "new_player_count" @@ -1881,7 +1881,7 @@ def chk_decision(cli, force="", end_game=True, deadlist=[]): var.JESTERS.add(votee) if var.ROLE_REVEAL in ("on", "team"): - rrole = get_reveal_role(votee) + rrole = get_reveal_role(users._get(votee)) # FIXME an = "n" if rrole.startswith(("a", "e", "i", "o", "u")) else "" lmsg = random.choice(messages["lynch_reveal"]).format(votee, an, rrole) else: @@ -2381,7 +2381,7 @@ def del_player(player, *, devoice=True, end_game=True, death_triggers=True, kill pl = set(get_players()).difference(deadlist) if player is not None and (player is original or player in pl): mainrole = get_main_role(player) - revealrole = get_reveal_role(player.nick) # FIXME + revealrole = get_reveal_role(player) allroles = get_all_roles(player) del var.MAIN_ROLES[player] for r in allroles: @@ -2465,7 +2465,7 @@ def del_player(player, *, devoice=True, end_game=True, death_triggers=True, kill continue var.LOVERS[lover.nick].remove(player.nick) if var.ROLE_REVEAL in ("on", "team"): - role = get_reveal_role(lover.nick) + role = get_reveal_role(lover) an = "n" if role.startswith(("a", "e", "i", "o", "u")) else "" message = messages["lover_suicide"].format(lover, an, role) else: @@ -2510,7 +2510,7 @@ def del_player(player, *, devoice=True, end_game=True, death_triggers=True, kill prots.popleft() if len(prots) == 0: if var.ROLE_REVEAL in ("on", "team"): - role = get_reveal_role(target.nick) + role = get_reveal_role(target) an = "n" if role.startswith(("a", "e", "i", "o", "u")) else "" message = messages["assassin_success"].format(player, target, an, role) else: @@ -2749,7 +2749,7 @@ def reaper(cli, gameid): if nck not in list_players(): continue if var.ROLE_REVEAL in ("on", "team"): - cli.msg(chan, messages["idle_death"].format(nck, get_reveal_role(nck))) + cli.msg(chan, messages["idle_death"].format(nck, get_reveal_role(users._get(nck)))) # FIXME else: cli.msg(chan, (messages["idle_death_no_reveal"]).format(nck)) user = users._get(nck) # FIXME @@ -2770,7 +2770,7 @@ def reaper(cli, gameid): mass_privmsg(cli, msg_targets, messages["player_idle_warning"].format(chan), privmsg=True) for dcedplayer, (timeofdc, what) in list(var.DISCONNECTED.items()): mainrole = get_main_role(dcedplayer) - revealrole = get_reveal_role(dcedplayer.nick) # FIXME + revealrole = get_reveal_role(dcedplayer) if what in ("quit", "badnick") and (datetime.now() - timeofdc) > timedelta(seconds=var.QUIT_GRACE_TIME): if mainrole != "person" and var.ROLE_REVEAL in ("on", "team"): channels.Main.send(messages["quit_death"].format(dcedplayer, revealrole)) @@ -3166,7 +3166,7 @@ def leave(var, what, user, why=None): population = "" killplayer = False - channels.Main.send(msg.format(user, get_reveal_role(user.nick)) + population) # FIXME: Need to fix this once get_reveal_role() accepts User instances + channels.Main.send(msg.format(user, get_reveal_role(user)) + population) var.SPECTATING_WOLFCHAT.discard(user) var.SPECTATING_DEADCHAT.discard(user) leave_deadchat(var, user) @@ -3206,7 +3206,7 @@ def leave_game(cli, nick, chan, rest): return if get_role(nick) != "person" and var.ROLE_REVEAL in ("on", "team"): - role = get_reveal_role(nick) + role = get_reveal_role(users._get(nick)) # FIXME an = "n" if role.startswith(("a", "e", "i", "o", "u")) else "" if var.DYNQUIT_DURING_GAME: lmsg = random.choice(messages["quit"]).format(nick, an, role) @@ -3592,7 +3592,7 @@ def transition_day(cli, gameid=0): revt.data["novictmsg"] = False elif victim not in revt.data["dead"]: # not already dead via some other means if var.ROLE_REVEAL in ("on", "team"): - role = get_reveal_role(victim.nick) + role = get_reveal_role(victim) an = "n" if role.startswith(("a", "e", "i", "o", "u")) else "" revt.data["message"].append(messages["death"].format(victim, an, role)) else: @@ -3653,7 +3653,7 @@ def transition_day(cli, gameid=0): if woflset: deadwolf = random.choice(tuple(woflset)) if var.ROLE_REVEAL in ("on", "team"): - message.append(messages["gunner_killed_wolf_overnight"].format(victim, deadwolf, get_reveal_role(deadwolf.nick))) + message.append(messages["gunner_killed_wolf_overnight"].format(victim, deadwolf, get_reveal_role(deadwolf))) else: message.append(messages["gunner_killed_wolf_overnight_no_reveal"].format(victim, deadwolf)) dead.append(deadwolf) @@ -4210,7 +4210,7 @@ def shoot(var, wrapper, message): wolfvictim = victim in list_players(var.WOLF_ROLES) realrole = get_role(victim) - victimrole = get_reveal_role(victim) + victimrole = get_reveal_role(users._get(victim)) # FIXME alwaysmiss = (realrole == "werekitten") @@ -4251,7 +4251,7 @@ def shoot(var, wrapper, message): wrapper.send(messages["gunner_miss"].format(wrapper.source.nick)) else: if var.ROLE_REVEAL in ("on", "team"): - wrapper.send(messages["gunner_suicide"].format(wrapper.source.nick, get_reveal_role(wrapper.source.nick))) + wrapper.send(messages["gunner_suicide"].format(wrapper.source.nick, get_reveal_role(wrapper.source))) else: wrapper.send(messages["gunner_suicide_no_reveal"].format(wrapper.source.nick)) if not del_player(wrapper.source, killer_role="villager"): # blame explosion on villager's shoddy gun construction or something