qwtf_discord_bot 1.0.3 → 1.0.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: 450ebc5efc6d206adea7b7a83ab80289d97f8203354d4b111e4f6a14d7733f0f
4
- data.tar.gz: f9e87f001470d11febd7659b94fcd7495cbbeb65a732a601d3e64e67e82eec71
3
+ metadata.gz: 1ebda1cd0b14e12fbf359e452f7f7874c97be6c8014d68a43d482ca4b347767b
4
+ data.tar.gz: f1e04bcd5653703d38d455f5d919902e70334d07c04542c2377ea9d06fe542ce
5
5
  SHA512:
6
- metadata.gz: '049cb1d8ede2cfb8c5f4c1a60fd6c1c92ed3030ba7d19b3db3f2111245f3ac46f3eee44d81812d102001be7d160c6478f2671c3eb5190b3157ccd827f7c3c3c4'
7
- data.tar.gz: a7b57a2843ade62a37be4cf9da723a99a5b08a72e141f8b6984348d49ae062bf1c5fcbb2fdc125ab0a8c8a0fec4408dc75353b27dc89fc1a37300bd31ca15795
6
+ metadata.gz: 95b5c0f1cbe59d2c8f5827d35c16271a8c2ab6f0ea545e7b580d8654df59a05ccea0c23a049b394015044ec93a24d375d3ff60ba0d2a776ccd721db122f354ac
7
+ data.tar.gz: c058065bb6e627164fdb7ddd3885e3d9a9301978d7ce578e9fe9084eb6732e424a85d4d8e6c7150518e1d554517f3171a8a43b900bc78bc3f9ecda761ba3b9ee
data/.gitignore CHANGED
@@ -13,3 +13,4 @@ assets/
13
13
  .env*
14
14
  qstat
15
15
  *.gem
16
+ *.swp
data/Gemfile CHANGED
@@ -12,4 +12,5 @@ end
12
12
 
13
13
  group :test do
14
14
  gem 'rspec'
15
+ gem 'factory_bot'
15
16
  end
