|
# File rbot/ircbot.rb, line 72
def initialize(botclass)
@botclass = botclass.gsub(/\/$/, "")
@startup_time = Time.new
Dir.mkdir("#{botclass}") if(!File.exist?("#{botclass}"))
Dir.mkdir("#{botclass}/logs") if(!File.exist?("#{botclass}/logs"))
@config = Irc::BotConfig.new(self)
@timer = Timer::Timer.new
@registry = BotRegistry.new self
@timer.add(@config["SAVE_EVERY"].to_i) { save }
@channels = Hash.new
@logs = Hash.new
@lang = Irc::Language.new(@config["LANGUAGE"])
@keywords = Irc::Keywords.new(self)
@auth = Irc::IrcAuth.new(self)
@plugins = Irc::Plugins.new(self, ["#{botclass}/plugins"])
@socket = Irc::IrcSocket.new(@config["SERVER"], @config["PORT"], @config["HOST"], @config["SENDQ_DELAY"], @config["SENDQ_BURST"])
@nick = @config["NICK"]
@server_password = @config["SERVER_PASSWORD"]
if @config["ADDRESS_PREFIX"]
@addressing_prefixes = @config["ADDRESS_PREFIX"].split(" ")
else
@addressing_prefixes = Array.new
end
@client = Irc::IrcClient.new
@client["PRIVMSG"] = proc { |data|
message = PrivMessage.new(self, data["SOURCE"], data["TARGET"], data["MESSAGE"])
onprivmsg(message)
}
@client["NOTICE"] = proc { |data|
message = NoticeMessage.new(self, data["SOURCE"], data["TARGET"], data["MESSAGE"])
# pass it off to plugins that want to hear everything
@plugins.delegate "listen", message
}
@client["MOTD"] = proc { |data|
data['MOTD'].each_line { |line|
log "MOTD: #{line}", "server"
}
}
@client["NICKTAKEN"] = proc { |data|
nickchg "#{@nick}_"
}
@client["BADNICK"] = proc {|data|
puts "WARNING, bad nick (#{data['NICK']})"
}
@client["PING"] = proc {|data|
# (jump the queue for pongs)
@socket.puts "PONG #{data['PINGID']}"
}
@client["NICK"] = proc {|data|
sourcenick = data["SOURCENICK"]
nick = data["NICK"]
m = NickMessage.new(self, data["SOURCE"], data["SOURCENICK"], data["NICK"])
if(sourcenick == @nick)
@nick = nick
end
@channels.each {|k,v|
if(v.users.has_key?(sourcenick))
log "@ #{sourcenick} is now known as #{nick}", k
v.users[nick] = v.users[sourcenick]
v.users.delete(sourcenick)
end
}
@plugins.delegate("listen", m)
@plugins.delegate("nick", m)
}
@client["QUIT"] = proc {|data|
source = data["SOURCE"]
sourcenick = data["SOURCENICK"]
sourceurl = data["SOURCEADDRESS"]
message = data["MESSAGE"]
m = QuitMessage.new(self, data["SOURCE"], data["SOURCENICK"], data["MESSAGE"])
if(data["SOURCENICK"] =~ /#{@nick}/)
else
@channels.each {|k,v|
if(v.users.has_key?(sourcenick))
log "@ Quit: #{sourcenick}: #{message}", k
v.users.delete(sourcenick)
end
}
end
@plugins.delegate("listen", m)
@plugins.delegate("quit", m)
}
@client["MODE"] = proc {|data|
source = data["SOURCE"]
sourcenick = data["SOURCENICK"]
sourceurl = data["SOURCEADDRESS"]
channel = data["CHANNEL"]
targets = data["TARGETS"]
modestring = data["MODESTRING"]
log "@ Mode #{modestring} #{targets} by #{sourcenick}", channel
}
@client["WELCOME"] = proc {|data|
log "joined server #{data['SOURCE']} as #{data['NICK']}", "server"
debug "I think my nick is #{@nick}, server thinks #{data['NICK']}"
if data['NICK'] && data['NICK'].length > 0
@nick = data['NICK']
end
if(@config["JOIN_CHANNELS"])
@config["JOIN_CHANNELS"].split(", ").each {|c|
puts "autojoining channel #{c}"
if(c =~ /^(\S+)\s+(\S+)$/)
join $1, $2
else
join c if(c)
end
}
end
}
@client["JOIN"] = proc {|data|
m = JoinMessage.new(self, data["SOURCE"], data["CHANNEL"], data["MESSAGE"])
onjoin(m)
}
@client["PART"] = proc {|data|
m = PartMessage.new(self, data["SOURCE"], data["CHANNEL"], data["MESSAGE"])
onpart(m)
}
@client["KICK"] = proc {|data|
m = KickMessage.new(self, data["SOURCE"], data["TARGET"],data["CHANNEL"],data["MESSAGE"])
onkick(m)
}
@client["INVITE"] = proc {|data|
if(data["TARGET"] =~ /^#{@nick}$/)
join data["CHANNEL"] if (@auth.allow?("join", data["SOURCE"], data["SOURCENICK"]))
end
}
@client["CHANGETOPIC"] = proc {|data|
channel = data["CHANNEL"]
sourcenick = data["SOURCENICK"]
topic = data["TOPIC"]
if(sourcenick == @nick)
log "@ I set topic \"#{topic}\"", channel
else
log "@ #{sourcenick} set topic \"#{topic}\"", channel
end
m = TopicMessage.new(self, data["SOURCE"], data["CHANNEL"], data["TOPIC"])
@plugins.delegate("topic", m)
@plugins.delegate("listen", m)
}
@client["NAMES"] = proc {|data|
channel = data["CHANNEL"]
users = data["USERS"]
unless(@channels[channel])
puts "bug: got names for channel '#{channel}' I didn't think I was in\n"
exit 2
end
@channels[channel].users.clear
users.each {|u|
@channels[channel].users[u[0]] = ["mode", u[1]]
}
}
@client["UNKNOWN"] = proc {|data|
debug "UNKNOWN: #{data['SERVERSTRING']}"
}
end
|