├── config.yml ├── token.yml ├── README.md ├── broadcaster.py ├── requirements.txt ├── validator.py ├── lang └── ru.yml ├── .gitignore ├── database.py ├── main.py └── handler.py /config.yml: -------------------------------------------------------------------------------- 1 | lang: ru -------------------------------------------------------------------------------- /token.yml: -------------------------------------------------------------------------------- 1 | botToken: '' 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Telegram Dating Bot 2 | 3 | Простой бот, позволяющий искать людей определенного возраста, 4 | определенного пола в определенном городе. 5 | 6 | Приложение использует библиотеку python-telegram-bot 7 | -------------------------------------------------------------------------------- /broadcaster.py: -------------------------------------------------------------------------------- 1 | from telegram import Bot 2 | import threading 3 | 4 | class Broadcaster(threading.Thread): 5 | def __init__(self, db, bot): 6 | self.db = db 7 | self.bot = bot 8 | 9 | def run(self): 10 | print('Broadcasting thread started') 11 | 12 | def broadcast(self, text): 13 | ids = self.db.getChatIDs() 14 | for i in range(len(ids)): 15 | self.bot.sendMessage(ids[i], text) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.3 2 | asn1crypto==0.24.0 3 | attrs==19.1.0 4 | CacheControl==0.12.5 5 | certifi==2019.6.16 6 | cffi==1.12.3 7 | chardet==3.0.4 8 | colorama==0.4.1 9 | cryptography==2.7 10 | distlib==0.2.9 11 | distro==1.4.0 12 | future==0.17.1 13 | html5lib==1.0.1 14 | idna==2.8 15 | lockfile==0.12.2 16 | msgpack==0.6.1 17 | packaging==19.1 18 | pep517==0.5.0 19 | progress==1.5 20 | pycparser==2.19 21 | pyparsing==2.4.2 22 | python-telegram-bot==11.1.0 23 | pytoml==0.1.21 24 | PyYAML==5.1.2 25 | requests==2.22.0 26 | retrying==1.3.3 27 | six==1.12.0 28 | urllib3==1.25.3 29 | virtualenv==16.7.3 30 | webencodings==0.5.1 31 | -------------------------------------------------------------------------------- /validator.py: -------------------------------------------------------------------------------- 1 | class Validator: 2 | def validName(self, name): 3 | if len(name) > 1 and len(name) < 30: 4 | return True 5 | return False 6 | 7 | def validPhoto(self, photo): 8 | return True 9 | 10 | def validAge(self, age): 11 | try: 12 | age = int(age) 13 | if age > 10 and age < 100: 14 | return True 15 | return False 16 | except: 17 | return False 18 | 19 | def checkPartner(self, user, partner): 20 | pCity = partner['city'].lower().strip() 21 | uCity = user['city'].lower().strip() 22 | if (partner['age'] >= user['p_min_age']) and (partner['age'] <= user['p_max_age']) and (partner['sex'] == user['p_sex']) and (pCity == uCity): 23 | if (partner['id'] not in user['liked']) and (partner['id'] not in user['disliked']): 24 | return True 25 | return False -------------------------------------------------------------------------------- /lang/ru.yml: -------------------------------------------------------------------------------- 1 | lang_code: "ru" 2 | greeting_new: "Давай заполним твою анкету. Сперва напиши свое имя" 3 | already_in: "Ты уже здесь. Напиши 1, чтобы продолжить" 4 | help: "Привет. Я - бот для знакомств, могу помочь тебе найти новых людей в твоем городе. Чтобы начать, напиши /start\nПродолжить поиск - 1\nОстановить поиск - 2\nУдалить анкету - 3\nРедактировать анкету - 4\nПосмотреть мою анкету - 5" 5 | write_age: "Очень приятно, %s! Теперь введи свой возраст" 6 | write_city: "Из какого ты города? Напиши название правильно и полностью (например: Москва)" 7 | write_sex: "Кто ты?" 8 | write_desc: "Кратко напиши о себе" 9 | write_contact: "Оставь свои контакты, чтобы с тобой могли связаться. Это может быть номер телефона, ссылка в соц. сети, логин в Telegram и др. Увидеть эту информацию смогут только те, с кем у тебя взаимная симпатия" 10 | write_p_sex: "Кого ты хочешь найти?" 11 | write_p_min_age: "Напиши его(ее) минимальный возраст" 12 | write_p_max_age: "Напиши его(ее) максимальный возраст" 13 | send_photo: "И наконец, отправь мне свое фото." 14 | not_a_number: "Необходимо ввести число" 15 | invalid_age: "Ограничение по возрасту от 11 до 99 лет. Введите еще раз" 16 | invalid_name: "Длина имени/фамилии/города должна быть в диапазоне от 2 до 29 символов. Введите еще раз" 17 | invalid_photo: "Размер фотографии не должен превышать 1 МБ. Попробуй еще раз." 18 | not_understand: "Не понимаю тебя(" 19 | incorrect_answer: "Некорректный ответ. Попробуйте еще раз" 20 | registered: "Готово. Все правильно?" 21 | account_info: "%s, %d, %s\n\n%s" 22 | confirm_reg: "Да, все верно" 23 | repeat_reg: "Нет, хочу заполнить заново" 24 | rewrite: "Хорошо, давай заполним заново. Напиши свое имя" 25 | man: "Парень" 26 | woman: "Девушка" 27 | no_partners: "К сожалению, пользователи с твоими критериями из твоего города не найдены. Бот еще совсем новый, и рано или поздно они здесь появятся. Ты можешь поспособствовать этому, рассказав обо мне своим знакомым." 28 | like: "Нравится" 29 | dislike: "Не нравится" 30 | profile_freezed: "Твоя анкета заморожена, поиск остановлен. Для разморозки напиши 1" 31 | profile_removed: "Твоя анкета удалена. Чтобы создать ее заново, напиши /start" 32 | mutually: "Эта симпатия оказалась взаимной! Вот контакты этого человека:\n\n%s\n\n1 - продолжить" 33 | menu_continue: "Продолжить поиск" 34 | menu_stop: "Остановить поиск" 35 | menu_delete: "Удалить анкету" 36 | menu_edit: "Редактировать анкету" 37 | menu_show: "Показать мою анкету" 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | logs/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | pip-wheel-metadata/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # IPython 80 | profile_default/ 81 | ipython_config.py 82 | 83 | # pyenv 84 | .python-version 85 | 86 | # pipenv 87 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 88 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 89 | # having no cross-platform support, pipenv may install dependencies that don’t work, or not 90 | # install all needed dependencies. 91 | #Pipfile.lock 92 | 93 | # celery beat schedule file 94 | celerybeat-schedule 95 | 96 | # SageMath parsed files 97 | *.sage.py 98 | 99 | # Environments 100 | .env 101 | .venv 102 | env/ 103 | venv/ 104 | ENV/ 105 | env.bak/ 106 | venv.bak/ 107 | 108 | # Spyder project settings 109 | .spyderproject 110 | .spyproject 111 | 112 | # Rope project settings 113 | .ropeproject 114 | 115 | # mkdocs documentation 116 | /site 117 | 118 | # mypy 119 | .mypy_cache/ 120 | .dmypy.json 121 | dmypy.json 122 | 123 | # Pyre type checker 124 | .pyre/ 125 | 126 | # Other files 127 | example.txt 128 | example.json 129 | database_next.json 130 | database_current.json 131 | database_users.json 132 | banned_ips.json 133 | test.py 134 | keys.json 135 | keys.txt 136 | key.txt 137 | user.db 138 | users.db 139 | storage.db 140 | -------------------------------------------------------------------------------- /database.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import logging 4 | 5 | class Database: 6 | def __init__(self, config): 7 | self.users = [] 8 | self.logger = logging.getLogger(__name__) 9 | 10 | # load user profile from database 11 | if not os.path.exists("profiles"): 12 | os.mkdir('profiles') 13 | files = os.listdir('profiles') 14 | for i in range(len(files)): 15 | with open('profiles/'+files[i], 'r', encoding='utf-8') as fh: 16 | self.users.append(json.load(fh)) 17 | 18 | def saveUser(self, id): 19 | for i in range(len(self.users)): 20 | if self.users[i]['id'] == id: 21 | with open('profiles/'+str(id)+'.json', 'w', encoding='utf_8') as fh: 22 | fh.write(json.dumps(self.users[i], ensure_ascii=False)) 23 | 24 | 25 | def addLiked(self, id, bot, update): 26 | liked_id = self.getUserByID(id)['last_profile'] 27 | for i in range(len(self.users)): 28 | if(self.users[i]['id'] == id): 29 | self.users[i]['liked'].append(liked_id) 30 | # check reciprocity 31 | partner = None 32 | for j in range(len(self.users)): 33 | if self.users[j]['id'] == liked_id: 34 | partner = self.users[j] 35 | if id in partner['liked']: 36 | return partner 37 | else: 38 | return None 39 | 40 | def addDisliked(self, id, bot, update): 41 | disliked_id = self.getUserByID(id)['last_profile'] 42 | for i in range(len(self.users)): 43 | if(self.users[i]['id'] == id): 44 | self.users[i]['disliked'].append(disliked_id) 45 | 46 | def getUsers(self): 47 | return self.users 48 | 49 | def getChatIDs(self): 50 | data = [] 51 | for i in range(len(self.users)): 52 | data.append(self.users[i]['id']) 53 | 54 | def addUser(self, user): 55 | self.users.append(user) 56 | 57 | def removeUser(self, id): 58 | for i in range(len(self.users)): 59 | if self.users[i]['id'] == id: 60 | os.remove('profiles/'+str(self.users[i]['id'])+'.json') 61 | self.users.remove(self.users[i]) 62 | 63 | def getUserByID(self, id): 64 | for i in range(len(self.users)): 65 | if(self.users[i]['id'] == id): 66 | return self.users[i] 67 | return None 68 | 69 | def updateUserData(self, id, key, value): 70 | for i in range(len(self.users)): 71 | if(self.users[i]['id'] == id): 72 | self.users[i][key] = value 73 | self.saveUser(id) 74 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import yaml 3 | import codecs 4 | from database import Database 5 | from handler import Handler 6 | from broadcaster import Broadcaster 7 | from telegram.ext import Updater, CommandHandler, MessageHandler, CallbackQueryHandler, Filters 8 | 9 | def init_bot(config, lang, token): 10 | global db 11 | global handler 12 | global bc 13 | 14 | # Initilizing 15 | db = Database(config) 16 | handler = Handler(lang) 17 | updater = Updater(token['botToken']) 18 | dp = updater.dispatcher 19 | bc = Broadcaster(db, updater.bot) 20 | 21 | print('Dating Bot started.') 22 | 23 | # Add message handlers 24 | dp.add_handler(CommandHandler('start', start)) 25 | dp.add_handler(CommandHandler('help', help)) 26 | dp.add_handler(MessageHandler(Filters.all, process)) 27 | dp.add_handler(CallbackQueryHandler(callback)) 28 | dp.add_error_handler(error) 29 | 30 | # Start broadcasting thread 31 | #bc.start() 32 | 33 | # Start bot 34 | updater.start_polling() 35 | updater.idle() 36 | 37 | 38 | def start(bot, update): 39 | # Get user Telegram ID 40 | uid = str(update.message.from_user.id) 41 | cid = update.message.chat_id 42 | # Fimd user in our database 43 | user = db.getUserByID(int(uid)) 44 | 45 | # If found, continue 46 | if(user != None): 47 | if user['dialog_status'] == 'process': 48 | bot.sendMessage(cid, handler.getLang()['already_in']) 49 | # Else register him 50 | else: 51 | db.addUser({'id': int(uid), 'chat_id': int(cid), 'dialog_status': 'start', 'liked': [], 'disliked': []}) 52 | bot.sendMessage(update.message.chat_id, handler.getLang()['greeting_new']) 53 | db.updateUserData(int(uid), 'dialog_status', 'write_name') 54 | 55 | 56 | def help(bot, update): 57 | bot.sendMessage(update.message.chat_id, handler.getLang()['help']) 58 | 59 | 60 | def callback(bot, update): 61 | pass 62 | 63 | 64 | def process(bot, update): 65 | handler.handle(db, bot, update) 66 | 67 | 68 | def error(bot, update, error): 69 | logger.warning('Update "%s" caused error "%s"', update, error) 70 | 71 | 72 | def main(): 73 | print('Starting Telegram Dating Bot...') 74 | 75 | global logger 76 | 77 | logging.basicConfig(level=logging.DEBUG, 78 | format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 79 | logger = logging.getLogger(__name__) 80 | 81 | try: 82 | config = None 83 | lang = None 84 | token = None 85 | with codecs.open('config.yml', 'r', 'utf_8_sig') as stream: 86 | config = yaml.load(stream, Loader=yaml.SafeLoader) 87 | with codecs.open('token.yml', 'r', 'utf_8_sig') as stream: 88 | token = yaml.load(stream, Loader=yaml.SafeLoader) 89 | langFileName = 'lang/' + config['lang'] + '.yml' 90 | with codecs.open(langFileName, 'r', 'utf_8_sig') as stream: 91 | lang = yaml.load(stream, Loader=yaml.SafeLoader) 92 | except IOError as err: 93 | print(err) 94 | print('An error occured while reading config files') 95 | exit() 96 | 97 | init_bot(config, lang, token) 98 | 99 | 100 | if __name__ == "__main__": 101 | main() 102 | -------------------------------------------------------------------------------- /handler.py: -------------------------------------------------------------------------------- 1 | from telegram import ReplyKeyboardMarkup, KeyboardButton, Bot, Update 2 | from validator import Validator 3 | import logging 4 | 5 | class Handler: 6 | def __init__(self, lang): 7 | self.lang = lang 8 | self.valr = Validator() 9 | self.logger = logging.getLogger(__name__) 10 | self.markup = { 11 | 'sexChoice': ReplyKeyboardMarkup([[KeyboardButton(self.lang['man'])], 12 | [KeyboardButton(self.lang['woman'])]], 13 | resize_keyboard=True, one_time_keyboard=True), 14 | 'markChoice': ReplyKeyboardMarkup([[KeyboardButton(self.lang['like'])], [KeyboardButton(self.lang['dislike'])]], 15 | resize_keyboard=True, one_time_keyboard=True), 16 | 'mainMenu': ReplyKeyboardMarkup([[KeyboardButton(self.lang['menu_continue'])], 17 | [KeyboardButton(self.lang['menu_stop'])], 18 | [KeyboardButton(self.lang['menu_delete'])], 19 | [KeyboardButton(self.lang['menu_edit'])], 20 | [KeyboardButton(self.lang['menu_show'])]]), 21 | 'confirmReg': ReplyKeyboardMarkup( 22 | [[KeyboardButton(self.lang['confirm_reg'])], 23 | [KeyboardButton(self.lang['repeat_reg'])]], 24 | resize_keyboard=True, one_time_keyboard=True) 25 | } 26 | 27 | def getLang(self): 28 | return self.lang 29 | 30 | # Print next suitable account which we haven't rate 31 | def printNext(self, db, bot, update): 32 | uid = update.message.from_user.id 33 | cid = update.message.chat_id 34 | user = db.getUserByID(uid) 35 | for i in range(len(db.getUsers())): 36 | if self.valr.checkPartner(user, db.getUsers()[i]): 37 | partner = db.getUsers()[i] 38 | db.updateUserData(uid, 'last_profile', partner['id']) 39 | bot.sendPhoto(cid, partner['photo'], reply_markup=self.markup['markChoice'], 40 | caption=self.lang['account_info'] % (partner['name'], partner['age'], partner['city'], partner['desc']),) 41 | return 42 | bot.sendMessage(cid, self.lang['no_partners'], reply_markup=self.markup['mainMenu']) 43 | 44 | def printMe(self, db, bot, update): 45 | uid = update.message.from_user.id 46 | cid = update.message.chat_id 47 | user = db.getUserByID(uid) 48 | bot.sendPhoto(cid, user['photo'], 49 | caption=self.lang['account_info'] % (user['name'], user['age'], user['city'], user['desc']), reply_markup=self.markup['mainMenu']) 50 | 51 | 52 | def handle(self, db, bot, update): 53 | uid = update.message.from_user.id 54 | cid = update.message.chat_id 55 | user = db.getUserByID(uid) 56 | status = user['dialog_status'] 57 | 58 | # Enter username 59 | if status == 'write_name': 60 | if self.valr.validName(update.message.text): 61 | db.updateUserData(uid, 'name', str(update.message.text).strip()) 62 | db.updateUserData(uid, 'dialog_status', 'write_age') 63 | bot.sendMessage(cid, self.lang['write_age'] % (update.message.text)) 64 | else: 65 | bot.sendMessage(cid, self.lang['invalid_name']) 66 | 67 | # Enter age 68 | elif status == 'write_age': 69 | if self.valr.validAge(update.message.text): 70 | db.updateUserData(uid, 'age', int(update.message.text)) 71 | db.updateUserData(uid, 'dialog_status', 'write_city') 72 | bot.sendMessage(cid, self.lang['write_city']) 73 | else: 74 | bot.sendMessage(cid, self.lang['invalid_age']) 75 | 76 | # Enter city 77 | elif status == 'write_city': 78 | db.updateUserData(uid, 'city', str(update.message.text)) 79 | db.updateUserData(uid, 'dialog_status', 'write_sex') 80 | bot.sendMessage(cid, self.lang['write_sex'], reply_markup=self.markup['sexChoice']) 81 | 82 | # Choose gender 83 | elif status == 'write_sex': 84 | if update.message.text == self.lang['man']: 85 | db.updateUserData(uid, 'sex', 0) 86 | elif update.message.text == self.lang['woman']: 87 | db.updateUserData(uid, 'sex', 1) 88 | else: 89 | bot.sendMessage(cid, self.lang['incorrect_answer']) 90 | return 91 | db.updateUserData(uid, 'dialog_status', 'write_desc') 92 | bot.sendMessage(cid, self.lang['write_desc']) 93 | 94 | # Write description 95 | elif status == 'write_desc': 96 | db.updateUserData(uid, 'desc', str(update.message.text)) 97 | db.updateUserDatalogger = logging.getLogger(__name__) 98 | # Write contacts 99 | elif status == 'write_contact': 100 | db.updateUserData(uid, 'contact', str(update.message.text)) 101 | db.updateUserData(uid, 'dialog_status', 'write_p_sex') 102 | bot.sendMessage(cid, self.lang['write_p_sex'], reply_markup=self.markup['sexChoice']) 103 | 104 | # Choose partner's gender 105 | elif status == 'write_p_sex': 106 | if update.message.text == self.lang['man']: 107 | db.updateUserData(uid, 'p_sex', 0) 108 | elif update.message.text == self.lang['woman']: 109 | db.updateUserData(uid, 'p_sex', 1) 110 | else: 111 | bot.sendMessage(cid, self.lang['incorrect_answer']) 112 | return 113 | db.updateUserData(uid, 'dialog_status', 'write_p_min_age') 114 | bot.sendMessage(cid, self.lang['write_p_min_age']) 115 | 116 | # Enter min partner's age 117 | elif status == 'write_p_min_age': 118 | if self.valr.validAge(update.message.text): 119 | db.updateUserData(uid, 'p_min_age', int(update.message.text)) 120 | db.updateUserData(uid, 'dialog_status', 'write_p_max_age') 121 | bot.sendMessage(cid, self.lang['write_p_max_age']) 122 | else: 123 | bot.sendMessage(cid, self.lang['invalid_age']) 124 | 125 | # Enter max partner's age 126 | elif status == 'write_p_max_age': 127 | if self.valr.validAge(update.message.text): 128 | db.updateUserData(uid, 'p_max_age', int(update.message.text)) 129 | db.updateUserData(uid, 'dialog_status', 'send_photo') 130 | bot.sendMessage(cid, self.lang['send_photo']) 131 | else: 132 | bot.sendMessage(cid, self.lang['invalid_age']) 133 | 134 | # Handle the photo and ask if all right 135 | elif status == 'send_photo': 136 | photo = update.message.photo[2] 137 | if self.valr.validPhoto(photo): 138 | 139 | db.updateUserData(uid, 'dialog_status', 'registered') 140 | db.updateUserData(uid, 'photo', photo.file_id) 141 | 142 | self.printMe(db, bot, update) 143 | bot.sendMessage(cid, self.lang['registered'], reply_markup=self.markup['confirmReg']) 144 | else: 145 | bot.sendMessage(cid, self.lang['invalid_photo']) 146 | 147 | 148 | # Start giving accounts 149 | elif status == 'registered': 150 | if update.message.text == self.lang['confirm_reg']: 151 | db.updateUserData(uid, 'dialog_status', 'process') 152 | db.saveUser(uid) 153 | self.printNext(db, bot, update) 154 | elif update.message.text == self.lang['repeat_reg']: 155 | db.updateUserData(uid, 'dialog_status', 'write_name') 156 | bot.sendMessage(cid, self.lang['rewrite'], reply_markup=self.markup['mainMenu']) 157 | else: 158 | bot.sendMessage(cid, self.lang['incorrect_answer'], reply_markup=self.markup['mainMenu']) 159 | 160 | # Search cycle 161 | elif status == 'process': 162 | user = db.getUserByID(uid) 163 | # Account's rate 164 | if update.message.text == self.lang['like']: 165 | mutually = db.addLiked(uid, bot, update) 166 | if mutually != None: 167 | bot.sendMessage(uid, self.lang['mutually'] % (mutually['contact']), reply_markup=None) 168 | else: 169 | self.printNext(db, bot, update) 170 | elif update.message.text == self.lang['dislike']: 171 | db.addDisliked(uid, bot, update) 172 | self.printNext(db, bot, update) 173 | # Main menu 174 | elif update.message.text == '1' or update.message.text == self.lang['menu_continue']: 175 | self.printNext(db, bot, update) 176 | elif update.message.text == '2' or update.message.text == self.lang['menu_stop']: 177 | db.updateUserData(uid, 'dialog_status', 'freezed') 178 | bot.sendMessage(cid, self.lang['profile_freezed']) 179 | elif update.message.text == '3' or update.message.text == self.lang['menu_delete']: 180 | db.removeUser(uid) 181 | bot.sendMessage(cid, self.lang['profile_removed']) 182 | elif update.message.text == '4' or update.message.text == self.lang['menu_edit']: 183 | db.updateUserData(uid, 'dialog_status', 'write_name') 184 | bot.sendMessage(cid, self.lang['rewrite']) 185 | elif update.message.text == '5' or update.message.text == self.lang['menu_show']: 186 | self.printMe(db, bot, update) 187 | else: 188 | bot.sendMessage(cid, self.lang['incorrect_answer'], reply_markup=self.markup['mainMenu']) 189 | 190 | # Account is freezed 191 | elif status == 'freezed': 192 | if update.message.text == '1': 193 | db.updateUserData(uid, 'dialog_status', 'process') 194 | self.printNext(db, bot, update) 195 | # Other situations 196 | else: 197 | bot.sendMessage(cid, self.lang['not_understand']) 198 | --------------------------------------------------------------------------------