Compare commits
5 commits
Author | SHA1 | Date | |
---|---|---|---|
338685398e | |||
a0f10e2dd1 | |||
f5520ae3b3 | |||
fd1fef7e02 | |||
0ff2f11956 |
8 changed files with 508 additions and 309 deletions
|
@ -1,26 +0,0 @@
|
||||||
name: golangci-lint
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
# Optional: allow read access to pull request. Use with `only-new-issues` option.
|
|
||||||
# pull-requests: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
golangci:
|
|
||||||
name: lint
|
|
||||||
runs-on: runner
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: https://github.com/actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: stable
|
|
||||||
- name: golangci-lint
|
|
||||||
uses: https://github.com/golangci/golangci-lint-action@v6
|
|
||||||
with:
|
|
||||||
version: v1.63
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
func createDb(db *sql.DB) error {
|
func createDb(db *sql.DB) error {
|
||||||
var exists bool
|
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)
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -18,9 +18,9 @@ func getSevenTvPaints(w http.ResponseWriter, r *http.Request) {
|
||||||
io.WriteString(w, formatSevenTvPaints())
|
io.WriteString(w, formatSevenTvPaints())
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSevenTvBadges(w http.ResponseWriter, r *http.Request) {
|
// func getSevenTvBadges(w http.ResponseWriter, r *http.Request) {
|
||||||
io.WriteString(w, formatSevenTvBadges())
|
// io.WriteString(w, formatSevenTvBadges())
|
||||||
}
|
// }
|
||||||
|
|
||||||
func sevenTvUserCosmetics(w http.ResponseWriter, r *http.Request) {
|
func sevenTvUserCosmetics(w http.ResponseWriter, r *http.Request) {
|
||||||
svt := &SevenTv{}
|
svt := &SevenTv{}
|
||||||
|
@ -30,7 +30,7 @@ func sevenTvUserCosmetics(w http.ResponseWriter, r *http.Request) {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
logger.Trace().Msg("sevenTvUserCosmetics: user: " + userID)
|
// logger.Trace().Msg("sevenTvUserCosmetics: user: " + userID)
|
||||||
|
|
||||||
io.WriteString(w, formatSevenTvUserCosmetics(userID))
|
io.WriteString(w, formatSevenTvUserCosmetics(userID))
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ func (s *Gql) getUserID(username string) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", logger.Error().GetCtx().Err()
|
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))
|
request, err := http.NewRequest("POST", "https://gql.twitch.tv/gql", bytes.NewBuffer(data))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -52,6 +52,9 @@ func (s *Gql) getUserID(username string) (string, error) {
|
||||||
defer res.Body.Close()
|
defer res.Body.Close()
|
||||||
|
|
||||||
body, err := io.ReadAll(res.Body)
|
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
|
return string(body), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,8 +59,8 @@ func main() {
|
||||||
|
|
||||||
mux.HandleFunc("/", root)
|
mux.HandleFunc("/", root)
|
||||||
mux.HandleFunc("/badges", middleware(getAllBadges))
|
mux.HandleFunc("/badges", middleware(getAllBadges))
|
||||||
mux.HandleFunc("/7tv/badges", middleware(getSevenTvBadges))
|
// mux.HandleFunc("/7tvbadges", middleware(getSevenTvBadges))
|
||||||
mux.HandleFunc("/7tv/paints", middleware(getSevenTvPaints))
|
mux.HandleFunc("/paints", middleware(getSevenTvPaints))
|
||||||
// CONSIDERATION: github.com/gorilla/mux may be an option to make use of something like this:
|
// CONSIDERATION: github.com/gorilla/mux may be an option to make use of something like this:
|
||||||
// mux.HandleFunc("/7tv/cosmetics/{user}", middleware(sevenTvUserCosmetics))
|
// mux.HandleFunc("/7tv/cosmetics/{user}", middleware(sevenTvUserCosmetics))
|
||||||
// For now I will just trim the path
|
// For now I will just trim the path
|
||||||
|
|
|
@ -6,116 +6,197 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type _Chatterino struct {
|
// type _Chatterino []struct {
|
||||||
Badges []struct {
|
// Name string `json:"name"`
|
||||||
Name string `json:"name"`
|
// Url struct {
|
||||||
Url string `json:"url"`
|
// Image1 string `json:"1"`
|
||||||
Users []string `json:"users"`
|
// Image2 string `json:"2"`
|
||||||
} `json:"badges"`
|
// Image4 string `json:"4"`
|
||||||
}
|
// } `json:"url"`
|
||||||
|
// Users []string `json:"users"`
|
||||||
|
// }
|
||||||
|
|
||||||
type _Bttv struct {
|
type _Bttv struct {
|
||||||
Badges []struct {
|
Name string `json:"name"`
|
||||||
Name string `json:"name"`
|
Url map[string]string `json:"url"`
|
||||||
Url map[string]string `json:"url"`
|
Users []string `json:"users"`
|
||||||
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
|
// TODO
|
||||||
type _Chatty struct {
|
// type _Chatty struct {
|
||||||
Badges []struct {
|
// Name string `json:"name"`
|
||||||
Name string `json:"name"`
|
// Url []struct {
|
||||||
Url string `json:"url"`
|
// Image1 string `json:"1"`
|
||||||
Users []string `json:"users"`
|
// Image2 string `json:"2"`
|
||||||
} `json:"badges"`
|
// Image4 string `json:"4"`
|
||||||
}
|
// } `json:"url"`
|
||||||
|
// Users []string `json:"users"`
|
||||||
|
// }
|
||||||
|
|
||||||
type _DankChat struct {
|
// type _DankChat []struct {
|
||||||
Badges []struct {
|
// Name string `json:"name"`
|
||||||
Name string `json:"name"`
|
// Url string `json:"url"`
|
||||||
Url string `json:"url"`
|
// Users []string `json:"users"`
|
||||||
Users []string `json:"users"`
|
// }
|
||||||
} `json:"badges"`
|
|
||||||
|
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 {
|
type _Homies struct {
|
||||||
Badges []struct {
|
ID string `json:"id"`
|
||||||
Name string `json:"name"`
|
// Name string `json:"name"`
|
||||||
Url string `json:"url"`
|
// Url struct {
|
||||||
Users []string `json:"users"`
|
// Image1 string `json:"1"`
|
||||||
} `json:"badges"`
|
// Image2 string `json:"2"`
|
||||||
BadgesTwo []struct {
|
// Image4 string `json:"4"`
|
||||||
Name string `json:"name"`
|
// } `json:"url"`
|
||||||
Url string `json:"url"`
|
// Users []string `json:"users"`
|
||||||
Users []string `json:"users"`
|
defaultFormat
|
||||||
} `json:"badges2"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type _PurpleTv struct {
|
type _FrankerFz struct {
|
||||||
Badges []struct {
|
Name string `json:"name"`
|
||||||
Name string `json:"name"`
|
Color string `json:"color"`
|
||||||
Url string `json:"url"`
|
ID int64 `json:"id"`
|
||||||
Users []string `json:"users"`
|
Url struct {
|
||||||
} `json:"badges"`
|
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 {
|
type Format struct {
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
Chatterino _Chatterino `json:"chatterino"`
|
SevenTv *[]SevenTvBadges `json:"seventv"`
|
||||||
Ffz _FrankerFz `json:"ffz"`
|
Chatterino []defaultFormat `json:"chatterino"`
|
||||||
Bttv _Bttv `json:"bttv"`
|
Ffz []_FrankerFz `json:"frankerfacez"`
|
||||||
DankChat _DankChat `json:"dankchat"`
|
FfzAp []_FrankerFzAp `json:"frankerfacez_ap"`
|
||||||
Homies _Homies `json:"homies"`
|
Bttv []defaultFormat `json:"betterttv"`
|
||||||
PurpleTv _PurpleTv `json:"purpletv"`
|
DankChat []defaultFormat `json:"dankchat"`
|
||||||
Chatty _Chatty `json:"chatty"`
|
Homies []_Homies `json:"homies"`
|
||||||
|
PurpleTv []defaultFormat `json:"purpletv"`
|
||||||
|
Chatty []defaultFormat `json:"chatty"`
|
||||||
|
Chatsen []defaultFormat `json:"chatsen"`
|
||||||
|
Twitch []defaultFormat `json:"twitch"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
func formatChatterino(format *Format) {
|
func formatChatterino(format *Format) {
|
||||||
defer format.wg.Done()
|
// defer format.wg.Done()
|
||||||
chatterino := &Chatterino{}
|
chatterino := &Chatterino{}
|
||||||
chatterino.getBadges()
|
chatterino.getBadges()
|
||||||
|
|
||||||
for _, badge := range chatterino.Badges {
|
for _, badge := range chatterino.Badges {
|
||||||
format.Chatterino.Badges = append(format.Chatterino.Badges, struct {
|
format.Chatterino = append(format.Chatterino, struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Url string `json:"url"`
|
Url struct {
|
||||||
|
Image1 string `json:"1"`
|
||||||
|
Image2 string `json:"2"`
|
||||||
|
Image4 string `json:"4"`
|
||||||
|
} `json:"url"`
|
||||||
Users []string `json:"users"`
|
Users []string `json:"users"`
|
||||||
}{
|
}{
|
||||||
Name: badge.Tooltip,
|
Name: badge.Tooltip,
|
||||||
Url: badge.Image3,
|
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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
func formatFfz(format *Format) {
|
func formatFfz(format *Format) {
|
||||||
defer format.wg.Done()
|
// defer format.wg.Done()
|
||||||
data := &FrankerFz{}
|
data := &FrankerFz{}
|
||||||
data.getBadges()
|
data.getBadges()
|
||||||
|
|
||||||
for _, badge := range data.Badges {
|
for _, badge := range data.Badges {
|
||||||
format.Ffz.Badges = append(format.Ffz.Badges, struct {
|
format.Ffz = append(format.Ffz, struct {
|
||||||
ID int64 `json:"id"`
|
Name string `json:"name"`
|
||||||
Name string `json:"name"`
|
Color string `json:"color"`
|
||||||
Url map[string]string `json:"url"`
|
ID int64 `json:"id"`
|
||||||
Users []string `json:"users"`
|
Url struct {
|
||||||
|
Image1 string `json:"1"`
|
||||||
|
Image2 string `json:"2"`
|
||||||
|
Image4 string `json:"4"`
|
||||||
|
} `json:"url"`
|
||||||
|
Users []string `json:"users"`
|
||||||
}{
|
}{
|
||||||
ID: badge.ID,
|
Name: badge.Name,
|
||||||
Name: badge.Title,
|
Color: badge.Color,
|
||||||
Url: badge.Urls,
|
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 {
|
for id, userIDs := range data.Users {
|
||||||
|
@ -124,10 +205,10 @@ func formatFfz(format *Format) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range format.Ffz.Badges {
|
for i := range format.Ffz {
|
||||||
if format.Ffz.Badges[i].ID == badgeID {
|
if format.Ffz[i].ID == badgeID {
|
||||||
for _, userID := range userIDs {
|
for _, userID := range userIDs {
|
||||||
format.Ffz.Badges[i].Users = append(format.Ffz.Badges[i].Users, strconv.FormatInt(userID, 10))
|
format.Ffz[i].Users = append(format.Ffz[i].Users, strconv.FormatInt(userID, 10))
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -135,6 +216,31 @@ func formatFfz(format *Format) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
|
// TODO
|
||||||
func formatBttv(format *Format) {
|
func formatBttv(format *Format) {
|
||||||
defer format.wg.Done()
|
defer format.wg.Done()
|
||||||
|
@ -145,79 +251,168 @@ func formatBttv(format *Format) {
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
func formatDankChat(format *Format) {
|
func formatDankChat(format *Format) {
|
||||||
defer format.wg.Done()
|
// defer format.wg.Done()
|
||||||
data := &DankChat{}
|
data := &DankChat{}
|
||||||
data.getBadges()
|
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 {
|
for _, badge := range data.Badges {
|
||||||
format.DankChat.Badges = append(format.DankChat.Badges, struct {
|
format.DankChat = append(format.DankChat, struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Url string `json:"url"`
|
Url struct {
|
||||||
|
Image1 string `json:"1"`
|
||||||
|
Image2 string `json:"2"`
|
||||||
|
Image4 string `json:"4"`
|
||||||
|
} `json:"url"`
|
||||||
Users []string `json:"users"`
|
Users []string `json:"users"`
|
||||||
}{
|
}{
|
||||||
Name: badge.Type,
|
Name: badge.Type,
|
||||||
Url: badge.URL,
|
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,
|
Users: badge.Users,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatHomiesBadges(format *Format) {
|
func formatHomiesBadges(format *Format) {
|
||||||
defer format.wg.Done()
|
// defer format.wg.Done()
|
||||||
data := &Homies{}
|
data := &Homies{}
|
||||||
data.getBadges()
|
data.getBadges()
|
||||||
data.getBadgesTwo()
|
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 {
|
for _, badge := range data.Badges.Badges {
|
||||||
format.Homies.Badges = append(format.Homies.Badges, struct {
|
format.Homies = append(format.Homies, struct {
|
||||||
Name string `json:"name"`
|
ID string `json:"id"`
|
||||||
Url string `json:"url"`
|
defaultFormat
|
||||||
Users []string `json:"users"`
|
|
||||||
}{
|
}{
|
||||||
Name: badge.Tooltip,
|
ID: badge.ID,
|
||||||
Url: badge.Image3,
|
defaultFormat: defaultFormat{
|
||||||
Users: badge.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,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, badge := range data.BadgesTwo.Badges {
|
for _, badge := range data.BadgesTwo.Badges {
|
||||||
format.Homies.BadgesTwo = append(format.Homies.BadgesTwo, struct {
|
format.Homies = append(format.Homies, struct {
|
||||||
Name string `json:"name"`
|
ID string `json:"id"`
|
||||||
Url string `json:"url"`
|
defaultFormat
|
||||||
Users []string `json:"users"`
|
|
||||||
}{
|
}{
|
||||||
Name: badge.Tooltip,
|
// ID: badge.ID,
|
||||||
Url: badge.Image3,
|
defaultFormat: defaultFormat{
|
||||||
Users: badge.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
|
// Done
|
||||||
func formatPurpleTv(format *Format) {
|
func formatPurpleTv(format *Format) {
|
||||||
defer format.wg.Done()
|
// defer format.wg.Done()
|
||||||
data := &PurpleTV{}
|
data := &PurpleTV{}
|
||||||
data.getBadges()
|
data.getBadges()
|
||||||
|
|
||||||
var users []string
|
var users []string
|
||||||
for _, user := range data.Users {
|
for _, user := range data.Users {
|
||||||
users = append(users, user.UserName)
|
if user.UserID == "157861306" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
users = append(users, user.UserID)
|
||||||
}
|
}
|
||||||
|
|
||||||
format.PurpleTv.Badges = append(format.PurpleTv.Badges, struct {
|
format.PurpleTv = append(format.PurpleTv, struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Url string `json:"url"`
|
Url struct {
|
||||||
|
Image1 string `json:"1"`
|
||||||
|
Image2 string `json:"2"`
|
||||||
|
Image4 string `json:"4"`
|
||||||
|
} `json:"url"`
|
||||||
Users []string `json:"users"`
|
Users []string `json:"users"`
|
||||||
}{
|
}{
|
||||||
Name: "PurpleTV Supporter",
|
Name: "PurpleTV Developer",
|
||||||
Url: data.DefaultBadgeURL,
|
// 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,
|
Users: users,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Replace the data from the Chatty struct in place to use less memory.
|
// TODO: Replace the data from the Chatty struct in place to use less memory.
|
||||||
func formatChatty(format *Format) {
|
func formatChatty(format *Format) {
|
||||||
defer format.wg.Done()
|
// defer format.wg.Done()
|
||||||
data := &Chatty{}
|
data := &Chatty{}
|
||||||
newData := Chatty{}
|
newData := Chatty{}
|
||||||
data.getBadges()
|
data.getBadges()
|
||||||
|
@ -230,34 +425,122 @@ func formatChatty(format *Format) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, badge := range newData {
|
for _, badge := range newData {
|
||||||
format.Chatty.Badges = append(format.Chatty.Badges, struct {
|
format.Chatty = append(format.Chatty, struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Url string `json:"url"`
|
Url struct {
|
||||||
|
Image1 string `json:"1"`
|
||||||
|
Image2 string `json:"2"`
|
||||||
|
Image4 string `json:"4"`
|
||||||
|
} `json:"url"`
|
||||||
Users []string `json:"users"`
|
Users []string `json:"users"`
|
||||||
}{
|
}{
|
||||||
Name: badge.MetaTitle,
|
Name: badge.MetaTitle,
|
||||||
Url: badge.ImageURL4,
|
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,
|
Users: badge.Usernames,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatSevenTvBadges() string {
|
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 := &SevenTv{}
|
||||||
data.getBadges()
|
data.getBadges()
|
||||||
|
|
||||||
badges, err := json.Marshal(data.Badges.Data.Cosmetics)
|
format.SevenTv = &data.Badges.Data.Cosmetics.Badges
|
||||||
if err != nil {
|
|
||||||
logger.Error().Msg(err.Error())
|
// badges, err := json.Marshal(data.Badges.Data.Cosmetics)
|
||||||
}
|
// if err != nil {
|
||||||
return string(badges)
|
// logger.Error().Msg(err.Error())
|
||||||
|
// }
|
||||||
|
// return string(badges)
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatSevenTvPaints() string {
|
func formatSevenTvPaints() string {
|
||||||
data := &SevenTv{}
|
data := &SevenTv{}
|
||||||
data.getPaints()
|
data.getPaints()
|
||||||
|
|
||||||
paints, err := json.Marshal(data.Paints.Data.Cosmetics)
|
paints, err := json.Marshal(data.Paints.Data.Cosmetics.Paints)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error().Msg(err.Error())
|
logger.Error().Msg(err.Error())
|
||||||
}
|
}
|
||||||
|
@ -277,17 +560,21 @@ func formatSevenTvUserCosmetics(stvUserID string) string {
|
||||||
|
|
||||||
func formatAllBadges() string {
|
func formatAllBadges() string {
|
||||||
format := &Format{}
|
format := &Format{}
|
||||||
format.wg.Add(7)
|
// format.wg.Add(7)
|
||||||
|
|
||||||
go formatChatterino(format)
|
// formatSevenTvBadges(format)
|
||||||
go formatFfz(format)
|
// formatChatterino(format)
|
||||||
go formatDankChat(format)
|
// formatFfz(format)
|
||||||
go formatBttv(format)
|
// formatFfzAp(format)
|
||||||
go formatHomiesBadges(format)
|
// formatDankChat(format)
|
||||||
go formatPurpleTv(format)
|
// formatChatsen(format)
|
||||||
go formatChatty(format)
|
// go formatBttv(format)
|
||||||
|
formatHomiesBadges(format)
|
||||||
|
// formatPurpleTv(format)
|
||||||
|
// formatChatty(format)
|
||||||
|
// formatTwitch(format)
|
||||||
|
|
||||||
format.wg.Wait()
|
// format.wg.Wait()
|
||||||
|
|
||||||
json, err := json.Marshal(format)
|
json, err := json.Marshal(format)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -25,6 +25,16 @@ type Chatterino struct {
|
||||||
Users []string `json:"users"`
|
Users []string `json:"users"`
|
||||||
} `json:"badges"`
|
} `json:"badges"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SevenTvBadges 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"`
|
||||||
|
}
|
||||||
|
|
||||||
type SevenTv struct {
|
type SevenTv struct {
|
||||||
Query GqlQuery `json:"query"`
|
Query GqlQuery `json:"query"`
|
||||||
User struct {
|
User struct {
|
||||||
|
@ -48,19 +58,13 @@ type SevenTv struct {
|
||||||
Badges struct {
|
Badges struct {
|
||||||
Data struct {
|
Data struct {
|
||||||
Cosmetics struct {
|
Cosmetics struct {
|
||||||
Badges []struct {
|
Badges []SevenTvBadges `json:"badges"`
|
||||||
ID string `json:"id"`
|
Typename string `json:"__typename"`
|
||||||
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:"cosmetics"`
|
||||||
} `json:"data"`
|
} `json:"data"`
|
||||||
} `json:"sevenTvBadges"`
|
} `json:"sevenTvBadges"`
|
||||||
// 7tv Paints
|
// 7tv Paints
|
||||||
|
Name string `json:"name"`
|
||||||
Paints struct {
|
Paints struct {
|
||||||
Data struct {
|
Data struct {
|
||||||
Cosmetics struct {
|
Cosmetics struct {
|
||||||
|
@ -109,6 +113,14 @@ type FrankerFz struct {
|
||||||
Users map[string][]int64 `json:"users"`
|
Users map[string][]int64 `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 Bttv []struct {
|
type Bttv []struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
|
@ -190,6 +202,39 @@ type Chatty []struct {
|
||||||
Userids []string `json:"userids,omitempty"`
|
Userids []string `json:"userids,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Chatsen struct {
|
||||||
|
Badges []struct {
|
||||||
|
// ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
// Description interface{} `json:"description"`
|
||||||
|
Mipmap []string `json:"mipmap"`
|
||||||
|
Users []string `json:"users"`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 {
|
func doGetRequest(url string) []byte {
|
||||||
request, err := http.NewRequest("GET", url, nil)
|
request, err := http.NewRequest("GET", url, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -255,7 +300,7 @@ func (s *SevenTv) getBadges() *SevenTv {
|
||||||
}
|
}
|
||||||
|
|
||||||
res := doPostRequest("https://7tv.io/v3/gql", data)
|
res := doPostRequest("https://7tv.io/v3/gql", data)
|
||||||
logger.Trace().Msg(string(res))
|
// logger.Trace().Msg(string(res))
|
||||||
|
|
||||||
err = json.Unmarshal(res, &s.Badges)
|
err = json.Unmarshal(res, &s.Badges)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -375,8 +420,8 @@ func (s *FrankerFz) getBadges() *FrankerFz {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Bttv) getBadges() *Bttv {
|
func (s *FrankerFzAp) getBadges() *FrankerFzAp {
|
||||||
res := doGetRequest("https://api.betterttv.net/3/cached/badges/twitch")
|
res := doGetRequest("https://api.ffzap.com/v1/supporters")
|
||||||
err := json.Unmarshal(res, &s)
|
err := json.Unmarshal(res, &s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error().Msg(err.Error())
|
logger.Error().Msg(err.Error())
|
||||||
|
@ -384,8 +429,8 @@ func (s *Bttv) getBadges() *Bttv {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Chatty) getBadges() *Chatty {
|
func (s *Bttv) getBadges() *Bttv {
|
||||||
res := doGetRequest("https://tduva.com/res/badges")
|
res := doGetRequest("https://api.betterttv.net/3/cached/badges/twitch")
|
||||||
err := json.Unmarshal(res, &s)
|
err := json.Unmarshal(res, &s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error().Msg(err.Error())
|
logger.Error().Msg(err.Error())
|
||||||
|
@ -437,3 +482,30 @@ func (s *PurpleTV) getBadges() *PurpleTV {
|
||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Chatty) getBadges() *Chatty {
|
||||||
|
res := doGetRequest("https://tduva.com/res/badges")
|
||||||
|
err := json.Unmarshal(res, &s)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error().Msg(err.Error())
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Chatsen) getBadges() *Chatsen {
|
||||||
|
res := doGetRequest("https://api.chatsen.app/account/badges")
|
||||||
|
err := json.Unmarshal(res, &s.Badges)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error().Msg(err.Error())
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
136
golangci.yml
136
golangci.yml
|
@ -1,136 +0,0 @@
|
||||||
run:
|
|
||||||
timeout: 5m
|
|
||||||
|
|
||||||
linters-settings:
|
|
||||||
govet:
|
|
||||||
enable:
|
|
||||||
- shadow
|
|
||||||
- fieldalignment
|
|
||||||
misspell:
|
|
||||||
locale: US
|
|
||||||
exhaustive:
|
|
||||||
default-signifies-exhaustive: true
|
|
||||||
gomodguard:
|
|
||||||
blocked:
|
|
||||||
modules:
|
|
||||||
- github.com/pkg/errors:
|
|
||||||
recommendations:
|
|
||||||
- errors
|
|
||||||
forbidigo:
|
|
||||||
forbid:
|
|
||||||
- ^fmt.Print(f|ln)?$
|
|
||||||
- ^log.(Panic|Fatal|Print)(f|ln)?$
|
|
||||||
- ^os.Exit$
|
|
||||||
- ^panic$
|
|
||||||
- ^print(ln)?$
|
|
||||||
varnamelen:
|
|
||||||
max-distance: 12
|
|
||||||
min-name-length: 2
|
|
||||||
ignore-type-assert-ok: true
|
|
||||||
ignore-map-index-ok: true
|
|
||||||
ignore-chan-recv-ok: true
|
|
||||||
ignore-decls:
|
|
||||||
- i int
|
|
||||||
- n int
|
|
||||||
- w io.Writer
|
|
||||||
- r io.Reader
|
|
||||||
- b []byte
|
|
||||||
|
|
||||||
linters:
|
|
||||||
enable:
|
|
||||||
- asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers
|
|
||||||
- bidichk # Checks for dangerous unicode character sequences
|
|
||||||
- bodyclose # checks whether HTTP response body is closed successfully
|
|
||||||
- containedctx # containedctx is a linter that detects struct contained context.Context field
|
|
||||||
- contextcheck # check the function whether use a non-inherited context
|
|
||||||
- cyclop # checks function and package cyclomatic complexity
|
|
||||||
- decorder # check declaration order and count of types, constants, variables and functions
|
|
||||||
- dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())
|
|
||||||
- dupl # Tool for code clone detection
|
|
||||||
- durationcheck # check for two durations multiplied together
|
|
||||||
- err113 # Golang linter to check the errors handling expressions
|
|
||||||
- errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases
|
|
||||||
- errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted.
|
|
||||||
- errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`.
|
|
||||||
- errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13.
|
|
||||||
- exhaustive # check exhaustiveness of enum switch statements
|
|
||||||
- exportloopref # checks for pointers to enclosing loop variables
|
|
||||||
- forbidigo # Forbids identifiers
|
|
||||||
- forcetypeassert # finds forced type assertions
|
|
||||||
- gci # Gci control golang package import order and make it always deterministic.
|
|
||||||
- gochecknoglobals # Checks that no globals are present in Go code
|
|
||||||
- gocognit # Computes and checks the cognitive complexity of functions
|
|
||||||
- goconst # Finds repeated strings that could be replaced by a constant
|
|
||||||
- gocritic # The most opinionated Go source code linter
|
|
||||||
- gocyclo # Computes and checks the cyclomatic complexity of functions
|
|
||||||
- godot # Check if comments end in a period
|
|
||||||
- godox # Tool for detection of FIXME, TODO and other comment keywords
|
|
||||||
- gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
|
|
||||||
- gofumpt # Gofumpt checks whether code was gofumpt-ed.
|
|
||||||
- goheader # Checks is file header matches to pattern
|
|
||||||
- goimports # Goimports does everything that gofmt does. Additionally it checks unused imports
|
|
||||||
- gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.
|
|
||||||
- goprintffuncname # Checks that printf-like functions are named with `f` at the end
|
|
||||||
- gosec # Inspects source code for security problems
|
|
||||||
- gosimple # Linter for Go source code that specializes in simplifying a code
|
|
||||||
- govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
|
|
||||||
- grouper # An analyzer to analyze expression groups.
|
|
||||||
- importas # Enforces consistent import aliases
|
|
||||||
- ineffassign # Detects when assignments to existing variables are not used
|
|
||||||
- lll # Reports long lines
|
|
||||||
- maintidx # maintidx measures the maintainability index of each function.
|
|
||||||
- makezero # Finds slice declarations with non-zero initial length
|
|
||||||
- misspell # Finds commonly misspelled English words in comments
|
|
||||||
- nakedret # Finds naked returns in functions greater than a specified function length
|
|
||||||
- nestif # Reports deeply nested if statements
|
|
||||||
- nilerr # Finds the code that returns nil even if it checks that the error is not nil.
|
|
||||||
- nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value.
|
|
||||||
- nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity
|
|
||||||
- noctx # noctx finds sending http request without context.Context
|
|
||||||
- predeclared # find code that shadows one of Go's predeclared identifiers
|
|
||||||
- revive # golint replacement, finds style mistakes
|
|
||||||
- staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks
|
|
||||||
- stylecheck # Stylecheck is a replacement for golint
|
|
||||||
- tagliatelle # Checks the struct tags.
|
|
||||||
- tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17
|
|
||||||
- thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers
|
|
||||||
- typecheck # Like the front-end of a Go compiler, parses and type-checks Go code
|
|
||||||
- unconvert # Remove unnecessary type conversions
|
|
||||||
- unparam # Reports unused function parameters
|
|
||||||
- unused # Checks Go code for unused constants, variables, functions and types
|
|
||||||
- varnamelen # checks that the length of a variable's name matches its scope
|
|
||||||
- wastedassign # wastedassign finds wasted assignment statements
|
|
||||||
- whitespace # Tool for detection of leading and trailing whitespace
|
|
||||||
disable:
|
|
||||||
- depguard # Go linter that checks if package imports are in a list of acceptable packages
|
|
||||||
- funlen # Tool for detection of long functions
|
|
||||||
- gochecknoinits # Checks that no init functions are present in Go code
|
|
||||||
- gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.
|
|
||||||
- interfacebloat # A linter that checks length of interface.
|
|
||||||
- ireturn # Accept Interfaces, Return Concrete Types
|
|
||||||
- mnd # An analyzer to detect magic numbers
|
|
||||||
- nolintlint # Reports ill-formed or insufficient nolint directives
|
|
||||||
- paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test
|
|
||||||
- prealloc # Finds slice declarations that could potentially be preallocated
|
|
||||||
- promlinter # Check Prometheus metrics naming via promlint
|
|
||||||
- rowserrcheck # checks whether Err of rows is checked successfully
|
|
||||||
- sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed.
|
|
||||||
- testpackage # linter that makes you use a separate _test package
|
|
||||||
- tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes
|
|
||||||
- wrapcheck # Checks that errors returned from external packages are wrapped
|
|
||||||
- wsl # Whitespace Linter - Forces you to use empty lines!
|
|
||||||
|
|
||||||
issues:
|
|
||||||
exclude-use-default: false
|
|
||||||
exclude-dirs-use-default: false
|
|
||||||
exclude-rules:
|
|
||||||
# Allow complex tests and examples, better to be self contained
|
|
||||||
- path: (examples|main\.go|_test\.go)
|
|
||||||
linters:
|
|
||||||
- forbidigo
|
|
||||||
- gocognit
|
|
||||||
|
|
||||||
# Allow forbidden identifiers in CLI commands
|
|
||||||
- path: cmd
|
|
||||||
linters:
|
|
||||||
- forbidigo
|
|
Loading…
Add table
Reference in a new issue