NihalGazi commited on
Commit
16a9a79
·
verified ·
1 Parent(s): 56a36b8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -128
app.py CHANGED
@@ -1,129 +1,90 @@
1
- import uuid
2
- import time
3
- from flask import Flask, render_template, request
4
- from flask_socketio import SocketIO, join_room, leave_room, emit
5
-
6
- app = Flask(__name__)
7
- socketio = SocketIO(app, cors_allowed_origins="*")
8
-
9
- # In-memory matchmaking state
10
- PROFILES = {} # sid -> profile dict
11
- WAITING = [] # list of sids waiting
12
- ROOMS = {} # room_id -> {'users': (sid1, sid2), 'last_active': timestamp}
13
-
14
- STALE_TIMEOUT = 300 # 5 minutes
15
- SWEEP_INTERVAL = 300 # every 5 minutes
16
-
17
- @app.route("/", methods=["GET"])
18
- def index():
19
- return render_template("index.html")
20
-
21
- @app.route("/chat", methods=["GET"])
22
- def chat():
23
- return render_template("chat.html")
24
-
25
- @socketio.on("find")
26
- def handle_find(profile):
27
- sid = request.sid
28
- PROFILES[sid] = profile
29
- WAITING.append(sid)
30
- emit("status", {"msg": "Finding partner..."}, room=sid)
31
- try_match()
32
-
33
- @socketio.on("disconnect")
34
- def handle_disconnect():
35
- sid = request.sid
36
- if sid in WAITING:
37
- WAITING.remove(sid)
38
- PROFILES.pop(sid, None)
39
-
40
- # Remove from any room
41
- for room, info in list(ROOMS.items()):
42
- if sid in info['users']:
43
- other = info['users'][1] if info['users'][0] == sid else info['users'][0]
44
- emit("status", {"msg": "Partner left."}, room=other)
45
- leave_room(room, sid=other)
46
- ROOMS.pop(room)
47
-
48
- @socketio.on("subscribe")
49
- def handle_subscribe(data):
50
- room = data.get("room")
51
- sid = request.sid
52
- if room in ROOMS and sid in ROOMS[room]['users']:
53
- join_room(room)
54
- ROOMS[room]['last_active'] = time.time()
55
- emit("status", {"msg": f"Joined room {room}!"}, room=sid)
56
- else:
57
- emit("status", {"msg": "Invalid room or not in this room."}, room=sid)
58
-
59
- @socketio.on("chat")
60
- def handle_chat(data):
61
- room = data.get("room")
62
- msg = data.get("msg")
63
- if room in ROOMS:
64
- ROOMS[room]['last_active'] = time.time()
65
- emit("chat", {"msg": msg}, room=room)
66
-
67
- @socketio.on("leave")
68
- def handle_leave(data):
69
- room = data.get("room")
70
- sid = request.sid
71
- emit("left", {}, room=sid)
72
- if room in ROOMS:
73
- other = next(s for s in ROOMS[room]['users'] if s != sid)
74
- emit("status", {"msg": "Partner left."}, room=other)
75
- leave_room(room, sid=other)
76
- ROOMS.pop(room)
77
-
78
- def try_match():
79
- while len(WAITING) >= 2:
80
- s1 = WAITING.pop(0)
81
- prefs1 = set(PROFILES[s1]["interests"])
82
- s2 = None
83
- for i, sid in enumerate(WAITING):
84
- if prefs1 & set(PROFILES[sid]["interests"]):
85
- s2 = WAITING.pop(i)
86
- break
87
- if not s2:
88
- s2 = WAITING.pop(0)
89
- room = str(uuid.uuid4())
90
- ROOMS[room] = {
91
- 'users': (s1, s2),
92
- 'last_active': time.time()
93
- }
94
- join_room(room, sid=s1)
95
- join_room(room, sid=s2)
96
- emit("matched", {"room": room}, room=s1)
97
- emit("matched", {"room": room}, room=s2)
98
-
99
- def sweeper():
100
- while True:
101
- now = time.time()
102
- # Clean stale rooms
103
- for room, info in list(ROOMS.items()):
104
- if now - info['last_active'] > STALE_TIMEOUT:
105
- for sid in info['users']:
106
- try:
107
- emit("status", {"msg": "Room expired due to inactivity."}, room=sid)
108
- leave_room(room, sid=sid)
109
- PROFILES.pop(sid, None)
110
- if sid in WAITING:
111
- WAITING.remove(sid)
112
- except:
113
- pass
114
- ROOMS.pop(room)
115
-
116
- # Clean stale profiles
117
- active_sids = set()
118
- for room in ROOMS.values():
119
- active_sids.update(room['users'])
120
- for sid in list(PROFILES.keys()):
121
- if sid not in active_sids and sid not in WAITING:
122
- PROFILES.pop(sid, None)
123
- time.sleep(SWEEP_INTERVAL)
124
-
125
- # Start sweeper on app boot
126
- socketio.start_background_task(sweeper)
127
-
128
- if __name__ == "__main__":
129
  socketio.run(app, host="0.0.0.0", port=7860)
 
