こんにちは!VOYAGE GROUP新卒エンジニアの井手上です!

今回の記事はSkypeテキストチャットのためのコマンドラインインターフェースを作ろう
という内容です。

突然ですが、皆さんは仕事でのコミュニケーションにどのようなツールを利用していますか?
事業部にもよりますが、私の所属するadingoプラットフォーム本部では
Skypeインスタントメッセージ(テキストチャット)を利用しています。

Skypeの良い点は、やはり多くのプラットフォームで利用できるところです。
WindowsやMac、Linux等のOSにとらわれずに誰でもチャットに参加できるので
エンジニアだけではなく、業務に関わる全員と効率的なやり取りが可能です。

しかしSkypeを活用するようになって出てきた問題が2点あります。

  1. グループが増えてくると切り替えが大変
  2. 黒い画面が恋しい

私のSkypeのグループを見てみると、業務関係のグループであったり、エンジニアが
プログラミングの話をするグループであったり、同期が集まってワイワイするグループ
であったりと、小さなものから大きなものまで多くのグループがあります。

グループが多くなると、あるグループで会話が進んでいる裏で、別のグループでも
進んでいるという状況が多くなり、カーソルでグループをポチポチ選択してから
切り替える必要があります。このような場合はSkypeの画面を並べてチャットの一覧性
を高めたくなりますね。

(2)については好みによりますが、エンジニアの中には端末とかターミナルなどと呼ばれる
黒くて地味な画面を愛してやまず、一瞬でも長く黒い画面と付き合いたい方が一定数います(自分調べ)。
確かに操作がキーボードのみで完結しますし、zshのようなシェルを使用すると単語レベルでの
カーソル移動ができたりと、Skypeのチャット入力画面よりも編集能力は高いかもしれませんね。

と長くなりましたが、結局下の図のようにテキストチャットを利用したいわけです。

さいきょうのSkypeテキストチャット環境












さて、このさいきょうのSkypeを実現するために以下のことができる必要があります。

  1. コマンドラインからチャットを読んだり発言できたりする
  2. 画面を分割できる

(2)の「画面を分割できる」ですが、iTermやscreenの画面分割機能を使用すれば実現できそうです。

(1)についてはこれといったものが見つからないのでオレオレSkypeコマンドラインインターフェース(CLI)を
サクッと作っちゃいましょう。ようやく本題です。

Apple eventでアプリケーションと通信
 
CLIを作るためのプログラミング言語は何であれ、Skypeアプリケーションにコマンドを送信してチャットの
情報を取得したり発言する方法が必要です。
D-BusやApple eventを利用するとプロセス間通信でアプリケーションと対話できます。

下のスクリプトはAppleScriptからApple eventを利用した例です。

tell application "Skype"
     send command "SEARCH RECENTCHATS" script name "recentchat"
end tell

commandに続く"SEARCH RECENTCHATS"に注目してください。この例ではSkypeアプリケーションに
"最近のチャットを探してください"というコマンドを送信しています。そうすると以下のような
メッセージが帰ってきます。

CHATS #user1/$e18dd512f98ce425, #user2/user1;bc0710cb4a32bdc2

CHATS以降、カンマで区切られた文字列は最近のチャットのIDを表します。あるチャットでの会話を
取得したい場合は、"IDがXXのチャットの会話をください"とSkypeアプリケーションにまたコマンドを
送信します。

他にもいろいろなコマンドが用意されており、リファレンスが公開されています。


発言したりメッセージを取得するだけでなく、電話もできるようですね。

様々なプログラミング言語でApple eventを利用するためのライブラリが公開されているので、好きな
プログラミング言語でオレオレSkype CLIを作り放題ですよ!

オレオレSkype CLI

今回作成したオレオレSkype CLIをGitHubに公開しています。


インストール:

$ git clone https://github.com/jewel12/skype_chat.git
$ cd skype_chat
$ gem build skype_chat.gemspec
$ gem install skype_chat-0.0.1.gem

インストールするとskyというコマンドが利用できます。

チャット一覧
$ sky list
e4 VGエンジニア user1 user2 user3
86 同期とチャット user1 user2 user3
...
sky listと実行するとチャットの一覧が表示されます。トピック名があればトピック名が表示され、
チャットに参加しているユーザーも最大3名まで表示しています。

最初に"e4"や"86"と表示されている文字はチャットのIDになり、他のコマンドで利用できます。

チャットを読む
$ sky read e4
ユーザー1 : やっほー [06-24 23:45] e4
ユーザー2 : Common Lisp [06-25 08:35] e4
...

sky read e4とチャットIDを渡すと、会話の内容が表示されます。

sky stream e4とすると、新しいメッセージが投稿されたらそれを表示し続けます。

発言する

sky send e4 こんにちは〜

sendコマンドで発言を投稿できます。

応用する

会話を表示しているだけなのでgrepでフィルタリングしたりすることもできます。
sky send でちょっとしたSkype botを作ってみるのも良いかもしれませんね。

sky stream e4 | grep Java

sky send e4 "`date`"

ぼくがかんがえたさいきょうのSkypeを実現するため、画面分割にはtmuxを使用しています。
Tmuxinator を使用するとコマンド一発で設定しておいた画面構成にしてくれるので便利です。

ここまで読んでいただきありがとうございました。
皆さんも色々なCLIを作成して、黒い画面を愛でましょう!!