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)
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)
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)