implement handle_puppet_group_invite to auto-create groups

This commit is contained in:
Malte E
2022-06-12 21:46:11 +02:00
parent 9188251501
commit 565bb87470
4 changed files with 68 additions and 7 deletions
@@ -81,4 +81,3 @@ async def create(evt: CommandEvent) -> EventID:
except ValueError as e:
await portal.delete()
return await evt.reply(e.args[0])
return await evt.reply(f"Telegram chat created. ID: {portal.tgid}")
+62 -5
View File
@@ -42,6 +42,8 @@ from mautrix.types import (
)
from . import commands as com, portal as po, puppet as pu, user as u
from .commands.portal.util import get_initial_state, user_has_power_level, warn_missing_power
from .types import TelegramID
if TYPE_CHECKING:
from .__main__ import TelegramBridge
@@ -69,16 +71,71 @@ class MatrixHandler(BaseMatrixHandler):
evt: StateEvent,
members: list[UserID],
) -> None:
if self.az.bot_mxid not in members:
double_puppet = await pu.Puppet.get_by_custom_mxid(invited_by.mxid)
if not double_puppet or self.az.bot_mxid in members:
if self.az.bot_mxid not in members:
await puppet.default_mxid_intent.leave_room(
room_id,
reason="This ghost does not join multi-user rooms without the bridge bot.",
)
else:
await puppet.default_mxid_intent.send_notice(
room_id,
"This ghost will remain inactive until a Telegram chat is created for this room.",
)
return
elif not await user_has_power_level(
evt.room_id, double_puppet.intent, invited_by, "bridge"
):
await puppet.default_mxid_intent.leave_room(
room_id, reason="This ghost does not join multi-user rooms without the bridge bot."
room_id, reason="You do not have the permissions to bridge this room."
)
else:
await puppet.default_mxid_intent.send_notice(
return
await double_puppet.intent.invite_user(room_id, self.az.bot_mxid)
title, about, levels, encrypted = await get_initial_state(double_puppet.intent, room_id)
if not title:
await puppet.default_mxid_intent.leave_room(
room_id, reason="Please set a title before inviting Telegram puppets."
)
return
portal = po.Portal(
tgid=TelegramID(0),
tg_receiver=TelegramID(0),
peer_type="channel",
mxid=evt.room_id,
title=title,
about=about,
encrypted=encrypted,
)
await portal.az.intent.ensure_joined(room_id)
levels = await portal.az.intent.get_power_levels(room_id)
invited_by_level = levels.get_user_level(invited_by.mxid)
if invited_by_level > levels.get_user_level(self.az.bot_mxid):
levels.users[self.az.bot_mxid] = 100 if invited_by_level >= 100 else invited_by_level
await double_puppet.intent.set_power_levels(room_id, levels)
invites, errors = await portal.get_telegram_users_in_matrix_room(
invited_by, pre_create=True
)
if len(errors) > 0:
error_list = "\n".join(f"* [{mxid}](https://matrix.to/#/{mxid})" for mxid in errors)
await portal.az.intent.send_notice(
room_id,
"This ghost will remain inactive until a Telegram chat is created for this room.",
f"Failed to add the following users to the chat:\n\n{error_list}\n\n"
"You can try `$cmdprefix+sp search -r <username>` to help the bridge find "
"those users.",
)
try:
await portal.create_telegram_chat(invited_by, invites=invites, supergroup=True)
except ValueError as e:
await portal.delete()
return await portal.az.intent.send_notice(room_id, e.args[0])
async def handle_invite(
self, room_id: RoomID, user_id: UserID, inviter: u.User, event_id: EventID
) -> None:
+1
View File
@@ -555,6 +555,7 @@ class Portal(DBPortal, BasePortal):
await self.main_intent.set_power_levels(self.mxid, levels)
await self.handle_matrix_power_levels(source, levels.users, {}, None)
await self.update_bridge_info()
await self.main_intent.send_notice(self.mxid, f"Telegram chat created. ID: {self.tgid}")
async def handle_matrix_invite(
self, invited_by: u.User, puppet: p.Puppet | au.AbstractUser
+5 -1
View File
@@ -85,7 +85,11 @@ def get_base_power_levels(
)
for evt_type, value in overrides.get("events", {}).items():
levels.events[EventType.find(evt_type)] = value
levels.users = overrides.get("users", {})
userlevel_overrides = overrides.get("users", {})
bot_level = levels.get_user_level(portal.main_intent.mxid)
for user, user_level in levels.users.items():
if user_level < bot_level:
levels.users[user] = userlevel_overrides.get(user, 0)
if portal.main_intent.mxid not in levels.users:
levels.users[portal.main_intent.mxid] = 100
return levels