events.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from flask_socketio import emit
  2. from extensions import socketio, db
  3. from models import Event, Inventory
  4. from flask import request
  5. import json
  6. from dateutil import parser
  7. from datetime import datetime
  8. @socketio.on('connect')
  9. def handle_connect():
  10. print('Client connected')
  11. emit('clear_events')
  12. # Send history
  13. try:
  14. recent_events = Event.query.order_by(Event.timestamp.desc()).limit(30).all()
  15. print(f"Sending history: {len(recent_events)} events")
  16. for event in reversed(recent_events):
  17. emit('game_event', event.to_dict())
  18. except Exception as e:
  19. print(f"Error sending history: {e}")
  20. @socketio.on('disconnect')
  21. def handle_disconnect():
  22. print('Client disconnected')
  23. @socketio.on('game_event')
  24. def handle_game_event(data):
  25. # data = {type: 'CHAT', player: 'Name', content: 'Message', ...}
  26. print(f"Received event: {data}")
  27. # Save to DB
  28. try:
  29. if not data.get('type'):
  30. print(f"Error: Missing event type in {data}")
  31. return
  32. event_timestamp = None
  33. if data.get('timestamp'):
  34. try:
  35. event_timestamp = parser.parse(data.get('timestamp'))
  36. except Exception as e:
  37. print(f"Error parsing timestamp: {e}")
  38. event_timestamp = datetime.utcnow()
  39. event = Event(
  40. event_type=data.get('type'),
  41. player_uuid=data.get('uuid'),
  42. player_name=data.get('player'),
  43. content=data.get('content'),
  44. location=data.get('location'),
  45. timestamp=event_timestamp or datetime.utcnow()
  46. )
  47. db.session.add(event)
  48. db.session.commit()
  49. print(f"Event saved to DB: {event.id}")
  50. # If inventory data is present, save it
  51. if 'inventory' in data:
  52. inventory = Inventory(
  53. event_id=event.id,
  54. player_uuid=data.get('uuid'),
  55. items=json.dumps(data.get('inventory'))
  56. )
  57. db.session.add(inventory)
  58. db.session.commit()
  59. print(f"Inventory saved for event {event.id}")
  60. except Exception as e:
  61. print(f"Error saving event to DB: {str(e)}")
  62. db.session.rollback()
  63. # Broadcast to admin dashboard
  64. print(f"Broadcasting event: {data}")
  65. emit('game_event', data, broadcast=True)
  66. @socketio.on("*")
  67. def handle_any_event(event, methods=None, data=None):
  68. if event not in ['connect', 'disconnect']:
  69. print(f"Server received event: {event} with data: {data}")