TwitterIrcGatewayをmono 6で動かす

twitterTLS 1.2限定になって無事TwitterIrcGatewayが死亡したわけですが、ここはソースいじってLinux(debian 9)環境のmono(6.0.0.319)で動かそうという話。ソースはopentigリポジトリから、編集はVisual Studio 2017 Community版で行いました。なおそれまでdebian 7で動かしていたものをTLS 1.2対応が必要になって環境ごとバージョンアップしたら動かなくなったのであれこれやりましたが、先に結論から言うとmono 6で動かないのはTLS 1.2関係なかったです。

この記事はやったことを羅列していくのであまり原因について調べていませんというかそんな余裕ないです。

蛇足

ちなみに本稿と関係ないですが、WindowsTLS 1.2の対応はターゲットフレームワークを.NET 4.5にしてMainの頭に

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

と書いておけばいいです。monoではなくても動きました。理由はよくわかってません。レジストリをいじるハックが出回ってるのでソースいじりたくない人はそちらでもいいと思います。

本題

本題に入ります。まず、debian公式のmonoは古いのでまず公式のmonoをインストールします。何度も言うように動かない原因は別にあったので今となっては必要あるかはわかりませんが!

# apt install apt-transport-https dirmngr gnupg ca-certificates
# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
# echo "deb https://download.mono-project.com/repo/debian stable-stretch main" | tee /etc/apt/sources.list.d/mono-official-stable.list
# apt-get update
# apt-get install mono-devel ca-certificates-mono

次にローカル環境にソースコードをcloneしてきて、Visual Studioで開き、すべてのプロジェクトのターゲットフレームワークをv4.5にします。これも必要あるかはわかりません!がこの記事はやったことをただ書いていきます。

git clone https://github.com/opentig/TwitterIrcGateway.git

ここから本題です。monoでTwitterIrcGatewayが動かないのは、TwitterIrcGatewayCore内AddInManager.cs 150行目_sessionがnullになっておりここで止まるからです。ということでnullにならないようにしましょう。同ファイル63,64行目に問題がります。

            _server = ServerProxy.GetTransparentProxy() as Server;
            _session = SessionProxy.GetTransparentProxy() as Session;

これを

            _server = (Server)ServerProxy.GetTransparentProxy();
            _session = (Session)SessionProxy.GetTransparentProxy();

こうします。なんでこれで動くのかは例によってわかっていません。これでRelease設定でビルドしてBin/Releaseディレクトリ内ファイルをアップロードすれば終わりです。

お疲れ様でした。