Compare commits
	
		
			3 Commits
		
	
	
		
			master
			...
			ww_develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0250a297e1 | ||
|   | 711c83ddbb | ||
|   | 4523ffc98d | 
| @ -62,6 +62,8 @@ class Game: | ||||
|         village: discord.TextChannel = None, | ||||
|         log_channel: discord.TextChannel = None, | ||||
|         game_code=None, | ||||
|         day_length=HALF_DAY_LENGTH * 2, | ||||
|         night_length=HALF_NIGHT_LENGTH * 2, | ||||
|     ): | ||||
|         self.bot = bot | ||||
|         self.guild = guild | ||||
| @ -73,6 +75,9 @@ class Game: | ||||
|         self.day_vote = {}  # author: target | ||||
|         self.vote_totals = {}  # id: total_votes | ||||
| 
 | ||||
|         self.half_day_length = day_length // 2 | ||||
|         self.half_night_length = night_length // 2 | ||||
| 
 | ||||
|         self.started = False | ||||
|         self.game_over = False | ||||
|         self.any_votes_remaining = False | ||||
| @ -97,6 +102,7 @@ class Game: | ||||
| 
 | ||||
|         self.loop = asyncio.get_event_loop() | ||||
| 
 | ||||
|         self.cycle_task = None | ||||
|         self.action_queue = deque() | ||||
|         self.current_action = None | ||||
|         self.listeners = {} | ||||
| @ -116,6 +122,13 @@ class Game: | ||||
|     #     for c_data in self.p_channels.values(): | ||||
|     #         asyncio.ensure_future(c_data["channel"].delete("Werewolf game-over")) | ||||
| 
 | ||||
|     def _prestart_status(self, ctx): | ||||
|         return ( | ||||
|             f"Currently **{len(self.players)} / {len(self.roles)}**\n" | ||||
|             f"Use `{ctx.prefix}ww code` to pick a game setup\n" | ||||
|             f"Use `{ctx.prefix}buildgame` to generate a new game" | ||||
|         ) | ||||
| 
 | ||||
|     async def setup(self, ctx: commands.Context): | ||||
|         """ | ||||
|         Runs the initial setup | ||||
| @ -127,15 +140,20 @@ class Game: | ||||
|         4. Start game | ||||
|         """ | ||||
|         if self.game_code: | ||||
|             # Turn random roles into real roles | ||||
|             await self.get_roles(ctx) | ||||
|         else: | ||||
|             await ctx.maybe_send_embed( | ||||
|                 f"No game code has been assigned, cannot start\n{self._prestart_status(ctx)}" | ||||
|             ) | ||||
|             return False | ||||
| 
 | ||||
|         if len(self.players) != len(self.roles): | ||||
|             await ctx.maybe_send_embed( | ||||
|                 f"Player count does not match role count, cannot start\n" | ||||
|                 f"Currently **{len(self.players)} / {len(self.roles)}**\n" | ||||
|                 f"Use `{ctx.prefix}ww code` to pick a game setup\n" | ||||
|                 f"Use `{ctx.prefix}buildgame` to generate a new game" | ||||
|                 f"{self._prestart_status(ctx)}" | ||||
|             ) | ||||
|             # Clear the roles to be randomly generated again | ||||
|             self.roles = [] | ||||
|             return False | ||||
| 
 | ||||
| @ -156,6 +174,7 @@ class Game: | ||||
|                 self.roles = [] | ||||
|                 return False | ||||
| 
 | ||||
|         # Check if the role is already in use. If so, cannot continue until removed | ||||
|         anyone_with_role = await anyone_has_role(self.guild.members, self.game_role) | ||||
|         if anyone_with_role is not None: | ||||
|             await ctx.maybe_send_embed( | ||||
| @ -164,6 +183,7 @@ class Game: | ||||
|             ) | ||||
|             return False | ||||
| 
 | ||||
|         # Add the game role to those who are playing | ||||
|         try: | ||||
|             for player in self.players: | ||||
|                 await player.member.add_roles(*[self.game_role]) | ||||
| @ -175,6 +195,7 @@ class Game: | ||||
|             ) | ||||
|             return False | ||||
| 
 | ||||
|         # Randomly assign the roles in the game to the players | ||||
|         await self.assign_roles() | ||||
| 
 | ||||
|         # Create category and channel with individual overwrites | ||||
| @ -219,14 +240,16 @@ class Game: | ||||
|                 return False | ||||
|         else: | ||||
|             self.save_perms[self.village_channel] = self.village_channel.overwrites | ||||
|             try: | ||||
|                 await self.village_channel.edit( | ||||
|                     name="🔵werewolf", | ||||
|                     reason="(BOT) New game of werewolf", | ||||
|                 ) | ||||
|             except discord.Forbidden as e: | ||||
|                 log.exception("Unable to rename Game Channel") | ||||
|                 await ctx.maybe_send_embed("Unable to rename Game Channel, ignoring") | ||||
| 
 | ||||
|             # Disable renaming channels, too easy to get rate limited. | ||||
|             # try: | ||||
|             #     await self.village_channel.edit( | ||||
|             #         name="🔵werewolf", | ||||
|             #         reason="(BOT) New game of werewolf", | ||||
|             #     ) | ||||
|             # except discord.Forbidden as e: | ||||
|             #     log.exception("Unable to rename Game Channel") | ||||
|             #     await ctx.maybe_send_embed("Unable to rename Game Channel, ignoring") | ||||
| 
 | ||||
|             try: | ||||
|                 for target, ow in overwrite.items(): | ||||
| @ -283,9 +306,9 @@ class Game: | ||||
|                 self.vote_groups[channel_id] = vote_group | ||||
| 
 | ||||
|         log.debug("Pre-cycle") | ||||
|         await asyncio.sleep(0) | ||||
|         await asyncio.sleep(0)  # Pass back to controller to avoid heartbeat issues | ||||
| 
 | ||||
|         asyncio.create_task(self._cycle())  # Start the loop | ||||
|         self.cycle_task = asyncio.create_task(self._cycle())  # Start the loop | ||||
|         return True | ||||
| 
 | ||||
|     # ###########START Notify structure############ | ||||
| @ -360,13 +383,15 @@ class Game: | ||||
|         self.any_votes_remaining = True | ||||
| 
 | ||||
|         # Now we sleep and let the day happen. Print the remaining daylight half way through | ||||
|         await asyncio.sleep(HALF_DAY_LENGTH)  # 4 minute days FixMe to 120 later | ||||
|         await asyncio.sleep(self.half_day_length) | ||||
|         if check(): | ||||
|             return | ||||
|         await self.village_channel.send( | ||||
|             embed=discord.Embed(title=f"*{HALF_DAY_LENGTH / 60} minutes of daylight remain...*") | ||||
|             embed=discord.Embed( | ||||
|                 title=f"*{self.half_day_length/ 60} minutes of daylight remain...*" | ||||
|             ) | ||||
|         ) | ||||
|         await asyncio.sleep(HALF_DAY_LENGTH)  # 4 minute days FixMe to 120 later | ||||
|         await asyncio.sleep(self.half_day_length) | ||||
| 
 | ||||
|         # Need a loop here to wait for trial to end | ||||
|         while self.ongoing_vote: | ||||
| @ -501,13 +526,13 @@ class Game: | ||||
| 
 | ||||
|         await self._notify("at_night_start") | ||||
| 
 | ||||
|         await asyncio.sleep(HALF_NIGHT_LENGTH)  # 2 minutes FixMe to 120 later | ||||
|         await asyncio.sleep(self.half_night_length) | ||||
|         await self.village_channel.send( | ||||
|             embed=discord.Embed(title=f"**{HALF_NIGHT_LENGTH / 60} minutes of night remain...**") | ||||
|             embed=discord.Embed( | ||||
|                 title=f"**{self.half_night_length / 60} minutes of night remain...**" | ||||
|             ) | ||||
|         ) | ||||
|         await asyncio.sleep(HALF_NIGHT_LENGTH)  # 1.5 minutes FixMe to 90 later | ||||
| 
 | ||||
