Convert get_reveal_role to use Users

This commit is contained in:
skizzerz 2018-01-10 15:18:41 -07:00
parent 7e7d4db1ae
commit c9e1845fbb
10 changed files with 61 additions and 56 deletions

View File

@ -3,7 +3,11 @@ from src.events import Event
from src import settings as var from src import settings as var
from src import users 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): def get_players(roles=None, *, mainroles=None):
if mainroles is None: if mainroles is None:
@ -77,4 +81,28 @@ def get_main_role(user):
def get_all_roles(user): def get_all_roles(user):
return {role for role, users in var.ROLES.items() if user in users} 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: # vim: set sw=4 expandtab:

View File

@ -4,7 +4,7 @@ import random
from collections import defaultdict, deque from collections import defaultdict, deque
from src.utilities import * 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 import users, channels, debuglog, errlog, plog
from src.decorators import command, event_listener from src.decorators import command, event_listener
from src.messages import messages from src.messages import messages
@ -92,7 +92,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
prots.popleft() prots.popleft()
if var.ROLE_REVEAL in ("on", "team"): 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 "" an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
channels.Main.send(messages["dullahan_die_success"].format(user, target, an, role)) channels.Main.send(messages["dullahan_die_success"].format(user, target, an, role))
else: else:

View File

@ -8,7 +8,7 @@ import botconfig
import src.settings as var import src.settings as var
from src.utilities import * from src.utilities import *
from src import channels, users, debuglog, errlog, plog 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.decorators import command, event_listener
from src.messages import messages from src.messages import messages
from src.events import Event from src.events import Event
@ -79,7 +79,7 @@ def on_transition_day_resolve_end(evt, var, victims):
for hlt in VISITED: for hlt in VISITED:
if VISITED[hlt] is victim and hlt not in evt.data["bitten"] and hlt not in evt.data["dead"]: 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"): 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: else:
evt.data["message"].append(messages["visited_victim_noreveal"].format(hlt)) evt.data["message"].append(messages["visited_victim_noreveal"].format(hlt))
evt.data["bywolves"].add(hlt) evt.data["bywolves"].add(hlt)

View File

@ -8,7 +8,7 @@ import botconfig
import src.settings as var import src.settings as var
from src.utilities import * from src.utilities import *
from src import channels, users, debuglog, errlog, plog 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.decorators import command, event_listener
from src.messages import messages from src.messages import messages
from src.events import Event from src.events import Event
@ -103,9 +103,9 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
if kill1: if kill1:
if kill2: if kill2:
if var.ROLE_REVEAL in ("on", "team"): 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 "" 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 "" an2 = "n" if r2.startswith(("a", "e", "i", "o", "u")) else ""
tmsg = messages["mad_scientist_kill"].format(user, target1, an1, r1, target2, an2, r2) tmsg = messages["mad_scientist_kill"].format(user, target1, an1, r1, target2, an2, r2)
else: else:
@ -122,7 +122,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
pl = evt.params.refresh_pl(pl) pl = evt.params.refresh_pl(pl)
else: else:
if var.ROLE_REVEAL in ("on", "team"): 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 "" an1 = "n" if r1.startswith(("a", "e", "i", "o", "u")) else ""
tmsg = messages["mad_scientist_kill_single"].format(user, target1, an1, r1) tmsg = messages["mad_scientist_kill_single"].format(user, target1, an1, r1)
else: else:
@ -134,7 +134,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
else: else:
if kill2: if kill2:
if var.ROLE_REVEAL in ("on", "team"): 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 "" an2 = "n" if r2.startswith(("a", "e", "i", "o", "u")) else ""
tmsg = messages["mad_scientist_kill_single"].format(user, target2, an2, r2) tmsg = messages["mad_scientist_kill_single"].format(user, target2, an2, r2)
else: else:

View File

@ -7,7 +7,7 @@ import botconfig
import src.settings as var import src.settings as var
from src.utilities import * from src.utilities import *
from src import debuglog, errlog, plog, users, channels 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.decorators import cmd, event_listener
from src.messages import messages from src.messages import messages
from src.events import Event from src.events import Event
@ -291,7 +291,7 @@ def on_chk_decision_lynch5(evt, cli, var, voters):
return return
prots.popleft() prots.popleft()
if var.ROLE_REVEAL in ("on", "team"): 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 "" an1 = "n" if r1.startswith(("a", "e", "i", "o", "u")) else ""
tmsg = messages["totem_desperation"].format(votee, target, an1, r1) tmsg = messages["totem_desperation"].format(votee, target, an1, r1)
else: else:
@ -491,7 +491,7 @@ def on_transition_day_resolve6(evt, var, victim):
prots.popleft() prots.popleft()
evt.data["dead"].append(loser) evt.data["dead"].append(loser)
if var.ROLE_REVEAL in ("on", "team"): 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 "" an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
evt.data["message"].append(messages["totem_death"].format(victim, loser, an, role)) evt.data["message"].append(messages["totem_death"].format(victim, loser, an, role))
else: else:

