X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fconfig.rb;h=ef63a2feb06c36f1372e75d412d199814b633543;hb=b6db18c5467c1a161e3fcc39d82ad1b38e213c87;hp=5661b3d1ef9480ee27aeafbc0e79cb255ed77325;hpb=76d4c3ddf2b8327c6eee1d8e246ca60c74fab6b9;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/config.rb b/lib/rbot/config.rb index 5661b3d1..ef63a2fe 100644 --- a/lib/rbot/config.rb +++ b/lib/rbot/config.rb @@ -24,6 +24,7 @@ module Config attr_reader :desc attr_reader :key attr_reader :wizard + attr_reader :store_default attr_reader :requires_restart attr_reader :requires_rescan attr_reader :order @@ -40,7 +41,9 @@ module Config @order = @@order @@order += 1 @key = key.to_sym - if params.has_key? :default + if @manager.overrides.key?(@key) + @default = @manager.overrides[@key] + elsif params.has_key? :default @default = params[:default] else @default = false @@ -50,6 +53,7 @@ module Config @on_change = params[:on_change] @validate = params[:validate] @wizard = params[:wizard] + @store_default = params[:store_default] @requires_restart = params[:requires_restart] @requires_rescan = params[:requires_rescan] @auth_path = "config::key::#{key.sub('.','::')}" @@ -63,7 +67,7 @@ module Config end def get return @manager.config[@key] if @manager.config.has_key?(@key) - return @default + return default end alias :value :get def set(value, on_change = true) @@ -184,7 +188,7 @@ module Config unless newval.include? val newval << val validate_item(val) or raise ArgumentError, "invalid item: #{val}" - validate(newval) or raise ArgumentError, "invalid value: #{newval.to_s}" + validate(newval) or raise ArgumentError, "invalid value: #{newval.inspect}" set(newval) end end @@ -226,6 +230,7 @@ module Config attr_reader :bot attr_reader :items attr_reader :config + attr_reader :overrides attr_accessor :changed def initialize @@ -235,6 +240,21 @@ module Config def reset_config @items = Hash.new @config = Hash.new(false) + + # We allow default values for config keys to be overridden by + # the config file /etc/rbot.conf + # The main purpose for this is to allow distro or system-wide + # settings such as external program paths (figlet, toilet, ispell) + # to be set once for all the bots. + @overrides = Hash.new + etcfile = "/etc/rbot.conf" + if File.exist?(etcfile) + log "Loading defaults from #{etcfile}" + etcconf = YAML::load_file(etcfile) + etcconf.each { |k, v| + @overrides[k.to_sym] = v + } + end end # Associate with bot _bot_ @@ -244,9 +264,10 @@ module Config return unless @bot @changed = false - if(File.exist?("#{@bot.botclass}/conf.yaml")) + conf = @bot.path 'conf.yaml' + if File.exist? conf begin - newconfig = YAML::load_file("#{@bot.botclass}/conf.yaml") + newconfig = YAML::load_file conf newconfig.each { |key, val| @config[key.to_sym] = val } @@ -255,6 +276,14 @@ module Config error "failed to read conf.yaml: #{$!}" end end + # config options with :store_default to true should store + # their default value at first run. + # Some defaults might change anytime the bot starts + # for instance core.db or authpw + @items.values.find_all {|i| i.store_default }.each do |value| + @config[value.key] = value.default + end + # if we got here, we need to run the first-run wizard Wizard.new(@bot).run # save newly created config @@ -309,8 +338,10 @@ module Config return end begin + conf = @bot.path 'conf.yaml' + fnew = conf + '.new' debug "Writing new conf.yaml ..." - File.open("#{@bot.botclass}/conf.yaml.new", "w") do |file| + File.open(fnew, "w") do |file| savehash = {} @config.each { |key, val| savehash[key.to_s] = val @@ -318,8 +349,7 @@ module Config file.puts savehash.to_yaml end debug "Officializing conf.yaml ..." - File.rename("#{@bot.botclass}/conf.yaml.new", - "#{@bot.botclass}/conf.yaml") + File.rename(fnew, conf) @changed = false rescue => e error "failed to write configuration file conf.yaml! #{$!}" @@ -348,6 +378,7 @@ module Config end def run() + $stdout.sync = true puts _("First time rbot configuration wizard") puts "====================================" puts _("This is the first time you have run rbot with a config directory of: #{@bot.botclass}")