qwtf_discord_bot 0.4.1 → 0.5.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: 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