Add admina base

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2023-03-28 20:42:53 +03:00
parent 53e48f6012
commit aef5a27d02
13 changed files with 404 additions and 89 deletions

59
src/main.py Normal file
View File

@@ -0,0 +1,59 @@
import fbchat
from message import handle_message
from util.logger import logger
import atexit
from blinker import Signal
from threading import Thread
from os import environ
def on_event(sender, session, event):
match sender:
case fbchat.MessageEvent:
Thread(target=handle_message, args=(
sender, session, event)).start()
case _:
logger.debug("Ignoring event: %s", event)
def main():
email = environ.get("FB_EMAIL")
password = environ.get("FB_PASSWORD")
cookie_path = environ.get("FB_COOKIE_PATH") or "session.json"
if not email or not password:
raise ValueError("FB_EMAIL and FB_PASSWORD must be set")
try:
logger.info("Loading cookies from %s", cookie_path)
session = fbchat.Session.from_file(cookie_path)
except (FileNotFoundError, fbchat.FacebookError):
logger.warning("Failed to load cookies from %s", cookie_path)
logger.info("Logging in with email and password")
session = fbchat.Session.login(
email, password, on_2fa_callback=lambda: input("Input 2FA code: ")
)
session.to_file(cookie_path)
logger.info("Saved cookies to %s", cookie_path)
finally:
if session.is_logged_in():
logger.info("Logged in as %s", session.user.id)
else:
raise ValueError("Failed to log in")
atexit.register(lambda: session.to_file(cookie_path))
listener = fbchat.Listener(
session=session, chat_on=False, foreground=False)
events = Signal()
events.connect(on_event)
for event in listener.listen():
events.send(type(event), session=session, event=event)
if __name__ == "__main__":
main()

8
src/message.py Normal file
View File

@@ -0,0 +1,8 @@
import fbchat
from util.logger import logger
from util.database import database
from util.session import session
def handle_message(_, event: fbchat.MessageEvent):
logger.info("Received message from %s: %s", event.author.id, event.text)

15
src/util/database.py Normal file
View File

@@ -0,0 +1,15 @@
import pymongo
from os import environ
MONGO_HOST = environ.get("MONGO_HOST")
MONGO_PORT = environ.get("MONGO_PORT")
MONGO_USERNAME = environ.get("MONGO_USERNAME")
MONGO_PASSWORD = environ.get("MONGO_PASSWORD")
MONGO_DATABASE = environ.get("MONGO_DATABASE")
if not MONGO_HOST or not MONGO_PORT or not MONGO_USERNAME or not MONGO_PASSWORD or not MONGO_DATABASE:
raise ValueError(
"MONGO_HOST, MONGO_PORT, MONGO_USERNAME, MONGO_PASSWORD and MONGO_DATABASE must be set")
database = pymongo.MongoClient(MONGO_HOST, int(
MONGO_PORT), username=MONGO_USERNAME, password=MONGO_PASSWORD, authSource=MONGO_DATABASE)[MONGO_DATABASE].client

29
src/util/logger.py Normal file
View File

@@ -0,0 +1,29 @@
import sys
import logging.config
import logging.handlers
def handle_exception(exception_type, exception, traceback):
logger.error(
"Uncaught exception",
exc_info=(exception_type, exception, traceback),
)
sys.excepthook = handle_exception
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
'%(asctime)s:%(levelname)s:%(name)s:%(module)s:%(funcName)s:%(lineno)s:%(message)s')
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
file_handler = logging.FileHandler('output.log')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

33
src/util/session.py Normal file
View File

@@ -0,0 +1,33 @@
import fbchat
from util.logger import logger
import atexit
from os import environ
FB_EMAIL = environ.get("FB_EMAIL")
FB_PASSWORD = environ.get("FB_PASSWORD")
FB_COOKIE_PATH = environ.get("FB_COOKIE_PATH") or "session.json"
if not FB_EMAIL or not FB_PASSWORD:
raise ValueError("FB_EMAIL and FB_PASSWORD must be set")
try:
logger.info("Loading cookies from %s", FB_COOKIE_PATH)
session = fbchat.Session.from_file(FB_COOKIE_PATH)
except (FileNotFoundError, fbchat.FacebookError):
logger.warning("Failed to load cookies from %s", FB_COOKIE_PATH)
logger.info("Logging in with email and password")
session = fbchat.Session.login(
FB_EMAIL, FB_PASSWORD, on_2fa_callback=lambda: input(
"Input 2FA code: ")
)
session.session.to_file(FB_COOKIE_PATH)
logger.info("Saved cookies to %s", FB_COOKIE_PATH)
finally:
if session.is_logged_in():
logger.info("Logged in as %s", session.user.id)
else:
raise ValueError("Failed to log in")
atexit.register(lambda: session.to_file(FB_COOKIE_PATH))