+ def initialize(botclass, params = {})
+ # BotConfig for the core bot
+ BotConfig.register BotConfigStringValue.new('server.name',
+ :default => "localhost", :requires_restart => true,
+ :desc => "What server should the bot connect to?",
+ :wizard => true)
+ BotConfig.register BotConfigIntegerValue.new('server.port',
+ :default => 6667, :type => :integer, :requires_restart => true,
+ :desc => "What port should the bot connect to?",
+ :validate => Proc.new {|v| v > 0}, :wizard => true)
+ BotConfig.register BotConfigStringValue.new('server.password',
+ :default => false, :requires_restart => true,
+ :desc => "Password for connecting to this server (if required)",
+ :wizard => true)
+ BotConfig.register BotConfigStringValue.new('server.bindhost',
+ :default => false, :requires_restart => true,
+ :desc => "Specific local host or IP for the bot to bind to (if required)",
+ :wizard => true)
+ BotConfig.register BotConfigIntegerValue.new('server.reconnect_wait',
+ :default => 5, :validate => Proc.new{|v| v >= 0},
+ :desc => "Seconds to wait before attempting to reconnect, on disconnect")
+ BotConfig.register BotConfigStringValue.new('irc.nick', :default => "rbot",
+ :desc => "IRC nickname the bot should attempt to use", :wizard => true,
+ :on_change => Proc.new{|bot, v| bot.sendq "NICK #{v}" })
+ BotConfig.register BotConfigStringValue.new('irc.user', :default => "rbot",
+ :requires_restart => true,
+ :desc => "local user the bot should appear to be", :wizard => true)
+ BotConfig.register BotConfigArrayValue.new('irc.join_channels',
+ :default => [], :wizard => true,
+ :desc => "What channels the bot should always join at startup. List multiple channels using commas to separate. If a channel requires a password, use a space after the channel name. e.g: '#chan1, #chan2, #secretchan secritpass, #chan3'")
+ BotConfig.register BotConfigIntegerValue.new('core.save_every',
+ :default => 60, :validate => Proc.new{|v| v >= 0},
+ # TODO change timer via on_change proc
+ :desc => "How often the bot should persist all configuration to disk (in case of a server crash, for example")
+ BotConfig.register BotConfigFloatValue.new('server.sendq_delay',
+ :default => 2.0, :validate => Proc.new{|v| v >= 0},
+ :desc => "(flood prevention) the delay between sending messages to the server (in seconds)",
+ :on_change => Proc.new {|bot, v| bot.socket.sendq_delay = v })
+ BotConfig.register BotConfigIntegerValue.new('server.sendq_burst',
+ :default => 4, :validate => Proc.new{|v| v >= 0},
+ :desc => "(flood prevention) max lines to burst to the server before throttling. Most ircd's allow bursts of up 5 lines, with non-burst limits of 512 bytes/2 seconds",
+ :on_change => Proc.new {|bot, v| bot.socket.sendq_burst = v })
+ BotConfig.register BotConfigIntegerValue.new('server.ping_timeout',
+ :default => 10, :validate => Proc.new{|v| v >= 0},
+ :on_change => Proc.new {|bot, v| bot.start_server_pings},
+ :desc => "reconnect if server doesn't respond to PING within this many seconds (set to 0 to disable)")
+
+ @argv = params[:argv]
+
+ unless FileTest.directory? Config::datadir
+ puts "data directory '#{Config::datadir}' not found, did you setup.rb?"