Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
8cf9b2b
Minor Error Handling fixes
Minus-hates-school May 18, 2026
c7c0d0e
Fix response formatting and update setting retrieval
Minus-hates-school May 18, 2026
697b87c
Fix response formatting in healthchecks.py
Minus-hates-school May 18, 2026
606dbee
Fix jsonify return statements in logging.py
Minus-hates-school May 18, 2026
d0e66b4
Fix jsonify calls in roles.py
Minus-hates-school May 18, 2026
c0e8bd0
Refactor points update message and error handling
Minus-hates-school May 18, 2026
6926579
Fix return statements in settings routes
Minus-hates-school May 19, 2026
1161320
Fix formatting in settings.py
Minus-hates-school May 19, 2026
22e28a3
Please Dont Break.
Minus-hates-school May 19, 2026
99fccab
oops i broke the api routes for settings, but i fixed it and added a …
Minus-hates-school May 19, 2026
8d31d4c
Merge pull request #1 from Minus-hates-school/Ticket-Development
Minus-hates-school May 19, 2026
c544e2e
little debug to help find settings error
Minus-hates-school May 19, 2026
307c564
More Debug Testing...
Minus-hates-school May 19, 2026
de6abae
Merge pull request #2 from Minus-hates-school/Ticket-Development
Minus-hates-school May 19, 2026
29c5a4a
Last of the usless prints
Minus-hates-school May 19, 2026
0b8483f
Extension 'cogs.logging.logging_message_delete' raised an error: KeyE…
Minus-hates-school May 19, 2026
e797c21
test fix
Minus-hates-school May 19, 2026
0118ba2
debgging KeyError
Minus-hates-school May 19, 2026
21826c1
Removed [0]
Minus-hates-school May 19, 2026
767a2da
logging redo removing [0] index error from db data return
Minus-hates-school May 19, 2026
4ad085e
Error Handeling Potentialy
Minus-hates-school May 19, 2026
37bb9ec
swapped check order>
Minus-hates-school May 19, 2026
fd54493
Debugging and cleanup of logging
Minus-hates-school May 19, 2026
6698bd3
last removals of [0]
Minus-hates-school May 19, 2026
a59447f
Fix Setttings from [0] plague
Minus-hates-school May 19, 2026
9b1e36a
Adjustments to the Fixes
Minus-hates-school May 19, 2026
990ab08
Merge pull request #4 from Minus-hates-school/Ticket-Development
Minus-hates-school May 19, 2026
510cf9f
Fix response formatting and update setting retrieval
Minus-hates-school May 18, 2026
7ba4ab6
Merge pull request #5 from Minus-hates-school/Ticket-Development
Minus-hates-school May 19, 2026
c393bdc
Testing Image logging
Minus-hates-school May 19, 2026
3204e70
Added Attachment text to logging so it dosent appear blank.
Minus-hates-school May 19, 2026
4d70617
Reworked Attachments and removed emtpy message logging.
Minus-hates-school May 19, 2026
af14b99
Merge pull request #6 from Minus-hates-school/Ticket-Development
Minus-hates-school May 19, 2026
c8cb4e8
Changed How logging sends images.
Minus-hates-school May 19, 2026
2a8a6ed
removed accidental changes.
Minus-hates-school May 21, 2026
7ff38a8
Removed accidental changes to .gitigore
Minus-hates-school May 21, 2026
e487f2b
TicketTest
Minus-hates-school May 21, 2026
71b9fec
Merge branch 'Ticket-Development' of https://github.com/Minus-hates-s…
Minus-hates-school May 21, 2026
768a663
modal wasnt sending properly.
Minus-hates-school May 21, 2026
5caca12
Forgot to actualy open the modal this time
Minus-hates-school May 21, 2026
9be5363
ReWorked Selector
Minus-hates-school May 21, 2026
e88bb16
send_message -> send_modal
Minus-hates-school May 21, 2026
b5cfabf
oops lol
Minus-hates-school May 21, 2026
fddeaac
staff_role broke it
Minus-hates-school May 21, 2026
b317413
fix db push for ticket.
Minus-hates-school May 21, 2026
e0d5c95
add_ticket not create
Minus-hates-school May 21, 2026
ba092b6
message fix
Minus-hates-school May 21, 2026
d1d08a5
inital updates to db calls.
Minus-hates-school May 21, 2026
96cc42c
API fixes?
Minus-hates-school May 21, 2026
78ffbf7
idk
Minus-hates-school May 21, 2026
418cc11
ssss
Minus-hates-school May 21, 2026
36f6199
forgot to post method
Minus-hates-school May 21, 2026
e4dbfda
renamed and fixed errors. UN
Minus-hates-school May 21, 2026
d141e33
defer
Minus-hates-school May 21, 2026
2c0ecec
added close_thread
Minus-hates-school May 21, 2026
da93abc
name_close
Minus-hates-school May 21, 2026
c243bda
added close_ticket api
Minus-hates-school May 21, 2026
62ea69e
added db.close_ticke
Minus-hates-school May 21, 2026
4fcfce6
proper closing
Minus-hates-school May 21, 2026
17b5265
UI improvment
Minus-hates-school May 21, 2026
f0d3634
gc
Minus-hates-school May 21, 2026
7348d73
Ticket Rework for users
Minus-hates-school May 21, 2026
49181f4
I keep changing the .gitignore
Minus-hates-school May 22, 2026
d810acb
Merge branch 'Ticket-Development' of https://github.com/Minus-hates-s…
Minus-hates-school May 22, 2026
c118b6a
Merge pull request #7 from Minus-hates-school/Ticket-Development
Minus-hates-school May 22, 2026
615cf0a
Merge pull request #115 from Minus-hates-school/master
Xarlos89 May 22, 2026
4e378f3
Fixed requested review
Minus-hates-school May 22, 2026
805001f
fixed broken error checker
Minus-hates-school May 22, 2026
78e53e1
Added the migration commands.
kritarth2135 May 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
/.idea/
.env
/src/db/postgres-data/
.gitignore
.vscode/

# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down Expand Up @@ -157,3 +159,5 @@ dmypy.json
cython_debug/

/.obsidian/
src/bot/cogs/moderation/admin_detect_spam_message.py
.gitignore
2 changes: 2 additions & 0 deletions src/api/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from routes.settings import settings
from routes.points import points
from routes.roles import role
from routes.tickets import tickets

from core.db_helper import DB

Expand All @@ -28,6 +29,7 @@
app.register_blueprint(settings)
app.register_blueprint(points)
app.register_blueprint(role)
app.register_blueprint(tickets)

# Error handlers
@app.errorhandler(Exception)
Expand Down
150 changes: 135 additions & 15 deletions src/api/core/db_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ def get_log_settings(self):
try:
self.cursor.execute("SELECT * FROM logging") # case sensitive
result = self.cursor.fetchall()
return {"status": "ok", "logging": result}
response = {"status": "ok", "logging": result}
logger.debug(f"DB Response:\n{response}")
return response
except OperationalError as err:
logger.error(f"Error fetching logging: {err}")
return {"status": "error", "message": str(err)}
Expand All @@ -61,7 +63,9 @@ def get_logging(self):
try:
self.cursor.execute("SELECT * FROM logging")
result = self.cursor.fetchall()
return {"status": "ok", "logging": result}
response = {"status": "ok", "logging": result}
logger.debug(f"DB Response:\n{response}")
return response
except OperationalError as err:
logger.error(f"Error fetching logging: {err}")
return {"status": "error", "message": str(err)}
Expand Down Expand Up @@ -96,14 +100,15 @@ def delete_log_setting(self, log_id):
##################
## Settings ##
##################

