kag-gather 1.5.7 → 1.5.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/kag/gather/match.rb +14 -4
- data/lib/kag/gather/plugin.rb +3 -6
- data/lib/kag/gather/queue.rb +11 -5
- data/lib/kag/gather/team.rb +5 -1
- data/lib/kag/server/instance.rb +198 -0
- data/lib/kag/version.rb +1 -1
- metadata +47 -67
- data/lib/kag/server.rb +0 -187
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MGVhMjVmNTgzZGI3ZTM5NmYyNzI5MTUwZmRjNmMxOTVkZTllMTU5Yg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YjU4MGJhMmMzMDAyOGY5YzQzZWE2ZDY0ZTE0NGUyMzg4YWE4YjdiYw==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MTBlZDE3YWQ4NTFkYmEzMWNjMDhkNzQyN2IxNjA2NWRjZGM5NzBhNjZmYzE3
|
10
|
+
OTUyMzU4ZTFmZTdlMWZmYzM4NzRlYjVkNDA3MDk5OTEzN2U5YzEwNzBiZmU4
|
11
|
+
MmRjYzIzMjExMWY4YmE1YzNlOTIwYTllMGM0YTc2YmJhOGFjYzI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NjkyZDAxZjA0MzcxMjg3MTcwZmIxNDY3MzJkZGU0NWJiODRmNDkyNzUxZjIx
|
14
|
+
MzMyZTgwODdhOGY2OWMyYWMxMTI0YzQ1MDAwYmM3ODU0NjkzZTE5MWI2MzYy
|
15
|
+
NjY1NWVkMDdiNjA3ZGJkYTc3OTFkNWUzODBmN2JkYTlkMjdlZWQ=
|
data/lib/kag/gather/match.rb
CHANGED
@@ -48,7 +48,15 @@ module KAG
|
|
48
48
|
team_list.each do |ts|
|
49
49
|
eb = lb+players_per_team-1
|
50
50
|
eb = self.players.length if eb > self.players.length-1
|
51
|
-
|
51
|
+
x = 0
|
52
|
+
ps = {}
|
53
|
+
self.players.each do |authname,user|
|
54
|
+
if x >= lb and x <= eb
|
55
|
+
ps[authname.to_sym] = user
|
56
|
+
end
|
57
|
+
x = x + 1
|
58
|
+
end
|
59
|
+
#ps = Hash[self.players.sort_by{|k,v| v ? v.to_s : ''}[lb..(eb)]]
|
52
60
|
lb = players_per_team
|
53
61
|
|
54
62
|
self.teams << KAG::Gather::Team.new({
|
@@ -174,10 +182,12 @@ module KAG
|
|
174
182
|
match = self.dup
|
175
183
|
match[:server] = self.server[:key]
|
176
184
|
ts = []
|
177
|
-
match.teams
|
178
|
-
|
185
|
+
if match.teams
|
186
|
+
match.teams.each do |team|
|
187
|
+
ts << {:players => team.teammates,:color => team[:color],:name => team[:name]}
|
188
|
+
end
|
189
|
+
match[:teams] = ts
|
179
190
|
end
|
180
|
-
match[:teams] = ts
|
181
191
|
match.delete(:players)
|
182
192
|
match.delete(:bot) if match.key?(:bot)
|
183
193
|
|
data/lib/kag/gather/plugin.rb
CHANGED
@@ -3,7 +3,7 @@ require 'kag/common'
|
|
3
3
|
require 'commands/help'
|
4
4
|
require 'kag/bot/bot'
|
5
5
|
require 'kag/bans/report'
|
6
|
-
require 'kag/server'
|
6
|
+
require 'kag/server/instance'
|
7
7
|
require 'kag/gather/queue'
|
8
8
|
require 'kag/gather/match'
|
9
9
|
|
@@ -24,11 +24,7 @@ module KAG
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def _load_servers
|
27
|
-
@servers =
|
28
|
-
KAG::Config.instance[:servers].each do |k,s|
|
29
|
-
s[:key] = k
|
30
|
-
@servers[k] = KAG::Server.new(s)
|
31
|
-
end
|
27
|
+
@servers = KAG::Server::Instance.fetch_all
|
32
28
|
end
|
33
29
|
|
34
30
|
#listen_to :channel, method: :channel_listen
|
@@ -364,6 +360,7 @@ module KAG
|
|
364
360
|
def kick_from_match(m,nick)
|
365
361
|
if is_admin(m.user)
|
366
362
|
user = User(nick.to_s)
|
363
|
+
user.refresh
|
367
364
|
if user
|
368
365
|
match = get_match_in(user)
|
369
366
|
if match
|
data/lib/kag/gather/queue.rb
CHANGED
@@ -48,12 +48,18 @@ module KAG
|
|
48
48
|
def check_for_afk(gather)
|
49
49
|
max_idle = (KAG::Config.instance[:idle][:max] or 1800)
|
50
50
|
max_idle = max_idle.to_i
|
51
|
-
|
52
|
-
user
|
53
|
-
|
54
|
-
|
55
|
-
|
51
|
+
begin
|
52
|
+
self.players.each do |authname,user|
|
53
|
+
user.refresh
|
54
|
+
if user.idle > max_idle
|
55
|
+
self.remove(user)
|
56
|
+
gather.send_channels_msg "Removed #{user.authname} from queue (#{KAG::Gather::Match.type_as_string}) for being idle too long [#{self.length}]"
|
57
|
+
end
|
56
58
|
end
|
59
|
+
rescue Exception => e
|
60
|
+
puts e.message
|
61
|
+
puts e.backtrace.join("\n")
|
62
|
+
false
|
57
63
|
end
|
58
64
|
end
|
59
65
|
end
|
data/lib/kag/gather/team.rb
CHANGED
@@ -0,0 +1,198 @@
|
|
1
|
+
require 'cinch'
|
2
|
+
require 'symboltable'
|
3
|
+
require 'json'
|
4
|
+
require 'kagerator'
|
5
|
+
require 'kag/config'
|
6
|
+
require 'socket'
|
7
|
+
|
8
|
+
module KAG
|
9
|
+
module Server
|
10
|
+
class Instance < SymbolTable
|
11
|
+
def self.fetch_all
|
12
|
+
servers = {}
|
13
|
+
KAG::Config.instance[:servers].each do |k,s|
|
14
|
+
s[:key] = k
|
15
|
+
servers[k] = KAG::Server::Instance.new(s)
|
16
|
+
end
|
17
|
+
servers
|
18
|
+
end
|
19
|
+
|
20
|
+
def info
|
21
|
+
Kagerator.server(self[:ip],self[:port])
|
22
|
+
end
|
23
|
+
|
24
|
+
def in_use?
|
25
|
+
self.key?(:match)
|
26
|
+
end
|
27
|
+
|
28
|
+
def has_rcon?
|
29
|
+
self[:rcon_password] and !self[:rcon_password].empty?
|
30
|
+
end
|
31
|
+
|
32
|
+
def socket
|
33
|
+
unless self[:_socket]
|
34
|
+
begin
|
35
|
+
self[:_socket] = TCPSocket.new(self[:ip],self[:port])
|
36
|
+
rescue Exception => e
|
37
|
+
puts e.message
|
38
|
+
puts e.backtrace.join("\n")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
puts self[:_]
|
42
|
+
self[:_socket]
|
43
|
+
end
|
44
|
+
|
45
|
+
def text_join
|
46
|
+
"Join \x0305#{self[:key]} - #{self[:ip]}:#{self[:port]} \x0306password #{self[:password]}\x0301 | Visit kag://#{self[:ip]}/#{self[:password]}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def connect
|
50
|
+
return true if self.connected?
|
51
|
+
puts "[RCON] Attempting to get socket"
|
52
|
+
unless self.socket
|
53
|
+
puts "[RCON] Could not establish TCP socket to connect"
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
success = false
|
57
|
+
begin
|
58
|
+
self.socket.puts self[:rcon_password]
|
59
|
+
z = self.socket.gets
|
60
|
+
puts "[RCON] "+z.to_s
|
61
|
+
z.include?("now authenticated")
|
62
|
+
self[:_connected] = true
|
63
|
+
success = true
|
64
|
+
rescue Exception => e
|
65
|
+
puts e.message
|
66
|
+
puts e.backtrace.join("\n")
|
67
|
+
end
|
68
|
+
success
|
69
|
+
end
|
70
|
+
|
71
|
+
def disconnect
|
72
|
+
if self[:_socket]
|
73
|
+
puts "[RCON] Closing socket..."
|
74
|
+
#self.socket.puts "/quit"
|
75
|
+
self[:_socket].close
|
76
|
+
self[:_connected] = false
|
77
|
+
self.delete(:_socket)
|
78
|
+
end
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
def connected?
|
83
|
+
self[:_connected]
|
84
|
+
end
|
85
|
+
|
86
|
+
def _is_newline?(line)
|
87
|
+
line.empty?
|
88
|
+
end
|
89
|
+
|
90
|
+
def _parse_line(line)
|
91
|
+
line.gsub!(/\r/,"")
|
92
|
+
line.gsub!(/\n/,"")
|
93
|
+
line = line.strip
|
94
|
+
ep = line.index(']')
|
95
|
+
if ep
|
96
|
+
line = line[(ep+1)..line.length].strip
|
97
|
+
else
|
98
|
+
line = line[10..line.length].strip
|
99
|
+
end
|
100
|
+
line.gsub!(/\r/,"")
|
101
|
+
line.gsub!(/\n/,"")
|
102
|
+
line
|
103
|
+
end
|
104
|
+
|
105
|
+
def _cycle
|
106
|
+
while (line = self.socket.gets)
|
107
|
+
line = _parse_line(line)
|
108
|
+
puts "[RCON] "+line
|
109
|
+
break if (_is_newline?(line) or line.empty?)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
##
|
114
|
+
# broken
|
115
|
+
#
|
116
|
+
def players
|
117
|
+
return false unless self.connect
|
118
|
+
_command "/rcon /players"
|
119
|
+
|
120
|
+
players = []
|
121
|
+
while (line = self.socket.gets)
|
122
|
+
puts "[RCONPRIOR] '"+line+"'"
|
123
|
+
line = _parse_line(line)
|
124
|
+
puts "[RCON] '"+line+"'"
|
125
|
+
break if (line.empty? or line == '' or line == "\n")
|
126
|
+
|
127
|
+
player = SymbolTable.new
|
128
|
+
|
129
|
+
# get nick
|
130
|
+
sp = line.index("[")
|
131
|
+
next if sp == nil
|
132
|
+
ep = line.index("]",sp)
|
133
|
+
player[:nick] = line[(sp+1)..(ep-1)]
|
134
|
+
line = line[ep..line.length].strip
|
135
|
+
|
136
|
+
# get id
|
137
|
+
sp = line.index("(")
|
138
|
+
ep = line.index(")",sp)
|
139
|
+
player[:id] = line[(sp+4)..(ep-1)]
|
140
|
+
line = line[ep..line.length]
|
141
|
+
|
142
|
+
# get ip
|
143
|
+
sp = line.index("(")
|
144
|
+
ep = line.index(")",sp)
|
145
|
+
player[:ip] = line[(sp+4)..(ep-1)]
|
146
|
+
line = line[ep..line.length]
|
147
|
+
|
148
|
+
# get hwid
|
149
|
+
sp = line.index("(")
|
150
|
+
ep = line.index(")",sp)
|
151
|
+
player[:hwid] = line[(sp+6)..(ep-1)]
|
152
|
+
|
153
|
+
players << player
|
154
|
+
end
|
155
|
+
players
|
156
|
+
end
|
157
|
+
|
158
|
+
def kick(nick)
|
159
|
+
return false unless self.connect
|
160
|
+
self.socket.puts "/kick #{nick}"
|
161
|
+
_cycle
|
162
|
+
end
|
163
|
+
|
164
|
+
def kick_all
|
165
|
+
return false unless self.connect
|
166
|
+
ps = self.players
|
167
|
+
if ps
|
168
|
+
ps.each do |player|
|
169
|
+
_command "/kick #{player[:nick]}"
|
170
|
+
end
|
171
|
+
else
|
172
|
+
puts "No Players found on Server #{self[:ip]}!"
|
173
|
+
end
|
174
|
+
_cycle
|
175
|
+
end
|
176
|
+
|
177
|
+
def restart_map
|
178
|
+
return false unless self.connect
|
179
|
+
_command "/restartmap"
|
180
|
+
_cycle
|
181
|
+
end
|
182
|
+
|
183
|
+
def next_map
|
184
|
+
return false unless self.connect
|
185
|
+
_command "/nextmap"
|
186
|
+
_cycle
|
187
|
+
end
|
188
|
+
|
189
|
+
protected
|
190
|
+
|
191
|
+
def _command(cmd)
|
192
|
+
return false unless self.connected?
|
193
|
+
puts "[RCON] #{cmd.to_s}"
|
194
|
+
self.socket.puts cmd
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
data/lib/kag/version.rb
CHANGED
metadata
CHANGED
@@ -1,144 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kag-gather
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 1.5.7
|
4
|
+
version: 1.5.8
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Shaun McCormick
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
11
|
date: 2013-03-26 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: cinch
|
16
|
-
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
17
|
- - '='
|
19
18
|
- !ruby/object:Gem::Version
|
20
19
|
version: 2.0.4
|
21
|
-
|
22
|
-
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.0.4
|
27
|
-
none: false
|
28
|
-
prerelease: false
|
29
|
-
type: :runtime
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: cinch-identify
|
32
|
-
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
33
30
|
requirements:
|
34
31
|
- - '='
|
35
32
|
- !ruby/object:Gem::Version
|
36
33
|
version: 1.4.1
|
37
|
-
|
38
|
-
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
37
|
requirements:
|
40
38
|
- - '='
|
41
39
|
- !ruby/object:Gem::Version
|
42
40
|
version: 1.4.1
|
43
|
-
none: false
|
44
|
-
prerelease: false
|
45
|
-
type: :runtime
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: json
|
48
|
-
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
49
44
|
requirements:
|
50
45
|
- - ! '>='
|
51
46
|
- !ruby/object:Gem::Version
|
52
47
|
version: '0'
|
53
|
-
|
54
|
-
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
51
|
requirements:
|
56
52
|
- - ! '>='
|
57
53
|
- !ruby/object:Gem::Version
|
58
54
|
version: '0'
|
59
|
-
none: false
|
60
|
-
prerelease: false
|
61
|
-
type: :runtime
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: symboltable
|
64
|
-
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
65
58
|
requirements:
|
66
59
|
- - '='
|
67
60
|
- !ruby/object:Gem::Version
|
68
61
|
version: 1.0.2
|
69
|
-
|
70
|
-
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
66
|
- - '='
|
73
67
|
- !ruby/object:Gem::Version
|
74
68
|
version: 1.0.2
|
75
|
-
none: false
|
76
|
-
prerelease: false
|
77
|
-
type: :runtime
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: kagerator
|
80
|
-
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
81
72
|
requirements:
|
82
73
|
- - '='
|
83
74
|
- !ruby/object:Gem::Version
|
84
75
|
version: 1.0.3
|
85
|
-
|
86
|
-
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
79
|
requirements:
|
88
80
|
- - '='
|
89
81
|
- !ruby/object:Gem::Version
|
90
82
|
version: 1.0.3
|
91
|
-
none: false
|
92
|
-
prerelease: false
|
93
|
-
type: :runtime
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: rake
|
96
|
-
version_requirements: !ruby/object:Gem::Requirement
|
97
|
-
requirements:
|
98
|
-
- - ! '>='
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
version: '0'
|
101
|
-
none: false
|
102
85
|
requirement: !ruby/object:Gem::Requirement
|
103
86
|
requirements:
|
104
87
|
- - ! '>='
|
105
88
|
- !ruby/object:Gem::Version
|
106
89
|
version: '0'
|
107
|
-
none: false
|
108
|
-
prerelease: false
|
109
90
|
type: :development
|
110
|
-
|
111
|
-
name: rspec
|
91
|
+
prerelease: false
|
112
92
|
version_requirements: !ruby/object:Gem::Requirement
|
113
93
|
requirements:
|
114
94
|
- - ! '>='
|
115
95
|
- !ruby/object:Gem::Version
|
116
96
|
version: '0'
|
117
|
-
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
118
99
|
requirement: !ruby/object:Gem::Requirement
|
119
100
|
requirements:
|
120
101
|
- - ! '>='
|
121
102
|
- !ruby/object:Gem::Version
|
122
103
|
version: '0'
|
123
|
-
none: false
|
124
|
-
prerelease: false
|
125
104
|
type: :development
|
126
|
-
|
127
|
-
name: guard-rspec
|
105
|
+
prerelease: false
|
128
106
|
version_requirements: !ruby/object:Gem::Requirement
|
129
107
|
requirements:
|
130
108
|
- - ! '>='
|
131
109
|
- !ruby/object:Gem::Version
|
132
110
|
version: '0'
|
133
|
-
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: guard-rspec
|
134
113
|
requirement: !ruby/object:Gem::Requirement
|
135
114
|
requirements:
|
136
115
|
- - ! '>='
|
137
116
|
- !ruby/object:Gem::Version
|
138
117
|
version: '0'
|
139
|
-
none: false
|
140
|
-
prerelease: false
|
141
118
|
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
142
125
|
description: A bot for starting and managing KAG Gather matches
|
143
126
|
email:
|
144
127
|
- splittingred@gmail.com
|
@@ -147,20 +130,17 @@ extensions: []
|
|
147
130
|
extra_rdoc_files: []
|
148
131
|
files:
|
149
132
|
- readme.md
|
150
|
-
- lib/gather.rb
|
151
|
-
- lib/patches.rb
|
152
133
|
- lib/commands/command.rb
|
153
134
|
- lib/commands/commands.rb
|
154
135
|
- lib/commands/help.rb
|
155
|
-
- lib/
|
156
|
-
- lib/kag/config.rb
|
157
|
-
- lib/kag/data.rb
|
158
|
-
- lib/kag/server.rb
|
159
|
-
- lib/kag/version.rb
|
136
|
+
- lib/gather.rb
|
160
137
|
- lib/kag/bans/plugin.rb
|
161
138
|
- lib/kag/bans/report.rb
|
162
139
|
- lib/kag/bot/bot.rb
|
163
140
|
- lib/kag/bot/plugin.rb
|
141
|
+
- lib/kag/common.rb
|
142
|
+
- lib/kag/config.rb
|
143
|
+
- lib/kag/data.rb
|
164
144
|
- lib/kag/gather/match.rb
|
165
145
|
- lib/kag/gather/plugin.rb
|
166
146
|
- lib/kag/gather/queue.rb
|
@@ -168,15 +148,19 @@ files:
|
|
168
148
|
- lib/kag/help/book.rb
|
169
149
|
- lib/kag/help/plugin.rb
|
170
150
|
- lib/kag/irc/plugin.rb
|
151
|
+
- lib/kag/server/instance.rb
|
171
152
|
- lib/kag/stats/main.rb
|
172
153
|
- lib/kag/stats/plugin.rb
|
173
154
|
- lib/kag/user/plugin.rb
|
174
155
|
- lib/kag/user/user.rb
|
156
|
+
- lib/kag/version.rb
|
157
|
+
- lib/patches.rb
|
175
158
|
- config/config.sample.json
|
176
159
|
homepage: https://github.com/splittingred/kag-gather
|
177
160
|
licenses:
|
178
161
|
- GPLv2
|
179
|
-
|
162
|
+
metadata: {}
|
163
|
+
post_install_message:
|
180
164
|
rdoc_options: []
|
181
165
|
require_paths:
|
182
166
|
- lib
|
@@ -185,19 +169,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
185
169
|
- - ! '>='
|
186
170
|
- !ruby/object:Gem::Version
|
187
171
|
version: 1.9.2
|
188
|
-
none: false
|
189
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
173
|
requirements:
|
191
174
|
- - ! '>='
|
192
175
|
- !ruby/object:Gem::Version
|
193
176
|
version: 1.3.6
|
194
|
-
none: false
|
195
177
|
requirements: []
|
196
|
-
rubyforge_project:
|
197
|
-
rubygems_version:
|
198
|
-
signing_key:
|
199
|
-
specification_version:
|
178
|
+
rubyforge_project:
|
179
|
+
rubygems_version: 2.0.3
|
180
|
+
signing_key:
|
181
|
+
specification_version: 4
|
200
182
|
summary: KAG Gather IRC Bot
|
201
183
|
test_files: []
|
202
|
-
has_rdoc:
|
203
|
-
...
|
data/lib/kag/server.rb
DELETED
@@ -1,187 +0,0 @@
|
|
1
|
-
require 'cinch'
|
2
|
-
require 'symboltable'
|
3
|
-
require 'json'
|
4
|
-
require 'kagerator'
|
5
|
-
require 'kag/config'
|
6
|
-
require 'socket'
|
7
|
-
|
8
|
-
module KAG
|
9
|
-
class Server < SymbolTable
|
10
|
-
def info
|
11
|
-
Kagerator.server(self[:ip],self[:port])
|
12
|
-
end
|
13
|
-
|
14
|
-
def in_use?
|
15
|
-
self.key?(:match)
|
16
|
-
end
|
17
|
-
|
18
|
-
def has_rcon?
|
19
|
-
self[:rcon_password] and !self[:rcon_password].empty?
|
20
|
-
end
|
21
|
-
|
22
|
-
def socket
|
23
|
-
unless self[:_socket]
|
24
|
-
begin
|
25
|
-
self[:_socket] = TCPSocket.new(self[:ip],self[:port])
|
26
|
-
rescue Exception => e
|
27
|
-
puts e.message
|
28
|
-
puts e.backtrace.join("\n")
|
29
|
-
end
|
30
|
-
end
|
31
|
-
puts self[:_]
|
32
|
-
self[:_socket]
|
33
|
-
end
|
34
|
-
|
35
|
-
def text_join
|
36
|
-
"Join \x0305#{self[:key]} - #{self[:ip]}:#{self[:port]} \x0306password #{self[:password]}\x0301 | Visit kag://#{self[:ip]}/#{self[:password]}"
|
37
|
-
end
|
38
|
-
|
39
|
-
def connect
|
40
|
-
return true if self.connected?
|
41
|
-
puts "[RCON] Attempting to get socket"
|
42
|
-
unless self.socket
|
43
|
-
puts "[RCON] Could not establish TCP socket to connect"
|
44
|
-
return false
|
45
|
-
end
|
46
|
-
success = false
|
47
|
-
begin
|
48
|
-
self.socket.puts self[:rcon_password]
|
49
|
-
z = self.socket.gets
|
50
|
-
puts "[RCON] "+z.to_s
|
51
|
-
z.include?("now authenticated")
|
52
|
-
self[:_connected] = true
|
53
|
-
success = true
|
54
|
-
rescue Exception => e
|
55
|
-
puts e.message
|
56
|
-
puts e.backtrace.join("\n")
|
57
|
-
end
|
58
|
-
success
|
59
|
-
end
|
60
|
-
|
61
|
-
def disconnect
|
62
|
-
if self[:_socket]
|
63
|
-
puts "[RCON] Closing socket..."
|
64
|
-
#self.socket.puts "/quit"
|
65
|
-
self[:_socket].close
|
66
|
-
self[:_connected] = false
|
67
|
-
self.delete(:_socket)
|
68
|
-
end
|
69
|
-
true
|
70
|
-
end
|
71
|
-
|
72
|
-
def connected?
|
73
|
-
self[:_connected]
|
74
|
-
end
|
75
|
-
|
76
|
-
def _is_newline?(line)
|
77
|
-
line.empty?
|
78
|
-
end
|
79
|
-
|
80
|
-
def _parse_line(line)
|
81
|
-
line.gsub!(/\r/,"")
|
82
|
-
line.gsub!(/\n/,"")
|
83
|
-
line = line.strip
|
84
|
-
ep = line.index(']')
|
85
|
-
if ep
|
86
|
-
line = line[(ep+1)..line.length].strip
|
87
|
-
else
|
88
|
-
line = line[10..line.length].strip
|
89
|
-
end
|
90
|
-
line.gsub!(/\r/,"")
|
91
|
-
line.gsub!(/\n/,"")
|
92
|
-
line
|
93
|
-
end
|
94
|
-
|
95
|
-
def _cycle
|
96
|
-
while (line = self.socket.gets)
|
97
|
-
line = _parse_line(line)
|
98
|
-
puts "[RCON] "+line
|
99
|
-
break if (_is_newline?(line) or line.empty?)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
##
|
104
|
-
# broken
|
105
|
-
#
|
106
|
-
def players
|
107
|
-
return false unless self.connect
|
108
|
-
_command "/rcon /players"
|
109
|
-
|
110
|
-
players = []
|
111
|
-
while (line = self.socket.gets)
|
112
|
-
puts "[RCONPRIOR] '"+line+"'"
|
113
|
-
line = _parse_line(line)
|
114
|
-
puts "[RCON] '"+line+"'"
|
115
|
-
break if (line.empty? or line == '' or line == "\n")
|
116
|
-
|
117
|
-
player = SymbolTable.new
|
118
|
-
|
119
|
-
# get nick
|
120
|
-
sp = line.index("[")
|
121
|
-
next if sp == nil
|
122
|
-
ep = line.index("]",sp)
|
123
|
-
player[:nick] = line[(sp+1)..(ep-1)]
|
124
|
-
line = line[ep..line.length].strip
|
125
|
-
|
126
|
-
# get id
|
127
|
-
sp = line.index("(")
|
128
|
-
ep = line.index(")",sp)
|
129
|
-
player[:id] = line[(sp+4)..(ep-1)]
|
130
|
-
line = line[ep..line.length]
|
131
|
-
|
132
|
-
# get ip
|
133
|
-
sp = line.index("(")
|
134
|
-
ep = line.index(")",sp)
|
135
|
-
player[:ip] = line[(sp+4)..(ep-1)]
|
136
|
-
line = line[ep..line.length]
|
137
|
-
|
138
|
-
# get hwid
|
139
|
-
sp = line.index("(")
|
140
|
-
ep = line.index(")",sp)
|
141
|
-
player[:hwid] = line[(sp+6)..(ep-1)]
|
142
|
-
|
143
|
-
players << player
|
144
|
-
end
|
145
|
-
players
|
146
|
-
end
|
147
|
-
|
148
|
-
def kick(nick)
|
149
|
-
return false unless self.connect
|
150
|
-
self.socket.puts "/kick #{nick}"
|
151
|
-
_cycle
|
152
|
-
end
|
153
|
-
|
154
|
-
def kick_all
|
155
|
-
return false unless self.connect
|
156
|
-
ps = self.players
|
157
|
-
if ps
|
158
|
-
ps.each do |player|
|
159
|
-
_command "/kick #{player[:nick]}"
|
160
|
-
end
|
161
|
-
else
|
162
|
-
puts "No Players found on Server #{self[:ip]}!"
|
163
|
-
end
|
164
|
-
_cycle
|
165
|
-
end
|
166
|
-
|
167
|
-
def restart_map
|
168
|
-
return false unless self.connect
|
169
|
-
_command "/restartmap"
|
170
|
-
_cycle
|
171
|
-
end
|
172
|
-
|
173
|
-
def next_map
|
174
|
-
return false unless self.connect
|
175
|
-
_command "/nextmap"
|
176
|
-
_cycle
|
177
|
-
end
|
178
|
-
|
179
|
-
protected
|
180
|
-
|
181
|
-
def _command(cmd)
|
182
|
-
return false unless self.connected?
|
183
|
-
puts "[RCON] #{cmd.to_s}"
|
184
|
-
self.socket.puts cmd
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|