Holy moley is it hard to do MUCK stuff relationally.
This commit is contained in:
parent
c72417e5e4
commit
d9ed6d5cd7
8 changed files with 89 additions and 24 deletions
14
muck/app.py
Normal file
14
muck/app.py
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
from sqlalchemy import create_engine
|
||||||
|
from sqlalchemy.orm import sessionmaker, scoped_session
|
||||||
|
|
||||||
|
from muck.models.dbref import Base
|
||||||
|
from muck.init import bootstrap_world
|
||||||
|
|
||||||
|
engine = create_engine("sqlite:///muck.db", echo=True)
|
||||||
|
SessionLocal = scoped_session(sessionmaker(bind=engine))
|
||||||
|
|
||||||
|
Base.metadata.create_all(engine)
|
||||||
|
|
||||||
|
session = SessionLocal()
|
||||||
|
|
||||||
|
bootstrap_world(session)
|
||||||
3
muck/config.py
Normal file
3
muck/config.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
class Config:
|
||||||
|
DB_URI = "sqlite:///muck.db"
|
||||||
|
DB_TRACK_MODIFICATIONS = False
|
||||||
39
muck/init.py
Normal file
39
muck/init.py
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
from muck.models.room import Room
|
||||||
|
from muck.models.player import Player
|
||||||
|
|
||||||
|
def bootstrap_world(session):
|
||||||
|
if session.query(Room).first() or session.query(Player).first():
|
||||||
|
print("World already initialized.")
|
||||||
|
return
|
||||||
|
|
||||||
|
print("Bootstrapping world...")
|
||||||
|
|
||||||
|
room_zero = Room(
|
||||||
|
id=0,
|
||||||
|
name="Room Zero",
|
||||||
|
props={"_": {"de": "You are in Room Zero. It is very dark in here."}}
|
||||||
|
)
|
||||||
|
|
||||||
|
the_one = Player(
|
||||||
|
id=1,
|
||||||
|
name="One",
|
||||||
|
password="potrzebie",
|
||||||
|
props={"_": {"de": "You see The One."}}
|
||||||
|
)
|
||||||
|
|
||||||
|
the_one.location = room_zero
|
||||||
|
the_one.home = room_zero
|
||||||
|
|
||||||
|
the_one.creator = the_one
|
||||||
|
the_one.owner = the_one
|
||||||
|
the_one.modifier = the_one
|
||||||
|
the_one.last_user = the_one
|
||||||
|
|
||||||
|
room_zero.owner = the_one
|
||||||
|
room_zero.creator = the_one
|
||||||
|
room_zero.modifier = the_one
|
||||||
|
room_zero.last_user = the_one
|
||||||
|
|
||||||
|
session.add_all([room_zero, the_one])
|
||||||
|
session.commit()
|
||||||
|
print("World initialized.")
|
||||||
5
muck/models/__init__.py
Normal file
5
muck/models/__init__.py
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
from muck.models.dbref import Dbref
|
||||||
|
from muck.models.exit import Exit
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
|
Dbref.exits = relationship("Exit", back_populates="source", foreign_keys=[Exit.location_id])
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, DateTime, JSON, Enum as SQLEnum, func
|
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, DateTime, JSON, Enum as SQLEnum, func
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship, foreign, remote
|
||||||
from crudkit.core.base import CRUDMixin, Base
|
from crudkit.core.base import CRUDMixin, Base
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
|
|
@ -29,23 +29,22 @@ class Dbref(Base, CRUDMixin):
|
||||||
last_used = Column(DateTime, nullable=False, default=func.now())
|
last_used = Column(DateTime, nullable=False, default=func.now())
|
||||||
use_count = Column(Integer, nullable=False, default=0)
|
use_count = Column(Integer, nullable=False, default=0)
|
||||||
|
|
||||||
location_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
|
location_id = Column(Integer, ForeignKey("dbref.id"), nullable=True, default=0)
|
||||||
location = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[location_id], back_populates="contents")
|
location = relationship("Dbref", foreign_keys=[location_id], back_populates="contents", primaryjoin=lambda: foreign(Dbref.location_id) == remote(Dbref.id), remote_side=lambda: Dbref.id)
|
||||||
|
|
||||||
contents = relationship("Dbref", backref="location", foreign_keys=location_id)
|
contents = relationship("Dbref", foreign_keys=[location_id], back_populates="location")
|
||||||
exits = relationship("Exit", backref="source", foreign_keys=location_id)
|
|
||||||
|
|
||||||
owner_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
|
owner_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
owner = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[owner_id])
|
owner = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[owner_id], primaryjoin=lambda: Dbref.owner_id == remote(Dbref.id), post_update=True)
|
||||||
|
|
||||||
creator_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
|
creator_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
creator = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[creator_id])
|
creator = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[creator_id], primaryjoin=lambda: Dbref.creator_id == remote(Dbref.id), post_update=True)
|
||||||
|
|
||||||
modifier_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
|
modifier_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
modifier = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[modifier_id])
|
modifier = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[modifier_id], primaryjoin=lambda: Dbref.modifier_id == remote(Dbref.id), post_update=True)
|
||||||
|
|
||||||
last_user_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
|
last_user_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
last_user = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[last_user_id])
|
last_user = relationship("Player", remote_side=[CRUDMixin.id], foreign_keys=[last_user_id], primaryjoin=lambda: Dbref.last_user_id == remote(Dbref.id), post_update=True)
|
||||||
|
|
||||||
__mapper_args__ = {
|
__mapper_args__ = {
|
||||||
"polymorphic_on": type,
|
"polymorphic_on": type,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from sqlalchemy import Column, Integer, ForeignKey
|
from sqlalchemy import Column, Integer, ForeignKey
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship, foreign, remote
|
||||||
|
|
||||||
from crudkit.core.base import CRUDMixin
|
from crudkit.core.base import CRUDMixin
|
||||||
|
|
||||||
|
|
@ -11,8 +11,11 @@ class Exit(Dbref):
|
||||||
id = Column(Integer, ForeignKey("dbref.id"), primary_key=True)
|
id = Column(Integer, ForeignKey("dbref.id"), primary_key=True)
|
||||||
|
|
||||||
destination_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
destination_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
destination = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[destination_id])
|
destination = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[destination_id], primaryjoin=lambda: foreign(Exit.destination_id) == remote(Dbref.id))
|
||||||
|
|
||||||
|
source = relationship("Dbref", back_populates="exits", foreign_keys=[Dbref.location_id], remote_side=[Dbref.id])
|
||||||
|
|
||||||
__mapper_args__ = {
|
__mapper_args__ = {
|
||||||
"polymorphic_identity": ObjectType.EXIT
|
"polymorphic_identity": ObjectType.EXIT,
|
||||||
|
"inherit_condition": id == Dbref.id
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from sqlalchemy import Column, Integer, Boolean, String, ForeignKey
|
from sqlalchemy import Column, Integer, Boolean, String, ForeignKey
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship, foreign, remote
|
||||||
|
|
||||||
from crudkit.core.base import CRUDMixin
|
from crudkit.core.base import CRUDMixin
|
||||||
|
|
||||||
|
|
@ -15,12 +15,13 @@ class Player(Dbref):
|
||||||
block = Column(Integer, nullable=True)
|
block = Column(Integer, nullable=True)
|
||||||
password = Column(String, nullable=False)
|
password = Column(String, nullable=False)
|
||||||
|
|
||||||
home_id = Column(Integer, ForeignKey("dbref.id"), nullable=False)
|
home_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id])
|
home = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[home_id], primaryjoin=lambda: foreign(Player.home_id) == remote(Dbref.id))
|
||||||
|
|
||||||
current_program_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
current_program_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
current_program = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[current_program_id])
|
current_program = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[current_program_id], primaryjoin=lambda: foreign(Player.current_program_id) == remote(Dbref.id))
|
||||||
|
|
||||||
__mapper_args__ = {
|
__mapper_args__ = {
|
||||||
"polymorphic_identity": ObjectType.PLAYER
|
"polymorphic_identity": ObjectType.PLAYER,
|
||||||
|
"inherit_condition": id == Dbref.id
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from sqlalchemy import Column, Integer, ForeignKey
|
from sqlalchemy import Column, Integer, ForeignKey
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship, foreign, remote
|
||||||
|
|
||||||
from crudkit.core.base import CRUDMixin
|
from crudkit.core.base import CRUDMixin
|
||||||
|
|
||||||
|
|
@ -11,8 +11,9 @@ class Room(Dbref):
|
||||||
id = Column(Integer, ForeignKey("dbref.id"), primary_key=True)
|
id = Column(Integer, ForeignKey("dbref.id"), primary_key=True)
|
||||||
|
|
||||||
dropto_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
dropto_id = Column(Integer, ForeignKey("dbref.id"), nullable=True)
|
||||||
dropto = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[dropto_id])
|
dropto = relationship("Dbref", remote_side=[CRUDMixin.id], foreign_keys=[dropto_id], primaryjoin=lambda: foreign(Room.dropto_id) == remote(Dbref.id))
|
||||||
|
|
||||||
__mapper_args__ = {
|
__mapper_args__ = {
|
||||||
"polymorphic_identity": ObjectType.ROOM
|
"polymorphic_identity": ObjectType.ROOM,
|
||||||
|
"inherit_condition": id == Dbref.id
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue