diff options
author | Mikhail Kirillov <w96k@runbox.com> | 2024-10-09 04:53:26 +0400 |
---|---|---|
committer | Mikhail Kirillov <w96k@runbox.com> | 2024-10-09 22:46:19 +0400 |
commit | 662342863e37e8661f818218df7bb72bc18bf4eb (patch) | |
tree | 79ff9b3884a36e7afec820a8b7c3f235f2e6f1f1 /commands | |
parent | 0d48ea28aeb8a6290d2aeab202efa9c8d6e30fe3 (diff) |
Add movies commands
Diffstat (limited to 'commands')
-rw-r--r-- | commands/__init__.py | 4 | ||||
-rw-r--r-- | commands/movie.py | 105 | ||||
-rw-r--r-- | commands/users.py | 36 |
3 files changed, 138 insertions, 7 deletions
diff --git a/commands/__init__.py b/commands/__init__.py index b494867..09c0867 100644 --- a/commands/__init__.py +++ b/commands/__init__.py @@ -10,4 +10,6 @@ # <http://creativecommons.org/publicdomain/zero/1.0/> from .meta import about -from .users import set_users, add_users, list_users, remove_users, chooser_user +from .users import set_users, add_users, list_users, remove_users, \ + chooser_user, who_is_next +from .movie import movie, movies, remove_movies diff --git a/commands/movie.py b/commands/movie.py new file mode 100644 index 0000000..b7be8cd --- /dev/null +++ b/commands/movie.py @@ -0,0 +1,105 @@ +# This file is part of python-cinema-club-bot +# contributed in 2024 by Mikhail Kirillov (~w96k) <w96k@runbox.com> + +# To the extent possible under law, the author(s) have dedicated all copyright +# and related and neighboring rights to this software to the public domain +# worldwide. This software is distributed without any warranty. + +# You should have received a copy of the CC0 Public Domain Dedication along +# with this software. If not, see: +# <http://creativecommons.org/publicdomain/zero/1.0/> + +from telegram import Update, error +from telegram.ext import ContextTypes +from imdb import Cinemagoer +from pprint import pformat + +from utils import context_init + +from strings import MOVIE_NOT_PROVIDED, EXPECTED_ONE_MOVIE, \ + MOVIE_ANOTHER_USER, FETCHING_MOVIE, FETCHING_ERROR, \ + MOVIE_REMOVE, MOVIE_SET + + +imdb = Cinemagoer() + + +async def movie( + update: Update, + context: ContextTypes.DEFAULT_TYPE +) -> None: + context_init(context) + + chooser = context.chat_data["users"][0] or None + username = update.message.from_user.username + + if "@"+username != chooser: + raise error.TelegramError(MOVIE_ANOTHER_USER.format(user=chooser)) + + if context.args == []: + raise error.TelegramError(MOVIE_NOT_PROVIDED) + + if len(context.args) > 1: + raise error.TelegramError(EXPECTED_ONE_MOVIE) + + movie_id = context.args[0] + + await update.message.reply_text(FETCHING_MOVIE.format(id=movie_id)) + + try: + movie = imdb.get_movie(movie_id) + except: + raise error.TelegramError(FETCHING_ERROR) + + movie_dict = dict( + title=movie.data.get("title"), + id=movie.getID(), + user=update.effective_user.username, + poster=movie.data.get("cover url") + ) + + if len(context.chat_data["movies"]) > 0 and \ + context.chat_data["movies"][-1]["user"] == username: + context.chat_data["movies"][-1] = movie_dict + else: + context.chat_data["movies"].append(movie_dict) + + await update.message.reply_text( + MOVIE_SET.format(title=movie_dict["title"], user=movie_dict["user"]) + ) + + +async def movies( + update: Update, + context: ContextTypes.DEFAULT_TYPE +) -> None: + context_init(context) + + movies = context.chat_data["movies"].copy() + + for movie in movies: + if movie["poster"] or None: + del movie["poster"] + + await update.message.reply_text(pformat(movies)) + + +async def remove_movies( + update: Update, + context: ContextTypes.DEFAULT_TYPE +) -> None: + context_init(context) + + if context.args == []: + raise error.TelegramError(MOVIE_NOT_PROVIDED) + + movies = context.chat_data["movies"] + + for movie_id in context.args: + for movie in movies: + if movie["id"] == movie_id: + context.chat_data["movies"].remove(movie) + await update.message.reply_text( + MOVIE_REMOVE.format(title=movie["title"], id=["movie.id"]) + ) + diff --git a/commands/users.py b/commands/users.py index 413b681..497d7dd 100644 --- a/commands/users.py +++ b/commands/users.py @@ -14,8 +14,9 @@ from telegram.ext import ContextTypes from collections import deque from strings import USER_NOT_PROVIDED, USERS_ADDED, USERS_REMOVED, \ - EXPECTED_ONE_USER, USER_SET, USER_ADD, USER_REMOVE -from utils import context_init + EXPECTED_ONE_USER, USER_SET, USER_ADD, USER_REMOVE, ADD_MORE_USERS, \ + NEXT_MOVIE_USER, USER_NOT_FOUND, USER_CHOOSE +from utils import context_init, create_users_string async def set_users( @@ -53,7 +54,23 @@ async def list_users( ) -> None: context_init(context) - await update.message.reply_text(context.chat_data["users"]) + users = context.chat_data["users"] + + await update.message.reply_markdown(create_users_string(users)) + + +async def who_is_next( + update: Update, + context: ContextTypes.DEFAULT_TYPE +) -> None: + context_init(context) + + users = context.chat_data["users"] + + if len(users) > 0: + await update.message.reply_text(NEXT_MOVIE_USER.format(user=users[0])) + else: + await update.message.reply_text(ADD_MORE_USERS) async def remove_users( @@ -91,9 +108,16 @@ async def chooser_user( chooser = context.args[0] users = deque(context.chat_data["users"]) - chooser_index = users.index(chooser) + try: + chooser_index = users.index(chooser) + except ValueError: + raise error.TelegramError(USER_NOT_FOUND.format(user=chooser)) + users.rotate(-chooser_index) + users = list(users) + + context.chat_data["users"] = users - context.chat_data["users"] = list(users) + await update.message.reply_text(USER_CHOOSE.format(user=users[0])) - await update.message.reply_text(context.chat_data["users"]) + await update.message.reply_markdown(create_users_string(users)) |