From 697fa4f6ff040b85d10e4409dd7a3da57b70aec4 Mon Sep 17 00:00:00 2001 From: supopur Date: Wed, 5 Apr 2023 21:16:36 +0200 Subject: [PATCH] Migrating to multi computer development --- main.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 14 deletions(-) diff --git a/main.py b/main.py index 8e2d901..e5c724d 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ -import discord, os, sys, toml, time, datetime, logging, threading, asyncio, readline, importlib +import discord, os, sys, toml, time, datetime, logging, threading, asyncio, readline, importlib, sqlite3 from discord.ext import commands @@ -43,7 +43,7 @@ except: if token == "": log("err", 'Error no token is present type: export MEETOO_TOKEN="[Your token here]" into your terminall NOW!') -log("dbg", f"Token is: {token}") + start_time = time.time() @@ -54,8 +54,73 @@ bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) logger.debug("Loaded the client.") -#Api used mainly for plugins so getting uptime, loading, unloading, reloading plugins, getting status of plugins, get plugin info, stopping the bot, getting bot name and tag, getting cpm/commands per minute, get if there is web plugin, if there is web plugin register api, get if plugin supports web and so on.. +class DatabaseAPI: + def __init__(self, db_file): + self.db_file = db_file + self.connection = None + self.cursor = None + + def __enter__(self): + try: + self.connection = sqlite3.connect(self.db_file) + self.cursor = self.connection.cursor() + except sqlite3.Error as e: + raise e + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.cursor is not None: + self.cursor.close() + if self.connection is not None: + self.connection.close() + + def create_table(self, table_name, columns): + columns_str = ", ".join(columns) + query = f"CREATE TABLE IF NOT EXISTS {table_name} ({columns_str})" + self.cursor.execute(query) + self.connection.commit() + + def insert_values(self, table_name, values): + placeholders = ",".join(["?" for _ in range(len(values))]) + query = f"INSERT INTO {table_name} VALUES ({placeholders})" + self.cursor.execute(query, values) + self.connection.commit() + + def get_table(self, table_name): + query = f"SELECT * FROM {table_name}" + self.cursor.execute(query) + return self.cursor.fetchall() + + def modify_value(self, table_name, column_name, new_value): + query = f"UPDATE {table_name} SET {column_name} = ?" + self.cursor.execute(query, (new_value,)) + self.connection.commit() + + def del_column(self, table_name, column_name): + query = f"ALTER TABLE {table_name} DROP COLUMN {column_name}" + self.cursor.execute(query) + self.connection.commit() + + def plugin_register(self, plugin_name, guild_id=None): + general_table_query = f"CREATE TABLE IF NOT EXISTS {plugin_name}_general (key TEXT PRIMARY KEY, value TEXT)" + self.cursor.execute(general_table_query) + self.connection.commit() + + if guild_id is not None: + guild_table_query = f"CREATE TABLE IF NOT EXISTS {plugin_name}_server_{guild_id} (key TEXT PRIMARY KEY, value TEXT)" + self.cursor.execute(guild_table_query) + self.connection.commit() + + def get_all_tables(self): + query = "SELECT name FROM sqlite_master WHERE type='table'" + self.cursor.execute(query) + tables = self.cursor.fetchall() + table_names = [table[0] for table in tables] + return table_names + + +#Api used mainly for plugins so getting uptime, loading, unloading, reloading plugins, getting status of plugins, get plugin info, stopping the bot, getting bot name and tag, getting cpm/commands per minute, get if there is web plugin, if there is web plugin register api, get if plugin supports web and so on.. class API: #Returns config.tomls content in a array. @@ -86,13 +151,15 @@ class API: - def __init__(self, config, bot, log, token): + def __init__(self, config, bot, log, token, dbapi): self.start_time = time.time() self.config = config self.bot = bot self.logger = log self.token = token self.guild_ids = config["bot"]["guild_ids"] + self.db_api = dbapi + #This is the most basic interface CLI wich is basically a comand line that appears when you launch the app it will have commands like stop, help, commands, cogs, load, unload and so on.. class CLI: @@ -213,7 +280,10 @@ async def stop(ctx): if __name__ == "__main__": - api = API(config, bot, log, token) + dbapi = DatabaseAPI("storage.db") + dbapi.__enter__() + api = API(config, bot, log, token, dbapi) + cli = CLI(api) bot.api = api @@ -313,19 +383,18 @@ if __name__ == "__main__": cli.register_command("unload", cli_unload, "Unloads a cog takes a cog name as a arg example: unload cogs.example") - #start Starts the bot itself. - def cli_start(self): - print("Starting the bot...") + #Get a table + def cli_table_get(self, table: str): + print(f"Getting {table} data...") try: - self.api.bot.run(self.api.token) + table_data = self.api.db_api.get_table(table) except Exception as e: - print(e) + print(f"Table {table} doesn't exist or it couldn't be reached. {e}") return 1 - else: - print("Bot started.") - return 0 - #cli.register_command("start", cli_start, "Starts the bot.") + print(table_data) + + cli.register_command("table_get", cli_table_get, "Gets a table by name from the storage.db file.") for x in config["bot"]["cogs"]: