code: def join_chat(
          self,
          chat_id: str
      ):
          
          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])
docs: 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.