def _check_guild(guild: Guild):
    """Check that the guild has a correct configuration. Some properties may not be tested."""
    logger.info("Checking game guild !")
    errors_bot_role = _check_bot_privileges(guild)
    if errors_bot_role:
        return errors_bot_role
    guild_channels = guild.channels
    errors = []
    for ch_descr in CategoryChannelCollection.to_list():
        check_channel_description(
            ch_descr,
            guild,
            guild_channels,
            errors,
            allowed_role_descriptions=RoleCollection.to_list())

    for ch_descr in ChannelCollection.to_list():
        check_channel_description(
            ch_descr,
            guild,
            guild_channels,
            errors,
            allowed_role_descriptions=RoleCollection.to_list())

    for r_descr in RoleCollection.to_list():
        check_role_description(r_descr, guild, errors)
    return errors
示例#2
0
 def __init__(self, **kwargs):
     self._correct_answers_proportion = kwargs.pop(
         "correct_answers_proportions", 0.2)
     # all optional answers = optional_answers_bonus_proportion of correct answers
     self._optional_answers_bonus_proportion = kwargs.pop(
         "optional_answers_bonus_proportion", 0.5)
     self._voice_channel_description = ChannelCollection.get(
         kwargs.pop("voice_channel_description", "ROOM2_VOICE"))
     self._back_channel_description = ChannelCollection.get(
         kwargs.pop("back_channel_description", "AUDIO_BACK"))
     self._singer_role_description = RoleCollection.get(
         kwargs.pop("singer_role_description", "SINGER"))
     self._character_description = CharacterCollection.get(
         kwargs.pop("character_description", "CHARACTER2"))
     self._ignored_roles_descriptions = [
         RoleCollection.get(role_name) for role_name in kwargs.pop(
             "ignored_roles_descriptions", ["DEV", "MASTER"])
     ]
     super().__init__(**kwargs)
     self._simple_mode = None  # No simple mode
     self._channels = ChannelGameStatuses(AskWordsChannelStatus)
     self._nb_mandatory = len(self._messages["MANDATORY_ANSWERS"])
     self._nb_correct = len(self._messages["CORRECT_ANSWERS"])
     self._nb_optional = len(self._messages["OPTIONAL_ANSWERS"])
     if self._nb_optional:
         self._factor_optional = self._optional_answers_bonus_proportion * self._nb_correct / self._nb_optional
     else:
         self._factor_optional = 0
    def __init__(self, **kwargs):
        self._introduction_channel_d = ChannelCollection.get(kwargs.pop("introduction_channel", "WELCOME"))
        self._support_channel_d = ChannelCollection.get(kwargs.pop("support_channel", "SUPPORT"))
        self._master_role_description = RoleCollection.get(kwargs.pop("master_role_description", "MASTER"))
        self._default_role_description = RoleCollection.get(
            kwargs.pop("default_role_description", "DEFAULT"))  # no right
        self._visitor_role_description = RoleCollection.get(
            kwargs.pop("visitor_role_description", "VISITOR"))  # see/send
        self._emoji_to_team_role_key = OrderedDict([(k, RoleCollection.get(v)) for k, v in kwargs.pop(
            "emoji_to_team_role_key",
            OrderedDict([(Emojis.red_circle, "TEAM1"), (Emojis.blue_circle, "TEAM2"), (Emojis.white_circle, "TEAM3")])
        ).items()])
        self._character_role_descriptions_dict = {
            key: RoleCollection.get(role_key)
            for key, role_key in kwargs.pop("character_role_descriptions_dict",
                                            {"character_1": "CHARACTER1", "character_2": "CHARACTER2",
                                             "character_3": "CHARACTER3", "character_4": "CHARACTER4"}).items()}
        self._nb_teams = kwargs.pop("nb_teams", 3)
        self._max_number_per_team = kwargs.pop("max_number_per_team", 8)

        super().__init__(**kwargs)
        self._step = 0
        self._max_step = 5
        self._counter_2_to_3 = 0
        self._rolemenu_manager = None
        self._rules_msg_id = None
        self._choose_team_msg = None
        self._nb_players = None
        self._nb_teams_command = "!teams"
 def __init__(self, **kwargs):
     self._next_minigame_class_d = MinigameCollection.get(
         kwargs.pop("next_minigame_class", "KITCHEN"))
     self._next_channel_description = ChannelCollection.get(
         kwargs.pop("next_channel_description", "KITCHEN1"))
     self._ignored_role_descriptions = [
         RoleCollection.get(item)
         for item in kwargs.pop("ignored_role_descriptions", ["MASTER"])
     ]
     self._allowed_role_descriptions = [
         RoleCollection.get(item)
         for item in kwargs.pop("allowed_role_descriptions", ["VISITOR"])
     ]
     super().__init__(**kwargs)
     self._channels = ChannelGameStatuses(CountEveryoneChannelStatus)
