This commit is contained in:
2025-05-28 02:10:12 +09:00
commit 7b322ed116
2 changed files with 242 additions and 0 deletions

11
go.mod Normal file
View File

@@ -0,0 +1,11 @@
module splaschedbot
go 1.24.1
require github.com/bwmarrin/discordgo v0.29.0
require (
github.com/gorilla/websocket v1.4.2 // indirect
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect
)

231
main.go Normal file
View File

@@ -0,0 +1,231 @@
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"time"
"unicode/utf8"
"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.BankaraChallenge {
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)
}
}
}