FMN_bot/src/listener_mention.py

92 lines
4.9 KiB
Python
Raw Permalink Normal View History

2022-09-01 02:06:06 +03:00
from src.fedi_api import get_notifications, mark_as_read_notification, post_status, upload_attachment
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
import time
from datetime import datetime
from dateutil.parser import parse as dateutilparse
from dateutil.relativedelta import relativedelta, TU, SU
from loguru import logger
2022-08-31 13:20:49 +03:00
@logger.catch
def get_control_mention():
2022-08-31 13:20:49 +03:00
while True:
states = states_stor.states
2022-09-11 21:18:56 +03:00
time.sleep(30)
2022-09-05 20:15:18 +03:00
time_now = datetime.now()
now_week = time_now.weekday()
2022-09-11 00:58:44 +03:00
now_hour = time_now.hour
if now_week not in (0, 6):
continue
if now_week == 6 and now_hour < fmn_next_watching_hour:
# Предотвращение работы в холстую до начала сеанса
continue
2022-11-21 22:33:00 +02:00
post_exists = states.get('last_thread_id')
if post_exists:
2022-09-11 00:58:44 +03:00
continue
logger.debug('Wait for from admin mention...')
2022-08-31 13:20:49 +03:00
notif = get_notifications()
for i in notif:
if i['type'] not in ("mention"):
continue
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 is False and reply_to_id is None and now_week in (0, 6):
logger.success(f'Найдено упоминание от {acct_mention}')
2022-08-31 13:20:49 +03:00
st_id = i['status']['id']
st_date = i['status']['created_at']
thread_created_at = dateutilparse(st_date)
2022-09-05 20:15:18 +03:00
delta = relativedelta(hour=hour_poll_posting, minute=0, second=0, weekday=TU(1))
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()))
2022-09-05 20:15:18 +03:00
if now_week == 6: # Фикс стыков двух недель. Если вс, то расчитываем на следующую неделю
next_week = 2
else:
next_week = 1
next_movie_watching_delta = relativedelta(hour=fmn_next_watching_hour, minute=0, second=0, weekday=SU(next_week))
next_movie_watching = time_now + next_movie_watching_delta
max_mute_time = time.mktime(time.struct_time(next_movie_watching.timetuple())) # Глушение до следующего сеанса FMN.
next_movie_watching = next_movie_watching.strftime('%d.%m.%Y')
post_status(start_collect_movies_text(movies_accept_time, next_movie_watching), st_id, attachments=[upload_attachment('src/FMN.webp')])
2022-09-05 20:15:18 +03:00
2022-08-31 13:20:49 +03:00
time.sleep(0.2)
mark_as_read_notification(i['id'])
2022-11-21 22:33:00 +02:00
states_stor.states['max_mute_time'] = int(max_mute_time)
states_stor.states['stop_thread_scan'] = int(stop_thread_scan)
states_stor.states['last_thread_id'] = st_id
write_states(states_stor.states)
break
2022-08-31 13:20:49 +03:00
time.sleep(30)
def start_collect_movies_text(movies_accept_time=str, next_movie_watching=str):
2022-08-31 13:20:49 +03:00
text = f'''
Начинаем прием заявок на следующий вечерний киносеанс, запланированный на {next_movie_watching} в 21:00 по Москве.
2022-08-31 13:20:49 +03:00
Напоминаем правила:
- Мы принимаем на просмотр полнометражные художественные фильмы;
- Прием варианта осуществляется путем публикации ссылки на этот фильм на IMDB https://libremdb.leemoon.network/ или Кинопоиске в этом треде;
2022-08-31 13:20:49 +03:00
- Нам не подходят: сериалы, короткометражные и документальные фильмы;
2022-08-31 18:35:38 +03:00
- Максимальное количество вариантов, предложенных одним человеком не должно превышать {limit_movies_per_user};
- Всего может быть собрано до {limit_all_movies_poll} фильмов;
2022-08-31 13:20:49 +03:00
- Заявки принимаются до крайнего срока, после чего будет объявлено голосование по собранным вариантам.
Крайний срок подачи заявки - {movies_accept_time}.
2023-01-15 21:20:37 +02:00
Рекомендуем посетить список, чтобы случайно не предложить уже просмотренный фильм: https://pub.phreedom.club/~localhost/fmn_watched.gmi
2022-08-31 13:20:49 +03:00
Желаем удачи.
'''.replace('\t', '')
return text
2022-08-31 13:20:49 +03:00
def run_scan_notif():
scan_notif = threading.Thread(target=get_control_mention, daemon=True)
2022-08-31 13:20:49 +03:00
scan_notif.start()