{"id":19030656,"url":"https://github.com/hackclub/orpheus-bot","last_synced_at":"2025-04-23T16:07:09.060Z","repository":{"id":36571822,"uuid":"199718112","full_name":"hackclub/orpheus-bot","owner":"hackclub","description":"https://youtu.be/R8FVKVnYfY8","archived":false,"fork":false,"pushed_at":"2025-03-27T14:23:49.000Z","size":2547,"stargazers_count":26,"open_issues_count":17,"forks_count":14,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-23T16:06:39.972Z","etag":null,"topics":["hackclub","hacktoberfest","slack","slack-bot"],"latest_commit_sha":null,"homepage":"https://hackclub.com/slack/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hackclub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-30T19:54:14.000Z","updated_at":"2025-04-04T04:13:18.000Z","dependencies_parsed_at":"2024-03-02T17:26:20.067Z","dependency_job_id":"3361b3d6-e836-48af-a50a-99c4fe9cc768","html_url":"https://github.com/hackclub/orpheus-bot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Forpheus-bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Forpheus-bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Forpheus-bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hackclub%2Forpheus-bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hackclub","download_url":"https://codeload.github.com/hackclub/orpheus-bot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250468275,"owners_count":21435452,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hackclub","hacktoberfest","slack","slack-bot"],"created_at":"2024-11-08T21:18:59.623Z","updated_at":"2025-04-23T16:07:09.039Z","avatar_url":"https://github.com/hackclub.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](https://raw.githubusercontent.com/hackclub/dinosaurs/master/club_dinosaur.png)\n\n# orpheus!\nthe helpful dinosaur who is everybody's friend!\n\n## contributing:\ndrop something in the orph/interactions folder!\n\nthings should autoload if you do the decorator-y thing\n\n## her purpose:\n\nsomewhere to throw all the functionality we don't want to bother writing another slackbot for\n\n## none of the following is true anymore:\n## it might be true again someday!\n- [Commands](#commands)\n  - [Legend](#legend)\n  - [Slash Commands](#slash-commands)\n    - [Anyone ‡](#anyone-)\n    - [Full Slack Users §](#full-slack-users-)\n    - [Club leaders Δ](#club-leaders-δ)\n    - [Slack Owner/Admin ◊](#slack-owneradmin-)\n  - [Message commands](#message-commands)\n    - [Anyone ‡](#anyone--1)\n    - [Club leaders Δ](#club-leaders-δ-1)\n    - [Slack Owner/Admin ◊](#slack-owneradmin--1)\n- [Misc Interactions](#misc-interactions)\n\n## Commands\n\n### Legend\n\n‡ = anyone  \n§ = full Slack user only (not multi-channel or single-channel guest)  \nΔ = club leader only  \n◊ = Slack owner/admin only  \n**†** = deprecated\n\n### Slash Commands\n\n_Every Slash command comes with a help message. For example, to learn to use `/stats`, type `/stats help` in Slack._\n\n#### Anyone ‡\n\n- ‡[`/airtable`](/src/interactions/airtable.js) Post the database links of a Slack user\n- ‡[`/address` `/leader-address`](src/interactions/address.js) Post the current user's address with a link to edit\n- **†** ‡[`/stats @USER`](/src/interactions/stats.js) Get tagged user's meeting stats\n- **†** ‡[`/stats #CHANNEL`](/src/interactions/stats.js) Get tagged channel's meeting stats\n- **†** ‡[`/get`](/src/interactions/get.js) See a list of available promotions\n  - **†** ‡[`/get notion premium`](src/interactions/promos/notionPremium.js) Get a Premium Notion account\n  - **†** ‡[`/get adafruit discount`](src/interactions/promos/adafruitDiscount.js) Get a discount code for Adafruit\n- **†** ‡`/report` File a misconduct report\n- **†** ‡`/som-report` Report a Slack user's behavior\n- **†** ‡[`/promo`](src/interactions/promo.js) Renamed to `/get`\n\n_‡ = anyone_  \n_**†** = deprecated_\n\n#### Full Slack Users §\n\n_This excludes Slack guests, such as multi-channel or single-channel users._\n\n- **†** §[`/som-lookup`](src/interactions/som/lookup.js) Lookup who promoted a multi-channel guest to a full Slack user during the Summer of Making.\n- **†** §`/som-invite` Invite a multi-channel guest for the Summer of Making.\n- **†** §[`/club-init`](src/interactions/clubInit.js) Become a club leader by creating a club\n\n_§ = full Slack user only (not multi-channel or single-channel guest)_  \n_**†** = deprecated_\n\n#### Club leaders Δ\n\n- **†** Δ[`/club-address`](src/interactions/clubAddress.js) Post the current user's club address with a link to edit\n- **†** Δ[`/rename-channel`](src/interactions/rename.js) Rename your club channel\n- **†** Δ[`/slack-invite`](src/interactions/slack-invite.js) Get custom club Slack invite link \u0026 optionally invite an email to Slack\n- **†** Δ[`/moderate`](src/interactions/moderate.js) Use this command to moderate your club's community channel, first run `/moderate` to link the channel and then `/moderate \u003cslack message link\u003e` to delete an inappropriate message. WIP.\n- **†** Δ[`/meeting-add`](src/interactions/meetingAdd.js) Add a meeting to your club's stats\n- **†** Δ[`/meeting-remove`](src/interactions/meetingRemove.js) Remove a mis-recorded meeting\n- **†** Δ[`/meeting-list`](src/interactions/meetingList.js) Get a list of club meetings (useful for /meeting-remove)\n- **†** Δ[`/meeting-stats` `/stats`](src/interactions/stats.js) Get current user's meeting stats\n  - **†** ‡[`/stats @USER`](src/interactions/stats.js) Get tagged user's meeting stats\n  - **†** [`/stats #CHANNEL`](src/interactions/stats.js) Get tagged channel's meeting stats\n- **†** Δ[`/orpheus-tutorial` `/meeting-tutorial`](src/interactions/tutorial.js)\n  - Use `@orpheus forget` before running the command to restart the tutorial from scratch\n- **†** Δ[`/leader-add @USER`](src/interactions/leaderAdd.js) Add another Slack user as a leader for your club\n- **†** Δ[`/leader-list`](src/interactions/leaderList.js) Print out the Slack accounts of registered co-leads\n- **†** ‡[`/get`](src/interactions/get.js) See a list of available promotions\n  - **†** Δ[`/get zoom pro`](src/interactions/promos/zoom.js) Upgrade to a Zoom Pro account. Deprecated in favor of https://github.com/hackclub/slash-z\n  - **†** Δ[`/get hack pack`](src/interactions/promos/hackPack.js) Add club to list of Hack Pack approved clubs\n  - **†** Δ[`/get sticker envelope`](src/interactions/promos/stickerEnvelope.js) Order a sticker envelope for yourself or another slack user\n  - **†** Δ[`/get stickermule`](src/interactions/promos/stickermule.js) Request credit on StickerMule\n  - **†** Δ[`/get github grant`](src/interactions/promos/githubGrant.js) Request a $100 grant for your club, paid by GitHub\n- **†** Δ[`/club-card`](src/interactions/clubCard.js) Issue a credit card number for your club\n- **†** Δ[`/meeting-time`](src/interactions/meetingTime.js) Set the meeting time to get meeting notifications weekly\n\n_Δ = club leader only_  \n_‡ = anyone_  \n_**†** = deprecated_\n\n#### Slack Owner/Admin ◊\n\n- **†** ◊[`/announcement`](src/interactions/announcement.js) Send an announcement to all clubs in Airtable queued for announcements\n  - **†** ◊[`/announcement address`](src/interactions/announcement.js) See a list of the enqueued clubs\n  - **†** ◊[`/announcement status`](src/interactions/announcement.js) Get the number of successful messages sent / the total messages to send\n  - **†** ◊[`/announcement send`](src/interactions/announcement.js) Start sending announcements to enqueued clubs\n  - **†** ◊[`/announcement record`](src/interactions/announcement.js) Record a Slack message to the announcement buffer\n- **†** ◊[`/som-promote @USER`](src/interactions/som/promote.js) Promote a multi-channel guest to a full Slack user.\n- **†** ◊`/som-ban` Deactivate a Slack user\n\n_Δ = club leader only_  \n_**†** = deprecated_\n\n### Message commands\n\n#### Anyone ‡\n\n- ‡[`@orpheus breakout`](src/interactions/breakout.js) creates an ephemeral channel based on the current channel\n- ‡[`@orpheus info`](src/interactions/info.js) Print the current uptime (used as a [startup message](src/interactions/startup.js))\n- ‡[`@orpheus forget`](src/interactions/forget.js) Deletes a Slack user from @orpheus' memory. Used for debugging.\n- ‡[`@orpheus find or create @USER`](src/interactions/findOrCreate.js) Finds or creates a user record in the Airtable database. Used by automations.\n- ‡[`@orpheus date`](src/interactions/date.js) Command that returns a parsed date. Used for debugging.\n\n_‡ = anyone_\n\n#### Club leaders Δ\n\n- **†** Δ[`@orpheus checkin`](src/interactions/checkin.js) Start a check-in with the current user\n\n_Δ = club leader only_  \n_**†** = deprecated_\n\n#### Slack Owner/Admin ◊\n\n- ◊[`thump`](src/interactions/trigger/index.js) Trigger scheduled tasks (ex. close inactive breakout channels)\n- ◊[`@orpheus dm`](src/interactions/dm.js) Send a message as @orpheus\n  - ◊[`@orpheus dm @USER Hello world`](src/interactions/dm.js) Send a DM to @USER of \"Hello world\"\n  - ◊[`@orpheus dm #CHANNEL Hello world`](src/interactions/dm.js) Send a DM to #CHANNEL of \"Hello world\"\n- ◊[`@orpheus add this team to the leaders channel`](src/interactions/leaderInvite.js) Use in a club channel to invite all associated leader to the private `#leaders` channel\n\n_◊ = Slack owner/admin only_\n\n## Misc Interactions\n\n- Posting files in the `#cdn` channel will [host them on a cdn link](/src/interactions/fileShare.js)\n- Mentioning `@orpheus` in a message that contains `thanks/thank you/thnx` etc. will trigger a response\n- Mentioning `@orpheus` in a message that contains `who are you` etc. will trigger a response\n- Mentioning `@orpheus` in a message that contains `where are you` etc. will trigger a response\n- Mentioning `@orpheus` in a message that contains `what are you doing` etc. causes orpheus to shrug\n- Mentioning `hacktoberfest` in a message will trigger an [ephemeral response to the user](src/interactions/hacktoberfest.js) (but only in Oct)\n- Mentioning `@orpheus` in a message that contains `hello` will [trigger a response](src/interactions/hello.js)\n- Mentioning `@orpheus` in a message that contains `sass` or `mock` will [trigger a sassy response](src/interactions/mocking.js)\n- Asking `what are you doing` in a message `@orpheus` is tagged in will trigger a response\n- Tagging `@orpheus` in a message that doesn't map to an existing interaction will [trigger a confused response](src/interactions/catchall.js)\n- The phrase `get a room` in a post or thread will [trigger the breakout commmand](src/interactions/breakout.js)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhackclub%2Forpheus-bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhackclub%2Forpheus-bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhackclub%2Forpheus-bot/lists"}