mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-12-07 01:42:30 -05:00
[Config] Asynchronous getters (#907)
* Make config get async * Asyncify alias * Asyncify bank * Asyncify cog manager * IT BOOTS * Asyncify core commands * Asyncify repo manager * Asyncify downloader * Asyncify economy * Asyncify alias TESTS * Asyncify economy TESTS * Asyncify downloader TESTS * Asyncify config TESTS * A bank thing * Asyncify Bank cog * Warning message in docs * Update docs with await syntax * Update docs with await syntax
This commit is contained in:
89
core/bank.py
89
core/bank.py
@@ -1,6 +1,6 @@
|
||||
import datetime
|
||||
from collections import namedtuple
|
||||
from typing import Tuple, Generator, Union
|
||||
from typing import Tuple, Generator, Union, List
|
||||
|
||||
import discord
|
||||
from copy import deepcopy
|
||||
@@ -78,17 +78,17 @@ def _decode_time(time: int) -> datetime.datetime:
|
||||
return datetime.datetime.utcfromtimestamp(time)
|
||||
|
||||
|
||||
def get_balance(member: discord.Member) -> int:
|
||||
async def get_balance(member: discord.Member) -> int:
|
||||
"""
|
||||
Gets the current balance of a member.
|
||||
:param member:
|
||||
:return:
|
||||
"""
|
||||
acc = get_account(member)
|
||||
acc = await get_account(member)
|
||||
return acc.balance
|
||||
|
||||
|
||||
def can_spend(member: discord.Member, amount: int) -> bool:
|
||||
async def can_spend(member: discord.Member, amount: int) -> bool:
|
||||
"""
|
||||
Determines if a member can spend the given amount.
|
||||
:param member:
|
||||
@@ -97,7 +97,7 @@ def can_spend(member: discord.Member, amount: int) -> bool:
|
||||
"""
|
||||
if _invalid_amount(amount):
|
||||
return False
|
||||
return get_balance(member) > amount
|
||||
return await get_balance(member) > amount
|
||||
|
||||
|
||||
async def set_balance(member: discord.Member, amount: int) -> int:
|
||||
@@ -111,17 +111,17 @@ async def set_balance(member: discord.Member, amount: int) -> int:
|
||||
"""
|
||||
if amount < 0:
|
||||
raise ValueError("Not allowed to have negative balance.")
|
||||
if is_global():
|
||||
if await is_global():
|
||||
group = _conf.user(member)
|
||||
else:
|
||||
group = _conf.member(member)
|
||||
await group.balance.set(amount)
|
||||
|
||||
if group.created_at() == 0:
|
||||
if await group.created_at() == 0:
|
||||
time = _encoded_current_time()
|
||||
await group.created_at.set(time)
|
||||
|
||||
if group.name() == "":
|
||||
if await group.name() == "":
|
||||
await group.name.set(member.display_name)
|
||||
|
||||
return amount
|
||||
@@ -144,7 +144,7 @@ async def withdraw_credits(member: discord.Member, amount: int) -> int:
|
||||
if _invalid_amount(amount):
|
||||
raise ValueError("Invalid withdrawal amount {} <= 0".format(amount))
|
||||
|
||||
bal = get_balance(member)
|
||||
bal = await get_balance(member)
|
||||
if amount > bal:
|
||||
raise ValueError("Insufficient funds {} > {}".format(amount, bal))
|
||||
|
||||
@@ -163,7 +163,7 @@ async def deposit_credits(member: discord.Member, amount: int) -> int:
|
||||
if _invalid_amount(amount):
|
||||
raise ValueError("Invalid withdrawal amount {} <= 0".format(amount))
|
||||
|
||||
bal = get_balance(member)
|
||||
bal = await get_balance(member)
|
||||
return await set_balance(member, amount + bal)
|
||||
|
||||
|
||||
@@ -190,13 +190,13 @@ async def wipe_bank(user: Union[discord.User, discord.Member]):
|
||||
Deletes all accounts from the bank.
|
||||
:return:
|
||||
"""
|
||||
if is_global():
|
||||
if await is_global():
|
||||
await _conf.user(user).clear()
|
||||
else:
|
||||
await _conf.member(user).clear()
|
||||
|
||||
|
||||
def get_guild_accounts(guild: discord.Guild) -> Generator[Account, None, None]:
|
||||
async def get_guild_accounts(guild: discord.Guild) -> List[Account]:
|
||||
"""
|
||||
Gets all account data for the given guild.
|
||||
|
||||
@@ -207,14 +207,16 @@ def get_guild_accounts(guild: discord.Guild) -> Generator[Account, None, None]:
|
||||
if is_global():
|
||||
raise RuntimeError("The bank is currently global.")
|
||||
|
||||
accs = _conf.member(guild.owner).all_from_kind()
|
||||
ret = []
|
||||
accs = await _conf.member(guild.owner).all_from_kind()
|
||||
for user_id, acc in accs.items():
|
||||
acc_data = acc.copy() # There ya go kowlin
|
||||
acc_data['created_at'] = _decode_time(acc_data['created_at'])
|
||||
yield Account(**acc_data)
|
||||
ret.append(Account(**acc_data))
|
||||
return ret
|
||||
|
||||
|
||||
def get_global_accounts(user: discord.User) -> Generator[Account, None, None]:
|
||||
async def get_global_accounts(user: discord.User) -> List[Account]:
|
||||
"""
|
||||
Gets all global account data.
|
||||
|
||||
@@ -225,44 +227,47 @@ def get_global_accounts(user: discord.User) -> Generator[Account, None, None]:
|
||||
if not is_global():
|
||||
raise RuntimeError("The bank is not currently global.")
|
||||
|
||||
accs = _conf.user(user).all_from_kind() # this is a dict of user -> acc
|
||||
ret = []
|
||||
accs = await _conf.user(user).all_from_kind() # this is a dict of user -> acc
|
||||
for user_id, acc in accs.items():
|
||||
acc_data = acc.copy()
|
||||
acc_data['created_at'] = _decode_time(acc_data['created_at'])
|
||||
yield Account(**acc_data)
|
||||
ret.append(Account(**acc_data))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def get_account(member: Union[discord.Member, discord.User]) -> Account:
|
||||
async def get_account(member: Union[discord.Member, discord.User]) -> Account:
|
||||
"""
|
||||
Gets the appropriate account for the given member.
|
||||
:param member:
|
||||
:return:
|
||||
"""
|
||||
if is_global():
|
||||
acc_data = _conf.user(member)().copy()
|
||||
if await is_global():
|
||||
acc_data = (await _conf.user(member)()).copy()
|
||||
default = _DEFAULT_USER.copy()
|
||||
else:
|
||||
acc_data = _conf.member(member)().copy()
|
||||
acc_data = (await _conf.member(member)()).copy()
|
||||
default = _DEFAULT_MEMBER.copy()
|
||||
|
||||
if acc_data == {}:
|
||||
acc_data = default
|
||||
acc_data['name'] = member.display_name
|
||||
try:
|
||||
acc_data['balance'] = get_default_balance(member.guild)
|
||||
acc_data['balance'] = await get_default_balance(member.guild)
|
||||
except AttributeError:
|
||||
acc_data['balance'] = get_default_balance()
|
||||
acc_data['balance'] = await get_default_balance()
|
||||
|
||||
acc_data['created_at'] = _decode_time(acc_data['created_at'])
|
||||
return Account(**acc_data)
|
||||
|
||||
|
||||
def is_global() -> bool:
|
||||
async def is_global() -> bool:
|
||||
"""
|
||||
Determines if the bank is currently global.
|
||||
:return:
|
||||
"""
|
||||
return _conf.is_global()
|
||||
return await _conf.is_global()
|
||||
|
||||
|
||||
async def set_global(global_: bool, user: Union[discord.User, discord.Member]) -> bool:
|
||||
@@ -272,7 +277,7 @@ async def set_global(global_: bool, user: Union[discord.User, discord.Member]) -
|
||||
:param user: Must be a Member object if changing TO global mode.
|
||||
:return: New bank mode, True is global.
|
||||
"""
|
||||
if is_global() is global_:
|
||||
if (await is_global()) is global_:
|
||||
return global_
|
||||
|
||||
if is_global():
|
||||
@@ -287,7 +292,7 @@ async def set_global(global_: bool, user: Union[discord.User, discord.Member]) -
|
||||
return global_
|
||||
|
||||
|
||||
def get_bank_name(guild: discord.Guild=None) -> str:
|
||||
async def get_bank_name(guild: discord.Guild=None) -> str:
|
||||
"""
|
||||
Gets the current bank name. If the bank is guild-specific the
|
||||
guild parameter is required.
|
||||
@@ -296,10 +301,10 @@ def get_bank_name(guild: discord.Guild=None) -> str:
|
||||
:param guild:
|
||||
:return:
|
||||
"""
|
||||
if is_global():
|
||||
return _conf.bank_name()
|
||||
if await is_global():
|
||||
return await _conf.bank_name()
|
||||
elif guild is not None:
|
||||
return _conf.guild(guild).bank_name()
|
||||
return await _conf.guild(guild).bank_name()
|
||||
else:
|
||||
raise RuntimeError("Guild parameter is required and missing.")
|
||||
|
||||
@@ -314,7 +319,7 @@ async def set_bank_name(name: str, guild: discord.Guild=None) -> str:
|
||||
:param guild:
|
||||
:return:
|
||||
"""
|
||||
if is_global():
|
||||
if await is_global():
|
||||
await _conf.bank_name.set(name)
|
||||
elif guild is not None:
|
||||
await _conf.guild(guild).bank_name.set(name)
|
||||
@@ -324,7 +329,7 @@ async def set_bank_name(name: str, guild: discord.Guild=None) -> str:
|
||||
return name
|
||||
|
||||
|
||||
def get_currency_name(guild: discord.Guild=None) -> str:
|
||||
async def get_currency_name(guild: discord.Guild=None) -> str:
|
||||
"""
|
||||
Gets the currency name of the bank. The guild parameter is required if
|
||||
the bank is guild-specific.
|
||||
@@ -333,10 +338,10 @@ def get_currency_name(guild: discord.Guild=None) -> str:
|
||||
:param guild:
|
||||
:return:
|
||||
"""
|
||||
if is_global():
|
||||
return _conf.currency()
|
||||
if await is_global():
|
||||
return await _conf.currency()
|
||||
elif guild is not None:
|
||||
return _conf.guild(guild).currency()
|
||||
return await _conf.guild(guild).currency()
|
||||
else:
|
||||
raise RuntimeError("Guild must be provided.")
|
||||
|
||||
@@ -351,7 +356,7 @@ async def set_currency_name(name: str, guild: discord.Guild=None) -> str:
|
||||
:param guild:
|
||||
:return:
|
||||
"""
|
||||
if is_global():
|
||||
if await is_global():
|
||||
await _conf.currency.set(name)
|
||||
elif guild is not None:
|
||||
await _conf.guild(guild).currency.set(name)
|
||||
@@ -361,7 +366,7 @@ async def set_currency_name(name: str, guild: discord.Guild=None) -> str:
|
||||
return name
|
||||
|
||||
|
||||
def get_default_balance(guild: discord.Guild=None) -> int:
|
||||
async def get_default_balance(guild: discord.Guild=None) -> int:
|
||||
"""
|
||||
Gets the current default balance amount. If the bank is guild-specific
|
||||
you must pass guild.
|
||||
@@ -370,10 +375,10 @@ def get_default_balance(guild: discord.Guild=None) -> int:
|
||||
:param guild:
|
||||
:return:
|
||||
"""
|
||||
if is_global():
|
||||
return _conf.default_balance()
|
||||
if await is_global():
|
||||
return await _conf.default_balance()
|
||||
elif guild is not None:
|
||||
return _conf.guild(guild).default_balance()
|
||||
return await _conf.guild(guild).default_balance()
|
||||
else:
|
||||
raise RuntimeError("Guild is missing and required!")
|
||||
|
||||
@@ -393,9 +398,11 @@ async def set_default_balance(amount: int, guild: discord.Guild=None) -> int:
|
||||
if amount < 0:
|
||||
raise ValueError("Amount must be greater than zero.")
|
||||
|
||||
if is_global():
|
||||
if await is_global():
|
||||
await _conf.default_balance.set(amount)
|
||||
elif guild is not None:
|
||||
await _conf.guild(guild).default_balance.set(amount)
|
||||
else:
|
||||
raise RuntimeError("Guild is missing and required.")
|
||||
|
||||
return amount
|
||||
|
||||
Reference in New Issue
Block a user