2024-08-10 01:36:54 +02:00
|
|
|
# ==================================== #
|
|
|
|
# WinDog multi-purpose chatbot #
|
|
|
|
# Licensed under AGPLv3 by OctoSpacc #
|
|
|
|
# ==================================== #
|
2024-06-17 00:32:03 +02:00
|
|
|
|
2024-06-19 01:40:33 +02:00
|
|
|
""" # windog config start #
|
|
|
|
|
|
|
|
# TelegramToken = "1234567890:abcdefghijklmnopqrstuvwxyz123456789"
|
|
|
|
|
|
|
|
# end windog config # """
|
|
|
|
|
2024-06-17 00:32:03 +02:00
|
|
|
TelegramToken = None
|
|
|
|
|
2024-06-15 02:08:09 +02:00
|
|
|
import telegram, telegram.ext
|
2024-06-30 01:42:37 +02:00
|
|
|
from telegram import Bot #, Update
|
2024-06-19 01:40:33 +02:00
|
|
|
#from telegram.helpers import escape_markdown
|
|
|
|
#from telegram.ext import Application, filters, CommandHandler, MessageHandler, CallbackContext
|
2024-06-15 02:08:09 +02:00
|
|
|
from telegram.utils.helpers import escape_markdown
|
|
|
|
from telegram.ext import CommandHandler, MessageHandler, Filters, CallbackContext
|
|
|
|
|
2024-06-30 01:42:37 +02:00
|
|
|
TelegramClient = None
|
|
|
|
|
2024-06-17 00:32:03 +02:00
|
|
|
def TelegramMain() -> bool:
|
|
|
|
if not TelegramToken:
|
2024-06-15 02:08:09 +02:00
|
|
|
return False
|
2024-06-30 01:42:37 +02:00
|
|
|
global TelegramClient
|
|
|
|
TelegramClient = telegram.ext.Updater(TelegramToken)
|
|
|
|
TelegramClient.dispatcher.add_handler(MessageHandler(Filters.text | Filters.command, TelegramHandler))
|
|
|
|
TelegramClient.start_polling()
|
2024-06-19 01:40:33 +02:00
|
|
|
#app = Application.builder().token(TelegramToken).build()
|
|
|
|
#app.add_handler(MessageHandler(filters.TEXT | filters.COMMAND, TelegramHandler))
|
|
|
|
#app.run_polling(allowed_updates=Update.ALL_TYPES)
|
2024-06-17 00:32:03 +02:00
|
|
|
return True
|
2024-06-15 02:08:09 +02:00
|
|
|
|
2024-08-07 02:27:17 +02:00
|
|
|
def TelegramMakeUserData(user:telegram.User) -> UserData:
|
|
|
|
return UserData(
|
|
|
|
id = f"telegram:{user.id}",
|
|
|
|
tag = user.username,
|
|
|
|
name = user.first_name,
|
|
|
|
)
|
|
|
|
|
2024-06-20 01:45:51 +02:00
|
|
|
def TelegramMakeInputMessageData(message:telegram.Message) -> InputMessageData:
|
2024-06-26 02:02:55 +02:00
|
|
|
#if not message:
|
|
|
|
# return None
|
2024-06-20 01:45:51 +02:00
|
|
|
data = InputMessageData(
|
|
|
|
message_id = f"telegram:{message.message_id}",
|
2024-06-29 01:52:53 +02:00
|
|
|
datetime = int(time.mktime(message.date.timetuple())),
|
2024-06-20 01:45:51 +02:00
|
|
|
text_plain = message.text,
|
|
|
|
text_markdown = message.text_markdown_v2,
|
2024-08-07 02:27:17 +02:00
|
|
|
user = TelegramMakeUserData(message.from_user),
|
2024-06-29 01:52:53 +02:00
|
|
|
room = SafeNamespace(
|
|
|
|
id = f"telegram:{message.chat.id}",
|
|
|
|
tag = message.chat.username,
|
|
|
|
name = (message.chat.title or message.chat.first_name),
|
|
|
|
),
|
2024-06-20 01:45:51 +02:00
|
|
|
)
|
2024-08-10 01:36:54 +02:00
|
|
|
data.command = TextCommandData(data.text_plain, "telegram")
|
|
|
|
data.user.settings = (UserSettingsData(data.user.id) or SafeNamespace())
|
2024-06-28 01:57:42 +02:00
|
|
|
linked = TelegramLinker(data)
|
|
|
|
data.message_url = linked.message
|
|
|
|
data.room.url = linked.room
|
2024-06-20 01:45:51 +02:00
|
|
|
return data
|
|
|
|
|
2024-06-28 01:57:42 +02:00
|
|
|
def TelegramHandler(update:telegram.Update, context:CallbackContext=None) -> None:
|
|
|
|
def handler() -> None:
|
|
|
|
if not update.message:
|
|
|
|
return
|
|
|
|
data = TelegramMakeInputMessageData(update.message)
|
|
|
|
if (quoted := update.message.reply_to_message):
|
|
|
|
data.quoted = TelegramMakeInputMessageData(quoted)
|
2024-08-08 00:58:07 +02:00
|
|
|
OnInputMessageParsed(data)
|
2024-08-10 01:36:54 +02:00
|
|
|
call_endpoint(EventContext(platform="telegram", event=update, manager=context), data)
|
2024-06-28 01:57:42 +02:00
|
|
|
Thread(target=handler).start()
|
2024-06-15 02:08:09 +02:00
|
|
|
|
2024-06-30 01:42:37 +02:00
|
|
|
def TelegramSender(context:EventContext, data:OutputMessageData):
|
2024-06-25 02:08:49 +02:00
|
|
|
result = None
|
2024-07-01 01:17:35 +02:00
|
|
|
# TODO clean this
|
2024-08-08 00:58:07 +02:00
|
|
|
if data.room and (room_id := data.room.id):
|
|
|
|
result = context.manager.bot.send_message(room_id, text=data.text_plain)
|
2024-06-15 02:08:09 +02:00
|
|
|
else:
|
2024-06-26 02:02:55 +02:00
|
|
|
replyToId = (data.ReplyTo or context.event.message.message_id)
|
|
|
|
if data.media:
|
|
|
|
for medium in data.media:
|
2024-06-25 02:08:49 +02:00
|
|
|
result = context.event.message.reply_photo(
|
2024-08-10 01:36:54 +02:00
|
|
|
(obj_get(medium, "bytes") or obj_get(medium, "url")),
|
2024-06-26 02:02:55 +02:00
|
|
|
caption=(data.text_html or data.text_markdown or data.text_plain),
|
|
|
|
parse_mode=("HTML" if data.text_html else "MarkdownV2" if data.text_markdown else None),
|
2024-06-19 01:40:33 +02:00
|
|
|
reply_to_message_id=replyToId)
|
2024-06-26 02:02:55 +02:00
|
|
|
elif data.text_html:
|
|
|
|
result = context.event.message.reply_html(data.text_html, reply_to_message_id=replyToId)
|
|
|
|
elif data.text_markdown:
|
|
|
|
result = context.event.message.reply_markdown_v2(data.text_markdown, reply_to_message_id=replyToId)
|
|
|
|
elif data.text_plain:
|
|
|
|
result = context.event.message.reply_text(data.text_plain, reply_to_message_id=replyToId)
|
2024-06-25 02:08:49 +02:00
|
|
|
return TelegramMakeInputMessageData(result)
|
2024-06-15 02:08:09 +02:00
|
|
|
|
2024-06-28 01:57:42 +02:00
|
|
|
# TODO support usernames
|
2024-06-20 01:45:51 +02:00
|
|
|
def TelegramLinker(data:InputMessageData) -> SafeNamespace:
|
|
|
|
linked = SafeNamespace()
|
2024-08-08 00:58:07 +02:00
|
|
|
if (room_id := data.room.id):
|
2024-06-28 01:57:42 +02:00
|
|
|
# prefix must be dropped for groups and channels, while direct chats apparently can never be linked
|
2024-08-08 00:58:07 +02:00
|
|
|
if (room_id := "100".join(room_id.split("telegram:")[1].split("100")[1:])):
|
2024-06-28 01:57:42 +02:00
|
|
|
# apparently Telegram doesn't really support links to rooms by id without a message id, so we just use a null one
|
|
|
|
linked.room = f"https://t.me/c/{room_id}/0"
|
|
|
|
if data.message_id:
|
|
|
|
message_id = data.message_id.split("telegram:")[1]
|
|
|
|
linked.message = f"https://t.me/c/{room_id}/{message_id}"
|
2024-06-20 01:45:51 +02:00
|
|
|
return linked
|
|
|
|
|
2024-08-07 02:27:17 +02:00
|
|
|
RegisterPlatform(
|
|
|
|
name="Telegram",
|
|
|
|
main=TelegramMain,
|
|
|
|
sender=TelegramSender,
|
|
|
|
linker=TelegramLinker,
|
|
|
|
event_class=telegram.Update,
|
|
|
|
manager_class=(lambda:TelegramClient),
|
|
|
|
agent_info=(lambda:TelegramMakeUserData(TelegramClient.bot.get_me())),
|
|
|
|
)
|
2024-06-16 01:40:30 +02:00
|
|
|
|