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 sock:write(out..'\r\n') return out 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