qwtf_discord_bot 0.2.2 → 0.3.0

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: 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