FMN_bot/src/listener_context.py

129 lines
5.3 KiB
Python
Raw Normal View History

2022-08-31 10:20:49 +00:00
import time
from datetime import datetime
from dateutil.parser import parse as dateutilparse
from dateutil.relativedelta import relativedelta, TU
import re
import logging
2022-08-31 15:24:30 +00:00
from config import hour_poll_posting, bot_acct, instance
2022-08-31 10:20:49 +00:00
from src.fedi_api import get_status_context, get_status, post_status
from src.kinopoisk_api import get_kinopoisk_movie
from src.imdb_datasets_worker import get_title_by_id
from src.fmn_database import add_movie_to_poll, get_already_watched
2022-08-31 15:24:30 +00:00
from src.fmn_states_db import get_state, add_state
from src.fmn_poll import create_poll_movies, get_winner_movie
2022-08-31 10:20:49 +00:00
logger = logging.getLogger('thread_listener')
def parse_links(text=str):
regex = r"kinopoisk\.ru/"
if re.search(regex, text.lower(), flags=re.MULTILINE):
kinopoisk_ids = re.findall(r"film/(\d{1,})", text.lower())
return kinopoisk_ids
else:
return None
def parse_links_imdb(text=str):
regex = r"imdb\.com/"
if re.search(regex, text.lower(), flags=re.MULTILINE):
imdb_ids = re.findall(r"tt(\d{1,})", text.lower())
return imdb_ids
else:
return None
def scan_context_thread():
while True:
2022-08-31 15:24:30 +00:00
status_id = get_state('last_thread_id')
poll_created = get_state('poll_status_id')
stop_thread_scan = get_state('stop_thread_scan')
2022-08-31 15:24:30 +00:00
flag_scan = 0
time_now = int(time.time())
while status_id is None or stop_thread_scan is None:
2022-08-31 15:24:30 +00:00
status_id = get_state('last_thread_id')
stop_thread_scan = get_state('stop_thread_scan')
2022-08-31 10:20:49 +00:00
time.sleep(1)
2022-08-31 15:24:30 +00:00
if time_now >= int(stop_thread_scan):
2022-08-31 10:20:49 +00:00
logger.debug('Сбор завершён, сканирование треда на опоздавших')
2022-08-31 15:24:30 +00:00
if poll_created is None:
2022-08-31 10:20:49 +00:00
create_poll_movies()
2022-08-31 15:24:30 +00:00
poll_created = get_state('poll_status_id')
else:
if time_now >= int(get_state('poll_expires_at')):
get_winner_movie(poll_created)
2022-08-31 10:20:49 +00:00
else:
endings = int(stop_thread_scan) - time_now
2022-08-31 10:20:49 +00:00
logger.debug(f'Осталось до закрытия сбора: {endings}')
descendants = get_status_context(status_id)['descendants']
replyed = []
for status in descendants:
if status['account']['acct'] == bot_acct:
replyed.append(status['in_reply_to_id'])
for status in descendants:
id_st = status['id']
in_reply_acct = status['in_reply_to_account_id']
in_reply_id = status['in_reply_to_id']
acct = status['account']['acct']
content = status['pleroma']['content']['text/plain']
if id_st in replyed: # Игнорировать уже отвеченное
continue
parsed_result = parse_links(content)
parsed_result_imdb = parse_links_imdb(content)
if parsed_result is None and parsed_result_imdb is None:
continue
2022-08-31 15:24:30 +00:00
if poll_created:
post_status(f' Приём заявок уже окончен.\n\nГолосовалка здесь: https://{instance}/notice/{poll_created}', id_st)
2022-08-31 10:20:49 +00:00
continue
if parsed_result is not None:
suggested_movies = get_kinopoisk_movie(parsed_result)
index_type = 0
index_name = 2
index_ru_name = 3
index_year = 1
elif parsed_result_imdb is not None:
suggested_movies = get_title_by_id(parsed_result_imdb)
index_type = 1
index_name = 2
index_ru_name = 3
index_year = 4
message_writer = []
for movie in suggested_movies:
if movie[index_type] == "404":
message_writer.append("Не найдено.")
elif movie[index_type] not in ("movie", "FILM", "video"):
message_writer.append(f"Не принято: Мы принимаем фильмы, если они: полнометражные, художественные, не являются сериалами")
else:
name = movie[index_name]
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:
movie_string = f"{name}, {year}"
if get_already_watched(name, name_ru, year) == True:
message_writer.append(f"ℹ️Этот фильм уже был на FMN: {movie_string}")
continue
if add_movie_to_poll(acct, name, name_ru, year) == True:
message_writer.append(f"✅ Принято: {movie_string}")
else:
post_status("❌ Вы не можете добавить больше 2х фильмов", id_st)
if message_writer != []:
post_status('\n'.join(message_writer) + "\nБлагодарим за ваше предложение!", id_st)
logger.info(str((id_st, in_reply_acct, acct, in_reply_id, content)))
time.sleep(30)