-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapplication.py
More file actions
203 lines (135 loc) · 5.77 KB
/
application.py
File metadata and controls
203 lines (135 loc) · 5.77 KB
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
import os
from flask import Flask, render_template, redirect, url_for, request, session
from flask_session import Session
from flask_socketio import SocketIO, emit, join_room, leave_room
from datetime import datetime
from helpers import login_required
app = Flask(__name__)
app.config["SECRET_KEY"] = 'mysecret'
socketio = SocketIO(app)
# Configure session to use filesystem
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
# Global variables to store channels and chat history
channels = []
chat_history = {}
@app.route("/" , methods=["GET", "POST"])
@login_required
def index():
"""Homepage"""
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# If user creates a channel
if request.form.get("channel"):
channel = request.form.get("channel")
# Show error page if channel already in list
if channel in channels:
return render_template("error.html", message="channel already exists")
# Add channel if not yet in list
if channel not in channels:
channels.append(channel)
# Creat empty list for channel in chat_history dictionary
chat_history[channel] = []
return redirect(url_for('channel', channel_id=channel))
# User reached route via GET (as by clicking a link or via redirect)
else:
# If the user has previously chatted in a channel
if "last_channel" in session:
last_channel = session['last_channel']
# Redirect user to the last channel user was on
if last_channel in channels:
return redirect(url_for('channel', channel_id=last_channel))
return render_template("index.html", channels=channels)
@app.route("/login", methods=["GET", "POST"])
def login():
"""Log user in"""
# Forget any user
session.clear()
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# Ensure username was submitted
if not request.form.get("username"):
return render_template("error.html", message="please provide a display name")
# Store username in session variable
session['username'] = request.form.get("username")
# Also store username in session variable 'oldusername'
session['oldusername'] = session['username']
# Redirect user to homepage
return redirect("/")
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("login.html")
@app.route("/channel/<string:channel_id>", methods=["GET", "POST"])
@login_required
def channel(channel_id):
"""Channel page"""
# Get name of channel
id = channel_id
# Store the last channel the user visited in session variable
session['last_channel'] = channel_id
# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":
# If user changes display name, clear and update session variable
## Form submission disabled in JavaScript
if request.form.get("username"):
session['oldusername'] = session['username']
session.pop('username', None)
session['username'] = request.form.get("username")
# If user creates a channel
if request.form.get("channel"):
channel = request.form.get("channel")
# Show error page if channel already in list
if channel in channels:
return render_template("error.html", message="channel already exists")
# Add channel if not yet in list
if channel not in channels:
channels.append(channel)
# Creat empty list for channel in chat_history dictionary
chat_history[channel] = []
return render_template("channel.html", id=id, messages=chat_history[channel_id], channels=channels)
# User reached route via GET (as by clicking a link or via redirect)
else:
return render_template("channel.html", id=id, messages=chat_history[channel_id], channels=channels)
@socketio.on("join_channel")
def on_join(data):
room = data["channel"]
join_room(room)
entire_message = session["username"] + " has connected"
emit("announce message", entire_message, room=room)
@socketio.on("submit message")
def messages(data):
message = data["message"]
room = data["channel"]
join_room(room)
# Get timestamp
now = datetime.now()
timestamp = now.strftime("%H:%M:%S")
entire_message = session['username'] + ": " + message + " " + "[" + timestamp + "]"
# Delete first message if total messages stored in list reaches maximum of 100
if len(chat_history[room]) == 100:
del chat_history[room][0]
# Store message into chat history dictionary
chat_history[room].append(entire_message)
emit("announce message", entire_message, room=room)
@socketio.on("change name")
def change(data):
username = data["username"]
room = data["channel"]
join_room(room)
# If user changes display name, clear and update session variable
session.pop('username', None)
session['username'] = username
entire_message = session['oldusername'] + " has changed his/her name to " + username
# Update 'oldusername' session variable to the new display name
session['oldusername'] = session['username']
emit("announce message", entire_message, room=room)
@socketio.on("leave_channel")
def on_leave(data):
room = data["channel"]
# Remove the last channel from session variable
## leave_room functionality currently not used
session.pop('last_channel', None)
leave_room(room)
if __name__ == '__main__':
socketio.run(app)