<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def join_chat( self, chat_id: str ):
 """Use this method to join a group chat or channel. Args: chat_id (``str``):
 Unique identifier for the target chat in form of a *t.me/joinchat/* link or username of the target channel/supergroup (in the format @username). Returns: On success, a :obj:`Chat <pyrogram.Chat>` object is returned. Raises: :class:`RPCError <pyrogram.RPCError>` in case of a Telegram RPC error. """

        match = self.INVITE_LINK_RE.match(chat_id)

        if match:
            chat = self.send(
                functions.messages.ImportChatInvite(
                    hash=match.group(1)
                )
            )
            if isinstance(chat.chats[0], types.Chat):
                return pyrogram.Chat._parse_chat_chat(self, chat.chats[0])
            elif isinstance(chat.chats[0], types.Channel):
                return pyrogram.Chat._parse_channel_chat(self, chat.chats[0])
        else:
            resolved_peer = self.send(
                functions.contacts.ResolveUsername(
                    username=chat_id.lower().strip("@")
                )
            )

            channel = types.InputPeerChannel(
                channel_id=resolved_peer.chats[0].id,
                access_hash=resolved_peer.chats[0].access_hash
            )

            chat = self.send(
                functions.channels.JoinChannel(
                    channel=channel
                )
            )

            return pyrogram.Chat._parse_channel_chat(self, chat.chats[0])