1// @generated by jacquard-lexicon. DO NOT EDIT.
2//
3// Lexicon: net.anisota.beta.game.session
4//
5// This file was automatically generated from Lexicon schemas.
6// Any manual changes will be overwritten on the next regeneration.
7
8/// Summary of activity during this session
9#[jacquard_derive::lexicon]
10#[derive(
11 serde::Serialize,
12 serde::Deserialize,
13 Debug,
14 Clone,
15 PartialEq,
16 Eq,
17 jacquard_derive::IntoStatic,
18 Default
19)]
20#[serde(rename_all = "camelCase")]
21pub struct ActivitySummary<'a> {
22 /// Player's current level at the time of this session update
23 #[serde(skip_serializing_if = "std::option::Option::is_none")]
24 pub current_level: std::option::Option<i64>,
25 /// Player's total XP at the time of this session update
26 #[serde(skip_serializing_if = "std::option::Option::is_none")]
27 pub current_xp: std::option::Option<i64>,
28 #[serde(skip_serializing_if = "std::option::Option::is_none")]
29 #[serde(borrow)]
30 pub game_actions: std::option::Option<
31 crate::net_anisota::beta::game::session::GameActions<'a>,
32 >,
33 /// List of unique pages/routes visited
34 #[serde(skip_serializing_if = "std::option::Option::is_none")]
35 #[serde(borrow)]
36 pub pages_visited: std::option::Option<Vec<jacquard_common::CowStr<'a>>>,
37 /// Total number of events logged in this session
38 #[serde(skip_serializing_if = "std::option::Option::is_none")]
39 pub total_events: std::option::Option<i64>,
40 /// Total XP gained during this specific session
41 #[serde(skip_serializing_if = "std::option::Option::is_none")]
42 pub xp_gained_this_session: std::option::Option<i64>,
43}
44
45/// Game-specific actions performed
46#[jacquard_derive::lexicon]
47#[derive(
48 serde::Serialize,
49 serde::Deserialize,
50 Debug,
51 Clone,
52 PartialEq,
53 Eq,
54 jacquard_derive::IntoStatic,
55 Default
56)]
57#[serde(rename_all = "camelCase")]
58pub struct GameActions<'a> {
59 #[serde(skip_serializing_if = "std::option::Option::is_none")]
60 pub daily_rewards_claimed: std::option::Option<i64>,
61 #[serde(skip_serializing_if = "std::option::Option::is_none")]
62 pub feeds_loaded: std::option::Option<i64>,
63 #[serde(skip_serializing_if = "std::option::Option::is_none")]
64 pub items_collected: std::option::Option<i64>,
65 #[serde(skip_serializing_if = "std::option::Option::is_none")]
66 pub level_ups: std::option::Option<i64>,
67 #[serde(skip_serializing_if = "std::option::Option::is_none")]
68 pub posts_viewed: std::option::Option<i64>,
69 #[serde(skip_serializing_if = "std::option::Option::is_none")]
70 pub specimens_collected: std::option::Option<i64>,
71}
72
73/// A game session record tracking a continuous period of user engagement with the application
74#[jacquard_derive::lexicon]
75#[derive(
76 serde::Serialize,
77 serde::Deserialize,
78 Debug,
79 Clone,
80 PartialEq,
81 Eq,
82 jacquard_derive::IntoStatic,
83 bon::Builder
84)]
85#[serde(rename_all = "camelCase")]
86pub struct Session<'a> {
87 #[serde(skip_serializing_if = "std::option::Option::is_none")]
88 #[builder(into)]
89 #[serde(borrow)]
90 pub activity_summary: Option<
91 crate::net_anisota::beta::game::session::ActivitySummary<'a>,
92 >,
93 /// Version of the client application
94 #[serde(borrow)]
95 #[builder(into)]
96 pub client_version: jacquard_common::CowStr<'a>,
97 /// When the session record was created
98 #[serde(skip_serializing_if = "std::option::Option::is_none")]
99 #[builder(into)]
100 pub created_at: Option<jacquard_common::types::string::Datetime>,
101 /// Total session duration in milliseconds (calculated when session ends)
102 #[serde(skip_serializing_if = "std::option::Option::is_none")]
103 #[builder(into)]
104 pub duration: Option<i64>,
105 /// Why the session ended
106 #[serde(skip_serializing_if = "std::option::Option::is_none")]
107 #[builder(into)]
108 #[serde(borrow)]
109 pub end_reason: Option<jacquard_common::CowStr<'a>>,
110 /// When the session ended (ISO 8601)
111 #[serde(skip_serializing_if = "std::option::Option::is_none")]
112 #[builder(into)]
113 pub ended_at: Option<jacquard_common::types::string::Datetime>,
114 /// Timestamp of the last recorded activity in this session
115 #[serde(skip_serializing_if = "std::option::Option::is_none")]
116 #[builder(into)]
117 pub last_activity_at: Option<jacquard_common::types::string::Datetime>,
118 #[serde(skip_serializing_if = "std::option::Option::is_none")]
119 #[builder(into)]
120 #[serde(borrow)]
121 pub metadata: Option<crate::net_anisota::beta::game::session::Metadata<'a>>,
122 /// URI of the previous session if this is a continuation (e.g., after brief inactivity)
123 #[serde(skip_serializing_if = "std::option::Option::is_none")]
124 #[builder(into)]
125 #[serde(borrow)]
126 pub parent_session_uri: Option<jacquard_common::CowStr<'a>>,
127 /// Platform where the session occurred
128 #[serde(borrow)]
129 #[builder(into)]
130 pub platform: jacquard_common::CowStr<'a>,
131 /// URIs of log records that occurred during this session
132 #[serde(skip_serializing_if = "std::option::Option::is_none")]
133 #[builder(into)]
134 #[serde(borrow)]
135 pub related_log_uris: Option<Vec<jacquard_common::CowStr<'a>>>,
136 /// URIs of progress records created during this session
137 #[serde(skip_serializing_if = "std::option::Option::is_none")]
138 #[builder(into)]
139 #[serde(borrow)]
140 pub related_progress_uris: Option<Vec<jacquard_common::CowStr<'a>>>,
141 /// URIs of related sessions (e.g., same day, same device)
142 #[serde(skip_serializing_if = "std::option::Option::is_none")]
143 #[builder(into)]
144 #[serde(borrow)]
145 pub related_session_uris: Option<Vec<jacquard_common::CowStr<'a>>>,
146 #[serde(skip_serializing_if = "std::option::Option::is_none")]
147 #[builder(into)]
148 #[serde(borrow)]
149 pub session_context: Option<
150 crate::net_anisota::beta::game::session::SessionContext<'a>,
151 >,
152 /// When the session began (ISO 8601)
153 pub started_at: jacquard_common::types::string::Datetime,
154 /// Current status of the session
155 #[serde(borrow)]
156 #[builder(into)]
157 pub status: jacquard_common::CowStr<'a>,
158 /// When the session record was last updated
159 #[serde(skip_serializing_if = "std::option::Option::is_none")]
160 #[builder(into)]
161 pub updated_at: Option<jacquard_common::types::string::Datetime>,
162}
163
164/// Typed wrapper for GetRecord response with this collection's record type.
165#[derive(
166 serde::Serialize,
167 serde::Deserialize,
168 Debug,
169 Clone,
170 PartialEq,
171 Eq,
172 jacquard_derive::IntoStatic
173)]
174#[serde(rename_all = "camelCase")]
175pub struct SessionGetRecordOutput<'a> {
176 #[serde(skip_serializing_if = "std::option::Option::is_none")]
177 #[serde(borrow)]
178 pub cid: std::option::Option<jacquard_common::types::string::Cid<'a>>,
179 #[serde(borrow)]
180 pub uri: jacquard_common::types::string::AtUri<'a>,
181 #[serde(borrow)]
182 pub value: Session<'a>,
183}
184
185/// Marker type for deserializing records from this collection.
186pub struct SessionRecord;
187impl jacquard_common::xrpc::XrpcResp for SessionRecord {
188 const NSID: &'static str = "net.anisota.beta.game.session";
189 const ENCODING: &'static str = "application/json";
190 type Output<'de> = SessionGetRecordOutput<'de>;
191 type Err<'de> = jacquard_common::types::collection::RecordError<'de>;
192}
193
194impl jacquard_common::types::collection::Collection for Session<'_> {
195 const NSID: &'static str = "net.anisota.beta.game.session";
196 type Record = SessionRecord;
197}
198
199impl From<SessionGetRecordOutput<'_>> for Session<'_> {
200 fn from(output: SessionGetRecordOutput<'_>) -> Self {
201 use jacquard_common::IntoStatic;
202 output.value.into_static()
203 }
204}
205
206/// Additional session metadata
207#[jacquard_derive::lexicon]
208#[derive(
209 serde::Serialize,
210 serde::Deserialize,
211 Debug,
212 Clone,
213 PartialEq,
214 Eq,
215 jacquard_derive::IntoStatic,
216 Default
217)]
218#[serde(rename_all = "camelCase")]
219pub struct Metadata<'a> {
220 /// List of features used during the session
221 #[serde(skip_serializing_if = "std::option::Option::is_none")]
222 #[serde(borrow)]
223 pub features: std::option::Option<Vec<jacquard_common::CowStr<'a>>>,
224 /// Network condition during session
225 #[serde(skip_serializing_if = "std::option::Option::is_none")]
226 #[serde(borrow)]
227 pub network_condition: std::option::Option<jacquard_common::CowStr<'a>>,
228 #[serde(skip_serializing_if = "std::option::Option::is_none")]
229 #[serde(borrow)]
230 pub performance_metrics: std::option::Option<
231 crate::net_anisota::beta::game::session::PerformanceMetrics<'a>,
232 >,
233}
234
235/// Performance-related data
236#[jacquard_derive::lexicon]
237#[derive(
238 serde::Serialize,
239 serde::Deserialize,
240 Debug,
241 Clone,
242 PartialEq,
243 Eq,
244 jacquard_derive::IntoStatic,
245 Default
246)]
247#[serde(rename_all = "camelCase")]
248pub struct PerformanceMetrics<'a> {
249 /// Average API response time in milliseconds (rounded to nearest integer)
250 #[serde(skip_serializing_if = "std::option::Option::is_none")]
251 pub average_response_time: std::option::Option<i64>,
252 /// Number of errors encountered
253 #[serde(skip_serializing_if = "std::option::Option::is_none")]
254 pub error_count: std::option::Option<i64>,
255}
256
257/// Context about how the session started
258#[jacquard_derive::lexicon]
259#[derive(
260 serde::Serialize,
261 serde::Deserialize,
262 Debug,
263 Clone,
264 PartialEq,
265 Eq,
266 jacquard_derive::IntoStatic,
267 Default
268)]
269#[serde(rename_all = "camelCase")]
270pub struct SessionContext<'a> {
271 /// How the user was authenticated
272 #[serde(skip_serializing_if = "std::option::Option::is_none")]
273 #[serde(borrow)]
274 pub authentication_method: std::option::Option<jacquard_common::CowStr<'a>>,
275 /// How the user entered the app
276 #[serde(skip_serializing_if = "std::option::Option::is_none")]
277 #[serde(borrow)]
278 pub entry_point: std::option::Option<jacquard_common::CowStr<'a>>,
279 /// Whether this was a new user's first session
280 #[serde(skip_serializing_if = "std::option::Option::is_none")]
281 pub is_new_user: std::option::Option<bool>,
282 /// Referrer URL if applicable
283 #[serde(skip_serializing_if = "std::option::Option::is_none")]
284 #[serde(borrow)]
285 pub referrer: std::option::Option<jacquard_common::CowStr<'a>>,
286}