KMKMの補足メモ

Twitterじゃ書ききれないことを記事にしています

【IFTTT】iOS複数端末対応のスタミナ通知リマインダー(スタミナ漏れ超絶気にする人向け)を作った

f:id:kmkmdouga:20200606164238j:image
 世はソシャゲ掛け持ち時代。複数のソシャゲを同時にすることが前提の毎日で、
運営側もそれを鑑みてスキップ機能やオート周回などのスタミナ消化を楽にする設備を整えている。

 加えて、ありがたいことに最近のソシャゲは複数端末でセーブデータを共通できる。同じOS(iOS)間であればAppleIDやGame Centerアカウントで一瞬で引き継ぎも完了だ。スマホAでTwitterをまさぐっている間に、スマホBでスタミナをオート周回で消化してもらえるという算段だ。

 

アプリ備え付けのスタミナ通知は当てにならない

 そこで問題になってくるのが、複数端末で同じソシャゲを起動し、スタミナを消化した場合、アプリ固有のスタミナ回復通知への信ぴょう性が損なわれることだ。

 例えば、とある最大AP(スタミナ)が100のアプリで、スマホAでスタミナを50消費した後、スマホBでスタミナをまた50消費して残量を0にしたときに、スマホAでまだスタミナが100溜まりきってないのに「スタミナが満タンになったよ!」と紛らわしい通知が流れてきてしまうのだ。

 スタミナ通知管理のプログラムがローカルで行われていると推測する以上、避けようのない問題なのだ。

※おそらくホーム画面かなんかのタイミングで「最大AP-現在AP=満タンになるまでのリマインダー」を生成してスマホ端末内に置いている仕組みだと思われる。アカウントごとにオンライン管理はさすがにしてない。

そもそも100%じゃなくて9割で通知してほしい

 いざ通知が来られても、手を離せない状況というのは多々あるだろう。その間にもAP漏れは刻一刻と発生し、スタミナ消化のモチベを奪っていく…というのが嫌なので私はスタミナタイマーアプリを用いて、APが9割になったタイミングで通知してもらえるようにした。

f:id:kmkmdouga:20200606170806j:image

 これでスタミナ漏れを気にせずに遊べるし、万が一管理アプリの通知を見逃しても
アプリ側の「スタミナが満タンになりました」通知で2度回復をお知らせしてもらえる素晴らしい状態となった。

管理媒体を1つに絞りたい、もっと対応幅を広げたい

 昨今の自粛生活の中でひと頃は掛け持ちソシャゲの数が増えていたという方はいるのではないだろうか。私がそうだ。(記事書いている今はそうではない)

 FGO・アークナイツ・グラブル・プリコネ・デスチャ・エピックセブン・ワーフリ・MHR・ブレスロ・ツイステetc…ほとんどがオート周回に対応していて、ながらでできるゲームだが、スタミナの上限や回復時間では通知状況にパターンが異なる。

A.1回消費しきったら12~14時間ぐらいやらなくていい

 FGO・アークナイツ・プリコネ・MHRがこれに該当する。大体1APあたりの回復時間が5~6分で、上限が120~160。一度0付近まで消化しきってしまえば、次回アプリ起動が12~14時間後ぐらいになる。ちまちま起動する必要が薄いが、通知確認を忘れるといつの間にかAP漏れしまくってる代表パターン。

B.7時間以内に消化しなおす

 グラブルデスチャ・エピックセブン・ドラガリ・ワーフリがこれに該当する。1APの回復時間が5分で、上限が70~120。通知をしておかないと学業や仕事終わりにすっかりAP漏れしてるパターン。グラブルやドラガリはAP消化が秒で終わるので問題ないが、それ以外のアプリはオート周回をしてちまちま減らしていくタイプなので、消化にもちょっと時間がかかる…

 特にツイステは「15分で1回復、最大10AP」なので2時間半で0から10までになってしまう。もうちょっと上限上げて?

