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