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 MessageRequest struct { Content string `json:"content"` } type ThreadResponse struct { ID string `json:"id"` } 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) BuildThreadBody() ([]byte, error) { return json.Marshal(ThreadRequest{ Name: bot.GetThreadName(), Auto_archive_duration: bot.GetArchiveDuration(), }) } func (bot *StatusBotSender) BuildThreaMessagedBody() ([]byte, error) { { return json.Marshal(MessageRequest{ Content: os.Getenv("THREAD_MESSAGE"), }) } } func (bot *StatusBotSender) BuildThreadMessageRequest(body []byte, channel_id string) (*http.Request, error) { req, err := http.NewRequest( "POST", DISCORD_API+"/channels/"+channel_id+"/messages", 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) BuildThreadRequest(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.BuildThreadBody() req, _ := bot.BuildThreadRequest(body) log.Println("Sending request to create thread:", string(body)) res, _ := http.DefaultClient.Do(req) log.Println("Response status:", res.Status) var tr ThreadResponse json.NewDecoder(res.Body).Decode(&tr) if tr.ID != "" { msg := os.Getenv("THREAD_MESSAGE") msg_body, _ := bot.BuildThreaMessagedBody() msg_req, _ := bot.BuildThreadMessageRequest(msg_body, tr.ID) log.Println("Sending message to thread:", msg) _, err := http.DefaultClient.Do(msg_req) if err != nil { return err } } return nil }