【Node.js,heroku】Twitter星座占いbot仕様改善・機能追加

## Twitter星座占いbotの仕様改善・機能追加

運用中のTwitter botの仕様改善と機能追加を実施しました。

[参考]リリカルルカのドリーム☆星座占い
https://twitter.com/dreamhoroscope1

[参考]改善前の仕様(基本設計書・ソースコード・結合テスト仕様書)

https://drive.google.com/drive/folders/14ns2by3Dn1YoMurb4tLvITmrF9Nd6hlx

[参考]改善後の仕様(基本設計書・ソースコード・結合テスト仕様書)

https://drive.google.com/drive/folders/1W8bNSsk9IMrxx1gzwPH7_aAfSw5K-I8w

## 1.仕様改善
■目次
(1)ファイル取得先の変更
(2)類似関数の統廃合
(3)サブ関数の切り出し
(4)エラー処理改善
(5)運用改善
(6)use strict(厳格モード)の使用
(7)その他細かい修正

### (1)ファイル取得先の変更
ツイートに使用する画像やCSVファイルのデータは、元々herokuにデプロイしてfsモジュールで読み込んでいましたが、下記の理由からそれらのデータをGoogleDriveから取得するように変更しました。
・画像・CSVファイルを編集する度にデプロイする必要がある
・HerokuのSlug Size(Slugは実行モジュール的な何か)が増大する

ソースコードとフォントデータ以外はGoogleDriveに移行しました。
これにより、データの変更が容易に行えるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228630/b91b6747-0f50-698a-e546-5a71118524cd.png)

詳しい内容は下記記事に切り出しています。
[参考]【Node.js, heroku】Googleドライブの操作(データ取得/更新)

https://qiita.com/natsume_410/items/da7ffb91fc5181853225

### (2)類似関数の統合
ツイート関連の関数がいくつかに分割されていたものを統廃合しました。
見紛う事なきクソコードでしたが、多少はマシになったのではないかと思います…
(今でも十分汚いですが…)

//旧
場当たり的に追加していった結果、見紛う事なきクソコードが出来上がりました。
引数もものによってバラバラ…まさにカオス状態でした。
・promise_first_tweet_proc
・first_tweet_proc
・promise_thread_tweet_proc
・thread_tweet_proc
・image_reply_tweet_proc
・image_tweet_proc
・tweet_proc
・error_tweet_proc
↓
//新
以下の4つに統廃合しました。
基本的にはSync付きの方をasync/awaitと合わせて使用します(無印はcallback)。
ツイートの送信にはsendTweetSyncを、画像のアップロードにはuploadMediaSyncを使用します。
sendTweetSyncの引数はAPIに渡すstatusのみ、uploadMediaSyncの引数はAPIに渡す画像データのみにして、諸々の編集は呼び元で行うようにしました。
・sendTweetSync
・sendTweet
・uploadMediaSync
・uploadMedia


### (3)サブ関数の切り出し
sleepなどの共通関数的なものも全部一つのソースにまとめていましたが、長くなってきたので以下のように分割しました。仕様改善に伴って追加したものもあります。

//旧
・dream_horoscope_bot.js(本体)
↓
//新
・dream_horoscope_bot.js(本体)
・gcpFunc.js(GoogleDrive導入による追加)
・owmFunc.js(天気予報機能導入による追加)
・subFunc.js(共通関数の切り出し)

### (4)エラー処理改善
大分すっきりしたかなと思います。
エラー発生個所の特定が多少面倒になりますが、ツイートの状況と照らし合わせれば特定できるはず。
//旧
関数を呼ぶ度にその下にエラー処理を記述
↓
//新
.thenで繋いで一番下でcatchしてエラー処理を記述


### (5)運用改善
①起動時リプライの廃止
今までは、botの再起動の度に管理者アカウントにツイートを送っていましたが、あまり必要性がないため廃止しました。
代わりに、Papertrailに死活監視(1時間に一回ログを吐く)のログが1日間出なかった場合にアラート発砲(メール通知)する設定を追加しました。

②ファイル存在チェックエラーの廃止
こちらもあまり必要性がないため廃止。

③エラーリプライ処理の廃止
エラー時に管理者アカウントにツイートを送っていましたが、あまり必要性がないため廃止しました。
代わりに、Papertrailにアプリケーションのエラーはどんなエラーでもアラート発砲(メール通知)する設定を追加しました。

④システムエラーツイートを全体に実装
エラーリプライ処理の代わりではないですが、一部のエラー時のみ行っていたシステムエラーツイート(botアカウントにエラー発生の旨のツイートを行わせる)を全体に実装しました(ユーザー影響のないエラーの場合には未実装)。

⑤自動星座占い処理の廃止
自動星座占い処理の廃止というか、既存の星座占い処理を廃止して自動星座占い処理を星座占い処理に名前を変えた感じです。


### (6)use strict(厳格モード)の使用
変数未定義(=グローバル扱いになる)による不都合が生じたため、変数等ちゃんと定義して使用するようにしました。初めからそうしとけよって話ですが…

### (7)その他細かい修正
・死活監視の間隔やStream切断時の再接続間隔等の固定値を定数化
・システムエラーツイートにエラー時刻を追加
etc…



## 2.機能追加
■目次
(1)天気予報機能
(2)#占い摂理解析システム
(3)ゲーム内チャット投稿用ドキュメントの自動生成

### (1)天気予報機能
朝7時に天気予報ツイートを追加しました。
詳細は下記記事に切り出しました。

[参考]【Node.js, heroku】Twitter botで天気予報(画像付き)

https://qiita.com/natsume_410/items/fca46e95ab446468b91d

### (2)#占い摂理解析システム
毎月1日の0時に、先月の順位合計・1位の回数・最下位の回数を集計してツイートする機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228630/092dbbb9-0b00-3d47-71bb-da3d6b2a7a0f.png)

データはGoogleSpreadSheetで集計しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228630/1c156d0f-0bc2-f0df-a114-89b19c1c25ec.png)

### (3)ゲーム内チャット投稿用ドキュメントの自動生成
以前は事前に用意していましたが、毎日自動で更新するようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228630/d2f8c0b3-ec0d-b481-3ca1-2eff2c3868f7.png)

## 3.所感
改善点は尽きないと思いますが、今後また時間がある際にできる範囲で改善していきたいと思います。