]> git.lizzy.rs Git - luairc.git/blob - test/luabot.lua
4563c49cc249e701493e02b392bc62af28533fd0
[luairc.git] / test / luabot.lua
1 #!/usr/bin/env lua
2
3 local irc = require 'irc'
4 irc.DEBUG = true
5
6 local nick = "luabot"
7 local channel = "#doytest"
8 local network = "irc.freenode.org"
9
10 local envs = {}
11
12 local function create_env()
13     return {
14         _VERSION =      _VERSION,
15         assert =         assert,
16         collectgarbage = collectgarbage,
17         error =          error,
18         getfenv =        getfenv,
19         getmetatable =   getmetatable,
20         ipairs =         ipairs,
21         loadstring =     loadstring,
22         next =           next,
23         pairs =          pairs,
24         pcall =          pcall,
25         rawequal =       rawequal,
26         rawget =         rawget,
27         rawset =         rawset,
28         select =         select,
29         setfenv =        setfenv,
30         setmetatable =   setmetatable,
31         tonumber =       tonumber,
32         tostring =       tostring,
33         type =           type,
34         unpack =         unpack,
35         xpcall =         xpcall,
36         coroutine =      coroutine,
37         math =           math,
38         string =         string,
39         table =          table,
40     }
41 end
42
43 local commands = {
44     eval = function(target, from, code)
45         code = code:gsub("^=", "return ")
46         local fn, err = loadstring(code)
47         if not fn then
48             irc.say(target, from .. ": Error loading code: " .. code .. err:match(".*(:.-)$"))
49             return
50         else
51             setfenv(fn, envs[from])
52             local result = {pcall(fn)}
53             local success = table.remove(result, 1)
54             if not success then
55                 irc.say(target, from .. ": Error running code: " .. code .. result[1]:match(".*(:.-)$"))
56             else
57                 if result[1] == nil then
58                     irc.say(target, from .. ": nil")
59                 else
60                     for i, v in ipairs(result) do result[i] = tostring(v) end
61                     irc.say(target, from .. ": " .. table.concat(result, ", "))
62                 end
63             end
64         end
65     end,
66     clear = function(target, from)
67         irc.say(target, from .. ": Clearing your environment")
68         envs[from] = create_env()
69     end,
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")
77         end
78     end
79 }
80
81 irc.register_callback("connect", function()
82     irc.join(channel)
83 end)
84
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)
91     end
92 end)
93
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)
100     else
101         commands["eval"](from, from, message)
102     end
103 end)
104
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]
108         envs[old_nick] = nil
109     end
110 end)
111
112 irc.connect{network = network, nick = nick}