qwtf_discord_bot 0.2.2 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17b3a605955a7c65f2b562ede207f81a65710cb8b25bd50a182ef87e7859b71d
4
- data.tar.gz: 3a4d2102cf31c211a5183bcb960a74b143477a6237935eb9e4aa93b82b74a608
3
+ metadata.gz: af5a91eea63cee06b63358f91be5473c89aaac89dbbd8bbb06141b7ba3b0d7dd
4
+ data.tar.gz: '0815fbb7ba17b9232561f9fa10581c883fcf9ac8f41a4427949ecd32e4f3bebb'
5
5
  SHA512:
6
- metadata.gz: 57b2ba74202f630c0a304195f281a8e51ebff62d6ac6cd908854d0665c95dd74bf831944ad5c4bd425d73219dc68a2390eaddfcd3c15495a742ab7e5c006c591
7
- data.tar.gz: d23e6b6479b6cd7548696fbf1135e65c5ffd0a9fb85e576ed2cedfef3d649bfba0d9e4d8e074d9a4cefa76b3fb16f4a1ad9b1fddf577f46b7a4b64b22eb5db9d
6
+ metadata.gz: 235a0377e67ea4d2289f4dee19d08c7f7ee58b43c4218653c461dc4f859c17d803498ed30c7daa13bce64c35468905697d31b7f15260a5afa169ff654f40767d
7
+ data.tar.gz: f9378c160a7acebab7f648349e17021cbb8a31975a3e4cd713fe13fea9dd912d4471e6c119801d1ffe44ffa49e13b9b643e7a1419ece9b02ecd89eea843bd067
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  assets/
13
13
  .env
14
14
  qstat
15
+ *.gem
data/Gemfile.lock CHANGED
@@ -1,13 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qwtf_discord_bot (0.2.0)
4
+ qwtf_discord_bot (0.2.2)
5
+ activesupport
5
6
  discordrb
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
10
- coderay (1.1.2)
11
+ activesupport (5.2.0)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ concurrent-ruby (1.0.5)
11
17
  diff-lcs (1.3)
12
18
  discordrb (3.2.1)
13
19
  discordrb-webhooks (~> 3.2.0.1)
@@ -17,22 +23,21 @@ GEM
17
23
  websocket-client-simple (>= 0.3.0)
18
24
  discordrb-webhooks (3.2.0.1)
19
25
  rest-client
20
- domain_name (0.5.20170404)
26
+ domain_name (0.5.20180417)
21
27
  unf (>= 0.0.5, < 1.0.0)
22
28
  event_emitter (0.2.6)
23
29
  ffi (1.9.25)
24
30
  http-cookie (1.0.3)
25
31
  domain_name (~> 0.5)
26
- method_source (0.9.0)
32
+ i18n (1.0.1)
33
+ concurrent-ruby (~> 1.0)
27
34
  mime-types (3.1)
28
35
  mime-types-data (~> 3.2015)
29
36
  mime-types-data (3.2016.0521)
37
+ minitest (5.11.3)
30
38
  netrc (0.11.0)
31
39
  opus-ruby (1.0.1)
32
40
  ffi
33
- pry (0.11.3)
34
- coderay (~> 1.1.0)
35
- method_source (~> 0.9.0)
36
41
  rake (10.5.0)
37
42
  rbnacl (3.4.0)
38
43
  ffi
@@ -54,10 +59,13 @@ GEM
54
59
  rspec-support (~> 3.7.0)
55
60
  rspec-support (3.7.1)
56
61
  thor (0.20.0)
62
+ thread_safe (0.3.6)
63
+ tzinfo (1.2.5)
64
+ thread_safe (~> 0.1)
57
65
  unf (0.1.4)
58
66
  unf_ext
59
67
  unf_ext (0.0.7.5)
60
- websocket (1.2.5)
68
+ websocket (1.2.8)
61
69
  websocket-client-simple (0.3.0)
62
70
  event_emitter
63
71
  websocket
@@ -67,11 +75,10 @@ PLATFORMS
67
75
 
68
76
  DEPENDENCIES
69
77
  bundler (~> 1.16)
70
- pry
71
78
  qwtf_discord_bot!
72
79
  rake (~> 10.0)
73
80
  rspec (~> 3.0)
74
- thor
81
+ thor (~> 0)
75
82
 
76
83
  BUNDLED WITH
77
84
  1.16.2
data/README.md CHANGED
@@ -1,38 +1,30 @@
1
1
  # QwtfDiscordBot
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/qwtf_discord_bot`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ A Discord bot for checking the status of QuakeWorld Team Fortress servers
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ ![screenshot of bot](screenshot.png)
6
6
 
7
- ## Installation
8
-
9
- Add this line to your application's Gemfile:
10
7
 
11
- ```ruby
12
- gem 'qwtf_discord_bot'
13
- ```
8
+ ## Dependencies
14
9
 
15
- And then execute:
10
+ - Ruby >= 2.5.0
11
+ - [qstat](https://github.com/multiplay/qstat) version with JSON support. Tested with commit [2ab78bd5c30fbd47b2bdd4a6279296d66424b37e](https://github.com/multiplay/qstat/tree/2ab78bd5c30fbd47b2bdd4a6279296d66424b37e). Should be added to `$PATH`.
16
12
 
17
- $ bundle
18
13
 
19
- Or install it yourself as:
14
+ ## Installation
20
15
 
21
16
  $ gem install qwtf_discord_bot
22
17
 
23
- ## Usage
24
-
25
- $ bundle exec exe\qwtf-discord-bot server
26
18
 
27
- ## Development
19
+ ## Usage
28
20
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
21
+ Create a bot on discord.
30
22
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
23
+ Edit the `.env.example` file, update with your bot's `client_id` and `token` and save as `.env`. Then:
32
24
 
33
- ## Contributing
25
+ $ source .env
26
+ $ bundle exec exe\qwtf-discord-bot server
34
27
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/qwtf_discord_bot.
36
28
 
37
29
  ## License
38
30
 
data/exe/qwtf_discord_bot CHANGED
@@ -1,6 +1,24 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'qwtf_discord_bot'
4
- require 'qwtf_discord_bot/cli'
4
+ require "thor"
5
5
 
6
- QwtfDiscordBot::CLI.start
6
+ class QwtfDiscordBotExe < Thor
7
+ def self.exit_on_failure?
8
+ true
9
+ end
10
+
11
+ desc "server", "Runs the qwtf-discord-bot server"
12
+ def server
13
+ server_bot = QwtfDiscordBot::Server.new
14
+ server_bot.run
15
+ end
16
+
17
+ desc "watcher", "Runs the qwtf-discord-bot watcher"
18
+ def watcher
19
+ watcher_bot = QwtfDiscordBot::Watcher.new
20
+ watcher_bot.run
21
+ end
22
+ end
23
+
24
+ QwtfDiscordBotExe.start
data/lib/player.rb CHANGED
@@ -1,47 +1,47 @@
1
1
  class Player
2
- PLAYER_CLASSES = {
3
- "sco" => "scout",
4
- "sni" => "sniper",
5
- "sol" => "soldier",
6
- "dem" => "demoman",
7
- "med" => "medic",
8
- "pyr" => "pyro",
9
- "hwg" => "hwguy",
10
- "spy" => "spy",
11
- "eng" => "engineer"
12
- }
13
-
14
- def initialize(data)
15
- @data = data
16
- end
17
-
18
- def to_row
19
- "#{emoji}#{name}"
20
- end
21
-
22
- def team
23
- @team ||= Team.new(@data["team"].to_sym)
24
- end
25
-
26
- def player_class
27
- PLAYER_CLASSES[short_class]
28
- end
29
-
30
- private
31
-
32
- def emoji
33
- Emoji.new(self).to_s
34
- end
35
-
36
- def name
37
- @data["name"]
38
- end
39
-
40
- def short_class
41
- skin.split("_").last
42
- end
43
-
44
- def skin
45
- @data["skin"]
46
- end
2
+ PLAYER_CLASSES = {
3
+ "sco" => "scout",
4
+ "sni" => "sniper",
5
+ "sol" => "soldier",
6
+ "dem" => "demoman",
7
+ "med" => "medic",
8
+ "pyr" => "pyro",
9
+ "hwg" => "hwguy",
10
+ "spy" => "spy",
11
+ "eng" => "engineer"
12
+ }
13
+
14
+ def initialize(data)
15
+ @data = data
16
+ end
17
+
18
+ def name
19
+ @data["name"]
20
+ end
21
+
22
+ def to_row
23
+ "#{emoji}#{name}"
24
+ end
25
+
26
+ def team
27
+ @team ||= Team.new(@data["team"].to_sym)
28
+ end
29
+
30
+ def player_class
31
+ PLAYER_CLASSES[short_class]
32
+ end
33
+
34
+ private
35
+
36
+ def emoji
37
+ Emoji.new(self).to_s
38
+ end
39
+
40
+ def short_class
41
+ skin.split("_").last
42
+ end
43
+
44
+ def skin
45
+ @data["skin"]
46
+ end
47
47
  end
data/lib/qstat_request.rb CHANGED
@@ -1,38 +1,38 @@
1
1
  class QstatRequest
2
- def initialize(hostname)
3
- @result = JSON.parse(%x[qstat -json -P -qws #{hostname}]).first
4
- end
2
+ def initialize(hostname)
3
+ @result = JSON.parse(%x[qstat -json -P -qws #{hostname}]).first
4
+ end
5
5
 
6
- def output
7
- <<~HEREDOC
6
+ def output
7
+ <<~HEREDOC
8
8
  **#{address} | #{map} | #{numplayers}/#{maxplayers}**
9
9
  #{player_table}
10
- HEREDOC
11
- end
10
+ HEREDOC
11
+ end
12
12
 
13
- def address
14
- @result["address"]
15
- end
13
+ def address
14
+ @result["address"]
15
+ end
16
16
 
17
- def map
18
- @result["map"]
19
- end
17
+ def map
18
+ @result["map"]
19
+ end
20
20
 
21
- def numplayers
22
- @result["numplayers"]
23
- end
21
+ def numplayers
22
+ @result["numplayers"]
23
+ end
24
24
 
25
- def maxplayers
26
- @result["maxplayers"]
27
- end
25
+ def maxplayers
26
+ @result["maxplayers"]
27
+ end
28
28
 
29
- def player_table
30
- players.sort_by { |player| player.team.number }.map(&:to_row).join("\n")
31
- end
29
+ def player_table
30
+ players.sort_by { |player| player.team.number }.map(&:to_row).join("\n")
31
+ end
32
32
 
33
- def players
34
- @result["players"].map do |player_data|
35
- Player.new(player_data)
36
- end
37
- end
33
+ def players
34
+ @result["players"].map do |player_data|
35
+ Player.new(player_data)
36
+ end
37
+ end
38
38
  end
@@ -1,23 +1,82 @@
1
1
  require "qwtf_discord_bot/version"
2
2
  require "discordrb"
3
+ require 'active_support/core_ext/string'
3
4
 
4
5
  require "qstat_request"
5
6
  require "player"
6
7
  require "team"
7
8
  require "emoji"
8
9
 
9
- module QwtfDiscordBot
10
- raise "DISCORD_QSTAT_BOT_TOKEN environment variable not set" unless ENV["DISCORD_QSTAT_BOT_TOKEN"]
11
-
12
- TOKEN = ENV["DISCORD_QSTAT_BOT_TOKEN"].strip
13
- CLIENT_ID = ENV["DISCORD_CLIENT_ID"].strip
10
+ class QwtfDiscordBot
11
+ TOKEN = ENV["QWTF_DISCORD_BOT_TOKEN"].strip
12
+ CLIENT_ID = ENV["QWTF_DISCORD_BOT_CLIENT_ID"].strip
13
+ CHANNEL_ID = ENV["QWTF_DISCORD_BOT_CHANNEL_ID"].strip
14
14
  HOSTNAME = "fortressone.ga"
15
15
 
16
- bot = Discordrb::Commands::CommandBot.new token: TOKEN, client_id: CLIENT_ID, prefix: "!"
16
+ class Server
17
+ def initialize
18
+ @bot ||= Discordrb::Commands::CommandBot.new(
19
+ token: TOKEN,
20
+ client_id: CLIENT_ID,
21
+ prefix: "!"
22
+ )
23
+
24
+ @bot.command :server do |event|
25
+ QstatRequest.new(HOSTNAME).output
26
+ end
27
+ end
17
28
 
18
- bot.command :server do |event|
19
- QstatRequest.new(HOSTNAME).output
29
+ def run
30
+ @bot.run
31
+ end
20
32
  end
21
33
 
22
- bot.run
34
+ class Watcher
35
+ THIRTY_SECONDS = 30
36
+ TEN_MINUTES = 10 * 60
37
+
38
+ def initialize
39
+ @history = {}
40
+ end
41
+
42
+ def run
43
+ every(THIRTY_SECONDS) do
44
+ request = QstatRequest.new(HOSTNAME)
45
+ player_names = request.players.map(&:name)
46
+ numplayers = request.numplayers
47
+
48
+ player_names.each do |name|
49
+ report_joined(name, numplayers) unless seen_recently?(name)
50
+ @history[name] = Time.now
51
+ end
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def report_joined(name, numplayers)
58
+ number_of_other_players = numplayers - 1
59
+
60
+ Discordrb::API::Channel.create_message(
61
+ "Bot #{TOKEN}",
62
+ CHANNEL_ID,
63
+ "**#{name}** has joined **#{number_of_other_players}** " \
64
+ "#{"other player".pluralize(number_of_other_players)} on **#{HOSTNAME}**"
65
+ )
66
+ end
67
+
68
+ def seen_recently?(name)
69
+ last_seen = @history[name]
70
+ last_seen && (Time.now - last_seen < TEN_MINUTES)
71
+ end
72
+
73
+ def every(n)
74
+ loop do
75
+ before = Time.now
76
+ yield
77
+ interval = n-(Time.now-before)
78
+ sleep(interval) if interval > 0
79
+ end
80
+ end
81
+ end
23
82
  end
@@ -1,10 +1,22 @@
1
- require 'thor'
2
-
3
- module QwtfDiscordBot
4
- class CLI < Thor
5
- desc "server", "Runs the qwtf-discord-bot"
6
- def server
7
- QwtfDiscordBot::Server.run
8
- end
9
- end
10
- end
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'qwtf_discord_bot'
4
+ require "thor"
5
+
6
+ class QwtfDiscordBot < Thor
7
+ def self.exit_on_failure?
8
+ true
9
+ end
10
+
11
+ desc "server", "Runs the qwtf-discord-bot server"
12
+ def server
13
+ QwtfDiscordBot::Server.run
14
+ end
15
+
16
+ desc "watcher", "Runs the qwtf-discord-bot watcher"
17
+ def watcher
18
+ QwtfDiscordBot::Watcher.run
19
+ end
20
+ end
21
+
22
+ QwtfDiscordBot.start
@@ -1,3 +1,3 @@
1
- module QwtfDiscordBot
2
- VERSION = "0.2.2"
1
+ class QwtfDiscordBot
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,4 +1,3 @@
1
-
2
1
  lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require "qwtf_discord_bot/version"
@@ -9,19 +8,27 @@ Gem::Specification.new do |spec|
9
8
  spec.authors = ["Sheldon Johnson"]
10
9
  spec.email = ["shayolden@hotmail.com"]
11
10
 
12
- spec.description = %q{A discord bot for checking the status of qwtf servers}
13
- spec.summary = %q{A discord bot for checking the status of qwtf servers}
11
+ spec.description = "A Discord bot for reporting on QuakeWorld Team " \
12
+ "Fortress game servers"
13
+
14
+ spec.summary = "Works by wrapping the excellent CLI server query tool" \
15
+ "qstat. Accepts the !server command from users and " \
16
+ "also periodically checks for new players on the " \
17
+ "server and reports about them."
18
+
14
19
  spec.homepage = "https://github.com/drzel/qwtf_discord_bot.git"
15
20
  spec.license = "MIT"
16
21
 
17
22
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
23
  f.match(%r{^(test|spec|features)/})
19
24
  end
25
+
20
26
  spec.bindir = "exe"
21
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
28
  spec.require_paths = ["lib"]
23
29
 
24
30
  spec.add_dependency "discordrb"
31
+ spec.add_dependency "activesupport"
25
32
 
26
33
  spec.add_development_dependency "thor", '~> 0'
27
34
  spec.add_development_dependency "bundler", "~> 1.16"
data/screenshot.png ADDED
Binary file
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: 0.2.2
4
+ version: 0.3.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: 2018-08-01 00:00:00.000000000 Z
11
+ date: 2018-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: discordrb
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: thor
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +94,7 @@ dependencies:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: '3.0'
83
- description: A discord bot for checking the status of qwtf servers
97
+ description: A Discord bot for reporting on QuakeWorld Team Fortress game servers
84
98
  email:
85
99
  - shayolden@hotmail.com
86
100
  executables:
@@ -106,9 +120,8 @@ files:
106
120
  - lib/qwtf_discord_bot/cli.rb
107
121
  - lib/qwtf_discord_bot/version.rb
108
122
  - lib/team.rb
109
- - qwtf_discord_bot-0.2.0.gem
110
- - qwtf_discord_bot-0.2.1.gem
111
123
  - qwtf_discord_bot.gemspec
124
+ - screenshot.png
112
125
  homepage: https://github.com/drzel/qwtf_discord_bot.git
113
126
  licenses:
114
127
  - MIT
@@ -132,5 +145,7 @@ rubyforge_project:
132
145
  rubygems_version: 2.7.3
133
146
  signing_key:
134
147
  specification_version: 4
135
- summary: A discord bot for checking the status of qwtf servers
148
+ summary: Works by wrapping the excellent CLI server query toolqstat. Accepts the !server
149
+ command from users and also periodically checks for new players on the server and
150
+ reports about them.
136
151
  test_files: []
Binary file
Binary file