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)