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 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
+ ...