TODO: Chatty, BTTV, Homies endpoints

This commit is contained in:
Fijxu 2025-01-21 22:11:24 -03:00
parent 0bd6137ab4
commit 53344090f2
Signed by: Fijxu
GPG key ID: 32C1DDF333EDA6A4
4 changed files with 245 additions and 91 deletions

View file

@ -3,6 +3,7 @@ package main
import (
"io"
"net/http"
"strings"
)
func root(w http.ResponseWriter, r *http.Request) {
@ -13,6 +14,27 @@ func getAllBadges(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, formatAllBadges())
}
func getSevenTvPaints(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, formatSevenTvPaints())
}
func getSevenTvBadges(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, formatSevenTvBadges())
}
func sevenTvUserCosmetics(w http.ResponseWriter, r *http.Request) {
svt := &SevenTv{}
user := strings.TrimPrefix(r.URL.Path, "/7tv/cosmetics/")
userID, err := svt.getUserID(user)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
logger.Trace().Msg("sevenTvUserCosmetics: user: " + userID)
io.WriteString(w, formatSevenTvUserCosmetics(userID))
}
// func sevenTvPaints(w http.ResponseWriter, r *http.Request) {
// svt := &SevenTv{}
// badges, err := svt.getPaints()
@ -32,15 +54,3 @@ func getAllBadges(w http.ResponseWriter, r *http.Request) {
// }
// io.WriteString(w, badges)
// }
// func sevenTvUserCosmetics(w http.ResponseWriter, r *http.Request) {
// svt := &SevenTv{}
// user := strings.TrimPrefix(r.URL.Path, "/7tv/cosmetics/")
// logger.Trace().Msg("sevenTvUserCosmetics: user: " + user)
// badges, err := svt.getUserCosmetics(user)
// if err != nil {
// http.Error(w, err.Error(), http.StatusInternalServerError)
// return
// }
// io.WriteString(w, badges)
// }

View file

@ -59,12 +59,12 @@ func main() {
mux.HandleFunc("/", root)
mux.HandleFunc("/badges", middleware(getAllBadges))
// mux.HandleFunc("/7tv/paints", middleware(sevenTvPaints))
// mux.HandleFunc("/7tv/badges", middleware(sevenTvBadges))
// // CONSIDERATION: github.com/gorilla/mux may be an option to make use of something like this:
// // mux.HandleFunc("/7tv/cosmetics/{user}", middleware(sevenTvUserCosmetics))
// // For now I will just trim the path
// mux.HandleFunc("/7tv/cosmetics/", middleware(sevenTvUserCosmetics))
mux.HandleFunc("/7tv/badges", middleware(getSevenTvBadges))
mux.HandleFunc("/7tv/paints", middleware(getSevenTvPaints))
// CONSIDERATION: github.com/gorilla/mux may be an option to make use of something like this:
// mux.HandleFunc("/7tv/cosmetics/{user}", middleware(sevenTvUserCosmetics))
// For now I will just trim the path
mux.HandleFunc("/7tv/cosmetics/", middleware(sevenTvUserCosmetics))
srv := &http.Server{
Addr: config.HTTPServer.Addr + ":" + config.HTTPServer.Port,

View file

@ -3,6 +3,7 @@ package main
import (
"encoding/json"
"strconv"
"sync"
)
type _Chatterino struct {
@ -13,16 +14,6 @@ type _Chatterino struct {
} `json:"badges"`
}
type _SevenTv struct {
Badges []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"badges"`
// Paints []struct {
// }
}
type _Bttv struct {
Badges []struct {
Name string `json:"name"`
@ -40,6 +31,7 @@ type _FrankerFz struct {
} `json:"badges"`
}
// TODO
type _Chatty struct{}
type _DankChat struct {
@ -51,11 +43,6 @@ type _DankChat struct {
}
type _Homies struct {
CustomBadges []struct {
Name string `json:"name"`
Url string `json:"url"`
Users []string `json:"users"`
} `json:"customBadges"`
Badges []struct {
Name string `json:"name"`
Url string `json:"url"`
@ -77,17 +64,19 @@ type _PurpleTv struct {
}
type Format struct {
wg sync.WaitGroup
Chatterino _Chatterino `json:"chatterino"`
SevenTv _SevenTv `json:"seventv"`
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()
@ -104,15 +93,9 @@ func formatChatterino(format *Format) {
}
}
// TODO
func formatSevenTv(format *Format) {
data := &SevenTv{}
data.getBadges()
}
// Done
func formatFfz(format *Format) {
defer format.wg.Done()
data := &FrankerFz{}
data.getBadges()
@ -146,8 +129,17 @@ func formatFfz(format *Format) {
}
}
// Done
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()
@ -164,25 +156,40 @@ func formatDankChat(format *Format) {
}
}
// func parseHomies(format *Format) {
// data := &Homies{}
// data.getBadges()
func formatHomiesBadges(format *Format) {
defer format.wg.Done()
data := &Homies{}
data.getBadges()
data.getBadgesTwo()
// for _, badge := range data.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: []string{badge.Username},
// })
// }
// }
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()
@ -202,22 +209,75 @@ func formatPurpleTv(format *Format) {
})
}
// TODO
func formatChatty(format *Format) {
defer format.wg.Done()
data := &Chatty{}
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,
// })
}
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)
// formatChatterino(format)
// formatSevenTv(format)
formatFfz(format)
// formatDankChat(format)
// parseHomies(format)
// formatPurpleTv(format)
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, _ := json.Marshal(format)
return string(json)
// bttv := &Bttv{}
// ffz := &FrankerFz{}
// chatterino := &Chatterino{}
// chatty := &Chatty{}
// homies := &Homies{}
// ptv := &PurpleTV{}
}

View file

@ -26,8 +26,25 @@ type Chatterino struct {
} `json:"badges"`
}
type SevenTv struct {
Query GqlQuery `json:"query"`
UserID string
Query GqlQuery `json:"query"`
User struct {
ID string `json:"id"`
} `json:"user"`
UserCosmetics struct {
Data struct {
User struct {
ID string `json:"id"`
Cosmetics []struct {
ID string `json:"id"`
Kind string `json:"kind"`
Selected bool `json:"selected"`
Typename string `json:"__typename"`
} `json:"cosmetics"`
Typename string `json:"__typename"`
} `json:"user"`
} `json:"data"`
}
// 7tv Badges
Badges struct {
Data struct {
Cosmetics struct {
@ -38,12 +55,45 @@ type SevenTv struct {
Tooltip string `json:"tooltip"`
Tag string `json:"tag"`
Typename string `json:"__typename"`
}
} `json:"badges"`
Typename string `json:"__typename"`
} `json:"cosmetics"`
} `json:"data"`
} `json:"sevenTvBadges"`
// 7tv Paints
Paints struct {
Data struct {
Cosmetics struct {
Paints []struct {
ID string `json:"id"`
Kind string `json:"kind"`
Name string `json:"name"`
Function string `json:"function"`
Color interface{} `json:"color"`
Angle int64 `json:"angle"`
Shape string `json:"shape"`
ImageURL string `json:"image_url"`
Repeat bool `json:"repeat"`
Stops []struct {
At float64 `json:"at"`
Color int64 `json:"color"`
Typename string `json:"__typename"`
} `json:"stops"`
Shadows []struct {
XOffset float64 `json:"x_offset"`
YOffset float64 `json:"y_offset"`
Radius float64 `json:"radius"`
Color int64 `json:"color"`
Typename string `json:"__typename"`
} `json:"shadows"`
Typename string `json:"__typename"`
} `json:"paints"`
Typename string `json:"__typename"`
} `json:"cosmetics"`
} `json:"data"`
} `json:"sevenTvPaints"`
}
type FrankerFz struct {
Badges []struct {
ID int64 `json:"id"`
@ -59,9 +109,17 @@ type FrankerFz struct {
Users map[string][]int64 `json:"users"`
}
type Bttv struct{}
type Chatty struct{}
type Bttv []struct {
ID string `json:"id"`
Name string `json:"name"`
DisplayName string `json:"displayName"`
ProviderID string `json:"providerId"`
Badge struct {
Type int64 `json:"type"`
Description string `json:"description"`
} `json:"badge"`
SVG string `json:"svg"`
}
type DankChat struct {
Badges []struct {
@ -118,6 +176,20 @@ type PurpleTV struct {
} `json:"users"`
}
type Chatty []struct {
ID string `json:"id"`
Version string `json:"version"`
ImageURL string `json:"image_url"`
ImageURL2 string `json:"image_url_2"`
ImageURL4 string `json:"image_url_4"`
Color *string `json:"color"`
Position *string `json:"position,omitempty"`
MetaTitle string `json:"meta_title"`
MetaURL *string `json:"meta_url"`
Usernames []string `json:"usernames"`
Userids []string `json:"userids,omitempty"`
}
func doGetRequest(url string) []byte {
request, err := http.NewRequest("GET", url, nil)
if err != nil {
@ -152,7 +224,8 @@ func doPostRequest(url string, data []byte) []byte {
func (s *SevenTv) getUserID(userId string) (string, error) {
req := doGetRequest("https://7tv.io/v3/users/twitch/" + userId)
return string(req), nil
json.Unmarshal(req, &s)
return string(s.User.ID), nil
}
func (s *SevenTv) getBadges() *SevenTv {
@ -160,12 +233,12 @@ func (s *SevenTv) getBadges() *SevenTv {
query GetCosmestics($list: [ObjectID!]) {
cosmetics(list: $list) {
badges {
id
kind
name
tooltip
tag
__typename
id
kind
name
tooltip
tag
__typename
}
__typename
}
@ -207,16 +280,16 @@ func (s *SevenTv) getPaints() (string, error) {
image_url
repeat
stops {
at
color
__typename
at
color
__typename
}
shadows {
x_offset
y_offset
radius
color
__typename
x_offset
y_offset
radius
color
__typename
}
__typename
}
@ -232,9 +305,14 @@ func (s *SevenTv) getPaints() (string, error) {
if err != nil {
return "", err
}
logger.Trace().Msg(string(data))
res := doPostRequest("https://7tv.io/v3/gql", data)
// logger.Trace().Msg(string(res))
err = json.Unmarshal(res, &s.Paints)
if err != nil {
logger.Error().Msg(err.Error())
}
return string(res), nil
}
@ -267,9 +345,15 @@ func (s *SevenTv) getUserCosmetics(userId string) (string, error) {
if err != nil {
return "", err
}
logger.Trace().Msg(string(data))
// logger.Trace().Msg(string(data))
res := doPostRequest("https://7tv.io/v3/gql", data)
err = json.Unmarshal(res, &s.UserCosmetics)
if err != nil {
logger.Error().Msg(err.Error())
}
return string(res), nil
}