qwtf_discord_bot 6.0.4 → 6.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 44abd3f52df5308b4ebf30f466541ea533746bd1445b0d0f4da1bcd65899589e
4
- data.tar.gz: e343757d9e22e7b012a31ee64ffc5ecbb9a8553b90fa7e9d662203b9bea564e9
3
+ metadata.gz: 402ebf8fe6c235b94f6e1db48b228f13d0bdece3628873edf943f66f26c9d05c
4
+ data.tar.gz: 69c5fdad3c21f133a315a1f87ac9b92dc068efd13750e33f144bfdf64bf9ea8f
5
5
  SHA512:
6
- metadata.gz: 050ad69fb1fadd1620bc12874882579744e6e8dffbf249c22a255f7fd785faf02b3f95d1e3bad6fb612909744bf7ae22c5ca407696170cc567decaa869133da1
7
- data.tar.gz: 40e6a6c3657a4c030d93002edc6138406a33980c1d7f37e8fc3465060ba49aecd216dca43b3a8de56bd0c333535dcc7785c564ae617e3584ad0aa60dedbc3181
6
+ metadata.gz: fd4aa01e8a86d1e0e82b658c26e9f6bbfce16786e00c61bd6069c4be1a03a3a63ab8a05a497bb287cf861d8d0f37f210cf8f52510be5e812a47eba34f728d1a2
7
+ data.tar.gz: c2c25e668f9de93662ee2ddac5ac43d058c50d49be42647c1c1ec33046b10220cfcb1b3f5678b7d4a52899e99bad8092098f2159478b7435217de86263cea1c8
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qwtf_discord_bot (6.0.4)
4
+ qwtf_discord_bot (6.1.4)
5
5
  discordrb (= 3.4.0)
6
6
  redis (~> 4.2)
7
7
  thor (~> 1.1)
@@ -93,4 +93,4 @@ DEPENDENCIES
93
93
  thor
94
94
 
95
95
  BUNDLED WITH
96
- 2.2.8
96
+ 2.2.21
data/VERSION CHANGED
@@ -1 +1 @@
1
- 6.0.4
1
+ 6.1.4
data/lib/dashboard.rb CHANGED
@@ -4,7 +4,6 @@ class Dashboard
4
4
  @endpoints = dashboard_config["endpoints"]
5
5
  @messages = {}
6
6
 
7
-
8
7
  channel_name = dashboard_config["name"]
9
8
 
10
9
  old_dashboard_channel = @server.channels.find do |chan|
data/lib/pug.rb CHANGED
@@ -11,17 +11,28 @@ class Pug
11
11
  end
12
12
 
13
13
  def join(player_id)
14
- redis.setnx(pug_key, Time.now.to_i)
15
- redis.sadd(team_key(0), player_id)
14
+ timestamp = Time.now.to_i
15
+ redis.setnx(pug_key, timestamp)
16
+ redis.zadd(queue_key, timestamp, player_id, nx: true)
16
17
  end
17
18
 
18
19
  def join_team(team_no:, player_id:)
19
- redis.setnx(pug_key, Time.now.to_i)
20
- leave_teams(player_id)
20
+ join(player_id)
21
+ unteam(player_id)
21
22
  redis.sadd(team_key(team_no), player_id)
22
23
  end
23
24
 
24
- def joined_players
25
+ def up_now_players
26
+ players[0, maxplayers]
27
+ end
28
+
29
+ def destroy_teams
30
+ teamed_players.each do |player_id|
31
+ unteam(player_id)
32
+ end
33
+ end
34
+
35
+ def teamed_players
25
36
  teams_keys.inject([]) do |players, team|
26
37
  players + redis.smembers(team).map(&:to_i)
27
38
  end
@@ -55,16 +66,24 @@ class Pug
55
66
  redis.set(teamsize_key, teamsize)
56
67
  end
57
68
 
69
+ def total_player_count
70
+ players.count
71
+ end
72
+
58
73
  def full?
59
- joined_player_count >= maxplayers
74
+ total_player_count >= maxplayers
75
+ end
76
+
77
+ def has_exactly_maxplayers?
78
+ total_player_count == maxplayers
60
79
  end
61
80
 
62
81
  def empty?
