Repository navigation
Expand file tree
/
Copy pathbot.py
More file actions
1929 lines (1722 loc) · 110 KB
/
Copy pathbot.py
File metadata and controls
1929 lines (1722 loc) · 110 KB
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# lobby-bot-dl
import asyncio
import datetime
from datetime import timezone
import distutils
from distutils import util
import random
from zoneinfo import ZoneInfo
import discord
from discord.ext import tasks
import json
import re
import os
from datetime import timedelta
import classes
with open("config/config.json", "r") as jsonfile:
config = json.load(jsonfile)
DiscordBotToken = config['DiscordBotToken']
BotTimezone = config['BotTimezone']
BotGame = config['BotGame']
BotAdminRole = config['BotAdminRole']
BotSuperAdminRoles = config['BotSuperAdminRoles']
version = "v0.4.0"
Units = {'s': 'seconds', 'm': 'minutes', 'h': 'hours', 'd': 'days', 'w': 'weeks'}
utc = datetime.datetime.now(timezone.utc)
bot_super_admin_roles = []
Lobbies = []
LobbyCount = 0
allowed_mentions = discord.AllowedMentions(roles=True)
lbcomCommandList = ["ReloadPresets", "ReloadHeroes", "FullReset", "CloseLobby"]
def load_bans():
global Bans
Bans = []
with open("bans.json", "r") as bansjsonfile:
JSONBans = json.load(bansjsonfile)
for ban in JSONBans:
Bans.append([ban[0], ban[1], ban[2], ban[3], ban[4], ban[5], ban[6]])
def load_presets():
global Presets, presets_string
Presets = []
presets_string = ""
for file in os.listdir("config/presets/"):
if file.endswith(".json"):
Presets.append(os.path.splitext(file)[0])
presets_string = ", ".join(Presets)
return
def load_heroes():
global Heroes, heroes_string
Heroes = []
with open("config/heroes.json", "r") as heroesjsonfile:
heroesjson = json.load(heroesjsonfile)
Heroes = heroesjson['Heroes']
heroes_string = ", ".join(Heroes)
load_bans()
load_presets()
load_heroes()
class Bot(discord.Bot):
async def cleanup(self):
print("Cleaning up messages...")
while len(Lobbies) > 1:
if not await is_message_deleted(Lobbies[1].lobby_channel, Lobbies[1].ping_message_id):
ping_message = await Lobbies[1].lobby_channel.fetch_message(Lobbies[1].ping_message_id)
await ping_message.delete()
if not await is_message_deleted(Lobbies[1].lobby_channel, Lobbies[1].message_id):
lobby_message = await Lobbies[1].lobby_channel.fetch_message(Lobbies[1].message_id)
await lobby_message.delete()
if not await is_message_deleted(Lobbies[1].host.dm_channel, Lobbies[1].admin_msg_id):
admin_message = await Lobbies[1].host.dm_channel.fetch_message(Lobbies[1].admin_msg_id)
await admin_message.delete()
if not await is_message_deleted(Lobbies[1].drafter.dm_channel, Lobbies[1].draft_msg.id):
draft_message = await Lobbies[1].drafter.dm_channel.fetch_message(Lobbies[1].draft_msg.id)
await draft_message.delete()
async for message in Lobbies[1].lobby_channel.history(limit=25):
if message.author == bot.user:
print(f'Found old message from {bot.user}, deleting it')
await message.delete()
Lobbies.pop(1)
async def close(self):
await self.cleanup()
print("Goodbye...")
await super().close()
intents = discord.Intents.default()
intents.members = True
bot = Bot(intents=intents)
@bot.command(name="lbcom", description="Send command")
async def lbcom(ctx, command: discord.Option(description="Command to execute", autocomplete=discord.utils.basic_autocomplete(lbcomCommandList))):
if bot_admin_role in ctx.author.roles:
global presets_string
print(f'Received lbcom command from {ctx.author.display_name}, executing command...')
if command.casefold() == "reloadpresets":
load_presets()
await ctx.respond(f'Presets reloaded. Available presets: {presets_string}', ephemeral=True)
print(f'{ctx.author.display_name} reloaded presets. Available presets: {presets_string}')
elif command.casefold() == "reloadheroes":
load_heroes()
await ctx.respond(f'Heroes reloaded. Available heroes: {heroes_string}', ephemeral=True)
print(f'{ctx.author.display_name} reloaded heroes. Available heroes: {heroes_string}')
elif command.casefold() == "fullreset":
await ctx.respond(f'Closing all lobbies and resetting, please wait 10 seconds before starting a new lobby', ephemeral=True)
global LobbyCount
await bot.cleanup()
Lobbies.clear()
LobbyCount = 0
await add_dummy_lobby()
print(f'{ctx.author.display_name} executed full reset')
elif command.casefold() == "closelobby":
print(f'{ctx.author.display_name} executed close lobby command')
await ctx.response.send_modal(closeModal(title=f"Close a lobby"))
else:
await ctx.respond(f'Command not found', ephemeral=True)
else:
await ctx.respond('You do not have appropriate permissions! Leave me alone!!')
print(f'Received command from {ctx.author.display_name} who does not have admin role "{bot_admin_role}"!')
@bot.command(name="lbban", description="Toggle global ban status of a user")
async def lbban(ctx, user_id: discord.Option(description="Numeric User ID of the user to ban or unban"),
duration: discord.Option(description="Ban duration (attach units: 3d, 2w, etc.) Leave blank for indefinite", required=False)):
if set(bot_super_admin_roles) & set(ctx.author.roles):
print(f'Received lbban command from {ctx.author.display_name}, executing command...')
player = bot_guild.get_member(int(f"{user_id}"))
if not player:
await ctx.respond(f"Player not found", ephemeral=True)
return
banned = await banunban_player(player, ctx.author, "global", duration)
if banned:
if not duration:
duration_string = "indefinitely"
else:
duration_string = "for " + duration
await ctx.respond(f"Player {player.display_name} banned globally {duration_string}", ephemeral=True)
else:
await ctx.respond(f"Player {player.display_name} unbanned", ephemeral=True)
else:
await ctx.respond('You do not have appropriate permissions! Leave me alone!!')
print(f'Received command from {ctx.author.display_name} who does not have a super admin role"!')
@bot.command(name="startlobby", description="Start a lobby")
async def startlobby(ctx, server: discord.Option(str, description="Enter the servers address and port (address:port) "),
password: discord.Option(str, description="Enter the servers password"),
preset: discord.Option(str, description=f"Presets: {presets_string}"),
title: discord.Option(str, description="Override the lobby message title", required=False),
description: discord.Option(str, description="Optional lobby description", required=False)):
if bot_admin_role in ctx.author.roles:
print(f"startlobby: Received command from {ctx.author.display_name}, starting lobby...")
selected_preset = preset
if selected_preset in Presets:
print(f"startlobby: Found Selected preset: {selected_preset}")
else:
print(f"startlobby: Could not find selected preset: {selected_preset}, aborting command")
await ctx.respond("Could not find that preset, please try again. Note that preset names are case sensitive!", ephemeral=True)
return
global LobbyCount, Lobbies, Heroes
lobby_number = LobbyCount + 1
print(f'lobby{lobby_number}: Received lobby request from {ctx.author.display_name}, starting Lobby #{lobby_number}')
with open(f"config/presets/{selected_preset}.json", "r") as presetjsonfile:
preset = json.load(presetjsonfile)
if int(preset['LobbyThreshold']) % 2 or int(preset['LobbyThreshold']) == 0:
print(f"startlobby: Invalid LobbyThreshold ({preset['LobbyThreshold']}), cancelling lobby")
await ctx.respond(f'LobbyThreshold must be even and non-zero', ephemeral=True)
return
LobbyRole = preset['LobbyRole']
for guild in bot.guilds:
for role in guild.roles:
try:
int_role = int(LobbyRole)
if role.id == int_role:
lobby_role = role
print(f'lobby{lobby_number}: Lobby Role found: "{lobby_role.name}"')
except ValueError:
if role.name == LobbyRole:
lobby_role = role
print(f'lobby{lobby_number}: Lobby Role found: "{lobby_role.name}"')
LobbyChannel = preset['LobbyChannel']
for guild in bot.guilds:
for channel in guild.channels:
try:
int_chan = int(LobbyChannel)
if channel.id == int_chan:
lobby_channel = channel
print(f'lobby{lobby_number}: Lobby channel found #{lobby_channel.name}')
except ValueError:
if channel.name == LobbyChannel:
lobby_channel = channel
print(f'lobby{lobby_number}: Lobby channel found #{lobby_channel.name}')
lobby_msgs = await initialize_lobby(lobby_number, lobby_role, distutils.util.strtobool(preset['LobbyRolePing']), lobby_channel)
lobby_message = lobby_msgs[0]
ping_message = lobby_msgs[1]
await ctx.respond(f'Lobby #{lobby_number} started', ephemeral=True)
embed = discord.Embed(title=f"Starting Lobby {lobby_number} Admin Panel...")
admin_panel_msg = await ctx.author.send(embed=embed, view=None)
if not title:
lobby_title = preset['LobbyMessageTitle']
else:
lobby_title = title
with open(f"config/presets/{selected_preset}.json", "r") as presetjsonfile:
preset = json.load(presetjsonfile)
Lobbies.append(classes.Lobby(lobby_number, lobby_message.id, ctx.author, admin_panel_msg.id, ping_message.id, server, password, selected_preset, description, [],
[], [], [], [], Heroes[:], [], 0,
0, 0, discord.User, "hero", 0, 0,
lobby_role, preset['LobbyRolePing'], preset['LobbyAutoLaunch'], preset['LobbyAutoReset'],
lobby_title, preset['LobbyMessageColor'], preset['ActiveMessageColor'],
preset['LobbyThreshold'], preset['LobbyCooldown'], preset['SapphireTeamName'],
preset['AmberTeamName'], preset['EitherTeamName'], 0, "none",
preset['EnableHeroDraft'], discord.Message, preset['EnableImageSend'], lobby_channel,
preset['EnablePlayerDraft'], 0, 0, discord.User, discord.User,
[], discord.User, 0, preset['EnableReadyUp'], 0, 0,
[], [], [], []))
print(f'lobby{lobby_number}: Lobby created with preset {selected_preset}')
LobbyCount = lobby_number
await update_message(lobby_number)
await update_admin_panel(lobby_number)
else:
await ctx.respond('You do not have appropriate permissions! Leave me alone!!')
print(f'Received startlobby request from {ctx.author.display_name} who does not have admin role "{bot_admin_role}"!')
@bot.event
async def on_ready():
print('------------------------------------------------------')
print(f'erkston/lobby-bot-dl {version}')
systemtime = datetime.datetime.now()
bottime = datetime.datetime.now(ZoneInfo(BotTimezone))
print(f'System Time: {systemtime.strftime("%Y-%m-%d %H:%M:%S")} Bot Time: {bottime.strftime("%Y-%m-%d %H:%M:%S")} (Timezone: {BotTimezone})')
print('Config:')
print(f'BotGame: {BotGame}')
print(f'BotAdminRole: {BotAdminRole}')
print(f'BotSuperAdminRoles: {BotSuperAdminRoles}')
print(f'Heroes: {heroes_string}')
print(f'Available presets: {presets_string}')
print('------------------------------------------------------')
print(f'Logged in as {bot.user} (ID: {bot.user.id})')
print(f'{bot.user} is connected to the following guild(s):')
global bot_guild
for guild in bot.guilds:
bot_guild = guild
print(f'{guild.name} (id: {guild.id})')
global bot_admin_role
global bot_super_admin_roles
for guild in bot.guilds:
for role in guild.roles:
try:
int_role = int(BotAdminRole)
if role.id == int_role:
bot_admin_role = role
print(f'Bot Admin Role found: "{bot_admin_role.name}"')
except ValueError:
if role.name == BotAdminRole:
bot_admin_role = role
print(f'Bot Admin Role found: "{bot_admin_role.name}"')
for bsa_role in BotSuperAdminRoles:
try:
int_role = int(bsa_role)
if role.id == int_role:
bot_super_admin_roles.append(role)
print(f'Bot Super Admin Role found: "{role.name}"')
except ValueError:
if role.name == bsa_role:
bot_super_admin_roles.append(role)
print(f'Bot Super Admin Role found: "{role.name}"')
await add_dummy_lobby()
message_refresher.start()
evaluate_ban_timers.start()
print('Startup complete, awaiting command')
print('------------------------------------------------------')
@tasks.loop(minutes=1)
async def message_refresher():
await update_all_lobby_messages()
@tasks.loop(minutes=5)
async def evaluate_ban_timers():
utc = datetime.datetime.now(timezone.utc)
utc_timestamp = utc.timestamp()
bans_modified = False
for i in range(len(Bans)):
if utc_timestamp > int(Bans[i][6]):
print(f"{Bans[i][0]}'s ban expired, removing it")
Bans.pop(i)
bans_modified = True
break
if bans_modified:
await write_bans_to_file()
async def add_dummy_lobby():
Lobbies.append(classes.Lobby(0, 0, discord.User, 0, discord.Message, "0.0.0.0", "pass",
"preset", "desc", [], [], [], [], [], [], [],
0, 0, 0, discord.User, "none",
0, 0, "role", "True", "True",
"True", "Title", "FFFFFF", "FFFFFF",
0, 0, 0, 0, 0, 0,
"none", "True", discord.Message, "False", 0,
0, 0, 0, discord.User, discord.User, [], discord.User, 0,
"True", 0, 0, [], [], [], []))
async def initialize_lobby(lobby_number, lobby_role, lobby_role_ping, lobby_channel):
print(f'lobby{lobby_number}: Initializing lobby message')
if lobby_role_ping:
print(f'lobby{lobby_number}: LobbyRolePing is {lobby_role_ping}, sending ping')
ping_message = await lobby_channel.send(f'{lobby_role.mention}')
else:
ping_message = discord.Message
embed = discord.Embed(title='Reticulating Splines...', color=0xb4aba0)
lobby_message = await lobby_channel.send(embed=embed)
await bot.change_presence(status=discord.Status.online,
activity=discord.Activity(type=discord.ActivityType.listening,
name=f"#{lobby_channel.name}"))
return [lobby_message, ping_message]
async def update_admin_panel(lobby_number):
if not await is_message_deleted(Lobbies[lobby_number].host.dm_channel, Lobbies[lobby_number].admin_msg_id):
admin_panel_msg = await Lobbies[lobby_number].host.dm_channel.fetch_message(Lobbies[lobby_number].admin_msg_id)
else:
print(f'lobby{lobby_number}: Admin panel message not found')
return
if Lobbies[lobby_number].active == 0:
if distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft):
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is open, player draft will begin automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is open and will for you to begin player draft')
elif distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is open, hero draft will begin automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is open and will for you to begin hero draft')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is open, lobby will launch automatically when full')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is open and will wait for you before launching')
else:
if distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft):
if not Lobbies[lobby_number].drafting_players:
if not Lobbies[lobby_number].player_draft_completed:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is full, player draft will begin automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is full, waiting for you to begin player draft')
else:
if distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
if not Lobbies[lobby_number].drafting_heroes:
if not Lobbies[lobby_number].hero_draft_completed:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel",description='Player draft complete, hero draft will begin automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Player draft complete, waiting for you to begin hero draft')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel",description='Hero draft complete, lobby will launch automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Hero draft complete, waiting for you to start the game')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Hero draft ongoing, lobby will launch automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Hero draft ongoing, lobby will wait for you to launch')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Player draft complete, lobby will launch automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Player draft complete, waiting for you to start the game')
else:
if distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Player draft ongoing, hero draft will start automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Player draft ongoing, hero draft will wait for you to start')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Player draft ongoing, lobby will launch automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Player draft ongoing, lobby will wait for you to launch')
else:
if distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
if not Lobbies[lobby_number].drafting_heroes:
if not Lobbies[lobby_number].hero_draft_completed:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby full, hero draft will begin automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby full, waiting for you to begin hero draft')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Hero draft complete, lobby will launch automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Hero draft complete, waiting for you to start the game')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Hero draft ongoing, lobby will launch automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Hero draft ongoing, lobby will wait for you to launch')
else:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby full, lobby will launch automatically')
else:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby full, waiting for you to start the game')
if Lobbies[lobby_number].readying:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Players are readying up, game will start automatically')
if Lobbies[lobby_number].launched == 1:
embed = discord.Embed(title=f"Lobby {lobby_number} Admin Panel", description='Lobby is launched! DMs were sent to all players')
setting_string = "Server\nPassword\nPreset\nLobbyAutoLaunch\nLobbyAutoReset\nLobbyMessageTitle\nSapphireTeamName\nAmberTeamName\nEitherTeamName\nEnableImageSend\nLobbyThreshold\nLobbyCooldown\nEnableHeroDraft\nEnablePlayerDraft\nEnableReadyUp"
value_string = (f"{Lobbies[lobby_number].server}\n{Lobbies[lobby_number].password}\n{Lobbies[lobby_number].preset}\n{Lobbies[lobby_number].lobby_auto_launch}\n"
f"{Lobbies[lobby_number].lobby_auto_reset}\n{Lobbies[lobby_number].lobby_message_title}\n{Lobbies[lobby_number].sapphire_name}\n"
f"{Lobbies[lobby_number].amber_name}\n{Lobbies[lobby_number].either_name}\n{Lobbies[lobby_number].enable_image_send}\n{Lobbies[lobby_number].lobby_threshold}\n"
f"{Lobbies[lobby_number].lobby_cooldown}\n{Lobbies[lobby_number].enable_hero_draft}\n{Lobbies[lobby_number].enable_player_draft}\n{Lobbies[lobby_number].enable_ready_up}")
embed.add_field(name='Setting', value=setting_string, inline=True)
embed.add_field(name='Value', value=value_string, inline=True)
await admin_panel_msg.edit(embed=embed, view=AdminButtons(lobby_number))
return
async def update_message(lobby_number):
sapp_players = []
ambr_players = []
fill_players = []
for i in range(len(Lobbies[lobby_number].sapp_players)):
if Lobbies[lobby_number].drafting_heroes or Lobbies[lobby_number].hero_draft_completed:
sapp_players.append(str(Lobbies[lobby_number].sapp_players[i].display_name) + " - " + Lobbies[lobby_number].sapp_heroes[i])
else:
sapp_players.append(str(Lobbies[lobby_number].sapp_players[i].display_name))
for i in range(len(Lobbies[lobby_number].ambr_players)):
if Lobbies[lobby_number].drafting_heroes or Lobbies[lobby_number].hero_draft_completed:
ambr_players.append(str(Lobbies[lobby_number].ambr_players[i].display_name) + " - " + Lobbies[lobby_number].ambr_heroes[i])
else:
ambr_players.append(str(Lobbies[lobby_number].ambr_players[i].display_name))
for player in Lobbies[lobby_number].fill_players:
fill_players.append(str(player.display_name))
sapp_players_string = "\n".join(sapp_players)
if not sapp_players_string:
sapp_players_string = "None"
ambr_players_string = "\n".join(ambr_players)
if not ambr_players_string:
ambr_players_string = "None"
fill_players_string = ", ".join(fill_players)
if not fill_players_string:
fill_players_string = "None"
current_lobby_size = len(sapp_players) + len(ambr_players) + len(fill_players)
if distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft):
player_pool = []
for i in range(len(Lobbies[lobby_number].player_pool)):
player_pool.append(str(Lobbies[lobby_number].player_pool[i].display_name))
player_pool_string = "\n".join(player_pool)
if not player_pool_string:
player_pool_string = "None"
current_lobby_size = len(player_pool) + len(sapp_players) + len(ambr_players)
if current_lobby_size < int(Lobbies[lobby_number].lobby_threshold):
Lobbies[lobby_number].active = 0
print(f'lobby{lobby_number}: Lobby threshold not met ({current_lobby_size}<{Lobbies[lobby_number].lobby_threshold}), displaying lobby information')
if distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft):
embed = discord.Embed(title=f'{Lobbies[lobby_number].lobby_message_title}',
description='Captains Mode, player draft will start when the lobby is full. '
'Currently ' + str(current_lobby_size) + '/' + str(Lobbies[lobby_number].lobby_threshold) + ' players',
color=int(Lobbies[lobby_number].lobby_message_color, 16))
if Lobbies[lobby_number].description:
embed.add_field(name="", value=Lobbies[lobby_number].description, inline=False)
embed.add_field(name="Players", value=player_pool_string, inline=True)
embed.add_field(name='\u200b', value='\u200b', inline=False)
embed.timestamp = datetime.datetime.now()
embed.set_footer(text=f'Lobby {lobby_number} • Hosted by {Lobbies[lobby_number].host.display_name} • Last updated')
lobby_message = await Lobbies[lobby_number].lobby_channel.fetch_message(Lobbies[lobby_number].message_id)
await lobby_message.edit(embed=embed, view=CMButton(timeout=None))
return
embed = discord.Embed(title=f'{Lobbies[lobby_number].lobby_message_title}',
description='Join using buttons below, server info will be sent via DM when the lobby is full. '
'Currently ' + str(current_lobby_size) + '/' + str(Lobbies[lobby_number].lobby_threshold) + ' players',
color=int(Lobbies[lobby_number].lobby_message_color, 16))
if Lobbies[lobby_number].description:
embed.add_field(name="", value=Lobbies[lobby_number].description, inline=False)
embed.add_field(name=Lobbies[lobby_number].sapphire_name, value=sapp_players_string, inline=True)
embed.add_field(name=Lobbies[lobby_number].amber_name, value=ambr_players_string, inline=True)
embed.add_field(name='\u200b', value='\u200b', inline=False)
embed.add_field(name=Lobbies[lobby_number].either_name, value=fill_players_string, inline=False)
embed.timestamp = datetime.datetime.now()
embed.set_footer(text=f'Lobby {lobby_number} • Hosted by {Lobbies[lobby_number].host.display_name} • Last updated')
lobby_message = await Lobbies[lobby_number].lobby_channel.fetch_message(Lobbies[lobby_number].message_id)
await lobby_message.edit(embed=embed, view=LobbyButtons(lobby_number))
return
elif current_lobby_size >= int(Lobbies[lobby_number].lobby_threshold) and Lobbies[lobby_number].active and not Lobbies[lobby_number].launched:
if distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft) and not Lobbies[lobby_number].player_draft_completed:
if not Lobbies[lobby_number].drafting_players:
embed = discord.Embed(title=f'Player draft is about to start', description="Waiting for host...", color=int(Lobbies[lobby_number].active_message_color, 16))
else:
if Lobbies[lobby_number].selecting_captains:
embed = discord.Embed(title=f'Player draft is ongoing', description="Host is selecting captains", color=int(Lobbies[lobby_number].active_message_color, 16))
else:
embed = discord.Embed(title=f'Player draft is ongoing', description=f"Captains are {Lobbies[lobby_number].sapp_captain.display_name} and {Lobbies[lobby_number].ambr_captain.display_name}", color=int(Lobbies[lobby_number].active_message_color, 16))
elif distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft) and not Lobbies[lobby_number].hero_draft_completed:
if not Lobbies[lobby_number].drafting_heroes:
embed = discord.Embed(title=f'Hero draft is about to start', description="Waiting for host...", color=int(Lobbies[lobby_number].active_message_color, 16))
else:
embed = discord.Embed(title=f'Hero draft is ongoing', description=f"Currently drafting: {Lobbies[lobby_number].drafter.display_name} \n You will receive a DM when it's your turn to draft", color=int(Lobbies[lobby_number].active_message_color, 16))
elif distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft) and Lobbies[lobby_number].hero_draft_completed:
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f'Hero draft is complete!', description='Lobby is launching...', color=int(Lobbies[lobby_number].active_message_color, 16))
else:
embed = discord.Embed(title=f'Hero draft is complete!', description='Waiting for host...', color=int(Lobbies[lobby_number].active_message_color, 16))
elif not distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
embed = discord.Embed(title=f'Lobby is full!', description='Lobby is launching...', color=int(Lobbies[lobby_number].active_message_color, 16))
else:
embed = discord.Embed(title=f'Lobby is full!', description='Waiting for host...', color=int(Lobbies[lobby_number].active_message_color, 16))
if Lobbies[lobby_number].readying:
not_ready = []
for i in range(len(Lobbies[lobby_number].sapp_players)):
if not Lobbies[lobby_number].sapp_players_ready[i]:
not_ready.append(str(Lobbies[lobby_number].sapp_players[i].display_name))
for i in range(len(Lobbies[lobby_number].ambr_players)):
if not Lobbies[lobby_number].ambr_players_ready[i]:
not_ready.append(str(Lobbies[lobby_number].ambr_players[i].display_name))
not_ready_string = ", ".join(not_ready)
if not not_ready_string:
not_ready_string = "None"
embed = discord.Embed(title=f"Ready up! Check your DMs", description=f'Not ready: {not_ready_string}')
if Lobbies[lobby_number].description:
embed.add_field(name="", value=Lobbies[lobby_number].description, inline=False)
embed.add_field(name=Lobbies[lobby_number].sapphire_name, value=sapp_players_string, inline=True)
embed.add_field(name=Lobbies[lobby_number].amber_name, value=ambr_players_string, inline=True)
embed.add_field(name='\u200b', value='\u200b', inline=False)
if distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft) and not Lobbies[lobby_number].player_draft_completed:
embed.add_field(name="Player Pool", value=player_pool_string, inline=False)
embed.timestamp = datetime.datetime.now()
embed.set_footer(text=f'Lobby {lobby_number} • Hosted by {Lobbies[lobby_number].host.display_name} • Last updated')
lobby_message = await Lobbies[lobby_number].lobby_channel.fetch_message(Lobbies[lobby_number].message_id)
if Lobbies[lobby_number].active and not Lobbies[lobby_number].readying and not Lobbies[lobby_number].drafting_heroes and not Lobbies[lobby_number].hero_draft_completed and not Lobbies[lobby_number].drafting_players and not Lobbies[lobby_number].player_draft_completed and not Lobbies[lobby_number].launched:
await lobby_message.edit(embed=embed, view=LeaveButton(timeout=None))
return
await lobby_message.edit(embed=embed, view=None)
return
elif current_lobby_size >= int(Lobbies[lobby_number].lobby_threshold) and Lobbies[lobby_number].active and Lobbies[lobby_number].launched:
print(f'lobby{lobby_number}: Lobby activated and launched, displaying final player list')
embed = discord.Embed(title=f'Lobby has started!', description='Check your DMs for connect info', color=int(Lobbies[lobby_number].active_message_color, 16))
if Lobbies[lobby_number].description:
embed.add_field(name="", value=Lobbies[lobby_number].description, inline=False)
embed.add_field(name=Lobbies[lobby_number].sapphire_name, value=sapp_players_string, inline=True)
embed.add_field(name=Lobbies[lobby_number].amber_name, value=ambr_players_string, inline=True)
embed.add_field(name='\u200b', value='\u200b', inline=False)
embed.timestamp = datetime.datetime.now()
embed.set_footer(text=f'Lobby {lobby_number} • Hosted by {Lobbies[lobby_number].host.display_name} • Last updated')
lobby_message = await Lobbies[lobby_number].lobby_channel.fetch_message(Lobbies[lobby_number].message_id)
await lobby_message.edit(embed=embed, view=None)
return
else:
print(f'lobby{lobby_number}: Lobby threshold met! ({current_lobby_size}/{Lobbies[lobby_number].lobby_threshold})')
await activate_lobby(lobby_number)
async def activate_lobby(lobby_number):
if not Lobbies[lobby_number].active:
Lobbies[lobby_number].active = 1
await update_message(lobby_number)
if not distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft):
await assign_teams(lobby_number)
await size_lobby(lobby_number)
await update_message(lobby_number)
await update_admin_panel(lobby_number)
if distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft):
if not distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
print(f'lobby{lobby_number}: EnablePlayerDraft is {Lobbies[lobby_number].enable_player_draft}, LobbyAutoLaunch is {Lobbies[lobby_number].lobby_auto_launch}, waiting for host to start player draft')
await Lobbies[lobby_number].host.dm_channel.send(f"Lobby {lobby_number} is waiting for you to start the player draft")
return
else:
print(f'lobby{lobby_number}: EnablePlayerDraft is {Lobbies[lobby_number].enable_player_draft}, LobbyAutoLaunch is {Lobbies[lobby_number].lobby_auto_launch}, starting player draft')
await draft_players(lobby_number)
return
elif distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
if not distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
print(f'lobby{lobby_number}: EnableHeroDraft is {Lobbies[lobby_number].enable_hero_draft}, LobbyAutoLaunch is {Lobbies[lobby_number].lobby_auto_launch}, waiting for host to start hero draft')
await Lobbies[lobby_number].host.dm_channel.send(f"Lobby {lobby_number} is waiting for you to start the hero draft")
return
else:
print(f'lobby{lobby_number}: EnableHeroDraft is {Lobbies[lobby_number].enable_hero_draft}, LobbyAutoLaunch is {Lobbies[lobby_number].lobby_auto_launch}, starting player draft')
await draft_heroes(lobby_number)
return
else:
if not distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
print(f'lobby{lobby_number}: EnablePlayerDraft is {Lobbies[lobby_number].enable_player_draft}, EnableHeroDraft is {Lobbies[lobby_number].enable_hero_draft}, LobbyAutoLaunch is {Lobbies[lobby_number].lobby_auto_launch}, waiting for host to launch')
await Lobbies[lobby_number].host.dm_channel.send(f"Lobby {lobby_number} is waiting for you to start the game")
return
else:
print(f'lobby{lobby_number}: EnablePlayerDraft is {Lobbies[lobby_number].enable_player_draft}, EnableHeroDraft is {Lobbies[lobby_number].enable_hero_draft}, LobbyAutoLaunch is {Lobbies[lobby_number].lobby_auto_launch}, launching lobby')
await launch_lobby(lobby_number)
return
else:
print(f'lobby{lobby_number}: Lobby was already started, doing nothing...')
return
async def launch_lobby(lobby_number):
if not Lobbies[lobby_number].launched:
if distutils.util.strtobool(Lobbies[lobby_number].enable_ready_up):
await ready_up(lobby_number)
await bot.change_presence(status=discord.Status.idle, activity=discord.Game(f"{BotGame}"))
Lobbies[lobby_number].launched = 1
await send_lobby_info(lobby_number)
await update_admin_panel(lobby_number)
await update_message(lobby_number)
await asyncio.sleep(convert_to_seconds(Lobbies[lobby_number].lobby_cooldown))
print(f'lobby{lobby_number}: LobbyCooldown ({Lobbies[lobby_number].lobby_cooldown}) has passed since lobby was started')
if not distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_reset):
print(f'lobby{lobby_number}: LobbyAutoReset is {Lobbies[lobby_number].lobby_auto_reset}, closing lobby...')
await close_lobby(lobby_number)
return
else:
if Lobbies[lobby_number].manual_mode:
print(f'lobby{lobby_number}: Admin has previously manually reset this lobby, doing nothing')
return
else:
print(f'lobby{lobby_number}: LobbyAutoReset is {Lobbies[lobby_number].lobby_auto_reset}, resetting...')
await reset_lobby(lobby_number)
return
else:
print(f'lobby{lobby_number}: Lobby was already launched, doing nothing...')
return
async def draft_players(lobby_number):
if Lobbies[lobby_number].drafting_players or Lobbies[lobby_number].player_draft_completed:
print(f'lobby{lobby_number}: Player draft was already started!')
return
else:
Lobbies[lobby_number].drafting_players = 1
print(f'lobby{lobby_number}: Beginning player draft...')
random.shuffle(Lobbies[lobby_number].player_pool)
await get_captains(lobby_number)
await update_message(lobby_number)
await update_admin_panel(lobby_number)
team_size = int(Lobbies[lobby_number].lobby_threshold) / 2
if team_size >= 8:
draft_range = team_size - 2
else:
draft_range = team_size
first_pick = random.choice(["sapp", "ambr"])
for i in range(int(draft_range)-1):
if first_pick == "sapp":
await start_captain_pick(lobby_number, "sapp")
await start_captain_pick(lobby_number, "ambr")
else:
await start_captain_pick(lobby_number, "ambr")
await start_captain_pick(lobby_number, "sapp")
await assign_teams(lobby_number)
Lobbies[lobby_number].player_pool.clear()
Lobbies[lobby_number].drafting_players = 0
Lobbies[lobby_number].player_draft_completed = 1
print(f'lobby{lobby_number}: Player draft completed!')
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
if distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
await draft_heroes(lobby_number)
else:
await launch_lobby(lobby_number)
else:
if distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
await update_message(lobby_number)
await update_admin_panel(lobby_number)
await Lobbies[lobby_number].host.dm_channel.send(f"Lobby {lobby_number} player draft is complete and waiting for you to start hero draft")
else:
await update_message(lobby_number)
await update_admin_panel(lobby_number)
await Lobbies[lobby_number].host.dm_channel.send(f"Lobby {lobby_number} player draft is complete and waiting for you to launch the lobby")
async def get_captains(lobby_number):
Lobbies[lobby_number].selecting_captains = 1
await update_message(lobby_number)
embed = discord.Embed(title=f"Pick two players to be captains", color=int("0B6623", 16))
draft_msg = await Lobbies[lobby_number].host.send(embed=embed, view=CaptainSelect(Lobbies[lobby_number].player_pool))
Lobbies[lobby_number].draft_msg = draft_msg
while Lobbies[lobby_number].selecting_captains:
await asyncio.sleep(1)
Lobbies[lobby_number].selected_player = Lobbies[lobby_number].sapp_captain
Lobbies[lobby_number].sapp_players.append(Lobbies[lobby_number].sapp_captain)
await remove_selected_player(lobby_number)
Lobbies[lobby_number].selected_player = Lobbies[lobby_number].ambr_captain
Lobbies[lobby_number].ambr_players.append(Lobbies[lobby_number].ambr_captain)
await remove_selected_player(lobby_number)
await update_message(lobby_number)
async def start_captain_pick(lobby_number, team):
if team == "sapp":
Lobbies[lobby_number].waiting_for_pick = 1
await get_captain_pick(lobby_number, team)
while Lobbies[lobby_number].waiting_for_pick:
await asyncio.sleep(1)
Lobbies[lobby_number].sapp_players.append(Lobbies[lobby_number].selected_player)
await remove_selected_player(lobby_number)
await update_message(lobby_number)
return
else:
Lobbies[lobby_number].waiting_for_pick = 1
await get_captain_pick(lobby_number, team)
while Lobbies[lobby_number].waiting_for_pick:
await asyncio.sleep(1)
Lobbies[lobby_number].ambr_players.append(Lobbies[lobby_number].selected_player)
await remove_selected_player(lobby_number)
await update_message(lobby_number)
async def get_captain_pick(lobby_number, team):
sapp_players = []
ambr_players = []
for i in range(len(Lobbies[lobby_number].sapp_players)):
sapp_players.append(str(Lobbies[lobby_number].sapp_players[i].display_name))
for i in range(len(Lobbies[lobby_number].ambr_players)):
ambr_players.append(str(Lobbies[lobby_number].ambr_players[i].display_name))
sapp_players_string = "\n".join(sapp_players)
ambr_players_string = "\n".join(ambr_players)
if not sapp_players_string:
sapp_players_string = "None"
if not ambr_players_string:
ambr_players_string = "None"
if team == "sapp":
embed = discord.Embed(title=f"It's your turn to pick a player! You are captain of {Lobbies[lobby_number].sapphire_name}", color=int("0F52BA", 16))
drafter = Lobbies[lobby_number].sapp_captain
else:
embed = discord.Embed(title=f"It's your turn to pick a player! You are captain of {Lobbies[lobby_number].amber_name}", color=int("FFBF00", 16))
drafter = Lobbies[lobby_number].ambr_captain
embed.add_field(name=Lobbies[lobby_number].sapphire_name, value=sapp_players_string, inline=True)
embed.add_field(name=Lobbies[lobby_number].amber_name, value=ambr_players_string, inline=True)
draft_msg = await drafter.send(embed=embed, view=PlayerSelect(Lobbies[lobby_number].player_pool))
Lobbies[lobby_number].draft_msg = draft_msg
async def remove_selected_player(lobby_number):
for i in range(len(Lobbies[lobby_number].player_pool)):
if Lobbies[lobby_number].player_pool[i] == Lobbies[lobby_number].selected_player:
Lobbies[lobby_number].player_pool.pop(i)
return
async def draft_heroes(lobby_number):
if Lobbies[lobby_number].drafting_heroes or Lobbies[lobby_number].hero_draft_completed:
print(f'lobby{lobby_number}: Hero draft was already started!')
return
else:
Lobbies[lobby_number].drafting_heroes = 1
print(f'lobby{lobby_number}: Beginning hero draft...')
random.shuffle(Lobbies[lobby_number].sapp_players)
random.shuffle(Lobbies[lobby_number].ambr_players)
Lobbies[lobby_number].sapp_heroes.clear()
Lobbies[lobby_number].ambr_heroes.clear()
Lobbies[lobby_number].picked_heroes.clear()
for i in range(len(Lobbies[lobby_number].sapp_players)):
Lobbies[lobby_number].sapp_heroes.append("not drafted")
Lobbies[lobby_number].ambr_heroes.append("not drafted")
await update_message(lobby_number)
await update_admin_panel(lobby_number)
team_size = int(Lobbies[lobby_number].lobby_threshold)/2
first_pick = random.choice(["sapp", "ambr"])
for i in range(int(team_size)):
if first_pick == "sapp":
await start_player_pick(lobby_number, "sapp", i)
await start_player_pick(lobby_number, "ambr", i)
else:
await start_player_pick(lobby_number, "ambr", i)
await start_player_pick(lobby_number, "sapp", i)
Lobbies[lobby_number].drafting_heroes = 0
Lobbies[lobby_number].hero_draft_completed = 1
if distutils.util.strtobool(Lobbies[lobby_number].lobby_auto_launch):
await launch_lobby(lobby_number)
else:
await update_message(lobby_number)
await update_admin_panel(lobby_number)
await Lobbies[lobby_number].host.dm_channel.send(f"Lobby {lobby_number} hero draft is complete and waiting for you to launch the lobby")
async def start_player_pick(lobby_number, team, index):
if team == "sapp":
Lobbies[lobby_number].waiting_for_pick = 1
Lobbies[lobby_number].drafter = Lobbies[lobby_number].sapp_players[index]
await update_message(lobby_number)
await get_player_pick(lobby_number, Lobbies[lobby_number].sapp_players[index], team)
while Lobbies[lobby_number].waiting_for_pick:
await asyncio.sleep(1)
Lobbies[lobby_number].sapp_heroes[index] = Lobbies[lobby_number].selected_hero
Lobbies[lobby_number].picked_heroes.append(Lobbies[lobby_number].selected_hero)
await remove_selected_hero(lobby_number)
await update_message(lobby_number)
return
else:
Lobbies[lobby_number].waiting_for_pick = 1
Lobbies[lobby_number].drafter = Lobbies[lobby_number].ambr_players[index]
await update_message(lobby_number)
await get_player_pick(lobby_number, Lobbies[lobby_number].ambr_players[index], team)
while Lobbies[lobby_number].waiting_for_pick:
await asyncio.sleep(1)
Lobbies[lobby_number].ambr_heroes[index] = Lobbies[lobby_number].selected_hero
Lobbies[lobby_number].picked_heroes.append(Lobbies[lobby_number].selected_hero)
await remove_selected_hero(lobby_number)
await update_message(lobby_number)
async def get_player_pick(lobby_number, player, team):
sapp_players = []
ambr_players = []
for i in range(len(Lobbies[lobby_number].sapp_players)):
sapp_players.append(str(Lobbies[lobby_number].sapp_players[i].display_name) + " - " + Lobbies[lobby_number].sapp_heroes[i])
for i in range(len(Lobbies[lobby_number].ambr_players)):
ambr_players.append(str(Lobbies[lobby_number].ambr_players[i].display_name) + " - " + Lobbies[lobby_number].ambr_heroes[i])
sapp_players_string = "\n".join(sapp_players)
ambr_players_string = "\n".join(ambr_players)
if team == "sapp":
embed = discord.Embed(title=f"It's your turn to pick a hero! You are on {Lobbies[lobby_number].sapphire_name}", color=int("0F52BA", 16))
else:
embed = discord.Embed(title=f"It's your turn to pick a hero! You are on {Lobbies[lobby_number].amber_name}",
color=int("FFBF00", 16))
embed.add_field(name=Lobbies[lobby_number].sapphire_name, value=sapp_players_string, inline=True)
embed.add_field(name=Lobbies[lobby_number].amber_name, value=ambr_players_string, inline=True)
draft_msg = await player.send(embed=embed, view=HeroSelect(Lobbies[lobby_number].available_heroes))
Lobbies[lobby_number].draft_msg = draft_msg
async def remove_selected_hero(lobby_number):
for i in range(len(Lobbies[lobby_number].available_heroes)):
if Lobbies[lobby_number].available_heroes[i] == Lobbies[lobby_number].selected_hero:
Lobbies[lobby_number].available_heroes.pop(i)
return
async def get_lobby_number(interaction):
global Lobbies
for i in range(len(Lobbies)):
if interaction.message.id == Lobbies[i].message_id:
lobby_number = Lobbies[i].number
print(f'lobby{lobby_number}: Received lobby button press from {interaction.user.display_name}')
for i in range(len(Lobbies)):
if interaction.message.id == Lobbies[i].admin_msg_id:
lobby_number = Lobbies[i].number
print(f'lobby{lobby_number}: Received admin button press from {interaction.user.display_name}')
for i in range(len(Lobbies)):
if interaction.message.id == Lobbies[i].draft_msg.id:
lobby_number = Lobbies[i].number
print(f'lobby{lobby_number}: Received draft button press from {interaction.user.display_name}')
return lobby_number
async def assign_teams(lobby_number):
if not distutils.util.strtobool(Lobbies[lobby_number].enable_player_draft):
print(f'lobby{lobby_number}: Assigning fill players to teams')
random.shuffle(Lobbies[lobby_number].fill_players)
for player in Lobbies[lobby_number].fill_players:
if len(Lobbies[lobby_number].sapp_players) < int(Lobbies[lobby_number].lobby_threshold)/2:
Lobbies[lobby_number].sapp_players.append(player)
else:
Lobbies[lobby_number].ambr_players.append(player)
Lobbies[lobby_number].fill_players.clear()
else:
print(f'lobby{lobby_number}: Assigning any remaining players to teams')
random.shuffle(Lobbies[lobby_number].player_pool)
for player in Lobbies[lobby_number].player_pool:
if len(Lobbies[lobby_number].sapp_players) < int(Lobbies[lobby_number].lobby_threshold) / 2:
Lobbies[lobby_number].sapp_players.append(player)
else:
Lobbies[lobby_number].ambr_players.append(player)
async def shuffle_teams(lobby_number):
print(f'lobby{lobby_number}: Shuffling teams')
player_list = []
for player in Lobbies[lobby_number].sapp_players:
player_list.append(player)
for player in Lobbies[lobby_number].ambr_players:
player_list.append(player)
for player in Lobbies[lobby_number].fill_players:
player_list.append(player)
Lobbies[lobby_number].sapp_players.clear()
Lobbies[lobby_number].ambr_players.clear()
Lobbies[lobby_number].fill_players.clear()
random.shuffle(player_list)
i = 0
while i < len(player_list)/2:
Lobbies[lobby_number].sapp_players.append(player_list[i])
i += 1
while i < len(player_list):
Lobbies[lobby_number].ambr_players.append(player_list[i])
i += 1
await update_message(lobby_number)
async def ready_up(lobby_number):
print(f'lobby{lobby_number}: Beginning ready up...')
Lobbies[lobby_number].readying = 1
for i in range(len(Lobbies[lobby_number].sapp_players)):
Lobbies[lobby_number].sapp_players_ready.append(0)
for i in range(len(Lobbies[lobby_number].sapp_players)):
Lobbies[lobby_number].sapp_ready_msgs.append(discord.Message)
for i in range(len(Lobbies[lobby_number].ambr_players)):
Lobbies[lobby_number].ambr_players_ready.append(0)
for i in range(len(Lobbies[lobby_number].ambr_players)):
Lobbies[lobby_number].ambr_ready_msgs.append(discord.Message)
await update_message(lobby_number)
await update_admin_panel(lobby_number)
for i in range(len(Lobbies[lobby_number].sapp_players)):
await get_ready_status(Lobbies[lobby_number].sapp_players[i], lobby_number, "sapp", i)
for i in range(len(Lobbies[lobby_number].ambr_players)):
await get_ready_status(Lobbies[lobby_number].ambr_players[i], lobby_number, "ambr", i)
while not Lobbies[lobby_number].all_players_ready:
await update_message(lobby_number)
await check_ready_status(lobby_number)
await asyncio.sleep(3)
print(f'lobby{lobby_number}: All players are ready! Launching...')
async def get_ready_status(player, lobby_number, team, index):
embed = discord.Embed(title=f"Ready up!", color=int("0B6623", 16))
ready_msg = await player.send(embed=embed, view=ReadyUpButton(lobby_number, team, index))
if team == "sapp":
Lobbies[lobby_number].sapp_ready_msgs[index] = ready_msg
else:
Lobbies[lobby_number].ambr_ready_msgs[index] = ready_msg
async def check_ready_status(lobby_number):
for i in range(len(Lobbies[lobby_number].sapp_players)):
if not Lobbies[lobby_number].sapp_players_ready[i]:
return
for i in range(len(Lobbies[lobby_number].ambr_players)):
if not Lobbies[lobby_number].ambr_players_ready[i]:
return
Lobbies[lobby_number].readying = 0
Lobbies[lobby_number].all_players_ready = 1
async def send_lobby_info(lobby_number):
print(f'lobby{lobby_number}: Sending DMs with team and connect info...')
connect_string = "".join(["`connect ", str(Lobbies[lobby_number].server), "; password ", str(Lobbies[lobby_number].password), "`"])
for i in range(len(Lobbies[lobby_number].sapp_players)):
with open("config/banner_sapp.png", "rb") as bansa:
if distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
embed = discord.Embed(title=f"You are on team {Lobbies[lobby_number].sapphire_name} and playing {Lobbies[lobby_number].sapp_heroes[i]}", color=int("0F52BA", 16))
else:
embed = discord.Embed(title=f"You are on team {Lobbies[lobby_number].sapphire_name}", color=int("0F52BA", 16))
embed.add_field(name='Connect info', value=connect_string, inline=False)
if distutils.util.strtobool(Lobbies[lobby_number].enable_image_send):
file = discord.File(bansa, filename="config/banner_sapp.png")
else:
file = None
await Lobbies[lobby_number].sapp_players[i].send(embed=embed, file=file)
for i in range(len(Lobbies[lobby_number].ambr_players)):
with open("config/banner_ambr.png", "rb") as banam:
if distutils.util.strtobool(Lobbies[lobby_number].enable_hero_draft):
embed = discord.Embed(title=f"You are on team {Lobbies[lobby_number].amber_name} and playing {Lobbies[lobby_number].ambr_heroes[i]}", color=int("FFBF00", 16))
else: