qwtf_discord_bot 0.4.1 → 0.5.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: 62157a5a72751b294e2ee10e08455e2ae86b617f4f04ab4654c4e85a0bc57391
4
- data.tar.gz: 815994275f732832081c1d9ed36f75ca1063eda17d16875d6823756f306aecca
3
+ metadata.gz: c4e173913a0bd952c25925e850c3d6e812edde02814a683cb6babf197fa6bece
4
+ data.tar.gz: c1611d47c886f95106bc46bd08e22ca7ee891c4821276731d2053e98d3bac459
5
5
  SHA512:
6
- metadata.gz: 933a0d807334cceafa97c3f9f48e00554483c04057c042c4fd74b7e2a676778340e8349ff2959a0a3a5641adf9329ccea0aa382e22737b31a119a71ce2a9c55c
7
- data.tar.gz: 9f6a616d96d8e5173e2f896ec0de689315ac468e08a8c82a5fc85b202ed619325aa267b3b5212a6bde48b1a357004014e2ad0a798c8e407ef5eac92da15f9039
6
+ metadata.gz: c9429a92ac668b36035086e2fd6692a9777a1b4c14b458400ba2ddb32becb06714202f7e656516235267e529071bd7bb686f609ed8cb3e1b7038466a4df1e50d
7
+ data.tar.gz: 719c94d1fefa5a56e4d31b00a2b5ee41964844dd81cde1255e25b9d2bb445172a73b34b43478448806679c313c4548f0b2f8c68cf68b6ccd762d7e9c40575847
data/.gitignore CHANGED
@@ -10,6 +10,6 @@
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
12
  assets/
13
- .env
13
+ .env*
14
14
  qstat
15
15
  *.gem
data/Gemfile CHANGED
@@ -5,3 +5,5 @@ gemspec
5
5
  gem 'bundler'
6
6
  gem 'discordrb'
7
7
  gem 'thor'
