Explorar o código

Now showing user's score when an AniList media is completed

Lucas Villeneuve %!s(int64=3) %!d(string=hai) anos
pai
achega
7378a04f1c
Modificáronse 5 ficheiros con 83 adicións e 12 borrados
  1. 1 1
      myanimebot.py
  2. 47 5
      myanimebot/anilist.py
  3. 5 2
      myanimebot/myanimelist.py
  4. 25 2
      myanimebot/utils.py
  5. 5 2
      tests/test_utils.py

+ 1 - 1
myanimebot.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-# Copyright Penta & lulu (c) 2018/2021 - Under BSD License - Based on feed2discord.py by Eric Eisenhart
+# Copyright Penta & lulu (c) 2018/2022 - Under BSD License - Based on feed2discord.py by Eric Eisenhart
 
 # Compatible for Python 3.7.X
 

+ 47 - 5
myanimebot/anilist.py

@@ -64,7 +64,8 @@ def build_feed_from_activity(activity, user : utils.User) -> utils.Feed:
 
     media_type = utils.MediaType.from_str(activity["type"])
 
-    media = utils.Media(name=get_media_name(activity),
+    media = utils.Media(id=activity["media"]["id"],
+                        name=get_media_name(activity),
                         url=activity["media"]["siteUrl"],
                         episodes=get_number_episodes(activity, media_type),
                         image=activity["media"]["coverImage"]["large"],
@@ -75,11 +76,49 @@ def build_feed_from_activity(activity, user : utils.User) -> utils.Feed:
                         status=utils.MediaStatus.from_str(activity["status"]),
                         description=None,
                         media=media,
-                        progress=None)
+                        progress=None,
+                        score=None,
+                        score_format=None)
     feed.progress = get_progress(feed, activity)
     return feed
  
 
+def get_user_score_from_media(media_id : int, user_id : int) -> int:
+    """ Look for the user's score on a specific media """
+    
+    query = '''query($userId: Int, $mediaId: Int){
+        MediaList(userId: $userId, mediaId: $mediaId) {
+            score
+            user {
+                mediaListOptions {
+                    scoreFormat
+                }
+            }
+        }
+    }'''
+    
+    variables = {
+        'userId': user_id,
+        'mediaId': media_id,
+    }
+
+    try:
+        response = requests.post(ANILIST_GRAPHQL_URL, json={'query': query, 'variables': variables})
+        response.raise_for_status()
+        media_list = response.json()["data"]["MediaList"]
+        score_fmt = media_list["user"]["mediaListOptions"]["scoreFormat"]
+        score = media_list["score"]
+        if media_list is None or score == 0: # Not scored
+            return None, score_fmt
+        else:
+            return score, score_fmt
+    except requests.HTTPError as e:
+        globals.logging.error('''HTTP Error while getting the user's score (ID="{}") for media "{}". Error: {}'''.format(user_id, media_id, e))
+    except Exception as e:
+        globals.logging.error('''Unknown error while getting the user's score (ID="{}") for media "{}". Error: {}'''.format(user_id, media_id, e))
+    return None, None
+
+
 def get_anilist_userId_from_name(user_name : str) -> int:
     """ Searches an AniList user by its name and returns its ID """
 
@@ -98,7 +137,7 @@ def get_anilist_userId_from_name(user_name : str) -> int:
         response.raise_for_status()
         return response.json()["data"]["User"]["id"]
     except requests.HTTPError as e:
-        globals.logging.error('HTPP Error while getting the AniList user ID for "{}". Error: {}'.format(user_name, e))
+        globals.logging.error('HTTP Error while getting the AniList user ID for "{}". Error: {}'.format(user_name, e))
     except Exception as e:
         globals.logging.error('Unknown error while getting the AniList user ID for "{}". Error: {}'.format(user_name, e))
     return None
