kag-gather 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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