WebSocket клиент и модуль .c

donaks.

Активный
Автор темы
101
67
Версия MoonLoader
Другое
Приветствую. Мне нужно соединиться с сервером по веб сокету. Пробовал при помощи модуля websocket.lua, просит модуль lua-ev, который я просто не могу подгрузить, так как он в расширении .c. Для этого пробовал только кидать все в папку lib, но .c модули видимо не подгружает.
Также пробовал на ванилле писать, но чет не особо получилось. Ниже код, который я тестил. Но он не подключается к серверу и выводит в цикле "Socket is not connected" (status). Так как я только сегодня узнал об веб сокете, то не смог написать вменяемый код с нуля. Скорее всего нужно использовать модуль. Я просто хочу написать онлайн игру внутри гта.
Если использовать тот модуль от стороннего разработчика (websocket.lua), то придется пользователю догружать доп. модули. Но наверное это не особо проблематично. Что думаете, что посоветуете? Может кто-то уже имел дело с этим.
Lua:
local socket = require "socket"
local tcp = assert(socket.tcp())

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    tcp:connect('localhost/chat/server.php', 8090)
    -- ws://localhost:8090/chat/server.php
    -- ws://localhost/chat/server.php
    -- localhost/chat/server.php
    print("Connected!")

    tcp:send(
        "GET /chat"..
        "Host: localhost"..
        "Origin: https://localhost"..
        "Connection: Upgrade"..
        "Upgrade: websocket"..
        "Sec-WebSocket-Key: "..generate_key()..
        "Sec-WebSocket-Version: 13"
    )

    while true do
        wait(0)
        local s, status, partial = tcp:receive()
        print(s or partial)
        print(status)
        if status == "closed" then break end
    end
    tcp:close()
end


function generate_key()
    local r1 = math.random(0,0xfffffff)
    local r2 = math.random(0,0xfffffff)
    local r3 = math.random(0,0xfffffff)
    local r4 = math.random(0,0xfffffff)
    local key = write_int32(r1)..write_int32(r2)..write_int32(r3)..write_int32(r4)
    assert(#key==16,#key)
    return b64(key)
end
local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
function write_int32(v)
    return string.char(
        bit.band(bit.rshift(v, 24), 0xFF),
        bit.band(bit.rshift(v, 16), 0xFF),
        bit.band(bit.rshift(v,  8), 0xFF),
        bit.band(v, 0xFF)
    )
end

function b64(data)
    return ((data:gsub('.', function(x)
        local r, b = '',x:byte()
        for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then return '' end
        local c=0
        for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
        return b:sub(c+1,c+1)
    end)..({ '', '==', '=' })[#data%3+1])
end