/// <summary> /// Internal helper function to update local copy of the friends list. /// </summary> /// <param name="messages">Messages received from the Steam service.</param> private async void ProcessMessagesReceived( SteamChatPollResult result ) { result.Messages.Sort(); List<SteamChatMessage> messages = new List<SteamChatMessage>(); List<SteamChatRelationshipNotification> notifications = new List<SteamChatRelationshipNotification>(); foreach( var message in result.Messages ) { if( message.Type == ChatMessageType.MessageText || message.Type == ChatMessageType.Typing || message.Type == ChatMessageType.LeftConversation ) { messages.Add( SteamChatMessage.CreateFromPollMessage( message ) ); } else if( message.Type == ChatMessageType.PersonaStateChange || message.Type == ChatMessageType.PersonaRelationship ) { // Filter out notifications about the currently authenticated user if( message.FromUser.Equals( ChatSession.SteamID ) ) continue; notifications.Add( SteamChatRelationshipNotification.CreateFromPollMessage( message ) ); if( FriendsList.Friends.ContainsKey( message.FromUser ) ) { FriendsList.Friends[message.FromUser].PlayerInfo.PersonaState = message.PersonaState; FriendsList.Friends[message.FromUser].PlayerInfo.PersonaName = message.PersonaName; if( message.PersonaState == PersonaState.Offline ) FriendsList.Friends[message.FromUser].PlayerInfo.LastLogOff = message.UTCMessageDateTime; } else { var newUser = new SteamUser { SteamID = message.FromUser, PlayerInfo = new SteamCommunity.PlayerInfo { PersonaName = message.PersonaName, PersonaState = message.PersonaState } }; try { await newUser.GetProfileDataAsync( this ); } catch( Exception ) { // Likely Network Connectivity Failure } FriendsList.Friends.Add( message.FromUser, newUser ); } } } if( messages.Count > 0 ) { OnSteamChatMessagesReceived( new SteamChatMessagesReceivedEventArgs { UTCServerChangeDateTime = result.UTCTimestamp, NewMessages = messages } ); } if( notifications.Count > 0 ) { OnSteamChatUserStateChange( new SteamChatUserStateChangeEventArgs { UTCServerChangeDateTime = result.UTCTimestamp, StateChanges = notifications } ); } }