Как позволить событию календаря 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() {}
});