diff --git a/mautrix_telegram/commands/portal/misc.py b/mautrix_telegram/commands/portal/misc.py
index 26896094..b9720684 100644
--- a/mautrix_telegram/commands/portal/misc.py
+++ b/mautrix_telegram/commands/portal/misc.py
@@ -13,6 +13,10 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+from typing import Optional, List, Tuple
+from datetime import timedelta, datetime
+import re
+
from telethon.tl.functions.channels import GetFullChannelRequest
from telethon.tl.functions.messages import GetFullChatRequest
from telethon.errors import (ChatAdminRequiredError, UsernameInvalidError,
@@ -80,9 +84,81 @@ async def get_id(evt: CommandEvent) -> EventID:
await evt.reply(f"This room is bridged to Telegram chat ID `{tgid}`.")
+invite_link_usage = ("**Usage:** `$cmdprefix+sp invite-link [--uses=] [--expire=]`"
+ "\n\n"
+ "* `--uses`: the number of times the invite link can be used."
+ " Defaults to unlimited.\n"
+ "* `--expire`: the duration after which the link will expire."
+ " A number suffixed with d(ay), h(our), m(inute) or s(econd)")
+
+
+def _parse_flag(args: List[str]) -> Tuple[str, str]:
+ arg = args.pop(0).lower()
+ if arg.startswith("--"):
+ value_start = arg.index("=")
+ if value_start:
+ flag = arg[2:value_start]
+ value = arg[value_start+1:]
+ else:
+ flag = arg[2:]
+ value = args.pop(0).lower()
+ elif arg.startswith("-"):
+ flag = arg[1]
+ if len(arg) > 3 and arg[2] == "=":
+ value = arg[3:]
+ else:
+ value = args.pop(0).lower()
+ else:
+ raise ValueError("invalid flag")
+ return flag, value
+
+
+delta_regex = re.compile("([0-9]+)(w(?:eek)?|d(?:ay)?|h(?:our)?|m(?:in(?:ute)?)?|s(?:ec(?:ond)?)?)")
+
+
+def _parse_delta(value: str) -> Optional[timedelta]:
+ match = delta_regex.fullmatch(value)
+ if not match:
+ return None
+ number = int(match.group(1))
+ unit = match.group(2)[0]
+ if unit == "w":
+ return timedelta(weeks=number)
+ elif unit == "d":
+ return timedelta(days=number)
+ elif unit == "h":
+ return timedelta(hours=number)
+ elif unit == "m":
+ return timedelta(minutes=number)
+ elif unit == "s":
+ return timedelta(seconds=number)
+ else:
+ return None
+
+
@command_handler(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=] [--expire=