async def start(self, ctx):
        """Start command"""

        import globvars

        # The player has already voted to start
        if ctx.author.id in globvars.start_votes:
            return

        game = botutils.GameChooser().get_selected_game()

        if len(globvars.master_state.pregame) < game.MIN_PLAYERS:
            msg = fstart_min.format(ctx.author.mention,
                                    botutils.BotEmoji.cross, str(game),
                                    game.MIN_PLAYERS)
            await ctx.send(msg)
            return

        if len(globvars.master_state.pregame) > game.MAX_PLAYERS:
            msg = fstart_max.format(ctx.author.mention,
                                    botutils.BotEmoji.cross, str(game),
                                    game.MAX_PLAYERS)
            await ctx.send(msg)
            return

        # The player has not voted to start yet
        else:

            globvars.start_votes.append(ctx.author.id)

            # First person to vote. Start the clear start votes timer
            if len(globvars.start_votes) == 1:
                if start_votes_timer.is_running():
                    start_votes_timer.cancel()
                start_votes_timer.start()

            # Calculate the number of votes needed
            votes_needed = max(len(globvars.master_state.pregame) - 3, 3)

            # Reached the number of votes needed. Start the game.
            if len(globvars.start_votes) == votes_needed:
                game = botutils.GameChooser().get_selected_game()
                globvars.master_state.game = game
                await globvars.master_state.game.start_game()
                botutils.update_state_machine()

                # Clear the start votes
                globvars.start_votes.clear()

                return

            votes_left = votes_needed - len(globvars.start_votes)

            # Do not have a negative number of votes required to start
            if votes_left < 0:
                return

            msg = start_str.format(ctx.author.name, votes_left,
                                   "vote" if votes_left == 1 else "votes")
            await ctx.send(msg)
示例#2
0
    async def fstart(self, ctx):
        """Force start command"""

        import globvars

        game = botutils.GameChooser().get_selected_game()

        # Make sure all the players are still in the guild
        globvars.master_state.pregame.remove_left_guild_players()

        if len(globvars.master_state.pregame) < game.MIN_PLAYERS:
            msg = fstart_min.format(ctx.author.mention,
                                    botutils.BotEmoji.x_emoji, str(game),
                                    game.MIN_PLAYERS)
            await ctx.send(msg)
            return

        if len(globvars.master_state.pregame) > game.MAX_PLAYERS:
            msg = fstart_max.format(ctx.author.mention,
                                    botutils.BotEmoji.x_emoji, str(game),
                                    game.MAX_PLAYERS)
            await ctx.send(msg)
            return

        globvars.master_state.game = game
        await globvars.master_state.game.start_game()
        botutils.update_state_machine()

        # Clear the start votes
        globvars.start_votes.clear()
    async def fstart(self, ctx):
        """Force start command"""

        import globvars

        game = botutils.GameChooser().get_selected_game()

        if len(globvars.master_state.pregame) < game.MIN_PLAYERS:
            msg = fstart_min.format(ctx.author.mention,
                                    botutils.BotEmoji.cross, str(game),
                                    game.MIN_PLAYERS)
            await ctx.send(msg)
            return

        if len(globvars.master_state.pregame) > game.MAX_PLAYERS:
            msg = fstart_min
            msg = fstart_min.format(ctx.author.mention,
                                    botutils.BotEmoji.cross, str(game),
                                    game.MAX_PLAYERS)
            await ctx.send(msg)
            return

        globvars.master_state.game = game
        await globvars.master_state.game.start_game()
        botutils.update_state_machine()
    async def fjoin(self, ctx, *, member: discord.Member):
        """Force join command"""

        import globvars

        game = botutils.GameChooser().get_selected_game()

        # Too many players
        if len(globvars.master_state.pregame) >= game.MAX_PLAYERS:
            msg = fjoin_max
            msg = fjoin_max.format(ctx.author.mention, botutils.BotEmoji.cross,
                                   str(game), game.MAX_PLAYERS)
            await ctx.send(msg)
            return

        # The player has already joined
        if globvars.master_state.pregame.is_joined(member.id):
            await ctx.send(fjoined_str.format(ctx.author.mention, member.name))

        # The player has not yet joined. Make them join.
        else:
            globvars.master_state.pregame.safe_add_player(member.id)
            botutils.update_state_machine()
            await ctx.send(
                fjoin_str.format(member.name,
                                 len(globvars.master_state.pregame)))

        # If you are the first player to join the game, then start the lobby timeout loop
        if len(globvars.master_state.pregame) == 1:
            lobby_timeout.start()

        await botutils.add_alive_role(member)
示例#5
0
    async def fjoin(self, ctx, *members: Union[discord.Member, discord.User,
                                               str]):
        """Force join command"""

        import globvars

        game = botutils.GameChooser().get_selected_game()

        for member in members:
            if isinstance(member, str):
                member = botutils.get_member_from_string(member)
                if member is None:
                    continue

            # The player is a bot
            if member.bot:
                await ctx.send(cant_fjoin_bot.format(ctx.author.mention))
                return

            # Too many players
            if len(globvars.master_state.pregame) >= game.MAX_PLAYERS:
                msg = fjoin_max.format(ctx.author.mention,
                                       botutils.BotEmoji.x_emoji, str(game),
                                       game.MAX_PLAYERS)
                await ctx.send(msg)
                return

            # The player has already joined
            if globvars.master_state.pregame.is_joined(member.id):
                await ctx.send(
                    fjoined_str.format(ctx.author.mention, member.name))

            # The player has not yet joined. Make them join.
            else:
                globvars.master_state.pregame.safe_add_player(member.id)
                botutils.update_state_machine()
                await ctx.send(
                    fjoin_str.format(member.name,
                                     len(globvars.master_state.pregame)))

            # If you are the first player to join the game, then start the lobby timeout loop
            if len(globvars.master_state.pregame) == 1:
                lobby_timeout.start()

            await botutils.add_alive_role(member)