Compare commits
1 Commits
master
...
bot-owners
Author | SHA1 | Date | |
---|---|---|---|
ccbbe5ce73 |
@ -42,6 +42,7 @@ First, copy config.json.example to config.json. Then fill in the fields:
|
||||
* `hosts.bare`: Just the (sub)domain of the server.
|
||||
* `user_id_format`: A Python `str.format`-style string to format user IDs as
|
||||
* `db_url`: A SQLAlchemy URL for the database. See the [SQLAlchemy docs](http://docs.sqlalchemy.org/en/latest/core/engines.html).
|
||||
* `bot_owners`: A list of matrix users the bot won't use a `<username>` prefix for. Can be left blank to print a prefix for all matrix users. Useful if you would like the bridge to replace Telegram for yourself, but also want to allow others to use the Matrix room.
|
||||
|
||||
**Synapse configuration**
|
||||
|
||||
|
@ -12,6 +12,12 @@
|
||||
"bare": "DOMAIN.TLD"
|
||||
},
|
||||
|
||||
"bot_owners": [
|
||||
"@youruser:DOMAIN.TLD",
|
||||
"@youruser:matrix.org",
|
||||
"@youruser:example.com"
|
||||
],
|
||||
|
||||
"user_id_format": "@telegram_{}:DOMAIN.TLD",
|
||||
"db_url": "sqlite:///database.db",
|
||||
|
||||
|
@ -12,7 +12,6 @@ from datetime import datetime
|
||||
from time import time
|
||||
from urllib.parse import unquote, quote, urlparse, parse_qs
|
||||
from io import BytesIO
|
||||
import re
|
||||
|
||||
from PIL import Image
|
||||
from aiohttp import web, ClientSession
|
||||
@ -39,6 +38,11 @@ try:
|
||||
MATRIX_HOST_EXT = CONFIG['hosts']['external']
|
||||
MATRIX_HOST_BARE = CONFIG['hosts']['bare']
|
||||
|
||||
try:
|
||||
MATRIX_BOT_OWNERS = CONFIG['bot_owners']
|
||||
except KeyError:
|
||||
MATRIX_BOT_OWNERS = {}
|
||||
|
||||
MATRIX_PREFIX = MATRIX_HOST + '_matrix/client/r0/'
|
||||
MATRIX_MEDIA_PREFIX = MATRIX_HOST + '_matrix/media/r0/'
|
||||
|
||||
@ -83,26 +87,26 @@ def sanitize_html(string):
|
||||
soup = BeautifulSoup(string, 'html.parser')
|
||||
for tag in soup.find_all(True):
|
||||
if tag.name == 'blockquote':
|
||||
tag.string = ('\n' + tag.text).replace('\n', '\n> ')[3:-3]
|
||||
tag.string = ('\n' + tag.text).replace('\n', '\n> ').rstrip('\n>')
|
||||
if tag.name not in VALID_TAGS:
|
||||
tag.hidden = True
|
||||
return soup.renderContents().decode('utf-8')
|
||||
|
||||
|
||||
def format_matrix_msg(form, content):
|
||||
def format_matrix_msg(form, username, content):
|
||||
"""
|
||||
Formats a matrix message for sending to Telegram
|
||||
:param form: The format string of the message, where the first parameter
|
||||
is the username and the second one the message.
|
||||
:param username: The username of the user.
|
||||
:param content: The content to be sent.
|
||||
:return: The formatted string.
|
||||
"""
|
||||
if 'format' in content and content['format'] == 'org.matrix.custom.html':
|
||||
sanitized = re.sub("<a href=\\\"https://matrix.to/#/@telegram_([0-9]+):{}\\\">(.+?) \(Telegram\)</a>".format(MATRIX_HOST_BARE), "<a href=\"tg://user?id=\\1\">\\2</a>", content['formatted_body'])
|
||||
sanitized = sanitize_html(sanitized)
|
||||
return html.escape(form).format(sanitized), 'HTML'
|
||||
sanitized = sanitize_html(content['formatted_body'])
|
||||
return html.escape(form).format(username, sanitized), 'HTML'
|
||||
else:
|
||||
return form.format(html.escape(content['body'])), None
|
||||
return form.format(username, content['body']), None
|
||||
|
||||
|
||||
async def download_matrix_file(url, filename):
|
||||
@ -206,38 +210,44 @@ async def matrix_transaction(request):
|
||||
|
||||
if event['type'] == 'm.room.message':
|
||||
user_id = event['user_id']
|
||||
if matrix_is_telegram(user_id):
|
||||
continue
|
||||
|
||||
|
||||
sender = db.session.query(db.MatrixUser)\
|
||||
.filter_by(matrix_id=user_id).first()
|
||||
|
||||
if not sender:
|
||||
response = await matrix_get('client', 'profile/{}/displayname'
|
||||
.format(user_id), None)
|
||||
try:
|
||||
displayname = response['displayname']
|
||||
except KeyError:
|
||||
displayname = get_username(user_id)
|
||||
sender = db.MatrixUser(user_id, displayname)
|
||||
db.session.add(sender)
|
||||
if user_id in MATRIX_BOT_OWNERS:
|
||||
displayname = ''
|
||||
else:
|
||||
displayname = sender.name or get_username(user_id)
|
||||
if matrix_is_telegram(user_id):
|
||||
continue
|
||||
|
||||
|
||||
sender = db.session.query(db.MatrixUser)\
|
||||
.filter_by(matrix_id=user_id).first()
|
||||
|
||||
if not sender:
|
||||
response = await matrix_get('client', 'profile/{}/displayname'
|
||||
.format(user_id), None)
|
||||
try:
|
||||
displayname = response['displayname']
|
||||
except KeyError:
|
||||
displayname = get_username(user_id)
|
||||
sender = db.MatrixUser(user_id, displayname)
|
||||
db.session.add(sender)
|
||||
else:
|
||||
displayname = sender.name or get_username(user_id)
|
||||
content = event['content']
|
||||
|
||||
if 'msgtype' not in content:
|
||||
continue
|
||||
|
||||
if content['msgtype'] == 'm.text':
|
||||
msg, mode = format_matrix_msg('{}', content)
|
||||
response = await group.send_text("<b>{}:</b> {}".format(displayname, msg), parse_mode='HTML')
|
||||
prefix = '' if displayname == '' else '<' + displayname + '> '
|
||||
msg, mode = format_matrix_msg('{}{}', prefix, content)
|
||||
response = await group.send_text(msg, parse_mode=mode)
|
||||
elif content['msgtype'] == 'm.notice':
|
||||
msg, mode = format_matrix_msg('{}', content)
|
||||
response = await group.send_text("[{}] {}".format(displayname, msg), parse_mode=mode)
|
||||
prefix = '' if displayname == '' else '[' + displayname + '] '
|
||||
msg, mode = format_matrix_msg('{}{}', prefix, content)
|
||||
response = await group.send_text(msg, parse_mode=mode)
|
||||
elif content['msgtype'] == 'm.emote':
|
||||
msg, mode = format_matrix_msg('{}', content)
|
||||
response = await group.send_text("* {} {}".format(displayname, msg), parse_mode=mode)
|
||||
prefix = '' if displayname == '' else '* ' + displayname + ' '
|
||||
msg, mode = format_matrix_msg('{}{}', prefix, content)
|
||||
response = await group.send_text(msg, parse_mode=mode)
|
||||
elif content['msgtype'] == 'm.image':
|
||||
try:
|
||||
url = urlparse(content['url'])
|
||||
@ -256,7 +266,9 @@ async def matrix_transaction(request):
|
||||
.format(url.netloc, quote(url.path))
|
||||
url_str = await shorten_url(url_str)
|
||||
|
||||
caption = '{} sent an image'.format(displayname)
|
||||
prefix = '' if displayname == '' else '<' + displayname + '> '
|
||||
caption = '{}{} ({})'.format(prefix,
|
||||
content['body'], url_str)
|
||||
response = await group.send_photo(img_file, caption=caption)
|
||||
except:
|
||||
pass
|
||||
|
Loading…
x
Reference in New Issue
Block a user