about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authoruser <user@node5.net>2025-02-08 20:49:16 +0100
committeruser <user@node5.net>2025-02-08 20:49:16 +0100
commit14de1a23248086371671fa45f4057fcd5bdd3205 (patch)
tree23c99c2bb82f6f792a0077f46c3c696a76d5fa0f /src
parent3b86282401dc213a143938cef9eed790e9f8c22d (diff)
Make DB & telegram optional
Diffstat (limited to 'src')
-rw-r--r--src/blog_node5_net.py57
-rw-r--r--src/db_handler.py62
-rw-r--r--src/log.py37
-rw-r--r--src/telegram_handler.py28
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())