qwtf_discord_bot 6.1.3 → 6.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef8bda609c0735d9ba3ba074c3f53a963c2d2cc7f933af4965ba9fb797b7d151
4
- data.tar.gz: de760869c4380aa7d14ec16b7828655b1534c41aa3808a6c26d8f36a5694e7dd
3
+ metadata.gz: ce51af5b4d0cad9d10f44446ef2191b99188a17a1f5f4c7a460a7b8e64c91a2e
4
+ data.tar.gz: cbffbf577b7a3f61ea59d6ec18fa2a4a8cecae8dab8e6c9409e0892907bb5aea
5
5
  SHA512:
6
- metadata.gz: ec8f53ff7b12188bab9059db811c478b7010a105e7d37e626816da5d03003502030515e7ab918b521ec0d6dd7998c1a776be332d8a1fdc1fa2a8935df4fb272b
7
- data.tar.gz: 4812904a6c1dd2824f08bd376239760c8506329438c26dae718ac809a123e6201547ad40f77de1bd3cab91781234022f6f914ba4f1abc21eba9c19c6f0e7999b
6
+ metadata.gz: 8e0a30ef32c41f1c7514ff78c3ac025ad771cdcd56758e86fe88ab4211836a0a01477db6c28ceadd393f55e358e26e97f1efaa41f413226fce666f3679dbac0f
7
+ data.tar.gz: 335081f9a5318c1a3ad4fc3bd03e97c6f260497f188c55d2783c033c230bc26b74a1ac207300d99601f3560e4834ce614b213bd5bcce8aab728e4928b76b9a62
data/Gemfile CHANGED
@@ -6,9 +6,11 @@ gem 'bundler'
6
6
  gem 'discordrb', '3.4.0'
7
7
  gem 'redis'
8
8
  gem 'thor'
9
+ gem 'activesupport'
9
10
 
10
11
  group :development do
11
12
  gem 'pry'
13
+ gem 'dotenv'
12
14
  end
13
15
 
14
16
  group :test do
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qwtf_discord_bot (6.1.3)
4
+ qwtf_discord_bot (6.2.1)
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!
@@ -93,4 +97,4 @@ DEPENDENCIES
93
97
  thor
94
98
 
95
99
  BUNDLED WITH
96
- 2.2.8
100
+ 2.2.21
data/README.md CHANGED
@@ -105,6 +105,7 @@ This responds to discord messages:
105
105
  - `!maps`
106
106
  - `!map [map_name]`
107
107
  - `!choose [n]`
108
+ - `!shuffle`
108
109
  - `!win <team_no>`
109
110
  - `!draw`
110
111
  - `!notify <@role>`
data/VERSION CHANGED
@@ -1 +1 @@
1
- 6.1.3
1
+ 6.2.1
data/exe/qwtf_discord_bot CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'dotenv/load'
3
4
  require 'qwtf_discord_bot'
4
5
  require 'thor'
5
6
  require 'pry'
@@ -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
@@ -9,6 +10,29 @@ class QwtfDiscordBotPug # :nodoc:
9
10
  MSG_SNIPPET_DELIMITER = ' · '
10
11
  TEAM_NAMES = { 1 => "Blue", 2 => "Red" }
11
12
  TEN_MINUTES = 10 * 60
13
+ VALID_MENTION = /<@!?\d+>/
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]" }
12
36
 
13
37
  def run
14
38
  bot = Discordrb::Commands::CommandBot.new(
@@ -27,19 +51,79 @@ class QwtfDiscordBotPug # :nodoc:
27
51
  )
28
52
 
29
53
  bot.command :help do |event, *args|
30
- "Pug commands: `!status`, `!join`, `!team <team_no> [@player1] [@player2]`, `!unteam`, `!leave`, `!kick <@player>`, `!win <team_no>`, `!draw`, `!end`, `!teamsize <no_of_players>`, `!addmap <map_name>`, `!removemap <map_name>`, `!maps`, `!map [map_name]`, `!choose [n]`, `!notify <@role>`"
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
31
62
  end
32
63
 
33
64
  bot.command :join do |event, *args|
