From 0d6745606d3110ac312af9d773e6c0304ce614f1 Mon Sep 17 00:00:00 2001 From: Mikhail Kirillov Date: Wed, 9 Oct 2024 01:22:02 +0400 Subject: Add /remove and /list commands (unfinished) --- app.py | 80 -------------------------------------- db | Bin 0 -> 121 bytes main.py | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ persistence.py | 3 ++ strings.py | 3 ++ utils.py | 23 +++++++++++ 6 files changed, 149 insertions(+), 80 deletions(-) delete mode 100644 app.py create mode 100644 db create mode 100644 main.py create mode 100644 persistence.py create mode 100644 utils.py diff --git a/app.py b/app.py deleted file mode 100644 index eeaf27e..0000000 --- a/app.py +++ /dev/null @@ -1,80 +0,0 @@ -# This file is part of python-cinema-club-bot -# contributed in 2024 by Mikhail Kirillov (~w96k) - -# 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: -# - -from telegram import Update, error -from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, \ - MessageHandler, filters -from dotenv import load_dotenv -from rich import inspect -import os -import logging -from .strings import INVALID_COMMAND - -load_dotenv() - -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) - - -async def about(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: - await update.message.reply_text(''' -Version 0.0 - -python-cinema-club-bot is a bot for Telegram specialized for managing cinema club activities. This software is released as Public Domain using CC0 license. - -Project information: http://57.129.46.169/trac/wiki/python-cinema-club-bot -Source code: http://57.129.46.169/cgit/python-cinema-club-bot/ - -Contributed in 2024 by Mikhail Kirillov (~w96k) - -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: - - - ''') - - -async def add_choose_cycle( - update: Update, - context: ContextTypes.DEFAULT_TYPE -) -> None: - command = update.message.text - - user = command.replace("/add", "") - - inspect(user) - - try: - if user == "": - raise error.TelegramError("User is not provided. Use /add @username") - except error.TelegramError as err: - await update.message.reply_text(err.message) - return - - await update.message.reply_text(update.message.text) - - -async def unknown(update: Update, context: ContextTypes.DEFAULT_TYPE): - await context.bot.send_message(chat_id=update.effective_chat.id, text=INVALID_COMMAND) - -app = ApplicationBuilder().token( - os.environ.get('TELEGRAM_TOKEN') -).build() - -app.add_handler(CommandHandler("about", about)) -app.add_handler(CommandHandler("add", add_choose_cycle)) - -app.add_handler(MessageHandler(filters.COMMAND, unknown)) - -app.run_polling() diff --git a/db b/db new file mode 100644 index 0000000..97c1e47 Binary files /dev/null and b/db differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..5ea81d3 --- /dev/null +++ b/main.py @@ -0,0 +1,120 @@ +# This file is part of python-cinema-club-bot +# contributed in 2024 by Mikhail Kirillov (~w96k) + +# 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: +# + +from telegram import Update, error +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, \ + MessageHandler, filters +from dotenv import load_dotenv +import os +import logging +from rich import inspect + +from strings import INVALID_COMMAND, USER_NOT_PROVIDED, USER_ADDED, \ + USER_REMOVED +from utils import context_init +from persistence import Persistence + + +load_dotenv() + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) + + +async def about(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + await update.message.reply_text(''' +Version 0.0 + +python-cinema-club-bot is a bot for Telegram specialized for managing cinema club activities. This software is released as Public Domain using CC0 license. + +Project information: http://57.129.46.169/trac/wiki/python-cinema-club-bot +Source code: http://57.129.46.169/cgit/python-cinema-club-bot/ + +Contributed in 2024 by Mikhail Kirillov (~w96k) + +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: + + + ''') + + +async def add( + update: Update, + context: ContextTypes.DEFAULT_TYPE +) -> None: + context_init(context) + + if context.args == []: + await update.message.reply_text(USER_NOT_PROVIDED) + raise error.TelegramError(USER_NOT_PROVIDED) + + for user in context.args: + context.chat_data["users"].append(user) + await update.message.reply_text(USER_ADDED.format(user=user)) + + await update.message.reply_text(context.chat_data) + + +async def list( + update: Update, + context: ContextTypes.DEFAULT_TYPE +) -> None: + context_init(context) + + await update.message.reply_text(context.chat_data) + + +async def remove( + update: Update, + context: ContextTypes.DEFAULT_TYPE +) -> None: + context_init(context) + + if context.args == []: + await update.message.reply_text(USER_NOT_PROVIDED) + raise error.TelegramError(USER_NOT_PROVIDED) + + for user in context.args: + if user == "*": + context.chat_data["users"] = [] + break + + context.chat_data["users"].remove(user) + await update.message.reply_text(USER_REMOVED.format(user=user)) + + await update.message.reply_text(context.chat_data) + + +async def unknown(update: Update, context: ContextTypes.DEFAULT_TYPE): + await context.bot.send_message( + chat_id=update.effective_chat.id, + text=INVALID_COMMAND + ) + + +if __name__ == "__main__": + app = ApplicationBuilder().token( + os.environ.get("TELEGRAM_TOKEN") + ).persistence(Persistence).build() + + app.add_handler(CommandHandler("about", about)) + app.add_handler(CommandHandler("add", add)) + app.add_handler(CommandHandler("list", list)) + app.add_handler(CommandHandler("remove", remove)) + + + app.add_handler(MessageHandler(filters.COMMAND, unknown)) + + app.run_polling() diff --git a/persistence.py b/persistence.py new file mode 100644 index 0000000..71758e1 --- /dev/null +++ b/persistence.py @@ -0,0 +1,3 @@ +from telegram.ext import PicklePersistence + +Persistence = PicklePersistence(filepath='db') diff --git a/strings.py b/strings.py index 61dc5d6..c9cfb20 100644 --- a/strings.py +++ b/strings.py @@ -10,3 +10,6 @@ # INVALID_COMMAND = "Invalid command. Available commands: /add" +USER_NOT_PROVIDED = "User(s) is not provided" +USER_ADDED = "User {user} has been added" +USER_REMOVED = "User {user} has been removed" diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..4b28c03 --- /dev/null +++ b/utils.py @@ -0,0 +1,23 @@ +# This file is part of python-cinema-club-bot +# contributed in 2024 by Mikhail Kirillov (~w96k) + +# 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: +# + +from telegram.ext import ContextTypes + + +def context_init(context: ContextTypes.DEFAULT_TYPE): + ''' + Initialize chat context with starting values + ''' + + if "users" not in context.chat_data: + context.chat_data["users"]: list[str] = [] + + return context -- cgit v1.2.3