def update_ktolivnul(cls, chat_id: int) -> None: logger.debug(f'update_ktolivnul_lock {chat_id}') # лок, чтобы работа прошла за раз # иначе можно кого-то отметить дважды ливнувшим with cls.update_ktolivnul_lock: chat_uids_ktolivnul = set([ int(x) for x in pure_cache.get(f'ktolivnul:{chat_id}', '').split(',') if x != '' ]) if len(chat_uids_ktolivnul) == 0: return chat_uids_db = set([x.uid for x in ChatUser.get_all(chat_id)]) leaved_uids = chat_uids_db - chat_uids_ktolivnul if len(leaved_uids) == 0: return ktolivnul_uid = CONFIG.get('ktolivnul', 0) now = datetime.now() for uid in leaved_uids: ChatUser.add(uid, chat_id, left=True) LeaveCollector.add_kick(uid, chat_id, now, ktolivnul_uid) logger.info(f'[update_ktolivnul] kick {chat_id}:{uid}')
def leave_check(bot: telegram.Bot, update: telegram.Update): message = update.message chat_id = message.chat_id from_user: telegram.User = message.from_user from_uid = from_user.id if not from_user.is_bot: ChatUser.add(from_uid, chat_id) # убыло left_user = message.left_chat_member if left_user is not None and not left_user.is_bot: User.add_user(left_user) ChatUser.add(left_user.id, chat_id, left=True) if from_uid == left_user.id: # сам ливнул LeaveCollector.add_left(left_user.id, chat_id, message.date, from_uid) else: LeaveCollector.add_kick(left_user.id, chat_id, message.date, from_uid) # прибыло new_users = message.new_chat_members if new_users is not None and len(new_users) > 0: for new_user in new_users: if new_user.is_bot: continue User.add_user(new_user) ChatUser.add(new_user.id, chat_id) if from_uid == new_user.id: # вошел по инвайт-ссылке LeaveCollector.add_invite(new_user.id, chat_id, message.date, from_uid) else: LeaveCollector.add_join(new_user.id, chat_id, message.date, from_uid) send_welcome(bot, chat_id, new_user.id) # если ктоливнулыч что-то пишет, то запускаем сверку списков if 'ktolivnul' in CONFIG and from_uid == CONFIG['ktolivnul']: LeaveCollector.update_ktolivnul(chat_id)