GruntJSで伺かを操作するgrunt-sstpを作った

先日書いた[この記事](http://qiita.com/kinzal/items/2103f423c43d9ea5feb9)のとおり。Macで動く伺か環境を作ったら、勢い余ってGruntプラグイン作っちゃいました。

[grunt-sstp - https://www.npmjs.org/package/grunt-sstp](https://www.npmjs.org/package/grunt-sstp)

さくらさんが可愛いので仕方なかったんです。

![うにゅう_and_うにゅう_and_さくら_and_さくら.png](https://qiita-image-store.s3.amazonaws.com/0/5522/5f759246-37af-89af-fda4-cc3d657f1ecb.png)

# 使い方

````
$ npm install grunt-sstp --save-dev
````

npmコマンドでインストールして。

```js
grunt.initConfig({
  sstp: {
    options: {}
  }
})

// Load task
grunt.loadNpmTasks('grunt-sstp');

// run sstp notify
grunt.task.run('sstp');
````

Gruntfile.jsに追加するだけです。

# さくらスクリプトを自分で書く

一応、自分でさくらスクリプトを書けないとおもしろくないので、いくつか受け口を作りました。
さくらスクリプト用のビルダーは誰か作ってくれると信じてる。

## options.success

タスクが成功したときに実行するスクリプトです。

```js
  sstp: {
    options: {
      success: 'NOTIFY SSTP/1.1\n\
                Sender: grunt-sstp\n\
                Script: \\\\0\\\\s[5]タスクの実行に成功したよ\\\\1\\\\s[10]良かったな\\\\e\n\
                Option: nodescript,notranslate\n\
                Charset: UTF-8'
    }
  }
````

![うにゅう_and_うにゅう_and_さくら_and_さくらsuccess.png](https://qiita-image-store.s3.amazonaws.com/0/5522/fda2a21b-a632-d953-74a1-4e246f4896d5.png)


## options.warning

タスクで警告が発生したときに実行するスクリプトです。

```js
  sstp: {
    options: {
      warning: 'NOTIFY SSTP/1.1\n\
                Sender: grunt-sstp\n\
                Script: \\\\0\\\\s[5]警告を発生させたよ\\\\1\\\\s[10]問題ないな\\\\e\n\
                Option: nodescript,notranslate\n\
                Charset: UTF-8'
    }
  }
````

![うにゅう_and_うにゅう_and_さくら_and_さくらwarning.png](https://qiita-image-store.s3.amazonaws.com/0/5522/eefd011f-50c5-35ea-1d1a-7354b12c4f3e.png)

## options.error

タスクでエラーが発生したときに実行するスクリプトです。

```js
  sstp: {
    options: {
      error: 'NOTIFY SSTP/1.1\n\
              Sender: grunt-sstp\n\
              Script: \\\\0\\\\s[5]エラーを発生させたよ\\\\1\\\\s[10]テストだから気にするな\\\\e\n\
              Option: nodescript,notranslate\n\
              Charset: UTF-8'
    }
  }
````

![うにゅう_and_うにゅう_and_さくら_and_さくらerror.png](https://qiita-image-store.s3.amazonaws.com/0/5522/0c6d3dbb-c465-a1c8-c72c-080c1d0120e5.png)

## options.fatal

タスクがFatal Errorが発生したときに実行するスクリプトです。

```js
  sstp: {
    options: {
      fatal: 'NOTIFY SSTP/1.1\n\
              Sender: grunt-sstp\n\
              Script: \\\\0\\\\s[5]致命的なエラーを発生させたよ\\\\1\\\\s[10]テストとはいえビックリするな\\\\e\n\
              Option: nodescript,notranslate\n\
              Charset: UTF-8'
    }
  }
````

![うにゅう_and_うにゅう_and_さくら_and_さくらfatal.png](https://qiita-image-store.s3.amazonaws.com/0/5522/be6122c5-3a49-2c67-4b92-7af5c3943091.png)

## options.command

警告、エラー、Fatal Errorが未定義のとき実行するスクリプト定義です。

```js
  sstp: {
    options: {
      command: 'NOTIFY SSTP/1.1\n\
                Sender: grunt-sstp\n\
                Script: \\\\h\\\\s[0]タスクの実行をしたよ\\\\w9\\\\u\\\\s[11]失敗してるぞ\\\\w9\\\\w9\\\\h\\\\s[4]\\\\n\\\\nええー\\\\e\n\
                Option: nodescript,notranslate\n\
                Charset: UTF-8',
    }
  }
````

![うにゅう_and_うにゅう_and_さくら_and_さくらcommand.png](https://qiita-image-store.s3.amazonaws.com/0/5522/e5957504-bb58-68ab-9927-b2e7fdbfae91.png)

# SSTP＋さくらスクリプトの仕様

自分が実装にあたって参考にしたページです。

Sakura Script Transfer Protocolで通信するのに必要な仕様
http://usada.sakura.vg/contents/sstp.html

さくらスクリプトを書くのに必要な仕様
http://usada.sakura.vg/contents/shiori.html

表情の変更に必要な仕様
http://usada.sakura.vg/contents/shell.html


地味にリンクが死んでるので、なかなか必要な情報を漁りづらいです。
でも、表情を変え出すと楽しさ倍増です。頑張って情報を漁ってください。

# 作った感想

今回は初めてのNodeJS & Gruntプラグイン作りだったので苦労するかと思ったけど以外にあっさり作れました。
ソケット通信＋Gruntのフックみたいなことをやって、だいたい1日かからないぐらいでした。

````
$ npm install -g generator-gruntplugin
$ yo gruntplugin
````

今回はyeomanさんのジェネレーターからひな形を作成しました。
最初の構成に迷ったらyeomanさんの出番ですね。

最初の構成ができたら、あとは機能に合わせてコーディングして、````npm publish````して上げれば良かったです。
実装で難しかったのはGruntのフック周りでしたが、[grunt-notify](https://github.com/dylang/grunt-notify)リスペクトです。先人のいる分野は助かります。
便利レベルで使ってた自分がgrunt-notifyの中の実装を完璧理解できるようになったレベルでリスペクトです。ありがとうございます。

あと、テストを````grunt.util.spwan````でタスクを呼び出して、その結果と通信内容の確認と、大味なテストにしたのでカバレッジが取得できないという事態に。。。
ソケット通信したり、Gruntの処理をフックするようなときのテストの書き方がさっぱりわからないです。
この辺り、良い書き方があれば、ぜひ教えてください。

ついでに最初は[nodeunit](https://github.com/caolan/nodeunit)でテストを書いてましたが、途中で[mocha](http://visionmedia.github.io/mocha/)と[chai](http://chaijs.com/)に切り替えました。
nodeunitがダメというより、mochaとchaiはテストを綺麗に書けて凄い楽しいです。

---

たぶん、気が向いたらまた伺か関係のおもちゃ作ると思います。
次は何を作るとおもしろいかなぁ。