34
65
  setup_pug(event) do |e, pug|
35
- if pug.joined?(e.user_id)
36
- return send_embedded_message(
37
- description: "You've already joined",
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
+ send_embedded_message(
121
+ message: message,
122
+ description: [errors, description.join(MSG_SNIPPET_DELIMITER)].join("\n"),
38
123
  channel: e.channel
39
124
  )
40
125
  end
41
126
 
42
- join_pug(e, pug)
43
127
  start_pug(pug, e) if pug.has_exactly_maxplayers?
44
128
  end
45
129
  end
@@ -66,7 +150,21 @@ class QwtfDiscordBotPug # :nodoc:
66
150
  0
67
151
  end
68
152
 
69
- message_obj = choose_fair_teams(pug: pug, event: e, iteration: iteration)
153
+ message_obj = choose_teams(pug: pug, event: e, iteration: iteration)
154
+ status(pug: pug, event: e, message_obj: message_obj) if message_obj
155
+ end
156
+ end
157
+
158
+ bot.command :shuffle do |event|
159
+ setup_pug(event) do |e, pug|
160
+ if !pug.full?
161
+ return send_embedded_message(
162
+ description: "Not enough players, reduce !teamsize",
163
+ channel: event.channel
164
+ )
165
+ end
166
+
167
+ message_obj = choose_teams(pug: pug, event: e)
70
168
  status(pug: pug, event: e, message_obj: message_obj) if message_obj
71
169
  end
72
170
  end
@@ -170,56 +268,70 @@ class QwtfDiscordBotPug # :nodoc:
170
268
  )
171
269
  end
172
270
 
173
- args.each do |arg|
174
- unless arg.match(/<@!\d+>/)
175
- send_embedded_message(
176
- description: "#{arg} isn't a valid mention",
177
- channel: e.channel
178
- )
271
+ errors = []
272
+ kickees = []
273
+
274
+ args.each do |mention|
275
+ if !mention.match(VALID_MENTION)
276
+ errors << "#{mention} isn't a valid mention"
179
277
  next
180
278
  end
181
279
 
182
- user_id = mention_to_user_id(arg)
183
- display_name = e.display_name_for(user_id) || arg
280
+ user_id = mention_to_user_id(mention)
281
+ display_name = e.display_name_for(user_id) || mention
184
282
 
185
283
  unless pug.joined?(user_id)
186
- send_embedded_message(
187
- description: "#{display_name} isn't in the PUG",
188
- channel: e.channel
189
- )
284
+ errors << "#{display_name} isn't in the PUG"
190
285
  next
191
286
  end
192
287
 
193
288
  pug.leave(user_id)
194
289
 
195
- snippets = [
196
- "#{display_name} is kicked from the PUG",
197
- "#{pug.player_slots} remain"
198
- ]
290
+ kickees << display_name
291
+ end
199
292
 
200
- message = "#{pug.slots_left} more #{pug.notify_roles}" if pug.slots_left == 1
293
+ message = ""
294
+ description = []
201
295
 
202
- send_embedded_message(
203
- message: message,
204
- description: snippets.join(MSG_SNIPPET_DELIMITER),
205
- channel: e.channel
206
- )
296
+ if pug.slots_left == 1
297
+ message = "#{pug.slots_left} more #{pug.notify_roles}"
298
+ end
207
299
 
208
- break end_pug(pug, e.channel) if pug.empty?
300
+ if kickees.any?
301
+ description << [
302
+ kickees.to_sentence,
303
+ kickees.count == 1 ? "is" : "are",
304
+ "kicked from the PUG"
305
+ ].join(" ")
209
306
  end
307
+
308
+ description << [
309
+ [pug.total_player_count, pug.maxplayers].join("/"),
310
+ "remain"
311
+ ].join(" ")
312
+
313
+ description = [errors, description.join(MSG_SNIPPET_DELIMITER)].join("\n")
314
+
315
+ send_embedded_message(
316
+ message: message,
317
+ description: description,
318
+ channel: e.channel
319
+ )
320
+
321
+ end_pug(pug, e.channel) if pug.empty?
210
322
  end
211
323
  end
