Convert hunter to the new User API

This commit is contained in:
Vgr E. Barry 2017-08-23 18:59:30 -04:00
parent ca628dfe2e
commit 401edb75cf

View File

@ -4,105 +4,100 @@ from collections import defaultdict
import src.settings as var import src.settings as var
from src.utilities import * from src.utilities import *
from src import debuglog, errlog, plog from src import users, debuglog, errlog, plog
from src.decorators import cmd, event_listener from src.functions import get_players, get_target
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
KILLS = {} # type: Dict[str, str] KILLS = {} # type: Dict[users.User, users.User]
HUNTERS = set() HUNTERS = set()
PASSED = set() PASSED = set()
@cmd("kill", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("hunter",)) @command("kill", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("hunter",))
def hunter_kill(cli, nick, chan, rest): def hunter_kill(var, wrapper, message):
"""Kill someone once per game.""" """Kill someone once per game."""
if nick in HUNTERS and nick not in KILLS: if wrapper.source in HUNTERS and wrapper.source not in KILLS:
pm(cli, nick, messages["hunter_already_killed"]) wrapper.pm(messages["hunter_already_killed"])
return return
victim = get_victim(cli, nick, re.split(" +",rest)[0], False) target = get_target(var, wrapper, re.split(" +", message)[0])
if not victim: if not target:
return return
if victim == nick: if wrapper.source is target:
pm(cli, nick, messages["no_suicide"]) wrapper.pm(messages["no_suicide"])
return return
orig = victim orig = target
evt = Event("targeted_command", {"target": victim, "misdirection": True, "exchange": True}) evt = Event("targeted_command", {"target": target.nick, "misdirection": True, "exchange": True})
evt.dispatch(cli, var, "kill", nick, victim, frozenset({"detrimental"})) evt.dispatch(wrapper.client, var, "kill", wrapper.source.nick, target.nick, frozenset({"detrimental"}))
if evt.prevent_default: if evt.prevent_default:
return return
victim = evt.data["target"]
KILLS[nick] = victim target = users._get(evt.data["target"]) # FIXME: Need to fix once targeted_command uses the new API
HUNTERS.add(nick)
PASSED.discard(nick)
pm(cli, nick, messages["player_kill"].format(orig)) KILLS[wrapper.source] = target
HUNTERS.add(wrapper.source)
PASSED.discard(wrapper.source)
debuglog("{0} ({1}) KILL: {2} ({3})".format(nick, get_role(nick), victim, get_role(victim))) wrapper.pm(messages["player_kill"].format(orig))
chk_nightdone(cli)
@cmd("retract", "r", chan=False, pm=True, playing=True, phases=("night",), roles=("hunter",)) debuglog("{0} (hunter) KILL: {1} ({2})".format(wrapper.source, target, get_role(target.nick)))
def hunter_retract(cli, nick, chan, rest): chk_nightdone(wrapper.client)
@command("retract", "r", chan=False, pm=True, playing=True, phases=("night",), roles=("hunter",))
def hunter_retract(var, wrapper, message):
"""Removes a hunter's kill selection.""" """Removes a hunter's kill selection."""
if nick not in KILLS and nick not in PASSED: if wrapper.source not in KILLS and wrapper.source not in PASSED:
return return
if nick in KILLS: KILLS.pop(wrapper.source, None)
del KILLS[nick] HUNTERS.discard(wrapper.source)
HUNTERS.discard(nick) PASSED.discard(wrapper.source)
PASSED.discard(nick) wrapper.pm(messages["retracted_kill"])
pm(cli, nick, messages["retracted_kill"])
@cmd("pass", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("hunter",)) @command("pass", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("hunter",))
def hunter_pass(cli, nick, chan, rest): def hunter_pass(var, wrapper, message):
"""Do not use hunter's once-per-game kill tonight.""" """Do not use hunter's once-per-game kill tonight."""
if nick in HUNTERS and nick not in KILLS: if wrapper.source in HUNTERS and wrapper.source not in KILLS:
pm(cli, nick, messages["hunter_already_killed"]) wrapper.pm(messages["hunter_already_killed"])
return return
if nick in KILLS: KILLS.pop(wrapper.source, None)
del KILLS[nick] HUNTERS.discard(wrapper.source)
HUNTERS.discard(nick) PASSED.add(wrapper.source)
PASSED.add(nick) wrapper.pm(messages["hunter_pass"])
pm(cli, nick, messages["hunter_pass"])
debuglog("{0} ({1}) PASS".format(nick, get_role(nick))) debuglog("{0} (hunter) PASS".format(wrapper.source))
chk_nightdone(cli) chk_nightdone(wrapper.client)
@event_listener("del_player") @event_listener("del_player")
def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers): def on_del_player(evt, cli, var, nick, mainrole, allroles, death_triggers):
HUNTERS.discard(nick) user = users._get(nick) # FIXME
PASSED.discard(nick) HUNTERS.discard(user)
if nick in KILLS: PASSED.discard(user)
del KILLS[nick] KILLS.pop(user, None)
for h,v in list(KILLS.items()): for h, v in list(KILLS.items()):
if v == nick: if v is user:
HUNTERS.discard(h) HUNTERS.discard(h)
pm(cli, h, messages["hunter_discard"]) h.send(messages["hunter_discard"])
del KILLS[h] del KILLS[h]
@event_listener("rename_player") @event_listener("swap_player")
def on_rename(evt, cli, var, prefix, nick): def on_swap(evt, var, old_user, user):
kvp = [] for a, b in list(KILLS.items()):
for a,b in KILLS.items(): if a is old_user:
if a == prefix: KILLS[user] = KILLS.pop(old_user)
a = nick if b is old_user:
if b == prefix: KILLS[user] = KILLS.pop(old_user)
b = nick if old_user in HUNTERS:
kvp.append((a,b)) HUNTERS.discard(old_user)
KILLS.update(kvp) HUNTERS.add(user)
if prefix in KILLS: if old_user in PASSED:
del KILLS[prefix] PASSED.discard(old_user)
if prefix in HUNTERS: PASSED.add(user)
HUNTERS.discard(prefix)
HUNTERS.add(nick)
if prefix in PASSED:
PASSED.discard(prefix)
PASSED.add(nick)
@event_listener("night_acted") @event_listener("night_acted")
def on_acted(evt, cli, var, nick, sender): def on_acted(evt, cli, var, nick, sender):
if nick in KILLS: if users._get(nick) in KILLS: # FIXME
evt.data["acted"] = True evt.data["acted"] = True
@event_listener("get_special") @event_listener("get_special")
@ -112,49 +107,50 @@ def on_get_special(evt, cli, var):
@event_listener("transition_day", priority=2) @event_listener("transition_day", priority=2)
def on_transition_day(evt, cli, var): def on_transition_day(evt, cli, var):
for k, d in list(KILLS.items()): for k, d in list(KILLS.items()):
evt.data["victims"].append(d) evt.data["victims"].append(d.nick)
evt.data["onlybywolves"].discard(d) evt.data["onlybywolves"].discard(d.nick)
evt.data["killers"][d].append(k) evt.data["killers"][d].append(k.nick)
# important, otherwise our del_player listener lets hunter kill again # important, otherwise our del_player listener lets hunter kill again
del KILLS[k] del KILLS[k]
@event_listener("exchange_roles") @event_listener("exchange_roles")
def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role): def on_exchange(evt, cli, var, actor, nick, actor_role, nick_role):
if actor in KILLS: user = users._get(actor) # FIXME
del KILLS[actor] target = users._get(nick) # FIXME
if nick in KILLS: KILLS.pop(user, None)
del KILLS[nick] KILLS.pop(target, None)
HUNTERS.discard(actor) HUNTERS.discard(user)
HUNTERS.discard(nick) HUNTERS.discard(target)
PASSED.discard(actor) PASSED.discard(user)
PASSED.discard(nick) PASSED.discard(target)
@event_listener("chk_nightdone") @event_listener("chk_nightdone")
def on_chk_nightdone(evt, cli, var): def on_chk_nightdone(evt, cli, var):
evt.data["actedcount"] += len(KILLS) + len(PASSED) evt.data["actedcount"] += len(KILLS) + len(PASSED)
evt.data["nightroles"].extend([p for p in var.ROLES["hunter"] if p not in HUNTERS or p in KILLS]) evt.data["nightroles"].extend([p for p in var.ROLES["hunter"] if users._get(p) not in (HUNTERS | KILLS.keys())]) # FIXME
@event_listener("transition_night_end", priority=2) @event_listener("transition_night_end", priority=2)
def on_transition_night_end(evt, cli, var): def on_transition_night_end(evt, cli, var):
ps = list_players() ps = get_players()
for hunter in var.ROLES["hunter"]: for hunter in var.ROLES["hunter"]:
if hunter in HUNTERS: user = users._get(hunter) # FIXME
continue #already killed if user in HUNTERS:
continue # already killed
pl = ps[:] pl = ps[:]
random.shuffle(pl) random.shuffle(pl)
pl.remove(hunter) pl.remove(user)
if hunter in var.PLAYERS and not is_user_simple(hunter): to_send = "hunter_notify"
pm(cli, hunter, messages["hunter_notify"]) if user.prefers_simple():
else: to_send = "hunter_simple"
pm(cli, hunter, messages["hunter_simple"]) user.send(messages[to_send], "Players: " + ", ".join(p.nick for p in pl), sep="\n")
pm(cli, hunter, "Players: " + ", ".join(pl))
@event_listener("succubus_visit") @event_listener("succubus_visit")
def on_succubus_visit(evt, cli, var, nick, victim): def on_succubus_visit(evt, cli, var, nick, victim):
if KILLS.get(victim) in var.ROLES["succubus"]: user = users._get(victim) # FIXME
pm(cli, victim, messages["no_kill_succubus"].format(KILLS[victim])) if user in KILLS and KILLS[user].nick in var.ROLES["succubus"]: # FIXME
del KILLS[victim] user.send(messages["no_kill_succubus"].format(KILLS[user]))
HUNTERS.discard(victim) del KILLS[user]
HUNTERS.discard(user)
@event_listener("begin_day") @event_listener("begin_day")
def on_begin_day(evt, cli, var): def on_begin_day(evt, cli, var):
@ -172,7 +168,7 @@ def on_get_role_metadata(evt, var, kind):
if kind == "night_kills": if kind == "night_kills":
# hunters is the set of all hunters that have not killed in a *previous* night # hunters is the set of all hunters that have not killed in a *previous* night
# (if they're in both HUNTERS and KILLS, then they killed tonight and should be counted) # (if they're in both HUNTERS and KILLS, then they killed tonight and should be counted)
hunters = (set(var.ROLES["hunter"]) - HUNTERS) | set(KILLS.keys()) hunters = ({users._get(h) for h in var.ROLES["hunter"]} - HUNTERS) | set(KILLS.keys()) # FIXME
evt.data["hunter"] = len(hunters) evt.data["hunter"] = len(hunters)
# vim: set sw=4 expandtab: # vim: set sw=4 expandtab: