def define_weekday(): """ Определяет день недели для использования расписания: стоит ли искать электрички среди тех, которые находятся на следующий день """ today = now().isoweekday() today_plus_1_hour = (now() + dt.timedelta(hours=1)).isoweekday() if today_plus_1_hour - today == 0: return 'today', return 'today', 'tomorrow'
def update_curriculum(self): """ Функция для потока обновления расписания каждые 6 часов """ with Lock(): while True: sleep(3600 * 6) if now().hour in (0, 1, 2): sleep(3600 * 3) self.buses_curriculum = BusesCurriculum() self.suburbans_curriculum = SuburbansCurriculum() self.last_update_time = now() print(f'Расписание обновилось. ({now().strftime("%H:%M:%S")})')
def make_request(station: str, is_from_odintsovo: bool, next_day: bool): """ Принимает на вход название станции station: str, информацией, направляется ли электричка из одинцово или нет is_from_odintsovo: bool, информацией, нужно ли искать расписание на следующий день Возвращает поезда в формате json """ stations = { 'Одинцово': 'c10743', 'Кунцево': 's9601728', 'Славянский бульвар': 's9876336', 'Фили': 's9600821', 'Беговая': 's9601666', 'Белорусский вокзал': 's2000006' } apikey = os.getenv('APIKEY_YANDEX') station_from = 'Одинцово' if is_from_odintsovo else station station_to = 'Одинцово' if not is_from_odintsovo else station today = now() if next_day: today += dt.timedelta(days=1) url = f'https://api.rasp.yandex.net/v3.0/search/?apikey={apikey}' \ f'&from={stations[station_from]}&to={stations[station_to]}' \ f'&date={now().date()}&format=json&limit=1000&lang=ru_RU&' \ f'system=yandex&show_systems=yandex' response = urlopen(url) data_from_response = response.read() encoding = response.info().get_content_charset('utf-8') json_data = json.loads(data_from_response.decode(encoding)) return json_data
def count_delta(transport): """ Принимает на вход объект класса Transport, считает, через сколько он приедет и строит грамматически верное словосочетание, возвращает словосочетание """ today = now() delta = abs((today.hour * 60 + today.minute) - (transport.departure_time.hour * 60 + transport.departure_time.minute)) if delta > 60: delta = 60 - delta % 60 if delta == 0: return ' – сейчас' elif delta == 60: add_delta = '1 час' elif 11 <= delta <= 19: add_delta = f'{delta} минут' elif delta % 10 == 1: add_delta = f'{delta} минуту' elif delta % 10 in [2, 3, 4]: add_delta = f'{delta} минуты' elif delta % 10 in [5, 6, 7, 8, 9, 0]: add_delta = f'{delta} минут' txt_delta = f' – через {add_delta}' return txt_delta
def add_user_data(self, command: str, user_id: int): """ Принимает на вход название команды бота command: str и telegram-id пользователя user_id: int и добавляет данные в базу данных со статистикой по использованию """ today = now().strftime('%d.%m.%Y') self.update_full_statistics(today, command) self.update_users_statistics(today, user_id)
def get_slavyanki(self, direction: str): """ Находит славянки на весь день """ current_time = now() weekday = self.define_weekday() relevant_buses = [] for bus in self[weekday][direction]: if bus.is_slavyanka and bus >= current_time: relevant_buses.append(bus) return relevant_buses
def define_weekday(): """ Определяет день недели для использования расписания: где искать автобусы на сегодня """ today = now().isoweekday() hour = now().hour if hour in (0, 1, 2): if today == 1: return 'sunday' elif today == 6: return 'weekday' elif today == 7: return 'saturday' else: if today in (1, 2, 3, 4, 5): return 'weekday' elif today == 6: return 'saturday' elif today == 7: return 'sunday'
def get_buses_for_hour(self, direction: str): """ Находит автобусы на ближайший час """ current_time = now() max_time = current_time + dt.timedelta(hours=1) weekday = self.define_weekday() relevant_buses = [] for bus in self[weekday][direction]: if current_time <= bus <= max_time: relevant_buses.append(bus) return relevant_buses
def get_suburbans_for_hour(self, direction: str): """ Находит электрички на ближайший час """ current_time = now() max_time = current_time + dt.timedelta(hours=1) current_weekdays = self.define_weekday() relevant_suburbans = [] for weekday in current_weekdays: for suburban in self[weekday][direction]: if current_time <= suburban <= max_time: if not self.is_suburban_already_exists( suburban, relevant_suburbans): relevant_suburbans.append(suburban) return relevant_suburbans
def __init__(self): """ При инициализации запускается первый запуск: установка расписания автобусов и электричек, запуск потока обновления расписания каждые 6 часов и подключение к базе данных """ print('Первый запуск...') self.buses_curriculum = BusesCurriculum() print('Расписание автобусов загружено...') self.suburbans_curriculum = SuburbansCurriculum() print('Расписание электричек загружено...') self.last_update_time = now() self.update_curriculum_thread = Thread(target=self.update_curriculum, name='update_curriculum_thread', daemon=True) self.update_curriculum_thread.start() print('Поток обновления расписания запущен...') self.database = DataBase() print('База данных подключена...') print('Первый запуск прошел успешно. Бот готов к работе!')