Example #1
0
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'
                         )
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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')
Example #6
0
    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],
Example #7
0
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()