Warn when new slotmin/slotmax value will cause slots to not work (#4583)

* Properly handle slotmin/slotmax rules

* Use a variable to reduce config calls. No reason to process differently half way through a command anyways.

* Update redbot/cogs/economy/economy.py

* Add positive int converter for slotmin/slotmax

* Option to allow bad mins and maxes.

* Update economy.py

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
This commit is contained in:
bobloy 2020-12-17 14:32:57 -05:00 committed by GitHub
parent e519286f5c
commit d22ea2dd11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 15 deletions

View File

@ -0,0 +1,22 @@
from typing import NewType, TYPE_CHECKING
from redbot.core.commands import BadArgument
from redbot.core.i18n import Translator
from redbot.core.utils.chat_formatting import inline
_ = Translator("Economy", __file__)
# Duplicate of redbot.cogs.cleanup.converters.PositiveInt
PositiveInt = NewType("PositiveInt", int)
if TYPE_CHECKING:
positive_int = PositiveInt
else:
def positive_int(arg: str) -> int:
try:
ret = int(arg)
except ValueError:
raise BadArgument(_("{arg} is not an integer.").format(arg=inline(arg)))
if ret <= 0:
raise BadArgument(_("{arg} is not a positive integer.").format(arg=inline(arg)))
return ret

View File

@ -11,12 +11,12 @@ import discord
from redbot.cogs.bank import is_owner_if_bank_global
from redbot.cogs.mod.converters import RawUserIds
from redbot.core import Config, bank, commands, errors, checks
from redbot.core.bot import Red
from redbot.core.i18n import Translator, cog_i18n
from redbot.core.utils import AsyncIter
from redbot.core.utils.chat_formatting import box, humanize_number
from redbot.core.utils.menus import close_menu, menu, DEFAULT_CONTROLS
from redbot.core.bot import Red
from .converters import positive_int
T_ = Translator("Economy", __file__)
@ -834,7 +834,7 @@ class Economy(commands.Cog):
)
@economyset.command()
async def slotmin(self, ctx: commands.Context, bid: int):
async def slotmin(self, ctx: commands.Context, bid: positive_int):
"""Set the minimum slot machine bid.
Example:
@ -844,11 +844,20 @@ class Economy(commands.Cog):
- `<bid>` The new minimum bid for using the slot machine. Default is 5.
"""
if bid < 1:
await ctx.send(_("Invalid min bid amount."))
return
guild = ctx.guild
if await bank.is_global():
is_global = await bank.is_global()
if is_global:
slot_max = await self.config.SLOT_MAX()
else:
slot_max = await self.config.guild(guild).SLOT_MAX()
if bid > slot_max:
await ctx.send(
_(
"Warning: Minimum bid is greater than the maximum bid ({max_bid}). "
"Slots will not work."
).format(max_bid=humanize_number(slot_max))
)
if is_global:
await self.config.SLOT_MIN.set(bid)
else:
await self.config.guild(guild).SLOT_MIN.set(bid)
@ -860,7 +869,7 @@ class Economy(commands.Cog):
)
@economyset.command()
async def slotmax(self, ctx: commands.Context, bid: int):
async def slotmax(self, ctx: commands.Context, bid: positive_int):
"""Set the maximum slot machine bid.
Example:
@ -870,15 +879,21 @@ class Economy(commands.Cog):
- `<bid>` The new maximum bid for using the slot machine. Default is 100.
"""
slot_min = await self.config.SLOT_MIN()
if bid < 1 or bid < slot_min:
await ctx.send(
_("Invalid maximum bid amount. Must be greater than the minimum amount.")
)
return
guild = ctx.guild
is_global = await bank.is_global()
if is_global:
slot_min = await self.config.SLOT_MIN()
else:
slot_min = await self.config.guild(guild).SLOT_MIN()
if bid < slot_min:
await ctx.send(
_(
"Warning: Maximum bid is less than the minimum bid ({min_bid}). "
"Slots will not work."
).format(min_bid=humanize_number(slot_min))
)
credits_name = await bank.get_currency_name(guild)
if await bank.is_global():
if is_global:
await self.config.SLOT_MAX.set(bid)
else:
await self.config.guild(guild).SLOT_MAX.set(bid)