diff options
| author | user <user@node5.net> | 2025-02-08 20:49:16 +0100 |
|---|---|---|
| committer | user <user@node5.net> | 2025-02-08 20:49:16 +0100 |
| commit | 14de1a23248086371671fa45f4057fcd5bdd3205 (patch) | |
| tree | 23c99c2bb82f6f792a0077f46c3c696a76d5fa0f /src | |
| parent | 3b86282401dc213a143938cef9eed790e9f8c22d (diff) | |
Make DB & telegram optional
Diffstat (limited to 'src')
| -rw-r--r-- | src/blog_node5_net.py | 57 | ||||
| -rw-r--r-- | src/db_handler.py | 62 | ||||
| -rw-r--r-- | src/log.py | 37 | ||||
| -rw-r--r-- | src/telegram_handler.py | 28 |
4 files changed, 110 insertions, 74 deletions
diff --git a/src/blog_node5_net.py b/src/blog_node5_net.py index 16e2042..0b7b3de 100644 --- a/src/blog_node5_net.py +++ b/src/blog_node5_net.py @@ -11,43 +11,14 @@ import markdown import markupsafe import yaml +import log import article import db_handler import telegram_handler -class CustomFormatter(logging.Formatter): - grey = "\x1b[90;20m" - blue = "\x1b[34;20m" - yellow = "\x1b[33;20m" - red = "\x1b[31;20m" - bold_red = "\x1b[31;1m" - reset = "\x1b[0m" - format = "%(asctime)s,%(msecs)03d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s" - - FORMATS = { - logging.DEBUG: grey + format + reset, - logging.INFO: blue + format + reset, - logging.WARNING: yellow + format + reset, - logging.ERROR: red + format + reset, - logging.CRITICAL: bold_red + format + reset - } - - def format(self, record): - log_fmt = self.FORMATS.get(record.levelno) - formatter = logging.Formatter(log_fmt) - return formatter.format(record) - - -logger = logging.getLogger(__name__) -debug = os.environ.get('FLASK_DEBUG') == '1' -logger.setLevel(logging.DEBUG if debug else logging.WARNING) -logging.getLogger('werkzeug').setLevel(logging.DEBUG if debug else logging.WARNING) +logger = logging.getLogger(__name__) # Set the logger name, to the name of the module -stream_handler = logging.StreamHandler() -stream_handler.setFormatter(CustomFormatter()) -logger.root.addHandler(stream_handler) -logger.info(f"Debug: {'en' if debug else 'dis'}abled") with open(os.path.join('configs', 'config.yml'), 'r') as file: config = yaml.safe_load(file.read()) @@ -79,10 +50,28 @@ folders_by_url: typing.Dict[str, article.Folder] = {} articles_by_url: typing.Dict[str, article.Article] = {} +# DB init +try: + with open(os.path.join('configs', 'database.yml'), 'r') as file: + db_conf = yaml.safe_load(file.read()) + db: DBHandler = DBHandler(db_conf) +except FileNotFoundError as ex: + logger.warning("Database config - Not found, running without") + db = None + +# Telegram init +try: + with open(os.path.join('configs', 'telegram.yml'), 'r') as file: + telegram_conf = yaml.safe_load(file.read()) + telegram = telegram_handler.Telegram(telegram_conf) +except FileNotFoundError as ex: + logger.warning("Telegram config - Not found, running without") + + @app.context_processor # Always inject site title to all render_templates def inject_common(): args = { - 'comments': db_handler.get_comments(strip_trailing_slash(flask.request.path)), + 'comments': db.get_comments(strip_trailing_slash(flask.request.path)) if db else None, 'title': config['site_root_folder_path'], 'motd': random.choice(motd_list) } @@ -122,13 +111,13 @@ def post_comment(): notification_message += f'\n{key[0].upper()}{key[1:]}: {args.get(key)}' telegram_handler.send_message(notification_message) - db_handler.post_comment(**args) + db.post_comment(**args) return flask.redirect(flask.request.referrer) def view_folder(): path = flask.request.path - if path is not '/': + if path != '/': path = strip_trailing_slash(flask.request.path) folder = folders_by_url[path] return flask.render_template('folder.html', folder=folder) diff --git a/src/db_handler.py b/src/db_handler.py index a7740f7..cd40112 100644 --- a/src/db_handler.py +++ b/src/db_handler.py @@ -1,31 +1,41 @@ import os +import logging +from dataclasses import dataclass import psycopg import yaml -with open(os.path.join('configs', 'database.yml'), 'r') as file: - db_con_params = yaml.safe_load(file.read()) - - -def get_comments(url: str) -> list[dict]: - with psycopg.connect(**db_con_params, row_factory=psycopg.rows.dict_row) as conn: - with conn.cursor() as cur: - cur.execute( - "SELECT id, comment, page_url, visitor_url, nickname, " - "(CASE WHEN show_contact THEN contact ELSE NULL END) as contact, created_at " - "FROM comment WHERE approved AND public AND page_url = %(url)s ORDER BY created_at DESC;", {'url': url}) - comments = cur.fetchall() - return comments - - -def post_comment(comment: str, page_url: str, visitor_url: str=None, nickname: str=None, contact: str=None, - show_contact: bool=True, public: bool=True): - with psycopg.connect(**db_con_params, row_factory=psycopg.rows.dict_row) as conn: - with conn.cursor() as cur: - cur.execute( - "INSERT INTO comment (comment, page_url, visitor_url, nickname, contact, show_contact, public)" - "VALUES (%(comment)s, %(page_url)s, %(visitor_url)s, %(nickname)s, %(contact)s, %(show_contact)s, " - "%(public)s);", - {'comment': comment, 'page_url': page_url, 'visitor_url': visitor_url, 'nickname': nickname, - 'contact': contact, 'show_contact': show_contact, 'public': public} - ) + +logger = logging.getLogger(__name__) # Set the logger name, to the name of the module + + +@dataclass +class DBHandler: + config: dict + + def conn_factory(self) -> psycopg.Connection: + conn: psycopg.Connection = psycopg.connect(**self.config, row_factory=psycopg.rows.dict_row) + return conn + + def get_comments(self, url: str) -> list[dict]: + with self.conn_factory() as conn: + with conn.cursor() as cur: + cur.execute( + "SELECT id, comment, page_url, visitor_url, nickname, " + "(CASE WHEN show_contact THEN contact ELSE NULL END) as contact, created_at " + "FROM comment WHERE approved AND public AND page_url = %(url)s ORDER BY created_at DESC;", {'url': url}) + comments = cur.fetchall() + return comments + + + def post_comment(self, comment: str, page_url: str, visitor_url: str=None, nickname: str=None, contact: str=None, + show_contact: bool=True, public: bool=True): + with self.conn_factory() as conn: + with conn.cursor() as cur: + cur.execute( + "INSERT INTO comment (comment, page_url, visitor_url, nickname, contact, show_contact, public)" + "VALUES (%(comment)s, %(page_url)s, %(visitor_url)s, %(nickname)s, %(contact)s, %(show_contact)s, " + "%(public)s);", + {'comment': comment, 'page_url': page_url, 'visitor_url': visitor_url, 'nickname': nickname, + 'contact': contact, 'show_contact': show_contact, 'public': public} + ) diff --git a/src/log.py b/src/log.py new file mode 100644 index 0000000..9e1b0a6 --- /dev/null +++ b/src/log.py @@ -0,0 +1,37 @@ +import os +import logging + + +class CustomFormatter(logging.Formatter): + grey = "\x1b[90;20m" + blue = "\x1b[34;20m" + yellow = "\x1b[33;20m" + red = "\x1b[31;20m" + bold_red = "\x1b[31;1m" + reset = "\x1b[0m" + format = "%(asctime)s,%(msecs)03d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s" + + FORMATS = { + logging.DEBUG: grey + format + reset, + logging.INFO: blue + format + reset, + logging.WARNING: yellow + format + reset, + logging.ERROR: red + format + reset, + logging.CRITICAL: bold_red + format + reset + } + + def format(self, record): + log_fmt = self.FORMATS.get(record.levelno) + formatter = logging.Formatter(log_fmt) + return formatter.format(record) + + +logger = logging.getLogger(__name__) +debug = os.environ.get('FLASK_DEBUG') == '1' +logger.setLevel(logging.DEBUG if debug else logging.WARNING) +logging.getLogger('werkzeug').setLevel(logging.DEBUG if debug else logging.WARNING) + +stream_handler = logging.StreamHandler() +stream_handler.setFormatter(CustomFormatter()) +logger.root.addHandler(stream_handler) +logger.info(f"Debug: {'en' if debug else 'dis'}abled") + diff --git a/src/telegram_handler.py b/src/telegram_handler.py index 0484e9b..6213445 100644 --- a/src/telegram_handler.py +++ b/src/telegram_handler.py @@ -4,24 +4,24 @@ import os import telegram import yaml -with open(os.path.join('configs', 'telegram.yml'), 'r') as file: - config = yaml.safe_load(file.read()) -bot = telegram.Bot(config['token']) +class Telegram: + def __init__(self, config: dict): + config: dict = config + bot = telegram.Bot(config['token']) + breakpoint() + asyncio.run(init_bot()) + def send_message(self, text): + asyncio.run(async_send_message(text)) -def send_message(text): - asyncio.run(async_send_message(text)) + async def async_send_message(self, text): + async with bot: + await bot.send_message(text=text, chat_id=config['chat_id']) -async def async_send_message(text): - async with bot: - await bot.send_message(text=text, chat_id=config['chat_id']) + async def init_bot(self): + async with bot: + print(await bot.get_me()) -async def init_bot(): - async with bot: - print(await bot.get_me()) - - -asyncio.run(init_bot()) |
