{"id":16048218,"url":"https://github.com/devict/bot","last_synced_at":"2026-03-08T04:31:31.757Z","repository":{"id":236679822,"uuid":"792958155","full_name":"devict/bot","owner":"devict","description":null,"archived":false,"fork":false,"pushed_at":"2024-08-25T12:03:53.000Z","size":41,"stargazers_count":1,"open_issues_count":6,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-07-24T13:02:06.535Z","etag":null,"topics":["bot","deno","slack","slack-bot","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/devict.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":"2024-04-28T03:04:31.000Z","updated_at":"2024-08-25T12:03:56.000Z","dependencies_parsed_at":"2024-08-25T02:43:59.528Z","dependency_job_id":"d7fbaf30-5129-4d89-8bcc-ab80ab891256","html_url":"https://github.com/devict/bot","commit_stats":{"total_commits":17,"total_committers":2,"mean_commits":8.5,"dds":0.05882352941176472,"last_synced_commit":"ff8341b42762d518601cf07dbd697a5bdacfe558"},"previous_names":["devict/bot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/devict/bot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devict%2Fbot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devict%2Fbot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devict%2Fbot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devict%2Fbot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devict","download_url":"https://codeload.github.com/devict/bot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devict%2Fbot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30245214,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"online","status_checked_at":"2026-03-08T02:00:06.215Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["bot","deno","slack","slack-bot","typescript"],"created_at":"2024-10-09T00:05:15.777Z","updated_at":"2026-03-08T04:31:31.738Z","avatar_url":"https://github.com/devict.png","language":"TypeScript","readme":"# 🤖 devICT bot 🤖\n\nA slack bot powered by Slack webhook events.\n\n## Overview\n\nThis is _not_ using any of the Slack platform stuff. Trying to keep it simple by\nsimply receiving webhook events from Slack and responding to those events\nhowever we want.\n\n- Runs as an API service listening on a `/slack/event` endpoint for webhook\n  events from Slack.\n  - Deployed to Deno Deploy\n- Commands are implemented as handlers that are executed if the message from the\n  event matches some defined criteria.\n  - Check the\n    [commands/ping.ts](https://github.com/devict/bot/tree/main/commands/ping.ts)\n    for a basic example.\n- Responses to the events are sent as separate HTTP requests, not as responses\n  to the incoming webhooks.\n  - We're using the\n    [@slack/web-api](https://www.npmjs.com/package/@slack/web-api) package,\n    which is a thin wrapper over Slack's HTTP API.\n\n## Contributing\n\nThis is a great project to contribute to as a member of the devICT community!\n\n## Local dev\n\nThis project runs on TypeScript with Deno.\n\n### Setup\n\n- [Install deno](https://docs.deno.com/runtime/manual/getting_started/installation/)\n  with `brew install deno`, or several other methods\n- Copy `.env.example` to `.env`\n- Plug your `SLACK_TOKEN` in to `.env` (reach out to\n  [@seth](https://devict.slack.com/archives/D19FFBMPB) for this)\n- Run `deno task cache` to download dependencies\n\n### Running the service\n\n- `deno task start`\n\n### Testing commands locally\n\nThere is a separate Slack app for development (`@bot (test)`) that can be used.\nReach out to [@seth](https://devict.slack.com/archives/D19FFBMPB) in Slack for\nthe `SLACK_TOKEN`.\n\nSimulate events from Slack hitting your local server with the\n`bin/simulate-message` util.\n\n```\n$ bin/simulate-message.ts \"@bot ping\"\n```\n\nor for windows\n\n```\ndeno run --env --allow-env --allow-net .\\bin\\simulate-message.ts \"@bot ping\"\n```\n\nYou won't see the simulated message in Slack, but the response will show up\nthere from `@bot (test)`.\n\n#### Testing reply in thread responses\n\nTo test reply in thread responses, you can pass a `thread_ts` to the `simulate-message.ts command`.\n\n```\n$ bin/simulate-message.ts \"@bot events\" \"1724586898.242849\"\n```\n\nTo get the `thread_ts` for your message:\n\n- Post a message of your own in the `#bot-testing` channel\n- Post _another_ message as a threaded reply to the first one\n- Copy the link to the threaded reply message\n- Grab the `thread_ts` query param from the URL\n\n## Slack App\n\nThis bot is installed in the devICT work space as a Slack app called **bot**.\n\n- The [OAuth \u0026 Permissions](https://api.slack.com/apps/A07B9TL6EMT/oauth) page\n  contains the `SLACK_TOKEN` needed to power the bot.\n  - The following scopes must be added: `app_mentions:read`, `chat:write`\n- The event receiving endpoint must be added on the\n  [Event Subscriptions](https://api.slack.com/apps/A07B9TL6EMT/event-subscriptions)\n  page.\n  - Events to subscribe to: `app_mention`\n\n## Slack Events\n\n[A list of all the events can be seen here](https://api.slack.com/events).\n\nThe events the bot responds to are defined in the `events.ts` module. Typebox\nschemas are defined for the events we respond to.\n\n_Note: If we want to respond to new event types, we will need to add them in the\nSlack app console before Slack will start sending them._\n\n## Deployment\n\nBot is deployed on Deno Deploy. The Slack App points to the `/slack/event`\nendpoint of the deployed bot API (this repo).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevict%2Fbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevict%2Fbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevict%2Fbot/lists"}