Files
splaschedbot/main.go

233 lines
5.5 KiB
Go
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"time"
"github.com/bwmarrin/discordgo"
)
type AutoGenerated struct {
Result struct {
Regular []struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Rule struct {
Key string `json:"key"`
Name string `json:"name"`
} `json:"rule"`
Stages []struct {
ID int `json:"id"`
Name string `json:"name"`
Image string `json:"image"`
} `json:"stages"`
IsFest bool `json:"is_fest"`
} `json:"regular"`
BankaraChallenge []struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Rule struct {
Key string `json:"key"`
Name string `json:"name"`
} `json:"rule"`
Stages []struct {
ID int `json:"id"`
Name string `json:"name"`
Image string `json:"image"`
} `json:"stages"`
IsFest bool `json:"is_fest"`
} `json:"bankara_challenge"`
BankaraOpen []struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Rule struct {
Key string `json:"key"`
Name string `json:"name"`
} `json:"rule"`
Stages []struct {
ID int `json:"id"`
Name string `json:"name"`
Image string `json:"image"`
} `json:"stages"`
IsFest bool `json:"is_fest"`
} `json:"bankara_open"`
X []struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Rule struct {
Key string `json:"key"`
Name string `json:"name"`
} `json:"rule"`
Stages []struct {
ID int `json:"id"`
Name string `json:"name"`
Image string `json:"image"`
} `json:"stages"`
IsFest bool `json:"is_fest"`
} `json:"x"`
Event []struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Rule struct {
Key string `json:"key"`
Name string `json:"name"`
} `json:"rule"`
Stages []struct {
ID int `json:"id"`
Name string `json:"name"`
Image string `json:"image"`
} `json:"stages"`
Event struct {
ID string `json:"id"`
Name string `json:"name"`
Desc string `json:"desc"`
} `json:"event"`
IsFest bool `json:"is_fest"`
} `json:"event"`
Fest []struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Rule any `json:"rule"`
Stages any `json:"stages"`
IsFest bool `json:"is_fest"`
IsTricolor bool `json:"is_tricolor"`
TricolorStages any `json:"tricolor_stages"`
} `json:"fest"`
FestChallenge []struct {
StartTime time.Time `json:"start_time"`
EndTime time.Time `json:"end_time"`
Rule any `json:"rule"`
Stages any `json:"stages"`
IsFest bool `json:"is_fest"`
IsTricolor bool `json:"is_tricolor"`
TricolorStages any `json:"tricolor_stages"`
} `json:"fest_challenge"`
} `json:"result"`
}
type msgidstore struct {
filepath string
}
func NewMsgIDStore() *msgidstore {
return &msgidstore{filepath: os.Getenv("MSGIDSTORE_FILEPATH")}
}
func (s *msgidstore) Set(id string) error {
// Open file for writing
file, err := os.OpenFile(s.filepath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
return err
}
defer file.Close()
// Write the message ID to the file
_, err = file.WriteString(id)
if err != nil {
return err
}
return nil
}
func (s *msgidstore) Exist() bool {
// Check if the file exists
_, err := os.Stat(s.filepath)
if os.IsNotExist(err) {
return false
}
return err == nil
}
func (s *msgidstore) Get() (string, error) {
// Open file for reading
file, err := os.Open(s.filepath)
if err != nil {
return "", err
}
defer file.Close()
// Read the message ID from the file
var id string
_, err = fmt.Fscanf(file, "%s", &id)
if err != nil {
return "", err
}
return id, nil
}
func main() {
discordChannelId := os.Getenv("DISCORD_CHANNEL_ID")
discordToken := os.Getenv("DISCORD_TOKEN")
discord, err := discordgo.New("Bot " + discordToken)
if err != nil {
panic(err)
}
url := "https://spla3.yuu26.com/api/schedule"
resp, err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
byteArray, _ := io.ReadAll(resp.Body)
var data AutoGenerated
err = json.Unmarshal(byteArray, &data)
if err != nil {
panic(err)
}
output := "バンカラオープン スケジュール\n"
output += "```\n"
for _, v := range data.Result.BankaraOpen {
output += fmt.Sprintf("%d/%d %2d:%02d- ", v.StartTime.Month(), v.StartTime.Day(), v.StartTime.Hour(), v.StartTime.Minute())
output += v.Rule.Name
/*
length := utf8.RuneCountInString(v.Rule.Name)
fill := (13 - length)
for range fill {
output += " "
}
for _, stage := range v.Stages {
output += fmt.Sprintf("%s ", stage.Name)
length := utf8.RuneCountInString(stage.Name)
fill := (11 - length)
for range fill {
output += " "
}
}
*/
output += fmt.Sprintln()
}
output += "```\n"
output += "updated at " + time.Now().Format("1/2 15:04") + "\n"
print(output)
msgidstore := NewMsgIDStore()
if msgidstore.Exist() {
id, err := msgidstore.Get()
if err != nil {
panic(err)
}
// If the message ID exists, edit the message
_, err = discord.ChannelMessageEdit(discordChannelId, id, output)
if err != nil {
panic(err)
}
} else {
msg, err := discord.ChannelMessageSend(discordChannelId, output)
if err != nil {
panic(err)
}
// Store msg ID
err = msgidstore.Set(msg.ID)
if err != nil {
panic(err)
}
}
}