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)