やります!アンコちゃん 公式wiki - はじめてのプラグイン
プラグイン製作者向け For developers page.

はじめに

アイデアと、アプリを作成するスキルはあるけど、プラグインとなると鳥肌が立つ方向けです。
といっても、難しいことはしていませんので、サンプルを改造することでアプリが作れないひとも作れるようになると思います。

プラグインてどんなもの?


アンコちゃん内部での処理をプラグインで肩代わりして、独自の処理を施して、運営コメントを送ったりできるプログラムです。

とやかくいう前につくってみましょう

準備するもの

  • VisualStudio2010 C# Expressなら無料でつかえます。
  • anko2サンプル
Expressだとデバッグ機能制限のせいでそのままだと、デバッグができません。
うつろにゃんが準備していただいているサンプルを使うと簡単にデバッグできます。
anko2サンプルは以下のコミュニティからダウンロードできます。(お知らせをよく読んでください)
co235502

VS2010のインストールとかプラグインサンプルの下準備は終わった前提で始めたいと思います。
プラグインのreadmeをみて、GUIDまで書き換えておいてください。
GUIDについて https://developer.mozilla.org/ja/Generating_GUIDs

とりあえずデバッグ実行

突然ですが素の状態で動かしてみましょう。
再生ボタンみたいなのをクリックするだけです。
※12/05/08 現在、アップデートによる一部の仕様変更により、
そのままでは DisconnectedServer に関する行がエラーとなります。
エラーになる行が2か所あると思いますが、とりあえず該当の行を削除すれば動作します。

何の苦労もなく起動したかとおもいます。


え、anko2\nicoView2.exeが見つからないっていわれるって?
readme通りにコピーまでしているのにできない方は、anko2Sample.csproj.userというファイルを開いてanko2\nicoView2.exeのところを、..\anko2\nicoView2.exeという感じに修正してみてください。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
    <StartAction>Program</StartAction>
    <StartProgram>..\anko2\nicoView2.exe</StartProgram>
  </PropertyGroup>
</Project>

起動はしましたが、プラグインのフォルダーが開発用環境側に設定されていないのでプラグインメニューには何も変化無いとおもいます。
設定>上級者設定 で「プラグインフォルダー位置の初期化」を押してOKで反映させ、コピーした方のプラグインフォルダーに設定します。
ここまでできたら一度アンコちゃんを止めてから起動してみましょう。
すると、プラグインメニューにプラグインサンプルって出てくるようになったと思います。

選ぶと設定画面の雛形が表示されると思います。
これで下準備は完了です。

さて何をつくりましょ

主コメで「延長メニュー表示」って入力したら、メニューを表示させてみましょう。
ReceiveChatというイベントをつかいます。
で、どこに書くかというとpublic ankoPlugin2.IPluginHost hostプロパティーのsetに書きます。
_host.まで入力すると、選択肢がでてきますのでReceiveChatを選んでエンタをおします。

つづけて+=まで入力すると、TABを押すとどーのこーのっていわれるので、TABを押してお任せしてしまいましょ。


かってにvoid _host_ReceiveChat(object sender, ankoPlugin2.ReceiveChatEventArgs e)ができましたよね。
この中に、主コメで「延長メニュー表示」って入力したら・・・という処理をコーディングしていきます。

throw new NotImplementedException();は削除しちゃってください。

        void _host_ReceiveChat(object sender, ankoPlugin2.ReceiveChatEventArgs e)
        {
            //おまじない _host.CurrentCastがnullだったら処理しない
            if (_host.CurrentCast == null)
                return;
            //放送主でなければ処理しない
            if (_host.CurrentCast.is_owner!=1)
                return;
            //メッセージがなければしょりしない
            if (string.IsNullOrEmpty(e.Chat.Message))
                return;
            //主コメ&延長メニュー表示だったら
            if (e.Chat.IsCaster && e.Chat.Message == "延長メニュー表示")
            {
                //ここに処理を書く
                System.Diagnostics.Debug.Print("ここに処理を書く該当メッセージです");
            }
        }
