3 local irc = require 'irc'
10 local function create_env()
14 collectgarbage = collectgarbage,
17 getmetatable = getmetatable,
19 loadstring = loadstring,
28 setmetatable = setmetatable,
34 coroutine = coroutine,
42 eval = function(target, from, code)
43 code = code:gsub("^=", "return ")
44 local fn, err = loadstring(code)
46 irc.say(target, from .. ": Error loading code: " .. code .. err:match(".*(:.-)$"))
49 setfenv(fn, envs[from])
50 local result = {pcall(fn)}
51 local success = table.remove(result, 1)
53 irc.say(target, from .. ": Error running code: " .. code .. result[1]:match(".*(:.-)$"))
55 if result[1] == nil then
56 irc.say(target, from .. ": nil")
58 for i, v in ipairs(result) do result[i] = tostring(v) end
59 irc.say(target, from .. ": " .. table.concat(result, ", "))
64 clear = function(target, from)
65 irc.say(target, from .. ": Clearing your environment")
66 envs[from] = create_env()
68 help = function(target, from, arg)
69 if arg == "" or not arg then
70 irc.say(target, from .. ": Commands: !clear, !eval, !help")
71 elseif arg == "eval" then
72 irc.say(target, from .. ": Evaluates a Lua statement in your own persistent environment")
73 elseif arg == "clear" then
74 irc.say(target, from .. ": Clears your personal environment")
79 irc.register_callback("connect", function()
83 irc.register_callback("channel_msg", function(channel, from, message)
84 message = message:gsub("^" .. nick .. "[:,>] ", "!eval ")
85 local is_cmd, cmd, arg = message:match("^(!)([%w_]+) ?(.-)$")
86 if is_cmd and commands[cmd] then
87 envs[from] = envs[from] or create_env()
88 commands[cmd](channel.name, from, arg)
92 irc.register_callback("private_msg", function(from, message)
93 message = message:gsub("^" .. nick .. "[:,>] ", "!eval ")
94 local is_cmd, cmd, arg = message:match("^(!)([%w_]+) ?(.-)$")
95 envs[from] = envs[from] or create_env()
96 if is_cmd and commands[cmd] then
97 commands[cmd](from, from, arg)
99 commands["eval"](from, from, message)
103 irc.register_callback("nick_change", function(from, old_nick)
104 if envs[old_nick] and not envs[from] then
105 envs[from] = envs[old_nick]
110 irc.connect{network = "irc.freenode.net", nick = nick}