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 { /// /// Service der den Versand von SignalR-Nachrichten /// vom Server an die App ermöglicht. /// public class AppHubSender : IAppHubSender { private readonly IHubContext _appHub; private readonly IAppHubUsers _appHubUsers; /// /// Erstellt eine Instanz /// /// Instanz eines IAppHub /// Instanz eines IAppHubUsers public AppHubSender(IHubContext appHub, IAppHubUsers appHubUsers) { _appHub = appHub; _appHubUsers = appHubUsers; } /// /// Senden eine Nachricht an einen Benutzer /// /// Benutzer - email /// Nachricht /// Task 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); } } /// /// Event wenn sich die Daten eines App-Users geändert haben /// /// Id des App-Users /// Liste Benutzer die ignoriert werden soll /// Task public async Task AppUserChangedAsync(string appUserId, List ignoreUsers = null) { var ignoreList = GetIgnoreList(ignoreUsers); await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("AppUserChanged"); } /// /// Gibt zurück ob ein Benutzer verbunden ist /// /// Benutzername /// true wenn verbunden, false sonst public async Task IsUserConnectedAsync(string userName) { await Task.Delay(1); var connected = _appHubUsers.ConnectedUsers.ContainsKey(userName); return connected; } /// /// Event wenn sich ein Benutzer ausloggen soll /// /// Id des App-Users /// public async Task LogoutAsync(string appUserId) { await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("Logout"); } /// /// Event wenn eine Nachricht für einen Benutzer angekommen ist /// /// /// public async Task MessageAddedAsync(string appUserId) { await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("MessageAdded"); } /// /// Event wenn eine Nachricht für einen Benutzer angekommen ist /// /// /// public async Task SystemMessageAddedAsync(string appUserId) { await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("SystemMessageAdded"); } /// /// Event wenn sich NewsKategorien geändert haben /// /// Liste Benutzer die ignoriert werden soll /// public async Task NewsCategoriesChangedAsync(List ignoreUsers = null) { var ignoreList = GetIgnoreList(ignoreUsers); await _appHub.Clients.AllExcept(ignoreList).SendAsync("NewsCategoriesChanged"); } #region Helper /// /// Holen der Connection-IDS für Benutzer die Ignoriert werden sollen /// /// Liste Benutzernamen die ignoriert werden sollen /// Liste connectionIds die ignoriert werden sollen private List GetIgnoreList(List ignoreUsers) { var ignoreList = new List(); 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 } }