Sometimes Telegram does not provide all the user info with the message.
        In order to get the full profile (aka the language code) you need to
        call this method which will make sure that the full User object is
        loaded.

        The result is cached for the lifetime of the object, so if the function
        is called multiple times it will only fetch the user once. There is
        a locking mechanism around the cache to allow concurrent calls.

async def _get_full_user(self) -> Dict:
        """
        Sometimes Telegram does not provide all the user info with the message.
        In order to get the full profile (aka the language code) you need to
        call this method which will make sure that the full User object is
        loaded.

        The result is cached for the lifetime of the object, so if the function
        is called multiple times it will only fetch the user once. There is
        a locking mechanism around the cache to allow concurrent calls.
        """

        if 'language_code' in self._user:
            return self._user

        async with self._lock:
            if self._full_user is None:
                cm = await self._telegram.call(
                    'getChatMember',
                    user_id=self._user['id'],
                    chat_id=self._chat['id'],
                )
                self._full_user = cm['result']['user']

            return self._full_user