View File

@ -8,6 +8,7 @@ import botconfig
import src.settings as var import src.settings as var
from src.utilities import * from src.utilities import *
from src import channels, users, debuglog, errlog, plog 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.decorators import command, event_listener
from src.messages import messages from src.messages import messages
from src.events import Event from src.events import Event

View File

@ -8,7 +8,7 @@ import botconfig
import src.settings as var import src.settings as var
from src.utilities import * from src.utilities import *
from src import channels, users, debuglog, errlog, plog 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.decorators import command, event_listener
from src.messages import messages from src.messages import messages
from src.events import Event from src.events import Event
@ -209,7 +209,7 @@ def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
comma = "," comma = ","
for e in entranced_alive: for e in entranced_alive:
if var.ROLE_REVEAL in ("on", "team"): 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 "" 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)) msg.append("\u0002{0}\u0002, a{1} \u0002{2}\u0002".format(e, an, role))
else: else:
@ -249,7 +249,7 @@ def on_transition_day_resolve_end(evt, var, victims):
for succubus in VISITED: for succubus in VISITED:
if VISITED[succubus] is victim and succubus not in evt.data["bitten"] and succubus not in evt.data["dead"]: 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"): 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: else:
evt.data["message"].append(messages["visited_victim_noreveal"].format(succubus)) evt.data["message"].append(messages["visited_victim_noreveal"].format(succubus))
evt.data["bywolves"].add(succubus) evt.data["bywolves"].add(succubus)

View File

@ -13,7 +13,7 @@ from src.messages import messages
from src.events import Event from src.events import Event
@event_listener("get_reveal_role") @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 # 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 # 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, # the stats are wrong in that they'll report one less wolf than actually exists,

View File

@ -12,7 +12,7 @@ __all__ = ["pm", "is_fake_nick", "mass_mode", "mass_privmsg", "reply",
"is_user_simple", "is_user_notice", "in_wolflist", "is_user_simple", "is_user_notice", "in_wolflist",
"relay_wolfchat_command", "irc_lower", "irc_equals", "match_hostmask", "relay_wolfchat_command", "irc_lower", "irc_equals", "match_hostmask",
"is_owner", "is_admin", "plural", "singular", "list_players", "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"] "complete_match", "complete_one_match", "get_victim", "get_nick", "InvalidModeException"]
# message either privmsg or notice, depending on user settings # message either privmsg or notice, depending on user settings
def pm(cli, target, message): def pm(cli, target, message):
@ -314,30 +314,6 @@ def get_roles(*roles, rolemap=None):
all_roles.append(rolemap[role]) all_roles.append(rolemap[role])
return [u.nick for u in itertools.chain(*all_roles)] 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 # TODO: move this to functions.py
def change_role(user, oldrole, newrole, set_final=True): def change_role(user, oldrole, newrole, set_final=True):
var.ROLES[oldrole].remove(user) var.ROLES[oldrole].remove(user)

View File

