Здесь много неправильно, и не странно, что это не работает.
На первом уровне вложенности основной код, который должен делать 3 вещи:
1. Импортировать модули.
2. Создавать объект класса TeleBot.
3. Вызывать от него polling.
Что делает polling? Это цикл, который дёргает у Bot API метод
getUpdates и получает время от времени новые обновления от Telegram. Для каждого он вызывает обработчики (handler). По умолчанию нет ни одного handler, и простейший бот без них не делает ничего - только скачивает и сразу выбрасывает получаемые сообщения.
Далее надо сделать обработчики. Они представляют из себя обычные функции. Например, обработчик сообщения принимает объект класса Message, в котором все данные по сообщению: отправитель, текст, время отправки, id чата итд.
Чтобы бот знал, что вот эта конкретная функция является обработчиком такого-то события с такими-то условиями, надо использовать декораторы. Например:
@bot.message_handler(commands=['start','menu'])
def start_message(message):
# в этом обработчике мы можем обработать команду /start или /menu,
# при этом можно брать из message данные о сообщении:
# message.text - текст
# message.from_user - объект класса User с данными отправителя
# message.chat - объект класса Chat с данными о чате (группа или приват)
... тут нужные действия ...
Использовать декоратор без @ и последующего описания функции бессмысленно - он просто ничего не будет делать (потому что декоратор - это специально устроенный класс, вызов bot.message_handler создаёт экземпляр этого класса, от которого потом вызывается специальный метод, а тут этого не происходит).
Вызывать на первом уровне вложенности bot.send_message таки возможно, но... но тут в него передаётся, например, message.chat.id - а что такое message? Этой переменной в скрипте нет. И откуда бы она взялась, если сообщение получается внутри вызова bot.polling и должно передаваться обработчику, который нужно было бы оформить как функцию с декоратором? В коде нет ни одного такого. Да и переменная message будет актуальна только внутри этого обработчика, снаружи функции она не будет доступна.
В общем, это никак не может работать.
Плохая идея начинать изучения языка с ботов, области, в которой уже нужно обладать определённым уровнем познаний. Начинать имеет смысл с азов. Делать сначала простейшие задания (вида "попросить пользователя ввести два числа и вывести их сумму"), освоить циклы и функции, работу с файлами и строками, ну и всё такое. Затем, вернувшись к теме ботов, уже будешь делать всё не вслепую, а хоть как-то понимая происходящее.
Представь себе, что ты бы купил автомобиль, и не смог бы понять, как его завести. Начал бы тыкать куда попало. Например, нашёл нипель на колесе - подёргал. Дворник крутится, если приложить усилия (ой, сломал, теперь не будет ездить?). Сзади труба торчил - к ней надо водопроводный шланг подвести? Вот примерно так сейчас ты делаешь бота. Даже если тебе подскажут, что изменить, ты всё равно не научишься программировать и не будешь понимать, что сделал.