Ejemplo n.º 1
0
 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'
Ejemplo n.º 2
0
 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")})')
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
 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'
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
 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
Ejemplo n.º 10
0
 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('Первый запуск прошел успешно. Бот готов к работе!')