From 81c13c3c964835cebed817c9a8730afcf2a41a42 Mon Sep 17 00:00:00 2001 From: localhost_frssoft Date: Thu, 27 Jul 2023 17:21:22 +0300 Subject: [PATCH] import cleanup and retries for context thread; pep8 --- src/fedi_api.py | 12 ++++++------ src/listener_context.py | 28 +++++++++++----------------- src/listener_mention.py | 12 +++++++----- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/fedi_api.py b/src/fedi_api.py index ce052e7..9f882a3 100644 --- a/src/fedi_api.py +++ b/src/fedi_api.py @@ -1,6 +1,5 @@ from config import instance import time -import json import requests from loguru import logger @@ -35,7 +34,6 @@ def get_notifications(): logger.info('Retrying get notificatios...') - def mark_as_read_notification(id_notification): success = 0 while success == 0: @@ -51,6 +49,7 @@ def mark_as_read_notification(id_notification): def get_status_context(status_id): + retry = 0 success = 0 while success == 0: try: @@ -58,11 +57,14 @@ def get_status_context(status_id): r.raise_for_status() success = 1 return r.json() - except: + except Exception as E: logger.exception(f'Ошибка получения контекста треда {status_id}') time.sleep(30) logger.info('Повторный запрос треда...') - + retry += 1 + if retry > 5: + raise IOError(f'Фетчинг треда поломан! {E}') + def get_status(status_id): success = 0 @@ -78,7 +80,6 @@ def get_status(status_id): logger.info(f'Retrying get status {status_id}') - def post_status(text, reply_to_status_id=None, poll_options=None, poll_expires=345600, attachments=None): poll = None if poll_options is not None: @@ -136,4 +137,3 @@ def mute_user(acct_id=str, acct=str, duration=None): logger.exception(f'Ошибка глушения {acct}') time.sleep(5) logger.info(f'Повторное глушение {acct}...') - diff --git a/src/listener_context.py b/src/listener_context.py index 7b1ac6f..986a2dc 100644 --- a/src/listener_context.py +++ b/src/listener_context.py @@ -3,13 +3,10 @@ from src.fedi_api import get_status_context, get_status, post_status, mute_user from src.kinopoisk_api import get_kinopoisk_movie_to_imdb from src.imdb_datasets_worker import get_title_by_id from src.fmn_database import add_movie_to_poll, get_already_watched, get_suggested_movies_count -from src.fmn_states_db import states_stor, write_states +from src.fmn_states_db import states_stor from src.fmn_poll import create_poll_movies, get_winner_movie import re import time -from datetime import datetime -from dateutil.parser import parse as dateutilparse -from dateutil.relativedelta import relativedelta, TU from collections import Counter from loguru import logger @@ -29,7 +26,7 @@ def parse_links_imdb(text=str): if imdb_ids != []: return imdb_ids[:limit_movies_per_user] - + def scan_context_thread(): fail_limit = Counter() while True: @@ -58,7 +55,7 @@ def scan_context_thread(): else: endings = int(stop_thread_scan) - time_now logger.debug(f'Осталось до закрытия сбора: {endings}') - if reserve_time: # Reduce instance load + if reserve_time: # Reduce instance load time.sleep(30) get_thread_time = time.time() descendants = get_status_context(status_id)['descendants'] @@ -79,14 +76,14 @@ def scan_context_thread(): acct_id = status['account']['id'] content = status['pleroma']['content']['text/plain'] - if id_st in replyed: # Игнорировать уже отвеченное + if id_st in replyed: # Игнорировать уже отвеченное continue if muted is True: continue - if fail_limit[acct] >= max_fail_limit: # Игнорировать пользователя если он превысил fail limit + if fail_limit[acct] >= max_fail_limit: # Игнорировать пользователя если он превысил fail limit mute_user(acct_id, acct, int(states.get('max_mute_time')) - time_now) logger.warning(f'{acct} игнорируется - превышение fail limit') - break # Нужно обновить тред, чтобы muted на заглушенном стал True + break # Нужно обновить тред, чтобы muted на заглушенном стал True parsed_result = parse_links(content) parsed_result_imdb = parse_links_imdb(content) @@ -99,7 +96,7 @@ def scan_context_thread(): logger.info(f'{acct} был уведомлен о завершенной голосовалке') fail_limit[acct] += 1 continue - + index_type = 1 index_name = 2 index_ru_name = 3 @@ -117,13 +114,12 @@ def scan_context_thread(): continue elif parsed_result_imdb is not None: suggested_movies = get_title_by_id(parsed_result_imdb) - + if suggested_movies is None: post_status('❌ Фильм(ы) не найден в базе данных IMDB, пожалуйста обратитесь к администратору, чтобы обновить базу. Примечание: IMDB выкладывает новые изменения не сразу.', id_st) fail_limit[acct] += 1 continue - for movie in suggested_movies: logger.debug(str(movie)) if movie[index_type] == "404": @@ -140,7 +136,7 @@ def scan_context_thread(): name_ru = movie[index_ru_name] year = movie[index_year] movie_string = f"{name_ru} / {name}, {year}" - + if name is None: movie_string = f"{name_ru}, {year}" if name_ru is None: @@ -154,8 +150,8 @@ def scan_context_thread(): logger.warning(f'Предложение {acct} было отклонено: количество уже предложенных фильмов превышает\равно {limit_all_movies_poll}') fail_limit[acct] += 1 break - - if get_already_watched(name, name_ru, year) == True: + + if get_already_watched(name, name_ru, year) is True: message_writer.append(f"ℹ️ Этот фильм уже был на FMN: {movie_string}") logger.info(f'Попытка предложить уже просмотренный фильм: {acct} {name} {name_ru} {year}') fail_limit[acct] += 1 @@ -181,5 +177,3 @@ def scan_context_thread(): post_status('\n'.join(message_writer) + message, id_st) time.sleep(30) - - diff --git a/src/listener_mention.py b/src/listener_mention.py index 4073c15..d1d2e46 100644 --- a/src/listener_mention.py +++ b/src/listener_mention.py @@ -2,7 +2,8 @@ from src.fedi_api import get_notifications, mark_as_read_notification, post_stat from src.fmn_states_db import write_states, states_stor from config import admins_bot, limit_movies_per_user, limit_all_movies_poll, hour_poll_posting, fmn_next_watching_hour -import threading, time +import threading +import time from datetime import datetime from dateutil.parser import parse as dateutilparse from dateutil.relativedelta import relativedelta, TU, SU @@ -19,7 +20,8 @@ def get_control_mention(): now_hour = time_now.hour if now_week not in (0, 6): continue - if now_week == 6 and now_hour < fmn_next_watching_hour: # Предотвращение работы в холстую до начала сеанса + if now_week == 6 and now_hour < fmn_next_watching_hour: + # Предотвращение работы в холстую до начала сеанса continue post_exists = states.get('last_thread_id') if post_exists: @@ -32,7 +34,7 @@ def get_control_mention(): seen = i['pleroma']['is_seen'] acct_mention = i['account']['acct'] reply_to_id = i['status']['in_reply_to_id'] - if acct_mention in admins_bot and seen == False and reply_to_id == None and now_week in (0, 6): + if acct_mention in admins_bot and seen is False and reply_to_id is None and now_week in (0, 6): logger.success(f'Найдено упоминание от {acct_mention}') st_id = i['status']['id'] st_date = i['status']['created_at'] @@ -42,7 +44,7 @@ def get_control_mention(): stop_thread_scan = thread_created_at + delta movies_accept_time = stop_thread_scan.strftime('%H:%M %d.%m.%Y по Москве') stop_thread_scan = time.mktime(time.struct_time(stop_thread_scan.timetuple())) - + if now_week == 6: # Фикс стыков двух недель. Если вс, то расчитываем на следующую неделю next_week = 2 else: @@ -83,7 +85,7 @@ def start_collect_movies_text(movies_accept_time=str, next_movie_watching=str): '''.replace('\t', '') return text + def run_scan_notif(): scan_notif = threading.Thread(target=get_control_mention, daemon=True) scan_notif.start() -