C.無限に放置周回する

 ブレスロ・MHR。大量のスタミナ回復薬を配布し、かつ長時間のオート周回に対応している。無限にAPを配布し、無限に周回させる。寝ている間や、家を離れている間に自動で周回してもらうタイプ。そもそもスタミナ管理の必要性がない。周回時間 > AP回復時間とかザラ。


 こういったアプリ全てをスタミナタイマーで管理したいのだが、使ってるアプリでは同時に登録できるタイマーが6つまでという制約があった。お金だして無制限版があったら即座に買っていたが、そんなものもなかった。(そもそも数年前に開発終了のにおい)

 また、ソシャゲの時間計画で回復する"スタミナ"は1アプリ1つだけではない。例えばPVPやレイドの挑戦チケットだ。

 デスチャでは定期的にワールドボスというレイドイベントが行われる。レイドボスに挑む際にチケットが1枚消費する。チケットは2時間に1枚ずつ溜まり、最大6枚まで保持できる。

 この手の「1APあたりの回復時間が60分以上」のパターンにも、スタミナタイマーには対応してなかった。むしろ対応しているアプリのほうが珍しいというか… いろいろなスタミナタイマーアプリを試してみても、「管理のためにアプリを起動する必要がある」「アプリごとのスタミナ設定がややこしい」「そもそも入力自体が面倒」と肌に合わなかった。


リマインダー作戦、発動

 じゃあ大体の回復時間を予測して、それをアカウント登録型のリマインダーに入れればよくね?と感じてまずはMicrosoft Todoを試した。アカウントさえ登録すれば、スマホからでもPCからでも予定登録ができるのだ。
 が、これはダメだった。PCから登録した通知はアプリから通知されない。一度アプリを起動しても同じ。アプリを起動して予定を入れるのはむしろ効率が悪くなっている。

 

LINEのリマインダー

 LINEの公式アカウントの1つに、「リマインくん」というアカウントがある。
通知してほしい事項と設定時刻を伝えると、LINE通知からリマインドさせてくれるのだ。LINE IDで同じアカウントにログインすれば、全ての端末から通知がきてくれた。

 だがめんどくさい。いちいち要件と時間を伝えなければならない。現在APから計算して通知する時間を設定しなければならないし、そのたびにLINEアプリから手文字で入力するのもめんどくさい。なので長続きしなかった。


IFTTTとの連携作戦、開始

 じゃあせめて、タイトル名と現在APを設定したら、自動的に通知設定をしてくれないだろうか?そんなアプリはなかった。自分にアプリを作る技能なんてない。苦肉の策を講じるしかない。

 むかーし、IFTTTを使ったことがある。うまいこと活用できないかいろいろ試してみた。数多くある対応のアプリの中から、インプットとアウトプット的にうまくいきそうなもの選んだ結果、

Twitterでつぶやく → Google スプレッドシートに情報記載 → シートで時間計算 → 通知時間をiOSリマインダーに登録

という流れになった。

大量のサービスに対応した連携サービス。「サービスAであることをしたらサービスBに別のあることをさせる」ということができる。

1.TwitterGoogle スプレッドシートに記載

 IFTTTで組めるアプレット(機能)としてTwitterの特定ツイートの内容を、別媒体にコピーできる。EvernoteとかGoogle Documentとか。これを使ってデータ入力をする。


 入力の際に絶対必要な情報が3つある。「アプリ名」「現在のAP」「情報を入力した時間」だ。うち2つはツイート内容を「FGO 4」みたく入力すればいい。スプレッドシート側で空白で区切るように関数を組めばできそうだ。

 問題は「情報を入力した時間」だ。データ入力に検知して時間を表示させる関数(TIME関数など)をスプレッドシート側で用意したいが、IFTTT経由でデータを送る際に最大数時間のラグが発生することはIFTTTに慣れたユーザーなら誰しも経験済みだ。

 なので、ツイートした時間を「情報を入力した時間」として用意すればいい。長時間のラグが発生しても、参照元はツイートした時間だから確認が遅れても問題ない。

