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

blessave

Известный
364
106
у меня у одного дня 2-3 уже какая-то дичь происходит?

из телеграмма в самп сообщения отправляются с задержкой 3-5 сек, а через некоторое время и вовсе отправить ничего невозможно в игру, до тех пор пока не перезагрузишь мунловд, крашей никаких нет, ощущения будто телеграмм лагает или еще что, не пойму..
 

blessave

Известный
364
106
Как можно спрятать токен бота и chat_id чтобы человек заглянувший в код скрипта не нашёл там токен и не мог изменить текст который отправляется в телеграмм мне?
в конфиге сделать токен и ид, но его также можно открыть и изменить.

можно на гитхабе разместить конфииг и посылать запрос в коде, так токен и ид никто не изменит, кроме тебя, но узнав ссылку на гитхаб из кода - человек получит твой токен и ид
 

blessave

Известный
364
106
Я это знаю. Я бы так и сделал, но мне надо чтобы никто не узнал это
мб подойдет
 

Shina

Новичок
16
3
Я что то скорей всего туплю, но как сделать чтобы при получение команды с тг пришла игровая статистика также в сообщении тг ?
 

DanyaMarlow111

Участник
35
5
Помогите, как фиксануть
1691770060956.png
 

Dewize

Известный
432
88
Посмотреть вложение 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
Позже постараюсь выложить обновленную версию с кнопками(ну когда разберусь:))
Если нашли какой-то баг - отпишите в теме
Я знаю, что в Telegram, чтоб отправить текст курсивом надо написать __слово__, а как это сделать так-же в скрипте? Я пытался, просто также сделать, но не получилось
 

neverlane

t.me/neverlane00
Автор темы
Друг
998
1,143
Я знаю, что в Telegram, чтоб отправить текст курсивом надо написать __слово__, а как это сделать так-же в скрипте? Я пытался, просто также сделать, но не получилось
нужно установить параметр parse_mode в значение Markdown или MarkdownV2, но тогда появляется много символов, которые нужно экранировать

вообще вот новый пример уведов, сделал давно прост лень заливать было
в примере есть работа с inline кнопками и адекватный long polling
кстати, если кто не знал, в тг нельзя использовать 1 токен для одновременного получения апдейтов с более чем 1 клиента (1 токен = 1 скрипт, но на отправку это никак не влияет, только апдейты)
 

Вложения

  • updated_telegram_guide.lua
    12 KB · Просмотры: 94
Последнее редактирование:
  • Нравится
Реакции: vegas, Rice. и ChromiusJ

Dewize

Известный
432
88
нужно установить параметр parse_mode в значение Markdown или MarkdownV2, но тогда появляется много символов, которые нужно экранировать

вообще вот новый пример уведов, сделал давно прост лень заливать было
в примере есть работа с inline кнопками и адекватный long polling
кстати, если кто не знал, в тг нельзя использовать 1 токен для одновременного получения апдейтов с более чем 1 клиента (1 токен = 1 скрипт, но на отправку это никак не влияет, только апдейты)
Ничего не понимаю, где комментарии.
ААААААААААААААААААААААААААААААААААААААААААА, спасите я слишком тупой, чтоб читать этот код без комментариев
 
  • Ха-ха
Реакции: Z3roKwq

Otvertka1337

Известный
13
2
нужно установить параметр parse_mode в значение Markdown или MarkdownV2, но тогда появляется много символов, которые нужно экранировать

вообще вот новый пример уведов, сделал давно прост лень заливать было
в примере есть работа с inline кнопками и адекватный long polling
кстати, если кто не знал, в тг нельзя использовать 1 токен для одновременного получения апдейтов с более чем 1 клиента (1 токен = 1 скрипт, но на отправку это никак не влияет, только апдейты)
Почему не работает код?
function sampev.onServerMessage(color, text)
local chat_id = ffi.string(telegramUserId)
local message = string.format('Сообщение сервера: %s', text)
telegram.api.sendMessage({
chat_id = chat_id,
text = message
})
end

Почему не работает код?
function sampev.onServerMessage(color, text)
local chat_id = ffi.string(telegramUserId)
local message = string.format('Сообщение сервера: %s', text)
telegram.api.sendMessage({
chat_id = chat_id,
text = message
})
end
UP
 
Последнее редактирование: