Исходник Гайд Асинхронные HTTP запросы в MoonLoader

Статус
В этой теме нельзя размещать новые ответы.

Di3

Участник
432
20
Ничего там не вылетает, просто нормальный код писать нужно. Используй обычные HTTP запросы.
result = https.request('url') - Если ты про это,то от него провисает.
На счет нормального кода),я 10 раз по разному делал,всегда вылетает по неизвестной причине.
Lua:
asyncHttpRequest("GET", 'http://ip-api.com/json/'..ip1..'?lang=ru', nil,
    function(regdanny1)
        local regvrem = u8:decode(regdanny1.text)
   local   city1,country1,isp1 = regvrem:match('city%":%"(.*)%"%,%"country%":%"(.*)%"%,%"countryCode.*%"isp%":%"(.*)%"%,%"lat%"')
  asyncHttpRequest("GET", 'http://ip-api.com/json/'..ip2..'?lang=ru', nil,
    function(regdanny2)
        local regvrem = u8:decode(regdanny2.text)
   local city2,country2,isp2 = regvrem:match('city%":%"(.*)%"%,%"country%":%"(.*)%"%,%"countryCode.*%"isp%":%"(.*)%"%,%"lat%"')
-- Дальнейший код.
    end,
    function(err)
    print(err)
    sampAddChatMessage('[Ошибка] Не удалось загрузить информацию о LAST IP', 0xFF0000)
    end)
    end,
    function(err)
    print(err)
    sampAddChatMessage('[Ошибка] Не удалось загрузить информацию о REG IP', 0xFF0000)
    end)
Что тут может быть еще не так то?)
 

Frapsy

Известный
Проверенный
393
226
т.е если я изменю функцию запроса то все заработает?)
Совмещай асинхронные и
result = https.request('url')
Провисает не критично, но работать будет и не крашнет.
Господи, просто засунь асинхронный в асинхронный
В этой теме только и твердят о том, что это вызовет неминуемый краш скрипта по левой и неинформативной причине и ты говоришь это делать? А ю сириусли? У него по коду запрос в запросе, это и есть причина краша скрипта, потому что одновременно ты не сможешь юзать несколько асинхронных на постоянке и придется играть в подобие рулетки, крашнет сразу или через минуту. Если не смотреть на то, что у него запрос в запросе, то функция используется правильно.

Выход - жертвовать просадкой игры на долю секунды-секунду, но избегать краша.. Хотя, как вариант, про который говорил(очередь), сделай сначала получение информации RIP, а после него LIP, застопить скрипт можешь циклом до тех пор, пока не получишь ответа по первому запросу, единственный косяк, что если ответа не получишь - скрипт встанет до таймаута по запросу ;D
 
  • Нравится
Реакции: Di3

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Совмещай асинхронные и

Провисает не критично, но работать будет и не крашнет.

В этой теме только и твердят о том, что это вызовет неминуемый краш скрипта по левой и неинформативной причине и ты говоришь это делать? А ю сириусли? У него по коду запрос в запросе, это и есть причина краша скрипта, потому что одновременно ты не сможешь юзать несколько асинхронных на постоянке и придется играть в подобие рулетки, крашнет сразу или через минуту. Если не смотреть на то, что у него запрос в запросе, то функция используется правильно.

Выход - жертвовать просадкой игры на долю секунды-секунду, но избегать краша.. Хотя, как вариант, про который говорил(очередь), сделай сначала получение информации RIP, а после него LIP, застопить скрипт можешь циклом до тех пор, пока не получишь ответа по первому запросу, единственный косяк, что если ответа не получишь - скрипт встанет до таймаута по запросу ;D
Как бы нет. Вызвать вторую асинхронную после результата первой - единственный верный вариант. А вообще нафиг их, юзаем http requests!
 

Di3

Участник
432
20
Как бы нет. Вызвать вторую асинхронную после результата первой - единственный верный вариант. А вообще нафиг их, юзаем http requests!
Два запроса последовательно. Результат такой же,либо я кривой , либо два запроса подряд никак не сделать.