f:id:kmkmdouga:20200606003452j:plain

 こんな感じでどうだろう… Textに「FGO 4」って入れたツイートが、CreartAtにツイート日時がその都度入る。このデータがスプレットシートに1行ずつ追加されていく。後はデータをシート側で調理してやれば…

 試しにツイートで呟く。一度連携すると、鍵アカウントでもちゃんとシート側に反映されていた。エゴサ妨害にならずにすむ。新しく生まれたシート、その1行目に書かれていた内容とは…

 

「テスト 10/May 20, 2020 at 01:42PM

 

( д) ゚ ゚

 いや何だこの日付表示!? 驚くほどにデータ変換との相性が悪い!いや普通に「2020/05/20 13:42」な出力でいいでしょ!?なんで月を英語3文字にした?atもなぜ入れた?そして24時間表記じゃないの!?!?!?

 このぐっちゃぐちゃの表記をどーにかこーにか分解して関数との兼ね合いができる形に修正する戦いが、幕を開けた…

 

2.シートで時間計算

 ひとまず謎の日付表示に怯えつつも、ゴリ押しでデータ分解を行おうと試行錯誤してみた。結果から先に教えよう。

f:id:kmkmdouga:20200606005837j:plain

A列:入れたデータ B列:タイトル抽出 C列:現在AP D~G列:データ入力時刻
H列:組み合わせてTIME関数で使えるようにしたもの
I列:設定したAPになるまでの時間(分) J列:I列の時間を足したもの

 B~G列にはREGEXEXTRACT関数を使用した。Googleスプレットシート限定の関数で、特定の状況に一致する文字列を取り出すことができる。

それぞれに設定した関数は以下の通り。

B列(タイトル抽出)

=ARRAYFORMULA(IFERROR(REGEXEXTRACT(A1:A,"(.+?) "),""))

C列(現在AP抽出)

=ARRAYFORMULA(IFERROR(REGEXEXTRACT(A1:A," (.+)/"),""))

D列(年)

=ARRAYFORMULA(IFERROR(REGEXEXTRACT(A1:A,"(....) at"),""))

E列(月) ※1

=ARRAYFORMULA(IFERROR(Vlookup(REGEXEXTRACT($A$1:$A,"/(...)"),'シート2'!D$1:$E$12,2,FALSE),""))

F列(日)

=ARRAYFORMULA(IFERROR(REGEXEXTRACT(A1:A,"(..),"),""))

G列(時間)

=ARRAYFORMULA(IFERROR(TIMEVALUE(REGEXEXTRACT(A1:A1257,"at(.+)")),""))

H列(年月日と時間くっつけた)

=ARRAYFORMULA(IFERROR(DATE(D1:D,E1:E,F1:F)+G1:G,""))

I列(回復の時間計算) ※1

=ARRAYFORMULA((IFERROR((VLOOKUP(B1:B,'シート2'!$A$1:$C$13,3,FALSE)-C1:C)*VLOOKUP(B1:B,'シート2'!$A$1:$C$20,2,FALSE),"")))

J列(回復予定時刻) ※2

=ARRAYFORMULA(IF(ISBLANK(A1:A1272),"",H1:H1251+I1:I/1440))

 

※1

f:id:kmkmdouga:20200606161018j:plain

 別シートでVLOOKUP関数の為の対応表を用意した。E列の月表示を数字に変換させて、I列にはアプリ名ごとに1APあたりの回復時間(分)と目標APを記載し、

最大AP - 現在AP = 回復するAP量 × 1APあたりの回復時間 = 必要回復時間(分)

を出力させた。

 

※2

J列全体を選択し、

「表示形式」→「数字」→「表示形式の詳細設定」→「カスタム数字形式」で

yyyy"/"mm"/"dd" "hh":"mm":"ss

で設定し、「8時」→「08時」の形式で表示させる。

