Skip to content

Commit 03e616c

Browse files
Add ConnectionStatusListener and functions to Reconnect, Disconnect all subscriptions.
1 parent 4c9c59c commit 03e616c

File tree

9 files changed

+122
-8
lines changed

9 files changed

+122
-8
lines changed

Source/PubnubChatSDK/Private/PubnubChat.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,23 @@ UPubnubChat* UPubnubChat::Create(Pubnub::Chat Chat)
3333
};
3434
};
3535
Chat.register_logger_callback(PubnubChatLogLambda);
36+
3637
return NewChat;
3738
}
3839

40+
void UPubnubChat::InitConnectionListener()
41+
{
42+
if(!IsInternalChatValid()) {return;}
43+
44+
auto ConnectionStatusListener = [this](Pubnub::pn_connection_status status, Pubnub::ConnectionStatusData status_data)
45+
{
46+
FPubnubConnectionStatusData StatusData = FPubnubConnectionStatusData({UPubnubChatUtilities::PubnubStringToFString(status_data.reason)});
47+
OnConnectionStatusChanged.Broadcast((EPubnubConnectionStatus)status, StatusData);
48+
OnConnectionStatusChangedNative.Broadcast((EPubnubConnectionStatus)status, StatusData);
49+
};
50+
InternalChat->add_connection_status_listener(ConnectionStatusListener);
51+
}
52+
3953
void UPubnubChat::DestroyChat()
4054
{
4155
delete InternalChat;
@@ -546,6 +560,38 @@ UPubnubAccessManager* UPubnubChat::GetAccessManager()
546560
return UPubnubAccessManager::Create(InternalChat->access_manager());
547561
}
548562

563+
bool UPubnubChat::ReconnectSubscriptions()
564+
{
565+
if(!IsInternalChatValid()) {return false;}
566+
567+
try
568+
{
569+
return InternalChat->reconnect_subscriptions();
570+
}
571+
catch (std::exception& Exception)
572+
{
573+
UE_LOG(PubnubChatLog, Error, TEXT("Reconnect Subscriptions error: %s"), UTF8_TO_TCHAR(Exception.what()));
574+
}
575+
576+
return false;
577+
}
578+
579+
bool UPubnubChat::DisconnectSubscriptions()
580+
{
581+
if(!IsInternalChatValid()) {return false;}
582+
583+
try
584+
{
585+
return InternalChat->disconnect_subscriptions();
586+
}
587+
catch (std::exception& Exception)
588+
{
589+
UE_LOG(PubnubChatLog, Error, TEXT("Disconnect Subscriptions error: %s"), UTF8_TO_TCHAR(Exception.what()));
590+
}
591+
592+
return false;
593+
}
594+
549595
bool UPubnubChat::IsInternalChatValid()
550596
{
551597
if(InternalChat == nullptr)

Source/PubnubChatSDK/Private/PubnubChatSubsystem.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ UPubnubChat* UPubnubChatSubsystem::InitChat(FString PublishKey, FString Subscrib
3737
UPubnubChatUtilities::FStringToPubnubString(SubscribeKey),UPubnubChatUtilities::FStringToPubnubString(UserID), CppConfig));
3838
//Bind OnChatDestroyed, so Subsystem can clear a variable when Chat is destroyed manually by an user
3939
Chat->OnChatDestroyed.AddDynamic(this, &UPubnubChatSubsystem::OnChatDestroyed);
40+
Chat->InitConnectionListener();
4041

4142
return Chat;
4243
}

Source/PubnubChatSDK/Public/PubnubChat.h

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
DECLARE_DYNAMIC_DELEGATE_OneParam(FOnPubnubEventReceived, FPubnubEvent, Event);
1414
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnPubnubChatDestroyed);
15+
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnConnectionStatusChanged, EPubnubConnectionStatus, Status, const FPubnubConnectionStatusData&, StatusData);
16+
DECLARE_MULTICAST_DELEGATE_TwoParams(FOnConnectionStatusChangedNative, EPubnubConnectionStatus Status, const FPubnubConnectionStatusData& StatusData);
1517

1618
class UPubnubChannel;
1719
class UPubnubUser;
@@ -152,20 +154,19 @@ struct FPubnubEventsHistoryWrapper
152154
}
153155
};
154156

155-
// TODO: Probably it should be moved into new directory but I'm not sure if it requires any additional actions:
156-
// -->
157+
157158
USTRUCT(BlueprintType)
158159
struct FPubnubUserMentionData
159160
{
160161
GENERATED_BODY();
161162

162-
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString ChannelID;
163-
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString UserID;
163+
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString ChannelID = "";
164+
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString UserID = "";
164165
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FPubnubEvent Event;
165166
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") UPubnubMessage* Message = nullptr;
166167

167-
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString ParentChannelID;
168-
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString ThreadChannelID;
168+
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString ParentChannelID = "";
169+
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString ThreadChannelID = "";
169170

170171
FPubnubUserMentionData() = default;
171172
FPubnubUserMentionData(Pubnub::UserMentionData& MentionData) :
@@ -197,7 +198,7 @@ struct FPubnubUserMentionDataList
197198
}
198199
}
199200
};
200-
// <--
201+
201202

