1use bitflags::bitflags;
4use twilight_model::gateway::{Intents, OpCode, event::EventType};
5
6bitflags! {
7 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
40 pub struct EventTypeFlags: u128 {
41 const AUTO_MODERATION_ACTION_EXECUTION = 1 << 71;
43 const AUTO_MODERATION_RULE_CREATE = 1 << 72;
47 const AUTO_MODERATION_RULE_DELETE = 1 << 73;
51 const AUTO_MODERATION_RULE_UPDATE = 1 << 74;
55 const ENTITLEMENT_CREATE = 1 << 76;
57 const ENTITLEMENT_DELETE = 1 << 77;
59 const ENTITLEMENT_UPDATE = 1 << 78;
61 const BAN_ADD = 1;
63 const BAN_REMOVE = 1 << 1;
65 const CHANNEL_CREATE = 1 << 2;
67 const CHANNEL_DELETE = 1 << 3;
69 const CHANNEL_PINS_UPDATE = 1 << 4;
71 const CHANNEL_UPDATE = 1 << 5;
73 const COMMAND_PERMISSIONS_UPDATE = 1 << 70;
75 const GATEWAY_HEARTBEAT = 1 << 6;
77 const GATEWAY_HEARTBEAT_ACK = 1 << 7;
79 const GATEWAY_HELLO = 1 << 8;
81 const GATEWAY_INVALIDATE_SESSION = 1 << 69;
86 const GATEWAY_RECONNECT = 1 << 9;
88 const GUILD_AUDIT_LOG_ENTRY_CREATE = 1 << 75;
90 const GUILD_CREATE = 1 << 10;
92 const GUILD_DELETE = 1 << 11;
94 const GUILD_EMOJIS_UPDATE = 1 << 12;
96 const GUILD_INTEGRATIONS_UPDATE = 1 << 13;
98 const GUILD_SCHEDULED_EVENT_CREATE = 1 << 64;
100 const GUILD_SCHEDULED_EVENT_DELETE = 1 << 65;
102 const GUILD_SCHEDULED_EVENT_UPDATE = 1 << 66;
104 const GUILD_SCHEDULED_EVENT_USER_ADD = 1 << 67;
106 const GUILD_SCHEDULED_EVENT_USER_REMOVE = 1 << 68;
108 const GUILD_STICKERS_UPDATE = 1 << 63;
110 const GUILD_UPDATE = 1 << 14;
112 const INTEGRATION_CREATE = 1 << 60;
114 const INTEGRATION_DELETE = 1 << 61;
116 const INTEGRATION_UPDATE = 1 << 62;
118 const INTERACTION_CREATE = 1 << 56;
120 const INVITE_CREATE = 1 << 46;
122 const INVITE_DELETE = 1 << 47;
124 const MEMBER_ADD = 1 << 15;
126 const MEMBER_REMOVE = 1 << 16;
128 const MEMBER_UPDATE = 1 << 17;
130 const MEMBER_CHUNK = 1 << 18;
135 const MESSAGE_CREATE = 1 << 19;
137 const MESSAGE_DELETE = 1 << 20;
139 const MESSAGE_DELETE_BULK = 1 << 21;
141 const MESSAGE_POLL_VOTE_ADD = 1 << 28;
143 const MESSAGE_POLL_VOTE_REMOVE = 1 << 29;
145 const MESSAGE_UPDATE = 1 << 22;
147 const PRESENCE_UPDATE = 1 << 23;
149 const REACTION_ADD = 1 << 25;
151 const REACTION_REMOVE = 1 << 26;
153 const REACTION_REMOVE_ALL = 1 << 27;
155 const REACTION_REMOVE_EMOJI = 1 << 48;
157 const READY = 1 << 28;
159 const RESUMED = 1 << 29;
161 const ROLE_CREATE = 1 << 30;
163 const ROLE_DELETE = 1 << 31;
165 const ROLE_UPDATE = 1 << 32;
167 const STAGE_INSTANCE_CREATE = 1 << 57;
169 const STAGE_INSTANCE_DELETE = 1 << 58;
171 const STAGE_INSTANCE_UPDATE = 1 << 59;
173 const THREAD_CREATE = 1 << 50;
176 const THREAD_DELETE = 1 << 52;
178 const THREAD_LIST_SYNC = 1 << 53;
180 const THREAD_MEMBERS_UPDATE = 1 << 55;
182 const THREAD_MEMBER_UPDATE = 1 << 54;
184 const THREAD_UPDATE = 1 << 51;
186 const TYPING_START = 1 << 39;
188 const UNAVAILABLE_GUILD = 1 << 40;
190 const USER_UPDATE = 1 << 41;
192 const VOICE_SERVER_UPDATE = 1 << 42;
194 const VOICE_STATE_UPDATE = 1 << 43;
196 const WEBHOOKS_UPDATE = 1 << 44;
198 const RATE_LIMITED = 1 << 79;
201
202 const AUTO_MODERATION_CONFIGURATION = Self::AUTO_MODERATION_RULE_CREATE.bits()
206 | Self::AUTO_MODERATION_RULE_DELETE.bits()
207 | Self::AUTO_MODERATION_RULE_UPDATE.bits();
208 const AUTO_MODERATION_EXECUTION = Self::AUTO_MODERATION_ACTION_EXECUTION.bits();
212 const DIRECT_MESSAGES = Self::MESSAGE_CREATE.bits()
216 | Self::MESSAGE_DELETE.bits()
217 | Self::MESSAGE_DELETE_BULK.bits()
218 | Self::MESSAGE_UPDATE.bits();
219 const DIRECT_MESSAGE_REACTIONS = Self::REACTION_ADD.bits()
223 | Self::REACTION_REMOVE.bits()
224 | Self::REACTION_REMOVE_ALL.bits()
225 | Self::REACTION_REMOVE_EMOJI.bits();
226 const DIRECT_MESSAGE_TYPING = Self::TYPING_START.bits();
230 const GUILDS = Self::CHANNEL_CREATE.bits()
234 | Self::CHANNEL_DELETE.bits()
235 | Self::CHANNEL_PINS_UPDATE.bits()
236 | Self::CHANNEL_UPDATE.bits()
237 | Self::GUILD_CREATE.bits()
238 | Self::GUILD_DELETE.bits()
239 | Self::GUILD_UPDATE.bits()
240 | Self::ROLE_CREATE.bits()
241 | Self::ROLE_DELETE.bits()
242 | Self::ROLE_UPDATE.bits()
243 | Self::STAGE_INSTANCE_CREATE.bits()
244 | Self::STAGE_INSTANCE_UPDATE.bits()
245 | Self::STAGE_INSTANCE_DELETE.bits()
246 | Self::THREAD_CREATE.bits()
247 | Self::THREAD_UPDATE.bits()
248 | Self::THREAD_DELETE.bits()
249 | Self::THREAD_LIST_SYNC.bits()
250 | Self::THREAD_MEMBER_UPDATE.bits()
251 | Self::THREAD_MEMBERS_UPDATE.bits();
252 const GUILD_MODERATION = Self::BAN_ADD.bits() | Self::BAN_REMOVE.bits() | Self::GUILD_AUDIT_LOG_ENTRY_CREATE.bits();
256 const GUILD_EMOJIS_AND_STICKERS = Self::GUILD_EMOJIS_UPDATE.bits()
260 | Self::GUILD_STICKERS_UPDATE.bits();
261
262 const GUILD_INTEGRATIONS = Self::GUILD_INTEGRATIONS_UPDATE.bits()
266 | Self::INTEGRATION_CREATE.bits()
267 | Self::INTEGRATION_UPDATE.bits()
268 | Self::INTEGRATION_DELETE.bits();
269
270 const GUILD_INVITES = Self::INVITE_CREATE.bits() | Self::INVITE_DELETE.bits();
274
275 const GUILD_MEMBERS = Self::MEMBER_ADD.bits()
279 | Self::MEMBER_REMOVE.bits()
280 | Self::MEMBER_UPDATE.bits()
281 | Self::THREAD_MEMBERS_UPDATE.bits();
282
283
284 const GUILD_MESSAGES = Self::MESSAGE_CREATE.bits()
288 | Self::MESSAGE_DELETE.bits()
289 | Self::MESSAGE_DELETE_BULK.bits()
290 | Self::MESSAGE_UPDATE.bits();
291
292 const MESSAGE_POLLS = Self::MESSAGE_POLL_VOTE_ADD.bits() | Self::MESSAGE_POLL_VOTE_REMOVE.bits();
297
298 const GUILD_MESSAGE_REACTIONS = Self::REACTION_ADD.bits()
302 | Self::REACTION_REMOVE.bits()
303 | Self::REACTION_REMOVE_ALL.bits()
304 | Self::REACTION_REMOVE_EMOJI.bits();
305
306 const GUILD_MESSAGE_TYPING = Self::TYPING_START.bits();
310
311 const GUILD_PRESENCES = Self::PRESENCE_UPDATE.bits();
315
316 const GUILD_SCHEDULED_EVENTS = Self::GUILD_SCHEDULED_EVENT_CREATE.bits()
320 | Self::GUILD_SCHEDULED_EVENT_DELETE.bits()
321 | Self::GUILD_SCHEDULED_EVENT_UPDATE.bits()
322 | Self::GUILD_SCHEDULED_EVENT_USER_ADD.bits()
323 | Self::GUILD_SCHEDULED_EVENT_USER_REMOVE.bits();
324
325 const GUILD_VOICE_STATES = Self::VOICE_STATE_UPDATE.bits();
329
330 const GUILD_WEBHOOKS = Self::WEBHOOKS_UPDATE.bits();
334
335 }
336}
337
338impl From<Intents> for EventTypeFlags {
339 fn from(intents: Intents) -> Self {
340 let mut event_type_flags = Self::empty();
341
342 for (_, intent) in intents.iter_names() {
343 event_type_flags |= match intent {
344 Intents::AUTO_MODERATION_CONFIGURATION => Self::AUTO_MODERATION_CONFIGURATION,
345 Intents::AUTO_MODERATION_EXECUTION => Self::AUTO_MODERATION_EXECUTION,
346 Intents::DIRECT_MESSAGES => Self::DIRECT_MESSAGES,
347 Intents::DIRECT_MESSAGE_REACTIONS => Self::DIRECT_MESSAGE_REACTIONS,
348 Intents::DIRECT_MESSAGE_TYPING => Self::DIRECT_MESSAGE_TYPING,
349 Intents::GUILDS => Self::GUILDS,
350 Intents::GUILD_MODERATION => Self::GUILD_MODERATION,
351 Intents::GUILD_EMOJIS_AND_STICKERS => Self::GUILD_EMOJIS_AND_STICKERS,
352 Intents::GUILD_INTEGRATIONS => Self::GUILD_INTEGRATIONS,
353 Intents::GUILD_INVITES => Self::GUILD_INVITES,
354 Intents::GUILD_MEMBERS => Self::GUILD_MEMBERS,
355 Intents::GUILD_MESSAGES => Self::GUILD_MESSAGES,
356 Intents::GUILD_MESSAGE_POLLS | Intents::DIRECT_MESSAGE_POLLS => Self::MESSAGE_POLLS,
357 Intents::GUILD_MESSAGE_REACTIONS => Self::GUILD_MESSAGE_REACTIONS,
358 Intents::GUILD_MESSAGE_TYPING => Self::GUILD_MESSAGE_TYPING,
359 Intents::GUILD_PRESENCES => Self::GUILD_PRESENCES,
360 Intents::GUILD_SCHEDULED_EVENTS => Self::GUILD_SCHEDULED_EVENTS,
361 Intents::GUILD_VOICE_STATES => Self::GUILD_VOICE_STATES,
362 Intents::GUILD_WEBHOOKS => Self::GUILD_WEBHOOKS,
363 Intents::MESSAGE_CONTENT => Self::empty(),
364 _ => unimplemented!("Unimplemented Intent to EventTypeFlags mapping"),
365 }
366 }
367
368 event_type_flags
369 }
370}
371
372impl From<EventType> for EventTypeFlags {
373 fn from(event_type: EventType) -> Self {
374 match event_type {
375 EventType::AutoModerationActionExecution => Self::AUTO_MODERATION_ACTION_EXECUTION,
376 EventType::AutoModerationRuleCreate => Self::AUTO_MODERATION_RULE_CREATE,
377 EventType::AutoModerationRuleDelete => Self::AUTO_MODERATION_RULE_DELETE,
378 EventType::AutoModerationRuleUpdate => Self::AUTO_MODERATION_RULE_UPDATE,
379 EventType::BanAdd => Self::BAN_ADD,
380 EventType::BanRemove => Self::BAN_REMOVE,
381 EventType::ChannelCreate => Self::CHANNEL_CREATE,
382 EventType::ChannelDelete => Self::CHANNEL_DELETE,
383 EventType::ChannelPinsUpdate => Self::CHANNEL_PINS_UPDATE,
384 EventType::ChannelUpdate => Self::CHANNEL_UPDATE,
385 EventType::CommandPermissionsUpdate => Self::COMMAND_PERMISSIONS_UPDATE,
386 EventType::EntitlementCreate => Self::ENTITLEMENT_CREATE,
387 EventType::EntitlementDelete => Self::ENTITLEMENT_DELETE,
388 EventType::EntitlementUpdate => Self::ENTITLEMENT_UPDATE,
389 EventType::GatewayClose => Self::empty(),
390 EventType::GatewayHeartbeat => Self::GATEWAY_HEARTBEAT,
391 EventType::GatewayHeartbeatAck => Self::GATEWAY_HEARTBEAT_ACK,
392 EventType::GatewayHello => Self::GATEWAY_HELLO,
393 EventType::GatewayInvalidateSession => Self::GATEWAY_INVALIDATE_SESSION,
394 EventType::GatewayReconnect => Self::GATEWAY_RECONNECT,
395 EventType::GuildAuditLogEntryCreate => Self::GUILD_AUDIT_LOG_ENTRY_CREATE,
396 EventType::GuildCreate => Self::GUILD_CREATE,
397 EventType::GuildDelete => Self::GUILD_DELETE,
398 EventType::GuildEmojisUpdate => Self::GUILD_EMOJIS_UPDATE,
399 EventType::GuildIntegrationsUpdate => Self::GUILD_INTEGRATIONS_UPDATE,
400 EventType::GuildScheduledEventCreate => Self::GUILD_SCHEDULED_EVENT_CREATE,
401 EventType::GuildScheduledEventDelete => Self::GUILD_SCHEDULED_EVENT_DELETE,
402 EventType::GuildScheduledEventUpdate => Self::GUILD_SCHEDULED_EVENT_UPDATE,
403 EventType::GuildScheduledEventUserAdd => Self::GUILD_SCHEDULED_EVENT_USER_ADD,
404 EventType::GuildScheduledEventUserRemove => Self::GUILD_SCHEDULED_EVENT_USER_REMOVE,
405 EventType::GuildStickersUpdate => Self::GUILD_STICKERS_UPDATE,
406 EventType::GuildUpdate => Self::GUILD_UPDATE,
407 EventType::IntegrationCreate => Self::INTEGRATION_CREATE,
408 EventType::IntegrationDelete => Self::INTEGRATION_DELETE,
409 EventType::IntegrationUpdate => Self::INTEGRATION_UPDATE,
410 EventType::InteractionCreate => Self::INTERACTION_CREATE,
411 EventType::InviteCreate => Self::INVITE_CREATE,
412 EventType::InviteDelete => Self::INVITE_DELETE,
413 EventType::MemberAdd => Self::MEMBER_ADD,
414 EventType::MemberRemove => Self::MEMBER_REMOVE,
415 EventType::MemberUpdate => Self::MEMBER_UPDATE,
416 EventType::MemberChunk => Self::MEMBER_CHUNK,
417 EventType::MessageCreate => Self::MESSAGE_CREATE,
418 EventType::MessageDelete => Self::MESSAGE_DELETE,
419 EventType::MessageDeleteBulk => Self::MESSAGE_DELETE_BULK,
420 EventType::MessagePollVoteAdd => Self::MESSAGE_POLL_VOTE_ADD,
421 EventType::MessagePollVoteRemove => Self::MESSAGE_POLL_VOTE_REMOVE,
422 EventType::MessageUpdate => Self::MESSAGE_UPDATE,
423 EventType::PresenceUpdate => Self::PRESENCE_UPDATE,
424 EventType::RateLimited => Self::RATE_LIMITED,
425 EventType::ReactionAdd => Self::REACTION_ADD,
426 EventType::ReactionRemove => Self::REACTION_REMOVE,
427 EventType::ReactionRemoveAll => Self::REACTION_REMOVE_ALL,
428 EventType::ReactionRemoveEmoji => Self::REACTION_REMOVE_EMOJI,
429 EventType::Ready => Self::READY,
430 EventType::Resumed => Self::RESUMED,
431 EventType::RoleCreate => Self::ROLE_CREATE,
432 EventType::RoleDelete => Self::ROLE_DELETE,
433 EventType::RoleUpdate => Self::ROLE_UPDATE,
434 EventType::StageInstanceCreate => Self::STAGE_INSTANCE_CREATE,
435 EventType::StageInstanceDelete => Self::STAGE_INSTANCE_DELETE,
436 EventType::StageInstanceUpdate => Self::STAGE_INSTANCE_UPDATE,
437 EventType::ThreadCreate => Self::THREAD_CREATE,
438 EventType::ThreadDelete => Self::THREAD_DELETE,
439 EventType::ThreadListSync => Self::THREAD_LIST_SYNC,
440 EventType::ThreadMembersUpdate => Self::THREAD_MEMBERS_UPDATE,
441 EventType::ThreadMemberUpdate => Self::THREAD_MEMBER_UPDATE,
442 EventType::ThreadUpdate => Self::THREAD_UPDATE,
443 EventType::TypingStart => Self::TYPING_START,
444 EventType::UnavailableGuild => Self::UNAVAILABLE_GUILD,
445 EventType::UserUpdate => Self::USER_UPDATE,
446 EventType::VoiceServerUpdate => Self::VOICE_SERVER_UPDATE,
447 EventType::VoiceStateUpdate => Self::VOICE_STATE_UPDATE,
448 EventType::WebhooksUpdate => Self::WEBHOOKS_UPDATE,
449 }
450 }
451}
452
453impl TryFrom<(OpCode, Option<&str>)> for EventTypeFlags {
454 type Error = ();
455
456 fn try_from((op, event_type): (OpCode, Option<&str>)) -> Result<Self, Self::Error> {
457 match (op, event_type) {
458 (OpCode::Heartbeat, _) => Ok(Self::GATEWAY_HEARTBEAT),
459 (OpCode::Reconnect, _) => Ok(Self::GATEWAY_RECONNECT),
460 (OpCode::InvalidSession, _) => Ok(Self::GATEWAY_INVALIDATE_SESSION),
461 (OpCode::Hello, _) => Ok(Self::GATEWAY_HELLO),
462 (OpCode::HeartbeatAck, _) => Ok(Self::GATEWAY_HEARTBEAT_ACK),
463 (_, Some(event_type)) => EventType::try_from(event_type)
464 .map(Self::from)
465 .map_err(|_| ()),
466 (_, None) => Err(()),
467 }
468 }
469}
470
471#[cfg(test)]
472mod tests {
473 use super::EventTypeFlags;
474 use static_assertions::assert_impl_all;
475 use std::{fmt::Debug, hash::Hash};
476 use twilight_model::gateway::event::EventType;
477
478 assert_impl_all!(
479 EventTypeFlags: Copy,
480 Clone,
481 Debug,
482 Eq,
483 From<EventType>,
484 Hash,
485 PartialEq,
486 Send,
487 Sync,
488 );
489}