kag-gather 1.0.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/README.md +11 -0
- data/lib/kag/bot.rb +29 -0
- data/lib/kag/config.rb +22 -0
- data/lib/kag/gather.rb +206 -0
- data/lib/kag/server.rb +13 -0
- data/lib/kag/version.rb +6 -0
- metadata +182 -0
data/README.md
ADDED
data/lib/kag/bot.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'cinch'
|
2
|
+
require File.dirname(__FILE__)+'/config'
|
3
|
+
require File.dirname(__FILE__)+'/gather'
|
4
|
+
|
5
|
+
module KAG
|
6
|
+
class Bot
|
7
|
+
def initialize
|
8
|
+
config = self.config
|
9
|
+
bot = Cinch::Bot.new do
|
10
|
+
configure do |c|
|
11
|
+
c.server = config[:server]
|
12
|
+
c.channels = config[:channels]
|
13
|
+
c.port = config[:port].to_i > 0 ? config[:port] : 6667
|
14
|
+
#c.ssl = config[:ssl]
|
15
|
+
c.nick = config[:nick].to_s != "" ? config[:nick] : "KAGatherer"
|
16
|
+
c.realname = config[:realname].to_s != "" ? config[:realname] : "KAG Gatherer"
|
17
|
+
c.messages_per_second = 1
|
18
|
+
c.plugins.plugins = [KAG::Gather]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
bot.start
|
23
|
+
end
|
24
|
+
|
25
|
+
def config
|
26
|
+
KAG::Config.instance
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/kag/config.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'symboltable'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module KAG
|
6
|
+
class Config < SymbolTable
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super
|
11
|
+
self.merge!(self._get_config)
|
12
|
+
end
|
13
|
+
|
14
|
+
def _get_config
|
15
|
+
if File.exists?("config/config.json")
|
16
|
+
SymbolTable.new(JSON.parse(::IO.read("config/config.json")))
|
17
|
+
else
|
18
|
+
raise 'Error loading config file from config/config.json'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/kag/gather.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'cinch'
|
2
|
+
require File.dirname(__FILE__)+'/bot'
|
3
|
+
require File.dirname(__FILE__)+'/config'
|
4
|
+
require File.dirname(__FILE__)+'/server'
|
5
|
+
|
6
|
+
module KAG
|
7
|
+
class Gather
|
8
|
+
include Cinch::Plugin
|
9
|
+
|
10
|
+
def config
|
11
|
+
KAG::Config.instance
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :queue
|
15
|
+
|
16
|
+
def initialize(*args)
|
17
|
+
super
|
18
|
+
@queue = {}
|
19
|
+
@matches = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
listen_to :channel, method: :channel_listen
|
23
|
+
def channel_listen(m)
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
listen_to :leaving, method: :leaving
|
28
|
+
def leaving(m)
|
29
|
+
if @queue.key?(m.user.nick)
|
30
|
+
remove_from_queue(m)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
listen_to :nick, method: :handle_nick_change
|
35
|
+
def handle_nick_change(m)
|
36
|
+
if @queue.key?(m.user.last_nick)
|
37
|
+
@queue[m.user.nick] = @queue[m.user.last_nick]
|
38
|
+
@queue.delete(m.user.last_nick)
|
39
|
+
elsif in_match(m.user.last_nick)
|
40
|
+
@matches.each do |m|
|
41
|
+
i = m[:team1].index(m.user.last_nick)
|
42
|
+
if i != nil
|
43
|
+
m[:team1].delete_at(i)
|
44
|
+
m[:team1] << m.user.nick
|
45
|
+
end
|
46
|
+
i = m[:team2].index(m.user.last_nick)
|
47
|
+
if i != nil
|
48
|
+
m[:team2].delete_at(i)
|
49
|
+
m[:team2] << m.user.nick
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
match "add", method: :add_to_queue
|
56
|
+
def add_to_queue(m)
|
57
|
+
unless @queue.key?(m.user.nick) or in_match(m.user.nick)
|
58
|
+
@queue[m.user.nick] = SymbolTable.new({
|
59
|
+
:user => m.user,
|
60
|
+
:channel => m.channel,
|
61
|
+
:message => m.message,
|
62
|
+
:joined_at => Time.now
|
63
|
+
})
|
64
|
+
send_channels_msg "Added #{m.user.nick} to queue (5v5 CTF) [#{@queue.length}]"
|
65
|
+
check_for_new_match(m)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
match "rem", method: :remove_from_queue
|
70
|
+
def remove_from_queue(m)
|
71
|
+
if @queue.key?(m.user.nick)
|
72
|
+
@queue.delete(m.user.nick)
|
73
|
+
send_channels_msg "Removed #{m.user.nick} from queue (5v5 CTF) [#{@queue.length}]"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
match "list", method: :list_queue
|
78
|
+
def list_queue(m)
|
79
|
+
users = []
|
80
|
+
@queue.each do |n,u|
|
81
|
+
users << n
|
82
|
+
end
|
83
|
+
m.user.send "Queue (5v5 CTF) [#{@queue.length}] #{users.join(", ")}"
|
84
|
+
end
|
85
|
+
|
86
|
+
match "status", method: :status
|
87
|
+
def status(m)
|
88
|
+
m.reply "Matches in progress: #{@matches.length.to_s}"
|
89
|
+
end
|
90
|
+
|
91
|
+
match "end", method: :end_match
|
92
|
+
def end_match(m)
|
93
|
+
@matches.each do |k,match|
|
94
|
+
info = match[:server].info
|
95
|
+
if info
|
96
|
+
players_on = info[:serverStatus][:playerList].length
|
97
|
+
if players_on > 0
|
98
|
+
m.reply "Cannot end a match for #{match[:server][:ip]} in progress, there are #{players_on.to_s} players still playing!"
|
99
|
+
else
|
100
|
+
@matches.shift
|
101
|
+
send_channels_msg("Match at #{match[:server][:ip]} finished!")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def in_match(nick)
|
108
|
+
playing = false
|
109
|
+
@matches.each do |m|
|
110
|
+
playing = true if (m[:team1].include?(nick) or m[:team2].include?(nick))
|
111
|
+
end
|
112
|
+
playing
|
113
|
+
end
|
114
|
+
|
115
|
+
def check_for_new_match(m)
|
116
|
+
if @queue.length >= KAG::Config.instance[:match_size]
|
117
|
+
playing = []
|
118
|
+
@queue.each do |n,i|
|
119
|
+
playing << n
|
120
|
+
end
|
121
|
+
|
122
|
+
server = get_unused_server
|
123
|
+
unless server
|
124
|
+
send_channels_msg "Could not find any available servers!"
|
125
|
+
debug "FAILED TO FIND UNUSED SERVER"
|
126
|
+
return false
|
127
|
+
end
|
128
|
+
|
129
|
+
@queue = {}
|
130
|
+
playing.shuffle!
|
131
|
+
match_size = KAG::Config.instance[:match_size].to_i
|
132
|
+
match_size = 2 if match_size < 2
|
133
|
+
|
134
|
+
lb = (match_size / 2).ceil.to_i - 1
|
135
|
+
lb = 1 if lb < 1
|
136
|
+
|
137
|
+
(match_size-1).times { |x| playing << "player#{(x+1).to_s}" } if KAG::Config.instance[:debug]
|
138
|
+
|
139
|
+
debug "MATCH SIZE #{match_size.to_s}"
|
140
|
+
debug "LOWER BOUND: #{lb.to_s}"
|
141
|
+
debug "PLAYERS: #{playing.join(",")}"
|
142
|
+
|
143
|
+
team1 = playing.slice(0,lb)
|
144
|
+
team2 = playing.slice(lb,match_size)
|
145
|
+
|
146
|
+
send_channels_msg("MATCH: #{team1.join(", ")} (Blue) vs #{team2.join(", ")} (Red)")
|
147
|
+
msg = "Join \x0307#{server[:ip]}:#{server[:port]} password #{server[:password]} \x0310| Visit \x0307kag://#{server[:ip]}/#{server[:password]} \x0310| "
|
148
|
+
team1.each do |p|
|
149
|
+
User(p).send(msg+" Blue Team #{team1.join(", ")}") unless p.include?("player")
|
150
|
+
end
|
151
|
+
team2.each do |p|
|
152
|
+
User(p).send(msg+" Red Team #{team2.join(", ")}") unless p.include?("player")
|
153
|
+
end
|
154
|
+
|
155
|
+
@matches[server[:key]] = {
|
156
|
+
:team1 => team1,
|
157
|
+
:team2 => team2,
|
158
|
+
:server => server
|
159
|
+
}
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def send_channels_msg(msg)
|
164
|
+
KAG::Config.instance[:channels].each do |c|
|
165
|
+
Channel(c).send(msg)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def get_unused_server
|
170
|
+
used_servers = []
|
171
|
+
@matches.each do |k,m|
|
172
|
+
used_servers << k
|
173
|
+
end
|
174
|
+
available_servers = KAG::Config.instance[:servers]
|
175
|
+
available_servers.each do |k,s|
|
176
|
+
unless used_servers.include?(k)
|
177
|
+
s[:key] = k
|
178
|
+
return KAG::Server.new(s)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
false
|
182
|
+
end
|
183
|
+
|
184
|
+
# admin methods
|
185
|
+
|
186
|
+
def debug(msg)
|
187
|
+
if KAG::Config.instance[:debug]
|
188
|
+
puts msg
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def is_admin(user)
|
193
|
+
user.refresh
|
194
|
+
o = (KAG::Config.instance[:owners] or [])
|
195
|
+
o.include?(user.authname)
|
196
|
+
end
|
197
|
+
|
198
|
+
match "quit", method: :quit
|
199
|
+
def quit(m)
|
200
|
+
if is_admin(m.user)
|
201
|
+
m.bot.quit("Shutting down...")
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
end
|
data/lib/kag/server.rb
ADDED
data/lib/kag/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kag-gather
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 1.0.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Shaun McCormick
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cinch
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 2.0.4
|
21
|
+
none: false
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.4
|
27
|
+
none: false
|
28
|
+
prerelease: false
|
29
|
+
type: :runtime
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: json
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - '='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 1.7.6
|
37
|
+
none: false
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - '='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.7.6
|
43
|
+
none: false
|
44
|
+
prerelease: false
|
45
|
+
type: :runtime
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: symboltable
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - '='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.0.2
|
53
|
+
none: false
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 1.0.2
|
59
|
+
none: false
|
60
|
+
prerelease: false
|
61
|
+
type: :runtime
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: jruby-openssl
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
none: false
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
none: false
|
76
|
+
prerelease: false
|
77
|
+
type: :runtime
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: kagerator
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - '='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.0.2
|
85
|
+
none: false
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.0.2
|
91
|
+
none: false
|
92
|
+
prerelease: false
|
93
|
+
type: :runtime
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
version_requirements: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
none: false
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ! '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
none: false
|
108
|
+
prerelease: false
|
109
|
+
type: :development
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rspec
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
none: false
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ! '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
none: false
|
124
|
+
prerelease: false
|
125
|
+
type: :development
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: guard-rspec
|
128
|
+
version_requirements: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
none: false
|
134
|
+
requirement: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ! '>='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
none: false
|
140
|
+
prerelease: false
|
141
|
+
type: :development
|
142
|
+
description: ''
|
143
|
+
email:
|
144
|
+
- splittingred@gmail.com
|
145
|
+
executables: []
|
146
|
+
extensions: []
|
147
|
+
extra_rdoc_files: []
|
148
|
+
files:
|
149
|
+
- README.md
|
150
|
+
- lib/kag/bot.rb
|
151
|
+
- lib/kag/config.rb
|
152
|
+
- lib/kag/gather.rb
|
153
|
+
- lib/kag/server.rb
|
154
|
+
- lib/kag/version.rb
|
155
|
+
homepage: https://github.com/splittingred/kag-gather
|
156
|
+
licenses:
|
157
|
+
- GPLv2
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ! '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 1.9.2
|
167
|
+
none: false
|
168
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ! '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 1.3.6
|
173
|
+
none: false
|
174
|
+
requirements: []
|
175
|
+
rubyforge_project:
|
176
|
+
rubygems_version: 1.8.25
|
177
|
+
signing_key:
|
178
|
+
specification_version: 3
|
179
|
+
summary: KAG Gather IRC Bot
|
180
|
+
test_files: []
|
181
|
+
has_rdoc:
|
182
|
+
...
|