123 lines
2.9 KiB
Go

package listimportanilist
import (
"errors"
"fmt"
"net/http"
"strconv"
"github.com/aerogo/aero"
"github.com/animenotifier/anilist"
"github.com/animenotifier/notify.moe/arn"
"github.com/animenotifier/notify.moe/components"
)
// Preview shows an import preview.
func Preview(ctx aero.Context) error {
user := arn.GetUserFromContext(ctx)
if user == nil {
return ctx.Error(http.StatusBadRequest, "Not logged in")
}
matches, err := getMatches(ctx)
if err != nil {
return ctx.Error(http.StatusBadRequest, err)
}
return ctx.HTML(components.ImportAnilist(user, matches))
}
// Finish ...
func Finish(ctx aero.Context) error {
user := arn.GetUserFromContext(ctx)
if user == nil {
return ctx.Error(http.StatusBadRequest, "Not logged in")
}
matches, err := getMatches(ctx)
if err != nil {
return ctx.Error(http.StatusBadRequest, err)
}
animeList := user.AnimeList()
for _, match := range matches {
if match.ARNAnime == nil || match.AniListItem == nil {
continue
}
item := &arn.AnimeListItem{
AnimeID: match.ARNAnime.ID,
Status: arn.AniListAnimeListStatus(match.AniListItem),
Episodes: match.AniListItem.Progress,
Notes: match.AniListItem.Notes,
Rating: arn.AnimeListItemRating{
Overall: float64(match.AniListItem.ScoreRaw) / 10.0,
},
RewatchCount: match.AniListItem.Repeat,
Private: match.AniListItem.Private,
Created: arn.DateTimeUTC(),
Edited: arn.DateTimeUTC(),
}
animeList.Import(item)
}
animeList.Save()
return ctx.HTML(components.ImportFinished(user))
}
// getMatches finds and returns all matches for the logged in user.
func getMatches(ctx aero.Context) ([]*arn.AniListMatch, error) {
user := arn.GetUserFromContext(ctx)
if user == nil {
return nil, errors.New("Not logged in")
}
anilistUser, err := anilist.GetUser(user.Accounts.AniList.Nick)
if err != nil {
return nil, fmt.Errorf("User doesn't exist on AniList: %s", err.Error())
}
anilistAnimeList, err := anilist.GetAnimeList(anilistUser.ID)
if err != nil {
return nil, fmt.Errorf("Couldn't load your anime list from AniList: %s", err.Error())
}
// Find matches
matches := findAllMatches(anilistAnimeList)
return matches, nil
}
// findAllMatches returns all matches for the anime inside an anilist anime list.
func findAllMatches(animeList *anilist.AnimeList) []*arn.AniListMatch {
finder := arn.NewAniListAnimeFinder()
matches := []*arn.AniListMatch{}
for _, list := range animeList.Lists {
matches = importList(matches, finder, list.Entries)
}
return matches
}
// importList imports a single list inside an anilist anime list collection.
func importList(matches []*arn.AniListMatch, finder *arn.AniListAnimeFinder, animeListItems []*anilist.AnimeListItem) []*arn.AniListMatch {
for _, item := range animeListItems {
matches = append(matches, &arn.AniListMatch{
AniListItem: item,
ARNAnime: finder.GetAnime(strconv.Itoa(item.Anime.ID), strconv.Itoa(item.Anime.MALID)),
})
}
return matches
}