summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Kirillov <w96k@runbox.com>2024-10-09 03:05:41 +0400
committerMikhail Kirillov <w96k@runbox.com>2024-10-09 03:09:50 +0400
commitcc34991f2098692a2cb2a9e913bd6667d38fdab5 (patch)
tree2d0e3f0fe93a7dc6f694bf50133761998c970630
parent0d6745606d3110ac312af9d773e6c0304ce614f1 (diff)
Add commands modules; Added /chooser command
-rw-r--r--commands/__init__.py13
-rw-r--r--commands/meta.py32
-rw-r--r--commands/users.py91
-rw-r--r--main.py85
-rw-r--r--strings.py1
5 files changed, 146 insertions, 76 deletions
diff --git a/commands/__init__.py b/commands/__init__.py
new file mode 100644
index 0000000..e2fd670
--- /dev/null
+++ b/commands/__init__.py
@@ -0,0 +1,13 @@
+# 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 .meta import about
+from .users import add_users, list_users, remove_users, chooser_user
diff --git a/commands/meta.py b/commands/meta.py
new file mode 100644
index 0000000..c98e770
--- /dev/null
+++ b/commands/meta.py
@@ -0,0 +1,32 @@
+# 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
+from telegram.ext import ContextTypes
+
+
+async def about(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
+ await update.message.reply_text('''
+Version InDev
+
+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) <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/>
+
+ ''')
diff --git a/commands/users.py b/commands/users.py
new file mode 100644
index 0000000..affdb53
--- /dev/null
+++ b/commands/users.py
@@ -0,0 +1,91 @@
+# 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 collections import deque
+
+from strings import USER_NOT_PROVIDED, USER_ADDED, USER_REMOVED, EXPECTED_ONE_USER
+from utils import context_init
+
+from rich import inspect
+
+
+async def add_users(
+ 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["users"])
+
+
+async def list_users(
+ update: Update,
+ context: ContextTypes.DEFAULT_TYPE
+) -> None:
+ context_init(context)
+
+ await update.message.reply_text(context.chat_data["users"])
+
+
+async def remove_users(
+ 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["users"])
+
+
+async def chooser_user(
+ 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)
+
+ if len(context.args) > 1:
+ await update.message.reply_text(EXPECTED_ONE_USER)
+ raise error.TelegramError(EXPECTED_ONE_USER)
+
+ chooser = context.args[0]
+ users = deque(context.chat_data["users"])
+
+ chooser_index = users.index(chooser)
+ users.rotate(-chooser_index)
+
+ context.chat_data["users"] = list(users)
+
+ await update.message.reply_text(context.chat_data)
diff --git a/main.py b/main.py
index 5ea81d3..7ca8b59 100644
--- a/main.py
+++ b/main.py
@@ -9,18 +9,16 @@
# with this software. If not, see:
# <http://creativecommons.org/publicdomain/zero/1.0/>
-from telegram import Update, error
+from telegram import Update
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 strings import INVALID_COMMAND
from persistence import Persistence
+import commands
load_dotenv()
@@ -31,72 +29,6 @@ logging.basicConfig(
)
-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) <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/>
-
- ''')
-
-
-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,
@@ -104,15 +36,16 @@ async def unknown(update: Update, context: ContextTypes.DEFAULT_TYPE):
)
-if __name__ == "__main__":
+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(CommandHandler("about", commands.about))
+ app.add_handler(CommandHandler("add", commands.add_users))
+ app.add_handler(CommandHandler("list", commands.list_users))
+ app.add_handler(CommandHandler("remove", commands.remove_users))
+ app.add_handler(CommandHandler("chooser", commands.chooser_user))
app.add_handler(MessageHandler(filters.COMMAND, unknown))
diff --git a/strings.py b/strings.py
index c9cfb20..0a7efb9 100644
--- a/strings.py
+++ b/strings.py
@@ -11,5 +11,6 @@
INVALID_COMMAND = "Invalid command. Available commands: /add"
USER_NOT_PROVIDED = "User(s) is not provided"
+EXPECTED_ONE_USER = "Expected only one user"
USER_ADDED = "User {user} has been added"
USER_REMOVED = "User {user} has been removed"