136 lines
3.8 KiB
Python
136 lines
3.8 KiB
Python
from flask import Flask, render_template, session, request, redirect, url_for, jsonify
|
|
from flask_socketio import SocketIO, join_room, leave_room
|
|
import psycopg2
|
|
import config, database
|
|
from functools import wraps
|
|
from dateutil import parser
|
|
import datetime
|
|
import pytz, json
|
|
|
|
app = Flask(__name__)
|
|
app.secret_key = '11gs22h2h1a4h6ah8e413a45'
|
|
|
|
socketio = SocketIO(app)
|
|
|
|
|
|
@app.context_processor
|
|
def inject_user():
|
|
if 'user_id' in session.keys() and session['user_id'] is not None:
|
|
database_config = config.config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM users WHERE id=%s;"
|
|
cur.execute(sql, (session['user_id'],))
|
|
user = cur.fetchone()
|
|
session['user'] = user
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
conn.rollback()
|
|
return dict(username="")
|
|
|
|
return dict(
|
|
user = user
|
|
)
|
|
|
|
return dict(user=[])
|
|
|
|
def login_required(func):
|
|
@wraps(func)
|
|
def wrapper(*args, **kwargs):
|
|
if 'user' not in session or session['user'] == None:
|
|
return redirect('/login')
|
|
return func(*args, **kwargs)
|
|
return wrapper
|
|
|
|
@login_required
|
|
@app.route('/')
|
|
def index():
|
|
return render_template('index.html')
|
|
|
|
@app.route('/get_session')
|
|
def get_session():
|
|
return {'user': session.get('user')}
|
|
|
|
@app.route('/get_channel_messsages', methods=["GET"])
|
|
def get_channel_messages():
|
|
|
|
channel_id = request.args['channel_id']
|
|
limit = 100
|
|
page = 1
|
|
|
|
offset = (page - 1) * limit
|
|
|
|
messages = database.select_messages((channel_id, limit))
|
|
return jsonify(messages=messages)
|
|
|
|
@app.route('/logout', methods=['GET'])
|
|
def logout():
|
|
if 'user' in session.keys():
|
|
session['user'] = None
|
|
return redirect('/login')
|
|
|
|
@app.route('/login', methods=["POST", "GET"])
|
|
def login():
|
|
session.clear()
|
|
|
|
if request.method == "POST":
|
|
username = request.form.get('username')
|
|
password = request.form.get('password')
|
|
|
|
database_config = config.config()
|
|
with psycopg2.connect(**database_config) as conn:
|
|
try:
|
|
with conn.cursor() as cur:
|
|
sql = f"SELECT * FROM users WHERE username=%s;"
|
|
cur.execute(sql, (username,))
|
|
user = cur.fetchone()
|
|
print(user)
|
|
except (Exception, psycopg2.DatabaseError) as error:
|
|
print(error)
|
|
conn.rollback()
|
|
print(password, user[2])
|
|
if user and user[2] == password:
|
|
print(password, user[2])
|
|
session['user'] = user
|
|
return redirect('/')
|
|
|
|
if 'user' not in session.keys():
|
|
session['user'] = None
|
|
|
|
return render_template('login.html')
|
|
|
|
@socketio.on('join')
|
|
def on_join(data):
|
|
print(data)
|
|
channel = database.get_channel(data['channel_id'])
|
|
room = channel['channel_name']
|
|
join_room(room)
|
|
socketio.emit('joined', channel, to=request.sid)
|
|
|
|
@socketio.on('leave')
|
|
def on_leave(data):
|
|
username = data['username']
|
|
room = data['room']
|
|
print(f"{username} joined the {room}!")
|
|
leave_room(room)
|
|
|
|
@socketio.on('messageSend')
|
|
def handle_event(data):
|
|
print('Received:', data)
|
|
channel = database.get_channel(data['channel_id'])
|
|
|
|
payload = (
|
|
datetime.datetime.now(),
|
|
data['channel_id'],
|
|
data['user_id'],
|
|
data['message_content']
|
|
)
|
|
row = database.insert_message(payload)
|
|
message = database.select_message(row['id'])
|
|
print(message)
|
|
message['timestamp'] = str(message['timestamp'])
|
|
socketio.emit('messageReceive', message, to=channel['channel_name'])
|
|
|
|
if __name__ == '__main__':
|
|
socketio.run(app, host="0.0.0.0", port=5812, debug=True) |