re-org and db views
This commit is contained in:
parent
9f2b2e7be2
commit
7c6493cea8
10 changed files with 160 additions and 27 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -4,5 +4,5 @@ __pycache__/
|
||||||
.idea
|
.idea
|
||||||
config/config.ini
|
config/config.ini
|
||||||
config/*.log*
|
config/*.log*
|
||||||
config/sqlite.db
|
config/sqlite*
|
||||||
.DS_STORE
|
.DS_STORE
|
2
main.py
2
main.py
|
@ -1,4 +1,4 @@
|
||||||
from src.bot import run
|
from src import run
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -6,7 +6,7 @@ from alembic import command
|
||||||
from alembic.config import Config
|
from alembic.config import Config
|
||||||
from dateutil import tz
|
from dateutil import tz
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session, joinedload
|
||||||
from sqlalchemy_utils import database_exists
|
from sqlalchemy_utils import database_exists
|
||||||
|
|
||||||
from .log import get_logger
|
from .log import get_logger
|
||||||
|
@ -17,11 +17,7 @@ engine = sqlalchemy.create_engine(f"{os.getenv('BOT_DB_URL', 'sqlite:///./config
|
||||||
engine.connect()
|
engine.connect()
|
||||||
|
|
||||||
|
|
||||||
def create_engine(db_url: str):
|
def run_db_migrations(script_location: str, db_url: str) -> None:
|
||||||
return engine
|
|
||||||
|
|
||||||
|
|
||||||
def run_migrations(script_location: str, db_url: str) -> None:
|
|
||||||
logger.debug('Running DB migrations in %r on %r', script_location, db_url)
|
logger.debug('Running DB migrations in %r on %r', script_location, db_url)
|
||||||
alembic_cfg = Config()
|
alembic_cfg = Config()
|
||||||
alembic_cfg.set_main_option('script_location', script_location)
|
alembic_cfg.set_main_option('script_location', script_location)
|
||||||
|
@ -30,10 +26,9 @@ def run_migrations(script_location: str, db_url: str) -> None:
|
||||||
if not database_exists(db_url):
|
if not database_exists(db_url):
|
||||||
logger.debug(f"'{db_url}' does not exist. Running normal migration to create db and tables." )
|
logger.debug(f"'{db_url}' does not exist. Running normal migration to create db and tables." )
|
||||||
command.upgrade(alembic_cfg, 'head')
|
command.upgrade(alembic_cfg, 'head')
|
||||||
if database_exists(db_url):
|
elif database_exists(db_url):
|
||||||
logger.debug(f"'{db_url} exists.")
|
logger.debug(f"'{db_url}' exists.")
|
||||||
e = create_engine(db_url)
|
insp = sqlalchemy.inspect(engine)
|
||||||
insp = sqlalchemy.inspect(e)
|
|
||||||
alembic_version_table_name = 'alembic_version'
|
alembic_version_table_name = 'alembic_version'
|
||||||
has_alembic_table = insp.has_table(alembic_version_table_name)
|
has_alembic_table = insp.has_table(alembic_version_table_name)
|
||||||
if has_alembic_table:
|
if has_alembic_table:
|
||||||
|
@ -49,6 +44,11 @@ def run_migrations(script_location: str, db_url: str) -> None:
|
||||||
|
|
||||||
class NotificationHelper:
|
class NotificationHelper:
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls):
|
||||||
|
with Session(engine) as session:
|
||||||
|
return session.query(TableNotification).order_by(TableNotification.created_at.desc()).all()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def insert(cls, type_of_error, message, medium, success):
|
def insert(cls, type_of_error, message, medium, success):
|
||||||
with Session(engine) as session:
|
with Session(engine) as session:
|
||||||
|
@ -89,6 +89,11 @@ class NotificationHelper:
|
||||||
|
|
||||||
class GiveawayHelper:
|
class GiveawayHelper:
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls):
|
||||||
|
with Session(engine) as session:
|
||||||
|
return session.query(TableGiveaway).options(joinedload('steam_item')).order_by(TableGiveaway.giveaway_ended_at.desc()).all()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def unix_timestamp_to_utc_datetime(cls, timestamp):
|
def unix_timestamp_to_utc_datetime(cls, timestamp):
|
||||||
return datetime.utcfromtimestamp(timestamp)
|
return datetime.utcfromtimestamp(timestamp)
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import os
|
import os
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
from .log import get_logger
|
from src.bot.log import get_logger
|
||||||
from .config_reader import ConfigReader, ConfigException
|
from src.bot.config_reader import ConfigReader, ConfigException
|
||||||
from .enter_giveaways import SteamGiftsException
|
from src.bot.enter_giveaways import SteamGiftsException
|
||||||
from .giveaway_thread import GiveawayThread
|
from src.bot.giveaway_thread import GiveawayThread
|
||||||
from .notification import Notification
|
from src.bot.notification import Notification
|
||||||
from .database import run_migrations, create_engine
|
from src.bot.database import run_db_migrations
|
||||||
from .webserver_thread import WebServerThread
|
from src.web.webserver_thread import WebServerThread
|
||||||
|
|
||||||
logger = get_logger(__name__)
|
logger = get_logger(__name__)
|
||||||
config_file_name = f"{os.getenv('BOT_CONFIG_DIR', './config')}/config.ini"
|
config_file_name = f"{os.getenv('BOT_CONFIG_DIR', './config')}/config.ini"
|
||||||
|
@ -73,9 +73,9 @@ def entry():
|
||||||
|___/
|
|___/
|
||||||
-------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------
|
||||||
""")
|
""")
|
||||||
run_migrations(alembic_migration_files, db_url)
|
run_db_migrations(alembic_migration_files, db_url)
|
||||||
create_engine(db_url)
|
|
||||||
run()
|
run()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
entry()
|
entry()
|
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Steamgifts Bot Configuration</title>
|
<title>{{name}} Steamgifts Bot Configuration</title>
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -13,6 +13,8 @@
|
||||||
<li><a href="{{ url_for('config') }}">Config</a></li>
|
<li><a href="{{ url_for('config') }}">Config</a></li>
|
||||||
<li><a href="{{ url_for('log_info') }}">Info Logs</a></li>
|
<li><a href="{{ url_for('log_info') }}">Info Logs</a></li>
|
||||||
<li><a href="{{ url_for('log_debug') }}">Debug Logs</a></li>
|
<li><a href="{{ url_for('log_debug') }}">Debug Logs</a></li>
|
||||||
|
<li><a href="{{ url_for('db_giveaways') }}">Giveaways</a></li>
|
||||||
|
<li><a href="{{ url_for('db_notifications') }}">Notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav></strong>
|
</nav></strong>
|
||||||
</div>
|
</div>
|
63
src/web/templates/giveaways.html
Normal file
63
src/web/templates/giveaways.html
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{{name}} Steamgifts Bot DB View</title>
|
||||||
|
<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="logo">Steamgifts Bot</h1>
|
||||||
|
<strong>
|
||||||
|
<nav>
|
||||||
|
<ul class="menu">
|
||||||
|
<li><a href="{{ url_for('config') }}">Config</a></li>
|
||||||
|
<li><a href="{{ url_for('log_info') }}">Info Logs</a></li>
|
||||||
|
<li><a href="{{ url_for('log_debug') }}">Debug Logs</a></li>
|
||||||
|
<li><a href="{{ url_for('db_giveaways') }}">Giveaways</a></li>
|
||||||
|
<li><a href="{{ url_for('db_notifications') }}">Notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</strong>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Giveaway ID</th>
|
||||||
|
<th>Steam ID</th>
|
||||||
|
<th>Giveaway URI</th>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Steam URL</th>
|
||||||
|
<th>User</th>
|
||||||
|
<th>Giveaway Created At</th>
|
||||||
|
<th>Giveaway Ended At</th>
|
||||||
|
<th>Cost</th>
|
||||||
|
<th>Copies</th>
|
||||||
|
<th>Contributor Level</th>
|
||||||
|
<th>Entered</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for row in content %}
|
||||||
|
<tr>
|
||||||
|
<td>{{row.giveaway_id}}</td>
|
||||||
|
<td>{{row.steam_id}}</td>
|
||||||
|
<td>{{row.giveaway_uri}}</td>
|
||||||
|
<td>{{row.steam_item.game_name}}</td>
|
||||||
|
<td>{{row.steam_item.steam_url}}</td>
|
||||||
|
<td>{{row.user}}</td>
|
||||||
|
<td>{{row.giveaway_created_at}}</td>
|
||||||
|
<td>{{row.giveaway_ended_at}}</td>
|
||||||
|
<td>{{row.cost}}</td>
|
||||||
|
<td>{{row.copies}}</td>
|
||||||
|
<td>{{row.contributor_level}}</td>
|
||||||
|
<td>{{row.entered}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Steamgifts Bot Logs</title>
|
<title>{{name}} Steamgifts Bot {{log_type}} Logs</title>
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -13,6 +13,8 @@
|
||||||
<li><a href="{{ url_for('config') }}">Config</a></li>
|
<li><a href="{{ url_for('config') }}">Config</a></li>
|
||||||
<li><a href="{{ url_for('log_info') }}">Info Logs</a></li>
|
<li><a href="{{ url_for('log_info') }}">Info Logs</a></li>
|
||||||
<li><a href="{{ url_for('log_debug') }}">Debug Logs</a></li>
|
<li><a href="{{ url_for('log_debug') }}">Debug Logs</a></li>
|
||||||
|
<li><a href="{{ url_for('db_giveaways') }}">Giveaways</a></li>
|
||||||
|
<li><a href="{{ url_for('db_notifications') }}">Notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav></strong>
|
</nav></strong>
|
||||||
</div>
|
</div>
|
51
src/web/templates/notifications.html
Normal file
51
src/web/templates/notifications.html
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>{{name}} Steamgifts Bot DB View</title>
|
||||||
|
<link href="{{ url_for('static', filename='css/main.css') }}" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="logo">Steamgifts Bot</h1>
|
||||||
|
<strong>
|
||||||
|
<nav>
|
||||||
|
<ul class="menu">
|
||||||
|
<li><a href="{{ url_for('config') }}">Config</a></li>
|
||||||
|
<li><a href="{{ url_for('log_info') }}">Info Logs</a></li>
|
||||||
|
<li><a href="{{ url_for('log_debug') }}">Debug Logs</a></li>
|
||||||
|
<li><a href="{{ url_for('db_giveaways') }}">Giveaways</a></li>
|
||||||
|
<li><a href="{{ url_for('db_notifications') }}">Notifications</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</strong>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Medium</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Success</th>
|
||||||
|
<th>Created At</th>
|
||||||
|
<th>Message</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for row in content %}
|
||||||
|
<tr>
|
||||||
|
<td>{{row.id}}</td>
|
||||||
|
<td>{{row.medium}}</td>
|
||||||
|
<td>{{row.type}}</td>
|
||||||
|
<td>{{row.success}}</td>
|
||||||
|
<td>{{row.created_at}}</td>
|
||||||
|
<td>{{row.message}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -4,7 +4,8 @@ from threading import Thread
|
||||||
|
|
||||||
from flask_basicauth import BasicAuth
|
from flask_basicauth import BasicAuth
|
||||||
|
|
||||||
from .log import get_logger
|
from src.bot.database import NotificationHelper, GiveawayHelper
|
||||||
|
from src.bot.log import get_logger
|
||||||
|
|
||||||
logger = get_logger(__name__)
|
logger = get_logger(__name__)
|
||||||
|
|
||||||
|
@ -15,6 +16,7 @@ class WebServerThread(threading.Thread):
|
||||||
Thread.__init__(self)
|
Thread.__init__(self)
|
||||||
self.exc = None
|
self.exc = None
|
||||||
self.config = config
|
self.config = config
|
||||||
|
self.name = config['NOTIFICATIONS'].get('notification.prefix')
|
||||||
self.host = config['WEB'].get('web.host')
|
self.host = config['WEB'].get('web.host')
|
||||||
self.port = config['WEB'].getint('web.port')
|
self.port = config['WEB'].getint('web.port')
|
||||||
self.ssl = config['WEB'].getboolean('web.ssl')
|
self.ssl = config['WEB'].getboolean('web.ssl')
|
||||||
|
@ -41,24 +43,32 @@ class WebServerThread(threading.Thread):
|
||||||
def config():
|
def config():
|
||||||
with open(f"{os.getenv('BOT_CONFIG_DIR', './config')}/config.ini", 'r') as f:
|
with open(f"{os.getenv('BOT_CONFIG_DIR', './config')}/config.ini", 'r') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
return render_template('configuration.html', content=content)
|
return render_template('configuration.html', name=self.name, content=content)
|
||||||
|
|
||||||
@app.route(f"{self.app_root}log_info")
|
@app.route(f"{self.app_root}log_info")
|
||||||
def log_info():
|
def log_info():
|
||||||
with open(f"{os.getenv('BOT_CONFIG_DIR', './config')}/info.log", 'r') as f:
|
with open(f"{os.getenv('BOT_CONFIG_DIR', './config')}/info.log", 'r') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
return render_template('log.html', content=content)
|
return render_template('log.html', name=self.name, log_type='info', content=content)
|
||||||
|
|
||||||
@app.route(f"{self.app_root}log_debug")
|
@app.route(f"{self.app_root}log_debug")
|
||||||
def log_debug():
|
def log_debug():
|
||||||
with open(f"{os.getenv('BOT_CONFIG_DIR', './config')}/debug.log", 'r') as f:
|
with open(f"{os.getenv('BOT_CONFIG_DIR', './config')}/debug.log", 'r') as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
return render_template('log.html', content=content)
|
return render_template('log.html', name=self.name, log_type='debug', content=content)
|
||||||
|
|
||||||
@app.route(f"{self.app_root}alive")
|
@app.route(f"{self.app_root}alive")
|
||||||
def alive():
|
def alive():
|
||||||
return 'OK'
|
return 'OK'
|
||||||
|
|
||||||
|
@app.route(f"{self.app_root}notifications")
|
||||||
|
def db_notifications():
|
||||||
|
return render_template('notifications.html', content=NotificationHelper.get())
|
||||||
|
|
||||||
|
@app.route(f"{self.app_root}giveaways")
|
||||||
|
def db_giveaways():
|
||||||
|
return render_template('giveaways.html', content=GiveawayHelper.get())
|
||||||
|
|
||||||
if self.enabled:
|
if self.enabled:
|
||||||
logger.info("Webserver Enabled. Running")
|
logger.info("Webserver Enabled. Running")
|
||||||
if self.ssl:
|
if self.ssl:
|
Loading…
Reference in a new issue