Slide 1

Slide 1 text

Discordユーザー認証botを 作った話 Discord .NET を用いたDiscord Bot開発 2019年07月15日 (月) 未来大 ✕ 琉大 中継LT大会!!! Speaker:Atria #ryukyu_fun_lt

Slide 2

Slide 2 text

About Me • HN : Atria(あとりあ) • 公立はこだて未来大学 B1 • 好きな言語:C# • 競技プログラミングがすき • 未来大 競プロサークル代表 • C#と生活してます @AtriaSoft Atria64 http://atriasoft.work/

Slide 3

Slide 3 text

未来大学には一年生限定のコミュニティがあります • 1年のつよいひとが作った • Discordコミュニティサーバーを運営 • 総勢100名近くが参加 • 課題の期限、学内情報などを共有 • Twitter以外での連絡手段としてとても有効 • サーバー固有スタンプや、クラス限定チャンネルなど •たのしい

Slide 4

Slide 4 text

たのしい ※注※ まだ入学してない

Slide 5

Slide 5 text

人数が増えるごとに問題が • 人数が増えていくうちに ”一年生” 以外の流入を危惧 • このままではオープンな情報交換が 難しいとの声 • 流石に学内情報筒抜けはマズイ • 何かしらの認証が必要になった 0 20 40 60 80 100 120 3月 4月 5月 6月 7月 Discord “FUN 2019” 参加人数

Slide 6

Slide 6 text

どのような認証が必要か 1. 運営コストを抑える。無料。手動招待制はあまりにも重いコスト 2. 簡単な本人確認ができるように 3. 本人確認が終了すると、内部を見れる権限を付与する 4. 本人確認行為は周りに見えないようにする こんな便利な認証システム、ネット上には転がってないよね…

Slide 7

Slide 7 text

必要なら作ればいいじゃない エンジニア界のマリー・アントワネット

Slide 8

Slide 8 text

完成品

Slide 9

Slide 9 text

やったぜ • “!auth 学籍番号 名前” で認証botを動かすことにした • 二重認証は弾かれる • 自動メンションを行うことで、自分の投稿に対する反応だと明確にわかる • 権限が付与され、アクセス可能チャンネルが増えていく様子はマジ感動

Slide 10

Slide 10 text

どう実現させたのか

Slide 11

Slide 11 text

Discord .NET で開発 “Discord .NET” を用いると、C#を用いたBot開発が可能です。 “Discord .NET” はGitHubに上がっているオープンソースライブラリです。 Why use C#??? • C#の強みである “LINQ” を生かして、データに簡単アクセスできるから • NuGetが便利だから • “Discord .NET” のドキュメントが充実しているから • 自分が使い慣れていたから •C#が好きだから。C#愛

Slide 12

Slide 12 text

認証Botのしくみ 名簿データ参照、更新 サーバー内のやり取り を送信 “!auth” コマンドが呼ばれた時動作 Botに発言させる、 権限を付与するなど

Slide 13

Slide 13 text

難しかった問題 • 非同期処理に足をすくわれた • なんでデータ取ろうとしたら null なんですか!!!!!!!!!! • 非同期処理関係の理解には、まだまだ時間がかかりそう • 名簿データの取り扱い問題 • クラウドで管理するのはどうしても怖かった(いくら有志とは言えども) • 数字列のみをクラウドで管理、文字列データはローカル管理 • データセット作成面倒だった → ”csvConvarter” っていうのを即興で作った(C#で) • 認証時周りに見えないようにする • Discord つよいひとがユーザ権限周りいじって実現してくれた。すごいね。

Slide 14

Slide 14 text

みんなも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; …….みたいな

Slide 15

Slide 15 text

Discordユーザー認証botを 作った話 Discord .NET を用いたDiscord Bot開発 2019年07月15日 (月) 未来大 ✕ 琉大 中継LT大会!!! Speaker:Atria #ryukyu_fun_lt