Bridge bans to Telegram. Fixes #303
This commit is contained in:
@@ -188,6 +188,30 @@ class MatrixHandler(BaseMatrixHandler):
|
|||||||
else:
|
else:
|
||||||
await portal.leave_matrix(user, event_id)
|
await portal.leave_matrix(user, event_id)
|
||||||
|
|
||||||
|
async def handle_ban(self, room_id: RoomID, user_id: UserID, banned_by: UserID, reason: str,
|
||||||
|
event_id: EventID) -> None:
|
||||||
|
self.log.debug(f"{user_id} was banned from {room_id} by {banned_by} for {reason}")
|
||||||
|
|
||||||
|
sender = u.User.get_by_mxid(banned_by, create=False)
|
||||||
|
if not sender:
|
||||||
|
return
|
||||||
|
await sender.ensure_started()
|
||||||
|
|
||||||
|
portal = po.Portal.get_by_mxid(room_id)
|
||||||
|
if not portal:
|
||||||
|
return
|
||||||
|
|
||||||
|
puppet = pu.Puppet.get_by_mxid(user_id)
|
||||||
|
if puppet:
|
||||||
|
await portal.ban_matrix(puppet, sender)
|
||||||
|
return
|
||||||
|
|
||||||
|
user = u.User.get_by_mxid(user_id, create=False)
|
||||||
|
if not user:
|
||||||
|
return
|
||||||
|
await user.ensure_started()
|
||||||
|
await portal.ban_matrix(user, sender)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def allow_message(user: 'u.User') -> bool:
|
async def allow_message(user: 'u.User') -> bool:
|
||||||
return user.relaybot_whitelisted
|
return user.relaybot_whitelisted
|
||||||
|
|||||||
@@ -124,27 +124,33 @@ class PortalMatrix(BasePortal, MautrixBasePortal, ABC):
|
|||||||
await user.client.send_read_acknowledge(self.peer, max_id=message.tgid,
|
await user.client.send_read_acknowledge(self.peer, max_id=message.tgid,
|
||||||
clear_mentions=True)
|
clear_mentions=True)
|
||||||
|
|
||||||
async def kick_matrix(self, user: Union['u.User', 'p.Puppet'], source: 'u.User') -> None:
|
async def _preproc_kick_ban(self, user: Union['u.User', 'p.Puppet'], source: 'u.User'
|
||||||
|
) -> Optional['AbstractUser']:
|
||||||
if user.tgid == source.tgid:
|
if user.tgid == source.tgid:
|
||||||
return
|
return None
|
||||||
if self.peer_type == "user" and user.tgid == self.tgid:
|
if self.peer_type == "user" and user.tgid == self.tgid:
|
||||||
self.delete()
|
self.delete()
|
||||||
try:
|
return None
|
||||||
del self.by_tgid[self.tgid_full]
|
|
||||||
del self.by_mxid[self.mxid]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
return
|
|
||||||
if isinstance(user, u.User) and await user.needs_relaybot(self):
|
if isinstance(user, u.User) and await user.needs_relaybot(self):
|
||||||
if not self.bot:
|
if not self.bot:
|
||||||
return
|
return None
|
||||||
# TODO kick and ban message
|
# TODO kick message
|
||||||
return
|
return None
|
||||||
if await source.needs_relaybot(self):
|
if await source.needs_relaybot(self):
|
||||||
if not self.has_bot:
|
if not self.has_bot:
|
||||||
return
|
return None
|
||||||
source = self.bot
|
return self.bot
|
||||||
await source.client.kick_participant(self.peer, user.peer)
|
return source
|
||||||
|
|
||||||
|
async def kick_matrix(self, user: Union['u.User', 'p.Puppet'], source: 'u.User') -> None:
|
||||||
|
source = await self._preproc_kick_ban(user, source)
|
||||||
|
if source is not None:
|
||||||
|
await source.client.kick_participant(self.peer, user.peer)
|
||||||
|
|
||||||
|
async def ban_matrix(self, user: Union['u.User', 'p.Puppet'], source: 'u.User'):
|
||||||
|
source = await self._preproc_kick_ban(user, source)
|
||||||
|
if source is not None:
|
||||||
|
await source.client.edit_permissions(self.peer, user.peer, view_messages=False)
|
||||||
|
|
||||||
async def leave_matrix(self, user: 'u.User', event_id: EventID) -> None:
|
async def leave_matrix(self, user: 'u.User', event_id: EventID) -> None:
|
||||||
if await user.needs_relaybot(self):
|
if await user.needs_relaybot(self):
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ class PortalMetadata(BasePortal, ABC):
|
|||||||
self.log.debug(f"default_banned_rights is None in {entity}")
|
self.log.debug(f"default_banned_rights is None in {entity}")
|
||||||
dbr = ChatBannedRights(invite_users=True, change_info=True, pin_messages=True,
|
dbr = ChatBannedRights(invite_users=True, change_info=True, pin_messages=True,
|
||||||
send_stickers=False, send_messages=False, until_date=None)
|
send_stickers=False, send_messages=False, until_date=None)
|
||||||
levels.ban = 99
|
levels.ban = 50
|
||||||
levels.kick = 50
|
levels.kick = 50
|
||||||
levels.redact = 50
|
levels.redact = 50
|
||||||
levels.invite = 50 if dbr.invite_users else 0
|
levels.invite = 50 if dbr.invite_users else 0
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ setuptools.setup(
|
|||||||
|
|
||||||
install_requires=[
|
install_requires=[
|
||||||
"aiohttp>=3.0.1,<4",
|
"aiohttp>=3.0.1,<4",
|
||||||
"mautrix>=0.4.0.dev70,<0.5",
|
"mautrix>=0.4.0.dev71,<0.5",
|
||||||
"SQLAlchemy>=1.2.3,<2",
|
"SQLAlchemy>=1.2.3,<2",
|
||||||
"alembic>=1.0.0,<2",
|
"alembic>=1.0.0,<2",
|
||||||
"commonmark>=0.8.1,<0.10",
|
"commonmark>=0.8.1,<0.10",
|
||||||
|
|||||||
Reference in New Issue
Block a user