2022-09-01 02:06:06 +03:00
|
|
|
from src.fedi_api import get_status, post_status, upload_attachment
|
2022-08-31 22:22:04 +03:00
|
|
|
from src.fmn_states_db import add_state, get_state, clear_all_states
|
2022-10-02 19:27:00 +03:00
|
|
|
from src.fmn_database import get_movies_for_poll, write_votes, read_votes, mark_as_watched_movie, get_already_watched, rewrite_db, reset_poll, get_count_all_watched_movies
|
2022-08-31 22:22:04 +03:00
|
|
|
from collections import Counter
|
2022-09-07 02:55:12 +03:00
|
|
|
from loguru import logger
|
2022-08-31 22:22:04 +03:00
|
|
|
import time
|
2022-08-31 13:20:49 +03:00
|
|
|
|
|
|
|
|
2022-10-02 19:27:00 +03:00
|
|
|
def text_create_poll():
|
2022-11-01 16:56:07 +02:00
|
|
|
count_poll = get_count_all_watched_movies()
|
2022-10-02 19:27:00 +03:00
|
|
|
text_poll = f'''Друзья, {count_poll} голосование за следующий Fediverse Movie Night объявляю открытым!
|
2022-08-31 13:20:49 +03:00
|
|
|
|
2022-10-02 19:27:00 +03:00
|
|
|
Ставки сделаны, ставок больше нет
|
|
|
|
'''.replace('\t', '')
|
|
|
|
return text_poll
|
2022-08-31 13:20:49 +03:00
|
|
|
|
|
|
|
|
2022-10-02 19:27:00 +03:00
|
|
|
def create_poll_movies(text=text_create_poll(), poll_expires=345600):
|
2022-08-31 13:20:49 +03:00
|
|
|
formated_poll_options = []
|
|
|
|
raw_poll = get_movies_for_poll()
|
|
|
|
for i in raw_poll:
|
|
|
|
acct = i[0]
|
|
|
|
orig_name = i[1]
|
|
|
|
ru_name = i[2]
|
|
|
|
year = i[3]
|
|
|
|
poll_option_string = f"{ru_name} / {orig_name}, {year} ({acct})"
|
|
|
|
if ru_name is None:
|
|
|
|
poll_option_string = f"{orig_name}, {year} ({acct})"
|
|
|
|
if orig_name is None:
|
|
|
|
poll_option_string = f"{ru_name}, {year} ({acct})"
|
2022-09-12 00:51:28 +03:00
|
|
|
if len(poll_option_string) >= 200:
|
|
|
|
poll_option_string = poll_option_string[0:199] # Обрезка на 200 символов.
|
2022-08-31 13:20:49 +03:00
|
|
|
formated_poll_options.append(poll_option_string)
|
2022-10-02 19:27:00 +03:00
|
|
|
|
2022-09-01 02:06:06 +03:00
|
|
|
poll_status_id = post_status(text, None, formated_poll_options,
|
|
|
|
poll_expires=poll_expires, attachments=[upload_attachment('src/FMN.png')])
|
2022-09-07 03:05:18 +03:00
|
|
|
logger.success('Голосовалка создана')
|
2022-08-31 22:22:04 +03:00
|
|
|
add_state('poll_expires_at', int(time.time()) + poll_expires)
|
2022-09-01 02:06:06 +03:00
|
|
|
add_state('poll_status_id', poll_status_id['id'])
|
2022-08-31 13:20:49 +03:00
|
|
|
return poll_status_id
|
|
|
|
|
|
|
|
|
|
|
|
def get_winner_movie(poll_status_id=str):
|
2022-08-31 22:22:04 +03:00
|
|
|
'''Отмечаем победивший фильм на голосовании как просмотренный или постим tie breaker'''
|
2022-08-31 13:20:49 +03:00
|
|
|
votes_counters = []
|
|
|
|
status_with_poll = get_status(poll_status_id)
|
|
|
|
poll = status_with_poll['poll']
|
|
|
|
votes_counter = Counter()
|
|
|
|
for option in poll['options']:
|
|
|
|
votes_count = option['votes_count']
|
|
|
|
votes_counters.append(votes_count)
|
|
|
|
|
|
|
|
write_votes(votes_counters)
|
|
|
|
voted_movies = read_votes()
|
|
|
|
max_vote = voted_movies[0][4]
|
|
|
|
winned_movies = []
|
|
|
|
for i in voted_movies:
|
|
|
|
if max_vote == i[4]:
|
|
|
|
winned_movies.append(i)
|
|
|
|
|
|
|
|
if len(winned_movies) > 1:
|
|
|
|
logger.warning('Будет создан tie breaker')
|
|
|
|
rewrite_db(winned_movies)
|
2022-08-31 22:22:04 +03:00
|
|
|
if get_state('tie_breaker'):
|
|
|
|
create_tie_breaker(2)
|
|
|
|
else:
|
|
|
|
create_tie_breaker()
|
2022-08-31 13:20:49 +03:00
|
|
|
else:
|
|
|
|
movie = winned_movies[0]
|
|
|
|
mark_as_watched_movie(movie[1], movie[2], movie[3])
|
2022-09-06 22:16:30 +03:00
|
|
|
|
2022-09-17 16:18:42 +03:00
|
|
|
acct_suggested, orig_name, ru_name, year, votes_count_win = movie
|
2022-09-10 23:30:08 +03:00
|
|
|
win_variant = f"{ru_name} / {orig_name}, {year}"
|
2022-09-06 22:16:30 +03:00
|
|
|
if ru_name is None:
|
|
|
|
win_variant = f"{orig_name}, {year}"
|
|
|
|
if orig_name is None:
|
|
|
|
win_variant = f"{ru_name}, {year}"
|
2022-10-02 19:27:00 +03:00
|
|
|
expired_poll_count = get_count_all_watched_movies() - 1
|
|
|
|
text_winned = f"{expired_poll_count} голосование завершилось! Победил вариант предложенный @{acct_suggested}:\n{win_variant}"
|
2022-09-06 22:16:30 +03:00
|
|
|
|
2022-09-07 03:05:18 +03:00
|
|
|
logger.success("Победил " + str(movie))
|
2022-09-06 22:16:30 +03:00
|
|
|
post_status(text_winned, attachments=[upload_attachment('src/FMN.png')])
|
2022-08-31 22:22:04 +03:00
|
|
|
clear_all_states()
|
|
|
|
reset_poll()
|
2022-08-31 13:20:49 +03:00
|
|
|
|
|
|
|
|
2022-08-31 22:22:04 +03:00
|
|
|
def create_tie_breaker(count_tie=1):
|
|
|
|
'''Создание tie breaker'''
|
|
|
|
if count_tie == 1:
|
|
|
|
add_state('tie_breaker', 1)
|
|
|
|
poll_expires = 8*60*60
|
|
|
|
else:
|
|
|
|
poll_expires = 4*60*60
|
2022-09-01 02:06:06 +03:00
|
|
|
tie_poll = create_poll_movies("TIE BREAKER!!!\n\nВыбираем из победителей!", poll_expires)
|
2022-08-31 13:20:49 +03:00
|
|
|
|