diff --git a/.env_default b/.env_default new file mode 100644 index 0000000..c3c92fb --- /dev/null +++ b/.env_default @@ -0,0 +1,15 @@ +discord_token='token' +flask_port='5000' +imgflip_username='username' +imgflip_password='password' +openai.api_key='api_key' +upload_phixxy='False' +ftp_server='www.example.com' +ftp_username='username' +ftp_password='password' +ftp_public_html='/home/debian/www.example.com/' +stable_diffusion_ip='disabled' +stable_diffusion_port='7861' +stable_diffusion_user= +stable_diffusion_password= +eleven_labs='api-key' diff --git a/flask_templates/index.html b/flask_templates/index.html new file mode 100644 index 0000000..757eda7 --- /dev/null +++ b/flask_templates/index.html @@ -0,0 +1,73 @@ + + + + + + + + Sparkytron Config + + + +
+

Warning!

+

This information is stored in PLAIN TEXT in a .env file!

+
+ {% for key, value in key_value_pairs.items() %} +
+ +
+ +
+
+ {% endfor %} + + + + {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + {% endwith %} +
+
+ + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c94a3fc..6645a76 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,6 @@ psutil aiofiles inky wakeonlan -beautifulsoup4 \ No newline at end of file +beautifulsoup4 +Flask[async] +waitress \ No newline at end of file diff --git a/sparkytron_webui.py b/sparkytron_webui.py new file mode 100644 index 0000000..bb75e1e --- /dev/null +++ b/sparkytron_webui.py @@ -0,0 +1,26 @@ +import asyncio +import discord +import os +import subprocess +import sys +from dotenv import load_dotenv +from src.bot import bot +from src.webui import flask_app +from waitress import serve + +def get_flask_app(process): + flask_app.bot_process = process + flask_app.secret_key = "woaoaoahaowhawoiahoahhhhhh" + return flask_app + +def main(): + load_dotenv() + flask_port = os.getenv("flask_port") + if not flask_port: + flask_port = '5000' + process = subprocess.Popen([sys.executable, "sparkytron3000.py"]) + flask_app = get_flask_app(process) + serve(flask_app, host='0.0.0.0', port=flask_port) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/bot.py b/src/bot.py index 8c00b66..52cb604 100644 --- a/src/bot.py +++ b/src/bot.py @@ -10,7 +10,6 @@ intents.message_content = True bot = commands.Bot(command_prefix='!', intents=intents) logger = src.logger.logger_setup() - async def load_cogs(bot: commands.Bot, cog_path: str) -> None: for cog_file in os.listdir(cog_path): if cog_file[-3:] == '.py': @@ -27,6 +26,7 @@ async def on_ready(): await utils.delete_all_files("tmp/") await load_cogs(bot, 'cogs/') logger.info('We have logged in as {0.user}'.format(bot)) + print("If using the webui, visit http://localhost:5000 to change config!") except: logger.warning(f"Error in on_ready") @@ -43,4 +43,4 @@ async def on_message(ctx): except discord.ext.commands.errors.CommandNotFound: logger.info("Command not found.") except Exception as e: - logger.warning(f"Error processing commands: {e}") + logger.warning(f"Error processing commands: {e}") \ No newline at end of file diff --git a/src/webui.py b/src/webui.py new file mode 100644 index 0000000..a003068 --- /dev/null +++ b/src/webui.py @@ -0,0 +1,47 @@ +import logging +import os +import subprocess +import sys + +from flask import Flask, render_template, request, flash + +logger = logging.getLogger("bot") +flask_app = Flask(__name__, template_folder='../flask_templates') + +def read_env(filename): + if os.path.exists(filename): + with open(filename, 'r') as file: + key_value_pairs = {} + for line in file: + try: + key, value = line.strip().split('=') + key = key.strip() + value = value.strip()[1:-1] + key_value_pairs[key] = value + except: + print("This line isnt a kv pair") + return key_value_pairs + else: + return None + +@flask_app.route('/', methods=['GET', 'POST']) +async def index(): + key_value_pairs = read_env('.env') + if not key_value_pairs: + logger.warn("No .env file found! Copying defaults.") + key_value_pairs = read_env('.env_default') + form_dict = {} + if request.method == 'POST': + if key_value_pairs: + for form_name in key_value_pairs.keys(): + form_dict[form_name] = request.form[form_name] + with open('.env', 'w') as file: + for key, value in form_dict.items(): + file.write(f"{key}='{value}'\n") + print(form_dict) + flask_app.bot_process.terminate() + flask_app.bot_process = subprocess.Popen([sys.executable, "sparkytron3000.py"]) + message = "Variables Updated!" + flash(message) + return render_template('index.html', key_value_pairs = key_value_pairs) +