qwtf_discord_bot 6.1.5 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +5 -1
- data/README.md +1 -0
- data/VERSION +1 -1
- data/exe/qwtf_discord_bot +1 -0
- data/lib/qwtf_discord_bot/qwtf_discord_bot_pug.rb +203 -72
- data/qwtf_discord_bot.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1bfa9a0b1f5ad3c3206d216e1e266d2749e081c6dc3c58e77994ec997f64fe2f
|
4
|
+
data.tar.gz: 215a86a21d79da634525e031ad7408ad0f1c2b3ee2eced49ec2dc9f7dfffd8f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b206b70ee1b67653022619909db86705c05f08006cc712179d00ec30b556fb64ea901f164395c7f8ad35649bf5c67a082f858d46b50fae4c4ee690be5b194ae6
|
7
|
+
data.tar.gz: 8174cd63f0589c839a2a47509d8de220d7ef8b96c82fec9b38501a4bdac56000767c0425a8b55c10d858e8c5b0d919f8a7763a680775316ae1ef286818b6380a
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
qwtf_discord_bot (6.
|
4
|
+
qwtf_discord_bot (6.2.0)
|
5
|
+
activesupport (~> 6.1)
|
5
6
|
discordrb (= 3.4.0)
|
6
7
|
redis (~> 4.2)
|
7
8
|
thor (~> 1.1)
|
@@ -28,6 +29,7 @@ GEM
|
|
28
29
|
rest-client (>= 2.1.0.rc1)
|
29
30
|
domain_name (0.5.20190701)
|
30
31
|
unf (>= 0.0.5, < 1.0.0)
|
32
|
+
dotenv (2.7.6)
|
31
33
|
event_emitter (0.2.6)
|
32
34
|
factory_bot (6.1.0)
|
33
35
|
activesupport (>= 5.0.0)
|
@@ -83,8 +85,10 @@ PLATFORMS
|
|
83
85
|
x86_64-linux
|
84
86
|
|
85
87
|
DEPENDENCIES
|
88
|
+
activesupport
|
86
89
|
bundler
|
87
90
|
discordrb (= 3.4.0)
|
91
|
+
dotenv
|
88
92
|
factory_bot
|
89
93
|
pry
|
90
94
|
qwtf_discord_bot!
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
6.
|
1
|
+
6.2.0
|
data/exe/qwtf_discord_bot
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'pug'
|
4
4
|
require 'event_decorator'
|
5
|
+
require 'active_support/core_ext/array/conversions'
|
5
6
|
|
6
7
|
class QwtfDiscordBotPug # :nodoc:
|
7
8
|
include QwtfDiscordBot
|
@@ -11,6 +12,28 @@ class QwtfDiscordBotPug # :nodoc:
|
|
11
12
|
TEN_MINUTES = 10 * 60
|
12
13
|
VALID_MENTION = /<@!?\d+>/
|
13
14
|
|
15
|
+
COMMANDS = <<~MESSAGE
|
16
|
+
`!status` Shows who has joined
|
17
|
+
`!join [@player1] [@player2]` Join PUG. Can also join other players
|
18
|
+
`!leave` Leave PUG
|
19
|
+
`!kick <@player> [@player2]` Kick one or more other players
|
20
|
+
`!team <team_no> [@player1] [@player2]` Join team
|
21
|
+
`!unteam [@player1] [@player2]` Leave team and go to front of queue
|
22
|
+
`!choose [n]` Choose fair teams. Pass number for nth fairest team
|
23
|
+
`!shuffle` Choose random teams.
|
24
|
+
`!win <team_no>` Report winning team
|
25
|
+
`!draw` Report draw
|
26
|
+
`!end` End PUG. Kicks all players
|
27
|
+
`!teamsize <no_of_players>` Set number of players in a team
|
28
|
+
`!addmap <map_name>` Add map to map list
|
29
|
+
`!removemap <map_name>` Remove map from map list
|
30
|
+
`!maps` Show map list
|
31
|
+
`!map [map_name]` Show or set map
|
32
|
+
`!notify <@role>` Set @role for alerts
|
33
|
+
MESSAGE
|
34
|
+
|
35
|
+
HELP = { commands: COMMANDS, footer: "!command <required> [optional]" }
|
36
|
+
|
14
37
|
def run
|
15
38
|
bot = Discordrb::Commands::CommandBot.new(
|
16
39
|
token: QwtfDiscordBot.config.token,
|
@@ -28,19 +51,80 @@ class QwtfDiscordBotPug # :nodoc:
|
|
28
51
|
)
|
29
52
|
|
30
53
|
bot.command :help do |event, *args|
|
31
|
-
|
54
|
+
send_embedded_message(
|
55
|
+
description: HELP[:commands],
|
56
|
+
channel: event.channel
|
57
|
+
) do |embed|
|
58
|
+
embed.footer = Discordrb::Webhooks::EmbedFooter.new(
|
59
|
+
text: HELP[:footer]
|
60
|
+
)
|
61
|
+
end
|
32
62
|
end
|
33
63
|
|
34
64
|
bot.command :join do |event, *args|
|
35
65
|
setup_pug(event) do |e, pug|
|
36
|
-
if
|
37
|
-
|
38
|
-
|
66
|
+
if args.empty?
|
67
|
+
if pug.joined?(e.user_id)
|
68
|
+
return send_embedded_message(
|
69
|
+
description: "You've already joined",
|
70
|
+
channel: e.channel
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
join_pug(e, pug)
|
75
|
+
else
|
76
|
+
errors = []
|
77
|
+
joiners = []
|
78
|
+
|
79
|
+
args.each do |mention|
|
80
|
+
if !mention.match(VALID_MENTION)
|
81
|
+
errors << "#{mention} isn't a valid mention"
|
82
|
+
next
|
83
|
+
end
|
84
|
+
|
85
|
+
user_id = mention_to_user_id(mention)
|
86
|
+
display_name = e.display_name_for(user_id) || mention
|
87
|
+
|
88
|
+
if pug.joined?(user_id)
|
89
|
+
errors << "#{display_name} is already in this PUG"
|
90
|
+
next
|
91
|
+
end
|
92
|
+
|
93
|
+
pug.join(user_id)
|
94
|
+
joiners << display_name
|
95
|
+
end
|
96
|
+
|
97
|
+
message = ""
|
98
|
+
description = []
|
99
|
+
|
100
|
+
if pug.total_player_count == 0
|
101
|
+
message = "#{pug.notify_roles} PUG started"
|
102
|
+
description << "#{e.display_name} creates a PUG"
|
103
|
+
elsif pug.slots_left.between?(1, 3)
|
104
|
+
message = "#{pug.slots_left} more #{pug.notify_roles}"
|
105
|
+
end
|
106
|
+
|
107
|
+
if joiners.any?
|
108
|
+
description << [
|
109
|
+
joiners.to_sentence,
|
110
|
+
joiners.count == 1 ? "joins" : "join",
|
111
|
+
"the PUG"
|
112
|
+
].join(" ")
|
113
|
+
end
|
114
|
+
|
115
|
+
description << [
|
116
|
+
pug.total_player_count,
|
117
|
+
pug.maxplayers
|
118
|
+
].join("/")
|
119
|
+
|
120
|
+
|
121
|
+
send_embedded_message(
|
122
|
+
message: message,
|
123
|
+
description: [errors, description.join(MSG_SNIPPET_DELIMITER)].join("\n"),
|
39
124
|
channel: e.channel
|
40
125
|
)
|
41
126
|
end
|
42
127
|
|
43
|
-
join_pug(e, pug)
|
44
128
|
start_pug(pug, e) if pug.has_exactly_maxplayers?
|
45
129
|
end
|
46
130
|
end
|
@@ -67,7 +151,21 @@ class QwtfDiscordBotPug # :nodoc:
|
|
67
151
|
0
|
68
152
|
end
|
69
153
|
|
70
|
-
message_obj =
|
154
|
+
message_obj = choose_teams(pug: pug, event: e, iteration: iteration)
|
155
|
+
status(pug: pug, event: e, message_obj: message_obj) if message_obj
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
bot.command :shuffle do |event|
|
160
|
+
setup_pug(event) do |e, pug|
|
161
|
+
if !pug.full?
|
162
|
+
return send_embedded_message(
|
163
|
+
description: "Not enough players, reduce !teamsize",
|
164
|
+
channel: event.channel
|
165
|
+
)
|
166
|
+
end
|
167
|
+
|
168
|
+
message_obj = choose_teams(pug: pug, event: e)
|
71
169
|
status(pug: pug, event: e, message_obj: message_obj) if message_obj
|
72
170
|
end
|
73
171
|
end
|
@@ -171,12 +269,12 @@ class QwtfDiscordBotPug # :nodoc:
|
|
171
269
|
)
|
172
270
|
end
|
173
271
|
|
272
|
+
errors = []
|
273
|
+
kickees = []
|
274
|
+
|
174
275
|
args.each do |mention|
|
175
|
-
|
176
|
-
|
177
|
-
description: "#{mention} isn't a valid mention",
|
178
|
-
channel: e.channel
|
179
|
-
)
|
276
|
+
if !mention.match(VALID_MENTION)
|
277
|
+
errors << "#{mention} isn't a valid mention"
|
180
278
|
next
|
181
279
|
end
|
182
280
|
|
@@ -184,43 +282,57 @@ class QwtfDiscordBotPug # :nodoc:
|
|
184
282
|
display_name = e.display_name_for(user_id) || mention
|
185
283
|
|
186
284
|
unless pug.joined?(user_id)
|
187
|
-
|
188
|
-
description: "#{display_name} isn't in the PUG",
|
189
|
-
channel: e.channel
|
190
|
-
)
|
285
|
+
errors << "#{display_name} isn't in the PUG"
|
191
286
|
next
|
192
287
|
end
|
193
288
|
|
194
289
|
pug.leave(user_id)
|
195
290
|
|
196
|
-
|
197
|
-
|
198
|
-
"#{pug.player_slots} remain"
|
199
|
-
]
|
291
|
+
kickees << display_name
|
292
|
+
end
|
200
293
|
|
201
|
-
|
294
|
+
message = ""
|
295
|
+
description = []
|
202
296
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
channel: e.channel
|
207
|
-
)
|
297
|
+
if pug.slots_left == 1
|
298
|
+
message = "#{pug.slots_left} more #{pug.notify_roles}"
|
299
|
+
end
|
208
300
|
|
209
|
-
|
301
|
+
if kickees.any?
|
302
|
+
description << [
|
303
|
+
kickees.to_sentence,
|
304
|
+
kickees.count == 1 ? "is" : "are",
|
305
|
+
"kicked from the PUG"
|
306
|
+
].join(" ")
|
210
307
|
end
|
308
|
+
|
309
|
+
description << [
|
310
|
+
[pug.total_player_count, pug.maxplayers].join("/"),
|
311
|
+
"remain"
|
312
|
+
].join(" ")
|
313
|
+
|
314
|
+
description = [errors, description.join(MSG_SNIPPET_DELIMITER)].join("\n")
|
315
|
+
|
316
|
+
send_embedded_message(
|
317
|
+
message: message,
|
318
|
+
description: description,
|
319
|
+
channel: e.channel
|
320
|
+
)
|
321
|
+
|
322
|
+
end_pug(pug, e.channel) if pug.empty?
|
211
323
|
end
|
212
324
|
end
|
213
325
|
|
214
326
|
bot.command :team do |event, *args|
|
215
327
|
setup_pug(event) do |e, pug|
|
216
|
-
|
328
|
+
if args.empty?
|
217
329
|
return send_embedded_message(
|
218
330
|
description: "Which team? E.G. `!team 1`",
|
219
331
|
channel: e.channel
|
220
332
|
)
|
221
333
|
end
|
222
334
|
|
223
|
-
|
335
|
+
if ["1", "2"].none?(args.first)
|
224
336
|
return send_embedded_message(
|
225
337
|
description: "Choose `!team 1`, `!team 2`, or `!unteam` to leave team",
|
226
338
|
channel: e.channel
|
@@ -250,12 +362,12 @@ class QwtfDiscordBotPug # :nodoc:
|
|
250
362
|
channel: e.channel
|
251
363
|
)
|
252
364
|
else
|
365
|
+
errors = []
|
366
|
+
teamers = []
|
367
|
+
|
253
368
|
args[1..-1].each do |mention|
|
254
|
-
|
255
|
-
|
256
|
-
description: "#{mention} isn't a valid mention",
|
257
|
-
channel: e.channel
|
258
|
-
)
|
369
|
+
if !mention.match(VALID_MENTION)
|
370
|
+
errors << "#{mention} isn't a valid mention"
|
259
371
|
next
|
260
372
|
end
|
261
373
|
|
@@ -263,14 +375,25 @@ class QwtfDiscordBotPug # :nodoc:
|
|
263
375
|
display_name = e.display_name_for(user_id) || mention
|
264
376
|
pug.join_team(team_no: team_no, player_id: user_id)
|
265
377
|
|
266
|
-
|
267
|
-
description: [
|
268
|
-
"#{display_name} joins #{TEAM_NAMES[team_no]}",
|
269
|
-
"#{pug.team_player_count(team_no)}/#{pug.teamsize}"
|
270
|
-
].join(MSG_SNIPPET_DELIMITER),
|
271
|
-
channel: e.channel
|
272
|
-
)
|
378
|
+
teamers << display_name
|
273
379
|
end
|
380
|
+
|
381
|
+
description = errors << [
|
382
|
+
[
|
383
|
+
teamers.to_sentence,
|
384
|
+
teamers.count == 1 ? "joins" : "join",
|
385
|
+
TEAM_NAMES[team_no]
|
386
|
+
].join(" "),
|
387
|
+
[
|
388
|
+
pug.team_player_count(team_no),
|
389
|
+
pug.teamsize
|
390
|
+
].join("/")
|
391
|
+
].join(MSG_SNIPPET_DELIMITER)
|
392
|
+
|
393
|
+
send_embedded_message(
|
394
|
+
description: description.join("\n"),
|
395
|
+
channel: e.channel
|
396
|
+
)
|
274
397
|
end
|
275
398
|
|
276
399
|
start_pug(pug, e) if !pug_already_full && pug.has_exactly_maxplayers?
|
@@ -281,7 +404,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
281
404
|
setup_pug(event) do |e, pug|
|
282
405
|
user_id = e.user_id
|
283
406
|
|
284
|
-
|
407
|
+
if !pug.active?
|
285
408
|
return send_embedded_message(
|
286
409
|
description: 'No PUG has been started. `!join` to create',
|
287
410
|
channel: e.channel
|
@@ -289,7 +412,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
289
412
|
end
|
290
413
|
|
291
414
|
if args.empty?
|
292
|
-
|
415
|
+
if !pug.joined?(user_id)
|
293
416
|
return send_embedded_message(
|
294
417
|
description: "You aren't in this PUG",
|
295
418
|
channel: e.channel
|
@@ -310,32 +433,38 @@ class QwtfDiscordBotPug # :nodoc:
|
|
310
433
|
channel: e.channel
|
311
434
|
)
|
312
435
|
else
|
436
|
+
errors = []
|
437
|
+
unteamers = []
|
438
|
+
|
313
439
|
args.each do |mention|
|
314
|
-
|
315
|
-
|
316
|
-
description: "#{mention} isn't a valid mention",
|
317
|
-
channel: e.channel
|
318
|
-
)
|
440
|
+
if !mention.match(VALID_MENTION)
|
441
|
+
errors << "#{mention} isn't a valid mention"
|
319
442
|
next
|
320
443
|
end
|
321
444
|
|
322
445
|
user_id = mention_to_user_id(mention)
|
323
446
|
display_name = e.display_name_for(user_id) || mention
|
324
447
|
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
channel: e.channel
|
329
|
-
)
|
448
|
+
if !pug.joined?(user_id)
|
449
|
+
errors << "#{display_name} isn't in this PUG"
|
450
|
+
next
|
330
451
|
end
|
331
452
|
|
332
453
|
pug.unteam(user_id)
|
333
454
|
|
334
|
-
|
335
|
-
description: "#{display_name} leaves team",
|
336
|
-
channel: e.channel
|
337
|
-
)
|
455
|
+
unteamers << display_name
|
338
456
|
end
|
457
|
+
|
458
|
+
description = errors << [
|
459
|
+
unteamers.to_sentence,
|
460
|
+
unteamers.count == 1 ? "goes" : "go",
|
461
|
+
"into the queue"
|
462
|
+
].join(" ")
|
463
|
+
|
464
|
+
send_embedded_message(
|
465
|
+
description: description.join("\n"),
|
466
|
+
channel: e.channel
|
467
|
+
)
|
339
468
|
end
|
340
469
|
end
|
341
470
|
end
|
@@ -417,7 +546,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
417
546
|
).body
|
418
547
|
|
419
548
|
send_embedded_message(
|
420
|
-
description: "#{TEAM_NAMES[winning_team_no]} wins game ##{id}. `!choose` again. [
|
549
|
+
description: "#{TEAM_NAMES[winning_team_no]} wins game ##{id}. `!choose` again. [Results](#{discord_channel_leaderboard_url(e.channel.id)})",
|
421
550
|
channel: e.channel
|
422
551
|
)
|
423
552
|
end
|
@@ -485,7 +614,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
485
614
|
).body
|
486
615
|
|
487
616
|
send_embedded_message(
|
488
|
-
description: "Match ##{id} drawn. `!choose` again. [
|
617
|
+
description: "Match ##{id} drawn. `!choose` again. [Results](#{discord_channel_leaderboard_url(e.channel.id)})",
|
489
618
|
channel: e.channel
|
490
619
|
)
|
491
620
|
end
|
@@ -640,7 +769,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
640
769
|
end
|
641
770
|
|
642
771
|
def mention_to_user_id(mention)
|
643
|
-
mention[
|
772
|
+
mention[/\d+/].to_i
|
644
773
|
end
|
645
774
|
|
646
775
|
def join_pug(e, pug)
|
@@ -648,7 +777,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
648
777
|
|
649
778
|
if pug.total_player_count == 1
|
650
779
|
snippets = ["#{e.display_name} creates a PUG", "#{pug.player_slots} joined"]
|
651
|
-
message = pug.notify_roles
|
780
|
+
message = "#{pug.notify_roles} PUG started"
|
652
781
|
else
|
653
782
|
snippets = ["#{e.display_name} joins the PUG", "#{pug.player_slots} joined"]
|
654
783
|
message = "#{pug.slots_left} more #{pug.notify_roles}" if pug.slots_left.between?(1, 3)
|
@@ -668,7 +797,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
668
797
|
nil # stop discordrb printing return value
|
669
798
|
end
|
670
799
|
|
671
|
-
def
|
800
|
+
def choose_teams(pug:, event:, iteration: nil)
|
672
801
|
if !pug.full?
|
673
802
|
return send_embedded_message(
|
674
803
|
description: "Not enough players, reduce !teamsize",
|
@@ -677,7 +806,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
677
806
|
end
|
678
807
|
|
679
808
|
message_obj = send_embedded_message(
|
680
|
-
description: "Choosing
|
809
|
+
description: "Choosing teams...",
|
681
810
|
channel: event.channel
|
682
811
|
)
|
683
812
|
|
@@ -685,14 +814,18 @@ class QwtfDiscordBotPug # :nodoc:
|
|
685
814
|
channel_id: event.channel.id, players: pug.up_now_players
|
686
815
|
)
|
687
816
|
|
688
|
-
|
817
|
+
if iteration
|
818
|
+
teams = combinations[iteration]
|
689
819
|
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
820
|
+
if !teams
|
821
|
+
return send_embedded_message(
|
822
|
+
description: "There are only #{combinations.count} possible combinations",
|
823
|
+
channel: event.channel,
|
824
|
+
message_obj: message_obj
|
825
|
+
) && nil
|
826
|
+
end
|
827
|
+
else
|
828
|
+
teams = combinations.sample
|
696
829
|
end
|
697
830
|
|
698
831
|
pug.destroy_teams
|
@@ -748,8 +881,6 @@ class QwtfDiscordBotPug # :nodoc:
|
|
748
881
|
end
|
749
882
|
|
750
883
|
def start_pug(pug, event)
|
751
|
-
choose_fair_teams(pug: pug, event: event) unless pug.teams.any?
|
752
|
-
|
753
884
|
footer = [
|
754
885
|
pug.game_map,
|
755
886
|
"#{pug.player_slots} joined",
|
@@ -759,7 +890,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
759
890
|
event.mention_for(player_id)
|
760
891
|
end
|
761
892
|
|
762
|
-
mention_line = "
|
893
|
+
mention_line = "`!choose`, `!shuffle` or `!team` up. #{mentions.join(" ")}"
|
763
894
|
|
764
895
|
send_embedded_message(
|
765
896
|
message: mention_line,
|
data/qwtf_discord_bot.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qwtf_discord_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sheldon Johnson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: discordrb
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '6.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '6.1'
|
55
69
|
description: A Discord bot for reporting on QuakeWorld Team Fortress game servers
|
56
70
|
email:
|
57
71
|
- shayolden@hotmail.com
|