8
+ gem 'rspec'
9
+ gem 'pry'
data/Gemfile.lock CHANGED
@@ -1,11 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- qwtf_discord_bot (0.4.0)
4
+ qwtf_discord_bot (0.4.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ coderay (1.1.2)
10
+ diff-lcs (1.3)
9
11
  discordrb (3.2.1)
10
12
  discordrb-webhooks (~> 3.2.0.1)
11
13
  opus-ruby
@@ -20,18 +22,35 @@ GEM
20
22
  ffi (1.9.25)
21
23
  http-cookie (1.0.3)
22
24
  domain_name (~> 0.5)
25
+ method_source (0.9.0)
23
26
  mime-types (3.1)
24
27
  mime-types-data (~> 3.2015)
25
28
  mime-types-data (3.2016.0521)
26
29
  netrc (0.11.0)
27
30
  opus-ruby (1.0.1)
28
31
  ffi
32
+ pry (0.11.3)
33
+ coderay (~> 1.1.0)
34
+ method_source (~> 0.9.0)
29
35
  rbnacl (3.4.0)
30
36
  ffi
31
37
  rest-client (2.0.2)
32
38
  http-cookie (>= 1.0.2, < 2.0)
33
39
  mime-types (>= 1.16, < 4.0)
34
40
  netrc (~> 0.8)
41
+ rspec (3.8.0)
42
+ rspec-core (~> 3.8.0)
43
+ rspec-expectations (~> 3.8.0)
44
+ rspec-mocks (~> 3.8.0)
45
+ rspec-core (3.8.0)
46
+ rspec-support (~> 3.8.0)
47
+ rspec-expectations (3.8.1)
48
+ diff-lcs (>= 1.2.0, < 2.0)
49
+ rspec-support (~> 3.8.0)
50
+ rspec-mocks (3.8.0)
51
+ diff-lcs (>= 1.2.0, < 2.0)
52
+ rspec-support (~> 3.8.0)
53
+ rspec-support (3.8.0)
35
54
  thor (0.20.0)
36
55
  unf (0.1.4)
37
56
  unf_ext
@@ -47,7 +66,9 @@ PLATFORMS
47
66
  DEPENDENCIES
48
67
  bundler
49
68
  discordrb
69
+ pry
50
70
  qwtf_discord_bot!
71
+ rspec
51
72
  thor
52
73
 
53
74
  BUNDLED WITH
data/lib/player.rb CHANGED
@@ -19,12 +19,16 @@ class Player
19
19
  @data['name']
20
20
  end
21
21
 
22
+ def score
23
+ @data['score']
24
+ end
25
+
22
26
  def to_row
23
27
  "#{emoji}#{name}"
24
28
  end
25
29
 
26
30
  def team
27
- @team ||= Team.new(@data['team'].to_sym)
31
+ @data['team']
28
32
  end
29
33
 
30
34
  def player_class
data/lib/qstat_request.rb CHANGED
@@ -1,38 +1,84 @@
1
- class QstatRequest
2
- def initialize(endpoint)
3
- @result = JSON.parse(%x[qstat -json -P -qws #{endpoint}]).first
4
- end
5
-
6
- def output
7
- <<~HEREDOC
8
- **#{address} | #{map} | #{numplayers}/#{maxplayers}**
9
- #{player_table}
10
- HEREDOC
11
- end
12
-
13
- def address
14
- @result["address"]
15
- end
16
-
17
- def map
18
- @result["map"]
19
- end
20
-
21
- def numplayers
22
- @result["numplayers"]
23
- end
24
-
25
- def maxplayers
26
- @result["maxplayers"]
27
- end
28
-
29
- def player_table
30
- players && players.sort_by { |player| player.team.number }.map(&:to_row).join("\n")
31
- end
32
-
33
- def players
34
- @result["players"] && @result["players"].map do |player_data|
35
- Player.new(player_data)
36
- end
37
- end
38
- end
1
+ class QstatRequest
2
+ def initialize(endpoint)
3
+ @endpoint = endpoint
4
+ @data = fetch_data
5
+ end
6
+
7
+ def teams
8
+ @teams ||= begin
9
+ roster = {}
10
+ teams = players.map(&:team).uniq
11
+ teams.each { |team| roster[team] = [] }
12
+
13
+ players.each do |player|
14
+ roster[player.team] << player
15
+ end
16
+ roster
17
+ end
18
+ end
19
+
20
+ def output
21
+ return server_summary unless has_players?
22
+ [server_summary, player_table].join("\n")
23
+ end
24
+
25
+ def to_embed
26
+ embed = Discordrb::Webhooks::Embed.new
27
+ teams.each do |team, players|
28
+ player_list = players.map(&:to_row).join('\n')
29
+ score = players.first.score
30
+ field_name = "#{team} #{score}"
31
+ embed.add_field(Discordrb::Webhooks::EmbedField.new(inline: true, name: field_name, value: player_list))
32
+ end
33
+
34
+ embed
35
+ end
36
+
37
+ def server_summary
38
+ "#{@endpoint} | #{game_map} | #{numplayers}/#{maxplayers}"
39
+ end
40
+
41
+ def has_players?
42
+ @data["players"] || false
43
+ end
44
+
45
+ def player_names
46
+ players.map(&:name)
47
+ end
48
+
49
+ private
50
+
51
+ def fetch_data
52
+ JSON.parse(%x[qstat -json -P -qws #{@endpoint}]).first
53
+ end
54
+
55
+ def player_table
56
+ players.sort_by { |player| player.team.number }.map(&:to_row).join("\n")
57
+ end
58
+
59
+ def address
60
+ @data["address"]
61
+ end
62
+
63
+ def game_map
64
+ @data["map"]
65
+ end
66
+
67
+ def numplayers
68
+ @data["numplayers"]
69
+ end
70
+
71
+ def maxplayers
72
+ @data["maxplayers"]
73
+ end
74
+
75
+ def players
76
+ @data["players"].map do |player_data|
77
+ Player.new(player_data)
78
+ end
79
+ end
80
+
81
+ def players_from_team(team)
82
+ players.select { |player| player.team_name == team }.map(&:player_name)
83
+ end
84
+ end
@@ -1,4 +1,8 @@
1
+ require 'pry'
2
+
1
3
  require 'qwtf_discord_bot/version'
4
+ require 'qwtf_discord_bot/qwtf_discord_bot_server'
5
+ require 'qwtf_discord_bot/qwtf_discord_bot_watcher'
2
6
  require 'discordrb'
3
7
 
4
8
  require 'qstat_request'
@@ -17,78 +21,9 @@ class QwtfDiscordBot
17
21
  end
18
22
 
19
23
  def endpoint
20
- return @hostname if @port == 27500
21
- [@hostname, @port].join(':')
22
- end
23
- end
24
-
25
- class QwtfDiscordBotServer < QwtfDiscordBot
26
- def run
27
- bot = Discordrb::Commands::CommandBot.new(
28
- token: TOKEN,
29
- client_id: CLIENT_ID,
30
- prefix: '!'
31
- )
32
-
33
- bot.command :server do |_event|
34
- QstatRequest.new(endpoint).output
35
- end
36
-
37
- bot.run
38
- end
39
- end
40
-
41
- class QwtfDiscordBotWatcher < QwtfDiscordBot
42
- THIRTY_SECONDS = 30
43
- TEN_MINUTES = 10 * 60
44
-
45
- def run
46
- every(THIRTY_SECONDS) do
47
- request = QstatRequest.new(endpoint)
48
- numplayers = request.numplayers
49
- maxplayers = request.maxplayers
50
- map = request.map
51
-
52
- if request.players
53
- player_names = request.players.map(&:name)
54
-
55
- player_names.each do |name|
56
- unless seen_recently?(name)
57
- report_joined(name: name,
58
- map: map,
59
- numplayers: numplayers,
60
- maxplayers: maxplayers)
61
- end
62
-
63
- history[name] = Time.now
64
- end
65
- end
66
- end
67
- end
68
-
69
- def every(n_seconds)
70
- loop do
71
- before = Time.now
72
- yield
73
- interval = n_seconds - (Time.now - before)
74
- sleep(interval) if interval > 0
75
- end
76
- end
77
-
78
- def seen_recently?(name)
79
- last_seen = history[name]
80
- last_seen && (Time.now - last_seen < TEN_MINUTES)
81
- end
82
-
83
- def report_joined(name:, map:, numplayers:, maxplayers:)
84
- Discordrb::API::Channel.create_message(
85
- "Bot #{TOKEN}",
86
- CHANNEL_ID,
87
- "**#{name}** has joined **#{endpoint} | #{map} | #{numplayers}/#{maxplayers}**"
88
- )
89
- end
90
-
91
- def history
92
- @history ||= {}
24
+ @endpoint ||= begin
25
+ return @hostname if @port == 27500
26
+ [@hostname, @port].join(':')
27
+ end
93
28
  end
94
29
  end
@@ -0,0 +1,19 @@
1
+ class QwtfDiscordBotServer < QwtfDiscordBot
2
+ def run
3
+ bot = Discordrb::Commands::CommandBot.new(
4
+ token: TOKEN,
5
+ client_id: CLIENT_ID,
6
+ prefix: '!'
7
+ )
8
+
9
+ bot.command :server do |event|
10
+ qstat_request = QstatRequest.new(endpoint)
11
+ message = qstat_request.server_summary
12
+ embed = qstat_request.to_embed
13
+
14
+ event.channel.send_embed(message, embed)
15
+ end
16
+
17
+ bot.run
18
+ end
19
+ end
@@ -0,0 +1,46 @@
1
+ class QwtfDiscordBotWatcher < QwtfDiscordBot
2
+ THIRTY_SECONDS = 30
3
+ TEN_MINUTES = 10 * 60
4
+
5
+ def run
6
+ every(THIRTY_SECONDS) do
7
+ request = QstatRequest.new(endpoint)
8
+
9
+ if request.player_names
10
+ request.player_names.each do |name|
11
+ unless seen_recently?(name)
12
+ report_joined(name: name, server_summary: request.server_summary)
13
+ end
14
+
15
+ history[name] = Time.now
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ def every(n_seconds)
22
+ loop do
23
+ before = Time.now
24
+ yield
25
+ interval = n_seconds - (Time.now - before)
26
+ sleep(interval) if interval > 0
27
+ end
28
+ end
29
+
30
+ def seen_recently?(name)
31
+ last_seen = history[name]
32
+ last_seen && (Time.now - last_seen < TEN_MINUTES)
33
+ end
34
+
35
+ def report_joined(name:, server_summary:)
36
+ Discordrb::API::Channel.create_message(
37
+ "Bot #{TOKEN}",
38
+ CHANNEL_ID,
39
+ "#{name} has joined #{server_summary}"
40
+ )
41
+ end
42
+
43
+ def history
44
+ @history ||= {}
45
+ end
46
+ end
@@ -1,3 +1,3 @@
1
1
  class QwtfDiscordBot
2
- VERSION = '0.4.1'.freeze
2
+ VERSION = '0.5.0'.freeze
3
3
  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: 0.4.1
4
+ version: 0.5.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-11 00:00:00.000000000 Z
11
+ date: 2018-08-13 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:
@@ -52,6 +52,8 @@ files:
52
52
  - lib/player.rb
53
53
  - lib/qstat_request.rb
54
54
  - lib/qwtf_discord_bot.rb
55
+ - lib/qwtf_discord_bot/qwtf_discord_bot_server.rb
56
+ - lib/qwtf_discord_bot/qwtf_discord_bot_watcher.rb
55
57
  - lib/qwtf_discord_bot/version.rb
56
58
  - lib/team.rb
57
59
  - qwtf_discord_bot.gemspec