@pcdesign

Как распарсить GotoIfTime из астериска?

В Астериске используется GotoIfTime, чтобы проверять попадет ли звонок в нужное время или нет.
Например.
GotoIfTime(09:00-17:59,mon-fri,*,*?open,s,1)
Рабочие дни с 9 до 6 вечера.
Или GotoIfTime(09:00-11:59,sat,*,*?open,s,1)
С 9 до 12, в субботу.
Как это распарсить это в pythоn и сравнить попадает ли текущее время в этот диапазон?
  • Вопрос задан
  • 32 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Регулярное выражение вида
GotoIfTime\((?P<from>\d+:\d+)-(?P<to>\d+:\d+),(?P<days>[a-z-]+),\*,\*\?open,s,1\)
извлечёт из строки нужные части. Их можно будет вытащить так:
regexp = re.compile(r'GotoIfTime\((?P<from>\d+:\d+)-(?P<to>\d+:\d+),(?P<days>[a-z-]+),\*,\*\?open,s,1\)', re.I)
m = regexp.match('GotoIfTime(09:00-17:59,mon-fri,*,*?open,s,1)')
if m:
    print(m.group('days'), m.group('from'), m.group('to'))

Для работы с датами datetime ну и просто работа со строками. C днём недели можно будет справиться как-то так:
now = datetime.datetime.now()
weekday = now.weekday()
days = m.group('days').lower()
days_of_week = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']  # datetime.datetime.weekday()
if '-' in days:  # диапазон
    dfrom, _, dto = days.partition('-')
    dfrom, dto = days_of_week.index(dfrom), days_of_week.index(dto)
    if dfrom <= dto:  # обычный кейс, вроде mon-fri
        day_is_good = dfrom <= weekday <= dto
    else:  # на случае если нужно зацикливание вида fri-tue
        day_is_good = (weekday >= dfrom) or (weekday <= dto)
else:  # один день, не диапазон
    dow = days_of_week.index(days)
    day_is_good = weekday == dow
print(day_is_good)  # True или False


С временем тоже несложно, разбиваешь через partition() по двоеточию, преобразуешь в целое, потом делаешь datetime.datetime.now().replace(hour=h, minute=m) и получаешь указанное время в текущий день.

Таким образом у тебя будет два момента времени, один на базе from другой на базе to. Их можно просто сравнить с текущим: if from <= now <= to:
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы