diff --git a/werewolf/game.py b/werewolf/game.py index 7c6a5c8..ba63211 100644 --- a/werewolf/game.py +++ b/werewolf/game.py @@ -5,6 +5,7 @@ from typing import List, Any, Dict, Set, Union import discord from redbot.core import commands +from redbot.core.bot import Red from .builder import parse_code from .player import Player @@ -34,10 +35,15 @@ class Game: "**Morning has arrived on day {}..**", ] + night_messages = [ + "**Dawn falls on day {}..****" + ] + day_vote_count = 3 def __init__( self, + bot: Red, guild: discord.Guild, role: discord.Role = None, category: discord.CategoryChannel = None, @@ -45,6 +51,7 @@ class Game: log_channel: discord.TextChannel = None, game_code=None, ): + self.bot = bot self.guild = guild self.game_code = game_code @@ -340,6 +347,9 @@ class Game: await self.village_channel.send( "**{} will be put to trial and has 30 seconds to defend themselves**".format( target.mention + ), + allowed_mentions=discord.AllowedMentions( + everyone=False, users=[target] ) ) @@ -347,11 +357,14 @@ class Game: await self.speech_perms(self.village_channel, target.member, undo=True) # No one can talk - message = await self.village_channel.send( + message: discord.Message = await self.village_channel.send( "Everyone will now vote whether to lynch {}\n" "👍 to save, 👎 to lynch\n" "*Majority rules, no-lynch on ties, " - "vote both or neither to abstain, 15 seconds to vote*".format(target.mention) + "vote both or neither to abstain, 15 seconds to vote*".format(target.mention), + allowed_mentions=discord.AllowedMentions( + everyone=False, users=[target] + ) ) await message.add_reaction("👍") @@ -442,7 +455,7 @@ class Game: await self.village_channel.send( embed=discord.Embed(title="**Thirty seconds until sunrise...**") ) - await asyncio.sleep(3) # .5 minutes FixMe to 3 Later + await asyncio.sleep(3) # .5 minutes FixMe to 30 Later await self._at_night_end() @@ -462,19 +475,20 @@ class Game: async def _notify(self, event, data=None): for i in range(1, 7): # action guide 1-6 (0 is no action) - tasks = [] - # Role priorities - role_order = [role for role in self.roles if role.action_list[event][1] == i] - for role in role_order: - tasks.append(asyncio.ensure_future(role.on_event(event, data), loop=self.loop)) - # VoteGroup priorities - vote_order = [vg for vg in self.vote_groups.values() if vg.action_list[event][1] == i] - for vote_group in vote_order: - tasks.append( - asyncio.ensure_future(vote_group.on_event(event, data), loop=self.loop) - ) - if tasks: - await asyncio.gather(*tasks) + self.bot.dispatch(f"red.fox.werewolf.{event}", data=data, priority=i) + # tasks = [] + # # Role priorities + # role_order = [role for role in self.roles if role.action_list[event][1] == i] + # for role in role_order: + # tasks.append(asyncio.ensure_future(role.on_event(event, data), loop=self.loop)) + # # VoteGroup priorities + # vote_order = [vg for vg in self.vote_groups.values() if vg.action_list[event][1] == i] + # for vote_group in vote_order: + # tasks.append( + # asyncio.ensure_future(vote_group.on_event(event, data), loop=self.loop) + # ) + # if tasks: + # await asyncio.gather(*tasks) # Run same-priority task simultaneously ############END Notify structure############ diff --git a/werewolf/role.py b/werewolf/role.py index 8c4d989..2a08f71 100644 --- a/werewolf/role.py +++ b/werewolf/role.py @@ -38,7 +38,7 @@ class Role: 3. Protection / Preempt actions (bodyguard/framer) 4. Non-disruptive actions (seer/silencer) 5. Disruptive actions (Killing) - 6. Role altering actions (Cult / Mason) + 6. Role altering actions (Cult / Mason / Shifter) """ rand_choice = False # Determines if it can be picked as a random role (False for unusually disruptive roles) diff --git a/werewolf/roles/seer.py b/werewolf/roles/seer.py index 35c8271..8d0fc1f 100644 --- a/werewolf/roles/seer.py +++ b/werewolf/roles/seer.py @@ -14,8 +14,10 @@ class Seer(Role): "Lynch players during the day with `[p]ww vote `\n" "Check for werewolves at night with `[p]ww choose `" ) - description = "A mystic in search of answers in a chaotic town.\n" \ - "Calls upon the cosmos to discern those of Lycan blood" + description = ( + "A mystic in search of answers in a chaotic town.\n" + "Calls upon the cosmos to discern those of Lycan blood" + ) def __init__(self, game): super().__init__(game) @@ -33,7 +35,7 @@ class Seer(Role): (self._at_day_end, 0), (self._at_night_start, 2), (self._at_night_end, 4), - (self._at_visit, 0) + (self._at_visit, 0), ] async def see_alignment(self, source=None): @@ -87,4 +89,8 @@ class Seer(Role): await super().choose(ctx, data) self.see_target, target = await pick_target(self, ctx, data) - await ctx.send("**You will attempt to see the role of {} tonight...**".format(target.member.display_name)) + await ctx.send( + "**You will attempt to see the role of {} tonight...**".format( + target.member.display_name + ) + ) diff --git a/werewolf/roles/shifter.py b/werewolf/roles/shifter.py index 4c550dc..8d4b4f5 100644 --- a/werewolf/roles/shifter.py +++ b/werewolf/roles/shifter.py @@ -37,7 +37,7 @@ class Shifter(Role): 3. Protection / Preempt actions (bodyguard/framer) 4. Non-disruptive actions (seer/silencer) 5. Disruptive actions (Killing) - 6. Role altering actions (Cult / Mason) + 6. Role altering actions (Cult / Mason / Shifter) """ rand_choice = False # Determines if it can be picked as a random role (False for unusually disruptive roles) diff --git a/werewolf/votegroups/wolfvote.py b/werewolf/votegroups/wolfvote.py index 9c068d5..fb98b20 100644 --- a/werewolf/votegroups/wolfvote.py +++ b/werewolf/votegroups/wolfvote.py @@ -13,7 +13,8 @@ class WolfVote(VoteGroup): kill_messages = [ "**{ID}** - {target} was mauled by wolves", - "**{ID}** - {target} was found torn to shreds"] + "**{ID}** - {target} was found torn to shreds", + ] def __init__(self, game, channel): super().__init__(game, channel) @@ -34,7 +35,7 @@ class WolfVote(VoteGroup): (self._at_day_end, 0), (self._at_night_start, 2), (self._at_night_end, 5), # Kill priority - (self._at_visit, 0) + (self._at_visit, 0), ] # async def on_event(self, event, data): @@ -75,7 +76,9 @@ class WolfVote(VoteGroup): await self.channel.send(mention_list) self.killer = random.choice(self.players) - await self.channel.send("{} has been selected as tonight's killer".format(self.killer.member.display_name)) + await self.channel.send( + "{} has been selected as tonight's killer".format(self.killer.member.display_name) + ) async def _at_night_end(self, data=None): if self.channel is None: @@ -90,7 +93,9 @@ class WolfVote(VoteGroup): print("Target id: {}\nKiller: {}".format(target_id, self.killer.member.display_name)) if target_id is not None and self.killer: await self.game.kill(target_id, self.killer, random.choice(self.kill_messages)) - await self.channel.send("**{} has left to complete the kill...**".format(self.killer.member.display_name)) + await self.channel.send( + "**{} has left to complete the kill...**".format(self.killer.member.display_name) + ) else: await self.channel.send("**No kill will be attempted tonight...**") @@ -117,4 +122,6 @@ class WolfVote(VoteGroup): self.vote_results[author.id] = target_id - await self.channel.send("{} has voted to kill {}".format(author.mention, target.member.display_name)) + await self.channel.send( + "{} has voted to kill {}".format(author.mention, target.member.display_name) + ) diff --git a/werewolf/werewolf.py b/werewolf/werewolf.py index c90982f..0c8374c 100644 --- a/werewolf/werewolf.py +++ b/werewolf/werewolf.py @@ -97,7 +97,7 @@ class Werewolf(Cog): @wwset.command(name="role") async def wwset_role(self, ctx: commands.Context, role: discord.Role = None): """ - Assign the game role + Set the game role This role should not be manually assigned """ if role is None: @@ -222,7 +222,7 @@ class Werewolf(Cog): await ctx.send("No game running, cannot start") if not await game.setup(ctx): - pass # Do something? + pass # ToDo something? @commands.guild_only() @ww.command(name="stop") @@ -230,10 +230,10 @@ class Werewolf(Cog): """ Stops the current game """ - if ctx.guild is None: - # Private message, can't get guild - await ctx.send("Cannot start game from PM!") - return + # if ctx.guild is None: + # # Private message, can't get guild + # await ctx.send("Cannot stop game from PM!") + # return if ctx.guild.id not in self.games or self.games[ctx.guild.id].game_over: await ctx.send("No game to stop") return @@ -354,11 +354,11 @@ class Werewolf(Cog): await ctx.send("Role ID not found") async def _get_game(self, ctx: commands.Context, game_code=None): - guild: discord.Guild = ctx.guild + guild: discord.Guild = getattr(ctx, "guild", None) if guild is None: # Private message, can't get guild - await ctx.send("Cannot start game from PM!") + await ctx.send("Cannot start game from DM!") return None if guild.id not in self.games or self.games[guild.id].game_over: await ctx.send("Starting a new game...") @@ -368,7 +368,7 @@ class Werewolf(Cog): await ctx.send("Cannot start a new game") return None - self.games[guild.id] = Game(guild, role, category, channel, log_channel, game_code) + self.games[guild.id] = Game(self.bot, guild, role, category, channel, log_channel, game_code) return self.games[guild.id]