kag-gather 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # KAGGather for Ruby
2
+
3
+ KAG Gather IRC bot in Ruby
4
+
5
+ ## Usage
6
+
7
+ First setup config file by copying config/config.sample.json to config/config.json.
8
+
9
+ Then run:
10
+
11
+ `ruby gather.rb`
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
@@ -0,0 +1,13 @@
1
+ require 'cinch'
2
+ require 'symboltable'
3
+ require 'json'
4
+ require 'kagerator'
5
+ require File.dirname(__FILE__)+'/config'
6
+
7
+ module KAG
8
+ class Server < SymbolTable
9
+ def info
10
+ Kagerator.server(self[:ip],self[:port])
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ module KAG
2
+ VERSION = '1.0.0'
3
+ def self.version
4
+ VERSION
5
+ end
6
+ end
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
+ ...