mirror of
https://github.com/Apologieze/Benri.git
synced 2026-01-18 17:17:21 +01:00
358 lines
11 KiB
Go
358 lines
11 KiB
Go
package verniy
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
type userResponse struct {
|
|
Data struct {
|
|
User User `json:"user"`
|
|
} `json:"data"`
|
|
}
|
|
|
|
func (c *Client) userQuery(params QueryParam, fields ...UserField) string {
|
|
p := make([]string, len(fields))
|
|
for i := range fields {
|
|
p[i] = string(fields[i])
|
|
}
|
|
return FieldObject("User", params, p...)
|
|
}
|
|
|
|
// GetUser to get user data.
|
|
func (c *Client) GetUser(username string, fields ...UserField) (*User, error) {
|
|
return c.GetUserWithContext(context.Background(), username, fields...)
|
|
}
|
|
|
|
// GetUserWithContext to get user data with context.
|
|
func (c *Client) GetUserWithContext(ctx context.Context, username string, fields ...UserField) (*User, error) {
|
|
if len(fields) == 0 {
|
|
fields = []UserField{
|
|
UserFieldID,
|
|
UserFieldName,
|
|
UserFieldAbout,
|
|
UserFieldAvatar(UserAvatarFieldLarge),
|
|
UserFieldBannerImage,
|
|
UserFieldStatistics(
|
|
UserStatisticTypesFieldAnime(
|
|
UserStatisticsFieldCount,
|
|
UserStatisticsFieldMeanScore,
|
|
UserStatisticsFieldStandardDeviation,
|
|
UserStatisticsFieldMinutesWatched,
|
|
UserStatisticsFieldEpisodesWatched),
|
|
UserStatisticTypesFieldManga(
|
|
UserStatisticsFieldCount,
|
|
UserStatisticsFieldMeanScore,
|
|
UserStatisticsFieldStandardDeviation,
|
|
UserStatisticsFieldChaptersRead,
|
|
UserStatisticsFieldVolumesRead)),
|
|
}
|
|
}
|
|
|
|
query := FieldObject("query", QueryParam{
|
|
"$name": "String",
|
|
}, c.userQuery(QueryParam{
|
|
"name": "$name",
|
|
}, fields...))
|
|
|
|
var d userResponse
|
|
err := c.post(ctx, query, queryVariable{
|
|
"name": username,
|
|
}, &d)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &d.Data.User, nil
|
|
}
|
|
|
|
// GetUserFavouriteAnime to get user's favourite anime.
|
|
func (c *Client) GetUserFavouriteAnime(username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserFavouriteAnimeWithContext(context.Background(), username, page, perPage)
|
|
}
|
|
|
|
// GetUserFavouriteAnimeWithContext to get user's favourite anime with context.
|
|
func (c *Client) GetUserFavouriteAnimeWithContext(ctx context.Context, username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserWithContext(ctx, username, UserFieldFavourites(UserParamFavourites{
|
|
Page: page,
|
|
}, FavouritesFieldAnime(FavouritesParamAnime{
|
|
Page: page,
|
|
PerPage: perPage,
|
|
},
|
|
MediaConnectionFieldPageInfo(
|
|
PageInfoFieldTotal,
|
|
PageInfoFieldPerPage,
|
|
PageInfoFieldCurrentPage,
|
|
PageInfoFieldLastPage,
|
|
PageInfoFieldHasNextPage),
|
|
MediaConnectionFieldEdges(
|
|
MediaEdgeFieldFavouriteOrder,
|
|
MediaEdgeFieldNode(
|
|
MediaFieldID,
|
|
MediaFieldIsAdult,
|
|
MediaFieldTitle(
|
|
MediaTitleFieldRomaji,
|
|
MediaTitleFieldEnglish,
|
|
MediaTitleFieldNative),
|
|
MediaFieldCoverImage(
|
|
MediaCoverImageFieldLarge,
|
|
MediaCoverImageFieldLarge))))))
|
|
}
|
|
|
|
// GetUserFavouriteManga to get user's favourite manga.
|
|
func (c *Client) GetUserFavouriteManga(username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserFavouriteMangaWithContext(context.Background(), username, page, perPage)
|
|
}
|
|
|
|
// GetUserFavouriteMangaWithContext to get user's favourite manga with context.
|
|
func (c *Client) GetUserFavouriteMangaWithContext(ctx context.Context, username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserWithContext(ctx, username, UserFieldFavourites(UserParamFavourites{
|
|
Page: page,
|
|
}, FavouritesFieldManga(FavouritesParamManga{
|
|
Page: page,
|
|
PerPage: perPage,
|
|
},
|
|
MediaConnectionFieldPageInfo(
|
|
PageInfoFieldTotal,
|
|
PageInfoFieldPerPage,
|
|
PageInfoFieldCurrentPage,
|
|
PageInfoFieldLastPage,
|
|
PageInfoFieldHasNextPage),
|
|
MediaConnectionFieldEdges(
|
|
MediaEdgeFieldFavouriteOrder,
|
|
MediaEdgeFieldNode(
|
|
MediaFieldID,
|
|
MediaFieldIsAdult,
|
|
MediaFieldTitle(
|
|
MediaTitleFieldRomaji,
|
|
MediaTitleFieldEnglish,
|
|
MediaTitleFieldNative),
|
|
MediaFieldCoverImage(
|
|
MediaCoverImageFieldLarge,
|
|
MediaCoverImageFieldLarge))))))
|
|
}
|
|
|
|
// GetUserFavouriteCharacters to get user's favourite characters.
|
|
func (c *Client) GetUserFavouriteCharacters(username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserFavouriteCharactersWithContext(context.Background(), username, page, perPage)
|
|
}
|
|
|
|
// GetUserFavouriteCharactersWithContext to get user's favourite characters with context.
|
|
func (c *Client) GetUserFavouriteCharactersWithContext(ctx context.Context, username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserWithContext(ctx, username, UserFieldFavourites(UserParamFavourites{
|
|
Page: page,
|
|
}, FavouritesFieldCharacters(FavouritesParamCharacters{
|
|
Page: page,
|
|
PerPage: perPage,
|
|
},
|
|
CharacterConnectionFieldPageInfo(
|
|
PageInfoFieldTotal,
|
|
PageInfoFieldPerPage,
|
|
PageInfoFieldCurrentPage,
|
|
PageInfoFieldLastPage,
|
|
PageInfoFieldHasNextPage),
|
|
CharacterConnectionFieldEdges(
|
|
CharacterEdgeFieldFavouriteOrder,
|
|
CharacterEdgeFieldNode(
|
|
CharacterFieldID,
|
|
CharacterFieldName(
|
|
CharacterNameFieldFull,
|
|
CharacterNameFieldNative),
|
|
CharacterFieldImage(CharacterImageFieldLarge))))))
|
|
}
|
|
|
|
// GetUserFavouriteStaff to get user's favourite staff.
|
|
func (c *Client) GetUserFavouriteStaff(username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserFavouriteStaffWithContext(context.Background(), username, page, perPage)
|
|
}
|
|
|
|
// GetUserFavouriteStaffWithContext to get user's favourite staff with context.
|
|
func (c *Client) GetUserFavouriteStaffWithContext(ctx context.Context, username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserWithContext(ctx, username, UserFieldFavourites(UserParamFavourites{
|
|
Page: page,
|
|
}, FavouritesFieldStaff(FavouritesParamStaff{
|
|
Page: page,
|
|
PerPage: perPage,
|
|
},
|
|
StaffConnectionFieldPageInfo(
|
|
PageInfoFieldTotal,
|
|
PageInfoFieldPerPage,
|
|
PageInfoFieldCurrentPage,
|
|
PageInfoFieldLastPage,
|
|
PageInfoFieldHasNextPage),
|
|
StaffConnectionFieldEdges(
|
|
StaffEdgeFieldFavouriteOrder,
|
|
StaffEdgeFieldNode(
|
|
StaffFieldID,
|
|
StaffFieldName(
|
|
StaffNameFieldFull,
|
|
StaffNameFieldNative),
|
|
StaffFieldImage(StaffImageFieldLarge))))))
|
|
}
|
|
|
|
// GetUserFavouriteStudios to get user's favourite studios.
|
|
func (c *Client) GetUserFavouriteStudios(username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserFavouriteStudiosWithContext(context.Background(), username, page, perPage)
|
|
}
|
|
|
|
// GetUserFavouriteStudiosWithContext to get user's favourite studios with context.
|
|
func (c *Client) GetUserFavouriteStudiosWithContext(ctx context.Context, username string, page int, perPage int) (*User, error) {
|
|
return c.GetUserWithContext(ctx, username, UserFieldFavourites(UserParamFavourites{
|
|
Page: page,
|
|
}, FavouritesFieldStudios(FavouritesParamStudios{
|
|
Page: page,
|
|
PerPage: perPage,
|
|
},
|
|
StudioConnectionFieldPageInfo(
|
|
PageInfoFieldTotal,
|
|
PageInfoFieldPerPage,
|
|
PageInfoFieldCurrentPage,
|
|
PageInfoFieldLastPage,
|
|
PageInfoFieldHasNextPage),
|
|
StudioConnectionFieldEdges(
|
|
StudioEdgeFieldFavouriteOrder,
|
|
StudioEdgeFieldNode(
|
|
StudioFieldID,
|
|
StudioFieldName)))))
|
|
}
|
|
|
|
type userAnimeListResponse struct {
|
|
Data struct {
|
|
MediaListCollection *MediaListCollection `json:"mediaListCollection"`
|
|
} `json:"data"`
|
|
}
|
|
|
|
func (c *Client) mediaListCollectionQuery(params QueryParam, fields ...MediaListCollectionField) string {
|
|
p := make([]string, len(fields))
|
|
for i := range fields {
|
|
p[i] = string(fields[i])
|
|
}
|
|
return FieldObject("MediaListCollection", params, p...)
|
|
}
|
|
|
|
func (c *Client) getMediaListCollection(ctx context.Context, username string, mediaType MediaType, fields ...MediaListGroupField) ([]MediaListGroup, error) {
|
|
query := FieldObject("query", QueryParam{
|
|
"$username": "String",
|
|
"$type": "MediaType",
|
|
}, c.mediaListCollectionQuery(QueryParam{
|
|
"userName": "$username",
|
|
"type": "$type",
|
|
}, MediaListCollectionFieldLists(MediaListGroupFieldStatus, fields...)))
|
|
|
|
var d userAnimeListResponse
|
|
|
|
err := c.post(ctx, query, queryVariable{
|
|
"username": username,
|
|
"type": mediaType,
|
|
}, &d)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return d.Data.MediaListCollection.Lists, nil
|
|
}
|
|
|
|
// GetUserAnimeList to get user's anime list.
|
|
func (c *Client) GetUserAnimeList(username string, fields ...MediaListGroupField) ([]MediaListGroup, error) {
|
|
return c.GetUserAnimeListWithContext(context.Background(), username, fields...)
|
|
}
|
|
|
|
// GetUserAnimeListSort Added custom function to get user's anime list sorted
|
|
func (c *Client) GetUserAnimeListSort(username string, sort MediaListSort, fields ...MediaListGroupField) ([]MediaListGroup, error) {
|
|
ctx := context.Background()
|
|
query := FieldObject("query", QueryParam{
|
|
"$username": "String",
|
|
"$type": "MediaType",
|
|
"$sort": "[MediaListSort]",
|
|
}, c.mediaListCollectionQuery(QueryParam{
|
|
"userName": "$username",
|
|
"type": "$type",
|
|
"sort": "$sort",
|
|
}, MediaListCollectionFieldLists(MediaListGroupFieldStatus, fields...)))
|
|
|
|
var d userAnimeListResponse
|
|
|
|
err := c.post(ctx, query, queryVariable{
|
|
"username": username,
|
|
"type": MediaTypeAnime,
|
|
"sort": sort,
|
|
}, &d)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return d.Data.MediaListCollection.Lists, nil
|
|
}
|
|
|
|
// GetUserAnimeListWithContext to get user's anime list with context.
|
|
func (c *Client) GetUserAnimeListWithContext(ctx context.Context, username string, fields ...MediaListGroupField) ([]MediaListGroup, error) {
|
|
if len(fields) == 0 {
|
|
fields = []MediaListGroupField{
|
|
MediaListGroupFieldName,
|
|
MediaListGroupFieldStatus,
|
|
MediaListGroupFieldEntries(
|
|
MediaListFieldID,
|
|
MediaListFieldStatus,
|
|
MediaListFieldScore,
|
|
MediaListFieldProgress,
|
|
MediaListFieldNotes,
|
|
MediaListFieldStartedAt,
|
|
MediaListFieldCompletedAt,
|
|
MediaListFieldMedia(
|
|
MediaFieldID,
|
|
MediaFieldTitle(
|
|
MediaTitleFieldRomaji,
|
|
MediaTitleFieldEnglish,
|
|
MediaTitleFieldNative),
|
|
MediaFieldType,
|
|
MediaFieldFormat,
|
|
MediaFieldStatusV2,
|
|
MediaFieldCoverImage(MediaCoverImageFieldLarge),
|
|
MediaFieldAverageScore,
|
|
MediaFieldPopularity,
|
|
MediaFieldIsAdult,
|
|
MediaFieldEpisodes)),
|
|
}
|
|
}
|
|
return c.getMediaListCollection(ctx, username, MediaTypeAnime, fields...)
|
|
}
|
|
|
|
// GetUserMangaList to get user's manga list.
|
|
func (c *Client) GetUserMangaList(username string, fields ...MediaListGroupField) ([]MediaListGroup, error) {
|
|
return c.GetUserMangaListWithContext(context.Background(), username, fields...)
|
|
}
|
|
|
|
// GetUserMangaListWithContext to get user's manga list with context.
|
|
func (c *Client) GetUserMangaListWithContext(ctx context.Context, username string, fields ...MediaListGroupField) ([]MediaListGroup, error) {
|
|
if len(fields) == 0 {
|
|
fields = []MediaListGroupField{
|
|
MediaListGroupFieldName,
|
|
MediaListGroupFieldStatus,
|
|
MediaListGroupFieldEntries(
|
|
MediaListFieldID,
|
|
MediaListFieldStatus,
|
|
MediaListFieldScore,
|
|
MediaListFieldProgress,
|
|
MediaListFieldProgressVolumes,
|
|
MediaListFieldNotes,
|
|
MediaListFieldStartedAt,
|
|
MediaListFieldCompletedAt,
|
|
MediaListFieldMedia(
|
|
MediaFieldID,
|
|
MediaFieldTitle(
|
|
MediaTitleFieldRomaji,
|
|
MediaTitleFieldEnglish,
|
|
MediaTitleFieldNative),
|
|
MediaFieldType,
|
|
MediaFieldFormat,
|
|
MediaFieldStatusV2,
|
|
MediaFieldCoverImage(MediaCoverImageFieldLarge),
|
|
MediaFieldAverageScore,
|
|
MediaFieldPopularity,
|
|
MediaFieldIsAdult,
|
|
MediaFieldChapters,
|
|
MediaFieldVolumes)),
|
|
}
|
|
}
|
|
return c.getMediaListCollection(ctx, username, MediaTypeManga, fields...)
|
|
}
|