Как получить событие _received_ iCal для запуска сценария? - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь написать Applescript, который будет выполнять исходящий звонок Skype в моменты времени, запланированные получено приглашений от других сторон.

Я думаю, что я в порядке со сценарием дляAPI Skype для совершения звонка, однако я борюсь с iCal любым из способов

A) заставить скрипт работать в фоновом режиме и получить время всех новых событий, или

B) получение оповещения о событии для запуска одноразового скрипта.

Проблема с вариантом B) заключается в том, что, хотя вы можете устанавливать события из iCal так, чтобы оповещение запускало скрипт, мне нужно вызвать его изсобытия, которые были получены.

Типичным примером будет:

  • Все сценарии и iCal, запущенные на хосте
  • В 10:00 пользователь планирует событие (черезgoogle cal на портативном устройстве) на 3 часа дня * и приглашает Хоста.
  • В 15:00 скрипт на Хосте использует Skype API для совершения звонка Пользователю.

** это также может быть на свидании вбудущее и требования остаются в силе.

Большое спасибо за любые советы!

1 Ответ

2 голосов
/ 24 февраля 2012

Поскольку iCal не имеет никаких уведомлений (некоторые приложения, например, iChat), вам придется запустить приложение «оставайтесь открытым» appleScript. Нечто подобное сделает это для вашего сценария "B". ПРИМЕЧАНИЕ: вам нужно будет добавить путь к вашему яблочному файлу (тот, который делает ваш звонок в Skype) в переменную яблочный скрипт.

При запуске он получит список всех событий календаря, которые есть в iCal. Затем он будет запускаться каждые 5 минут. Когда он запускается, он сверяет текущие события со списком событий, которые он первоначально сделал. Если есть новые события, то ваш яблочный скрипт будет добавлен в качестве тревоги для новых событий. Таким образом, он отслеживает текущие события между запусками и находит только новые.

Так что этот скрипт должен быть хорошей отправной точкой для вас. Не забудьте сохранить его как открытое приложение appleScript. Вы, вероятно, захотите изменить его. Например, у меня есть проверка каждого календаря на наличие новых событий, но у вас может быть один конкретный календарь, на который вы хотите настроить таргетинг. Удачи.

property storedUIDs : {} -- we use this to check for new events, if an event is not in this list then it is new

global applescriptPath

on run
    set applescriptPath to (path to desktop as text) & "myAlarm.scpt" -- the path to the applescript which is run as the alarm
end run

on idle
    set newEvents to {}
    tell application "iCal"
        set theCals to calendars
        set allUIDs to {}
        repeat with aCal in theCals
            tell aCal
                set theseEvents to events
                repeat with anEvent in theseEvents
                    set thisUID to uid of anEvent
                    set end of allUIDs to thisUID
                    if thisUID is not in storedUIDs then
                        set end of newEvents to contents of anEvent
                    end if
                end repeat
            end tell
        end repeat
        set storedUIDs to allUIDs

        if (count of newEvents) is less than 5 then -- this will prevent the first run of the script from adding the alarm to every event
            repeat with aNewEvent in newEvents
                -- do something with this new events like add an alarm to run an applescript
                set theAlarm to make new open file alarm at end of open file alarms of aNewEvent with properties {trigger interval:0, filepath:POSIX path of applescriptPath}
            end repeat
        end if
    end tell

    return (5 * 60) -- run every 5 minutes
end idle

on quit
    set storedUIDs to {}
    continue quit
end quit
...