rbot 0.9.9 → 0.9.10

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.
Files changed (72) hide show
  1. data/AUTHORS +8 -0
  2. data/ChangeLog +51 -0
  3. data/INSTALL +4 -0
  4. data/README +1 -0
  5. data/REQUIREMENTS +11 -0
  6. data/TODO +2 -0
  7. data/bin/rbot +21 -2
  8. data/data/rbot/languages/german.lang +4 -1
  9. data/data/rbot/languages/russian.lang +75 -0
  10. data/data/rbot/plugins/autoop.rb +42 -51
  11. data/data/rbot/plugins/bans.rb +205 -0
  12. data/data/rbot/plugins/bash.rb +56 -0
  13. data/data/rbot/plugins/chucknorris.rb +74 -0
  14. data/data/rbot/plugins/chucknorris.yml.gz +0 -0
  15. data/data/rbot/plugins/deepthoughts.rb +95 -0
  16. data/data/rbot/plugins/demauro.rb +95 -0
  17. data/data/rbot/plugins/digg.rb +51 -0
  18. data/data/rbot/plugins/figlet.rb +24 -0
  19. data/data/rbot/plugins/forecast.rb +133 -0
  20. data/data/rbot/plugins/freshmeat.rb +13 -7
  21. data/data/rbot/plugins/google.rb +2 -0
  22. data/data/rbot/plugins/grouphug.rb +36 -0
  23. data/data/rbot/plugins/imdb.rb +92 -0
  24. data/data/rbot/plugins/insult.rb +8 -1
  25. data/data/rbot/plugins/iplookup.rb +227 -0
  26. data/data/rbot/plugins/karma.rb +2 -2
  27. data/data/rbot/plugins/keywords.rb +470 -0
  28. data/data/rbot/plugins/lart.rb +132 -146
  29. data/data/rbot/plugins/lastfm.rb +25 -0
  30. data/data/rbot/plugins/markov.rb +204 -0
  31. data/data/rbot/plugins/math.rb +5 -1
  32. data/data/rbot/plugins/nickserv.rb +71 -11
  33. data/data/rbot/plugins/opme.rb +19 -19
  34. data/data/rbot/plugins/quakeauth.rb +2 -2
  35. data/data/rbot/plugins/quotes.rb +40 -25
  36. data/data/rbot/plugins/remind.rb +1 -1
  37. data/data/rbot/plugins/rot13.rb +2 -2
  38. data/data/rbot/plugins/roulette.rb +49 -15
  39. data/data/rbot/plugins/rss.rb +585 -0
  40. data/data/rbot/plugins/rubyurl.rb +39 -0
  41. data/data/rbot/plugins/seen.rb +2 -1
  42. data/data/rbot/plugins/slashdot.rb +5 -5
  43. data/data/rbot/plugins/spell.rb +5 -0
  44. data/data/rbot/plugins/theyfightcrime.rb +121 -0
  45. data/data/rbot/plugins/threat.rb +55 -0
  46. data/data/rbot/plugins/tinyurl.rb +39 -0
  47. data/data/rbot/plugins/topic.rb +204 -0
  48. data/data/rbot/plugins/urban.rb +71 -0
  49. data/data/rbot/plugins/url.rb +399 -4
  50. data/data/rbot/plugins/wow.rb +123 -0
  51. data/data/rbot/plugins/wserver.rb +1 -1
  52. data/data/rbot/templates/levels.rbot +2 -0
  53. data/lib/rbot/auth.rb +207 -96
  54. data/lib/rbot/channel.rb +5 -5
  55. data/lib/rbot/config.rb +125 -24
  56. data/lib/rbot/dbhash.rb +87 -21
  57. data/lib/rbot/httputil.rb +181 -13
  58. data/lib/rbot/ircbot.rb +525 -179
  59. data/lib/rbot/ircsocket.rb +330 -54
  60. data/lib/rbot/message.rb +66 -23
  61. data/lib/rbot/messagemapper.rb +25 -17
  62. data/lib/rbot/plugins.rb +244 -115
  63. data/lib/rbot/post-clean.rb +1 -0
  64. data/lib/rbot/{post-install.rb → post-config.rb} +1 -1
  65. data/lib/rbot/rbotconfig.rb +29 -14
  66. data/lib/rbot/registry.rb +111 -72
  67. data/lib/rbot/rfc2812.rb +208 -197
  68. data/lib/rbot/timer.rb +4 -0
  69. data/lib/rbot/utils.rb +2 -2
  70. metadata +127 -104
  71. data/data/rbot/plugins/rss.rb.disabled +0 -414
  72. data/lib/rbot/keywords.rb +0 -433
