aboutsummaryrefslogtreecommitdiffstats
path: root/src/irc/message.lua
blob: 27698d802ca39e487d7d6b6e747f2ae31695ea6c (plain) (blame)
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
-- initialization {{{
local base =      _G
local constants = require 'irc.constants'
local ctcp =      require 'irc.ctcp'
local irc_debug = require 'irc.debug'
local misc =      require 'irc.misc'
local socket =    require 'socket'
local string =    require 'string'
local table =     require 'table'
-- }}}

module 'irc.message'

-- local functions {{{
-- parse() - parse a server command {{{
function parse(str)
    -- low-level ctcp quoting {{{
    str = ctcp.low_dequote(str)
    -- }}}
    -- parse the from field, if it exists (leading :) {{{
    local from = ""
    if str:sub(1, 1) == ":" then
        local e
        e, from = socket.skip(1, str:find("^:([^ ]*) "))
        str = str:sub(e + 1)
    end
    -- }}}
    -- get the command name or numerical reply value {{{
    local command, argstr = socket.skip(2, str:find("^([^ ]*) ?(.*)"))
    local reply = false
    if command:find("^%d%d%d$") then
        reply = true
        if constants.replies[base.tonumber(command)] then
            command = constants.replies[base.tonumber(command)]
        else
            irc_debug.warn("Unknown server reply: " .. command)
        end
    end
    -- }}}
    -- get the args {{{
    local args = misc.split(argstr, " ", ":")
    -- the first arg in a reply is always your nick
    if reply then table.remove(args, 1) end
    -- }}}
    -- return the parsed message {{{
    return {from = from, command = command, args = args}
    -- }}}
end
-- }}}
-- }}}