From 1260a4cb8b8bcc5efecff778f8f83de3d11e52f0 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 15 Jun 2021 22:15:05 +0200 Subject: [PATCH] Create NotificationService.cs --- .../Services/NotificationService.cs | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 ReallifeGamemode.Server/Services/NotificationService.cs diff --git a/ReallifeGamemode.Server/Services/NotificationService.cs b/ReallifeGamemode.Server/Services/NotificationService.cs new file mode 100644 index 00000000..05ca5f6a --- /dev/null +++ b/ReallifeGamemode.Server/Services/NotificationService.cs @@ -0,0 +1,152 @@ +/** + * @overview Benachrichtigungen (NotificationService.cs) + * @author Luke, hydrant, xSprite + * @copyright Life of German + */ + +using GTANetworkAPI; +using System.Collections.Generic; +using System.Linq; +using ReallifeGamemode.Database.Entities; +using ReallifeGamemode.Database.Models; +using ReallifeGamemode.Server.Extensions; +using ReallifeGamemode.Server.Job; +using ReallifeGamemode.Server.Types; + +namespace ReallifeGamemode.Server.Services +{ + internal class NotificationService + { + /// + /// Sendet eine Benachrichtigung an einen bestimmten Spieler + /// + /// Der Spieler, der die Benachrichtigung erhalten soll + /// Die Nachricht, die dem Spieler als Benachrichtigung zugestellt werden soll + public static void SendNotification(Player player, string message) + { + if (player == null || !player.IsLoggedIn()) + { + return; + } + + player.SendNotification(message); + } + + /// + /// Sendet eine Fehlermeldung als Benachrichtigung an einen bestimmten Spieler + /// + /// Der Spieler, der die Benachrichtigung erhalten soll + /// Die Nachricht, die dem Spieler als Benachrichtigung zugestellt werden soll + public static void SendErrorNotification(Player player, string message) + { + if (message.EndsWith(".")) + { + message.Substring(0, message.Length - 1); + } + + SendNotification(player, $"~r~Fehler:~n~~s~{message}"); + } + + /// + /// Sendet eine Benachrichtigung an alle Spieler + /// + /// Die Nachricht, die dem Spieler als Benachrichtigung zugestellt werden soll + public static void SendServerNotification(string message) => NAPI.Pools.GetAllPlayers().ForEach(player => SendNotification(player, message)); + + /// + /// Sendet eine Benachrichtigung an die Mitglieder einer Fraktion + /// + /// Die Fraktion, deren Mitglieder diese Benachrichtigung erhalten soll + /// Die Nachricht, die den Mitgliedern als Benachrichtigung zugestellt werden soll + public static void SendFactionNotification(Faction faction, string message) => SendFactionNotification(new List() { faction }, message); + + /// + /// Sendet eine Benachrichtigung an die Mitglieder mehrerer Fraktionen + /// + /// Die Liste an Fraktionen, deren Mitglieder diese Benachrichtigung erhalten sollen + /// Die Nachricht, die den Mitgliedern als Benachrichtigung zugestellt werden soll + public static void SendFactionNotification(List factions, string message) + { + foreach (Player player in NAPI.Pools.GetAllPlayers()) + { + User user = player.GetUser(); + Faction userFaction = user.Faction; + + if (userFaction != null && factions.Find(faction => faction.Id == userFaction.Id) != null) + { + SendNotification(player, message); + } + } + } + + /// + /// Sendet eine Nachricht an die Mitglieder der Strafverfolgungsbehörden + /// + /// Die Nachricht, die den Beamten als Benachrichtigung zugestellt werden soll + public static void SendPolicingNotification(string message) => SendFactionNotificationByFactionIds(new List() { 1, 3 }, $"!{{#8181E9}}HQ-Meldung:~n~~s~{message}"); + + /// + /// Sendet eine Benachrichtigung an alle Spieler mit einem bestimmten Admin-Level + /// + /// Das Admin-Level, dass für den Erhalt dieser Benachrichtigung erforderlich ist + /// Die Nachricht, die den Spielern als Benachrichtigung zugestellt werden soll + public static void SendAdminLevelNotification(AdminLevel minLevel, string message) + { + NAPI.Pools.GetAllPlayers() + .Where(player => player.IsLoggedIn()) + .Where(player => player.GetUser().IsAdmin(minLevel)).ToList() + .ForEach(player => SendNotification(player, message)); + } + + /// + /// Sendet eine Benachrichtigung an alle Spieler, die sich im T-Support befinden + /// + /// Die Nachricht, die den Spielern als Benachrichtigung zugestellt werden soll + public static void SendDutyTeamMemberNotification(string message) + { + NAPI.Pools.GetAllPlayers() + .Where(player => player.IsAdminDuty()).ToList() + .ForEach(player => SendNotification(player, message)); + } + + /// + /// Sendet eine Benachrichtigung an Spieler, die sich in der Nähe eines Punktes befinden + /// + /// Position, von der die Distanz ermittelt wird + /// Distanz, bis zu welcher Spieler benachrichtigt werden + /// Die Nachricht, die dem Spieler als Benachrichtigung zugestellt werden soll + internal static void SendRangeNotification(Vector3 position, int range, string message) + { + NAPI.Pools.GetAllPlayers() + .Where(player => player.Position.DistanceTo(position) <= range).ToList() + .ForEach(player => SendNotification(player, message)); + } + + /// + /// Sendet eine Benachrichtigung an die Mitglieder einer Gruppe + /// + /// Die Gruppe, deren Mitglieder diese Benachrichtigung erhalten soll + /// Die Nachricht, die den Mitgliedern als Benachrichtigung zugestellt werden soll + public static void SendGroupNotification(Group group, string message) + { + NAPI.Pools.GetAllPlayers() + .Where(player => player.GetUser().Group.Id == group.Id).ToList() + .ForEach(player => SendNotification(player, $"!{{FF8080}}Gruppe:~n~~s~{message}")); + } + + /// + /// Sendet eine Benachrichtigung an Personen, die einem bestimmten Beruf nachgehen + /// + /// Der Beruf, dessen Arbeiter diese Benachrichtigung erhalten soll + /// Die Nachricht, die den Mitgliedern als Benachrichtigung zugestellt werden soll + public static void SendJobNotification(JobBase job, string message) => job.GetUsersInJob().ForEach(player => SendNotification(player, message)); + + internal static void SendFactionNotificationByFactionIds(List factionIds, string message) + { + using (var dbContext = new DatabaseContext()) + { + SendFactionNotification(dbContext.Factions.Where(faction => factionIds.Contains(faction.Id)).ToList(), message); + } + } + } +}