63
- joined_player_count.zero?
82
+ total_player_count.zero?
64
83
  end
65
84
 
66
- def joined_player_count
67
- joined_players.count
85
+ def teamed_player_count
86
+ teamed_players.count
68
87
  end
69
88
 
70
89
  def team_player_count(team_no)
@@ -72,11 +91,11 @@ class Pug
72
91
  end
73
92
 
74
93
  def player_slots
75
- "#{joined_player_count}/#{maxplayers}"
94
+ "#{total_player_count}/#{maxplayers}"
76
95
  end
77
96
 
78
97
  def slots_left
79
- maxplayers - joined_player_count
98
+ maxplayers - total_player_count
80
99
  end
81
100
 
82
101
  def game_map=(map)
@@ -104,7 +123,8 @@ class Pug
104
123
  end
105
124
 
106
125
  def leave(player_id)
107
- leave_teams(player_id)
126
+ leave_queue(player_id)
127
+ unteam(player_id)
108
128
  end
109
129
 
110
130
  def end_pug
@@ -114,13 +134,17 @@ class Pug
114
134
  end
115
135
 
116
136
  def joined?(player_id)
117
- joined_players.include?(player_id)
137
+ redis.zrank(queue_key, player_id)
118
138
  end
119
139
 
120
140
  def maxplayers
121
141
  teamsize * no_of_teams
122
142
  end
123
143
 
144
+ def queued_players
145
+ players - teamed_players
146
+ end
147
+
124
148
  def teams
125
149
  all_teams = teams_keys.inject({}) do |teams, team|
126
150
  teams.merge({ team.split(':').last.to_i => redis.smembers(team).map(&:to_i) })
@@ -129,16 +153,6 @@ class Pug
129
153
  all_teams.sort.to_h
130
154
  end
131
155
 
132
- def actual_teams
133
- teams.tap { |team| team.delete(0) }
134
- end
135
-
136
- def unteam_all_players
137
- joined_players.each do |player_id|
138
- join_team(team_no: 0, player_id: player_id)
139
- end
140
- end
141
-
142
156
  def update_last_result_time
143
157
  redis.set(last_result_time_key, Time.now.to_i)
144
158
  end
@@ -148,25 +162,37 @@ class Pug
148
162
  end
149
163
 
150
164
  def equal_number_of_players_on_each_team?
151
- team_player_counts = actual_teams.map do |_name, players|
165
+ team_player_counts = teams.map do |_name, players|
152
166
  players.size
153
167
  end
154
168
 
155
169
  team_player_counts.uniq.size == 1
156
170
  end
157
171
 
158
- private
159
-
160
- def leave_teams(player_id)
172
+ def unteam(player_id)
161
173
  teams_keys.each do |team|
162
174
  redis.srem(team, player_id)
163
175
  end
164
176
  end
165
177
 
178
+ def players
179
+ redis.zrange(queue_key, 0, -1).map(&:to_i)
180
+ end
181
+
182
+ private
183
+
184
+ def leave_queue(player_id)
185
+ redis.zrem(queue_key, player_id)
186
+ end
187
+
166
188
  def teams_keys
167
189
  redis.keys([pug_key, 'teams:*'].join(':'))
168
190
  end
169
191
 
192
+ def queue_key
193
+ [pug_key, 'queue'].join(':')
194
+ end
195
+
170
196
  def team_key(team_no)
171
197
  [pug_key, 'teams', team_no].join(':')
172
198
  end
@@ -208,6 +234,6 @@ class Pug
208
234
  end
209
235
 
210
236
  def no_of_teams
211
- [actual_teams.count, MIN_NO_OF_TEAMS].max
237
+ [teams.count, MIN_NO_OF_TEAMS].max
212
238
  end
213
239
  end
data/lib/qstat_request.rb CHANGED
@@ -11,28 +11,26 @@ class QstatRequest
11
11
  @result ||= execute
12
12
  end
13
13
 
14
- def to_embed
15
- return nil if is_empty?
16
-
17
- embed = Discordrb::Webhooks::Embed.new
18
-
19
- teams.each do |team|
20
- embed << team.to_embed_field
21
- end
22
-
23
- embed
24
- end
25
-
26
14
  def to_full_embed
