Handle missing input entities better when creating groups. Fixes #379
This commit is contained in:
@@ -52,8 +52,14 @@ async def create(evt: CommandEvent) -> EventID:
|
|||||||
|
|
||||||
portal = po.Portal(tgid=TelegramID(0), peer_type=type, mxid=evt.room_id,
|
portal = po.Portal(tgid=TelegramID(0), peer_type=type, mxid=evt.room_id,
|
||||||
title=title, about=about, encrypted=encrypted)
|
title=title, about=about, encrypted=encrypted)
|
||||||
|
invites, errors = await portal.get_telegram_users_in_matrix_room(evt.sender)
|
||||||
|
if len(errors) > 0:
|
||||||
|
error_list = "\n".join(f"* [{mxid}](https://matrix.to/#/{mxid})" for mxid in errors)
|
||||||
|
await evt.reply(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:
|
try:
|
||||||
await portal.create_telegram_chat(evt.sender, supergroup=supergroup)
|
await portal.create_telegram_chat(evt.sender, invites=invites, supergroup=supergroup)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
await portal.delete()
|
await portal.delete()
|
||||||
return await evt.reply(e.args[0])
|
return await evt.reply(e.args[0])
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
from typing import List, Optional, Iterable, Union, Dict, Any, TYPE_CHECKING
|
from typing import List, Optional, Iterable, Union, Dict, Any, Tuple, TYPE_CHECKING
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
@@ -26,7 +26,8 @@ from telethon.tl.types import (
|
|||||||
Channel, ChatBannedRights, ChannelParticipantsRecent, ChannelParticipantsSearch, ChatPhoto,
|
Channel, ChatBannedRights, ChannelParticipantsRecent, ChannelParticipantsSearch, ChatPhoto,
|
||||||
PhotoEmpty, InputChannel, InputUser, ChatPhotoEmpty, PeerUser, Photo, TypeChat, TypeInputPeer,
|
PhotoEmpty, InputChannel, InputUser, ChatPhotoEmpty, PeerUser, Photo, TypeChat, TypeInputPeer,
|
||||||
TypeUser, User, InputPeerPhotoFileLocation, ChatParticipantAdmin, ChannelParticipantAdmin,
|
TypeUser, User, InputPeerPhotoFileLocation, ChatParticipantAdmin, ChannelParticipantAdmin,
|
||||||
ChatParticipantCreator, ChannelParticipantCreator, UserProfilePhoto, UserProfilePhotoEmpty)
|
ChatParticipantCreator, ChannelParticipantCreator, UserProfilePhoto, UserProfilePhotoEmpty,
|
||||||
|
InputPeerUser)
|
||||||
|
|
||||||
from mautrix.errors import MForbidden
|
from mautrix.errors import MForbidden
|
||||||
from mautrix.types import (RoomID, UserID, RoomCreatePreset, EventType, Membership,
|
from mautrix.types import (RoomID, UserID, RoomCreatePreset, EventType, Membership,
|
||||||
@@ -58,21 +59,30 @@ class PortalMetadata(BasePortal, ABC):
|
|||||||
|
|
||||||
# region Matrix -> Telegram
|
# region Matrix -> Telegram
|
||||||
|
|
||||||
async def _get_telegram_users_in_matrix_room(self) -> List[Union[InputUser, PeerUser]]:
|
async def get_telegram_users_in_matrix_room(self, source: 'u.User'
|
||||||
user_tgids = set()
|
) -> Tuple[List[InputPeerUser], List[UserID]]:
|
||||||
|
user_tgids = {}
|
||||||
user_mxids = await self.main_intent.get_room_members(self.mxid, (Membership.JOIN,
|
user_mxids = await self.main_intent.get_room_members(self.mxid, (Membership.JOIN,
|
||||||
Membership.INVITE))
|
Membership.INVITE))
|
||||||
for user_str in user_mxids:
|
for mxid in user_mxids:
|
||||||
user = UserID(user_str)
|
if mxid == self.az.bot_mxid:
|
||||||
if user == self.az.bot_mxid:
|
|
||||||
continue
|
continue
|
||||||
mx_user = u.User.get_by_mxid(user, create=False)
|
mx_user = u.User.get_by_mxid(mxid, create=False)
|
||||||
if mx_user and mx_user.tgid:
|
if mx_user and mx_user.tgid:
|
||||||
user_tgids.add(mx_user.tgid)
|
user_tgids[mx_user.tgid] = mxid
|
||||||
puppet_id = p.Puppet.get_id_from_mxid(user)
|
puppet_id = p.Puppet.get_id_from_mxid(mxid)
|
||||||
if puppet_id:
|
if puppet_id:
|
||||||
user_tgids.add(puppet_id)
|
user_tgids[puppet_id] = mxid
|
||||||
return [PeerUser(user_id) for user_id in user_tgids]
|
input_users = []
|
||||||
|
errors = []
|
||||||
|
for tgid, mxid in user_tgids.items():
|
||||||
|
try:
|
||||||
|
input_users.append(await source.client.get_input_entity(tgid))
|
||||||
|
except ValueError as e:
|
||||||
|
source.log.debug(f"Failed to find the input entity for {tgid} ({mxid}) for "
|
||||||
|
f"creating a group: {e}")
|
||||||
|
errors.append(mxid)
|
||||||
|
return input_users, errors
|
||||||
|
|
||||||
async def upgrade_telegram_chat(self, source: 'u.User') -> None:
|
async def upgrade_telegram_chat(self, source: 'u.User') -> None:
|
||||||
if self.peer_type != "chat":
|
if self.peer_type != "chat":
|
||||||
@@ -116,13 +126,13 @@ class PortalMetadata(BasePortal, ABC):
|
|||||||
if await self._update_username(username):
|
if await self._update_username(username):
|
||||||
await self.save()
|
await self.save()
|
||||||
|
|
||||||
async def create_telegram_chat(self, source: 'u.User', supergroup: bool = False) -> None:
|
async def create_telegram_chat(self, source: 'u.User', invites: List[InputUser],
|
||||||
|
supergroup: bool = False) -> None:
|
||||||
if not self.mxid:
|
if not self.mxid:
|
||||||
raise ValueError("Can't create Telegram chat for portal without Matrix room.")
|
raise ValueError("Can't create Telegram chat for portal without Matrix room.")
|
||||||
elif self.tgid:
|
elif self.tgid:
|
||||||
raise ValueError("Can't create Telegram chat for portal with existing Telegram chat.")
|
raise ValueError("Can't create Telegram chat for portal with existing Telegram chat.")
|
||||||
|
|
||||||
invites = await self._get_telegram_users_in_matrix_room()
|
|
||||||
if len(invites) < 2:
|
if len(invites) < 2:
|
||||||
if self.bot is not None:
|
if self.bot is not None:
|
||||||
info, mxid = await self.bot.get_me()
|
info, mxid = await self.bot.get_me()
|
||||||
|
|||||||
Reference in New Issue
Block a user