212
324
 
213
325
  bot.command :team do |event, *args|
214
326
  setup_pug(event) do |e, pug|
215
- unless args.any?
327
+ if args.empty?
216
328
  return send_embedded_message(
217
329
  description: "Which team? E.G. `!team 1`",
218
330
  channel: e.channel
219
331
  )
220
332
  end
221
333
 
222
- unless ["1", "2"].any?(args.first)
334
+ if ["1", "2"].none?(args.first)
223
335
  return send_embedded_message(
224
336
  description: "Choose `!team 1`, `!team 2`, or `!unteam` to leave team",
225
337
  channel: e.channel
@@ -249,27 +361,38 @@ class QwtfDiscordBotPug # :nodoc:
249
361
  channel: e.channel
250
362
  )
251
363
  else
364
+ errors = []
365
+ teamers = []
366
+
252
367
  args[1..-1].each do |mention|
253
- unless mention.match(/<@!\d+>/)
254
- send_embedded_message(
255
- description: "#{arg} isn't a valid mention",
256
- channel: e.channel
257
- )
368
+ if !mention.match(VALID_MENTION)
369
+ errors << "#{mention} isn't a valid mention"
258
370
  next
259
371
  end
260
372
 
261
373
  user_id = mention_to_user_id(mention)
262
- display_name = e.display_name_for(user_id) || arg
374
+ display_name = e.display_name_for(user_id) || mention
263
375
  pug.join_team(team_no: team_no, player_id: user_id)
264
376
 
265
- send_embedded_message(
266
- description: [
267
- "#{display_name} joins #{TEAM_NAMES[team_no]}",
268
- "#{pug.team_player_count(team_no)}/#{pug.teamsize}"
269
- ].join(MSG_SNIPPET_DELIMITER),
270
- channel: e.channel
271
- )
377
+ teamers << display_name
272
378
  end
379
+
380
+ description = errors << [
381
+ [
382
+ teamers.to_sentence,
383
+ teamers.count == 1 ? "joins" : "join",
384
+ TEAM_NAMES[team_no]
385
+ ].join(" "),
386
+ [
387
+ pug.team_player_count(team_no),
388
+ pug.teamsize
389
+ ].join("/")
390
+ ].join(MSG_SNIPPET_DELIMITER)
391
+
392
+ send_embedded_message(
393
+ description: description.join("\n"),
394
+ channel: e.channel
395
+ )
273
396
  end
274
397
 
275
398
  start_pug(pug, e) if !pug_already_full && pug.has_exactly_maxplayers?
@@ -280,7 +403,7 @@ class QwtfDiscordBotPug # :nodoc:
280
403
  setup_pug(event) do |e, pug|
281
404
  user_id = e.user_id
282
405
 
283
- unless pug.active?
406
+ if !pug.active?
284
407
  return send_embedded_message(
285
408
  description: 'No PUG has been started. `!join` to create',
286
409
  channel: e.channel
@@ -288,7 +411,7 @@ class QwtfDiscordBotPug # :nodoc:
288
411
  end
289
412
 
290
413
  if args.empty?
291
- unless pug.joined?(user_id)
414
+ if !pug.joined?(user_id)
292
415
  return send_embedded_message(
293
416
  description: "You aren't in this PUG",
294
417
  channel: e.channel
@@ -309,32 +432,38 @@ class QwtfDiscordBotPug # :nodoc:
309
432
  channel: e.channel
310
433
  )
311
434
  else
435
+ errors = []
436
+ unteamers = []
437
+
312
438
  args.each do |mention|
313
- unless mention.match(/<@!\d+>/)
314
- send_embedded_message(
315
- description: "#{arg} isn't a valid mention",
316
- channel: e.channel
317
- )
439
+ if !mention.match(VALID_MENTION)
440
+ errors << "#{mention} isn't a valid mention"
318
441
  next
319
442
  end
320
443
 
321
444
  user_id = mention_to_user_id(mention)
322
- display_name = e.display_name_for(user_id) || arg
445
+ display_name = e.display_name_for(user_id) || mention
323
446
 
324
- unless pug.joined?(user_id)
325
- return send_embedded_message(
326
- description: "#{display_name} isn't in this PUG",
327
- channel: e.channel
328
- )
447
+ if !pug.joined?(user_id)
448
+ errors << "#{display_name} isn't in this PUG"
449
+ next
329
450
  end
330
451
 
331
452
  pug.unteam(user_id)
332
453
 
333
- send_embedded_message(
334
- description: "#{display_name} leaves team",
335
- channel: e.channel
336
- )
454
+ unteamers << display_name
337
455
  end
456
+
457
+ description = errors << [
458
+ unteamers.to_sentence,
459
+ unteamers.count == 1 ? "goes" : "go",
460
+ "into the queue"
461
+ ].join(" ")
462
+
463
+ send_embedded_message(
464
+ description: description.join("\n"),
465
+ channel: e.channel
466
+ )
338
467
  end
339
468
  end
340
469
  end
@@ -416,7 +545,7 @@ class QwtfDiscordBotPug # :nodoc:
416
545
  ).body
