134 lines
4.9 KiB
C#
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
|
|
}
|
|
}
|