vanity-tester-backend-go/cmd/vanity-tester-backend/parser.go
2025-02-17 01:27:29 -03:00

584 lines
13 KiB
Go

package main
import (
"encoding/json"
"strconv"
"sync"
)
// type _Chatterino []struct {
// Name string `json:"name"`
// Url struct {
// Image1 string `json:"1"`
// Image2 string `json:"2"`
// Image4 string `json:"4"`
// } `json:"url"`
// Users []string `json:"users"`
// }
type _Bttv struct {
Name string `json:"name"`
Url map[string]string `json:"url"`
Users []string `json:"users"`
}
// TODO
// type _Chatty struct {
// Name string `json:"name"`
// Url []struct {
// Image1 string `json:"1"`
// Image2 string `json:"2"`
// Image4 string `json:"4"`
// } `json:"url"`
// Users []string `json:"users"`
// }
// type _DankChat []struct {
// Name string `json:"name"`
// Url string `json:"url"`
// Users []string `json:"users"`
// }
type defaultFormat struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}
type _Homies struct {
ID string `json:"id"`
// Name string `json:"name"`
// Url struct {
// Image1 string `json:"1"`
// Image2 string `json:"2"`
// Image4 string `json:"4"`
// } `json:"url"`
// Users []string `json:"users"`
defaultFormat
}
type _FrankerFz struct {
Name string `json:"name"`
Color string `json:"color"`
ID int64 `json:"id"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}
type _FrankerFzAp struct {
ID string `json:"id"`
BadgeColor *string `json:"badge_color,omitempty"`
BadgeIsColored *int64 `json:"badge_is_colored,omitempty"`
Tier int64 `json:"tier"`
Admin *int64 `json:"admin,omitempty"`
}
// 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
SevenTv *[]SevenTvBadges `json:"seventv"`
Chatterino []defaultFormat `json:"chatterino"`
Ffz []_FrankerFz `json:"frankerfacez"`
FfzAp []_FrankerFzAp `json:"frankerfacez_ap"`
Bttv []defaultFormat `json:"betterttv"`
DankChat []defaultFormat `json:"dankchat"`
Homies []_Homies `json:"homies"`
PurpleTv []defaultFormat `json:"purpletv"`
Chatty []defaultFormat `json:"chatty"`
Chatsen []defaultFormat `json:"chatsen"`
Twitch []defaultFormat `json:"twitch"`
}
// Done
func formatChatterino(format *Format) {
// defer format.wg.Done()
chatterino := &Chatterino{}
chatterino.getBadges()
for _, badge := range chatterino.Badges {
format.Chatterino = append(format.Chatterino, struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Tooltip,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: badge.Image1,
Image2: badge.Image2,
Image4: 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 = append(format.Ffz, struct {
Name string `json:"name"`
Color string `json:"color"`
ID int64 `json:"id"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Name,
Color: badge.Color,
ID: badge.ID,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: badge.Image,
Image2: badge.Image,
Image4: badge.Image,
},
})
// for _, badge := range data.Badges {
// format.Ffz = append(format.Ffz, struct {
// Name string `json:"name"`
// Url struct {
// Image1 string `json:"1"`
// Image2 string `json:"2"`
// Image4 string `json:"4"`
// } `json:"url"`
// Users []string `json:"users"`
// }{
// Name: badge.Name,
// Name: badge.Name,
// Name: badge.Name,
// }
// )
// }
}
for id, userIDs := range data.Users {
badgeID, err := strconv.ParseInt(id, 10, 64)
if err != nil {
continue
}
for i := range format.Ffz {
if format.Ffz[i].ID == badgeID {
for _, userID := range userIDs {
format.Ffz[i].Users = append(format.Ffz[i].Users, strconv.FormatInt(userID, 10))
}
break
}
}
}
}
// Done?
func formatFfzAp(format *Format) {
// defer format.wg.Done()
data := &FrankerFzAp{}
data.getBadges()
// fmt.Println((*data)[0])
for _, badge := range *data {
format.FfzAp = append(format.FfzAp, struct {
ID string `json:"id"`
BadgeColor *string `json:"badge_color,omitempty"`
BadgeIsColored *int64 `json:"badge_is_colored,omitempty"`
Tier int64 `json:"tier"`
Admin *int64 `json:"admin,omitempty"`
}{
ID: badge.ID,
BadgeColor: badge.BadgeColor,
BadgeIsColored: badge.BadgeIsColored,
Tier: badge.Tier,
Admin: badge.Admin,
})
}
}
// 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()
// Gets rid of the "DankChat Top Supporter" badge ;)
for i, badge := range data.Badges {
if badge.Type == "DankChat Top Supporter" {
data.Badges = append(data.Badges[:i], data.Badges[i+1:]...)
}
}
for _, badge := range data.Badges {
format.DankChat = append(format.DankChat, struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Type,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: badge.URL,
Image2: badge.URL,
Image4: badge.URL,
},
Users: badge.Users,
})
}
}
func formatHomiesBadges(format *Format) {
// defer format.wg.Done()
data := &Homies{}
data.getBadges()
data.getBadgesTwo()
// var mergedBadges []Homies
// for i := range data.Badges.Badges {
// mergedBadges[data.Badges.Badges[i].Tooltip] = &badges1.Badges[i]
// }
// // Iterate through the second set of badges
// for _, badge := range badges2.Badges {
// // Check if a badge with the same tooltip exists in the map
// if existingBadge, ok := badgeMap[badge.Tooltip]; ok {
// // Combine users if the existing badge has users
// if badge.Users != nil {
// existingBadge.Users = append(existingBadge.Users, badge.Users...)
// }
// } else {
// // Add new badge to the map and the badges1.Badges slice
// badgeMap[badge.Tooltip] = &badge
// badges1.Badges = append(badges1.Badges, badge)
// }
// }
for _, badge := range data.Badges.Badges {
format.Homies = append(format.Homies, struct {
ID string `json:"id"`
defaultFormat
}{
ID: badge.ID,
defaultFormat: defaultFormat{
Name: badge.Tooltip,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: badge.Image1,
Image2: badge.Image2,
Image4: badge.Image3,
},
Users: badge.Users,
},
})
}
for _, badge := range data.BadgesTwo.Badges {
format.Homies = append(format.Homies, struct {
ID string `json:"id"`
defaultFormat
}{
// ID: badge.ID,
defaultFormat: defaultFormat{
Name: badge.Tooltip,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: badge.Image1,
Image2: badge.Image2,
Image4: 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 {
if user.UserID == "157861306" {
continue
}
users = append(users, user.UserID)
}
format.PurpleTv = append(format.PurpleTv, struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: "PurpleTV Developer",
// ID of user @n0pbreak
Users: []string{"157861306"},
})
format.PurpleTv = append(format.PurpleTv, struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: "PurpleTV Supporter",
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: data.DefaultBadgeURL,
Image2: data.DefaultBadgeURL,
Image4: 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 = append(format.Chatty, struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: badge.MetaTitle,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
// Chatty API doesn't include the URI schemein their imageURLs
Image1: "https:" + badge.ImageURL,
Image2: "https:" + badge.ImageURL2,
Image4: "https:" + badge.ImageURL4,
},
Users: badge.Usernames,
})
}
}
func formatChatsen(format *Format) {
// defer format.wg.Done()
data := &Chatsen{}
data.getBadges()
for _, badge := range data.Badges {
format.Chatsen = append(format.Chatsen, struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: badge.Name,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: badge.Mipmap[0],
Image2: badge.Mipmap[0],
Image4: badge.Mipmap[0],
},
Users: badge.Users,
})
}
}
func formatTwitch(format *Format) {
// defer format.wg.Done()
data := &Twitch{}
data.getBadges()
for _, badge := range *(data) {
for _, version := range badge.Versions {
format.Twitch = append(format.Twitch, struct {
Name string `json:"name"`
Url struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
} `json:"url"`
Users []string `json:"users"`
}{
Name: version.Title,
Url: struct {
Image1 string `json:"1"`
Image2 string `json:"2"`
Image4 string `json:"4"`
}{
Image1: version.ImageURL1X,
Image2: version.ImageURL2X,
Image4: version.ImageURL4X,
},
Users: []string{},
})
}
}
}
// 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 formatSevenTvBadges(format *Format) {
data := &SevenTv{}
data.getBadges()
format.SevenTv = &data.Badges.Data.Cosmetics.Badges
// 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.Paints)
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)
// formatSevenTvBadges(format)
// formatChatterino(format)
// formatFfz(format)
// formatFfzAp(format)
// formatDankChat(format)
// formatChatsen(format)
// go formatBttv(format)
formatHomiesBadges(format)
// formatPurpleTv(format)
// formatChatty(format)
// formatTwitch(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)
}