-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRoom.py
169 lines (149 loc) · 6.59 KB
/
Room.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import asyncio
import inspect
import discord
from RoomImage import ImageGen
from time import strftime, gmtime
from Player import Player
from Active import Active
from const_messages import \
CONFLICT_MSG, \
ADMIT_DEFEAT_MSG, \
CLAIM_VICTORY_MSG, \
CLAIM_VICTORY_LOG, \
START_GAME_TITLE, \
START_DUEL_MSG, \
DUEL_RESULTS_MSG
class Room:
def __init__(self, duel_request_msg, attacker, defender, client):
self.client = client
self.duelRequestMsg = duel_request_msg
self.attacker = attacker
self.defender = defender
self.bracket = None
self.channel = None
self.result_msg = None
self.result_reactions = {'a': None, 'd': None}
self.results = None
self.winner = None
self.task = None
async def clear(self):
for member in self.bracket.members:
await member.remove_roles(self.bracket)
await self.channel.purge()
await self.channel.purge()
def get_winner_and_loser(self):
if self.winner == 'a':
return self.attacker, self.defender
return self.defender, self.attacker
async def set_winner(self, value):
if self.winner:
return
self.winner = value
winner, loser = self.get_winner_and_loser()
await Player(self.client, winner).wins(Player(self.client, loser), self.channel)
await self.channel.send('```This room will close in 10 seconds...```')
self.client.loop.create_task(self.call_this_in(self.clear, (), 10))
def is_this_reaction_for_me(self, react, user):
if user.id != self.attacker.id and user.id != self.defender.id:
return False
if react.message.id != self.result_msg.id:
return False
return True
async def claim_was_right(self, winner):
await self.set_winner(winner)
@staticmethod
async def call_this_in(func, args, time):
await asyncio.sleep(time)
if inspect.iscoroutinefunction(func):
if args:
return await func(args)
return await func()
if args:
return func(args)
return func()
async def claimed_victory(self, letter, who, on_who):
await self.channel.send(CLAIM_VICTORY_MSG.format(who.name, on_who.name, on_who.mention))
await self.client.log(CLAIM_VICTORY_LOG.format(who.name, on_who.name, strftime("%Y-%m-%d %H:%M", gmtime())))
self.task = self.client.loop.create_task(self.call_this_in(self.claim_was_right, letter, 420))
async def check_results(self):
if self.task:
self.task.cancel()
if self.result_reactions['d'] == self.result_reactions['a']:
await self.channel.send(CONFLICT_MSG)
elif self.result_reactions['a'] == 0:
await self.channel.send(ADMIT_DEFEAT_MSG.format(self.attacker.name, self.defender.name))
return await self.set_winner('d')
elif self.result_reactions['d'] == 0:
await self.channel.send(ADMIT_DEFEAT_MSG.format(self.defender.name, self.attacker.name))
return await self.set_winner('a')
elif self.result_reactions['a'] == 1:
await self.claimed_victory('a', self.attacker, self.defender)
elif self.result_reactions['d'] == 1:
await self.claimed_victory('d', self.defender, self.attacker)
async def ask_who_won(self):
e = discord.Embed(color=discord.Color.green(),
title='Results',
description=DUEL_RESULTS_MSG.format(self.client.usefulCustomEmotes['win'],
self.client.usefulCustomEmotes['lose'], self.client.usefulCustomEmotes['cancel']))
msg = await self.channel.send(embed=e)
await msg.add_reaction(self.client.usefulCustomEmotes['win'])
await msg.add_reaction(self.client.usefulCustomEmotes['lose'])
await msg.add_reaction(self.client.usefulCustomEmotes['cancel'])
self.result_msg = msg
async def enter_score(self, user, victory):
who = None
if user.id == self.attacker.id:
who = 'a'
elif user.id == self.defender.id:
who = 'd'
if not who:
return False
self.result_reactions[who] = victory
await self.check_results()
async def init_duel(self):
e = discord.Embed(color=discord.Color.red(),
title= 'Best of 3',
description = START_DUEL_MSG.format(self.attacker.mention))
try:
e.set_image(url=ImageGen(self.attacker.avatar_url,self.defender.avatar_url))
except Exception:
e.set_image(url=self.attacker.avatar_url)
e.set_thumbnail(url=self.defender.avatar_url)
e.set_author(name=START_GAME_TITLE.format(self.attacker.name, self.defender.name), icon_url='https://cdn.discordapp.com/avatars/779767593418227735/abd2384d28df211f58550249951dd147.png?size=4096')
await self.channel.send("{} vs {}".format(self.attacker.mention, self.defender.mention), embed=e)
async def delete_request_msg(self):
if self.duelRequestMsg:
await self.duelRequestMsg.delete()
self.duelRequestMsg = None
async def init_bracket(self):
room_id, self.bracket = self.get_free_bracket()
if not self.bracket:
await self.client.log('No free bracket to play {} vs {}'.format(self.attacker, self.defender))
return
self.channel = self.client.usefulChannels[room_id]
try:
await self.attacker.add_roles(self.bracket)
await self.defender.add_roles(self.bracket)
await self.init_active(self.attacker)
await self.init_active(self.defender)
except Exception as e:
await self.client.log("Can't give {} role to {} or {}. {}".format(
self.bracket.name, self.attacker, self.defender, e)
)
async def init_active(self, user):
activeUser = Active(user, self.client)
if not activeUser in self.client.Active:
await activeUser.start()
self.client.Active.append(activeUser)
else:
await self.client.Active[self.client.Active.index(activeUser)].update()
def get_free_bracket(self):
for role in self.client.BracketRoles:
if not len(self.client.BracketRoles[role].members):
return role, self.client.BracketRoles[role]
return None
async def create(self):
await self.init_bracket()
await self.delete_request_msg()
await self.init_duel()
await self.ask_who_won()