417
546
 
418
547
  send_embedded_message(
419
- description: "#{TEAM_NAMES[winning_team_no]} wins game ##{id}. `!choose` again. [Ratings](#{discord_channel_leaderboard_url(e.channel.id)})",
548
+ description: "#{TEAM_NAMES[winning_team_no]} wins game ##{id}. `!choose` again. [Results](#{discord_channel_leaderboard_url(e.channel.id)})",
420
549
  channel: e.channel
421
550
  )
422
551
  end
@@ -484,7 +613,7 @@ class QwtfDiscordBotPug # :nodoc:
484
613
  ).body
485
614
 
486
615
  send_embedded_message(
487
- description: "Match ##{id} drawn. `!choose` again. [Ratings](#{discord_channel_leaderboard_url(e.channel.id)})",
616
+ description: "Match ##{id} drawn. `!choose` again. [Results](#{discord_channel_leaderboard_url(e.channel.id)})",
488
617
  channel: e.channel
489
618
  )
490
619
  end
@@ -639,7 +768,7 @@ class QwtfDiscordBotPug # :nodoc:
639
768
  end
640
769
 
641
770
  def mention_to_user_id(mention)
642
- mention[3..-2].to_i
771
+ mention[/\d+/].to_i
643
772
  end
644
773
 
645
774
  def join_pug(e, pug)
@@ -647,7 +776,7 @@ class QwtfDiscordBotPug # :nodoc:
647
776
 
648
777
  if pug.total_player_count == 1
649
778
  snippets = ["#{e.display_name} creates a PUG", "#{pug.player_slots} joined"]
650
- message = pug.notify_roles
779
+ message = "#{pug.notify_roles} PUG started"
651
780
  else
652
781
  snippets = ["#{e.display_name} joins the PUG", "#{pug.player_slots} joined"]
653
782
  message = "#{pug.slots_left} more #{pug.notify_roles}" if pug.slots_left.between?(1, 3)
@@ -667,7 +796,7 @@ class QwtfDiscordBotPug # :nodoc:
667
796
  nil # stop discordrb printing return value
668
797
  end
669
798
 
670
- def choose_fair_teams(pug:, event:, iteration: 0)
799
+ def choose_teams(pug:, event:, iteration: nil)
671
800
  if !pug.full?
672
801
  return send_embedded_message(
673
802
  description: "Not enough players, reduce !teamsize",
@@ -676,7 +805,7 @@ class QwtfDiscordBotPug # :nodoc:
676
805
  end
677
806
 
678
807
  message_obj = send_embedded_message(
679
- description: "Choosing fair teams...",
808
+ description: "Choosing teams...",
680
809
  channel: event.channel
681
810
  )
682
811
 
@@ -684,14 +813,34 @@ class QwtfDiscordBotPug # :nodoc:
684
813
  channel_id: event.channel.id, players: pug.up_now_players
685
814
  )
686
815
 
687
- teams = combinations[iteration]
816
+ if iteration
817
+ teams = combinations[iteration]
688
818
 