27
15
  Discordrb::Webhooks::Embed.new.tap do |embed|
28
16
  embed.add_field(
29
17
  name: name,
30
- value: embed_summary,
18
+ value: join_link,
31
19
  )
32
20
 
33
21
  teams.each do |team|
34
22
  embed << team.to_embed_field
35
23
  end
24
+
25
+ footer = [game_map, "#{numplayers}/#{maxplayers} players"]
26
+
27
+ if has_spectators?
28
+ footer << "#{numspectators}/#{maxspectators} spectators"
29
+ end
30
+
31
+ embed.footer = Discordrb::Webhooks::EmbedFooter.new(
32
+ text: footer.join(MSG_SNIPPET_DELIMITER)
33
+ )
36
34
  end
37
35
  end
38
36
 
@@ -43,9 +41,7 @@ class QstatRequest
43
41
  end
44
42
 
45
43
  def server_summary
46
- return "#{@endpoint} isn't responding" unless game_map
47
-
48
- info = [name, @endpoint, game_map]
44
+ info = [name, game_map]
49
45
 
50
46
  info += if !has_spectators?
51
47
  ["#{numplayers}/#{maxplayers}"]
@@ -56,28 +52,13 @@ class QstatRequest
56
52
  ]
57
53
  end
58
54
 
55
+ info << join_link
56
+
59
57
  info.join(MSG_SNIPPET_DELIMITER)
60
58
  end
61
59
 
62
60
  def join_link
63
- "[Join](http://phobos.baseq.fr:9999/join?url=#{@endpoint})"
64
- end
65
-
66
- def embed_summary
67
- info = [@endpoint, game_map]
68
-
69
- info += if !has_spectators?
70
- ["#{numplayers}/#{maxplayers}"]
71
- else
72
- [
73
- "#{numplayers}/#{maxplayers} players",
74
- "#{numspectators}/#{maxspectators} spectators"
75
- ]
76
- end
77
-
78
- info << join_link
79
-
80
- info.join(MSG_SNIPPET_DELIMITER)
61
+ "<qw://#{@endpoint}>"
81
62
  end
82
63
 
83
64
  def is_empty?
@@ -92,6 +73,10 @@ class QstatRequest
92
73
  numplayers && numplayers > 0
93
74
  end
94
75
 
76
+ def live_server?
77
+ !game_map.nil?
78
+ end
79
+
95
80
  private
96
81
 
97
82
  def has_spectators?
@@ -9,6 +9,7 @@ class QwtfDiscordBotPug # :nodoc:
9
9
  MSG_SNIPPET_DELIMITER = ' · '
10
10
  TEAM_NAMES = { 1 => "Blue", 2 => "Red" }
11
11
  TEN_MINUTES = 10 * 60
12
+ VALID_MENTION = /<@!?\d+>/
12
13
 
13
14
  def run
14
15
  bot = Discordrb::Commands::CommandBot.new(
@@ -40,22 +41,15 @@ class QwtfDiscordBotPug # :nodoc:
40
41
  end
41
42
 
42
43
  join_pug(e, pug)
43
- start_pug(pug, e) if pug.full?
44
+ start_pug(pug, e) if pug.has_exactly_maxplayers?
44
45
  end
45
46
  end
46
47
 
47
48
  bot.command :choose do |event, *args|
48
49
  setup_pug(event) do |e, pug|
49
- if pug.joined_players.count > pug.maxplayers
50
- return send_embedded_message(
51
- description: "Too many players, increase `!teamsize` or `!kick` extras",
52
- channel: event.channel
53
- )
54
- end
55
-
56
- if pug.joined_players.count.odd?
50
+ if !pug.full?
57
51
  return send_embedded_message(
58
- description: "Can't choose teams with odd number of players",
52
+ description: "Not enough players, reduce !teamsize",
59
53
  channel: event.channel
60
54
  )
61
55
  end
@@ -177,17 +171,17 @@ class QwtfDiscordBotPug # :nodoc:
177
171
  )
178
172
  end
179
173
 
180
- args.each do |arg|
181
- unless arg.match(/<@!\d+>/)
174
+ args.each do |mention|
175
+ unless mention.match(VALID_MENTION)
182
176
  send_embedded_message(
183
- description: "#{arg} isn't a valid mention",
177
+ description: "#{mention} isn't a valid mention",
184
178
  channel: e.channel
185
179
  )
