mirror of
https://github.com/OTCv8/otclientv8.git
synced 2025-04-29 18:59:20 +02:00
91 lines
3.3 KiB
Lua
91 lines
3.3 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.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
|