Mastodon すごい勢いで利用者が増えて面白いことになってるなぁと感じています.
ここまでユーザが増えるのであれば Twitter でやっていた Bot 運用をこちらでもしたいなと思いまして,まずは Mastodon の API を叩けるライブラリを作成して,その後に Bot の簡単な枠組みを作ってみました.
ライブラリについて
yamachu/Mastodot: C# Library for Mastodon. Easy Toot!
Nuget に出す練習もしてみたかったので Nuget にも公開済みです.
使い方は Github の README に書いてあったり,また example としてサンプルコードを書いたので参考にしてください.
Bot について
せっかくストリームを受信しているのだからその流れを絶やしたくない...フィルタリングする内容とかは動的に決めたいという思いが自分の中にありました.
C# はスクリプト言語ではないため外部からごにょごにょ...というのはあまり現実的ではありません.
しかし Roslyn の登場によりスクリプト言語的にも扱えるようになりました(Visual Studio の Immediate Window みたいなイメージ)
その Roslyn を借りて動的に動きを変えることが出来る Bot を作ってみました.
実現するためのコードは Azure Functions - C# のRoslyn コード評価環境を構築しよう を参考にしました.
サンプルコードを以下にアップしました
yamachu/MastodonScriptBot: Mastodon Bot with Roslyn for Scripting
方法としては実にシンプルで,
- Mastodon のストリームに接続
- そのストリームを Subscribe する際にフィルタをかけたりして動作を変える
これだけです.
動的に止めることなく Bot の振る舞いを変える際にいい感じに役に立ってくれたのが FileSystemWatcher
でした.
この存在を知ったのは MacOS上で.NET Coreを使ってフォルダ/ファイル変更監視 の記事でした,感謝.
タイトルにあるように監視対象のディレクトリでのファイルの変更を通知してくれます.
これを使って Bot の動作が動的に変更することが可能となっています.
じゃあどんなふうに Bot の振る舞いを書くの?ということですが,以下のように Mastodon のストリームを Subscribe してそれに対する処理を書くだけです.
Script ディレクトリに {適当な名前}.csx という感じで以下のファイルを保存してみます(; がないじゃん!と思うかもしれませんが,大丈夫です,問題ありません)
MSStream.OfType<Status>()
.Where(x => x.Content.Contains("マストドン"))
.Subscribe(x =>
{
System.Console.WriteLine(x.Content);
Client.Favourite(x.Id);
})
これは文章中に”マストドン”という単語が含まれていたら fav を投げつけるというようなサンプルです.
この中のMSStream
とClient
ってどっから来たんだよ!っていう感じなのですが,ストリームを生成した Host 側に持たせています.
それを Global な変数として Bot を実現するスクリプト側に投げています.
処理的に言えば
https://github.com/yamachu/MastodonScriptBot/blob/master/SampleMastodon/Program.cs#L145-L169
このあたりに該当します.
この記事では仕組みとかそのあたりには触れないので,ぜひ使って感じてみて欲しいなと思います.
ですが,これは半分ネタです,すみません.
というのも完全に型が...型がわからない............補完が効かない.....ということでいくつかテンプレートを作って遊んでみるのがいいのかなと思いました.
みんなも Mastodon で Bot 運用楽しもうず!!!!
本当は update_name について書くつもりだったけど...何か別の記事で!
あと yamachu/Mastodot: C# Library for Mastodon. Easy Toot!
を何卒よろしくお願いします.