Lua:
if msg:find('Nik %[(.*)%]  R%-IP %[(.*)%]  IP %[(.*)%]') and statuschecktrue == true then
statuschecktrue = false
    if statuschecktrue2 == true then
    lua_thread.create(function()
        local reginick,regip,reglast =    msg:match('Nik %[(.*)%]  R%-IP %[(.*)%]  IP %[(.*)%]')
            statuschecktrue2=false
errorregi=false
city2=nil
country2=nil
isp2=nil
city1=nil
country1=nil
isp1=nil
asyncHttpRequest("GET", 'http://ip-api.com/json/'..regip..'?lang=ru', nil,
function(xueta)
local regvrem = u8:decode(xueta.text)
city1,country1,isp1 = regvrem:match('city%":%"(.*)%"%,%"country%":%"(.*)%"%,%"countryCode.*%"isp%":%"(.*)%"%,%"lat%"')
end,
function(errlob)
print(errlob)
sampAddChatMessage('[Ошибка] Не удалось загрузить информацию о REG IP', 0xFF0000)
errorregi = true
end)
while not city1 or errorregi == true do wait(0) end
asyncHttpRequest("GET", 'http://ip-api.com/json/'..reglast..'?lang=ru', nil,
function(response)
local regvrem = u8:decode(response.text)
city2,country2,isp2 = regvrem:match('city%":%"(.*)%"%,%"country%":%"(.*)%"%,%"countryCode.*%"isp%":%"(.*)%"%,%"lat%"')
end,
function(err)
print(err)
errorregi = true
sampAddChatMessage('[Ошибка] Не удалось загрузить информацию о LAST IP', 0xFF0000)
end)
while not city1 or not city2 or errorregi==true do wait(0) end
statuschecktrue2=true
if city1 and city2 then
sampAddChatMessage(country1..'  '..country2, -1)
sampAddChatMessage(city1..'  '..city2, -1)
sampAddChatMessage(isp1..'  '..isp2, -1)
else
sampAddChatMessage('[Ошибка] Не удалось загрузить информацию.', 0xFF0000)
end

end)
else
sampAddChatMessage('[Ошибка] Ожидайте загрузки прошлого запроса.', 0xFF0000)
end
return false
end

result = https.request('url') - Провисание в 3 секунды такое себе удовольствие.
 
Последнее редактирование:

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Два запроса последовательно. Результат такой же,либо я кривой , либо два запроса подряд никак не сделать.

Lua:
if msg:find('Nik %[(.*)%]  R%-IP %[(.*)%]  IP %[(.*)%]') and statuschecktrue == true then
statuschecktrue = false
    if statuschecktrue2 == true then
    lua_thread.create(function()
        local reginick,regip,reglast =    msg:match('Nik %[(.*)%]  R%-IP %[(.*)%]  IP %[(.*)%]')
            statuschecktrue2=false
errorregi=false
city2=nil
country2=nil
isp2=nil
city1=nil
country1=nil
isp1=nil
asyncHttpRequest("GET", 'http://ip-api.com/json/'..regip..'?lang=ru', nil,
function(xueta)
local regvrem = u8:decode(xueta.text)
city1,country1,isp1 = regvrem:match('city%":%"(.*)%"%,%"country%":%"(.*)%"%,%"countryCode.*%"isp%":%"(.*)%"%,%"lat%"')
end,
function(errlob)
print(errlob)
sampAddChatMessage('[Ошибка] Не удалось загрузить информацию о REG IP', 0xFF0000)
errorregi = true
end)
while not city1 or errorregi == true do wait(0) end
asyncHttpRequest("GET", 'http://ip-api.com/json/'..reglast..'?lang=ru', nil,
function(response)
local regvrem = u8:decode(response.text)
city2,country2,isp2 = regvrem:match('city%":%"(.*)%"%,%"country%":%"(.*)%"%,%"countryCode.*%"isp%":%"(.*)%"%,%"lat%"')
end,
function(err)
print(err)
errorregi = true
sampAddChatMessage('[Ошибка] Не удалось загрузить информацию о LAST IP', 0xFF0000)
end)
while not city1 or not city2 or errorregi==true do wait(0) end
statuschecktrue2=true
if city1 and city2 then
sampAddChatMessage(country1..'  '..country2, -1)
sampAddChatMessage(city1..'  '..city2, -1)
sampAddChatMessage(isp1..'  '..isp2, -1)
else
sampAddChatMessage('[Ошибка] Не удалось загрузить информацию.', 0xFF0000)
end

end)
else
sampAddChatMessage('[Ошибка] Ожидайте загрузки прошлого запроса.', 0xFF0000)
end
return false
end

result = https.request('url') - Провисание в 3 секунды такое себе удовольствие.
С такой табуляцией я никогда ничего не пойму.
 
  • Нравится
Реакции: Di3

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
Через пол часа после постоянных асинхронных запросов с задержкой в 200 мс процессор нагружается до 100 процентов, даже если игра свёрнута.
С чем это может быть связано? Кто-то сталкивался? Использую Effil.
 
  • Нравится
Реакции: Di3

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,133
Через пол часа после постоянных асинхронных запросов с задержкой в 200 мс процессор нагружается до 100 процентов, даже если игра свёрнута.
С чем это может быть связано? Кто-то сталкивался? Использую Effil.
Задержка 200 мс. Ну ты и смертник.
Не было такого, хотя на такой задержке не гонял.
 

Di3

