PerfectlyNormal-Flexo 0.4.2 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/flexo +0 -0
- data/bin/mkflexorc +2 -4
- data/flexo.gemspec +3 -3
- data/lib/flexo/data.rb +1 -5
- data/lib/flexo/dispatcher.rb +21 -0
- data/lib/flexo/errors.rb +4 -0
- data/lib/flexo/events/reply.rb +2 -2
- data/lib/flexo/handler.rb +1 -1
- data/lib/flexo/manager.rb +5 -6
- data/lib/flexo/plugin.rb +11 -0
- data/lib/flexo/pluginmanager.rb +10 -0
- data/lib/flexo/server.rb +18 -8
- data/plugins/auth.rb +39 -5
- metadata +3 -3
data/bin/flexo
CHANGED
File without changes
|
data/bin/mkflexorc
CHANGED
data/flexo.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "Flexo"
|
3
|
-
s.version = "0.4.
|
4
|
-
s.date = "2008-
|
3
|
+
s.version = "0.4.4"
|
4
|
+
s.date = "2008-12-25"
|
5
5
|
s.author = "Per Christian B. Viken"
|
6
6
|
s.email = "perchr@northblue.org"
|
7
|
-
s.homepage = "http://eastblue.org/
|
7
|
+
s.homepage = "http://eastblue.org/projects/flexo/"
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.summary = "A simple, extensible IRC bot based on Flux"
|
10
10
|
s.files = ["README",
|
data/lib/flexo/data.rb
CHANGED
data/lib/flexo/dispatcher.rb
CHANGED
@@ -72,10 +72,12 @@ module Flexo
|
|
72
72
|
def subscribe(event, &block)
|
73
73
|
if event.is_a?(Symbol) || event.kind_of?(String)
|
74
74
|
if (e = event.to_s) =~ /^(?:RPL|ERR)_/i
|
75
|
+
@manager.logger.debug "Subscribing to a ReplyEvent (#{e})"
|
75
76
|
event = Flexo::Events::ReplyEvent[e.upcase]
|
76
77
|
else
|
77
78
|
match = e.match(/^(.+?)(?:_?event)?$/i)
|
78
79
|
event = Flexo::Events.const_get("#{match[1].capitalize}Event")
|
80
|
+
@manager.logger.debug "Subscribing to a #{match[1].capitalize}Event (else)"
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
@@ -86,6 +88,7 @@ module Flexo
|
|
86
88
|
numeric = false
|
87
89
|
end
|
88
90
|
|
91
|
+
@manager.logger.debug "Creating a handler against #{numeric.to_s}"
|
89
92
|
handler = Handler.new(numeric, &block)
|
90
93
|
@manager.mutex do
|
91
94
|
@handlers[event] ||= []
|
@@ -105,6 +108,24 @@ module Flexo
|
|
105
108
|
|
106
109
|
@manager.logger.debug("Handler #{handler} removed")
|
107
110
|
end
|
111
|
+
|
112
|
+
# Waits for a specified amount of time, which defaults to 60.
|
113
|
+
# If the chosen event isn't receieved within that time, a TimeoutError
|
114
|
+
# is raised.
|
115
|
+
def await(event, opts = {}, &block)
|
116
|
+
opts = {:timeout => 60}.merge(opts)
|
117
|
+
queue = Queue.new
|
118
|
+
handler = subscribe(event) do |e|
|
119
|
+
queue << e
|
120
|
+
block.call(e) if block_given?
|
121
|
+
end
|
122
|
+
|
123
|
+
begin
|
124
|
+
Timeout.timeout(opts[:timeout], Flexo::TimeoutError) { queue.shift }
|
125
|
+
ensure
|
126
|
+
unsubscribe(handler)
|
127
|
+
end
|
128
|
+
end
|
108
129
|
|
109
130
|
# Easy way to add a trigger.
|
110
131
|
# See Flexo::Trigger for documentation
|
data/lib/flexo/errors.rb
CHANGED
@@ -6,6 +6,10 @@ module Flexo
|
|
6
6
|
# Raised when the configuration is invalid, and there's no way to recover
|
7
7
|
class InvalidConfigurationException < Error
|
8
8
|
end
|
9
|
+
|
10
|
+
# Error raised when calls to Dispatcher.await times out
|
11
|
+
class TimeoutError < Error
|
12
|
+
end
|
9
13
|
|
10
14
|
# Raised when a plugin is missing a required dependency
|
11
15
|
class PluginDependencyError < Error
|
data/lib/flexo/events/reply.rb
CHANGED
@@ -22,8 +22,8 @@ module Flexo
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def self.[](reply)
|
25
|
-
n = (reply =~ /^\d+$/ || reply.kind_of?(Integer)) ? reply.to_i : Numerics.const_get(reply)
|
26
|
-
Numeric.new(n)
|
25
|
+
n = (reply =~ /^\d+$/ || reply.kind_of?(Integer)) ? reply.to_i : Flexo::Numerics.const_get(reply)
|
26
|
+
Flexo::Events::ReplyEvent::Numeric.new(n)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
data/lib/flexo/handler.rb
CHANGED
@@ -22,7 +22,7 @@ module Flexo
|
|
22
22
|
# aptly named 'call', is called, the block passed
|
23
23
|
# as block when creating this instance, is executed.
|
24
24
|
def call(event)
|
25
|
-
if !@numeric || event.class == ReplyEvent && @numeric == event.numeric
|
25
|
+
if !@numeric || event.class == Flexo::Events::ReplyEvent && @numeric == event.numeric
|
26
26
|
@manager.thread { @block.call(event) }
|
27
27
|
end
|
28
28
|
end
|
data/lib/flexo/manager.rb
CHANGED
@@ -33,9 +33,6 @@ module Flexo
|
|
33
33
|
|
34
34
|
# Create everything
|
35
35
|
def setup
|
36
|
-
return if @setup == true
|
37
|
-
@setup = true
|
38
|
-
|
39
36
|
@config = Flexo::Config.new
|
40
37
|
raise InvalidConfigurationException unless @config.valid?
|
41
38
|
|
@@ -96,9 +93,11 @@ module Flexo
|
|
96
93
|
end
|
97
94
|
end
|
98
95
|
}
|
99
|
-
|
100
|
-
|
101
|
-
|
96
|
+
|
97
|
+
while(!@server.welcomed) do
|
98
|
+
@logger.debug "Not welcomed, sleeping"
|
99
|
+
sleep 0.5
|
100
|
+
end
|
102
101
|
|
103
102
|
@logger.info "Joining channels"
|
104
103
|
@config['core.channels'].each do |channel|
|
data/lib/flexo/plugin.rb
CHANGED
@@ -62,6 +62,17 @@ module Flexo
|
|
62
62
|
super
|
63
63
|
end
|
64
64
|
|
65
|
+
# Searches loaded plugins for a method. Used by plugins to see if
|
66
|
+
# certain optional functionality is available, instead of adding
|
67
|
+
# the plugin providing the function as a requirement.
|
68
|
+
def has_method?(method)
|
69
|
+
@plugins.each do |name, plugin|
|
70
|
+
return true if plugin.respond_to?(method)
|
71
|
+
end
|
72
|
+
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
|
65
76
|
# Synchronize mutex
|
66
77
|
def mutex
|
67
78
|
@manager.pluginmutex { yield }
|
data/lib/flexo/pluginmanager.rb
CHANGED
@@ -113,6 +113,16 @@ module Flexo
|
|
113
113
|
klass = @plugins_loaded[plugin]
|
114
114
|
@manager.mutex { @plugins_loaded.delete(plugin) }
|
115
115
|
klass.unload
|
116
|
+
|
117
|
+
# Every file we load ends up in $". Require checks there, and if it's there,
|
118
|
+
# it doesn't reload the file. So to force tthe removal of the plugin,
|
119
|
+
# we remove the class from the object space, and from the array
|
120
|
+
@plugins_path.each do |p|
|
121
|
+
file = File.expand_path(File.join(p, "#{plugin.downcase}.rb"))
|
122
|
+
$".delete file
|
123
|
+
end
|
124
|
+
|
125
|
+
Object.send :remove_const, klass.name if klass
|
116
126
|
end
|
117
127
|
end
|
118
128
|
end
|
data/lib/flexo/server.rb
CHANGED
@@ -10,11 +10,13 @@ module Flexo
|
|
10
10
|
attr_reader :thread
|
11
11
|
attr_reader :server
|
12
12
|
attr_reader :nickname
|
13
|
+
attr_reader :welcomed
|
13
14
|
|
14
15
|
def initialize
|
15
16
|
@manager = Flexo::Manager.instance
|
16
17
|
@socket = nil
|
17
18
|
@server = nil
|
19
|
+
@welcomed = false
|
18
20
|
end
|
19
21
|
|
20
22
|
def setup
|
@@ -126,19 +128,27 @@ module Flexo
|
|
126
128
|
|
127
129
|
# First, we add a handler to fix things
|
128
130
|
# if our nickname is taken
|
129
|
-
nicktaken = @manager.dispatcher.subscribe(
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
@manager.nickname = nick
|
135
|
-
end
|
131
|
+
nicktaken = @manager.dispatcher.subscribe(:ERR_NICKNAMEINUSE) do
|
132
|
+
nick = config['core.nick'].shift
|
133
|
+
quote "NICK #{nick}"
|
134
|
+
@manager.logger.info("Nickname taken, trying #{nick}")
|
135
|
+
@manager.nickname = nick
|
136
136
|
end
|
137
137
|
|
138
138
|
nick = config['core.nick'].shift
|
139
139
|
@manager.sender.nick nick
|
140
140
|
@manager.sender.user config['core.username'], 0, config['core.realname']
|
141
|
-
|
141
|
+
|
142
|
+
@manager.thread do
|
143
|
+
@manager.dispatcher.await(:RPL_WELCOME, :timeout => 30) do |reply|
|
144
|
+
@manager.mutex do
|
145
|
+
@manager.nickname = nick
|
146
|
+
@manager.logger.debug "Welcomed!"
|
147
|
+
@welcomed = true
|
148
|
+
end
|
149
|
+
@manager.dispatcher.unsubscribe(nicktaken)
|
150
|
+
end
|
151
|
+
end
|
142
152
|
end
|
143
153
|
|
144
154
|
# Disconnects from the server
|
data/plugins/auth.rb
CHANGED
@@ -22,10 +22,12 @@ module Flexo
|
|
22
22
|
@default_level = 0
|
23
23
|
|
24
24
|
add_trigger(/^user register ([a-zA-Z][a-zA-Z0-9_-]*) (\S+)$/, &method(:cmd_register))
|
25
|
-
add_trigger(/^user
|
25
|
+
add_trigger(/^user mask add ([a-zA-Z][a-zA-Z0-9_-]*) (\S+)$/, &method(:cmd_addmask))
|
26
26
|
|
27
27
|
add_restricted_trigger(/^user change ([a-zA-Z][a-zA-Z0-9_-]*) (\d{1,3})$/, :level => 256, &method(:cmd_changelevel))
|
28
28
|
add_restricted_trigger(/^user remove ([a-zA-Z][a-zA-Z0-9_-]*)$/, :level => 256, &method(:cmd_remove))
|
29
|
+
add_restricted_trigger(/^user forceregister ([a-zA-Z][a-zA-Z0-9_-]*) (\S+)$/, :level => 256, &method(:cmd_admin_register))
|
30
|
+
add_restricted_trigger(/^user mask forceadd ([a-zA-Z][a-zA-Z0-9_-]*) ([a-zA-Z][a-zA-Z0-9_-]*) (\S+)$/, :level => 256, &method(:cmd_admin_addmask))
|
29
31
|
add_trigger(/^user lookup ([a-zA-Z][a-zA-Z0-9_-]*)$/, &method(:cmd_lookup))
|
30
32
|
|
31
33
|
@db = pstore_open("#{@manager.config.path}/user.db")
|
@@ -148,7 +150,7 @@ module Flexo
|
|
148
150
|
tmpuser = {
|
149
151
|
:username => user,
|
150
152
|
:password => Digest::MD5.hexdigest(pass).to_s,
|
151
|
-
:hostmasks => [[nick, host]],
|
153
|
+
:hostmasks => nick != nil ? [[nick, host]] : [],
|
152
154
|
:level => level.to_i
|
153
155
|
}
|
154
156
|
|
@@ -164,6 +166,19 @@ module Flexo
|
|
164
166
|
end
|
165
167
|
end
|
166
168
|
|
169
|
+
# Triggered when a superuser registers another user
|
170
|
+
def cmd_admin_register(privmsg, username, password)
|
171
|
+
@manager.logger.debug "AuthPlugin: Going to register #{username} (admin)"
|
172
|
+
p = privmsg
|
173
|
+
return notify_cannot_register_in_public(p) if privmsg.to_channel?
|
174
|
+
return notify_username_taken(p) if username_exists?(username)
|
175
|
+
|
176
|
+
register(username, password, nil, nil, @default_level.to_i)
|
177
|
+
|
178
|
+
privmsg.reply("Successfully registered #{username}", false)
|
179
|
+
privmsg.reply("No hostmask has been added for that user", false)
|
180
|
+
end
|
181
|
+
|
167
182
|
# Triggered when a user tries to register via a privmsg
|
168
183
|
def cmd_register(privmsg, username, password)
|
169
184
|
@manager.logger.debug "AuthPlugin: Going to register #{username}"
|
@@ -180,6 +195,17 @@ module Flexo
|
|
180
195
|
privmsg.reply("You have been added as a master!", false) if master
|
181
196
|
end
|
182
197
|
|
198
|
+
# Triggered when a superuser adds a hostmask to a user
|
199
|
+
def cmd_admin_addmask(privmsg, username, nick, mask)
|
200
|
+
@manager.logger.debug "AuthPlugin: Adding a mask to #{username} (admin)"
|
201
|
+
p = privmsg
|
202
|
+
return notify_incorrect_information(p) if (!username_exists?(username))
|
203
|
+
return notify_hostmask_taken(p) if hostmask_exists?(nick, mask)
|
204
|
+
|
205
|
+
addmask(username, nick, mask)
|
206
|
+
privmsg.reply "Successfully added the new mask to #{username}"
|
207
|
+
end
|
208
|
+
|
183
209
|
# Triggered when a user wants to add a new hostmask to themselves
|
184
210
|
def cmd_addmask(privmsg, username, password)
|
185
211
|
@manager.logger.debug "AuthPlugin: Adding a mask to #{username}"
|
@@ -224,13 +250,21 @@ module Flexo
|
|
224
250
|
return notify_user_not_found(privmsg)
|
225
251
|
end
|
226
252
|
|
227
|
-
|
253
|
+
user = nil
|
228
254
|
|
229
255
|
@db.transaction do |pstore|
|
230
|
-
|
256
|
+
user = pstore[:users][username.downcase]
|
231
257
|
end
|
232
258
|
|
233
|
-
|
259
|
+
privmsg.reply "#{username} has a level of #{user[:level].to_s}"
|
260
|
+
|
261
|
+
srcuser = get_user_from_hostmask(privmsg.sender, privmsg.data.hostmask.hostname)
|
262
|
+
if(srcuser && srcuser[:level] > 1)
|
263
|
+
privmsg.reply "Registered nick/hostmask-combinations:"
|
264
|
+
user[:hostmasks].each do |nick,host|
|
265
|
+
privmsg.reply " #{nick}@#{host}"
|
266
|
+
end
|
267
|
+
end
|
234
268
|
end
|
235
269
|
|
236
270
|
# Convenience function for errors
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: PerfectlyNormal-Flexo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Per Christian B. Viken
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-25 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -64,7 +64,7 @@ files:
|
|
64
64
|
- plugins/dbus.rb
|
65
65
|
- plugins/svnlookup.rb
|
66
66
|
has_rdoc: true
|
67
|
-
homepage: http://eastblue.org/
|
67
|
+
homepage: http://eastblue.org/projects/flexo/
|
68
68
|
post_install_message:
|
69
69
|
rdoc_options: []
|
70
70
|
|