def get_setting(self, setting_id):
logger.debug("API attempting to contact DB for get_setting...")
try:
self.cursor.execute("SELECT * FROM serversettings where id = %s", (setting_id,))
result = self.cursor.fetchone()
return {"status": "ok", "setting": result}
except OperationalError as err:
logger.error(f"Error fetching logging: {err}")
logger.error(f"Error fetching setting: {err}")
return {"status": "error", "message": str(err)}

def get_settings(self):
Expand All @@ -113,7 +118,7 @@ def get_settings(self):
result = self.cursor.fetchall()
return {"status": "ok", "setting": result}
except OperationalError as err:
logger.error(f"Error fetching setting: {err}")
logger.error(f"Error fetching settings: {err}")
return {"status": "error", "message": str(err)}


Expand Down Expand Up @@ -148,6 +153,7 @@ def delete_setting(self, log_id):
##################
## roles ##
##################

def get_role(self, role_id):
logger.debug("API attempting to contact DB for get_role...")
try:
Expand Down Expand Up @@ -189,10 +195,10 @@ def add_role(self, name, value):
def delete_role(self, role_id):
logger.debug(f"API attempting to contact DB for delete_role with role_ID:{role_id}")
try:
self.cursor.execute("DELETE FROM roles WHERE id = %s", (role_id,))
self.cursor.execute("DELETE FROM roles WHERE id = %s", (role_id,))
return {"status": "ok", "message": f"role with ID {role_id} deleted successfully"}
except OperationalError as err:
logger.error(f"Error deleting role: {err}")
logger.error(f"Error deleting role: {err}")
return {"status": "error", "message": str(err)}

##################
Expand All @@ -212,12 +218,10 @@ def get_points_for_user(self, user_id):

def update_points(self, user_id, value):
try:
self.cursor.execute("UPDATE users SET points = points + %s WHERE discord_id = %s", (value, user_id))
self.conn.commit()
self.cursor.execute("UPDATE users SET points = points + %s WHERE discord_id = %s", (value, user_id))
return {"status": "ok", "message": "points updated successfully"}
except OperationalError as err:
logger.error(f"Error updating points: {err}")
self.conn.rollback()
return {"status": "error", "message": str(err)}

def add_user_to_points(self, user_id):
Expand All @@ -226,25 +230,25 @@ def add_user_to_points(self, user_id):
"INSERT INTO users (discord_id, points) VALUES (%s, 0) ON CONFLICT (discord_id) DO NOTHING;"
, (user_id,)
)
# self.conn.commit()
#
return {"status": "ok", "message": "New user added to 'points' successfully"}
except OperationalError as err:
logger.error(f"Error adding new user: {err}")
# self.conn.rollback()
#
return {"status": "error", "message": str(err)}

def remove_user_from_points(self, user_id):
try:
self.cursor.execute("DELETE FROM users WHERE discord_id = %s", (user_id,))
affected_rows = self.cursor.rowcount
if affected_rows > 0:
self.conn.commit()

return {"status": "ok", "message": f"User with ID: {user_id} deleted successfully"}
else:
return {"status": "not_found", "message": f"No user found with ID: {user_id}"}
except OperationalError as err:
logger.error(f"Error deleting user: {err}")
self.conn.rollback()

return {"status": "error", "message": str(err)}

def get_top_10(self):
Expand All @@ -254,5 +258,121 @@ def get_top_10(self):
return {"status": "ok", "message": result}
except OperationalError as err:
logger.error(f"Error deleting user: {err}")
self.conn.rollback()
return {"status": "error", "message": str(err)}

return {"status": "error", "message": str(err)}


##################
## Ticket ##
##################

def get_ticket(self, thread_id: int):
"""Fetches a specific ticket from the database by its thread ID."""

