mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-07 03:38:53 -05:00
* Removes `MAX_BALANCE` from bank, user `bank.get_max_balance()` now `[p]bankset maxbal` can be used to set the maximum bank balance Signed-off-by: Guy <guyreis96@gmail.com> * Initial Commit Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * I need to make sure I keep aika on her toes. Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Fixes a few missing kwargs and case consistency Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Fixes a few missing kwargs and case consistency v2 and typos Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Reset cooldowns + add changelogs Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Add 3 extra file formats. Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * IRDUMB - fix capitalization. Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Fix a silent error, and some incorrect messages. Signed-off-by: guyre <27962761+drapersniper@users.noreply.github.com> * Remove unnecessary emojis from queue when they are not needed Signed-off-by: guyre <27962761+drapersniper@users.noreply.github.com> * Remove duplicated call in `[p]playlist update` Signed-off-by: guyre <27962761+drapersniper@users.noreply.github.com> * Remove duplicated call in `[p]playlist update` Signed-off-by: guyre <27962761+drapersniper@users.noreply.github.com> * Resolve conflicts Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Bring all files up to date + Black Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Facepalm Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * *Sigh* Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * *Sigh* 2.0 Signed-off-by: Draper <27962761+Drapersniper@users.noreply.github.com> * Merge branch 'V3/develop' of https://github.com/Cog-Creators/Red-DiscordBot into audio-misc-pt1 Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> # Resolve Conflicts: # redbot/cogs/audio/audio.py # redbot/cogs/audio/utils.py * Import missing Typecheck Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Fix Broken docstrings Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Sort Local Tracks Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * 🤦 Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Reorder the sorting of local tracks, `alphanumerical lower then alphanumerical upper` `a comes before A, but B comes after A` Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Black formatting Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Make the local file sorting case insensitive Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Add global blacklist/whitelist + fix some issues with original server based whitelist/blacklist Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Remove the pre-commit yaml Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Nottin to see Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Further improvement to the blacklists Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Further improvement to the blacklists Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Fix the __str__ method on LocalTracks Object * Rename LocalTracks.to_string_hidden() to LocalTracks.to_string_user() To keep it inline with the Query object * Remove encoding pragmas + a few typo fixes * Update some typehints + fix some typos * Remove this duplicate call * Black * fix capitalization * Address preda's review Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Remove the API from the audio cog - Is in direct conflict with goals stated in #2804 - Features this was intended to enable can be enabled in other more appropriate ways later on * changelog * Address Aika's review * Black * *sigh* dont use github web ui * Fuck windows Long live linux... *sigh* no lets ensure windows users can still use local tracks * Merge branch 'V3/develop' of https://github.com/Cog-Creators/Red-DiscordBot into refactoring Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> # Conflicts: # redbot/cogs/audio/audio.py * 👀 + chore Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * facepalm Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * facepalm... again y u h8 me bruh Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * fuk this fuk u tube fuck python fuck all Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * awyehfqwajefhnqeffawefqa eqewarfqaesf qwef qaf qwfr Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * fuck everything Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * oh lord saviour resus i love you just make this work Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Change logic to be no errors within last 10 seconds... this should be a valid work around discord ratelimits caused by the spam * Remove auto deletion Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * See I did a ting Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * irdumb Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * black Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Add an is_url attribute to Query objects * chore Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Black * Address Aikas review Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Hyperlink Playlist names Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Make shit bold Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * why was this here Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * why was this here Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Initial commit * Workinnng Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Improve SQL Statements + migrate from SQL Alchemy + Databases to APSW Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * apsw tested and working Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * chose Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Migrate Playlist to DB 3 TODO 1 Migrate Config to Schema 3 without playlists and update get_playlist methods Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Revert "Migrate Playlist to DB 3 TODO 1 Migrate Config to Schema 3 without playlists and update get_playlist methods" This reverts commit 4af33cff Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Implement schema migration * Lets not touch the deps since #3192 is already adding them * chore * *sigh* Black * Follow the existing logic and always default Playlist to guild scope * wghqjegqf black * Update usage of last_fetched and last_updated to be Ints... However column migration still pending * Some bug fixes * Update usage of last_fetched and last_updated to be Ints... However column migration still pending * working Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * partial match Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * better partial match Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * black Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * I thought i done this before * Delete 3195.misc.1.rst Wrong PR * Thanks Sinbad Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Thanks Sinbad Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Log Errors in init ... Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Update error logs. Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Create index Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * :Drapersweat: Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Chore Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Revert "Chore" This reverts commit edcc9a9f UGHHHH Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Allow removing tracks from queue by URL Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Words matter Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * chore Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * arghhh CONFLICTS Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Review sinbads latest comment .. ToDo.. Nuke existing playlist - check version and set version Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * migrate the DB schema to v3 (to keep in line with the schema visioning of Config * Add a Todo * *sigh* conflicts and black * *sigh* black * Passively delete playlist deletion mechanism * Delete Old entries on startup * Since we are dropping the table mightaware make these into JSON for future proofing * Don't Dump strings in JSON field ? :think: * Move some things around to make easier to use 1 connection to the Audio DB * Move some things around to make easier to use 1 connection to the Audio DB * *sigh* * Clean up api * *sigh* black * Red + reorder some variables * 🤦 * how could i forget this ....... * Black Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Black Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Black Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * #automagically Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * FINAFUCKINGLY Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * FINAFUCKINGLY Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Remove unused config default Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Remove the API from the audio Cog (Properly) Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Missed these changes Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * ARGHHH Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Some fixes I've noticed while running through the code line by line Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Translation + UX (show playlist author ID if can't find user) Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* missed this one Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * this is no longer needed .... Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * 🤦 Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * fix new lines in error messages Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Black * Sinbads Review Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Sinbads Review Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* copy paste Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * imrpove backups Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Im a fucking idiot Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Fix #3238 Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * chore Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * humans Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * humans Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * add play alias to playlists Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Im dumb ... Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Im dumb ... Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * fix new line Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * fix new line Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * show playlist count on playlist picker Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * DJ/Vote system fixes Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * DJ/Vote system fixes Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* fix currency check Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * show playlist count on playlist picker Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * DJ/Vote system fixes Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * DJ/Vote system fixes Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* fix currency check Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Fix duplicate messages on timeout Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * fix SQL Statement logic Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * fix SQL Statement logic Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Markdown escape Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Markdown escape Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Markdown escape fix Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Markdown escape fix Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * clean up local cache more frequently Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * clean up db more frequently Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Await in hell Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* im dumb Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* im dumb Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Black cuz I hate red Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Black cuz I hate red Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * StringIO to ByteIO Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * StringIO to ByteIO Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* im dumb Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * :Facepalm: the whole purpose of this is so its offline so this can be backed up without being blocking Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Run write queries on ThreadPoolExecutor Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * Backup Audio.db Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* im dumb Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * blaaaack Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * *sigh* Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * formatting Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * remove duplicated string of code Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> * ffs awaits Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com> Co-authored-by: Michael H <michael@michaelhall.tech>
256 lines
8.7 KiB
Python
256 lines
8.7 KiB
Python
import getpass
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
from typing import Optional, Any, AsyncIterator, Tuple, Union, Callable, List
|
|
|
|
try:
|
|
# pylint: disable=import-error
|
|
import asyncpg
|
|
except ModuleNotFoundError:
|
|
asyncpg = None
|
|
|
|
from ... import data_manager, errors
|
|
from ..base import BaseDriver, IdentifierData, ConfigCategory
|
|
from ..log import log
|
|
|
|
__all__ = ["PostgresDriver"]
|
|
|
|
_PKG_PATH = Path(__file__).parent
|
|
DDL_SCRIPT_PATH = _PKG_PATH / "ddl.sql"
|
|
DROP_DDL_SCRIPT_PATH = _PKG_PATH / "drop_ddl.sql"
|
|
|
|
|
|
def encode_identifier_data(
|
|
id_data: IdentifierData,
|
|
) -> Tuple[str, str, str, List[str], List[str], int, bool]:
|
|
return (
|
|
id_data.cog_name,
|
|
id_data.uuid,
|
|
id_data.category,
|
|
["0"] if id_data.category == ConfigCategory.GLOBAL else list(id_data.primary_key),
|
|
list(id_data.identifiers),
|
|
1 if id_data.category == ConfigCategory.GLOBAL else id_data.primary_key_len,
|
|
id_data.is_custom,
|
|
)
|
|
|
|
|
|
class PostgresDriver(BaseDriver):
|
|
|
|
_pool: Optional["asyncpg.pool.Pool"] = None
|
|
|
|
@classmethod
|
|
async def initialize(cls, **storage_details) -> None:
|
|
if asyncpg is None:
|
|
raise errors.MissingExtraRequirements(
|
|
"Red must be installed with the [postgres] extra to use the PostgreSQL driver"
|
|
)
|
|
cls._pool = await asyncpg.create_pool(**storage_details)
|
|
with DDL_SCRIPT_PATH.open() as fs:
|
|
await cls._pool.execute(fs.read())
|
|
|
|
@classmethod
|
|
async def teardown(cls) -> None:
|
|
if cls._pool is not None:
|
|
await cls._pool.close()
|
|
|
|
@staticmethod
|
|
def get_config_details():
|
|
unixmsg = (
|
|
""
|
|
if sys.platform == "win32"
|
|
else (
|
|
" - Common directories for PostgreSQL Unix-domain sockets (/run/postgresql, "
|
|
"/var/run/postgresl, /var/pgsql_socket, /private/tmp, and /tmp),\n"
|
|
)
|
|
)
|
|
host = (
|
|
input(
|
|
f"Enter the PostgreSQL server's address.\n"
|
|
f"If left blank, Red will try the following, in order:\n"
|
|
f" - The PGHOST environment variable,\n{unixmsg}"
|
|
f" - localhost.\n"
|
|
f"> "
|
|
)
|
|
or None
|
|
)
|
|
|
|
print(
|
|
"Enter the PostgreSQL server port.\n"
|
|
"If left blank, this will default to either:\n"
|
|
" - The PGPORT environment variable,\n"
|
|
" - 5432."
|
|
)
|
|
while True:
|
|
port = input("> ") or None
|
|
if port is None:
|
|
break
|
|
|
|
try:
|
|
port = int(port)
|
|
except ValueError:
|
|
print("Port must be a number")
|
|
else:
|
|
break
|
|
|
|
user = (
|
|
input(
|
|
"Enter the PostgreSQL server username.\n"
|
|
"If left blank, this will default to either:\n"
|
|
" - The PGUSER environment variable,\n"
|
|
" - The OS name of the user running Red (ident/peer authentication).\n"
|
|
"> "
|
|
)
|
|
or None
|
|
)
|
|
|
|
passfile = r"%APPDATA%\postgresql\pgpass.conf" if sys.platform == "win32" else "~/.pgpass"
|
|
password = getpass.getpass(
|
|
f"Enter the PostgreSQL server password. The input will be hidden.\n"
|
|
f" NOTE: If using ident/peer authentication (no password), enter NONE.\n"
|
|
f"When NONE is entered, this will default to:\n"
|
|
f" - The PGPASSWORD environment variable,\n"
|
|
f" - Looking up the password in the {passfile} passfile,\n"
|
|
f" - No password.\n"
|
|
f"> "
|
|
)
|
|
if password == "NONE":
|
|
password = None
|
|
|
|
database = (
|
|
input(
|
|
"Enter the PostgreSQL database's name.\n"
|
|
"If left blank, this will default to either:\n"
|
|
" - The PGDATABASE environment variable,\n"
|
|
" - The OS name of the user running Red.\n"
|
|
"> "
|
|
)
|
|
or None
|
|
)
|
|
|
|
return {
|
|
"host": host,
|
|
"port": port,
|
|
"user": user,
|
|
"password": password,
|
|
"database": database,
|
|
}
|
|
|
|
async def get(self, identifier_data: IdentifierData):
|
|
try:
|
|
result = await self._execute(
|
|
"SELECT red_config.get($1)",
|
|
encode_identifier_data(identifier_data),
|
|
method=self._pool.fetchval,
|
|
)
|
|
except asyncpg.UndefinedTableError:
|
|
raise KeyError from None
|
|
|
|
if result is None:
|
|
# The result is None both when postgres yields no results, or when it yields a NULL row
|
|
# A 'null' JSON value would be returned as encoded JSON, i.e. the string 'null'
|
|
raise KeyError
|
|
return json.loads(result)
|
|
|
|
async def set(self, identifier_data: IdentifierData, value=None):
|
|
try:
|
|
await self._execute(
|
|
"SELECT red_config.set($1, $2::jsonb)",
|
|
encode_identifier_data(identifier_data),
|
|
json.dumps(value),
|
|
)
|
|
except asyncpg.ErrorInAssignmentError:
|
|
raise errors.CannotSetSubfield
|
|
|
|
async def clear(self, identifier_data: IdentifierData):
|
|
try:
|
|
await self._execute(
|
|
"SELECT red_config.clear($1)", encode_identifier_data(identifier_data)
|
|
)
|
|
except asyncpg.UndefinedTableError:
|
|
pass
|
|
|
|
async def inc(
|
|
self, identifier_data: IdentifierData, value: Union[int, float], default: Union[int, float]
|
|
) -> Union[int, float]:
|
|
try:
|
|
return await self._execute(
|
|
f"SELECT red_config.inc($1, $2, $3)",
|
|
encode_identifier_data(identifier_data),
|
|
value,
|
|
default,
|
|
method=self._pool.fetchval,
|
|
)
|
|
except asyncpg.WrongObjectTypeError as exc:
|
|
raise errors.StoredTypeError(*exc.args)
|
|
|
|
async def toggle(self, identifier_data: IdentifierData, default: bool) -> bool:
|
|
try:
|
|
return await self._execute(
|
|
"SELECT red_config.inc($1, $2)",
|
|
encode_identifier_data(identifier_data),
|
|
default,
|
|
method=self._pool.fetchval,
|
|
)
|
|
except asyncpg.WrongObjectTypeError as exc:
|
|
raise errors.StoredTypeError(*exc.args)
|
|
|
|
@classmethod
|
|
async def aiter_cogs(cls) -> AsyncIterator[Tuple[str, str]]:
|
|
query = "SELECT cog_name, cog_id FROM red_config.red_cogs"
|
|
log.invisible(query)
|
|
async with cls._pool.acquire() as conn, conn.transaction():
|
|
async for row in conn.cursor(query):
|
|
yield row["cog_name"], row["cog_id"]
|
|
|
|
@classmethod
|
|
async def delete_all_data(
|
|
cls, *, interactive: bool = False, drop_db: Optional[bool] = None, **kwargs
|
|
) -> None:
|
|
"""Delete all data being stored by this driver.
|
|
|
|
Parameters
|
|
----------
|
|
interactive : bool
|
|
Set to ``True`` to allow the method to ask the user for
|
|
input from the console, regarding the other unset parameters
|
|
for this method.
|
|
drop_db : Optional[bool]
|
|
Set to ``True`` to drop the entire database for the current
|
|
bot's instance. Otherwise, schemas within the database which
|
|
store bot data will be dropped, as well as functions,
|
|
aggregates, event triggers, and meta-tables.
|
|
|
|
"""
|
|
if interactive is True and drop_db is None:
|
|
print(
|
|
"Please choose from one of the following options:\n"
|
|
" 1. Drop the entire PostgreSQL database for this instance, or\n"
|
|
" 2. Delete all of Red's data within this database, without dropping the database "
|
|
"itself."
|
|
)
|
|
options = ("1", "2")
|
|
while True:
|
|
resp = input("> ")
|
|
try:
|
|
drop_db = bool(options.index(resp))
|
|
except ValueError:
|
|
print("Please type a number corresponding to one of the options.")
|
|
else:
|
|
break
|
|
if drop_db is True:
|
|
storage_details = data_manager.storage_details()
|
|
await cls._pool.execute(f"DROP DATABASE $1", storage_details["database"])
|
|
else:
|
|
with DROP_DDL_SCRIPT_PATH.open() as fs:
|
|
await cls._pool.execute(fs.read())
|
|
|
|
@classmethod
|
|
async def _execute(cls, query: str, *args, method: Optional[Callable] = None) -> Any:
|
|
if method is None:
|
|
method = cls._pool.execute
|
|
log.invisible("Query: %s", query)
|
|
if args:
|
|
log.invisible("Args: %s", args)
|
|
return await method(query, *args)
|