twitch_api/eventsub/channel/guest_star_session/
end.rs1#![doc(alias = "channel.guest_star_session.end")]
2use super::*;
5#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
7#[cfg_attr(feature = "typed-builder", derive(typed_builder::TypedBuilder))]
8#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
9#[non_exhaustive]
10pub struct ChannelGuestStarSessionEndBeta {
11 #[cfg_attr(feature = "typed-builder", builder(setter(into)))]
13 pub broadcaster_user_id: types::UserId,
14 #[cfg_attr(feature = "typed-builder", builder(setter(into)))]
16 pub moderator_user_id: types::UserId,
17}
18
19impl ChannelGuestStarSessionEndBeta {
20 pub fn new(
22 broadcaster_user_id: impl Into<types::UserId>,
23 moderator_user_id: impl Into<types::UserId>,
24 ) -> Self {
25 Self {
26 broadcaster_user_id: broadcaster_user_id.into(),
27 moderator_user_id: moderator_user_id.into(),
28 }
29 }
30}
31
32impl EventSubscription for ChannelGuestStarSessionEndBeta {
33 type Payload = ChannelGuestStarSessionEndBetaPayload;
34
35 const EVENT_TYPE: EventType = EventType::ChannelGuestStarSessionEnd;
36 #[cfg(feature = "twitch_oauth2")]
37 const SCOPE: twitch_oauth2::Validator = twitch_oauth2::validator![any(
38 twitch_oauth2::Scope::ChannelReadGuestStar,
39 twitch_oauth2::Scope::ChannelManageGuestStar,
40 twitch_oauth2::Scope::ModeratorReadGuestStar,
41 twitch_oauth2::Scope::ModeratorManageGuestStar,
42 )];
43 const VERSION: &'static str = "beta";
44}
45
46#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
48#[cfg_attr(feature = "deny_unknown_fields", serde(deny_unknown_fields))]
49#[non_exhaustive]
50pub struct ChannelGuestStarSessionEndBetaPayload {
51 pub broadcaster_user_id: types::UserId,
53 pub broadcaster_user_login: types::UserName,
55 pub broadcaster_user_name: types::DisplayName,
57
58 pub session_id: types::GuestStarSessionId,
60 pub started_at: types::Timestamp,
62 pub ended_at: types::Timestamp,
64
65 pub host_user_id: types::UserId,
67 pub host_user_login: types::UserName,
69 pub host_user_name: types::DisplayName,
71}
72
73#[cfg(test)]
74#[test]
75fn parse_payload() {
76 use crate::eventsub::{Event, Message};
77
78 let payload = r##"
79 {
80 "subscription": {
81 "id": "f1c2a387-161a-49f9-a165-0f21d7a4e1c4",
82 "type": "channel.guest_star_session.end",
83 "version": "beta",
84 "status": "enabled",
85 "cost": 0,
86 "condition": {
87 "broadcaster_user_id": "1337",
88 "moderator_user_id": "1338"
89 },
90 "transport": {
91 "method": "webhook",
92 "callback": "https://example.com/webhooks/callback"
93 },
94 "created_at": "2023-04-11T10:11:22.123Z"
95 },
96 "event": {
97 "broadcaster_user_id": "1337",
98 "broadcaster_user_name": "Cool_User",
99 "broadcaster_user_login": "cool_user",
100 "host_user_id": "1338",
101 "host_user_name": "Cool_Mod",
102 "host_user_login": "cool_mod",
103 "session_id": "2KFRQbFtpmfyD3IevNRnCzOPRJI",
104 "started_at": "2023-04-11T16:20:03.17106713Z",
105 "ended_at": "2023-04-11T17:51:29.153485Z"
106 }
107 }
108 "##;
109
110 let val = Event::parse(payload).unwrap();
111 crate::tests::roundtrip(&val);
112
113 let Event::ChannelGuestStarSessionEndBeta(val) = val else {
114 panic!("invalid event type");
115 };
116 let Message::Notification(notif) = val.message else {
117 panic!("invalid settings type");
118 };
119
120 assert_eq!(notif.broadcaster_user_id.as_str(), "1337");
121 assert_eq!(notif.host_user_id.as_str(), "1338");
122 assert_eq!(notif.session_id.as_str(), "2KFRQbFtpmfyD3IevNRnCzOPRJI");
123 assert_eq!(notif.started_at.as_str(), "2023-04-11T16:20:03.17106713Z");
124 assert_eq!(notif.ended_at.as_str(), "2023-04-11T17:51:29.153485Z");
125}