IFTTTくんは24時間式の対応にめっぽう弱い。この設定が無いとリマインダー送りにする際にヘンテコ設定をかます。ひどい

 

 これらの関数全てにIFERROR関数でデータが入っていない時は空白状態にできるようごまかしをかけて、最後にGoogle スプレットシート限定の最高便利関数、ARRAYFORMULA関数をかぶせる。

 ARRAYFORMULA関数は本来1行にしか設定できない関数(今回はREGEXEXTRACT関数がそう)を複数行に引き伸ばし、自動でデータが入り次第無限に計算をしてもらえるぞ!!これで関数の範囲継ぎ足しとかしなくていいぞ!!

 こうして、クセの強いデータを再利用可能にし、回復時間を計算し、回復予定時刻を用意することができた。あとはリマインダーに突っ込むだけ!

 

3.通知時間をiOSリマインダーに登録

 Apple IDと連携すればリマインダーとの連携も可能になる。

f:id:kmkmdouga:20200606163649j:plain

 設定は単純!さっきのスプレットシートを参照元に、リマインダータイトルをB列(アプリ名)、Alarm dateにJ列を設定するだけ! Priorityは適当にHighにしてる。こうすれば列が更新されるたびに、リマインダーが新しく登録される。

 

願いは叶った…のか?

f:id:kmkmdouga:20200606164251p:image

 ついに願いは成就した。Twitterでかるーく呟くだけでリマインダーが勝手に設定される。リマインダーアプリはApple ID共通、ゆえにどの端末からでもこの内容は見れるし、管理もできる。通知もくる。完璧か?

 …でもまだ足りないところはある。満足できないところはある。あとはそこを補いたい。

Twitterゆえの致命傷

 データ入力媒体をTwitterに頼ってると避けて通れないのが「同じツイートはできない」点。繰り返し同じようなAPになるソシャゲ消化では、このポイントは結構面倒だ。

 これは最大APが100ぐらいのゲームなら1ぐらいずれても大丈夫だが、ツイステのように最大APが10とかだと1違うだけでもだいぶ時間通知がずれる。これはマイナス。

 加えて、IFTTTとTwitter連携最大の欠点、反映までラグタイムがめっちゃ大きい。Google スプレットシート→リマインダーは即座に反映されるが、TwitterGoogle スプレットシートの反映時間が非常に長い。30分~数時間。

 ラグによる設定時間ズレはツイート時間を参照元にしているので心配ないが、通知時間 > 反映時間なんてことになったら目も当てられない。

 何よりも、いちいちツイートするのは前時代ですね!!!もっと手間いらずに設定したい!ワンボタンで通知するようにできないかな?

 ん?ボタン…?

 

最後の答え、ウィジェットボタン

f:id:kmkmdouga:20200606172726j:plain

 あ り ま し た。ボタンウィジェット。IFTTTにありました。iOSウィジェットにボタンを表示させる機能です。

 

f:id:kmkmdouga:20200606174123j:plain

※アークナイツは120AP貯まる時間をリマインダー設定。実際の最大APは128。

 スプレットシートに直接叩き込ませるボタンを用意する。アークナイツはCE-5やLS-5を周回してれば120AP溶ける。アナログだけど手間が省けるならいい。

 IFTTTはアプレットをそのままコピーできないので、1つ1つ似たようなものを設定してやらないといけないが…アプリごとに1度きりなので我慢。

f:id:kmkmdouga:20200606185433j:image

  ボタンができた。ワンポチでリマインダー登録。このボタンもすべての端末から使える。素晴らしい!ついに理想のAP管理が生み出せた!これで毎日のソシャゲ消化もAP漏れを気にせずにできるぞ!

 

 これで管理しきれないようなアプリはログボ放置とか、そもそもログインしなければいいので! ゲームは気の持ちようでやればいいです。気分が沈んでるときとか何もやりたくない時に無理してやるものでもない。

 

 ソシャゲのスタミナに生活を管理される日々を過ごしている人(つまり私)向けに、わずかながらでも助けになれば幸いです。

 

おわり