vanity-tester-backend-go/cmd/vanity-tester-backend/parser.go

297 lines
6.3 KiB
Go

package main
import (
"encoding/json"
"strconv"
"sync"
)
type _Chatterino struct {
Badges []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
}
type _Bttv struct {
Badges []struct {
Name string `json:"name"`
Url map[string]string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
}
type _FrankerFz struct {
Badges []struct {
ID int64 `json:"id"`
Name string `json:"name"`
Url map[string]string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
}
// TODO
type _Chatty struct {
Badges []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
}
type _DankChat struct {
Badges []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
}
type _Homies struct {
Badges []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
BadgesTwo []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"badges2"`
}
type _PurpleTv struct {
Badges []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
}
type Format struct {
wg sync.WaitGroup
Chatterino _Chatterino `json:"chatterino"`
Ffz _FrankerFz `json:"ffz"`
Bttv _Bttv `json:"bttv"`
DankChat _DankChat `json:"dankchat"`
Homies _Homies `json:"homies"`
PurpleTv _PurpleTv `json:"purpletv"`
Chatty _Chatty `json:"chatty"`
}
// Done
func formatChatterino(format *Format) {
defer format.wg.Done()
chatterino := &Chatterino{}
chatterino.getBadges()
for _, badge := range chatterino.Badges {
format.Chatterino.Badges = append(format.Chatterino.Badges, struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Tooltip,
Url: badge.Image3,
Users: badge.Users,
})
}
}
// Done
func formatFfz(format *Format) {
defer format.wg.Done()
data := &FrankerFz{}
data.getBadges()
for _, badge := range data.Badges {
format.Ffz.Badges = append(format.Ffz.Badges, struct {
ID int64 `json:"id"`
Name string `json:"name"`
Url map[string]string `json:"url"`
Users []string `json:"users"`
}{
ID: badge.ID,
Name: badge.Title,
Url: badge.Urls,
})
}
for id, userIDs := range data.Users {
badgeID, err := strconv.ParseInt(id, 10, 64)
if err != nil {
continue
}
for i := range format.Ffz.Badges {
if format.Ffz.Badges[i].ID == badgeID {
for _, userID := range userIDs {
format.Ffz.Badges[i].Users = append(format.Ffz.Badges[i].Users, strconv.FormatInt(userID, 10))
}
break
}
}
}
}
// TODO
func formatBttv(format *Format) {
defer format.wg.Done()
data := &Bttv{}
data.getBadges()
}
// Done
func formatDankChat(format *Format) {
defer format.wg.Done()
data := &DankChat{}
data.getBadges()
for _, badge := range data.Badges {
format.DankChat.Badges = append(format.DankChat.Badges, struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Type,
Url: badge.URL,
Users: badge.Users,
})
}
}
func formatHomiesBadges(format *Format) {
defer format.wg.Done()
data := &Homies{}
data.getBadges()
data.getBadgesTwo()
for _, badge := range data.Badges.Badges {
format.Homies.Badges = append(format.Homies.Badges, struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Tooltip,
Url: badge.Image3,
Users: badge.Users,
})
}
for _, badge := range data.BadgesTwo.Badges {
format.Homies.BadgesTwo = append(format.Homies.BadgesTwo, struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Tooltip,
Url: badge.Image3,
Users: badge.Users,
})
}
}
// Done
func formatPurpleTv(format *Format) {
defer format.wg.Done()
data := &PurpleTV{}
data.getBadges()
var users []string
for _, user := range data.Users {
users = append(users, user.UserName)
}
format.PurpleTv.Badges = append(format.PurpleTv.Badges, struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
}{
Name: "PurpleTV Supporter",
Url: data.DefaultBadgeURL,
Users: users,
})
}
// TODO: Replace the data from the Chatty struct in place to use less memory.
func formatChatty(format *Format) {
defer format.wg.Done()
data := &Chatty{}
newData := Chatty{}
data.getBadges()
// Removes the elements containing "ffz" or "ffzap" in the ID.
for _, element := range *data {
if (element.ID != "ffz") && (element.ID != "ffzap") {
newData = append(newData, element)
}
}
for _, badge := range newData {
format.Chatty.Badges = append(format.Chatty.Badges, struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
}{
Name: badge.MetaTitle,
Url: badge.ImageURL4,
Users: badge.Usernames,
})
}
}
func formatSevenTvBadges() string {
data := &SevenTv{}
data.getBadges()
badges, err := json.Marshal(data.Badges.Data.Cosmetics)
if err != nil {
logger.Error().Msg(err.Error())
}
return string(badges)
}
func formatSevenTvPaints() string {
data := &SevenTv{}
data.getPaints()
paints, err := json.Marshal(data.Paints.Data.Cosmetics)
if err != nil {
logger.Error().Msg(err.Error())
}
return string(paints)
}
func formatSevenTvUserCosmetics(stvUserID string) string {
data := &SevenTv{}
data.getUserCosmetics(stvUserID)
cosmetics, err := json.Marshal(data.UserCosmetics.Data.User.Cosmetics)
if err != nil {
logger.Error().Msg(err.Error())
}
return string(cosmetics)
}
func formatAllBadges() string {
format := &Format{}
format.wg.Add(7)
go formatChatterino(format)
go formatFfz(format)
go formatDankChat(format)
go formatBttv(format)
go formatHomiesBadges(format)
go formatPurpleTv(format)
go formatChatty(format)
format.wg.Wait()
json, err := json.Marshal(format)
if err != nil {
logger.Error().Msg("Failed to json.Marshal badges: " + err.Error())
}
return string(json)
}