Skypeの通知をnotify-osdにまわす

Skypeにはイベント(コンタクトがオンラインになるだとか、ファイル送信のリクエストが飛んできたりだとか)毎に通知を出したり、音声を流したりする機能がある。

この機能の中に、イベントに応じてコマンドを実行する機能がある。また、イベントによっては変数が扱えたりもする。この変数をうまくコマンドに渡してあげると、いろいろ楽しいことができる。

また、Ubuntuにはnotify-osdという(まだ完成度は低いが)オシャレな通知システムがあるので、Rubyのスクリプトを介してnotify-osdに各種イベントの通知を出すようにする。

次のようなスクリプトを用意する。

Page not found · GitHub

#!/usr/bin/env ruby

require "logger"

log = Logger.new(File.expand_path('~/.skype-notify.log'))
log.level = Logger::INFO
log.progname = 'skype-notify.rb'

def notify(summary, body='')
	system("notify-send -i /usr/share/icons/skype.png '#{summary}' '#{body}'")
end

begin
	type, sname, fname, fpath, smessage, fsize, sskype = *ARGV.dup
	log.debug(ARGV.dup.inspect)

	case type
	when "CallRingingIn"
		notify "Calling!", sname
	when "ContactOnline"
		notify "Login: #{sname}"
	when "ContactOffline"
		notify "Logout: #{sname}"
	when "ContactAuthRequest"
		notify 'Incoming Contact Request', sname
	when "ChatIncomingInitial"
		notify "#{sname} started chat", smessage
	when "TransferRequest"
		notify "Transfer Request from #{sname}", "#{fname}, [#{fsize}KB]"
	when "TransferComplete"
		notify "Transfer Completed!", "#{fname}, [#{fsize}KB]"
	when "Birthday"
		notify "Happy Birthday! #{sname}"
	end
rescue Exception => e
	log.error(e.inspect)
end

次にSkypeのOptionsを編集する。

[Options] -> [Notifications] -> [Advanced View] から [Execute the following script on any event] にチェックを入れて、次のように入力する。

ruby $HOME/bin/skype-notify.rb "%type" "%sname" "%fname" "%fpath" "%smessage" "%fsize" "%sskype"

あとは、 [Display pop-up notifications] のチェックをすべて外してよいとおもう。

デバッグについて

log.level = Logger::DEBUG として、Skypeの [Options] -> [Notifications] -> [Test Event] を叩きまくると、 ~/.skype-notify.log にログがたまる。 type の値ごとに when 節を追加していけばよい。まあ、なにはともあれコードを読むほうがはやいとおもう。

はじめてloggerをつかったのだけど、とても便利。いろいろ使ってみるものですね。