Skip to main content

neptunium_http/endpoints/guild/members/
update_guild_member.rs

1use bon::Builder;
2use neptunium_model::{
3    guild::member::GuildMember,
4    id::{
5        Id,
6        marker::{ChannelMarker, GuildMarker, RoleMarker, UserMarker},
7    },
8    time::timestamp::{Timestamp, representations::Iso8601},
9};
10use reqwest::Method;
11use serde::Serialize;
12
13use crate::{endpoints::Endpoint, request::Request};
14
15#[derive(Serialize, Clone, Debug, Builder)]
16pub struct UpdateGuildMemberBody {
17    #[builder(into)]
18    pub nick: Option<String>,
19    #[builder(into)]
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub roles: Option<Vec<Id<RoleMarker>>>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub mute: Option<bool>,
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub deaf: Option<bool>,
26    // TODO: Is this true?
27    /// Set this to `Some(None)` to remove the user's timeout.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub communication_disabled_until: Option<Option<Timestamp<Iso8601>>>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    #[builder(into)]
32    pub timeout_reason: Option<String>,
33    // TODO: How to disconnect a member? Set this to null? Check that
34    /// The voice channel to move the member to.
35    #[serde(skip_serializing_if = "Option::is_none", rename = "channel_id")]
36    pub voice_channel_id: Option<Id<ChannelMarker>>,
37    #[serde(skip_serializing_if = "Option::is_none", rename = "connection_id")]
38    pub voice_connection_id: Option<String>,
39}
40
41#[derive(Builder, Clone, Debug)]
42pub struct UpdateGuildMember {
43    pub guild_id: Id<GuildMarker>,
44    pub user_id: Id<UserMarker>,
45    pub body: UpdateGuildMemberBody,
46}
47
48impl Endpoint for UpdateGuildMember {
49    type Response = GuildMember;
50
51    fn into_request(self) -> crate::request::Request {
52        Request::builder()
53            .method(Method::PATCH)
54            .body(serde_json::to_string(&self.body).unwrap())
55            .path(format!(
56                "/guilds/{}/members/{}",
57                self.guild_id, self.user_id
58            ))
59            .build()
60    }
61}