mcm-discord/discord/sync.go

62 lines
1.6 KiB
Go

package discord
import (
"fmt"
"strings"
"git.jojodev.com/minecraft/mcm-discord/database"
"git.jojodev.com/minecraft/mcm-discord/discord/rest"
"github.com/Karitham/corde"
)
func (d Discord) sync(w corde.ResponseWriter, i *corde.Interaction) {
members, err := rest.Members(i.GuildID.String(), d.token)
if err != nil {
w.Respond(corde.NewResp().Content("Could not sync.").Ephemeral())
return
}
syncPlayer := func(pl *database.Player) (bool, error) {
for _, member := range members {
name := member.Nick
if name == "" {
name = member.User.Username
}
if strings.EqualFold(pl.Username, name) {
return true, d.store.PlayerUpdateDiscordID(member.User.ID, pl.ID)
}
}
return false, nil
}
players, err := d.store.PlayersByDiscordIsNull()
if err != nil {
w.Respond(corde.NewResp().Content("Could not sync.").Ephemeral())
return
}
needed, err := d.store.PlayersByDiscordIsNullCount()
if err != nil {
w.Respond(corde.NewResp().Content("Could not sync.").Ephemeral())
return
}
var synced []string
var notSynced []string
if needed > 0 {
for _, player := range players {
ok, err := syncPlayer(player)
if err != nil {
w.Respond(corde.NewResp().Content("Could not sync.").Ephemeral())
return
}
if ok {
synced = append(synced, player.Username)
continue
}
notSynced = append(notSynced, player.Username)
}
}
txt := fmt.Sprintf("Synced\n\t%s\n\nNot Synced\n\t%s", strings.Join(synced, "\n\t"), strings.Join(notSynced, "\n\t"))
w.Respond(corde.NewResp().Attachment(strings.NewReader(txt), "sync.txt").Contentf("Successfully synced %d/%d players.", len(synced), needed))
}