Files
WinDog/LibWinDog/Database.py

85 lines
2.1 KiB
Python
Executable File

# ==================================== #
# WinDog multi-purpose chatbot #
# Licensed under AGPLv3 by OctoSpacc #
# ==================================== #
from peewee import *
from LibWinDog.Types import *
Db = SqliteDatabase("./Data/Database.sqlite")
class BaseModel(Model):
class Meta:
database = Db
class EntitySettings(BaseModel):
language = CharField(null=True)
#country = ...
#timezone = ...
class Entity(BaseModel):
id = CharField(null=True)
id_hash = CharField()
settings = ForeignKeyField(EntitySettings, backref="entity", null=True)
class File(BaseModel):
path = CharField()
content = BlobField()
owner = ForeignKeyField(Entity, backref="files")
class Meta:
indexes = (
(('path', 'owner'), True),
)
#class BaseFilter(BaseModel):
# name = CharField(null=True)
# owner = ForeignKeyField(Entity, backref="filters")
#class ScriptFilter(BaseFilter):
# script = TextField()
#class StaticFilter(BaseFilter):
# response = TextField()
class Filter(BaseModel):
name = CharField(null=True)
trigger = CharField(null=True)
output = CharField(null=True)
owner = ForeignKeyField(Entity, backref="filters")
class Room(Entity):
pass
UserToRoomDeferred = DeferredThroughModel()
FilterToRoomDeferred = DeferredThroughModel()
class User(Entity):
rooms = ManyToManyField(Room, backref="users", through_model=UserToRoomDeferred)
class UserToRoom(BaseModel):
user = ForeignKeyField(User, backref="room_links")
room = ForeignKeyField(Room, backref="user_links")
class FilterToRoom(BaseModel):
filter = ForeignKeyField(Filter, backref="room_links")
room = ForeignKeyField(Room, backref="filter_links")
UserToRoomDeferred.set_model(UserToRoom)
FilterToRoomDeferred.set_model(FilterToRoom)
Db.create_tables([
EntitySettings, File, Filter,
User, Room,
FilterToRoom, UserToRoom,
], safe=True)
class UserSettingsData():
def __new__(cls, user_id:str=None) -> SafeNamespace:
settings = None
try:
settings = EntitySettings.select().join(User).where(User.id == user_id).dicts().get()
except EntitySettings.DoesNotExist:
pass
return SafeNamespace(**(settings or {}), _exists=bool(settings))