【问题标题】:how to let thunderbird calender event trigger a shell script?如何让雷鸟日历事件触发shell脚本?
【发布时间】:2015-07-13 04:53:56
【问题描述】:

当 Thunderbird 中发生日历事件时,我需要更新信使的状态。可以hook现有的闹钟吗?

【问题讨论】:

    标签: thunderbird thunderbird-addon thunderbird-lightning


    【解决方案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
       }
    });
    

    如果您想对此进行改进,您可以在启动时获取下一个事件发生并相应地设置计时器间隔。这样您就不会运行空计时器并获得更准确的结果。

    当警报触发时

    这要简单得多。您可以收听alarm service 以确定警报何时触发并采取行动。

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

    【讨论】:

    • 我尝试按照插件 SDK 教程 (developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/…),将您的第二段代码作为 main.js 放在 my-addon/lib/ 下,然后运行“cfx run” ,我得到错误日志:使用“组件”访问 chrome 权限。为此,您需要添加类似于以下内容的一行: const {Cc,Ci} = require("chrome");
    • 如果在上面的示例中将Components.classes 替换为Cc 并将Components.interfaces 替换为Ci,则它可能适用于const {Cc,Ci,Cu} = require("chrome");。您还需要通过Cu.import("resource://calendar/modules/calUtils.jsm"); 来获取 cal。命名空间。最后一行也可能与 require() 一起使用。
    • 另请注意,附加组件 SDK 和 cfx 工具是为 Firefox 编写的。虽然它有时可能适用于 Thunderbird,但我认为它并不是一个非常棒的体验。另一种方法是创建一个overlay addon,它工作得很好,缺点是插件不是不重启。您还可以创建一个介于两者之间的bootstrapped addon
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多