irc_modpack/irc/irc/set.lua

53 lines
985 B
Lua
Raw Permalink Normal View History

2015-09-17 20:51:25 +02:00
local select = require "socket".select
local m = {}
local set = {}
set.__index = set
function m.new(t)
t.connections = {}
t.sockets = {}
return setmetatable(t, set)
end
function set:add(connection)
local socket = connection.socket
insert(self.sockets, socket)
2015-09-23 20:54:57 +02:00
2015-09-17 20:51:25 +02:00
self.connections[socket] = connection
insert(self.connections, connection)
end
function set:remove(connection)
local socket = connection.socket
self.connections[socket] = nil
for k, s in ipairs(self.sockets) do
if socket == s then
remove(self.sockets, k)
remove(self.connections, k)
break
end
end
end
function set:select()
local read, write, err = select(self.sockets, nil, self.timeout)
2015-09-23 20:54:57 +02:00
2015-09-17 20:51:25 +02:00
if read then
for k, socket in ipairs(read) do
read[k] = self.connections[socket]
end
end
2015-09-23 20:54:57 +02:00
2015-09-17 20:51:25 +02:00
return read, err
end
-- Select - but if it times out, it returns all connections.
function set:poll()
local read, err = self:select()
return err == "timeout" and self.connections or read
end
return m