Queer European MD passionate about IT
Browse Source

Store user profile pictures in bot database

Check for new photos at least 24 hours after last check. Store telegram file id.
Davte 5 years ago
parent
commit
27959ac4fd
1 changed files with 61 additions and 6 deletions
  1. 61 6
      davtelepot/bot.py

+ 61 - 6
davtelepot/bot.py

@@ -273,6 +273,23 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
                 'selected_language_code',
                 'selected_language_code',
                 self.db.types.string
                 self.db.types.string
             )
             )
+        if 'user_profile_photos' not in self.db.tables:
+            table = self.db.create_table(
+                table_name='user_profile_photos'
+            )
+            table.create_column(
+                'user_id',
+                self.db.types.integer
+            )
+            table.create_column(
+                'telegram_file_id',
+                self.db.types.integer
+            )
+
+            table.create_column(
+                'update_datetime',
+                self.db.types.datetime
+            )
         return
         return
 
 
     @property
     @property
@@ -3145,19 +3162,26 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
             track of differences in `users_history` table.
             track of differences in `users_history` table.
         """
         """
         while 1:
         while 1:
+            users_profile_pictures_to_update = OrderedDict()
             await asyncio.sleep(interval)
             await asyncio.sleep(interval)
+            now = datetime.datetime.now()
             # Iterate through a copy since asyncio.sleep(0) is awaited at each
             # Iterate through a copy since asyncio.sleep(0) is awaited at each
             # cycle iteration.
             # cycle iteration.
             for telegram_id, user in self.recent_users.copy().items():
             for telegram_id, user in self.recent_users.copy().items():
                 new_record = dict()
                 new_record = dict()
                 with self.db as db:
                 with self.db as db:
                     user_record = db['users'].find_one(telegram_id=telegram_id)
                     user_record = db['users'].find_one(telegram_id=telegram_id)
-                    for key in [
-                        'first_name',
-                        'last_name',
-                        'username',
-                        'language_code'
-                    ]:
+                    user_picture_record = db['user_profile_photos'].find_one(
+                        user_id=user_record['id'],
+                        order_by=['-update_datetime']
+                    )
+                    # If user profile picture needs to be updated, add it to the OD
+                    if (user_picture_record is None
+                            or user_picture_record['update_datetime']
+                            < now - datetime.timedelta(days=1)):
+                        users_profile_pictures_to_update[telegram_id] = user_picture_record
+                    for key in ('first_name', 'last_name',
+                                'username', 'language_code', ):
                         new_record[key] = (user[key] if key in user else None)
                         new_record[key] = (user[key] if key in user else None)
                         if (
                         if (
                             (
                             (
@@ -3190,6 +3214,37 @@ class Bot(TelegramBot, ObjectWithDatabase, MultiLanguageObject):
                 if telegram_id in self.recent_users:
                 if telegram_id in self.recent_users:
                     del self.recent_users[telegram_id]
                     del self.recent_users[telegram_id]
                 await asyncio.sleep(0)
                 await asyncio.sleep(0)
+            # Update user profile pictures
+            for telegram_id, user_picture_record in users_profile_pictures_to_update.items():
+                try:
+                    user_profile_photos = await self.getUserProfilePhotos(
+                        user_id=telegram_id,
+                        offset=0,
+                        limit=1
+                    )
+                    if (user_profile_photos is not None
+                            and 'photos' in user_profile_photos
+                            and len(user_profile_photos['photos'])):
+                        current_photo = user_profile_photos['photos'][0][0]
+                        if (user_picture_record is None
+                                or current_photo['file_id']
+                                != user_picture_record['telegram_file_id']):
+                            db['user_profile_photos'].insert(dict(
+                                user_id=user_record['id'],
+                                telegram_file_id=current_photo['file_id'],
+                                update_datetime=now
+                            ))
+                        else:
+                            db['user_profile_photos'].upsert(
+                                dict(
+                                    user_id=user_record['id'],
+                                    telegram_file_id=current_photo['file_id'],
+                                    update_datetime=now
+                                ),
+                                ['user_id', 'telegram_file_id']
+                            )
+                except Exception as e:
+                    logging.error(e)
 
 
     def get_user_record(self, update):
     def get_user_record(self, update):
         """Get user_record of update sender.
         """Get user_record of update sender.