├── .gitattributes ├── README.md ├── custom_answer.py ├── database.py └── main.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # YourBunnyWroteChatBot 2 | YourBunnyWrote - телеграм чат бот знакомств для подростков на Python 3 | 4 | Для реализации работы с telegram api используется библиотека aiogram, а из субд используется sqlite 5 | 6 | Из функционала : 7 | - создание анкеты 8 | - поиск по анкетам 9 | - редактирование анкеты 10 | - рейтинг анкет 11 | - админка 12 | - ранговая система 13 | - привязка инстаграмма 14 | - жалобы 15 | - откакт действий 16 | 17 | Архитектура проекта - Основная логика хранится в main.py, настройки в config.py. В database.py, в классе dbworker хранится работа с бд,а в custom_answer.py - массивы с кастомными ответами юзеров(нужно в будущем переписать на vedis) 18 | 19 | Проект начат - 30 июня 20 | 21 | Закончен - 28 июля 22 | 23 | # Примеры пользования 24 | 25 | ![Screenshot](https://sun1.beltelecom-by-minsk.userapi.com/ZJF0w-280rrskh5MgPO314LyW_t2sx3k52aoFA/ERbZDHalR3g.jpg) 26 | 27 | ![Screenshot](https://sun1.beltelecom-by-minsk.userapi.com/XQ01duOl-tNDtTmg_mzUyb6mNoxTw5_VY6ylhw/IHcIF8hQO_M.jpg) 28 | -------------------------------------------------------------------------------- /custom_answer.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | 4 | repeat_list = ['Повторите ещё раз!','Повторите ещё раз','Репит плиз🥺','Не работает,попробуй ещё раз','Повторение - мать учения\nСоветую повторить'] 5 | 6 | joke_potato_list = ['Да это рофл был бро...\n\nМы все знаем что есть только 2 гендера - трансформер и водка)','шутка бро,ист джоук :)'] 7 | 8 | else_list = ['Я не знаю, что с этим делать 😲\n\nЯ просто напомню, что есть команда /start =)','ненаю что с этим делать🥺\n\nЯ просто напомню, что есть команда /start =)'] 9 | 10 | aim_rofl_list = ['Чё ты по мне тыкаешь я сам по тебе ща тыкну🤬'] 11 | 12 | ban_symvols = [','] 13 | 14 | available_symvols_age = ['1','2','3','4','5','6','7','8','9','0'] 15 | 16 | def random_reapeat_list(): 17 | return random.choice(repeat_list) 18 | def too_long(): 19 | return 'Слишком много текста!' 20 | def joke_first(): 21 | return random.choice(joke_potato_list) 22 | def else_list(): 23 | return random.choice(else_list) -------------------------------------------------------------------------------- /database.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | 4 | class dbworker: 5 | def __init__(self,database_file): 6 | self.connection = sqlite3.connect(database_file) 7 | self.cursor = self.connection.cursor() 8 | def user_exists(self, user_id): 9 | '''Проверка есть ли юзер в бд''' 10 | with self.connection: 11 | result = self.cursor.execute('SELECT * FROM `users` WHERE `telegram_id` = ?', (user_id,)).fetchall() 12 | return bool(len(result)) 13 | def add_user(self,telegram_username,telegram_id,full_name): 14 | '''Добавляем нового юзера''' 15 | with self.connection: 16 | return self.cursor.execute("INSERT INTO `users` (`telegram_username`, `telegram_id`,`full_name`) VALUES(?,?,?)", (telegram_username,telegram_id,full_name)) 17 | def create_profile(self,telegram_id,telegram_username,name,description,city,photo,sex,age,social_link): 18 | '''Создаём анкету''' 19 | with self.connection: 20 | return self.cursor.execute("INSERT INTO `profile_list` (`telegram_id`,`telegram_username`,`name`,`description`,`city`,`photo`,`sex`,`age`,`social_link`) VALUES(?,?,?,?,?,?,?,?,?)", (telegram_id,telegram_username,name,description,city,photo,sex,age,social_link)) 21 | def profile_exists(self,user_id): 22 | '''Проверка есть ли анкета в бд''' 23 | with self.connection: 24 | result = self.cursor.execute('SELECT * FROM `profile_list` WHERE `telegram_id` = ?', (user_id,)).fetchall() 25 | return bool(len(result)) 26 | def delete_profile(self,user_id): 27 | '''Удаление анкеты''' 28 | with self.connection: 29 | return self.cursor.execute("DELETE FROM `profile_list` WHERE `telegram_id` = ?",(user_id,)) 30 | def all_profile(self,user_id): 31 | '''поиск по анкетам''' 32 | with self.connection: 33 | return self.cursor.execute("SELECT * FROM `profile_list` WHERE `telegram_id` = ?",(user_id,)).fetchall() 34 | def edit_description(self,description,user_id): 35 | '''изменение описания''' 36 | with self.connection: 37 | return self.cursor.execute('UPDATE `profile_list` SET `description` = ? WHERE `telegram_id` = ?',(description,user_id)) 38 | def edit_age(self,age,user_id): 39 | '''изменение возвраста''' 40 | with self.connection: 41 | return self.cursor.execute('UPDATE `profile_list` SET `age` = ? WHERE `telegram_id` = ?',(age,user_id)) 42 | def search_profile(self,city,age,sex): 43 | '''поиск хаты''' 44 | try: 45 | if str(sex) == 'мужчина': 46 | sex_search = 'женщина' 47 | else: 48 | sex_search = 'мужчина' 49 | with self.connection: 50 | return self.cursor.execute("SELECT `telegram_id` FROM `profile_list` WHERE `city` = ? AND `sex` = ? ORDER BY `age` DESC",(city,sex_search)).fetchall() 51 | except Exception as e: 52 | print(e) 53 | def get_info(self,user_id): 54 | '''получение ифнормации по профилю''' 55 | with self.connection: 56 | return self.cursor.execute("SELECT * FROM `profile_list` WHERE `telegram_id` = ?",(user_id,)).fetchone() 57 | def search_profile_status(self,user_id): 58 | '''возвращение статуса''' 59 | with self.connection: 60 | return self.cursor.execute("SELECT `search_id` FROM `users` WHERE `telegram_id` = ?",(user_id,)).fetchone() 61 | def edit_profile_status(self,user_id,num): 62 | '''изменение статуса''' 63 | with self.connection: 64 | return self.cursor.execute('UPDATE `users` SET `search_id` = ? WHERE `telegram_id` = ?',(str(num + 1),user_id)) 65 | def edit_zero_profile_status(self,user_id): 66 | '''изменение статуса на 0 когда анкеты заканчиваются''' 67 | with self.connection: 68 | return self.cursor.execute('UPDATE `users` SET `search_id` = 0 WHERE `telegram_id` = ?',(user_id,)) 69 | def set_city_search(self,city,user_id): 70 | '''задования города для поиска''' 71 | with self.connection: 72 | return self.cursor.execute('UPDATE `users` SET `city_search` = ? WHERE `telegram_id` = ?',(city,user_id)) 73 | def get_info_user(self,user_id): 74 | '''получение информации по юзеру''' 75 | with self.connection: 76 | return self.cursor.execute("SELECT * FROM `users` WHERE `telegram_id` = ?",(user_id,)).fetchone() 77 | def check_rating(self,user_id): 78 | '''чек по рейтингу''' 79 | with self.connection: 80 | return self.cursor.execute("SELECT `rating` FROM `profile_list` WHERE `telegram_id` = ?",(user_id,)).fetchone() 81 | def up_rating(self,count,user_id): 82 | '''добавление по рейтингу''' 83 | with self.connection: 84 | return self.cursor.execute('UPDATE `profile_list` SET `rating` = ? WHERE `telegram_id` = ?',(count + 1,user_id)) 85 | def top_rating(self): 86 | '''вывод топа по рейтингу''' 87 | with self.connection: 88 | return self.cursor.execute('SELECT `telegram_id` FROM `profile_list` ORDER BY `rating` DESC LIMIT 5').fetchall() 89 | def count_user(self): 90 | '''вывод кол-ва юзеров''' 91 | with self.connection: 92 | return self.cursor.execute('SELECT COUNT(*) FROM `users`').fetchone() 93 | def report_exists(self,user_id,recipent): 94 | '''Проверка есть ли репорт в бд''' 95 | with self.connection: 96 | result = self.cursor.execute('SELECT * FROM `reports` WHERE `send` = ? AND `recipient` = ?', (user_id,recipent)).fetchall() 97 | return bool(len(result)) 98 | def throw_report(self,user_id,recipent): 99 | '''отправка репорта''' 100 | with self.connection: 101 | return self.cursor.execute("INSERT INTO `reports` (`send`, `recipient`) VALUES(?,?)", (user_id,recipent)) 102 | def backup(self,name,age,city,description): 103 | '''откат действий''' 104 | with self.connection: 105 | return self.cursor.execute('SELECT `telegram_id` FROM `profile_list` WHERE `name` = ? AND `age` = ? AND `city` = ? AND `description` = ?', (name,age,city,description)).fetchall() 106 | def city_search_exists(self,user_id): 107 | '''есть ли city search у юзера''' 108 | with self.connection: 109 | result = self.cursor.execute('SELECT `city_search` FROM `users` WHERE `telegram_id` = ?', (user_id,)).fetchone() 110 | return result 111 | def add_like(self,sender,recipent): 112 | '''добавление лайка в таблицу''' 113 | with self.connection: 114 | return self.cursor.execute('INSERT INTO `likes` (`sender`,`recipient`) VALUES(?,?)', (sender,recipent)) 115 | def add_like_exists(self,sender,recipient): 116 | with self.connection: 117 | result = self.cursor.execute('SELECT * FROM `likes` WHERE `sender` = ? AND `recipient` = ?', (sender,recipient)).fetchall() 118 | return bool(len(result)) 119 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import logging 3 | import datetime 4 | from datetime import timedelta 5 | import random 6 | 7 | 8 | #aiogram и всё утилиты для коректной работы с Telegram API 9 | from aiogram import Bot, types 10 | from aiogram.utils import executor 11 | from aiogram.utils.emoji import emojize 12 | from aiogram.dispatcher import Dispatcher 13 | from aiogram.types.message import ContentType 14 | from aiogram.utils.markdown import text, bold, italic, code, pre 15 | from aiogram.types import ParseMode, InputMediaPhoto, InputMediaVideo, ChatActions 16 | from aiogram.types import ReplyKeyboardRemove,ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton 17 | from aiogram.dispatcher import FSMContext 18 | from aiogram.dispatcher.filters.state import State, StatesGroup 19 | from aiogram.contrib.fsm_storage.memory import MemoryStorage 20 | 21 | #конфиг с настройками 22 | import config 23 | #кастомные ответы 24 | import custom_answer as cus_ans 25 | from database import dbworker 26 | import os.path 27 | 28 | 29 | #задаём логи 30 | logging.basicConfig(level=logging.INFO) 31 | 32 | 33 | #инициализируем бота 34 | bot = Bot(token=config.TOKEN) 35 | dp = Dispatcher(bot,storage=MemoryStorage()) 36 | 37 | #инициализируем базу данных 38 | db = dbworker('database.db') 39 | 40 | def aim_stat(): 41 | button_aim = f'До добавления стикеров осталось {100 - db.count_user()[0]} пользователей' 42 | return button_aim 43 | 44 | #хендлер команды /start 45 | @dp.message_handler(commands=['start'],state='*') 46 | async def start(message : types.Message): 47 | #кнопки для волшебного входа 48 | button_start = KeyboardButton('Зайти в волшебный мир Your Bunny врота🌀') 49 | 50 | magic_start = ReplyKeyboardMarkup(one_time_keyboard=True) 51 | 52 | magic_start.add(button_start) 53 | await message.answer('Привет👋\n\nЭто Your Bunny Wrote бот и я советую перечитать названия🤠\nА ещё я советую задержаться у нас подольше, у нас тут много интересного\n\nYour Bunny Wrote - место для знакомств : \n - скейтеров🛹\n - хипстеров🦹‍♀️ \n и инопланетян👽',reply_markup=magic_start) 54 | await message.answer_sticker('CAADAgADZgkAAnlc4gmfCor5YbYYRAI') 55 | if(not db.user_exists(message.from_user.id)): 56 | #если юзера нет в базе добавляем его 57 | db.add_user(message.from_user.username,message.from_user.id,message.from_user.full_name) 58 | await bot.send_message(-1001406772763,f'Новый пользователь!\nID - {str(message.from_user.id)}\nusername - {str(message.from_user.username)}') 59 | #хендлер для команды Зайти в волшебный мир 60 | 61 | @dp.message_handler(lambda message: message.text == 'Зайти в волшебный мир Your Bunny врота🌀' or message.text == '/magic_start',state='*') 62 | async def magic_start(message : types.Message): 63 | '''Функция для меню самого бота''' 64 | await send_log(message) 65 | #кнопки меню 66 | button_search = KeyboardButton('Найти человечка🔍') 67 | 68 | button_create_profile = KeyboardButton('Создать анкету📌') 69 | 70 | button_edit_profile = KeyboardButton('Редактировать анкету📝') 71 | 72 | button_remove_profile = KeyboardButton('Удалить🗑') 73 | 74 | button_rating_profile = KeyboardButton('Рейтинг анкет⭐️') 75 | 76 | button_admin = KeyboardButton('Админка⚙️') 77 | 78 | button_aim = KeyboardButton(f'До добавления стикеров осталось {100 - db.count_user()[0]} пользователей') 79 | 80 | menu = ReplyKeyboardMarkup() 81 | 82 | if(not db.profile_exists(message.from_user.id)): 83 | menu.add(button_search,button_create_profile,button_rating_profile) 84 | elif(db.profile_exists(message.from_user.id)) : 85 | if int(db.get_info(str(message.from_user.id))[10]) < 51: 86 | button_rank = 'инопланетянин обычный👽' 87 | elif int(db.get_info(str(message.from_user.id))[10]) < 101: 88 | button_rank = 'кик флип🛹' 89 | elif int(db.get_info(str(message.from_user.id))[10]) < 151: 90 | button_rank = 'пожилой человек👨' 91 | elif int(db.get_info(str(message.from_user.id))[10]) < 201: 92 | button_rank = 'лучший в мире за работой👀' 93 | elif int(db.get_info(str(message.from_user.id))[10]) < 301: 94 | button_rank = 'гений мысли отец русской демократии🧠' 95 | button_ranked = KeyboardButton(f'Твой ранг - {button_rank}') 96 | menu.add(button_search,button_edit_profile,button_remove_profile,button_rating_profile,button_ranked) 97 | if message.from_user.id in config.ADMIN_LIST: 98 | menu.add(button_admin) 99 | menu.add(button_aim) 100 | await message.answer('Привет-привет, это центральный компьютер чат бота🤖\n\nТут ты можешь управлять всеми этими штуками что внизу⚙️\n\nУ нас также есть ранговая система - получай очки с помощью активностей в чат боте,прокачивай ранги и становись самым свежим в этой шалав... в городе да😎\n\n200 - 300 — гений мысли отец русской демократии🧠\n\n150 - 200 — лучший в мире за работой👀\n\n100 - 150 — пожилой человек👨‍\n\n50 - 100 — кик флип🛹\n\n0 - 50 — инопланетянин обычный👽',reply_markup=menu) 101 | 102 | 103 | #хендлер для создания анкеты 104 | 105 | 106 | class CreateProfile(StatesGroup): 107 | name = State() 108 | description = State() 109 | city = State() 110 | photo = State() 111 | sex = State() 112 | age = State() 113 | social_link = State() 114 | #хендлер старта для создания анкеты 115 | @dp.message_handler(lambda message: message.text == 'Создать анкету📌',state='*') 116 | async def create_profile(message : types.Message): 117 | #кнопки отмены 118 | button_exit = KeyboardButton('Выйти❌') 119 | 120 | menu_exit = ReplyKeyboardMarkup() 121 | 122 | menu_exit.add(button_exit) 123 | 124 | if message.from_user.username != None: 125 | if(not db.profile_exists(message.from_user.id)): 126 | await message.answer("Для того что бы создать твою so style анкету нужно заполнить несколько пунктов\nДавайте начнём с твоего имя, как мне тебя называть?😉",reply_markup=menu_exit) 127 | await CreateProfile.name.set() 128 | elif(db.profile_exists(message.from_user.id)) : 129 | await message.answer('У тебя уже есть активная анкета\n\n') 130 | else: 131 | await message.answer('‼️У вас не заполнен username в телеграм!\n\nПожалуйста сделайте это для коректного функционирования бота\nДля этого зайдите в настройки -> Edit Profile(Изменить профиль) и жмякайте add username\n\nТам вводите желаемый никнейм и вуаля') 132 | #хендлер для заполнения имя 133 | @dp.message_handler(state=CreateProfile.name) 134 | async def create_profile_name(message: types.Message, state: FSMContext): 135 | if str(message.text) == 'Выйти❌': 136 | await state.finish() 137 | await magic_start(message) 138 | return 139 | if len(str(message.text)) < 35 and (not str(message.text) in cus_ans.ban_symvols): 140 | await state.update_data(profile_name=message.text.lower()) 141 | await message.reply(message.text.title() + ' - п*здатое имя😉\nТеперь заполни описание своей личности что бы все поняли кто же ты : \n - инопланетянин👽\n - дурак🤡 \n - гигант мысли🧠 \n - отец русской демократии👪 \n\nбез этого никак прости :9') 142 | await CreateProfile.next() 143 | elif str(message.text) in cus_ans.ban_symvols: 144 | await message.answer('У тебя в сообщении запрещённые символы🤬🤬\nЗапятая к примеру') 145 | else: 146 | await message.answer(cus_ans.random_reapeat_list()) 147 | #прерывание функции 148 | return 149 | 150 | #хендлер для заполнение описания 151 | 152 | @dp.message_handler(state=CreateProfile.description) 153 | async def create_profile_description(message: types.Message, state: FSMContext): 154 | if str(message.text) == 'Выйти❌': 155 | await state.finish() 156 | await magic_start(message) 157 | return 158 | if len(message.text) < 35 and (not str(message.text) in cus_ans.ban_symvols): 159 | await state.update_data(profile_description=message.text) 160 | await message.answer('Неплохо,неплохо\n\nТеперь предлагаю заполнить город где вы собираетесь трепить🤪') 161 | await CreateProfile.next() 162 | elif str(message.text) in cus_ans.ban_symvols: 163 | await message.answer('У тебя в сообщении запрещённые символы🤬🤬\nЗапятая к примеру') 164 | else: 165 | await message.answer(cus_ans.random_reapeat_list()) 166 | #прерывание функции 167 | return 168 | #хендлер для заполнения города 169 | @dp.message_handler(state=CreateProfile.city) 170 | async def create_profile_city(message: types.Message, state: FSMContext): 171 | if str(message.text) == 'Выйти❌': 172 | await state.finish() 173 | await magic_start(message) 174 | return 175 | if len(message.text) < 35 and (not str(message.text) in cus_ans.ban_symvols): 176 | await state.update_data(profile_city=message.text.lower()) 177 | await message.answer('Прелестно, теперь добавим фотокарточку, что бы все знали какая ты красавица(хихи)🖼\n\nВажно отправлять фотографией, а не файлом!') 178 | await CreateProfile.next() 179 | elif str(message.text) in cus_ans.ban_symvols: 180 | await message.answer('У тебя в сообщении запрещённые символы🤬🤬\nЗапятая к примеру') 181 | else: 182 | await message.answer(cus_ans.random_reapeat_list()) 183 | #прерывание функции 184 | return 185 | #хендлер для заполнения фотографии 186 | @dp.message_handler(state=CreateProfile.photo,content_types=['photo']) 187 | async def create_profile_photo(message: types.Message, state: FSMContext): 188 | if str(message.text) == 'Выйти❌': 189 | await state.finish() 190 | await magic_start(message) 191 | 192 | #кнопки выбора пола 193 | button_male = KeyboardButton('Мужчина') 194 | 195 | button_wooman = KeyboardButton('Женщина') 196 | 197 | button_potato = KeyboardButton('Картошка🥔') 198 | 199 | sex_input = ReplyKeyboardMarkup(one_time_keyboard=True) 200 | sex_input.add(button_male,button_wooman,button_potato) 201 | 202 | await message.photo[-1].download('photo_user/' + str(message.from_user.id) + '.jpg') 203 | await message.answer('Пипец ты соска)\n\nОсталось совсем немного,укажи свой пол(не тот который под тобой:)',reply_markup=sex_input) 204 | await CreateProfile.next() 205 | #хендлер для заполнения пола 206 | @dp.message_handler(state=CreateProfile.sex) 207 | async def create_profile_sex(message: types.Message, state: FSMContext): 208 | if str(message.text) == 'Выйти❌': 209 | await state.finish() 210 | await magic_start(message) 211 | return 212 | if message.text == 'Мужчина' or message.text == 'Женщина': 213 | await state.update_data(profile_sex=message.text.lower()) 214 | await message.answer('Замечательно!\nОсталось совсем чуть-чуть\n\nДавай же узнаем твой возвраст, что бы не сидеть восьмёрку лет если что👮‍♂️ ') 215 | await CreateProfile.next() 216 | elif message.text == 'Картошка🥔': 217 | await message.answer(cus_ans.joke_first()) 218 | #прерывание функции 219 | return 220 | else: 221 | await message.answer(cus_ans.random_reapeat_list()) 222 | #прерывание функции 223 | return 224 | 225 | #хендлер для заполнения возвраста 226 | @dp.message_handler(state=CreateProfile.age) 227 | async def create_profile_age(message: types.Message, state: FSMContext): 228 | try: 229 | if str(message.text) == 'Выйти❌': 230 | await state.finish() 231 | await magic_start(message) 232 | return 233 | if int(message.text) < 6: 234 | await message.answer('ой🤭\nТы чёт маловат...') 235 | await message.answer(cus_ans.random_reapeat_list()) 236 | 237 | #прерывание функции 238 | return 239 | elif int(message.text) > 54: 240 | await message.answer('Пажилой человек👨‍') 241 | await message.answer(cus_ans.random_reapeat_list()) 242 | 243 | #прерывание функции 244 | return 245 | elif int(message.text) > 6 and int(message.text) < 54: 246 | await state.update_data(profile_age=message.text) 247 | #кнопки меню 248 | button_skip = KeyboardButton('Пропустить') 249 | 250 | skip_input = ReplyKeyboardMarkup(one_time_keyboard=True) 251 | skip_input.add(button_skip) 252 | await message.answer('За№бись!!\nПоследний шаг - указать ссылку на свой инстаграмм🤑\nЕсли нет желания - можно пропустить➡🔜',reply_markup=skip_input) 253 | await CreateProfile.next() 254 | else: 255 | await answer.message('Укажи правильный возраст, только цифры') 256 | return 257 | except: 258 | await message.answer(cus_ans.random_reapeat_list()) 259 | #прерывание функции 260 | return 261 | #хендлер для заполнения ссылки на социальную сеть 262 | @dp.message_handler(state=CreateProfile.social_link) 263 | async def create_profile_social_link(message: types.Message, state: FSMContext): 264 | try: 265 | if str(message.text) == 'Выйти❌': 266 | await state.finish() 267 | await magic_start(message) 268 | return 269 | if str(message.text) == 'Пропустить': 270 | await message.answer('Анкета успешно создана!') 271 | user_data = await state.get_data() 272 | db.create_profile(message.from_user.id,message.from_user.username,str(user_data['profile_name']),str(user_data['profile_description']),str(user_data['profile_city']),'photo/' + str(message.from_user.id) + '.jpg',str(user_data['profile_sex']),str(user_data['profile_age']),None) #self,telegram_id,telegram_username,name,description,city,photo,sex,age,social_link 273 | await state.finish() 274 | await magic_start(message) 275 | elif str(message.text).startswith('https://www.instagram.com/'): 276 | await state.update_data(profile_link=message.text) 277 | await message.answer('Анкета успешно создана!') 278 | user_data = await state.get_data() 279 | db.create_profile(message.from_user.id,message.from_user.username,str(user_data['profile_name']),str(user_data['profile_description']),str(user_data['profile_city']),'photo/' + str(message.from_user.id) + '.jpg',str(user_data['profile_sex']),str(user_data['profile_age']),str(user_data['profile_link'])) #self,telegram_id,telegram_username,name,description,city,photo,sex,age,social_link 280 | await state.finish() 281 | await magic_start(message) 282 | else : 283 | await message.answer('Ссылка корявая!!\n\nОна должна начинаться с https://www.instagram.com/\n\nК примеру - https://www.instagram.com/helloworldbastard/') 284 | 285 | return 286 | 287 | 288 | except: 289 | await message.answer(cus_ans.random_reapeat_list()) 290 | #прерывание функции 291 | return 292 | 293 | #хендлер для удаления анкеты 294 | @dp.message_handler(lambda message: message.text == 'Удалить🗑') 295 | async def delete_profile(message : types.Message): 296 | '''Функция для удаления анкеты''' 297 | await send_log(message) 298 | try: 299 | db.delete_profile(message.from_user.id) 300 | await message.answer('Анкета успешно удалена!') 301 | await magic_start(message) 302 | except: 303 | await message.answer(cus_ans.random_reapeat_list()) 304 | return 305 | 306 | #хендлер для редактирования анкеты 307 | @dp.message_handler(lambda message: message.text == 'Редактировать анкету📝') 308 | async def edit_profile(message : types.Message): 309 | '''Функция для меню редактирования анкеты''' 310 | await send_log(message) 311 | try: 312 | if(not db.profile_exists(message.from_user.id)): 313 | await message.answer('У тебя нет анкеты!') 314 | elif(db.profile_exists(message.from_user.id)) : 315 | photo = open('photo_user/' + str(message.from_user.id) + '.jpg','rb') 316 | #кнопки выбора пола 317 | button_again = KeyboardButton('Заполнить анкету заново🔄') 318 | 319 | button_edit_description = KeyboardButton('Изменить описание анкеты📝') 320 | 321 | button_edit_age = KeyboardButton('Изменить количество годиков👶') 322 | 323 | button_cancel = KeyboardButton('Выйти❌') 324 | 325 | edit_profile = ReplyKeyboardMarkup(one_time_keyboard=True) 326 | edit_profile.add(button_again,button_edit_description,button_edit_age,button_cancel) 327 | caption = 'Твоя анкета:\n\nИмя - ' + str(db.all_profile(str(message.from_user.id))[0][3]).title() + '\nОписание - ' + str(db.all_profile(str(message.from_user.id))[0][4]) + '\nМесто жительство🌎 - ' + str(db.all_profile(str(message.from_user.id))[0][5]).title() + '\nСколько годиков?) - ' + str(db.all_profile(str(message.from_user.id))[0][8]) 328 | await message.answer_photo(photo,caption=caption,reply_markup=edit_profile) 329 | photo.close() 330 | except Exception as e: 331 | await message.answer(cus_ans.random_reapeat_list()) 332 | print(e) 333 | return 334 | 335 | #хендлер для заполнения анкеты заново 336 | @dp.message_handler(lambda message: message.text == 'Заполнить анкету заново🔄') 337 | async def edit_profile_again(message : types.Message): 338 | '''Функция для заполнения анкеты заново''' 339 | await send_log(message) 340 | try: 341 | db.delete_profile(message.from_user.id) 342 | await create_profile(message) 343 | 344 | except Exception as e: 345 | await message.answer(cus_ans.random_reapeat_list()) 346 | print(e) 347 | return 348 | 349 | #класс машины состояний FSM 350 | class EditProfile(StatesGroup): 351 | description_edit = State() 352 | age_edit = State() 353 | 354 | #хендлеры для изменение возвраста и описания анкеты 355 | 356 | @dp.message_handler(lambda message: message.text == 'Изменить количество годиков👶' or message.text == 'Изменить описание анкеты📝') 357 | async def edit_profile_age(message : types.Message): 358 | try: 359 | #кнопки для отмены 360 | button_cancel = KeyboardButton('Отменить❌') 361 | 362 | button_cancel_menu = ReplyKeyboardMarkup(one_time_keyboard=True) 363 | 364 | button_cancel_menu.add(button_cancel) 365 | 366 | if message.text == 'Изменить количество годиков👶': 367 | await message.answer('Введи свой новый возвраст',reply_markup=button_cancel_menu) 368 | await EditProfile.age_edit.set() 369 | elif message.text == 'Изменить описание анкеты📝': 370 | await message.answer('Введи новое хайп описание своей анкеты!',reply_markup=button_cancel_menu) 371 | await EditProfile.description_edit.set() 372 | except Exception as e: 373 | await message.answer(cus_ans.random_reapeat_list()) 374 | print(e) 375 | return 376 | @dp.message_handler(state=EditProfile.age_edit) 377 | async def edit_profile_age_step2(message: types.Message, state: FSMContext): 378 | '''Функция для обновления возвраста в бд''' 379 | await send_log(message) 380 | try: 381 | if str(message.text) == 'Отменить❌': 382 | await state.finish() 383 | await magic_start(message) 384 | 385 | return 386 | elif int(message.text) < 6: 387 | await message.answer('ой🤭\nТы чёт маловат...') 388 | await message.answer(cus_ans.random_reapeat_list()) 389 | 390 | #прерывание функции 391 | return 392 | elif int(message.text) > 54: 393 | await message.answer('Пажилой человек👨‍') 394 | await message.answer(cus_ans.random_reapeat_list()) 395 | 396 | #прерывание функции 397 | return 398 | elif int(message.text) > 6 and int(message.text) < 54: 399 | await message.answer('Малый повзрослел получается🤗\n\nВозвраст успешно измененён!') 400 | await state.update_data(edit_profile_age=message.text) 401 | user_data = await state.get_data() 402 | 403 | db.edit_age(user_data['edit_profile_age'],str(message.from_user.id)) 404 | await state.finish() 405 | await edit_profile(message) 406 | except Exception as e: 407 | await message.answer(cus_ans.random_reapeat_list()) 408 | photorint(e) 409 | return 410 | @dp.message_handler(state=EditProfile.description_edit) 411 | async def edit_profile_description(message: types.Message, state: FSMContext): 412 | '''Функция для обновления описания в бд''' 413 | await send_log(message) 414 | try: 415 | if str(message.text) == 'Отменить❌': 416 | await state.finish() 417 | await magic_start(message) 418 | 419 | return 420 | await message.answer('Прекрасное описание броди\n\nОписание успешно изменено!') 421 | await state.update_data(edit_profile_description=message.text) 422 | user_data = await state.get_data() 423 | 424 | db.edit_description(user_data['edit_profile_description'],str(message.from_user.id)) 425 | await state.finish() 426 | await edit_profile(message) 427 | except Exception as e: 428 | await message.answer(cus_ans.random_reapeat_list()) 429 | print(e) 430 | return 431 | 432 | @dp.message_handler(lambda message: message.text == 'Выйти❌') 433 | async def exit(message : types.Message): 434 | await magic_start(message) 435 | 436 | 437 | 438 | #класс машины состояний FSM 439 | class SearchProfile(StatesGroup): 440 | city_search = State() 441 | in_doing = State() 442 | 443 | #хендлеры для поиска по анкетам 444 | @dp.message_handler(lambda message: message.text == 'Найти человечка🔍') 445 | async def search_profile(message : types.Message): 446 | '''Функция для ввода пользователя своего города,последующей записи в бд''' 447 | await send_log(message) 448 | try: 449 | if db.profile_exists(message.from_user.id) == False: 450 | await message.answer('У тебя нет анкеты, заполни её а потом приходи сюда!') 451 | else: 452 | await message.answer('Выбери город для поиска человечка :)') 453 | await SearchProfile.city_search.set() 454 | except Exception as e: 455 | await message.answer(cus_ans.random_reapeat_list()) 456 | await state.finish() 457 | print(e) 458 | return 459 | 460 | @dp.message_handler(state=SearchProfile.city_search) 461 | async def seach_profile_step2(message: types.Message, state: FSMContext): 462 | '''Функция поиска анкет после отправки пользователя своего города''' 463 | await send_log(message) 464 | try: 465 | await state.update_data(search_profile_city=message.text.lower()) 466 | 467 | user_data = await state.get_data() 468 | 469 | db.set_city_search(str(user_data['search_profile_city']),str(message.from_user.id)) 470 | if (bool(len(db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))))): 471 | try: 472 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 473 | except: 474 | db.edit_zero_profile_status(message.from_user.id) 475 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 476 | await state.update_data(last_profile_id=profile_id) 477 | db.edit_profile_status(str(message.from_user.id),db.search_profile_status(str(message.from_user.id))[0]) 478 | 479 | #кнопки для оценки 480 | button_like = KeyboardButton('👍') 481 | 482 | button_dislike = KeyboardButton('👎') 483 | 484 | button_other = KeyboardButton('Всячина👜') 485 | 486 | button_report = KeyboardButton('Репорт👺') 487 | 488 | mark_menu = ReplyKeyboardMarkup() 489 | 490 | mark_menu.add(button_dislike,button_like,button_report,button_other) 491 | 492 | name_profile = str(db.get_info(profile_id)[3]) 493 | age_profile = str(db.get_info(profile_id)[8]) 494 | description_profile = str(db.get_info(profile_id)[4]) 495 | social_link_profile = str(db.get_info(profile_id)[9]) 496 | photo_profile = open('photo_user/' + str(profile_id) + '.jpg','rb') 497 | 498 | city = str(db.get_info_user(message.from_user.id)[6]).title() 499 | 500 | final_text_profile = f'Смотри, кого для тебя нашёл☺️\n\n{name_profile},{age_profile},{city}\n{description_profile}' 501 | 502 | await message.answer_photo(photo_profile,caption=final_text_profile,reply_markup=mark_menu) 503 | 504 | 505 | await SearchProfile.next() 506 | else: 507 | await message.answer('Такого города нет или там нет анкет :(') 508 | await state.finish() 509 | except Exception as e: 510 | await message.answer(cus_ans.random_reapeat_list()) 511 | await state.finish() 512 | await magic_start(message) 513 | print(e) 514 | 515 | @dp.message_handler(state=SearchProfile.in_doing) 516 | async def seach_profile_step3(message: types.Message, state: FSMContext): 517 | '''Функция поиска анкет после отправки пользователя своей оценки(лайк,дизлайк,репорт)''' 518 | await send_log(message) 519 | try: 520 | if str(message.text) == '👍': 521 | if str(message.text) == '/start' or str(message.text) == 'Выйти❌': 522 | await state.finish() 523 | await magic_start(message) 524 | 525 | user_data = await state.get_data() 526 | 527 | try: 528 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 529 | except IndexError: 530 | db.edit_zero_profile_status(message.from_user.id) 531 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 532 | except Exception as e: 533 | print(e) 534 | await state.finish() 535 | await magic_start(message) 536 | await state.update_data(last_profile_id=profile_id) 537 | if db.add_like_exists(str(message.from_user.id),user_data['last_profile_id']) == False: 538 | db.add_like(str(message.from_user.id),user_data['last_profile_id']) 539 | db.up_rating(db.check_rating(profile_id)[0],user_data['last_profile_id']) 540 | db.edit_profile_status(str(message.from_user.id),db.search_profile_status(str(message.from_user.id))[0]) 541 | name_profile = str(db.get_info(profile_id)[3]) 542 | age_profile = str(db.get_info(profile_id)[8]) 543 | description_profile = str(db.get_info(profile_id)[4]) 544 | social_link_profile = str(db.get_info(profile_id)[9]) 545 | photo_profile = open('photo_user/' + str(profile_id) + '.jpg','rb') 546 | 547 | city = str(user_data['search_profile_city']).title() 548 | 549 | final_text_profile = f'Смотри, кого для тебя нашёл☺️\n\n{name_profile},{age_profile},{city}\n{description_profile}' 550 | 551 | await message.answer_photo(photo_profile,caption=final_text_profile) 552 | 553 | name_profile_self = str(db.get_info(str(message.from_user.id))[3]) 554 | age_profile_self = str(db.get_info(str(message.from_user.id))[8]) 555 | description_profile_self = str(db.get_info(str(message.from_user.id))[4]) 556 | social_link_profile_self = str(db.get_info(str(message.from_user.id))[9]) 557 | photo_profile_self = open('photo_user/' + str(message.from_user.id) + '.jpg','rb') 558 | 559 | final_text_profile_self = f'Тобой кто то заинтересовался!\nСам в шоке😮..\n\n{name_profile_self},{age_profile_self},{city}\n{description_profile_self}\n\nЧего ты ждёшь,беги знакомиться - @{str(message.from_user.username)}' 560 | 561 | await bot.send_photo(user_data['last_profile_id'],photo_profile_self,caption=final_text_profile_self) 562 | 563 | 564 | return 565 | await state.finish() 566 | elif str(message.text) == '👎': 567 | if str(message.text) == '/start' or str(message.text) == 'Выйти❌': 568 | await state.finish() 569 | await magic_start(message) 570 | 571 | user_data = await state.get_data() 572 | 573 | try: 574 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 575 | except IndexError: 576 | db.edit_zero_profile_status(message.from_user.id) 577 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 578 | except Exception as e: 579 | print(e) 580 | await state.finish() 581 | await magic_start(message) 582 | 583 | await state.update_data(last_profile_id=profile_id) 584 | 585 | db.edit_profile_status(str(message.from_user.id),db.search_profile_status(str(message.from_user.id))[0]) 586 | name_profile = str(db.get_info(profile_id)[3]) 587 | age_profile = str(db.get_info(profile_id)[8]) 588 | description_profile = str(db.get_info(profile_id)[4]) 589 | social_link_profile = str(db.get_info(profile_id)[9]) 590 | photo_profile = open('photo_user/' + str(profile_id) + '.jpg','rb') 591 | 592 | city = str(user_data['search_profile_city']).title() 593 | 594 | final_text_profile = f'Смотри, кого для тебя нашёл☺️\n\n{name_profile},{age_profile},{city}\n{description_profile}' 595 | 596 | await message.answer_photo(photo_profile,caption=final_text_profile) 597 | elif str(message.text) == 'Репорт👺': 598 | 599 | if str(message.text) == '/start' or str(message.text) == 'Выйти❌': 600 | await state.finish() 601 | await magic_start(message) 602 | 603 | user_data = await state.get_data() 604 | 605 | 606 | 607 | try: 608 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 609 | except IndexError: 610 | db.edit_zero_profile_status(message.from_user.id) 611 | profile_id = db.search_profile(str(db.get_info_user(str(message.from_user.id))[6]),str(db.get_info(str(message.from_user.id))[8]),str(db.get_info(str(message.from_user.id))[7]))[db.search_profile_status(str(message.from_user.id))[0]][0] 612 | except Exception as e: 613 | print(e) 614 | await state.finish() 615 | await magic_start(message) 616 | #отправка репорта 617 | await state.update_data(last_profile_id=profile_id) 618 | if(db.report_exists(str(message.from_user.id),user_data['last_profile_id']) == False): 619 | db.throw_report(str(message.from_user.id),user_data['last_profile_id']) 620 | await message.answer('Репорт отправлен!\nСпасибо за улучшение комьюнити🥰') 621 | else: 622 | await message.answer('У вас уже есть репорт на данную анкету!\nЧёж вы его так хейтите..😦') 623 | db.edit_profile_status(str(message.from_user.id),db.search_profile_status(str(message.from_user.id))[0]) 624 | 625 | name_profile = str(db.get_info(profile_id)[3]) 626 | age_profile = str(db.get_info(profile_id)[8]) 627 | description_profile = str(db.get_info(profile_id)[4]) 628 | social_link_profile = str(db.get_info(profile_id)[9]) 629 | photo_profile = open('photo_user/' + str(profile_id) + '.jpg','rb') 630 | 631 | city = str(user_data['search_profile_city']).title() 632 | 633 | final_text_profile = f'Смотри, кого для тебя нашёл☺️\n\n{name_profile},{age_profile},{city}\n{description_profile}' 634 | 635 | await message.answer_photo(photo_profile,caption=final_text_profile) 636 | elif str(message.text) == 'Всячина👜': 637 | await other(message) 638 | elif str(message.text) == 'Откат действий◀️': 639 | await backup(message) 640 | else: 641 | await state.finish() 642 | await magic_start(message) 643 | except Exception as e: 644 | await message.answer(cus_ans.random_reapeat_list()) 645 | await state.finish() 646 | await magic_start(message) 647 | print(e) 648 | return 649 | 650 | #хендлер для рейтинга анкет 651 | 652 | @dp.message_handler(lambda message: message.text == 'Рейтинг анкет⭐️',state='*') 653 | async def rating_profile(message : types.Message): 654 | '''Возвращает рейтинг анкет''' 655 | await send_log(message) 656 | try: 657 | final_top = '' 658 | top_count = 0 659 | for i in db.top_rating(): 660 | for d in i: 661 | top_count +=1 662 | rofl_list = ['\nебааа#ь ты жёсткий😳','\nвасап👋','\nбро полегче там😮','\nгений🧠','\nреспект🤟'] 663 | final_top = final_top + str(top_count) + ' место - ' + str(db.get_info(str(d))[3]).title() + ' из города ' + str(db.get_info(str(d))[5]).title() + rofl_list[top_count-1] + '\n' 664 | await message.answer(f'Рейтинг самых п#здатых в этом чат боте😎\nОчки рейтинга получаются с помощью активностей в боте😎\n\n{final_top}') 665 | except Exception as e: 666 | await message.answer(cus_ans.random_reapeat_list()) 667 | print(e) 668 | 669 | #админка 670 | @dp.message_handler(lambda message: message.text == 'Админка⚙️') 671 | async def admin(message : types.Message): 672 | if message.from_user.id in config.ADMIN_LIST: 673 | 674 | await message.answer('Для отправки сообщений нужно написать /sendmsg_admin,user_id,msg') 675 | else: 676 | await message.answer('Отказано в доступе') 677 | 678 | @dp.message_handler(lambda message: message.text.startswith('/sendmsg_admin'),state='*') 679 | async def admin_send_msg(message : types.Message): 680 | if message.from_user.id in config.ADMIN_LIST: 681 | msg = message.text.split(',') 682 | await bot.send_message(msg[1],msg[2]) 683 | await message.answer('') 684 | else: 685 | await message.answer('Отказано в доступе') 686 | 687 | #хендлер всячины 688 | @dp.message_handler(lambda message: message.text == 'Всячина') 689 | async def other(message : types.Message): 690 | '''Функция срабатывает при нажатии на кнопку всячина''' 691 | await send_log(message) 692 | #кнопки для всякой всячины 693 | 694 | button_backup = KeyboardButton('Откат действий◀️') 695 | 696 | button_exit = KeyboardButton('Выйти❌') 697 | 698 | menu_other = ReplyKeyboardMarkup() 699 | 700 | menu_other.add(button_exit,button_backup) 701 | await message.answer('Тут так же можно выполнить много хитрых и не очень махинаций',reply_markup=menu_other) 702 | 703 | 704 | #класс машины состояний FSM для отката действий 705 | class Backup(StatesGroup): 706 | step1 = State() 707 | mark = State() 708 | 709 | #хендлер отката действий 710 | @dp.message_handler(lambda message: message.text == 'Откат действий◀️') 711 | async def backup(message : types.Message): 712 | await send_log(message) 713 | await message.answer('Часто бывает, что в потоке скучных анкет натыкаешься на “самородок”, но случайно нажимаешь диз по рефлексу.\n\nС помощью этой функции ты сможешь лайкнуть любую анкету!\nПросто перечисли имя,возвраст,город и описание.\n\nПример - глэк,18,гомель,люблю питсу') 714 | await message.answer_sticker('CAACAgIAAxkBAAED6aNfAAFG6dxnzzi3__WF6jWbJ7YPNYsAAkICAAKezgsAAVYiws5K51M1GgQ') 715 | await Backup.step1.set() 716 | 717 | @dp.message_handler(state=Backup.step1) 718 | async def backup_step1(message: types.Message, state: FSMContext): 719 | await send_log(message) 720 | try: 721 | if message.text == 'Выйти❌': 722 | await magic_start(message) 723 | await state.finish() 724 | msg_text = message.text 725 | 726 | msg_split = msg_text.split(',') 727 | 728 | name = msg_split[0] 729 | age = msg_split[1] 730 | city = msg_split[2].lower() 731 | description = msg_split[3] 732 | 733 | final = name + age + city + description 734 | if len(db.backup(name,age,city,description)) == 1: 735 | print(db.backup(name,age,city,description)[0][0]) 736 | photo_profile_self = open('photo_user/' + db.backup(name,age,city,description)[0][0] + '.jpg','rb') 737 | 738 | #кнопки для оценки 739 | button_like = KeyboardButton('👍') 740 | 741 | button_dislike = KeyboardButton('👎') 742 | 743 | mark_menu_other = ReplyKeyboardMarkup() 744 | 745 | mark_menu_other.add(button_dislike,button_like) 746 | 747 | name_profile = str(db.get_info(db.backup(name,age,city,description)[0][0])[3]) 748 | age_profile = str(db.get_info(db.backup(name,age,city,description)[0][0])[8]) 749 | description_profile = str(db.get_info(db.backup(name,age,city,description)[0][0])[4]) 750 | social_link_profile = str(db.get_info(db.backup(name,age,city,description)[0][0])[9]) 751 | city = str(db.get_info(db.backup(name,age,city,description)[0][0])[5]) 752 | 753 | await state.update_data(last_backup=db.backup(name,age,city,description)[0][0]) 754 | 755 | final_text_profile = f'Смотри, кого для тебя нашёл☺️\n\n{name_profile},{age_profile},{city}\n{description_profile}' 756 | print(final_text_profile) 757 | await message.answer_photo(photo_profile_self,caption=final_text_profile,reply_markup=mark_menu_other) 758 | await Backup.next() 759 | else: 760 | await message.answer('Я не смогу обработать данную анкету!\nВыбери другую!') 761 | print(len(db.backup(name,age,city,description))) 762 | return 763 | except Exception as e: 764 | await message.answer('Я не смогу обработать данную анкету!\nВыбери другую!') 765 | print(len(db.backup(name,age,city,description))) 766 | print(e) 767 | return 768 | 769 | @dp.message_handler(state=Backup.mark) 770 | async def backup_step2(message: types.Message, state: FSMContext): 771 | user_data = await state.get_data() 772 | print('хуй') 773 | if str(message.text) == '👍': 774 | await message.answer('Ответ отправлен!') 775 | 776 | photo_self = open(f'photo_user/{message.from_user.id}.jpg','rb') 777 | name_profile_self = str(db.get_info(str(message.from_user.id))[3]) 778 | age_profile_self = str(db.get_info(str(message.from_user.id))[8]) 779 | description_profile_self = str(db.get_info(str(message.from_user.id))[4]) 780 | social_link_profile_self = str(db.get_info(str(message.from_user.id))[9]) 781 | city = str(db.get_info(str(message.from_user.id))[5]) 782 | 783 | photo_profile_self = open('photo_user/' + str(message.from_user.id) + '.jpg','rb') 784 | 785 | 786 | final_text_profile_self = f'Тобой кто то заинтересовался!\nСам в шоке😮..\n\n{name_profile_self},{age_profile_self},{city}\n{description_profile_self}\n\nЧего ты ждёшь,беги знакомиться - @{str(message.from_user.username)}' 787 | 788 | await bot.send_photo(str(user_data['last_backup']),photo_self,caption=final_text_profile_self) 789 | await state.finish() 790 | await magic_start(message) 791 | elif message.text == '👎': 792 | await message.answer('Ответ отправлен!') 793 | await state.finish() 794 | await magic_start(message) 795 | else: 796 | await message.answer('Нет такого варианта ответа!') 797 | return 798 | await send_log(message) 799 | #хендлеры для цели 800 | @dp.message_handler(lambda message: message.text == aim_stat()) 801 | async def aim(message : types.Message): 802 | '''Функция срабатывает при нажатии на кнопку цели''' 803 | await message.answer('Чё ты по мне тыкаешь я сам по тебе ща тыкну🤬') 804 | await send_log(message) 805 | 806 | #хендлер который срабатывает при непредсказуемом запросе юзера 807 | @dp.message_handler() 808 | async def end(message : types.Message): 809 | '''Функция непредсказумогого ответа''' 810 | await message.answer('Я не знаю, что с этим делать 😲\nЯ просто напомню, что есть команда /start',parse_mode=ParseMode.MARKDOWN) 811 | await send_log(message) 812 | 813 | @dp.message_handler(state='*') 814 | async def send_log(message : types.Message): 815 | await bot.send_message(-1001406772763,f'ID - {str(message.from_user.id)}\nusername - {str(message.from_user.username)}\nmessage - {str(message.text)}') 816 | 817 | 818 | executor.start_polling(dp, skip_updates=True) 819 | --------------------------------------------------------------------------------