[commands] Fetch user if an ID is passed and cache lookup fails.
This commit is contained in:
		| @@ -206,6 +206,10 @@ class UserConverter(IDConverter): | |||||||
|  |  | ||||||
|     .. versionchanged:: 1.5 |     .. versionchanged:: 1.5 | ||||||
|          Raise :exc:`.UserNotFound` instead of generic :exc:`.BadArgument` |          Raise :exc:`.UserNotFound` instead of generic :exc:`.BadArgument` | ||||||
|  |  | ||||||
|  |     .. versionchanged:: 1.6 | ||||||
|  |         This converter now lazily fetches users from the HTTP APIs if an ID is passed | ||||||
|  |         and it's not available in cache. | ||||||
|     """ |     """ | ||||||
|     async def convert(self, ctx, argument): |     async def convert(self, ctx, argument): | ||||||
|         match = self._get_id_match(argument) or re.match(r'<@!?([0-9]+)>$', argument) |         match = self._get_id_match(argument) or re.match(r'<@!?([0-9]+)>$', argument) | ||||||
| @@ -215,25 +219,32 @@ class UserConverter(IDConverter): | |||||||
|         if match is not None: |         if match is not None: | ||||||
|             user_id = int(match.group(1)) |             user_id = int(match.group(1)) | ||||||
|             result = ctx.bot.get_user(user_id) or _utils_get(ctx.message.mentions, id=user_id) |             result = ctx.bot.get_user(user_id) or _utils_get(ctx.message.mentions, id=user_id) | ||||||
|         else: |             if result is None: | ||||||
|             arg = argument |                 try: | ||||||
|  |                     result = await ctx.bot.fetch_user(user_id) | ||||||
|  |                 except discord.HTTPException: | ||||||
|  |                     raise UserNotFound(argument) from None | ||||||
|  |  | ||||||
|             # Remove the '@' character if this is the first character from the argument |             return result | ||||||
|             if arg[0] == '@': |  | ||||||
|                 # Remove first character |  | ||||||
|                 arg = arg[1:] |  | ||||||
|  |  | ||||||
|             # check for discriminator if it exists, |         arg = argument | ||||||
|             if len(arg) > 5 and arg[-5] == '#': |  | ||||||
|                 discrim = arg[-4:] |  | ||||||
|                 name = arg[:-5] |  | ||||||
|                 predicate = lambda u: u.name == name and u.discriminator == discrim |  | ||||||
|                 result = discord.utils.find(predicate, state._users.values()) |  | ||||||
|                 if result is not None: |  | ||||||
|                     return result |  | ||||||
|  |  | ||||||
|             predicate = lambda u: u.name == arg |         # Remove the '@' character if this is the first character from the argument | ||||||
|  |         if arg[0] == '@': | ||||||
|  |             # Remove first character | ||||||
|  |             arg = arg[1:] | ||||||
|  |  | ||||||
|  |         # check for discriminator if it exists, | ||||||
|  |         if len(arg) > 5 and arg[-5] == '#': | ||||||
|  |             discrim = arg[-4:] | ||||||
|  |             name = arg[:-5] | ||||||
|  |             predicate = lambda u: u.name == name and u.discriminator == discrim | ||||||
|             result = discord.utils.find(predicate, state._users.values()) |             result = discord.utils.find(predicate, state._users.values()) | ||||||
|  |             if result is not None: | ||||||
|  |                 return result | ||||||
|  |  | ||||||
|  |         predicate = lambda u: u.name == arg | ||||||
|  |         result = discord.utils.find(predicate, state._users.values()) | ||||||
|  |  | ||||||
|         if result is None: |         if result is None: | ||||||
|             raise UserNotFound(argument) |             raise UserNotFound(argument) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user