Merge pull request #4 from the-programmers-hangout/minor-changes

"Minor changes"
This commit is contained in:
Khinshan Khan
2025-03-29 08:56:37 -04:00
committed by GitHub
3 changed files with 90 additions and 42 deletions
+2 -2
View File
@@ -17,12 +17,12 @@ jobs:
- uses: docker/setup-qemu-action@v3 - uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3 - uses: docker/setup-buildx-action@v3
- name: Get image repository - name: Get image repository
run: echo IMAGE_REPOSITORY=$(echo ghcr.io/the-programmers-hangout/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV run: echo IMAGE_REPOSITORY=$(echo ghcr.io/${{ github.repository }} | tr '[:upper:]' '[:lower:]') >> $GITHUB_ENV
- name: Login to registry - name: Login to registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ghcr.io registry: ghcr.io
username: the-programmers-hangout username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image - name: Build and push Docker image
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
+47 -1
View File
@@ -4,6 +4,23 @@ A playful Discord bot that sends random praises and (occasionally) a conspiracy
## Setup ## Setup
### Create a Discord Bot
> [!WARNING]
> Discord updates frequently -- if any steps seem outdated, refer to the official docs:
> https://discord.com/developers/docs/intro
1. Log into Discord.
2. Go to [Discord Developer Portal](https://discord.com/developers/applications)
3. Click "New Application", give it a name, and create it.
4. In the sidebar, go to Bot, click "Add Bot".
5. Under OAuth2 > URL Generator:
1. Select "bot" scope.
2. Under Bot Permissions, check at least:
- Send Messages
6. Use the generated URL to invite the bot to your server.
7. In the Bot tab, click "Reset Token", copy the token and save it in your `.env` (view next step).
### Configuration ### Configuration
Create a `.env` file in the root of your project with the following keys: Create a `.env` file in the root of your project with the following keys:
@@ -21,8 +38,37 @@ Create a `.env` file in the root of your project with the following keys:
- `CONSPIRACY_PROBABILITY`: Probability (from 0.0 to 1.0) that a conspiracy message is sent after a praise. Eg, 0.4 = - `CONSPIRACY_PROBABILITY`: Probability (from 0.0 to 1.0) that a conspiracy message is sent after a praise. Eg, 0.4 =
40% chance. 40% chance.
You can view the [.env-sample](./.env-sample) as an example. You can view the [.env-sample](./.env-sample) as an example completed template.
### Install + Run
#### Vanilla (Local Dev)
1. Install Go via https://go.dev/doc/install
2. Install Make if you don't have it via https://www.gnu.org/software/make/
3. Run:
```bash
make # builds the bot
./bin/bot # starts the bot
```
#### Docker
> We maintain a ghcr image at ghcr.io/the-programmers-hangout/swiftspiracy-bot:latest
1. Pull the image:
```bash
docker pull ghcr.io/the-programmers-hangout/swiftspiracy-bot:latest
```
2. Run it with your `.env` file:
```bash
docker run --env-file ./.env ghcr.io/the-programmers-hangout/swiftspiracy-bot:latest
```
## Notes ## Notes
- The bot gracefully shuts down on CTRL+C. - The bot gracefully shuts down on CTRL+C.
- Conspiracy messages are deleted after a short delay to keep the mystery alive, you should configure it to be low.
- Messages are sourced from [praises.json](./cmd/bot/praises.json) and
[conspiracies.json](./cmd/bot/conspiracies.json). If your timings for message are too short for the duration the bot
runs, the messages will repeat.
+41 -39
View File
@@ -25,26 +25,63 @@ var praisesFile embed.FS
var conspiraciesFile embed.FS var conspiraciesFile embed.FS
var ( var (
// messages sourced from the embedded files
praises []string praises []string
conspiracies []string conspiracies []string
// internally track which messages have been sent
praiseIndex int praiseIndex int
conspiracyIndex int conspiracyIndex int
) )
// Settings for bot sourced from env variables
var ( var (
botToken string botToken string
channelID string channelID string
)
var (
SendMessageIntervalMin int SendMessageIntervalMin int
SendMessageIntervalMax int SendMessageIntervalMax int
SendMessageUnit time.Duration SendMessageUnit time.Duration
DeleteConspiracyDelay time.Duration
ConspiracyProbability float64 DeleteConspiracyDelay time.Duration
ConspiracyProbability float64
) )
func main() {
if err := loadEnvConfig(); err != nil {
log.Fatalf("[x] Failed to load configuration: %v", err)
}
// Load messages at build time
if err := loadMessages(); err != nil {
log.Fatalf("[x] Error loading messages: %v", err)
}
// Initialize bot session
dg, err := discordgo.New("Bot " + botToken)
if err != nil {
log.Fatalf("[x] Error creating Discord session: %v", err)
}
// Open WebSocket connection
dg.AddHandler(readyHandler)
if err := dg.Open(); err != nil {
log.Fatalf("[x] Error opening connection: %v", err)
}
defer dg.Close()
// Start the message scheduler
go startScheduler(dg, channelID)
// Graceful shutdown handling
log.Println("[✓] Swiftspiracy Bot is now running. Press CTRL+C to exit.")
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
log.Println("[↓] Shutting down bot gracefully...")
}
func loadEnvConfig() error { func loadEnvConfig() error {
if err := godotenv.Load(); err != nil { if err := godotenv.Load(); err != nil {
log.Println("[!] No .env file found, using system environment variables.") log.Println("[!] No .env file found, using system environment variables.")
@@ -94,41 +131,6 @@ func loadEnvConfig() error {
return nil return nil
} }
func main() {
if err := loadEnvConfig(); err != nil {
log.Fatalf("[x] Failed to load configuration: %v", err)
}
// Load messages at build time
if err := loadMessages(); err != nil {
log.Fatalf("[x] Error loading messages: %v", err)
}
// Initialize bot session
dg, err := discordgo.New("Bot " + botToken)
if err != nil {
log.Fatalf("[x] Error creating Discord session: %v", err)
}
// Open WebSocket connection
dg.AddHandler(readyHandler)
if err := dg.Open(); err != nil {
log.Fatalf("[x] Error opening connection: %v", err)
}
defer dg.Close()
// Start the message scheduler
go startScheduler(dg, channelID)
// Graceful shutdown handling
log.Println("[✓] Swiftspiracy Bot is now running. Press CTRL+C to exit.")
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
log.Println("[↓] Shutting down bot gracefully...")
}
// loadMessages loads JSON files into memory at build time // loadMessages loads JSON files into memory at build time
func loadMessages() error { func loadMessages() error {
var err error var err error