Асинхронные запросы

xanndiane

Известный
Автор темы
521
148
Версия MoonLoader
.026-beta
Когда работаю с запросами по данному туториалу вылазит такая ошибочка...
Помогите или подскажите другие способы пожалуйста!
1703251616192.png

Работаю с этим кодом(То что лютейше говна наложил знаю но это не важно ведь в данном случае)
lua:
local lanes = require('lanes').configure()

function main()
    sampRegisterChatCommand('request', req)
    wait(0)
end

function req(text)
    request('POST', 'http://127.0.0.1:5000',nil)
    sampAddChatMessage("request: " .. text,-1)
end

function request(method, url, args)
    if not _G['lanes.async_http'] then
        local linda = lanes.linda()
        local lane_gen = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
            local requests = require 'requests'
            while true do
                local key, val = linda:receive(50 / 1000, 'request')
                if key == 'request' then
                    local ok, result = pcall(requests.request, val.method, val.url, val.args)
                    if ok then
                        result.json, result.xml = nil, nil
                        linda:send('response', result)
                    else
                        linda:send('error', result)
                    end
                end
            end
        end)
        _G['lanes.async_http'] = {lane = lane_gen(), linda = linda}
    end
    local lanes_http = _G['lanes.async_http']
    lanes_http.linda:send('request', {method = method, url = url, args = args})
    lua_thread.create(function(linda)
        while true do
            local key, val = linda:receive(0, 'response', 'error')
            if key == 'response' then
                -- return resolve(val)
            elseif key == 'error' then
                -- return reject(val)
            end
            wait(0)
        end
    end, lanes_http.linda)
end

Возможно просто я тупой и чето не дочитал... Не бейте палками
 

Sadow

Известный
1,439
587
Используй лучше effil
 
  • Нравится
Реакции: Rice.

xanndiane

Известный
Автор темы
521
148
Используй лучше effil
Вот не поверишь... Та же ошибка так еще и после нее игра закрываеться

Попробуй ты данный код... МБ у меня чето не то
 
  • Клоун
Реакции: Fott

Sadow

Известный
1,439
587
Lua:
local effil = require("effil")

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("requests", function()
        request("GET", "http://127.0.0.1:5000", nil, function(resp)
            sampAddChatMessage("request: " .. resp.text)
        end,
        function(err)
            sampAddChatMessage(err)
        end)
    end)
end

function request(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require("requests")
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)

   if not resolve then resolve = function() end end
   if not reject then reject = function() end end

   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == "completed" then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == "canceled" then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
 

xanndiane

Известный
Автор темы
521
148
Lua:
local effil = require("effil")

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("requests", function()
        request("GET", "http://127.0.0.1:5000", nil, function(resp)
            sampAddChatMessage("request: " .. resp.text)
        end,
        function(err)
            sampAddChatMessage(err.text)
        end)
    end)
end

function request(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require("requests")
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)

   if not resolve then resolve = function() end end
   if not reject then reject = function() end end

   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == "completed" then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == "canceled" then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
То же самое
 
  • Клоун
Реакции: Fott

Sadow

Известный
1,439
587
Lua:
local effil = require("effil")

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("requests", function()
        request("GET", "https://www.google.com/", nil, function(resp)
            sampAddChatMessage("request: " .. resp.text)
        end,
        function(err)
            sampAddChatMessage(err)
        end)
    end)
end

function request(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require("requests")
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)

   if not resolve then resolve = function() end end
   if not reject then reject = function() end end

   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == "completed" then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == "canceled" then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
Если не сработает, то наврятли проблема в скрипте
 

xanndiane

Известный
Автор темы
521
148
Lua:
local effil = require("effil")

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("requests", function()
        request("GET", "https://www.google.com/", nil, function(resp)
            sampAddChatMessage("request: " .. resp.text)
        end,
        function(err)
            sampAddChatMessage(err)
        end)
    end)
end

