#!/usr/bin/lua

socket = require 'socket'
copas = require 'copas'

daemon = require 'concurrent.daemon'

database = {}

server = socket.bind('*', 9634)

function handler(socket)
    socket = copas.wrap(socket)
    while true do
        local data = socket:receive()
        if not data then
            break
        end

        local name, port = string.match(data, '^%+ ([%w_]+@[%w-.]+) (%d+)$')
        if name and port and not database[name] then
            database[name] = port
            print(name .. ' = ' .. port)
        end
        
        local name, port = string.match(data, '^%= ([%w_]+@[%w-.]+) (%d+)$')
        if name and port and database[name] then
            database[name] = port
            print(name .. ' = ' .. port)
        end

        local name = string.match(data, '^%- ([%w_]+@[%w-.]+)$')
        if name and database[name] then
            database[name] = nil
            print(name .. ' = 0')
        end

        local name = string.match(data, '^%? ([%w_]+@[%w-.]+)$')
        if name then
            if database[name] then
                socket:send(database[name] .. '\r\n')
            else
                socket:send('0\r\n')
            end
        end

        if string.find(data, '^%*$') then
            local s = ''
            for k, v in pairs(database) do
                s = s .. k .. '=' .. v .. ',' 
            end
            socket:send(s .. '\r\n')
        end
    end
end

daemon.daemon()

copas.addserver(server, handler)
copas.loop()

