mirror of
https://github.com/miloszowi/everyone-mention-telegram-bot.git
synced 2025-05-20 09:14:07 +00:00
Singleton mongo client, added mongosh easy enter command, better logging, added idle time to mongo connection
This commit is contained in:
parent
ea2fddff40
commit
9c8f5795f8
@ -22,7 +22,6 @@ services:
|
|||||||
- ./docker/config/app.env
|
- ./docker/config/app.env
|
||||||
volumes:
|
volumes:
|
||||||
- ./src:/src
|
- ./src:/src
|
||||||
- ./logs:/var/log/bot
|
|
||||||
ports:
|
ports:
|
||||||
- $APP_EXPOSED_PORT:$APP_INTERNAL_PORT
|
- $APP_EXPOSED_PORT:$APP_INTERNAL_PORT
|
||||||
depends_on:
|
depends_on:
|
||||||
|
8
docker/mongosh
Executable file
8
docker/mongosh
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [ -f docker/config/app.env ]
|
||||||
|
then
|
||||||
|
source docker/config/app.env
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker-compose exec database mongosh --port $MONGODB_PORT --host $MONGODB_HOSTNAME --username $MONGODB_USERNAME --password $MONGODB_PASSWORD --authenticationDatabase admin $MONGODB_DATABASE
|
5
docker/start
Executable file
5
docker/start
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
docker-compose stop
|
||||||
|
docker-compose up -d
|
||||||
|
docker logs -f $(docker-compose ps -q app) &> app.log &
|
@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
from urllib.parse import quote_plus
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
@ -8,10 +9,10 @@ BOT_TOKEN = os.environ['BOT_TOKEN']
|
|||||||
WEBHOOK_URL = os.environ['WEBHOOK_URL']
|
WEBHOOK_URL = os.environ['WEBHOOK_URL']
|
||||||
PORT = os.environ['PORT']
|
PORT = os.environ['PORT']
|
||||||
|
|
||||||
MONGODB_DATABASE = os.environ['MONGODB_DATABASE']
|
MONGO_DATABASE = os.environ['MONGODB_DATABASE']
|
||||||
MONGODB_USERNAME = os.environ['MONGODB_USERNAME']
|
MONGO_CONNECTION_STRING = "mongodb://%s:%s@%s:%s/%s?authSource=admin" % (
|
||||||
MONGODB_PASSWORD = os.environ['MONGODB_PASSWORD']
|
os.environ['MONGODB_USERNAME'], quote_plus(os.environ['MONGODB_PASSWORD']),
|
||||||
MONGODB_HOSTNAME = os.environ['MONGODB_HOSTNAME']
|
os.environ['MONGODB_HOSTNAME'], os.environ['MONGODB_PORT'], MONGO_DATABASE
|
||||||
MONGODB_PORT = os.environ['MONGODB_PORT']
|
)
|
||||||
|
|
||||||
BANNED_USERS = os.environ['BANNED_USERS'].split(',') or []
|
BANNED_USERS = os.environ['BANNED_USERS'].split(',') or []
|
||||||
|
@ -1,25 +1,25 @@
|
|||||||
from urllib.parse import quote_plus
|
from __future__ import annotations
|
||||||
|
|
||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
from pymongo.database import Database
|
from pymongo.database import Database
|
||||||
|
|
||||||
from config.envs import (MONGODB_DATABASE, MONGODB_HOSTNAME,
|
from config.envs import MONGO_CONNECTION_STRING, MONGO_DATABASE
|
||||||
MONGODB_PASSWORD, MONGODB_PORT,
|
from decorators.singleton import Singleton
|
||||||
MONGODB_USERNAME)
|
|
||||||
|
|
||||||
|
|
||||||
class Client:
|
class Client(metaclass=Singleton):
|
||||||
mongo_client: MongoClient
|
mongo_client: MongoClient
|
||||||
database: Database
|
database: Database
|
||||||
|
|
||||||
def __init__(self) -> None:
|
# allow only 10 minutes on idle, close connection after
|
||||||
uri = "mongodb://%s:%s@%s:%s/%s?authSource=admin" % (
|
max_idle_time: int = 10 * (60 * 1000)
|
||||||
MONGODB_USERNAME, quote_plus(MONGODB_PASSWORD),
|
|
||||||
MONGODB_HOSTNAME, MONGODB_PORT, MONGODB_DATABASE
|
|
||||||
)
|
|
||||||
|
|
||||||
self.mongo_client = MongoClient(uri)
|
def __init__(self) -> None:
|
||||||
self.database = self.mongo_client[MONGODB_DATABASE]
|
self.mongo_client = MongoClient(
|
||||||
|
MONGO_CONNECTION_STRING,
|
||||||
|
connect=False,
|
||||||
|
maxIdleTimeMS=self.max_idle_time
|
||||||
|
)
|
||||||
|
self.database = self.mongo_client[MONGO_DATABASE]
|
||||||
|
|
||||||
def insert_one(self, collection: str, data: dict) -> None:
|
def insert_one(self, collection: str, data: dict) -> None:
|
||||||
self.database.get_collection(collection).insert_one(data)
|
self.database.get_collection(collection).insert_one(data)
|
||||||
|
8
src/decorators/singleton.py
Normal file
8
src/decorators/singleton.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
class Singleton(type):
|
||||||
|
_instances: dict = {}
|
||||||
|
|
||||||
|
def __call__(cls, *args, **kwargs):
|
||||||
|
if cls not in cls._instances:
|
||||||
|
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
|
||||||
|
|
||||||
|
return cls._instances[cls]
|
@ -14,9 +14,6 @@ class Logger:
|
|||||||
main_logger: str = 'main-logger'
|
main_logger: str = 'main-logger'
|
||||||
main_logger_file: str = '/var/log/bot/app.log'
|
main_logger_file: str = '/var/log/bot/app.log'
|
||||||
|
|
||||||
# noinspection SpellCheckingInspection
|
|
||||||
formatter: logging.Formatter = logging.Formatter('%(asctime)s[%(levelname)s]: %(message)s')
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.configure(self.action_logger, self.action_logger_file, logging.INFO)
|
self.configure(self.action_logger, self.action_logger_file, logging.INFO)
|
||||||
self.configure(self.main_logger, self.main_logger_file, logging.ERROR)
|
self.configure(self.main_logger, self.main_logger_file, logging.ERROR)
|
||||||
@ -27,10 +24,13 @@ class Logger:
|
|||||||
os.makedirs(directory)
|
os.makedirs(directory)
|
||||||
|
|
||||||
logger = logging.getLogger(logger_name)
|
logger = logging.getLogger(logger_name)
|
||||||
|
logger.propagate = False
|
||||||
|
|
||||||
file_handler = logging.FileHandler(log_file, mode='w')
|
file_handler = logging.FileHandler(log_file, mode='w')
|
||||||
file_handler.setFormatter(self.formatter)
|
formatter = logging.Formatter('%(asctime)s [%(levelname)s]: %(message)s', datefmt='%H:%M:%S %Y/%m/%d')
|
||||||
|
file_handler.setFormatter(formatter)
|
||||||
stream_handler = logging.StreamHandler()
|
stream_handler = logging.StreamHandler()
|
||||||
stream_handler.setFormatter(self.formatter)
|
stream_handler.setFormatter(formatter)
|
||||||
|
|
||||||
logger.setLevel(level)
|
logger.setLevel(level)
|
||||||
logger.addHandler(file_handler)
|
logger.addHandler(file_handler)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user