mirror of
https://gitlab.com/octospacc/WinDog.git
synced 2025-06-05 22:09:20 +02:00
More work on Matrix, move commands to new HTML locales, fix Mastodon
This commit is contained in:
@@ -23,7 +23,7 @@ def TelegramMain() -> bool:
|
||||
return False
|
||||
updater = telegram.ext.Updater(TelegramToken)
|
||||
dispatcher = updater.dispatcher
|
||||
dispatcher.add_handler(MessageHandler(Filters.text | Filters.command, TelegramHandlerWrapper))
|
||||
dispatcher.add_handler(MessageHandler(Filters.text | Filters.command, TelegramHandler))
|
||||
updater.start_polling()
|
||||
#app = Application.builder().token(TelegramToken).build()
|
||||
#app.add_handler(MessageHandler(filters.TEXT | filters.COMMAND, TelegramHandler))
|
||||
@@ -40,60 +40,33 @@ def TelegramMakeInputMessageData(message:telegram.Message) -> InputMessageData:
|
||||
)
|
||||
data.text_auto = GetWeightedText(data.text_markdown, data.text_plain)
|
||||
data.command = ParseCommand(data.text_plain)
|
||||
data.room = SafeNamespace(
|
||||
id = f"telegram:{message.chat.id}",
|
||||
tag = message.chat.username,
|
||||
name = (message.chat.title or message.chat.first_name),
|
||||
)
|
||||
data.user = SafeNamespace(
|
||||
id = f"telegram:{message.from_user.id}",
|
||||
tag = message.from_user.username,
|
||||
name = message.from_user.first_name,
|
||||
)
|
||||
data.user.settings = GetUserSettings(data.user.id)
|
||||
data.user.settings = (GetUserSettings(data.user.id) or SafeNamespace())
|
||||
data.room = SafeNamespace(
|
||||
id = f"telegram:{message.chat.id}",
|
||||
tag = message.chat.username,
|
||||
name = (message.chat.title or message.chat.first_name),
|
||||
)
|
||||
linked = TelegramLinker(data)
|
||||
data.message_url = linked.message
|
||||
data.room.url = linked.room
|
||||
return data
|
||||
|
||||
def TelegramHandlerWrapper(update:telegram.Update, context:CallbackContext=None) -> None:
|
||||
Thread(target=lambda:TelegramHandlerCore(update, context)).start()
|
||||
|
||||
def TelegramHandlerCore(update:telegram.Update, context:CallbackContext=None) -> None:
|
||||
if not update.message:
|
||||
return
|
||||
data = TelegramMakeInputMessageData(update.message)
|
||||
if update.message.reply_to_message:
|
||||
data.quoted = TelegramMakeInputMessageData(update.message.reply_to_message)
|
||||
OnMessageParsed(data)
|
||||
cmd = ParseCmd(update.message.text)
|
||||
if cmd:
|
||||
# TODO remove old cmd and just pass the data object
|
||||
cmd.command = data.command
|
||||
cmd.quoted = data.quoted
|
||||
cmd.user = data.user
|
||||
cmd.message_id = data.message_id
|
||||
cmd.messageId = update.message.message_id
|
||||
cmd.TextPlain = cmd.Body
|
||||
cmd.TextMarkdown = update.message.text_markdown_v2
|
||||
cmd.Text = GetWeightedText(cmd.TextMarkdown, cmd.TextPlain)
|
||||
if cmd.Tokens[0][0] in CmdPrefixes and cmd.Name in Endpoints:
|
||||
cmd.User = SimpleNamespace(**{
|
||||
"Name": update.message.from_user.first_name,
|
||||
"Tag": update.message.from_user.username,
|
||||
"Id": f'telegram:{update.message.from_user.id}',
|
||||
})
|
||||
if update.message.reply_to_message:
|
||||
cmd.Quoted = SimpleNamespace(**{
|
||||
"messageId": update.message.reply_to_message.message_id,
|
||||
"Body": update.message.reply_to_message.text,
|
||||
"TextPlain": update.message.reply_to_message.text,
|
||||
"TextMarkdown": update.message.reply_to_message.text_markdown_v2,
|
||||
"Text": GetWeightedText(update.message.reply_to_message.text_markdown_v2, update.message.reply_to_message.text),
|
||||
"User": SimpleNamespace(**{
|
||||
"Name": update.message.reply_to_message.from_user.first_name,
|
||||
"Tag": update.message.reply_to_message.from_user.username,
|
||||
"Id": f'telegram:{update.message.reply_to_message.from_user.id}',
|
||||
}),
|
||||
})
|
||||
CallEndpoint(cmd.Name, EventContext(platform="telegram", event=update, manager=context), cmd)
|
||||
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)
|
||||
OnMessageParsed(data)
|
||||
if (command := ObjGet(data, "command.name")):
|
||||
CallEndpoint(command, EventContext(platform="telegram", event=update, manager=context), data)
|
||||
Thread(target=handler).start()
|
||||
|
||||
def TelegramSender(context:EventContext, data:OutputMessageData, destination):
|
||||
result = None
|
||||
@@ -104,7 +77,7 @@ def TelegramSender(context:EventContext, data:OutputMessageData, destination):
|
||||
if data.media:
|
||||
for medium in data.media:
|
||||
result = context.event.message.reply_photo(
|
||||
(DictGet(medium, "bytes") or DictGet(medium, "url")),
|
||||
(ObjGet(medium, "bytes") or ObjGet(medium, "url")),
|
||||
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),
|
||||
reply_to_message_id=replyToId)
|
||||
@@ -116,14 +89,17 @@ def TelegramSender(context:EventContext, data:OutputMessageData, destination):
|
||||
result = context.event.message.reply_text(data.text_plain, reply_to_message_id=replyToId)
|
||||
return TelegramMakeInputMessageData(result)
|
||||
|
||||
# TODO support usernames
|
||||
def TelegramLinker(data:InputMessageData) -> SafeNamespace:
|
||||
linked = SafeNamespace()
|
||||
if data.room.id:
|
||||
room_id = data.room.id.split("telegram:")[1]
|
||||
linked.room = f"https://t.me/{room_id}"
|
||||
if data.message_id:
|
||||
message_id = data.message_id.split("telegram:")[1]
|
||||
linked.message = f"{linked.room}/{message_id}"
|
||||
# prefix must be dropped for groups and channels, while direct chats apparently can never be linked
|
||||
if (room_id := "100".join(data.room.id.split("telegram:")[1].split("100")[1:])):
|
||||
# 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}"
|
||||
return linked
|
||||
|
||||
RegisterPlatform(name="Telegram", main=TelegramMain, sender=TelegramSender, linker=TelegramLinker, eventClass=telegram.Update)
|
||||
|
Reference in New Issue
Block a user