Бот-будильник для любого часового пояса

В этой статье мы расскажем о том как с помощью платформы Метабот вы можете создать чат-бот, который будет работать как будильник в любом мессенджере или социальной сети.

Бот позволяет пользователю запланировать напоминание на нужный день и время с помощью триггеров и послужит хорошей основной для ваших грандиозных проектов. В сочетании с 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. Создайте скрипт «Запланировать будильник»

Этот скрипт будет содержать сценарий, в котором происходит следующее:

  1. Спрашиваем у пользователя его временной пояс, а также необходимость сдвига на летнее время
  2. Для установки будильника спрашиваем у пользователя день и время в его местном часовом поясе
  3. Алгоритм, который позволяет установить время для будильника с учетом времени сервера, на котором выполняется бот
  4. Планирование триггера, созданного на этапе 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 }}

 

Надеемся, что эти примеры окажутся вам полезны!