Allow generating invite links that need join approval
This commit is contained in:
@@ -159,12 +159,13 @@ def _parse_delta(value: str) -> timedelta | None:
|
|||||||
@command_handler(
|
@command_handler(
|
||||||
help_section=SECTION_PORTAL_MANAGEMENT,
|
help_section=SECTION_PORTAL_MANAGEMENT,
|
||||||
help_text="Get a Telegram invite link to the current chat.",
|
help_text="Get a Telegram invite link to the current chat.",
|
||||||
help_args="[--uses=<amount>] [--expire=<time delta, e.g. 1d>]",
|
help_args="[--uses=<amount>] [--expire=<time delta, e.g. 1d>] [--request-needed] [title]",
|
||||||
)
|
)
|
||||||
async def invite_link(evt: CommandEvent) -> EventID:
|
async def invite_link(evt: CommandEvent) -> EventID:
|
||||||
# TODO once we switch to Python 3.9 minimum, use argparse with exit_on_error=False
|
# TODO once we switch to Python 3.9 minimum, use argparse with exit_on_error=False
|
||||||
uses = None
|
uses = None
|
||||||
expire = None
|
expire = None
|
||||||
|
request_needed = False
|
||||||
while evt.args:
|
while evt.args:
|
||||||
try:
|
try:
|
||||||
flag, value = _parse_flag(evt.args)
|
flag, value = _parse_flag(evt.args)
|
||||||
@@ -180,6 +181,9 @@ async def invite_link(evt: CommandEvent) -> EventID:
|
|||||||
if not expire_delta:
|
if not expire_delta:
|
||||||
await evt.reply("Invalid format for expiry time delta")
|
await evt.reply("Invalid format for expiry time delta")
|
||||||
expire = datetime.now() + expire_delta
|
expire = datetime.now() + expire_delta
|
||||||
|
elif flag in ("request", "request-needed", "r"):
|
||||||
|
request_needed = True
|
||||||
|
title = " ".join(evt.args)
|
||||||
|
|
||||||
portal = await po.Portal.get_by_mxid(evt.room_id)
|
portal = await po.Portal.get_by_mxid(evt.room_id)
|
||||||
if not portal:
|
if not portal:
|
||||||
@@ -189,7 +193,9 @@ async def invite_link(evt: CommandEvent) -> EventID:
|
|||||||
return await evt.reply("You can't invite users to private chats.")
|
return await evt.reply("You can't invite users to private chats.")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
link = await portal.get_invite_link(evt.sender, uses=uses, expire=expire)
|
link = await portal.get_invite_link(
|
||||||
|
evt.sender, uses=uses, expire=expire, request_needed=request_needed, title=title
|
||||||
|
)
|
||||||
return await evt.reply(f"Invite link to {portal.title}: {link}")
|
return await evt.reply(f"Invite link to {portal.title}: {link}")
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
return await evt.reply(e.args[0])
|
return await evt.reply(e.args[0])
|
||||||
|
|||||||
@@ -3455,7 +3455,12 @@ class Portal(DBPortal, BasePortal):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
async def get_invite_link(
|
async def get_invite_link(
|
||||||
self, user: u.User, uses: int | None = None, expire: datetime | None = None
|
self,
|
||||||
|
user: u.User,
|
||||||
|
uses: int | None = None,
|
||||||
|
expire: datetime | None = None,
|
||||||
|
request_needed: bool = False,
|
||||||
|
title: str | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
if self.peer_type == "user":
|
if self.peer_type == "user":
|
||||||
raise ValueError("You can't invite users to private chats.")
|
raise ValueError("You can't invite users to private chats.")
|
||||||
@@ -3463,7 +3468,11 @@ class Portal(DBPortal, BasePortal):
|
|||||||
return f"https://t.me/{self.username}"
|
return f"https://t.me/{self.username}"
|
||||||
link = await user.client(
|
link = await user.client(
|
||||||
ExportChatInviteRequest(
|
ExportChatInviteRequest(
|
||||||
peer=await self.get_input_entity(user), expire_date=expire, usage_limit=uses
|
peer=await self.get_input_entity(user),
|
||||||
|
expire_date=expire,
|
||||||
|
usage_limit=uses,
|
||||||
|
request_needed=request_needed,
|
||||||
|
title=title,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return link.link
|
return link.link
|
||||||
|
|||||||
Reference in New Issue
Block a user