前提
最近社内業務システムのためにSlack連携アプリを開発する話があり、社員でプロトタイプの開発を行っています。今回は自分が開発している仮想通貨チェックアプリの紹介そして開発状況について報告を行いたいと思います。
#自分が制作したアプリ:仮想通貨チェッカー
仮想通貨の売買を行っている同僚が多いため、Slackにて仮想通貨の変動をチェックできるアプリを作成しました。
https://github.com/zikaa/slack-cryptocurrency-checker
利用できるコマンド
-
/ccc list
:主要な仮想通貨5つをリストアップしてくれます。 -
/ccc <currency_name>
:指定した通貨をリストアップ、コンマを使用することで複数指定できます(例:/ccc btc,eth,etc
) -
/ccc <currency_name> <exchange>
:指定した通貨を他の仮想通貨の単位でリストアップします(例:/ccc btc eth
)
#開発環境
- 使用言語: Javascript
- 開発環境: Nodejs Version8.1
- ホスティング: Heroku
#参考にした記事
・BotkitでSlackのSlash Commandを作る
つまづいた点としてはRedirect URLsの設定がアプリ作成時に設定できなくなっており、アプリをインストールできなかったことでした。これはAdd features and functionality>Permissionsにて行えます。
#Node Version8.1
実行環境としてNodejs V8.1を指定している理由としては便利なAPIが豊富に実装されているためです。とくにasync/awaitをネイティブAPIで利用できることはコールバックのネスティングを防ぎ、またそれによってコードの可読性を獲得することできます。その他に便利なAPIとしては
- 分割代入
const { HIGH24HOUR, LOW24HOUR, PRICE, CHANGE24HOUR, FROMSYMBOL } = currency[exchange];
- Object.values()
const availableCoinList = Object.values(coinList.Data).map(data => { return data.Name});
- デフォルト引数
const filterCoins = (currencies = [], exchange = "USD", coinList = {}) => {}
- テンプレート文字列
"author_icon":`https://www.cryptocompare.com/${ImageUrl}`,
"fallback": `Current rate for the ${FROMSYMBOL} is ${formatPrice(PRICE, exchange)} ,
- アロー関数
const doSomething = () => {}
などが挙げられます。これらのAPIのおかげでコードの行数をかなり抑えることができました。
#Heroku
HerokuをV8で実行する
HerokuをV8環境にて実行するにはpackage.json
にて
"engines":{
"node": "8.1"
}
と記述してデプロイを行います。
HerokuとGithubを連携する
HerokuはGithubと連携を行うことができます。これによってGithubにプッシュを行うとHerokuにも自動的に更新され、GithubとHeroku両方にプッシュする手間が省ける上に、GithubとHerokuで実行されているコードが違うなどという問題が発生しなくなります。
Githubと連携を行う方法
- Herokuにログインする
- Slackアプリを実行しているappsを指定する
- deployを選択すると以下の画面が表示されるので、
Deployment method
を選択後リポジトリと連携を行います。 - 連携後、
Automatic deploys
にてブランチを指定すれば、そのブランチが更新されるたびに自動デプロイが行われます。
#感想
- NodeV8を利用することによってコーディングがめちゃくちゃ気持ちいい
- async/await最高
- Herokuでのホスティングは非常にお手軽なのでおすすめ
- Slackは送信できるフォーマットが予め決まっているため、自由度が低い
- Herokuにデプロイを行うたびにアプリを再連携する必要があり、面倒である。
- 今後はデータベースと接続することによってユーザーごとにリストアップできる仮想通貨をカスタマイズできるようにしたいが、スパム攻撃を防ぐ方法を見つける必要がある。