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);
+ }
+ }
+ }
+}