2014-12-07 19:09:38 -05:00
|
|
|
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
2014-03-14 14:13:41 -04:00
|
|
|
|
|
|
|
|
#include "FriendsAndChatPrivatePCH.h"
|
2014-11-06 15:17:11 -05:00
|
|
|
#include "OnlineChatInterface.h"
|
2014-12-03 10:21:53 -05:00
|
|
|
#include "ChatItemViewModel.h"
|
2014-09-21 20:35:48 -04:00
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
#define LOCTEXT_NAMESPACE "FriendsMessageManager"
|
2014-12-01 08:46:12 -05:00
|
|
|
// Message expiry time for different message types
|
2014-12-03 10:21:53 -05:00
|
|
|
static const int32 GlobalMessageLifetime = 5 * 60; // 5 min
|
|
|
|
|
static const int32 PartyMessageLifetime = 5 * 60; // 5 min
|
|
|
|
|
static const int32 WhisperMessageLifetime = 5 * 60; // 5 min
|
2014-12-01 08:46:12 -05:00
|
|
|
static const int32 MessageStore = 200;
|
2014-12-03 10:21:53 -05:00
|
|
|
static const int32 GlobalMaxStore = 100;
|
|
|
|
|
static const int32 WhisperMaxStore = 100;
|
|
|
|
|
static const int32 PartyMaxStore = 100;
|
2014-03-14 14:13:41 -04:00
|
|
|
|
2014-11-06 15:17:11 -05:00
|
|
|
class FFriendsMessageManagerImpl
|
|
|
|
|
: public FFriendsMessageManager
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-06 15:17:11 -05:00
|
|
|
public:
|
2014-03-14 14:13:41 -04:00
|
|
|
|
2014-11-06 15:17:11 -05:00
|
|
|
virtual void LogIn() override
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-06 15:17:11 -05:00
|
|
|
Initialize();
|
2014-11-08 11:02:45 -05:00
|
|
|
|
|
|
|
|
if (OnlineSub != nullptr &&
|
|
|
|
|
OnlineSub->GetIdentityInterface().IsValid())
|
|
|
|
|
{
|
|
|
|
|
LoggedInUser = OnlineSub->GetIdentityInterface()->GetUniquePlayerId(0);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-13 22:10:58 -05:00
|
|
|
for (auto RoomName : RoomJoins)
|
2014-11-08 11:02:45 -05:00
|
|
|
{
|
|
|
|
|
JoinPublicRoom(RoomName);
|
|
|
|
|
}
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2014-11-06 15:17:11 -05:00
|
|
|
virtual void LogOut() override
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-08 11:02:45 -05:00
|
|
|
if (OnlineSub != nullptr &&
|
|
|
|
|
OnlineSub->GetChatInterface().IsValid() &&
|
|
|
|
|
LoggedInUser.IsValid())
|
|
|
|
|
{
|
|
|
|
|
// exit out of any rooms that we're in
|
|
|
|
|
TArray<FChatRoomId> JoinedRooms;
|
|
|
|
|
OnlineSub->GetChatInterface()->GetJoinedRooms(*LoggedInUser, JoinedRooms);
|
|
|
|
|
for (auto RoomId : JoinedRooms)
|
|
|
|
|
{
|
|
|
|
|
OnlineSub->GetChatInterface()->ExitRoom(*LoggedInUser, RoomId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
LoggedInUser.Reset();
|
2014-11-06 15:17:11 -05:00
|
|
|
UnInitialize();
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2015-03-13 08:26:18 -04:00
|
|
|
virtual const TArray<TSharedRef<FFriendChatMessage> >& GetMessages() const override
|
2014-11-26 04:56:03 -05:00
|
|
|
{
|
|
|
|
|
return ReceivedMessages;
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-18 18:54:38 -05:00
|
|
|
virtual bool SendRoomMessage(const FString& RoomName, const FString& MsgBody) override
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-08 11:02:45 -05:00
|
|
|
if (OnlineSub != nullptr &&
|
|
|
|
|
LoggedInUser.IsValid())
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-08 11:02:45 -05:00
|
|
|
IOnlineChatPtr ChatInterface = OnlineSub->GetChatInterface();
|
|
|
|
|
if (ChatInterface.IsValid())
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-08 11:17:18 -05:00
|
|
|
if (!RoomName.IsEmpty())
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-08 11:17:18 -05:00
|
|
|
TSharedPtr<FChatRoomInfo> RoomInfo = ChatInterface->GetRoomInfo(*LoggedInUser, FChatRoomId(RoomName));
|
|
|
|
|
if (RoomInfo.IsValid() &&
|
|
|
|
|
RoomInfo->IsJoined())
|
|
|
|
|
{
|
2014-11-18 18:54:38 -05:00
|
|
|
return ChatInterface->SendRoomChat(*LoggedInUser, FChatRoomId(RoomName), MsgBody);
|
2014-11-08 11:17:18 -05:00
|
|
|
}
|
2014-11-07 17:41:06 -05:00
|
|
|
}
|
2014-11-08 11:17:18 -05:00
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// send to all joined rooms
|
2014-11-18 18:54:38 -05:00
|
|
|
bool bAbleToSend = false;
|
2014-11-08 11:17:18 -05:00
|
|
|
TArray<FChatRoomId> JoinedRooms;
|
|
|
|
|
OnlineSub->GetChatInterface()->GetJoinedRooms(*LoggedInUser, JoinedRooms);
|
|
|
|
|
for (auto RoomId : JoinedRooms)
|
|
|
|
|
{
|
2014-11-18 18:54:38 -05:00
|
|
|
if (ChatInterface->SendRoomChat(*LoggedInUser, RoomId, MsgBody))
|
|
|
|
|
{
|
|
|
|
|
bAbleToSend = true;
|
|
|
|
|
}
|
2014-11-08 11:17:18 -05:00
|
|
|
}
|
2014-11-18 18:54:38 -05:00
|
|
|
return bAbleToSend;
|
2014-11-08 11:17:18 -05:00
|
|
|
}
|
|
|
|
|
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
2014-11-18 18:54:38 -05:00
|
|
|
return false;
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
2014-03-14 14:13:41 -04:00
|
|
|
|
2015-03-13 08:26:18 -04:00
|
|
|
virtual bool SendPrivateMessage(TSharedPtr<FUniqueNetId> UserID, const FText MessageText) override
|
2014-11-08 11:02:45 -05:00
|
|
|
{
|
|
|
|
|
if (OnlineSub != nullptr &&
|
|
|
|
|
LoggedInUser.IsValid())
|
|
|
|
|
{
|
|
|
|
|
IOnlineChatPtr ChatInterface = OnlineSub->GetChatInterface();
|
|
|
|
|
if(ChatInterface.IsValid())
|
|
|
|
|
{
|
2014-12-03 10:21:53 -05:00
|
|
|
TSharedPtr< FFriendChatMessage > ChatItem = MakeShareable(new FFriendChatMessage());
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->FromName = FText::FromString(OnlineSub->GetIdentityInterface()->GetPlayerNickname(*LoggedInUser.Get()));
|
2015-04-09 04:02:47 -04:00
|
|
|
TSharedPtr<IFriendItem> FoundFriend = FFriendsAndChatManager::Get()->FindUser(*UserID.Get());
|
|
|
|
|
ChatItem->ToName = FText::FromString(*FoundFriend->GetName());
|
2014-12-03 10:21:53 -05:00
|
|
|
ChatItem->Message = MessageText;
|
|
|
|
|
ChatItem->MessageType = EChatMessageType::Whisper;
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->MessageTime = FDateTime::UtcNow();
|
2014-12-03 10:21:53 -05:00
|
|
|
ChatItem->ExpireTime = FDateTime::UtcNow() + FTimespan::FromSeconds(WhisperMessageLifetime);
|
|
|
|
|
ChatItem->bIsFromSelf = true;
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->SenderId = LoggedInUser;
|
|
|
|
|
ChatItem->RecipientId = UserID;
|
2014-12-03 10:21:53 -05:00
|
|
|
AddMessage(ChatItem.ToSharedRef());
|
|
|
|
|
return ChatInterface->SendPrivateChat(*LoggedInUser, *UserID.Get(), MessageText.ToString());
|
2014-11-08 11:02:45 -05:00
|
|
|
}
|
|
|
|
|
}
|
2014-11-18 18:54:38 -05:00
|
|
|
return false;
|
2014-11-08 11:02:45 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-11 04:54:47 -05:00
|
|
|
virtual void InsertNetworkMessage(const FString& MsgBody) override
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr< FFriendChatMessage > ChatItem = MakeShareable(new FFriendChatMessage());
|
|
|
|
|
ChatItem->FromName = FText::FromString("Game");
|
|
|
|
|
ChatItem->Message = FText::FromString(MsgBody);
|
2014-11-13 16:15:33 -05:00
|
|
|
ChatItem->MessageType = EChatMessageType::Party;
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->MessageTime = FDateTime::UtcNow();
|
2014-12-03 10:21:53 -05:00
|
|
|
ChatItem->ExpireTime = FDateTime::UtcNow() + FTimespan::FromSeconds(PartyMessageLifetime);
|
2014-11-11 04:54:47 -05:00
|
|
|
ChatItem->bIsFromSelf = false;
|
2014-12-03 10:21:53 -05:00
|
|
|
PartyMessagesCount++;
|
2014-11-26 04:56:03 -05:00
|
|
|
AddMessage(ChatItem.ToSharedRef());
|
2014-11-11 04:54:47 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
virtual void JoinPublicRoom(const FString& RoomName) override
|
|
|
|
|
{
|
|
|
|
|
if (LoggedInUser.IsValid())
|
|
|
|
|
{
|
|
|
|
|
if (OnlineSub != nullptr &&
|
|
|
|
|
OnlineSub->GetChatInterface().IsValid())
|
|
|
|
|
{
|
|
|
|
|
// join the room to start receiving messages from it
|
|
|
|
|
FString NickName = OnlineSub->GetIdentityInterface()->GetPlayerNickname(*LoggedInUser);
|
|
|
|
|
OnlineSub->GetChatInterface()->JoinPublicRoom(*LoggedInUser, FChatRoomId(RoomName), NickName);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-11-13 22:10:58 -05:00
|
|
|
RoomJoins.AddUnique(RoomName);
|
2014-11-08 11:02:45 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-06 15:17:11 -05:00
|
|
|
DECLARE_DERIVED_EVENT(FFriendsMessageManagerImpl, FFriendsMessageManager::FOnChatMessageReceivedEvent, FOnChatMessageReceivedEvent)
|
|
|
|
|
virtual FOnChatMessageReceivedEvent& OnChatMessageRecieved() override
|
|
|
|
|
{
|
2014-11-13 22:05:37 -05:00
|
|
|
return MessageReceivedEvent;
|
|
|
|
|
}
|
|
|
|
|
DECLARE_DERIVED_EVENT(FFriendsMessageManagerImpl, FFriendsMessageManager::FOnChatPublicRoomJoinedEvent, FOnChatPublicRoomJoinedEvent)
|
|
|
|
|
virtual FOnChatPublicRoomJoinedEvent& OnChatPublicRoomJoined() override
|
|
|
|
|
{
|
|
|
|
|
return PublicRoomJoinedEvent;
|
|
|
|
|
}
|
|
|
|
|
DECLARE_DERIVED_EVENT(FFriendsMessageManagerImpl, FFriendsMessageManager::FOnChatPublicRoomExitedEvent, FOnChatPublicRoomExitedEvent)
|
|
|
|
|
virtual FOnChatPublicRoomExitedEvent& OnChatPublicRoomExited() override
|
|
|
|
|
{
|
|
|
|
|
return PublicRoomExitedEvent;
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~FFriendsMessageManagerImpl()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
FFriendsMessageManagerImpl( )
|
2014-11-08 11:02:45 -05:00
|
|
|
: OnlineSub(nullptr)
|
2014-11-13 22:05:37 -05:00
|
|
|
, bEnableEnterExitMessages(false)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Initialize()
|
|
|
|
|
{
|
|
|
|
|
// Clear existing data
|
|
|
|
|
LogOut();
|
|
|
|
|
|
2014-12-03 10:21:53 -05:00
|
|
|
GlobalMessagesCount = 0;
|
|
|
|
|
WhisperMessagesCount = 0;
|
|
|
|
|
PartyMessagesCount = 0;
|
|
|
|
|
ReceivedMessages.Empty();
|
|
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
OnlineSub = IOnlineSubsystem::Get( TEXT( "MCP" ) );
|
2014-11-06 15:17:11 -05:00
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
if (OnlineSub != nullptr)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
2014-11-08 11:02:45 -05:00
|
|
|
IOnlineChatPtr ChatInterface = OnlineSub->GetChatInterface();
|
2014-11-13 22:10:58 -05:00
|
|
|
if (ChatInterface.IsValid())
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2015-01-08 09:29:27 -05:00
|
|
|
OnChatRoomJoinPublicDelegate = FOnChatRoomJoinPublicDelegate ::CreateSP(this, &FFriendsMessageManagerImpl::OnChatRoomJoinPublic);
|
|
|
|
|
OnChatRoomExitDelegate = FOnChatRoomExitDelegate ::CreateSP(this, &FFriendsMessageManagerImpl::OnChatRoomExit);
|
|
|
|
|
OnChatRoomMemberJoinDelegate = FOnChatRoomMemberJoinDelegate ::CreateSP(this, &FFriendsMessageManagerImpl::OnChatRoomMemberJoin);
|
|
|
|
|
OnChatRoomMemberExitDelegate = FOnChatRoomMemberExitDelegate ::CreateSP(this, &FFriendsMessageManagerImpl::OnChatRoomMemberExit);
|
|
|
|
|
OnChatRoomMemberUpdateDelegate = FOnChatRoomMemberUpdateDelegate ::CreateSP(this, &FFriendsMessageManagerImpl::OnChatRoomMemberUpdate);
|
|
|
|
|
OnChatRoomMessageReceivedDelegate = FOnChatRoomMessageReceivedDelegate ::CreateSP(this, &FFriendsMessageManagerImpl::OnChatRoomMessageReceived);
|
|
|
|
|
OnChatPrivateMessageReceivedDelegate = FOnChatPrivateMessageReceivedDelegate::CreateSP(this, &FFriendsMessageManagerImpl::OnChatPrivateMessageReceived);
|
2014-11-06 15:17:11 -05:00
|
|
|
|
2015-01-08 09:29:27 -05:00
|
|
|
OnChatRoomJoinPublicDelegateHandle = ChatInterface->AddOnChatRoomJoinPublicDelegate_Handle (OnChatRoomJoinPublicDelegate);
|
|
|
|
|
OnChatRoomExitDelegateHandle = ChatInterface->AddOnChatRoomExitDelegate_Handle (OnChatRoomExitDelegate);
|
|
|
|
|
OnChatRoomMemberJoinDelegateHandle = ChatInterface->AddOnChatRoomMemberJoinDelegate_Handle (OnChatRoomMemberJoinDelegate);
|
|
|
|
|
OnChatRoomMemberExitDelegateHandle = ChatInterface->AddOnChatRoomMemberExitDelegate_Handle (OnChatRoomMemberExitDelegate);
|
|
|
|
|
OnChatRoomMemberUpdateDelegateHandle = ChatInterface->AddOnChatRoomMemberUpdateDelegate_Handle (OnChatRoomMemberUpdateDelegate);
|
|
|
|
|
OnChatRoomMessageReceivedDelegateHandle = ChatInterface->AddOnChatRoomMessageReceivedDelegate_Handle (OnChatRoomMessageReceivedDelegate);
|
|
|
|
|
OnChatPrivateMessageReceivedDelegateHandle = ChatInterface->AddOnChatPrivateMessageReceivedDelegate_Handle(OnChatPrivateMessageReceivedDelegate);
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
2014-11-13 22:10:58 -05:00
|
|
|
IOnlinePresencePtr PresenceInterface = OnlineSub->GetPresenceInterface();
|
|
|
|
|
if (PresenceInterface.IsValid())
|
|
|
|
|
{
|
|
|
|
|
OnPresenceReceivedDelegate = FOnPresenceReceivedDelegate::CreateSP(this, &FFriendsMessageManagerImpl::OnPresenceReceived);
|
2015-01-08 09:29:27 -05:00
|
|
|
OnPresenceReceivedDelegateHandle = PresenceInterface->AddOnPresenceReceivedDelegate_Handle(OnPresenceReceivedDelegate);
|
2014-11-13 22:10:58 -05:00
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UnInitialize()
|
|
|
|
|
{
|
2014-11-08 11:02:45 -05:00
|
|
|
if (OnlineSub != nullptr)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
2014-11-08 11:02:45 -05:00
|
|
|
IOnlineChatPtr ChatInterface = OnlineSub->GetChatInterface();
|
2014-11-06 15:17:11 -05:00
|
|
|
if( ChatInterface.IsValid())
|
|
|
|
|
{
|
2015-01-08 09:29:27 -05:00
|
|
|
ChatInterface->ClearOnChatRoomJoinPublicDelegate_Handle (OnChatRoomJoinPublicDelegateHandle);
|
|
|
|
|
ChatInterface->ClearOnChatRoomExitDelegate_Handle (OnChatRoomExitDelegateHandle);
|
|
|
|
|
ChatInterface->ClearOnChatRoomMemberJoinDelegate_Handle (OnChatRoomMemberJoinDelegateHandle);
|
|
|
|
|
ChatInterface->ClearOnChatRoomMemberExitDelegate_Handle (OnChatRoomMemberExitDelegateHandle);
|
|
|
|
|
ChatInterface->ClearOnChatRoomMemberUpdateDelegate_Handle (OnChatRoomMemberUpdateDelegateHandle);
|
|
|
|
|
ChatInterface->ClearOnChatRoomMessageReceivedDelegate_Handle (OnChatRoomMessageReceivedDelegateHandle);
|
|
|
|
|
ChatInterface->ClearOnChatPrivateMessageReceivedDelegate_Handle(OnChatPrivateMessageReceivedDelegateHandle);
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
2014-11-13 22:10:58 -05:00
|
|
|
IOnlinePresencePtr PresenceInterface = OnlineSub->GetPresenceInterface();
|
|
|
|
|
if (PresenceInterface.IsValid())
|
|
|
|
|
{
|
2015-01-08 09:29:27 -05:00
|
|
|
PresenceInterface->ClearOnPresenceReceivedDelegate_Handle(OnPresenceReceivedDelegateHandle);
|
2014-11-13 22:10:58 -05:00
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
2014-11-08 11:02:45 -05:00
|
|
|
OnlineSub = nullptr;
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
void OnChatRoomJoinPublic(const FUniqueNetId& UserId, const FChatRoomId& ChatRoomID, bool bWasSuccessful, const FString& Error)
|
2014-11-08 11:17:18 -05:00
|
|
|
{
|
2015-02-10 06:44:35 -05:00
|
|
|
if (bWasSuccessful)
|
|
|
|
|
{
|
|
|
|
|
OnChatPublicRoomJoined().Broadcast(ChatRoomID);
|
|
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
void OnChatRoomExit(const FUniqueNetId& UserId, const FChatRoomId& ChatRoomID, bool bWasSuccessful, const FString& Error)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
2015-02-10 06:44:35 -05:00
|
|
|
if (bWasSuccessful)
|
|
|
|
|
{
|
|
|
|
|
OnChatPublicRoomExited().Broadcast(ChatRoomID);
|
|
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
void OnChatRoomMemberJoin(const FUniqueNetId& UserId, const FChatRoomId& ChatRoomID, const FUniqueNetId& MemberId)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
2014-11-13 22:05:37 -05:00
|
|
|
if (bEnableEnterExitMessages &&
|
|
|
|
|
LoggedInUser.IsValid() &&
|
2014-11-07 17:41:06 -05:00
|
|
|
*LoggedInUser != MemberId)
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr< FFriendChatMessage > ChatItem = MakeShareable(new FFriendChatMessage());
|
|
|
|
|
TSharedPtr<FChatRoomMember> ChatMember = OnlineSub->GetChatInterface()->GetMember(UserId, ChatRoomID, MemberId);
|
|
|
|
|
if (ChatMember.IsValid())
|
|
|
|
|
{
|
|
|
|
|
ChatItem->FromName = FText::FromString(*ChatMember->GetNickname());
|
|
|
|
|
}
|
|
|
|
|
ChatItem->Message = FText::FromString(TEXT("entered room"));
|
|
|
|
|
ChatItem->MessageType = EChatMessageType::Global;
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->MessageTime = FDateTime::UtcNow();
|
2014-12-01 08:46:12 -05:00
|
|
|
ChatItem->ExpireTime = FDateTime::UtcNow() + GlobalMessageLifetime;
|
2014-11-07 17:41:06 -05:00
|
|
|
ChatItem->bIsFromSelf = false;
|
2014-12-03 10:21:53 -05:00
|
|
|
GlobalMessagesCount++;
|
|
|
|
|
AddMessage(ChatItem.ToSharedRef());
|
2014-11-07 17:41:06 -05:00
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
void OnChatRoomMemberExit(const FUniqueNetId& UserId, const FChatRoomId& ChatRoomID, const FUniqueNetId& MemberId)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
2014-11-13 22:05:37 -05:00
|
|
|
if (bEnableEnterExitMessages &&
|
|
|
|
|
LoggedInUser.IsValid() &&
|
2014-11-07 17:41:06 -05:00
|
|
|
*LoggedInUser != MemberId)
|
|
|
|
|
{
|
|
|
|
|
TSharedPtr< FFriendChatMessage > ChatItem = MakeShareable(new FFriendChatMessage());
|
|
|
|
|
TSharedPtr<FChatRoomMember> ChatMember = OnlineSub->GetChatInterface()->GetMember(UserId, ChatRoomID, MemberId);
|
|
|
|
|
if (ChatMember.IsValid())
|
|
|
|
|
{
|
|
|
|
|
ChatItem->FromName = FText::FromString(*ChatMember->GetNickname());
|
|
|
|
|
}
|
|
|
|
|
ChatItem->Message = FText::FromString(TEXT("left room"));
|
|
|
|
|
ChatItem->MessageType = EChatMessageType::Global;
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->MessageTime = FDateTime::UtcNow();
|
2014-12-01 08:46:12 -05:00
|
|
|
ChatItem->ExpireTime = FDateTime::UtcNow() + GlobalMessageLifetime;
|
2014-11-07 17:41:06 -05:00
|
|
|
ChatItem->bIsFromSelf = false;
|
2014-12-03 10:21:53 -05:00
|
|
|
GlobalMessagesCount++;
|
|
|
|
|
AddMessage(ChatItem.ToSharedRef());
|
2014-11-07 17:41:06 -05:00
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
void OnChatRoomMemberUpdate(const FUniqueNetId& UserId, const FChatRoomId& ChatRoomID, const FUniqueNetId& MemberId)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-18 13:35:25 -05:00
|
|
|
void OnChatRoomMessageReceived(const FUniqueNetId& UserId, const FChatRoomId& ChatRoomID, const TSharedRef<FChatMessage>& ChatMessage)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
2014-11-07 17:41:06 -05:00
|
|
|
TSharedPtr< FFriendChatMessage > ChatItem = MakeShareable(new FFriendChatMessage());
|
|
|
|
|
|
2014-11-18 13:35:25 -05:00
|
|
|
ChatItem->FromName = FText::FromString(*ChatMessage->GetNickname());
|
|
|
|
|
ChatItem->Message = FText::FromString(*ChatMessage->GetBody());
|
2014-11-07 17:41:06 -05:00
|
|
|
ChatItem->MessageType = EChatMessageType::Global;
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->MessageTime = ChatMessage->GetTimestamp();
|
2014-12-03 10:21:53 -05:00
|
|
|
ChatItem->ExpireTime = ChatMessage->GetTimestamp() + FTimespan::FromSeconds(GlobalMessageLifetime);
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->bIsFromSelf = *ChatMessage->GetUserId() == *LoggedInUser;
|
|
|
|
|
ChatItem->SenderId = ChatMessage->GetUserId();
|
|
|
|
|
ChatItem->RecipientId = nullptr;
|
2014-11-19 05:28:05 -05:00
|
|
|
ChatItem->MessageRef = ChatMessage;
|
2014-12-03 10:21:53 -05:00
|
|
|
GlobalMessagesCount++;
|
|
|
|
|
AddMessage(ChatItem.ToSharedRef());
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
|
|
|
|
|
2014-11-18 13:35:25 -05:00
|
|
|
void OnChatPrivateMessageReceived(const FUniqueNetId& UserId, const TSharedRef<FChatMessage>& ChatMessage)
|
2014-11-06 15:17:11 -05:00
|
|
|
{
|
|
|
|
|
TSharedPtr< FFriendChatMessage > ChatItem = MakeShareable(new FFriendChatMessage());
|
2014-11-18 13:35:25 -05:00
|
|
|
TSharedPtr<IFriendItem> FoundFriend = FFriendsAndChatManager::Get()->FindUser(ChatMessage->GetUserId());
|
2014-11-20 04:05:40 -05:00
|
|
|
// Ignore messages from unknown people
|
2014-11-06 15:17:11 -05:00
|
|
|
if(FoundFriend.IsValid())
|
|
|
|
|
{
|
2014-11-08 11:02:45 -05:00
|
|
|
ChatItem->FromName = FText::FromString(*FoundFriend->GetName());
|
2014-11-14 08:05:34 -05:00
|
|
|
ChatItem->SenderId = FoundFriend->GetUniqueID();
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->bIsFromSelf = false;
|
|
|
|
|
ChatItem->RecipientId = LoggedInUser;
|
2014-11-20 04:05:40 -05:00
|
|
|
ChatItem->Message = FText::FromString(*ChatMessage->GetBody());
|
|
|
|
|
ChatItem->MessageType = EChatMessageType::Whisper;
|
2015-03-13 08:26:18 -04:00
|
|
|
ChatItem->MessageTime = ChatMessage->GetTimestamp();
|
2014-12-03 10:21:53 -05:00
|
|
|
ChatItem->ExpireTime = ChatMessage->GetTimestamp() + FTimespan::FromSeconds(WhisperMessageLifetime);
|
2014-11-20 04:05:40 -05:00
|
|
|
ChatItem->MessageRef = ChatMessage;
|
2014-12-03 10:21:53 -05:00
|
|
|
WhisperMessagesCount++;
|
|
|
|
|
AddMessage(ChatItem.ToSharedRef());
|
2014-12-17 12:42:40 -05:00
|
|
|
|
|
|
|
|
// Inform listers that we have received a chat message
|
2015-02-10 06:44:35 -05:00
|
|
|
FFriendsAndChatManager::Get()->SendChatMessageReceivedEvent(ChatItem->MessageType, FoundFriend);
|
2014-11-06 15:17:11 -05:00
|
|
|
}
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2014-11-13 22:10:58 -05:00
|
|
|
void OnPresenceReceived(const FUniqueNetId& UserId, const TSharedRef<FOnlineUserPresence>& Presence)
|
|
|
|
|
{
|
|
|
|
|
if (LoggedInUser.IsValid() &&
|
|
|
|
|
*LoggedInUser == UserId)
|
|
|
|
|
{
|
|
|
|
|
if (Presence->bIsOnline)
|
|
|
|
|
{
|
|
|
|
|
for (auto RoomName : RoomJoins)
|
|
|
|
|
{
|
|
|
|
|
JoinPublicRoom(RoomName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-13 08:26:18 -04:00
|
|
|
void AddMessage(TSharedRef< FFriendChatMessage > NewMessage)
|
2014-11-26 04:56:03 -05:00
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
//TSharedRef<FChatItemViewModel> NewMessage = FChatItemViewModelFactory::Create(ChatItem);
|
2014-12-03 10:21:53 -05:00
|
|
|
if(ReceivedMessages.Add(NewMessage) > MessageStore)
|
2014-12-01 08:46:12 -05:00
|
|
|
{
|
|
|
|
|
bool bGlobalTimeFound = false;
|
|
|
|
|
bool bPartyTimeFound = false;
|
|
|
|
|
bool bWhisperFound = false;
|
|
|
|
|
FDateTime CurrentTime = FDateTime::UtcNow();
|
|
|
|
|
for(int32 Index = 0; Index < ReceivedMessages.Num(); Index++)
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
TSharedRef<FFriendChatMessage> Message = ReceivedMessages[Index];
|
|
|
|
|
if (Message->ExpireTime < CurrentTime)
|
2014-12-01 08:46:12 -05:00
|
|
|
{
|
2014-12-03 10:21:53 -05:00
|
|
|
RemoveMessage(Message);
|
2014-12-01 08:46:12 -05:00
|
|
|
Index--;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
switch (Message->MessageType)
|
2014-12-01 08:46:12 -05:00
|
|
|
{
|
2014-12-03 10:21:53 -05:00
|
|
|
case EChatMessageType::Global :
|
|
|
|
|
{
|
|
|
|
|
if(GlobalMessagesCount > GlobalMaxStore)
|
|
|
|
|
{
|
|
|
|
|
RemoveMessage(Message);
|
|
|
|
|
Index--;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
bGlobalTimeFound = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case EChatMessageType::Party :
|
|
|
|
|
{
|
|
|
|
|
if(PartyMessagesCount > PartyMaxStore)
|
|
|
|
|
{
|
|
|
|
|
RemoveMessage(Message);
|
|
|
|
|
Index--;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
bPartyTimeFound = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case EChatMessageType::Whisper :
|
|
|
|
|
{
|
|
|
|
|
if(WhisperMessagesCount > WhisperMaxStore)
|
|
|
|
|
{
|
|
|
|
|
RemoveMessage(Message);
|
|
|
|
|
Index--;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
bWhisperFound = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
2014-12-01 08:46:12 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(ReceivedMessages.Num() < MessageStore || (bPartyTimeFound && bGlobalTimeFound && bWhisperFound))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-12-03 10:21:53 -05:00
|
|
|
OnChatMessageRecieved().Broadcast(NewMessage);
|
2014-11-26 04:56:03 -05:00
|
|
|
}
|
|
|
|
|
|
2015-03-13 08:26:18 -04:00
|
|
|
void RemoveMessage(TSharedRef<FFriendChatMessage> Message)
|
2014-12-03 10:21:53 -05:00
|
|
|
{
|
2015-03-13 08:26:18 -04:00
|
|
|
switch(Message->MessageType)
|
2014-12-03 10:21:53 -05:00
|
|
|
{
|
|
|
|
|
case EChatMessageType::Global : GlobalMessagesCount--; break;
|
|
|
|
|
case EChatMessageType::Party : PartyMessagesCount--; break;
|
|
|
|
|
case EChatMessageType::Whisper : WhisperMessagesCount--; break;
|
|
|
|
|
}
|
|
|
|
|
ReceivedMessages.Remove(Message);
|
|
|
|
|
}
|
2014-11-06 15:17:11 -05:00
|
|
|
private:
|
2014-03-14 14:13:41 -04:00
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
// Incoming delegates
|
2014-11-06 15:17:11 -05:00
|
|
|
FOnChatRoomJoinPublicDelegate OnChatRoomJoinPublicDelegate;
|
|
|
|
|
FOnChatRoomExitDelegate OnChatRoomExitDelegate;
|
|
|
|
|
FOnChatRoomMemberJoinDelegate OnChatRoomMemberJoinDelegate;
|
|
|
|
|
FOnChatRoomMemberExitDelegate OnChatRoomMemberExitDelegate;
|
|
|
|
|
FOnChatRoomMemberUpdateDelegate OnChatRoomMemberUpdateDelegate;
|
|
|
|
|
FOnChatRoomMessageReceivedDelegate OnChatRoomMessageReceivedDelegate;
|
|
|
|
|
FOnChatPrivateMessageReceivedDelegate OnChatPrivateMessageReceivedDelegate;
|
2014-11-13 22:10:58 -05:00
|
|
|
FOnPresenceReceivedDelegate OnPresenceReceivedDelegate;
|
2014-09-21 20:35:48 -04:00
|
|
|
|
2015-01-08 09:29:27 -05:00
|
|
|
// Handles to the above registered delegates
|
|
|
|
|
FDelegateHandle OnChatRoomJoinPublicDelegateHandle;
|
|
|
|
|
FDelegateHandle OnChatRoomExitDelegateHandle;
|
|
|
|
|
FDelegateHandle OnChatRoomMemberJoinDelegateHandle;
|
|
|
|
|
FDelegateHandle OnChatRoomMemberExitDelegateHandle;
|
|
|
|
|
FDelegateHandle OnChatRoomMemberUpdateDelegateHandle;
|
|
|
|
|
FDelegateHandle OnChatRoomMessageReceivedDelegateHandle;
|
|
|
|
|
FDelegateHandle OnChatPrivateMessageReceivedDelegateHandle;
|
|
|
|
|
FDelegateHandle OnPresenceReceivedDelegateHandle;
|
|
|
|
|
|
2014-11-06 15:17:11 -05:00
|
|
|
// Outgoing events
|
2014-11-13 22:05:37 -05:00
|
|
|
FOnChatMessageReceivedEvent MessageReceivedEvent;
|
|
|
|
|
FOnChatPublicRoomJoinedEvent PublicRoomJoinedEvent;
|
|
|
|
|
FOnChatPublicRoomExitedEvent PublicRoomExitedEvent;
|
2014-11-06 15:17:11 -05:00
|
|
|
|
2014-11-08 11:02:45 -05:00
|
|
|
IOnlineSubsystem* OnlineSub;
|
|
|
|
|
TSharedPtr<FUniqueNetId> LoggedInUser;
|
2014-11-13 22:10:58 -05:00
|
|
|
TArray<FString> RoomJoins;
|
2014-11-06 15:17:11 -05:00
|
|
|
|
2015-03-13 08:26:18 -04:00
|
|
|
TArray<TSharedRef<FFriendChatMessage> > ReceivedMessages;
|
2014-12-01 08:46:12 -05:00
|
|
|
|
2014-12-03 10:21:53 -05:00
|
|
|
int32 GlobalMessagesCount;
|
|
|
|
|
int32 WhisperMessagesCount;
|
|
|
|
|
int32 PartyMessagesCount;
|
2014-11-26 04:56:03 -05:00
|
|
|
|
2014-11-13 22:05:37 -05:00
|
|
|
bool bEnableEnterExitMessages;
|
|
|
|
|
|
2014-11-06 15:17:11 -05:00
|
|
|
private:
|
|
|
|
|
friend FFriendsMessageManagerFactory;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TSharedRef< FFriendsMessageManager > FFriendsMessageManagerFactory::Create()
|
2014-03-14 14:13:41 -04:00
|
|
|
{
|
2014-11-06 15:17:11 -05:00
|
|
|
TSharedRef< FFriendsMessageManagerImpl > MessageManager(new FFriendsMessageManagerImpl());
|
|
|
|
|
return MessageManager;
|
2014-03-14 14:13:41 -04:00
|
|
|
}
|
|
|
|
|
|
2014-11-08 11:17:18 -05:00
|
|
|
#undef LOCTEXT_NAMESPACE
|