Connpassです。 未来大 ✕ 琉大 中継LT大会!!! 〜間とって長野とかでやりたかった〜 https://connpass.com/event/133298/ ------------------------------------------- 未来大学と琉球大学の対バンLT会で話したスライドです。 技術的な詳しい話はそのうちブログにまとめる"予定"です。
Discordユーザー認証botを作った話Discord .NET を用いたDiscord Bot開発2019年07月15日 (月)未来大 ✕ 琉大 中継LT大会!!!Speaker:Atria #ryukyu_fun_lt
View Slide
About Me• HN : Atria(あとりあ)• 公立はこだて未来大学 B1• 好きな言語:C#• 競技プログラミングがすき• 未来大 競プロサークル代表• C#と生活してます@AtriaSoftAtria64http://atriasoft.work/
未来大学には一年生限定のコミュニティがあります• 1年のつよいひとが作った• Discordコミュニティサーバーを運営• 総勢100名近くが参加• 課題の期限、学内情報などを共有• Twitter以外での連絡手段としてとても有効• サーバー固有スタンプや、クラス限定チャンネルなど•たのしい
たのしい※注※まだ入学してない
人数が増えるごとに問題が• 人数が増えていくうちに ”一年生”以外の流入を危惧• このままではオープンな情報交換が難しいとの声• 流石に学内情報筒抜けはマズイ• 何かしらの認証が必要になった0204060801001203月 4月 5月 6月 7月Discord “FUN 2019”参加人数
どのような認証が必要か1. 運営コストを抑える。無料。手動招待制はあまりにも重いコスト2. 簡単な本人確認ができるように3. 本人確認が終了すると、内部を見れる権限を付与する4. 本人確認行為は周りに見えないようにするこんな便利な認証システム、ネット上には転がってないよね…
必要なら作ればいいじゃないエンジニア界のマリー・アントワネット
完成品
やったぜ• “!auth 学籍番号 名前” で認証botを動かすことにした• 二重認証は弾かれる• 自動メンションを行うことで、自分の投稿に対する反応だと明確にわかる• 権限が付与され、アクセス可能チャンネルが増えていく様子はマジ感動
どう実現させたのか
Discord .NET で開発“Discord .NET” を用いると、C#を用いたBot開発が可能です。“Discord .NET” はGitHubに上がっているオープンソースライブラリです。Why use C#???• C#の強みである “LINQ” を生かして、データに簡単アクセスできるから• NuGetが便利だから• “Discord .NET” のドキュメントが充実しているから• 自分が使い慣れていたから•C#が好きだから。C#愛
認証Botのしくみ名簿データ参照、更新サーバー内のやり取りを送信“!auth” コマンドが呼ばれた時動作Botに発言させる、権限を付与するなど
難しかった問題• 非同期処理に足をすくわれた• なんでデータ取ろうとしたら null なんですか!!!!!!!!!!• 非同期処理関係の理解には、まだまだ時間がかかりそう• 名簿データの取り扱い問題• クラウドで管理するのはどうしても怖かった(いくら有志とは言えども)• 数字列のみをクラウドで管理、文字列データはローカル管理• データセット作成面倒だった → ”csvConvarter” っていうのを即興で作った(C#で)• 認証時周りに見えないようにする• Discord つよいひとがユーザ権限周りいじって実現してくれた。すごいね。
みんなもC#で作ってみようLinq使うと簡単に実装できるよ。C#は楽しいよ。int sID = int.Parse(s[1]);string sName = s[2];for (int i = 0; i <= ls.Count; i++) {//番兵if (i == ls.Count) {await channel.SendMessageAsync(context.User.Mention + " " + "Auth Failure...");break;}if (sID == ls[i].ID) {if (sName == ls[i].Name) {//auth成功処理await channel.SendMessageAsync(context.User.Mention + " " + "Auth Succeed!");AddAuthedID(s[1]);var role = context.Guild.Roles.FirstOrDefault(x => x.Name == "authed user");await (context.User as IGuildUser).AddRoleAsync(role);break;…….みたいな