Skip to content

Implement MembershipData in method arguments and overloads #15

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .pubnub.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
---
version: v0.4.3
version: v0.4.4
changelog:
- date: 2025-05-12
version: v0.4.4
changes:
- type: feature
text: "Added the ChatMembershipData which replaces the customDataJson argument in membership-related methods."
- date: 2025-04-02
version: v0.4.3
changes:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,17 +56,24 @@ public async Task TestUpdateMemberships()
return;
}

var updateData = new ChatMembershipData()
{
CustomDataJson = "{\"key\":\"" + Guid.NewGuid() + "\"}"
};

var manualUpdatedEvent = new ManualResetEvent(false);
testMembership.OnMembershipUpdated += membership =>
{
Assert.True(membership.Id == testMembership.Id);
var updatedData = membership.MembershipData.CustomDataJson;
Assert.True(updatedData == updateData.CustomDataJson, $"{updatedData} != {updateData.CustomDataJson}");
manualUpdatedEvent.Set();
};
testMembership.SetListeningForUpdates(true);

await Task.Delay(4000);

await testMembership.Update("{\"key\": \"" + Guid.NewGuid() + "\"}");
await testMembership.Update(updateData);
var updated = manualUpdatedEvent.WaitOne(8000);
Assert.IsTrue(updated);
}
Expand Down
39 changes: 31 additions & 8 deletions c-sharp-chat/PubnubChatApi/PubnubChatApi/Entities/Channel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ private static extern int pn_channel_get_users_restrictions(IntPtr channel, stri

[DllImport("pubnub-chat")]
private static extern IntPtr pn_channel_stream_message_reports(IntPtr channel);

[DllImport("pubnub-chat")]
private static extern IntPtr pn_channel_stream_updates(IntPtr channel);

Expand All @@ -162,6 +162,14 @@ private static extern int pn_channel_get_users_restrictions(IntPtr channel, stri
[DllImport("pubnub-chat")]
private static extern IntPtr pn_channel_stream_presence(IntPtr channel);

[DllImport("pubnub-chat")]
private static extern IntPtr pn_channel_join_with_membership_data(
IntPtr channel,
string membership_custom_json,
string membership_type,
string membership_status
);

#endregion

/// <summary>
Expand Down Expand Up @@ -367,7 +375,7 @@ public async void SetListeningForReportEvents(bool listen)
reportEventsListeningHandle = await SetListening(reportEventsListeningHandle, listen,
() => pn_channel_stream_message_reports(pointer));
}

internal void BroadcastReportEvent(ChatEvent chatEvent)
{
OnReportEvent?.Invoke(chatEvent);
Expand All @@ -378,13 +386,13 @@ public async void SetListeningForReadReceiptsEvents(bool listen)
readReceiptsListeningHandle = await SetListening(readReceiptsListeningHandle, listen,
() => pn_channel_stream_read_receipts(pointer));
}

public async void SetListeningForTyping(bool listen)
{
typingListeningHandle = await SetListening(typingListeningHandle, listen,
() => pn_channel_get_typing(pointer));
}

public async void SetListeningForPresence(bool listen)
{
presenceListeningHandle = await SetListening(presenceListeningHandle, listen,
Expand Down Expand Up @@ -437,7 +445,8 @@ internal void TryParseAndBroadcastTypingEvent(List<string> userIds)
{
indicator.Stop();
typingIndicators.Remove(key);
indicator.Dispose();;
indicator.Dispose();
;
}
}

Expand Down Expand Up @@ -600,10 +609,10 @@ public async void Connect()
{
return;
}

connectionHandle = await SetListening(connectionHandle, true, () => pn_channel_connect(pointer));
}

// TODO: Shouldn't join have additional parameters?
/// <summary>
/// Joins the channel.
/// <para>
Expand All @@ -626,13 +635,24 @@ public async void Connect()
/// <seealso cref="OnMessageReceived"/>
/// <seealso cref="Connect"/>
/// <seealso cref="Disconnect"/>
public async void Join()
public async void Join(ChatMembershipData? membershipData = null)
{
if (connectionHandle != IntPtr.Zero)
{
return;
}
connectionHandle = await SetListening(connectionHandle, true, () => pn_channel_join(pointer, string.Empty));

if (membershipData == null)
{
connectionHandle =
await SetListening(connectionHandle, true, () => pn_channel_join(pointer, string.Empty));
}
else
{
connectionHandle = await SetListening(connectionHandle, true,
() => pn_channel_join_with_membership_data(pointer, membershipData.CustomDataJson,
membershipData.Type, membershipData.Status));
}
}

/// <summary>
Expand All @@ -659,6 +679,7 @@ public void Disconnect()
{
return;
}

CUtilities.CheckCFunctionResult(pn_channel_disconnect(pointer));
pn_callback_handle_dispose(connectionHandle);
connectionHandle = IntPtr.Zero;
Expand Down Expand Up @@ -690,6 +711,7 @@ public async void Leave()
{
return;
}

var connectionHandleCopy = connectionHandle;
connectionHandle = IntPtr.Zero;
CUtilities.CheckCFunctionResult(await Task.Run(() =>
Expand All @@ -698,6 +720,7 @@ public async void Leave()
{
return 0;
}

pn_channel_leave(pointer);
pn_callback_handle_dispose(connectionHandleCopy);
return 0;
Expand Down
Loading