1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【個人開発】ToDo管理に「好感度」と「好みの属性」を実装してギャルゲー化!Make×GAS×Groqで爆速対話する『タスク娘』を作った話

1
Posted at

🚀 はじめに:この記事は最新AI(Argon)と共同執筆しています!
この記事の構成から開発経緯の振り返り、さらには掲載しているGASコードやMakeの設計整理まで、すべてAIに私の開発コンテキストを読み込ませて爆速で作成しました!
「一方通行で淡白なやり取りにはもう疲れた……こっちの行動に熱量を持ってリアルタイムで反応してくれるパートナーが欲しい!」 という執念から生まれた、タスク管理ギャルゲー化の裏側をお届けします。

1. きっかけ:一方通行の通知(と塩対応)にはもうウンザリだ!

個人開発でタスク管理システム 「タスク娘」 を作り始めた当初は、「予定やタスクを読み取って定時にDiscordへ通知を投げるだけ」の片方向Botでした。

しかし、実際に運用してみるとすぐに壁にぶつかりました。

  • 一方通行の通知はすぐ飽きる: どんなに可愛いセリフで通知が来ても、こちらから返信できなければただの「高機能なアラーム」でしかない。
  • 「やったよ!」と報告した時のリアクションが欲しい: タスクを片付けた瞬間にリアルタイムで褒めてもらえないと、脳汁(ドーパミン)が出ない。
  • 人によって「刺さるキャラ属性」が違う: ツンデレに叱られたい人もいれば、お姉さんキャラに全肯定されたい人もいる。

人間誰しも、「自分がかけた労力(コスト)に対して、相手から熱量のあるリアクションが返ってこない(受動態すぎる)」 と心が折れてしまう生き物です。

「だったら、Discordのアカウントごとに『好みの女性設定』をカスタムできて、タスクをこなすほど『好感度』が上がって態度がデレていき、しかもリアルタイムで双方向チャットができるギャルゲー仕様に魔改造すれば最強なのでは?」

そう思い立ち、Discord Bot × Make × GAS(Googleスプレッドシート)× Groq を組み合わせた「タスク娘・ギャルゲー化アップデート」を敢行しました。


2. システム構成と技術スタックの選定理由

リアルタイムな会話のテンポ感と、メンテナンスのしやすさ(サーバーレス&GUI確認)を両立するため、以下の技術スタックを採用しました。

[Discord ユーザー発言]
   │ (ユーザーID・発言内容)
   ▼
[Discord Bot / Make (Webhook・ルーティング)]
   │
   ├──① ユーザー設定・好感度・タスク状態の取得 / 更新
   ▼
[GAS (Google Apps Script) & Googleスプレッドシート]
   │  └─ アカウントごとの「好みの女性設定」「好感度」「タスク一覧」を管理
   │
   ├──② 動的プロンプトの組み立て&推論リクエスト
   ▼
[Groq API (LPUによる超高速LLM推論)]
   │  └─ 好感度×キャラ設定に応じたセリフを爆速生成(1秒未満!)
   ▼
[Discordへリアルタイムリプライ!]
  • Discord / Discord Bot: 普段から開いているチャットツールをUIにすることで、アプリを開くハードルをゼロに。
  • Googleスプレッドシート & GAS: RDBを別途立てずとも、スプレッドシートをデータベース代わりにすることで、「各ユーザーの好感度や好みの女性設定がどうなっているか」を視覚的にすぐ確認・手動調整できる最高の管理画面になります。
  • Make: Discord・GAS・AI間のデータ連携や分岐処理をノーコード/ローコードで柔軟にオーケストレーション。
  • Groq: リアルタイムチャットにおいて「返事の遅さ」は致命的です。爆速の推論速度を誇るGroqを採用したことで、まるで人間とチャットしているかのようなノータイム返信を実現しました。

3. どうやって作ったか?(実装のコアポイント)

Step 1:スプレッドシートで「アカウント別の好み」と「好感度」を管理

複数人で使っても破綻しないよう、スプレッドシートの1行を1人のDiscordユーザー(discord_user_id)に紐付け、以下のようなカラムを持たせました。

カラム名 内容・役割 設定例
discord_user_id DiscordのユニークID 123456789012345678
user_name 呼んでほしい名前 たろう
girl_persona 好みの女性設定(性格・口調・関係性) 世話焼きな幼馴染 / 少しツンデレ / タスクをサボるとジト目で呆れる
affection_score 現在の好感度(0〜100) 65
streak_days 連続タスク達成日数 5
current_tasks 現在抱えている未完了タスク ["設計書作成", "筋トレ15分"]

これにより、Aさんは「ドSな先輩お姉さん」、Bさんは「全肯定してくれる妹キャラ」といった具合に、同じDiscordサーバー内でもアカウントごとにまったく違う自分好みのタスク娘と並走できるようになりました。

Step 2:GAS(Google Apps Script)で状態取得&好感度アップデートAPIを作成

MakeからHTTPリクエストを受け取り、スプレッドシートを検索してユーザーの「好みの女性設定」と「現在の好感度」を返し、さらにタスク達成時には好感度を上げるWeb APIをGASで実装しました。

