Skip to content

Commit e3e6043

Browse files
mohitpubnubMohit TejaniMohit Tejanipubnub-release-bot
authored
hereNow with limit, offset, deprecated gcm, apns and removed mpns push notification gateway type (#264)
* cleanup GCM as decomissioned by google * deprecation warning for GCM push service type * support for `limit` and `offset` for hereNow API. default limit = 1000, offset = 0 (omitted when not provided explicitly by user) * fix typo in test * HereNowOperation: applied Codacy suggestions * fix: test for channels metadata, limit 100, first page does not contain latest object * remove all reference to `mpns` as push gateway type mpns is not supported and decosmmisioned * Depreaction warning for APNs * revert `nestOffset` calculation in hereNow * fix(test): channel members metadata removal inconsistent, added a small delay. * tests added for duplicate channels in subscribe and presence * revert unnecessary changes made to test project files * updated log level for api execution messages to Trace from Debug. dependency upgrade for test projects * fix: codacy suggestion about curly braces in herenow operation code. * test cleanup for mocked requests * PubNub SDK v8.0.0.0 release. --------- Co-authored-by: Mohit Tejani <[email protected]> Co-authored-by: Mohit Tejani <[email protected]> Co-authored-by: PubNub Release Bot <[email protected]>
1 parent 2c66b2b commit e3e6043

File tree

66 files changed

+1232
-468
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1232
-468
lines changed

.pubnub.yml

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
name: c-sharp
2-
version: "7.5.0"
2+
version: "8.0.0"
33
schema: 1
44
scm: github.com/pubnub/c-sharp
55
changelog:
6+
- date: 2025-10-27
7+
version: v8.0.0
8+
changes:
9+
- type: feature
10+
text: "BREAKING CHANGES: The HereNow method will return a maximum of 1000 occupants per channel. Previously, it was returning all occupants without limit parameter support. Use pagination through offset when more than 1000 occupants present in channel."
11+
- type: bug
12+
text: "Discard use of gcm and replaced with fcm for push notification service type of google. Removed mpns support."
13+
- type: improvement
14+
text: "Added new tests for duplicate subscribe requests."
615
- date: 2025-09-01
716
version: v7.5.0
817
changes:
@@ -943,7 +952,7 @@ features:
943952
- QUERY-PARAM
944953
supported-platforms:
945954
-
946-
version: Pubnub 'C#' 7.5.0
955+
version: Pubnub 'C#' 8.0.0
947956
platforms:
948957
- Windows 10 and up
949958
- Windows Server 2008 and up
@@ -954,7 +963,7 @@ supported-platforms:
954963
- .Net Framework 4.6.1+
955964
- .Net Framework 6.0
956965
-
957-
version: PubnubPCL 'C#' 7.5.0
966+
version: PubnubPCL 'C#' 8.0.0
958967
platforms:
959968
- Xamarin.Android
960969
- Xamarin.iOS
@@ -974,7 +983,7 @@ supported-platforms:
974983
- .Net Core
975984
- .Net 6.0
976985
-
977-
version: PubnubUWP 'C#' 7.5.0
986+
version: PubnubUWP 'C#' 8.0.0
978987
platforms:
979988
- Windows Phone 10
980989
- Universal Windows Apps
@@ -998,7 +1007,7 @@ sdks:
9981007
distribution-type: source
9991008
distribution-repository: GitHub
10001009
package-name: Pubnub
1001-
location: https://github.com/pubnub/c-sharp/releases/tag/v7.5.0.0
1010+
location: https://github.com/pubnub/c-sharp/releases/tag/v8.0.0.0
10021011
requires:
10031012
-
10041013
name: ".Net"
@@ -1281,7 +1290,7 @@ sdks:
12811290
distribution-type: source
12821291
distribution-repository: GitHub
12831292
package-name: PubNubPCL
1284-
location: https://github.com/pubnub/c-sharp/releases/tag/v7.5.0.0
1293+
location: https://github.com/pubnub/c-sharp/releases/tag/v8.0.0.0
12851294
requires:
12861295
-
12871296
name: ".Net Core"
@@ -1640,7 +1649,7 @@ sdks:
16401649
distribution-type: source
16411650
distribution-repository: GitHub
16421651
package-name: PubnubUWP
1643-
location: https://github.com/pubnub/c-sharp/releases/tag/v7.5.0.0
1652+
location: https://github.com/pubnub/c-sharp/releases/tag/v8.0.0.0
16441653
requires:
16451654
-
16461655
name: "Universal Windows Platform Development"

CHANGELOG

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
v8.0.0 - October 27 2025
2+
-----------------------------
3+
- Added: bREAKING CHANGES: The HereNow method will return a maximum of 1000 occupants per channel. Previously, it was returning all occupants without limit parameter support. Use pagination through offset when more than 1000 occupants present in channel.
4+
5+
- Fixed: discard use of gcm and replaced with fcm for push notification service type of google. Removed mpns support.
6+
7+
- Modified: added new tests for duplicate subscribe requests.
8+
19
v7.5.0 - September 01 2025
210
-----------------------------
311
- Fixed: fixed types of Meta and Actions in PNHistoryItemResult to not be objects but properly formatted Dictionaries.

src/Api/PubnubApi/EndPoint/Access/GrantTokenOperation.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ internal void GrantAccess(PNCallback<PNAccessManagerTokenResult> callback)
172172
if (this.grantTTL <= 0) {
173173
throw new MissingMemberException("Invalid TTL value");
174174
}
175-
logger?.Debug($"{GetType().Name} parameter validated.");
175+
logger?.Trace($"{GetType().Name} parameter validated.");
176176
RequestState<PNAccessManagerTokenResult> requestState = new RequestState<PNAccessManagerTokenResult>
177177
{
178178
Channels = pubnubResources.Channels.Keys.ToArray(),
@@ -194,14 +194,14 @@ internal void GrantAccess(PNCallback<PNAccessManagerTokenResult> callback)
194194
if (!string.IsNullOrEmpty(responseString)) {
195195
List<object> result = ProcessJsonResponse(requestState, responseString);
196196
ProcessResponseCallbacks(result, requestState);
197-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
197+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
198198
}
199199
} else {
200200
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message);
201201
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message);
202202
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerGrantToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));
203203
requestState.PubnubCallback.OnResponse(default(PNAccessManagerTokenResult), status);
204-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
204+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
205205
}
206206
});
207207
}
@@ -231,7 +231,7 @@ internal async Task<PNResult<PNAccessManagerTokenResult>> GrantAccess()
231231
if (this.grantTTL <= 0) {
232232
throw new MissingMemberException("Invalid TTL value");
233233
}
234-
logger?.Debug($"{GetType().Name} parameter validated.");
234+
logger?.Trace($"{GetType().Name} parameter validated.");
235235
RequestState<PNAccessManagerTokenResult> requestState = new RequestState<PNAccessManagerTokenResult>();
236236
requestState.Channels = pubnubResources.Channels.Keys.ToArray();
237237
requestState.ChannelGroups = pubnubResources.ChannelGroups.Keys.ToArray();
@@ -274,7 +274,7 @@ internal async Task<PNResult<PNAccessManagerTokenResult>> GrantAccess()
274274
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerGrantToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));
275275
returnValue.Status = status;
276276
}
277-
logger?.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
277+
logger?.Trace($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
278278
return returnValue;
279279
}
280280

