Yuji Yamamoto (山本悠滋)
2018-07-13
メッセージ送信どうしてる?
メッセージ送信どうしてる?
__∧______
(Haskellで!)
その現実
こんな感じ?
// ユーザーごとの状態を管理する連想配列
const statusByUser = {};
// ユーザーごとの状態を表すenum的なもの
const LISTENING_JOBS = 0;
const LISTENING_ACHIEVEMENT = 1;
こんな感じ?
// 「報告」と発言したユーザーの状態を更新
robot.respond(/報告/, (res) => {
statusByUser[res.message.user.name] = LISTENING_JOBS;
res.replay("今日はどんな業務をしましたか?");
});
こんな感じ?
// 業務を報告したユーザーの業務を追加
robot.respond(/.*/, (res) => {
const user = res.message.user.name;
if (statusByUser[res.message.user.name] === LISTENING_JOBS){
logJob(user, res.match[0]);
};
// ...
});
こんな感じ?
// 「。」と発言したユーザーに達成度を尋ねる
robot.respond(/。/, (res) => {
if (statusByUser[res.message.user.name] === LISTENING_JOBS){
statusByUser[res.message.user.name] = LISTENING_ACHIEVEMENT;
}
res.send({
question: "達成度はどれくらいですか?",
options: [/* ... */]
});
});
※詳しくはこちら
※抜粋した上で、本質的でない部分を削っています。雰囲気だけ感じ取ってください。
-- 「報告」を含むメッセージを受け取ったら
-- 「Channel」を通したユーザーとの会話を始める
handleCreateMessage client (D.Txt txt)
| "報告" `T.isInfixOf` txt =
forkIO (D.withChannel client nippo)
全体の流れが把握しやすい!
nippo chan = do
jobs <- askJobs -- 業務を尋ねて
logJobs jobs -- 業務を記録して
eval <- askEvaluation -- 評価を尋ねて
logEvaluation eval -- 評価を記録して
bye -- さようならの挨拶
-- 業務を訪ね始める
askJobsLoop jobs = do
-- 「Channel」に紐付いた相手からのメッセージだけを受信
msg <- D.recv chan
-- 「。」と相手が回答するまで尋ね続ける
case msg of
D.Txt "。" -> return jobs
D.Txt job ->
askJobsLoop (job:jobs)
recvLoop = do
msg <- D.recv chan
-- 数値を選んだときのメッセージ以外はエラー
case msg of
D.SelectA _ _ ans -> return ans
_ -> do
D.send chan (D.Txt "数値を選んでください。")
recvLoop
wake wordを受け取る前
誰かからwake wordを受け取った時
誰かからwake wordを受け取った後
メッセージにちゃんと型をつけたよ!
stamp
のときはstamp_set
,
stamp_index
からスタンプの情報を取り出すyesno
のときはresponse
から回答を取り出すdirect4bコマンドを作りました。
シェルスクリプトなどに組み込んで使うことを想定しています。
インストール例・使用例(要: Stack)
$ git clone https://github.com/iij-ii/direct-hs.git
$ stack install
$ echo こんにちは、世界! | direct4b -- send <TALK_ID>
Space, Right Arrow or swipe left to move to next slide, click help below for more details