134 lines
4.9 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Dto.Messages;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection;
namespace gehGassi.Web.Hubs
{
/// <summary>
/// Service der den Versand von SignalR-Nachrichten
/// vom Server an die App ermöglicht.
/// </summary>
public class AppHubSender : IAppHubSender
{
private readonly IHubContext<AppHub> _appHub;
private readonly IAppHubUsers _appHubUsers;
/// <summary>
/// Erstellt eine Instanz
/// </summary>
/// <param name="appHub">Instanz eines IAppHub</param>
/// <param name="appHubUsers">Instanz eines IAppHubUsers </param>
public AppHubSender(IHubContext<AppHub> appHub, IAppHubUsers appHubUsers)
{
_appHub = appHub;
_appHubUsers = appHubUsers;
}
/// <summary>
/// Senden eine Nachricht an einen Benutzer
/// </summary>
/// <param name="user">Benutzer - email</param>
/// <param name="message">Nachricht</param>
/// <returns>Task</returns>
public async Task MessageForUser(string user, string message)
{
var connectionIds = _appHubUsers.ConnectedUsers[user];
if (connectionIds != null && connectionIds.Any())
{
await _appHub.Clients.Clients(connectionIds).SendAsync("MessageForUser", message);
}
}
/// <summary>
/// Event wenn sich die Daten eines App-Users geändert haben
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="ignoreUsers">Liste Benutzer die ignoriert werden soll</param>
/// <returns>Task</returns>
public async Task AppUserChangedAsync(string appUserId, List<string> ignoreUsers = null)
{
var ignoreList = GetIgnoreList(ignoreUsers);
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("AppUserChanged");
}
/// <summary>
/// Gibt zurück ob ein Benutzer verbunden ist
/// </summary>
/// <param name="userName">Benutzername</param>
/// <returns>true wenn verbunden, false sonst</returns>
public async Task<bool> IsUserConnectedAsync(string userName)
{
await Task.Delay(1);
var connected = _appHubUsers.ConnectedUsers.ContainsKey(userName);
return connected;
}
/// <summary>
/// Event wenn sich ein Benutzer ausloggen soll
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns></returns>
public async Task LogoutAsync(string appUserId)
{
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("Logout");
}
/// <summary>
/// Event wenn eine Nachricht für einen Benutzer angekommen ist
/// </summary>
/// <param name="appUserId"></param>
/// <returns></returns>
public async Task MessageAddedAsync(string appUserId)
{
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("MessageAdded");
}
/// <summary>
/// Event wenn eine Nachricht für einen Benutzer angekommen ist
/// </summary>
/// <param name="appUserId"></param>
/// <returns></returns>
public async Task SystemMessageAddedAsync(string appUserId)
{
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("SystemMessageAdded");
}
/// <summary>
/// Event wenn sich NewsKategorien geändert haben
/// </summary>
/// <param name="ignoreUsers">Liste Benutzer die ignoriert werden soll</param>
/// <returns></returns>
public async Task NewsCategoriesChangedAsync(List<string> ignoreUsers = null)
{
var ignoreList = GetIgnoreList(ignoreUsers);
await _appHub.Clients.AllExcept(ignoreList).SendAsync("NewsCategoriesChanged");
}
#region Helper
/// <summary>
/// Holen der Connection-IDS für Benutzer die Ignoriert werden sollen
/// </summary>
/// <param name="ignoreUsers">Liste Benutzernamen die ignoriert werden sollen</param>
/// <returns>Liste connectionIds die ignoriert werden sollen</returns>
private List<string> GetIgnoreList(List<string> ignoreUsers)
{
var ignoreList = new List<string>();
if (ignoreUsers == null || !ignoreUsers.Any()) return ignoreList;
foreach (var ignoreUser in ignoreUsers.Where(ignoreUser => _appHubUsers.ConnectedUsers.ContainsKey(ignoreUser)))
{
ignoreList.AddRange(_appHubUsers.ConnectedUsers[ignoreUser]);
}
return ignoreList;
}
#endregion
}
}