zmb 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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