models.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from flask_sqlalchemy import SQLAlchemy
  2. from flask_login import UserMixin
  3. from datetime import datetime
  4. import json
  5. from extensions import db
  6. class User(UserMixin, db.Model):
  7. __tablename__ = 'users'
  8. id = db.Column(db.Integer, primary_key=True)
  9. discord_id = db.Column(db.String(50), unique=True, nullable=False)
  10. username = db.Column(db.String(100), nullable=False)
  11. minecraft_uuid = db.Column(db.String(36), unique=True, nullable=True)
  12. minecraft_username = db.Column(db.String(16), nullable=True)
  13. is_admin = db.Column(db.Boolean, default=False)
  14. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  15. class Event(db.Model):
  16. __tablename__ = 'events'
  17. id = db.Column(db.Integer, primary_key=True)
  18. event_type = db.Column(db.String(50), nullable=False) # CHAT, JOIN, QUIT, DEATH, TELEPORT
  19. player_uuid = db.Column(db.String(36), nullable=True)
  20. player_name = db.Column(db.String(16), nullable=True)
  21. content = db.Column(db.Text, nullable=True) # Chat message, death message, etc.
  22. location = db.Column(db.String(100), nullable=True) # Serialized location
  23. timestamp = db.Column(db.DateTime, default=datetime.utcnow)
  24. def to_dict(self):
  25. return {
  26. 'type': self.event_type,
  27. 'player': self.player_name,
  28. 'uuid': self.player_uuid,
  29. 'content': self.content,
  30. 'location': self.location,
  31. 'timestamp': self.timestamp.isoformat() if self.timestamp else None,
  32. 'inventory': json.loads(self.inventory.items) if self.inventory else None
  33. }
  34. class EventConfig(db.Model):
  35. __tablename__ = 'event_configs'
  36. event_name = db.Column(db.String(255), primary_key=True) # Full class name
  37. package_name = db.Column(db.String(255), nullable=False)
  38. is_enabled = db.Column(db.Boolean, default=True)
  39. class Inventory(db.Model):
  40. __tablename__ = 'inventories'
  41. id = db.Column(db.Integer, primary_key=True)
  42. event_id = db.Column(db.Integer, db.ForeignKey('events.id'), nullable=False)
  43. player_uuid = db.Column(db.String(36), nullable=False)
  44. items = db.Column(db.Text, nullable=False) # JSON serialized inventory
  45. timestamp = db.Column(db.DateTime, default=datetime.utcnow)
  46. event = db.relationship('Event', backref=db.backref('inventory', uselist=False))
  47. class Ticket(db.Model):
  48. __tablename__ = 'tickets'
  49. id = db.Column(db.Integer, primary_key=True)
  50. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) # Creator
  51. title = db.Column(db.String(200), nullable=False)
  52. description = db.Column(db.Text, nullable=False)
  53. status = db.Column(db.String(20), default='OPEN') # OPEN, CLOSED, IN_PROGRESS
  54. closing_reason = db.Column(db.Text, nullable=True)
  55. closed_by_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
  56. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  57. creator = db.relationship('User', backref='created_tickets', foreign_keys=[user_id])
  58. closed_by = db.relationship('User', foreign_keys=[closed_by_id])
  59. assignments = db.relationship('TicketAssignment', backref='ticket', cascade="all, delete-orphan")
  60. comments = db.relationship('TicketComment', backref='ticket', cascade="all, delete-orphan", order_by='TicketComment.created_at')
  61. class TicketAssignment(db.Model):
  62. __tablename__ = 'ticket_assignments'
  63. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
  64. ticket_id = db.Column(db.Integer, db.ForeignKey('tickets.id'), primary_key=True)
  65. assigned_at = db.Column(db.DateTime, default=datetime.utcnow)
  66. user = db.relationship('User', backref='assignments')
  67. class TicketComment(db.Model):
  68. __tablename__ = 'ticket_comments'
  69. id = db.Column(db.Integer, primary_key=True)
  70. ticket_id = db.Column(db.Integer, db.ForeignKey('tickets.id'), nullable=False)
  71. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
  72. content = db.Column(db.Text, nullable=False)
  73. is_hidden = db.Column(db.Boolean, default=False)
  74. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  75. user = db.relationship('User', backref='comments')
  76. class LinkCode(db.Model):
  77. __tablename__ = 'link_codes'
  78. id = db.Column(db.Integer, primary_key=True)
  79. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
  80. code = db.Column(db.String(10), unique=True, nullable=False)
  81. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  82. expires_at = db.Column(db.DateTime, nullable=False)
  83. user = db.relationship('User', backref=db.backref('link_code', uselist=False, cascade="all, delete-orphan"))
  84. class Application(db.Model):
  85. __tablename__ = 'applications'
  86. id = db.Column(db.Integer, primary_key=True)
  87. user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
  88. position = db.Column(db.String(50), nullable=False) # MODERATOR, DEVELOPER
  89. content = db.Column(db.Text, nullable=False)
  90. status = db.Column(db.String(20), default='PENDING') # PENDING, ACCEPTED, REJECTED
  91. created_at = db.Column(db.DateTime, default=datetime.utcnow)
  92. user = db.relationship('User', backref='applications')