Перейти к публикации
Форум - ComputerCraft
HeroBrine1st

Telegram Interface

Рекомендованные сообщения

Я увидел на форуме библиотеку одного человека, который сделал одностороннее общение с опенкомпами через отдельного бота.

Я сделал чуток лучше. Я сделал библиотеку для ботов.

 

Установка

Копируем вот этот код в /lib/Telegram.lua:

local TG = {}
local json = require("JSON")
local internet = require("internet")
local serial = require("serialization")
local fs = require("filesystem")
function TG.sendRequest(token,method,POST)
	local data = ""
	for chunk in internet.request("https://api.telegram.org/bot" .. token .. "/" .. method,POST) do
		data = data .. chunk
	end
	return json.decode(data)
end

function TG.sendMessage(token,chat_id,text)
	while true do
		local success, reason = pcall(TG.sendRequest,token,"sendMessage",{chat_id = chat_id, text = text})
		if success then return reason end
	end
end

function TG.getUpdates(token)
	while true do
		local success, reason = pcall(TG.sendRequest,token,"getUpdates",{offset = TG.lastUpdate})
		if success then
			for i = 1, #reason.result do
				TG.lastUpdate = reason.result[i].update_id + 1
			end
			return reason 
		end
	end
end

function TG.receiveMessages(token)
	local updates = TG.getUpdates(token,{offset = TG.lastUpdate})
	local messages = {}
	for i = 1, #updates.result do
		local update = updates.result[i]
		if update and update.message then
			local message = {update = update, text = update.message.text, chat_id = update.message.chat.id}
			table.insert(messages,message)
		end
	end
	return messages
end


return TG

Скачиваем эту библиотеку https://github.com/rxi/json.lua/blob/master/json.lua в /lib/JSON.lua

 

Создание бота

Здесь все подробно обьясняют: https://tlgrm.ru/docs/bots#botfather.

 

Документация

 

Эта библиотека имеет всего 4 функции. Трех последних вполне достаточно, что бы написать простого бота. Ну а что бы создавать шедевры, есть первая функция.

 

sendRequest(token: string,method: string[, POST: table]): table

Создает GET или POST запрос к API серверу. Возвращает таблицу, которую вернул сервер.

 

sendMessage(token: string,chat_id: number,text: string)

Отправляет в диалог chat_id сообщение text. Что-то возвращает, вроде таблицу, не проверял.

 

getUpdates(token: string): table

Получает все события, которые бот должен обработать. Исключает повторы.

 

receiveMessages(token: string): table

Возвращает массив с таблицами, каждая содержит 3 значения: update - обьект самого сообщения, text - текст в сообщении и chat_id - айди чата. Зависима от getUpdates, т.е. тоже исключает повторы.

 

Так же хочу пояснить за циклы в некоторых функциях.

Эти циклы исключают ошибку разрыва соединения. Например во время перезагрузки сервера, если программа сделает запрос, сервер закроет соединение, и получится ошибка. Цикл же ждет, пока функция не выполнится успешно, и если выполнится - цикл закрывается.

А еще в библиотеке нет защиты от дурака. Учитывайте.

 

P.s. надеюсь, что ничьи чувства вступлением не оскорбил

Изменено пользователем HeroBrine1st
  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А если сервера Telegram окажутся недоступны?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А если сервера Telegram окажутся недоступны?

API сервер никогда не отключается. В одиночной игре использование данной библиотеки бессмысленно, а сервера без интернета не остаются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вещица реально крута, но есть одно "но": если мы перезагрузим ПК и заного запустим нашу библиотеку и попытаемся получить события, то на нас вывалятся все сообщения вплоть до мезозоя. Поэтому если планируешь дорабатывать - добавь фичу сохранения последнего lastUpdate в файл

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вещица реально крута, но есть одно "но": если мы перезагрузим ПК и заного запустим нашу библиотеку и попытаемся получить события, то на нас вывалятся все сообщения вплоть до мезозоя. Поэтому если планируешь дорабатывать - добавь фичу сохранения последнего lastUpdate в файл

Согласно документации, если я вызову метод getUpdates с параметром offset, все обновления, меньшие или равные этому ID будут засчитаны как обработанные.

 

То есть API сервер сам сохраняет то, что я обработал обновление. Со стороны бота ничего сохранять в файл не нужно.

Однако есть одно но: при команде типа /reboot и последующей перезагрузке бот может зациклить перезагрузку. Решение - перед выключением или перезагрузкой надо еще раз получить обновления.

 

И да, лимит обновлений - 100 единиц. При получении нового обновления самое первое удаляется (если выходит за лимит). Если обновлению уже исполнился 1 день, оно автоматически удаляется.

Изменено пользователем HeroBrine1st

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость kovirolik

Спасибо)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×