Выполнение общего кода для каждой команды pyTelegramBotAPI

есть телеграм-бот с кучей команд.

import telebot

mytoken=...
adminchat_id=...

bot = telebot.TeleBot(mytoken)

@bot.message_handler(commands = ['command1', 'command2'])
def func1(message):
    ....

@bot.message_handler(commands = ['command3', 'command4'])
def func2(message):
    ....

@bot.message_handler(commands = ['command99', 'command100'])
def func50(message):
    ....

Понадобилось переправлять все запросы пользователей боту по любой команде определенному пользователю. Добавил функцию

def resend_message(msg):
    bot.send_message(adminchat_id, str(msg.from_user.username)+ ' ' + str(msg.from_user.first_name) + ' ' + str(msg.from_user.last_name) + '\n' + msg.text)

и прописал ее вызов (resend_message(message))в начало каждой func1 ... func50. Но может можно выполнить общий код для всех команд одной строчкой, не прописывая в каждую функцию?


Ответы (2 шт):

Автор решения: RottenRat

Во-первых, скажу, что msg.from_user.username и (по-моему) msg.from_user.last_name может быть None, так что рекомендую сделать проверку на это, иначе бот иногда может выдавать ошибки

Во-вторых, если вы хотите общую функцию для всех функций, то могли бы все вписать в одну функцию:

@bot.message_handler()
def func_with_resend_message():
    resend_message(message)
    
    if message.text.lstrip('/').lower() == 'command1':
     return command1func(message)
    if message.text.lstrip('/').lower() == 'command2':
     return command2func(message)

и так далее

Либо же можно воспользоваться предложенным мною вариантом, но сделать это более интересно, взяв один из ответов в https://stackoverflow.com/questions/9168340/using-a-dictionary-to-select-function-to-execute

→ Ссылка
Автор решения: noobofthenoobs

Решение найдено, достаточно было почитать документацию)

telebot.apihelper.ENABLE_MIDDLEWARE = True

...

@bot.middleware_handler(update_types=['message'])
def modify_message(bot_instance, message):
    resend_message(message)

...

→ Ссылка