Class Irc::Bot::Config::ManagerClass
In: lib/rbot/config.rb
Parent: Object
BasicUserMessage JoinMessage NamesMessage WhoisMessage ModeChangeMessage KickMessage MotdMessage QuitMessage BanlistMessage UserMessage NoSuchTargetMessage TopicMessage NickMessage WelcomeMessage UnknownMessage InviteMessage PartMessage NetmaskList UserList ArrayOf ChannelList Netmask User\n[lib/rbot/botuser.rb\nlib/rbot/irc.rb] Channel Singleton RfcCasemap StrictRfcCasemap AsciiCasemap Casemap PrivMessage NoticeMessage TokyoCabinet::BDB CIBDB Btree CIBtree Socket MessageQueue QueueRing Client DBHash\n[lib/rbot/registry/bdb.rb\nlib/rbot/registry/tc.rb] DBTree\n[lib/rbot/registry/bdb.rb\nlib/rbot/registry/tc.rb] Server NetmaskDb Bot\n[lib/rbot/botuser.rb\nlib/rbot/config.rb\nlib/rbot/ircbot.rb\nlib/rbot/language.rb\nlib/rbot/message.rb\nlib/rbot/messagemapper.rb\nlib/rbot/plugins.rb\nlib/rbot/rbotconfig.rb\nlib/rbot/registry/bdb.rb\nlib/rbot/registry/tc.rb] lib/rbot/ircsocket.rb lib/rbot/rfc2812.rb lib/rbot/registry/tc.rb lib/rbot/irc.rb lib/rbot/maskdb.rb lib/rbot/message.rb lib/rbot/messagemapper.rb lib/rbot/botuser.rb lib/rbot/registry/tc.rb (null) BotConfig PKGConfig ServerOrCasemap Irc dot/m_35_0.png

container for bot configuration

Methods

[]   []=   bot_associate   method_missing   new   register   reset_config   save  

Included Modules

Singleton

Attributes

bot  [R] 
changed  [RW] 
config  [R] 
items  [R] 
overrides  [R] 

Public Class methods

[Source]

     # File lib/rbot/config.rb, line 234
234:     def initialize
235:       bot_associate(nil,true)
236:     end

Public Instance methods

currently we store values in a hash but this could be changed in the future. We use hash semantics, however. components that register their config keys and setup defaults are supported via []

[Source]

     # File lib/rbot/config.rb, line 295
295:     def [](key)
296:       # return @items[key].value if @items.has_key?(key)
297:       return @items[key.to_sym].value if @items.has_key?(key.to_sym)
298:       # try to still support unregistered lookups
299:       # but warn about them
300:       #      if @config.has_key?(key)
301:       #        warning "Unregistered lookup #{key.inspect}"
302:       #        return @config[key]
303:       #      end
304:       if @config.has_key?(key.to_sym)
305:         warning _("Unregistered lookup #{key.to_sym.inspect}")
306:         return @config[key.to_sym]
307:       end
308:       return false
309:     end

[Source]

     # File lib/rbot/config.rb, line 311
311:     def []=(key, value)
312:       return @items[key.to_sym].set(value) if @items.has_key?(key.to_sym)
313:       if @config.has_key?(key.to_sym)
314:         warning _("Unregistered lookup #{key.to_sym.inspect}")
315:         return @config[key.to_sym] = value
316:       end
317:     end

Associate with bot bot

[Source]

     # File lib/rbot/config.rb, line 259
259:     def bot_associate(bot, reset=false)
260:       reset_config if reset
261:       @bot = bot
262:       return unless @bot
263: 
264:       @changed = false
265:       conf = @bot.path 'conf.yaml'
266:       if File.exist? conf
267:         begin
268:           newconfig = YAML::load_file conf
269:           newconfig.each { |key, val|
270:             @config[key.to_sym] = val
271:           }
272:           return
273:         rescue
274:           error "failed to read conf.yaml: #{$!}"
275:         end
276:       end
277:       # if we got here, we need to run the first-run wizard
278:       Wizard.new(@bot).run
279:       # save newly created config
280:       @changed = true
281:       save
282:     end

pass everything else through to the hash

[Source]

     # File lib/rbot/config.rb, line 320
320:     def method_missing(method, *args, &block)
321:       return @config.send(method, *args, &block)
322:     end

[Source]

     # File lib/rbot/config.rb, line 284
284:     def register(item)
285:       unless item.kind_of?(Value)
286:         raise ArgumentError,"item must be an Irc::Bot::Config::Value"
287:       end
288:       @items[item.key] = item
289:     end

[Source]

     # File lib/rbot/config.rb, line 238
238:     def reset_config
239:       @items = Hash.new
240:       @config = Hash.new(false)
241: 
242:       # We allow default values for config keys to be overridden by
243:       # the config file /etc/rbot.conf
244:       # The main purpose for this is to allow distro or system-wide
245:       # settings such as external program paths (figlet, toilet, ispell)
246:       # to be set once for all the bots.
247:       @overrides = Hash.new
248:       etcfile = "/etc/rbot.conf"
249:       if File.exist?(etcfile)
250:         log "Loading defaults from #{etcfile}"
251:         etcconf = YAML::load_file(etcfile)
252:         etcconf.each { |k, v|
253:           @overrides[k.to_sym] = v
254:         }
255:       end
256:     end

write current configuration to #{botclass}/conf.yaml

[Source]

     # File lib/rbot/config.rb, line 325
325:     def save
326:       if not @changed
327:         debug "Not writing conf.yaml (unchanged)"
328:         return
329:       end
330:       begin
331:         conf = @bot.path 'conf.yaml'
332:         fnew = conf + '.new'
333:         debug "Writing new conf.yaml ..."
334:         File.open(fnew, "w") do |file|
335:           savehash = {}
336:           @config.each { |key, val|
337:             savehash[key.to_s] = val
338:           }
339:           file.puts savehash.to_yaml
340:         end
341:         debug "Officializing conf.yaml ..."
342:         File.rename(fnew, conf)
343:         @changed = false
344:       rescue => e
345:         error "failed to write configuration file conf.yaml! #{$!}"
346:         error "#{e.class}: #{e}"
347:         error e.backtrace.join("\n")
348:       end
349:     end

[Validate]