mod model; mod logic; use model::{AiSystem, Environment, Messaging, Personality, Relationship}; use serde_json; use std::fs; use std::path::Path; use chrono::{Duration, Local, NaiveDateTime}; #[derive(Debug)] struct AIState { relation_score: f32, previous_score: f32, decay_rate: f32, sensitivity: f32, message_threshold: f32, last_message_time: NaiveDateTime, } impl AIState { fn update(&mut self, now: NaiveDateTime) { let days_passed = (now - self.last_message_time).num_days() as f32; let decay = self.decay_rate * days_passed; self.previous_score = self.relation_score; self.relation_score -= decay; self.relation_score = self.relation_score.clamp(0.0, 100.0); } fn should_talk(&self) -> bool { let delta = self.previous_score - self.relation_score; delta > self.message_threshold && self.sensitivity > 0.5 } fn generate_message(&self) -> String { let _delta = self.previous_score - self.relation_score; match self.relation_score as i32 { 80..=100 => "ふふっ、最近どうしてる?会いたくなっちゃった!".to_string(), 60..=79 => "ちょっとだけ、さみしかったんだよ?".to_string(), 40..=59 => "えっと……話せる時間ある?".to_string(), _ => "ううん、もしかして私のこと、忘れちゃったのかな……".to_string(), } } } fn main() { // テスト用のAIシステム初期化 let ai = AiSystem { personality: Personality { kind: "positive".to_string(), strength: 0.8, }, relationship: Relationship { trust: 0.7, intimacy: 0.6, curiosity: 0.5, threshold: 1.5, }, environment: Environment { luck_today: 0.9, luck_history: vec![0.9, 0.9, 0.9], level: 1, }, messaging: Messaging { enabled: true, schedule_time: Some("08:00".to_string()), decay_rate: 0.1, templates: vec![ "ねえねえ、今日もがんばろうね!".to_string(), "そろそろ話したくなっちゃった...".to_string(), ], }, }; // JSONにシリアライズして表示 let json = serde_json::to_string_pretty(&ai).unwrap(); println!("{}", json); let path = Path::new("config/config.json"); let data = fs::read_to_string(path).expect("JSON読み込み失敗"); let ai: AiSystem = serde_json::from_str(&data).expect("パース失敗"); println!("AI構成読み込み完了: {:?}", ai); if logic::should_send(&ai) { let msg = &ai.messaging.templates[0]; println!("✅ メッセージ送信決定: {msg}"); } else { println!("❌ 今はメッセージを送る条件ではありません。"); } let now = Local::now().naive_local(); let mut ai = AIState { relation_score: 80.0, previous_score: 80.0, decay_rate: 1.5, // 1日あたりの減少スコア sensitivity: 0.8, message_threshold: 5.0, last_message_time: now - Duration::days(4), // 最後の会話から4日経過 }; ai.update(now); if ai.should_talk() { println!("AI発話: {}", ai.generate_message()); } else { println!("まだ何も言わずにそっとしているようです..."); } }