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/system.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
class System
|
2
|
-
def initialize(sender,
|
3
|
-
|
4
|
-
def to_json(*a)
|
5
|
-
{ 'plugin' => 'system' }.to_json(*a)
|
6
|
-
end
|
2
|
+
def initialize(sender, s) ;end
|
7
3
|
|
8
4
|
def commands
|
9
5
|
require 'zmb/commands'
|
10
6
|
{
|
11
|
-
'uptime' =>
|
12
|
-
'date' =>
|
7
|
+
'uptime' => [:uptime, 0, { :help => 'Server uptime' }],
|
8
|
+
'date' => [:date, 0, { :help => 'Display the server date/time' }],
|
13
9
|
}
|
14
10
|
end
|
15
11
|
|
data/plugins/url.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
class URL
|
6
|
+
def initialize(sender, s) ;end
|
7
|
+
|
8
|
+
def to_query_string(h)
|
9
|
+
h.map { |k, v|
|
10
|
+
if v.instance_of?(Hash)
|
11
|
+
v.map { |sk, sv|
|
12
|
+
"#{k}[#{sk}]=#{sv}"
|
13
|
+
}.join('&')
|
14
|
+
else
|
15
|
+
"#{k}=#{v}"
|
16
|
+
end
|
17
|
+
}.join('&')
|
18
|
+
end
|
19
|
+
|
20
|
+
def http(host, port=80, path='/', type='get', query_string={})
|
21
|
+
http = Net::HTTP.new(host, port)
|
22
|
+
query_string = to_query_string(query_string) if query_string.class == Hash
|
23
|
+
http.start do |h|
|
24
|
+
case type
|
25
|
+
when 'get' then h.get(path + '?' + query_string)
|
26
|
+
when 'post' then h.post(path, query_string)
|
27
|
+
when 'head' then h.head(path + '?' + query_string)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def commands
|
33
|
+
{
|
34
|
+
'head' => :head,
|
35
|
+
'bitly' => :bitly,
|
36
|
+
'isgd' => :isgd,
|
37
|
+
'tinyurl' => :tinyurl,
|
38
|
+
'dpaste' => :dpaste,
|
39
|
+
'pastie' => :pastie_command,
|
40
|
+
'ppastie' => [:private_pastie_command, 1, { :help => 'Create a private pastie' }],
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def head(e, url)
|
45
|
+
u = URI.parse(url)
|
46
|
+
u.path = '/' if u.path.size == 0
|
47
|
+
u.query = '' if not u.query
|
48
|
+
|
49
|
+
resp = http(u.host, u.port, u.path, 'head', u.query)
|
50
|
+
if resp.code == "301" or resp.code == "302" then
|
51
|
+
"#{resp.code} - #{resp['location']}"
|
52
|
+
elsif resp.code == "404" then
|
53
|
+
"404 - Page not found"
|
54
|
+
else
|
55
|
+
"#{resp.code}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def bitly(e, link)
|
60
|
+
resp, body = http('bit.ly', 80, '/api', 'get', { :url => link })
|
61
|
+
body
|
62
|
+
end
|
63
|
+
|
64
|
+
def isgd(e, link)
|
65
|
+
resp, body = http('is.gd', 80, '/api.php', 'get', { :longurl => link })
|
66
|
+
body
|
67
|
+
end
|
68
|
+
|
69
|
+
def tinyurl(e, link)
|
70
|
+
resp, body = http('tinyurl.com', 80, '/api-create.php', 'get', { :url => link })
|
71
|
+
body
|
72
|
+
end
|
73
|
+
|
74
|
+
def dpaste(e, data)
|
75
|
+
resp, body = http('dpaste.de', 80, '/api/', 'post', { :content => data })
|
76
|
+
body = body[1..-2] if body =~ /^".+"$/ # Remove any quotation marks if there are any
|
77
|
+
body
|
78
|
+
end
|
79
|
+
|
80
|
+
def pastie(data, is_private=false, format='plaintext')
|
81
|
+
resp, body = http('pastie.org', 80, '/pastes', 'post', { :paste => {
|
82
|
+
:body => CGI.escape(data),
|
83
|
+
:parser => format,
|
84
|
+
:restricted => is_private,
|
85
|
+
:authorization => 'burger'
|
86
|
+
}})
|
87
|
+
|
88
|
+
puts resp.code
|
89
|
+
|
90
|
+
if resp.code == '302' then
|
91
|
+
resp['location']
|
92
|
+
else
|
93
|
+
body
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def pastie_command(e, data)
|
98
|
+
pastie(data)
|
99
|
+
end
|
100
|
+
|
101
|
+
def private_pastie_command(e, data)
|
102
|
+
pastie(data, true)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
Plugin.define do
|
107
|
+
name 'url'
|
108
|
+
description 'URL shortening and paste websites'
|
109
|
+
object URL
|
110
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
class Usermodes
|
2
|
+
def initialize(sender, s)
|
3
|
+
@usermodes = Hash.new
|
4
|
+
@usermodes = s['usermodes'] if s.has_key?('usermodes')
|
5
|
+
end
|
6
|
+
|
7
|
+
def settings
|
8
|
+
{ 'usermodes' => @usermodes }
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(instance, channel, username, mode)
|
12
|
+
k = instance + ':' + channel
|
13
|
+
@usermodes[k] = Hash.new if not @usermodes.has_key?(k)
|
14
|
+
@usermodes[k][username] = Array.new if not @usermodes[k].has_key?(username)
|
15
|
+
@usermodes[k][username] << mode
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove(instance, channel, username=nil, mode=nil)
|
19
|
+
k = instance + ':' + channel
|
20
|
+
@usermodes.delete(k) if @usermodes.has_key?(k) and username == nil
|
21
|
+
|
22
|
+
if @usermodes.has_key?(k) and @usermodes[k].has_key?(username) then
|
23
|
+
@usermodes[k][username].delete(mode)
|
24
|
+
@usermodes[k].delete(username) if not mode or @usermodes[k][username].empty?
|
25
|
+
@usermodes.delete(k) if @usermodes[k].empty?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def event(sender, e)
|
30
|
+
if e.command == 'join' and e.respond_to?('user') then
|
31
|
+
if @usermodes.has_key?(k = e.delegate.instance + ':' + e.channel) then
|
32
|
+
if @usermodes[k].has_key?(e.user.username) then
|
33
|
+
@usermodes[k][e.user.username].each{ |mode| e.delegate.write "MODE #{e.channel} +#{mode} #{e.name}" }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def commands
|
40
|
+
{
|
41
|
+
'usermode-add' => [:usermode_add, 4, {
|
42
|
+
:permission => 'admin',
|
43
|
+
:help => 'Apply a usermode to a user when they join a channel',
|
44
|
+
:usage => 'instance channel user mode',
|
45
|
+
:example => 'efnet #zmb zynox o' }],
|
46
|
+
'usermode-del' => [:usermode_del, 4 , {
|
47
|
+
:permission => 'admin',
|
48
|
+
:help => 'Delete a usermode',
|
49
|
+
:usage => 'instance channel user mode',
|
50
|
+
:example => 'efnet #zmb zynox o' }],
|
51
|
+
'usermodes' => [:usermodes, 2 , {
|
52
|
+
:permission => 'admin',
|
53
|
+
:help => 'List all usermodes for a channel',
|
54
|
+
:usage => 'instance channel',
|
55
|
+
:example => 'efnet #zmb' }],
|
56
|
+
'usermodes-ls' => [:usermodes_ls , {
|
57
|
+
:permission => 'admin',
|
58
|
+
:help => 'List all channels usermodes are applied to' }],
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def usermode_add(e, *args)
|
63
|
+
add(*args)
|
64
|
+
"usermode added"
|
65
|
+
end
|
66
|
+
|
67
|
+
def usermode_del(e, *args)
|
68
|
+
remove(*args)
|
69
|
+
"usermode deleted"
|
70
|
+
end
|
71
|
+
|
72
|
+
def usermodes(e, instance, channel)
|
73
|
+
k = instance + ':' + channel
|
74
|
+
if @usermodes.has_key?(k) then
|
75
|
+
@usermodes[k].map{ |k,v| "#{k} +#{v.join('')}" }.join("\n")
|
76
|
+
else
|
77
|
+
'no usermodes found for instance/channel'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def usermodes_ls(e)
|
82
|
+
@usermodes.keys.map{ |k| k.split(':', 2) }.map{ |i,c| "#{i} - #{c}" }.join("\n")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
Plugin.define do
|
87
|
+
name 'usermodes'
|
88
|
+
description 'Auto opping, voicing users in a channel'
|
89
|
+
object Usermodes
|
90
|
+
end
|
data/plugins/users.rb
CHANGED
@@ -13,7 +13,8 @@ class User
|
|
13
13
|
|
14
14
|
def self.create_settings(data)
|
15
15
|
require 'time'
|
16
|
-
user = new(data['username']
|
16
|
+
user = new(data['username'])
|
17
|
+
user.raw_password = data['password']
|
17
18
|
user.userhosts = data['userhosts'] if data.has_key?('userhosts')
|
18
19
|
user.permissions = data['permissions'] if data.has_key?('permissions')
|
19
20
|
user.seen = Time.parse(data['seen']) if data.has_key?('seen') and data['seen']
|
@@ -33,6 +34,10 @@ class User
|
|
33
34
|
@userhosts += other_user.userhosts
|
34
35
|
end
|
35
36
|
|
37
|
+
def raw_password=(new_password)
|
38
|
+
@password = new_password
|
39
|
+
end
|
40
|
+
|
36
41
|
def password=(new_password)
|
37
42
|
@password = Digest::SHA1.hexdigest(new_password)
|
38
43
|
end
|
@@ -79,14 +84,14 @@ end
|
|
79
84
|
class Users
|
80
85
|
attr_accessor :users
|
81
86
|
|
82
|
-
def initialize(sender,
|
87
|
+
def initialize(sender, s={})
|
83
88
|
@delegate = sender
|
84
|
-
@users =
|
89
|
+
@users = s['users'].map{ |user| User.create_settings(user) } if s.has_key?('users')
|
85
90
|
@users = Array.new if not @users
|
86
91
|
end
|
87
92
|
|
88
|
-
def
|
89
|
-
{'users' => @users
|
93
|
+
def settings
|
94
|
+
{ 'users' => @users }
|
90
95
|
end
|
91
96
|
|
92
97
|
def user!(search)
|
@@ -109,24 +114,54 @@ class Users
|
|
109
114
|
end
|
110
115
|
|
111
116
|
def commands
|
112
|
-
require 'zmb/commands'
|
113
117
|
{
|
114
|
-
'meet' =>
|
115
|
-
'forget' =>
|
116
|
-
|
117
|
-
|
118
|
-
'
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
'
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
'
|
129
|
-
|
118
|
+
'meet' => [:meet, 1, { :help => 'Meet a user' }],
|
119
|
+
'forget' => [:forget, 0, {
|
120
|
+
:help => 'Forget about a user',
|
121
|
+
:permission => 'authenticated' }],
|
122
|
+
'permit' => [:permit, 2, {
|
123
|
+
:permission => 'admin',
|
124
|
+
:help => 'Add a permission to a user',
|
125
|
+
:usage => '<user> <permission>',
|
126
|
+
:example => 'zynox admin' }],
|
127
|
+
'deny' => [:deny, 2, {
|
128
|
+
:permission => 'admin',
|
129
|
+
:help => 'Remove a permission from a user',
|
130
|
+
:usage => '<user> <permission>',
|
131
|
+
:example => 'zynox admin' }],
|
132
|
+
'perms' => [:perms, 0, {
|
133
|
+
:permission => 'authenticated',
|
134
|
+
:help => 'List all the permissions you have' }],
|
135
|
+
'merge' => [:merge, 2, {
|
136
|
+
:permission => 'admin',
|
137
|
+
:help => 'Merge two users together, give user a the permissions and useragents of b and then delete b',
|
138
|
+
:usage => 'user_a user_b'}],
|
139
|
+
'password' => [:password, 1, {
|
140
|
+
:permission => 'authenticated',
|
141
|
+
:help => 'Set the password for your account',
|
142
|
+
:usage => 'password' }],
|
143
|
+
'login' => [:login, 2, {
|
144
|
+
:help => 'Login to your account, adding your current userhost to your account.',
|
145
|
+
:usage => 'username password' }],
|
146
|
+
'logout' => [:logout, 0, {
|
147
|
+
:permission => 'authenticated',
|
148
|
+
:help => 'Logout from your account, this will remove your current userhost from your account.' }],
|
149
|
+
'whoami' => [:whoami, 0, { :help => 'Who are you logged in as?' }],
|
150
|
+
'userhosts' => [:userhosts, 0, {
|
151
|
+
:help => 'List all the userhosts associated with your account.' }],
|
152
|
+
'adduserhost' => [:adduserhost, 1, { :help => 'Add a userhost to your account.' }],
|
153
|
+
'rmuserhost' => [:rmuserhost, 1, { :help => 'Remove a userhost to your account.' }],
|
154
|
+
'names' => [:names, 1, {
|
155
|
+
:help => 'List all the users',
|
156
|
+
:usage => '<search>' }],
|
157
|
+
'seen' => [:seen, 1, {
|
158
|
+
:help => 'When was a user last seen?',
|
159
|
+
:usage => 'user' }],
|
160
|
+
'sudo' => [:sudo, 2, {
|
161
|
+
:permission => 'admin',
|
162
|
+
:help => 'Execute a command as another user.',
|
163
|
+
:usage => 'user command',
|
164
|
+
:example => 'zynox whoami' }],
|
130
165
|
}
|
131
166
|
end
|
132
167
|
|
@@ -168,7 +203,7 @@ class Users
|
|
168
203
|
end
|
169
204
|
end
|
170
205
|
|
171
|
-
def perms(e
|
206
|
+
def perms(e)
|
172
207
|
e.user.permissions.empty? ? "#{e.user.username} has no permissions" : e.user.permissions.join(', ')
|
173
208
|
end
|
174
209
|
|
@@ -193,19 +228,17 @@ class Users
|
|
193
228
|
def login(e, username, password)
|
194
229
|
user = user!(username)
|
195
230
|
|
196
|
-
if
|
197
|
-
|
198
|
-
|
199
|
-
user.hosts << e.userhost
|
200
|
-
"#{request.hostname} added to your account #{user.username}"
|
231
|
+
if user and user.password?(password) then
|
232
|
+
user.userhosts << e.userhost
|
233
|
+
"#{e.userhost} added to your account #{user.username}"
|
201
234
|
else
|
202
235
|
'user and/or password is incorrect'
|
203
236
|
end
|
204
237
|
end
|
205
238
|
|
206
239
|
def logout(e)
|
207
|
-
e.user.
|
208
|
-
"userhost #{e.
|
240
|
+
e.user.userhosts.delete(e.userhost)
|
241
|
+
"userhost #{e.userhost} removed from your account."
|
209
242
|
end
|
210
243
|
|
211
244
|
def whoami(e)
|
@@ -221,7 +254,7 @@ class Users
|
|
221
254
|
"#{userhost} added to #{e.user.username}"
|
222
255
|
end
|
223
256
|
|
224
|
-
def
|
257
|
+
def rmuserhost(e, userhost)
|
225
258
|
if e.user.userhosts.delete(userhost) then
|
226
259
|
"#{userhost} deleted from #{e.user.username}"
|
227
260
|
else
|
data/zmb.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{zmb}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
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-03-
|
12
|
+
s.date = %q{2010-03-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}
|
@@ -27,20 +27,26 @@ Gem::Specification.new do |s|
|
|
27
27
|
"VERSION",
|
28
28
|
"bin/zmb",
|
29
29
|
"lib/zmb.rb",
|
30
|
-
"lib/zmb/commands.rb",
|
31
30
|
"lib/zmb/event.rb",
|
32
31
|
"lib/zmb/plugin.rb",
|
33
32
|
"lib/zmb/settings.rb",
|
34
33
|
"lib/zmb/timer.rb",
|
34
|
+
"plugins/announce.rb",
|
35
|
+
"plugins/autorejoin.rb",
|
35
36
|
"plugins/bank.rb",
|
36
37
|
"plugins/commands.rb",
|
38
|
+
"plugins/dns.rb",
|
37
39
|
"plugins/idle.rb",
|
38
40
|
"plugins/irc.rb",
|
41
|
+
"plugins/log.rb",
|
39
42
|
"plugins/nickserv.rb",
|
40
43
|
"plugins/poll.rb",
|
41
44
|
"plugins/quote.rb",
|
42
45
|
"plugins/relay.rb",
|
46
|
+
"plugins/security.rb",
|
43
47
|
"plugins/system.rb",
|
48
|
+
"plugins/url.rb",
|
49
|
+
"plugins/usermodes.rb",
|
44
50
|
"plugins/users.rb",
|
45
51
|
"test/helper.rb",
|
46
52
|
"test/test_zmb.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.
|
4
|
+
version: 0.2.0
|
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-03-
|
12
|
+
date: 2010-03-05 00:00:00 +00:00
|
13
13
|
default_executable: zmb
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -50,20 +50,26 @@ files:
|
|
50
50
|
- VERSION
|
51
51
|
- bin/zmb
|
52
52
|
- lib/zmb.rb
|
53
|
-
- lib/zmb/commands.rb
|
54
53
|
- lib/zmb/event.rb
|
55
54
|
- lib/zmb/plugin.rb
|
56
55
|
- lib/zmb/settings.rb
|
57
56
|
- lib/zmb/timer.rb
|
57
|
+
- plugins/announce.rb
|
58
|
+
- plugins/autorejoin.rb
|
58
59
|
- plugins/bank.rb
|
59
60
|
- plugins/commands.rb
|
61
|
+
- plugins/dns.rb
|
60
62
|
- plugins/idle.rb
|
61
63
|
- plugins/irc.rb
|
64
|
+
- plugins/log.rb
|
62
65
|
- plugins/nickserv.rb
|
63
66
|
- plugins/poll.rb
|
64
67
|
- plugins/quote.rb
|
65
68
|
- plugins/relay.rb
|
69
|
+
- plugins/security.rb
|
66
70
|
- plugins/system.rb
|
71
|
+
- plugins/url.rb
|
72
|
+
- plugins/usermodes.rb
|
67
73
|
- plugins/users.rb
|
68
74
|
- test/helper.rb
|
69
75
|
- test/test_zmb.rb
|