ニコ動風コメントシステム「Textream」×「EzCommenter」
はじめに
砕けたプレゼンテーションなんかに使えそうなコメントシステムを考えてみました。
今回は、C#×WCFとNode.js×expressを使ってみました。このシステムでは、ブラウザからコメントを打つことができ、端末を選ばないようになっています。
- 「Textream」コメントを流すやつ
- 「EzCommenter」コメントを打つやつ
使い方
1. コメントを受け取りたいPCで「Textream.exe」を管理者権限で起動します。(WCFによる通信機能を使用するため)
2. 以下のような初期画面にIPアドレスが表示されます。
3. 同PCで「EzCommenter」のディレクトリに移動し、コマンドプロンプト等から
npm start
を実行し、「EzCommenter」を起動します。
4. コメントを打ちたい端末からブラウザで「http://aaa.bbb.ccc.ddd:3000/」のようにアクセスします。aaa~は2.で表示されているIPアドレスです。
5. 以下のような画面が開きます。
6. コメントを入力し、Enterキーを押すか送信をクリックすると以下のように「Textream」を起動しているPCの画面上にコメントが右から流れてきます。コメントの左に書かれている時間は、「EzCommenter」の起動からの時間となっています。
上記の手順で画面の最前面に文字列が流れてくるようになります。
終了したいときは、タスクバーから「Textream」のバツから終了できます。
「EzCommenter」は起動した状態でコマンドプロンプトからCtrl+C二回で終了できます。
また、コメントのログが「EzCommenter」のディレクトリに「CommentLog.json」として時間とコメントがそれぞれ保存されています。
終わりに
WCFというフレームワークを用いると今回実装したかった機能が簡単に実装できました。
ソースコードは以下で公開しています。気になったら見てみてください。
あと「Textream」はWindowsでしか動きません。
github.com
github.com
Discordのチャットを読み上げるアプリ「Yomisen」のGUI版「Yomisen2」を作った話
Yomisenは意外と使い物になった!?
面倒くさかったのでCUIでちゃちゃっと作ってしまいましたが、意外と使用する機会がありました。
例えば、実家に帰省しているとき、リビングで通話に参加したいとします。
当然、家族の迷惑になるので通話に参加しても喋ることができません。
このとき、Yomisenを使って棒読みちゃんにチャットを読み上げさせます。
この棒読みちゃんの音声をDiscordのマイク入力として渡せば、
ゆっくりボイスでの通話の参加が可能となります。まぁ、別途設定が必要になってくるんですが。
この設定については、別の記事で書こうと思います。
TwitterのTLがニコ動風に流れてくるアプリを作ってみた
はじめに
TwiiterのAPIを使うとおもちゃが簡単に作れるということで今回は、
StreamingAPIを利用し、Twitterのタイムラインがニコニコ動画風に
右から左へ流れていくアプリを作ってみました。
名前は「TLN2」です。(名前そのまんまかよ)
使用したもの
機能紹介
タイムラインがリアルタイムで流れてきます。
検索ワードが指定できて、FF外もリアルタイムで監視できます。
(画像は「草」を指定してみた結果)
- ツイートに含まれるURLをクリックするとブラウザで開きます。
- ツイート文をクリックするとツイートをブラウザで開きます。(デフォルトはOFF)
- ツイート主のユーザIDの表示・非表示切り替え可
- 棒読みちゃんに読み上げさせることが可能。(デフォルトはOFF)
棒読みちゃんを起動しておけば読み上げが開始します。
棒読みちゃん - ダウンロード(音声合成で日本語文章を読み上げ)
あと、誠に勝手ながら日本圏以外のツイートは弾いてます。
一応、Windowsでしか動きません。
ソースコード
ソースコードはGitHubに公開しています。
バイナリ版も置いてあるのでAPIKeyをTwitter Application Managementで
取得してアプリ内で入力すればすぐに利用できます。
最後に
StreamingAPI廃止が辛いンゴ…。
寿命が来るまで個人で使います。
C#×WPFでデスクトップマスコットを作ってみた
どんなもの?
そもそも私がこのアプリを作ったきっかけって、メイプルストーリーのメイプルキノコをデスクトップに居座らせたかったからってだけなんですよね。
なのでメイプルキノコがデスクトップでぴょこぴょこ動きます。
あと、それだけでは物足りないので色々便利な機能を付けてみました。右クリックで現れるコンテキストメニューから機能を選べます。
使用したライブラリ
- CoreTweet.0.8.1.394
- Newtonsoft.Json.10.0.3
- WpfAnimatedGif.1.4.16
機能紹介
時計とツイート機能
タイマー機能
他にも天気予報の取得や、メモ機能などを搭載しています。
また、マスコットはResourcesフォルダ内にmascot.gifという名前の画像を入れていただくと画像の差し替えができます。
プラグインによる機能追加
IPluginインタフェースを継承したクラスライブラリとその依存関係をPluginsフォルダに入れると機能の追加が自由にできるようになっています。(誰か作って)
ぶっちゃけインタフェース周りは初見だったのでめちゃくちゃ手こずりました。
ソースコード
ソースコードは以下で公開しています。
コメントまみれで逆に見づらいかもですが自分が忘れやすいので...
github.com
キノコの素材は公開すると版権が危うい気がしたので差し替えてあります。
ご自身で画像をご用意ください。
Discordの通知を棒読みちゃんに読み上げてもらおう!~Discord.Netを添えて~
この記事はSLP KBIT Advent Calendar 2017 - Adventarの19日目の記事となります。
いい感じの導入
生粋のゲーマーである私は、「壁を隔てたお友達」と遊ぶ時に
Discordというナウいゲーマーに熱いアプリを公開当初から通話に使っています。
そこで通話するとき、聞き専(「リビングゲーマー」、「ママが怖い」等の理由で、
ボイスチャットに声で参加できない人)のチャットを見るために、
ゲーム画面から目を離せないときがあります。そこで棒読みちゃんに読んでもらおうと思いました。
(Discord自体に標準で読み上げ機能はあるけどもゆっくりボイスがいい)
そこで爆誕したDiscordと棒読みちゃんの仲介人である「Yomisen」を紹介したいと思います。
用意したもの
- C#の環境
- Discord(https://discordapp.com/)
- Discord.Net(NuGetからインストール可)
- 棒読みちゃん(http://www.vector.co.jp/soft/winnt/art/se475579.html)
アプローチの手順
- Discordにログイン
- チャットの通知を受け取る
- 棒読みちゃんに指示を送る
- ゆっくりしていってね!
実は超簡単な棒読みちゃんへの指示出し
棒読みちゃんのサブフォルダ「SampleSrc\IpcClientChannelで読み上げ指示を送る(ローカル専用・.NET専用)\Src\BouyomiChanSample」にあるBouyomiChanClient.csをプロジェクトにそのまま追加します。
これは作者様が開発用に提供してくださっているものです。
BouyomiChanClientクラスを使用すると
var bc = new BouyomiChanClient(); bc.AddTalkTask("読み上げたい内容"); bc.Dispose();
または、
using (var bc = new BouyomiChanClient()) { bc.AddTalkTask("読み上げたい内容"); }
のように簡単に棒読みちゃんに読み上げたい内容を送信できます。(棒読みちゃんを事前に起動しておく)
また、using構文はリソース解放の記述をしなくてもブロックを抜けると自動的にリソースを開放してくれます。
なので、下のほうがリソース解放の書き忘れの心配がないので安心できると思います。
ソースコード
概要
Program.cs
一部省略
using Discord; using Discord.WebSocket; using FNF.Utility; using System; using System.Threading.Tasks; namespace Yomisen { class Program { static void Main(string[] args) => MainAsync().GetAwaiter().GetResult(); /// <summary> /// 非同期Mainメソッド /// </summary> static async Task MainAsync() { // トークンのチェック await CheckTokenAsync(); // ログイン処理 Console.WriteLine("ログイン中…"); var client = new DiscordSocketClient(); await client.LoginAsync(TokenType.User, Properties.Settings.Default.Token); await client.StartAsync(); Console.WriteLine("ログイン完了"); // 始めのあいさつ(大事) var task = Task.Run(() => { using (var start = new BouyomiChanClient()) { start.AddTalkTask("棒読みちゃん起動~!"); } }); // メッセージ受信時のイベントを追加 client.MessageReceived += Talk; // 各種コマンド InputCommand(); // 終わりのあいさつ(大事) task = Task.Run(() => { using (var end = new BouyomiChanClient()) { end.AddTalkTask("棒読みちゃん終了~!"); } }); Console.WriteLine("キー入力で終了"); Console.ReadLine(); } /// <summary> /// メッセージを受け取った時の処理 /// </summary> static async Task Talk(SocketMessage arg) { await Task.Run(() => { // チャンネル一覧にあるなら if (Properties.Settings.Default.TextChannels.IndexOf(arg.Channel.Id.ToString()) >= 0) { // 読み上げ using (var bc = new BouyomiChanClient()) { bc.AddTalkTask(arg.Content); } } }); } ~以下省略~ } }
メッセージの通知を受信したときのイベントで、棒読みちゃんへの指示を行っています。
受信したメッセージのチャンネルIDが読み上げたいチャンネルIDとして登録されていれば読み上げが行われるようにします。
~省略~ // メッセージ受信時のイベントを追加 client.MessageReceived += Talk; ~省略~ // 読み上げ static async Task Talk(SocketMessage arg) { await Task.Run(() => { // チャンネル一覧にあるなら if (Properties.Settings.Default.TextChannels.IndexOf(arg.Channel.Id.ToString()) >= 0) { // 読み上げ using (var bc = new BouyomiChanClient()) { bc.AddTalkTask(arg.Content); } } }); }
Properties.Settings.Default.~~はアプリの設定ファイルで、設定値等を保存しておくことができるものです。
今回は、チャンネルIDの配列を保存しています。
機能として、コマンド入力によって読み上げたいテキストチャンネルのIDを登録・削除・列挙することができます。
トークンのリセットをした場合は一度終了となり、再度ログイン作業が必要となります。
テキストチャンネルのIDを調べる方法
- 設定>テーマ>開発者モード をオン
- テキストチャンネルの名前の上で右クリック
- IDをコピー でクリップボードにコピーされる
例
> add 012345678901234567
のように18桁のIDを正しく入力することでテキストチャンネルのIDを登録できます。
(適当に登録しても、自身のアカウントの知れる範囲のものでないと通知は来ません)
DiscordApiHelper.cs
Discord.Netではサポートされていないメールアドレスとパスワードによる
トークンの取得を実現するためのヘルパークラスです。
using Newtonsoft.Json; using System; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; namespace Yomisen { public static class DiscordApiHelper { /// <summary> /// EmailとPasswordでトークンを取得します /// </summary> public static async Task<string> LogInAsync(string mail, string password) { var baseUrl = "https://discordapp.com/api/"; var appName = "Yomisen"; var discordAccount = new { email = mail, password = password }; var json = JsonConvert.SerializeObject(discordAccount); var content = new StringContent(json, Encoding.UTF8, "application/json"); var res = await GetClient(appName).PostAsync(new Uri($@"{baseUrl}/auth/login"), content); if (res.IsSuccessStatusCode == true) { var resJson = await res.Content.ReadAsStringAsync(); var deserializedJson = JsonConvert.DeserializeAnonymousType(resJson, new { token = "" }); return deserializedJson.token; } else { return null; } } /// <summary> /// ヘッダーの追加 /// </summary> public static HttpClient GetClient(string appName) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("User-Agent", appName); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); return client; } } }
discordapp.com
このあたりの書式に沿ってヘッダーの編集などをしてJSON形式でトークンを貰います。
このトークンは、
Discord上で「ctrl+shift+i」>Appliacationタブ>Local Storage>https://discordapp.com>token
の値と同値になると思います。
使い方
- 棒読みちゃんを起動(音量・速度等はこちらで設定)
- Yomisenを起動
- Discordのメールアドレスとパスワードを入力(初回・リセット時のみ)
- テキストチャンネルIDの登録
- ゆっくりしていってね!
GitHub
この記事では、ソースコードは一部省略していましたが、以下に公開しています。
github.com
Visual Studio 2017 でビルド後のコマンドを指定する
ビルド後にファイルを指定の位置に移動させる
コマンドの設定画面は、
プロジェクト右クリック→プロパティ→ビルドイベント
から開くことができる。
今回は、ビルド後に、自作のプラグインのクラスライブラリ(.dll)を、
実行ファイル(.exe)が存在するフォルダのサブフォルダ「Plugins」に
自動的に移動させたいと思った。
そこで、以下のように設定した。
ビルド後に、出力フォルダに移動して「Plugin」フォルダを作成して、
拡張子が.dllのファイルををすべて「Plugin」フォルダ配下に移動している。
これだけでは読み込んでくれない
サブフォルダのdllを参照するときにはconfigファイルにも変更が必要なようだ。
プロジェクトの「~.config」を開いて以下を追記
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="Plugins"/> </assemblyBinding> </runtime> </configuration>
これでサブフォルダ内の読み込みができるようになる
privatePath="Plugins"
の部分を変更することで読み込みたいフォルダを変更、追加できる。
結果
実行ファイルのあるフォルダがごちゃごちゃしなくてスッキリ!