Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e8114ff5ad | |||
| 280c74e9cd | |||
| 4f1482e7b0 | |||
| 4641215e97 | |||
| 2f34ebfed9 | |||
| b65a1cc60a | |||
| 53bf278f1e | |||
| 35f137ccc1 | |||
| 31846e7a98 | |||
| 9ab2ee2970 | |||
| c7dd08ecd1 | |||
| 8fbd723bfa | |||
| 530bd9e52e | |||
| 6480e7925e | |||
| c70ab2a12b | |||
| 070bfd4f55 | |||
| 88c3a93526 | |||
| caefda582b | |||
| e1b181ed55 | |||
| cc6a915ef4 | |||
| de4df57278 |
@@ -1,7 +1,16 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: If something is definitely wrong in the bridge (rather than just a setup issue),
|
||||
file a bug report. Remember to include relevant logs.
|
||||
labels: bug
|
||||
file a bug report. Remember to include relevant logs. Asking in the Matrix room first
|
||||
is strongly recommended.
|
||||
type: Bug
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Remember to include relevant logs, the bridge version and any other details.
|
||||
|
||||
It's always best to ask in the Matrix room first, especially if you aren't sure
|
||||
what details are needed. Issues with insufficient detail will likely just be
|
||||
ignored or closed immediately.
|
||||
-->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: Enhancement request
|
||||
about: Submit a feature request or other suggestion
|
||||
labels: enhancement
|
||||
type: Feature
|
||||
|
||||
---
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
# v0.15.3 (2025-07-16)
|
||||
|
||||
* Updated Telegram API to layer 204.
|
||||
* Added support for MSC4190.
|
||||
* Enabled captions by default, as they are now supported by most clients.
|
||||
* Existing configs will still need to enable `caption_in_message` manually.
|
||||
* Changed new room creation to hardcode room v11 to avoid v12 rooms being
|
||||
created before proper support for them can be added.
|
||||
* Fixed bridging sticker messages with partial quote replies from Telegram.
|
||||
* Fixed text in poll bridging.
|
||||
* Disabled kicking unauthenticated users from portals.
|
||||
|
||||
# v0.15.2 (2024-07-16)
|
||||
|
||||
* Dropped support for Python 3.9.
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
FROM dock.mau.dev/tulir/lottieconverter:alpine-3.19
|
||||
FROM dock.mau.dev/tulir/lottieconverter:alpine-3.22
|
||||
|
||||
RUN apk add --no-cache \
|
||||
python3 py3-pip py3-setuptools py3-wheel \
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
__version__ = "0.15.2"
|
||||
__version__ = "0.15.3"
|
||||
__author__ = "Tulir Asokan <tulir@maunium.net>"
|
||||
|
||||
@@ -121,6 +121,7 @@ async def login_qr(evt: CommandEvent) -> EventID:
|
||||
mxc = await evt.az.intent.upload_media(qr, "image/png", "login-qr.png", len(qr))
|
||||
content = MediaMessageEventContent(
|
||||
body=qr_login.url,
|
||||
filename="login-qr.png",
|
||||
url=mxc,
|
||||
msgtype=MessageType.IMAGE,
|
||||
info=ImageInfo(mimetype="image/png", size=len(qr), width=size, height=size),
|
||||
|
||||
@@ -216,8 +216,7 @@ bridge:
|
||||
# to resolve redirects in invite links.
|
||||
invite_link_resolve: false
|
||||
# Send captions in the same message as images. This will send data compatible with both MSC2530 and MSC3552.
|
||||
# This is currently not supported in most clients.
|
||||
caption_in_message: false
|
||||
caption_in_message: true
|
||||
# Maximum size of image in megabytes before sending to Telegram as a document.
|
||||
image_as_file_size: 10
|
||||
# Maximum number of pixels in an image before sending to Telegram as a document. Defaults to 4096x4096 = 16777216.
|
||||
@@ -272,8 +271,19 @@ bridge:
|
||||
# Default to encryption, force-enable encryption in all portals the bridge creates
|
||||
# This will cause the bridge bot to be in private chats for the encryption to work properly.
|
||||
default: false
|
||||
# Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data.
|
||||
# Whether to use MSC3202/MSC4203 instead of /sync long polling for receiving encryption-related data.
|
||||
# This option is not yet compatible with standard Matrix servers like Synapse and should not be used.
|
||||
# Changing this option requires updating the appservice registration file.
|
||||
appservice: false
|
||||
# Whether to use MSC4190 instead of appservice login to create the bridge bot device.
|
||||
# Requires the homeserver to support MSC4190 and the device masquerading parts of MSC3202.
|
||||
# Only relevant when using end-to-bridge encryption, required when using encryption with next-gen auth (MSC3861).
|
||||
# Changing this option requires updating the appservice registration file.
|
||||
msc4190: false
|
||||
# Should the bridge bot generate a recovery key and cross-signing keys and verify itself?
|
||||
# Note that without the latest version of MSC4190, this will fail if you reset the bridge database.
|
||||
# The generated recovery key will be printed in logs.
|
||||
self_sign: false
|
||||
# Require encryption, drop any unencrypted messages.
|
||||
require: false
|
||||
# Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled.
|
||||
@@ -346,7 +356,7 @@ bridge:
|
||||
private_chat_portal_meta: default
|
||||
# Disable generating reply fallbacks? Some extremely bad clients still rely on them,
|
||||
# but they're being phased out and will be completely removed in the future.
|
||||
disable_reply_fallbacks: false
|
||||
disable_reply_fallbacks: true
|
||||
# Should cross-chat replies from Telegram be bridged? Most servers and clients don't support this.
|
||||
cross_room_replies: false
|
||||
# Whether or not the bridge should send a read receipt from the bridge bot when a message has
|
||||
|
||||
@@ -155,14 +155,6 @@ class MatrixHandler(BaseMatrixHandler):
|
||||
room_id, user.mxid, "You are not whitelisted on this Telegram bridge."
|
||||
)
|
||||
return
|
||||
elif not await user.is_logged_in() and not portal.has_bot:
|
||||
await portal.main_intent.kick_user(
|
||||
room_id,
|
||||
user.mxid,
|
||||
"This chat does not have a bot on the Telegram side for relaying messages sent by"
|
||||
" unauthenticated Matrix users.",
|
||||
)
|
||||
return
|
||||
|
||||
self.log.debug(f"{user.mxid} joined {room_id}")
|
||||
if await user.is_logged_in() or portal.has_bot:
|
||||
|
||||
@@ -70,7 +70,6 @@ from telethon.tl.functions.channels import (
|
||||
InviteToChannelRequest,
|
||||
JoinChannelRequest,
|
||||
UpdateUsernameRequest,
|
||||
ViewSponsoredMessageRequest,
|
||||
)
|
||||
from telethon.tl.functions.messages import (
|
||||
AddChatUserRequest,
|
||||
@@ -87,6 +86,7 @@ from telethon.tl.functions.messages import (
|
||||
SetTypingRequest,
|
||||
UnpinAllMessagesRequest,
|
||||
UpdatePinnedMessageRequest,
|
||||
ViewSponsoredMessageRequest,
|
||||
)
|
||||
from telethon.tl.patched import Message, MessageService
|
||||
from telethon.tl.types import (
|
||||
@@ -1038,6 +1038,7 @@ class Portal(DBPortal, BasePortal):
|
||||
initial_state=initial_state,
|
||||
creation_content=creation_content,
|
||||
beeper_auto_join_invites=autojoin_invites,
|
||||
room_version="11",
|
||||
)
|
||||
if not room_id:
|
||||
raise Exception(f"Failed to create room")
|
||||
@@ -1200,7 +1201,7 @@ class Portal(DBPortal, BasePortal):
|
||||
continue
|
||||
if mx_user.is_bot:
|
||||
await mx_user.unregister_portal(*self.tgid_full)
|
||||
if not self.has_bot:
|
||||
if not self.has_bot and mx_user.tgid:
|
||||
try:
|
||||
await self.main_intent.kick_user(
|
||||
self.mxid, mx_user.mxid, "You had left this Telegram chat."
|
||||
|
||||
@@ -282,7 +282,7 @@ class TelegramMessageConverter:
|
||||
elif isinstance(evt.reply_to, MessageReplyStoryHeader):
|
||||
return
|
||||
|
||||
if evt.reply_to.quote and content.msgtype.is_text:
|
||||
if evt.reply_to.quote and content.msgtype and content.msgtype.is_text:
|
||||
content.ensure_has_html()
|
||||
quote_html = await formatter.telegram_text_to_matrix_html(
|
||||
source, evt.reply_to.quote_text, evt.reply_to.quote_entities
|
||||
@@ -763,18 +763,18 @@ class TelegramMessageConverter:
|
||||
_n += 1
|
||||
return _n
|
||||
|
||||
text_answers = "\n".join(f"{n()}. {answer.text}" for answer in poll.answers)
|
||||
html_answers = "\n".join(f"<li>{answer.text}</li>" for answer in poll.answers)
|
||||
text_answers = "\n".join(f"{n()}. {answer.text.text}" for answer in poll.answers)
|
||||
html_answers = "\n".join(f"<li>{answer.text.text}</li>" for answer in poll.answers)
|
||||
vote_command = f"{self.command_prefix} vote {poll_id}"
|
||||
content = TextMessageEventContent(
|
||||
msgtype=MessageType.TEXT,
|
||||
format=Format.HTML,
|
||||
body=(
|
||||
f"Poll: {poll.question}\n{text_answers}\n"
|
||||
f"Poll: {poll.question.text}\n{text_answers}\n"
|
||||
f"Vote with {vote_command} <choice number>"
|
||||
),
|
||||
formatted_body=(
|
||||
f"<strong>Poll</strong>: {poll.question}<br/>\n"
|
||||
f"<strong>Poll</strong>: {poll.question.text}<br/>\n"
|
||||
f"<ol>{html_answers}</ol>\n"
|
||||
f"Vote with <code>{vote_command} <choice number></code>"
|
||||
),
|
||||
|
||||
@@ -18,7 +18,7 @@ from __future__ import annotations
|
||||
import base64
|
||||
import html
|
||||
|
||||
from telethon.tl.functions.channels import GetSponsoredMessagesRequest
|
||||
from telethon.tl.functions.messages import GetSponsoredMessagesRequest
|
||||
from telethon.tl.types import Channel, InputChannel, PeerChannel, PeerUser, SponsoredMessage, User
|
||||
from telethon.tl.types.messages import SponsoredMessages, SponsoredMessagesEmpty
|
||||
|
||||
|
||||
@@ -2,27 +2,28 @@
|
||||
# Uncommented lines after the group definition insert things into that group.
|
||||
|
||||
#/speedups
|
||||
cryptg>=0.1,<0.5
|
||||
cryptg>=0.1,<0.6
|
||||
aiodns
|
||||
brotli
|
||||
|
||||
#/qr_login
|
||||
pillow>=10.0.1,<11
|
||||
qrcode>=6,<8
|
||||
pillow>=10.0.1,<12
|
||||
qrcode>=6,<9
|
||||
|
||||
#/formattednumbers
|
||||
phonenumbers>=8,<9
|
||||
phonenumbers>=8,<10
|
||||
|
||||
#/metrics
|
||||
prometheus_client>=0.6,<0.21
|
||||
prometheus_client>=0.6,<0.23
|
||||
|
||||
#/e2be
|
||||
python-olm>=3,<4
|
||||
pycryptodome>=3,<4
|
||||
unpaddedbase64>=1,<3
|
||||
base58>=2,<3
|
||||
|
||||
#/sqlite
|
||||
aiosqlite>=0.16,<0.21
|
||||
aiosqlite>=0.16,<0.22
|
||||
|
||||
#/proxy
|
||||
python-socks[asyncio]
|
||||
|
||||
+4
-4
@@ -3,8 +3,8 @@ python-magic>=0.4,<0.5
|
||||
commonmark>=0.8,<0.10
|
||||
aiohttp>=3,<4
|
||||
yarl>=1,<2
|
||||
mautrix>=0.20.6,<0.21
|
||||
tulir-telethon==1.37.0a1
|
||||
asyncpg>=0.20,<0.30
|
||||
mautrix>=0.21.0b5,<0.22
|
||||
tulir-telethon==1.99.0a6
|
||||
asyncpg>=0.20,<1
|
||||
mako>=1,<2
|
||||
setuptools
|
||||
setuptools<82
|
||||
|
||||
@@ -63,6 +63,7 @@ setuptools.setup(
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
],
|
||||
package_data={"mautrix_telegram": [
|
||||
"web/public/*.mako", "web/public/*.png", "web/public/*.css",
|
||||
|
||||
Reference in New Issue
Block a user