From bfc5e6a9ddfb3498f08fb9e6282aab778869d04a Mon Sep 17 00:00:00 2001 From: "Vgr E. Barry" Date: Fri, 27 Oct 2017 17:05:22 -0400 Subject: [PATCH 1/6] Convert harlot --- src/gamemodes.py | 5 +- src/roles/harlot.py | 124 +++++++++++++++++++----------------------- src/roles/succubus.py | 10 ++-- src/wolfgame.py | 7 +-- 4 files changed, 68 insertions(+), 78 deletions(-) diff --git a/src/gamemodes.py b/src/gamemodes.py index 484474d..8eb8822 100644 --- a/src/gamemodes.py +++ b/src/gamemodes.py @@ -238,9 +238,10 @@ class VillagergameMode(GameMode): if len(var.ROLES["harlot"]) == 1: hlt = list(var.ROLES["harlot"])[0] from src.roles import harlot - hvst = harlot.VISITED.get(hlt) - if hvst: + hvst = harlot.VISITED.get(users._get(hlt)) # FIXME + if hvst is not None: pl.remove(hlt) + hvst = hvst.nick # FIXME if len(var.ROLES["shaman"]) == 1: shmn = list(var.ROLES["shaman"])[0] if random.random() < 0.3: diff --git a/src/roles/harlot.py b/src/roles/harlot.py index 01733dd..b8028f3 100644 --- a/src/roles/harlot.py +++ b/src/roles/harlot.py @@ -8,69 +8,70 @@ 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_target from src.decorators import cmd, event_listener from src.messages import messages from src.events import Event VISITED = {} +PASSED = set() -@cmd("visit", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("harlot",)) -def hvisit(cli, nick, chan, rest): +@command("visit", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("harlot",)) +def hvisit(var, wrapper, message): """Visit a player. You will die if you visit a wolf or a target of the wolves.""" - if VISITED.get(nick): - pm(cli, nick, messages["harlot_already_visited"].format(VISITED[nick])) + if VISITED.get(wrapper.source): + wrapper.pm(messages["harlot_already_visited"].format(VISITED[wrapper.source])) return - victim = get_victim(cli, nick, re.split(" +",rest)[0], False, True) - if not victim: + target = get_target(var, wrapper, re.split(" +", message)[0], allow_bot=True) + if not target: return - if nick == victim: - pm(cli, nick, messages["harlot_not_self"]) + if target is wrapper.source: + wrapper.pm(messages["harlot_not_self"]) return - evt = Event("targeted_command", {"target": victim, "misdirection": True, "exchange": True}) - evt.dispatch(cli, var, "visit", nick, victim, frozenset({"immediate"})) + evt = Event("targeted_command", {"target": target.nick, "misdirection": True, "exchange": True}) + evt.dispatch(wrapper.client, var, "visit", wrapper.source.nick, target.nick, frozenset({"immediate"})) if evt.prevent_default: return - victim = evt.data["target"] - vrole = get_role(victim) + target = users._get(evt.data["target"]) # FIXME + vrole = get_main_role(target) - VISITED[nick] = victim - pm(cli, nick, messages["harlot_success"].format(victim)) - if nick != victim: - pm(cli, victim, messages["harlot_success"].format(nick)) + VISITED[wrapper.source] = target + PASSED.discard(wrapper.source) + + wrapper.pm(messages["harlot_success"].format(target)) + if target is not wrapper.source: + wrapper.pm(messages["harlot_success"].format(wrapper.source)) revt = Event("harlot_visit", {}) - revt.dispatch(cli, var, nick, victim) + revt.dispatch(var, wrapper.source, target) - debuglog("{0} ({1}) VISIT: {2} ({3})".format(nick, get_role(nick), victim, vrole)) - chk_nightdone(cli) + debuglog("{0} (harlot) VISIT: {1} ({2})".format(wrapper.source, target, vrole)) + chk_nightdone(wrapper.client) -@cmd("pass", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("harlot",)) -def pass_cmd(cli, nick, chan, rest): +@command("pass", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("harlot",)) +def pass_cmd(var, wrapper, message): """Do not visit someone tonight.""" - if VISITED.get(nick): - pm(cli, nick, messages["harlot_already_visited"].format(VISITED[nick])) + if VISITED.get(wrapper.source): + wrapper.pm(messages["harlot_already_visited"].format(VISITED[wrapper.source])) return - VISITED[nick] = None - pm(cli, nick, messages["no_visit"]) - debuglog("{0} ({1}) PASS".format(nick, get_role(nick))) - chk_nightdone(cli) + PASSED.add(wrapper.source) + wrapper.pm(messages["no_visit"]) + debuglog("{0} (harlot) PASS".format(wrapper.source)) + chk_nightdone(wrapper.client) @event_listener("bite") def on_bite(evt, var, alpha, target): - if target.nick not in var.ROLES["harlot"] or target.nick not in VISITED: + if target.nick not in var.ROLES["harlot"] or target not in VISITED: return - hvisit = VISITED[target.nick] - if hvisit is not None: - visited = users._get(hvisit) # FIXME - if get_main_role(visited) not in var.WOLFCHAT_ROLES and (visited not in evt.params.bywolves or visited in evt.params.protected): - evt.data["can_bite"] = False + hvisit = VISITED[target] + if get_main_role(hvisit) not in var.WOLFCHAT_ROLES and (hvisit not in evt.params.bywolves or hvisit in evt.params.protected): + evt.data["can_bite"] = False @event_listener("transition_day_resolve", priority=1) def on_transition_day_resolve(evt, var, victim): - if victim.nick in var.ROLES["harlot"] and VISITED.get(victim.nick) and victim not in evt.data["dead"] and victim in evt.data["onlybywolves"]: + if victim.nick in var.ROLES["harlot"] and VISITED.get(victim) and victim not in evt.data["dead"] and victim in evt.data["onlybywolves"]: if victim not in evt.data["bitten"]: evt.data["message"].append(messages["target_not_home"]) evt.data["novictmsg"] = False @@ -80,22 +81,21 @@ def on_transition_day_resolve(evt, var, victim): @event_listener("transition_day_resolve_end", priority=1) def on_transition_day_resolve_end(evt, var, victims): for victim in victims + evt.data["bitten"]: - if victim in evt.data["dead"] and victim.nick in VISITED.values() and (victim in evt.data["bywolves"] or victim in evt.data["bitten"]): + if victim in evt.data["dead"] and victim in VISITED.values() and (victim in evt.data["bywolves"] or victim in evt.data["bitten"]): for hlt in VISITED: - user = users._get(hlt) # FIXME - if VISITED[hlt] == victim.nick and user not in evt.data["bitten"] and user 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"): - evt.data["message"].append(messages["visited_victim"].format(hlt, get_reveal_role(hlt))) + evt.data["message"].append(messages["visited_victim"].format(hlt, get_reveal_role(hlt.nick))) else: evt.data["message"].append(messages["visited_victim_noreveal"].format(hlt)) - evt.data["bywolves"].add(user) - evt.data["onlybywolves"].add(user) - evt.data["dead"].append(user) + evt.data["bywolves"].add(hlt) + evt.data["onlybywolves"].add(hlt) + evt.data["dead"].append(hlt) @event_listener("transition_day_resolve_end", priority=3) def on_transition_day_resolve_end3(evt, var, victims): for harlot in get_all_players(("harlot",)): - if VISITED.get(harlot.nick) in list_players(var.WOLF_ROLES) and harlot not in evt.data["dead"] and harlot not in evt.data["bitten"]: + if VISITED.get(harlot) in get_players(var.WOLF_ROLES) and harlot not in evt.data["dead"] and harlot not in evt.data["bitten"]: evt.data["message"].append(messages["harlot_visited_wolf"].format(harlot)) evt.data["bywolves"].add(harlot) evt.data["onlybywolves"].add(harlot) @@ -103,28 +103,26 @@ def on_transition_day_resolve_end3(evt, var, victims): @event_listener("night_acted") def on_night_acted(evt, var, user, actor): - if VISITED.get(user.nick): + if VISITED.get(user): evt.data["acted"] = True @event_listener("chk_nightdone") def on_chk_nightdone(evt, var): - evt.data["actedcount"] += len(VISITED) + evt.data["actedcount"] += len(VISITED) + len(PASSED) evt.data["nightroles"].extend(get_all_players(("harlot",))) @event_listener("exchange_roles") def on_exchange_roles(evt, var, actor, target, actor_role, target_role): if actor_role == "harlot": - if actor.nick in VISITED: - if VISITED[actor.nick] is not None: - visited = users._get(VISITED[actor.nick]) # FIXME - visited.send(messages["harlot_disappeared"].format(actor)) - del VISITED[actor.nick] + if actor in VISITED: + VISITED[actor].send(messages["harlot_disappeared"].format(actor)) + del VISITED[actor] + PASSED.discard(actor) if target_role == "harlot": - if target.nick in VISITED: - if VISITED[target.nick] is not None: - visited = users._get(VISITED[target.nick]) # FIXME - visited.send(messages["harlot_disappeared"].format(target)) - del VISITED[target.nick] + if target in VISITED: + VISITED[target].send(messages["harlot_disappeared"].format(target)) + del VISITED[target] + PASSED.discard(target) @event_listener("transition_night_end", priority=2) def on_transition_night_end(evt, var): @@ -140,6 +138,7 @@ def on_transition_night_end(evt, var): @event_listener("begin_day") def on_begin_day(evt, var): VISITED.clear() + PASSED.clear() @event_listener("get_special") def on_get_special(evt, var): @@ -149,21 +148,12 @@ def on_get_special(evt, var): def on_del_player(evt, var, user, mainrole, allroles, death_triggers): if "harlot" not in allroles: return - VISITED.pop(user.nick, None) - -@event_listener("rename_player") -def on_rename(evt, cli, var, prefix, nick): - kvp = {} - for a,b in VISITED.items(): - s = nick if a == prefix else a - t = nick if b == prefix else b - kvp[s] = t - VISITED.update(kvp) - if prefix in VISITED: - del VISITED[prefix] + VISITED.pop(user, None) + PASSED.discard(user) @event_listener("reset") def on_reset(evt, var): VISITED.clear() + PASSED.clear() # vim: set sw=4 expandtab: diff --git a/src/roles/succubus.py b/src/roles/succubus.py index eb4cdb1..2bf85a6 100644 --- a/src/roles/succubus.py +++ b/src/roles/succubus.py @@ -83,11 +83,11 @@ def pass_cmd(cli, nick, chan, rest): chk_nightdone(cli) @event_listener("harlot_visit") -def on_harlot_visit(evt, cli, var, nick, victim): - if victim in var.ROLES["succubus"]: - pm(cli, nick, messages["notify_succubus_target"].format(victim)) - pm(cli, victim, messages["succubus_harlot_success"].format(nick)) - ENTRANCED.add(nick) +def on_harlot_visit(evt, var, actor, victim): + if victim.nick in var.ROLES["succubus"]: + actor.send(messages["notify_succubus_target"].format(victim)) + victim.send(messages["succubus_harlot_success"].format(actor)) + ENTRANCED.add(actor.nick) @event_listener("get_random_totem_targets") def on_get_random_totem_targets(evt, var, shaman): diff --git a/src/wolfgame.py b/src/wolfgame.py index 010c000..6534326 100644 --- a/src/wolfgame.py +++ b/src/wolfgame.py @@ -963,9 +963,8 @@ def join_player(var, wrapper, who=None, forced=False, *, sanity=True): @handle_error def kill_join(var, wrapper): - pl = list_players() + pl = [x.nick for x in get_players()] pl.sort(key=lambda x: x.lower()) - msg = "PING! " + break_long_message(pl).replace("\n", "\nPING! ") reset_modes_timers(var) reset() wrapper.send(*pl, first="PING! ") @@ -3517,7 +3516,7 @@ def transition_day(cli, gameid=0): victims.append(v) elif v.nick in var.ROLES["bodyguard"] and v.nick in angel.GUARDED and users._get(angel.GUARDED[v.nick]) in victims_set: # FIXME vappend.append(v) - elif v.nick in var.ROLES["harlot"] and harlot.VISITED.get(v.nick) is not None and users._get(harlot.VISITED[v.nick]) in victims_set: # FIXME + elif v.nick in var.ROLES["harlot"] and harlot.VISITED[v] in victims_set: vappend.append(v) else: victims.append(v) @@ -3535,7 +3534,7 @@ def transition_day(cli, gameid=0): if v.nick in var.ROLES["bodyguard"] and users._get(angel.GUARDED.get(v.nick)) not in vappend: # FIXME vappend.remove(v) victims.append(v) - elif v.nick in var.ROLES["harlot"] and users._get(harlot.VISITED.get(v.nick)) not in vappend: # FIXME + elif v.nick in var.ROLES["harlot"] and harlot.VISITED.get(v) not in vappend: vappend.remove(v) victims.append(v) From 7e9bbcaf3cd559b02faf3fe5e92bc0b43b863beb Mon Sep 17 00:00:00 2001 From: "Vgr E. Barry" Date: Mon, 4 Dec 2017 14:48:07 -0500 Subject: [PATCH 2/6] Some small fixes for harlot --- src/wolfgame.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wolfgame.py b/src/wolfgame.py index 6534326..19f32df 100644 --- a/src/wolfgame.py +++ b/src/wolfgame.py @@ -3516,7 +3516,7 @@ def transition_day(cli, gameid=0): victims.append(v) elif v.nick in var.ROLES["bodyguard"] and v.nick in angel.GUARDED and users._get(angel.GUARDED[v.nick]) in victims_set: # FIXME vappend.append(v) - elif v.nick in var.ROLES["harlot"] and harlot.VISITED[v] in victims_set: + elif v in harlot.VISITED and harlot.VISITED[v] in victims_set: vappend.append(v) else: victims.append(v) @@ -3534,7 +3534,7 @@ def transition_day(cli, gameid=0): if v.nick in var.ROLES["bodyguard"] and users._get(angel.GUARDED.get(v.nick)) not in vappend: # FIXME vappend.remove(v) victims.append(v) - elif v.nick in var.ROLES["harlot"] and harlot.VISITED.get(v) not in vappend: + elif harlot.VISITED.get(v) not in vappend: vappend.remove(v) victims.append(v) From f6a169fdee8c637723f03a8342fb8efba1fc7ab6 Mon Sep 17 00:00:00 2001 From: "Vgr E. Barry" Date: Thu, 7 Dec 2017 13:22:17 -0500 Subject: [PATCH 3/6] Small fixes --- src/roles/harlot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/roles/harlot.py b/src/roles/harlot.py index b8028f3..4662808 100644 --- a/src/roles/harlot.py +++ b/src/roles/harlot.py @@ -9,7 +9,7 @@ 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.decorators import cmd, event_listener +from src.decorators import command, event_listener from src.messages import messages from src.events import Event @@ -43,7 +43,7 @@ def hvisit(var, wrapper, message): wrapper.pm(messages["harlot_success"].format(target)) if target is not wrapper.source: - wrapper.pm(messages["harlot_success"].format(wrapper.source)) + target.send(messages["harlot_success"].format(wrapper.source)) revt = Event("harlot_visit", {}) revt.dispatch(var, wrapper.source, target) From 8e45ab5978af3edf57f16997f15399da203bd678 Mon Sep 17 00:00:00 2001 From: "Vgr E. Barry" Date: Thu, 7 Dec 2017 13:33:38 -0500 Subject: [PATCH 4/6] Fix thing --- src/roles/harlot.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/roles/harlot.py b/src/roles/harlot.py index 4662808..8c8620e 100644 --- a/src/roles/harlot.py +++ b/src/roles/harlot.py @@ -23,14 +23,10 @@ def hvisit(var, wrapper, message): if VISITED.get(wrapper.source): wrapper.pm(messages["harlot_already_visited"].format(VISITED[wrapper.source])) return - target = get_target(var, wrapper, re.split(" +", message)[0], allow_bot=True) + target = get_target(var, wrapper, re.split(" +", message)[0], not_self_message="harlot_not_self") if not target: return - if target is wrapper.source: - wrapper.pm(messages["harlot_not_self"]) - return - evt = Event("targeted_command", {"target": target.nick, "misdirection": True, "exchange": True}) evt.dispatch(wrapper.client, var, "visit", wrapper.source.nick, target.nick, frozenset({"immediate"})) if evt.prevent_default: From ab0920f824e58238d72420493f342db87770101a Mon Sep 17 00:00:00 2001 From: "Vgr E. Barry" Date: Fri, 8 Dec 2017 09:39:33 -0500 Subject: [PATCH 5/6] Make harlot listen to swap_player --- src/roles/harlot.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/roles/harlot.py b/src/roles/harlot.py index 8c8620e..2c69a74 100644 --- a/src/roles/harlot.py +++ b/src/roles/harlot.py @@ -136,6 +136,14 @@ def on_begin_day(evt, var): VISITED.clear() PASSED.clear() +@event_listener("swap_player") +def on_swap(evt, var, old_user, user): + for actor, target in set(VISITED.items()): + if target is old_user: + VISITED[actor] = user + if actor is old_user: + VISITED[user] = VISITED.pop(actor) + @event_listener("get_special") def on_get_special(evt, var): evt.data["special"].update(get_players(("harlot",))) From 8236664e15452980eaee5cd3c80e66f0d5061ea9 Mon Sep 17 00:00:00 2001 From: "Vgr E. Barry" Date: Mon, 11 Dec 2017 15:21:01 -0500 Subject: [PATCH 6/6] Fix some issues with harlot conversion --- src/roles/harlot.py | 20 ++++++++++++-------- src/roles/succubus.py | 8 ++++---- src/wolfgame.py | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/roles/harlot.py b/src/roles/harlot.py index 2c69a74..648f3dd 100644 --- a/src/roles/harlot.py +++ b/src/roles/harlot.py @@ -13,8 +13,8 @@ from src.decorators import command, event_listener from src.messages import messages from src.events import Event -VISITED = {} -PASSED = set() +VISITED = {} # type: Dict[users.User, users.User] +PASSED = set() # type: Set[users.User] @command("visit", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("harlot",)) def hvisit(var, wrapper, message): @@ -98,8 +98,8 @@ def on_transition_day_resolve_end3(evt, var, victims): evt.data["dead"].append(harlot) @event_listener("night_acted") -def on_night_acted(evt, var, user, actor): - if VISITED.get(user): +def on_night_acted(evt, var, target, spy): + if VISITED.get(target): evt.data["acted"] = True @event_listener("chk_nightdone") @@ -138,11 +138,15 @@ def on_begin_day(evt, var): @event_listener("swap_player") def on_swap(evt, var, old_user, user): - for actor, target in set(VISITED.items()): + for harlot, target in set(VISITED.items()): if target is old_user: - VISITED[actor] = user - if actor is old_user: - VISITED[user] = VISITED.pop(actor) + VISITED[harlot] = user + if harlot is old_user: + VISITED[user] = VISITED.pop(harlot) + + if old_user in PASSED: + PASSED.remove(old_user) + PASSED.add(user) @event_listener("get_special") def on_get_special(evt, var): diff --git a/src/roles/succubus.py b/src/roles/succubus.py index 2bf85a6..fa3969b 100644 --- a/src/roles/succubus.py +++ b/src/roles/succubus.py @@ -83,11 +83,11 @@ def pass_cmd(cli, nick, chan, rest): chk_nightdone(cli) @event_listener("harlot_visit") -def on_harlot_visit(evt, var, actor, victim): +def on_harlot_visit(evt, var, harlot, victim): if victim.nick in var.ROLES["succubus"]: - actor.send(messages["notify_succubus_target"].format(victim)) - victim.send(messages["succubus_harlot_success"].format(actor)) - ENTRANCED.add(actor.nick) + harlot.send(messages["notify_succubus_target"].format(victim)) + victim.send(messages["succubus_harlot_success"].format(harlot)) + ENTRANCED.add(harlot.nick) @event_listener("get_random_totem_targets") def on_get_random_totem_targets(evt, var, shaman): diff --git a/src/wolfgame.py b/src/wolfgame.py index 19f32df..325556d 100644 --- a/src/wolfgame.py +++ b/src/wolfgame.py @@ -3516,7 +3516,7 @@ def transition_day(cli, gameid=0): victims.append(v) elif v.nick in var.ROLES["bodyguard"] and v.nick in angel.GUARDED and users._get(angel.GUARDED[v.nick]) in victims_set: # FIXME vappend.append(v) - elif v in harlot.VISITED and harlot.VISITED[v] in victims_set: + elif harlot.VISITED.get(v) in victims_set: vappend.append(v) else: victims.append(v)