689
- if !teams
690
- return send_embedded_message(
691
- description: "There are only #{combinations.count} possible combinations",
692
- channel: event.channel,
693
- message_obj: message_obj
694
- ) && nil
819
+ if !teams
820
+ return send_embedded_message(
821
+ description: "There are only #{combinations.count} possible combinations",
822
+ channel: event.channel,
823
+ message_obj: message_obj
824
+ ) && nil
825
+ end
826
+ else
827
+ weighted_combinations = combinations.map.with_index do |combination, index|
828
+ { weight: 1/(index+1.0), combination: combination }
829
+ end
830
+
831
+ total = weighted_combinations.inject(0) do |sum, wt|
832
+ sum + wt[:weight]
833
+ end
834
+
835
+ chosen_weighted_team_index = rand(0..total)
836
+ counter = 0.0
837
+
838
+ weighted_combination = weighted_combinations.find do |wt|
839
+ counter += wt[:weight]
840
+ chosen_weighted_team_index <= counter
841
+ end
842
+
843
+ teams = weighted_combination[:combination]
695
844
  end
696
845
 
697
846
  pug.destroy_teams
@@ -747,51 +896,17 @@ class QwtfDiscordBotPug # :nodoc:
747
896
  end
748
897
 
749
898
  def start_pug(pug, event)
750
- choose_fair_teams(pug: pug, event: event) unless pug.teams.any?
751
-
752
- footer = [
753
- pug.game_map,
754
- "#{pug.player_slots} joined",
755
- ].compact.join(MSG_SNIPPET_DELIMITER)
756
-
757
899
  mentions = pug.players.map do |player_id|
758
900
  event.mention_for(player_id)
759
901
  end
760
902
 
761
- mention_line = "Time to play! #{mentions.join(" ")}"
903
+ mention_line = mentions.join(" ")
762
904
 
763
905
  send_embedded_message(
764
906
  message: mention_line,
765
- channel: event.channel
766
- ) do |embed|
767
- embed.footer = Discordrb::Webhooks::EmbedFooter.new(
768
- text: footer
769
- )
770
-
771
- if pug.queued_players.any?
772
- queue_display_names = pug.queued_players.map do |player_id|
773
- event.display_name_for(player_id)
774
- end
775
-
776
- embed.add_field(
777
- inline: true,
778
- name: "Queue",
779
- value: queue_display_names.join("\n")
780
- )
781
- end
782
-
783
- pug.teams.each do |team_no, player_ids|
784
- team_mentions = player_ids.map do |player_id|
785
- event.display_name_for(player_id)
786
- end
787
-
788
- embed.add_field(
789
- inline: true,
790
- name: team_name(team_no),
791
- value: team_mentions.join("\n")
792
- )
793
- end
794
- end
907
+ channel: event.channel,
908
+ description: "Time to play. `!choose`, `!shuffle` or `!team` up."
909
+ )
795
910
  end
796
911
 
797
912
  def end_pug(pug, channel_id)
@@ -47,7 +47,7 @@ class QwtfDiscordBotServer
47
47
  request = QstatRequest.new(endpoint.address)
48
48
 
49
49
  if !request.live_server?
50
- event.channel.send_message("#{endpoint} isn't responding")
50
+ event.channel.send_message("#{endpoint.address} isn't responding")
51
51
  else
52
52
  event.channel.send_embed(nil, request.to_full_embed)
53
53
  end
@@ -30,4 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_runtime_dependency 'discordrb', '3.4.0'
31
31
  spec.add_runtime_dependency 'redis', '~> 4.2'
32
32
  spec.add_runtime_dependency 'thor', '~>1.1'
33
+ spec.add_runtime_dependency 'activesupport', '~>6.1'
33
34
  end
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.1.3
4
+ version: 6.2.1
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-06-25 00:00:00.000000000 Z
11
+ date: 2021-09-05 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
@@ -141,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
155
  - !ruby/object:Gem::Version
142
156
  version: '0'
143
157
  requirements: []
144
- rubygems_version: 3.2.3
158
+ rubygems_version: 3.2.15
145
159
  signing_key:
146
160
  specification_version: 4
147
161
  summary: Works by wrapping the excellent CLI server query tool qstat. Accepts !server,