示例#5
0
async def init_guild(guild_wrapper) -> bool:
    """Coroutine to initialize a new a guild or to reset it when the version has changed."""
    # Print information on the guild
    logger.info(get_guild_info(BOT, guild_wrapper))
    logger.info(get_members_info(guild_wrapper))
    logger.info(get_roles_info(guild_wrapper))
    logger.info(get_channels_info(guild_wrapper))

    # Get existing channels and roles, but do not set/create/update anything
    await fetch_roles(guild_wrapper, RoleCollection.to_list())
    await fetch_channels(guild_wrapper, CategoryChannelCollection.to_list())
    await fetch_channels(guild_wrapper, ChannelCollection.to_list())

    # Add guild listeners and show the control panel
    await guild_wrapper.add_listeners(UtilsList(guild_wrapper))  # add utils
    await guild_wrapper.add_listeners(
        MinigameCollection.get_guild_instances(guild_wrapper))  # add minigames
    if VERBOSE >= 10:
        await guild_wrapper.listener_manager.show_control_panel(
            guild_wrapper.guild)  # show control panel

    # Send a success message
    try:
        channel = await get_safe_text_channel(guild_wrapper.guild,
                                              "BOARD",
                                              create=False)
        if VERBOSE >= 10:
            await channel.send("Bot redémarré !")
    except discord.DiscordException as err:
        logger.error(f"Failed to send reboot message: {err}")
        return False
    else:
        logger.info("Guild initialized successfully")
        return True
 def __init__(self, **kwargs):
     description_names = kwargs.pop("channel_descriptions", None)
     self._channel_descriptions = ChannelCollection.to_list() if description_names is None \
         else [ChannelCollection.get(name) for name in description_names]
     self._init_channel_description = ChannelCollection.get(kwargs.pop("init_channel_description", "WELCOME"))
     self._visitor_role_description = RoleCollection.get(kwargs.pop("visitor_role_description", "VISITOR"))
     super().__init__(**kwargs)
示例#7
0
 def __init__(self, **kwargs):
     self._prefix = kwargs.pop("prefix", ".")
     self._master_role_description = RoleCollection.get(
         kwargs.pop("master_role_description", "MASTER"))
     self._emoji_key = kwargs.pop("emoji_key", "👋")
     self._role_to_character_description_dict: Dict[
         RoleDescription, CharacterDescription] = {
             RoleCollection.get(role_key):
             CharacterCollection.get(character_key)
             for role_key, character_key in kwargs.pop(
                 "role_to_character_description_dict", {
                     "CHARACTER1": "CHARACTER1",
                     "CHARACTER2": "CHARACTER2"
                 }).items()
         }
     super().__init__(**kwargs)
     self._sep = " "
     self._channels = ChannelGameStatuses(StoryTellingChannelStatus)
示例#8
0
 def __init__(self, **kwargs):
     self._max_users_with_role = kwargs.pop("max_users_with_role", 2)
     self._max_number_of_reactions_per_user = kwargs.pop(
         "max_number_of_reactions_per_user", 1)
     self._allow_role_change = kwargs.pop("allow_role_change", True)
     self._visitor_d = RoleCollection.get(kwargs.pop(
         "visitor_d", "VISITOR"))
     self._characters_menu = OrderedDict([
         (k, [RoleCollection.get(v)]) for k, v in kwargs.pop(
             "characters_menu",
             OrderedDict([(Emojis.sunflower,
                           "CHARACTER1"), (Emojis.anchor, "CHARACTER2"),
                          (Emojis.mag,
                           "CHARACTER"), (Emojis.mag_right,
                                          "CHARACTER4")])).items()
     ])
     super().__init__(**kwargs)
     self._channels = ChannelGameStatuses(ChestGameChannelStatus)
示例#9
0
 def __init__(self, **kwargs):
     self._commands_channel_description = ChannelCollection.get(
         kwargs.pop("commands_channel_description", "COMMANDS"))
     self._init_channel_description = ChannelCollection.get(
         kwargs.pop("init_channel_description", "WELCOME"))
     self._visitor_role_description = RoleCollection.get(
         kwargs.pop("visitor_role_description", "VISITOR"))
     super().__init__(**kwargs)
     self._simple_mode = None
