void FXmppPresenceJingle::OnSignalPresenceUpdate(const buzz::PresenceStatus& InStatus) { // ignore muc presence FString Domain(UTF8_TO_TCHAR(InStatus.jid().domain().c_str())); if (!Domain.Equals(Connection.GetMucDomain(), ESearchCase::IgnoreCase)) { FXmppUserJid UserJid; FXmppJingle::ConvertToJid(UserJid, InStatus.jid()); // Don't keep presence entries missing a resource, this comes in when a new friend is added but will never get updated when user logs off if (UserJid.IsValid() && !UserJid.Resource.IsEmpty()) { FScopeLock Lock(&RosterLock); FXmppUserPresenceJingle& RosterEntry = RosterPresence.FindOrAdd(UserJid.GetFullPath()); ConvertToPresence(*RosterEntry.Presence, InStatus, UserJid); FXmppJingle::ConvertToJid(RosterEntry.UserJid, InStatus.jid()); UE_LOG(LogXmpp, Verbose, TEXT("Received presence for user [%s]"), *UserJid.GetFullPath()); DebugPrintPresence(*RosterEntry.Presence); RosterUpdates.Enqueue(UserJid.GetFullPath()); } else if (UserJid.IsValid() && UserJid.Resource.IsEmpty()) { UE_LOG(LogXmpp, Warning, TEXT("Ignoring presence update with empty resource. StatusJid = %s, JidFullPath = %s"), UTF8_TO_TCHAR(InStatus.jid().Str().c_str()), *UserJid.GetFullPath()); } } }
void FXmppPresenceJingle::OnSignalMucPresenceUpdate(const class FXmppMucPresenceStatus& MucStatus) { FXmppUserJid MucJid; FXmppJingle::ConvertToJid(MucJid, MucStatus.jid()); UE_LOG(LogXmpp, Verbose, TEXT("Received MUC presence from [%s]"), *MucJid.GetFullPath()); FXmppMucPresence MucPresence; ConvertToMucPresence(MucPresence, MucStatus, MucJid); Connection.MultiUserChat()->HandleMucPresence(MucPresence); }