zmb 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/bin/zmb +4 -6
- data/lib/zmb.rb +48 -36
- data/lib/zmb/settings.rb +8 -2
- data/lib/zmb/timer.rb +7 -2
- data/plugins/announce.rb +101 -0
- data/plugins/autorejoin.rb +15 -0
- data/plugins/bank.rb +9 -7
- data/plugins/commands.rb +97 -32
- data/plugins/dns.rb +51 -0
- data/plugins/idle.rb +2 -7
- data/plugins/irc.rb +53 -26
- data/plugins/log.rb +25 -0
- data/plugins/nickserv.rb +8 -6
- data/plugins/poll.rb +10 -11
- data/plugins/quote.rb +20 -16
- data/plugins/relay.rb +12 -8
- data/plugins/security.rb +117 -0
- data/plugins/system.rb +3 -7
- data/plugins/url.rb +110 -0
- data/plugins/usermodes.rb +90 -0
- data/plugins/users.rb +64 -31
- data/zmb.gemspec +9 -3
- metadata +9 -3
- data/lib/zmb/commands.rb +0 -63
data/plugins/dns.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'resolv'
|
2
|
+
require 'socket'
|
3
|
+
|
4
|
+
class DNS
|
5
|
+
def initialize(sender, s) ;end
|
6
|
+
|
7
|
+
def commands
|
8
|
+
{
|
9
|
+
'dns' => :dns,
|
10
|
+
'rdns' => :rdns,
|
11
|
+
'whois' => [:whois, 1, { :help => 'perform a whois on a domain' }],
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def dns(e, host)
|
16
|
+
Resolv.new.getaddress(host)
|
17
|
+
end
|
18
|
+
|
19
|
+
def rdns(e, ip)
|
20
|
+
begin
|
21
|
+
Resolv.new.getname(ip)
|
22
|
+
rescue Resolv::ResolvError
|
23
|
+
ip
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def whois(e, domain)
|
28
|
+
begin
|
29
|
+
require 'whois'
|
30
|
+
rescue Exception
|
31
|
+
'command depends on whois gem: http://www.ruby-whois.org/'
|
32
|
+
end
|
33
|
+
|
34
|
+
a = Whois.query(domain)
|
35
|
+
|
36
|
+
if a.available? then
|
37
|
+
"#{domain} is availible"
|
38
|
+
else
|
39
|
+
t = a.technical
|
40
|
+
c = "Created on #{a.created_on}"
|
41
|
+
c += " by #{t.name}" if t
|
42
|
+
c
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Plugin.define do
|
48
|
+
name 'dns'
|
49
|
+
description 'resolve dns'
|
50
|
+
object DNS
|
51
|
+
end
|
data/plugins/idle.rb
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
class Idle
|
2
|
-
def initialize(sender,
|
2
|
+
def initialize(sender, s)
|
3
3
|
@channels = Hash.new
|
4
4
|
end
|
5
5
|
|
6
|
-
def to_json(*a)
|
7
|
-
{ 'plugin' => 'idle' }.to_json(*a)
|
8
|
-
end
|
9
|
-
|
10
6
|
def event(sender, e)
|
11
7
|
if e.message? and e.respond_to?('channel') then
|
12
8
|
@channels[e.channel] = Time.now if not e.message.include?('idle')
|
@@ -14,9 +10,8 @@ class Idle
|
|
14
10
|
end
|
15
11
|
|
16
12
|
def commands
|
17
|
-
require 'zmb/commands'
|
18
13
|
{
|
19
|
-
'idle' =>
|
14
|
+
'idle' => [:idle, 1, { :help => 'How long has this channel been idle?'}],
|
20
15
|
}
|
21
16
|
end
|
22
17
|
|
data/plugins/irc.rb
CHANGED
@@ -3,10 +3,10 @@ require 'socket'
|
|
3
3
|
require 'zmb/timer'
|
4
4
|
|
5
5
|
class Event
|
6
|
-
attr_accessor :delegate, :command, :args, :name, :userhost, :message, :channel
|
6
|
+
attr_accessor :delegate, :command, :args, :name, :userhost, :message, :channel, :line
|
7
7
|
|
8
8
|
def initialize(sender, line)
|
9
|
-
|
9
|
+
@line = line
|
10
10
|
|
11
11
|
if line[0,1] == ':' then
|
12
12
|
line = line[1..-1] # Remove the :
|
@@ -25,6 +25,16 @@ class Event
|
|
25
25
|
@userhost, @channel, @message = args.split(' ', 3)
|
26
26
|
@name, @userhost = @userhost.split('!', 2)
|
27
27
|
@message = @message[1..-1]
|
28
|
+
when 'join'
|
29
|
+
@userhost, @channel = args.split(' ', 2)
|
30
|
+
@name, @userhost = @userhost.split('!', 2)
|
31
|
+
when 'part'
|
32
|
+
@userhost, @channel = args.split(' ', 2)
|
33
|
+
@name, @userhost = @userhost.split('!', 2)
|
34
|
+
when 'kick'
|
35
|
+
@userhost, @channel, @name, @message = args.split(' ', 4)
|
36
|
+
nick, @userhost = @userhost.split('!', 2)
|
37
|
+
@message = @message[1..-1]
|
28
38
|
end
|
29
39
|
end
|
30
40
|
|
@@ -53,26 +63,26 @@ end
|
|
53
63
|
class IrcConnection
|
54
64
|
attr_accessor :host, :port, :channels, :nick, :name, :realname, :password, :throttle
|
55
65
|
|
56
|
-
def initialize(sender,
|
66
|
+
def initialize(sender, s={})
|
57
67
|
@delegate = sender
|
58
68
|
|
59
|
-
@host =
|
69
|
+
@host = s['host'] if s.has_key?('host')
|
60
70
|
begin
|
61
|
-
@port = Integer(
|
71
|
+
@port = Integer(s['port']) if s.has_key?('port')
|
62
72
|
rescue Exception
|
63
73
|
@port = 6667
|
64
74
|
end
|
65
75
|
|
66
76
|
@channels = Array.new
|
67
|
-
@channels =
|
77
|
+
@channels = s['channels'] if s.has_key?('channels')
|
68
78
|
|
69
|
-
@nick =
|
70
|
-
@name =
|
71
|
-
@realname =
|
72
|
-
@password =
|
79
|
+
@nick = s['nick'] if s.has_key?('nick')
|
80
|
+
@name = s['name'] if s.has_key?('name')
|
81
|
+
@realname = s['realname'] if s.has_key?('realname')
|
82
|
+
@password = s['password'] if s.has_key?('password')
|
73
83
|
|
74
84
|
@throttle = 10
|
75
|
-
@throttle =
|
85
|
+
@throttle = s['throttle'] if s.has_key?('throttle')
|
76
86
|
|
77
87
|
sender.timer_add(Timer.new(self, :connect, 0.1, false)) if sender.running?
|
78
88
|
end
|
@@ -81,7 +91,7 @@ class IrcConnection
|
|
81
91
|
@socket = value
|
82
92
|
end
|
83
93
|
|
84
|
-
def
|
94
|
+
def settings
|
85
95
|
{
|
86
96
|
'host' => @host,
|
87
97
|
'port' => @port,
|
@@ -94,8 +104,7 @@ class IrcConnection
|
|
94
104
|
'password' => @password,
|
95
105
|
|
96
106
|
'throttle' => @throttle,
|
97
|
-
|
98
|
-
}.to_json(*a)
|
107
|
+
}
|
99
108
|
end
|
100
109
|
|
101
110
|
def self.wizard
|
@@ -110,18 +119,17 @@ class IrcConnection
|
|
110
119
|
end
|
111
120
|
|
112
121
|
def commands
|
113
|
-
require 'zmb/commands'
|
114
122
|
{
|
115
|
-
'join' =>
|
116
|
-
'part' =>
|
117
|
-
'cycle' =>
|
118
|
-
'topic' =>
|
119
|
-
'kick' =>
|
120
|
-
'channels' =>
|
121
|
-
'raw' =>
|
122
|
-
'nick' =>
|
123
|
-
'tell' =>
|
124
|
-
'reconnect' =>
|
123
|
+
'join' => [:join_command, 1, { :permission => 'admin' }],
|
124
|
+
'part' => [:part_command, 1, { :permission => 'admin' }],
|
125
|
+
'cycle' => [:cycle_command, 1, { :permission => 'admin' }],
|
126
|
+
'topic' => [:topic_command, 2, { :permission => 'admin' }],
|
127
|
+
'kick' => [:kick_command, 2, { :permission => 'admin' }],
|
128
|
+
'channels' => [:channels_command, 1, { :permission => 'admin' }],
|
129
|
+
'raw' => [:raw_command, 1, { :permission => 'admin' }],
|
130
|
+
'nick' => [:nick_command, 1, { :permission => 'admin' }],
|
131
|
+
'tell' => [:tell_command, 2, { :permission => 'admin' }],
|
132
|
+
'reconnect' => [:reconnect_command, 1, { :permission => 'admin' }],
|
125
133
|
}
|
126
134
|
end
|
127
135
|
|
@@ -165,7 +173,26 @@ class IrcConnection
|
|
165
173
|
end
|
166
174
|
|
167
175
|
def message(recipient, msg)
|
168
|
-
|
176
|
+
if msg.size >= (total = 510 - (recipient.size + 10)) then
|
177
|
+
words = msg.split(' ')
|
178
|
+
line = words.shift
|
179
|
+
length = line.size
|
180
|
+
|
181
|
+
words.each do |word|
|
182
|
+
if (length += (word.size + 1)) >= total then
|
183
|
+
write "PRIVMSG #{recipient} :#{line}"
|
184
|
+
sleep 0.1
|
185
|
+
line = word
|
186
|
+
length = word.size
|
187
|
+
else
|
188
|
+
line += " #{word}"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
write "PRIVMSG #{recipient} :#{line}" if line.size > 0
|
193
|
+
else
|
194
|
+
write "PRIVMSG #{recipient} :#{msg}"
|
195
|
+
end
|
169
196
|
end
|
170
197
|
|
171
198
|
def join(channel)
|
data/plugins/log.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'ftools'
|
2
|
+
|
3
|
+
class Log
|
4
|
+
def initialize(sender, s)
|
5
|
+
@delegate = sender
|
6
|
+
end
|
7
|
+
|
8
|
+
def log_file(instance, channel)
|
9
|
+
path = File.join(@delegate.settings_manager.directory, 'logs', instance)
|
10
|
+
File.makedirs(path)
|
11
|
+
File.join(path, "#{channel}-#{Time.now.strftime('%d%m%Y')}.log")
|
12
|
+
end
|
13
|
+
|
14
|
+
def event(sender, e)
|
15
|
+
if e.respond_to?('channel') and e.respond_to?('line') and e.channel then
|
16
|
+
File.open(log_file(e.delegate.instance, e.channel), 'a+') { |f| f.write(e.line + "\n") }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Plugin.define do
|
22
|
+
name 'log'
|
23
|
+
description 'log everything received from irc'
|
24
|
+
object Log
|
25
|
+
end
|
data/plugins/nickserv.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
class NickServ
|
2
|
-
def initialize(sender,
|
3
|
-
@password =
|
2
|
+
def initialize(sender, s)
|
3
|
+
@password = s['password'] if s.has_key?('password')
|
4
4
|
end
|
5
5
|
|
6
|
-
def
|
7
|
-
{ '
|
6
|
+
def settings
|
7
|
+
{ 'password' => @password }
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.wizard
|
@@ -18,9 +18,11 @@ class NickServ
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def commands
|
21
|
-
require 'zmb/commands'
|
22
21
|
{
|
23
|
-
'nickserv' =>
|
22
|
+
'nickserv' => [:set, 1, {
|
23
|
+
:help => 'Set the NickServ password for the bot to login with.',
|
24
|
+
:usage => 'password',
|
25
|
+
}],
|
24
26
|
}
|
25
27
|
end
|
26
28
|
|
data/plugins/poll.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
class Poll
|
2
|
-
def initialize(sender,
|
2
|
+
def initialize(sender, s={})
|
3
3
|
@polls = Hash.new
|
4
|
-
@polls =
|
4
|
+
@polls = s['polls'] if s.has_key?('polls')
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
8
|
-
{ '
|
7
|
+
def settings
|
8
|
+
{ 'polls' => @polls }
|
9
9
|
end
|
10
10
|
|
11
11
|
def add(slug, poll)
|
@@ -29,14 +29,13 @@ class Poll
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def commands
|
32
|
-
require 'zmb/commands'
|
33
32
|
{
|
34
|
-
'poll-add' =>
|
35
|
-
'poll-opt' =>
|
36
|
-
'poll-del' =>
|
37
|
-
'vote' =>
|
38
|
-
'polls' =>
|
39
|
-
'poll' =>
|
33
|
+
'poll-add' => [:add_command, 2, { :permission => 'admin' }],
|
34
|
+
'poll-opt' => [:opt_command, 2, { :permission => 'admin' }],
|
35
|
+
'poll-del' => [:del_command, 1, { :permission => 'admin' }],
|
36
|
+
'vote' => [:vote_command, 2],
|
37
|
+
'polls' => [:polls_command, 0],
|
38
|
+
'poll' => :poll_command,
|
40
39
|
}
|
41
40
|
end
|
42
41
|
|
data/plugins/quote.rb
CHANGED
@@ -1,19 +1,15 @@
|
|
1
1
|
class Quote
|
2
2
|
attr_accessor :quotes, :autoindex
|
3
3
|
|
4
|
-
def initialize(sender,
|
4
|
+
def initialize(sender, s={})
|
5
5
|
@quotes = Hash.new
|
6
|
-
@quotes =
|
6
|
+
@quotes = s['quotes'] if s.has_key?('quotes')
|
7
7
|
@autoindex = 1
|
8
|
-
@autoindex =
|
8
|
+
@autoindex = s['autoindex'] if s.has_key?('autoindex')
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
{
|
13
|
-
'plugin' => 'quote',
|
14
|
-
'quotes' => @quotes,
|
15
|
-
'autoindex' => @autoindex,
|
16
|
-
}.to_json(*a)
|
11
|
+
def settings
|
12
|
+
{ 'quotes' => @quotes, 'autoindex' => @autoindex }
|
17
13
|
end
|
18
14
|
|
19
15
|
def add(quote, username=nil)
|
@@ -32,14 +28,22 @@ class Quote
|
|
32
28
|
end
|
33
29
|
|
34
30
|
def commands
|
35
|
-
require 'zmb/commands'
|
36
31
|
{
|
37
|
-
'quote' =>
|
38
|
-
|
39
|
-
|
40
|
-
'quote-
|
41
|
-
|
42
|
-
|
32
|
+
'quote' => [:quote_command, 1, {
|
33
|
+
:help => 'Show a random quote or the quote with matching id',
|
34
|
+
:usage => '<id>' }],
|
35
|
+
'quote-add' => [:add_command, 1, {
|
36
|
+
:help => 'Add a quote'
|
37
|
+
:example => 'zynox: Hello!'}],
|
38
|
+
'quote-del' => [:del_command, 1, {
|
39
|
+
:help => 'Delete a quote by id',
|
40
|
+
:example => '7'}],
|
41
|
+
'quote-count' =>[:count_command, 0, {
|
42
|
+
:help => 'Show amount of quotes' }],
|
43
|
+
'quote-last' => [:last_command, 0, { :help => 'Show the last quote'),
|
44
|
+
'quote-search' => [:search_command, 1, {
|
45
|
+
:help => 'Search to find a quote',
|
46
|
+
:usage => 'search' }],
|
43
47
|
}
|
44
48
|
end
|
45
49
|
|
data/plugins/relay.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
class Relay
|
2
2
|
attr_accessor :relays
|
3
3
|
|
4
|
-
def initialize(sender,
|
5
|
-
@relays =
|
4
|
+
def initialize(sender, s={})
|
5
|
+
@relays = s['relays'] if s.has_key?('relays')
|
6
6
|
@relays = Hash.new if not @relays
|
7
7
|
|
8
8
|
@delegate = sender
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
{ 'relays' => @relays
|
11
|
+
def settings
|
12
|
+
{ 'relays' => @relays }
|
13
13
|
end
|
14
14
|
|
15
15
|
def event(sender, e)
|
@@ -24,11 +24,15 @@ class Relay
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def commands
|
27
|
-
require 'zmb/commands'
|
28
27
|
{
|
29
|
-
'relays' =>
|
30
|
-
|
31
|
-
'relay-
|
28
|
+
'relays' => [:relays_command, 0, {
|
29
|
+
:help => 'Show all relays' }],
|
30
|
+
'relay-add' => [:add_command, 2, {
|
31
|
+
:help => 'Add a relay',
|
32
|
+
:permission => 'admin' }],
|
33
|
+
'relay-del' => [:del_command, 1, {
|
34
|
+
:help => 'Delete a relay',
|
35
|
+
:permission => 'admin' }],
|
32
36
|
}
|
33
37
|
end
|
34
38
|
|
data/plugins/security.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'digest'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
MORSE = {
|
5
|
+
'-----' => '0',
|
6
|
+
'.----' => '1',
|
7
|
+
'..---' => '2',
|
8
|
+
'...--' => '3',
|
9
|
+
'....-' => '4',
|
10
|
+
'.....' => '5',
|
11
|
+
'-....' => '6',
|
12
|
+
'--...' => '7',
|
13
|
+
'---..' => '8',
|
14
|
+
'----.' => '9',
|
15
|
+
'.-' => 'a',
|
16
|
+
'-...' => 'b',
|
17
|
+
'-.-.' => 'c',
|
18
|
+
'-..' => 'd',
|
19
|
+
'.' => 'e',
|
20
|
+
'..-.' => 'f',
|
21
|
+
'--.' => 'g',
|
22
|
+
'....' => 'h',
|
23
|
+
'..' => 'i',
|
24
|
+
'.---' => 'j',
|
25
|
+
'-.-' => 'k',
|
26
|
+
'.-..' => 'l',
|
27
|
+
'--' => 'm',
|
28
|
+
'-.' => 'n',
|
29
|
+
'---' => 'o',
|
30
|
+
'.--.' => 'p',
|
31
|
+
'--.-' => 'q',
|
32
|
+
'.-.' => 'r',
|
33
|
+
'...' => 's',
|
34
|
+
'-' => 't',
|
35
|
+
'..-' => 'u',
|
36
|
+
'...-' => 'v',
|
37
|
+
'.--' => 'w',
|
38
|
+
'-..-' => 'x',
|
39
|
+
'-.--' => 'y',
|
40
|
+
'--..' => 'z',
|
41
|
+
'-..-.' => '/',
|
42
|
+
'.-.-.' => '+',
|
43
|
+
'-...-' => '=',
|
44
|
+
'.-.-.-' => '.',
|
45
|
+
'--..--' => ',',
|
46
|
+
'..--..' => '?',
|
47
|
+
'-.--.' => '(',
|
48
|
+
'-.--.-' => ')',
|
49
|
+
'-....-' => '-',
|
50
|
+
'.-..-.' => '"',
|
51
|
+
'..--.-' => '_',
|
52
|
+
'.----.' => "'",
|
53
|
+
'---...' => ':',
|
54
|
+
'-.-.-.' => ';',
|
55
|
+
'...-..-' => '$',
|
56
|
+
'/' => ' ',
|
57
|
+
}
|
58
|
+
|
59
|
+
class Security
|
60
|
+
def initialize(sender, s) ;end
|
61
|
+
|
62
|
+
def commands
|
63
|
+
{
|
64
|
+
'morse' => [:morse, 1, {
|
65
|
+
:help => 'Encode text into morse code',
|
66
|
+
:example => 'Hello World' }],
|
67
|
+
'decode-morse' => [:demorse, 1, {
|
68
|
+
:help => 'Convert morse code into text',
|
69
|
+
:example => '.... . .-.. .-.. --- / .-- --- .-. .-.. -..' }],
|
70
|
+
|
71
|
+
'rot13' => :rot13,
|
72
|
+
'sha1' => [:sha1, 1, { :help => 'Create a sha1 hash of some text' }],
|
73
|
+
'sha256' => [:sha256, 1, { :help => 'Create a sha256 hash of some text' }],
|
74
|
+
'md5' => [:md5, 1, { :help => 'Create a md5 hash of some text' }],
|
75
|
+
'base64' => [:base64, 1, { :help => '' }],
|
76
|
+
'decode64' => [:decode64, 1, { :help => '' }],
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
def morse(e, data)
|
81
|
+
data.downcase.split('').map{ |c| MORSE.index(c) }.join(' ')
|
82
|
+
end
|
83
|
+
|
84
|
+
def demorse(e, data)
|
85
|
+
data.split(' ').map{ |m| MORSE.fetch(m, '-') }.join
|
86
|
+
end
|
87
|
+
|
88
|
+
def rot13(e, data)
|
89
|
+
data.tr('A-Ma-mN-Zn-z', 'N-Zn-zA-Ma-m')
|
90
|
+
end
|
91
|
+
|
92
|
+
def sha1(e, data)
|
93
|
+
Digest::SHA1.hexdigest(data)
|
94
|
+
end
|
95
|
+
|
96
|
+
def sha256(e, data)
|
97
|
+
Digest::SHA256.hexdigest(data)
|
98
|
+
end
|
99
|
+
|
100
|
+
def md5(e, data)
|
101
|
+
Digest::MD5.hexdigest(data)
|
102
|
+
end
|
103
|
+
|
104
|
+
def base64(e, data)
|
105
|
+
Base64.b64encode(data)
|
106
|
+
end
|
107
|
+
|
108
|
+
def decode64(e, data)
|
109
|
+
Base64.decode64(data)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
Plugin.define do
|
114
|
+
name 'security'
|
115
|
+
description 'Hashes, morse code and base64.'
|
116
|
+
object Security
|
117
|
+
end
|