summaryrefslogtreecommitdiff
path: root/rirc.lua
diff options
context:
space:
mode:
Diffstat (limited to 'rirc.lua')
-rw-r--r--rirc.lua66
1 files changed, 66 insertions, 0 deletions
diff --git a/rirc.lua b/rirc.lua
new file mode 100644
index 0000000..b341bfd
--- /dev/null
+++ b/rirc.lua
@@ -0,0 +1,66 @@
+local irc = {}
+
+function irc.sendmsg(conn, ch, msg)
+ local m = msg:gsub("[\r\n]+"," ")
+ local l = 512-12-#ch
+ m = m:sub(1,l)
+ conn:send("PRIVMSG "..ch.." :"..m.."\r\n")
+end
+
+function irc.send(sock, args)
+ local out = ''
+ if args.source then
+ out = ':' .. args.source .. ' '
+ end
+ for i = 1, #args-1 do
+ local arg = tostring(args[i])
+ out = out .. arg:gsub("[\r\n ]+","") .. ' '
+ end
+ local last = tostring(args[#args]):gsub("[\r\n]+"," ")
+ out = out .. ':' .. last
+ print('>', out)
+ sock:write(out..'\r\n')
+end
+
+function irc.parse(line)
+ local words = {}
+ local idx = 1
+ while true do
+ local word,nidx = line:match("(%g+)%s*()",idx)
+ if not word then
+ break
+ elseif word:sub(1,1) == ":" and idx ~= 1 then
+ -- first word can start with :
+ local rest = line:sub(idx+1)
+ table.insert(words,rest)
+ break
+ else
+ table.insert(words,word)
+ idx = nidx
+ end
+ end
+
+ local from = nil
+ if words[1] and words[1]:sub(1,1) == ":" then
+ -- we have a source
+ from = table.remove(words,1):sub(2)
+ end
+
+ local op = words[1]
+ local args = {}
+ for i=2,#words do
+ args[i-1] = words[i]
+ end
+ return {source=from,op=op:upper(),args=args}
+end
+
+function irc.parse_src(src)
+ local s, _, nick, user, host = src:find("^(.*)!(.*)@(.*)$")
+ if s then
+ return true, nick, user, host
+ else
+ return false
+ end
+end
+
+return irc