Archive for the 'Colloguy(IRC client)' Category

2013/09/08 IRC Client「Colloguy」をAppleScriptでコントロール(3)

IRCクライアント「Colloguy」をAppleScriptからコントロールするシリーズの続きです。

サーバーに接続して、チャットルームにログイン、退出、チャットルーム中のユーザー情報の取得などをAppleScriptから行えるようになりました。

ログイン中のチャットルームに発言する処理を試してみましょう。

col9.png

col10.png

スクリプト名:Colloguyでメッセージ送信テスト
set sendM to ” testing “

tell application “Colloquy”
  tell front window
    tell active panel
      repeat 10 times
        set sendM to “(” & sendM & “)”
        
send message sendM
      end repeat
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

しかし、いろいろ試していますが、チャットルーム中の会話内容(message)を取得できていません。

Colloguyの「Chat Plug-in Suite」を見てみると、いろいろできそうではありますが、もうちょっと試行錯誤が必要なようです。

collo11.png

2013/09/08 IRC Client「Colloguy」をAppleScriptでコントロール(2)

IRCクライアント「Colloguy」をAppleScriptからコントロールするシリーズの続きです。

なんでもAppleScriptからできそうな雰囲気がありつつ、けっこうサポート機能がまばらなColloguyのコントロールをためしてみます。

初期設定、とくにサーバー登録をGUI側から手で行っておく必要があるので、済ませておきます。

col4.png

とりあえず、この「irc.livedoor.ne.jp」のサーバーにAppleScriptから接続してみましょう。そのためには、「irc.livedoor.ne.jp」のサーバーを登録してあるconnectionのIDを調べる必要があります。

簡単に「connect “irc.livedoor.ne.jp”」と実行すればつながるように作っておけばよいものを、アプリに登録してあるconnectをすべて調べて、その中に指定名称(server address)が合致するものがあるかどうかをすべて調査する必要があります。

スクリプト名:ColloquyでIRCの指定サーバーに接続
set cID to retIRCconnectionByName(“irc.livedoor.ne.jp”) of me
if cID = false then return

tell application “Colloquy”
  connect connection cID
end tell

–指定サーバーのConnection IDを取得する
on retIRCconnectionByName(aName)
  tell application “Colloquy”
    set cCount to count every connection
    
    
repeat with i from 1 to cCount
      tell connection i
        set aP to properties
        
set aSt to (server address of aP) as string
        
if aSt = aName then
          return i
        end if
      end tell
    end repeat
    
    
return false
    
  end tell
end retIRCconnectionByName

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

これを実行すると、

col5.png

画面上でも、コネクションが成立したことが確認できます。

次に、チャットルームへの参加。なぜか「#test」への参加が承認制(先にチャットルームを作成した人がそのように宣言したのだろうか)になっていたので、乱数で名前を指定してたぶんぶつからないはずのチャットルームを作って参加してみましょう。

col6.png

スクリプト名:Colloguyで指定のチャットルームに入室する
set cList to retActiveIRCconnection() of me
set cID to contents of first item of cList

set randDnum to random number from 10000 to 99999
set rStr to randDnum as string
set chatRoom to “#test” & rStr

tell application “Colloquy”
  try
    set aRes to join chat room chatRoom on connection cID
  end try
end tell

–activeなIRC connectionのIDを返す。なければヌルのリストが返る
on retActiveIRCconnection()
  tell application “Colloquy”
    set cCount to count every connection
    
set cList to {}
    
    
repeat with i from 1 to cCount
      tell connection i
        set aP to properties
        
set aSt to (status of aP) as string
        
if aSt = “connected” then
          set the end of cList to i
        end if
      end tell
    end repeat
    
    
return cList
    
  end tell
end retActiveIRCconnection

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

この状態で、接続したチャットルームから退室するAppleScriptのコマンドを探してみたのですが…………そういう命令はありません。GUI上からはできるのですが、AppleScriptにはそういう機能は解放されていません。

となると、特定のチャットルームから退出するのではなく、サーバーとのコネクションそのものを切断するしかありません。

col7.png

スクリプト名:Colloquyですべてのサーバーとのconnectionを切断する
tell application “Colloquy”
  disconnect every connection
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

コネクションを切断したままでは、チャットウィンドウが閉じないので明示的に命令してあげる必要があります。

スクリプト名:Colloguyですべてのウィンドウを閉じる
tell application “Colloquy”
  close every window
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

