ruma_client_api/presence/
set_presence.rs1pub mod v3 {
6 #[cfg(feature = "unstable-msc4532")]
11 use ruma_common::presence::PresenceStatus;
12 use ruma_common::{
13 OwnedUserId,
14 api::{auth_scheme::AccessToken, request, response},
15 metadata,
16 presence::PresenceState,
17 };
18 use serde::{Deserialize, Deserializer, Serialize, Serializer};
19
20 metadata! {
21 method: PUT,
22 rate_limited: true,
23 authentication: AccessToken,
24 history: {
25 1.0 => "/_matrix/client/r0/presence/{user_id}/status",
26 1.1 => "/_matrix/client/v3/presence/{user_id}/status",
27 }
28 }
29
30 #[request]
32 #[ruma_api(manual_body_serde)]
33 pub struct Request {
34 #[ruma_api(path)]
36 pub user_id: OwnedUserId,
37
38 pub presence: PresenceState,
40
41 #[cfg_attr(
46 feature = "unstable-msc4532",
47 deprecated(note = "Deprecated when MSC4532 is enabled, use `status` instead")
48 )]
49 pub status_msg: Option<String>,
50
51 #[cfg(feature = "unstable-msc4532")]
57 pub status: PresenceStatus,
58 }
59
60 #[derive(Serialize, Deserialize)]
62 struct RequestBodyRepr {
63 pub presence: PresenceState,
65
66 #[serde(skip_serializing_if = "Option::is_none")]
71 pub status_msg: Option<String>,
72
73 #[cfg(feature = "unstable-msc4532")]
79 #[serde(
80 skip_serializing_if = "ruma_common::serde::is_default",
81 rename = "org.continuwuity.presence_v2.msc4532.status",
82 default
83 )]
84 pub status: PresenceStatus,
85 }
86
87 impl<'de> Deserialize<'de> for RequestBody {
89 #[allow(deprecated)]
90 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
91 where
92 D: Deserializer<'de>,
93 {
94 let RequestBodyRepr {
95 presence,
96 status_msg,
97 #[cfg(feature = "unstable-msc4532")]
98 status,
99 } = RequestBodyRepr::deserialize(deserializer)?;
100
101 Ok(Self {
102 presence,
103 status_msg,
104 #[cfg(feature = "unstable-msc4532")]
105 status,
106 })
107 }
108 }
109
110 impl Serialize for RequestBody {
111 #[allow(deprecated)]
112 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
113 where
114 S: Serializer,
115 {
116 let RequestBody {
117 presence,
118 status_msg,
119 #[cfg(feature = "unstable-msc4532")]
120 status,
121 } = self.clone();
122
123 #[cfg(feature = "unstable-msc4532")]
124 let status = if status == PresenceStatus::default() {
125 PresenceStatus::new(status_msg)
126 } else {
127 status
128 };
129
130 #[cfg(feature = "unstable-msc4532")]
131 let status_msg = status.msg.clone();
132
133 RequestBodyRepr {
134 presence,
135 status_msg,
136 #[cfg(feature = "unstable-msc4532")]
137 status,
138 }
139 .serialize(serializer)
140 }
141 }
142
143 #[response]
145 #[derive(Default)]
146 pub struct Response {}
147
148 impl Request {
149 pub fn new(user_id: OwnedUserId, presence: PresenceState) -> Self {
151 Self {
152 user_id,
153 presence,
154 #[allow(deprecated)]
155 status_msg: None,
156 #[cfg(feature = "unstable-msc4532")]
157 status: PresenceStatus::default(),
158 }
159 }
160 }
161
162 impl Response {
163 pub fn new() -> Self {
165 Self {}
166 }
167 }
168}