function request(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require("requests")
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)

   if not resolve then resolve = function() end end
   if not reject then reject = function() end end

   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == "completed" then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == "canceled" then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
Если не сработает, то наврятли проблема в скрипте
ииии тоже не работает. У тебя скрипт то работает? Проверь если есть возможность
 
  • Клоун
Реакции: Fott

invilso.

Известный
249
89
Использую вот такой вариант уже более полутора лет, полет нормальный.
get_unactivated_admins запускается в lua потоке обычном.
Файликом http.lua нужно заменить файл lib/copas/http.lua, или как вариант создать файл этот отдельно для своего скрипта.
В моем варианте http.lua включена поддержка хидерсов (мб ещё что-то не помню уже).

P.S. Поддерживается ли ssl - не знаю.

Старайся в скрипте не делать так чтобы запросы "перекрикивали" друг друга. Раз на дофига случаев крашит скрипт из-за этого.

Lua:
local copas = require 'copas'
local http = require 'copas.http'

function httpRequest(method, request, body, headers, handler)
    if not copas.running then
        copas.running = true
        lua_thread.create(function()
            wait(0)
            if not pcall(thread_manage_tool) then
                print('Copas err')
            end
        end)
    end
    if handler then
        return copas.addthread(function(m, r, b, he, h)
            copas.setErrorHandler(function(err) h(nil, err) end)
            h(http.request(r, b, he, m))
        end, method, request, body, headers, handler)
    else
        local results
        local thread = copas.addthread(function(m, r, b, he)
            copas.setErrorHandler(function(err) results = {nil, err} end)
            results = table.pack(http.request(r, b, he, m))
        end, method, request, body, headers)
        while coroutine.status(thread) ~= 'dead' do wait(0) end
        return table.unpack(results)
    end
end

function thread_manage_tool()
    while not copas.finished() do
        local ok, err = copas.step(0)
        if ok == nil then error(err) end
        wait(0)
    end
    copas.running = false
end


function get_unactivated_admins()
    local headers = {
        ["Authorization"] = "Token "..auth.token,
        ["content-type"] = "application/json"
    }
    local data = {}
    local response, code, headers, status = httpRequest('GET', "http://"..host.."/account/longpoll/unactivated", encodeJson(data), headers)
    if code == 200 then
        handleUnactivatedAdmins(decodeJson(response))
    end
end
 

Вложения

  • http.lua
    14.2 KB · Просмотры: 4
Последнее редактирование:

xanndiane

Известный
Автор темы
521
148
Использую вот такой вариант уже более полутора лет, полет нормальный.
get_unactivated_admins запускается в lua потоке обычном.
Файликом http.lua нужно заменить файл lib/copas/http.lua, или как вариант создать файл этот отдельно для своего скрипта.
В моем варианте http.lua включена поддержка хидерсов (мб ещё что-то не помню уже).

P.S. Поддерживается ли ssl - не знаю.

Старайся в скрипте не делать так чтобы запросы "перекрикивали" друг друга. Раз на дофига случаев крашит скрипт из-за этого.

Lua:
local copas = require 'copas'
local http = require 'copas.http'

function httpRequest(method, request, body, headers, handler)
    if not copas.running then
        copas.running = true
        lua_thread.create(function()
            wait(0)
            if not pcall(thread_manage_tool) then
                print('Copas err')
            end
        end)
    end
    if handler then
        return copas.addthread(function(m, r, b, he, h)
            copas.setErrorHandler(function(err) h(nil, err) end)
            h(http.request(r, b, he, m))
        end, method, request, body, headers, handler)
    else
        local results
        local thread = copas.addthread(function(m, r, b, he)
            copas.setErrorHandler(function(err) results = {nil, err} end)
            results = table.pack(http.request(r, b, he, m))
        end, method, request, body, headers)
        while coroutine.status(thread) ~= 'dead' do wait(0) end
        return table.unpack(results)
    end
end

function thread_manage_tool()
    while not copas.finished() do
        local ok, err = copas.step(0)
        if ok == nil then error(err) end
        wait(0)
    end
    copas.running = false
end


function get_unactivated_admins()
    local headers = {
        ["Authorization"] = "Token "..auth.token,
        ["content-type"] = "application/json"
    }
    local data = {}
    local response, code, headers, status = httpRequest('GET', "http://"..host.."/account/longpoll/unactivated", encodeJson(data), headers)
    if code == 200 then
        handleUnactivatedAdmins(decodeJson(response))
    end
end
Оно хоть обосрись обращаеться к этому длл. Скинь который у тебя в либах
[ML] (error) LongChat — êîïèÿ.lua: error loading module 'mime.core' from file 'D:\GTA 140K BY DAPO SHOW\moonloader\lib\mime\core.dll':
 
  • Клоун
Реакции: Fott

Fott

Простреленный
3,433
2,279
try
Lua:
local lanes = require('lanes').configure() -- в начало скрипта, конечно же

function async_http_request(method, url, args, resolve, reject)
    local request_lane = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
        local requests = require 'requests'
        local ok, result = pcall(requests.request, method, url, args)
        if ok then
            result.json, result.xml = nil, nil -- cannot be passed through a lane
            return true, result
        else
            return false, result -- return error
        end
    end)
    if not reject then reject = function() end end
    lua_thread.create(function()
        local lh = request_lane()
        while true do
            local status = lh.status
            if status == 'done' then
                local ok, result = lh[1], lh[2]
                if ok then resolve(result) else reject(result) end
                return
            elseif status == 'error' then
                return reject(lh[1])
            elseif status == 'killed' or status == 'cancelled' then
                return reject(status)
            end
            wait(0)
        end
    end)
end



Lua:
async_http_request('POST', 'http://127.0.0.1', {params = {param1 = 'test', param2 = 123}},
  function(response)
    print(response.text, response.status_code)
  end,
  function(err)
    print(err)
  end)
 

xanndiane

Известный
Автор темы
521
148
try
Lua:
local lanes = require('lanes').configure() -- в начало скрипта, конечно же

function async_http_request(method, url, args, resolve, reject)
    local request_lane = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
        local requests = require 'requests'
        local ok, result = pcall(requests.request, method, url, args)
        if ok then
            result.json, result.xml = nil, nil -- cannot be passed through a lane
            return true, result
        else
            return false, result -- return error
        end
    end)
    if not reject then reject = function() end end
    lua_thread.create(function()
        local lh = request_lane()
        while true do
            local status = lh.status
            if status == 'done' then
                local ok, result = lh[1], lh[2]
                if ok then resolve(result) else reject(result) end
                return
            elseif status == 'error' then
                return reject(lh[1])
            elseif status == 'killed' or status == 'cancelled' then
                return reject(status)
            end
            wait(0)
        end
    end)
end



Lua:
async_http_request('POST', 'http://127.0.0.1', {params = {param1 = 'test', param2 = 123}},
  function(response)
    print(response.text, response.status_code)
  end,
  function(err)
    print(err)
  end)
Проблема после создания потока
[ML] (error) LongChat — êîïèÿ.lua: error loading module 'lub.Autoload' from file 'D:\GTA 140K BY DAPO SHOW\moonloader\lib\lub\Autoload.lua':
D:\GTA 140K BY DAPO SHOW\moonloader\lib\lub\Autoload.lua:1: unexpected symbol near '<'
stack traceback:
[C]: in function '__index'
D:\GTA 140K BY DAPO SHOW\moonloader\LongChat — êîïèÿ.lua:43: in function <D:\GTA 140K BY DAPO SHOW\moonloader\LongChat — êîïèÿ.lua:34>
[ML] (error) LongChat — êîïèÿ.lua: Script died due to an error. (0B9BF40C)
 
  • Клоун
Реакции: Fott