oxidebot 0.1.8

A lightweight yet powerful chatbot framework
Documentation
use std::collections::BTreeMap;

use chrono::{DateTime, Utc};
use serde_json::Value;

use crate::{
    application::{MiniAppEvent, SuggestionRequest, SuggestionSelection},
    collaboration::{ActivityState, CallSession, PinnedMessage, ReactionChange, ReadReceipt},
    commerce::{CheckoutRequest, Payment, ShippingRequest, Subscription},
    content::{Checklist, ChecklistChange, MessageEnvelope, Poll},
    conversation::{
        ConversationMember, ConversationProfile, ConversationRef, JoinRequest, MessageRef,
        PermissionSet, Thread,
    },
    interaction::PlatformNativeData,
    source::{message::File, user::User},
};

#[derive(Clone, Debug, PartialEq)]
pub enum LifecycleEvent {
    MessageCreated(Box<MessageEnvelope>),
    MessageUpdated(Box<MessageEnvelope>),
    MessagesDeleted {
        conversation: Option<ConversationRef>,
        messages: Vec<MessageRef>,
        platform_data: Option<PlatformNativeData>,
    },
    ActivityChanged(ActivityState),
    ReadReceiptUpdated(ReadReceipt),
    CallUpdated(CallSession),
    ReactionsChanged {
        message: MessageRef,
        actor: Option<User>,
        change: ReactionChange,
    },
    MessagePinned(PinnedMessage),
    MessageUnpinned(PinnedMessage),
    ThreadCreated(Thread),
    ThreadUpdated(Thread),
    ThreadClosed(Thread),
    ThreadDeleted(Thread),
    PollUpdated(Poll),
    PollVoteChanged {
        poll_id: String,
        user: Option<User>,
        option_ids: Vec<String>,
        platform_data: Option<PlatformNativeData>,
    },
    ChecklistUpdated(Checklist),
    ChecklistChanged(ChecklistChange),
    ConversationCreated {
        conversation: ConversationRef,
        profile: Option<Box<ConversationProfile>>,
    },
    ConversationUpdated {
        conversation: ConversationRef,
        old_profile: Option<Box<ConversationProfile>>,
        new_profile: Box<ConversationProfile>,
    },
    ConversationArchived(ConversationRef),
    MemberUpdated {
        conversation: ConversationRef,
        old_member: Option<Box<ConversationMember>>,
        new_member: Box<ConversationMember>,
    },
    JoinRequested(JoinRequest),
    PermissionsChanged {
        conversation: ConversationRef,
        user: Option<User>,
        old_permissions: Option<PermissionSet>,
        new_permissions: PermissionSet,
    },
    FileShared {
        conversation: ConversationRef,
        user: Option<User>,
        file: File,
    },
    FileDeleted {
        conversation: Option<ConversationRef>,
        file_id: String,
    },
    SuggestionRequested(SuggestionRequest),
    SuggestionSelected(SuggestionSelection),
    MiniApp(MiniAppEvent),
    ShippingRequested(ShippingRequest),
    CheckoutRequested(CheckoutRequest),
    PaymentUpdated(Payment),
    SubscriptionUpdated(Subscription),
    ScheduledMessageSent(MessageRef),
    ScheduledMessageFailed {
        client_message_id: Option<String>,
        error: String,
    },
    PlatformNative(PlatformNativeData),
}

#[derive(Clone, Debug)]
pub struct EventEnvelope {
    pub id: String,
    pub platform: String,
    pub bot_id: Option<String>,
    pub occurred_at: Option<DateTime<Utc>>,
    pub received_at: DateTime<Utc>,
    pub conversation: Option<ConversationRef>,
    pub delivery_attempt: Option<u32>,
    pub raw: Option<Value>,
    pub metadata: BTreeMap<String, Value>,
    pub event: super::Event,
}

impl EventEnvelope {
    pub fn new(platform: impl Into<String>, event: super::Event) -> Self {
        Self {
            id: String::new(),
            platform: platform.into(),
            bot_id: None,
            occurred_at: None,
            received_at: Utc::now(),
            conversation: None,
            delivery_attempt: None,
            raw: None,
            metadata: BTreeMap::new(),
            event,
        }
    }
}