2020-02-02 19:26:54 +13:00
|
|
|
import yaml
|
|
|
|
from redbot.core import commands
|
|
|
|
|
|
|
|
|
|
|
|
configable_guild_defaults = {
|
|
|
|
"interval": 5,
|
2020-02-09 08:52:28 +13:00
|
|
|
"fail_rate": 0.2,
|
|
|
|
"decay_rate": 0.5,
|
2020-02-02 19:26:54 +13:00
|
|
|
"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:
|
2020-02-02 20:18:16 +13:00
|
|
|
raise commands.BadArgument("Interval must be an integer value 5 or greater") from None
|
2020-02-02 19:26:54 +13:00
|
|
|
|
|
|
|
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:
|
2020-02-02 20:18:16 +13:00
|
|
|
raise commands.BadArgument(f"{value} must be a non-negative integer value")
|
2020-02-02 19:26:54 +13:00
|
|
|
|
|
|
|
for value in ("maximum_level", "maximum_bonus"):
|
|
|
|
if value in args:
|
|
|
|
try:
|
2020-02-02 20:18:16 +13:00
|
|
|
assert args[value] is None or (args[value] == int(args[value]) and args[value] >= 0)
|
2020-02-02 19:26:54 +13:00
|
|
|
except AssertionError:
|
2020-02-02 20:18:16 +13:00
|
|
|
raise commands.BadArgument(f"{value} must be a non-negative integer value or `null`")
|
2020-02-02 19:26:54 +13:00
|
|
|
|
2020-02-10 12:29:27 +13:00
|
|
|
for value in "fail_rate":
|
2020-02-09 08:52:28 +13:00
|
|
|
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.")
|
|
|
|
|
2020-02-10 12:29:27 +13:00
|
|
|
for value in "decay_rate":
|
2020-02-10 12:13:51 +13:00
|
|
|
if value in args:
|
|
|
|
try:
|
|
|
|
assert args[value] >= 0
|
|
|
|
except AssertionError:
|
|
|
|
raise commands.BadArgument(f"{value} must be greater than 0.")
|
|
|
|
|
2020-02-02 19:26:54 +13:00
|
|
|
return args
|