mike23415 commited on
Commit
e460795
·
verified ·
1 Parent(s): 9a3dc81

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -18
app.py CHANGED
@@ -739,6 +739,17 @@ def create_chat_room():
739
  room_id = str(uuid.uuid4())
740
  admin_session = str(uuid.uuid4())
741
 
 
 
 
 
 
 
 
 
 
 
 
742
  CHAT_ROOMS[room_id] = {
743
  "admin_session": admin_session,
744
  "created_at": time.time(),
@@ -749,16 +760,16 @@ def create_chat_room():
749
  "allow_files": allow_files,
750
  "burn_on_admin_exit": True
751
  },
 
752
  "active_sessions": {},
753
  "receiver_counter": 0
754
  }
755
 
756
-
757
-
758
- # Return only IDs - let frontend create URLs
759
  return jsonify({
760
  "room_id": room_id,
761
  "admin_session": admin_session,
 
762
  "expires_at": CHAT_ROOMS[room_id]["expires_at"]
763
  })
764
 
@@ -770,6 +781,8 @@ def join_chat_room(room_id):
770
  try:
771
  password = request.args.get("password", "")
772
  admin_session = request.args.get("admin", "")
 
 
773
 
774
  if room_id not in CHAT_ROOMS:
775
  return jsonify({"error": "Chat room not found"}), 404
@@ -784,23 +797,54 @@ def join_chat_room(room_id):
784
  if room["settings"]["password"] and password != room["settings"]["password"]:
785
  return jsonify({"error": "Wrong password"}), 403
786
 
787
- # FIXED: Proper role assignment
788
  if admin_session and admin_session == room["admin_session"]:
789
- # Only admin if the session matches the room's admin session
790
  role = "admin"
791
  session_id = admin_session
792
  receiver_number = None
793
- else:
794
- # Everyone else is a receiver
795
- active_receivers = sum(1 for s in room["active_sessions"].values() if s["role"] == "receiver")
796
- if active_receivers >= room["settings"]["max_receivers"]:
797
- return jsonify({"error": "Chat room is full"}), 403
798
-
799
- role = "receiver"
800
- session_id = str(uuid.uuid4())
801
- room["receiver_counter"] += 1
802
- receiver_number = room["receiver_counter"]
803
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
804
  return jsonify({
805
  "session_id": session_id,
806
  "role": role,
@@ -948,14 +992,14 @@ def handle_leave_chat(data):
948
  if session["role"] == "admin" and CHAT_ROOMS[room_id]["settings"]["burn_on_admin_exit"]:
949
  emit('room_closing', {'reason': 'Admin left the room'}, room=room_id)
950
  del CHAT_ROOMS[room_id]
951
- if room_id in CHAT_MESSAGES:
952
- del CHAT_MESSAGES[room_id]
953
  else:
 
954
  emit('user_left', {
 
955
  'role': session["role"],
956
  'receiver_number': session.get("receiver_number"),
957
  'active_count': len(CHAT_ROOMS[room_id]["active_sessions"])
958
- }, room=room_id)
959
 
960
  leave_room(room_id)
961
 
 
739
  room_id = str(uuid.uuid4())
740
  admin_session = str(uuid.uuid4())
741
 
742
+ # NEW: Generate individual receiver tokens
743
+ receiver_tokens = []
744
+ for i in range(max_receivers):
745
+ receiver_tokens.append({
746
+ "token": str(uuid.uuid4()),
747
+ "receiver_number": i + 1,
748
+ "claimed": False,
749
+ "device_uuid": None,
750
+ "claimed_at": None
751
+ })
752
+
753
  CHAT_ROOMS[room_id] = {
754
  "admin_session": admin_session,
755
  "created_at": time.time(),
 
760
  "allow_files": allow_files,
761
  "burn_on_admin_exit": True
762
  },
763
+ "receiver_tokens": receiver_tokens, # NEW!
764
  "active_sessions": {},
765
  "receiver_counter": 0
766
  }
767
 
768
+ # Return IDs + receiver tokens
 
 
769
  return jsonify({
770
  "room_id": room_id,
771
  "admin_session": admin_session,
772
+ "receiver_tokens": [{"token": t["token"], "receiver_number": t["receiver_number"]} for t in receiver_tokens],
773
  "expires_at": CHAT_ROOMS[room_id]["expires_at"]
774
  })
775
 
 
781
  try:
782
  password = request.args.get("password", "")
783
  admin_session = request.args.get("admin", "")
784
+ receiver_token = request.args.get("receiver", "") # NEW!
785
+ device_uuid = request.args.get("device_uuid", "") # NEW!
786
 
787
  if room_id not in CHAT_ROOMS:
788
  return jsonify({"error": "Chat room not found"}), 404
 
797
  if room["settings"]["password"] and password != room["settings"]["password"]:
798
  return jsonify({"error": "Wrong password"}), 403
799
 
800
+ # Admin join
801
  if admin_session and admin_session == room["admin_session"]:
 
802
  role = "admin"
803
  session_id = admin_session
804
  receiver_number = None
 
 
 
 
 
 
 
 
 
 
805
 
806
+ return jsonify({
807
+ "session_id": session_id,
808
+ "role": role,
809
+ "receiver_number": receiver_number,
810
+ "room_settings": room["settings"],
811
+ "expires_at": room["expires_at"]
812
+ })
813
+
814
+ # Receiver join with token
815
+ if not receiver_token or not device_uuid:
816
+ return jsonify({"error": "Receiver token and device UUID required"}), 400
817
+
818
+ # Find the token
819
+ token_data = None
820
+ for token in room["receiver_tokens"]:
821
+ if token["token"] == receiver_token:
822
+ token_data = token
823
+ break
824
+
825
+ if not token_data:
826
+ return jsonify({"error": "Invalid receiver token"}), 403
827
+
828
+ # Check if token already claimed by a different device
829
+ if token_data["claimed"]:
830
+ if token_data["device_uuid"] != device_uuid:
831
+ return jsonify({
832
+ "error": "This link has already been used on another device",
833
+ "claimed_at": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(token_data["claimed_at"]))
834
+ }), 403
835
+ # Same device rejoining - allow
836
+ print(f"[Rejoin] Device {device_uuid[:8]}... rejoining with token {receiver_token[:8]}...")
837
+ else:
838
+ # First time claim
839
+ token_data["claimed"] = True
840
+ token_data["device_uuid"] = device_uuid
841
+ token_data["claimed_at"] = time.time()
842
+ print(f"[Claim] Device {device_uuid[:8]}... claimed token {receiver_token[:8]}...")
843
+
844
+ role = "receiver"
845
+ session_id = str(uuid.uuid4())
846
+ receiver_number = token_data["receiver_number"]
847
+
848
  return jsonify({
849
  "session_id": session_id,
850
  "role": role,
 
992
  if session["role"] == "admin" and CHAT_ROOMS[room_id]["settings"]["burn_on_admin_exit"]:
993
  emit('room_closing', {'reason': 'Admin left the room'}, room=room_id)
994
  del CHAT_ROOMS[room_id]
 
 
995
  else:
996
+ # Notify everyone in the room (including self, so they see the message before leaving)
997
  emit('user_left', {
998
+ 'session_id': session_id, # NEW: Include session_id
999
  'role': session["role"],
1000
  'receiver_number': session.get("receiver_number"),
1001
  'active_count': len(CHAT_ROOMS[room_id]["active_sessions"])
1002
+ }, room=room_id) # Send to everyone including sender
1003
 
1004
  leave_room(room_id)
1005