Skip to content

Instantly share code, notes, and snippets.

@ericbrunner
Created August 14, 2018 06:02
Show Gist options
  • Save ericbrunner/1b1b75d8593dca416ccfa6a975e26d9f to your computer and use it in GitHub Desktop.
Save ericbrunner/1b1b75d8593dca416ccfa6a975e26d9f to your computer and use it in GitHub Desktop.
TruckerWebAppHub
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