logger.debug("API attempting to contact DB for get_ticket...")
try:
self.cursor.execute("SELECT * FROM tickets where thread_id = %s", (thread_id,))
result = self.cursor.fetchone()
return {"status": "ok", "ticket": result}
except OperationalError as err:
logger.error(f"Error fetching ticket: {err}")
return {"status": "error", "message": str(err)}

def get_tickets(self):
"""Fetches all tickets from the database."""

logger.debug("API attempting to contact DB for get_tickets...")
try:
self.cursor.execute("SELECT * FROM tickets")
result = self.cursor.fetchall()
return {"status": "ok", "tickets": result}
except OperationalError as err:
logger.error(f"Error fetching tickets: {err}")
return {"status": "error", "message": str(err)}

def add_ticket(self, thread_id: int, creator_id: int, channel_id: int, status: str = 'open'):
"""
Add a new ticket to the database.
Args:
- thread_id: The unique ID of the ticket (e.g., thread ID).
- creator_id: The Discord ID of the user who created the ticket.
- channel_id: The Discord ID of the channel associated with the ticket.
- status: The current status of the ticket (e.g., 'open', 'closed')

"""

logger.debug(f"API attempting to contact DB for add_ticket with thread_id:{thread_id} - creator_id:{creator_id} - channel_id:{channel_id} - status:{status}")
try:
self.cursor.execute(
"""
INSERT INTO tickets (
thread_id,
creator_id,
channel_id,
status
)
VALUES (%s, %s, %s, %s)""",
(
thread_id,
creator_id,
channel_id,
status
)
)


return {"status": "ok", "message": "New ticket added successfully"}
except OperationalError as err:
logger.error(f"Error adding new ticket: {err}")

return {"status": "error", "message": str(err)}

def close_ticket(self, thread_id: int):
"""
Close a specific ticket in the database by updating its status to 'closed'.
Args:
- thread_id: The unique ID of the ticket (e.g., thread ID) to be closed.
"""

logger.debug(f"API attempting to contact DB for close_ticket with thread_id:{thread_id}")
try:
self.cursor.execute("UPDATE tickets SET status = 'closed' WHERE thread_id = %s", (thread_id,))

return {"status": "ok", "message": f"Ticket with thread ID {thread_id} closed successfully"}
except OperationalError as err:
logger.error(f"Error closing ticket: {err}")

return {"status": "error", "message": str(err)}

def update_ticket_status(self, thread_id: int, status: str):
logger.debug(f"API attempting to contact DB for update_ticket_status with thread_id:{thread_id} - status:{status}")
try:
self.cursor.execute("UPDATE tickets SET status = %s WHERE thread_id = %s", (status, thread_id))

return {"status": "ok", "message": "Ticket status updated successfully"}
except OperationalError as err:
logger.error(f"Error updating ticket status: {err}")

return {"status": "error", "message": str(err)}

def delete_ticket(self, thread_id: int):
logger.debug(f"API attempting to contact DB for delete_ticket with thread_id:{thread_id}")
try:
self.cursor.execute("DELETE FROM tickets WHERE thread_id = %s", (thread_id,))

return {"status": "ok", "message": f"Ticket with thread ID {thread_id} deleted successfully"}
except OperationalError as err:
logger.error(f"Error deleting ticket: {err}")

return {"status": "error", "message": str(err)}

def get_open_tickets(self):
logger.debug("API attempting to contact DB for get_open_tickets...")
try:
self.cursor.execute("SELECT * FROM tickets WHERE status = 'open'")
result = self.cursor.fetchall()
return {"status": "ok", "tickets": result}
except OperationalError as err:
logger.error(f"Error fetching open tickets: {err}")
return {"status": "error", "message": str(err)}

8 changes: 4 additions & 4 deletions src/api/routes/healthchecks.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def api_health_check():
if request.method == 'GET':
return jsonify({'status': 'ok'}, 200)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Forgot to de-serialize one here


return jsonify({'message': 'improper request method'}, 405)
return jsonify({'message': 'improper request method'}), 405


