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) }