C#版MisskeyAPIライブラリを作ってる話: Misskey Advent Calendar 2024

Posted on Mon 16 December 2024 in 雑書き

これはMisskey Advent Calendar 2024の16日の記事です。

最初に

2024年もあと少しとなりましたが、いかがお過ごしでしょうか。

私はMisskey関連だとMisskey APIのC#版ライブラリを書いていたのでそれについて書いておこうと思います。

どんなライブラリなのか

一言で言ってしまえばC#版のMisskey APIライブラリです。しかし、手動でコードを書くのではなく(半分)自動化しているのが特徴です。

まず、Misskeyにはapi.jsonというMisskeyのAPIの仕様が書かれているありがたいファイルがあります。

そのファイルを読み込んでコードを生成しています。

そのおかげでMisskeyでアップデートがあっても、半自動で更新作業を行えたりします。(様々な事情で一部は手動修正ですが)

中身

生成部分は複雑怪奇になってしまったので図で軽く書いておきます。

モデルデータの生成順序

モデルデータの生成順序

C#はクラスだと多重継承ができないので一旦インターフェースにしてからクラスにしています。

エンドポイントごとの関数の生成順序

エンドポイントごとの関数の生成順序

基本的にこれで9割は生成できるのでかなり楽になりました。(これ作るのに半年かかったので総合的に楽かどうかは不明ですが)

ストリーミング

ストリーミングの情報はapi.jsonに書かれていなかったので、全部手動で書いています。

手動だと思い通りのコードが出てくるので楽ですね(本末転倒)

使い方

軽く例を載せておきます。

基本的に階層はMisskeyのAPIと同じです。

ノートの作成

var app = new App("misskey.04.si", "T43B79NBASDF34"); // Appインスタンスを作成する
var note = (await app.NotesApi.Create(text: "Hello, World!")).Result; //シンプルなノートを作成

ファイル付きでノートを作成

await using var fs = new FileStream("image.png", FileMode.Open); // ファイルを読み込み
var file = (await app.DriveApi.FilesApi.Create(fs)).Result; // ファイルをアップロード
var note = (await app.NotesApi.Create(text: "Test", fileIds: new List<string> { file.Id })).Result; // ファイル付きでノートを作成

リアクションをつける

await app.NotesApi.ReactionsApi.Create("a1hn5439a", "❤️"); //リアクションをつける

ストリーミング

タイムライン

await app.Streaming.Start();
app.Streaming.NoteReceived += args => { Console.WriteLine(args.Body.Text); };// ノートが流れてきたときにノートのテキストを表示
await app.Streaming.Subscribe(ChannelType.HomeTimeline, "1"); //ストリーミング開始
await Task.Delay(1000 * 30);
await app.Streaming.Unsubscribe("1"); //切断

投稿のキャプチャ

app.Streaming.ReactedReceived += args => { Console.WriteLine(args.Body.Reaction); }; // リアクションされたときのリアクションを表示
app.Streaming.UnreactedReceived += args => { Console.WriteLine(args.Body.Reaction); };// リアクションをはずされたときのリアクションを表示
await app.Streaming.Subscribe("a1hn5439a");
await Task.Delay(1000 * 30);
await app.Streaming.Unsubscribe("a1hn5439a");

さいごに

最終目標はこれを使ってクライアントを作ることなのですが、まだまだなので実現できるように来年も頑張っていきたいと思っています。

ソースコートはここにおいてあるのでよかったら見ていってください。

https://github.com/grapeapple0/misharp-v2

nugetにもアップしています。

https://www.nuget.org/packages/Misharp/