@health_checks.route('/hc_db', methods=['GET'])
Expand All @@ -30,9 +30,9 @@ def database_health_check():
if request.method == 'GET':
try:
hc = eos.db.database_health_check()
return jsonify(hc, 200)
return jsonify(hc), 200

except TypeError as ded:
return jsonify({"status": "unhealthy", "error": "DB unreachable"}, 404)
return jsonify({"status": "unhealthy", "error": "DB unreachable"}), 404

return jsonify({'message': 'improper request method'}, 404)
return jsonify({'message': 'improper request method'}), 404
16 changes: 8 additions & 8 deletions src/api/routes/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def get_log_setting(log_id=None):
# Retrieve a single setting
result = eos.db.get_log_setting(log_id)

return jsonify(result, 200)
return jsonify(result), 200

# @settings.route('/log_settings', methods=['GET'])
# def get_log_settings():
Expand All @@ -36,7 +36,7 @@ def get_log_setting(log_id=None):
# """
# result = eos.db.get_log_settings()
#
# return jsonify(result, 200)
# return jsonify(result), 200

@logs.route('/logging/<log_id>', methods=['PUT'])
def update_log_setting(log_id):
Expand All @@ -46,9 +46,9 @@ def update_log_setting(log_id):
if request.method == 'PUT':
data = request.json
result = eos.db.update_logging(int(log_id), data['value'])
return jsonify(result, 200)
return jsonify(result), 200

return jsonify({'message': 'improper request method'}, 405)
return jsonify({'message': 'improper request method'}), 405

@logs.route('/logging', methods=['POST'])
def add_log_setting():
Expand All @@ -58,9 +58,9 @@ def add_log_setting():
if request.method == 'POST':
data = request.json
result = eos.db.add_log_setting(data['name'], data['value'])
return jsonify(result, 201)
return jsonify(result), 201

return jsonify({'message': 'improper request method'}, 405)
return jsonify({'message': 'improper request method'}), 405

@logs.route('/logging/<int:log_id>', methods=['DELETE'])
def delete_log_setting(log_id):
Expand All @@ -69,6 +69,6 @@ def delete_log_setting(log_id):
"""
if request.method == 'DELETE':
result = eos.db.delete_log_setting(log_id)
return jsonify(result, 200)
return jsonify(result), 200

return jsonify({'message': 'improper request method'}, 405)
return jsonify({'message': 'improper request method'}), 405
15 changes: 8 additions & 7 deletions src/api/routes/roles.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def get_role(role_id=None):
# Retrieve a single role
result = eos.db.get_role(role_id)

return jsonify(result, 200)
return jsonify(result), 200

@role.route('/role/<role_id>', methods=['PUT'])
def update_role(role_id):
Expand All @@ -35,9 +35,9 @@ def update_role(role_id):
if request.method == 'PUT':
data = request.json
result = eos.db.update_role(int(role_id), data['value'])
return jsonify(result, 200)
return jsonify(result), 200

return jsonify({'message': 'improper request method'}, 405)
return jsonify({'message': 'improper request method'}), 405

@role.route('/role', methods=['POST'])
def add_role():
Expand All @@ -47,9 +47,9 @@ def add_role():
if request.method == 'POST':
data = request.json
result = eos.db.add_role(data['name'], data['value'])
return jsonify(result, 201)
return jsonify(result), 201

return jsonify({'message': 'improper request method'}, 405)
return jsonify({'message': 'improper request method'}), 405

@role.route('/role/<int:role_id>', methods=['DELETE'])
def delete_role(role_id):
Expand All @@ -58,6 +58,7 @@ def delete_role(role_id):
"""
if request.method == 'DELETE':
result = eos.db.delete_role(role_id)
return jsonify(result, 200)
return jsonify(result), 200

return jsonify({'message': 'improper request method'}), 405

return jsonify({'message': 'improper request method'}, 405)
Loading