from urllib.parse import urlsplit from django.conf import settings def is_same_server_message_link(url: str) -> bool: split_result = urlsplit(url) hostname = split_result.hostname fragment = split_result.fragment if hostname not in {None, settings.EXTERNAL_HOST_WITHOUT_PORT}: return False # A message link always has category `narrow`, section `channel` # or `dm`, and ends with `/near/`, where # is a sequence of digits. The URL fragment of a message link has # at least 5 parts. e.g. '#narrow/dm/9,15-dm/near/43' fragment_parts = fragment.split("/") if len(fragment_parts) < 5: return False category = fragment_parts[0] section = fragment_parts[1] ends_with_near_message_id = fragment_parts[-2] == "near" and fragment_parts[-1].isdigit() return category == "narrow" and section in {"channel", "dm"} and ends_with_near_message_id