Исходник Гайд Как сделать управление игрой через Telegram + отправка уведомлений

Ya Zaregalsya

Известный
387
135
Есть ли способ прочитать сообщение, которое отправил сам бот?
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
Есть ли способ прочитать сообщение, которое отправил сам бот?
код открыт
делал по этому соурсу
 

Ya Zaregalsya

Известный
387
135
код открыт
делал по этому соурсу
Там разве есть такое? Вроде только чтение сообщений от пользователей, а надо именно от бота, чтобы один скрипт мог отправить, а другой это же сообщение прочитать.
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
Moonloader.log:
[07:59:06.104051] (script)    ML-AutoReboot: Reloading "Telegram Control SAMP"...
[07:59:06.123050] (system)    Telegram Control SAMP: Script terminated. (2D7C6B34)
[07:59:06.126049] (system)    Loading script 'D:\GTA\JTA\moonloader\Telegram Control SAMP.lua'...
[07:59:06.126049] (debug)    New script: 2D7C69AC
[07:59:06.151049] (system)    Telegram Control SAMP: Loaded successfully.
[08:07:06.084560] (error)    Telegram Control SAMP: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'decodeJson'
    D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:664: in function 'resolve'
    D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:1370: in function 'threadHandle'
    D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:1424: in function <D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:1417>
[08:07:06.088560] (error)    Telegram Control SAMP: Script died due to an error. (2D7C69AC)
[09:00:33.595823] (system)    Unloading...
Жалуется на функции отправки сообщений в телегу
ого,я ещё не умер🚽
 
  • Нравится
Реакции: Sidney31

Obeme_Negr

Новичок
1
0
Посмотреть вложение 59057
Хай, я тут поискал и не нашел темы о том, как сделать управление игрой через Telegram и решил сделать сам
Lua:
script_name('Telegram Notifications Source')
script_authors('ronnyscripts, ronny_evans')

-- подключаем библиотеки
local effil = require("effil")
local encoding = require("encoding")
encoding.default = 'CP1251'
u8 = encoding.UTF8

chat_id = '' -- чат ID юзера
token = '' -- токен бота

local updateid -- ID последнего сообщения для того чтобы не было флуда

function threadHandle(runner, url, args, resolve, reject)
    local t = runner(url, args)
    local r = t:get(0)
    while not r do
        r = t:get(0)
        wait(0)
    end
    local status = t:status()
    if status == 'completed' then
        local ok, result = r[1], r[2]
        if ok then resolve(result) else reject(result) end
    elseif err then
        reject(err)
    elseif status == 'canceled' then
        reject(status)
    end
    t:cancel(0)
end

function requestRunner()
    return effil.thread(function(u, a)
        local https = require 'ssl.https'
        local ok, result = pcall(https.request, u, a)
        if ok then
            return {true, result}
        else
            return {false, result}
        end
    end)
end

function async_http_request(url, args, resolve, reject)
    local runner = requestRunner()
    if not reject then reject = function() end end
    lua_thread.create(function()
        threadHandle(runner, url, args, resolve, reject)
    end)
end

function encodeUrl(str)
    str = str:gsub(' ', '%+')
    str = str:gsub('\n', '%%0A')
    return u8:encode(str, 'CP1251')
end

function sendTelegramNotification(msg) -- функция для отправки сообщения юзеру
    msg = msg:gsub('{......}', '') --тут типо убираем цвет
    msg = encodeUrl(msg) -- ну тут мы закодируем строку
    async_http_request('https://api.telegram.org/bot' .. token .. '/sendMessage?chat_id=' .. chat_id .. '&text='..msg,'', function(result) end) -- а тут уже отправка
end

function get_telegram_updates() -- функция получения сообщений от юзера
    while not updateid do wait(1) end -- ждем пока не узнаем последний ID
    local runner = requestRunner()
    local reject = function() end
    local args = ''
    while true do
        url = 'https://api.telegram.org/bot'..token..'/getUpdates?chat_id='..chat_id..'&offset=-1' -- создаем ссылку
        threadHandle(runner, url, args, processing_telegram_messages, reject)
        wait(0)
    end
end

function calc(str) --это тестовая функция, её не требуется переносить в ваш код
    return assert(load("return "..str))()
end

function processing_telegram_messages(result) -- функция проверОчки того что отправил чел
    if result then
        -- тута мы проверяем все ли верно
        local proc_table = decodeJson(result)
        if proc_table.ok then
            if #proc_table.result > 0 then
                local res_table = proc_table.result[1]
                if res_table then
                    if res_table.update_id ~= updateid then
                        updateid = res_table.update_id
                        local message_from_user = res_table.message.text
                        if message_from_user then
                            -- и тут если чел отправил текст мы сверяем
                            local text = u8:decode(message_from_user) .. ' ' --добавляем в конец пробел дабы не произошли тех. шоколадки с командами(типо чтоб !q не считалось как !qq)
                            if text:match('^!qq') then
                                sendTelegramNotification('Ку')
                            elseif text:match('^!q') then
                                sendTelegramNotification('Привет!')
                            elseif text:match('^!stats') then
                                sendTelegramNotification('Это тестовая версия блин')
                            elseif text:match('^!calc') then
                                local arg = text:gsub('!calc ','',1) -- вот так мы получаем аргумент команды
                                if #arg > 0 then
                                    local result_calc = calc(arg)
                                    if result_calc then
                                        sendTelegramNotification('Вы ввели пример: '..arg..'\nОтвет: '..result_calc)
                                    else
                                        sendTelegramNotification('Неверный пример!')
                                    end
                                      
                                else
                                    sendTelegramNotification('Эм, ты не ввел аргумент')
                                end
                            else -- если же не найдется ни одна из команд выше, выведем сообщение
                                sendTelegramNotification('Неизвестная команда!')
                            end
                        end
                    end
                end
            end
        end
    end