@@ -0,0 +1,123 @@
1
+ #
2
+ # World of Warcraft Realm Status plugin for rbot
3
+ # by MrChucho (mrchucho@mrchucho.net)
4
+ # Copyright (C) 2006 Ralph M. Churchill
5
+ #
6
+ # Requires: insatiable appetite for World of Warcraft
7
+ #
8
+ require 'open-uri'
9
+ require 'rexml/document'
10
+
11
+ class Realm
12
+ attr_accessor :name,:status,:type,:pop
13
+ def initialize(name,status,type,pop)
14
+ self.name = pretty_realm(name)
15
+ self.status = pretty_status(status)
16
+ self.type = pretty_type(type)
17
+ self.pop = pretty_pop(pop)
18
+ end
19
+ def Realm.get_realm_status(realm_name)
20
+ begin
21
+ open("http://www.worldofwarcraft.com/realmstatus/status.xml") do |xmldoc|
22
+ realm_list = (REXML::Document.new xmldoc).root
23
+ realm_data = realm_list.elements["r[@n=\"#{realm_name}\"]"]
24
+ if realm_data and realm_data.attributes.any? then
25
+ realm = Realm.new(
26
+ realm_data.attributes['n'],
27
+ realm_data.attributes['s'].to_i,
28
+ realm_data.attributes['t'].to_i,
29
+ realm_data.attributes['l'].to_i)
30
+ else
31
+ "Realm, #{realm_name}, not found."
32
+ end
33
+ end
34
+ rescue => err
35
+ "Error retrieving realm status: #{err}"
36
+ end
37
+ end
38
+ def to_s
39
+ "#{name} (#{type}) Status: #{status} Population: #{pop}"
40
+ end
41
+ # just a longer, tabluar format
42
+ # might be good if displaying multiple realms
43
+ def _to_s
44
+ sprintf("%-8s %-20s %-8s %-9s\n%-11s %-22s %-8s %-9s",
45
+ "Status","Realm","Type","Population",
46
+ status,name,type,pop)
47
+ end
48
+ private
49
+ def pretty_status(status)
50
+ case status
51
+ when 1
52
+ "3Up"
53
+ when 2
54
+ "5Down"
55
+ end
56
+ end
57
+ def pretty_pop(pop)
58
+ case pop
59
+ when 1
60
+ "3Low"
61
+ when 2
62
+ "7Medium"
63
+ when 3
64
+ "4High"
65
+ when 4
66
+ "5Max(Queued)"
67
+ end
68
+ end
69
+ def pretty_realm(realm)
70
+ "#{realm}"
71
+ end
72
+ def pretty_type(type)
73
+ case type
74
+ when 0
75
+ 'RP-PVP'
76
+ when 1
77
+ 'Normal'
78
+ when 2
79
+ 'PVP'
80
+ when 3
81
+ 'RP'
82
+ end
83
+ end
84
+ end
85
+
86
+ class RealmPlugin < Plugin
87
+ USAGE="realm <realm> => determine the status of a Warcraft realm"
88
+ def initialize
89
+ super
90
+ class << @registry
91
+ def store(val)
92
+ val
93
+ end
94
+ def restore(val)
95
+ val
96
+ end
97
+ end
98
+ end
99
+ def help(plugin,topic="")
100
+ USAGE
101
+ end
102
+ def usage(m,params={})
103
+ m.reply USAGE
104
+ end
105
+ def realm(m,params)
106
+ if params[:realm_name] and params[:realm_name].any?
107
+ realm_name = params[:realm_name].collect{|tok|
108
+ tok.capitalize
109
+ }.join(' ')
110
+ @registry[m.sourcenick] = realm_name
111
+ m.reply Realm.get_realm_status(realm_name)
112
+ else
113
+ if @registry.has_key?(m.sourcenick)
114
+ realm_name = @registry[m.sourcenick]
115
+ m.reply Realm.get_realm_status(realm_name)
116
+ else
117
+ m.reply "I don't know which realm you want.\n#{USAGE}"
118
+ end
119
+ end
120
+ end
121
+ end
122
+ plugin = RealmPlugin.new
123
+ plugin.map 'realm *realm_name', :defaults => {:realm_name => false}
@@ -61,7 +61,7 @@ class WserverPlugin < Plugin
61
61
  hostname = err.message
