heystreamer/app/database.py
Bashy 6ad661c220 Initial commit — BashyOverlay v1
Twitch stream event platform with OBS browser source overlay.

Features:
- Twitch OAuth login (streamer + mod access)
- EventSub WebSocket for subs, gift subs, bits, channel points, follows, raids
- Chat commands via tmi.js in the overlay
- Gap audio — tone plays on new chat message after silence, volume/pitch scale with gap length
- Self-hosted media library (upload sounds and videos)
- Action configuration — map any event to sound, video, or alert
- Per-action cooldowns, test button, enable/disable toggle
- Multiple actions per event (all matching actions fire)
- Activity log dashboard with EventSub connection status
- Layout editor — iframe-based WYSIWYG with drag handles, live style preview
- Custom CSS and custom JS injection into overlay
- Custom DOM events (bashyoverlay:sub, bashyoverlay:raid, etc.) for custom JS hooks
- deploy.sh — one-shot setup and launch script

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 23:48:35 +03:00

48 lines
1.2 KiB
Python

import os
from dotenv import load_dotenv
from sqlmodel import Session, SQLModel, create_engine, select
load_dotenv()
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./bashyoverlay.db")
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
def create_db() -> None:
SQLModel.metadata.create_all(engine)
def get_session():
with Session(engine) as session:
yield session
def get_settings():
from app.models import Settings
with Session(engine) as session:
s = session.exec(select(Settings)).first()
if not s:
s = Settings()
session.add(s)
session.commit()
session.refresh(s)
return s
def get_layout():
from app.models import OverlayLayout
with Session(engine) as session:
layout = session.exec(select(OverlayLayout)).first()
if not layout:
layout = OverlayLayout()
session.add(layout)
session.commit()
session.refresh(layout)
return layout
def get_admin_user():
from app.models import User
with Session(engine) as session:
return session.exec(select(User).where(User.is_admin == True)).first()