kag-gather 1.1.1 → 1.2.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.
data/lib/kag/gather.rb CHANGED
@@ -2,6 +2,7 @@ require 'cinch'
2
2
  require 'kag/bot'
3
3
  require 'kag/config'
4
4
  require 'kag/server'
5
+ require 'kag/match'
5
6
 
6
7
  module KAG
7
8
  class Gather
@@ -11,12 +12,21 @@ module KAG
11
12
  KAG::Config.instance
12
13
  end
13
14
 
14
- attr_accessor :queue
15
+ attr_accessor :queue,:servers
15
16
 
16
17
  def initialize(*args)
17
18
  super
18
19
  @queue = {}
19
20
  @matches = {}
21
+ _load_servers
22
+ end
23
+
24
+ def _load_servers
25
+ @servers = {}
26
+ KAG::Config.instance[:servers].each do |k,s|
27
+ s[:key] = k
28
+ @servers[k] = KAG::Server.new(s)
29
+ end
20
30
  end
21
31
 
22
32
  #listen_to :channel, method: :channel_listen
@@ -24,29 +34,23 @@ module KAG
24
34
  #end
25
35
 
26
36
  listen_to :leaving, method: :on_leaving
27
- def on_leaving(m,user)
28
- remove_user_from_queue(user) if @queue.key?(user)
29
- remove_user_from_match(user) if in_match(user)
37
+ def on_leaving(m,nick)
38
+ match = get_match_in(nick)
39
+ if match
40
+ match.remove_player(nick)
41
+ elsif @queue.key?(nick)
42
+ remove_user_from_queue(nick)
43
+ end
30
44
  end
31
45
 
32
46
  listen_to :nick, method: :on_nick
33
47
  def on_nick(m)
34
- if @queue.key?(m.user.last_nick)
48
+ match = get_match_in(m.user.last_nick)
49
+ if match
50
+ match.rename_player(m.user.last_nick,m.user.nick)
51
+ elsif @queue.key?(m.user.last_nick)
35
52
  @queue[m.user.nick] = @queue[m.user.last_nick]
36
53
  @queue.delete(m.user.last_nick)
37
- elsif in_match(m.user.last_nick)
38
- @matches.each do |m|
39
- i = m[:team1].index(m.user.last_nick)
40
- if i != nil
41
- m[:team1].delete_at(i)
42
- m[:team1] << m.user.nick
43
- end
44
- i = m[:team2].index(m.user.last_nick)
45
- if i != nil
46
- m[:team2].delete_at(i)
47
- m[:team2] << m.user.nick
48
- end
49
- end
50
54
  end
51
55
  end
52
56
 
@@ -57,8 +61,13 @@ module KAG
57
61
 
58
62
  match "rem", method: :evt_rem
59
63
  def evt_rem(m)
60
- remove_user_from_match(m.user.nick)
61
- remove_user_from_queue(m.user.nick)
64
+ match = get_match_in(m.user.nick)
65
+ if match
66
+ match.remove_player(m.user.nick)
67
+ send_channels_msg "#{nick} has left the match at #{match.server[:key]}! Find a sub!"
68
+ elsif @queue.key?(user)
69
+ remove_user_from_queue(m.user.nick)
70
+ end
62
71
  end
63
72
 
64
73
  match "list", method: :evt_list
@@ -67,7 +76,7 @@ module KAG
67
76
  @queue.each do |n,u|
68
77
  users << n
69
78
  end
70
- m.user.send "Queue (#{get_match_type_as_string}) [#{@queue.length}] #{users.join(", ")}"
79
+ m.user.send "Queue (#{KAG::Match.type_as_string}) [#{@queue.length}] #{users.join(", ")}"
71
80
  end
72
81
 
73
82
  match "status", method: :evt_status
@@ -77,16 +86,15 @@ module KAG
77
86
 
78
87
  match "end", method: :evt_end
79
88
  def evt_end(m)
80
- match_in = get_match_in(m.user.nick)
81
- if match_in
82
- match_in[:end_votes] = match_in[:end_votes] + 1
83
- evt = KAG::Config.instance[:end_vote_threshold].to_i
84
- evt = 3 if evt < 1
85
- if match_in[:end_votes] >= evt
86
- end_match(match_in)
89
+ match = get_match_in(m.user.nick)
90
+ if match
91
+ match.add_end_vote
92
+ if match.voted_to_end?
93
+ match.cease
94
+ @matches.delete(match.server[:key])
95
+ send_channels_msg("Match at #{match.server[:key]} finished!")
87
96
  else
