steamworks/callbacks/
persona_state_change.rs

1#![allow(clippy::unnecessary_cast)]
2
3use crate::callbacks::{CallbackDispatcher, CallbackStorage};
4use crate::steam::SteamId;
5use bitflags::bitflags;
6use steamworks_sys as sys;
7
8/// <https://partner.steamgames.com/doc/api/ISteamFriends#PersonaStateChange_t>
9#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
10pub struct PersonaStateChange {
11    pub steam_id: SteamId,
12    pub change_flags: PersonaStateChangeFlags,
13}
14
15bitflags! {
16    /// <https://partner.steamgames.com/doc/api/ISteamFriends#EPersonaChange>
17    #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
18    pub struct PersonaStateChangeFlags: u32 {
19        const NAME = sys::EPersonaChange_k_EPersonaChangeName as u32;
20        const STATUS = sys::EPersonaChange_k_EPersonaChangeStatus as u32;
21        const COME_ONLINE = sys::EPersonaChange_k_EPersonaChangeComeOnline as u32;
22        const GONE_OFFLINE = sys::EPersonaChange_k_EPersonaChangeGoneOffline as u32;
23        const GAME_PLAYED = sys::EPersonaChange_k_EPersonaChangeGamePlayed as u32;
24        const GAME_SERVER = sys::EPersonaChange_k_EPersonaChangeGameServer as u32;
25        const AVATAR = sys::EPersonaChange_k_EPersonaChangeAvatar as u32;
26        const JOINED_SOURCE = sys::EPersonaChange_k_EPersonaChangeJoinedSource as u32;
27        const LEFT_SOURCE = sys::EPersonaChange_k_EPersonaChangeLeftSource as u32;
28        const RELATIONSHIP_CHANGED = sys::EPersonaChange_k_EPersonaChangeRelationshipChanged as u32;
29        const NAME_FIRST_SET = sys::EPersonaChange_k_EPersonaChangeNameFirstSet as u32;
30        const BROADCAST = sys::EPersonaChange_k_EPersonaChangeBroadcast as u32;
31        const NICKNAME = sys::EPersonaChange_k_EPersonaChangeNickname as u32;
32        const STEAM_LEVEL = sys::EPersonaChange_k_EPersonaChangeSteamLevel as u32;
33        const RICH_PRESENCE = sys::EPersonaChange_k_EPersonaChangeRichPresence as u32;
34    }
35}
36
37#[derive(Debug, Default)]
38pub(crate) struct PersonaStateChangeDispatcher(CallbackStorage<PersonaStateChange>);
39
40impl CallbackDispatcher for PersonaStateChangeDispatcher {
41    type RawCallbackData = sys::PersonaStateChange_t;
42    type MappedCallbackData = PersonaStateChange;
43
44    fn storage(&self) -> &CallbackStorage<PersonaStateChange> {
45        &self.0
46    }
47
48    fn map_callback_data(raw: &sys::PersonaStateChange_t) -> PersonaStateChange {
49        PersonaStateChange {
50            steam_id: raw.m_ulSteamID.into(),
51            change_flags: PersonaStateChangeFlags::from_bits_truncate(raw.m_nChangeFlags as u32),
52        }
53    }
54}