Brandon209-Red-bot-Cogs/economytrickle/converters.py
2020-02-09 18:29:27 -05:00

77 lines
2.3 KiB
Python

import yaml
from redbot.core import commands
configable_guild_defaults = {
"interval": 5,
"fail_rate": 0.2,
"decay_rate": 0.5,
"level_xp_base": 100,
"xp_lv_increase": 50,
"maximum_level": None,
"xp_per_interval": 10,
"econ_per_interval": 20,
"bonus_per_level": 5,
"maximum_bonus": None,
"extra_voice_xp": 0,
"extra_message_xp": 0,
}
def settings_converter(user_input: str) -> dict:
if user_input.startswith("```") and user_input.endswith("```"):
user_input = "\n".join(user_input.split("\n")[1:-1])
try:
args = yaml.safe_load(user_input)
assert all(k in configable_guild_defaults for k in args.keys())
except (AssertionError, yaml.YAMLError):
raise commands.BadArgument() from None
if "interval" in args:
try:
assert args["interval"] == int(args["interval"])
assert args["interval"] >= 5
except AssertionError:
raise commands.BadArgument("Interval must be an integer value 5 or greater") from None
for value in (
"econ_per_interval",
"bonus_per_level",
"level_xp_base",
"xp_lv_increase",
"xp_per_interval",
"extra_voice_xp",
"extra_message_xp",
):
if value in args:
try:
assert args[value] == int(args[value]) and args[value] >= 0
except AssertionError:
raise commands.BadArgument(f"{value} must be a non-negative integer value")
for value in ("maximum_level", "maximum_bonus"):
if value in args:
try:
assert args[value] is None or (args[value] == int(args[value]) and args[value] >= 0)
except AssertionError:
raise commands.BadArgument(f"{value} must be a non-negative integer value or `null`")
for value in "fail_rate":
if value in args:
try:
assert args[value] >= 0
assert args[value] <= 1
except AssertionError:
raise commands.BadArgument(f"{value} must be a decimal value between 0 and 1.")
for value in "decay_rate":
if value in args:
try:
assert args[value] >= 0
except AssertionError:
raise commands.BadArgument(f"{value} must be greater than 0.")
return args