bitbckt-botbckt 0.4.0 → 0.4.2
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/Rakefile +6 -0
- data/VERSION.yml +1 -1
- data/lib/botbckt/bot.rb +58 -21
- data/lib/botbckt/cmd.rb +1 -1
- data/lib/botbckt/command.rb +24 -1
- data/lib/botbckt/irc.rb +2 -2
- data/lib/botbckt/store.rb +29 -3
- data/lib/botbckt.rb +1 -1
- metadata +55 -5
data/Rakefile
CHANGED
@@ -15,6 +15,12 @@ begin
|
|
15
15
|
g.homepage = 'http://github.com/bitbckt/botbckt'
|
16
16
|
g.description = 'Boredom strikes on Sunday mornings.'
|
17
17
|
g.authors = ['Brandon Mitchell']
|
18
|
+
g.executables << 'botbckt'
|
19
|
+
g.add_dependency('eventmachine', '>= 0.12.0')
|
20
|
+
g.add_dependency('activesupport')
|
21
|
+
g.add_dependency('json', '>= 1.1.2')
|
22
|
+
g.add_dependency('hpricot', '>= 0.6')
|
23
|
+
g.add_dependency('em-redis', '>= 0.1.1')
|
18
24
|
end
|
19
25
|
rescue LoadError
|
20
26
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
data/VERSION.yml
CHANGED
data/lib/botbckt/bot.rb
CHANGED
@@ -11,6 +11,7 @@ module Botbckt #:nodoc:
|
|
11
11
|
|
12
12
|
attr_accessor :logger
|
13
13
|
attr_accessor :store
|
14
|
+
attr_accessor :connection
|
14
15
|
|
15
16
|
# ==== Parameters
|
16
17
|
# options<Hash{Symbol => String,Integer}>
|
@@ -29,32 +30,21 @@ module Botbckt #:nodoc:
|
|
29
30
|
# :backend_port<Integer>:: The port used by the Redis store. Optional.
|
30
31
|
#
|
31
32
|
def self.start(options)
|
32
|
-
|
33
|
-
self.instance.logger = ActiveSupport::BufferedLogger.new options.delete(:log) || 'botbckt.log',
|
34
|
-
options.delete(:log_level) || INFO
|
35
|
-
|
36
|
-
host, port = options.delete(:backend_host), options.delete(:backend_port)
|
37
33
|
daemonize = options.delete(:daemonize)
|
38
34
|
pid = options.delete(:pid) || 'botbckt.pid'
|
39
35
|
|
40
36
|
if daemonize || daemonize.nil?
|
41
37
|
EventMachine::fork_reactor do
|
42
|
-
|
43
|
-
|
44
|
-
if host && port
|
45
|
-
self.instance.store = Store.new(host, port)
|
46
|
-
end
|
38
|
+
start!
|
47
39
|
|
48
40
|
if pid
|
49
|
-
File.open(pid, 'w'){ |
|
41
|
+
File.open(pid, 'w') { |file| file.write("#{Process.pid}") }
|
50
42
|
at_exit { File.delete(pid) if File.exist?(pid) }
|
51
43
|
end
|
52
44
|
|
53
45
|
end
|
54
46
|
else
|
55
|
-
EventMachine::run
|
56
|
-
Botbckt::IRC.connect(options)
|
57
|
-
end
|
47
|
+
EventMachine::run { start! }
|
58
48
|
end
|
59
49
|
end
|
60
50
|
|
@@ -75,6 +65,14 @@ module Botbckt #:nodoc:
|
|
75
65
|
@commands
|
76
66
|
end
|
77
67
|
|
68
|
+
# Sets the key to the given value, creating the key if necessary.
|
69
|
+
#
|
70
|
+
# ==== Parameters
|
71
|
+
# key<String>:: The identifier for this value. Required.
|
72
|
+
# value<Object>:: The value to store at the key. Required.
|
73
|
+
# &block:: A callback to execute after the value is stored. The block should
|
74
|
+
# take a single parameter: the value stored. Optional.
|
75
|
+
#
|
78
76
|
#--
|
79
77
|
# TODO: Forwardable?
|
80
78
|
#++
|
@@ -82,6 +80,13 @@ module Botbckt #:nodoc:
|
|
82
80
|
self.store && self.store.set(key, value, &block)
|
83
81
|
end
|
84
82
|
|
83
|
+
# Retrieves the value stored at key. Returns nil if the key does not exist.
|
84
|
+
#
|
85
|
+
# ==== Parameters
|
86
|
+
# key<String>:: The identifier to retrieve. Required.
|
87
|
+
# &block:: A callback to execute after the value is retrieved. The block should
|
88
|
+
# take a single parameter: the value retrieved. Required.
|
89
|
+
#
|
85
90
|
#--
|
86
91
|
# TODO: Forwardable?
|
87
92
|
#++
|
@@ -89,6 +94,14 @@ module Botbckt #:nodoc:
|
|
89
94
|
self.store && self.store.get(key, &block)
|
90
95
|
end
|
91
96
|
|
97
|
+
# Increments the value stored at key by 1, creating the key and initializing
|
98
|
+
# it to 0 if necessary.
|
99
|
+
#
|
100
|
+
# ==== Parameters
|
101
|
+
# key<String>:: The identifier whose value should be incremented. Required.
|
102
|
+
# &block:: A callback to execute after the value is stored. The block should
|
103
|
+
# take a single parameter: the value stored. Optional.
|
104
|
+
#
|
92
105
|
#--
|
93
106
|
# TODO: Forwardable?
|
94
107
|
#++
|
@@ -106,7 +119,7 @@ module Botbckt #:nodoc:
|
|
106
119
|
# TODO: Before/after callbacks?
|
107
120
|
#++
|
108
121
|
def run(command, sender, channel, *args)
|
109
|
-
callable = commands[command.to_sym]
|
122
|
+
callable = commands[command.to_sym] || raise("Unregistered command called. (#{command})")
|
110
123
|
|
111
124
|
if callable.is_a?(Class)
|
112
125
|
# Callables are Singletons; we use #create! as a convention to give
|
@@ -114,9 +127,14 @@ module Botbckt #:nodoc:
|
|
114
127
|
callable = callable.create!(sender, channel, *args)
|
115
128
|
end
|
116
129
|
|
117
|
-
callable.respond_to?(:call)
|
118
|
-
|
119
|
-
|
130
|
+
if callable.respond_to?(:call)
|
131
|
+
callable.call(sender, channel, *args)
|
132
|
+
else
|
133
|
+
raise("Non-callable used as command. (#{command})")
|
134
|
+
end
|
135
|
+
|
136
|
+
rescue StandardError => error
|
137
|
+
log "ERROR:\n#{error.inspect}\n#{error.backtrace}", DEBUG
|
120
138
|
say Bot.befuddled, channel
|
121
139
|
end
|
122
140
|
|
@@ -140,17 +158,36 @@ module Botbckt #:nodoc:
|
|
140
158
|
end
|
141
159
|
|
142
160
|
# ==== Parameters
|
143
|
-
# msg<String>:: A message to send to the channel
|
161
|
+
# msg<String>:: A message to send to the channel. Required.
|
144
162
|
# channel<String>:: The channel to send the message. Required.
|
145
163
|
#
|
146
164
|
def say(msg, channel)
|
147
|
-
|
165
|
+
self.connection.say msg, channel
|
148
166
|
end
|
149
167
|
|
150
|
-
|
168
|
+
# ==== Parameters
|
169
|
+
# msg<String>:: A message to log. Required.
|
170
|
+
# level<Integer>:: The minimum log level at which to log this message. Defaults to INFO.
|
171
|
+
#
|
172
|
+
def log(msg, level = INFO)
|
151
173
|
self.logger.add(level, msg)
|
152
174
|
end
|
153
175
|
|
176
|
+
private
|
177
|
+
|
178
|
+
def self.start!(options) #:nodoc:
|
179
|
+
self.instance.logger = ActiveSupport::BufferedLogger.new options.delete(:log) || 'botbckt.log',
|
180
|
+
options.delete(:log_level) || INFO
|
181
|
+
|
182
|
+
host, port = options.delete(:backend_host), options.delete(:backend_port)
|
183
|
+
|
184
|
+
if host && port
|
185
|
+
self.instance.store = Store.new(host, port)
|
186
|
+
end
|
187
|
+
|
188
|
+
self.instance.connection = Botbckt::IRC.connect(options.merge(:bot => self.instance))
|
189
|
+
end
|
190
|
+
|
154
191
|
end
|
155
192
|
|
156
193
|
end
|
data/lib/botbckt/cmd.rb
CHANGED
data/lib/botbckt/command.rb
CHANGED
@@ -49,7 +49,7 @@ module Botbckt #:nodoc:
|
|
49
49
|
# channel<String>:: The channel to send the message. Required.
|
50
50
|
#
|
51
51
|
def self.say(msg, channel)
|
52
|
-
Botbckt::Bot.instance.say(msg, channel)
|
52
|
+
Botbckt::Bot.instance.say(msg, channel)
|
53
53
|
end
|
54
54
|
|
55
55
|
# Proxy for Command.say
|
@@ -58,14 +58,37 @@ module Botbckt #:nodoc:
|
|
58
58
|
self.class.say(msg, channel)
|
59
59
|
end
|
60
60
|
|
61
|
+
# Sets the key to the given value, creating the key if necessary.
|
62
|
+
#
|
63
|
+
# ==== Parameters
|
64
|
+
# key<String>:: The identifier for this value. Required.
|
65
|
+
# value<Object>:: The value to store at the key. Required.
|
66
|
+
# &block:: A callback to execute after the value is stored. The block should
|
67
|
+
# take a single parameter: the value stored. Optional.
|
68
|
+
#
|
61
69
|
def set(key, value, &block)
|
62
70
|
Botbckt::Bot.instance.set(key, value, &block)
|
63
71
|
end
|
64
72
|
|
73
|
+
# Retrieves the value stored at key. Returns nil if the key does not exist.
|
74
|
+
#
|
75
|
+
# ==== Parameters
|
76
|
+
# key<String>:: The identifier to retrieve. Required.
|
77
|
+
# &block:: A callback to execute after the value is retrieved. The block should
|
78
|
+
# take a single parameter: the value retrieved. Required.
|
79
|
+
#
|
65
80
|
def get(key, &block)
|
66
81
|
Botbckt::Bot.instance.get(key, &block)
|
67
82
|
end
|
68
83
|
|
84
|
+
# Increments the value stored at key by 1, creating the key and initializing
|
85
|
+
# it to 0 if necessary.
|
86
|
+
#
|
87
|
+
# ==== Parameters
|
88
|
+
# key<String>:: The identifier whose value should be incremented. Required.
|
89
|
+
# &block:: A callback to execute after the value is stored. The block should
|
90
|
+
# take a single parameter: the value stored. Optional.
|
91
|
+
#
|
69
92
|
def increment!(key, &block)
|
70
93
|
Botbckt::Bot.instance.increment!(key, &block)
|
71
94
|
end
|
data/lib/botbckt/irc.rb
CHANGED
@@ -60,7 +60,7 @@ module Botbckt #:nodoc:
|
|
60
60
|
args << $5.squish if $5
|
61
61
|
|
62
62
|
# run args: command, sender, channel, optional args
|
63
|
-
|
63
|
+
self.config.bot.run($4, *args)
|
64
64
|
else
|
65
65
|
log line
|
66
66
|
end
|
@@ -76,7 +76,7 @@ module Botbckt #:nodoc:
|
|
76
76
|
private
|
77
77
|
|
78
78
|
def log(msg, level = Botbckt::Bot::INFO) #:nodoc:
|
79
|
-
|
79
|
+
self.config.bot.log msg, level
|
80
80
|
end
|
81
81
|
|
82
82
|
def command(*cmd) #:nodoc:
|
data/lib/botbckt/store.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'em-redis'
|
2
|
-
|
3
1
|
module Botbckt #:nodoc:
|
4
2
|
|
5
3
|
# Implements a basic key/value store API for cross-session state storage.
|
@@ -11,18 +9,46 @@ module Botbckt #:nodoc:
|
|
11
9
|
|
12
10
|
attr_accessor :backend
|
13
11
|
|
12
|
+
# ==== Parameters
|
13
|
+
# host<String>:: IP address or hostname of the Redis server. Required.
|
14
|
+
# port<Integer>:: Port the Redis server is listening on. Required.
|
15
|
+
#
|
14
16
|
def initialize(host, port)
|
15
17
|
self.backend = EventMachine::Protocols::Redis.connect(host, port)
|
16
18
|
end
|
17
19
|
|
20
|
+
# Sets the key to the given value, creating the key if necessary.
|
21
|
+
#
|
22
|
+
# ==== Parameters
|
23
|
+
# key<String>:: The identifier for this value. Required.
|
24
|
+
# value<Object>:: The value to store at the key. Required.
|
25
|
+
# &block:: A callback to execute after the value is stored. The block should
|
26
|
+
# take a single parameter: the value stored. Optional.
|
27
|
+
#
|
18
28
|
def set(key, value, &block)
|
19
29
|
backend.set(key, value, &block)
|
20
30
|
end
|
21
|
-
|
31
|
+
|
32
|
+
# Retrieves the value stored at key. Returns nil if the key does not exist.
|
33
|
+
#
|
34
|
+
# ==== Parameters
|
35
|
+
# key<String>:: The identifier to retrieve. Required.
|
36
|
+
# &block:: A callback to execute after the value is retrieved. The block should
|
37
|
+
# take a single parameter: the value retrieved. Required.
|
38
|
+
#
|
22
39
|
def get(key, &block)
|
40
|
+
return unless block_given?
|
23
41
|
backend.get(key, &block)
|
24
42
|
end
|
25
43
|
|
44
|
+
# Increments the value stored at key by 1, creating the key and initializing
|
45
|
+
# it to 0 if necessary.
|
46
|
+
#
|
47
|
+
# ==== Parameters
|
48
|
+
# key<String>:: The identifier whose value should be incremented. Required.
|
49
|
+
# &block:: A callback to execute after the value is stored. The block should
|
50
|
+
# take a single parameter: the value stored. Optional.
|
51
|
+
#
|
26
52
|
def increment!(key, &block)
|
27
53
|
backend.incr(key, &block)
|
28
54
|
end
|
data/lib/botbckt.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
%w{ rubygems eventmachine activesupport ostruct json open-uri cgi hpricot singleton optparse }.each { |lib| require lib }
|
1
|
+
%w{ rubygems eventmachine activesupport ostruct json open-uri cgi hpricot singleton optparse em-redis }.each { |lib| require lib }
|
2
2
|
%w{ irc store bot utilities command cmd }.each { |lib| require File.dirname(__FILE__) + "/botbckt/#{ lib }" }
|
3
3
|
Dir[File.dirname(__FILE__) + '/botbckt/commands/*'].each { |lib| require lib }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitbckt-botbckt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Mitchell
|
@@ -9,14 +9,64 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
13
|
-
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
12
|
+
date: 2009-06-24 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: eventmachine
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.12.0
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: json
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.1.2
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: hpricot
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0.6"
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: em-redis
|
57
|
+
type: :runtime
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.1.1
|
64
|
+
version:
|
16
65
|
description: Boredom strikes on Sunday mornings.
|
17
66
|
email: brandon@systemisdown.net
|
18
67
|
executables:
|
19
68
|
- botbckt
|
69
|
+
- botbckt
|
20
70
|
extensions: []
|
21
71
|
|
22
72
|
extra_rdoc_files:
|