You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
4.0 KiB
Python

import os
from typing import List
import sqlalchemy.engine
from sqlalchemy import String, create_engine, URL, Table, Column, ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, relationship, Session
from sqlalchemy.sql.expression import select
from sqlalchemy.testing.schema import mapped_column
from config.config import ConfigLoader
def get_engine() -> sqlalchemy.engine.Engine:
url_obj = URL.create(
"postgresql",
username=os.environ.get('POSTGRES_USER'),
password=os.environ.get('POSTGRES_PASSWORD'),
database=os.environ.get('POSTGRES_DB'),
host=ConfigLoader.get_config_loader().database_host,
port=ConfigLoader.get_config_loader().database_port
)
e = create_engine(url_obj)
return e
class Base(DeclarativeBase):
pass
mc_users_on_mc_server = Table(
"mc_users_on_mc_server",
Base.metadata,
Column("minecraft_user", ForeignKey("minecraft_users.uuid"), primary_key=True),
Column("minecraft_server", ForeignKey("minecraft_servers.domain"), primary_key=True)
)
class DiscordUser(Base):
__tablename__ = "discord_users"
snowflake_id: Mapped[str] = mapped_column(primary_key=True)
handle: Mapped[str] = mapped_column(String(32))
minecraft_user_uuid = mapped_column(ForeignKey("minecraft_users.uuid"))
def __repr__(self):
return f"User(snowflake_id={self.snowflake_id}, handle={self.handle})"
class MinecraftUser(Base):
__tablename__ = "minecraft_users"
uuid: Mapped[String] = mapped_column(String(32), primary_key=True)
user_name: Mapped[String] = mapped_column(String(16), primary_key=True)
#discord_user = mapped_column(ForeignKey("discord_users.snowflake_id"))
minecraft_servers: Mapped[List["MinecraftServer"]] = relationship(secondary=mc_users_on_mc_server, back_populates="minecraft_users")
def __repr__(self):
return f"MCUser(uuid={self.uuid}, user_name={self.user_name})"
class MinecraftServer(Base):
__tablename__ = "minecraft_servers"
domain: Mapped[str] = mapped_column(String(64), primary_key=True)
minecraft_users: Mapped[List["MinecraftUser"]] = relationship(secondary=mc_users_on_mc_server, back_populates="minecraft_servers")
def __repr__(self):
return f"MinecraftServer(domain={self.domain}, discord_user={self.discord_user})"
if __name__ == "__main__":
url_obj = URL.create(
"postgresql",
username=os.environ.get('POSTGRES_USER'),
password=os.environ.get('POSTGRES_PASSWORD'),
database=os.environ.get('POSTGRES_DB'),
host=ConfigLoader.get_config_loader().database_host,
port=ConfigLoader.get_config_loader().database_port
)
engine = create_engine(url_obj, echo=True)
with Session(engine) as session:
pass
#mc_server = MinecraftServer(domain="feather-mc.pandro.de")
#uuid = MinecraftAPI.get_uuid_from_user_name("Pandr0")
#mc_user = MinecraftUser(uuid=uuid,
# user_name="Pandr0"
# )
#disc_user = DiscordUser(snowflake_id="682326483921797146",
# handle="pandro_",
# minecraft_user_uuid=mc_user.uuid)
#stmt = update(mc_users_on_mc_server).where().values()
#session.execute(stmt)
#stmt = insert(mc_users_on_mc_server).values(minecraft_user=uuid, minecraft_server="feather-mc.pandro.de")
#session.execute(stmt)
#session.commit()
stmt = select(MinecraftUser).where(MinecraftUser.user_name == "Pandr0")
mc_user = session.execute(stmt).first()[0]
stmt = select(MinecraftServer).where(MinecraftServer.minecraft_users.any(MinecraftUser.user_name == "Pandr0")) # TODO figure out how to query minecraft servers with a given minecraft user
result = session.execute(stmt).all()
print(f"PG user: {os.environ.get('POSTGRES_USER')}")
#print(f"PG pw: {os.environ.get('POSTGRES_PASSWORD')}")
print(f"PG db: {os.environ.get('POSTGRES_DB')}")