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

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


person user1532146    schedule 03.05.2015    source источник


Ответы (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() {}
});
person Philipp Kewisch    schedule 04.05.2015
comment
Я пытался следовать руководству по SDK надстройки (developer.mozilla.org/ en-US / Add-ons / SDK / Tutorials /), я поместил вторую часть вашего кода как main.js в my-addon / lib /, а затем запустил cfx run и получил ошибку log: используйте «Компоненты» для доступа к полномочиям Chrome. Для этого вам нужно добавить строку примерно следующего вида: const {Cc, Ci} = require (chrome); - person user1532146; 07.05.2015
comment
Если вы замените 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
comment
Также обратите внимание, что SDK надстроек и инструмент cfx были написаны для Firefox. Хотя иногда это может работать для Thunderbird, я не думаю, что это действительно хороший опыт. Альтернативой является создание надстройки оверлея, которая очень хорошо работает с недостаток в том, что аддон не перезапускается. Вы также можете создать самонастраиваемый аддон, который находится где-то посередине. - person Philipp Kewisch; 08.05.2015