Помогите мне связать моего телеграмм-бота с чатом раксампа RAKSAMP.

kvarth

Новичок
Автор темы
5
0
Версия SA-MP
  1. Любая
Я хочу синхронизировать своего бота Telegram с чатом raksamp, чтобы я мог писать такие команды, как !quit и команды сервера. Как мне это сделать?

Telegram Chat:
local telegramuvedi = false -- переставьте на false если вам ненужны телеграм уведомления

local token = ('') -- токен бота @botfather
local chatid = ('') -- чат айди @getmyid_bot

local link = ('https://api.telegram.org/bot' .. token .. '/sendMessage?chat_id=' .. chatid .. '&text=')

local sampev = require("samp.events")
require("addon")
local requests = require("requests")

---снизу тг уведы-------------------------------------------------------
local effil = require 'effil'

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
       newTask(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

local ansi_decode={
    [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
    [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
    [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
    [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
    [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
    [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
    [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
    [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
    [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
    [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
    [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}

function AnsiToUtf8(s)
    local r, b = ''
    for i = 1, s and s:len() or 0 do
        b = s:byte(i)
        if b < 128 then
            r = r..string.char(b)
        else
             if b > 239 then
                   r = r..'\209'..string.char(b - 112)
             elseif b > 191 then
                  r = r..'\208'..string.char(b - 48)
             elseif ansi_decode[b] then
                   r = r..ansi_decode[b]
             else
                   r = r..'_'
             end
           end
    end
      return r
end
----------------------нужно для тг уведов вверх-------------
function sampev.onServerMessage(color, text)
    if telegramuvedi then
        asyncHttpRequest('GET', AnsiToUtf8(link..text), nil, nil, nil)
    end
end
 
Последнее редактирование:

meepi

Участник
73
28
Привет, вот можешь попробывать.
В боте вводишь

Код:
local sampev = require("samp.events")
local encoding = require("encoding")
local requests = require("requests")
local effil = require("effil")
require("addon")

encoding.default = "CP1251"
u8 = encoding.UTF8

local chatid = '' -- chat id
local token = '' -- token

function onLoad()
    getLastUpdate()
    get_telegram_updates()
end
 
local ansi_decode = {[128] = "\208\130",[129] = "\208\131",[130] = "\226\128\154",[131] = "\209\147",[132] = "\226\128\158",[133] = "\226\128\166",[134] = "\226\128\160",[135] = "\226\128\161",[136] = "\226\130\172",[137] = "\226\128\176",[138] = "\208\137",[139] = "\226\128\185",[140] = "\208\138",[141] = "\208\140",[142] = "\208\139",[143] = "\208\143",[144] = "\209\146",[145] = "\226\128\152",[146] = "\226\128\153",[147] = "\226\128\156",[148] = "\226\128\157",[149] = "\226\128\162",[150] = "\226\128\147",[151] = "\226\128\148",[152] = "\194\152",[153] = "\226\132\162",[154] = "\209\153",[155] = "\226\128\186",[156] = "\209\154",[157] = "\209\156",[158] = "\209\155",[159] = "\209\159",[160] = "\194\160",[161] = "\209\142",[162] = "\209\158",[163] = "\208\136",[164] = "\194\164",[165] = "\210\144",[166] = "\194\166",[167] = "\194\167",[168] = "\208\129",[169] = "\194\169",[170] = "\208\132",[171] = "\194\171",[172] = "\194\172",[173] = "\194\173",[174] = "\194\174",[175] = "\208\135",[176] = "\194\176",[177] = "\194\177",[178] = "\208\134",[179] = "\209\150",[180] = "\210\145",[181] = "\194\181",[182] = "\194\182",[183] = "\194\183",[184] = "\209\145",[185] = "\226\132\150",[186] = "\209\148",[187] = "\194\187",[188] = "\209\152",[189] = "\208\133",[190] = "\209\149",[191] = "\209\151"}
function AnsiToUtf8(s)
    local r, b = "", ""
    for i = 1, s and s:len() or 0 do
        b = s:byte(i)
        if b < 128 then
            r = r .. string.char(b)
        else
            if b > 239 then
                r = r .. "\209" .. string.char(b - 112)
            elseif b > 191 then
                r = r .. "\208" .. string.char(b - 48)
            elseif ansi_decode[b] then
                r = r .. ansi_decode[b]
            else
                r = r .. "_"
            end
        end
    end
    return r
end

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
    newTask(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 sendTG(msg)
    msg = msg:gsub("{......}", "")
    msg = encodeUrl(msg)
    async_http_request("https://api.telegram.org/bot" .. token .. "/sendMessage?chat_id=" .. chatid .. "&text=" .. msg, "", function(result) end)
end

function get_telegram_updates()
    newTask(function()
        while not updateid do
            wait(1)
        end
        local runner = requestRunner()
        local reject = function()
        end
        local args = ""
        while true do
            url = "https://api.telegram.org/bot" .. token .. "/getUpdates?chat_id=" .. chatid .. "&offset=-1"
            threadHandle(runner, url, args, processing_telegram_messages, reject)
            wait(0)
        end
    end)
end

function processing_telegram_messages(result)
    if result then
        local proc_table = json.decode(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) .. " "
                            if text:find("%/exit") then
                                local mode = text:match("%/exit (.+)")
                                if mode then
                                    mode = mode:gsub("%s", "")
                                    if mode == "all" then
                                        newTask(exit, 100)
                                    elseif mode:find("(%d+)") then
                                        if tonumber(mode) == getBotId() then
                                            newTask(exit, 100)
                                        end
                                    end
                            elseif text:find('%/send') then
                                local chat = text:match('%/send (.*)')
                                if chat then
                                sendInput(chat)
                                end
                            end
                            end
                        end
                    end
                end
            end
        end
    end
end

function getLastUpdate()
    local offset = -1
    async_http_request("https://api.telegram.org/bot" .. token .. "/getUpdates?chat_id=" .. chatid .. "&offset=" .. offset, "", function(result)
        if result then
            local proc_table = json.decode(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 = offset + 1
                end
            end
        end
    end)
end

Если написать в бота /send и какой то текст он отправит его в чат игры, если найдешь баги то отпиши в эту тему

Я хочу синхронизировать своего бота Telegram с чатом raksamp, чтобы я мог писать такие команды, как !quit и команды сервера. Как мне это сделать?

Telegram Chat:
local telegramuvedi = false -- переставьте на false если вам ненужны телеграм уведомления

local token = ('') -- токен бота @botfather
local chatid = ('') -- чат айди @getmyid_bot

local link = ('https://api.telegram.org/bot' .. token .. '/sendMessage?chat_id=' .. chatid .. '&text=')

local sampev = require("samp.events")
require("addon")
local requests = require("requests")

---снизу тг уведы-------------------------------------------------------
local effil = require 'effil'

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
       newTask(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

local ansi_decode={
    [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
    [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
    [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
    [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
    [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
    [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
    [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
    [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
    [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
    [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
    [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}

function AnsiToUtf8(s)
    local r, b = ''
    for i = 1, s and s:len() or 0 do
        b = s:byte(i)
        if b < 128 then
            r = r..string.char(b)
        else
             if b > 239 then
                   r = r..'\209'..string.char(b - 112)
             elseif b > 191 then
                  r = r..'\208'..string.char(b - 48)
             elseif ansi_decode[b] then
                   r = r..ansi_decode[b]
             else
                   r = r..'_'
             end
           end
    end
      return r
end
----------------------нужно для тг уведов вверх-------------
function sampev.onServerMessage(color, text)
    if telegramuvedi then
        asyncHttpRequest('GET', AnsiToUtf8(link..text), nil, nil, nil)
    end
end
А то что в коде написал хз что вообще такое