Участник
432
20
Через пол часа после постоянных асинхронных запросов с задержкой в 200 мс процессор нагружается до 100 процентов, даже если игра свёрнута.
С чем это может быть связано? Кто-то сталкивался? Использую Effil.
Мб в этом и есть причина крашей, типо процесс не завершается .
 

Aniki

🐰
Администратор
1,225
1,506
Через пол часа после постоянных асинхронных запросов с задержкой в 200 мс процессор нагружается до 100 процентов, даже если игра свёрнута.
С чем это может быть связано? Кто-то сталкивался? Использую Effil.
а код будет или как
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,484
скорее всего там куча незавершенных потоков от этих запросов остается, иначе чему там так грузить проц
Кстати, да, иногда запросы могут не доходить до клиента, из-за этого может быть? Они копятся и нагружает.

Вечером отправлю сам код запроса.

скорее всего там куча незавершенных потоков от этих запросов остается, иначе чему там так грузить проц
Lua:
firstload = true
lua_thread.create(function()
    while true do wait(200)
     
        asyncHttpRequest('GET', 'https://url/tekstovik.txt', nil --[[Аргументы запроса]],
        function(response)
            local texte = response.text:match('.+ ~=|=|=~ (.+)')
            userid = response.text:match('(.+) ~=|=|=~ .+')
            globaltext = texte
            userservername, userchatnick, message =  texte:match('%[(.+)%] %[(.+)%]: (.+)')
            if userservername ~= nil then
                userservername = userservername:gsub('Pears Pr.', '{00BFFF}Pears Pr.')
                userservername = userservername:gsub('Lime Pr.', '{00BFFF}Lime Pr.')
                userservername = userservername:gsub('Kiwi Pr.', '{00BFFF}Kiwi Pr.')
                userservername = userservername:gsub('ARZ', '{B80000}ARZ')
                userservername = userservername:gsub('DRP', '{77DDE7}DRP')
            end
            if globaltext ~= nil then
                globaltext = globaltext:gsub('%%', '%%%%')
                globaltext = globaltext:gsub('%$', '%%$')
                globaltext = globaltext:gsub('%*', '%%*')
            end
            if message ~= nil then
                message = message:gsub('%%', '%%%%')
                message = message:gsub('%$', '%%$')
                message = message:gsub('%*', '%%*')
            end
        end,
        function(err)
         
        end)
        while userid == nil and globaltext == nil and userchatnick == nil and message == nil do wait(0) end
        if firstload == true then oldtext = globaltext firstload = false end
        -- Остальная часть кода
    end
end)

function asyncHttpRequest(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

@Aniki
 

Aniki

🐰
Администратор
1,225
1,506
Кстати, да, иногда запросы могут не доходить до клиента, из-за этого может быть? Они копятся и нагружает.

Вечером отправлю сам код запроса.


Lua:
firstload = true
lua_thread.create(function()
    while true do wait(200)
  
        asyncHttpRequest('GET', 'https://url/tekstovik.txt', nil --[[Аргументы запроса]],
        function(response)
            local texte = response.text:match('.+ ~=|=|=~ (.+)')
            userid = response.text:match('(.+) ~=|=|=~ .+')
            globaltext = texte
            userservername, userchatnick, message =  texte:match('%[(.+)%] %[(.+)%]: (.+)')
            if userservername ~= nil then
                userservername = userservername:gsub('Pears Pr.', '{00BFFF}Pears Pr.')
                userservername = userservername:gsub('Lime Pr.', '{00BFFF}Lime Pr.')
                userservername = userservername:gsub('Kiwi Pr.', '{00BFFF}Kiwi Pr.')
                userservername = userservername:gsub('ARZ', '{B80000}ARZ')
                userservername = userservername:gsub('DRP', '{77DDE7}DRP')
            end
            if globaltext ~= nil then
                globaltext = globaltext:gsub('%%', '%%%%')
                globaltext = globaltext:gsub('%$', '%%$')
                globaltext = globaltext:gsub('%*', '%%*')
            end
            if message ~= nil then
                message = message:gsub('%%', '%%%%')
                message = message:gsub('%$', '%%$')
                message = message:gsub('%*', '%%*')
            end
        end,
        function(err)
      
        end)
        while userid == nil and globaltext == nil and userchatnick == nil and message == nil do wait(0) end
        if firstload == true then oldtext = globaltext firstload = false end
        -- Остальная часть кода
    end
end)

function asyncHttpRequest(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

@Aniki
Вроде бы все ок, могу лишь предположить что какая-то хуйня происходит во время создания потока внутри другого, потому что используя реализацию с одним потоком и повторными запросами треда у меня все ок, даже на lanes
 

Jason2222

Известный
180
3
Можно ли таблицу с данными направлять пост запросом обработчику? Как-то не могу понять как реализовать
 
Статус
В этой теме нельзя размещать новые ответы.