src/Api/PubnubApi/EndPoint/Access/RevokeTokenOperation.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ internal void RevokeAccess(PNCallback<PNAccessManagerRevokeTokenResult> callback
6161
throw new MissingMemberException("Invalid secret key");
6262
}
6363

64-
logger?.Debug($"{GetType().Name} parameter validated.");
64+
logger?.Trace($"{GetType().Name} parameter validated.");
6565
RequestState<PNAccessManagerRevokeTokenResult> requestState = new RequestState<PNAccessManagerRevokeTokenResult>
6666
{
6767
ResponseType = PNOperationType.PNAccessManagerRevokeToken,
@@ -80,14 +80,14 @@ internal void RevokeAccess(PNCallback<PNAccessManagerRevokeTokenResult> callback
8080
if (!string.IsNullOrEmpty(responseString)) {
8181
List<object> result = ProcessJsonResponse(requestState, responseString);
8282
ProcessResponseCallbacks(result, requestState);
83-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
83+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
8484
}
8585
} else {
8686
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message);
8787
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message);
8888
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error));
8989
requestState.PubnubCallback.OnResponse(default(PNAccessManagerRevokeTokenResult), status);
90-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
90+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
9191
}
9292
});
9393
}
@@ -97,7 +97,7 @@ internal async Task<PNResult<PNAccessManagerRevokeTokenResult>> RevokeAccess()
9797
if (string.IsNullOrEmpty(config.SecretKey) || string.IsNullOrEmpty(config.SecretKey.Trim()) || config.SecretKey.Length <= 0) {
9898
throw new MissingMemberException("Invalid secret key");
9999
}
100-
logger?.Debug($"{GetType().Name} parameter validated.");
100+
logger?.Trace($"{GetType().Name} parameter validated.");
101101
PNResult<PNAccessManagerRevokeTokenResult> returnValue = new PNResult<PNAccessManagerRevokeTokenResult>();
102102
RequestState<PNAccessManagerRevokeTokenResult> requestState = new RequestState<PNAccessManagerRevokeTokenResult>();
103103
requestState.ResponseType = PNOperationType.PNAccessManagerRevokeToken;
@@ -133,10 +133,10 @@ internal async Task<PNResult<PNAccessManagerRevokeTokenResult>> RevokeAccess()
133133
} else {
134134
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(transportResponse.Error.Message);
135135
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, transportResponse.Error.Message);
136-
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));logger?.Debug($"{GetType().Name} request finished with status code {statusCode}");
136+
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));logger?.Trace($"{GetType().Name} request finished with status code {statusCode}");
137137
returnValue.Status = status;
138138
}
139-
logger?.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
139+
logger?.Trace($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
140140
return returnValue;
141141
}
142142

