Scripting — Examples
Note: Scripts run in a sandboxed Lua environment. The
os, io, loadfile, dofile, and package globals are removed. Use api.log() for debug output and api.ui.print() for UI messages.Practical Lua script examples for repartee.
Auto-greet on join
Greet users when they join a specific channel:
meta = {
name = "autogreet",
version = "1.0",
description = "Auto-greet users on join"
}
function setup(api)
local greet_channels = { ["#mychannel"] = true }
api.on("irc.join", function(event)
if greet_channels[event.channel] and event.nick ~= api.store.our_nick() then
api.irc.say(event.channel, "Welcome, " .. event.nick .. "!")
end
end)
end
URL logger
Log all URLs posted to channels:
meta = {
name = "urllogger",
version = "1.0",
description = "Log URLs from messages"
}
function setup(api)
local urls = {}
api.on("irc.privmsg", function(event)
for url in event.message:gmatch("https?://[%w%.%-/%%?&=_#]+") do
table.insert(urls, {
nick = event.nick,
channel = event.target,
url = url
})
api.log("URL: " .. url .. " from " .. event.nick)
end
end)
api.command("urls", {
handler = function(args)
local count = tonumber(args[1]) or 10
local start = math.max(1, #urls - count + 1)
for i = start, #urls do
local u = urls[i]
api.ui.print(u.nick .. " > " .. u.url)
end
end,
description = "Show recent URLs",
usage = "/urls [count]"
})
end
Highlight monitor
Copy highlighted messages to a dedicated buffer:
meta = {
name = "hilight",
version = "1.0",
description = "Monitor highlighted messages"
}
function setup(api)
api.on("irc.privmsg", function(event)
local my_nick = api.store.our_nick()
if my_nick and event.message:lower():find(my_nick:lower(), 1, true) then
local msg = "[" .. event.target .. "] <" .. event.nick .. "> " .. event.message
api.ui.print(msg)
end
end)
end
Custom slap command
The classic IRC /slap command:
meta = {
name = "slap",
version = "1.0",
description = "Slap someone with a large trout"
}
function setup(api)
local items = {
"a large trout",
"a mass of wet noodles",
"a mass-produced plastic toy",
"a mass of jello",
"a mass of cotton candy",
}
api.command("slap", {
handler = function(args)
local target = args[1]
if not target then
api.ui.print("Usage: /slap <nick>")
return
end
local item = items[math.random(#items)]
local buf = api.store.active_buffer()
if buf then
api.irc.action(buf, "slaps " .. target .. " around a bit with " .. item)
end
end,
description = "Slap someone with a random object",
usage = "/slap <nick>"
})
end
Spam filter
Block messages matching patterns:
meta = {
name = "spamfilter",
version = "1.0",
description = "Filter spam messages"
}
function setup(api)
local patterns = {
"buy cheap",
"free bitcoins",
"click here now",
}
-- High priority so we run before default handlers
api.on("irc.privmsg", function(event)
local lower = event.message:lower()
for _, pattern in ipairs(patterns) do
if lower:find(pattern, 1, true) then
api.log("Blocked spam from " .. event.nick .. ": " .. event.message)
return true -- suppress the event
end
end
end, api.PRIORITY_HIGH)
end
Nick highlight with sound
Print an alert when your nick is mentioned:
meta = {
name = "nickbell",
version = "1.0",
description = "Print alert on nick mention"
}
function setup(api)
api.on("irc.privmsg", function(event)
local my_nick = api.store.our_nick()
if my_nick and event.message:lower():find(my_nick:lower(), 1, true) then
api.ui.print("** Mentioned in " .. event.target .. " by " .. event.nick)
end
end)
end