Commit graph

147 commits

Author SHA1 Message Date
Alex
2d7d0a03f0
Fixed Jumpstart Grammar & Responses (#143)
* Jumpstart transcript

* Added Jumpstart to init

* Alphabetically ordered all local imports

* Seperate lines

* Fixed grammar and responses

* Added README

* Fixed Precheck

* Fix typo: READNE => README

* Rename variable to match naming convention

* Add space after bullet point

* Remove spaces at the end of each line

---------

Co-authored-by: MMK21Hub <50421330+MMK21Hub@users.noreply.github.com>
2026-01-16 19:50:20 +00:00
Mish
620939dcb8
Add deployment instructions (#141) 2026-01-04 23:28:14 +00:00
Alex
0823715421
Added Jumpstart YSWS (#140)
* Jumpstart transcript

* Added Jumpstart to init

* Alphabetically ordered all local imports

* Seperate lines
2026-01-04 19:21:19 +00:00
Saleh
1651ad2d38
Added shipwrights macro (#139)
* Added shipwrights macro

* fixes ig idk?

* renamed class for consistency

* reordered imports

* removed extra space

* Update README.md

* Adjust grammar in ?shipwrights response

* Remove spaces next to newlines

---------

Co-authored-by: MMK21Hub <50421330+MMK21Hub@users.noreply.github.com>
2025-12-28 01:20:31 +00:00
Mish
b156145811
First iteration of "question tags" (#136)
* Rename tags to team tags

* Add a TagType enum with TEAM and QUESTION options

* Ticket#questionTag exists now

* Revert "Add a TagType enum with TEAM and QUESTION options"

This reverts commit c9a17f4003aa2ce470f82810ac031fe83325f3d6.

* Add a new QuestionTag model

* Add another dropdown to the backend msg

* create tag => create team tag

* Add creating tags (from the backend channel)

* Create a single function for sending the backend message

Previously this code was duplicated across 2 places, making it inconsistent

* Rename a bunch of files; implement upating question tags on tickets

* Add a log!

* Fix ticket tag dropdowns in old msgs

* Auto-select the current question tag when a backend msg is posted

* Update backend message with the current tag

* Allow clearing the question tag

* Dynamically get question tag list

* Document question tags

* typo

* Change some log msgs to debug

* Only make the DB call if current_question_tag_id is present

* Remove unused variable

* Add createdAt to QuestionTag

* Ensure "reopened by [user]" is preserved when backend message is edited
2025-12-21 11:57:06 +00:00
Mish
983f895737
[WIP] Working on the daily summary message (#125)
* Add a ?dailystats macro for dev

* Get rid of all the overall stats in the daily summary

* Make the daily summary pie dark themed

* Write a module for unified stats calculation

* Use the stats module for the App Home leaderboards

* Ensure datetime types are tz-aware

* Use the stats module for the daily stats message

* Use the stats module for the stats API

* Implement get_unanswered_tickets()

* Add some functions for getting message links

* Format?

* Add old tickets to the daily stats message

* Remove unused import

* Fix calculation for new_tickets_in_progress

* fix typo

* Use correct stat for daily summary
2025-12-20 09:49:09 +00:00
Mish
e9455e0d1c
Fix the alaninnovates bug (#134)
* Add a little log

* Ensure closed tickets are attributed to helpers correctly

* Add a success log when a ticket is resolved
2025-12-14 00:06:14 +00:00
Mish
43967cf289
App home improvements! (#133)
* Show an error message if the views_publish call fails

This means that if our Block Kit has a syntax error and Slack API returns en error for it, a fallback screen is shown instead of indefinite loading

* Include nav buttons in the header

* Fix header formatting error

I think this was a GH Copilot hallucination that I accepted bc it looked very similar to the OG code :(

* Show header on the loading screen

* Make clicking on a button during the loading phase work

* Delete views/home/apps.py

I don't think this view is used anywhere

* Use the new header style everywhere

* Remove buttons.py (no longer used)

* Show "dashboard" tab as selected during first load

This means that the "default" virtual view name no longer exists, but we have a DEFAULT_VIEW constant now

* Add at least some sort of return type to get_header()

* Make the helper and assigned views non-helper-friendly

* Allow non-helpers to access the app home

* Remove useless `or` statement

* Extract error_screen to a component

* Gate the tags view to only helpers

* Make the tags view non-helper-friendly

* Make the stats view non-helper-friendly

* Make the error text a bit nicer

* Fix type error

* Make the infinite loading situation less likely

This could happen if you spam-clicked one of the buttons (I tested with assigned tickets). I think the problem existed before but was made worse by the new `user_last_requested_view` logic - now it's back to normal and the issue is very hard to recreate.

* Remove "unknown user" view and transcripts

* Remove commented code block

* Remove comment the second

* Fix timezone fetching and add more logs
2025-12-08 11:54:00 +00:00
Mish
8791e3ec54
Add more log attributes from Coolify-provided metadata (#131) 2025-12-02 01:24:18 +00:00
Mish
81dd26da2b
Add support for pushing logs to an OpenTelemetry endpoint (#130)
* Allow specifying log level per-logger

* Add support for sending logs to an OpenTelemetry endpoint

* Consistently use parse_level_name() for LOG_LEVEL_* env vars
2025-12-01 14:05:32 +00:00
Mish
14784f77d1
Preparation for improving the daily summary message (#124)
* Add lastMsgAt and lastMsgBy to DB

* Keep track of the last messages in threads

* Add UserType enum to schema

* Make both of the new fields optional

* Add data/ to .gitignore

* Only include users who have resolved tickets on the overall leaderboard

Fixes #96

* Fix docstring
2025-11-29 11:25:49 +00:00
Mish
2fc6a90a4d
Improvements to macros (#123)
* Attempts at getting macro aliases to work

* Store instances of macros as well as just the classes

* Add ?unresolve and ?open aliases for ?reopen

* Add an error message for invalid macros

* Add ?close as an alias for ?resolve

* Add error message for running a macro on a closed ticket

* Allow ?thread to be run on closed tickets

* Add type annotation to macro list
2025-11-29 11:22:08 +00:00
Balogh Barnabás
be77c20a18
Added Construct YSWS (#121)
* Added Construct YSWS

* Added to Construct to the list

* Pre commit runned
2025-11-23 23:34:25 +00:00
Mish
5567cc7673
Add a /api/ticket endpoint for ticket info (#122)
* Add a /api/ticket endpoint!

* Add some validation and user-friendly error msgs
2025-11-23 19:13:36 +00:00
Mish
df7ab83cb4
Handle exceptions from reactions_remove() calls (#119)
This is because I noticed this part of the code failing in the prod logs
2025-11-20 13:06:22 +00:00
Mish
7950126903
Ensure the Prisma VSCode extension sticks with Prisma v6 (#118)
Prisma v7 is JS-only, so I assume we won't ever be migrating to it :pf:

This change only affects devs using the Prisma extension for VSCode (mee!)
2025-11-20 13:06:17 +00:00
Mish
527fafe2b4
Add Promethus histograms for some parts of the code (#114)
* Add support for exporting code block times as histograms

* Adjust perf metrics

* Aff perf metrics for message processing and title gen

* Add metric for opening app home views

* Performance metrics are now defined individually

* Remove performance metric from slack.py

* New metrics for ticket title gen and app home rendering

* Prevent .labels({}) from happening

* Make import consistent
2025-11-17 11:23:09 +00:00
Mish
2cd5ad4b09
Add OpenAI dependency (#113) 2025-11-17 00:38:01 +00:00
Mish
86eb418220
Don't also send resolved message for most macros (#112)
* Don't send resolved message for most macros

* Make the ship cert macro only apply to SoM

* Add notes to the end of the resolving macros (for FT)
2025-11-16 17:44:48 +00:00
Mish
fdb729a00b
Refactoring around macros (#111)
* Use transcripts for most macro message texts

* Write a get_user_name() util

* Remove Fraudpheus reference

* Use get_user_name() in shipcertqueue.py

* Always impersonate in reopen.py

See 182771acdfd8eca0410f8c012f24e7cd51a71925

* Add user PFP method to slack_user.py

* Handle the case of a username not being present

* Use get_user_profile() to get user PFPs when tickets are (re)opened

* Remove comment

* Fix type error in reopen.py

* Guard against ts being not present in reopen.py

* Ensure consistent handling of profile_pic_512x() being None
2025-11-16 16:41:47 +00:00
Mish
f25a27afc7
Show ticket title in tagged ticket DM (#110) 2025-11-16 13:54:37 +00:00
Mish
4c3775d7c0
Bring back AI titles! (#109)
* Rewrite ticket title gen to use the new HC AI

* Use implicit string concatenation

* Use async OpenAI

* Guard against single-letter or all-whitespace AI responses

* Add a singular space
2025-11-16 12:45:47 +00:00
Mish
c2b73dcb96
Add a perf_timer() utility for timing blocks of code (#108)
* Add a perf_timer() utility for timing blocks of code

It has replaced raw perf_counter() calls in some files.

* Use perf_timer in ticket_status_pie.py

* Use perf_timer() for app home performance logging

* Remove plt.show() call

That was never meant to be there :pf:

* Print performance logs as debug logs
2025-11-15 21:46:14 +00:00
Mish
bb0fd03907
Fix log level logic being the wrong way around (#103) 2025-11-15 15:47:21 +00:00
Mish
68b2eb1e41
Make logging level configurable with an ENV var (#102) 2025-11-15 15:32:09 +00:00
Mish
8230f8560b
That's Leo, not Mish! (#101) 2025-11-15 15:13:55 +00:00
Mish
9e20174062
Split nephthys/events/message.py into procedures (#100)
* Extract some of the message handler into functions

* Add a send_user_facing_message function

* Improve type hints

* Remove redundant if statement check

* Remove unnecessary indentation

* Declare constant outside of function

* Add docstrings to 2 functions

Credit to GH Copilot :P

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix docstrings

* Add send_ticket_message docstring

* Fix profile_pic being set to "" instead of None

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-11 03:13:38 +00:00
Mish
accd86610e
Add a Docker healthcheck (#99)
* Add a Docker healthcheck

* Fix regexp

* Add --start-period to healthcheck
2025-11-11 02:28:28 +00:00
Chase Naples
20f7e8571b
chore: fill pyproject description (#98) 2025-11-10 12:37:33 +00:00
Amber
ea871bbc5d
update midnight faq (#95) 2025-11-08 21:18:17 +00:00
MMK21
415ee8576f
Rename "i get it now" button to "Mark as resolved" (#94)
* Add resolve_ticket_button to transcript

I also set "Mark as resolved" as the default wording for all instances

* Change button text back to "i get it now" for SoM and Identity

Backwards compatibility!
I think Midnight would be fine with the new default
2025-11-04 20:41:22 +00:00
Amber
76d6fa41a1
import midnight transcript (#91) 2025-11-03 18:42:02 +00:00
Leo
e857fe5b1e
add midnight transcript (#90) 2025-11-03 18:19:46 +00:00
MMK21
b54694e62d
Add a Prometheus metrics endpoint (#84)
* Add a Prometheus metrics endpoint

* Add starlette_exporter metrics

* Add Prisma metrics  to `/metrics`
2025-10-28 23:42:32 +00:00
MMK21
1a3818e413
Ensure the bot maintainer is always an admin (#88) 2025-10-28 23:16:49 +00:00
MMK21
c2f2584101
Make the header in app home configurable (#87)
* Add an app_title env var

* Use app_title in app home

* Fix header being wrapped in a tuple
2025-10-28 22:38:30 +00:00
MMK21
8f96d64267
Add files:write scope to app manifest (#86) 2025-10-28 22:37:25 +00:00
MMK21
f4fe7c3e9e
Improve response time when a new help message is sent (#82)
* Add a bunch of performance logs to on_message

* Remove duplicate DB user lookup

* Ensure Slack user info is only fetched once

* Make AI title generation happen after the FAQ message has been sent

* Make the performance logging debug-level

* Fix some perf calculations being incorrect

* Add type hint
2025-10-27 20:45:35 +00:00
MMK21
4e68152d08
Add a transcript for Flavortown (#80)
* Write v1 of the Flavortown transcript

* Remove summer reference from bot manifest

* Mrkdwn doesn't support bullet points, are we fr?

* Actually link help channel in resolve message
2025-10-26 17:01:18 +00:00
MMK21
228f70f835
Document ?reopen (#79) 2025-10-26 16:53:15 +00:00
MMK21
a10d0d4627
Proper fix for deleting messages in the backend channel (#78)
* Actually fix deleting messages in the backend channel

* Always impersonate in backend channel

- Yeah turns out deleting impersonated messages still works with a bot token
- Partially reverts #74
2025-10-26 16:11:54 +00:00
Shreyas Deo
b53e1c57fa
Add reopen macro (#76)
* Add reopen macro

* Move reopen message to transcript.py

* Remove duplicate run_macro calls
2025-10-26 16:08:09 +00:00
MMK21
fcd07e3080
Only impersonate if admin perms are present (#74)
* Implement env.workspace_admin_available()

* Only impersonate if admin perms are present

* Ensure we're accessing `self`'s properties

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-25 21:45:47 +00:00
MMK21
6ce7f7dd3e
Add a Dockerignore file (#72)
* Add required library libatomic1 to Dockerfile

* Add a dockerignore file

It used to take like 3 seconds to copy all the files into the Docker image because `.venv` was included.

That isn't needed because we `uv sync` within the container, so builds are slightly faster during development now.
2025-10-25 08:33:57 +00:00
MMK21
bed6f313ca
Overhaul deleted message handling (#73)
* Update DB when unthreaded messages are deleted

* Add required library libatomic1 to Dockerfile (#71)

* Handle quick message deletions

This is a quick and dirty way to handle the bug, but it works.

I also realised that handle_question_deletion() doesn't delete it in #tickets

* Create a system for tracking bot messages attached to tickets

* Ensure resolved message is added to userFacingMsgs

TODO I''ll need to make a function that all the macros can use to send a user-facing message

* Add a reply_to_ticket() helper for updating the DB
while replying to a ticket

* Fix type errors in reply_to_ticket()

* Use reply_to_ticket when resolving tickets

* Fix type errors in message.py

* Create delete_replies_to_ticket()

* Remove unused parameter in delete_replies_to_ticket

* Rename BotMessage.msgTs to BotMessage.ts

* Write a stub delete_and_clean_up_ticket function

* Partially implement delete_and_clean_up_ticket

* Delete "ticket" message in delete_and_clean_up_ticket()

* Use the new ticket methods where appropriate

* Make function name clearer ("delete_bot_replies")

* Log if a question is deleted but not present in DB

* Fix error when normal messages are deleted

* Actually include userFacingMsgs in the query when deleting bot replies

* Add success heartbeat to delete queue

* Document the deletion queue needing workspace admin

* Don't use delete queue in ticket_methods.py

This is because the delete queue requires an admin token, ew

* Fix deleting the backend message on ticket deletion

* Always preserve support threads with >3 bot messages

This is so that if someone runs ?faq, the ticket still counts as being resolved in the DB.

* Debug-log message event data instead of printing

* Use the reply_to_ticket util in macros

---------

Co-authored-by: RandomSearch <101704343+RandomSearch18@users.noreply.github.com>
2025-10-25 07:52:21 +00:00
MMK21
eeb5c3d739
Add required library libatomic1 to Dockerfile (#71) 2025-10-22 22:37:01 +00:00
MMK21
8a83580fe8
Delete bot messages and database entries if a thread is deleted (#69)
* Differentiate between message creation and deletion

* Add a comment to explain thread_broadcast

* If top-level message gets deleted, then delete bot messages

* Ensure top-level messages being deleted don't cause errors

It would previously freak out when the tombstone message gets deleted :P

* Remove deleted tickets from DB

* Actually delete the correct ticket

* Ensure unexpected SlackApiErrors are re-raised

* refactor: Move deleted message handling into its own file
2025-10-21 20:51:43 +00:00
MMK21
feb251de91
Fix tags (#67)
* Update readme re tags and stale

* Enable messages tab for the Slack app

This makes tags actually function as intended
2025-10-21 14:59:54 +00:00
MMK21
1dc54555c8
Ignore bot messages in the support channel (#60) 2025-10-21 14:40:55 +00:00
MMK21
5e5cc49b6e
Improve performance of pie chart generation by using db.ticket.count() (#62)
* Add some logging for time spent generating the Dashboard

* Start adding perf logging to get_ticket_status_pie_chart

* Add more detailed logs to ticket_status_pie

* Use db.ticket.count() instead of fetching all tickets for pie chart

Querying the database used to take 0.25s avg, now the query takes 0.028s avg (tested with 20k records)

Generating pie chart used to take 1.3s, now it's 0.74s. That's a 43% speedup I think! Although the pie chart isn't the only thing that takes time to load on the dashboard.

* Remove status_counts dict

I think the code reads nicer without the extra dict. Now we just have each variable listed inline in a list, which matches how the labels and colours are defined.

* Downgrade profiling logs to DEBUG level
2025-10-21 09:37:46 +00:00