end

function getLastUpdate() -- тут мы получаем последний ID сообщения, если же у вас в коде будет настройка токена и chat_id, вызовите эту функцию для того чтоб получить последнее сообщение
    async_http_request('https://api.telegram.org/bot'..token..'/getUpdates?chat_id='..chat_id..'&offset=-1','',function(result)
        if result then
            local proc_table = decodeJson(result)
            if proc_table.ok then
                if #proc_table.result > 0 then
                    local res_table = proc_table.result[1]
                    if res_table then
                        updateid = res_table.update_id
                    end
                else
                    updateid = 1 -- тут зададим значение 1, если таблица будет пустая
                end
            end
        end
    end)
end

function main()
    while not isSampAvailable() do
        wait(0)
    end
    getLastUpdate() -- вызываем функцию получения последнего ID сообщения
    sampRegisterChatCommand('telegram',function() -- тестовая команда
        sampAddChatMessage('[Telegram] Отправляю тестовое сообщение',-1)
        sendTelegramNotification('Тестовое сообщение от '..sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))) -- отправляем сообщение юзеру
    end)
    lua_thread.create(get_telegram_updates) -- создаем нашу функцию получения сообщений от юзера
    while true do
        wait(0)
    end
end
Позже постараюсь выложить обновленную версию с кнопками(ну когда разберусь:))
Если нашли какой-то баг - отпишите в теме
Можешь дать готовую луашку, чтоб просто закинуть, поменять чат айди и кайфовать?
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
@Vespan Есть функция отправки изображения в тг из луа?
 

Sidney31

Известный
1,124
385
Moonloader.log:
[07:59:06.104051] (script)    ML-AutoReboot: Reloading "Telegram Control SAMP"...
[07:59:06.123050] (system)    Telegram Control SAMP: Script terminated. (2D7C6B34)
[07:59:06.126049] (system)    Loading script 'D:\GTA\JTA\moonloader\Telegram Control SAMP.lua'...
[07:59:06.126049] (debug)    New script: 2D7C69AC
[07:59:06.151049] (system)    Telegram Control SAMP: Loaded successfully.
[08:07:06.084560] (error)    Telegram Control SAMP: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'decodeJson'
    D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:664: in function 'resolve'
    D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:1370: in function 'threadHandle'
    D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:1424: in function <D:\GTA\JTA\moonloader\Telegram Control SAMP.lua:1417>
[08:07:06.088560] (error)    Telegram Control SAMP: Script died due to an error. (2D7C69AC)
[09:00:33.595823] (system)    Unloading...
Жалуется на функции отправки сообщений в телегу
ого,я ещё не умер🚽
не нашёл фикс?
 

Aizen Sosuke

Участник
120
20
1652922280416.png

Вписываю токен бота, в чат айди - свой айди.
Крашит игру, что не так?
 
  • Ха-ха
Реакции: qdIbp

artie

Участник
70
20
как такие фокусы пофиксить? помирает после пары часов нормальной работы
Код:
[15:37:09.435648] (error)    Telegram Notifications Source: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'decodeJson'
    D:\Games\SAMP\trade\moonloader\fromtg.lua:91: in function 'resolve'
    D:\Games\SAMP\trade\moonloader\fromtg.lua:29: in function 'threadHandle'
    D:\Games\SAMP\trade\moonloader\fromtg.lua:83: in function <D:\Games\SAMP\trade\moonloader\fromtg.lua:76>
[15:37:09.435648] (error)    Telegram Notifications Source: Script died due to an error. (10836104)
 

Vespan

Чешский луашер
Проверенный
2,120
1,722
как такие фокусы пофиксить? помирает после пары часов нормальной работы
Код:
[15:37:09.435648] (error)    Telegram Notifications Source: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'decodeJson'
    D:\Games\SAMP\trade\moonloader\fromtg.lua:91: in function 'resolve'
    D:\Games\SAMP\trade\moonloader\fromtg.lua:29: in function 'threadHandle'
    D:\Games\SAMP\trade\moonloader\fromtg.lua:83: in function <D:\Games\SAMP\trade\moonloader\fromtg.lua:76>
[15:37:09.435648] (error)    Telegram Notifications Source: Script died due to an error. (10836104)
после краша перезапускай скрипт через отдельный скрипт
 
  • Нравится
  • Грустно
Реакции: qdIbp и artie