More work on Matrix, move commands to new HTML locales, fix Mastodon

This commit is contained in:
2024-06-28 01:57:42 +02:00
parent 2c73846554
commit 4afb5f3275
28 changed files with 307 additions and 271 deletions

View File

@@ -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)