47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
import argparse
|
|
import contextlib
|
|
import io
|
|
|
|
import utils
|
|
|
|
|
|
class ArgumentParser:
|
|
def __init__(self, command, description):
|
|
self.parser = argparse.ArgumentParser(
|
|
command, description=description, exit_on_error=False
|
|
)
|
|
|
|
def print_help(self):
|
|
help_buffer = io.StringIO()
|
|
with contextlib.redirect_stdout(help_buffer):
|
|
self.parser.print_help()
|
|
return help_buffer.getvalue().replace(" and exit", "")
|
|
|
|
def add_mutually_exclusive_group(self, *args, **kwargs):
|
|
return self.parser.add_mutually_exclusive_group(*args, **kwargs)
|
|
|
|
def add_argument(self, *args, **kwargs):
|
|
return self.parser.add_argument(*args, **kwargs)
|
|
|
|
async def parse_args(self, message, tokens) -> argparse.Namespace | None:
|
|
try:
|
|
with contextlib.redirect_stdout(io.StringIO()):
|
|
args = self.parser.parse_args(tokens[1:])
|
|
return args
|
|
except SystemExit:
|
|
await utils.reply(message, f"```\n{self.print_help()}```")
|
|
except Exception as e:
|
|
await utils.reply(message, f"`{e}`")
|
|
|
|
|
|
def range_type(string, min=0, max=100):
|
|
try:
|
|
value = int(string)
|
|
except ValueError:
|
|
raise argparse.ArgumentTypeError("value is not a valid integer")
|
|
|
|
if min <= value <= max:
|
|
return value
|
|
else:
|
|
raise argparse.ArgumentTypeError(f"value is not in range {min}-{max}")
|