如何让thunderbird日历事件触发shell脚本?

时间:2015-05-03 21:03:56

标签: thunderbird thunderbird-addon thunderbird-lightning

当Thunderbird中发生日历事件时,我需要更新信使的状态。是否可以挂钩现有的警报?

1 个答案:

答案 0 :(得分:0)

您是否希望在发生事件或警报触发时更新状态?不幸的是,两种选择都没有内置方式。您必须创建一个监听相应事件的扩展,然后与您的信使连接。

任何时候有事件

理想情况下,当事件正在进行和结束时会有观察员服务通知,但在内部我们没有遇到我们需要这个的情况。这是一个非常好的功能请求,所以如果你想将这个功能添加到核心,然后使用你的扩展名,请告诉我。

无论如何,处理此问题的一种方法是每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
   }
});

如果你想改进这一点,你可以在启动时获得下一个事件,并相应地设置定时器间隔。这样,您就没有空的计时器运行和更精确的结果。

当警报触发时

这简单得多。您可以收听alarm service以确定警报何时触发并对其进行操作。

cal.getAlarmService().addObserver({
    onAlarm: function(aItem, aAlarm) {
        // Alarm fired, update your messenger
    },
    onRemoveAlarmsByItem: function(item) {},
    onRemoveAlarmsByCalendar: function(calendar) {},
    onAlarmsLoaded: function() {}
});