initial commit
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
status-bot
|
||||
.env
|
||||
3
crontab
Normal file
3
crontab
Normal 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
24
docker-compose.yaml
Normal 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
1
env-example
Normal file
@@ -0,0 +1 @@
|
||||
.env
|
||||
64
lib/sender.go
Normal file
64
lib/sender.go
Normal 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
21
lib/server.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user