1
+ import uuid
2
+ from flask import Flask, render_template, request
3
+ from flask_socketio import SocketIO, join_room, leave_room, emit
4
+
5
+ app = Flask(__name__)
6
+ socketio = SocketIO(app, cors_allowed_origins="*")
7
+
8
+ # In-memory matchmaking state
9
+ PROFILES = {} # sid -> profile dict
10
+ WAITING = [] # list of sids waiting
11
+ ROOMS = {} # room_id -> (sid1, sid2)
12
+
13
+ @app.route("/", methods=["GET"])
14
+ def index():
15
+ return render_template("index.html")
16
+
17
+ @app.route("/chat", methods=["GET"])
18
+ def chat():
19
+ return render_template("chat.html")
20
+
21
+ @socketio.on("find")
22
+ def handle_find(profile):
23
+ sid = request.sid
24
+ PROFILES[sid] = profile
25
+ WAITING.append(sid)
26
+ emit("status", {"msg": "Finding partner..."}, room=sid)
27
+ try_match()
28
+
29
+ @socketio.on("disconnect")
30
+ def handle_disconnect(sid):
31
+ # `sid` is passed in by Socket.IO on disconnect
32
+ if sid in WAITING:
33
+ WAITING.remove(sid)
34
+ PROFILES.pop(sid, None)
35
+ # Remove from any room
36
+ for room, pair in list(ROOMS.items()):
37
+ if sid in pair:
38
+ other = pair[1] if pair[0] == sid else pair[0]
39
+ emit("status", {"msg": "Partner left."}, room=other)
40
+ leave_room(room, sid=other)
41
+ ROOMS.pop(room)
42
+
43
+ @socketio.on("subscribe")
44
+ def handle_subscribe(data):
45
+ room = data.get("room")
46
+ sid = request.sid
47
+ if room in ROOMS and sid in ROOMS[room]:
48
+ join_room(room)
49
+ emit("status", {"msg": f"Joined room {room}!"}, room=sid)
50
+ else:
51
+ emit("status", {"msg": "Invalid room or not in this room."}, room=sid)
52
+
53
+ @socketio.on("chat")
54
+ def handle_chat(data):
55
+ room = data.get("room")
56
+ msg = data.get("msg")
57
+ if room in ROOMS:
58
+ emit("chat", {"msg": msg}, room=room)
59
+
60
+ @socketio.on("leave")
61
+ def handle_leave(data):
62
+ room = data.get("room")
63
+ sid = request.sid
64
+ emit("left", {}, room=sid)
65
+ if room in ROOMS:
66
+ other = next(s for s in ROOMS[room] if s != sid)
67
+ emit("status", {"msg": "Partner left."}, room=other)
68
+ leave_room(room, sid=other)
69
+ ROOMS.pop(room)
70
+
71
+ def try_match():
72
+ while len(WAITING) >= 2:
73
+ s1 = WAITING.pop(0)
74
+ prefs1 = set(PROFILES[s1]["interests"])
75
+ s2 = None
76
+ for i, sid in enumerate(WAITING):
77
+ if prefs1 & set(PROFILES[sid]["interests"]):
78
+ s2 = WAITING.pop(i)
79
+ break
80
+ if not s2:
81
+ s2 = WAITING.pop(0)
82
+ room = str(uuid.uuid4())
83
+ ROOMS[room] = (s1, s2)
84
+ join_room(room, sid=s1)
85
+ join_room(room, sid=s2)
86
+ emit("matched", {"room": room}, room=s1)
87
+ emit("matched", {"room": room}, room=s2)
88
+
89
+ if __name__ == "__main__":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  socketio.run(app, host="0.0.0.0", port=7860)