95 lines
1.9 KiB
Go
95 lines
1.9 KiB
Go
package compare
|
|
|
|
import (
|
|
"net/http"
|
|
"sort"
|
|
|
|
"github.com/animenotifier/notify.moe/components"
|
|
"github.com/animenotifier/notify.moe/utils"
|
|
|
|
"github.com/aerogo/aero"
|
|
"github.com/animenotifier/notify.moe/arn"
|
|
)
|
|
|
|
// AnimeList ...
|
|
func AnimeList(ctx aero.Context) error {
|
|
user := utils.GetUser(ctx)
|
|
nickA := ctx.Get("nick-1")
|
|
nickB := ctx.Get("nick-2")
|
|
|
|
a, err := arn.GetUserByNick(nickA)
|
|
|
|
if err != nil || a == nil {
|
|
return ctx.Error(http.StatusNotFound, "User not found: "+nickA, err)
|
|
}
|
|
|
|
b, err := arn.GetUserByNick(nickB)
|
|
|
|
if err != nil || b == nil {
|
|
return ctx.Error(http.StatusNotFound, "User not found: "+nickB, err)
|
|
}
|
|
|
|
comparisons := []*utils.Comparison{}
|
|
countA := 0
|
|
countB := 0
|
|
|
|
animeListA := a.AnimeList()
|
|
animeListB := b.AnimeList()
|
|
|
|
for _, item := range animeListA.Items {
|
|
if item.Status == arn.AnimeListStatusPlanned {
|
|
continue
|
|
}
|
|
|
|
countA++
|
|
|
|
comparisons = append(comparisons, &utils.Comparison{
|
|
Anime: item.Anime(),
|
|
ItemA: item,
|
|
ItemB: animeListB.Find(item.AnimeID),
|
|
})
|
|
}
|
|
|
|
for _, item := range animeListB.Items {
|
|
if item.Status == arn.AnimeListStatusPlanned {
|
|
continue
|
|
}
|
|
|
|
countB++
|
|
|
|
if Contains(comparisons, item.AnimeID) {
|
|
continue
|
|
}
|
|
|
|
comparisons = append(comparisons, &utils.Comparison{
|
|
Anime: item.Anime(),
|
|
ItemA: animeListA.Find(item.AnimeID),
|
|
ItemB: item,
|
|
})
|
|
}
|
|
|
|
sort.Slice(comparisons, func(i, j int) bool {
|
|
aPopularity := comparisons[i].Anime.Popularity.Total()
|
|
bPopularity := comparisons[j].Anime.Popularity.Total()
|
|
|
|
if aPopularity == bPopularity {
|
|
return comparisons[i].Anime.Title.Canonical < comparisons[j].Anime.Title.Canonical
|
|
}
|
|
|
|
return aPopularity > bPopularity
|
|
})
|
|
|
|
return ctx.HTML(components.CompareAnimeList(a, b, countA, countB, comparisons, user))
|
|
}
|
|
|
|
// Contains ...
|
|
func Contains(comparisons []*utils.Comparison, animeID string) bool {
|
|
for _, comparison := range comparisons {
|
|
if comparison.Anime.ID == animeID {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|