- bjelkeman
- Medlem ●
I iChat så kan man sätta custom Alerts när något händer. T.ex. en "buddy" blir tillgänglig online. Om man höger klickar på en "buddy" och gör "Show info" så på."Alerts" tabben så kan man välja "Announce when event occurs". Men det är en ganska lång harrang som kommer ut då. Jag ville ha något lite kortare. Jag skrev ett pyttelitet Applescript som ser ut som följer:
do shell script "say Fred is online"
Kör man den vid ett "event" m.a.o. ha det valt med "Run AppleScript", så spelas rätt ljud upp, men man får ett felmedelande som säger:
AppleScript Event Handler Error AN error occured while executing an AppleScript event handler. Event: Buddy Becomes Available Buddy: Fred File: Fred is online.scpt Error: Error -1708
Som verkar vara ett: "errAEEventNotHandled -1708 Script context doesn't contain handler for event"
OSADoEvent(IM:IC)
i ScriptEditor när man testkör detta script, då blir resultatet:
tell current application do shell script "say Fred is online" "" end tell
Jag gissar att utmatningen av en (tom?) sträng som visas som "" förmodligen är det "event" som 1708 felmeddelandet klagar på. Eftersom Applescriptet inte tar hand om det.
Hur tar man hand om detta så att jag inte får ett felmeddelande? Jag är en glad amatörscriptare och vore jätteglad om man fick ett tips av någon.
Tack!
Jag förstår inte riktigt varför du går via shell.
Är det inte bättre att använda enbart applescript:
say "say Fred is online"
Eller har jag missat nåt?
Annars kan du kanske testa att escape:a citattecknet:
do shell script \"say Fred is online\"
Vilken version av iChat är det där? I Min iChat (3.1.9 / OS X 10.4.11) så har jag tom en ruta där det står "Läs upp text" och där kan man skriva en text som man vill iChat skall läsa upp när händelsen inträffar.
Felet i ditt script är förmodligen att du adresserar ditt kommando till fel program, den missen har jag gjort 1000 gånger...
Du har
tell current application <--- Alltså iChat
do shell script "say Fred is online" <--- Vet iChat hur man gör ett "do shell script"?
Varför inte helt enkelt skippa ditt tell-kommando? och bara behålla raden "do shell script..."
Tips till nybörjare i Applescript - tänk dig varje applikation som någon typ av hantverkare, en kan måla, en kan flytta tegelstenar, en annan kan snickra, en annan kan bygga bilar osv... När du använder "tell application" så tänk dig att du står i en cirkel av alla dina hantverkare och du vänder dig mot en av dem och ber dem göra något. Man måste alltså tänka på att inte be målaren att snickra, och han som flyttar tegelstenar att bygga bilar osv...
Förresten, om du vill göra en annan fiffig grej med iChat, Adium och Skype som är att via Appelscript sätta samma statusmeddelande i alla tre, så kolla denna tråd:
http://www.99.se/applescript/229460-applescript-s-tter-samma-status-i-skype-i-ichat.html
Tips till nybörjare i Applescript - tänk dig varje applikation som någon typ av hantverkare, en kan måla, en kan flytta tegelstenar, en annan kan snickra, en annan kan bygga bilar osv... När du använder "tell application" så tänk dig att du står i en cirkel av alla dina hantverkare och du vänder dig mot en av dem och ber dem göra något. Man måste alltså tänka på att inte be målaren att snickra, och han som flyttar tegelstenar att bygga bilar osv...
Mycket bra analogi! Är även imponerad av dina andra svar i den här tråden, mycket pedagogiska och hjälpsamma!
Bra fråga. (Svar jag visste inte att "say" fanns i Applescript).
Jag har nu ett Applescript som säger
say "Fred is online"
men jag får fortfarande samma felmeddelande.
Om man escapar citattecknen i shellscriptet så får man
Expected “given”, “in”, “of”, expression, “with”, “without”, other parameter name, etc. but found unknown token.
Du måste "escapa" ett citattecken och behålla ett för att inuti applescript (som behöver citattecken för att innesluta do shellscriptkommandot och ett till som kommandot i shell vill ha...
do shell script "say \"Fred is online\""
@Taz_1999 Event loggen för det när det är "escapat" som du säger blir likadan som tidigare. Men det verkar som AppleScript fixade biffen vilket som, Applescript gör rätt men det verkar som iChat inte klarar att köra det hela utan error, shell script eller bara Applescript.
Ok, men är iChat "current application" då? Om du jobbar i Photoshop tex och din kompis kommer online, vet Photoshop, som blir måltavla för ditt tell, hur man gör en say blablabla?
Varför inte faktiskt styra ditt kommando och då faktiskt lägga till en tell som innebär att du verkligen vänder dig till rätt "hantverkare" och ber denne göra något specifikt?
tell application "System Events"
say "Fred is online"
end tell
Tack Taz_1999.
Gjorde som du sade, men det blev fortfarande samma fel.
Så för att inte ni skall behöva bugfixa mitt dåliga script och utbilda mig hela dagen så gjorde jag på ett annat sätt.
Man kan lägga till vilka ljudfiler som helst som skall spelas när ett "event" händer. Så jag skapade en "Fred is online" fil med
say -o fred.aiff fred is online
i terminalen och lade det på rätt ställe. Sedan kan iChat säga att Fred är online.
Tack för hjälpen båda två, jag lärde mig flera saker om AppleScript i dag!
Tack för hjälpen båda två, jag lärde mig flera saker om AppleScript i dag!
Varsågod! Det är inte alla som säger tack.
Vill du lära dig mera, så har jag en site om Applescript, man kan lära sig en del av kommentarerna i de script jag publicerat, länkarna mm.
Applescript-tips från Intelligent Mammals AB - Home (tvåspråkig)
Eller ställen fråga här i forumet förstås. Flera riktigt duktiga Applescriptare svarar på frågor här.
Try say "Fred is online" end try
Då verkar det som att det inte ett AppleScript-fel, utan ett fel i iChat. Nu använder jag dock vare sig iChat eller Leopard så jag kan inte testa
Tack för berömmet. Roligt att höra.
En annan analogi jag använder mig av är bokhylla för att likna heriarkier i olika program. Man måste säga rätt sak till rätt grej även inom heriarkin inuti programmet, man kan inte säga till bokhyllan som helhet, "ge mig texten", man måste säga till tredje sidan i fjärde boken i femte hyllan i bokhyllan "ge mig texten", för att det är sidan som förstår kommandot, inte boken, inte hyllan, inte bokhyllan. Denna liknelse fungerar med tex Finder och mappar, den funkar med objekt i Indesign, den fungerar med fält i FileMaker Pro databaser osv osv.
För att faktiskt försöka lösa problemet utan att skapa en massa onödiga ljudfiler tycker jag du borde testa det här skriptet:
using terms from application "iChat" on buddy became available theBuddy set buddyName to name of theBuddy say buddyName & "is now available." end buddy became available end using terms from
Det funkar finfint här. Sätter du det på en viss kontakt läser den upp den kontaktens namn när denne loggar in, annars kan du sätta det globalt på alla kontakter i Preferences.
För att förklara varför ditt andra skript inte funkade så beror det på att iChat vill att skripten ska fånga visa events som det skickar. Med andra ord, när någon loggar in så kör iChat ditt skript och berättar för det att någon har loggat in. För att allt ska fungera måste det finnas något i ditt skript som "lyssnar" på just det här, annars blir iChat på dåligt humör och slänger upp sina dumma 1708 fel.
I vårt skript är det "on buddy became available" biten som iChat anropar när skriptet körs så som du vill. Utan det går allt fel eftersom iChat anropar något som inte existerar.
Det finns en hel drös med sådana events i iChat, lättaste sättet att utforska dem är att öppna iChat som en Dictionary i Script Editor. Starta Script Editor och gå till File->Open Dictionary->iChat, kolla sen under "iChat Event Handler Suite". Ett annat tips när du ändå är inne i Dictionaryn är att ta en titt på vad objektet buddy innehåller (finns i "iChat Event Suite"),. Bland annat kan du få reda på deras status, statusmeddelande, för & efternamn och lite annat.
Bättre sent än aldrig
shandar: Sweet, det förklarade en hel del det där.
Kan också tillägga att "iChat Event Handler Suite" inte finns i den iChat som medföljer OS X 10.4.x, så ni som har 10.5 kan följa instruktionera ovan.
Men det måste ju finnas något liknande? Vad händer om du kör det här skriptet i 10.4?
Shandar: Jag har inte testat, men eftersom kommandot inte finns så går scriptet förmodligen inte att kompilera. Apple har alltså i den senare version av iChat lagt till funktioner i Applescript-stödet.
bjelkeman: Varför tar du inte och öppnar ordlistan för ichat och kollar vad det kan heta? Starta manusredigeraren > Arkiv > Öppna ordlista > iChat. Det finns sökruta mm. Enjoy!