伝説のどいつまの伝説~失敗編~

岩美に永住したい新米エンジニアのあれやこれやな話。

【C#】【Bot】Slack Bot で推したちと会話したい!Part.6

前回までのあらすじ

果て無き荒野を彷徨うオタク。
ひとまず、5人の Bot たちが会話をすることに成功した!
次なる高みへ向かって、今日もオタクは開発に勤しむ。

▼前回の内容はこちらから。
d01tsumath.hatenablog.com


Free! とはなんぞや?という方は、Netflix、d アニメストアをはじめとした動画配信サービスにて配信中なので是非ご視聴ください!
いわゆる "異次元系スポーツ" ではないので、安心して視聴できると思います。
iwatobi-sc.com



【Slack Bot シリーズの新目標】
1. 会話のレパートリーを増やす
  2. 推したちだけで会話が始まるように改修
  3. 会話に遅延を取り入れる

まず、整備する

現状、会話も名前も固定値で持っている状態です。
今後もっと会話が増えることを考えるとコード内で固定値で持っているのも運用がしにくい......ということで、ここの整備から始めます。

Database 爆誕

まず、Slack 側の UserID やそれぞれの名前の呼び方の管理をするためにデータベースを作っていきます。
f:id:d01tsumath:20200224192210p:plain

該当のリソースグループより [追加] > [SQL Database] を選択し、必要事項を入力していきます。
RDBMS を選択した理由は、基本的に RDBMS しか使用経験がないから!w
f:id:d01tsumath:20200224205736p:plain

今回、[サーバー] も新規作成し、[SQL エラスティック プール] の利用は「はい」にしました。
あとはデフォルトのまま [作成] ドーン!!!
f:id:d01tsumath:20200224210841p:plain

で、Azure portal からこのまま作業を進めても良いんだが、自身の学習のためにも「SQL Server Management Studio」を使用していこうと思います!
インストールが終わったら、起動して...
[ファイル] > [新規作成] > [データベース エンジン クエリ] より、上記データベース作成時に決めたログイン情報を入力し、アクセスします。
f:id:d01tsumath:20200224211932p:plain

まず、後々失敗しないように必要なテーブルの情報などを書き出していこうと思います。
設計的なのやったことはないけど、これも練習!後々のため!やるぞおぉー!w
と、いうわけで、まず最初に欲しいテーブルがこんな感じです。

Users』テーブル
Slack の ID と名前を紐づけるためだけのものにします。

Column / 列名 主キー Null 許可
UserId / ID INT Y
BotName / 名前 NVARCHAR(128)
SlackId / Slack のユーザー ID NVARCHAR(128)


NickNames』テーブル
各キャラとニックネームを紐づけるためのものにします。
これは、キャラが呼ばれる側です。
現段階では、各キャラ3通りが上限なので『ニックネーム3』まで作成しておけば問題ないと思われます。

Column / 列名 主キー Null 許可
NickNameId / ID INT Y
UserId / User テーブルの ID INT
NickName1 / ニックネーム1 NVARCHAR(128)
NickName2 / ニックネーム2 NVARCHAR(128)
NickName3 / ニックネーム3 NVARCHAR(128)


CallNames』テーブル
キャラが他のキャラの名前を呼ぶものです。
ややこしいけど...分けておいた方が無難だと思うので、分けます。

Column / 列名 主キー Null 許可
CallNameId / ID INT Y
UserId / User テーブルの ID INT
CallHaruka NVARCHAR(128) Y
CallMakoto NVARCHAR(128) Y
CallRin NVARCHAR(128) Y
CallNagisa NVARCHAR(128) Y
CallRei NVARCHAR(128) Y


この設計でうまくいくかいかないかは今後実際に使ってみて次第。
まー、間違ってたところで、作り直せばよいし、これで行ってみましょう。
間違いも含めてのこのブログですから......。

-- Create Users table
CREATE TABLE Users
(
    UserId INT IDENTITY PRIMARY KEY,
    BotName NVARCHAR(128) NOT NULL,
    SlackId NVARCHAR(128) NOT NULL
)

-- Create NickNames table
CREATE TABLE NickNames
(
    NickNameId INT IDENTITY PRIMARY KEY,
    UserId INT NOT NULL,
    NickName1 NVARCHAR(128) NOT NULL,
    NickName2 NVARCHAR(128) NOT NULL,
    NickName3 NVARCHAR(128) NOT NULL
)

-- Create CallNames table
CREATE TABLE CallNames
(
    CallNameId INT IDENTITY PRIMARY KEY,
    UserId INT NOT NULL,
    CallHaruka NVARCHAR(128),
    CallMakoto NVARCHAR(128),
    CallRin NVARCHAR(128),
    CallNagisa NVARCHAR(128),
    CallRei NVARCHAR(128)
)


クエリを実行します。
SSMS を使っててちょっと詰まったポイントととして、クエリを実行する場所に注意が必要です。
f:id:d01tsumath:20200225194827p:plain
「hogehoge.database.windows.net」はサーバー名になるので、その下の対象のデータベースを右クリックして [新しいクエリ(Q)] より、クエリ実行します。
普通にサーバー上でクエリ実行して、マスターテーブル作れないよ!って怒られて夜中1時間くらい悶々と悩みました。そして会社で聞いたら瞬殺で解決っていうw

データ投入

そしたら、各テーブルにデータを投入します。

INSERT INTO [dbo].[Users]
(
[BotName],
[SlackId]
)
VALUES
(
'Haruka',
'********U'
);


このようにデータ追加していきます。
CSV とかでも追加できるみたいだけど、今回はデータ数が少ないので割愛。

f:id:d01tsumath:20200225201012p:plain
データ投入完了!

今回はここまで。
次回は、実際にデータベースから名前を取得して Bot に名前を呼ばせたり名前に反応したり...の部分を作っていこうと思います。