def start_vine_msg(message): # здесь добавляем юзера в таблицу с юзерскими сессиями, # чтобы не потерять его на просторах асинхронного программирования try: kinds = [] for i in select_condition(table='imnotalcocholic', column='kind', distinct=True): kinds.append(i[0]) kinds.append('Мне повезёт') bot.send_message(chat_id=message.chat.id, text='Что ты хочешь выпить?', parse_mode='Markdown', reply_markup=keyboard(kinds) ) if not select_condition('user_sessions', 'user_id', "user_id = '{}' and command = 'alcoholic'".format(message.chat.id)): insert_condition(table='user_sessions', values=(str(message.chat.id), 'alcoholic'), columns='(user_id, command)') except Exception as e: bot.send_message(chat_id=log_chat, text='Exception {} in imnotalcocholic at start_vine_msg func'.format(e) ) bot.send_message(chat_id=message.chat.id, text='Ой, что-то пошло не так. Попробуй ещё раз.', parse_mode='Markdown' )
def new_phrase(message): text_exists = select_condition('texts', 'msg', "msg = '{msg}'".format(msg=message.text)) role = check_superuser(login=message.from_user.username) if role in ('superuser', 'moder', 'admin'): if enough(message.text): bot.send_message(chat_id=message.chat.id, text="Ой, больно-то и хотелось!", parse_mode='Markdown') elif message.content_type == 'text' and message.text[ 0] != '/' and not text_exists: result = insert_condition(table='texts', values=(message.text, ), columns='(msg)') if result: bot.send_message( chat_id=message.chat.id, text="Я всё добавил, но если что, можно удалить.", parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text= "Хм, кажется, что-то не так с базой данных. Давай попробуем ещё раз.", parse_mode='Markdown', reply_to_message_id=message.message_id) elif text_exists: bot.send_message( chat_id=message.chat.id, text="Такой текст уже есть, давай попробуем ещё раз. ", parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text= 'Мы так не договаривались! Пришли фразу, пожалуйста, а не вот это вот всё :C', parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text='Прости, мама запрещает мне общаться с незнакомцами.', parse_mode='Markdown') bot.send_sticker( chat_id=message.chat.id, sticker= 'CAACAgIAAxkBAAIHmF41kWHKUfajjxb0umLKOG-EMWanAALwLgAC4KOCB2bcGHGkwKtzGAQ' ) bot.clear_step_handler(message)
def add_moder(message): moder_exists = select_condition('superusers', 'user_role', "login = '******'".format(msg=message.text)) role = check_superuser(login=message.from_user.username) if role in ('superuser', 'admin'): if enough(message.text): bot.send_message(chat_id=message.chat.id, text="Ой, больно-то и хотелось!", parse_mode='Markdown') elif message.content_type == 'text' and message.text[ 0] != '/' and not moder_exists: result = insert_condition(table='superusers', values=(message.text, "moder")) if result: bot.send_message( chat_id=message.chat.id, text= "Я добавил нового модератора, но если что, можно и удалить!", parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text= "Хм, кажется, что-то не так с базой данных. Давай попробуем ещё раз.", parse_mode='Markdown', reply_to_message_id=message.message_id) elif moder_exists: bot.send_message(chat_id=message.chat.id, text="А такой модератор уже есть, соряш-соряш.", parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text= 'Мы так не договаривались! Пришли фразу, пожалуйста, а не вот это вот всё :C', parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text='Прости, мама запрещает мне общаться с незнакомцами.', parse_mode='Markdown') bot.clear_step_handler(message)
def delete_moder(message): role = check_superuser(login=message.from_user.username) if role in ('superuser', 'admin'): moder_exists = select_condition( 'superusers', 'user_role', "login = '******'".format(msg=message.text)) if enough(message.text): bot.send_message(chat_id=message.chat.id, text="Ой, больно-то и хотелось!", parse_mode='Markdown') elif moder_exists: result = delete_condition( table='superusers', condition="login = '******'".format(msg=message.text)) if result: bot.send_message( chat_id=message.chat.id, text="Ну что ж, я отобрал его права. Теперь страдай.", parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text= "Хм, кажется, что-то не так с базой данных. Давай попробуем ещё раз.", parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text= "А такого модератора-то и нет, делай теперь с этим что хочешь!", parse_mode='Markdown', reply_to_message_id=message.message_id) else: bot.send_message( chat_id=message.chat.id, text='Прости, мама запрещает мне общаться с незнакомцами.', parse_mode='Markdown') bot.clear_step_handler(message)
def button(button): if button.data == 'Мне повезёт' or button.data in all_prices_dict.keys() or button.data == 'Любая стоимость': # здесь смотрим на юзерскую сессию если она есть user_session = {} user_session[button.message.chat.id] = select_condition('user_sessions', 'session', "user_id = '{}'" "and command = 'alcoholic'" .format(button.message.chat.id))[0][0] vine_condition = not_none_condition(user_session[button.message.chat.id]) if user_session[ button.message.chat.id] else '' if button.data in all_prices_dict.keys() and button.data != '> 20 000 р.': vine_condition += ' and price between {} and {}'.format(all_prices_dict[button.data][0], all_prices_dict[button.data][1]) elif button.data == '> 20 000 р.': vine_condition += 'and price > 20000' vines = select_random('imnotalcocholic', 'title, ' # 0 'kind, ' # 1 'alcohol, ' # 2 'country, ' # 3 'price, '# 4 'sugar, ' # 5 'type, ' # 6 'temperature, ' # 7 'old,' # 8 'compatibility, ' # 9 'taste, ' # 10 'link ', # 11 vine_condition, limit=3) message_text = [] # здесь составляем текст если первый вопрос был выбран или нет, то есть если мы знаем тип или нет if user_session[button.message.chat.id] and user_session[button.message.chat.id]['kind']: for vine in vines: # если тип выбран message_text += ['{title}. {alcohol}{type}{country}{price}{taste}{sugar}' '{temperature}{old}{compatibility}' .format(title='\n[{}]({})'.format(vine[0], vine[11]), alcohol='\nПроцент алкоголя: {}'.format(vine[2]) if vine[2] else '\nПроцент алкоголя не написали 😭', type='\nТип алкоголя: {}'.format(vine[6]) if vine[6] else '', country='\nСтрана происхождения: {}'.format(vine[3]) if vine[2] else '', price='\nСтоимость: {} р.'.format(vine[4]) if vine[4] else '', taste='\nВкус: {}'.format(vine[10]).replace("'", '') if vine[10] else '', sugar='\nСодержание сахара: {}'.format(vine[5]) if vine[5] else '', temperature='\nТемпература подачи: {}'.format(vine[7]) if vine[7] else '', old='\nВыдержка: {}'.format(vine[8]) if vine[8] else '', compatibility='\nСочетается с: {}'.format(vine[9]) .replace("'", '') .replace("'", '') if vine[9] and len(vine[9]) else '' )] message_for_send = 'Могу предложить тебе {}:\n\n{}.'\ .format(user_session[button.message.chat.id]['kind'].lower(), '\n'.join(message_text)) else: # если тип не выбран for vine in vines: message_text += ['{kind}: {title}. {alcohol}{type}{country}{price}{taste}{sugar}' '{temperature}{old}{compatibility}' .format(title='\n[{}]({})'.format(vine[0], vine[11]), kind=vine[1], alcohol='\nПроцент алкоголя: {}'.format(vine[2]) if vine[2] else '\nПроцент алкоголя не написали 😭', type='\nТип алкоголя: {}'.format(vine[6]) if vine[6] else '', country='\nСтрана происхождения: {}'.format(vine[3]) if vine[2] else '', price='\nСтоимость: {} р.'.format(vine[4]) if vine[4] else '', taste='\nВкус: {}'.format(vine[10]) if vine[10] else '', sugar='\nСодержание сахара: {}'.format(vine[5]) if vine[5] else '', temperature='\nТемпература подачи: {}'.format(vine[7]) if vine[7] else '', old='\nВыдержка: {}'.format(vine[8]) if vine[8] else '', compatibility='\nСочетается с: {}'.format(vine[9]) if vine[9] and len(vine[9]) else '' )] message_for_send = '***Могу предложить тебе***\n\n{}.'.format('\n\n'.join(message_text)) bot.edit_message_text(chat_id=button.message.chat.id, message_id=button.message.message_id, text=message_for_send, parse_mode='Markdown', disable_web_page_preview=True) # здесь удаляем наши знания о юзере из базы, нам это хранить ни к чему delete_condition('user_sessions', "user_id = '{}' and command = 'alcoholic'" .format(button.message.chat.id)) elif button.data in all_kinds: # здесь записываем в словарик вид алкоголя и спрашиваем его тип, # например цвет. Любой значит что вопросы будут продолжаться user_session = {} user_session[button.message.chat.id] = select_condition('user_sessions', 'session', "user_id = '{}'" "and command = 'alcoholic'" .format(button.message.chat.id))[0][0] user_session[button.message.chat.id] = {'kind': button.data} update_condition('user_sessions', "session = '{}'".format(json.dumps(user_session[button.message.chat.id])), "user_id = '{}'" "and command = 'alcoholic'".format(button.message.chat.id)) possible_types = select_condition(table='imnotalcocholic', column='type', condition=not_none_condition(user_session[button.message.chat.id]), distinct=True) alco_type = [] if possible_types[0]: alco_type = [i[0].replace(', ', ' - ') if i[0] and i[0] not in all_kinds else 'Любой тип' for i in possible_types] alco_type += ['Любой тип', 'Мне повезёт'] alco_type = set(alco_type) bot.edit_message_text(chat_id=button.message.chat.id, message_id=button.message.message_id, text='Ты выбрал {}.\nКакого типа?'.format(button.data), parse_mode='Markdown', reply_markup=keyboard(alco_type) ) elif button.data in all_types or button.data == 'Любой тип' or button.data.replace(' - ', ', ') in all_types: user_session = {} user_session[button.message.chat.id] = select_condition('user_sessions', 'session', "user_id = '{}'" "and command = 'alcoholic'" .format(button.message.chat.id))[0][0] # здесь записываем в словарик тип алкоголя и спрашиваем о стране if button.data == 'Любой тип': user_session[button.message.chat.id].update({'type': None}) else: user_session[button.message.chat.id].update({'type': button.data.replace(' - ', ', ')}) update_condition('user_sessions', "session = '{}'".format(json.dumps(user_session[button.message.chat.id])), "user_id = '{}'" "and command = 'alcoholic'".format(button.message.chat.id)) possible_country = select_condition(table='imnotalcocholic', column='country', condition=not_none_condition(user_session[button.message.chat.id]), distinct=True) country = [] if possible_country[0]: country = [i[0] if i[0] else 'Любая страна' for i in possible_country] country += ['Любая страна', 'Мне повезёт'] bot.edit_message_text(chat_id=button.message.chat.id, message_id=button.message.message_id, text='Ты выбрал {}, {}. \nИз какой страны?' .format(user_session[button.message.chat.id]['kind'], button.data), parse_mode='Markdown', reply_markup=keyboard(country) ) elif button.data in all_country or button.data == 'Любая страна': user_session = {} user_session[button.message.chat.id] = select_condition('user_sessions', 'session', "user_id = '{}'" "and command = 'alcoholic'" .format(button.message.chat.id))[0][0] # здесь записываем в словарик страну и узнаём ценовую категорию if button.data == 'Любая страна': user_session[button.message.chat.id].update({'country': None}) else: user_session[button.message.chat.id].update({'country': button.data}) update_condition('user_sessions', "session = '{}'".format(json.dumps(user_session[button.message.chat.id])), "user_id = '{}'" "and command = 'alcoholic'".format(button.message.chat.id)) possible_price = select_condition(table='imnotalcocholic', column='price', condition=not_none_condition(user_session[button.message.chat.id]), distinct=True) prices = [] if possible_price[0]: for price in possible_price: for all_price, all_price_list in all_prices_dict.items(): if all_price_list[0] <= price[0] < all_price_list[-1]: prices.append(all_price) elif price[0] > all_price_list[0] and all_price_list[-1] == all_price_list[0]: prices.append(all_price) else: prices.append('Любая стоимость') prices += ['Любая стоимость', 'Мне повезёт'] prices = set(prices) bot.edit_message_text(chat_id=button.message.chat.id, message_id=button.message.message_id, text='Ты выбрал {}, {}, {}. \nВ какой цене?' .format(user_session[button.message.chat.id]['kind'], user_session[button.message.chat.id]['type'] if user_session[button.message.chat.id]['type'] else 'Любой тип', button.data), parse_mode='Markdown', reply_markup=keyboard(prices)) else: bot.edit_message_text(chat_id=button.message.chat.id, message_id=button.message.message_id, text='Ой, что-то пошло не так. Давай попробуем ещё раз?\nНу пожалуйста-пожалуйста.🥺', parse_mode='Markdown')
for dict_key, dict_value in user_session_dict.items(): if dict_value: not_none_condition.append("{} = '{}'".format(dict_key, dict_value)) return ' and '.join(not_none_condition) def keyboard(buttons, width=2): keyb = types.InlineKeyboardMarkup(row_width=width) keyb.add( *[types.InlineKeyboardButton(text=name, callback_data=name) for name in buttons]) return keyb all_kinds = [i[0] for i in select_condition(table='imnotalcocholic', column='kind', distinct=True)] all_types = [i[0] for i in select_condition(table='imnotalcocholic', column='type', distinct=True)] all_country = [i[0] for i in select_condition(table='imnotalcocholic', column='country', distinct=True)] all_prices_dict = {'< 300 р.': [1, 300], '300 - 700 р.': [300, 700], '700 - 1200 р.': [700, 1200], '1 200 - 2 000 р.': [1200, 2000], '2 000 - 4 000 р.': [2000, 4000],
def parse_one_item(item_soup): a_tag = item_soup.find('a') href = a_tag.attrs.get('href') try: if 'wine' in href.split('/'): kind = 'Вино' elif 'shampanskoe-i-igristoe' in href.split('/'): kind = 'Шампанское' elif 'rom' in href.split('/'): kind = 'Ром' elif 'viski' in href.split('/'): kind = 'Виски' elif 'cognac' in href.split('/'): kind = 'Коньяк' elif 'likery' in href.split('/'): kind = 'Ликёр или настойка' elif 'vodka' in href.split('/'): kind = 'Водка' elif 'gin' in href.split('/'): kind = 'Джин' elif 'absent' in href.split('/'): kind = 'Абсент' elif 'aperitive' in href.split('/'): kind = 'Апперетиф' elif 'armanyak' in href.split('/'): kind = 'Арманьяк' elif 'brendi' in href.split('/'): kind = 'Бренди' elif 'grappa' in href.split('/'): kind = 'Граппа' elif 'kalvados' in href.split('/'): kind = 'Кальвадос' elif 'tequila' in href.split('/'): kind = 'Текила' elif 'voda' in href.split('/'): kind = 'Вода' elif 'sok' in href.split('/'): kind = 'Сок' else: kind = 'Неизвестно' title = a_tag.attrs.get('title').replace("'", '`') cur_soup = get_current_page(base_url + href) all_sets = cur_soup.find_all('div', attrs={'class': 'col-xs-6'}) price = cur_soup.find_all('div', attrs={ 'class': 'price' })[0].find('span').text if cur_soup.find_all( 'div', attrs={'class': 'price'}) else '0' item_dict = {} country, alco_type, sugar, temperature, grape, alcohol, compatibility, taste, old, alco_class, material, color, \ style, alco_filter, added, distillation = [None for i in range(0, 16)] for one_set in all_sets: title = title item = one_set.text.replace('\t', '').strip().split('\n') if item: if item[0] == 'Страна': country = item[-1].strip() if item[0] == 'Тип': alco_type = item[-1].strip() if item[0] == 'Сахар': sugar = item[-1].strip() if item[0] == 'Подача': temperature = item[-1].strip() if item[0] == 'Сорт винограда': grape = item[-1].strip() if item[0] == 'Алкоголь': alcohol = item[-1].strip() if item[0] == 'Сочетаемость': compatibility = ', '.join(item[1:-1]) if item else '' if item[0] == 'Вкус': taste = ', '.join(item[1:-1]) if item else '' if item[0] == 'Выдержка': old = item[-1].strip() if item[0] == 'Класс': alco_class = item[-1].strip() if item[0] == 'Материал' or item[0] == 'Сырье': material = item[-1].strip() if item[0] == 'Цвет': color = item[-1].strip() if item[0] == 'Стиль': style = item[-1].strip() if item[0] == 'Фильтрация': alco_filter = item[-1].strip() if item[0] == 'Добавки': added = item[-1].strip() if item[0] == 'Дистилляция': distillation = item[-1].strip() else: break item_dict.update({ 'title': title, 'country': country, 'type': alco_type, 'sugar': sugar, 'temperature': temperature, 'grape': grape, 'alcohol': alcohol, 'compatibility': compatibility, 'taste': taste, 'old': old, 'class': alco_class, 'material': material, 'color': color, 'style': style, 'filter': alco_filter, 'added': added, 'distillation': distillation, 'link': base_url + href, 'price': int(price.replace(' ', '')), 'kind': kind }) alcochol_exists = select_condition( 'imnotalcocholic', 'title', "title = '{title}'".format(title=title)) if alcochol_exists: items_list = [] for item_key, item in item_dict.items(): if item and item_key != 'price': items_list.append("{} = '{}'".format( item_key, item.replace("'", '`'))) elif item_key == 'price': items_list.append("{} = {}".format(item_key, item)) return update_condition( 'imnotalcocholic', # table ', '.join(items_list), # set "title = '{title}'".format(title=title)) # condition else: return insert_condition( 'imnotalcocholic', tuple(item_dict.values()), str(tuple(item_dict.keys())).replace("'", '')) except Exception as e: bot.send_message( chat_id=log_chat, text='Exception {} in alcomarket at parse_one_item func'.format(e)) traceback.print_exc()