186
180
  next
187
181
  end
188
182
 
189
- user_id = mention_to_user_id(arg)
190
- display_name = e.display_name_for(user_id) || arg
183
+ user_id = mention_to_user_id(mention)
184
+ display_name = e.display_name_for(user_id) || mention
191
185
 
192
186
  unless pug.joined?(user_id)
193
187
  send_embedded_message(
@@ -257,16 +251,16 @@ class QwtfDiscordBotPug # :nodoc:
257
251
  )
258
252
  else
259
253
  args[1..-1].each do |mention|
260
- unless mention.match(/<@!\d+>/)
254
+ unless mention.match(VALID_MENTION)
261
255
  send_embedded_message(
262
- description: "#{arg} isn't a valid mention",
256
+ description: "#{mention} isn't a valid mention",
263
257
  channel: e.channel
264
258
  )
265
259
  next
266
260
  end
267
261
 
268
262
  user_id = mention_to_user_id(mention)
269
- display_name = e.display_name_for(user_id) || arg
263
+ display_name = e.display_name_for(user_id) || mention
270
264
  pug.join_team(team_no: team_no, player_id: user_id)
271
265
 
272
266
  send_embedded_message(
@@ -279,7 +273,7 @@ class QwtfDiscordBotPug # :nodoc:
279
273
  end
280
274
  end
281
275
 
282
- start_pug(pug, e) if !pug_already_full && pug.full?
276
+ start_pug(pug, e) if !pug_already_full && pug.has_exactly_maxplayers?
283
277
  end
284
278
  end
285
279
 
@@ -302,14 +296,14 @@ class QwtfDiscordBotPug # :nodoc:
302
296
  )
303
297
  end
304
298
 
305
- if pug.team(0).include?(user_id)
299
+ if !pug.teamed_players.include?(user_id)
306
300
  return send_embedded_message(
307
301
  description: "You aren't in a team",
308
302
  channel: e.channel
309
303
  )
310
304
  end
311
305
 
312
- pug.join_team(team_no: 0, player_id: user_id)
306
+ pug.unteam(user_id)
313
307
 
314
308
  send_embedded_message(
315
309
  description: "#{e.display_name} leaves team",
@@ -317,17 +311,25 @@ class QwtfDiscordBotPug # :nodoc:
317
311
  )
318
312
  else
319
313
  args.each do |mention|
320
- unless mention.match(/<@!\d+>/)
314
+ unless mention.match(VALID_MENTION)
321
315
  send_embedded_message(
322
- description: "#{arg} isn't a valid mention",
316
+ description: "#{mention} isn't a valid mention",
323
317
  channel: e.channel
324
318
  )
325
319
  next
326
320
  end
327
321
 
328
322
  user_id = mention_to_user_id(mention)
329
- display_name = e.display_name_for(user_id) || arg
330
- pug.join_team(team_no: 0, player_id: user_id)
323
+ display_name = e.display_name_for(user_id) || mention
324
+
325
+ unless pug.joined?(user_id)
326
+ return send_embedded_message(
327
+ description: "#{display_name} isn't in this PUG",
328
+ channel: e.channel
329
+ )
330
+ end
331
+
332
+ pug.unteam(user_id)
331
333
 
332
334
  send_embedded_message(
333
335
  description: "#{display_name} leaves team",
@@ -384,14 +386,14 @@ class QwtfDiscordBotPug # :nodoc:
384
386
 
385
387
  winning_team_no = args.first.to_i
386
388
 
387
- if pug.actual_teams.count < 2
389
+ if pug.teams.count < 2
388
390
  return send_embedded_message(
389
391
  description: "There must be at least two teams with players to submit a result",
390
392
  channel: e.channel
391
393
  )
392
394
  end
393
395
 
394
- team_results = pug.actual_teams.inject({}) do |teams, (name, player_ids)|
396
+ team_results = pug.teams.inject({}) do |teams, (name, player_ids)|
395
397
  players = player_ids.inject({}) do |memo, id|
396
398
  memo.merge({ id => e.display_name_for(id) })
397
399
  end
@@ -444,7 +446,7 @@ class QwtfDiscordBotPug # :nodoc:
444
446
  )
445
447
  end
446
448
 
447
- if pug.actual_teams.count < 2
449
+ if pug.teams.count < 2
448
450
  return send_embedded_message(
449
451
  description: "There must be at least two teams with players to submit a result",
450
452
  channel: e.channel
@@ -460,7 +462,7 @@ class QwtfDiscordBotPug # :nodoc:
460
462
  )
461
463
  end
462
464
 
463
- team_results = pug.actual_teams.inject({}) do |teams, (name, player_ids)|
465
+ team_results = pug.teams.inject({}) do |teams, (name, player_ids)|
464
466
  players = player_ids.inject({}) do |memo, id|
465
467
  memo.merge({ id => e.display_name_for(id) })
466
468
  end
@@ -644,7 +646,7 @@ class QwtfDiscordBotPug # :nodoc:
644
646
  def join_pug(e, pug)
645
647
  pug.join(e.user_id)
646
648
 
647
- if pug.joined_player_count == 1
649
+ if pug.total_player_count == 1
648
650
  snippets = ["#{e.display_name} creates a PUG", "#{pug.player_slots} joined"]
649
651
  message = pug.notify_roles
650
652
  else
@@ -669,7 +671,7 @@ class QwtfDiscordBotPug # :nodoc:
669
671
  def choose_fair_teams(pug:, event:, iteration: 0)
670
672
  if !pug.full?
671
673
  return send_embedded_message(
672
- description: "Can't choose teams until PUG is full",
674
+ description: "Not enough players, reduce !teamsize",
673
675
  channel: event.channel
674
676
  ) && nil
675
677
  end
@@ -680,7 +682,7 @@ class QwtfDiscordBotPug # :nodoc:
680
682
  )
681
683
 
682
684
  combinations = get_fair_teams(
683
- channel_id: event.channel.id, players: pug.joined_players
685
+ channel_id: event.channel.id, players: pug.up_now_players
684
686
  )
685
687
 
686
688
  teams = combinations[iteration]
@@ -693,6 +695,8 @@ class QwtfDiscordBotPug # :nodoc:
693
695
  ) && nil
694
696
  end
695
697
 
698
+ pug.destroy_teams
699
+
696
700
  teams.each do |team_no, player_ids|
697
701
  player_ids.each do |player_id|
698
702
  pug.join_team(team_no: team_no, player_id: player_id)
@@ -717,6 +721,18 @@ class QwtfDiscordBotPug # :nodoc:
717
721
  text: footer
718
722
  )
719
723
 
724
+ if pug.queued_players.any?
725
+ queue_display_names = pug.queued_players.map do |player_id|
726
+ event.display_name_for(player_id)
727
+ end
728
+
729
+ embed.add_field(
730
+ inline: true,
731
+ name: "Queue",
732
+ value: queue_display_names.join("\n")
733
+ )
734
+ end
735
+
720
736
  pug.teams.each do |team_no, player_ids|
721
737
  team_display_names = player_ids.map do |player_id|
722
738
  event.display_name_for(player_id)
@@ -732,14 +748,14 @@ class QwtfDiscordBotPug # :nodoc:
732
748
  end
733
749
 
734
750
  def start_pug(pug, event)
735
- choose_fair_teams(pug: pug, event: event) unless pug.actual_teams.any?
751
+ choose_fair_teams(pug: pug, event: event) unless pug.teams.any?
736
752
 
737
753
  footer = [
738
754
  pug.game_map,
739
755
  "#{pug.player_slots} joined",
740
756
  ].compact.join(MSG_SNIPPET_DELIMITER)
741
757
 
742
- mentions = pug.joined_players.map do |player_id|
758
+ mentions = pug.players.map do |player_id|
743
759
  event.mention_for(player_id)
744
760
  end
745
761
 
@@ -753,6 +769,18 @@ class QwtfDiscordBotPug # :nodoc:
753
769
  text: footer
754
770
  )
755
771
 
