大石泉にほめられよう
12月に入りお布団から出るのと土屋亜子さんを金嫌いにするのはどっちが楽だろうかと考える気温になってきましたね。たぶんお布団から出るほうが簡単です。プロデュースお疲れ様です、宮野でございます。大石泉すき。
この記事は「大石泉 Advent Calendar 2018」の12月8日の記事として書かれております。
[blogcard url="https://adventar.org/calendars/3007"]
昨日の記事(ツイート)は砒素さんの大石泉すきポーカーが実際にあった場合の裏面のデザイン案でした。
[blogcard url="https://twitter.com/hiso_123P/status/1071021609174020096"]
一昨日はAS ISさんが大石泉すきポーカーの役判定プログラムを書かれていたこともあり、少し興味が出てWikipediaでポーカーのルールを見てたんですけどさっぱりわからんという感じでした。花札こいこいが限界のようです。悲しい。
こちらのアドカレには初めて参加します、宮野といいます。大石泉Pというわけではないのですがたまに大石泉すきとつぶやく底辺プログラマーです。https://miyacorata.net にいろいろ置いてありますのでよかったら見ていってくださいね。
昨年はここではありませんが別のアドベントカレンダーでこんな記事(スライド)を作ったりもしていましたので気が向いたらぜひ見ていってください。
[blogcard url="https://niconare.nicovideo.jp/watch/kn2816"]
さて、ネタとしては「Discordで進捗報告したら褒めてくれる大石泉botとか作ってみるか」と思っていたんですが。
[blogcard url="https://qiita.com/0014123P/items/f1b2e634934be3198b98"]
あっ...
ネタがかぶるとかこんなことではへこたれません...
大石泉はプログラマーアイドル...きっとDiscordではなくあのコミュニケーションツールも使っているに違いありません...
Slack版を作りましょう
へこたれずアイドルにコミットしていきましょう。
Slackってなんだ
Slackはプログラマー御用達のコミュニケーションツールです。
こんな感じで使うツールです。Discordに似ていますがコードスニペットを投げたりマークダウンで書いた簡単な書類を投げたりとDiscordよりは開発者寄りの機能がとても充実しています。
ちなみに、大石泉が好きなPさん向けのワークスペースもありますのでこのカレンダーの主催にしてSlack管理者であらせられるASISさんにお尋ねくださいね。
で、なんかもう写っちゃってますけど今年の1月にも似たようなのを作っていました
[blogcard url="https://github.com/miyacorata/IzuminBot"]
こちらはPython版でしたが今回はこれと同じ機能とプラスアルファで別の言語で作りましょう。Python飽きたとかちょっとめんどいとかそんなんじゃないよぜったいに
用意するもの
今回はRubyを使っていきます。Rubyは1995年に日本で生まれたプログラミング言語で、例えばmastodonはRubyとフレームワークであるRuby on Railsで開発されています。
Slack Botインテグレーションの用意
SlackでBotを作るにはBotインテグレーションを作成する必要があります。
https://my.slack.com/services/new/bot で作成、名前を決めればすぐAPIキーが払い出されます。下の方にスクロールしたらアイコンや表示名の設定もできますのでここも済ませておけばそれっぽさが増します。強くおすすめします。
gemを用意する
gemというのはRubyで使えるライブラリのようなものです。先人の知恵は使わせていただくに限ります。Gemfileに必要なものを書いて bundle install しておきます。
source 'https://rubygems.org' gem 'dotenv' gem 'async-websocket' gem 'slack-ruby-client'
- dotenv - 設定を .env という名前のファイルに書き込んでおくと環境変数の形でぶちこんでくれます。とっても便利。
- async-websocket - なんかslack-ruby-clientのGitHubに書いとけって書いてあった
- slack-ruby-client - SlackのAPIを使いやすい形にしてくれています。(これがないともうちょっとめんどくさいコードになる)
コードを書く
立ち上げまで
ここから先いよいよRubyのコードを書きます。izumi.rbというファイル名にしておきましょうか、
require 'rubygems' require 'bundler/setup' require 'dotenv' require 'slack-ruby-client' puts 'IzuminBotV2 Starting...' puts Time.now # .envの読み込み Dotenv.load # トークンの設定 Slack.configure do |conf| conf.token = ENV['TOKEN'] puts "#{Time.now}:Bot token loaded from ENV." end # クライアントインスタンスの生成 client = Slack::RealTime::Client.new puts "#{Time.now}:RTM Client loaded." # 起動時の処理 client.on :hello do puts "#{Time.now}:IzuminBotV2 READY!!" end
requireで今回お世話になる外部ライブラリを読み込みます。bundlerを使う関係でrubygemsとbundler/setupも読ませます。
Dotenv.load で .env を読ませるとこれ以降は通常の環境変数と同様に ENV['TOKEN'] みたいな感じに参照できるようになります。便利ですねぇ~
メッセージに対する処理
# メッセージが飛んできたときの処理 client.on :message do |data| puts "#{Time.now}:Message received." pp data # 声をかけられたら返事します if data['text'] =~ /^(いずみん|大石|泉)(ちゃん)?、?いる/ client.message channel: data['channel'], text: 'いるよーどうかした?' end # 進捗orがんばりを褒めます if data['text'] =~ /ほめて|がんばった|進捗(?! だめ)/ client.message channel: data['channel'], text: 'えらい!' end # はげまします if data['text'] =~ /つらい/ client.message channel: data['channel'], text: '大丈夫、きっとできるよ...!' end end
メッセージが飛んでくるのを client.on メソッドを使って待ち受けます。とんできたらすぐメッセージのテキストを正規表現をつかって当てはまるようであれば定型文メッセージを投稿します。
正規表現というのは複数の文字列を一つの文字列で全パターン表現しちゃおう!というクッソ強いやつです。たとえば /^(いずみん|大石|泉)(ちゃん)?、?いる/ の場合、「いずみんいるー?」でも「大石ちゃん、いるかな」とかいろんなパターンに対応できます。すごいですよね。
正規表現はRubyに限らず大抵の言語(Brainfuck及びその方言である大石泉すき言語は難しいですが)で文字列の判定に使えるため覚えておいて損はないです。
Bot起動!
client.start!
start! と威勢がいいな~とぼくも一瞬思ったんですが、! をつけることで実行してエラーが起きた場合に例外を投げるようです。これがないと返り値がnilになるそうなのでそらつけるわなって思いました。
ここまでのコードで全部動きます。早速動かしてみましょう!以下のコマンドで動き始めます。
bundle exec ruby izumi.rb
できました
なんかニヤけてきますね。
いつもの開発作業が楽しみになりそうです。
今回書いたコードはすべてGitHubに上げてありますのでご自由に引っ張ってお手元で動かしたりRuby書けるよ!って方はforkして改造してくださいな(マサカリ的プルリクは真摯に受け止めます)
[blogcard url="https://github.com/miyacorata/IzuminBotV2"]
おわり
Rubyに限らず、プログラムを書いてそれが思い通りに動くと楽しいです(思い通りに動くとは言ってない)。いずみんはそれを思い通りに動かすまでの過程も楽しんでいそうなので強か~と思っているわたくしです。精進しよう。
ところで12月にも入りウインタースポーツの季節真っ盛りですね、たまには外に出てなにかこの季節ならではのスポーツを楽しんでみてもいいのかもしれません。例えばスノボとか。うーん(財布との相談)
ここまでお読み頂きありがとうございました! では、皆様ご唱和ください。
大石泉すき!