-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathapp.py
135 lines (99 loc) · 3.19 KB
/
app.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
132
133
134
135
"""
Developed and maintained by parth kabra (https://github.com/parth-kabra).
"""
from flask import Flask, render_template, url_for, request, session, redirect
from flask_socketio import SocketIO, send, emit
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from engineio.payload import Payload
app = Flask(__name__)
app.config["SECRET"] = "KEY"
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///database.db"
app.secret_key = "KEY"
Payload.max_decode_packets = 500
db = SQLAlchemy(app)
io = SocketIO(app, cors_allowed_origins="*")
online_users = 0
# MESSAGE MODEL FOR SQL
class Message(db.Model):
def get_time() -> str:
date = str(datetime.now())
date = date[:date.rfind(" ")]
time = datetime.today().strftime("%I:%M %p")
return f'{date} {time}'
id = db.Column(db.Integer, primary_key = True)
message = db.Column(db.String(3000), nullable = False)
date_created = db.Column(db.String, default = get_time())
user = db.Column(db.String, nullable = False)
def __repr__(self) -> str:
return "<User %r>" % self.id
# FLASK JOIN CHAT PAGE
@app.route('/', methods = ["POST", "GET"])
@app.route('/join', methods = ["POST", "GET"])
def join_chat():
if request.method == "POST":
name = request.form["user_name"]
session["user"] = name
return redirect('/chat/')
else:
if "user" in session:
return render_template("join.html")
else:
return render_template("join.html")
@app.route("/terms")
def terms_and_conditions():
return render_template("terms.html")
@app.errorhandler(404)
def page_not_found(e):
return render_template("404.html"), 404
# FASK CHAT AREA PAGE
@app.route('/chat/')
def index():
if "user" in session:
messages = Message.query.order_by(Message.date_created).all()
return render_template('index.html', messages = messages)
else:
return redirect("/")
# SOCKET CONNECT USER
@io.on("connect")
def add_user() -> None:
global online_users
online_users += 1
emit("user_action", online_users, broadcast = True)
# SOCKET DISCONNECT USER
@io.on("disconnect")
def remove_user() -> None:
global online_users
online_users -= 1
emit("user_action", online_users, broadcast = True)
session.clear()
# SOCKET HANDLE MESSAGE
@io.on("message")
def handle_message(msg) -> None:
if msg != "CONNECTED!":
new_msg = Message(message = msg, user = session["user"])
db.session.add(new_msg)
db.session.commit()
sender = {
"msg":msg,
"user":session["user"],
"date":new_msg.date_created
}
send(sender, broadcast = True)
# SOCKET SEND TYPING MESSAGE
@io.on("typing__signal")
def send_typing_signal(is_typing) -> None:
if is_typing:
typer = {
"is_typing": True,
"user":session["user"]
}
emit("typing", typer, broadcast=True, include_self = False)
else:
typer = {
"is_typing": False,
"user":session["user"]
}
emit("typing", typer , broadcast=True, include_self = False)
if __name__ == '__main__':
io.run(app)