示例#1
0
def _set_lovers(target1, target2):
    if target1 in LOVERS:
        LOVERS[target1].add(target2)
    else:
        LOVERS[target1] = UserSet({target2})

    if target2 in LOVERS:
        LOVERS[target2].add(target1)
    else:
        LOVERS[target2] = UserSet({target1})

    target1.send(messages["matchmaker_target_notify"].format(target2))
    target2.send(messages["matchmaker_target_notify"].format(target1))
示例#2
0
def add_force_vote(var, votee: users.User,
                   targets: Iterable[users.User]) -> None:
    """Force votee to vote for the specified targets."""
    if votee not in get_players():
        return
    _add_count(var, votee, 1)
    FORCED_TARGETS.setdefault(votee, UserSet()).update(targets)
示例#3
0
def setup_variables(rolename):
    SEEN = UserSet()

    @event_listener("del_player")
    def on_del_player(evt, var, user, mainrole, allroles, death_triggers):
        SEEN.discard(user)

    @event_listener("night_acted")
    def on_acted(evt, var, user, actor):
        if user in SEEN:
            evt.data["acted"] = True

    @event_listener("get_special")
    def on_get_special(evt, var):
        evt.data["villagers"].update(get_players((rolename, )))

    @event_listener("exchange_roles")
    def on_exchange(evt, var, actor, target, actor_role, target_role):
        if actor_role == rolename and target_role != rolename:
            SEEN.discard(actor)
        elif target_role == rolename and actor_role != rolename:
            SEEN.discard(target)

    @event_listener("chk_nightdone")
    def on_chk_nightdone(evt, var):
        evt.data["actedcount"] += len(SEEN)
        evt.data["nightroles"].extend(get_all_players((rolename, )))

    @event_listener("transition_night_end", priority=2)
    def on_transition_night_end(evt, var):
        for seer in get_all_players((rolename, )):
            pl = get_players()
            random.shuffle(pl)
            pl.remove(seer)  # remove self from list

            a = "a"
            if rolename.startswith(("a", "e", "i", "o", "u")):
                a = "an"

            what = messages[rolename + "_ability"]

            to_send = "seer_role_info"
            if seer.prefers_simple():
                to_send = "seer_simple"
            seer.send(messages[to_send].format(a, rolename, what),
                      messages["players_list"].format(", ".join(p.nick
                                                                for p in pl)),
                      sep="\n")

    @event_listener("begin_day")
    def on_begin_day(evt, var):
        SEEN.clear()

    @event_listener("reset")
    def on_reset(evt, var):
        SEEN.clear()

    return SEEN
示例#4
0
def _set_lovers(target1, target2):
    if target1 in LOVERS:
        LOVERS[target1].add(target2)
    else:
        LOVERS[target1] = UserSet({target2})

    if target2 in LOVERS:
        LOVERS[target2].add(target1)
    else:
        LOVERS[target2] = UserSet({target1})

    t1_msg = "matchmaker_target_notify"
    if target1.prefers_simple():
        t1_msg += "_simple"

    t2_msg = "matchmaker_target_notify"
    if target2.prefers_simple():
        t2_msg += "_simple"

    target1.send(messages[t1_msg].format(target2))
    target2.send(messages[t2_msg].format(target1))
示例#5
0
def on_role_assignment(evt, var, gamemode, pl):
    # assign random targets to dullahan to kill
    if var.ROLES["dullahan"]:
        max_targets = math.ceil(8.1 * math.log(len(pl), 10) - 5)
        for dull in var.ROLES["dullahan"]:
            TARGETS[dull] = UserSet()
        dull_targets = Event("dullahan_targets", {"targets": TARGETS}) # support sleepy
        dull_targets.dispatch(var, var.ROLES["dullahan"], max_targets)

        for dull, ts in TARGETS.items():
            ps = pl[:]
            ps.remove(dull)
            while len(ts) < max_targets:
                target = random.choice(ps)
                ps.remove(target)
                ts.add(target)