@ -49,7 +49,7 @@ import src.settings as var
from src.utilities import * from src.utilities import *
from src import db, events, dispatcher, channels, users, hooks, logger, debuglog, errlog, plog 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.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.messages import messages
from src.warnings import * from src.warnings import *
from src.context import IRCContext from src.context import IRCContext
@ -1091,7 +1091,7 @@ def fleave(var, wrapper, message):
msg = [messages["fquit_success"].format(wrapper.source, target)] msg = [messages["fquit_success"].format(wrapper.source, target)]
if get_main_role(target) != "person" and var.ROLE_REVEAL in ("on", "team"): 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": if var.PHASE == "join":
player_count = len(list_players()) - 1 player_count = len(list_players()) - 1
to_say = "new_player_count" to_say = "new_player_count"
@ -1881,7 +1881,7 @@ def chk_decision(cli, force="", end_game=True, deadlist=[]):
var.JESTERS.add(votee) var.JESTERS.add(votee)
if var.ROLE_REVEAL in ("on", "team"): 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 "" an = "n" if rrole.startswith(("a", "e", "i", "o", "u")) else ""
lmsg = random.choice(messages["lynch_reveal"]).format(votee, an, rrole) lmsg = random.choice(messages["lynch_reveal"]).format(votee, an, rrole)
else: else:
@ -2381,7 +2381,7 @@ def del_player(player, *, devoice=True, end_game=True, death_triggers=True, kill
pl = set(get_players()).difference(deadlist) pl = set(get_players()).difference(deadlist)
if player is not None and (player is original or player in pl): if player is not None and (player is original or player in pl):
mainrole = get_main_role(player) mainrole = get_main_role(player)
revealrole = get_reveal_role(player.nick) # FIXME revealrole = get_reveal_role(player)
allroles = get_all_roles(player) allroles = get_all_roles(player)
del var.MAIN_ROLES[player] del var.MAIN_ROLES[player]
for r in allroles: for r in allroles:
@ -2465,7 +2465,7 @@ def del_player(player, *, devoice=True, end_game=True, death_triggers=True, kill
continue continue
var.LOVERS[lover.nick].remove(player.nick) var.LOVERS[lover.nick].remove(player.nick)
if var.ROLE_REVEAL in ("on", "team"): 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 "" an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
message = messages["lover_suicide"].format(lover, an, role) message = messages["lover_suicide"].format(lover, an, role)
else: else:
@ -2510,7 +2510,7 @@ def del_player(player, *, devoice=True, end_game=True, death_triggers=True, kill
prots.popleft() prots.popleft()
if len(prots) == 0: if len(prots) == 0:
if var.ROLE_REVEAL in ("on", "team"): 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 "" an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
message = messages["assassin_success"].format(player, target, an, role) message = messages["assassin_success"].format(player, target, an, role)
else: else:
@ -2749,7 +2749,7 @@ def reaper(cli, gameid):
if nck not in list_players(): if nck not in list_players():
continue continue
if var.ROLE_REVEAL in ("on", "team"): 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: else:
cli.msg(chan, (messages["idle_death_no_reveal"]).format(nck)) cli.msg(chan, (messages["idle_death_no_reveal"]).format(nck))
user = users._get(nck) # FIXME 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) mass_privmsg(cli, msg_targets, messages["player_idle_warning"].format(chan), privmsg=True)
for dcedplayer, (timeofdc, what) in list(var.DISCONNECTED.items()): for dcedplayer, (timeofdc, what) in list(var.DISCONNECTED.items()):
mainrole = get_main_role(dcedplayer) 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 what in ("quit", "badnick") and (datetime.now() - timeofdc) > timedelta(seconds=var.QUIT_GRACE_TIME):
if mainrole != "person" and var.ROLE_REVEAL in ("on", "team"): if mainrole != "person" and var.ROLE_REVEAL in ("on", "team"):
channels.Main.send(messages["quit_death"].format(dcedplayer, revealrole)) channels.Main.send(messages["quit_death"].format(dcedplayer, revealrole))
@ -3166,7 +3166,7 @@ def leave(var, what, user, why=None):
population = "" population = ""
killplayer = False 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_WOLFCHAT.discard(user)
var.SPECTATING_DEADCHAT.discard(user) var.SPECTATING_DEADCHAT.discard(user)
leave_deadchat(var, user) leave_deadchat(var, user)
@ -3206,7 +3206,7 @@ def leave_game(cli, nick, chan, rest):
return return
if get_role(nick) != "person" and var.ROLE_REVEAL in ("on", "team"): 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 "" an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
if var.DYNQUIT_DURING_GAME: if var.DYNQUIT_DURING_GAME:
lmsg = random.choice(messages["quit"]).format(nick, an, role) lmsg = random.choice(messages["quit"]).format(nick, an, role)
@ -3592,7 +3592,7 @@ def transition_day(cli, gameid=0):
revt.data["novictmsg"] = False revt.data["novictmsg"] = False
elif victim not in revt.data["dead"]: # not already dead via some other means elif victim not in revt.data["dead"]: # not already dead via some other means
if var.ROLE_REVEAL in ("on", "team"): 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 "" an = "n" if role.startswith(("a", "e", "i", "o", "u")) else ""
revt.data["message"].append(messages["death"].format(victim, an, role)) revt.data["message"].append(messages["death"].format(victim, an, role))
else: else:
@ -3653,7 +3653,7 @@ def transition_day(cli, gameid=0):
if woflset: if woflset:
deadwolf = random.choice(tuple(woflset)) deadwolf = random.choice(tuple(woflset))
if var.ROLE_REVEAL in ("on", "team"): 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: else:
message.append(messages["gunner_killed_wolf_overnight_no_reveal"].format(victim, deadwolf)) message.append(messages["gunner_killed_wolf_overnight_no_reveal"].format(victim, deadwolf))
dead.append(deadwolf) dead.append(deadwolf)
@ -4210,7 +4210,7 @@ def shoot(var, wrapper, message):
wolfvictim = victim in list_players(var.WOLF_ROLES) wolfvictim = victim in list_players(var.WOLF_ROLES)
realrole = get_role(victim) realrole = get_role(victim)
victimrole = get_reveal_role(victim) victimrole = get_reveal_role(users._get(victim)) # FIXME
alwaysmiss = (realrole == "werekitten") alwaysmiss = (realrole == "werekitten")
@ -4251,7 +4251,7 @@ def shoot(var, wrapper, message):
wrapper.send(messages["gunner_miss"].format(wrapper.source.nick)) wrapper.send(messages["gunner_miss"].format(wrapper.source.nick))
else: else:
if var.ROLE_REVEAL in ("on", "team"): 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: else:
wrapper.send(messages["gunner_suicide_no_reveal"].format(wrapper.source.nick)) 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 if not del_player(wrapper.source, killer_role="villager"): # blame explosion on villager's shoddy gun construction or something