Technically opens now

fight-fixes
bobloy 7 years ago
parent 8dfbf0972a
commit d5e7ac3432

@ -2,11 +2,12 @@ import asyncio
import discord import discord
from datetime import datetime,timedelta from datetime import datetime, timedelta
from random import shuffle from random import shuffle
from .builder import parse_code # from .builder import parse_code
class Game: class Game:
""" """
@ -20,7 +21,7 @@ class Game:
} }
def __new__(cls, game_code): def __new__(cls, game_code):
game_code = ["DefaultWerewolf", "Villager", "Villager""] game_code = ["DefaultWerewolf", "Villager", "Villager"]
return Game(game_code) return Game(game_code)
def __init__(self, guild, game_code): def __init__(self, guild, game_code):
@ -48,7 +49,6 @@ class Game:
self.loop = asyncio.get_event_loop() self.loop = asyncio.get_event_loop()
async def setup(self, ctx): async def setup(self, ctx):
""" """
Runs the initial setup Runs the initial setup
@ -97,7 +97,6 @@ class Game:
await vote_group.register_player() await vote_group.register_player()
self.vote_groups[channel_id] = self.p_channels[channel_id]["votegroup"](self, channel) self.vote_groups[channel_id] = self.p_channels[channel_id]["votegroup"](self, channel)
############START Notify structure############ ############START Notify structure############
async def _cycle(self): async def _cycle(self):
""" """
@ -114,7 +113,7 @@ class Game:
and repeat with _at_day_start() again and repeat with _at_day_start() again
""" """
await self._at_day_start(): await self._at_day_start()
async def _at_game_start(self): # ID 0 async def _at_game_start(self): # ID 0
if self.game_over: if self.game_over:
@ -123,7 +122,6 @@ class Game:
await self._notify(0) await self._notify(0)
async def _at_day_start(self): # ID 1 async def _at_day_start(self): # ID 1
if self.game_over: if self.game_over:
return return
@ -168,7 +166,7 @@ class Game:
up_votes = sum(p.emoji == "👍" and not p.me for p in reaction_list) up_votes = sum(p.emoji == "👍" and not p.me for p in reaction_list)
down_votes = sum(p.emoji == "👎" and not p.me for p in reaction_list) down_votes = sum(p.emoji == "👎" and not p.me for p in reaction_list)
if len(down_votes)>len(up_votes): if len(down_votes) > len(up_votes):
embed=discord.Embed(title="Vote Results", color=0xff0000) embed=discord.Embed(title="Vote Results", color=0xff0000)
else: else:
embed=discord.Embed(title="Vote Results", color=0x80ff80) embed=discord.Embed(title="Vote Results", color=0x80ff80)
@ -178,7 +176,7 @@ class Game:
await self.village_channel.send(embed=embed) await self.village_channel.send(embed=embed)
if len(down_votes)>len(up_votes): if len(down_votes) > len(up_votes):
await self.village_channel.send("Voted to lynch {}!".format(target.mention)) await self.village_channel.send("Voted to lynch {}!".format(target.mention))
await self.kill(target) await self.kill(target)
self.can_vote = False self.can_vote = False
@ -188,7 +186,6 @@ class Game:
if not self.can_vote: if not self.can_vote:
await self._at_day_end() await self._at_day_end()
async def _at_kill(self, target): # ID 3 async def _at_kill(self, target): # ID 3
if self.game_over: if self.game_over:
return return
@ -238,15 +235,14 @@ class Game:
async def _notify(self, event, data=None): async def _notify(self, event, data=None):
for i in range(10): for i in range(10):
tasks = [] tasks = []
# Role priorities # Role priorities
role_order = [role for role in self.roles if role.action_list[event][1]==i] role_order = [role for role in self.roles if role.action_list[event][1]==i]
for role in role_order: for role in role_order:
tasks.append(asyncio.ensure_future(role.on_event(event, data)) tasks.append(asyncio.ensure_future(role.on_event(event, data)))
# VoteGroup priorities # VoteGroup priorities
vote_order = [votes for votes in self.vote_groups.values() if votes.action_list[event][1]==i] vote_order = [votes for votes in self.vote_groups.values() if votes.action_list[event][1]==i]
for vote_group in vote_order: for vote_group in vote_order:
tasks.append(asyncio.ensure_future(vote_group.on_event(event, data)) tasks.append(asyncio.ensure_future(vote_group.on_event(event, data)))
self.loop.run_until_complete(asyncio.gather(*tasks)) self.loop.run_until_complete(asyncio.gather(*tasks))
# Run same-priority task simultaneously # Run same-priority task simultaneously
@ -280,7 +276,7 @@ class Game:
if votegroup: if votegroup:
self.p_channels[channel_id]["votegroup"] = votegroup self.p_channels[channel_id]["votegroup"] = votegroup
async def join(self, member: discord.Member, channel: discord.Channel): async def join(self, member: discord.Member, channel: discord.TextChannel):
""" """
Have a member join a game Have a member join a game
""" """
@ -326,8 +322,9 @@ class Game:
if not self.can_vote: if not self.can_vote:
channel.send("Voting is not allowed right now") channel.send("Voting is not allowed right now")
return return
elif channel not in self.p_channels.values():
if channel in self.p_channels.values(): # Not part of the game
return # Don't say anything
try: try:
target = self.players[id] target = self.players[id]
@ -338,6 +335,8 @@ class Game:
channel.send("Not a valid target") channel.send("Not a valid target")
return return
# Now handle village vote or send to votegroup
async def kill(self, target, source=None, method: str=None): async def kill(self, target, source=None, method: str=None):
""" """
Attempt to kill a target Attempt to kill a target
@ -345,14 +344,23 @@ class Game:
Be sure to remove permissions appropriately Be sure to remove permissions appropriately
Important to finish execution before triggering notify Important to finish execution before triggering notify
""" """
pass if not target.protected:
target.alive = False
await self._at_kill(target)
if not target.alive: # Still dead after notifying
await self.dead_perms(target.member)
else:
target.protected = False
async def lynch(self, target): async def lynch(self, target):
""" """
Attempt to lynch a target Attempt to lynch a target
Important to finish execution before triggering notify Important to finish execution before triggering notify
""" """
pass target.alive = False
await self._at_hang(target)
if not target.alive: # Still dead after notifying
await self.dead_perms(target.member)
async def get_roles(self, game_code=None): async def get_roles(self, game_code=None):
if game_code: if game_code:
@ -366,6 +374,10 @@ class Game:
if not self.roles: if not self.roles:
return False return False
async def dead_perms(self, channel, member):
await channel.set_permissions(member, read_messages=True, send_message=False, add_reactions=False)
async def night_perms(self, channel): async def night_perms(self, channel):
await channel.set_permissions(self.guild.default_role, read_messages=False, send_messages=False) await channel.set_permissions(self.guild.default_role, read_messages=False, send_messages=False)
@ -376,7 +388,7 @@ class Game:
if undo: if undo:
await channel.set_permissions(self.guild.default_role, read_messages=False) await channel.set_permissions(self.guild.default_role, read_messages=False)
await channel.set_permissions(member, read_messages=True) await channel.set_permissions(member, read_messages=True)
elif: else:
await channel.set_permissions(self.guild.default_role, read_messages=False, send_messages=False) await channel.set_permissions(self.guild.default_role, read_messages=False, send_messages=False)
await channel.set_permissions(member, read_messages=True, send_messages=True) await channel.set_permissions(member, read_messages=True, send_messages=True)

@ -2,7 +2,7 @@ import asyncio
import discord import discord
from datetime import datetime,timedelta from datetime import datetime, timedelta
class Player: class Player:
""" """

@ -2,7 +2,7 @@ import asyncio
import discord import discord
from datetime import datetime,timedelta from datetime import datetime, timedelta
class Villager(Role): class Villager(Role):

@ -5,10 +5,11 @@ from discord.ext import commands
from redbot.core import Config from redbot.core import Config
from datetime import datetime,timedelta from datetime import datetime, timedelta
from .game import Game from .game import Game
class Werewolf: class Werewolf:
""" """
Base to host werewolf on a guild Base to host werewolf on a guild
@ -21,7 +22,6 @@ class Werewolf:
default_guild = { default_guild = {
} }
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
@ -87,7 +87,7 @@ class Werewolf:
if channel in (c["channel"] for c in game.p_channels.values()): if channel in (c["channel"] for c in game.p_channels.values()):
await game.vote(ctx.author, id, channel) await game.vote(ctx.author, id, channel)
def _get_game(self, guild, game_code = None): def _get_game(self, guild, game_code=None):
if guild.id not in self.games: if guild.id not in self.games:
if not game_code: if not game_code:
return None return None
@ -95,19 +95,5 @@ class Werewolf:
return self.games[guild.id] return self.games[guild.id]
async def _game_start(self, game): async def _game_start(self, game):
await game.start() await game.start()
async def on_message(self, message):
if message.author.id == self.bot.user.id:
return
author = message.author
channel = message.channel
guild = message.guild
if channel is game.village_channel:

Loading…
Cancel
Save