如何让雷鸟日历事件触发 shell 脚本?
how to let thunderbird calender event trigger a shell script?
当 Thunderbird 中发生日历事件时,我需要更新 Messenger 状态。是否可以hook现有的闹钟?
您想在有事件或警报响起时随时更新状态吗?不幸的是,对于这两个选项,都没有内置的方式。您必须创建一个扩展程序来监听相应的事件,然后与您的 Messenger 连接。
任何时候有活动
理想情况下,当事件正在进行和结束时会有一个观察者服务通知,但在内部我们还没有遇到需要这个的情况。这是一个非常好的功能请求,所以如果您想将此功能添加到核心,然后从您的扩展中使用,请告诉我。
无论如何,处理此问题的一种方法是 运行 每 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
}
});
如果您想对此进行改进,您可以在启动时让下一个事件发生并相应地设置计时器间隔。这样你就没有空计时器 运行s 和更准确的结果。
警报响起时
这要简单得多。您可以收听 alarm service 以确定警报何时触发并采取行动。
cal.getAlarmService().addObserver({
onAlarm: function(aItem, aAlarm) {
// Alarm fired, update your messenger
},
onRemoveAlarmsByItem: function(item) {},
onRemoveAlarmsByCalendar: function(calendar) {},
onAlarmsLoaded: function() {}
});
当 Thunderbird 中发生日历事件时,我需要更新 Messenger 状态。是否可以hook现有的闹钟?
您想在有事件或警报响起时随时更新状态吗?不幸的是,对于这两个选项,都没有内置的方式。您必须创建一个扩展程序来监听相应的事件,然后与您的 Messenger 连接。
任何时候有活动
理想情况下,当事件正在进行和结束时会有一个观察者服务通知,但在内部我们还没有遇到需要这个的情况。这是一个非常好的功能请求,所以如果您想将此功能添加到核心,然后从您的扩展中使用,请告诉我。
无论如何,处理此问题的一种方法是 运行 每 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
}
});
如果您想对此进行改进,您可以在启动时让下一个事件发生并相应地设置计时器间隔。这样你就没有空计时器 运行s 和更准确的结果。
警报响起时
这要简单得多。您可以收听 alarm service 以确定警报何时触发并采取行动。
cal.getAlarmService().addObserver({
onAlarm: function(aItem, aAlarm) {
// Alarm fired, update your messenger
},
onRemoveAlarmsByItem: function(item) {},
onRemoveAlarmsByCalendar: function(calendar) {},
onAlarmsLoaded: function() {}
});