88
- needed = evt - match_in[:end_votes]
89
- reply m,"End vote started, #{needed} more votes to end match at #{match_in[:server][:key]}"
97
+ reply m,"End vote started, #{match.get_needed_end_votes_left} more votes to end match at #{match.server[:key]}"
90
98
  end
91
99
  else
92
100
  reply m,"You're not in a match, silly! Stop trying to hack me."
@@ -94,14 +102,14 @@ module KAG
94
102
  end
95
103
 
96
104
  def add_user_to_queue(m,nick)
97
- unless @queue.key?(nick) or in_match(nick)
105
+ unless @queue.key?(nick) or get_match_in(nick)
98
106
  @queue[nick] = SymbolTable.new({
99
107
  :user => User(nick),
100
108
  :channel => m.channel,
101
109
  :message => m.message,
102
110
  :joined_at => Time.now
103
111
  })
104
- send_channels_msg "Added #{nick} to queue (#{get_match_type_as_string}) [#{@queue.length}]"
112
+ send_channels_msg "Added #{nick} to queue (#{KAG::Match.type_as_string}) [#{@queue.length}]"
105
113
  check_for_new_match
106
114
  end
107
115
  end
@@ -109,66 +117,25 @@ module KAG
109
117
  def remove_user_from_queue(nick)
110
118
  if @queue.key?(nick)
111
119
  @queue.delete(nick)
112
- send_channels_msg "Removed #{nick} from queue (#{get_match_type_as_string}) [#{@queue.length}]"
120
+ send_channels_msg "Removed #{nick} from queue (#{KAG::Match.type_as_string}) [#{@queue.length}]"
113
121
  end
114
122
  end
115
123
 
116
- def end_match(match)
117
- if match[:server].has_rcon?
118
- begin
119
- match[:team1].each do |p|
120
- match[:server].kick(p)
121
- end
122
- match[:team2].each do |p|
123
- match[:server].kick(p)
124
- end
125
- rescue Exception => e
126
- debug e.message
127
- debug e.backtrace.join("\n")
128
- end
129
- else
130
- debug "NO RCON, so could not kick!"
131
- end
132
- match[:server].disconnect
133
- @matches.delete(match[:server][:key])
134
- send_channels_msg("Match at #{match[:server][:key]} finished!")
135
- end
136
-
137
- def remove_user_from_match(nick,send_msg = true)
138
- match = get_match_in(nick)
139
- if match and send_msg
140
- send_channels_msg "#{nick} has left the match at #{match[:server][:key]}! Find a sub!"
141
- end
142
- end
143
-
144
- def in_match(nick)
145
- get_match_in(nick)
146
- end
147
-
148
124
  def get_match_in(nick)
149
125
  m = false
150
126
  @matches.each do |k,match|
151
- puts match.inspect
152
- if match[:team1] and match[:team1].include?(nick)
153
- m = match
154
- elsif match[:team2] and match[:team2].include?(nick)
127
+ if match.has_player?(nick)
155
128
  m = match
156
129
  end
157
130
  end
158
131
  m
159
132
  end
160
133
 
161
- def get_match_type_as_string
162
- ms = KAG::Config.instance[:match_size]
163
- ts = (ms / 2).ceil
164
- "#{ts.to_s}v#{ts.to_s} #{KAG::Config.instance[:match_type]}"
165
- end
166
-
167
134
  def check_for_new_match
168
135
  if @queue.length >= KAG::Config.instance[:match_size]
169
- playing = []
136
+ players = []
170
137
  @queue.each do |n,i|
171
- playing << n
138
+ players << n
172
139
  end
173
140
 
174
141
  server = get_unused_server
@@ -178,68 +145,20 @@ module KAG
178
145
  return false
179
146
  end
180
147
 
