+ def handle_list(m, params)
+ modules = []
+ if params[:module]
+ @@items.each_key do |key|
+ mod, name = key.split('.')
+ next unless mod == params[:module]
+ modules.push name unless modules.include?(name)
+ end
+ if modules.empty?
+ m.reply "no such module #{params[:module]}"
+ else
+ m.reply "module #{params[:module]} contains: " + modules.join(", ")
+ end
+ else
+ @@items.each_key do |key|
+ name = key.split('.').first
+ modules.push name unless modules.include?(name)
+ end
+ m.reply "modules: " + modules.join(", ")
+ end
+ end
+
+ def handle_get(m, params)
+ key = params[:key]
+ unless @@items.has_key?(key)
+ m.reply "no such config key #{key}"
+ end
+ value = self[key]
+ if @@items[key].type == :array
+ value = self[key].join(", ")
+ elsif @@items[key].type == :password && !m.private
+ value = "******"
+ end
+ m.reply "#{key}: #{value}"
+ end
+
+ def handle_desc(m, params)
+ key = params[:key]
+ unless @@items.has_key?(key)
+ m.reply "no such config key #{key}"
+ end
+ m.reply "#{key}: #{@@items[key].desc}"
+ end
+
+ def handle_unset(m, params)
+ key = params[:key]
+ unless @@items.has_key?(key)
+ m.reply "no such config key #{key}"
+ end
+ @config.delete(key)
+ handle_get(m, params)
+ end
+
+ def handle_set(m, params)
+ key = params[:key]
+ value = params[:value].to_s
+ unless @@items.has_key?(key)
+ m.reply "no such config key #{key}"
+ end
+ item = @@items[key]
+ puts "item type is #{item.type}"
+ case item.type
+ when :string
+ @config[key] = value
+ when :password
+ @config[key] = value
+ when :integer
+ @config[key] = value.to_i
+ when :float
+ @config[key] = value.to_f
+ when :array
+ @config[key] = value.split(/,\s*/)
+ when :boolean
+ if value == "true"
+ @config[key] = true
+ else
+ @config[key] = false
+ end
+ when :enum
+ unless item.values.include?(value)
+ m.reply "invalid value #{value}, allowed values are: " + item.values.join(", ")
+ return
+ end
+ @config[key] = value
+ else
+ puts "ACK, unsupported type #{item.type}"
+ exit 2
+ end
+ item.on_change(@config[key])
+ m.okay
+ end
+