-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
131 lines (101 loc) · 3.59 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from flask import Flask, render_template, request, session, redirect, url_for
from flask_socketio import join_room, leave_room, send, SocketIO
import random
from string import ascii_uppercase
app = Flask(__name__)
app.config["SECRET_KEY"] = "kasjfdldk"
socketio = SocketIO(app)
# store information regarding rooms
rooms = {}
def generate_unique_code(length):
while True:
code = ""
for _ in range(length):
code += random.choice(ascii_uppercase)
if code not in rooms:
break
#return code if it exists in a room
return code
@app.route("/", methods=["POST", "GET"])
def home():
# clear session and delete anything inside of it
session.clear()
if request.method == "POST":
name = request.form.get("name")
code = request.form.get("code")
# if join doesn't exist, it is false
join = request.form.get("join", False)
create = request.form.get("create", False)
if not name:
return render_template("home.html", error="Please enter a name.", code=code, name=name)
if join != False and not code:
return render_template("home.html", error="Please enter a room code.", code=code, name=name)
# get the room code
room = code
# if create is not false, tehy are trying to create a room
if create != False:
room = generate_unique_code(4)
rooms[room] = {
"members": 0,
"messages": []
}
elif code not in rooms:
return render_template("home.html", error="Room does not exist", code=code, name=name)
# store temporary session info
session["room"] = room
session["name"] = name
return redirect(url_for("room"))
return render_template("home.html")
@app.route("/room")
def room():
# get data from session
room = session.get("room")
# returns home if issue fetching room code
if room is None or session.get("name") is None or room not in rooms:
return redirect(url_for("home"))
# messages persiste the message for the duration of the room session
return render_template("room.html", code=room, messages=rooms[room]["messages"])
@socketio.on("connect")
def connect(auth):
room = session.get("room")
name = session.get("name")
# if room or name doesn't exist, don't connect
if not room or not name:
return
#socketio functions
if room not in rooms:
leave_room(room)
return
join_room(room)
# send data to room code
send({"name": name, "message": "has entered the room"}, to=room)
rooms[room]["members"] += 1
print(f"{name} joined room {room}")
@socketio.on("disconnect")
def disconnect():
room = session.get("room")
name = session.get("name")
leave_room(room)
# delete room if empty
if room in rooms:
rooms[room]["members"] -= 1
if rooms[room]["members"] <= 0:
del rooms[room]
send({"name": name, "message": "has left the room"}, to=room)
print(f"{name} has left the room {room}")
# send messages
@socketio.on("message")
def message(data):
room = session.get("room")
if room not in rooms:
return
content = {
"name": session.get("name"),
"message": data["data"]
}
# store history in rooms
send(content, to=room)
rooms[room]["messages"].append(content)
print(f"{session.get('name')} said: {data['data']}")
if __name__ == "__main__":
socketio.run(app, debug=True)