-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.lua
115 lines (108 loc) · 2.68 KB
/
main.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
socket=require("socket")
local espersv=assert(socket.connect("localhost",1337))
local freesv=socket.connect("localhost",1335)
https=require("ssl.https")
http=require("socket.http")
lfs=require("lfs")
bit=require("bit")
bc=require("bc")
json=require("dkjson")
sqlite=require("lsqlite3")
im=require("imlua")
cd=require("cdlua")
crypto=require("crypto")
posix=require("posix")
lpeg=require("lpeg")
re=require("re")
ffi=require("ffi")
lz=require("zlib")
C=ffi.C
require("cdluaim")
math.randomseed(socket.gettime()*1000)
local _,err=xpcall(function()
dofile("db.lua")
dofile("hook.lua")
dofile("plugins/async.lua")
local function loaddir(dir,env)
print("loading "..dir)
if env and not env.hook then
setmetatable(env,{__index=_G})
env._G=env
env.r_G=_G
env.async=false
setfenv(loadfile("hook.lua"),env)()
function env.loadstring(txt,bn)
local func,err=loadstring(txt,bn)
if not func then
return func,err
end
return setfenv(func,env)
end
env.hook.sel=hook.sel
env.hook.rsel=hook.rsel
env.hook.newsocket=hook.newsocket
env.hook.remsocket=hook.remsocket
env.hook.newrsocket=hook.newrsocket
env.hook.remrsocket=hook.remrsocket
elseif not env then
env=_G
end
local loaded={}
env.reqplugin=function(fn)
if not loaded[fn] then
print("loading plugin "..fn)
setfenv(assert(loadfile("plugins/"..fn)),env)()
end
loaded[fn]=true
end
for fn in lfs.dir("plugins/"..dir) do
if fn:sub(-4,-1)==".lua" then
env.reqplugin(dir.."/"..fn)
end
end
return env
end
loaddir("base")
networks={
esper=loaddir("",{cnick="^v",owneracc="ping",sv=espersv,network="esper",cmdprefix="."}),
freenode=loaddir("",{cnick="^0",owneracc="^v",sv=freesv,network="freenode",cmdprefix="^"}),
}
for k,v in pairs(networks) do
hook.newsocket(v.sv)
loaddir(k,v)
v.hook.queue("init")
v.send("WHOIS "..v.cnick)
end
while true do
local tme=5
for netname,net in pairs(networks) do
net.svbuffer=net.svbuffer or ""
local s,e,r=net.sv:receive("*a")
if e=="timeout" then
net.svbuffer=net.svbuffer..r
while net.svbuffer:match("[\r\n]") do
net.hook.queue("raw",net.svbuffer:match("^[^\r\n]+") or "")
net.svbuffer=net.svbuffer:gsub("^[^\r\n]*[\r\n]+","")
end
else
if e=="closed" then
error(e)
end
end
tme=math.min(tme,net.hook.interval or 5)
end
if networks.esper.exit or networks.freenode.exit then
break
end
local sel={socket.select(hook.sel,hook.rsel,tme)}
hook.queue("select",unpack(sel))
for netname,net in pairs(networks) do
net.hook.queue("select",unpack(sel))
end
end
end,debug.traceback)
--sql.cleanup()
if err then
error(err,0)
end
networks.esper.send("PRIVMSG #V :restarting")