summaryrefslogtreecommitdiff
path: root/commands
diff options
context:
space:
mode:
Diffstat (limited to 'commands')
-rw-r--r--commands/__init__.py4
-rw-r--r--commands/movie.py105
-rw-r--r--commands/users.py36
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))