Fix incoming channel messages and signatures. Fixes #67
This commit is contained in:
@@ -271,6 +271,12 @@ async def telegram_event_to_matrix(evt, source, native_replies=False, message_li
|
|||||||
else:
|
else:
|
||||||
html = quote + escape(text)
|
html = quote + escape(text)
|
||||||
|
|
||||||
|
if evt.post and evt.post_author:
|
||||||
|
if not html:
|
||||||
|
html = escape(text)
|
||||||
|
text += f"\n- {evt.post_author}"
|
||||||
|
html += f"<br/><i>- <u>{evt.post_author}</u></i>"
|
||||||
|
|
||||||
if html:
|
if html:
|
||||||
html = html.replace("\n", "<br/>")
|
html = html.replace("\n", "<br/>")
|
||||||
|
|
||||||
|
|||||||
+22
-21
@@ -675,11 +675,11 @@ class Portal:
|
|||||||
if self.mxid:
|
if self.mxid:
|
||||||
await user.intent.set_typing(self.mxid, is_typing=True)
|
await user.intent.set_typing(self.mxid, is_typing=True)
|
||||||
|
|
||||||
async def handle_telegram_photo(self, source, sender, media):
|
async def handle_telegram_photo(self, source, intent, media):
|
||||||
largest_size = self._get_largest_photo_size(media.photo)
|
largest_size = self._get_largest_photo_size(media.photo)
|
||||||
file = await source.client.download_file_bytes(largest_size.location)
|
file = await source.client.download_file_bytes(largest_size.location)
|
||||||
mime_type = magic.from_buffer(file, mime=True)
|
mime_type = magic.from_buffer(file, mime=True)
|
||||||
uploaded = await sender.intent.upload_file(file, mime_type)
|
uploaded = await intent.upload_file(file, mime_type)
|
||||||
info = {
|
info = {
|
||||||
"h": largest_size.h,
|
"h": largest_size.h,
|
||||||
"w": largest_size.w,
|
"w": largest_size.w,
|
||||||
@@ -689,8 +689,8 @@ class Portal:
|
|||||||
"mimetype": mime_type,
|
"mimetype": mime_type,
|
||||||
}
|
}
|
||||||
name = media.caption
|
name = media.caption
|
||||||
await sender.intent.set_typing(self.mxid, is_typing=False)
|
await intent.set_typing(self.mxid, is_typing=False)
|
||||||
return await sender.intent.send_image(self.mxid, uploaded["content_uri"], info=info,
|
return await intent.send_image(self.mxid, uploaded["content_uri"], info=info,
|
||||||
text=name)
|
text=name)
|
||||||
|
|
||||||
def convert_webp(self, file, to="png"):
|
def convert_webp(self, file, to="png"):
|
||||||
@@ -703,14 +703,14 @@ class Portal:
|
|||||||
self.log.exception(f"Failed to convert webp to {to}")
|
self.log.exception(f"Failed to convert webp to {to}")
|
||||||
return "image/webp", file
|
return "image/webp", file
|
||||||
|
|
||||||
async def handle_telegram_document(self, source, sender, media):
|
async def handle_telegram_document(self, source, intent, media):
|
||||||
file = await source.client.download_file_bytes(media.document)
|
file = await source.client.download_file_bytes(media.document)
|
||||||
mime_type = magic.from_buffer(file, mime=True)
|
mime_type = magic.from_buffer(file, mime=True)
|
||||||
dont_change_mime = False
|
dont_change_mime = False
|
||||||
if mime_type == "image/webp":
|
if mime_type == "image/webp":
|
||||||
mime_type, file = self.convert_webp(file, to="png")
|
mime_type, file = self.convert_webp(file, to="png")
|
||||||
dont_change_mime = True
|
dont_change_mime = True
|
||||||
uploaded = await sender.intent.upload_file(file, mime_type)
|
uploaded = await intent.upload_file(file, mime_type)
|
||||||
name = media.caption
|
name = media.caption
|
||||||
for attr in media.document.attributes:
|
for attr in media.document.attributes:
|
||||||
if not name and isinstance(attr, DocumentAttributeFilename):
|
if not name and isinstance(attr, DocumentAttributeFilename):
|
||||||
@@ -732,11 +732,11 @@ class Portal:
|
|||||||
type = "m.audio"
|
type = "m.audio"
|
||||||
elif mime_type.startswith("image/"):
|
elif mime_type.startswith("image/"):
|
||||||
type = "m.image"
|
type = "m.image"
|
||||||
await sender.intent.set_typing(self.mxid, is_typing=False)
|
await intent.set_typing(self.mxid, is_typing=False)
|
||||||
return await sender.intent.send_file(self.mxid, uploaded["content_uri"], info=info,
|
return await intent.send_file(self.mxid, uploaded["content_uri"], info=info,
|
||||||
text=name, file_type=type)
|
text=name, file_type=type)
|
||||||
|
|
||||||
def handle_telegram_location(self, source, sender, location):
|
def handle_telegram_location(self, source, intent, location):
|
||||||
long = location.long
|
long = location.long
|
||||||
lat = location.lat
|
lat = location.lat
|
||||||
long_char = "E" if long > 0 else "W"
|
long_char = "E" if long > 0 else "W"
|
||||||
@@ -753,7 +753,7 @@ class Portal:
|
|||||||
# so we'll add a plaintext link.
|
# so we'll add a plaintext link.
|
||||||
body = f"Location: {body}\n{url}"
|
body = f"Location: {body}\n{url}"
|
||||||
|
|
||||||
return sender.intent.send_message(self.mxid, {
|
return intent.send_message(self.mxid, {
|
||||||
"msgtype": "m.location",
|
"msgtype": "m.location",
|
||||||
"geo_uri": f"geo:{lat},{long}",
|
"geo_uri": f"geo:{lat},{long}",
|
||||||
"body": body,
|
"body": body,
|
||||||
@@ -761,16 +761,16 @@ class Portal:
|
|||||||
"formatted_body": formatted_body,
|
"formatted_body": formatted_body,
|
||||||
})
|
})
|
||||||
|
|
||||||
async def handle_telegram_text(self, source, sender, evt):
|
async def handle_telegram_text(self, source, intent, evt):
|
||||||
self.log.debug(f"Sending {evt.message} to {self.mxid} by {sender.id}")
|
self.log.debug(f"Sending {evt.message} to {self.mxid} by {intent.mxid}")
|
||||||
text, html = await formatter.telegram_event_to_matrix(evt, source,
|
text, html = await formatter.telegram_event_to_matrix(evt, source,
|
||||||
config["bridge.native_replies"],
|
config["bridge.native_replies"],
|
||||||
config["bridge.link_in_reply"],
|
config["bridge.link_in_reply"],
|
||||||
self.main_intent)
|
self.main_intent)
|
||||||
await sender.intent.set_typing(self.mxid, is_typing=False)
|
await intent.set_typing(self.mxid, is_typing=False)
|
||||||
return await sender.intent.send_text(self.mxid, text, html=html)
|
return await intent.send_text(self.mxid, text, html=html)
|
||||||
|
|
||||||
async def handle_telegram_edit(self, source, sender, evt):
|
async def handle_telegram_edit(self, source, intent, evt):
|
||||||
if not self.mxid:
|
if not self.mxid:
|
||||||
return
|
return
|
||||||
elif not config["bridge.edits_as_replies"]:
|
elif not config["bridge.edits_as_replies"]:
|
||||||
@@ -781,8 +781,8 @@ class Portal:
|
|||||||
config["bridge.native_replies"],
|
config["bridge.native_replies"],
|
||||||
config["bridge.link_in_reply"],
|
config["bridge.link_in_reply"],
|
||||||
self.main_intent, reply_text="Edit")
|
self.main_intent, reply_text="Edit")
|
||||||
await sender.intent.set_typing(self.mxid, is_typing=False)
|
await intent.set_typing(self.mxid, is_typing=False)
|
||||||
response = await sender.intent.send_text(self.mxid, text, html=html)
|
response = await intent.send_text(self.mxid, text, html=html)
|
||||||
|
|
||||||
mxid = response["event_id"]
|
mxid = response["event_id"]
|
||||||
tg_space = self.tgid if self.peer_type == "channel" else source.tgid
|
tg_space = self.tgid if self.peer_type == "channel" else source.tgid
|
||||||
@@ -808,15 +808,16 @@ class Portal:
|
|||||||
self.db.commit()
|
self.db.commit()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
intent = sender.intent if sender else self.main_intent
|
||||||
if evt.message:
|
if evt.message:
|
||||||
response = await self.handle_telegram_text(source, sender, evt)
|
response = await self.handle_telegram_text(source, intent, evt)
|
||||||
elif evt.media:
|
elif evt.media:
|
||||||
if isinstance(evt.media, MessageMediaPhoto):
|
if isinstance(evt.media, MessageMediaPhoto):
|
||||||
response = await self.handle_telegram_photo(source, sender, evt.media)
|
response = await self.handle_telegram_photo(source, intent, evt.media)
|
||||||
elif isinstance(evt.media, MessageMediaDocument):
|
elif isinstance(evt.media, MessageMediaDocument):
|
||||||
response = await self.handle_telegram_document(source, sender, evt.media)
|
response = await self.handle_telegram_document(source, intent, evt.media)
|
||||||
elif isinstance(evt.media, MessageMediaGeo):
|
elif isinstance(evt.media, MessageMediaGeo):
|
||||||
response = await self.handle_telegram_location(source, sender, evt.media.geo)
|
response = await self.handle_telegram_location(source, intent, evt.media.geo)
|
||||||
else:
|
else:
|
||||||
self.log.debug("Unhandled Telegram media: %s", evt.media)
|
self.log.debug("Unhandled Telegram media: %s", evt.media)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -385,7 +385,7 @@ class User:
|
|||||||
tg_receiver=self.tgid)
|
tg_receiver=self.tgid)
|
||||||
else:
|
else:
|
||||||
portal = po.Portal.get_by_entity(update.to_id, receiver_id=self.tgid)
|
portal = po.Portal.get_by_entity(update.to_id, receiver_id=self.tgid)
|
||||||
sender = pu.Puppet.get(update.from_id)
|
sender = pu.Puppet.get(update.from_id) if update.from_id else None
|
||||||
else:
|
else:
|
||||||
self.log.warning(
|
self.log.warning(
|
||||||
f"Unexpected message type in User#get_message_details: {type(update)}")
|
f"Unexpected message type in User#get_message_details: {type(update)}")
|
||||||
@@ -404,11 +404,12 @@ class User:
|
|||||||
sender.id)
|
sender.id)
|
||||||
return portal.handle_telegram_action(self, sender, update.action)
|
return portal.handle_telegram_action(self, sender, update.action)
|
||||||
|
|
||||||
|
user = sender.tgid if sender else "admin"
|
||||||
if isinstance(original_update, (UpdateEditMessage, UpdateEditChannelMessage)):
|
if isinstance(original_update, (UpdateEditMessage, UpdateEditChannelMessage)):
|
||||||
self.log.debug("Handling edit %s to %s by %d", update, portal.tgid_log, sender.tgid)
|
self.log.debug("Handling edit %s to %s by %s", update, portal.tgid_log, user)
|
||||||
return portal.handle_telegram_edit(self, sender, update)
|
return portal.handle_telegram_edit(self, sender, update)
|
||||||
|
|
||||||
self.log.debug("Handling message %s to %s by %d", update, portal.tgid_log, sender.tgid)
|
self.log.debug("Handling message %s to %s by %s", update, portal.tgid_log, user)
|
||||||
return portal.handle_telegram_message(self, sender, update)
|
return portal.handle_telegram_message(self, sender, update)
|
||||||
|
|
||||||
# endregion
|
# endregion
|
||||||
|
|||||||
Reference in New Issue
Block a user