3 local irc = require 'irc'
7 local channel = "#doytest"
8 local network = "irc.freenode.org"
12 local function create_env()
16 collectgarbage = collectgarbage,
19 getmetatable = getmetatable,
21 loadstring = loadstring,
30 setmetatable = setmetatable,
36 coroutine = coroutine,
44 eval = function(target, from, code)
45 code = code:gsub("^=", "return ")
46 local fn, err = loadstring(code)
48 irc.say(target, from .. ": Error loading code: " .. code .. err:match(".*(:.-)$"))
51 setfenv(fn, envs[from])
52 local result = {pcall(fn)}
53 local success = table.remove(result, 1)
55 irc.say(target, from .. ": Error running code: " .. code .. result[1]:match(".*(:.-)$"))
57 if result[1] == nil then
58 irc.say(target, from .. ": nil")
60 for i, v in ipairs(result) do result[i] = tostring(v) end
61 irc.say(target, from .. ": " .. table.concat(result, ", "))
66 clear = function(target, from)
67 irc.say(target, from .. ": Clearing your environment")
68 envs[from] = create_env()
70 help = function(target, from, arg)
71 if arg == "" or not arg then
72 irc.say(target, from .. ": Commands: !clear, !eval, !help")
73 elseif arg == "eval" then
74 irc.say(target, from .. ": Evaluates a Lua statement in your own persistent environment")
75 elseif arg == "clear" then
76 irc.say(target, from .. ": Clears your personal environment")
81 irc.register_callback("connect", function()
85 irc.register_callback("channel_msg", function(channel, from, message)
86 message = message:gsub("^" .. nick .. "[:,>] ", "!eval ")
87 local is_cmd, cmd, arg = message:match("^(!)([%w_]+) ?(.-)$")
88 if is_cmd and commands[cmd] then
89 envs[from] = envs[from] or create_env()
90 commands[cmd](channel.name, from, arg)
94 irc.register_callback("private_msg", function(from, message)
95 message = message:gsub("^" .. nick .. "[:,>] ", "!eval ")
96 local is_cmd, cmd, arg = message:match("^(!)([%w_]+) ?(.-)$")
97 envs[from] = envs[from] or create_env()
98 if is_cmd and commands[cmd] then
99 commands[cmd](from, from, arg)
101 commands["eval"](from, from, message)
105 irc.register_callback("nick_change", function(from, old_nick)
106 if envs[old_nick] and not envs[from] then
107 envs[from] = envs[old_nick]
112 irc.connect{network = network, nick = nick}