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.
@@ -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, { :permission => 'authenticated' }],
60
- 'vanish' => [:vanish, 0, { :permission => 'authenticated' }],
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
 
@@ -4,74 +4,197 @@ end
4
4
 
5
5
  class User
6
6
  require 'digest/sha1'
7
+ require 'time'
7
8
 
8
- attr_accessor :username, :password, :userhosts, :permissions, :seen, :users
9
+ attr_accessor :settings, :users
9
10
 
10
- def to_json(*a)
11
- {'username' => @username, 'password' => @password, 'userhosts' => @userhosts, 'permissions' => @permissions, 'seen' => @seen}.to_json(*a)
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.create_settings(data)
15
- require 'time'
16
- user = new(data['username'])
17
- user.raw_password = data['password']
18
- user.userhosts = data['userhosts'] if data.has_key?('userhosts')
19
- user.permissions = data['permissions'] if data.has_key?('permissions')
20
- user.seen = Time.parse(data['seen']) if data.has_key?('seen') and data['seen']
21
- user
22
- end
23
-
24
- def to_s
25
- @username
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 initialize(username=nil, password=nil, userhost=nil)
29
- @username = username
30
- @password = Digest::SHA1.hexdigest(password) if password
31
- @userhosts = Array.new
32
- @userhosts << userhost if userhost
33
- @permissions = Array.new
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 concat(other_user)
37
- @permissions += other_user.permissions
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
- @permissions.include?('owner') or @permissions.include?('admin')
161
+ permissions.include?('admin')
59
162
  end
60
163
 
61
164
  def permission?(permission)
62
- admin? or @permissions.include?(permission)
165
+ admin? or permissions.include?(permission)
63
166
  end
64
167
 
65
168
  def permit(permission)
66
- @permissions << permission
169
+ permissions << permission
67
170
  end
68
171
 
69
172
  def deny(permission)
70
- @permissions.delete(permission)
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 = s['users'].map{ |user| User.create_settings(user) } if s.has_key?('users')
94
- @users = Array.new if not @users
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
- @users.find{|user| user.userhosts.include?(search) or user.username == search}
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
- #e.instance_variable_set(:@user, user(e.userhost)) if e.respond_to?('userhost')
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' => [:whoami, 0, { :help => 'Who are you logged in as?' }],
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 not user!(username) then
181
- @users << user = User.new(username)
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 #{e.user}"
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
- diff = Time.now - user.seen
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
- if user = user!(username) then
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
- "#{username}: User not found"
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