From d56f2bc39145334779321eac6dbdcd843e3cadc8 Mon Sep 17 00:00:00 2001
From: bral <54455457+bralbral@users.noreply.github.com>
Date: Sat, 23 Sep 2023 21:29:46 +0400
Subject: [PATCH] customized messages && errors; updated readme.md (#1)
---
README.MD | 2 ++
deploy/example.config.yaml | 28 ++++++++++++++++++++++++-
src/__main__.py | 7 ++++++-
src/bot/handlers/admins/router.py | 12 +++++++----
src/bot/handlers/misc.py | 8 +++++---
src/bot/handlers/users.py | 15 +++++++++++---
src/bot/utils/setup_dispatcher.py | 8 +++++++-
src/config/__init__.py | 5 +++--
src/config/models.py | 34 +++++++++++++++++++++++++++++++
9 files changed, 104 insertions(+), 15 deletions(-)
diff --git a/README.MD b/README.MD
index bb13c39..3036325 100644
--- a/README.MD
+++ b/README.MD
@@ -24,6 +24,8 @@ Admin can answer to message by reply. The answer will be sent to the person who
If the transfer is successful, the administrator will be notified.
+You can [customize the bot's responses](./deploy/example.config.yaml#12), or use default values.
+
## Deploy
### Install from source
diff --git a/deploy/example.config.yaml b/deploy/example.config.yaml
index a73e2d2..20cedec 100644
--- a/deploy/example.config.yaml
+++ b/deploy/example.config.yaml
@@ -3,4 +3,30 @@ bot:
token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# chat id for redirect messages
-chat_id: -100XXXXXXXXXXXXX
\ No newline at end of file
+chat_id: -100XXXXXXXXXXXXX
+
+# Fill variables below as you want, or use default values.
+# You can use HTML tags provided by the sulguk package.
+# https://github.com/Tishka17/sulguk#readme
+
+#messages:
+# notify_user_about_success_deliver: ✅ Please wait for response.
+# help_message: |
+#
+# 👋 Hello!
+#
+#
+# I can redirect to recipient text, audios, voice messages, images, files to recipient.
+#
+#
+#
+# Just send your message and wait for a response!
+#
+# notify_admin_about_success_answer: ✅ Answered.
+#
+#errors:
+# unsupported_type: ❌ Unsupported message type.
Please check /help command.
+# too_long_message_text: ❌ Too long message text.
+# too_long_message_caption: ❌ Too long message caption.
+# copy_message: ❌ Error during copying
+# extract_user_id: ❌ Error during extract_id
diff --git a/src/__main__.py b/src/__main__.py
index d7d06cf..a9248f1 100755
--- a/src/__main__.py
+++ b/src/__main__.py
@@ -21,7 +21,12 @@
async def main() -> None:
config: Config = load_config(config_path=os.path.join(ROOT_DIR, "config.yaml"))
- dp: Dispatcher = setup_dispatcher(logger=logger, chat_id=config.chat_id)
+ dp: Dispatcher = setup_dispatcher(
+ logger=logger,
+ chat_id=config.chat_id,
+ messages=config.messages,
+ errors=config.errors,
+ )
bot: Bot = await setup_bot(config=config.bot)
await logger.ainfo("Starting bot")
diff --git a/src/bot/handlers/admins/router.py b/src/bot/handlers/admins/router.py
index a5574dd..e9512cb 100644
--- a/src/bot/handlers/admins/router.py
+++ b/src/bot/handlers/admins/router.py
@@ -6,26 +6,30 @@
from .utils import extract_id
from src.bot.filters import FilterByChatID
+from src.config import Errors
+from src.config import Messages
router = Router(name="admins")
@router.message(FilterByChatID(), F.reply_to_message) # type: ignore
-async def reply_to_user(message: Message, bot: Bot, **kwargs):
+async def reply_to_user(
+ message: Message, bot: Bot, messages: Messages, errors: Errors, **kwargs
+):
try:
user_id = extract_id(message.reply_to_message)
except ValueError as ex:
- await message.reply(f"❌ Error during extract_id: {str(ex)}")
+ await message.reply(text=f"{errors.extract_user_id} {str(ex)}")
return
try:
await bot.copy_message(
from_chat_id=message.chat.id, chat_id=user_id, message_id=message.message_id
)
- await message.reply(text="✅ Answered.")
+ await message.reply(text=messages.notify_admin_about_success_answer)
except TelegramAPIError as ex:
- await message.reply(f"❌ Error during copying: {str(ex)}")
+ await message.reply(text=f"{errors.copy_message} {str(ex)}")
__all__ = ["router"]
diff --git a/src/bot/handlers/misc.py b/src/bot/handlers/misc.py
index b2fbe84..2946bd1 100644
--- a/src/bot/handlers/misc.py
+++ b/src/bot/handlers/misc.py
@@ -4,7 +4,7 @@
from aiogram.types import Message
from sulguk import SULGUK_PARSE_MODE
-from src.constants import START_MESSAGE
+from src.config import Messages
logger = structlog.stdlib.get_logger()
router = Router(name="misc")
@@ -13,9 +13,11 @@
@router.message(
Command("start", "help"),
) # type: ignore
-async def start_help_handler(message: Message, **kwargs) -> None:
+async def start_help_handler(message: Message, messages: Messages, **kwargs) -> None:
await message.answer(
- START_MESSAGE, disable_web_page_preview=True, parse_mode=SULGUK_PARSE_MODE
+ messages.help_message,
+ disable_web_page_preview=True,
+ parse_mode=SULGUK_PARSE_MODE,
)
diff --git a/src/bot/handlers/users.py b/src/bot/handlers/users.py
index 802e24d..b19f6d7 100644
--- a/src/bot/handlers/users.py
+++ b/src/bot/handlers/users.py
@@ -5,6 +5,9 @@
from aiogram.types import Message
from sulguk import SULGUK_PARSE_MODE
+from src.config import Errors
+from src.config import Messages
+
router = Router(name="users")
@@ -14,6 +17,8 @@ async def handle_user_message(
message: Message,
bot: Bot,
chat_id: int,
+ messages: Messages,
+ errors: Errors,
**kwargs,
):
if message.content_type not in (
@@ -26,7 +31,7 @@ async def handle_user_message(
ContentType.VOICE,
):
await message.reply(
- text="❌ Unsupported message type.
Please check /help command.",
+ text=errors.unsupported_type,
parse_mode=SULGUK_PARSE_MODE,
)
@@ -37,7 +42,7 @@ async def handle_user_message(
if message.text:
if len(message.text) > 4000:
- await message.reply("❌ Too long message text")
+ await message.reply(text=errors.too_long_message_text)
return
message_text = f"
#id{message.from_user.id}
" + message.html_text
@@ -47,6 +52,10 @@ async def handle_user_message(
)
else:
+ if len(message.caption) > 1000:
+ await message.reply(text=errors.too_long_message_caption)
+ return
+
caption = message.caption if message.caption else ""
caption += f"
#id{message.from_user.id}
"
@@ -58,7 +67,7 @@ async def handle_user_message(
parse_mode=SULGUK_PARSE_MODE,
)
- await message.reply(text="✅ Please wait for response.")
+ await message.reply(text=messages.notify_user_about_success_deliver)
return
diff --git a/src/bot/utils/setup_dispatcher.py b/src/bot/utils/setup_dispatcher.py
index c1cfe9f..68b44b5 100644
--- a/src/bot/utils/setup_dispatcher.py
+++ b/src/bot/utils/setup_dispatcher.py
@@ -5,13 +5,19 @@
from src.bot.handlers import register_handlers
from src.bot.middlewares import LoggerMiddleware
+from src.config import Errors
+from src.config import Messages
-def setup_dispatcher(logger: BoundLogger, chat_id: int) -> Dispatcher:
+def setup_dispatcher(
+ logger: BoundLogger, chat_id: int, messages: Messages, errors: Errors
+) -> Dispatcher:
dp: Dispatcher = Dispatcher(
storage=MemoryStorage(),
logger=logger,
chat_id=chat_id,
+ messages=messages,
+ errors=errors,
events_isolation=SimpleEventIsolation(),
)
dp.message.middleware(LoggerMiddleware(logger=logger))
diff --git a/src/config/__init__.py b/src/config/__init__.py
index 91bb69c..a8573a3 100644
--- a/src/config/__init__.py
+++ b/src/config/__init__.py
@@ -1,6 +1,7 @@
from .models import BotConfig
from .models import Config
from .utils import load_config
+from src.config.models import Errors
+from src.config.models import Messages
-
-__all__ = ["BotConfig", "Config", "load_config"]
+__all__ = ["BotConfig", "Config", "Errors", "Messages", "load_config"]
diff --git a/src/config/models.py b/src/config/models.py
index becc2dc..b8ca2a7 100644
--- a/src/config/models.py
+++ b/src/config/models.py
@@ -1,3 +1,4 @@
+from pydantic import Field
from pydantic import SecretStr
from pydantic_settings import BaseSettings
@@ -10,6 +11,37 @@ class BotConfig(BaseSettings):
token: SecretStr
+class Messages(BaseSettings):
+ notify_user_about_success_deliver: str = Field(
+ default="✅ Please wait for response."
+ )
+ help_message: str = Field(
+ default="""
+
+ 👋 Hello!
+
+
+ I can redirect to recipient text, audios, voice messages, images, files to recipient.
+
+
+
+ Just send your message and wait for a response!
+
+ """
+ )
+ notify_admin_about_success_answer: str = Field(default="✅ Answered.")
+
+
+class Errors(BaseSettings):
+ unsupported_type: str = Field(
+ default="❌ Unsupported message type.
Please check /help command."
+ )
+ too_long_message_text: str = Field(default="❌ Too long message text.")
+ too_long_message_caption: str = Field(default="❌ Too long message caption.")
+ copy_message: str = Field(default="❌ Error during copying")
+ extract_user_id: str = Field(default="❌ Error during extract_id")
+
+
class Config(BaseSettings):
"""
All in one config
@@ -17,6 +49,8 @@ class Config(BaseSettings):
bot: BotConfig
chat_id: int
+ messages: Messages = Messages()
+ errors: Errors = Errors()
__all__ = ["BotConfig", "Config"]