kag-gather 1.5.7 → 1.5.8
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 +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
|