ここまでかいたら、実行ー、テスト枠とってみます。
運営コメントで、延長メニュー表示と入力すると、VS2010の出力ウインドウに「ここに処理を書く該当メッセージです」と表示されるはずです。


つぎに実際の処理を書いていきます。
でも、延長メニューってどうやってわかるの?
とういうことを、探せば出てくるとはおもいますが、予め関数が用意されていますのでそれを使います。
List<LibAnko.Utility.clsSalesList> LibAnko.Utility.getSalesList(string 放送ID)
放送IDを渡すと List<LibAnko.Utility.clsSalesList>で返してくれるものです。

処理内容に書き換えるとこんな感じになります。
            //主コメ&延長メニュー表示だったら
            if (e.Chat.IsCaster && e.Chat.Message == "延長メニュー表示")
            {
                //ここに処理を書く
                //一覧を取得
                List<LibAnko.Utility.clsSalesList> work = LibAnko.Utility.getSalesList(e.Chat.lid);
                //nullだったら処理をしない
                if (work == null)
                    return;

                foreach (LibAnko.Utility.clsSalesList item in work)
                {
                    //メッセージ編集
                    string wk = string.Format("{0} {1}ポイント", item.label, item.price);                    
                    //送信
                    _host.PostOwnerComment(wk, "", "");
                }
            }

ただーし、WEB問い合わせをしていますので、処理に時間がかかってしまい、ReceiveChatの処理の中で実行してしまうと、全体のレスポンスに影響がでます。
なので処理をスレッド化します。
いくつか方法があるのですが、インラインで簡単に書いてしまう方法にしたいとおもいます。
System.Threading.Thread t = new System.Threading.Thread(delegate() {と});で囲んでしまい、スタートさせる行を追加するだけでできます。
完成したコードが下記になります。
        void _host_ReceiveChat(object sender, ankoPlugin2.ReceiveChatEventArgs e)
        {
            //おまじない _host.CurrentCastがnullだったら処理しない
            if (_host.CurrentCast == null)
                return;
            //放送主でなければ処理しない
            if (_host.CurrentCast.is_owner!=1)
                return;

            //メッセージがなければしょりしない
            if (string.IsNullOrEmpty(e.Chat.Message))
                return;
            //主コメ&延長メニュー表示だったら
            if (e.Chat.IsCaster && e.Chat.Message == "延長メニュー表示")
            {
                //ここに処理を書く
                System.Threading.Thread t = new System.Threading.Thread(delegate()
                {
                    //一覧を取得
                    List<LibAnko.Utility.clsSalesList> work = LibAnko.Utility.getSalesList(e.Chat.lid);
                    //nullだったら処理をしない
                    if (work == null)
                        return;

                    foreach (LibAnko.Utility.clsSalesList item in work)
                    {
                        //メッセージ編集
                        string wk = string.Format("{0} {1}ポイント", item.label, item.price);
                        //送信
                        _host.PostOwnerComment(wk, "", "");
                    }
                });
                t.Name = "一覧取得処理";
                t.Start();
            }
        }



実行結果


これで完成です。
あとはtry とかで囲んで想定外のエラーのときに異常終了しないようにするとか、そういうところです。

最後に

LibAnkoの関数の利用制限はないです
ドキュメントはありませんので、使う人の責任でお願いします。
こういうの作ってとかいうご希望はお受けできませんが、こういうの出来るのって、xxxxxxxでいいですよね?的なご質問はwiki掲示板でお受けいたします。
http://w.livedoor.jp/yari_an/bbs/3789/l50 ←メンバー限定なのでお手数ですが参加をお願いします。

プラグインノウハウ
vbでプラグイン
名前を取り出す
シリアライズで適当XML
プラグインデバッグモード