initial commit

This commit is contained in:
2026-01-23 17:54:11 +01:00
commit 273266abb7
8 changed files with 129 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
status-bot
.env

3
crontab Normal file
View File

@@ -0,0 +1,3 @@
# crontab
CRON_TZ=Europe/Budapest
0 7 * * 2 curl -X POST http://discord_bot:8080/create-thread

24
docker-compose.yaml Normal file
View File

@@ -0,0 +1,24 @@
version: "3.9"
services:
bot:
image: golang:1.25.6-alpine
container_name: discord_status_bot
working_dir: /app
volumes:
- .:/app
command: go run main.go
environment:
DISCORD_BOT_TOKEN: ${DISCORD_BOT_TOKEN}
DISCORD_CHANNEL_ID: ${DISCORD_CHANNEL_ID}
ARCHIVE_DURATION: ${ARCHIVE_DURATION}
THREAD_NAME: ${THREAD_NAME}
cron:
image: alpine
container_name: discord_status_cron
depends_on:
- discord_status_bot
volumes:
- ./crontab:/etc/crontabs/root:ro
command: sh -c "apk add --no-cache curl && crond -f"

1
env-example Normal file
View File

@@ -0,0 +1 @@
.env

3
go.mod Normal file
View File

@@ -0,0 +1,3 @@
module status-bot
go 1.25.6

64
lib/sender.go Normal file
View File

@@ -0,0 +1,64 @@
package lib
import (
"bytes"
"encoding/json"
"log"
"net/http"
"os"
"strconv"
"time"
)
const DISCORD_API = "https://discord.com/api/v10"
type ThreadRequest struct {
Name string `json:"name"`
Auto_archive_duration int `json:"auto_archive_duration"`
}
type StatusBotSender struct {
}
func (bot *StatusBotSender) GetArchiveDuration() int {
v, err := strconv.Atoi(os.Getenv("ARCHIVE_DURATION"))
if err != nil {
return 10080
}
return v
}
func (bot *StatusBotSender) GetThreadName() string {
loc, _ := time.LoadLocation("Europe/Budapest")
base := os.Getenv("THREAD_NAME")
date := time.Now().In(loc).Format("2006-01-02")
return base + " (" + date + ")"
}
func (bot *StatusBotSender) BuildBody() ([]byte, error) {
return json.Marshal(ThreadRequest{
Name: bot.GetThreadName(),
Auto_archive_duration: bot.GetArchiveDuration(),
})
}
func (bot *StatusBotSender) BuildRequest(body []byte) (*http.Request, error) {
req, err := http.NewRequest(
"POST",
DISCORD_API+"/channels/"+os.Getenv("DISCORD_CHANNEL_ID")+"/threads",
bytes.NewBuffer(body),
)
req.Header.Set("Authorization", "Bot "+os.Getenv("DISCORD_BOT_TOKEN"))
req.Header.Set("Content-Type", "application/json")
return req, err
}
func (bot *StatusBotSender) SendCreateThreadRequest() error {
body, _ := bot.BuildBody()
req, _ := bot.BuildRequest(body)
log.Println(req.Method, req.URL.String(), req.Header.Values("Authorization"))
log.Println("Sending request to create thread:", string(body))
res, _ := http.DefaultClient.Do(req)
log.Println("Response status:", res.Status)
return nil
}

21
lib/server.go Normal file
View File

@@ -0,0 +1,21 @@
package lib
import (
"log"
"net/http"
)
type StatusBotServer struct {
}
func (server *StatusBotServer) createThreadHandler(w http.ResponseWriter, r *http.Request) {
bot := &StatusBotSender{}
bot.SendCreateThreadRequest()
w.WriteHeader(http.StatusOK)
}
func (server *StatusBotServer) Start() {
http.HandleFunc("/create-thread", server.createThreadHandler)
log.Println("Starting server on :8080")
http.ListenAndServe(":8080", nil)
}

11
main.go Normal file
View File

@@ -0,0 +1,11 @@
// main.go
package main
import "status-bot/lib"
func main() {
server := &lib.StatusBotServer{}
bot := &lib.StatusBotSender{}
bot.SendCreateThreadRequest()
server.Start()
}