Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mizchi/discord-claude-bot
https://github.com/mizchi/discord-claude-bot
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/mizchi/discord-claude-bot
- Owner: mizchi
- License: mit
- Created: 2024-03-14T10:16:58.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2024-10-28T09:30:53.000Z (about 2 months ago)
- Last Synced: 2024-10-28T21:39:20.265Z (about 1 month ago)
- Language: TypeScript
- Size: 78.1 KB
- Stars: 8
- Watchers: 2
- Forks: 3
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome - mizchi/discord-claude-bot - (TypeScript)
README
## Discord AI Chatbot on cloudflare-workers
- Discord API
- TypeScript
- Claude 3.5
- cloudflare workers## Setup
```bash
$ pnpm install
$ cp example.dev.vars .dev.vars# update commands
$ pnpm tsm script/builder.ts # generate src/commands.json
$ pnpm tsm script/register.ts# edit .dev.vars and set for production
$ pnpm wrangler secret put DISCORD_APPLICATION_ID
$ pnpm wrangler secret put DISCORD_PUBLIC_KEY
$ pnpm wrangler secret put DISCORD_TOKEN
$ pnpm wrangler secret put ANTHROPIC_API_KEY# release
$ pnpm wrangler deploy
```## TODO
- [x] short memory
- [ ] text to img
- [x] types
- [ ] test
- [ ] ci release---
Original README
# Cloudflare worker example app
awwbot is an example app that brings the cuteness of `r/aww` straight to your Discord server, hosted on Cloudflare workers. Cloudflare Workers are a convenient way to host Discord bots due to the free tier, simple development model, and automatically managed environment (no VMs!).
The tutorial for building awwbot is [in the developer documentation](https://discord.com/developers/docs/tutorials/hosting-on-cloudflare-workers)
![awwbot in action](https://user-images.githubusercontent.com/534619/157503404-a6c79d1b-f0d0-40c2-93cb-164f9df7c138.gif)
## Resources used
- [Discord Interactions API](https://discord.com/developers/docs/interactions/receiving-and-responding)
- [Cloudflare Workers](https://workers.cloudflare.com/) for hosting
- [Reddit API](https://www.reddit.com/dev/api/) to send messages back to the user---
## Project structure
Below is a basic overview of the project structure:
```
├── .github/workflows/ci.yaml -> Github Action configuration
├── src
│ ├── commands.js -> JSON payloads for commands
│ ├── reddit.js -> Interactions with the Reddit API
│ ├── register.js -> Sets up commands with the Discord API
│ ├── server.js -> Discord app logic and routing
├── test
| ├── test.js -> Tests for app
├── wrangler.toml -> Configuration for Cloudflare workers
├── package.json
├── README.md
├── .eslintrc.json
├── .prettierignore
├── .prettierrc.json
└── .gitignore
```## Configuring project
Before starting, you'll need a [Discord app](https://discord.com/developers/applications) with the following permissions:
- `bot` with the `Send Messages` and `Use Slash Command` permissions
- `applications.commands` scope> ⚙️ Permissions can be configured by clicking on the `OAuth2` tab and using the `URL Generator`. After a URL is generated, you can install the app by pasting that URL into your browser and following the installation flow.
## Creating your Cloudflare worker
Next, you'll need to create a Cloudflare Worker.
- Visit the [Cloudflare dashboard](https://dash.cloudflare.com/)
- Click on the `Workers` tab, and create a new service using the same name as your Discord bot## Running locally
First clone the project:
```
git clone https://github.com/discord/cloudflare-sample-app.git
```Then navigate to its directory and install dependencies:
```
cd cloudflare-sample-app
npm install
```> ⚙️ The dependencies in this project require at least v18 of [Node.js](https://nodejs.org/en/)
### Local configuration
> 💡 More information about generating and fetching credentials can be found [in the tutorial](https://discord.com/developers/docs/tutorials/hosting-on-cloudflare-workers#storing-secrets)
Rename `example.dev.vars` to `.dev.vars`, and make sure to set each variable.
**`.dev.vars` contains sensitive data so make sure it does not get checked into git**.
### Register commands
The following command only needs to be run once:
```
$ npm run register
```### Run app
Now you should be ready to start your server:
```
$ npm run dev
```### Setting up ngrok
When a user types a slash command, Discord will send an HTTP request to a given endpoint. During local development this can be a little challenging, so we're going to use a tool called `ngrok` to create an HTTP tunnel.
```
$ npm run ngrok
```![forwarding](https://user-images.githubusercontent.com/534619/157511497-19c8cef7-c349-40ec-a9d3-4bc0147909b0.png)
This is going to bounce requests off of an external endpoint, and forward them to your machine. Copy the HTTPS link provided by the tool. It should look something like `https://8098-24-22-245-250.ngrok.io`. Now head back to the Discord Developer Dashboard, and update the "Interactions Endpoint URL" for your bot:
![interactions-endpoint](https://user-images.githubusercontent.com/534619/157510959-6cf0327a-052a-432c-855b-c662824f15ce.png)
This is the process we'll use for local testing and development. When you've published your bot to Cloudflare, you will _want to update this field to use your Cloudflare Worker URL._
## Deploying app
This repository is set up to automatically deploy to Cloudflare Workers when new changes land on the `main` branch. To deploy manually, run `npm run publish`, which uses the `wrangler publish` command under the hood. Publishing via a GitHub Action requires obtaining an [API Token and your Account ID from Cloudflare](https://developers.cloudflare.com/workers/wrangler/cli-wrangler/authentication/#generate-tokens). These are stored [as secrets in the GitHub repository](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository), making them available to GitHub Actions. The following configuration in `.github/workflows/ci.yaml` demonstrates how to tie it all together:
```yaml
release:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs: [test, lint]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- run: npm install
- run: npm run publish
env:
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
```### Storing secrets
The credentials in `.dev.vars` are only applied locally. The production service needs access to credentials from your app:
```
$ wrangler secret put DISCORD_TOKEN
$ wrangler secret put DISCORD_PUBLIC_KEY
$ wrangler secret put DISCORD_APPLICATION_ID
```## Questions?
Feel free to post an issue here, or reach out to [@justinbeckwith](https://twitter.com/JustinBeckwith)!