aboutsummaryrefslogtreecommitdiff
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
parent3b86282401dc213a143938cef9eed790e9f8c22d (diff)
Make DB & telegram optional
-rw-r--r--blog.node5.net/templates/base.html2
-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
5 files changed, 111 insertions, 75 deletions
diff --git a/blog.node5.net/templates/base.html b/blog.node5.net/templates/base.html
index fccbeb1..edcdbf9 100644
--- a/blog.node5.net/templates/base.html
+++ b/blog.node5.net/templates/base.html
@@ -48,7 +48,7 @@
<input type="submit" value="Post comment" /> <small>(Will await approval before becoming public)</small>
</form>
<br>
- {% if comments|length > 0 %}
+ {% if comments and comments|length > 0 %}
<h3>
ID <span class="dark-grey">|</span>
Nickname <span class="dark-grey">|</span>
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())