zmb 0.2.1 → 0.3.0
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/README.markdown +17 -2
- data/VERSION +1 -1
- data/lib/zmb.rb +1 -0
- data/lib/zmb/timer.rb +8 -4
- data/lib/zmb/utils.rb +144 -0
- data/plugins/alias.rb +11 -3
- data/plugins/announce.rb +10 -2
- data/plugins/commands.rb +76 -34
- data/plugins/countdown.rb +46 -0
- data/plugins/dns.rb +1 -5
- data/plugins/gcalc.rb +1 -4
- data/plugins/idle.rb +5 -16
- data/plugins/irc.rb +57 -38
- data/plugins/quote.rb +1 -5
- data/plugins/random.rb +2 -20
- data/plugins/relay.rb +8 -4
- data/plugins/security.rb +5 -25
- data/plugins/sed.rb +18 -0
- data/plugins/url.rb +7 -42
- data/plugins/usermodes.rb +7 -3
- data/plugins/users.rb +309 -68
- data/plugins/vouch.rb +94 -0
- data/plugins/weather.rb +48 -0
- data/zmb.gemspec +7 -2
- metadata +7 -2
data/plugins/usermodes.rb
CHANGED
@@ -53,11 +53,15 @@ class Usermodes
|
|
53
53
|
:help => 'List all usermodes for a channel',
|
54
54
|
:usage => 'instance channel',
|
55
55
|
:example => 'efnet #zmb' }],
|
56
|
-
'usermodes-ls' => [:usermodes_ls, {
|
56
|
+
'usermodes-ls' => [:usermodes_ls, 0, {
|
57
57
|
:permission => 'admin',
|
58
58
|
:help => 'List all channels usermodes are applied to' }],
|
59
|
-
'enforce' => [:enforce, 0, {
|
60
|
-
|
59
|
+
'enforce' => [:enforce, 0, {
|
60
|
+
:permission => 'authenticated',
|
61
|
+
:help => 'Enforce all your usermodes in the current channel.' }],
|
62
|
+
'vanish' => [:vanish, 0, {
|
63
|
+
:permission => 'authenticated',
|
64
|
+
:help => 'Remove all your usermodes in the current channel.' }],
|
61
65
|
}
|
62
66
|
end
|
63
67
|
|
data/plugins/users.rb
CHANGED
@@ -4,74 +4,197 @@ end
|
|
4
4
|
|
5
5
|
class User
|
6
6
|
require 'digest/sha1'
|
7
|
+
require 'time'
|
7
8
|
|
8
|
-
attr_accessor :
|
9
|
+
attr_accessor :settings, :users
|
9
10
|
|
10
|
-
def
|
11
|
-
|
11
|
+
def initialize(s)
|
12
|
+
@settings = defaults.merge(s)
|
13
|
+
@settings['seen'] = Time.parse(@settings['seen']) if @settings['seen'].class == String
|
12
14
|
end
|
13
15
|
|
14
|
-
def self.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
def self.networks
|
17
|
+
{
|
18
|
+
'delicious' => ['Delicious', 'http://delicious.com/%s'],
|
19
|
+
'digg' => ['Digg.com', 'http://digg.com/users/%s'],
|
20
|
+
'django' => ['Django People', 'http://djangopeople.net/%s'],
|
21
|
+
'facebook' => ['Facebook', 'http://www.facebook.com/profile.php?id=%s'],
|
22
|
+
'flickr' => ['Flickr', 'http://www.flickr.com/photos/%s/'],
|
23
|
+
'github' => ['GitHub', 'http://github.com/%s'],
|
24
|
+
'pandora' => ['Pandora', 'http://pandora.com/people/%s'],
|
25
|
+
'technorati' => ['Technorati', 'http://technorati.com/people/technorati/%s'],
|
26
|
+
'tumblr' => ['Tumblr', 'http://%s.tumblr.com'],
|
27
|
+
'twitter' => ['Twitter', 'http://twitter.com/%s'],
|
28
|
+
'lastfm' => ['Last.fm', 'http://www.last.fm/user/%s'],
|
29
|
+
'xfire' => ['Xfire', 'http://www.xfire.com/profile/%s/'],
|
30
|
+
'ustream' => ['Ustream.TV', 'http://www.ustream.tv/%s'],
|
31
|
+
'youtube' => ['YouTube', 'http://www.youtube.com/user/%s'],
|
32
|
+
'steam' => ['Steam', 'http://steamcommunity.com/id/%s/'],
|
33
|
+
|
34
|
+
'netforce' => ['Net-Force', 'http://www.net-force.nl/members/view/%s/'],
|
35
|
+
'hts' => ['Hack This Site!', 'http://www.hackthissite.org/user/view/%s/'],
|
36
|
+
}
|
26
37
|
end
|
27
38
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
39
|
+
def defaults
|
40
|
+
{
|
41
|
+
'username' => 'username',
|
42
|
+
'password' => nil,
|
43
|
+
'email' => nil,
|
44
|
+
'userhosts' => [],
|
45
|
+
'permissions' => [],
|
46
|
+
'seen' => Time.now,
|
47
|
+
'location' => '',
|
48
|
+
'active' => true,
|
49
|
+
'networks' => Hash.new,
|
50
|
+
'buffer' => [],
|
51
|
+
}
|
34
52
|
end
|
35
53
|
|
36
|
-
def
|
37
|
-
@
|
38
|
-
@userhosts += other_user.userhosts
|
54
|
+
def username
|
55
|
+
@settings['username']
|
39
56
|
end
|
40
57
|
|
41
58
|
def raw_password=(new_password)
|
42
|
-
@password = new_password
|
59
|
+
@settings['password'] = new_password
|
43
60
|
end
|
44
61
|
|
45
62
|
def password=(new_password)
|
46
|
-
@password = Digest::SHA1.hexdigest(new_password)
|
63
|
+
@settings['password'] = Digest::SHA1.hexdigest(new_password)
|
47
64
|
end
|
48
65
|
|
49
66
|
def password?(check_password)
|
50
|
-
@password != nil and @password == Digest::SHA1.hexdigest(check_password)
|
67
|
+
@settings['password'] != nil and @settings['password'] == Digest::SHA1.hexdigest(check_password)
|
68
|
+
end
|
69
|
+
|
70
|
+
def email
|
71
|
+
@settings['email']
|
72
|
+
end
|
73
|
+
|
74
|
+
def email=(e)
|
75
|
+
@settings['email'] = e
|
76
|
+
end
|
77
|
+
|
78
|
+
def userhosts
|
79
|
+
@settings['userhosts']
|
80
|
+
end
|
81
|
+
|
82
|
+
def permissions
|
83
|
+
@settings['permissions']
|
84
|
+
end
|
85
|
+
|
86
|
+
def seen
|
87
|
+
@settings['seen']
|
88
|
+
end
|
89
|
+
|
90
|
+
def location
|
91
|
+
@settings['location']
|
92
|
+
end
|
93
|
+
|
94
|
+
def location=(l)
|
95
|
+
@settings['location'] = l
|
96
|
+
end
|
97
|
+
|
98
|
+
def network?(n)
|
99
|
+
@settings['networks'].has_key?(n)
|
100
|
+
end
|
101
|
+
|
102
|
+
def network(n)
|
103
|
+
return nil if not self.class.networks.has_key?(n)
|
104
|
+
self.class.networks[n][1].sub('%s', network!(n))
|
105
|
+
end
|
106
|
+
|
107
|
+
def network!(n)
|
108
|
+
@settings['networks'][n]
|
109
|
+
end
|
110
|
+
|
111
|
+
def networks
|
112
|
+
@settings['networks'].keys
|
113
|
+
end
|
114
|
+
|
115
|
+
def add_network(n, info)
|
116
|
+
@settings['networks'][n] = info
|
117
|
+
end
|
118
|
+
|
119
|
+
def saw(e=nil)
|
120
|
+
@settings['seen'] = Time.now
|
121
|
+
|
122
|
+
if e then
|
123
|
+
buffer.each do |message|
|
124
|
+
e.delegate.message(e.name, message)
|
125
|
+
end
|
126
|
+
|
127
|
+
clear_buffer
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def activate
|
132
|
+
@settings['active'] = true
|
133
|
+
end
|
134
|
+
|
135
|
+
def deactivate
|
136
|
+
@settings['active'] = false
|
137
|
+
end
|
138
|
+
|
139
|
+
def to_s
|
140
|
+
username
|
141
|
+
end
|
142
|
+
|
143
|
+
def concat(other_user)
|
144
|
+
@permissions += other_user.permissions
|
145
|
+
@userhosts += other_user.userhosts
|
146
|
+
end
|
147
|
+
|
148
|
+
def anonymous?
|
149
|
+
false
|
51
150
|
end
|
52
151
|
|
53
152
|
def authenticated?
|
54
153
|
true
|
55
154
|
end
|
56
155
|
|
156
|
+
def active?
|
157
|
+
@settings['active']
|
158
|
+
end
|
159
|
+
|
57
160
|
def admin?
|
58
|
-
|
161
|
+
permissions.include?('admin')
|
59
162
|
end
|
60
163
|
|
61
164
|
def permission?(permission)
|
62
|
-
admin? or
|
165
|
+
admin? or permissions.include?(permission)
|
63
166
|
end
|
64
167
|
|
65
168
|
def permit(permission)
|
66
|
-
|
169
|
+
permissions << permission
|
67
170
|
end
|
68
171
|
|
69
172
|
def deny(permission)
|
70
|
-
|
173
|
+
permissions.delete(permission)
|
174
|
+
end
|
175
|
+
|
176
|
+
def buffer
|
177
|
+
@settings['buffer']
|
178
|
+
end
|
179
|
+
|
180
|
+
def clear_buffer
|
181
|
+
@settings['buffer'] = []
|
182
|
+
end
|
183
|
+
|
184
|
+
def send(message)
|
185
|
+
@settings['buffer'] << message
|
71
186
|
end
|
72
187
|
end
|
73
188
|
|
74
189
|
class AnonymousUser
|
190
|
+
def to_s
|
191
|
+
'nobody'
|
192
|
+
end
|
193
|
+
|
194
|
+
def anonymous?
|
195
|
+
true
|
196
|
+
end
|
197
|
+
|
75
198
|
def authenticated?
|
76
199
|
false
|
77
200
|
end
|
@@ -86,37 +209,42 @@ class AnonymousUser
|
|
86
209
|
end
|
87
210
|
|
88
211
|
class Users
|
89
|
-
attr_accessor :users
|
212
|
+
attr_accessor :users, :user_defaults
|
90
213
|
|
91
214
|
def initialize(sender, s={})
|
92
215
|
@delegate = sender
|
93
|
-
@users =
|
94
|
-
@
|
216
|
+
@users = Array.new
|
217
|
+
@user_defaults = Hash.new
|
218
|
+
@users = s['users'].map{ |user| User.new(user) } if s.has_key?('users')
|
219
|
+
@user_defaults = s['user_defaults'] if s.has_key?('user_defaults')
|
95
220
|
end
|
96
221
|
|
97
222
|
def settings
|
98
|
-
{ 'users' => @users }
|
223
|
+
{ 'users' => @users.map{ |u| u.settings }, 'user_defaults' => @user_defaults }
|
99
224
|
end
|
100
225
|
|
101
|
-
def user!(search)
|
102
|
-
|
226
|
+
def user!(search, active=nil)
|
227
|
+
if active == nil then
|
228
|
+
@users.find{ |user| user.userhosts.include?(search) or user.username == search }
|
229
|
+
else
|
230
|
+
@users.find{ |user| (user.userhosts.include?(search) or user.username == search) and user.active? == active }
|
231
|
+
end
|
103
232
|
end
|
104
233
|
|
105
|
-
def user(search)
|
106
|
-
user!(search) or AnonymousUser.new
|
234
|
+
def user(search, active=nil)
|
235
|
+
user!(search, active) or AnonymousUser.new
|
107
236
|
end
|
108
237
|
|
109
238
|
def pre_event(sender, e)
|
110
|
-
e.user = user(e.userhost) if not e.user and e.respond_to?('userhost')
|
111
|
-
e.user.seen = Time.now if e.user.respond_to?('seen=')
|
112
239
|
e.users = self
|
113
|
-
|
114
|
-
|
115
|
-
#def e.user; user(e.userhost); end
|
240
|
+
e.user = user(e.userhost, true) if not e.user and e.respond_to?('userhost')
|
241
|
+
e.user.saw(e)
|
116
242
|
end
|
117
243
|
|
118
244
|
def commands
|
119
245
|
{
|
246
|
+
'activate' => [:activate, 1, { :help => 'Activate a user account' }],
|
247
|
+
'deactivate' => [:deactivate, 1, { :help => 'Deactivate a user account' }],
|
120
248
|
'meet' => [:meet, 1, { :help => 'Meet a user' }],
|
121
249
|
'forget' => [:forget, 1, {
|
122
250
|
:help => 'Forget about a user',
|
@@ -150,7 +278,7 @@ class Users
|
|
150
278
|
'logout' => [:logout, 0, {
|
151
279
|
:permission => 'authenticated',
|
152
280
|
:help => 'Logout from your account, this will remove your current userhost from your account.' }],
|
153
|
-
'whoami' => [
|
281
|
+
'whoami' => [lambda { |e| "#{e.user}" }, 0, { :help => 'Who are you logged in as?' }],
|
154
282
|
'userhosts' => [:userhosts, 0, {
|
155
283
|
:permission => 'authenticated',
|
156
284
|
:help => 'List all the userhosts associated with your account.' }],
|
@@ -171,16 +299,60 @@ class Users
|
|
171
299
|
:help => 'Execute a command as another user.',
|
172
300
|
:usage => 'user command',
|
173
301
|
:example => 'zynox whoami' }],
|
302
|
+
'location' => [:location, 1, {
|
303
|
+
:permission => 'authenticated',
|
304
|
+
:help => 'Set your location' }],
|
305
|
+
'email' => [:email, 1, {
|
306
|
+
:permission => 'authenticated',
|
307
|
+
:help => 'Set your email' }],
|
308
|
+
'user-defaults' => [:user_defaults_command, 0],
|
309
|
+
'user-default' => [:set_default, 2, {
|
310
|
+
:permission => 'admin',
|
311
|
+
:help => 'Set a user default',
|
312
|
+
:usage => 'key value',
|
313
|
+
:example => 'active false' }],
|
314
|
+
'rm-user-default' => [:del_default, 1, {
|
315
|
+
:permission => 'admin',
|
316
|
+
:help => 'Remove a user default',
|
317
|
+
:usage => 'key',
|
318
|
+
:example => 'active' }],
|
319
|
+
'network' => [:network, 2, {
|
320
|
+
:permission => 'authenticated',
|
321
|
+
:usage => 'lastfm zynox' }],
|
322
|
+
'networks' => [:networks, 0, { :help => 'List all availible networks' }],
|
323
|
+
'profile' => [:profile, 1, {
|
324
|
+
:permission => 'authenticated' }],
|
325
|
+
'message' => [:message, 2, { :permission => 'authenticated' }]
|
174
326
|
}
|
175
327
|
end
|
176
328
|
|
329
|
+
def activate(e, username)
|
330
|
+
if user = user!(username) then
|
331
|
+
user.activate
|
332
|
+
"#{username} active"
|
333
|
+
else
|
334
|
+
"#{username} does not exist"
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
def deactivate(e, username)
|
339
|
+
if user = user!(username) then
|
340
|
+
user.deactivate
|
341
|
+
"#{username} deactivated"
|
342
|
+
else
|
343
|
+
"#{username} does not exist"
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
177
347
|
def meet(e, username=nil)
|
178
348
|
username = e.name if not e.user.admin?
|
179
349
|
|
180
|
-
if
|
181
|
-
|
350
|
+
if username == 'nobody' then
|
351
|
+
"nobody is a excluded name"
|
352
|
+
elsif not user!(username) then
|
353
|
+
@users << user = User.new(@user_defaults.merge({'username' => username}))
|
182
354
|
user.userhosts << e.userhost if not e.user.admin? and e.respond_to?('userhost')
|
183
|
-
"Hello #{
|
355
|
+
"Hello #{user}"
|
184
356
|
else
|
185
357
|
"You already have an account #{e.user}"
|
186
358
|
end
|
@@ -254,10 +426,6 @@ class Users
|
|
254
426
|
"userhost #{e.userhost} removed from your account."
|
255
427
|
end
|
256
428
|
|
257
|
-
def whoami(e)
|
258
|
-
e.user.authenticated? ? "#{e.user}" : 'nobody'
|
259
|
-
end
|
260
|
-
|
261
429
|
def userhosts(e)
|
262
430
|
e.user.userhosts.empty? ? "#{e.user} has no userhosts" : e.user.userhosts.join(', ')
|
263
431
|
end
|
@@ -288,33 +456,106 @@ class Users
|
|
288
456
|
|
289
457
|
def seen(e, username)
|
290
458
|
if user = user!(username) and user.seen then
|
291
|
-
|
292
|
-
|
293
|
-
if diff < 60 then
|
294
|
-
msg = "#{Integer(diff)} seconds ago"
|
295
|
-
elsif diff < 3600 then
|
296
|
-
msg = "#{Integer(diff/60)} minutes ago"
|
297
|
-
elsif diff < 86400 then
|
298
|
-
msg = "about #{Integer(diff/3600)} hours ago"
|
299
|
-
else
|
300
|
-
msg = "#{Integer(diff/86400)} days ago"
|
301
|
-
end
|
302
|
-
|
303
|
-
"#{username} last seen #{msg}"
|
459
|
+
"#{username} last seen #{user.seen.since_words}"
|
304
460
|
else
|
305
461
|
"#{username} has never been seen"
|
306
462
|
end
|
307
463
|
end
|
308
464
|
|
309
|
-
def sudo(e, username, command)
|
310
|
-
|
465
|
+
def sudo(e, username, command=nil)
|
466
|
+
user = user(username)
|
467
|
+
|
468
|
+
if command then
|
311
469
|
new_event = e.clone
|
312
470
|
new_event.user = user
|
313
471
|
new_event.message = @delegate.instances['commands'].cc + command
|
314
472
|
@delegate.event(self, new_event)
|
315
473
|
nil
|
316
474
|
else
|
317
|
-
|
475
|
+
e.user = user
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
def location(e, loct=nil)
|
480
|
+
if loct then
|
481
|
+
e.user.location = loct
|
482
|
+
"location set to #{e.user.location}"
|
483
|
+
else
|
484
|
+
e.user.location
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
def email(e, em=nil)
|
489
|
+
if em then
|
490
|
+
e.user.email = em
|
491
|
+
"email set to #{e.user.email}"
|
492
|
+
else
|
493
|
+
e.user.email
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
def user_defaults_command(e)
|
498
|
+
user_defaults.map{ |k,v| "#{k}: #{v}" }.join("\n")
|
499
|
+
end
|
500
|
+
|
501
|
+
def set_default(e, key, value)
|
502
|
+
value = case value
|
503
|
+
when 'true' then true
|
504
|
+
when 'false' then false
|
505
|
+
when 'yes' then true
|
506
|
+
when 'no' then false
|
507
|
+
else value
|
508
|
+
end
|
509
|
+
|
510
|
+
user_defaults[key] = value
|
511
|
+
"#{key} added to defaults"
|
512
|
+
end
|
513
|
+
|
514
|
+
def del_default(e, key)
|
515
|
+
user_defaults.delete(key)
|
516
|
+
"#{key} removed from defaults"
|
517
|
+
end
|
518
|
+
|
519
|
+
def network(e, n, value=nil)
|
520
|
+
if value then
|
521
|
+
e.user.add_network(n, value)
|
522
|
+
"Username for #{User.networks[n][0]} set to #{value}" if User.networks.has_key?(n)
|
523
|
+
else
|
524
|
+
if e.user.network?(n) then
|
525
|
+
"#{n}: #{e.user.network(n)} (#{e.user.network!(n)})"
|
526
|
+
else
|
527
|
+
"No username set for #{n}"
|
528
|
+
end
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
def networks(e)
|
533
|
+
User.networks.keys.join(', ')
|
534
|
+
end
|
535
|
+
|
536
|
+
def profile(e, username=nil)
|
537
|
+
username = e.user.username unless username
|
538
|
+
|
539
|
+
if (user = user!(username)) then
|
540
|
+
user.networks.reject{ |n| not User.networks.has_key?(n) }.map{ |n| "#{User.networks[n][0]}: #{user.network(n)}" }.join(', ')
|
541
|
+
else
|
542
|
+
"No such user"
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
546
|
+
def message(e, username, message)
|
547
|
+
user = user!(username)
|
548
|
+
|
549
|
+
if user then
|
550
|
+
if e.user.admin? then
|
551
|
+
user.send(message)
|
552
|
+
else
|
553
|
+
user.send("#{e.user.username}: message")
|
554
|
+
end
|
555
|
+
|
556
|
+
"message sent"
|
557
|
+
else
|
558
|
+
"no such user"
|
318
559
|
end
|
319
560
|
end
|
320
561
|
end
|