チャットルームの詳細な情報収集は行えます。

スクリプト名:ColloguyでIRCチャットルームのプロパティを取得する
tell application “Colloquy”
  tell connection 1
    tell chat room “#test”
      
      
properties
      
–> {URL:”irc://irc.livedoor.ne.jp/%23test”, encoding:UTF8, display name:”test”, date parted:missing value, date joined:date “2013年9月3日火曜日 19:12:57″, banned users:{}, id:”#test”, joined:true, attributes:{}, name:”#test”, class:chat room}
      
    end tell
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

さらに、指定チャットルームに参加しているユーザーのプロパティを取得することも可能です。

col8.png

指定チャットサーバーのうち、ユーザーが多い方のチャットルーム情報を調べておいて(このあたり、AppleScriptからできないと意味なさそうですが)、プログラムで指定して自動ログインしてユーザー情報をすべて取得してみます。

スクリプト名:Colloguyでconnection IDとチャットルーム名で指定したチャットルームのユーザー情報をすべて収集する
set targRoom to “#そして輝くフリッグソウッ”

set cList to retActiveIRCconnection() of me
if cList = {} or cList = false then
  display dialog “No Connection”
  
return
end if
set cID to contents of first item of cList

tell application “Colloquy”
  try
    set aRes to join chat room targRoom on connection cID
  end try
end tell

delay 3

set aList to getDataListByConnectIDandChatRoom(cID, targRoom) of me
return aList

–connection IDとチャットルーム名で指定したチャットルームのユーザー情報をすべて収集する
on getDataListByConnectIDandChatRoom(cID, chatRoomName)
  
  
tell application “Colloquy”
    tell connection cID
      tell chat room chatRoomName
        set cList to every chat user
        
set resList to {}
        
        
repeat with i in cList
          set j to contents of i
          
          
tell j
            try
              set aName to name
              
set aName to aName as string
            on error
              set aName to “”
            end try
            
–> “maro”
            
            
try
              set rName to real name
              
set rName to rName as string
            on error
              set rName to “”
            end try
            
–> “Takaaki Naganoya”
            
            
try
              set dName to display name
              
set dName to dName as string
            on error
              set dName to “”
            end try
            
–> “maro”
            
            
try
              set uName to user name
              
set uName to uName as string
            on error
              set uName to “”
            end try
            
–> “maro”
            
            
try
              set anAddress to address
              
set anAddress to anAddress as string
            on error
              set anAddress to “”
            end try
            
–> “KDxxxxxxxxxxxxxxxx.ppp-bb.dion.ne.jp”
            
            
try
              set sAddress to server address
              
set sAddress to sAddress as string
            on error
              set sAddress to “”
            end try
            
–> “irc.livedoor.ne.jp”
            
            
try
              set iTime to idle time
            on error
              set iTime to 0
            end try
            
–> 232.0
            
            
try
              set uDate to date updated
              
set uDate to uDate as string
            on error
              set uDate to “”
            end try
            
–> date “2013年9月3日火曜日 17:33:42″
            
            
try
              set cDate to date connected
              
set cDate to cDate as string
            on error
              set cDate to “”
            end try
            
–> date “2013年9月3日火曜日 19:08:17″
            
            
try
              set dDate to date disconnected
              
set dDate to dDate as string
            on error
              set dDate to “”
            end try
            
            
try
              set aStatus to status
              
set aStatus to aStatus as string
            on error
              set aStatus to “”
            end try
            
–> available
            
            
try
              set aMes to away message
              
set aMes to aMes as string
            on error
              set aMes to “”
            end try
            
          end tell
          
          
set the end of resList to {aName, rName, dName, uName, anAddress, sAddress, iTime, uDate, cDate, dDate, aStatus, aMes}
          
        end repeat
      end tell
    end tell
  end tell
  
  
return resList
  
end getDataListByConnectIDandChatRoom

–activeなIRC connectionのIDを返す。なければヌルのリストが返る
on retActiveIRCconnection()
  tell application “Colloquy”
    
    
set cCount to count every connection
    
set cList to {}
    
    
repeat with i from 1 to cCount
      tell connection i
        set aP to properties
        
set aSt to (status of aP) as string
        
if aSt = “connected” then
          set the end of cList to i
        end if
      end tell
    end repeat
    
    
return cList
    
  end tell
end retActiveIRCconnection

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

ユーザー情報の属性値のうち、取得するとエラーになるものがいくつかあるので、慎重にエラートラップを仕掛けつつひとつずつ属性値を取得する必要があります(ちょっと前までのiTunesみたいだ、、、)。

2013/09/08 IRC Client「Colloguy」をAppleScriptでコントロール(1)

マンガ「王様達のヴァイキング」(さだやす著)を読んで、「そういえば、すごい昔にIRCってあったな。まだ残ってたのか」と思い出し、IRCをAppleScriptから攻めてみることにしました(大人の自由研究)。

IRCはインターネット上で利用できる文字ベースのチャットソフトおよびその仕組みのことで、1988年以来25年ぐらいの歴史があります。90年代のインターネットブームの際にちょこっと使った覚えがありますが、もうちょっとカジュアルな「ICQ」にユーザーが流れたりして(現在ではTwitterとか)あまり「旬」のアプリではない印象があります。世間的な認知度もそんなところでしょう。

IRCのインフラ自体は、現在も維持されているため、IRC clientのアプリを用意するなり、Terminal経由で接続すれば現在でも使えます。

Mac AppStore上で「IRC」をキーワードに検索すると、無料/有料のアプリが9件ほど見つかります。これらのうち、どれにも「AppleScript対応」の表記はなされていないので、昔から存在しているAppleScript対応のIRCクライアント「Colloguy」を久しぶりにダウンロード。

col1.png

ColloguyはIntel 64bit対応でOS X 10.8上でも問題なく動作します。昔から、ColloguyがAppleScript対応していることは知っていたのですが、オンラインドキュメントが絶望的によくなくて、読めば読むほど分らなくなる仕組みになっていました。

結論からいえば、ColloguyのScriptingにはかなり「慣れ」が必要です。慣れというよりも、Colloguyの「挙動」を理解しないとダメです。

まず、Colloguyは何でもAppleScriptからできるような顔つきをしていながら、サポート機能はけっこうまばらです。オープンソースで、悪く言えば「趣味で」作られているものなので、派手な機能はサポートしていますが地道な機能のサポートがよくないです。

端的にいえば、アカウントのセットアップなどへのサポートはないです。アプリケーションの初期設定(IRCサーバーの登録)などはユーザーがGUI側から済ませておく必要があります。

col3.png

また、できてよさそうなチャットルーム一覧の取得はサポートしていません。記述としては書けるのですが、値が返ってきません。

スクリプト名:Colloquyですべてのチャットルームをリストアップ(未遂)
tell application “Colloquy”
  tell connection 1
    set cList to every chat room
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

また、特定のサーバーにアクセスしているユーザーの一覧とその情報を取得するようなAppleScriptを書いてみたものの、値が返ってくるケースと返ってこないケースがあり、再現性に乏しいため試行錯誤中です。

スクリプト名:ColloguyでactiveなIRC connectionのIDを返す
set cList to retActiveIRCconnection() of me
–> {1}

–activeなIRC connectionのIDを返す。なければヌルのリストが返る
on retActiveIRCconnection()
  tell application “Colloquy”
    set cCount to count every connection
    
set cList to {}
    
    
repeat with i from 1 to cCount
      tell connection i
        set aP to properties
        
set aSt to (status of aP) as string
        
if aSt = “connected” or aSt = “connecting” then
          set the end of cList to i
        end if
      end tell
    end repeat
    
    
return cList
    
  end tell
end retActiveIRCconnection

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

あと、IRCサーバーの運用ポリシーがコロコロ変わるのか、数日前まで自由にアクセスできていたチャットルーム「#test」が招待制に変わったりといまひとつ分りづらいところがあります。

col2.png

スクリプト名:Colloguyで指定のチャットルームに入室する
set cList to retActiveIRCconnection() of me
set cID to contents of first item of cList

tell application “Colloquy”
  try
    set aRes to join chat room “#test” on connection cID
  end try
end tell

–activeなIRC connectionのIDを返す。なければヌルのリストが返る
on retActiveIRCconnection()
  tell application “Colloquy”
    set cCount to count every connection
    
set cList to {}
    
    
repeat with i from 1 to cCount
      tell connection i
        set aP to properties
        
set aSt to (status of aP) as string
        
if aSt = “connected” then
          set the end of cList to i
        end if
      end tell
    end repeat
    
    
return cList
    
  end tell
end retActiveIRCconnection

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に