zmb 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
data/bin/zmb CHANGED
@@ -28,7 +28,7 @@ class AdminUser
28
28
  end
29
29
 
30
30
  class Event
31
- attr_accessor :message, :user
31
+ attr_accessor :message, :user, :delegate
32
32
 
33
33
  def initialize(message)
34
34
  @message = message
@@ -46,6 +46,10 @@ class Event
46
46
  def reply(msg)
47
47
  puts "> #{msg}"
48
48
  end
49
+
50
+ def name
51
+ "admin"
52
+ end
49
53
  end
50
54
 
51
55
  def ask(question)
@@ -125,6 +129,11 @@ optparse = OptionParser.new do |opts|
125
129
  opts.on('-l', '--line LINE', 'Execute a command') do |line|
126
130
  options[:command] = line
127
131
  end
132
+
133
+ options[:fork] = false
134
+ opts.on('-f', '--fork', 'Detach (fork) ZMB (for use with -d daemon)') do
135
+ options[:fork] = true
136
+ end
128
137
  end
129
138
 
130
139
  optparse.parse!
@@ -182,5 +191,10 @@ if options[:shell] then
182
191
  end
183
192
 
184
193
  if options[:daemon] then
185
- zmb.run
194
+ if options[:fork] then
195
+ Process.detach(fork { STDOUT.reopen(File.open('/dev/null','w')); zmb.run })
196
+ puts "ZMB detached"
197
+ else
198
+ zmb.run
199
+ end
186
200
  end
data/lib/zmb.rb CHANGED
@@ -220,6 +220,7 @@ class Zmb
220
220
  'reset' => [:reset_command, 1, { :permission => 'admin' }],
221
221
  'addsource' => [:addource_command, 1, { :permission => 'admin' }],
222
222
  'refresh' => [:refresh_command, 1, { :permission => 'admin' }],
223
+ 'quit' => [:quit_command, 0, { :permission => 'admin' }],
223
224
  }
224
225
  end
225
226
 
@@ -323,4 +324,11 @@ class Zmb
323
324
  @plugin_manager.refresh_plugin_sources
324
325
  "Refreshed plugin sources"
325
326
  end
327
+
328
+ def quit_command(e)
329
+ e.reply "Quitting"
330
+ save
331
+ @running = false
332
+ instances.keys.each{ |i| unload(i) }
333
+ end
326
334
  end
@@ -97,6 +97,14 @@ class Array
97
97
 
98
98
  items.map{ |i, c| c == 1 ? i : "#{i} (#{c})" }.join(', ')
99
99
  end
100
+
101
+ def sum
102
+ inject {|result, element| result + element}
103
+ end
104
+
105
+ def avg
106
+ sum / count
107
+ end
100
108
  end
101
109
 
102
110
  class Hash
@@ -1,18 +1,27 @@
1
1
  class Commands
2
- attr_accessor :cmds, :cc
2
+ attr_accessor :cmds, :cc, :definitions
3
3
 
4
4
  def initialize(sender, s={})
5
5
  @delegate = sender
6
6
  @cmds = Hash.new
7
+ @definitions = Hash.new
7
8
 
8
9
  @cc = s['cc'] if s.has_key?('cc')
9
10
  @cc = '.' if @cc == nil
11
+ @definitions = s['definitions'] if s.has_key?('definitions')
10
12
 
11
13
  sender.instances.each{ |key, instance| plugin_loaded(key, instance) }
14
+
15
+ @definitions.each do |k,v|
16
+ @cmds[k] = {
17
+ :args => v[0],
18
+ :proc => (eval v[1])
19
+ }
20
+ end
12
21
  end
13
22
 
14
23
  def settings
15
- { 'cc' => @cc }
24
+ { 'cc' => @cc, 'definitions' => @definitions }
16
25
  end
17
26
 
18
27
  def self.wizard
@@ -91,30 +100,30 @@ class Commands
91
100
 
92
101
  c = @cmds[cmd]
93
102
 
94
- if c[2] == 0 then
103
+ if c[:args] == 0 then
95
104
  args = Array.new
