mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2024-12-27 03:00:38 +01:00
91 lines
1.9 KiB
Lua
91 lines
1.9 KiB
Lua
|
local irc = require("irc.main")
|
||
|
|
||
|
local meta = irc.meta
|
||
|
|
||
|
function meta:send(msg, ...)
|
||
|
if type(msg) == "table" then
|
||
|
msg = msg:toRFC1459()
|
||
|
else
|
||
|
if select("#", ...) > 0 then
|
||
|
msg = msg:format(...)
|
||
|
end
|
||
|
end
|
||
|
self:invoke("OnSend", msg)
|
||
|
|
||
|
local bytes, err = self.socket:send(msg .. "\r\n")
|
||
|
|
||
|
if not bytes and err ~= "timeout" and err ~= "wantwrite" then
|
||
|
self:invoke("OnDisconnect", err, true)
|
||
|
self:shutdown()
|
||
|
error(err, errlevel)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function meta:queue(msg)
|
||
|
table.insert(self.messageQueue, msg)
|
||
|
end
|
||
|
|
||
|
local function verify(str, errLevel)
|
||
|
if str:find("^:") or str:find("%s%z") then
|
||
|
error(("malformed parameter '%s' to irc command"):format(str), errLevel)
|
||
|
end
|
||
|
|
||
|
return str
|
||
|
end
|
||
|
|
||
|
function meta:sendChat(target, msg)
|
||
|
-- Split the message into segments if it includes newlines.
|
||
|
for line in msg:gmatch("([^\r\n]+)") do
|
||
|
self:queue(irc.msgs.privmsg(verify(target, 3), line))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function meta:sendNotice(target, msg)
|
||
|
-- Split the message into segments if it includes newlines.
|
||
|
for line in msg:gmatch("([^\r\n]+)") do
|
||
|
self:queue(irc.msgs.notice(verify(target, 3), line))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function meta:join(channel, key)
|
||
|
self:queue(irc.msgs.join(
|
||
|
verify(channel, 3),
|
||
|
key and verify(key, 3) or nil))
|
||
|
end
|
||
|
|
||
|
function meta:part(channel, reason)
|
||
|
channel = verify(channel, 3)
|
||
|
self:queue(irc.msgs.part(channel, reason))
|
||
|
if self.track_users then
|
||
|
self.channels[channel] = nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function meta:trackUsers(b)
|
||
|
self.track_users = b
|
||
|
if not b then
|
||
|
for k,v in pairs(self.channels) do
|
||
|
self.channels[k] = nil
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function meta:setMode(t)
|
||
|
local target = t.target or self.nick
|
||
|
local mode = ""
|
||
|
local add, rem = t.add, t.remove
|
||
|
|
||
|
assert(add or rem, "table contains neither 'add' nor 'remove'")
|
||
|
|
||
|
if add then
|
||
|
mode = table.concat{"+", verify(add, 3)}
|
||
|
end
|
||
|
|
||
|
if rem then
|
||
|
mode = table.concat{mode, "-", verify(rem, 3)}
|
||
|
end
|
||
|
|
||
|
self:queue(irc.msgs.mode(verify(target, 3), mode))
|
||
|
end
|
||
|
|