@@ -173,7 +212,7 @@ def get_latest_users_activities(users : List[utils.User], page: int, perPage = 5
         return feeds
 
     except requests.HTTPError as e:
-        globals.logging.error('HTPP Error while getting the latest users\' AniList activities for {} on page {} with {} items per page. Error: {}'.format(users, page, perPage, e))
+        globals.logging.error('HTTP Error while getting the latest users\' AniList activities for {} on page {} with {} items per page. Error: {}'.format(users, page, perPage, e))
     except Exception as e:
         globals.logging.error('Unknown Error while getting the latest users\' AniList activities for {} on page {} with {} items per page. Error: {}'.format(users, page, perPage, e))
     return None
@@ -229,7 +268,7 @@ def get_latest_activity(users : List[utils.User]):
         response.raise_for_status()
         return response.json()["data"]["Activity"]
     except requests.HTTPError as e:
-        globals.logging.error('HTPP Error while getting the latest AniList activity : {}'.format(e))
+        globals.logging.error('HTTP Error while getting the latest AniList activity : {}'.format(e))
     except Exception as e:
         globals.logging.error('Unknown error while getting the latest AniList activity : {}'.format(e))
     return None
@@ -328,6 +367,9 @@ async def process_new_activities(last_activity_date, users : List[utils.User]):
             # Process activity
             globals.logger.info('Adding new feed for "{}({})" about "{}"'.format(activity.user.name, activity.service.name, activity.media.name))
             insert_feed_db(activity)
+            
+            if activity.status == utils.MediaStatus.COMPLETED:
+                activity.score, activity.score_format = get_user_score_from_media(activity.media.id, activity.user.service_id)
 
             await send_embed_to_channels(activity)
 

+ 5 - 2
myanimebot/myanimelist.py

@@ -31,7 +31,8 @@ def build_feed_from_data(data, user : utils.User, image, pubDateRaw, type : util
 
     status, progress, episodes = break_rss_description_string(data.description)
 
-    media = utils.Media(name=data.title,
+    media = utils.Media(id=None,
+                        name=data.title,
                         url=data.link,
                         episodes=episodes,
                         image=image,
@@ -43,7 +44,9 @@ def build_feed_from_data(data, user : utils.User, image, pubDateRaw, type : util
                         status=status,
                         description=data.description, # TODO To remove, useless now
                         media=media,
-                        progress=progress)
+                        progress=progress,
+                        score=None,
+                        score_format=None)
     return feed
 
 

+ 25 - 2
myanimebot/utils.py

@@ -103,11 +103,13 @@ class User():
 
 class Media():
     def __init__(self,
+                 id         : int,
                  name       : str,
                  url        : str,
                  episodes   : str,
                  image      : str,
                  type       : MediaType):
+        self.id = id
         self.name = name
         self.url = url
         self.episodes = episodes
@@ -123,7 +125,9 @@ class Feed():
                  status         : MediaStatus,
                  description    : str, # TODO Need to change
                  progress       : str,
-                 media          : Media
+                 media          : Media,
+                 score          : float,
+                 score_format   : str
                  ):
         self.service = service
         self.date_publication = date_publication
@@ -132,6 +136,8 @@ class Feed():
         self.media = media
         self.description = description
         self.progress = progress
+        self.score = score
+        self.score_format = score_format
 
     
     def get_status_str(self):
@@ -230,6 +236,19 @@ def truncate_end_show(media_name : str):
     return media_name
 
 
+def build_score_string(score_format : str):
+    if score_format == "POINT_100":
+        return "100"
+    elif score_format == "POINT_10" or score_format == "POINT_10_DECIMAL":
+        return "10"
+    elif score_format == "POINT_5":
+        return "5"
+    elif score_format == "POINT_3":
+        return "3"
+    else:
+        return "?"    
+
+
 def build_description_string(feed : Feed):
     '''Build and returns a string describing the feed'''
 
@@ -237,7 +256,11 @@ def build_description_string(feed : Feed):
     status_str = feed.get_status_str()
 
     # Build the string
-    return '{} | {} of {} {}'.format(status_str, feed.progress, feed.media.episodes, media_type_count)
+    desc = '{} | {} of {} {}'.format(status_str, feed.progress, feed.media.episodes, media_type_count)
+    globals.logger.error("Feed media score {}".format(feed.score))
+    if feed.score is not None:
+        desc += '\nScore: {} / {}'.format(feed.score, build_score_string(feed.score_format))
+    return desc
 
 
 def get_channels(server_id: int) -> dict:

+ 5 - 2
tests/test_utils.py

@@ -275,7 +275,8 @@ def test_media_status():
 def test_feed_get_status_str():
     user = User(id=0, service_id=0, name='test', servers=[])
 
-    media = Media(name='Random anime',
+    media = Media(id=None,
+                  name='Random anime',
                     url=None,
                     episodes='?',
                     image=None,
@@ -287,7 +288,9 @@ def test_feed_get_status_str():
                     status=MediaStatus.COMPLETED,
                     description=None,
                     media=media,
-                    progress='?')
+                    progress='?',
+                    score=None,
+                    score_format=None)
 
     assert feed.get_status_str() == 'Completed'
     feed.status = MediaStatus.PLANNING