181
- @queue = {}
182
- playing.shuffle!
183
- match_size = KAG::Config.instance[:match_size].to_i
184
- match_size = 2 if match_size < 2
185
-
186
- lb = (match_size / 2).ceil.to_i
187
- lb = 1 if lb < 1
188
-
189
- debug "MATCH SIZE #{match_size.to_s}"
190
- debug "LOWER BOUND: #{lb.to_s}"
191
- debug "PLAYERS: #{playing.join(",")}"
192
-
193
- team1 = playing.slice(0,lb)
194
- team2 = playing.slice(lb,match_size)
195
-
196
- send_channels_msg("MATCH: #{get_match_type_as_string} - \x0312#{team1.join(", ")} (Blue) \x0310vs \x0304#{team2.join(", ")} (Red) \x0301(!end when done)",false)
197
- msg = "Join \x0305#{server[:key]} - #{server[:ip]}:#{server[:port]} \x0306password #{server[:password]}\x0301 | Visit kag://#{server[:ip]}/#{server[:password]} | "
198
-
199
- msg = msg + " \x0303Class: " if KAG::Config.instance[:pick_classes]
200
- classes_t1 = get_team_classes(1)
201
- classes_t2 = get_team_classes(2)
202
-
203
- team1.each do |p|
204
- player_msg = msg.clone
205
- if KAG::Config.instance[:pick_classes]
206
- cls = classes_t1.shift
207
- player_msg = player_msg+cls if cls and !cls.empty?
208
- end
209
- player_msg = player_msg+" \x0312Blue Team with: #{team1.join(", ")}"
210
- User(p).send(player_msg) unless p.include?("player")
211
- debug "Sent to #{p.to_s}: "+player_msg
212
- sleep(1)
213
- end
214
- team2.each do |p|
215
- player_msg = msg.clone
216
- if KAG::Config.instance[:pick_classes]
217
- cls = classes_t2.shift
218
- player_msg = player_msg+cls if cls and !cls.empty?
219
- end
220
- player_msg = player_msg+" \x0304Red Team with: #{team2.join(", ")}"
221
- User(p).send(player_msg) unless p.include?("player")
222
- debug "Sent to #{p.to_s}: "+player_msg
223
- sleep(1)
224
- end
225
-
226
- begin
227
- if server.has_rcon?
228
- server.restart_map
229
- else
230
- debug "Cannot restart map, no RCON!"
231
- end
232
- rescue Exception => e
233
- debug e.message
234
- debug e.backtrace.join("\n")
148
+ match = KAG::Match.new(SymbolTable.new({
149
+ :server => server,
150
+ :players => players
151
+ }))
152
+ match.start
153
+ messages = match.notify_teams_of_match_start
154
+ messages.each do |nick,msg|
155
+ User(nick.to_s).send(msg) unless nick.to_s.include?("player")
156
+ sleep(2)
235
157
  end
158
+ send_channels_msg(match.text_for_match_start,false)
236
159
 
237
- @matches[server[:key]] = {
238
- :team1 => team1,
239
- :team2 => team2,
240
- :server => server,
241
- :end_votes => 0
242
- }
160
+ @queue = {}
161
+ @matches[server[:key]] = match
243
162
  end
244
163
  end
245
164
 
@@ -256,18 +175,11 @@ module KAG
256
175
  end
257
176
 
258
177
  def get_unused_server
259
- used_servers = []
260
- @matches.each do |k,m|
261
- used_servers << k
178
+ server = false
179
+ @servers.each do |k,s|
180
+ server = s unless s.in_use?
262
181
  end
263
- available_servers = KAG::Config.instance[:servers]
264
- available_servers.each do |k,s|
265
- unless used_servers.include?(k)
266
- s[:key] = k
267
- return KAG::Server.new(s)
268
- end
269
- end
270
- false
182
+ server
271
183
  end
272
184
 
273
185
  match "help", method: :evt_help
@@ -356,8 +268,8 @@ module KAG
356
268
  def evt_restart_map(m)
357
269
  if is_admin(m.user)
358
270
  match = get_match_in(m.user.nick)
359
- if match
360
- match[:server].restart_map
271
+ if match and match.server
272
+ match.server.restart_map
361
273
  end
362
274
  end
363
275
  end
@@ -365,9 +277,8 @@ module KAG
365
277
  match /restart_map (.+)/, method: :evt_restart_map_specify
366
278
  def evt_restart_map_specify(m,arg)
367
279
  if is_admin(m.user)
368
- server = get_server(arg)
369
- if server
370
- server.next_map
280
+ if @servers[key]
281
+ @servers[key].restart_map
371
282
  else
372
283
  m.reply "No server found with key #{arg}"
373
284
  end
@@ -378,8 +289,8 @@ module KAG
378
289
  def evt_next_map(m)
379
290
  if is_admin(m.user)
380
291
  match = get_match_in(m.user.nick)
381
- if match
382
- match[:server].restart_map
292
+ if match and match.server
293
+ match.server.next_map
383
294
  end
384
295
  end
385
296
  end
@@ -387,9 +298,8 @@ module KAG
387
298
  match /next_map (.+)/, method: :evt_next_map_specify
388
299
  def evt_next_map_specify(m,arg)
389
300
  if is_admin(m.user)
390
- server = get_server(arg)
391
- if server
392
- server.next_map
301
+ if @servers[key]
302
+ @servers[key].next_map
393
303
  else
