chat-page-server/webserver.py
2025-05-24 09:23:37 -05:00

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)