Created
August 14, 2018 06:02
-
-
Save ericbrunner/1b1b75d8593dca416ccfa6a975e26d9f to your computer and use it in GitHub Desktop.
TruckerWebAppHub
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using Microsoft.AspNetCore.SignalR; | |
using Newtonsoft.Json; | |
using TruckerWebApp.RestApi.Manager; | |
namespace TruckerWebApp.RestApi.Hub | |
{ | |
public class TruckerWebAppHub : Microsoft.AspNetCore.SignalR.Hub | |
{ | |
private readonly MetricsManagerHelper _metricsManagerHelper; | |
private static readonly List<HubUser> HubUsers; | |
private const string SystemName = "_TRUCKERAPP_SYSTEM_"; | |
static TruckerWebAppHub() | |
{ | |
HubUsers = new List<HubUser>(); | |
} | |
public TruckerWebAppHub(MetricsManagerHelper metricsManagerHelper) | |
{ | |
_metricsManagerHelper = metricsManagerHelper; | |
} | |
public void Join(int truckerWebAppId, string name) | |
{ | |
try | |
{ | |
string connectionId = Context.ConnectionId; | |
HubUser currentHubUser = HubUsers.FirstOrDefault(user => user.UserId == truckerWebAppId); | |
if (currentHubUser == null) | |
{ | |
// add new Hub User | |
currentHubUser = new HubUser | |
{ | |
UserId = truckerWebAppId, | |
Name = name | |
}; | |
currentHubUser.ConnectionIds.Add(connectionId); | |
HubUsers.Add(currentHubUser); | |
IDictionary<string, string> properties = new Dictionary<string, string> | |
{ | |
{"User", JsonConvert.SerializeObject(currentHubUser)} | |
}; | |
_metricsManagerHelper.TrackEvent("SignalR-User-Joined", properties); | |
} | |
else | |
{ | |
// update existing Hub User with the newly added connectionid. A user can be logged in in | |
// several browsers or SignalR clients. So the truckerWebAppId is either the AuftraggeberId (AG) | |
// or the LieferantId (SUB) and that truckerWebAppId has a 1:many relationship to the ConnectionId(s). | |
currentHubUser.ConnectionIds.Add(connectionId); | |
IDictionary<string, string> properties = new Dictionary<string, string> | |
{ | |
{"User", JsonConvert.SerializeObject(currentHubUser)} | |
}; | |
_metricsManagerHelper.TrackEvent("SignalR-User-Updated", properties); | |
} | |
} | |
catch (Exception e) | |
{ | |
_metricsManagerHelper.TrackException(e); | |
} | |
} | |
public void Leave(int truckerWebAppId, string name) | |
{ | |
try | |
{ | |
HubUser removableHubUser = HubUsers.FirstOrDefault(user => user.UserId == truckerWebAppId); | |
if (removableHubUser == null) | |
return; | |
HubUsers.Remove(removableHubUser); | |
IDictionary<string, string> properties = new Dictionary<string, string> | |
{ | |
{" User", JsonConvert.SerializeObject(removableHubUser)} | |
}; | |
_metricsManagerHelper.TrackEvent("SignalR-User-Left", properties); | |
} | |
catch (Exception e) | |
{ | |
_metricsManagerHelper.TrackException(e); | |
} | |
} | |
public void SendDirectMessage(int senderId, int receiverId, string message) | |
{ | |
try | |
{ | |
HubUser receiver = HubUsers.FirstOrDefault(user => user.UserId == receiverId); | |
HubUser sender = HubUsers.FirstOrDefault(user => user.UserId == senderId); | |
string senderName = sender?.Name ?? SystemName; | |
if (receiver != null) | |
{ | |
foreach (string receiverConnectionId in receiver.ConnectionIds) | |
{ | |
Clients.Client(receiverConnectionId).SendAsync("broadcastMessage", senderName, message); | |
IDictionary<string, string> properties = new Dictionary<string, string> | |
{ | |
{"sender", senderId.ToString()}, | |
{"receiverId", receiverId.ToString()}, | |
{"connectionId", receiverConnectionId}, | |
{"client-method", "broadcastMessage"}, | |
{"message", message} | |
}; | |
_metricsManagerHelper.TrackEvent("SignalR-Message-Sent", properties); | |
} | |
} | |
else | |
{ | |
// No receiver joined with that Id. | |
Clients.Client(Context.ConnectionId).SendAsync("broadcastMessage", SystemName, $"No Receiver registered with Id={receiverId}"); | |
IDictionary<string, string> properties = new Dictionary<string, string> | |
{ | |
{"sender", senderId.ToString()}, | |
{"receiver", receiverId.ToString()}, | |
{"client-method", "broadcastMessage"}, | |
{"message", $"No Receiver registered with Id={receiverId}"} | |
}; | |
_metricsManagerHelper.TrackEvent("SignalR-Message-No-Receiver", properties); | |
} | |
} | |
catch (Exception e) | |
{ | |
_metricsManagerHelper.TrackException(e); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment