Files
ELM/src/elm/__init__.py
T
2026-08-24 16:51:05 +00:00

110 lines
4.3 KiB
Python

from __future__ import annotations
import logging
import tracemalloc
from pathlib import Path
from uuid import uuid4
from from_root import from_root
from rio import App, Theme, Color, Font, Icon, Session
from elm.components.RootComponent import RootComponent
from elm.services import ConfigurationService, DatabaseService, UserService, LocalData, LocalDataService, MailingService, AccountingService, PreloadService, ReceiptPrintingService, MemoryService
from elm.types import UserSession
logger = logging.getLogger("ELM")
logger.setLevel(logging.DEBUG)
theme = Theme.from_colors(
primary_color=Color.from_hex("02DAC5"),
secondary_color=Color.from_hex("018786"),
neutral_color=Color.from_hex("0D1117"),
background_color=Color.from_hex("0D1117"),
hud_color=Color.from_hex("003736"),
text_color=Color.from_hex("b9ccb2"),
mode="dark",
corner_radius_small=0,
corner_radius_medium=0,
corner_radius_large=0,
font=Font(
regular=from_root("src/elm/assets/PixelOperatorMono8.ttf"),
bold=from_root("src/elm/assets/PixelOperatorMono8-Bold.ttf")
)
)
theme.primary_color_darker = Color.from_hex("008679")
theme.primary_color_dark = Color.from_hex("003731")
theme.danger_color_dark = Color.from_hex("7f1b15")
theme.box_color = Color.from_hex("181c22")
theme.box_border_color = Color.from_hex("354333")
theme.header_box_background_color = Color.from_hex("30343b")
theme.text_color = Color.from_hex("b9ccb2")
theme.MAX_MOBILE_SCREEN_WIDTH = 28
Icon.register_single_icon(
icon_source=from_root("src/elm/assets/custom_icons/ts3.svg"),
set_name="custom",
icon_name="ts3"
)
configuration_service = ConfigurationService(from_root("config.toml"))
database_service = DatabaseService(configuration_service.get_database_configuration())
mailing_service = MailingService(configuration_service)
lan_info = configuration_service.get_lan_info()
tracemalloc_enabled = configuration_service.TRACEMALLOC_ENABLED
if tracemalloc_enabled:
tracemalloc.start(10)
memory_service = MemoryService(tracemalloc_enabled)
def is_mobile(self: Session) -> bool:
return self.screen_width < self.theme.MAX_MOBILE_SCREEN_WIDTH
Session.is_mobile = is_mobile
async def on_session_start(session: Session) -> None:
if configuration_service.DEV_MODE_ACTIVE:
# Use this line to fake being any user without having to log in
dev_user = await session[UserService].get_user("Typhus")
if not dev_user:
logger.fatal("DEV MODE USER DOES NOT EXIST")
exit(1)
session.attach(UserSession(id=uuid4(), user_name=dev_user.user_name, is_team_member=True, profile_picture=dev_user.user_picture))
await session.set_title(f"{lan_info.name} - {lan_info.iteration}")
if session[LocalData].stored_session_token:
user_session = session[LocalDataService].verify_token(session[LocalData].stored_session_token)
if user_session is not None:
session.attach(user_session)
async def on_app_start(a: App) -> None:
logger.info("Initializing mongodb...")
await a.default_attachments[2].initialize()
app = App(
name="elm",
theme=theme,
assets_dir=Path(__file__).parent / "assets",
build=RootComponent,
default_attachments=[LocalData(), configuration_service, database_service, UserService(), LocalDataService(), mailing_service, AccountingService(configuration_service, mailing_service), PreloadService(), ReceiptPrintingService(configuration_service.get_receipt_printing_configuration(), configuration_service.DEV_MODE_ACTIVE), memory_service],
on_app_start=on_app_start,
on_session_start=on_session_start,
icon=from_root("src/elm/assets/img/favicon.png"),
meta_tags={
"robots": "INDEX,FOLLOW",
"description": f"Info und Verwaltungs-Seite der LAN Party '{lan_info.name} - {lan_info.iteration}'.",
"og:description": f"Info und Verwaltungs-Seite der LAN Party '{lan_info.name} - {lan_info.iteration}'.",
"keywords": "Gaming, Clan, Guild, Verein, Club, Einfach, Zocken, Gesellschaft, Videospiele, "
"Videogames, LAN, Party, EZ, EZGG, LAN, Manager",
"author": "David Rodenkirchen",
"publisher": "EZ GG e.V.",
"copyright": "EZ GG e.V.",
"audience": "Alle",
"page-type": "Management Application",
"page-topic": "LAN Party",
"expires": "",
"revisit-after": "2 days"
}
)