src/Api/PubnubApi/EndPoint/ChannelGroup/AddChannelsToChannelGroupOperation.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ internal void AddChannelsToChannelGroup(string[] channels, string nameSpace, str
8282
if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) {
8383
throw new ArgumentException("Missing groupName");
8484
}
85-
logger?.Debug($"{GetType().Name} parameter validated.");
85+
logger?.Trace($"{GetType().Name} parameter validated.");
8686
RequestState<PNChannelGroupsAddChannelResult> requestState = new RequestState<PNChannelGroupsAddChannelResult>();
8787
requestState.ResponseType = PNOperationType.PNAddChannelsToGroupOperation;
8888
requestState.Channels = new string[] { };
@@ -101,14 +101,14 @@ internal void AddChannelsToChannelGroup(string[] channels, string nameSpace, str
101101
if (!string.IsNullOrEmpty(responseString)) {
102102
List<object> result = ProcessJsonResponse(requestState, responseString);
103103
ProcessResponseCallbacks(result, requestState);
104-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
104+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
105105
}
106106
} else {
107107
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message);
108108
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message);
109109
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAddChannelsToGroupOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error));
110110
requestState.PubnubCallback.OnResponse(default(PNChannelGroupsAddChannelResult), status);
111-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
111+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
112112
}
113113
});
114114
}
@@ -126,7 +126,7 @@ internal async Task<PNResult<PNChannelGroupsAddChannelResult>> AddChannelsToChan
126126
if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) {
127127
throw new ArgumentException("Missing groupName");
128128
}
129-
logger?.Debug($"{GetType().Name} parameter validated.");
129+
logger?.Trace($"{GetType().Name} parameter validated.");
130130
PNResult<PNChannelGroupsAddChannelResult> returnValue = new PNResult<PNChannelGroupsAddChannelResult>();
131131
RequestState<PNChannelGroupsAddChannelResult> requestState = new RequestState<PNChannelGroupsAddChannelResult>();
132132
requestState.ResponseType = PNOperationType.PNAddChannelsToGroupOperation;
@@ -165,7 +165,7 @@ internal async Task<PNResult<PNChannelGroupsAddChannelResult>> AddChannelsToChan
165165
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNAccessManagerRevokeToken, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));
166166
returnValue.Status = status;
167167
}
168-
logger?.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
168+
logger?.Trace($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
169169
return returnValue;
170170
}
171171

src/Api/PubnubApi/EndPoint/ChannelGroup/DeleteChannelGroupOperation.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ internal void DeleteChannelGroup(string groupName, Dictionary<string, object> ex
6666
if (string.IsNullOrEmpty(groupName) || groupName.Trim().Length == 0) {
6767
throw new ArgumentException("Missing groupName");
6868
}
69-
logger?.Debug($"{GetType().Name} parameter validated.");
69+
logger?.Trace($"{GetType().Name} parameter validated.");
7070
RequestState<PNChannelGroupsDeleteGroupResult> requestState = new RequestState<PNChannelGroupsDeleteGroupResult>();
7171
requestState.ResponseType = PNOperationType.PNRemoveGroupOperation;
7272
requestState.Channels = new string[] { };
@@ -85,14 +85,14 @@ internal void DeleteChannelGroup(string groupName, Dictionary<string, object> ex
8585
if (!string.IsNullOrEmpty(responseString)) {
8686
List<object> result = ProcessJsonResponse(requestState, responseString);
8787
ProcessResponseCallbacks(result, requestState);
88-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
88+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
8989
}
9090
} else {
9191
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message);
9292
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message);
9393
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveGroupOperation, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error));
9494
requestState.PubnubCallback.OnResponse(default(PNChannelGroupsDeleteGroupResult), status);
95-
logger?.Info($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
95+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
9696
}
9797
});
9898
}
@@ -103,7 +103,7 @@ internal async Task<PNResult<PNChannelGroupsDeleteGroupResult>> DeleteChannelGro
103103
throw new ArgumentException("Missing groupName");
104104
}
105105

106-
logger?.Debug($"{GetType().Name} parameter validated.");
106+
logger?.Trace($"{GetType().Name} parameter validated.");
107107
PNResult<PNChannelGroupsDeleteGroupResult> returnValue = new PNResult<PNChannelGroupsDeleteGroupResult>();
108108
RequestState<PNChannelGroupsDeleteGroupResult> requestState = new RequestState<PNChannelGroupsDeleteGroupResult>();
109109
requestState.ResponseType = PNOperationType.PNRemoveGroupOperation;
@@ -142,7 +142,7 @@ internal async Task<PNResult<PNChannelGroupsDeleteGroupResult>> DeleteChannelGro
142142
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.PNRemoveGroupOperation, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));
143143
returnValue.Status = status;
144144
}
145-
logger?.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
145+
logger?.Trace($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
146146
return returnValue;
147147
}
148148

src/Api/PubnubApi/EndPoint/ChannelGroup/ListAllChannelGroupOperation.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,15 @@ internal void GetAllChannelGroup(Dictionary<string, object> externalQueryParam,
7474
requestState.GotJsonResponse = true;
7575
if (!string.IsNullOrEmpty(responseString)) {
7676
List<object> result = ProcessJsonResponse(requestState, responseString);
77-
logger?.Debug($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
77+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
7878
ProcessResponseCallbacks(result, requestState);
7979
}
8080
} else {
8181
int statusCode = PNStatusCodeHelper.GetHttpStatusCode(t.Result.Error.Message);
8282
PNStatusCategory category = PNStatusCategoryHelper.GetPNStatusCategory(statusCode, t.Result.Error.Message);
8383
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.ChannelGroupAllGet, category, requestState, statusCode, new PNException(t.Result.Error.Message, t.Result.Error));
8484
requestState.PubnubCallback.OnResponse(default(PNChannelGroupsListAllResult), status);
85-
logger?.Debug($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
85+
logger?.Trace($"{GetType().Name} request finished with status code {requestState.Response?.StatusCode}");
8686
}
8787
});
8888
}
@@ -128,7 +128,7 @@ internal async Task<PNResult<PNChannelGroupsListAllResult>> GetAllChannelGroup(D
128128
PNStatus status = new StatusBuilder(config, jsonLibrary).CreateStatusResponse(PNOperationType.ChannelGroupAllGet, category, requestState, statusCode, new PNException(transportResponse.Error.Message, transportResponse.Error));
129129
returnValue.Status = status;
130130
}
131-
logger?.Info($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
131+
logger?.Trace($"{GetType().Name} request finished with status code {returnValue.Status.StatusCode}");
132132
return returnValue;
133133
}
134134

0 commit comments

Comments
 (0)