irc-bot/contrib/bot.lua

108 lines
2.3 KiB
Lua
Raw Normal View History

2012-11-16 13:13:51 -07:00
--
-- Bot object
--
-- require() this file, and you get a `bot` object with everything
-- you need to run a bot. You can either switch on bot.command,
-- or invoke bot:run(), which will run self:handle_$COMMAND.
--
bot = {}
bot.debug = false
bot.nick = "newmont"
bot.user = "WoozleBot"
bot.desc = "A woozle.org bot"
bot.prefix = os.getenv("prefix")
bot.forum = os.getenv("forum")
bot.sender = os.getenv("sender")
bot.command = os.getenv("command")
bot.text = os.getenv("text")
bot.args = arg
--
-- Log to stderr
--
function bot:log(text)
io.stderr:write(text .. "\n")
end
--
-- Log what we are working with
--
function bot:debug_input(text)
self:log(("< %-8s %8s/%-8s :%s"):format(
self.command,
self.sender or "-",
self.forum or "-",
self.text or ""))
end
--
-- Send a raw IRC command
--
function bot:raw(text)
if self.debug then
self:log(" > " .. text)
end
print(text)
end
--
-- Send a message to the forum, falling back to sender if we're
-- spamming the channel.
--
function bot:msg(text)
self.msgs_sent = self.msgs_sent + 1
if ((self.msgs_sent == 5) and (self.forum ~= self.sender)) then
self:raw("PRIVMSG " .. forum .. " :Sending the rest in private")
self.msg_recip = self.sender
end
self:raw("PRIVMSG " .. self.msg_recip .. " :" .. text)
end
bot.msgs_sent = 0
bot.msg_recip = bot.forum
--
-- Emote, like "* botname explodes"
--
function bot:emote(text)
self:msg("\001ACTION " .. text .. "\001")
end
--
-- Use introspection to dispatch a command
--
function bot:run()
local func = self["handle_" .. self.command:lower()]
if (self.debug) then
self:debug_input()
end
if (func) then
func(self)
else
self:handle_default()
end
end
-- Log in to IRC
function bot:handle__init_()
self:raw("NICK " .. self.nick)
self:raw(("USER %s %s %s :%s"):format(self.user, self.user, self.user, self.desc))
end
-- Deal with nickname collision
function bot:handle_433()
self.raw("NICK " .. self.nick .. (os.time() % 500))
end
-- Override this to handle messages
function bot:handle_privmsg()
self:log(("%s/%s: %s"):format(self.sender, self.forum, self.text))
end
-- Override this to handle any undefined command
function bot:handle_default()
end