* Add blockkit
* Use blockkit for header components
* Add get_header_components()
* Add a APP_HOME_VIEWS list to reduce repetition
* Re-add `buttons = Actions()`
bc that merged wrongly somehow
* Remove Question Tags view button
* Switch to blockkit for dashboard view
Also splits get_ticket_status_pie_chart into two functions!
* Add some form of codebase contributing documentation
* Rename helper.py => dashboard.py
* Fix caption for fallback pie image
* Add HCTG
* Add Hctg transcript to transcripts list
* Hack Club: The Game -> Hack Club The Game
* Fix formatting of channel comments in hctg.py
* Change program name to 'hctg'
* Update hctg.py
* Format
---------
Co-authored-by: Amber <amber@transcental.dev>
Co-authored-by: MMK21Hub <50421330+MMK21Hub@users.noreply.github.com>
* Add ai-based ticket categorization and you can add tags in the bot homepage
* made the CategoryTag model and refactored the code to support it
* Implemented the fulfillment reminder to send all open tickets in the past 24h for amber to check them :)
* removed the ability to manage categories from the UI/fixed stuff
* Fix type error
* removed question tags
* Re-add question tags to DB schema
This is only because we don't have migrations rn so we can't actually delete stuff from the DB
---------
Co-authored-by: MMK21Hub <50421330+MMK21Hub@users.noreply.github.com>
* Add a tickets API
* Add more fields to JSON response for /api/ticket and /api/tickets
* Prevent returning a massive number of tickets by default
* Add an order to the query
* Document /api/tickets
* Add a stats v2 endpoint
* Make helpers_leaderboard json-friendly
* Improve naming of hang time stats
* Make new_tickets_now_closed do what it says for ranges in the past
* Add some docs!
* Split all-time hang time into unresolved/all
* Add a statistic for oldest question waiting for a helper response (#152)
* Silence type error (that was annoying me)
* Add new metric: oldest_unanswered_ticket_age_minutes
* Fix datetime subtraction exception
* Add oldest unanswered ticket info to stats v2
* Add a resolution time stat
* Add resolution times to API
* Return None if no resolution time can be calculated
* Optionally calculate hang time for all tickets, not just in-progress ones
* Add avg_hang_time_all_minutes to API
* Store reopenedAt timestamp
* 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
* Updated ?shipcertqueue to be ?shipqueue and added it to flavortown!
* fixed var type and capitalization of program now
* new line at the end of flavortown.py
* run pre-commit
* Add old macro name as an alias
* one more alias. just one more alias. okay? okay.
* Make types consistent again
* Fix the default value
---------
Co-authored-by: MMK21Hub <50421330+MMK21Hub@users.noreply.github.com>
* 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>
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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
* 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>
* 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