def parse_annotation(param: inspect.Parameter, default, arg: str, index: int, message: discord.Message): """ Parse annotations and return the command to use. index is basically the arg's index in shelx.split(message.content) """ if default is param.empty: default = None if param.annotation is not param.empty: # Any annotation is a function or Annotation enum anno = param.annotation # Valid enum checks if isinstance(anno, utils.Annotate): content = lambda s: utils.split(s, maxsplit=index)[-1].strip("\" ") if anno is utils.Annotate.Content: # Split and get raw content from this point return content(message.content) or default elif anno is utils.Annotate.LowerContent: # Lowercase of above check return content(message.content).lower() or default elif anno is utils.Annotate.CleanContent: # Split and get clean raw content from this point return content(message.clean_content) or default elif anno is utils.Annotate.LowerCleanContent: # Lowercase of above check return content(message.clean_content).lower() or default elif anno is utils.Annotate.Member: # Checks member names or mentions return utils.find_member(message.server, arg) or default_self(anno, default, message) elif anno is utils.Annotate.Channel: # Checks channel names or mentions return utils.find_channel(message.server, arg) or default_self(anno, default, message) elif anno is utils.Annotate.Code: # Works like Content but extracts code return utils.get_formatted_code(utils.split(message.content, maxsplit=index)[-1]) or default try: # Try running as a method result = anno(arg) return result if result is not None else default except TypeError: raise TypeError("Command parameter annotation must be either pcbot.utils.Annotate or a callable") except: # On error, eg when annotation is int and given argument is str return None return str(arg) or default # Return str of arg if there was no annotation
async def parse_annotation(param: inspect.Parameter, default, arg: str, index: int, message: discord.Message): """ Parse annotations and return the command to use. index is basically the arg's index in shelx.split(message.content) """ if default is param.empty: default = None if param.annotation is not param.empty: # Any annotation is a function or Annotation enum anno = override_annotation(param.annotation) content = lambda s: utils.split(s, maxsplit=index)[-1].strip("\" ") # Valid enum checks if isinstance(anno, utils.Annotate): if anno is utils.Annotate.Content: # Split and get raw content from this point return content(message.content) or default elif anno is utils.Annotate.LowerContent: # Lowercase of above check return content(message.content).lower() or default elif anno is utils.Annotate.CleanContent: # Split and get clean raw content from this point return content(message.clean_content) or default elif anno is utils.Annotate.LowerCleanContent: # Lowercase of above check return content(message.clean_content).lower() or default elif anno is utils.Annotate.Member: # Checks member names or mentions return utils.find_member(message.server, arg) or default_self( anno, default, message) elif anno is utils.Annotate.Channel: # Checks text channel names or mentions return utils.find_channel(message.server, arg) or default_self( anno, default, message) elif anno is utils.Annotate.VoiceChannel: # Checks voice channel names or mentions return utils.find_channel(message.server, arg, channel_type="voice") elif anno is utils.Annotate.Code: # Works like Content but extracts code return utils.get_formatted_code( utils.split(message.content, maxsplit=index)[-1]) or default try: # Try running as a method if getattr(anno, "allow_spaces", False): arg = content(message.content) # Pass the message if the argument has this specified if getattr(anno, "pass_message", False): result = anno(message, arg) else: result = anno(arg) # The function can be a coroutine if inspect.isawaitable(result): result = await result return result if result is not None else default except TypeError: raise TypeError( "Command parameter annotation must be either pcbot.utils.Annotate, a callable or a coroutine" ) except AssertionError as e: # raise the error in order to catch it at a lower level raise AssertionError(e) except: # On error, eg when annotation is int and given argument is str return None return str(arg) or default # Return str of arg if there was no annotation