Бот-будильник для любого часового пояса
В этой статье мы расскажем о том как с помощью платформы Метабот вы можете создать чат-бот, который будет работать как будильник в любом мессенджере или социальной сети.
Бот позволяет пользователю запланировать напоминание на нужный день и время с помощью триггеров и послужит хорошей основной для ваших грандиозных проектов. В сочетании с API интеграцией это решение может иметь массу практичных применений, например, мониторинг систем с уведомлением на смартфон, формирование отчетов по расписанию, передача данных между системами. Все это платформа Метабота позволяет реализовать.
А еще этот бот примечателен тем, что умеет работать в любом часовом поясе. Вся сложность этого примера в основном связана с тем, что приходится рассчитывать время для запуска будильника относительно часового пояса сервера. Те кто создает бота, в котором необходима поддержка разных часовых поясов, найдут здесь много полезного.
Мы здесь опустим базовую информацию о том как создать бота, настроить маршруты и подключить бота к каналам. Для тех кто только начинает знакомиться с Метабот, рекомендуем ознакомиться с уроком Бот за 5 минут.
I. Создайте сценарий с уведомлениями, которые пользователь будет получать при срабатывании будильника
1. Команда «Выполнить JavaScript»
var randomStrings = [
«ПОРА ВСТАВАТЬ ?»,
«ПОДЬЕМ !!! ?»,
«КУКАРЕКУ ?»
];randomIndex = Math.ceil((Math.random()*randomStrings.length-1));
lead.setAttr(‘randomAnswer’, randomStrings[randomIndex]);
2. Команда «Отправить текст»
{{ $randomAnswer }}
II. Создайте триггер, который будем выполнять по заданию от пользователя
Назовите триггер «Уведомление о срабатывании будильника». Можете указать любое другое имя, но учтите, что мы позднее будем вызывать этот триггер из кода, обращаясь к нему по точному имени.
2. В поле «Запускаемый скрипт» выберите скрипт созданный ранее на этапе I.
III. Создайте скрипт «Запланировать будильник»
Этот скрипт будет содержать сценарий, в котором происходит следующее:
- Спрашиваем у пользователя его временной пояс, а также необходимость сдвига на летнее время
- Для установки будильника спрашиваем у пользователя день и время в его местном часовом поясе
- Алгоритм, который позволяет установить время для будильника с учетом времени сервера, на котором выполняется бот
- Планирование триггера, созданного на этапе II
1. Код расчета времени установки триггера с учетом временной зоны пользователя:
var dd = lead.getAttr(‘alarmDD’)*1; // + дней
var hh = lead.getAttr(‘alarmHH’)*1; // + часов
var mm = lead.getAttr(‘alarmMM’)*1; // + минут
var utc = lead.getAttr(‘utc’);
var summerTimeOffset = lead.getAttr(‘summerTimeOffset’);
var serverTimeOffset = 3; // Часовой пояс сервера (Москва) UTC(3)
var ms = 60 * 60 * 1000; // количеством миллисекунд в 1 часе//////////////////////////////////
// 1. Текущая дата и время относительно сервера (Москва), в миллисекундах
//////////////////////////////////var serverDatetime = new Date(Date.now());
var dateString =
serverDatetime.getFullYear() + «-» +
(«0» + (serverDatetime.getMonth()+1)).slice(-2) + «-» +
(«0″ + serverDatetime.getDate()).slice(-2) + » » +
(«0» + serverDatetime.getHours()).slice(-2) + «:» +
(«0» + serverDatetime.getMinutes()).slice(-2);lead.setAttr(‘serverDatetime’, serverDatetime);
lead.setAttr(‘serverDatetimeAsText’, dateString);/////////////////////////////////
// 2. Текущая дата и время пользователя по его местному часовому поясу
////////////////////////////////// Отнимаем сдвиг на московское время, чтобы привести все к UTC(0)
// И потом добавляем сдвиг на часовой пояс пользователя и летнее время
var currentLocalDatetime = new Date(
serverDatetime
— (serverTimeOffset * ms)
+ utc * ms
+ summerTimeOffset * ms
);dateString =
currentLocalDatetime.getFullYear() + «-» +
(«0» + (currentLocalDatetime.getMonth()+1)).slice(-2) + «-» +
(«0″ + currentLocalDatetime.getDate()).slice(-2) + » » +
(«0» + currentLocalDatetime.getHours()).slice(-2) + «:» +
(«0» + currentLocalDatetime.getMinutes()).slice(-2);lead.setAttr(‘currentLocalDatetime’, currentLocalDatetime);
lead.setAttr(‘currentLocalDatetimeAsText’, dateString);/////////////////////////////////
// 3. Расчитываем время будильника в часовом поясе пользователя
/////////////////////////////////var localAlarmDatetime = new Date (
currentLocalDatetime // текущее местное время
— currentLocalDatetime.getHours() * 60 * 1000 // отнимаем часы,
— currentLocalDatetime.getMinutes() // минуты
— currentLocalDatetime.getSeconds() // и cекунды, т.е. теперь это 00:00
+ 24 * dd * ms // добавляем дни, если надо
);// Устанавливем время будильника
localAlarmDatetime.setHours(hh);
localAlarmDatetime.setMinutes(mm);
localAlarmDatetime.setSeconds(0);dateString =
localAlarmDatetime.getFullYear() + «-» +
(«0» + (localAlarmDatetime.getMonth()+1)).slice(-2) + «-» +
(«0″ + localAlarmDatetime.getDate()).slice(-2) + » » +
(«0» + localAlarmDatetime.getHours()).slice(-2) + «:» +
(«0» + localAlarmDatetime.getMinutes()).slice(-2);lead.setAttr(‘localAlarmDatetime’, localAlarmDatetime);
lead.setAttr(‘localAlarmDatetimeAsText’, dateString);/////////////////////////////////
// 4. Расчитываем время будильника в часовом поясе сервера для установки триггера
/////////////////////////////////var d = new Date(
localAlarmDatetime
— utc * ms
— summerTimeOffset * ms
+ (serverTimeOffset * ms)
);var runTriggerAt =
d.getFullYear() + «-» +
(«0» + (d.getMonth()+1)).slice(-2) + «-» +
(«0″ + d.getDate()).slice(-2) + » » +
(«0» + d.getHours()).slice(-2) + «:» +
(«0» + d.getMinutes()).slice(-2) + «:00»;lead.setAttr(‘runTriggerAt’, runTriggerAt);
2. Код установки триггера
bot.runTriggerByNameForLead(‘Уведомление о срабатывании будильника’, lead.getData(‘id’), null, false, {
«run_at»: lead.getAttr(‘runTriggerAt’)
});
3. Сообщения для отладки
Время сервера: {{ $serverDatetime }}
Ваше местное время: {{ $currentLocalDateTimeAsText }}
Сдвиг часового пояса (UTC): {{ $utc }}
Сдвиг на летнее время: {{ $summerTimeOffset }}Запускаем триггер в (Серверное время): {{ $runTriggerAt }}
Надеемся, что эти примеры окажутся вам полезны!