aster/auto_reply/
message.rs1use std::collections::HashMap;
6use std::time::Duration;
7
8use chrono::{DateTime, Utc};
9use serde::{Deserialize, Serialize};
10
11use crate::auto_reply::keyword_matcher::KeywordMatchResult;
12use crate::auto_reply::registry::AutoReplyTrigger;
13use crate::auto_reply::types::TriggerType;
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct IncomingMessage {
18 pub id: String,
20 pub sender_id: String,
22 #[serde(default)]
24 pub sender_name: Option<String>,
25 pub content: String,
27 pub channel: String,
29 #[serde(default)]
31 pub group_id: Option<String>,
32 #[serde(default)]
34 pub is_direct_message: bool,
35 #[serde(default)]
37 pub mentions_bot: bool,
38 pub timestamp: DateTime<Utc>,
40 #[serde(default)]
42 pub metadata: HashMap<String, serde_json::Value>,
43}
44
45#[derive(Debug, Clone)]
47pub enum RejectionReason {
48 NotInWhitelist,
50 InCooldown { remaining: Duration },
52 GroupNotActivated,
54 RequiresMention,
56 TriggerDisabled,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct TriggerContext {
63 pub trigger_id: String,
65 pub trigger_type: TriggerType,
67 pub message: IncomingMessage,
69 #[serde(default, skip)]
71 pub match_details: Option<KeywordMatchResult>,
72 pub triggered_at: DateTime<Utc>,
74 #[serde(default)]
76 pub extra: HashMap<String, serde_json::Value>,
77}
78
79#[derive(Debug, Clone)]
81pub enum TriggerResult {
82 Triggered {
84 trigger: Box<AutoReplyTrigger>,
85 context: Box<TriggerContext>,
86 },
87 Rejected { reason: RejectionReason },
89 NoMatch,
91}