394
304
  m.reply "No server found with key #{arg}"
395
305
  end
@@ -400,9 +310,8 @@ module KAG
400
310
  def evt_kick_from_match(m,nick)
401
311
  if is_admin(m.user)
402
312
  match = get_match_in(nick)
403
- if match[:server]
404
- match[:server].kick(nick)
405
- remove_user_from_match(nick,false)
313
+ if match
314
+ match.remove_player(nick)
406
315
  m.reply "#{nick} has been kicked from the match"
407
316
  else
408
317
  m.reply "#{nick} is not in a match!"
@@ -410,13 +319,6 @@ module KAG
410
319
  end
411
320
  end
412
321
 
413
- def get_server(key)
414
- @matches.each do |k,m|
415
- return m[:server] if k.to_s == key
416
- end
417
- false
418
- end
419
-
420
322
  match "reload_config", method: :evt_reload_config
421
323
  def evt_reload_config(m)
422
324
  if is_admin(m.user)
@@ -424,11 +326,5 @@ module KAG
424
326
  m.reply "Configuration reloaded."
425
327
  end
426
328
  end
427
-
428
- def get_team_classes(team)
429
- classes = KAG::Config.instance[:classes]
430
- classes.shuffle!
431
- classes.clone
432
- end
433
329
  end
434
330
  end
data/lib/kag/match.rb ADDED
@@ -0,0 +1,138 @@
1
+ require 'cinch'
2
+ require 'symboltable'
3
+ require 'kag/config'
4
+ require 'kag/team'
5
+
6
+ module KAG
7
+ class Match < SymbolTable
8
+
9
+ def self.type_as_string
10
+ ms = KAG::Config.instance[:match_size].to_i
11
+ ts = (ms / 2).ceil
12
+ "#{ts.to_s}v#{ts.to_s} #{KAG::Config.instance[:match_type]}"
13
+ end
14
+
15
+ def setup_teams
16
+ self[:players].shuffle!
17
+ match_size = KAG::Config.instance[:match_size].to_i
18
+ match_size = 2 if match_size < 2
19
+
20
+ lb = (match_size / 2).ceil.to_i
21
+ lb = 1 if lb < 1
22
+
23
+ debug "MATCH SIZE #{match_size.to_s}"
24
+ debug "LOWER BOUND: #{lb.to_s}"
25
+ debug "PLAYERS: #{self[:players].join(",")}"
26
+
27
+ self[:teams] = []
28
+ self[:teams] << KAG::Team.new({
29
+ :players => self[:players].slice(0,lb),
30
+ :match => self,
31
+ :color => "\x0312",
32
+ :name => "Blue"
33
+ }).setup
34
+ self[:teams] << KAG::Team.new({
35
+ :players => self[:players].slice(lb,match_size),
36
+ :match => self,
37
+ :color => "\x0304",
38
+ :name => "Red"
39
+ }).setup
40
+ self[:teams]
41
+ end
42
+
43
+ def start
44
+ self[:end_votes] = 0 unless self[:end_votes]
45
+ setup_teams
46
+ restart_map
47
+ end
48
+
49
+ def text_for_match_start
50
+ msg = "MATCH: #{KAG::Match.type_as_string} - "
51
+ self[:teams].each do |team|
52
+ msg = msg+" "+team.text_for_match_start
53
+ end
54
+ msg+" \x0301(!end when done)"
55
+ end
56
+
57
+ def notify_teams_of_match_start
58
+ messages = {}
59
+ self[:teams].each do |t|
60
+ ms = t.notify_of_match_start
61
+ ms.each do |nick,msg|
62
+ messages[nick] = msg
63
+ end
64
+ end
65
+ messages
66
+ end
67
+
68
+ def add_end_vote
69
+ self[:end_votes] = 0 unless self[:end_votes] > 0
70
+ self[:end_votes] = self[:end_votes] + 1
71
+ end
72
+
73
+ def voted_to_end?
74
+ evt = KAG::Config.instance[:end_vote_threshold].to_i
75
+ evt = 3 if evt < 1
76
+ self[:end_votes] >= evt
77
+ end
78
+
79
+ def get_needed_end_votes_left
80
+ evt = KAG::Config.instance[:end_vote_threshold].to_i
81
+ evt - self[:end_votes]
82
+ end
83
+
84
+ def has_player?(nick)
85
+ playing = false
86
+ self[:teams].each do |team|
87
+ playing = true if team.has_player?(nick)
88
+ end
89
+ playing
90
+ end
91
+
92
+ def cease
93
+ if self.server
94
+ if self.server.has_rcon?
95
+ self[:teams].each do |team|
96
+ team.kick_all
97
+ end
98
+ else
99
+ debug "NO RCON, so could not kick!"
100
+ end
101
+ self.server.disconnect
102
+ self.server.delete(:match)
103
+ true
104
+ else
105
+ debug "No server for match defined!"
106
+ false
107
+ end
108
+ end
109
+
110
+ def restart_map
111
+ if self.server.has_rcon?
112
+ self.server.restart_map
113
+ else
114
+ debug "Cannot restart map, no RCON defined"
115
+ end
116
+ end
117
+
118
+ def remove_player
119
+ if match.server
120
+ match.server.kick(nick)
121
+ end
122
+ end
123
+
124
+ def rename_player(last_nick,new_nick)
125
+ self[:teams].each do |team|
126
+ if team.has_player?(last_nick)
127
+ team.rename_player(last_nick,new_nick)
128
+ end
129
+ end
130
+ end
131
+
132
+ def debug(msg)
133
+ if KAG::Config.instance[:debug]
134
+ puts msg
135
+ end
136
+ end
137
+ end
138
+ end
data/lib/kag/server.rb CHANGED
@@ -11,6 +11,10 @@ module KAG
11
11
  Kagerator.server(self[:ip],self[:port])
