diff --git a/muck/models/dbref.py b/muck/models/dbref.py index afd3081..69d70db 100644 --- a/muck/models/dbref.py +++ b/muck/models/dbref.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, Enum as SQLEnum +from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, DateTime, JSON, Enum as SQLEnum, func from sqlalchemy.orm import relationship from crudkit.core.base import CRUDMixin, Base from enum import Enum @@ -10,18 +10,42 @@ class ObjectType(str, Enum): PLAYER = "player" PROGRAM = "program" +TYPE_SUFFIXES = { + ObjectType.ROOM: "R", + ObjectType.EXIT: "E", + ObjectType.PLAYER: "P", + ObjectType.PROGRAM: "F", + ObjectType.THING: "", +} + class Dbref(Base, CRUDMixin): __tablename__ = "dbref" type = Column(SQLEnum(ObjectType, name="object_type_enum"), nullable=False) name = Column(String, nullable=False) + props = Column(JSON, nullable=False, default={}) is_deleted = Column(Boolean, nullable=False, default=False) - owner_id = Column(Integer, ForeignKey("dbref.id")) - location_id = Column(Integer, ForeignKey("dbref.id")) + last_used = Column(DateTime, nullable=False, default=func.now()) + use_count = Column(Integer, nullable=False, default=0) - owner = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[owner_id]) - location = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[location_id]) + location_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) + location = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[location_id], back_populates="contents") + + contents = relationship("Dbref", backref="location", foreign_keys=location_id) + exits = relationship("Exit", backref="source", foreign_keys=location_id) + + owner_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) + owner = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[owner_id]) + + creator_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) + creator = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[creator_id]) + + modifier_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) + modifier = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[modifier_id]) + + last_user_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) + last_user = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[last_user_id]) __mapper_args__ = { "polymorphic_on": type, @@ -29,11 +53,19 @@ class Dbref(Base, CRUDMixin): } def __str__(self): - return f"#{self.id} ({self.type}): {self.name}" + suffix = TYPE_SUFFIXES.get(self.type, "") + return f"#{self.id}{suffix}" + + def __repr__(self): + suffix = TYPE_SUFFIXES.get(self.type, "") + return f"" def is_type(self, *types: ObjectType) -> bool: return self.type in types + def display_type(self) -> str: + return self.type.value.upper() + @property def is_room(self): return self.is_type(ObjectType.ROOM) diff --git a/muck/models/exit.py b/muck/models/exit.py index 93acc66..a222bdc 100644 --- a/muck/models/exit.py +++ b/muck/models/exit.py @@ -1,6 +1,18 @@ +from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy.orm import relationship + +from crudkit.core.base import CRUDMixin + from muck.models.dbref import Dbref, ObjectType class Exit(Dbref): + __tablename__ = "exits" + + id = Column(Integer, ForeignKey("dbref.id"), primary_key=True) + + destination_id = Column(Integer, ForeignKey("dbref.id"), nullable=True) + destination = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[destination_id]) + __mapper_args__ = { "polymorphic_identity": ObjectType.EXIT } diff --git a/muck/models/player.py b/muck/models/player.py index 94d6f84..99a3b22 100644 --- a/muck/models/player.py +++ b/muck/models/player.py @@ -1,6 +1,26 @@ +from sqlalchemy import Column, Integer, Boolean, String, ForeignKey +from sqlalchemy.orm import relationship + +from crudkit.core.base import CRUDMixin + from muck.models.dbref import Dbref, ObjectType class Player(Dbref): + __tablename__ = "players" + + id = Column(Integer, ForeignKey("dbref.id"), primary_key=True) + + pennies = Column(Integer, nullable=False, default=0) + insert_mode = Column(Boolean, nullable=False, default=False) + block = Column(Integer, nullable=True) + password = Column(String, nullable=False) + + home_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) + home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id]) + + current_program_id = Column(Integer, ForeignKey("dbref.id"), nullable=True) + current_program = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[current_program_id]) + __mapper_args__ = { "polymorphic_identity": ObjectType.PLAYER } diff --git a/muck/models/program.py b/muck/models/program.py index 88e9403..b6f375f 100644 --- a/muck/models/program.py +++ b/muck/models/program.py @@ -1,6 +1,12 @@ +from sqlalchemy import Column, Integer, ForeignKey + from muck.models.dbref import Dbref, ObjectType class Program(Dbref): + __tablename__ = "programs" + + id = Column(Integer, ForeignKey("dbref.id"), primary_key=True) + __mapper_args__ = { "polymorphic_identity": ObjectType.PROGRAM } diff --git a/muck/models/room.py b/muck/models/room.py index 4de1232..49d5469 100644 --- a/muck/models/room.py +++ b/muck/models/room.py @@ -1,6 +1,18 @@ +from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy.orm import relationship + +from crudkit.core.base import CRUDMixin + from muck.models.dbref import Dbref, ObjectType class Room(Dbref): + __tablename__ = "rooms" + + id = Column(Integer, ForeignKey("dbref.id"), primary_key=True) + + dropto_id = Column(Integer, ForeignKey("dbref.id"), nullable=True) + dropto = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[dropto_id]) + __mapper_args__ = { "polymorphic_identity": ObjectType.ROOM } diff --git a/muck/models/thing.py b/muck/models/thing.py index 3f5815a..1725208 100644 --- a/muck/models/thing.py +++ b/muck/models/thing.py @@ -1,6 +1,20 @@ +from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy.orm import relationship + +from crudkit.core.base import CRUDMixin + from muck.models.dbref import Dbref, ObjectType class Thing(Dbref): + __tablename__ = "things" + + id = Column(Integer, ForeignKey("dbref.id"), primary_key=True) + + value = Column(Integer, nullable=False, default=0) + + home_id = Column(Integer, ForeignKey("dbref.id"), nullable=False) + home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id]) + __mapper_args__ = { "polymorphic_identity": ObjectType.THING }