diff --git a/cmd/vanity-tester-backend/database.go b/cmd/vanity-tester-backend/database.go index b8fb873..d4fa522 100644 --- a/cmd/vanity-tester-backend/database.go +++ b/cmd/vanity-tester-backend/database.go @@ -6,7 +6,6 @@ import ( func createDb(db *sql.DB) error { var exists bool - // rows := db.QueryRow("SELECT EXISTS (SELECT 1 FROM sqlite_schema WHERE type='table' AND name='seventv_ids') AND EXISTS (SELECT 1 FROM sqlite_schema WHERE type='table' AND name='seventv_ids');") err := db.QueryRow(`SELECT EXISTS (SELECT 1 FROM sqlite_schema WHERE type='table' AND name='seventv_ids') AND EXISTS (SELECT 1 FROM sqlite_schema WHERE type='table' AND name='seventv_ids');`).Scan(&exists) if err != nil { return err diff --git a/cmd/vanity-tester-backend/gql.go b/cmd/vanity-tester-backend/gql.go index 84b4ff4..83e0859 100644 --- a/cmd/vanity-tester-backend/gql.go +++ b/cmd/vanity-tester-backend/gql.go @@ -34,7 +34,7 @@ func (s *Gql) getUserID(username string) (string, error) { if err != nil { return "", logger.Error().GetCtx().Err() } - logger.Trace().Msg(string(data)) + // logger.Trace().Msg(string(data)) request, err := http.NewRequest("POST", "https://gql.twitch.tv/gql", bytes.NewBuffer(data)) if err != nil { @@ -52,6 +52,9 @@ func (s *Gql) getUserID(username string) (string, error) { defer res.Body.Close() body, err := io.ReadAll(res.Body) + if err != nil { + logger.Error().Msg("Failed to get user ID from Twitch GQL: " + err.Error()) + } return string(body), nil } diff --git a/cmd/vanity-tester-backend/parser.go b/cmd/vanity-tester-backend/parser.go index 7ef569e..f70b72f 100644 --- a/cmd/vanity-tester-backend/parser.go +++ b/cmd/vanity-tester-backend/parser.go @@ -17,11 +17,9 @@ import ( // } type _Bttv struct { - Badges []struct { - Name string `json:"name"` - Url map[string]string `json:"url"` - Users []string `json:"users"` - } `json:"badges"` + Name string `json:"name"` + Url map[string]string `json:"url"` + Users []string `json:"users"` } // TODO @@ -51,6 +49,18 @@ type defaultFormat struct { 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"` @@ -94,16 +104,17 @@ type _FrankerFzAp struct { type Format struct { wg sync.WaitGroup - SevenTv SevenTvBadges `json:"seventv"` - Chatterino []defaultFormat `json:"chatterino"` - Ffz []_FrankerFz `json:"frankerfacez"` - FfzAp []_FrankerFzAp `json:"frankerfacez_ap"` - Bttv _Bttv `json:"betterttv"` - DankChat []defaultFormat `json:"dankchat"` - Homies []defaultFormat `json:"homies"` - PurpleTv []defaultFormat `json:"purpletv"` - Chatty []defaultFormat `json:"chatty"` - Chatsen []defaultFormat `json:"chatsen"` + 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 @@ -282,51 +293,68 @@ func formatHomiesBadges(format *Format) { 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 { - Name string `json:"name"` - Url struct { - Image1 string `json:"1"` - Image2 string `json:"2"` - Image4 string `json:"4"` - } `json:"url"` - Users []string `json:"users"` + ID string `json:"id"` + 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, + 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, }, - Users: badge.Users, }) } for _, badge := range data.BadgesTwo.Badges { format.Homies = append(format.Homies, 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"` + ID string `json:"id"` + 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, + // 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, }, - Users: badge.Users, }) } } @@ -452,6 +480,38 @@ func formatChatsen(format *Format) { } } +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() @@ -467,7 +527,7 @@ func formatSevenTvBadges(format *Format) { data := &SevenTv{} data.getBadges() - format.SevenTv = data.Badges + format.SevenTv = &data.Badges.Data.Cosmetics.Badges // badges, err := json.Marshal(data.Badges.Data.Cosmetics) // if err != nil { @@ -502,16 +562,17 @@ func formatAllBadges() string { format := &Format{} // format.wg.Add(7) - formatSevenTvBadges(format) + // formatSevenTvBadges(format) // formatChatterino(format) // formatFfz(format) // formatFfzAp(format) // formatDankChat(format) // formatChatsen(format) // go formatBttv(format) - // formatHomiesBadges(format) + formatHomiesBadges(format) // formatPurpleTv(format) // formatChatty(format) + // formatTwitch(format) // format.wg.Wait() diff --git a/cmd/vanity-tester-backend/providers.go b/cmd/vanity-tester-backend/providers.go index c082308..84a5de8 100644 --- a/cmd/vanity-tester-backend/providers.go +++ b/cmd/vanity-tester-backend/providers.go @@ -27,19 +27,12 @@ type Chatterino struct { } type SevenTvBadges struct { - Data struct { - Cosmetics struct { - Badges []struct { - ID string `json:"id"` - Kind string `json:"kind"` - Name string `json:"name"` - Tooltip string `json:"tooltip"` - Tag string `json:"tag"` - Typename string `json:"__typename"` - } `json:"badges"` - Typename string `json:"__typename"` - } `json:"cosmetics"` - } `json:"data"` + ID string `json:"id"` + Kind string `json:"kind"` + Name string `json:"name"` + Tooltip string `json:"tooltip"` + Tag string `json:"tag"` + Typename string `json:"__typename"` } type SevenTv struct { @@ -62,7 +55,14 @@ type SevenTv struct { } `json:"data"` } // 7tv Badges - Badges SevenTvBadges `json:"sevenTvBadges"` + Badges struct { + Data struct { + Cosmetics struct { + Badges []SevenTvBadges `json:"badges"` + Typename string `json:"__typename"` + } `json:"cosmetics"` + } `json:"data"` + } `json:"sevenTvBadges"` // 7tv Paints Name string `json:"name"` Paints struct { @@ -212,6 +212,29 @@ type Chatsen struct { } } +// Twitch +type ClickAction string + +const ( + SubscribeToChannel ClickAction = "subscribe_to_channel" + Turbo ClickAction = "turbo" + VisitURL ClickAction = "visit_url" +) + +type Twitch []struct { + SetID string `json:"set_id"` + Versions []struct { + ID string `json:"id"` + ImageURL1X string `json:"image_url_1x"` + ImageURL2X string `json:"image_url_2x"` + ImageURL4X string `json:"image_url_4x"` + Title string `json:"title"` + Description string `json:"description"` + ClickAction *ClickAction `json:"click_action"` + ClickURL *string `json:"click_url"` + } `json:"versions"` +} + func doGetRequest(url string) []byte { request, err := http.NewRequest("GET", url, nil) if err != nil { @@ -277,7 +300,7 @@ func (s *SevenTv) getBadges() *SevenTv { } res := doPostRequest("https://7tv.io/v3/gql", data) - logger.Trace().Msg(string(res)) + // logger.Trace().Msg(string(res)) err = json.Unmarshal(res, &s.Badges) if err != nil { @@ -477,3 +500,12 @@ func (s *Chatsen) getBadges() *Chatsen { } return s } + +func (s *Twitch) getBadges() *Twitch { + res := doGetRequest("https://api.ivr.fi/v2/twitch/badges/global") + err := json.Unmarshal(res, &s) + if err != nil { + logger.Error().Msg(err.Error()) + } + return s +}