62
62
  retry
63
63
  rescue StandardError => err
64
- puts err
64
+ error err.inspect
65
65
  m.reply "couldn't connect to #{uri.host}:#{uri.port} :("
66
66
  return
67
67
  end
@@ -6,6 +6,7 @@
6
6
  80 nickserv
7
7
  80 qauth
8
8
  80 http
9
+ 85 autoop
9
10
  70 opme
10
11
  70 mode
11
12
  70 say
@@ -18,6 +19,7 @@
18
19
  15 delquote
19
20
  12 msginsult
20
21
  12 remind_other
22
+ 12 markov
21
23
  5 rmlart
22
24
  5 rmpraise
23
25
  5 keycmd
data/lib/rbot/auth.rb CHANGED
@@ -4,39 +4,45 @@ module Irc
4
4
  # netmask:: netmask to test against
5
5
  # Compare a netmask with a standard IRC glob, e.g foo!bar@baz.com would
6
6
  # match *!*@baz.com, foo!*@*, *!bar@*, etc.
7
- def Irc.netmaskmatch(globmask, netmask)
8
- regmask = globmask.gsub(/\*/, ".*?")
9
- return true if(netmask =~ /#{regmask}/)
7
+ def Irc.netmaskmatch( globmask, netmask )
8
+ regmask = Regexp.escape( globmask )
9
+ regmask.gsub!( /\\\*/, '.*' )
10
+ return true if(netmask =~ /#{regmask}/i)
10
11
  return false
11
12
  end
12
13
 
13
14
  # check if a string is an actual IRC hostmask
14
- def Irc.ismask(mask)
15
+ def Irc.ismask?(mask)
15
16
  mask =~ /^.+!.+@.+$/
16
17
  end
17
18
 
18
-
19
+ Struct.new( 'UserData', :level, :password, :hostmasks )
20
+
19
21
  # User-level authentication to allow/disallow access to bot commands based
20
22
  # on hostmask and userlevel.
21
23
  class IrcAuth
22
- BotConfig.register BotConfigStringValue.new('auth.password',
23
- :default => "rbotauth", :wizard => true,
24
- :desc => "Your password for maxing your auth with the bot (used to associate new hostmasks with your owner-status etc)")
25
-
24
+ BotConfig.register BotConfigStringValue.new( 'auth.password',
25
+ :default => 'rbotauth', :wizard => true,
26
+ :desc => 'Your password for maxing your auth with the bot (used to associate new hostmasks with your owner-status etc)' )
27
+ BotConfig.register BotConfigIntegerValue.new( 'auth.default_level',
28
+ :default => 10, :wizard => true,
29
+ :desc => 'The default level for new/unknown users' )
30
+
26
31
  # create a new IrcAuth instance.
27
32
  # bot:: associated bot class
28
33
  def initialize(bot)
29
34
  @bot = bot
30
- @users = Hash.new(0)
35
+ @users = Hash.new do
36
+ Struct::UserData.new(@bot.config['auth.default_level'], '', [])
37
+ end
31
38
  @levels = Hash.new(0)
32
- if(File.exist?("#{@bot.botclass}/users.rbot"))
33
- IO.foreach("#{@bot.botclass}/users.rbot") do |line|
34
- if(line =~ /\s*(\d+)\s*(\S+)/)
35
- level = $1.to_i
36
- mask = $2
37
- @users[mask] = level
38
- end
39
- end
39
+ @currentUsers = Hash.new( nil )
40
+ if( File.exist?( "#{@bot.botclass}/users.yaml" ) )
41
+ File.open( "#{@bot.botclass}/users.yaml" ) { |file|
42
+ # work around YAML not maintaining the default proc
43
+ @loadedusers = YAML::parse(file).transform
44
+ @users.update(@loadedusers)
45
+ }
40
46
  end
41
47
  if(File.exist?("#{@bot.botclass}/levels.rbot"))
42
48
  IO.foreach("#{@bot.botclass}/levels.rbot") do |line|
@@ -47,22 +53,43 @@ module Irc
47
53
  end
48
54
  end
49
55
  end
56
+ if @levels.length < 1
57
+ raise RuntimeError, "No valid levels.rbot found! If you really want a free-for-all bot and this isn't the result of a previous error, write a proper levels.rbot"
58
+ end
50
59
  end
51
60
 
52
61
  # save current users and levels to files.
53
62
  # levels are written to #{botclass}/levels.rbot
54
- # users are written to #{botclass}/users.rbot
63
+ # users are written to #{botclass}/users.yaml
55
64
  def save
56
65
  Dir.mkdir("#{@bot.botclass}") if(!File.exist?("#{@bot.botclass}"))
57
- File.open("#{@bot.botclass}/users.rbot", "w") do |file|
58
- @users.each do |key, value|
59
- file.puts "#{value} #{key}"
66
+ begin
67
+ debug "Writing new users.yaml ..."
68
+ File.open("#{@bot.botclass}/users.yaml.new", 'w') do |file|
69
+ file.puts @users.to_yaml
60
70
  end
71
+ debug "Officializing users.yaml ..."
72
+ File.rename("#{@bot.botclass}/users.yaml.new",
73
+ "#{@bot.botclass}/users.yaml")
74
+ rescue
75
+ error "failed to write configuration file users.yaml! #{$!}"
76
+ error "#{e.class}: #{e}"
77
+ error e.backtrace.join("\n")
61
78
  end
62
- File.open("#{@bot.botclass}/levels.rbot", "w") do |file|
63
- @levels.each do |key, value|
64
- file.puts "#{value} #{key}"
79
+ begin
80
+ debug "Writing new levels.rbot ..."
81
+ File.open("#{@bot.botclass}/levels.rbot.new", 'w') do |file|
82
+ @levels.each do |key, value|
83
+ file.puts "#{value} #{key}"
84
+ end
65
85
  end
86
+ debug "Officializing levels.rbot ..."
87
+ File.rename("#{@bot.botclass}/levels.rbot.new",
88
+ "#{@bot.botclass}/levels.rbot")
89
+ rescue
90
+ error "failed to write configuration file levels.rbot! #{$!}"
91
+ error "#{e.class}: #{e}"
92
+ error e.backtrace.join("\n")
66
93
  end
67
94
  end
68
95
 
@@ -73,30 +100,58 @@ module Irc
73
100
  # returns true if user with hostmask +mask+ is permitted to perform
74
101
  # +command+ optionally pass tell as the target for the "insufficient auth"
75
102
  # message, if the user is not authorised
76
- def allow?(command, mask, tell=nil)
77
- auth = userlevel(mask)
78
- if(auth >= @levels[command])
79
- return true
80
- else
81
- debug "#{mask} is not allowed to perform #{command}"
82
- @bot.say tell, "insufficient \"#{command}\" auth (have #{auth}, need #{@levels[command]})" if tell
83
- return false
84
- end
103
+ def allow?( command, mask, tell=nil )
104
+ auth = @users[matchingUser(mask)].level # Directly using @users[] is possible, because UserData has a default setting
105
+ if( auth >= @levels[command] )
106
+ return true
107
+ else
108
+ debug "#{mask} is not allowed to perform #{command}"
109
+ @bot.say tell, "insufficient \"#{command}\" auth (have #{auth}, need #{@levels[command]})" if tell
110
+ return false
111
+ end
85
112
  end
86
113
 
87
114
  # add user with hostmask matching +mask+ with initial auth level +level+
88
- def useradd(mask, level)
89
- if(Irc.ismask(mask))
90
- @users[mask] = level
91
- end
115
+ def useradd( username, level=@bot.config['auth.default_level'], password='', hostmask='*!*@*' )
116
+ @users[username] = Struct::UserData.new( level, password, [hostmask] ) if ! @users.has_key? username
92
117
  end
93
-
118
+
94
119
  # mask:: mask of user to remove
95
120
  # remove user with mask +mask+
96
- def userdel(mask)
97
- if(Irc.ismask(mask))
98
- @users.delete(mask)
121
+ def userdel( username )
122
+ @users.delete( username ) if @users.has_key? username
123
+ end
124
+
125
+ def usermod( username, item, value=nil )
126
+ if @users.has_key?( username )
127
+ case item
128
+ when 'hostmask'
129
+ if Irc.ismask?( value )
130
+ @users[username].hostmasks = [ value ]
131
+ return true
132
+ end
133
+ when '+hostmask'
134
+ if Irc.ismask?( value )
135
+ @users[username].hostmasks += [ value ]
136
+ return true
137
+ end
138
+ when '-hostmask'
139
+ if Irc.ismask?( value )
140
+ @users[username].hostmasks -= [ value ]
141
+ return true
142
+ end
143
+ when 'password'
144
+ @users[username].password = value
145
+ return true
146
+ when 'level'
147
+ @users[username].level = value.to_i
148
+ return true
149
+ else
150
+ debug "usermod: Tried to modify unknown item #{item}"
151
+ # @bot.say tell, "Unknown item #{item}" if tell
152
+ end
99
153
  end
154
+ return false
100
155
  end
101
156
 
102
157
  # command:: command to adjust
@@ -106,30 +161,33 @@ module Irc
106
161
  @levels[command] = level
107
162
  end
108
163
 
109
- # specific users.
110
- # mask:: mask of user
111
- # returns the authlevel of user with mask +mask+
112
- # finds the matching user which has the highest authlevel (so you can have
113
- # a default level of 5 for *!*@*, and yet still give higher levels to
114
- def userlevel(mask)
115
- # go through hostmask list, find match with _highest_ level (all users
116
- # will match *!*@*)
117
- level = 0
118
- @users.each {|user,userlevel|
119
- if(Irc.netmaskmatch(user, mask))
120
- level = userlevel if userlevel > level
164
+ def matchingUser( mask )
165
+ currentUser = nil
166
+ currentLevel = 0
167
+ @users.each { |user, data| # TODO Will get easier if YPaths are used...
168
+ if data.level > currentLevel
169
+ data.hostmasks.each { |hostmask|
170
+ if Irc.netmaskmatch( hostmask, mask )
171
+ currentUser = user
172
+ currentLevel = data.level
173
+ end
174
+ }
121
175
  end
122
176
  }
123
- level
177
+ currentUser
178
+ end
179
+
180
+ def identify( mask, username, password )
181
+ return false unless @users.has_key?(username) && @users[username].password == password
182
+ @bot.auth.usermod( username, '+hostmask', mask )
183
+ return true
124
184
  end
125
185
 
126
186
  # return all currently defined commands (for which auth is required) and
127
187
  # their required authlevels
128
188
  def showlevels
129
- reply = "Current levels are:"
130
- @levels.sort.each {|a|
131
- key = a[0]
132
- value = a[1]
189
+ reply = 'Current levels are:'
190
+ @levels.sort.each { |key, value|
133
191
  reply += " #{key}(#{value})"
134
192
  }
135
193
  reply
@@ -137,32 +195,46 @@ module Irc
137
195
 
138
196
  # return all currently defined users and their authlevels
139
197
  def showusers
140
- reply = "Current users are:"
141
- @users.sort.each {|a|
142
- key = a[0]
143
- value = a[1]
144
- reply += " #{key}(#{value})"
198
+ reply = 'Current users are:'
199
+ @users.sort.each { |key, value|
200
+ reply += " #{key}(#{value.level})"
145
201
  }
146
202
  reply
147
203
  end
148
-
204
+
205
+ def showdetails( username )
206
+ if @users.has_key? username
207
+ reply = "#{username}(#{@users[username].level}):"
208
+ @users[username].hostmasks.each { |hostmask|
209
+ reply += " #{hostmask}"
210
+ }
211
+ end
212
+ reply
213
+ end
214
+
149
215
  # module help
150
- def help(topic="")
216
+ def help(topic='')
151
217
  case topic
152
- when "setlevel"
153
- return "setlevel <command> <level> => Sets required level for <command> to <level> (private addressing only)"
154
- when "useradd"
155
- return "useradd <mask> <level> => Add user <mask> at level <level> (private addressing only)"
156
- when "userdel"
157
- return "userdel <mask> => Remove user <mask> (private addressing only)"
158
- when "auth"
159
- return "auth <masterpw> => Recognise your hostmask as bot master (private addressing only)"
160
- when "levels"
161
- return "levels => list commands and their required levels (private addressing only)"
162
- when "users"
163
- return "users => list users and their levels (private addressing only)"
218
+ when 'setlevel'
219
+ return 'setlevel <command> <level> => Sets required level for <command> to <level> (private addressing only)'
220
+ when 'useradd'
221
+ return 'useradd <username> => Add user <mask>, you still need to set him up correctly (private addressing only)'
222
+ when 'userdel'
223
+ return 'userdel <username> => Remove user <username> (private addressing only)'
224
+ when 'usermod'
225
+ return 'usermod <username> <item> <value> => Modify <username>s settings. Valid <item>s are: hostmask, (+|-)hostmask, password, level (private addressing only)'
226
+ when 'auth'
227
+ return 'auth <masterpw> => Create a user with your hostmask and master password as bot master (private addressing only)'
228
+ when 'levels'
229
+ return 'levels => list commands and their required levels (private addressing only)'
230
+ when 'users'
231
+ return 'users [<username>]=> list users and their levels or details about <username> (private addressing only)'
232
+ when 'whoami'
233
+ return 'whoami => Show as whom you are recognized (private addressing only)'
234
+ when 'identify'
235
+ return 'identify <username> <password> => Identify your hostmask as belonging to <username> (private addressing only)'
164
236
  else
165
- return "Auth module (User authentication) topics: setlevel, useradd, userdel, auth, levels, users"
237
+ return 'Auth module (User authentication) topics: setlevel, useradd, userdel, usermod, auth, levels, users, whoami, identify'
166
238
  end
167
239
  end
168
240
 
@@ -171,31 +243,70 @@ module Irc
171
243
  if(m.address? && m.private?)
172
244
  case m.message
173
245
  when (/^setlevel\s+(\S+)\s+(\d+)$/)
174
- if(@bot.auth.allow?("auth", m.source, m.replyto))
175
- @bot.auth.setlevel($1, $2.to_i)
246
+ if( @bot.auth.allow?( 'auth', m.source, m.replyto ) )
247
+ @bot.auth.setlevel( $1, $2.to_i )
176
248
  m.reply "level for #$1 set to #$2"
177
249
  end
178
- when (/^useradd\s+(\S+)\s+(\d+)/)
179
- if(@bot.auth.allow?("auth", m.source, m.replyto))
180
- @bot.auth.useradd($1, $2.to_i)
181
- m.reply "added user #$1 at level #$2"
250
+ when( /^useradd\s+(\S+)/ ) # FIXME Needs review!!! (\s+(\S+)(\s+(\S+)(\s+(\S+))?)?)? Should this part be added to make complete useradds possible?
251
+ if( @bot.auth.allow?( 'auth', m.source, m.replyto ) )
252
+ @bot.auth.useradd( $1 )
253
+ m.reply "added user #$1, please set him up correctly"
182
254
  end
183
- when (/^userdel\s+(\S+)/)
184
- if(@bot.auth.allow?("auth", m.source, m.replyto))
185
- @bot.auth.userdel($1)
255
+ when( /^userdel\s+(\S+)/ )
256
+ if( @bot.auth.allow?( 'auth', m.source, m.replyto ) )
257
+ @bot.auth.userdel( $1 )
186
258
  m.reply "user #$1 is gone"
187
259
  end
260
+ when( /^usermod\s+(\S+)\s+(\S+)\s+(\S+)/ )
261
+ if( @bot.auth.allow?('auth', m.source, m.replyto ) )
262
+ if( @bot.auth.usermod( $1, $2, $3 ) )
263
+ m.reply "Set #$2 of #$1 to #$3"
264
+ else
265
+ m.reply "Failed to set #$2 of #$1 to #$3"
266
+ end
267
+ end
268
+ when( /^setpassword\s+(\S+)/ )
269
+ password = $1
270
+ user = @bot.auth.matchingUser( m.source )
271
+ if user
272
+ if @bot.auth.usermod(user, 'password', password)
273
+ m.reply "Your password has been set to #{password}"
274
+ else
275
+ m.reply "Couldn't set password"
276
+ end
277
+ else
278
+ m.reply 'You don\'t belong to any user.'
279
+ end
188
280
  when (/^auth\s+(\S+)/)
189
- if($1 == @bot.config["auth.password"])
190
- @bot.auth.useradd(Regexp.escape(m.source), 1000)
191
- m.reply "Identified, security level maxed out"
281
+ if( $1 == @bot.config['auth.password'] )
282
+ if ! @users.has_key? 'master'
283
+ @bot.auth.useradd( 'master', 1000, @bot.config['auth.password'], m.source )
284
+ else
285
+ @bot.auth.usermod( 'master', '+hostmask', m.source )
286
+ end
287
+ m.reply 'Identified, security level maxed out'
288
+ else
289
+ m.reply 'Incorrect password'
290
+ end
291
+ when( /^identify\s+(\S+)\s+(\S+)/ )
292
+ if @bot.auth.identify( m.source, $1, $2 )
293
+ m.reply "Identified as #$1 (#{@users[$1].level})"
294
+ else
295
+ m.reply 'Incorrect username/password'
296
+ end
297
+ when( 'whoami' )
298
+ user = @bot.auth.matchingUser( m.source )
299
+ if user
300
+ m.reply "I recognize you as #{user} (#{@users[user].level})"
192
301
  else
193
- m.reply "incorrect password"
302
+ m.reply 'You don\'t belong to any user.'
194
303
  end
195
- when ("levels")
196
- m.reply @bot.auth.showlevels if(@bot.auth.allow?("config", m.source, m.replyto))
197
- when ("users")
198
- m.reply @bot.auth.showusers if(@bot.auth.allow?("config", m.source, m.replyto))
304
+ when( /^users\s+(\S+)/ )
305
+ m.reply @bot.auth.showdetails( $1 ) if( @bot.auth.allow?( 'auth', m.source, m.replyto ) )
306
+ when ( 'levels' )
307
+ m.reply @bot.auth.showlevels if( @bot.auth.allow?( 'config', m.source, m.replyto ) )
308
+ when ( 'users' )
309
+ m.reply @bot.auth.showusers if( @bot.auth.allow?( 'users', m.source, m.replyto ) )
199
310
  end
200
311
  end
201
312
  end