Add 'scheduleseriesmanually' command
This commit is contained in:
		
							parent
							
								
									395fba2778
								
							
						
					
					
						commit
						4c6ba8049b
					
				| 
						 | 
					@ -315,6 +315,94 @@ class AssignOwnerCommand(Command):
 | 
				
			||||||
        #except:
 | 
					        #except:
 | 
				
			||||||
            #await msg.channel.send("We hit a snag. Tell xvi.")
 | 
					            #await msg.channel.send("We hit a snag. Tell xvi.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ScheduleSeriesManuallyCommand():
 | 
				
			||||||
 | 
					    name = "scheduleseriesmanually"
 | 
				
			||||||
 | 
					    template = "m;scheduleseriesmanually [minutesToWaitBetweenGames] [awayTeam] @[homeTeam]"
 | 
				
			||||||
 | 
					    description = "Runs a series of games between specified teams."
 | 
				
			||||||
 | 
					    max_games_at_once = 5 # number of simultaneous games this series will attempt to run
 | 
				
			||||||
 | 
					    global_game_cap = 7 # do not schedule any games if there are more than this number of games
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def isauthorized(self, user):
 | 
				
			||||||
 | 
					        return user.id in config()["owners"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#    async def startgamedebug(self, msg, team1, team2, innings):
 | 
				
			||||||
 | 
					#        print("{},{} s".format(team1,team2))
 | 
				
			||||||
 | 
					#        gamesarray.append("{},{} s".format(team1,team2))
 | 
				
			||||||
 | 
					#        await asyncio.sleep(6)
 | 
				
			||||||
 | 
					#        gamesarray.pop(gamesarray.index("{},{} s".format(team1,team2)))
 | 
				
			||||||
 | 
					#        print("{},{} end".format(team1,team2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def startgame(self, msg, team1, team2, innings):
 | 
				
			||||||
 | 
					        game = games.game(msg.author.name, team1, team2, length=innings)
 | 
				
			||||||
 | 
					        channel = msg.channel
 | 
				
			||||||
 | 
					        user_mention = msg.author.mention
 | 
				
			||||||
 | 
					        game_task = asyncio.create_task(watch_game(channel, game, user=msg.author))
 | 
				
			||||||
 | 
					        await game_task
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def execute(self, msg, command):
 | 
				
			||||||
 | 
					        command = command.strip().split("\n")
 | 
				
			||||||
 | 
					        if len(command) == 0:
 | 
				
			||||||
 | 
					            await channel.send("Not a very exciting series, but sure! \n ...aand it's done! Nobody won, but nobody lost either.")
 | 
				
			||||||
 | 
					        if len(command) % 2 == 1:
 | 
				
			||||||
 | 
					            await channel.send(f"I need a number of minutes to wait between games, then an even number of teams. Are you missing a team name somewhere?")
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        delay_between_match_start_attempts = 60
 | 
				
			||||||
 | 
					        configLine = command[1].strip().split(" ")
 | 
				
			||||||
 | 
					        if configLine[0].isnumeric() and int(configLine[0]) > 2:
 | 
				
			||||||
 | 
					            delay_between_match_start_attempts = int(configLine[0])*60
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            await channel.send("The second line should be the interval each game should start at! Maybe 5 minutes?")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # optional: number of innings
 | 
				
			||||||
 | 
					        innings = 9
 | 
				
			||||||
 | 
					        if len(configLine) > 2:
 | 
				
			||||||
 | 
					            if configLine[1].isnumeric():
 | 
				
			||||||
 | 
					                innings = int(configLine[1])
 | 
				
			||||||
 | 
					                innings = max(3,min(innings, 30))
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                await channel.send(f"{configLine[1]} doesn't sound like a valid number of innings?")
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        # parse team pairs of team1\n@team2
 | 
				
			||||||
 | 
					        teamPairLines = command[2:]
 | 
				
			||||||
 | 
					        teamPairs = []
 | 
				
			||||||
 | 
					        for i in range(0,len(teamPairLines), 2):
 | 
				
			||||||
 | 
					            awayTeam = teamPairLines[i]
 | 
				
			||||||
 | 
					            homeTeam = teamPairLines[i+1]
 | 
				
			||||||
 | 
					            if homeTeam[0] == "@":
 | 
				
			||||||
 | 
					                homeTeam = homeTeam[1:].strip()
 | 
				
			||||||
 | 
					            teamPairs.append((awayTeam, homeTeam))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # to do: validate each team name
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        gametasks = []
 | 
				
			||||||
 | 
					        num_games_started = 0
 | 
				
			||||||
 | 
					        num_games_in_series = len(teamPairs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        notified_about_delay = False
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        while num_games_started < num_games_in_series:
 | 
				
			||||||
 | 
					            if len(gamesarray) > self.global_game_cap:
 | 
				
			||||||
 | 
					                # There's too many simultaneous games going on right now!
 | 
				
			||||||
 | 
					                if not notified_about_delay:
 | 
				
			||||||
 | 
					                    await channel.send("We're limiting the number of simultaneous games to avoid hitting Discord limits, and there's too many games right now. Hang tight and we'll let you know when there's a spot in the queue open.")
 | 
				
			||||||
 | 
					                    notified_about_delay = True
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                num_possible_game_slots = min(self.global_game_cap - len(gamesarray), self.max_games_at_once)
 | 
				
			||||||
 | 
					                for i in range(num_possible_game_slots):
 | 
				
			||||||
 | 
					                    # attempt to start another game
 | 
				
			||||||
 | 
					                    awayTeam, homeTeam = teamPairs[num_games_started]
 | 
				
			||||||
 | 
					                    game = asyncio.ensure_future(self.startgame(msg, awayTeam, homeTeam, innings))
 | 
				
			||||||
 | 
					                    gametasks.append(game)
 | 
				
			||||||
 | 
					                    notified_about_delay = False # if another delay happens, let the users know about it
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    num_games_started += 1
 | 
				
			||||||
 | 
					                    if num_games_started >= num_games_in_series:
 | 
				
			||||||
 | 
					                        break
 | 
				
			||||||
 | 
					            await asyncio.sleep(delay_between_match_start_attempts)
 | 
				
			||||||
 | 
					        #every game has been started, wait for them to end
 | 
				
			||||||
 | 
					        await asyncio.gather(*gametasks)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
commands = [
 | 
					commands = [
 | 
				
			||||||
    IntroduceCommand(),
 | 
					    IntroduceCommand(),
 | 
				
			||||||
| 
						 | 
					@ -331,6 +419,7 @@ commands = [
 | 
				
			||||||
    ShowAllTeamsCommand(),
 | 
					    ShowAllTeamsCommand(),
 | 
				
			||||||
    SearchTeamsCommand(),
 | 
					    SearchTeamsCommand(),
 | 
				
			||||||
    StartGameCommand(),
 | 
					    StartGameCommand(),
 | 
				
			||||||
 | 
					    ScheduleSeriesManuallyCommand(),
 | 
				
			||||||
    CreditCommand(),
 | 
					    CreditCommand(),
 | 
				
			||||||
    RomanCommand(),
 | 
					    RomanCommand(),
 | 
				
			||||||
    HelpCommand(),
 | 
					    HelpCommand(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue