Skip to content

Commit 76760b9

Browse files
Add Entities with all related functions. Add Subscription and SubscriptionSet functionality and Event Listeners. (#54)
feat(entities): add Entities with related functionality. Add implementation of Entities: Channel, ChannelGroup, ChannelMetadata, UserMetadata with all related PubNub functions. feat(subscribtion): add Subscription and SubscriptionSet objects. Add implementation of Subscription and SubscriptionSet objects. Add all necessary operations to add, remove, get subscriptions. feat(listeners): add implementation of event listeners. Add implementation of Event Listeners - user can now bind a delegate to subscription for every event type separately or all of them at once. fix(subscription): clean up properly all C-Core subscriptions after UnsubscribeFromAll.
1 parent 9f37ddb commit 76760b9

36 files changed

+6141
-104
lines changed

.pubnub.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@ schema: 1
33
version: v1.0.0
44
scm: github.com/pubnub/unreal-engine
55
changelog:
6+
- date: 2025-09-11
7+
version: 1.1.0
8+
changes:
9+
- type: feature
10+
text: "Add implementation of Entities: `Channel`, `ChannelGroup`, `ChannelMetadata`, `UserMetadata` with all related PubNub functions."
11+
- type: feature
12+
text: "Add implementation of `Subscription` and `SubscriptionSet` objects. Add all necessary operations to add, remove, get subscriptions."
13+
- type: feature
14+
text: "Add implementation of Event Listeners - user can now bind a delegate to subscription for every event type separately or all of them at once."
15+
- type: bug
16+
text: "Clean up properly all C-Core subscriptions after `UnsubscribeFromAll`."
617
- date: 2025-08-19
718
version: v1.0.0
819
changes:

PubnubLibrary.uplugin

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"FileVersion": 3,
3-
"Version": 11,
4-
"VersionName": "1.0.0",
3+
"Version": 12,
4+
"VersionName": "1.1.0",
55
"FriendlyName": "Pubnub Unreal SDK",
66
"Description": "Quickly add interactive features to your game that scale without building your backend infrastructure.",
77
"Category": "Code",
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright 2025 PubNub Inc. All Rights Reserved.
2+
3+
#include "Entities/PubnubBaseEntity.h"
4+
#include "Entities/PubnubSubscription.h"
5+
#include "PubnubSubsystem.h"
6+
7+
UPubnubSubscription* UPubnubBaseEntity::CreateSubscription(FPubnubSubscribeSettings SubscribeSettings)
8+
{
9+
if (!PubnubSubsystem)
10+
{
11+
UE_LOG(PubnubLog, Error, TEXT("Cannot create subscription - PubnubSubsystem is null. Entity not properly initialized."));
12+
return nullptr;
13+
}
14+
15+
UPubnubSubscription* Subscription = NewObject<UPubnubSubscription>(this);
16+
17+
Subscription->InitSubscription(PubnubSubsystem, this, SubscribeSettings);
18+
19+
return Subscription;
20+
}
21+
22+
void UPubnubBaseEntity::InitEntity(UPubnubSubsystem* InPubnubSubsystem)
23+
{
24+
if(!InPubnubSubsystem)
25+
{
26+
UE_LOG(PubnubLog, Error, TEXT("Init Entity failed, PubnubSubsystem is invalid"));
27+
return;
28+
}
29+
30+
PubnubSubsystem = InPubnubSubsystem;
31+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright 2025 PubNub Inc. All Rights Reserved.
2+
3+
#include "Entities/PubnubChannelEntity.h"
4+
5+
6+
UPubnubChannelEntity::UPubnubChannelEntity()
7+
{
8+
EntityType = EPubnubEntityType::PEnT_Channel;
9+
}
10+
11+
void UPubnubChannelEntity::PublishMessage(FString Message, FOnPublishMessageResponse OnPublishMessageResponse, FPubnubPublishSettings PublishSettings)
12+
{
13+
if (!PubnubSubsystem)
14+
{
15+
UE_LOG(PubnubLog, Error, TEXT("Cannot publish message - PubnubSubsystem is null. Entity not properly initialized."));
16+
return;
17+
}
18+
if (EntityID.IsEmpty())
19+
{
20+
UE_LOG(PubnubLog, Error, TEXT("Cannot publish message - EntityID is empty."));
21+
return;
22+
}
23+
PubnubSubsystem->PublishMessage(EntityID, Message, OnPublishMessageResponse, PublishSettings);
24+
}
25+
26+
void UPubnubChannelEntity::PublishMessage(FString Message, FOnPublishMessageResponseNative NativeCallback, FPubnubPublishSettings PublishSettings)
27+
{
28+
if (!PubnubSubsystem)
29+
{
30+
UE_LOG(PubnubLog, Error, TEXT("Cannot publish message - PubnubSubsystem is null. Entity not properly initialized."));
31+
return;
32+
}
33+
PubnubSubsystem->PublishMessage(EntityID, Message, NativeCallback, PublishSettings);
34+
}
35+
36+
void UPubnubChannelEntity::PublishMessage(FString Message, FPubnubPublishSettings PublishSettings)
37+
{
38+
if (!PubnubSubsystem)
39+
{
40+
UE_LOG(PubnubLog, Error, TEXT("Cannot publish message - PubnubSubsystem is null. Entity not properly initialized."));
41+
return;
42+
}
43+
PubnubSubsystem->PublishMessage(EntityID, Message, PublishSettings);
44+
}
45+
46+
void UPubnubChannelEntity::Signal(FString Message, FOnSignalResponse OnSignalResponse, FPubnubSignalSettings SignalSettings)
47+
{
48+
if (!PubnubSubsystem)
49+
{
50+
UE_LOG(PubnubLog, Error, TEXT("Cannot send signal - PubnubSubsystem is null. Entity not properly initialized."));
51+
return;
52+
}
53+
PubnubSubsystem->Signal(EntityID, Message, OnSignalResponse, SignalSettings);
54+
}
55+
56+
void UPubnubChannelEntity::Signal(FString Message, FOnSignalResponseNative NativeCallback, FPubnubSignalSettings SignalSettings)
57+
{
58+
if (!PubnubSubsystem)
59+
{
60+
UE_LOG(PubnubLog, Error, TEXT("Cannot send signal - PubnubSubsystem is null. Entity not properly initialized."));
61+
return;
62+
}
63+
PubnubSubsystem->Signal(EntityID, Message, NativeCallback, SignalSettings);
64+
}
65+
66+
void UPubnubChannelEntity::Signal(FString Message, FPubnubSignalSettings SignalSettings)
67+
{
68+
if (!PubnubSubsystem)
69+
{
70+
UE_LOG(PubnubLog, Error, TEXT("Cannot send signal - PubnubSubsystem is null. Entity not properly initialized."));
71+
return;
72+
}
73+
PubnubSubsystem->Signal(EntityID, Message, SignalSettings);
74+
}
75+
76+
void UPubnubChannelEntity::ListUsersFromChannel(FOnListUsersFromChannelResponse ListUsersFromChannelResponse, FPubnubListUsersFromChannelSettings ListUsersFromChannelSettings)
77+
{
78+
if (!PubnubSubsystem)
79+
{
80+
UE_LOG(PubnubLog, Error, TEXT("Cannot list users from channel - PubnubSubsystem is null. Entity not properly initialized."));
81+
return;
82+
}
83+
PubnubSubsystem->ListUsersFromChannel(EntityID, ListUsersFromChannelResponse, ListUsersFromChannelSettings);
84+
}
85+
86+
void UPubnubChannelEntity::ListUsersFromChannel(FOnListUsersFromChannelResponseNative NativeCallback, FPubnubListUsersFromChannelSettings ListUsersFromChannelSettings)
87+
{
88+
if (!PubnubSubsystem)
89+
{
90+
UE_LOG(PubnubLog, Error, TEXT("Cannot list users from channel - PubnubSubsystem is null. Entity not properly initialized."));
91+
return;
92+
}
93+
PubnubSubsystem->ListUsersFromChannel(EntityID, NativeCallback, ListUsersFromChannelSettings);
94+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// Copyright 2025 PubNub Inc. All Rights Reserved.
2+
3+
#include "Entities/PubnubChannelGroupEntity.h"
4+
5+
6+
UPubnubChannelGroupEntity::UPubnubChannelGroupEntity()
7+
{
8+
EntityType = EPubnubEntityType::PEnT_ChannelGroup;
9+
}
10+
11+
void UPubnubChannelGroupEntity::AddChannelToGroup(FString Channel, FOnAddChannelToGroupResponse OnAddChannelToGroupResponse)
12+
{
13+
if (!PubnubSubsystem)
14+
{
15+
UE_LOG(PubnubLog, Error, TEXT("Cannot add channel to group - PubnubSubsystem is null. Entity not properly initialized."));
16+
return;
17+
}
18+
PubnubSubsystem->AddChannelToGroup(Channel, EntityID, OnAddChannelToGroupResponse);
19+
}
20+
21+
void UPubnubChannelGroupEntity::AddChannelToGroup(FString Channel, FOnAddChannelToGroupResponseNative NativeCallback)
22+
{
23+
if (!PubnubSubsystem)
24+
{
25+
UE_LOG(PubnubLog, Error, TEXT("Cannot add channel to group - PubnubSubsystem is null. Entity not properly initialized."));
26+
return;
27+
}
28+
PubnubSubsystem->AddChannelToGroup(Channel, EntityID, NativeCallback);
29+
}
30+
31+
void UPubnubChannelGroupEntity::RemoveChannelFromGroup(FString Channel, FOnRemoveChannelFromGroupResponse OnRemoveChannelFromGroupResponse)
32+
{
33+
if (!PubnubSubsystem)
34+
{
35+
UE_LOG(PubnubLog, Error, TEXT("Cannot remove channel from group - PubnubSubsystem is null. Entity not properly initialized."));
36+
return;
37+
}
38+
PubnubSubsystem->RemoveChannelFromGroup(Channel, EntityID, OnRemoveChannelFromGroupResponse);
39+
}
40+
41+
void UPubnubChannelGroupEntity::RemoveChannelFromGroup(FString Channel, FOnRemoveChannelFromGroupResponseNative NativeCallback)
42+
{
43+
if (!PubnubSubsystem)
44+
{
45+
UE_LOG(PubnubLog, Error, TEXT("Cannot remove channel from group - PubnubSubsystem is null. Entity not properly initialized."));
46+
return;
47+
}
48+
PubnubSubsystem->RemoveChannelFromGroup(Channel, EntityID, NativeCallback);
49+
}
50+
51+
void UPubnubChannelGroupEntity::ListChannelsFromGroup(FOnListChannelsFromGroupResponse OnListChannelsResponse)
52+
{
53+
if (!PubnubSubsystem)
54+
{
55+
UE_LOG(PubnubLog, Error, TEXT("Cannot list channels from group - PubnubSubsystem is null. Entity not properly initialized."));
56+
return;
57+
}
58+
PubnubSubsystem->ListChannelsFromGroup(EntityID, OnListChannelsResponse);
59+
}
60+
61+
void UPubnubChannelGroupEntity::ListChannelsFromGroup(FOnListChannelsFromGroupResponseNative NativeCallback)
62+
{
63+
if (!PubnubSubsystem)
64+
{
65+
UE_LOG(PubnubLog, Error, TEXT("Cannot list channels from group - PubnubSubsystem is null. Entity not properly initialized."));
66+
return;
67+
}
68+
PubnubSubsystem->ListChannelsFromGroup(EntityID, NativeCallback);
69+
}
70+
71+
void UPubnubChannelGroupEntity::RemoveChannelGroup(FOnRemoveChannelGroupResponse OnRemoveChannelGroupResponse)
72+
{
73+
if (!PubnubSubsystem)
74+
{
75+
UE_LOG(PubnubLog, Error, TEXT("Cannot remove channel group - PubnubSubsystem is null. Entity not properly initialized."));
76+
return;
77+
}
78+
PubnubSubsystem->RemoveChannelGroup(EntityID, OnRemoveChannelGroupResponse);
79+
}
80+
81+
void UPubnubChannelGroupEntity::RemoveChannelGroup(FOnRemoveChannelGroupResponseNative NativeCallback)
82+
{
83+
if (!PubnubSubsystem)
84+
{
85+
UE_LOG(PubnubLog, Error, TEXT("Cannot remove channel group - PubnubSubsystem is null. Entity not properly initialized."));
86+
return;
87+
}
88+
PubnubSubsystem->RemoveChannelGroup(EntityID, NativeCallback);
89+
}
90+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright 2025 PubNub Inc. All Rights Reserved.
2+
3+
#include "Entities/PubnubChannelMetadataEntity.h"
4+
5+
6+
UPubnubChannelMetadataEntity::UPubnubChannelMetadataEntity()
7+
{
8+
EntityType = EPubnubEntityType::PEnT_ChannelMetadata;
9+
}
10+
11+
void UPubnubChannelMetadataEntity::SetChannelMetadata(FPubnubChannelData ChannelMetadata, FOnSetChannelMetadataResponse OnSetChannelMetadataResponse, FPubnubGetMetadataInclude Include)
12+
{
13+
if (!PubnubSubsystem)
14+
{
15+
UE_LOG(PubnubLog, Error, TEXT("Cannot set channel metadata - PubnubSubsystem is null. Entity not properly initialized."));
16+
return;
17+
}
18+
PubnubSubsystem->SetChannelMetadata(EntityID, ChannelMetadata, OnSetChannelMetadataResponse, Include);
19+
}
20+
21+
void UPubnubChannelMetadataEntity::SetChannelMetadata(FPubnubChannelData ChannelMetadata, FOnSetChannelMetadataResponseNative NativeCallback, FPubnubGetMetadataInclude Include)
22+
{
23+
if (!PubnubSubsystem)
24+
{
25+
UE_LOG(PubnubLog, Error, TEXT("Cannot set channel metadata - PubnubSubsystem is null. Entity not properly initialized."));
26+
return;
27+
}
28+
PubnubSubsystem->SetChannelMetadata(EntityID, ChannelMetadata, NativeCallback, Include);
29+
}
30+
31+
void UPubnubChannelMetadataEntity::GetChannelMetadata(FOnGetChannelMetadataResponse OnGetChannelMetadataResponse, FPubnubGetMetadataInclude Include)
32+
{
33+
if (!PubnubSubsystem)
34+
{
35+
UE_LOG(PubnubLog, Error, TEXT("Cannot get channel metadata - PubnubSubsystem is null. Entity not properly initialized."));
36+
return;
37+
}
38+
PubnubSubsystem->GetChannelMetadata(EntityID, OnGetChannelMetadataResponse, Include);
39+
}
40+
41+
void UPubnubChannelMetadataEntity::GetChannelMetadata(FOnGetChannelMetadataResponseNative NativeCallback, FPubnubGetMetadataInclude Include)
42+
{
43+
if (!PubnubSubsystem)
44+
{
45+
UE_LOG(PubnubLog, Error, TEXT("Cannot get channel metadata - PubnubSubsystem is null. Entity not properly initialized."));
46+
return;
47+
}
48+
PubnubSubsystem->GetChannelMetadata(EntityID, NativeCallback, Include);
49+
}
50+
51+
void UPubnubChannelMetadataEntity::RemoveChannelMetadata(FOnRemoveChannelMetadataResponse OnRemoveChannelMetadataResponse)
52+
{
53+
if (!PubnubSubsystem)
54+
{
55+
UE_LOG(PubnubLog, Error, TEXT("Cannot remove channel metadata - PubnubSubsystem is null. Entity not properly initialized."));
56+
return;
57+
}
58+
PubnubSubsystem->RemoveChannelMetadata(EntityID, OnRemoveChannelMetadataResponse);
59+
}
60+
61+
void UPubnubChannelMetadataEntity::RemoveChannelMetadata(FOnRemoveChannelMetadataResponseNative NativeCallback)
62+
{
63+
if (!PubnubSubsystem)
64+
{
65+
UE_LOG(PubnubLog, Error, TEXT("Cannot remove channel metadata - PubnubSubsystem is null. Entity not properly initialized."));
66+
return;
67+
}
68+
PubnubSubsystem->RemoveChannelMetadata(EntityID, NativeCallback);
69+
}
70+

0 commit comments

Comments
 (0)