from telebot import TeleBot
from telebot.handler_backends import BaseMiddleware

bot = TeleBot("TOKEN", use_class_middlewares=True)  # set use_class_middlewares to True!
# otherwise, class-based middlewares won't execute.

# You can use this classes for cancelling update or skipping handler:
# from telebot.handler_backends import CancelUpdate, SkipHandler


class Middleware(BaseMiddleware):
    def __init__(self):
        self.update_types = ["message"]

    def pre_process(self, message, data):
        data["foo"] = "Hello"  # just for example
        # we edited the data. now, this data is passed to handler.
        # return SkipHandler() -> this will skip handler
        # return CancelUpdate() -> this will cancel update

    def post_process(self, message, data, exception=None):
        print(data["foo"])
        if exception:  # check for exception
            print(exception)


@bot.message_handler(commands=["start"])
def start(
    message, data: dict
):  # you don't have to put data parameter in handler if you don't need it.
    bot.send_message(message.chat.id, data["foo"])
    data["foo"] = (
        "Processed"  # we changed value of data.. this data is now passed to post_process.
    )


# Setup middleware
bot.setup_middleware(Middleware())

bot.infinity_polling()
