Как позволить событию календаря Thunderbird вызвать сценарий оболочки?

Мне нужно обновить статус мессенджера, когда в Thunderbird происходит событие календаря. Можно ли подключить существующую сигнализацию?

1 ответ

Решение

Хотите ли вы обновлять статус в любое время, когда происходит событие или срабатывает сигнал тревоги? К сожалению, для обоих вариантов нет встроенного способа. Вам нужно будет создать расширение, которое слушает соответствующие события и затем соединяется с вашим мессенджером.

В любое время есть событие

В идеале, было бы уведомление службы наблюдателей, когда событие происходит и когда оно заканчивается, но внутри мы еще не сталкивались с ситуацией, когда это нам было нужно. Это очень приятный запрос, поэтому если вы хотите добавить эту функцию в ядро, а затем использовать if из вашего расширения, пожалуйста, дайте мне знать.

В любом случае, один из способов справиться с этим - запускать таймер каждые 15 минут или около того, чтобы получать элементы из всех включенных календарей за текущее время. Когда таймер срабатывает, вы можете запрашивать события в текущее время из всех календарей. Для этого вам необходимо:

// Create a composite calendar
var composite = Components.classes["@mozilla.org/calendar/calendar;1?type=composite"]
                          .createInstance(Components.interfaces.calICompositeCalendar);

// Add all current calendars into the composite
var calendars = cal.getCalendarManager().getCalendars({});
for (let calendar of calendars) {
    if (!calendar.getProperty("disabled")) {
        composite.addCalendar(calendar);
    }
}

// In newer versions of Lightning you can use calAsyncUtils.jsm like this:
var pcal = cal.async.promisifyCalendar(composite);
var now = cal.now();
pcal.getItems(Components.interfaces.calICalendar.ITEM_FILTER_ALL_ITEMS, 0, now, now).then(function(items) {
   if (items.length) {
       // Something is going on right now
   } else {
       // Nothing is going on
   }
});

Если вы хотите улучшить это, вы можете при запуске получить следующее событие и соответственно установить интервал таймера. Таким образом, у вас не будет пустых таймеров и более точный результат.

Когда срабатывает сигнализация

Это намного проще. Вы можете прослушать службу сигнализации, чтобы определить, когда срабатывает сигнализация, и действовать в соответствии с ней.

cal.getAlarmService().addObserver({
    onAlarm: function(aItem, aAlarm) {
        // Alarm fired, update your messenger
    },
    onRemoveAlarmsByItem: function(item) {},
    onRemoveAlarmsByCalendar: function(calendar) {},
    onAlarmsLoaded: function() {}
});
Другие вопросы по тегам