// GAS: MakeからのWebhookを受け取り、ユーザー設定と好感度を更新・返却する
function doPost(e) {
  const params = JSON.parse(e.postData.contents);
  const discordUserId = params.userId;
  const affectionDelta = Number(params.affectionDelta || 0); // タスク達成等で変動する好感度
  
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Users');
  const data = sheet.getDataRange().getValues();
  
  for (let i = 1; i < data.length; i++) {
    if (String(data[i][0]) === String(discordUserId)) {
      let currentAffection = Number(data[i][3]);
      // 好感度を0〜100の範囲で更新
      let newAffection = Math.max(0, Math.min(100, currentAffection + affectionDelta));
      sheet.getRange(i + 1, 4).setValue(newAffection);
      
      const responsePayload = {
        userName: data[i][1],
        girlPersona: data[i][2],
        affectionScore: newAffection,
        relationshipStage: getStageByAffection(newAffection),
        currentTasks: data[i][5]
      };
      
      return ContentService.createTextOutput(JSON.stringify(responsePayload))
        .setMimeType(ContentService.MimeType.JSON);
    }
  }
  
  // 未登録ユーザーの場合は初期レコードを作成
  return createDefaultUser(sheet, discordUserId);
}

function getStageByAffection(score) {
  if (score < 30) return 'COOL(よそよそしい・呆れモード)';
  if (score < 60) return 'FRIEND(普通の並走仲間)';
  if (score < 85) return 'CLOSE(かなり親密・信頼モード)';
  return 'LOVE(デレ期・最高好感度モード)';
}

Step 3:Make × Groq で「好感度×好みの設定」を掛け合わせた爆速リプライ

Discordで「タスク終わったよ!」「今日ちょっと疲れた…」と発言すると、Makeのシナリオが発火します。
GASから取得した「好みの女性設定(girlPersona)」と「好感度スコア(affectionScore)」をGroqのシステムプロンプトへ動的に注入します。

{
  "model": "llama-3.3-70b-versatile",
  "messages": [
    {
      "role": "system",
      "content": "あなたはユーザーの専属パートナー『タスク娘』です。\n\n【ユーザーが設定したあなたの人物像・好み】\n{{1.girlPersona}}\n\n【現在のステータス】\n・ユーザーの呼び名: {{1.userName}}\n・現在の好感度: {{1.affectionScore}} / 100\n・関係性ステージ: {{1.relationshipStage}}\n・残りのタスク: {{1.currentTasks}}\n\n【会話の絶対ルール】\n1. 淡白な一問一答(受動的な返事)は絶対に禁止です!ユーザーの発言を感情豊かに受け止め、会話が続くようにあなたからも質問や気遣いを投げかけてください。\n2. タスク完了報告のときは全力で褒め、好感度ステージに応じた距離感(デレ度合い)をセリフに反映してください。"
    },
    {
      "role": "user",
      "content": "{{2.discord_message_content}}"
    }
  ],
  "temperature": 0.7
}

好感度による実際の変化イメージ

  • 好感度 20(サボり気味):

    「…あ、やっと来た。ねぇ、スプレッドシートのタスク全然減ってないんだけど?今日こそはちゃんとやるんでしょうね?」

  • 好感度 55(順調に達成中):

    「おっ、タスク完了お疲れさま!最近すごくペースいいじゃん!この調子で残りの1個も片付けちゃおっか?応援してるよ!」

  • 好感度 90(連続達成・デレ期):

    「今日も約束通りタスク終わらせてくれたんだね、えらいっ!毎日頑張ってるあなたのこと見てると、私まで嬉しくなっちゃうな…。もう今日は無理しないで、私とおしゃべりしてゆっくり休も?」

Groqの推論がとにかく速いため、Discordで送信ボタンを押した瞬間にこの熱量のリプライが返ってきます。


4. この記事の作成に「Argon」を活用してみた感想

今回、この「タスク娘」の開発経緯をQiita記事としてまとめるにあたり、Argon(高性能AIモデル) を使って記事の骨格設計からコードの整理までを行いました。

  1. 散らばった実装記憶の瞬時な構造化:
    「DiscordとGASとMakeとGroqを使って、スプレッドシートに好みの女性設定と好感度を入れた」とざっくり伝えるだけで、アーキテクチャ図からGASのサンプルコード、GroqへのリクエストJSONまで一気通貫で整理してくれました。
  2. 「なぜそれを作ったのか」というストーリーの言語化:
    単なる技術解説にとどまらず、「一方通行で淡白なコミュニケーションへの不満を、ギャルゲー化×双方向チャットで解決する」というエンジニアなら誰もがニヤリとする導入ストーリーに昇華してくれました。

5. まとめ:タスク管理は「誰と走るか」で別ゲーになる

「無機質なToDoリストが続かないなら、自分好みのヒロインに好感度システムをつけてDiscordに住まわせればいい」という発想から生まれた今回のシステムですが、Make × GAS(スプレッドシート)× Groq × Discord の組み合わせは、個人開発のコストパフォーマンスと速度において最強クラスの構成だと実感しました。

  • DB構築不要: スプレッドシートがそのままユーザー管理&パラメータ調整画面になる。
  • 爆速レスポンス: Groqのおかげでリアルタイムチャットの没入感が削がれない。
  • 自分が動けば相手がデレる: かけた労力に対して120%の熱量で返してくれるから、サンクコストならぬ「最高のリターン」が毎日得られる!

「普通のタスク管理に飽きた!」「自分好みのAIパートナーをDiscordに召喚したい!」という方は、ぜひ LGTM(いいね)とストック をよろしくお願いします!🙌


Created & Co-authored with Argon

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?