data/Gemfile.lock CHANGED
@@ -1,12 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qwtf_discord_bot (1.0.3)
4
+ qwtf_discord_bot (1.0.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ activesupport (5.2.1)
10
+ concurrent-ruby (~> 1.0, >= 1.0.2)
11
+ i18n (>= 0.7, < 2)
12
+ minitest (~> 5.1)
13
+ tzinfo (~> 1.1)
9
14
  coderay (1.1.2)
15
+ concurrent-ruby (1.0.5)
10
16
  diff-lcs (1.3)
11
17
  discordrb (3.2.1)
12
18
  discordrb-webhooks (~> 3.2.0.1)
@@ -19,13 +25,18 @@ GEM
19
25
  domain_name (0.5.20180417)
20
26
  unf (>= 0.0.5, < 1.0.0)
21
27
  event_emitter (0.2.6)
28
+ factory_bot (4.11.0)
29
+ activesupport (>= 3.0.0)
22
30
  ffi (1.9.25)
23
31
  http-cookie (1.0.3)
24
32
  domain_name (~> 0.5)
33
+ i18n (1.1.0)
34
+ concurrent-ruby (~> 1.0)
25
35
  method_source (0.9.0)
26
36
  mime-types (3.2.2)
27
37
  mime-types-data (~> 3.2015)
28
38
  mime-types-data (3.2018.0812)
39
+ minitest (5.11.3)
29
40
  netrc (0.11.0)
30
41
  opus-ruby (1.0.1)
31
42
  ffi
@@ -52,6 +63,9 @@ GEM
52
63
  rspec-support (~> 3.8.0)
53
64
  rspec-support (3.8.0)
54
65
  thor (0.20.0)
66
+ thread_safe (0.3.6)
67
+ tzinfo (1.2.5)
68
+ thread_safe (~> 0.1)
55
69
  unf (0.1.4)
56
70
  unf_ext
57
71
  unf_ext (0.0.7.5)
@@ -66,6 +80,7 @@ PLATFORMS
66
80
  DEPENDENCIES
67
81
  bundler
68
82
  discordrb
83
+ factory_bot
69
84
  pry
70
85
  qwtf_discord_bot!
71
86
  rspec
data/bin/bundle ADDED
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'bundle' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "rubygems"
12
+
13
+ m = Module.new do
14
+ module_function
15
+
16
+ def invoked_as_script?
17
+ File.expand_path($0) == File.expand_path(__FILE__)
18
+ end
19
+
20
+ def env_var_version
21
+ ENV["BUNDLER_VERSION"]
22
+ end
23
+
24
+ def cli_arg_version
25
+ return unless invoked_as_script? # don't want to hijack other binstubs
26
+ return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27
+ bundler_version = nil
28
+ update_index = nil
29
+ 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
33
+ next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
+ bundler_version = $1 || ">= 0.a"
35
+ update_index = i
36
+ end
37
+ bundler_version
38
+ end
39
+
40
+ def gemfile
41
+ gemfile = ENV["BUNDLE_GEMFILE"]
42
+ return gemfile if gemfile && !gemfile.empty?
43
+
44
+ File.expand_path("../../Gemfile", __FILE__)
45
+ end
46
+
47
+ def lockfile
48
+ lockfile =
49
+ case File.basename(gemfile)
50
+ when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
51
+ else "#{gemfile}.lock"
52
+ end
53
+ File.expand_path(lockfile)
54
+ end
55
+
56
+ def lockfile_version
57
+ return unless File.file?(lockfile)
58
+ lockfile_contents = File.read(lockfile)
59
+ return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60
+ Regexp.last_match(1)
61
+ end
62
+
63
+ def bundler_version
64
+ @bundler_version ||= begin
65
+ env_var_version || cli_arg_version ||
66
+ lockfile_version || "#{Gem::Requirement.default}.a"
67
+ end
68
+ end
69
+
70
+ def load_bundler!
71
+ ENV["BUNDLE_GEMFILE"] ||= gemfile
72
+
73
+ # must dup string for RG < 1.8 compatibility
74
+ activate_bundler(bundler_version.dup)
75
+ end
76
+
77
+ def activate_bundler(bundler_version)
78
+ if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new("2.0")
79
+ bundler_version = "< 2"
80
+ end
81
+ gem_error = activation_error_handling do
82
+ gem "bundler", bundler_version
83
+ end
84
+ return if gem_error.nil?
85
+ require_error = activation_error_handling do
86
+ require "bundler/version"
87
+ end
88
+ return if require_error.nil? && Gem::Requirement.new(bundler_version).satisfied_by?(Gem::Version.new(Bundler::VERSION))
89
+ 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
+ exit 42
91
+ end
92
+
93
+ def activation_error_handling
94
+ yield
95
+ nil
96
+ rescue StandardError, LoadError => e
97
+ e
98
+ end
99
+ end
100
+
101
+ m.load_bundler!
102
+
103
+ if m.invoked_as_script?
104
+ load Gem.bin_path("bundler", "bundle")
105
+ end
data/bin/coderay ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'coderay' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("coderay", "coderay")
data/bin/htmldiff ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'htmldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "htmldiff")
data/bin/ldiff ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'ldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "ldiff")
data/bin/pry ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'pry' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("pry", "pry")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'qwtf_discord_bot' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("qwtf_discord_bot", "qwtf_discord_bot")
data/bin/restclient ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'restclient' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rest-client", "restclient")
data/bin/rspec ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rspec-core", "rspec")
data/bin/thor ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'thor' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("thor", "thor")
data/lib/qstat_request.rb CHANGED
@@ -1,16 +1,12 @@
1
1
  class QstatRequest
2
+ attr_accessor :result
3
+
2
4
  def initialize(endpoint)
3
5
  @endpoint = endpoint
4
- @data = fetch_data
5
6
  end
6
7
 
7
- def teams
8
- @teams ||= build_roster
9
- end
10
-
11
- def to_message
12
- return server_summary if is_empty?
13
- [server_summary, player_table].join("\n")
8
+ def result
9
+ @result ||= execute
14
10
  end
15
11
 
16
12
  def to_embed
@@ -18,13 +14,18 @@ class QstatRequest
18
14
 
19
15
  embed = Discordrb::Webhooks::Embed.new
20
16
 
21
- teams.each do |_name, team|
17
+ teams.each do |team|
22
18
  embed.add_field(team.to_embed_field)
23
19
  end
24
20
 
25
21
  embed
26
22
  end
27
23
 
24
+ def to_message
25
+ return server_summary if is_empty?
26
+ [server_summary, player_table].join("\n")
27
+ end
28
+
28
29
  def server_summary
29
30
  return "#{@endpoint} isn't responding" unless game_map
30
31
  return "#{@endpoint} | #{game_map} | #{numplayers}/#{maxplayers}" unless has_spectators?
@@ -35,22 +36,30 @@ class QstatRequest
35
36
  !has_players? && !has_spectators?
36
37
  end
37
38
 
38
- def has_spectators?
39
- numspectators && numspectators > 0
40
- end
41
-
42
- def has_players?
43
- numplayers && numplayers > 0
44
- end
45
-
46
39
  def player_names
47
40
  players.map(&:name)
48
41
  end
49
42
 
50
43
  private
51
44
 
52
- def fetch_data
53
- JSON.parse(%x[qstat -json -P -qws #{@endpoint}]).first
45
+ def has_spectators?
46
+ numspectators && numspectators > 0
47
+ end
48
+
49
+ def has_players?
50
+ numplayers && numplayers > 0
51
+ end
52
+
53
+ def teams
54
+ @teams ||= build_roster
55
+ end
56
+
57
+ def data
58
+ @data ||= JSON.parse(result).first
59
+ end
60
+
61
+ def execute
62
+ %x[qstat -json -P -qws #{@endpoint}]
54
63
  end
55
64
 
56
65
  def player_table
@@ -58,51 +67,45 @@ class QstatRequest
58
67
  end
59
68
 
60
69
  def address
61
- @data["address"]
70
+ data["address"]
62
71
  end
63
72
 
64
73
  def game_map
65
- @data["map"]
74
+ data["map"]
66
75
  end
67
76
 
68
77
  def numplayers
69
- @data["numplayers"]
78
+ data["numplayers"]
70
79
  end
71
80
 
72
81
  def maxplayers
73
- @data["maxplayers"]
82
+ data["maxplayers"]
74
83
  end
75
84
 
76
85
  def numspectators
77
- @data["numspectators"]
86
+ data["numspectators"]
78
87
  end
79
88
 
80
89
  def maxspectators
81
- @data["maxspectators"]
90
+ data["maxspectators"]
82
91
  end
83
92
 
84
93
  def build_roster
85
94
  return nil if is_empty?
86
95
 
87
- roster = {}
96
+ roster = Roster.new
88
97
 
89
- @data["players"].map do |player_data|
98
+ data["players"].map do |player_data|
90
99
  player = Player.new(player_data)
91
- team_name = player.team
92
- roster[team_name] ||= Team.new(team_name)
93
- roster[team_name].enlist(player)
100
+ roster.enroll(player)
94
101
  end
95
102
 
96
- roster
103
+ roster.teams.sort_by { |team| team.number }
97
104
  end
98
105
 
99
106
  def players
100
- @data["players"].map do |player_data|
107
+ data["players"].map do |player_data|
101
108
  Player.new(player_data)
102
109
  end
103
110
  end
104
-
105
- def players_from_team(team)
106
- players.select { |player| player.team_name == team }.map(&:player_name)
107
- end
108
111
  end
@@ -6,7 +6,7 @@ class QwtfDiscordBotWatcher < QwtfDiscordBot
6
6
  every(THIRTY_SECONDS) do
7
7
  request = QstatRequest.new(endpoint)
8
8
 
9
- if request.has_players?
9
+ unless request.is_empty?
10
10
  request.player_names.each do |name|
11
11
  unless seen_recently?(name)
12
12
  report_joined(name: name, server_summary: request.server_summary)
@@ -1,3 +1,3 @@
1
1
  class QwtfDiscordBot
2
- VERSION = '1.0.3'.freeze
2
+ VERSION = '1.0.4'.freeze
3
3
  end
@@ -7,6 +7,7 @@ require 'qstat_request'
7
7
  require 'player'
8
8
  require 'team'
9
9
  require 'emoji'
10
+ require 'roster'
10
11
 
11
12
  class QwtfDiscordBot
12
13
  TOKEN = ENV['QWTF_DISCORD_BOT_TOKEN'].strip
data/lib/roster.rb ADDED
@@ -0,0 +1,19 @@
1
+ class Roster
2
+ attr_reader :teams
3
+
4
+ def initialize
5
+ @teams = []
6
+ end
7
+
8
+ def enroll(player)
9
+ team_name = player.team
10
+ team = @teams.find { |team| team.name == team_name }
11
+
12
+ unless team
13
+ team = Team.new(team_name)
14
+ @teams << team
15
+ end
16
+
17
+ team.enlist(player)
18
+ end
19
+ 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: 1.0.3
4
+ version: 1.0.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: 2018-08-24 00:00:00.000000000 Z
11
+ date: 2018-08-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A Discord bot for reporting on QuakeWorld Team Fortress game servers
14
14
  email:
@@ -27,8 +27,17 @@ files:
27
27
  - LICENSE.txt
28
28
  - README.md
29
29
  - Rakefile
30
+ - bin/bundle
31
+ - bin/coderay
30
32
  - bin/console
33
+ - bin/htmldiff
34
+ - bin/ldiff
35
+ - bin/pry
36
+ - bin/qwtf_discord_bot
37
+ - bin/restclient
38
+ - bin/rspec
31
39
  - bin/setup
40
+ - bin/thor
32
41
  - emoji/blue_demoman.png
33
42
  - emoji/blue_engineer.png
34
43
  - emoji/blue_hwguy.png
@@ -55,6 +64,7 @@ files:
55
64
  - lib/qwtf_discord_bot/qwtf_discord_bot_server.rb
56
65
  - lib/qwtf_discord_bot/qwtf_discord_bot_watcher.rb
57
66
  - lib/qwtf_discord_bot/version.rb
67
+ - lib/roster.rb
58
68
  - lib/team.rb
59
69
  - qwtf_discord_bot.gemspec
60
70
  - server_screenshot.png