Мне нужно обновить статус мессенджера, когда в 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() {}
});
Components.classes
на Cc
и Components.interfaces
на Ci
в приведенных выше примерах, это может работать с const {Cc,Ci,Cu} = require("chrome");
. Вам также нужно будет сделать Cu.import("resource://calendar/modules/calUtils.jsm");
, чтобы получить кал. пространство имен. Эта последняя строка также может работать с require ().
- person Philipp Kewisch; 08.05.2015