Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Markup submodule support #26

Closed
SKY-ALIN opened this issue Sep 25, 2022 · 1 comment · Fixed by #27
Closed

Markup submodule support #26

SKY-ALIN opened this issue Sep 25, 2022 · 1 comment · Fixed by #27

Comments

@SKY-ALIN
Copy link

Hello! I want to table a proposal to add a special submodule to generate Telegram-specific markup easily.

Motivation

A common markdown format that every programmer uses is really simple and doesn’t require special utils for that, but MarkdownV2 and HTML which let include spoiler, strikethrough and other telegram innovations are different. For example, MarkdownV2 also requires to escape 18 characters, and if it’s not, reject the request. This may make the task of designing markup generation for bots that include business logic complicated enough and I suppose it’s better to have a ready-made out-of-the-box solution for this.

Implementation suggestion

General explanation

I have recently worked on a related challenge and I’m writing this to propose to re-use my solution. It’s the telegram-text module. The general structure in the context of the origamibot module I propose to implement is the following:

  • Add telegram-text as a dependency (maybe even optional)
  • Add support for message objects rendering depending on format mode (Markdown / MarkdownV2 / HTML) inside the message sending function
  • Add imports into the origamibot module core to import styles and other needed classes as from origamibot import .... Or it’s quite pretty to add a separated file (text.py or markup.py for example) to import as from origamibot.text import ...

Why telegram-text module?

  • Include all rules for all markup modes
  • Almost entirely covered by tests
  • Fully documented
  • Open to contribute
  • Has a few presets and is easily expandable to add new

Example of the module:

from telegram_text import Bold, Italic, Underline

text = Underline(Bold("Bold") + "and" + Italic("italic") + "with underline.")

Usage example in the origamibot context

from origamibot import OrigamiBot as Bot
from origamibot.listener import Listener
from origamibot.text import Spoiler, InlineCode, PlainText

TOKEN: str


class BotsCommands:
    def __init__(self, bot: Bot):
        self.bot = bot

    def echo(self, message, value: str):
        self.bot.send_message(message.chat.id, Spoiler(value))  # Spoiler text


class MessageListener(Listener):
    def __init__(self, bot: Bot):
        self.bot = bot

    def on_command_failure(self, message, err=None):
        if err is None:
            self.bot.send_message(message.chat.id, 'Command failed to bind arguments!')  # A std str object
        else:
            self.bot.send_message(message.chat.id, PlainText('Error in command:') + InlineCode(err))  # Combined plain and code text


if __name__ == '__main__':
    bot = Bot(TOKEN)

    bot.add_listener(MessageListener(bot))
    bot.add_commands(BotsCommands(bot))
    bot.start()

    while True:
        pass
@SKY-ALIN
Copy link
Author

Cool! 😎👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant