mirror of
https://github.com/Stone-Red-Software/StoneRed.NetificationApi.git
synced 2026-09-04 16:56:05 +02:00
Add RequestUnreadCount and ClearUnread methods to client
This commit is contained in:
@@ -4,18 +4,26 @@ using StoneRed.NetificationApi.Server;
|
||||
using StoneRed.NetificationApi.Server.IdentifyUser;
|
||||
using StoneRed.NetificationApi.Server.Send;
|
||||
|
||||
const string userId = "<UserId>";
|
||||
const string notificationId = "<NotifcationId>";
|
||||
const string clientId = "<ClientId>";
|
||||
const string clientSecret = "<ClientSecret>";
|
||||
// The ID of the user to send the notification to
|
||||
string userId = "test";
|
||||
|
||||
// The ID of the notification to send
|
||||
string notificationId = "test";
|
||||
|
||||
// The client ID and secret to use for the API
|
||||
string clientId = Environment.GetEnvironmentVariable("NOTIFICATION_API_CLIENT_ID", EnvironmentVariableTarget.User) ?? "<ClientId>";
|
||||
string clientSecret = Environment.GetEnvironmentVariable("NOTIFICATION_API_SECRET", EnvironmentVariableTarget.User) ?? "<ClientSecret>";
|
||||
|
||||
// The client is used to receive notifications
|
||||
NotificationApiClient notificationApiClient = new NotificationApiClient(userId, clientId);
|
||||
|
||||
// The server is used to send notifications
|
||||
NotificationApiServer notificationApiServer = new NotificationApiServer(clientId, clientSecret, false);
|
||||
|
||||
Console.WriteLine("Start client");
|
||||
NotificationApiClient notificationApiClient = new NotificationApiClient("test", clientId, clientSecret, false);
|
||||
await notificationApiClient.Start();
|
||||
Console.WriteLine("Client started");
|
||||
|
||||
notificationApiClient.RequestNotifications();
|
||||
|
||||
notificationApiClient.RequestedNotificationsReceived += (sender, args) =>
|
||||
{
|
||||
Console.WriteLine("Requested notifications received");
|
||||
@@ -34,13 +42,23 @@ notificationApiClient.NewNotificationsReceived += (sender, args) =>
|
||||
}
|
||||
};
|
||||
|
||||
NotificationApiServer notificationApiServer = new NotificationApiServer(clientId, clientSecret, false);
|
||||
notificationApiClient.UnreadCountReceived += (sender, args) =>
|
||||
{
|
||||
Console.WriteLine($"Unread count received: {args.Count}");
|
||||
};
|
||||
|
||||
Console.WriteLine("Request unread count");
|
||||
notificationApiClient.RequestUnreadCount();
|
||||
Console.WriteLine("Unread count requested");
|
||||
|
||||
Console.WriteLine("Request notifications");
|
||||
notificationApiClient.RequestNotifications(5);
|
||||
Console.WriteLine("Notifications requested");
|
||||
|
||||
Console.WriteLine("Identify user");
|
||||
await notificationApiServer.Identify(new IdentifyUserData
|
||||
{
|
||||
UserId = userId,
|
||||
Email = "[email protected]"
|
||||
UserId = userId
|
||||
});
|
||||
Console.WriteLine("User identified");
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace StoneRed.NetificationApi.Client.Models;
|
||||
|
||||
public class CountReceivedEventArgs(int count) : EventArgs
|
||||
{
|
||||
public int Count { get; } = count;
|
||||
}
|
||||
@@ -19,9 +19,11 @@ public class NotificationApiClient
|
||||
|
||||
public event EventHandler<NotificationsReceivedEventArgs>? NewNotificationsReceived;
|
||||
|
||||
public event EventHandler<CountReceivedEventArgs>? UnreadCountReceived;
|
||||
|
||||
private readonly WebsocketClient client;
|
||||
|
||||
public NotificationApiClient(string userId, string clientId, string clientSecret, bool secureMode, string baseAddress = "wss://ws.notificationapi.com")
|
||||
public NotificationApiClient(string userId, string clientId, string? userIdHash = null, string baseAddress = "wss://ws.notificationapi.com")
|
||||
{
|
||||
UriBuilder uriBuilder = new UriBuilder(baseAddress);
|
||||
|
||||
@@ -29,9 +31,9 @@ public class NotificationApiClient
|
||||
query["envId"] = clientId;
|
||||
query["userId"] = userId;
|
||||
|
||||
if (secureMode)
|
||||
if (userIdHash is not null)
|
||||
{
|
||||
query["userIdHash"] = UserIdHasher.Hash(userId, clientSecret);
|
||||
query["userIdHash"] = userIdHash;
|
||||
}
|
||||
|
||||
uriBuilder.Query = query.ToString();
|
||||
@@ -46,7 +48,7 @@ public class NotificationApiClient
|
||||
_ = client.MessageReceived
|
||||
.Where(msg => msg.Text is not null)
|
||||
.Where(msg => WebsocketMessageComparer.Compare(msg.Text, "inapp_web/notifications"))
|
||||
.Select(msg => WebsocketMessageConverter.ConvertWebsocketMessage<NotificationsReceivedPayload>(msg.Text!))
|
||||
.Select(msg => WebsocketMessageConverter.ConvertWebsocketMessage<NotificationsPayload>(msg.Text!))
|
||||
.Subscribe(msg =>
|
||||
{
|
||||
if (msg.Payload is null)
|
||||
@@ -60,7 +62,7 @@ public class NotificationApiClient
|
||||
_ = client.MessageReceived
|
||||
.Where(msg => msg.Text is not null)
|
||||
.Where(msg => WebsocketMessageComparer.Compare(msg.Text, "inapp_web/new_notifications"))
|
||||
.Select(msg => WebsocketMessageConverter.ConvertWebsocketMessage<NotificationsReceivedPayload>(msg.Text!))
|
||||
.Select(msg => WebsocketMessageConverter.ConvertWebsocketMessage<NotificationsPayload>(msg.Text!))
|
||||
.Subscribe(msg =>
|
||||
{
|
||||
if (msg.Payload is null)
|
||||
@@ -70,6 +72,20 @@ public class NotificationApiClient
|
||||
|
||||
NewNotificationsReceived?.Invoke(this, new NotificationsReceivedEventArgs(msg.Payload.Notifications));
|
||||
});
|
||||
|
||||
_ = client.MessageReceived
|
||||
.Where(msg => msg.Text is not null)
|
||||
.Where(msg => WebsocketMessageComparer.Compare(msg.Text, "inapp_web/unread_count"))
|
||||
.Select(msg => WebsocketMessageConverter.ConvertWebsocketMessage<CountPayload>(msg.Text!))
|
||||
.Subscribe(msg =>
|
||||
{
|
||||
if (msg.Payload is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
UnreadCountReceived?.Invoke(this, new CountReceivedEventArgs(msg.Payload.Count));
|
||||
});
|
||||
}
|
||||
|
||||
public Task Start()
|
||||
@@ -77,13 +93,37 @@ public class NotificationApiClient
|
||||
return client.StartOrFail();
|
||||
}
|
||||
|
||||
public bool RequestNotifications()
|
||||
public bool RequestNotifications(int count)
|
||||
{
|
||||
WebsocketMessage<object> message = new("inapp_web/notifications")
|
||||
WebsocketMessage<CountPayload> message = new("inapp_web/notifications")
|
||||
{
|
||||
Payload = new(count)
|
||||
};
|
||||
|
||||
return client.Send(JsonSerializer.Serialize(message, Configuration.JsonSerializerOptions));
|
||||
}
|
||||
|
||||
public bool RequestUnreadCount()
|
||||
{
|
||||
WebsocketMessage message = new("inapp_web/unread_count");
|
||||
|
||||
return client.Send(JsonSerializer.Serialize(message, Configuration.JsonSerializerOptions));
|
||||
}
|
||||
|
||||
public bool ClearUnread()
|
||||
{
|
||||
WebsocketMessage message = new("inapp_web/unread_clear");
|
||||
|
||||
return client.Send(JsonSerializer.Serialize(message, Configuration.JsonSerializerOptions));
|
||||
}
|
||||
|
||||
public bool ClearUnread(string notificationId)
|
||||
{
|
||||
WebsocketMessage<object> message = new("inapp_web/unread_clear")
|
||||
{
|
||||
Payload = new
|
||||
{
|
||||
count = 50
|
||||
notificationId
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace StoneRed.NetificationApi.Client.Payloads;
|
||||
|
||||
internal class CountPayload(int count)
|
||||
{
|
||||
public int Count { get; set; } = count;
|
||||
}
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace StoneRed.NetificationApi.Client.Payloads;
|
||||
|
||||
internal class NotificationsReceivedPayload
|
||||
internal class NotificationsPayload
|
||||
{
|
||||
public required List<NotificationReceivedData> Notifications { get; set; }
|
||||
}
|
||||
@@ -3,7 +3,7 @@ using System.Text;
|
||||
|
||||
namespace StoneRed.NetificationApi.Utilities;
|
||||
|
||||
internal static class UserIdHasher
|
||||
public static class UserIdHasher
|
||||
{
|
||||
public static string Hash(string userId, string clientSecret)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user