96
- elsif args.size > c[2]
97
- a = args.first c[2]-1 # Take one under amount of commands
98
- a << args[c[2]-1..-1].join(' ')
105
+ elsif args.size > c[:args]
106
+ a = args.first c[:args]-1 # Take one under amount of commands
107
+ a << args[c[:args]-1..-1].join(' ')
99
108
  args = a
100
109
  end
101
110
 
102
111
  # User permissions
103
- if (kwargs = c.at(3)) and kwargs.has_key?(:permission) then
112
+ if c.has_key?(:permission) then
104
113
  if not e.respond_to?('user')
105
114
  return 'user module not loaded'
106
- elsif kwargs[:permission] == 'authenticated' then
115
+ elsif c[:permission] == 'authenticated' then
107
116
  return 'permission denied' if not e.user.authenticated?
108
- elsif not e.user.permission?(kwargs[:permission])
117
+ elsif not e.user.permission?(c[:permission])
109
118
  return 'permission denied'
110
119
  end
111
120
  end
112
121
 
113
122
  begin
114
- if c[1].class == Symbol then
115
- c[0].send(c[1], e, *args)
116
- elsif c[1].class == Proc then
117
- c[1].call(e, *args)
123
+ if c.has_key?(:instance) and c.has_key?(:symbol) then
124
+ c[:instance].send(c[:symbol], e, *args)
125
+ elsif c.has_key?(:proc) then
126
+ c[:proc].call(e, *args)
118
127
  else
119
128
  "Bad command definition"
120
129
  end
@@ -132,39 +141,53 @@ class Commands
132
141
  def plugin_loaded(key, instance)
133
142
  if instance.respond_to?('commands') then
134
143
  instance.commands.each do |k,v|
135
- v = [v] if v.class != Array
136
- v.insert(0, instance)
137
- v << 1 if v.size == 2 # add default command amount
138
- @cmds[k] = v
144
+ @cmds[k] = {
145
+ :instance => instance,
146
+ :args => 1
147
+ }
148
+
149
+ if v.class == Hash then
150
+ @cmds[k].merge(v)
151
+ else
152
+ v = [v] if v.class != Array
153
+ v.each do |item|
154
+ @cmds[k][:args] = item if item.class == Fixnum
155
+ @cmds[k].merge!(item) if item.class == Hash
156
+ @cmds[k][:symbol] = item if item.class == Symbol
157
+ @cmds[k][:proc] = item if item.class == Proc
158
+ end
159
+ end
160
+
161
+ @cmds[k][:args] = @cmds[k][:usage].split(' ').count if @cmds[k].has_key?(:usage)
139
162
  end
140
163
  end
141
164
  end
142
165
 
143
166
  def plugin_unloaded(key, instance)
144
- @cmds = @cmds.reject{ |k,v| v[0] == instance }
167
+ @cmds = @cmds.reject{ |k,v| v[:instance] == instance }
145
168
  end
146
169
 
147
170
  def commands
148
171
  {
149
172
  'help' => :help,
150
- 'instance' => [:instance_command, 1, { :help => 'List all commands availible for a instance.'}],
151
- 'which' => [:which, 1, { :help => 'Find which plugin handles a command' }],
152
- 'cc' => [:control_command, 1, { :permission => 'admin' }],
153
- 'eval' => [:evaluate, 1, { :permission => 'admin' }],
173
+ 'instance' => [:instance_command, { :help => 'List all commands availible for a instance.'}],
174
+ 'which' => [:which, { :help => 'Find which plugin handles a command' }],
175
+ 'cc' => [:control_command, { :permission => 'admin' }],
176
+ 'eval' => [:evaluate, { :permission => 'admin' }],
154
177
  'ieval' => [:instance_evaluate, 2, { :permission => 'admin' }],
155
178
  'count' => lambda { |e, data| "#{data.split_seperators.size}" },
156
179
  'grep' => [:grep, 2],
157
180
  'not' => [:not_command, 2],
158
181
  'tail' => :tail,
159
- 'echo' => [:echo, 1, { :example => 'Hello, {username}' }],
182
+ 'echo' => [:echo, { :example => 'Hello, {username}' }],
160
183
  'reverse' => lambda { |e, data| data.reverse },
161
184
  'first' => lambda { |e, data| data.split_seperators.first },
162
185
  'last' => lambda { |e, data| data.split_seperators.last },
163
- 'sub' => [:sub, 3, {
186
+ 'sub' => [:sub, {
164
187
  :help => 'Replace all occurances of a pattern',
165
188
  :usage => 'pattern replacement data',
166
189
  :example => 'l * Hello World!' }],
167
- 'tr' => [:tr, 3, {
190
+ 'tr' => [:tr, {
168
191
  :help => 'Returns a copy of str with the characters in from_str replaced by the corresponding characters in to_str',
169
192
  :usage => 'from_str to_str data',
170
193
  :example => 'aeiou * hello' }],
@@ -172,6 +195,18 @@ class Commands
172
195
  'upcase' => lambda { |e, data| data.upcase },
173
196
  'swapcase' => lambda { |e, data| data.swapcase },
174
197
  'capitalize' => lambda { |e, data| data.capitalize },
198
+ 'define' => [:define, {
199
+ :permission => 'admin',
200
+ :help => 'Dynamically define a command',
201
+ :usage => 'command arguments block',
202
+ :example => 'ping nil "pong"'
203
+ }],
204
+ 'undefine' => [:undefine, {
205
+ :permission => 'admin',
206
+ :help => 'Undefine a command',
207
+ :usage => 'command',
208
+ :example => 'ping'
209
+ }]
175
210
  }
176
211
  end
177
212
 
@@ -179,10 +214,10 @@ class Commands
179
214
  if command then
180
215
  h = []
181
216
 
182
- if @cmds.has_key?(command) and (kwargs = @cmds[command].at(3)).respond_to?('has_key?') then
183
- h << "#{command}: #{kwargs[:help]}" if kwargs.has_key?(:help)
184
- h << "Usage: #{command} #{kwargs[:usage]}" if kwargs.has_key?(:usage)
185
- h << "Example: #{command} #{kwargs[:example]}" if kwargs.has_key?(:example)
217
+ if @cmds.has_key?(command) then
218
+ h << "#{command}: #{@cmds[command][:help]}" if @cmds[command].has_key?(:help)
219
+ h << "Usage: #{command} #{@cmds[command][:usage]}" if @cmds[command].has_key?(:usage)
220
+ h << "Example: #{command} #{@cmds[command][:example]}" if @cmds[command].has_key?(:example)
186
221
  end
187
222
 
188
223
  if h.size == 0 then
@@ -191,7 +226,7 @@ class Commands
191
226
  h.join("\n")
192
227
  end
193
228
  else
194
- cmds = @cmds.reject{ |k,v| ((kwargs = v.at(3)) and kwargs.has_key?(:permission)) and not e.user.permission?(kwargs[:permission]) }
229
+ cmds = @cmds.reject{ |k,v| (v.has_key?(:permission)) and not e.user.permission?(v[:permission]) }
195
230
  cmds.keys.join(', ')
196
231
  end
197
232
  end
@@ -210,11 +245,10 @@ class Commands
210
245
 
211
246
  def which(e, command)
212
247
  if @cmds.has_key?(command) then
213
- c = @cmds[command][0]
214
- if c.respond_to?('instance') and c.plugin != c.instance then
215
- "#{c.plugin} (#{c.instance})"
248
+ if @cmds[command].has_key?(:instance) and @cmds[command][:instance].plugin != @cmds[command][:instance].instance then
249
+ "#{@cmds[command][:instance].plugin} (#{@cmds[command][:instance].instance})"
216
250
  else
217
- c.plugin
251
+ @cmds[command][:instance].plugin
218
252
  end
219
253
  else
220
254
  'command not found'
@@ -274,6 +308,28 @@ class Commands
274
308
  def tr(e, from_str, to_str, data)
275
309
  data.tr(from_str, to_str)
276
310
  end
311
+
312
+ def define(e, command, arguments, block)
313
+ arguments = arguments.split_seperators
314
+ arguments = [] if arguments.include?('nil') or arguments.include?('none')
315
+ arguments.insert(0, 'e')
316
+
317
+ @cmds[command] = {
318
+ :args => arguments.count - 1,
319
+ :proc => (eval "lambda {|#{arguments.join(',')}| #{block}}")
320
+ }
321
+
322
+ @definitions[command] = [arguments.count-1, "lambda {|#{arguments.join(',')}| #{block}}"]
323
+
324
+ "#{command} has been defined"
325
+ end
326
+
327
+ def undefine(e, command)
328
+ @cmds.delete(command)
329
+ @definitions.delete(command)
330
+
331
+ "#{command} removed"
332
+ end
277
333
  end
278
334
 
279
335
  Plugin.define do
@@ -0,0 +1,64 @@
1
+ require 'digest'
2
+ require 'zmb/timer'
3
+
4
+ class HttpWatch
5
+ attr_accessor :settings
6
+
7
+ def initialize(sender, s)
8
+ @delegate = sender
9
+ @settings = s
10
+ @settings['urls'] = Array.new unless @settings.has_key?('urls')
11
+ @settings['interval'] = 60*5 unless @settings.has_key?('interval')
12
+
13
+ @delegate.timer_add(Timer.new(self, :check, @settings['interval'], true))
14
+ end
15
+
16
+ def check
17
+ @settings['urls'].each do |url|
18
+ hash = Digest::SHA256.hexdigest(url['url'].get.body)
19
+
20
+ if hash != url['hash'] then
21
+ @delegate.instances[url['instance']].message(url['sender'], "#{url['url']} has been changed")
22
+ end
23
+
24
+ url['hash'] = hash
25
+ end
26
+ end
27
+
28
+ def commands
29
+ {
30
+ 'watch' => [:watch, 1, {}],
31
+ 'stop-watching' => :remove
32
+ }
33
+ end
34
+
35
+ def watch(e, url)
36
+ @settings['urls'] << {
37
+ 'instance' => e.delegate.instance,
38
+ 'sender' => e.sender,
39
+ 'url' => url,
40
+ 'hash' => Digest::SHA256.hexdigest(url.get.body)
41
+ }
42
+
43
+ "#{url} is now being watched"
44
+ end
45
+
46
+ def remove(e, url)
47
+ u = @settings['urls'].find do |u|
48
+ (u['url'] == url) and (u['instance'] == e.delegate.instance) and (u['sender'] == e.sender)
49
+ end
50
+
51
+ if u then
52
+ @settings['urls'].delete(u)
53
+ "#{url} is no longer being watched"
54
+ else
55
+ "No url match for this url on this irc server from user/channel"
56
+ end
57
+ end
58
+ end
59
+
60
+ Plugin.define do
61
+ name 'httpwatch'
62
+ description 'Watch a url for changes'
63
+ object HttpWatch
64
+ end
@@ -0,0 +1,48 @@
1
+ class LineCount
2
+ attr_accessor :users
3
+
4
+ def initialize(sender, s)
5
+ @users = s['users'] if s.has_key?('users')
6
+ @users = Hash.new if not @users
7
+ end
8
+
9
+ def settings
10
+ { 'users' => @users }
11
+ end
12
+
13
+ def commands
14
+ {
15
+ 'linecount' => :linecount,
16
+ 'lines' => [:lines, 0],
17
+ }
18
+ end
19
+
20
+ def event(sender, e)
21
+ if e.message? and not e.private? and e.respond_to?('user') and e.user.authenticated? then
22
+ if @users.has_key?(e.user.username) then
23
+ @users[e.user.username] += 1
24
+ else
25
+ @users[e.user.username] = 1
26
+ end
27
+ end
28
+ end
29
+
30
+ def linecount(e, user=nil)
31
+ user = e.user.username if not user and e.respond_to?('user')
32
+
33
+ if @users.has_key?(user) then
34
+ "#{user} has said #{@users[user]} lines"
35
+ else
36
+ "#{user} has not said anything"
37
+ end
38
+ end
39
+
40
+ def lines(e)
41
+ @users.invert.sort.reverse[0..5].map{ |l,u| "#{u} (#{l})"}.join(', ')
42
+ end
43
+ end
44
+
45
+ Plugin.define do
46
+ name 'linecount'
47
+ object LineCount
48
+ end
@@ -30,28 +30,28 @@ class Poll
30
30
 
31
31
  def commands
32
32
  {
33
- 'poll-add' => [:add_command, 2, {
33
+ 'poll-add' => [:add_command, {
34
34
  :permission => 'admin',
35
35
  :help => 'Add a poll',
36
36
  :usage => 'id poll',
37
37
  :example => 'colour Red, yellow or blue?' }],
38
- 'poll-opt' => [:opt_command, 2, {
38
+ 'poll-opt' => [:opt_command, {
39
39
  :permission => 'admin',
40
40
  :help => 'Add a option to a poll',
41
41
  :usage => 'id option',
42
42
  :example => 'colour Red' }],
43
- 'poll-del' => [:del_command, 1, {
43
+ 'poll-del' => [:del_command, {
44
44
  :permission => 'admin',
45
45
  :help => 'Delete a poll',
46
46
  :usage => 'id',
47
47
  :example => 'colour' }],
48
- 'vote' => [:vote_command, 2, {
48
+ 'vote' => [:vote_command, {
49
49
  :help => 'Vote on a poll',
50
50
  :usage => 'id option',
51
51
  :example => 'colour 1' }],
52
52
  'polls' => [:polls_command, 0, {
53
53
  :help => 'List all poll\'s' }],
54
- 'poll' => [:poll_command, 1, {
54
+ 'poll' => [:poll_command, {
55
55
  :help => 'List a poll',
56
56
  :usage => 'id',
57
57
  :example => 'colour' }],
@@ -29,19 +29,19 @@ class Quote
29
29
 
30
30
  def commands
31
31
  {
32
- 'quote' => [:quote_command, 1, {
32
+ 'quote' => [:quote_command, {
33
33
  :help => 'Show a random quote or the quote with matching id',
34
- :usage => '<id>' }],
35
- 'quote-add' => [:add_command, 1, {
34
+ :usage => 'id' }],
35
+ 'quote-add' => [:add_command, {
36
36
  :help => 'Add a quote',
37
37
  :example => 'zynox: Hello!' }],
38
- 'quote-del' => [:del_command, 1, {
38
+ 'quote-del' => [:del_command, {
39
39
  :help => 'Delete a quote by id',
40
40
  :example => '7'}],
41
41
  'quote-count' =>[lambda { |e| "#{count} quotes" }, 0, {
42
42
  :help => 'Show amount of quotes' }],
43
43
  'quote-last' => [:last_command, 0, { :help => 'Show the last quote' }],
44
- 'quote-search' => [:search_command, 1, {
44
+ 'quote-search' => [:search_command, {
45
45
  :help => 'Search to find a quote',
46
46
  :usage => 'search' }],
47
47
  }
@@ -27,15 +27,15 @@ class Relay
27
27
  {
28
28
  'relays' => [:relays_command, 0, {
29
29
  :help => 'Show all relays' }],
30
- 'relay-add' => [:add_command, 2, {
30
+ 'relay-add' => [:add_command, {
31
31
  :permission => 'admin',
32
32
  :help => 'Add a relay',
33
33
  :usage => 'instance:channel instance:channel',
34
34
  :example => 'efnet:#zmb efnet:#zmb2' }],
35
- 'relay-del' => [:del_command, 1, {
36
- :permission => 'admin'
35
+ 'relay-del' => [:del_command, {
36
+ :permission => 'admin',
37
37
  :help => 'Delete a relay',
38
- :usage => 'instance:channel'
38
+ :usage => 'instance:channel',
39
39
  :example => 'efnet:#zmb' }],
40
40
  }
41
41
  end
@@ -0,0 +1,116 @@
1
+ require 'rss/1.0'
2
+ require 'rss/2.0'
3
+ require 'rss/atom'
4
+ require 'zmb/timer'
5
+
6
+ class Feeds
7
+ attr_accessor :settings
8
+
9
+ def initialize(sender, s={})
10
+ @delegate = sender
11
+ @settings = s
12
+ @settings['interval'] = 10 unless settings.has_key?('interval')
13
+ @settings['instances'] = Array.new unless settings.has_key?('instances')
14
+ @settings['feeds'] = Array.new unless settings.has_key?('feeds')
15
+
16
+ setup_timer
17
+ end
18
+
19
+ def setup_timer
20
+ @delegate.timer_delete(self)
21
+ @delegate.timer_add(Timer.new(self, :timer, (@settings['interval'] * 60), true))
22
+ end
23
+
24
+ def timer(e=nil)
25
+ @settings['feeds'].each do |feed|
26
+ begin
27
+ rss = RSS::Parser.parse(feed['feed'].get().body, false)
28
+ rss.items.each do |item|
29
+ link = item.link.to_s
30
+ link = $1 if link =~ /href="([\w:\/\.\?]*)"/
31
+
32
+ break if feed['link'] == link
33
+ @delegate.instances[feed['instance']].message(feed['sender'], "RSS: #{item.title.to_s.gsub(/<\/?[^>]*>/, "")} (#{link})")
34
+ end
35
+
36
+ link = rss.items[0].link.to_s
37
+ link = $1 if link =~ /href="([\w:\/\.\?]*)"/
38
+ feed['link'] = link
39
+ rescue Exception
40
+ @delegate.instances[feed['instance']].message(feed['sender'], "RSS: #{feed['feed']} failed")
41
+ end
42
+ end
43
+ end
44
+
45
+ def commands
46
+ {
47
+ 'rss-interval' => [:interval, 1, {
48
+ :permission => 'admin',
49
+ :help => 'Set the interval to automatically check rss feeds',
50
+ :usage => 'minutes',
51
+ :example => '15' }],
52
+ 'rss-list' => [:list, 0 , {
53
+ :permission => 'admin' }],
54
+ 'rss-subscribe' => [:add, 1, {
55
+ :permission => 'admin',
56
+ :help => 'Subscribe to a rss feed' }],
57
+ 'rss-scan' => [:timer, 0, { :permission => 'admin', :help => 'Rescan RSS feeds for news' }],
58
+ 'rss-unsubscribe' => [:remove, 1, {
59
+ :permission => 'admin',
60
+ :help => 'Unsubscribe from a rss feed' }],
61
+ }
62
+ end
63
+
64
+ def interval(e, i)
65
+ @settings['interval'] = Integer(i)
66
+ setup_timer
67
+ "RSS interval set to #{@settings['interval']}"
68
+ end
69
+
70
+ def list(e)
71
+ if @settings['feeds'].count > 0 then
72
+ count = 0
73
+ @settings['feeds'].map{ |feed| "#{count+=1}: #{feed['feed']} (#{feed['instance']}/#{feed['sender']})" }.join("\n")
74
+ else
75
+ "No feeds"
76
+ end
77
+ end
78
+
79
+ def add(e, feed)
80
+ @settings['feeds'] << {
81
+ 'feed' => feed,
82
+ 'link' => nil,
83
+ 'instance' => e.delegate.instance,
84
+ 'sender' => e.sender
85
+ }
86
+
87
+ "Feed #{feed} added"
88
+ end
89
+
90
+ def remove(e, feed)
91
+ begin
92
+ feed_id = Integer(feed) - 1
93
+ f = @settings['feeds'].at(feed_id)
94
+
95
+ if feed then
96
+ @settings['feeds'].delete_at(feed_id)
97
+ "#{f['feed']} deleted"
98
+ else
99
+ "No feed with index: #{feed}"
100
+ end
101
+ rescue ArgumentError
102
+ count = 0
103
+ @settings['feeds'].reject{ |f| not ((f['feed'] == feed) and (f['instance'] == e.delegate.instance) and (f['sender'] == e.sender)) }.map do |f|
104
+ count =+ 1
105
+ @settings['feeds'].delete(f)
106
+ end
107
+
108
+ "#{count} feeds removed"
109
+ end
110
+ end
111
+ end
112
+
113
+ Plugin.define do
114
+ name 'rss'
115
+ object Feeds
116
+ end
@@ -69,11 +69,11 @@ class Security
69
69
  :example => '.... . .-.. .-.. --- / .-- --- .-. .-.. -..' }],
70
70
 
71
71
  'rot13' => :rot13,
72
- 'sha1' => [lambda { |e, data| Digest::SHA1.hexdigest(data) }, 1, { :help => 'Create a sha1 hash of some text' }],
73
- 'sha256' => [lambda { |e, data| Digest::SHA256.hexdigest(data) }, 1, { :help => 'Create a sha256 hash of some text' }],
74
- 'md5' => [lambda { |e, data| Digest::MD5.hexdigest(data) }, 1, { :help => 'Create a md5 hash of some text' }],
75
- 'base64' => [lambda { |e, data| Base64.b64encode(data) }, 1, { :help => '' }],
76
- 'decode64' => [lambda { |e, data| Base64.decode64(data) }, 1, { :help => '' }],
72
+ 'sha1' => [lambda { |e, data| Digest::SHA1.hexdigest(data) }, { :help => 'Create a sha1 hash of some text' }],
73
+ 'sha256' => [lambda { |e, data| Digest::SHA256.hexdigest(data) }, { :help => 'Create a sha256 hash of some text' }],
74
+ 'md5' => [lambda { |e, data| Digest::MD5.hexdigest(data) }, { :help => 'Create a md5 hash of some text' }],
75
+ 'base64' => [lambda { |e, data| Base64.b64encode(data) }, { :help => 'Encode a string as base64' }],
76
+ 'decode64' => [lambda { |e, data| Base64.decode64(data) }, { :help => 'Decode a string with base64' }],
77
77
  }
78
78
  end
79
79
 
@@ -3,9 +3,11 @@ class Sed
3
3
  @messages = Hash.new
4
4
  end
5
5
 
6
- def event(sender, e)
6
+ def pre_event(sender, e)
7
7
  if e.message =~ /^s\/(\S+)\/(\S+)\/$/ then
8
8
  e.reply("#{e.name} meant " + @messages[e.userhost].sub($1, $2))
9
+ elsif e.message =~ /^!!(.+)/ then
10
+ e.message = @messages[e.userhost] + $1
9
11
  else
10
12
  @messages[e.userhost] = e.message if e.message?
11
13
  end
@@ -0,0 +1,34 @@
1
+ class Translate
2
+ def initialize(sender, s) ;end
3
+
4
+ def commands
5
+ {
6
+ 'translate' => [:translate, {
7
+ :usage => 'to from message',
8
+ :example => 'en fr Hello',
9
+ }],
10
+ }
11
+ end
12
+
13
+ def translate(e, to, from, message)
14
+ request = JSON.parse("http://ajax.googleapis.com/ajax/services/language/translate".get({
15
+ :v => '1.0',
16
+ :key => 'ABQIAAAAhwR5TtcQxY9fSuKy7yrBJhQ-sC4I4KvMQ8RG81t2M9sVc21w2xQUb9Dipx99m8XrHBsa3OctXe2rQw',
17
+ :langpair => "#{to}%7C#{from}",
18
+ :q => message
19
+ }).body)
20
+
21
+ if request['responseStatus'] == 200 then
22
+ request['responseData']['translatedText']
23
+ elsif request['responseStatus'] == 400
24
+ request['responseDetails']
25
+ else
26
+ "Unknown error occured"
27
+ end
28
+ end
29
+ end
30
+
31
+ Plugin.define do
32
+ name 'translate'
33
+ object Translate
34
+ end
@@ -8,13 +8,13 @@ class URL
8
8
  def commands
9
9
  {
10
10
  'head' => :head,
11
- 'url' => [:get, 1, { :permission => 'admin' }],
11
+ 'url' => [:get, { :permission => 'admin' }],
12
12
  'bitly' => :bitly,
13
13
  'isgd' => :isgd,
14
14
  'tinyurl' => :tinyurl,
15
15
  'dpaste' => :dpaste,
16
16
  'pastie' => :pastie_command,
17
- 'ppastie' => [:private_pastie_command, 1, { :help => 'Create a private pastie' }],
17
+ 'ppastie' => [:private_pastie_command, { :help => 'Create a private pastie' }],
18
18
  }
19
19
  end
20
20
 
@@ -38,17 +38,17 @@ class Usermodes
38
38
 
39
39
  def commands
40
40
  {
41
- 'usermode-add' => [:usermode_add, 4, {
41
+ 'usermode-add' => [:usermode_add, {
42
42
  :permission => 'admin',
43
43
  :help => 'Apply a usermode to a user when they join a channel',
44
44
  :usage => 'instance channel user mode',
45
45
  :example => 'efnet #zmb zynox o' }],
46
- 'usermode-del' => [:usermode_del, 4, {
46
+ 'usermode-del' => [:usermode_del, {
47
47
  :permission => 'admin',
48
48
  :help => 'Delete a usermode',
49
49
  :usage => 'instance channel user mode',
50
50
  :example => 'efnet #zmb zynox o' }],
51
- 'usermodes' => [:usermodes, 2, {
51
+ 'usermodes' => [:usermodes, {
52
52
  :permission => 'admin',
53
53
  :help => 'List all usermodes for a channel',
54
54
  :usage => 'instance channel',
@@ -23,15 +23,15 @@ class Vouch
23
23
 
24
24
  def commands
25
25
  {
26
- 'vouch' => [:vouch, 1, {
26
+ 'vouch' => [:vouch, {
27
27
  :permission => 'authenticated',
28
28
  :help => 'Vouch for a user',
29
29
  :usage => 'username',
30
30
  :example => 'zynox' }],
31
- 'vouch-limit' => [:limit_command, 1, {
31
+ 'vouch-limit' => [:limit_command, {
32
32
  :permission => 'admin',
33
33
  :help => 'Change the vouch limit' }],
34
- 'stats' => [:stats, 1, {
34
+ 'stats' => [:stats, {
35
35
  :help => 'View status of a vouch' }],
36
36
  }
37
37
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{zmb}
8
- s.version = "0.3.0"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["kylef"]
12
- s.date = %q{2010-05-25}
12
+ s.date = %q{2010-07-05}
13
13
  s.default_executable = %q{zmb}
14
14
  s.description = %q{ZMB, messenger bot}
15
15
  s.email = %q{inbox@kylefuller.co.uk}
@@ -41,17 +41,21 @@ Gem::Specification.new do |s|
41
41
  "plugins/dns.rb",
42
42
  "plugins/file.rb",
43
43
  "plugins/gcalc.rb",
44
+ "plugins/httpwatch.rb",
44
45
  "plugins/idle.rb",
45
46
  "plugins/irc.rb",
47
+ "plugins/linecount.rb",
46
48
  "plugins/log.rb",
47
49
  "plugins/nickserv.rb",
48
50
  "plugins/poll.rb",
49
51
  "plugins/quote.rb",
50
52
  "plugins/random.rb",
51
53
  "plugins/relay.rb",
54
+ "plugins/rss.rb",
52
55
  "plugins/security.rb",
53
56
  "plugins/sed.rb",
54
57
  "plugins/system.rb",
58
+ "plugins/translate.rb",
55
59
  "plugins/url.rb",
56
60
  "plugins/usermodes.rb",
57
61
  "plugins/users.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zmb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - kylef
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-05-25 00:00:00 +01:00
12
+ date: 2010-07-05 00:00:00 +01:00
13
13
  default_executable: zmb
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -64,17 +64,21 @@ files:
64
64
  - plugins/dns.rb
65
65
  - plugins/file.rb
66
66
  - plugins/gcalc.rb
67
+ - plugins/httpwatch.rb
67
68
  - plugins/idle.rb
68
69
  - plugins/irc.rb
70
+ - plugins/linecount.rb
69
71
  - plugins/log.rb
70
72
  - plugins/nickserv.rb
71
73
  - plugins/poll.rb
72
74
  - plugins/quote.rb
73
75
  - plugins/random.rb
74
76
  - plugins/relay.rb
77
+ - plugins/rss.rb
75
78
  - plugins/security.rb
76
79
  - plugins/sed.rb
77
80
  - plugins/system.rb
81
+ - plugins/translate.rb
78
82
  - plugins/url.rb
79
83
  - plugins/usermodes.rb
80
84
  - plugins/users.rb