summaryrefslogtreecommitdiff
path: root/commands/event.py
diff options
context:
space:
mode:
authorMikhail Kirillov <w96k@runbox.com>2024-10-10 04:12:00 +0400
committerMikhail Kirillov <w96k@runbox.com>2024-10-10 04:12:00 +0400
commit9be02d9141c14a3e3ca28567dbaff671de83200f (patch)
treeecc8c2f7023654179d51e2fdee68b1d688c131d8 /commands/event.py
parent662342863e37e8661f818218df7bb72bc18bf4eb (diff)
Fix #9. Add events commands
Diffstat (limited to 'commands/event.py')
-rw-r--r--commands/event.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/commands/event.py b/commands/event.py
new file mode 100644
index 0000000..47c34ea
--- /dev/null
+++ b/commands/event.py
@@ -0,0 +1,110 @@
+# 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 datetime import datetime
+
+from utils import context_init
+from predicates import is_past, has_finished_event
+from strings import EVENT_ARGS_NOT_PROVIDED, EVENT_INVALID_DATETIME, \
+ EVENT_CREATED, EVENT_EDITED, EVENT_CANT_BE_IN_PAST, \
+ EVENT_WHERE_NOT_PROVIDED, EVENT_MOVIE_NOT_CHOOSEN, EVENTS_LIST, \
+ EVENT_USER_HAD_EVENT, NO_EVENTS
+
+
+async def create_event(
+ update: Update,
+ context: ContextTypes.DEFAULT_TYPE
+) -> None:
+ context_init(context)
+ events = context.chat_data["events"]
+ movies = context.chat_data["movies"]
+
+ username = update.message.from_user.username
+ last_movie = movies[-1] if movies != [] else None
+
+ if has_finished_event(context, username):
+ raise error.TelegramError(EVENT_USER_HAD_EVENT)
+
+ if last_movie is None or last_movie["user"] != username:
+ raise error.TelegramError(EVENT_MOVIE_NOT_CHOOSEN)
+
+ if context.args == []:
+ raise error.TelegramError(EVENT_ARGS_NOT_PROVIDED)
+
+ argument_when = context.args[0]
+
+ try:
+ event_when = datetime.strptime(argument_when, "%d.%m.%Y/%H:%M")
+ except ValueError:
+ raise error.TelegramError(EVENT_INVALID_DATETIME)
+
+ if is_past(event_when):
+ raise error.TelegramError(
+ EVENT_CANT_BE_IN_PAST.format(
+ when=event_when,
+ today=datetime.today(),
+ )
+ )
+
+ arguments_where = context.args[1:]
+
+ if arguments_where == [] and events == []:
+ raise error.TelegramError(EVENT_WHERE_NOT_PROVIDED)
+
+ event_where = " ".join(arguments_where)
+
+ if event_where == "":
+ event_where = events[-1]["where"]
+
+ event_dict = dict(
+ when=event_when,
+ where=event_where,
+ movie=last_movie["title"],
+ user=last_movie["user"]
+ )
+
+ if events == [] or is_past(events[-1]["when"]):
+ events.append(event_dict)
+ await update.message.reply_text(EVENT_CREATED.format(when=event_when))
+ else:
+ events[-1] = event_dict
+ await update.message.reply_text(EVENT_EDITED.format(when=event_when))
+
+
+async def list_events(
+ update: Update,
+ context: ContextTypes.DEFAULT_TYPE
+) -> None:
+ context_init(context)
+
+ events = context.chat_data["events"]
+ movies = context.chat_data["movies"]
+
+ events_formatted: str = ""
+
+ for event in events:
+ event_finished = "FINISHED" \
+ if is_past(event["when"]) else "PLANNED"
+
+ events_formatted += EVENTS_LIST.format(
+ movie=event["movie"],
+ user=event["user"],
+ when=event["when"],
+ where=event["where"],
+ finished=event_finished
+ )
+
+ if events_formatted == "":
+ events_formatted = NO_EVENTS
+
+ await update.message.reply_text(events_formatted)