Update app.py
Browse files
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 |
-
#
|
| 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 |
|