NihalGazi commited on
Commit
cda539a
·
verified ·
1 Parent(s): 3de2aee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -41
app.py CHANGED
@@ -1,54 +1,90 @@
1
- from flask import Flask, render_template
2
- from flask_socketio import SocketIO, emit, join_room, leave_room
3
- from collections import defaultdict
4
  import uuid
 
 
5
 
6
  app = Flask(__name__)
7
  socketio = SocketIO(app, cors_allowed_origins="*")
8
 
9
- waiting = []
10
- rooms = {}
11
- sockets = {}
 
12
 
13
- @app.route('/')
14
  def index():
15
- return render_template('index.html')
16
 
17
- @socketio.on('find')
18
- def handle_find():
 
 
 
 
19
  sid = request.sid
20
- if waiting:
21
- partner_sid = waiting.pop(0)
22
- room_id = str(uuid.uuid4())
23
- rooms[sid] = room_id
24
- rooms[partner_sid] = room_id
25
- sockets[room_id] = [sid, partner_sid]
26
- join_room(room_id, sid)
27
- join_room(room_id, partner_sid)
28
- emit('found', {'room': room_id}, to=sid)
29
- emit('found', {'room': room_id}, to=partner_sid)
30
- else:
31
- waiting.append(sid)
32
 
33
- @socketio.on('message')
34
- def handle_message(data):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  sid = request.sid
36
- room_id = data.get('room')
37
- msg = data.get('msg')
38
- if room_id in sockets and sid in sockets[room_id]:
39
- emit('message', {'msg': msg}, room=room_id, include_self=False)
 
40
 
41
- @socketio.on('disconnect')
42
- def handle_disconnect():
 
 
 
 
 
 
 
 
43
  sid = request.sid
44
- if sid in waiting:
45
- waiting.remove(sid)
46
- room_id = rooms.pop(sid, None)
47
- if room_id and room_id in sockets:
48
- partner_sid = [s for s in sockets[room_id] if s != sid]
49
- if partner_sid:
50
- emit('partner_left', {}, to=partner_sid[0])
51
- sockets.pop(room_id, None)
52
-
53
- if __name__ == '__main__':
54
- 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)