qwtf_discord_bot 5.1.11 → 5.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +3 -0
- data/VERSION +1 -1
- data/bin/bundle +24 -20
- data/bin/coderay +7 -7
- data/bin/console +0 -0
- data/bin/htmldiff +7 -7
- data/bin/ldiff +7 -7
- data/bin/pry +7 -7
- data/bin/qwtf_discord_bot +7 -7
- data/bin/restclient +7 -7
- data/bin/rspec +7 -7
- data/bin/thor +7 -7
- data/lib/endpoint.rb +1 -1
- data/lib/event_decorator.rb +9 -8
- data/lib/player.rb +2 -1
- data/lib/pug.rb +63 -27
- data/lib/qstat_request.rb +51 -49
- data/lib/qwtf_discord_bot.rb +1 -0
- data/lib/qwtf_discord_bot/config.rb +4 -4
- data/lib/qwtf_discord_bot/qwtf_discord_bot_pug.rb +133 -29
- data/lib/qwtf_discord_bot/qwtf_discord_bot_server.rb +0 -1
- data/lib/qwtf_discord_bot/qwtf_discord_bot_watcher.rb +1 -1
- data/lib/qwtf_discord_bot/version.rb +1 -1
- data/lib/team.rb +27 -24
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27e4374d157a5f3cad0f5c1cc58ffb1e9fc0b9f6ca9b89391509635260bc460a
|
4
|
+
data.tar.gz: 2775f0952e46afb2af7dbff0a72b388e34f343ed896b3d909ca0b9d069f76ab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cf2acfe24299674b69051e0d28ce628cea334840910b5bbd083d73e10d91cdf2d7c96312371ffed448424b769abb86c77a63de05b4a23136d05e92398bf2ff1
|
7
|
+
data.tar.gz: 1a5830ef4f29e3c331d5534a84837e8d3e29bccf016e478e439aa8727836fe957d20f4865265264aa69116110f9e7ba7cf322869f6738aff5ef365f4d860137d
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
5.
|
1
|
+
5.2.5
|
data/bin/bundle
CHANGED
@@ -8,46 +8,46 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
11
|
+
require 'rubygems'
|
12
12
|
|
13
13
|
m = Module.new do
|
14
|
-
|
14
|
+
module_function
|
15
15
|
|
16
16
|
def invoked_as_script?
|
17
17
|
File.expand_path($0) == File.expand_path(__FILE__)
|
18
18
|
end
|
19
19
|
|
20
20
|
def env_var_version
|
21
|
-
ENV[
|
21
|
+
ENV['BUNDLER_VERSION']
|
22
22
|
end
|
23
23
|
|
24
24
|
def cli_arg_version
|
25
25
|
return unless invoked_as_script? # don't want to hijack other binstubs
|
26
|
-
return unless
|
26
|
+
return unless 'update'.start_with?(ARGV.first || ' ') # must be running `bundle update`
|
27
|
+
|
27
28
|
bundler_version = nil
|
28
29
|
update_index = nil
|
29
30
|
ARGV.each_with_index do |a, i|
|
30
|
-
if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
|
31
|
-
bundler_version = a
|
32
|
-
end
|
31
|
+
bundler_version = a if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
|
33
32
|
next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
|
34
|
-
|
33
|
+
|
34
|
+
bundler_version = Regexp.last_match(1) || '>= 0.a'
|
35
35
|
update_index = i
|
36
36
|
end
|
37
37
|
bundler_version
|
38
38
|
end
|
39
39
|
|
40
40
|
def gemfile
|
41
|
-
gemfile = ENV[
|
41
|
+
gemfile = ENV['BUNDLE_GEMFILE']
|
42
42
|
return gemfile if gemfile && !gemfile.empty?
|
43
43
|
|
44
|
-
File.expand_path(
|
44
|
+
File.expand_path('../Gemfile', __dir__)
|
45
45
|
end
|
46
46
|
|
47
47
|
def lockfile
|
48
48
|
lockfile =
|
49
49
|
case File.basename(gemfile)
|
50
|
-
when
|
50
|
+
when 'gems.rb' then gemfile.sub(/\.rb$/, gemfile)
|
51
51
|
else "#{gemfile}.lock"
|
52
52
|
end
|
53
53
|
File.expand_path(lockfile)
|
@@ -55,8 +55,10 @@ m = Module.new do
|
|
55
55
|
|
56
56
|
def lockfile_version
|
57
57
|
return unless File.file?(lockfile)
|
58
|
+
|
58
59
|
lockfile_contents = File.read(lockfile)
|
59
60
|
return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
|
61
|
+
|
60
62
|
Regexp.last_match(1)
|
61
63
|
end
|
62
64
|
|
@@ -68,24 +70,28 @@ m = Module.new do
|
|
68
70
|
end
|
69
71
|
|
70
72
|
def load_bundler!
|
71
|
-
ENV[
|
73
|
+
ENV['BUNDLE_GEMFILE'] ||= gemfile
|
72
74
|
|
73
75
|
# must dup string for RG < 1.8 compatibility
|
74
76
|
activate_bundler(bundler_version.dup)
|
75
77
|
end
|
76
78
|
|
77
79
|
def activate_bundler(bundler_version)
|
78
|
-
if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new(
|
79
|
-
bundler_version =
|
80
|
+
if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new('2.0')
|
81
|
+
bundler_version = '< 2'
|
80
82
|
end
|
81
83
|
gem_error = activation_error_handling do
|
82
|
-
gem
|
84
|
+
gem 'bundler', bundler_version
|
83
85
|
end
|
84
86
|
return if gem_error.nil?
|
87
|
+
|
85
88
|
require_error = activation_error_handling do
|
86
|
-
require
|
89
|
+
require 'bundler/version'
|
90
|
+
end
|
91
|
+
if require_error.nil? && Gem::Requirement.new(bundler_version).satisfied_by?(Gem::Version.new(Bundler::VERSION))
|
92
|
+
return
|
87
93
|
end
|
88
|
-
|
94
|
+
|
89
95
|
warn "Activating bundler (#{bundler_version}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_version}'`"
|
90
96
|
exit 42
|
91
97
|
end
|
@@ -100,6 +106,4 @@ end
|
|
100
106
|
|
101
107
|
m.load_bundler!
|
102
108
|
|
103
|
-
if m.invoked_as_script?
|
104
|
-
load Gem.bin_path("bundler", "bundle")
|
105
|
-
end
|
109
|
+
load Gem.bin_path('bundler', 'bundle') if m.invoked_as_script?
|
data/bin/coderay
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('coderay', 'coderay')
|
data/bin/console
CHANGED
File without changes
|
data/bin/htmldiff
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('diff-lcs', 'htmldiff')
|
data/bin/ldiff
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('diff-lcs', 'ldiff')
|
data/bin/pry
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('pry', 'pry')
|
data/bin/qwtf_discord_bot
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('qwtf_discord_bot', 'qwtf_discord_bot')
|
data/bin/restclient
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('rest-client', 'restclient')
|
data/bin/rspec
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
data/bin/thor
CHANGED
@@ -8,11 +8,11 @@
|
|
8
8
|
# this file is here to facilitate running it.
|
9
9
|
#
|
10
10
|
|
11
|
-
require
|
12
|
-
ENV[
|
13
|
-
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
|
-
bundle_binstub = File.expand_path(
|
15
|
+
bundle_binstub = File.expand_path('bundle', __dir__)
|
16
16
|
|
17
17
|
if File.file?(bundle_binstub)
|
18
18
|
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
@@ -23,7 +23,7 @@ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
require
|
27
|
-
require
|
26
|
+
require 'rubygems'
|
27
|
+
require 'bundler/setup'
|
28
28
|
|
29
|
-
load Gem.bin_path(
|
29
|
+
load Gem.bin_path('thor', 'thor')
|
data/lib/endpoint.rb
CHANGED
data/lib/event_decorator.rb
CHANGED
@@ -23,18 +23,20 @@ class EventDecorator
|
|
23
23
|
server.users
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
28
|
-
user&.mention
|
29
|
-
end
|
26
|
+
def mention_for(user_id)
|
27
|
+
find_user(user_id)&.mention
|
30
28
|
end
|
31
29
|
|
32
|
-
def
|
33
|
-
find_users(user_ids).map(&:
|
30
|
+
def mentions_for(user_ids)
|
31
|
+
find_users(user_ids).map(&:mention)
|
34
32
|
end
|
35
33
|
|
36
34
|
def display_name_for(user_id)
|
37
|
-
find_user(user_id)
|
35
|
+
find_user(user_id)&.display_name
|
36
|
+
end
|
37
|
+
|
38
|
+
def display_names_for(user_ids)
|
39
|
+
find_users(user_ids).map(&:display_name)
|
38
40
|
end
|
39
41
|
|
40
42
|
private
|
@@ -57,4 +59,3 @@ class EventDecorator
|
|
57
59
|
@event.user
|
58
60
|
end
|
59
61
|
end
|
60
|
-
|
data/lib/player.rb
CHANGED
data/lib/pug.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Pug
|
2
|
-
|
3
|
-
|
2
|
+
DEFAULT_TEAMSIZE = 4
|
3
|
+
MIN_NO_OF_TEAMS = 2
|
4
4
|
|
5
5
|
def self.for(channel_id)
|
6
6
|
new(channel_id)
|
@@ -10,18 +10,25 @@ class Pug
|
|
10
10
|
@channel_id = channel_id
|
11
11
|
end
|
12
12
|
|
13
|
-
def join(
|
13
|
+
def join(player_id)
|
14
14
|
redis.setnx(pug_key, Time.now)
|
15
|
-
|
15
|
+
|
16
|
+
redis.sadd(team_key(0), player_id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def join_team(team_no:, player_id:)
|
20
|
+
leave_teams(player_id)
|
21
|
+
redis.sadd(team_key(team_no), player_id)
|
16
22
|
end
|
17
23
|
|
18
24
|
def joined_players
|
19
|
-
|
25
|
+
teams_keys.inject([]) do |players, team|
|
26
|
+
players + redis.smembers(team).map(&:to_i)
|
27
|
+
end
|
20
28
|
end
|
21
29
|
|
22
|
-
def team(
|
23
|
-
|
24
|
-
joined_players.each_slice(teamsize).to_a[index]
|
30
|
+
def team(number)
|
31
|
+
redis.smembers(team_key(number)).map(&:to_i)
|
25
32
|
end
|
26
33
|
|
27
34
|
def teamsize=(teamsize)
|
@@ -33,7 +40,11 @@ class Pug
|
|
33
40
|
end
|
34
41
|
|
35
42
|
def joined_player_count
|
36
|
-
|
43
|
+
joined_players.count
|
44
|
+
end
|
45
|
+
|
46
|
+
def team_player_count(team_no)
|
47
|
+
redis.scard(team_key(team_no)).to_i
|
37
48
|
end
|
38
49
|
|
39
50
|
def player_slots
|
@@ -49,15 +60,11 @@ class Pug
|
|
49
60
|
end
|
50
61
|
|
51
62
|
def notify_roles
|
52
|
-
redis.get(notify_roles_key) ||
|
53
|
-
end
|
54
|
-
|
55
|
-
def teamsize=(teamsize)
|
56
|
-
redis.set(teamsize_key, teamsize)
|
63
|
+
redis.get(notify_roles_key) || '@here'
|
57
64
|
end
|
58
65
|
|
59
66
|
def teamsize
|
60
|
-
(redis.get(teamsize_key) ||
|
67
|
+
(redis.get(teamsize_key) || DEFAULT_TEAMSIZE).to_i
|
61
68
|
end
|
62
69
|
|
63
70
|
def active?
|
@@ -65,13 +72,14 @@ class Pug
|
|
65
72
|
end
|
66
73
|
|
67
74
|
def leave(player_id)
|
68
|
-
|
75
|
+
leave_teams(player_id)
|
69
76
|
end_pug if empty?
|
70
77
|
end
|
71
78
|
|
72
79
|
def end_pug
|
73
|
-
redis.
|
74
|
-
|
80
|
+
redis.keys([pug_key, "*"].join).each do |key|
|
81
|
+
redis.del(key)
|
82
|
+
end
|
75
83
|
end
|
76
84
|
|
77
85
|
def joined?(player_id)
|
@@ -79,36 +87,64 @@ class Pug
|
|
79
87
|
end
|
80
88
|
|
81
89
|
def maxplayers
|
82
|
-
teamsize *
|
90
|
+
teamsize * no_of_teams
|
91
|
+
end
|
92
|
+
|
93
|
+
def won_by(team_no)
|
94
|
+
{ teams: teams, winner: team_no }
|
95
|
+
end
|
96
|
+
|
97
|
+
def teams
|
98
|
+
teams_keys.inject({}) do |teams, team|
|
99
|
+
teams.merge({ team.split(':').last => redis.smembers(team).map(&:to_i) })
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def actual_teams
|
104
|
+
teams.tap { |team| team.delete("0") }
|
83
105
|
end
|
84
106
|
|
85
107
|
private
|
86
108
|
|
109
|
+
def leave_teams(player_id)
|
110
|
+
teams_keys.each do |team|
|
111
|
+
redis.srem(team, player_id)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def teams_keys
|
116
|
+
redis.keys([pug_key, 'teams:*'].join(':'))
|
117
|
+
end
|
118
|
+
|
87
119
|
def empty?
|
88
120
|
joined_player_count.zero?
|
89
121
|
end
|
90
122
|
|
91
|
-
def
|
92
|
-
[pug_key,
|
123
|
+
def team_key(team_no)
|
124
|
+
[pug_key, 'teams', team_no].join(':')
|
93
125
|
end
|
94
126
|
|
95
|
-
def
|
96
|
-
[
|
127
|
+
def pug_key
|
128
|
+
[channel_key, 'pug'].join(':')
|
97
129
|
end
|
98
130
|
|
99
|
-
def
|
100
|
-
[
|
131
|
+
def channel_key
|
132
|
+
['channel', @channel_id].join(':')
|
101
133
|
end
|
102
134
|
|
103
135
|
def notify_roles_key
|
104
|
-
[
|
136
|
+
[channel_key, 'role'].join(':')
|
105
137
|
end
|
106
138
|
|
107
139
|
def teamsize_key
|
108
|
-
[pug_key,
|
140
|
+
[pug_key, 'teamsize'].join(':')
|
109
141
|
end
|
110
142
|
|
111
143
|
def redis
|
112
144
|
Redis.current
|
113
145
|
end
|
146
|
+
|
147
|
+
def no_of_teams
|
148
|
+
[actual_teams.count, MIN_NO_OF_TEAMS].max
|
149
|
+
end
|
114
150
|
end
|
data/lib/qstat_request.rb
CHANGED
@@ -23,12 +23,14 @@ class QstatRequest
|
|
23
23
|
|
24
24
|
def to_message
|
25
25
|
return server_summary if is_empty?
|
26
|
+
|
26
27
|
[server_summary, player_table].join("\n")
|
27
28
|
end
|
28
29
|
|
29
30
|
def server_summary
|
30
31
|
return "#{@endpoint} isn't responding" unless game_map
|
31
32
|
return "#{name} | #{@endpoint} | #{game_map} | #{numplayers}/#{maxplayers}" unless has_spectators?
|
33
|
+
|
32
34
|
"#{name} | #{@endpoint} | #{game_map} | #{numplayers}/#{maxplayers} players | #{numspectators}/#{maxspectators} spectators"
|
33
35
|
end
|
34
36
|
|
@@ -46,70 +48,70 @@ class QstatRequest
|
|
46
48
|
|
47
49
|
private
|
48
50
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
def teams
|
54
|
-
@teams ||= build_roster
|
55
|
-
end
|
51
|
+
def has_spectators?
|
52
|
+
numspectators && numspectators > 0
|
53
|
+
end
|
56
54
|
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
def teams
|
56
|
+
@teams ||= build_roster
|
57
|
+
end
|
60
58
|
|
61
|
-
|
62
|
-
|
63
|
-
|
59
|
+
def data
|
60
|
+
@data ||= JSON.parse(result).first
|
61
|
+
end
|
64
62
|
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
def execute
|
64
|
+
`qstat -json -P -qws #{@endpoint}`
|
65
|
+
end
|
68
66
|
|
69
|
-
|
70
|
-
|
71
|
-
|
67
|
+
def player_table
|
68
|
+
players.sort_by { |player| player.team.number }.map(&:to_row).join("\n")
|
69
|
+
end
|
72
70
|
|
73
|
-
|
74
|
-
|
75
|
-
|
71
|
+
def name
|
72
|
+
data['name']
|
73
|
+
end
|
76
74
|
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
def address
|
76
|
+
data['address']
|
77
|
+
end
|
80
78
|
|
81
|
-
|
82
|
-
|
83
|
-
|
79
|
+
def game_map
|
80
|
+
data['map']
|
81
|
+
end
|
84
82
|
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
def numplayers
|
84
|
+
data['numplayers']
|
85
|
+
end
|
88
86
|
|
89
|
-
|
90
|
-
|
91
|
-
|
87
|
+
def maxplayers
|
88
|
+
data['maxplayers']
|
89
|
+
end
|
92
90
|
|
93
|
-
|
94
|
-
|
95
|
-
|
91
|
+
def numspectators
|
92
|
+
data['numspectators']
|
93
|
+
end
|
96
94
|
|
97
|
-
|
98
|
-
|
95
|
+
def maxspectators
|
96
|
+
data['maxspectators']
|
97
|
+
end
|
99
98
|
|
100
|
-
|
99
|
+
def build_roster
|
100
|
+
return nil if is_empty?
|
101
101
|
|
102
|
-
|
103
|
-
player = Player.new(player_data)
|
104
|
-
roster.enroll(player)
|
105
|
-
end
|
102
|
+
roster = Roster.new
|
106
103
|
|
107
|
-
|
104
|
+
data['players'].map do |player_data|
|
105
|
+
player = Player.new(player_data)
|
106
|
+
roster.enroll(player)
|
108
107
|
end
|
109
108
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
109
|
+
roster.teams.sort_by { |team| team.number }
|
110
|
+
end
|
111
|
+
|
112
|
+
def players
|
113
|
+
data['players'].map do |player_data|
|
114
|
+
Player.new(player_data)
|
114
115
|
end
|
116
|
+
end
|
115
117
|
end
|
data/lib/qwtf_discord_bot.rb
CHANGED
@@ -21,6 +21,7 @@ module QwtfDiscordBot # :nodoc:
|
|
21
21
|
def self.config_file
|
22
22
|
return ENV['QWTF_DISCORD_BOT_CONFIG_FILE'] if ENV['QWTF_DISCORD_BOT_CONFIG_FILE']
|
23
23
|
return "#{Dir.pwd}/config.yaml" if FileTest.exist?("#{Dir.pwd}/config.yaml")
|
24
|
+
|
24
25
|
"#{Dir.home}/.config/qwtf_discord_bot/config.yaml"
|
25
26
|
end
|
26
27
|
|
@@ -6,20 +6,20 @@ class Config
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def token
|
9
|
-
@token ||= @config[
|
9
|
+
@token ||= @config['token']
|
10
10
|
end
|
11
11
|
|
12
12
|
def client_id
|
13
|
-
@client_id ||= @config[
|
13
|
+
@client_id ||= @config['client_id']
|
14
14
|
end
|
15
15
|
|
16
16
|
def endpoints
|
17
|
-
@endpoints ||= @config[
|
17
|
+
@endpoints ||= @config['endpoints'].map do |endpoint|
|
18
18
|
Endpoint.new(endpoint)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def emojis
|
23
|
-
@emojis ||= @config[
|
23
|
+
@emojis ||= @config['emojis']
|
24
24
|
end
|
25
25
|
end
|
@@ -6,6 +6,8 @@ require 'event_decorator'
|
|
6
6
|
class QwtfDiscordBotPug # :nodoc:
|
7
7
|
include QwtfDiscordBot
|
8
8
|
|
9
|
+
MSG_SNIPPET_DELIMITER = ' · '
|
10
|
+
|
9
11
|
def run
|
10
12
|
bot = Discordrb::Commands::CommandBot.new(
|
11
13
|
token: QwtfDiscordBot.config.token,
|
@@ -18,52 +20,48 @@ class QwtfDiscordBotPug # :nodoc:
|
|
18
20
|
setup_pug(event) do |e, pug|
|
19
21
|
return send_msg("You've already joined", e.channel) if pug.joined?(e.user_id)
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
if pug.joined_player_count == 1
|
24
|
-
snippets = ["#{e.display_name} creates a PUG", pug.player_slots, pug.notify_roles]
|
25
|
-
else
|
26
|
-
snippets = ["#{e.display_name} joins the PUG", pug.player_slots]
|
27
|
-
snippets << "#{pug.slots_left} more #{pug.notify_roles}" if pug.slots_left.between?(1, 3)
|
28
|
-
end
|
29
|
-
|
30
|
-
send_msg(snippets.join(' | '), e.channel)
|
31
|
-
|
23
|
+
join_pug(e, pug)
|
32
24
|
start_pug(pug, e) if pug.full?
|
33
25
|
end
|
34
26
|
end
|
35
27
|
|
36
28
|
bot.command :status do |event, *args|
|
37
29
|
setup_pug(event) do |e, pug|
|
38
|
-
|
39
|
-
[
|
40
|
-
"#{e.display_names_for(pug.joined_players).join(', ')} joined",
|
41
|
-
pug.player_slots
|
42
|
-
].join(' | ')
|
43
|
-
else
|
44
|
-
'No PUG has been started. `!join` to create'
|
45
|
-
end
|
30
|
+
return send_msg('No PUG has been started. `!join` to create', e.channel) unless pug.active?
|
46
31
|
|
47
|
-
send_msg(
|
32
|
+
send_msg(
|
33
|
+
[
|
34
|
+
"#{pug.player_slots} joined",
|
35
|
+
pug_teams_message(pug, e).join("\n")
|
36
|
+
].join("\n"),
|
37
|
+
e.channel
|
38
|
+
)
|
48
39
|
end
|
49
40
|
end
|
50
41
|
|
51
42
|
bot.command :teamsize do |event, *args|
|
52
43
|
setup_pug(event) do |e, pug|
|
53
|
-
new_teamsize = args[0]
|
44
|
+
new_teamsize = args[0].to_i
|
45
|
+
return send_msg('Team size should be a number higher than 0', e.channel) unless new_teamsize > 0
|
54
46
|
|
55
47
|
if new_teamsize
|
56
48
|
pug.teamsize = new_teamsize
|
57
49
|
|
58
50
|
send_msg(
|
59
|
-
|
51
|
+
[
|
52
|
+
"Team size set to #{pug.teamsize}",
|
53
|
+
"#{pug.player_slots} joined"
|
54
|
+
].join(MSG_SNIPPET_DELIMITER),
|
60
55
|
e.channel
|
61
56
|
)
|
62
57
|
|
63
58
|
start_pug(pug, e) if pug.full?
|
64
59
|
else
|
65
60
|
send_msg(
|
66
|
-
|
61
|
+
[
|
62
|
+
"Current team size is #{pug.teamsize}",
|
63
|
+
"#{pug.player_slots} joined"
|
64
|
+
].join(MSG_SNIPPET_DELIMITER),
|
67
65
|
e.channel
|
68
66
|
)
|
69
67
|
end
|
@@ -85,7 +83,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
85
83
|
snippets << "#{pug.slots_left} more #{pug.notify_roles}" if pug.slots_left == 1
|
86
84
|
|
87
85
|
send_msg(
|
88
|
-
snippets.join(
|
86
|
+
snippets.join(MSG_SNIPPET_DELIMITER),
|
89
87
|
e.channel
|
90
88
|
)
|
91
89
|
|
@@ -121,7 +119,7 @@ class QwtfDiscordBotPug # :nodoc:
|
|
121
119
|
snippets << "#{pug.slots_left} more #{pug.notify_roles}" if pug.slots_left == 1
|
122
120
|
|
123
121
|
send_msg(
|
124
|
-
snippets.join(
|
122
|
+
snippets.join(MSG_SNIPPET_DELIMITER),
|
125
123
|
e.channel
|
126
124
|
)
|
127
125
|
|
@@ -130,6 +128,67 @@ class QwtfDiscordBotPug # :nodoc:
|
|
130
128
|
end
|
131
129
|
end
|
132
130
|
|
131
|
+
bot.command :team do |event, *args|
|
132
|
+
setup_pug(event) do |e, pug|
|
133
|
+
team_no = args[0].to_i
|
134
|
+
return send_msg("Choose a team between 1 and 4", e.channel) unless team_no.between?(1, 4)
|
135
|
+
|
136
|
+
user_id = e.user_id
|
137
|
+
return send_msg("You're already in team #{team_no}", e.channel) if pug.team(team_no).include?(user_id)
|
138
|
+
|
139
|
+
join_pug(e, pug) unless pug.joined?(user_id)
|
140
|
+
pug.join_team(team_no: team_no, player_id: user_id)
|
141
|
+
|
142
|
+
send_msg(
|
143
|
+
[
|
144
|
+
"#{e.display_name} joins team #{team_no}",
|
145
|
+
"#{pug.team_player_count(team_no)}/#{pug.teamsize}"
|
146
|
+
].join(MSG_SNIPPET_DELIMITER), e.channel
|
147
|
+
)
|
148
|
+
|
149
|
+
start_pug(pug, e) if pug.full?
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
bot.command :unteam do |event, *args|
|
154
|
+
setup_pug(event) do |e, pug|
|
155
|
+
user_id = e.user_id
|
156
|
+
return send_msg('No PUG has been started. `!join` to create', e.channel) unless pug.active?
|
157
|
+
return send_msg("You aren't in this PUG", e.channel) unless pug.joined?(user_id)
|
158
|
+
return send_msg("You aren't in a team", e.channel) if pug.team(0).include?(user_id)
|
159
|
+
|
160
|
+
pug.join_team(team_no: 0, player_id: user_id)
|
161
|
+
send_msg("#{e.display_name} has no team", e.channel)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
bot.command :win do |event, *args|
|
166
|
+
setup_pug(event) do |e, pug|
|
167
|
+
return send_msg(no_active_pug_message, e.channel) unless pug.active?
|
168
|
+
|
169
|
+
winning_team_no = args[0]
|
170
|
+
|
171
|
+
return send_msg("Not a valid team", e.channel) unless pug.team(winning_team_no).any?
|
172
|
+
|
173
|
+
pug.won_by(winning_team_no)
|
174
|
+
|
175
|
+
winning_team = pug.team(winning_team_no).map do |player_id|
|
176
|
+
e.display_name_for(player_id)
|
177
|
+
end
|
178
|
+
|
179
|
+
non_winning_teams = pug.actual_teams.tap { |team| team.delete(winning_team_no) }
|
180
|
+
|
181
|
+
losing_players = non_winning_teams.values.flatten.map do |player_id|
|
182
|
+
e.display_name_for(player_id)
|
183
|
+
end
|
184
|
+
|
185
|
+
send_msg(
|
186
|
+
"#{winning_team.join(', ')} defeat #{losing_players.join(', ')}",
|
187
|
+
e.channel
|
188
|
+
)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
133
192
|
bot.command :end do |event, *args|
|
134
193
|
setup_pug(event) do |e, pug|
|
135
194
|
return send_msg(no_active_pug_message, e.channel) unless pug.active?
|
@@ -160,6 +219,19 @@ class QwtfDiscordBotPug # :nodoc:
|
|
160
219
|
|
161
220
|
private
|
162
221
|
|
222
|
+
def join_pug(e, pug)
|
223
|
+
pug.join(e.user_id)
|
224
|
+
|
225
|
+
if pug.joined_player_count == 1
|
226
|
+
snippets = ["#{e.display_name} creates a PUG", pug.player_slots, pug.notify_roles]
|
227
|
+
else
|
228
|
+
snippets = ["#{e.display_name} joins the PUG", pug.player_slots]
|
229
|
+
snippets << "#{pug.slots_left} more #{pug.notify_roles}" if pug.slots_left.between?(1, 3)
|
230
|
+
end
|
231
|
+
|
232
|
+
send_msg(snippets.join(MSG_SNIPPET_DELIMITER), e.channel)
|
233
|
+
end
|
234
|
+
|
163
235
|
def setup_pug(event)
|
164
236
|
e = EventDecorator.new(event)
|
165
237
|
pug = Pug.for(e.channel_id)
|
@@ -168,17 +240,49 @@ class QwtfDiscordBotPug # :nodoc:
|
|
168
240
|
end
|
169
241
|
|
170
242
|
def start_pug(pug, event)
|
243
|
+
pug_teams = pug.teams.map do |team_no, player_ids|
|
244
|
+
team_mentions = player_ids.map do |player_id|
|
245
|
+
event.mention_for(player_id)
|
246
|
+
end
|
247
|
+
|
248
|
+
team_status_line(
|
249
|
+
team_no: team_no.to_i,
|
250
|
+
names: team_mentions,
|
251
|
+
teamsize: pug.teamsize
|
252
|
+
)
|
253
|
+
end
|
254
|
+
|
171
255
|
msg = [
|
172
256
|
'Time to play!',
|
173
|
-
|
174
|
-
['Team 2:', event.mentions_for(pug.team(2)).join(' ')].join(' ')
|
257
|
+
pug_teams
|
175
258
|
].join("\n")
|
176
259
|
|
177
260
|
send_msg(msg, event.channel)
|
178
261
|
end
|
179
262
|
|
180
|
-
def
|
181
|
-
|
263
|
+
def pug_teams_message(pug, event)
|
264
|
+
pug.teams.map do |team_no, player_ids|
|
265
|
+
team_display_names = player_ids.map do |player_id|
|
266
|
+
event.display_name_for(player_id)
|
267
|
+
end
|
268
|
+
|
269
|
+
team_status_line(
|
270
|
+
team_no: team_no.to_i,
|
271
|
+
names: team_display_names,
|
272
|
+
teamsize: pug.teamsize
|
273
|
+
)
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def team_status_line(team_no:, names:, teamsize:)
|
278
|
+
if team_no.to_i.zero?
|
279
|
+
["No team: #{names.join(', ')}"]
|
280
|
+
else
|
281
|
+
[
|
282
|
+
"Team #{team_no}: #{names.join(', ')}",
|
283
|
+
"#{names.count}/#{teamsize}"
|
284
|
+
].join(MSG_SNIPPET_DELIMITER)
|
285
|
+
end
|
182
286
|
end
|
183
287
|
|
184
288
|
def end_pug_message
|
@@ -12,7 +12,7 @@ class QwtfDiscordBotWatcher
|
|
12
12
|
next if request.is_empty?
|
13
13
|
|
14
14
|
request.player_names.each do |name|
|
15
|
-
redis_key = [
|
15
|
+
redis_key = ['watcher', address, name].join(':')
|
16
16
|
|
17
17
|
unless seen_recently?(redis_key)
|
18
18
|
endpoint.channel_ids.each do |channel_id|
|
data/lib/team.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Team
|
2
2
|
attr_accessor :name, :number, :players
|
3
3
|
|
4
|
-
TEAMS = {
|
4
|
+
TEAMS = { 'blue' => 1, 'red' => 2, 'yell' => 3, 'gren' => 4, 'spec' => 5 }.freeze
|
5
5
|
|
6
6
|
def initialize(name)
|
7
7
|
@name = build_name(name)
|
@@ -19,27 +19,30 @@ class Team
|
|
19
19
|
|
20
20
|
private
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
22
|
+
def field_name
|
23
|
+
name = @name.capitalize
|
24
|
+
return name.to_s unless playing?
|
25
|
+
|
26
|
+
"#{name} | #{score}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def playing?
|
30
|
+
(1..4).include?(@number)
|
31
|
+
end
|
32
|
+
|
33
|
+
def player_list
|
34
|
+
players.map(&:to_row).join("\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
def score
|
38
|
+
return nil if @name == 'spec'
|
39
|
+
|
40
|
+
@players.first.score
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_name(name)
|
44
|
+
return name if TEAMS[name]
|
45
|
+
|
46
|
+
'spec'
|
47
|
+
end
|
45
48
|
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: 5.
|
4
|
+
version: 5.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sheldon Johnson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: discordrb
|