2021-04-07 21:31:27 +00:00

92 lines
3.2 KiB
Lua

local context = G.botContext
context.BotServer = {}
context.BotServer.url = "ws://bot.otclient.ovh:8000/"
context.BotServer.timeout = 3
context.BotServer.ping = 0
context.BotServer._callbacks = {}
context.BotServer._lastMessageId = 0
context.BotServer._wasConnected = true -- show first warning
context.BotServer.init = function(name, channel)
if not channel or not name or channel:len() < 1 or name:len() < 1 then
return context.error("Invalid params for BotServer.init")
end
if context.BotServer._websocket then
return context.error("BotServer is already initialized")
end
context.BotServer._websocket = HTTP.WebSocketJSON(context.BotServer.url, {
onMessage = function(message, socketId)
if not context._websockets[socketId] then
return g_http.cancel(socketId)
end
if not context.BotServer._websocket or context.BotServer._websocket.id ~= socketId then
return g_http.cancel(socketId)
end
context.BotServer._wasConnected = true
if message["type"] == "ping" then
context.BotServer.ping = message["ping"]
return context.BotServer._websocket.send({type="ping"})
end
if message["type"] == "message" then
context.BotServer._lastMessageId = message["id"]
local topics = context.BotServer._callbacks[message["topic"]]
if topics then
for i=1,#topics do
topics[i](message["name"], message["message"], message["topic"])
end
end
topics = context.BotServer._callbacks["*"]
if topics then
for i=1,#topics do
topics[i](message["name"], message["message"], message["topic"])
end
end
return
end
end,
onClose = function(message, socketId)
if not context._websockets[socketId] then
return
end
context._websockets[socketId] = nil
if not context.BotServer._websocket or context.BotServer._websocket.id ~= socketId then
return
end
if context.BotServer._wasConnected then
context.warn("BotServer disconnected")
end
context.BotServer._wasConnected = false
context.BotServer._websocket = nil
context.BotServer.ping = 0
context.BotServer.init(name, channel)
end
}, context.BotServer.timeout)
context._websockets[context.BotServer._websocket.id] = 1
context.BotServer._websocket.send({type="init", name=name, channel=channel, lastMessage=context.BotServer._lastMessageId})
end
context.BotServer.terminate = function()
if context.BotServer._websocket then
context.BotServer._websocket:close()
context.BotServer._websocket = nil
end
end
context.BotServer.listen = function(topic, callback) -- callback = function(name, message, topic) -- message is parsed json = table
if not context.BotServer._websocket then
return context.error("BotServer is not initialized")
end
if not context.BotServer._callbacks[topic] then
context.BotServer._callbacks[topic] = {}
end
table.insert(context.BotServer._callbacks[topic], callback)
end
context.BotServer.send = function(topic, message)
if not context.BotServer._websocket then
return context.error("BotServer is not initialized")
end
context.BotServer._websocket.send({type="message", topic=topic, message=message})
end