Skip to main content

oxidebot/
application.rs

1//! Application commands, dynamic suggestions, mini apps, persistent surfaces,
2//! and localized bot profiles.
3
4use std::collections::{BTreeMap, BTreeSet};
5
6use crate::{
7    content::{FormValue, OutgoingMessage, RichLayout},
8    conversation::{ConversationPermission, ConversationRef, PermissionSet},
9    interaction::{Modal, PlatformNativeData},
10    source::{message::File, user::User},
11};
12
13#[derive(Clone, Debug, Default, PartialEq, Eq)]
14pub struct Localized<T> {
15    pub default: T,
16    pub translations: BTreeMap<String, T>,
17}
18
19#[derive(Clone, Debug, Default, PartialEq, Eq)]
20pub enum CommandKind {
21    #[default]
22    ChatInput,
23    User,
24    Message,
25    PlatformNative(String),
26}
27
28#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
29pub enum CommandContext {
30    Direct,
31    Group,
32    Channel,
33    Administrator,
34    #[default]
35    Any,
36    PlatformNative(String),
37}
38
39#[derive(Clone, Debug, PartialEq, Eq)]
40pub struct CommandChoice {
41    pub name: Localized<String>,
42    pub value: String,
43}
44
45#[derive(Clone, Debug, PartialEq, Eq)]
46pub enum CommandOptionType {
47    Subcommand,
48    SubcommandGroup,
49    String,
50    Integer,
51    Number,
52    Boolean,
53    User,
54    Conversation,
55    Role,
56    Mentionable,
57    Attachment,
58    PlatformNative(String),
59}
60
61#[derive(Clone, Debug, PartialEq)]
62pub struct CommandOption {
63    pub name: Localized<String>,
64    pub description: Localized<String>,
65    pub kind: CommandOptionType,
66    pub required: bool,
67    pub choices: Vec<CommandChoice>,
68    pub options: Vec<CommandOption>,
69    pub autocomplete: bool,
70    pub min_value: Option<f64>,
71    pub max_value: Option<f64>,
72    pub min_length: Option<u32>,
73    pub max_length: Option<u32>,
74    pub allowed_conversation_kinds: Vec<crate::conversation::ConversationKind>,
75    pub platform_data: Option<PlatformNativeData>,
76}
77
78#[derive(Clone, Debug, PartialEq)]
79pub struct CommandDefinition {
80    pub id: Option<String>,
81    pub name: Localized<String>,
82    pub description: Localized<String>,
83    pub kind: CommandKind,
84    pub options: Vec<CommandOption>,
85    pub default_permissions: Option<PermissionSet>,
86    pub contexts: BTreeSet<CommandContext>,
87    pub ephemeral: bool,
88    pub platform_data: Option<PlatformNativeData>,
89}
90
91#[derive(Clone, Debug, PartialEq)]
92pub struct CommandInvocation {
93    pub command_id: Option<String>,
94    pub name: String,
95    pub path: Vec<String>,
96    pub options: BTreeMap<String, Vec<FormValue>>,
97    pub raw_text: Option<String>,
98    pub target_user: Option<User>,
99    pub target_message: Option<crate::conversation::MessageRef>,
100    pub permissions: BTreeSet<ConversationPermission>,
101    pub locale: Option<String>,
102    pub platform_data: Option<PlatformNativeData>,
103}
104
105#[derive(Clone, Debug, PartialEq)]
106pub struct SuggestionRequest {
107    pub id: String,
108    pub query: String,
109    pub field_id: Option<String>,
110    pub user: User,
111    pub conversation: Option<ConversationRef>,
112    pub limit: Option<u32>,
113    pub cursor: Option<String>,
114    pub platform_data: Option<PlatformNativeData>,
115}
116
117#[derive(Clone, Debug, PartialEq)]
118pub struct Suggestion {
119    pub id: String,
120    pub title: String,
121    pub description: Option<String>,
122    pub image: Option<File>,
123    pub value: FormValue,
124    pub message: Option<OutgoingMessage>,
125    pub platform_data: Option<PlatformNativeData>,
126}
127
128/// A suggestion or inline-query result selected by a user.
129#[derive(Clone, Debug, PartialEq)]
130pub struct SuggestionSelection {
131    pub result_id: String,
132    pub query: Option<String>,
133    pub user: User,
134    pub conversation: Option<ConversationRef>,
135    pub message_id: Option<String>,
136    pub platform_data: Option<PlatformNativeData>,
137}
138
139#[derive(Clone, Debug, Default, PartialEq, Eq)]
140pub enum MiniAppMode {
141    #[default]
142    Embedded,
143    FullScreen,
144    External,
145    PlatformNative(String),
146}
147
148#[derive(Clone, Debug, PartialEq)]
149pub struct MiniAppLaunch {
150    pub url: String,
151    pub mode: MiniAppMode,
152    pub initialization_data: Option<serde_json::Value>,
153    pub platform_data: Option<PlatformNativeData>,
154}
155
156#[derive(Clone, Debug, Default, PartialEq, Eq)]
157pub enum VerificationState {
158    Verified,
159    Invalid,
160    #[default]
161    Unverified,
162}
163
164#[derive(Clone, Debug, PartialEq)]
165pub struct MiniAppEvent {
166    pub query_id: Option<String>,
167    pub user: User,
168    pub conversation: Option<ConversationRef>,
169    pub data: serde_json::Value,
170    pub verification: VerificationState,
171    pub platform_data: Option<PlatformNativeData>,
172}
173
174#[derive(Clone, Debug, Default, PartialEq, Eq)]
175pub enum AppSurfaceKind {
176    ChatMenu,
177    Home,
178    Modal,
179    Sidebar,
180    RichMenu,
181    #[default]
182    Unknown,
183    PlatformNative(String),
184}
185
186#[derive(Clone, Debug, PartialEq)]
187pub enum SurfaceContent {
188    Layout(RichLayout),
189    Modal(Modal),
190    MiniApp(MiniAppLaunch),
191    PlatformNative(PlatformNativeData),
192}
193
194#[derive(Clone, Debug, PartialEq)]
195pub struct AppSurface {
196    pub id: Option<String>,
197    pub title: Option<String>,
198    pub kind: AppSurfaceKind,
199    pub content: SurfaceContent,
200    pub user_id: Option<String>,
201    pub conversation: Option<ConversationRef>,
202    pub platform_data: Option<PlatformNativeData>,
203}
204
205#[derive(Clone, Debug, Default, PartialEq)]
206pub struct BotProfile {
207    pub names: BTreeMap<String, String>,
208    pub descriptions: BTreeMap<String, String>,
209    pub short_descriptions: BTreeMap<String, String>,
210    pub avatar: Option<File>,
211    pub default_permissions: Option<PermissionSet>,
212    pub platform_data: Option<PlatformNativeData>,
213}