示例#6
0
def on_new_role(evt, var, player, old_role):
    if player in TARGETS and old_role == "dullahan" and evt.data["role"] != "dullahan":
        del KILLS[:player:]
        del TARGETS[player]

    if player not in TARGETS and evt.data["role"] == "dullahan":
        ps = get_players()
        max_targets = math.ceil(8.1 * math.log(len(ps), 10) - 5)
        TARGETS[player] = UserSet()

        dull_targets = Event("dullahan_targets", {"targets": TARGETS[player]}) # support sleepy
        dull_targets.dispatch(var, player, max_targets)

        ps.remove(player)
        while len(TARGETS[player]) < max_targets:
            target = random.choice(ps)
            ps.remove(target)
            TARGETS[player].add(target)
示例#7
0
def setup_variables(rolename):
    SEEN = UserSet()

    @event_listener("del_player", listener_id="<{}>.on_del_player".format(rolename))
    def on_del_player(evt, var, player, all_roles, death_triggers):
        SEEN.discard(player)

    @event_listener("new_role", listener_id="<{}>.on_new_role".format(rolename))
    def on_new_role(evt, var, user, old_role):
        if old_role == rolename and evt.data["role"] != rolename:
            SEEN.discard(user)

    @event_listener("chk_nightdone", listener_id="<{}>.on_chk_nightdone".format(rolename))
    def on_chk_nightdone(evt, var):
        evt.data["actedcount"] += len(SEEN)
        evt.data["nightroles"].extend(get_all_players((rolename,)))

    @event_listener("transition_night_end", priority=2, listener_id="<{}>.on_transition_night_end".format(rolename))
    def on_transition_night_end(evt, var):
        for seer in get_all_players((rolename,)):
            pl = get_players()
            random.shuffle(pl)
            pl.remove(seer)  # remove self from list

            a = "a"
            if rolename.startswith(("a", "e", "i", "o", "u")):
                a = "an"

            what = messages[rolename + "_ability"]

            to_send = "seer_role_info"
            if seer.prefers_simple():
                to_send = "seer_simple"
            seer.send(messages[to_send].format(a, rolename, what), messages["players_list"].format(", ".join(p.nick for p in pl)), sep="\n")

    @event_listener("begin_day", listener_id="<{}>.on_begin_day".format(rolename))
    def on_begin_day(evt, var):
        SEEN.clear()

    @event_listener("reset", listener_id="<{}>.on_reset".format(rolename))
    def on_reset(evt, var):
        SEEN.clear()

    return SEEN
示例#8
0
def setup_variables(rolename):
    SEEN = UserSet()

    @event_listener("del_player", listener_id="<{}>.on_del_player".format(rolename))
    def on_del_player(evt, var, player, all_roles, death_triggers):
        SEEN.discard(player)

    @event_listener("new_role", listener_id="<{}>.on_new_role".format(rolename))
    def on_new_role(evt, var, user, old_role):
        if old_role == rolename and evt.data["role"] != rolename:
            SEEN.discard(user)

    @event_listener("chk_nightdone", listener_id="<{}>.on_chk_nightdone".format(rolename))
    def on_chk_nightdone(evt, var):
        evt.data["acted"].extend(SEEN)
        evt.data["nightroles"].extend(get_all_players((rolename,)))

    @event_listener("transition_night_end", priority=2, listener_id="<{}>.on_transition_night_end".format(rolename))
    def on_transition_night_end(evt, var):
        for seer in get_all_players((rolename,)):
            pl = get_players()
            random.shuffle(pl)
            pl.remove(seer)  # remove self from list

            seer.send(messages["seer_info_general"].format(rolename), messages[rolename + "_info"])
            seer.send(messages["players_list"].format(pl))

    @event_listener("begin_day", listener_id="<{}>.on_begin_day".format(rolename))
    def on_begin_day(evt, var):
        SEEN.clear()

    @event_listener("reset", listener_id="<{}>.on_reset".format(rolename))
    def on_reset(evt, var):
        SEEN.clear()

    return SEEN
示例#9
0
import re
import random
from collections import defaultdict

from src.utilities import *
from src import users, channels, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_target, get_main_role
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event

KILLS = UserDict()  # type: Dict[users.User, users.User]
HUNTERS = UserSet()
PASSED = UserSet()


