def set_second_airport(bot, update, user_data): text = update.message.text if text == '🔙Вернуться назад': city_ru, city_en = get_city(user_data['current_response'], 'ru_RU'), get_city( user_data['current_response']) airport_question(update, city_ru, city_en) return SET_SECOND_CITY_HANDLER elif text == '🔚Вернуться в меню': update.message.reply_text( 'Выберите одну из возможных функций для данного местоположения:', reply_markup=ReplyKeyboardMarkup(keyboard2)) return LOCATION_HANDLER else: response = geocoder_request(geocode=text, format='json') if check_response(response): user_data['city2'] = get_city(response, 'ru_RU') city_en = get_city(response) airports = airs.get(user_data['city2'], []) + airs.get(city_en, []) if not airports: update.message.reply_text( 'Введеный город не найден. Проверьте написание.') return SET_SECOND_AIRPORT_HANDLER update.message.reply_text( 'Выберите аэропорт прибытия:', reply_markup=ReplyKeyboardMarkup( [[elem[1] + ', ' + elem[0]] for elem in airports] + [['🔙Вернуться назад'], ['🔚Вернуться в меню']])) return FIND_FLIGHTS_HANDLER update.message.reply_text( 'Введеный город не найден. Проверьте написание.')
def weather(bot, update, user_data): text = update.message.text if text == '🌤Текущая погода': city, code = get_city(user_data['current_response']), get_country_code( user_data['current_response']) update.message.reply_text( get_current_weather( city, code, WEATHER_TOKEN, get_city(user_data['current_response'], 'ru-RU'))) elif text == '☔️Прогноз на 6 дней': city, code = get_city(user_data['current_response']), get_country_code( user_data['current_response']) update.message.reply_text( get_forecast_weather( city, code, WEATHER_TOKEN, get_city(user_data['current_response'], 'ru-RU'))) elif text == '🔙Вернуться назад': update.message.reply_text( 'Выберите одну из возможных функций для данного местоположения:', reply_markup=ReplyKeyboardMarkup(keyboard2)) return LOCATION_HANDLER
def parse_news(data): session = HTMLSession() print('getting page') city = '_'.join(get_city(data).split()) response = session.get(url.format(city)) if response: print('page gotten') html = response.html.find(selectors[0])[1] stories = html.find(selectors[1]) news = [] for story in stories: link = story.find('h2 > a')[0] title = link.text href = 'https://news.yandex.ru/story' + link.attrs['href'] try: text = story.find('div.story__text')[0].text except IndexError: continue news.append([title, text, href]) return news else: print('error while getting page, status code: {}'.format( response.status_code)) return None
def choosing_map_type(bot, update, user_data): query = update.callback_query bot.edit_message_text( chat_id=query.message.chat_id, message_id=query.message.message_id, text="[]({}){}".format( get_static_map(user_data, query.data), 'Карта для города ' + get_city(user_data['current_response'], 'ru-RU')), parse_mode='markdown', reply_markup=inline_maps)
def find_flights(bot, update, user_data): text = update.message.text if text == '🔙Вернуться назад': city_ru, city_en = get_city(user_data['current_response'], 'ru_RU'), get_city( user_data['current_response']) airport_question(update, city_ru, city_en) return SET_SECOND_CITY_HANDLER elif text == '🔚Вернуться в меню': update.message.reply_text( 'Выберите одну из возможных функций для данного местоположения:', reply_markup=ReplyKeyboardMarkup(keyboard2)) return LOCATION_HANDLER else: airport2 = text.split(', ')[-1] flights = get_flights(user_data['airport1'], airport2) if not flights: update.message.reply_text( 'Рейсов между указанными ранее аэропортами не найдено!') city_ru, city_en = get_city(user_data['current_response'], 'ru_RU'), get_city( user_data['current_response']) airport_question(update, city_ru, city_en) return SET_SECOND_CITY_HANDLER user_data['array'] = flights user_data['index'] = 0 user_data['length'] = len(flights) update.message.reply_text( 'Найдено рейсов для данного направления: {}'.format(len(flights)), reply_markup=ReplyKeyboardRemove()) update.message.reply_text( '[Данные предоставлены сервисом Яндекс.Расписания](http://rasp.yandex.ru/)', parse_mode='markdown') update.message.reply_text( flights[0], reply_markup=inline_sch_state1 if len(flights) > 1 else ReplyKeyboardMarkup(keyboard3))
def scrolling_flights(bot, update, user_data): print(user_data['array']) query = update.callback_query d = {0: inline_sch_state1, user_data['length'] - 1: inline_sch_state3} if query.data == '1': user_data['index'] = min(user_data['length'], user_data['index'] + 1) elif query.data == '2': user_data['index'] = max(0, user_data['index'] - 1) elif query.data == '3': bot.deleteMessage(chat_id=query.message.chat_id, message_id=query.message.message_id) city_ru, city_en = get_city(user_data['current_response'], 'ru_RU'), get_city( user_data['current_response']) airports = airs.get(city_ru, []) + airs.get(city_en, []) bot.sendMessage( text='Из какого аэропорта города {} вы хотите найти рейс?'.format( city_ru), chat_id=query.message.chat_id, reply_markup=ReplyKeyboardMarkup( [[elem[1] + ', ' + elem[0]] for elem in airports] + [['🔙Вернуться назад'], ['🔚Вернуться в меню']])) return SET_SECOND_CITY_HANDLER try: bot.edit_message_text(text=user_data['array'][user_data['index']], chat_id=query.message.chat_id, message_id=query.message.message_id, parse_mode='markdown', reply_markup=d[user_data['index']] if user_data['index'] in d else inline_sch_state2) except IndexError: if user_data['index'] < 0: user_data['index'] = 0 else: user_data['index'] = user_data['length'] - 1
def schedule(bot, update, user_data): text = update.message.text if text == '✈️Найти авиарейс': city_ru, city_en = get_city(user_data['current_response'], 'ru_RU'), get_city( user_data['current_response']) airports = airs.get(city_ru, []) + airs.get(city_en, []) if airports: airport_question(update, city_ru, city_en) return SET_SECOND_CITY_HANDLER else: update.message.reply_text('В заданном городе аэропорта не найдено') elif text == '🔙Вернуться назад': update.message.reply_text( 'Выберите одну из возможных функций для данного местоположения:', reply_markup=ReplyKeyboardMarkup(keyboard2)) return LOCATION_HANDLER
def location_handler(bot, update, user_data): text = update.message.text if text == '🗺Показать на карте': res = "[]({}){}".format( get_static_map(user_data), 'Карта для города ' + get_city(user_data['current_response'], 'ru-RU')) update.message.reply_text(res, parse_mode='markdown', reply_markup=inline_maps) elif text == '🗞Последние новости': news = parse_news(user_data['current_response']) if news is not None: user_data['array'] = news user_data['index'] = 0 user_data['length'] = len(news) update.message.reply_text( 'Найдено новостей в заданном городе: {}'.format(len(news)), reply_markup=ReplyKeyboardRemove()) update.message.reply_text( '*{0}*\n{1}\n[Подробнее:]({2})'.format(*news[0]), parse_mode='markdown', reply_markup=inline_news_state1) return NEWS_HANDLER else: update.message.reply_text('Новостей для этой местности не найдено') elif text == '🌧Погода': update.message.reply_text( 'Что вы хотите узнать о погоде в городе {}?'.format( get_city(user_data['current_response'], 'ru-RU')), reply_markup=ReplyKeyboardMarkup(keyboard4)) return WEATHER_HANDLER elif text == '🛩Расписания': update.message.reply_text('Выберите один из вариантов поиска:', reply_markup=ReplyKeyboardMarkup(keyboard5)) return RASP_HANDLER elif text == '💸Вакансии': try: data = geocoder_request(geocode=get_city( user_data['current_response']), format='json') city = get_city(data, 'ru_RU') region = list(region_suggest(city).items())[0][1] except: update.message.reply_text( 'Данный город не найден в базе данных HeadHunter.', reply_markup=ReplyKeyboardMarkup(keyboard2)) return LOCATION_HANDLER try: params = {'area': region} if user_data['vacancy']['keywords'] is not None: params['text'] = user_data['vacancy']['keywords'] user_data['vacancies_response'] = vacancies_request( **params)['items'] if len(user_data['vacancies_response']) == 0: update.message.reply_text( 'Для данного города не найдено ни одной вакансии.', reply_markup=ReplyKeyboardMarkup(keyboard2)) return LOCATION_HANDLER user_data['vacancies_index'] = 0 user_data['vacancies_image'] = 'logo' update.message.reply_text('Найдено несколько вакансий', reply_markup=ReplyKeyboardRemove()) _keyboard = [[ InlineKeyboardButton('Следующая вакансия▶️', callback_data=1) ], [InlineKeyboardButton('🗺Местоположение', callback_data=4)], [InlineKeyboardButton('🔙Назад', callback_data=3)]] if len(user_data['vacancies_response']) == 1: _keyboard.pop(0) reply = form_vacancy_reply(user_data) if reply['address'] == 'Адрес не указан': _keyboard.pop(1) update.message.reply_text( ( '*{title}*\n' '{experience}\n' '{address}\n' '[Подробнее:]({url})\n' '[]({image_url})' # EMPTY STRING IN BRACKETS ).format(**reply), parse_mode='markdown', reply_markup=InlineKeyboardMarkup(_keyboard)) return VACANCIES_HANDLER except Exception as e: logger.exception(e) elif text == '🔙Вернуться назад': update.message.reply_text( 'Введите город, информацию о котором Вы хотите узнать', reply_markup=ReplyKeyboardMarkup(keyboard3)) return SEARCH_HANDLER return LOCATION_HANDLER