772
+ if pug.queued_players.any?
773
+ queue_display_names = pug.queued_players.map do |player_id|
774
+ event.display_name_for(player_id)
775
+ end
776
+
777
+ embed.add_field(
778
+ inline: true,
779
+ name: "Queue",
780
+ value: queue_display_names.join("\n")
781
+ )
782
+ end
783
+
756
784
  pug.teams.each do |team_no, player_ids|
757
785
  team_mentions = player_ids.map do |player_id|
758
786
  event.display_name_for(player_id)
@@ -16,20 +16,17 @@ class QwtfDiscordBotServer
16
16
  message = 'Provide a server address e.g. `!server ' \
17
17
  'sydney.fortressone.org` or use `!active` or `!all`'
18
18
  event.channel.send_message(message)
19
- puts message
19
+
20
+ return puts message
21
+ end
22
+
23
+ endpoint = args.first
24
+ request = QstatRequest.new(endpoint)
25
+
26
+ if !request.live_server?
27
+ event.channel.send_message("#{endpoint} isn't responding")
20
28
  else
21
- endpoint = args.first
22
- qstat_response = QstatRequest.new(endpoint)
23
- message = qstat_response.server_summary
24
- embed = qstat_response.to_embed
25
-
26
- if embed
27
- event.channel.send_embed(message, embed)
28
- puts message
29
- else
30
- event.channel.send_message(message)
31
- puts message
32
- end
29
+ event.channel.send_embed(nil, request.to_full_embed)
33
30
  end
34
31
  end
35
32
 
@@ -43,20 +40,16 @@ class QwtfDiscordBotServer
43
40
  if endpoints_for_this_channel.empty?
44
41
  message = 'There are no servers associated with this channel'
45
42
  event.channel.send_message(message)
46
- puts message
47
- else
48
- endpoints_for_this_channel.each do |endpoint|
49
- qstat_request = QstatRequest.new(endpoint.address)
50
- message = qstat_request.server_summary
51
- embed = qstat_request.to_embed
52
-
53
- if embed
54
- event.channel.send_embed(message, embed)
55
- puts message
56
- else
57
- event.channel.send_message(message)
58
- puts message
59
- end
43
+ return puts message
44
+ end
45
+
46
+ endpoints_for_this_channel.each do |endpoint|
47
+ request = QstatRequest.new(endpoint.address)
48
+
49
+ if !request.live_server?
50
+ event.channel.send_message("#{endpoint} isn't responding")
51
+ else
52
+ event.channel.send_embed(nil, request.to_full_embed)
60
53
  end
61
54
  end
62
55
 
@@ -73,35 +66,27 @@ class QwtfDiscordBotServer
73
66
  if endpoints_for_this_channel.empty?
74
67
  message = 'There are no servers associated with this channel'
75
68
  event.channel.send_message(message)
76
- puts message
77
- else
78
- qstat_requests = endpoints_for_this_channel.map do |endpoint|
79
- QstatRequest.new(endpoint.address)
80
- end
69
+ return puts message
70
+ end
81
71
 
82
- servers_with_players = qstat_requests.reject do |server|
83
- server.is_empty?
84
- end
72
+ qstat_requests = endpoints_for_this_channel.map do |endpoint|
73
+ QstatRequest.new(endpoint.address)
74
+ end
85
75
 
86
- if servers_with_players.empty?
87
- message = "All ##{event.channel.name} servers are empty"
88
- event.channel.send_message(message)
89
- puts message
90
- else
91
- servers_with_players.each do |server|
92
- message = server.server_summary
93
- embed = server.to_embed
94
-
95
- if embed
96
- event.channel.send_embed(message, embed)
97
- puts message
98
- else
99
- event.channel.send_message(message)
100
- puts message
101
- end
102
- end
103
- end
76
+ servers_with_players = qstat_requests.reject do |server|
77
+ server.is_empty?
104
78
  end
79
+
80
+ if servers_with_players.empty?
81
+ message = "All ##{event.channel.name} servers are empty"
82
+ event.channel.send_message(message)
83
+ return puts message
84
+ end
85
+
86
+ servers_with_players.each do |server|
87
+ event.channel.send_embed(nil, server.to_full_embed)
88
+ end
89
+
105
90
  return nil
106
91
  end
107
92
 
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.0.4
4
+ version: 6.1.4
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-07 00:00:00.000000000 Z
11
+ date: 2021-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: discordrb