@command("kill",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("hunter", ))
def hunter_kill(var, wrapper, message):
    """Kill someone once per game."""
    if wrapper.source in HUNTERS and wrapper.source not in KILLS:
        wrapper.pm(messages["hunter_already_killed"])
        return
    target = get_target(var,
                        wrapper,
示例#10
0
import random

from src.utilities import *
from src import users, channels, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_all_roles, get_target, get_main_role, change_role
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange, add_lycanthropy, add_lycanthropy_scope
from src.cats import Wolf, All
from src.roles.helper.wolves import is_known_wolf_ally, send_wolfchat_message, register_wolf

register_wolf("alpha wolf")

ENABLED = False
ALPHAS = UserSet() # type: UserSet[users.User]
BITTEN = UserDict() # type: UserDict[users.User, users.User]

@command("bite", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("alpha wolf",))
def observe(var, wrapper, message):
    """Turn a player into a wolf!"""
    if not ENABLED:
        wrapper.pm(messages["alpha_no_bite"])
        return
    if wrapper.source in ALPHAS:
        wrapper.pm(messages["alpha_already_bit"])
        return
    target = get_target(var, wrapper, re.split(" +", message)[0])
    if not target:
        return
    if is_known_wolf_ally(var, wrapper.source, target):
示例#11
0
import re
import random
import itertools
import math
from collections import defaultdict

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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event

PRAYED = UserSet()  # type: Set[users.User]


@command("pray",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("prophet", ))
def pray(var, wrapper, message):
    """Receive divine visions of who has a role."""
    if wrapper.source in PRAYED:
        wrapper.pm(messages["already_prayed"])
        return

    what = re.split(" +", message)[0]
示例#12
0
import re
import random
import itertools
import math
from collections import defaultdict

from src.utilities import *
from src import users, channels, debuglog, errlog, plog
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange

REVEALED_MAYORS = UserSet()


@event_listener("chk_decision_lynch", priority=3)
def on_chk_decision_lynch(evt, var, voters):
    votee = evt.data["votee"]
    if votee in var.ROLES["mayor"] and votee not in REVEALED_MAYORS:
        channels.Main.send(messages["mayor_reveal"].format(votee))
        REVEALED_MAYORS.add(votee)
        evt.data["votee"] = None
        evt.prevent_default = True
        evt.stop_processing = True


@event_listener("reset")
def on_reset(evt, var):
    REVEALED_MAYORS.clear()
示例#13
0
from src.decorators import event_listener
from src.containers import UserSet
from src.functions import get_players
from src.events import Event

__all__ = ["add_disease", "remove_disease", "wolves_diseased"]

DISEASED = UserSet() # type: Set[users.User]
DISEASED_WOLVES = False

def add_disease(var, target):
    """Effect the target with disease. Fire the add_disease event."""
    if target in DISEASED or target not in get_players():
        return

    if Event("add_disease", {}).dispatch(var, target):
        DISEASED.add(target)

def remove_disease(var, target):
    """Remove the disease effect from the player."""
    DISEASED.discard(target)

def wolves_diseased(var):
    """Return whether or not wolves are currently diseased."""
    return DISEASED_WOLVES

@event_listener("transition_day_resolve_end")
def on_transition_day_resolve(evt, var, victims):
    global DISEASED_WOLVES
    for victim in evt.data["dead"]:
        if "@wolves" in evt.data["killers"][victim] and victim in DISEASED: # Silly wolves, eating a sick person... tsk tsk
示例#14
0
import itertools
import math
from collections import defaultdict

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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.events import Event
from src.cats import Wolf, Wolfchat

VISITED = UserDict()  # type: UserDict[users.User, users.User]
PASSED = UserSet()
FORCE_PASSED = UserSet()


@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(wrapper.source):
        wrapper.pm(messages["harlot_already_visited"].format(
            VISITED[wrapper.source]))
示例#15
0
文件: piper.py 项目: mweinelt/lykos
def charm(var, wrapper, message):
    """Charm a player or two, slowly leading to your win!"""
    pieces = re.split(" +", message)
    target1 = pieces[0]
    if len(pieces) > 1:
        if len(pieces) > 2 and pieces[1].lower() == "and":
            target2 = pieces[2]
        else:
            target2 = pieces[1]
    else:
        target2 = None

    target1 = get_target(var, wrapper, target1)
    if not target1:
        return

    if target2 is not None:
        target2 = get_target(var, wrapper, target2)
        if not target2:
            return

    orig1 = target1
    orig2 = target2

    target1 = try_misdirection(var, wrapper.source, target1)
    if target2 is not None:
        target2 = try_misdirection(var, wrapper.source, target2)

    if try_exchange(var, wrapper.source, target1) or try_exchange(
            var, wrapper.source, target2):
        return

    # Do these checks based on original targets, so piper doesn't know to change due to misdirection/luck totem
    if orig1 is orig2:
        wrapper.send(messages["must_charm_multiple"])
        return

    if orig1 in CHARMED and orig2 in CHARMED:
        wrapper.send(messages["targets_already_charmed"].format(orig1, orig2))
        return
    elif orig1 in CHARMED:
        wrapper.send(messages["target_already_charmed"].format(orig1))
        return
    elif orig2 in CHARMED:
        wrapper.send(messages["target_already_charmed"].format(orig2))
        return

    if wrapper.source in TOBECHARMED:
        TOBECHARMED[wrapper.source].clear()
    else:
        TOBECHARMED[wrapper.source] = UserSet()

    TOBECHARMED[wrapper.source].update({target1, target2} - {None})
    PASSED.discard(wrapper.source)

    if orig2:
        debuglog("{0} (piper) CHARM {1} ({2}) && {3} ({4})".format(
            wrapper.source, target1, get_main_role(target1), target2,
            get_main_role(target2)))
        wrapper.send(messages["charm_multiple_success"].format(orig1, orig2))
    else:
        debuglog("{0} (piper) CHARM {1} ({2})".format(wrapper.source, target1,
                                                      get_main_role(target1)))
        wrapper.send(messages["charm_success"].format(orig1))
示例#16
0
from datetime import datetime, timedelta
import random
import copy
import math
import re

from src.containers import UserDict, UserList, UserSet
from src.decorators import command, event_listener
from src.functions import get_players, get_target, get_reveal_role
from src.messages import messages
from src.status import try_absent, get_absent, get_forced_votes, get_forced_abstains, get_vote_weight, try_lynch_immunity, add_dying, kill_players
from src.events import Event
from src import channels

VOTES = UserDict()  # type: UserDict[users.User, UserList[users.User]]
ABSTAINS = UserSet()  # type: UserList[users.User]
ABSTAINED = False
LAST_VOTES = None
LYNCHED = 0  # type: int


@command("lynch", playing=True, pm=True, phases=("day", ))
def lynch(var, wrapper, message):
    """Use this to vote for a candidate to be lynched."""
    if not message:
        show_votes.func(var, wrapper, message)
        return
    if wrapper.private:
        return
    msg = re.split(" +", message)[0].strip()
示例#17
0
import random
import itertools
import math
from collections import defaultdict, deque

import botconfig
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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event

TARGETED = UserDict() # type: Dict[users.User, users.User]
PREV_ACTED = UserSet()

@command("target", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("assassin",))
def target(var, wrapper, message):
    """Pick a player as your target, killing them if you die."""
    if wrapper.source in PREV_ACTED:
        wrapper.send(messages["assassin_already_targeted"])
        return

    target = get_target(var, wrapper, re.split(" +", message)[0])
    if not target:
        return

    evt = Event("targeted_command", {"target": target, "misdirection": True, "exchange": True})
    if not evt.dispatch(var, wrapper.source, target):
        return
示例#18
0
import re
import random

from src import users, channels, status, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_main_role, get_target
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import All

from src.roles.helper.wolves import is_known_wolf_ally, register_wolf, send_wolfchat_message

register_wolf("doomsayer")

SEEN = UserSet()
LASTSEEN = UserDict()  # type: UserDict[users.User, users.User]
KILLS = UserDict()
SICK = UserDict()
LYCANS = UserDict()

_mappings = ("death", KILLS), ("lycan", LYCANS), ("sick", SICK)


@command("see",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("doomsayer", ))
示例#19
0
from src.containers import UserSet
from src.decorators import event_listener
from src.functions import get_main_role, change_role, get_players
from src.messages import messages
from src.events import Event

__all__ = ["add_exchange", "try_exchange"]

EXCHANGE = UserSet()  # type: Set[users.User]


def add_exchange(var, user):
    if user not in get_players():
        return
    EXCHANGE.add(user)


def try_exchange(var, actor, target):
    """Check if an exchange is happening. Return True if the exchange occurs."""
    if actor is target or target not in EXCHANGE:
        return False

    EXCHANGE.remove(target)

    role = get_main_role(actor)
    target_role = get_main_role(target)

    actor_role = change_role(var,
                             actor,
                             role,
                             target_role,
示例#20
0
# 4. Implement the "transition_day_begin" and "transition_night_end" events to give #
#    out totems if the shaman didn't act, and send night messages, respectively.    #
#    Implementation of the "get_role_metadata" event with the "role_categories"     #
#    kind is also necessary for the bot to know that the role exists at all. You    #
#    may look at existing shamans for reference. If your shaman isn't a wolf role,  #
#    the "lycanthropy_role" kind should also be implemented as follows:             #
#    evt.data[role] = {"role": "wolf shaman", "prefix": "shaman"}                   #
#    You will also need to implement your own "give" command; see existing          #
#    shamans for reference, or ask for help in our development channel.             #
#                                                                                   #
# It is generally unneeded to modify this file to add new totems or shaman roles    #
#####################################################################################

DEATH = UserDict()  # type: Dict[users.User, List[users.User]]
PROTECTION = UserList()  # type: List[users.User]
REVEALING = UserSet()  # type: Set[users.User]
NARCOLEPSY = UserSet()  # type: Set[users.User]
SILENCE = UserSet()  # type: Set[users.User]
DESPERATION = UserSet()  # type: Set[users.User]
IMPATIENCE = UserList()  # type: List[users.User]
PACIFISM = UserList()  # type: List[users.User]
INFLUENCE = UserSet()  # type: Set[users.User]
EXCHANGE = UserSet()  # type: Set[users.User]
LYCANTHROPY = UserSet()  # type: Set[users.User]
LUCK = UserSet()  # type: Set[users.User]
PESTILENCE = UserSet()  # type: Set[users.User]
RETRIBUTION = UserSet()  # type: Set[users.User]
MISDIRECTION = UserSet()  # type: Set[users.User]
DECEIT = UserSet()  # type: Set[users.User]

# holding vars that don't persist long enough to need special attention in
示例#21
0
import re
import random
import itertools
import math
from collections import defaultdict

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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event

MATCHMAKERS = UserSet()  # type: Set[users.User]
LOVERS = UserDict()  # type: Dict[users.User, Set[users.User]]


def _set_lovers(target1, target2):
    if target1 in LOVERS:
        LOVERS[target1].add(target2)
    else:
        LOVERS[target1] = UserSet({target2})

    if target2 in LOVERS:
        LOVERS[target2].add(target1)
    else:
        LOVERS[target2] = UserSet({target1})

    t1_msg = "matchmaker_target_notify"
    if target1.prefers_simple():
示例#22
0
import re
import random
import itertools
import math
from collections import defaultdict

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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange

JESTERS = UserSet() # type: UserSet[users.User]

@event_listener("lynch")
def on_lynch(evt, var, votee, voters):
    if votee in get_all_players(("jester",)):
        JESTERS.add(votee)

@event_listener("player_win")
def on_player_win(evt, var, player, main_role, all_roles, winner, team_win, survived):
    if player in JESTERS:
        evt.data["individual_win"] = True

@event_listener("transition_night_end")
def on_transition_night_end(evt, var):
    for jester in get_all_players(("jester",)):
        jester.send(messages["jester_notify"])
示例#23
0
import itertools
import math
from collections import defaultdict

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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event

from src.roles.helper.wolves import get_wolfchat_roles, is_known_wolf_ally, send_wolfchat_message

CURSED = UserDict()  # type: UserDict[users.User, users.User]
PASSED = UserSet()  # type: UserSet[users.Set]


@command("curse",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("warlock", ))
def curse(var, wrapper, message):
    target = get_target(var, wrapper, re.split(" +", message)[0])
    if not target:
        return

    if target in get_all_players(("cursed villager", )):
示例#24
0
import random
import itertools
import math
from collections import defaultdict

import botconfig
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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import Wolf

RECEIVED_INFO = UserSet()


def wolf_list(var):
    wolves = [wolf.nick for wolf in get_all_players(Wolf)]
    random.shuffle(wolves)
    return messages["wolves_list"].format(", ".join(wolves))


@event_listener("transition_night_end", priority=2)
def on_transition_night_end(evt, var):
    for minion in get_all_players(("minion", )):
        if minion in RECEIVED_INFO and not var.ALWAYS_PM_ROLE:
            continue
        minion.send(messages["minion_notify"])
        minion.send(wolf_list(var))
示例#25
0
import re
import random
import itertools
import math
from collections import defaultdict

import botconfig
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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event

ENTRANCED = UserSet() # type: Set[users.User]
VISITED = UserDict() # type: Dict[users.User, users.User]
PASSED = UserSet() # type: Set[users.User]
ALL_SUCC_IDLE = True

@command("visit", chan=False, pm=True, playing=True, silenced=True, phases=("night",), roles=("succubus",))
def hvisit(var, wrapper, message):
    """Entrance a player, converting them to your team."""
    if VISITED.get(wrapper.source):
        wrapper.send(messages["succubus_already_visited"].format(VISITED[wrapper.source]))
        return

    target = get_target(var, wrapper, re.split(" +", message)[0], not_self_message="succubus_not_self")
    if not target:
        return
示例#26
0
import random
import itertools
import math
from collections import defaultdict

import botconfig
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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.events import Event

VISITED = UserDict()  # type: Dict[users.User, users.User]
PASSED = UserSet()  # type: Set[users.User]


@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(wrapper.source):
        wrapper.pm(messages["harlot_already_visited"].format(
            VISITED[wrapper.source]))
示例#27
0
import math
from collections import defaultdict

import src.settings as var
from src.utilities import *
from src import users, channels, debuglog, errlog, plog
from src.functions import get_players, get_all_players, get_target, get_main_role
from src.decorators import command, event_listener
from src.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange, add_protection, add_dying
from src.cats import Wolf

GUARDED = UserDict()  # type: UserDict[users.User, users.User]
LASTGUARDED = UserDict()  # type: UserDict[users.User, users.User]
PASSED = UserSet()


@command("guard",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("guardian angel", ))
def guard(var, wrapper, message):
    """Guard a player, preventing them from being killed that night."""
    if wrapper.source in GUARDED:
        wrapper.pm(messages["already_protecting"])
        return
示例#28
0
import re
import random
import itertools
import math
from collections import defaultdict

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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.events import Event

ENTRANCED = UserSet()
VISITED = UserDict()  # type: UserDict[users.User, users.User]
PASSED = UserSet()
FORCE_PASSED = UserSet()
ALL_SUCC_IDLE = True


@command("visit",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("night", ),
         roles=("succubus", ))
def hvisit(var, wrapper, message):
    """Entrance a player, converting them to your team."""
示例#29
0
import random
import itertools
import math
from collections import defaultdict

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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.events import Event
from src.cats import Neutral, Wolfteam

INVESTIGATED = UserSet()


@command("id",
         "investigate",
         chan=False,
         pm=True,
         playing=True,
         silenced=True,
         phases=("day", ),
         roles=("investigator", ))
def investigate(var, wrapper, message):
    """Investigate two players to determine their relationship to each other."""
    if wrapper.source in INVESTIGATED:
        wrapper.pm(messages["already_investigated"])
        return
示例#30
0
import random
import itertools
import math
from collections import defaultdict

import botconfig
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.containers import UserList, UserSet, UserDict, DefaultUserDict
from src.messages import messages
from src.status import try_misdirection, try_exchange
from src.cats import Wolf

RECEIVED_INFO = UserSet()
KNOWS_MINIONS = UserSet()

def wolf_list(var):
    wolves = [wolf.nick for wolf in get_all_players(Wolf)]
    random.shuffle(wolves)
    return messages["wolves_list"].format(", ".join(wolves))

@event_listener("transition_night_end", priority=2)
def on_transition_night_end2(evt, var):
    for minion in get_all_players(("minion",)):
        if minion in RECEIVED_INFO and not var.ALWAYS_PM_ROLE:
            continue
        minion.send(messages["minion_notify"])
        minion.send(wolf_list(var))
        RECEIVED_INFO.add(minion)