|         await asyncio.sleep(3)  # .5 minutes FixMe to 30 Later | ||||
|         await asyncio.sleep(self.half_night_length) | ||||
| 
 | ||||
|         self.action_queue.append(self._at_night_end()) | ||||
| 
 | ||||
| @ -553,7 +578,7 @@ class Game: | ||||
|     # ###########END Notify structure############ | ||||
| 
 | ||||
|     async def generate_targets(self, channel, with_roles=False): | ||||
|         embed = discord.Embed(title="Remaining Players", description="[ID] - [Name]") | ||||
|         embed = discord.Embed(title="Remaining Players", description="ID || Name") | ||||
|         for i, player in enumerate(self.players): | ||||
|             if player.alive: | ||||
|                 status = "" | ||||
| @ -561,13 +586,15 @@ class Game: | ||||
|                 status = "*[Dead]*-" | ||||
|             if with_roles or not player.alive: | ||||
|                 embed.add_field( | ||||
|                     name=f"{i} - {status}{player.member.display_name}", | ||||
|                     name=f"{i} || {status}{player.member.display_name}", | ||||
|                     value=f"{player.role}", | ||||
|                     inline=False, | ||||
|                 ) | ||||
|             else: | ||||
|                 embed.add_field( | ||||
|                     name=f"{i} - {status}{player.member.display_name}", inline=False, value="____" | ||||
|                     name=f"{i} || {status}{player.member.display_name}", | ||||
|                     inline=False, | ||||
|                     value="\N{Zero Width Space}", | ||||
|                 ) | ||||
| 
 | ||||
|         return await channel.send(embed=embed) | ||||
| @ -859,7 +886,7 @@ class Game: | ||||
|         self.players.sort(key=lambda pl: pl.member.display_name.lower()) | ||||
| 
 | ||||
|         if len(self.roles) != len(self.players): | ||||
|             await self.village_channel.send("Unhandled error - roles!=players") | ||||
|             await self.village_channel.send("Unhandled error - roles != # players") | ||||
|             return False | ||||
| 
 | ||||
|         for idx, role in enumerate(self.roles): | ||||
|  | ||||
| @ -36,6 +36,7 @@ class Werewolf(Cog): | ||||
|             "category_id": None, | ||||
|             "channel_id": None, | ||||
|             "log_channel_id": None, | ||||
|             "default_game": {"daytime": 60 * 5, "nighttime": 60 * 5}, | ||||
|         } | ||||
| 
 | ||||
|         self.config.register_global(**default_global) | ||||
| @ -398,12 +399,13 @@ class Werewolf(Cog): | ||||
|             # Private message, can't get guild | ||||
|             await ctx.maybe_send_embed("Cannot start game from DM!") | ||||
|             return None | ||||
| 
 | ||||
|         if guild.id not in self.games or self.games[guild.id].game_over: | ||||
|             await ctx.maybe_send_embed("Starting a new game...") | ||||
|             valid, role, category, channel, log_channel = await self._get_settings(ctx) | ||||
| 
 | ||||
|             if not valid: | ||||
|                 await ctx.maybe_send_embed("Cannot start a new game") | ||||
|                 await ctx.maybe_send_embed("Cannot start a new game, check server settings.") | ||||
|                 return None | ||||
| 
 | ||||
|             who_has_the_role = await anyone_has_role(guild.members, role) | ||||
| @ -413,7 +415,15 @@ class Werewolf(Cog): | ||||
|                 ) | ||||
|                 return None | ||||
|             self.games[guild.id] = Game( | ||||
|                 self.bot, guild, role, category, channel, log_channel, game_code | ||||
|                 bot=self.bot, | ||||
|                 guild=guild, | ||||
|                 role=role, | ||||
|                 category=category, | ||||
|                 village=channel, | ||||
|                 log_channel=log_channel, | ||||
|                 game_code=game_code, | ||||
|                 day_length=await self.config.guild(guild).default_game.day_length(), | ||||
|                 night_length=await self.config.guild(guild).default_game.night_length(), | ||||
|             ) | ||||
| 
 | ||||
|         return self.games[guild.id] | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user