202203
/**
203204
*
@@ -216,7 +217,14 @@ class PUBNUBCHATSDK_API UPubnubChat : public UObject
216217
}
217218
}
218219

219-
UPROPERTY(BlueprintAssignable, Category = "Pubnub Chat")
220+
/**Listener to react for connection status changed */
221+
UPROPERTY(BlueprintAssignable, Category = "Pubnub Chat|Delegates")
222+
FOnConnectionStatusChanged OnConnectionStatusChanged;
223+
224+
/**Listener to react for connection status changed , equivalent that accepts lambdas*/
225+
FOnConnectionStatusChangedNative OnConnectionStatusChangedNative;
226+
227+
UPROPERTY(BlueprintAssignable, Category = "Pubnub Chat|Delegates")
220228
FOnPubnubChatDestroyed OnChatDestroyed;
221229

222230
UFUNCTION(BlueprintCallable, Category="Pubnub Chat")
@@ -332,8 +340,30 @@ class PUBNUBCHATSDK_API UPubnubChat : public UObject
332340
UFUNCTION(BlueprintCallable, Category = "Pubnub Chat|Access Manager")
333341
UPubnubAccessManager* GetAccessManager();
334342

343+
344+
/* CONNECTION STATUS */
345+
346+
/**
347+
* Tries to reconnect all existing subscriptions. Mostly call this if DisconnectSubscriptions was called previously
348+
* or if received ConnectionError from OnConnectionStatusChanged to restore all existing subscriptions and listeners.
349+
* @return true if operation succeeded.
350+
*/
351+
UFUNCTION(BlueprintCallable, Category = "Pubnub Chat|Connection Status")
352+
bool ReconnectSubscriptions();
353+
354+
/**
355+
* Tries to disconnect (pause) all active subscriptions - listeners. This will be called for all objects: channels, users,
356+
* messages, etc. Call ReconnectSubscriptions to restore them.
357+
* @return true if operation succeeded.
358+
*/
359+
UFUNCTION(BlueprintCallable, Category = "Pubnub Chat|Connection Status")
360+
bool DisconnectSubscriptions();
361+
362+
335363
//Internal usage only
336364
static UPubnubChat* Create(Pubnub::Chat Chat);
365+
//Internal usage only, to listen for Connection Statuses use OnConnectionStatusChanged or OnConnectionStatusChangedNative
366+
void InitConnectionListener();
337367

338368
private:
339369
bool IsInternalChatValid();

Source/PubnubChatSDK/Public/PubnubChatEnumLibrary.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,12 @@ enum class EPubnubMessageDraftSuggestionSource : uint8
6666
{
6767
PMDSS_Channel UMETA(DisplayName="Channel"),
6868
PMDSS_Global UMETA(DisplayName="Global"),
69+
};
70+
71+
UENUM(BlueprintType)
72+
enum class EPubnubConnectionStatus : uint8
73+
{
74+
PCS_CONNECTION_ONLINE UMETA(DisplayName="ConnectionOnline"),
75+
PCS_CONNECTION_OFFLINE UMETA(DisplayName="ConnectionOffline"),
76+
PCS_CONNECTION_ERROR UMETA(DisplayName="ConnectionError")
6977
};

Source/PubnubChatSDK/Public/PubnubChatStructLibrary.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,4 +482,13 @@ struct FPubnubMessageDraftConfig
482482
ChannelLimit
483483
});
484484
}
485+
};
486+
487+
USTRUCT(BlueprintType)
488+
struct FPubnubConnectionStatusData
489+
{
490+
GENERATED_BODY()
491+
492+
/**Error details in case of ConnectionError.*/
493+
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "PubnubChat") FString Reason = "";
485494
};

Source/ThirdParty/sdk/include/pubnub_chat/chat.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ namespace Pubnub {
110110
bool is_more;
111111
};
112112

113+
struct ConnectionStatusData
114+
{
115+
/**Error details in case of ConnectionError.*/
116+
Pubnub::String reason = "";
117+
};
118+
113119

114120

115121
class Chat {
@@ -170,11 +176,19 @@ namespace Pubnub {
170176
PN_CHAT_EXPORT void remove_thread_channel(const Pubnub::Message& message) const;
171177

172178
/* PAM */
179+
173180
PN_CHAT_EXPORT Pubnub::AccessManager access_manager() const;
174181

175182
/* LOG */
183+
176184
PN_CHAT_EXPORT void register_logger_callback(std::function<void(Pubnub::pn_log_level, const char*)> callback);
177185

186+
/* CONNECTION STATUS */
187+
188+
PN_CHAT_EXPORT void add_connection_status_listener(std::function<void(Pubnub::pn_connection_status status, Pubnub::ConnectionStatusData status_data)> connection_status_callback) const;
189+
PN_CHAT_EXPORT bool reconnect_subscriptions() const;
190+
PN_CHAT_EXPORT bool disconnect_subscriptions() const;
191+
178192
private:
179193
Chat(const Pubnub::String& publish_key, const Pubnub::String& subscribe_key, const Pubnub::String& user_id, const ChatConfig& config);
180194
void store_user_activity_timestamp() const;

Source/ThirdParty/sdk/include/pubnub_chat/enums.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ enum pn_log_level {
4747
Trace
4848
};
4949

50+
enum pn_connection_status {
51+
PCS_CONNECTION_ONLINE,
52+
PCS_CONNECTION_OFFLINE,
53+
PCS_CONNECTION_ERROR
54+
};
55+
5056
}
5157

5258
#endif // PN_ENUMS_HPP
Binary file not shown.
1.48 KB
Binary file not shown.

0 commit comments

Comments
 (0)