示例#10
0
 def __init__(self, **kwargs):
     self._next_minigame_class_d = MinigameCollection.get(
         kwargs.pop("next_minigame_class", None))
     self._next_channel_description = ChannelCollection.get(
         kwargs.pop("next_channel_description", "ATTIC1"))
     self._master_role_description = RoleCollection.get(
         kwargs.pop("master_role_description", "MASTER"))
     super().__init__(**kwargs)
     self._channels: ChannelGameStatuses = ChannelGameStatuses(
         FTRGameStatus)
示例#11
0
async def update_guild_roles(guild: Guild,
                             delete_old=False,
                             clear_references=True) -> bool:
    logger.info("Doing: update server roles")
    upd_ok = await update_roles(guild,
                                RoleCollection.to_list(),
                                delete_old=delete_old,
                                clear_references=clear_references)
    logger.info(f"Done{'' if upd_ok else ' with errors'}: update server roles")
    return upd_ok
def _check_bot_privileges(guild: Guild):
    highest_game_role_description = max(
        r.object_reference or guild.default_role
        for r in RoleCollection.to_list())
    highest_bot_role = guild.me.top_role
    if highest_bot_role >= highest_game_role_description:
        return []
    err = f"Highest bot role ({highest_bot_role}) must be higher than other game roles in hierarchy! " \
          f"At least one role with a higher position ({highest_game_role_description}) was found."
    logger.error(err)
    return [err]
示例#13
0
 async def cacher_embarquement(self, message, args):
     channels = [
         ChannelCollection.get("WELCOME").object_reference,
         ChannelCollection.get("SUPPORT_VOICE").object_reference
     ]
     for channel in channels:
         await channel.edit(
             overwrites={
                 RoleCollection.get("DEFAULT").object_reference:
                 PermissionOverwrite(view_channel=False)
             })
     await self._memo_channel_description.object_reference.send(
         f"OK step {message.content}")
示例#14
0
 async def plage_commune(self, message, args):
     channels = [
         ChannelCollection.get("MAIN_ROOM").object_reference,
         ChannelCollection.get("MAIN_ROOM_VOICE").object_reference
     ]
     for channel in channels:
         await channel.edit(
             overwrites={
                 RoleCollection.get("DEFAULT").object_reference:
                 PermissionOverwrite(view_channel=True)
             })
     await self._memo_channel_description.object_reference.send(
         f"OK step {message.content}")
示例#15
0
 def __init__(self, **kwargs):
     self._image_remaining_duration = kwargs.pop("image_remaining_duration",
                                                 10)
     self._interval_between_messages = kwargs.pop(
         "interval_between_messages", 15)
     self._max_use_flashlight = kwargs.pop("max_use_flashlight", 4)
     self._max_use_candle = kwargs.pop("max_use_candle", 3)
     self._max_use_matches = kwargs.pop("max_use_matches", 3)
     self._master_role_description = RoleCollection.get(
         kwargs.pop("master_role_description", "MASTER"))
     self._map_channel_description = ChannelCollection.get(
         kwargs.pop("map_channel_description", "MAP_ROOM1"))
     self._map_channel_minigame_d = MinigameCollection.get(
         kwargs.pop("map_channel_minigame", "MAP"))
     self._map_channel_minigame_simple_d = MinigameCollection.get(
         kwargs.pop("map_channel_minigame_simple", "MAP2"))
     self._chest_channel_description = ChannelCollection.get(
         kwargs.pop("chest_channel_description", "CHEST_ROOM1"))
     self._chest_channel_minigame_d = MinigameCollection.get(
         kwargs.pop("chest_channel_minigame", "CHEST"))
     self._max_uses_type = MaxUsesType[kwargs.pop("max_uses_type",
                                                  "GLOBAL")]
     super().__init__(**kwargs)
     self._channels = ChannelGameStatuses(AtticGameChannelStatus)
示例#16
0
async def show_roles(message):
    await long_send(message.channel, RoleCollection.to_str(), quotes=True)
示例#17
0
async def fetch(guild):
    await fetch_roles(guild, RoleCollection.to_list())
    await fetch_channels(guild, CategoryChannelCollection.to_list())
    await fetch_channels(guild, ChannelCollection.to_list())
    logger.debug("Channels fetched")
示例#18
0
def clear_object_references():
    RoleCollection.reset_object_references()
    ChannelCollection.reset_object_references()
    CategoryChannelCollection.reset_object_references()
    CharacterCollection.reset_object_references()
    GuildCollection.reset_object_references()