12
12
  end
13
13
 
14
+ def in_use?
15
+ self.key?(:match)
16
+ end
17
+
14
18
  def has_rcon?
15
19
  self[:rcon_password] and !self[:rcon_password].empty?
16
20
  end
data/lib/kag/team.rb ADDED
@@ -0,0 +1,62 @@
1
+ require 'cinch'
2
+ require 'cinch/user'
3
+ require 'symboltable'
4
+ require 'kag/config'
5
+
6
+ module KAG
7
+ class Team < SymbolTable
8
+
9
+ def setup
10
+ setup_classes
11
+ puts self[:players].inspect
12
+ self
13
+ end
14
+
15
+ def setup_classes
16
+ classes = KAG::Config.instance[:classes].clone
17
+ classes.shuffle!
18
+ players = self[:players].clone
19
+ self[:players] = {}
20
+ players.each do |p|
21
+ self[:players][p.to_sym] = classes.shift
22
+ end
23
+ end
24
+
25
+ def notify_of_match_start
26
+ server = self.match.server
27
+ msg = "Join \x0305#{server[:key]} - #{server[:ip]}:#{server[:port]} \x0306password #{server[:password]}\x0301 | Visit kag://#{server[:ip]}/#{server[:password]} | "
28
+ msg = msg + " \x0303Class: " if KAG::Config.instance[:pick_classes]
29
+
30
+ messages = {}
31
+ self[:players].each do |nick,cls|
32
+ player_msg = msg.clone
33
+ player_msg = player_msg+cls if KAG::Config.instance[:pick_classes] and cls and !cls.empty?
34
+ player_msg = player_msg+" \x0312Blue Team with: #{self[:players].keys.join(", ")}"
35
+ messages[nick] = player_msg
36
+ end
37
+ messages
38
+ end
39
+
40
+ def text_for_match_start
41
+ "#{self[:color]}#{self[:players].keys.join(", ")} (#{self[:name]})"
42
+ end
43
+
44
+ def has_player?(nick)
45
+ self[:players].keys.include?(nick.to_sym)
46
+ end
47
+
48
+ def rename_player(last_nick,new_nick)
49
+ if has_player?(nick)
50
+ cls = self[:players][last_nick.to_sym]
51
+ self[:players].delete(last_nick.to_sym)
52
+ self[:players][new_nick.to_sym] = cls
53
+ end
54
+ end
55
+
56
+ def kick_all
57
+ self[:players].each do |nick,cls|
58
+ self.match.server.kick(nick.to_s)
59
+ end
60
+ end
61
+ end
62
+ end
data/lib/kag/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module KAG
2
- VERSION = '1.1.1'
2
+ VERSION = '1.2.0'
3
3
  def self.version
4
4
  VERSION
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kag-gather
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -135,7 +135,9 @@ files:
135
135
  - lib/kag/bot.rb
136
136
  - lib/kag/config.rb
137
137
  - lib/kag/gather.rb
138
+ - lib/kag/match.rb
138
139
  - lib/kag/server.rb
140
+ - lib/kag/team.rb
139
141
  - lib/kag/version.rb
140
142
  - config/config.sample.json
141
143
  homepage: https://github.com/splittingred/kag-gather