From f231c7214bea7841ace19ddc1fdc335523a84562 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 23 Sep 2018 20:24:45 +0200 Subject: [PATCH 1/8] Initial Commit for user-backend, preparing several systems --- Model/DatabaseContext.cs | 1 + Server/Commands/Admin.cs | 98 ++++++++++++++++++++++++++++++++++ Server/Entities/User.cs | 6 ++- Server/Entities/UserVehicle.cs | 38 +++++++++++++ Server/Events/Disconnect.cs | 28 ++++++++-- Server/Events/Login.cs | 1 + Server/Events/ResourceStop.cs | 38 +++++++++++++ Server/Managers/LoadManager.cs | 2 +- 8 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 Server/Entities/UserVehicle.cs create mode 100644 Server/Events/ResourceStop.cs diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 6b60c4b8..9849697f 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -37,6 +37,7 @@ namespace reallife_gamemode.Model } public DbSet Users { get; set; } + public DbSet UserVehicles { get; set; } public DbSet Blips { get; set; } public DbSet Markers { get; set; } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 9f558bee..b1894b4d 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1,11 +1,15 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Collections.Generic; +using System.Diagnostics; using System.Text; using GTANetworkAPI; using reallife_gamemode.Server.Events; using reallife_gamemode.Server.Extensions; using reallife_gamemode.Server.Services; using reallife_gamemode.Server.Util; +using reallife_gamemode.Model; /** * @overview Life of German Reallife - Admin Commands (Admin.cs) @@ -277,5 +281,99 @@ namespace reallife_gamemode.Server.Commands } } + //TEST COMMAND + [Command("own")] + public void CmdAdminOwn(Client player) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + if (player.IsInVehicle) + { + Vehicle playerVehicle = player.Vehicle; + using (var saveVehicle = new Model.DatabaseContext()) + { + var dataSet = new Entities.UserVehicle + { + UserId = ClientExtension.GetUser(player).Id, + Model = (VehicleHash) playerVehicle.Model, + PositionX = playerVehicle.Position.X, + PositionY = playerVehicle.Position.Y, + PositionZ = playerVehicle.Position.Z, + Heading = playerVehicle.Heading, + NumberPlate = playerVehicle.NumberPlate, + PrimaryColor = Convert.ToByte(playerVehicle.PrimaryColor), + SecondaryColor = Convert.ToByte(playerVehicle.SecondaryColor), + Locked = playerVehicle.Locked, + Engine = playerVehicle.EngineStatus, + Dimension = Convert.ToByte(playerVehicle.Dimension), + }; + saveVehicle.UserVehicles.Add(dataSet); + saveVehicle.SaveChanges(); + } + + } + else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); + + } + //TEST COMMAND + [Command("myvehicles")] + public void CmdAdminMyVehicles(Client player) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.SendChatMessage("Deine Fahrzeuge: "); + using (var loadData = new DatabaseContext()) + { + foreach (Entities.UserVehicle v in loadData.UserVehicles) + { + if (v.UserId == ClientExtension.GetUser(player).Id) + { + player.SendChatMessage("~b~" + NAPI.Vehicle.GetVehicleDisplayName(v.Model)); + } + } + } + } + /* + [Command("restart")] + public void CmdAdminRestart(Client player) + { + if (ClientExtension.IsLoggedIn(player) == false) + { + ChatService.PlayerNotLoggedIn(player); + return; + } + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + var users = NAPI.Pools.GetAllPlayers(); + + foreach(Client user in users) + { + user.SendChatMessage("~r~Server startet neu.~s~ Bitte verbinde dich über ~y~F1~s~ neu."); + user.Kick(); + } + + NAPI.Resource.StopResource("reallife-gamemode"); + }*/ } } diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs index 5f8532e1..f119e2fa 100644 --- a/Server/Entities/User.cs +++ b/Server/Entities/User.cs @@ -1,4 +1,5 @@ -using reallife_gamemode.Server.Util; +using GTANetworkAPI; +using reallife_gamemode.Server.Util; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -31,6 +32,9 @@ namespace reallife_gamemode.Server.Entities [StringLength(64)] public string Email { get; set; } public AdminLevel AdminLevel { get; set; } + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } public bool IsAdmin(AdminLevel level) => AdminLevel >= level; } diff --git a/Server/Entities/UserVehicle.cs b/Server/Entities/UserVehicle.cs new file mode 100644 index 00000000..66daec9e --- /dev/null +++ b/Server/Entities/UserVehicle.cs @@ -0,0 +1,38 @@ +using GTANetworkAPI; +using reallife_gamemode.Server.Util; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +/** +* @overview Life of German Reallife - Entities UserVehicle (UserVehicle.cs) +* @author VegaZ, hydrant +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Entities +{ + public class UserVehicle + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + [ForeignKey("User")] + public int UserId { get; set; } + public VehicleHash Model { get; set; } + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + public float Heading { get; set; } + [StringLength(8)] + public string NumberPlate { get; set; } + public byte Alpha { get; set; } + public byte PrimaryColor { get; set; } + public byte SecondaryColor { get; set; } + public bool Locked { get; set; } + public bool Engine { get; set; } + public byte Dimension { get; set; } + } +} diff --git a/Server/Events/Disconnect.cs b/Server/Events/Disconnect.cs index defec9b7..b4696652 100644 --- a/Server/Events/Disconnect.cs +++ b/Server/Events/Disconnect.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using GTANetworkAPI; @@ -11,13 +12,34 @@ using GTANetworkAPI; namespace reallife_gamemode.Server.Events { - class Disconnect : Script + public class Disconnect : Script { [ServerEvent(Event.PlayerDisconnected)] - public void OnPlayerDisconnected(Client player) + public void OnPlayerDisconnected(Client player, DisconnectionType type, string reason) { + if (type == DisconnectionType.Left) + { + NAPI.Util.ConsoleOutput(player.Name + " left"); + } + if (type == DisconnectionType.Kicked) + { + NAPI.Util.ConsoleOutput(player.Name + " kicked"); + } + if (type == DisconnectionType.Timeout) + { + NAPI.Util.ConsoleOutput(player.Name + " Timeoutet"); + } + /* + using (var saveUser = new Model.DatabaseContext()) + { + var user = saveUser.Users.SingleOrDefault(u => u.Name == player.Name); + + user.PositionX = player.Position.X; + user.PositionY = player.Position.Y; + user.PositionZ = player.Position.Z; + saveUser.SaveChanges(); + }*/ player.SetData("isLoggedIn", false); } - } } \ No newline at end of file diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index a6534280..874285ff 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -44,6 +44,7 @@ namespace reallife_gamemode.Server.Events player.SetData("isLoggedIn", true); player.TriggerEvent("draw"); + player.Position = new Vector3(user.PositionX, user.PositionY, user.PositionZ); } } } diff --git a/Server/Events/ResourceStop.cs b/Server/Events/ResourceStop.cs new file mode 100644 index 00000000..ce98d989 --- /dev/null +++ b/Server/Events/ResourceStop.cs @@ -0,0 +1,38 @@ +using GTANetworkAPI; +using GTANetworkMethods; +using reallife_gamemode.Server.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +/** +* @overview Life of German Reallife - Event ResourceStop (ResourceStop.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Events +{ + public class ResourceStop : Script + { + [ServerEvent(Event.ResourceStop)] + public void OnResourceStop() + { + var users = NAPI.Pools.GetAllPlayers(); + + foreach(Client user in users) + { + using (var saveUsers = new Model.DatabaseContext()) + { + var saveUser = saveUsers.Users.SingleOrDefault(u => u.Name == user.Name); + + saveUser.PositionX = user.Position.X; + saveUser.PositionY = user.Position.Y; + saveUser.PositionZ = user.Position.Z; + saveUsers.SaveChanges(); + } + } + } + } +} diff --git a/Server/Managers/LoadManager.cs b/Server/Managers/LoadManager.cs index 4384c916..0ca49ad9 100644 --- a/Server/Managers/LoadManager.cs +++ b/Server/Managers/LoadManager.cs @@ -34,7 +34,7 @@ namespace reallife_gamemode.Server.Managers { if (v.Active == true) { - NAPI.Vehicle.CreateVehicle((uint)v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (int)(v.PrimaryColor), + NAPI.Vehicle.CreateVehicle((uint)v.Model, new Vector3(v.PositionX, v.PositionY, v.PositionZ), v.Heading, (v.PrimaryColor), v.SecondaryColor, v.NumberPlate, v.Alpha, v.Locked, v.Engine = false, v.Dimension); } } From a74d080d02e0f4ca6044c215bc12ec6eb536b5d7 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 23 Sep 2018 21:01:59 +0200 Subject: [PATCH 2/8] Add UserBankAccount --- Model/DatabaseContext.cs | 1 + Server/Commands/Admin.cs | 3 ++- Server/Entities/UserBankAccount.cs | 32 ++++++++++++++++++++++++++++++ Server/Entities/UserVehicle.cs | 4 +++- 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 Server/Entities/UserBankAccount.cs diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 9849697f..ac8d3c94 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -38,6 +38,7 @@ namespace reallife_gamemode.Model public DbSet Users { get; set; } public DbSet UserVehicles { get; set; } + public DbSet BankAccounts { get; set; } public DbSet Blips { get; set; } public DbSet Markers { get; set; } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index b1894b4d..041d5e27 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -303,7 +303,7 @@ namespace reallife_gamemode.Server.Commands { var dataSet = new Entities.UserVehicle { - UserId = ClientExtension.GetUser(player).Id, + UserId = player.GetUser().Id, Model = (VehicleHash) playerVehicle.Model, PositionX = playerVehicle.Position.X, PositionY = playerVehicle.Position.Y, @@ -350,6 +350,7 @@ namespace reallife_gamemode.Server.Commands } } } + /* [Command("restart")] public void CmdAdminRestart(Client player) diff --git a/Server/Entities/UserBankAccount.cs b/Server/Entities/UserBankAccount.cs new file mode 100644 index 00000000..ba295a39 --- /dev/null +++ b/Server/Entities/UserBankAccount.cs @@ -0,0 +1,32 @@ +using GTANetworkAPI; +using reallife_gamemode.Server.Util; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +/** +* @overview Life of German Reallife - Entities UserVehicle (UserVehicle.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Entities +{ + public class UserBankAccount + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + [ForeignKey("User")] + public int UserId { get; set; } + public User User { get; set; } + [StringLength(12)] + public string bic { get; set; } + [StringLength(32)] + public string Iban { get; set; } + public float Money { get; set; } + public bool Active { get; set; } + } +} \ No newline at end of file diff --git a/Server/Entities/UserVehicle.cs b/Server/Entities/UserVehicle.cs index 66daec9e..2c8be155 100644 --- a/Server/Entities/UserVehicle.cs +++ b/Server/Entities/UserVehicle.cs @@ -8,7 +8,7 @@ using System.Text; /** * @overview Life of German Reallife - Entities UserVehicle (UserVehicle.cs) -* @author VegaZ, hydrant +* @author VegaZ * @copyright (c) 2008 - 2018 Life of German */ @@ -21,6 +21,8 @@ namespace reallife_gamemode.Server.Entities public int Id { get; set; } [ForeignKey("User")] public int UserId { get; set; } + public User User { get; set; } + public VehicleHash Model { get; set; } public float PositionX { get; set; } public float PositionY { get; set; } From 3c527b5f7a6a04465ec355e3ba3a43f1c5f12a5a Mon Sep 17 00:00:00 2001 From: VegaZ Date: Sun, 23 Sep 2018 23:13:05 +0200 Subject: [PATCH 3/8] Fix DbContext --- Model/DatabaseContext.cs | 3 ++ Server/Entities/UserBankAccount.cs | 6 +-- Server/Logs/BankAccountTransactionHistory.cs | 34 +++++++++++++++ Server/Logs/Death.cs | 44 ++++++++++++++++++++ 4 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 Server/Logs/BankAccountTransactionHistory.cs create mode 100644 Server/Logs/Death.cs diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index ac8d3c94..aa0dea76 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -40,6 +40,9 @@ namespace reallife_gamemode.Model public DbSet UserVehicles { get; set; } public DbSet BankAccounts { get; set; } + public DbSet BankAccountTransactionHistories { get; set; } + public DbSet Deaths { get; set; } + public DbSet Blips { get; set; } public DbSet Markers { get; set; } public DbSet Peds { get; set; } diff --git a/Server/Entities/UserBankAccount.cs b/Server/Entities/UserBankAccount.cs index ba295a39..b636a940 100644 --- a/Server/Entities/UserBankAccount.cs +++ b/Server/Entities/UserBankAccount.cs @@ -7,7 +7,7 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Text; /** -* @overview Life of German Reallife - Entities UserVehicle (UserVehicle.cs) +* @overview Life of German Reallife - Entities UserBankAccount (UserBankAccount.cs) * @author VegaZ * @copyright (c) 2008 - 2018 Life of German */ @@ -23,10 +23,10 @@ namespace reallife_gamemode.Server.Entities public int UserId { get; set; } public User User { get; set; } [StringLength(12)] - public string bic { get; set; } + public string Bic { get; set; } [StringLength(32)] public string Iban { get; set; } - public float Money { get; set; } + public float Balance { get; set; } public bool Active { get; set; } } } \ No newline at end of file diff --git a/Server/Logs/BankAccountTransactionHistory.cs b/Server/Logs/BankAccountTransactionHistory.cs new file mode 100644 index 00000000..ac14e6c1 --- /dev/null +++ b/Server/Logs/BankAccountTransactionHistory.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +/** +* @overview Life of German Reallife - Logs BankAccountTransactionHistory (BankAccountTransactionHistory.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Logs +{ + public class BankAccountTransactionHistory + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [StringLength(32)] + public string Sender { get; set; } + public float SenderBalance { get; set; } + public float MoneySent { get; set; } + [StringLength(32)] + public string Receiver { get; set; } + public float ReceiverBalance { get; set; } + public float NewSenderBalance { get; set; } + public float NewReceiverBalance { get; set; } + public float Fee { get; set; } + [Timestamp] + public byte[] Timestamp { get; set; } + } +} diff --git a/Server/Logs/Death.cs b/Server/Logs/Death.cs new file mode 100644 index 00000000..de924f52 --- /dev/null +++ b/Server/Logs/Death.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using reallife_gamemode.Server.Entities; + +/** +* @overview Life of German Reallife - Logs Death (Death.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Logs +{ + public class Death + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("Killer")] + public int? KillerId { get; set; } + public User Killer { get; set; } + [ForeignKey("Victim")] + public int VictimId { get; set; } + public User Victim { get; set; } + + public float KillerPositionX { get; set; } + public float KillerPositionY { get; set; } + public float KillerPositionZ { get; set; } + public float KillerHeading { get; set; } + + public float VictimPositionX { get; set; } + public float VictimPositionY { get; set; } + public float VictimPositionZ { get; set; } + public float VictimHeading { get; set; } + + [StringLength(64)] + public string CauseOfDeath { get; set; } + [Timestamp] + public byte[] Timestamp { get; set; } + } +} From eec6807a058a8cc7ae63ae20a55fef4650a8e8b8 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 24 Sep 2018 22:16:57 +0200 Subject: [PATCH 4/8] Add DeathLogs --- Model/DatabaseContext.cs | 7 +++++-- Server/Events/Death.cs | 31 +++++++++++++++++++++++++++++++ Server/Events/Register.cs | 1 + Server/Logs/Death.cs | 17 +++++++++-------- 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index aa0dea76..7cb35714 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -36,13 +36,16 @@ namespace reallife_gamemode.Model base.OnModelCreating(modelBuilder); } + //User public DbSet Users { get; set; } public DbSet UserVehicles { get; set; } public DbSet BankAccounts { get; set; } - public DbSet BankAccountTransactionHistories { get; set; } - public DbSet Deaths { get; set; } + //Logs + public DbSet BankAccountTransactionLogs { get; set; } + public DbSet DeathLogs { get; set; } + //Saves public DbSet Blips { get; set; } public DbSet Markers { get; set; } public DbSet Peds { get; set; } diff --git a/Server/Events/Death.cs b/Server/Events/Death.cs index 4eaa85e0..cecc87c0 100644 --- a/Server/Events/Death.cs +++ b/Server/Events/Death.cs @@ -5,6 +5,7 @@ using System.Text; using GTANetworkAPI; using GTANetworkMethods; using reallife_gamemode.Model; +using reallife_gamemode.Server.Extensions; /* * Author: balbo @@ -19,6 +20,36 @@ namespace reallife_gamemode.Server.Events public void OnPlayerDeath(Client player, Client killer, uint reason) { NAPI.Chat.SendChatMessageToPlayer(player, "Du bist durch " + killer.Name + " gestorben: " + reason.ToString()); + + var killerId = 0; + var killerPosX = 0f; + var killerPosY = 0f; + var killerPosZ = 0f; + var killerHeading = 0f; + + if (killer.IsNull) + { + killerId = -1; + killerPosX = -1; + killerPosY = -1; + killerPosZ = -1; + killerHeading = -1; + } else { + killerId = killer.GetUser().Id; + killerPosX = killer.Position.X; + killerPosY = killer.Position.Y; + killerPosZ = killer.Position.Z; + killerHeading = killer.Heading; + } + + using (var userDeath = new DatabaseContext()) + { + var dead = new Logs.Death { VictimId = player.GetUser().Id, KillerId = killerId, KillerPositionX = killerPosX, KillerPositionY = killerPosY, + KillerPositionZ = killerPosZ, KillerHeading = killerHeading, VictimPositionX = player.Position.X, VictimPositionY = player.Position.Y, + VictimPositionZ = player.Position.Z, VictimHeading = player.Heading, CauseOfDeath = reason.ToString()}; + userDeath.DeathLogs.Add(dead); + userDeath.SaveChanges(); + } } } } diff --git a/Server/Events/Register.cs b/Server/Events/Register.cs index fbc45ecf..1aac5659 100644 --- a/Server/Events/Register.cs +++ b/Server/Events/Register.cs @@ -30,6 +30,7 @@ namespace reallife_gamemode.Server.Events } player.TriggerEvent("registerSuccess"); NAPI.Player.SpawnPlayer(player, Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING); + player.SetData("isLoggedIn", true); } else if (player.SocialClubName == checkedUser.SocialClubName) { diff --git a/Server/Logs/Death.cs b/Server/Logs/Death.cs index de924f52..b9f48eb3 100644 --- a/Server/Logs/Death.cs +++ b/Server/Logs/Death.cs @@ -18,24 +18,25 @@ namespace reallife_gamemode.Server.Logs [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } + + [ForeignKey("Victim")] + public int VictimId { get; set; } + public User Victim { get; set; } [ForeignKey("Killer")] public int? KillerId { get; set; } public User Killer { get; set; } - [ForeignKey("Victim")] - public int VictimId { get; set; } - public User Victim { get; set; } + + public float VictimPositionX { get; set; } + public float VictimPositionY { get; set; } + public float VictimPositionZ { get; set; } + public float VictimHeading { get; set; } public float KillerPositionX { get; set; } public float KillerPositionY { get; set; } public float KillerPositionZ { get; set; } public float KillerHeading { get; set; } - public float VictimPositionX { get; set; } - public float VictimPositionY { get; set; } - public float VictimPositionZ { get; set; } - public float VictimHeading { get; set; } - [StringLength(64)] public string CauseOfDeath { get; set; } [Timestamp] From 044651f6294c5a38e38d18db02a0feb14807bce1 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 24 Sep 2018 23:08:17 +0200 Subject: [PATCH 5/8] Add Bans --- Model/DatabaseContext.cs | 1 + Server/Commands/Admin.cs | 1 - Server/Entities/Ban.cs | 30 ++++++++++++++++++++++++++++++ Server/Entities/User.cs | 4 ++++ Server/Events/Death.cs | 13 +++++++------ 5 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 Server/Entities/Ban.cs diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 7cb35714..22d87bf1 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -42,6 +42,7 @@ namespace reallife_gamemode.Model public DbSet BankAccounts { get; set; } //Logs + //public DbSet BanLogs { get; set; } public DbSet BankAccountTransactionLogs { get; set; } public DbSet DeathLogs { get; set; } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 88998cb9..7ee9ddc4 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -62,7 +62,6 @@ namespace reallife_gamemode.Server.Commands Vehicle v = NAPI.Vehicle.CreateVehicle(hash, player.Position, player.Rotation.Z, color1, color2); player.SetIntoVehicle(v.Handle, -1); - player.SendChatMessage("Maxspeed: + " +player.Vehicle.MaxSpeed + ""); } [Command("fv")] diff --git a/Server/Entities/Ban.cs b/Server/Entities/Ban.cs new file mode 100644 index 00000000..895c4a27 --- /dev/null +++ b/Server/Entities/Ban.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using reallife_gamemode.Server.Entities; + +/** +* @overview Life of German Reallife - Entities Ban (Ban.cs) +* @author VegaZ +* @copyright (c) 2008 - 2018 Life of German +*/ + +namespace reallife_gamemode.Server.Entities +{ + public class Ban + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [ForeignKey("User")] + public int UserId { get; set; } + public User User { get; set; } + + public string Reason { get; set; } + public string BannedBy { get; set; } + public byte[] UntilDateTime { get; set; } + } +} diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs index f119e2fa..9bb71bab 100644 --- a/Server/Entities/User.cs +++ b/Server/Entities/User.cs @@ -36,6 +36,10 @@ namespace reallife_gamemode.Server.Entities public float PositionY { get; set; } public float PositionZ { get; set; } + [ForeignKey("Ban")] + public int? BanId { get; set; } + public Ban Ban { get; set; } + public bool IsAdmin(AdminLevel level) => AdminLevel >= level; } } diff --git a/Server/Events/Death.cs b/Server/Events/Death.cs index cecc87c0..62c3cd55 100644 --- a/Server/Events/Death.cs +++ b/Server/Events/Death.cs @@ -19,17 +19,18 @@ namespace reallife_gamemode.Server.Events [ServerEvent(Event.PlayerDeath)] public void OnPlayerDeath(Client player, Client killer, uint reason) { + //TODO: Zum Full Release entfernen NAPI.Chat.SendChatMessageToPlayer(player, "Du bist durch " + killer.Name + " gestorben: " + reason.ToString()); - var killerId = 0; - var killerPosX = 0f; - var killerPosY = 0f; - var killerPosZ = 0f; - var killerHeading = 0f; + int? killerId; + float killerPosX; + float killerPosY; + float killerPosZ; + float killerHeading; if (killer.IsNull) { - killerId = -1; + killerId = null; killerPosX = -1; killerPosY = -1; killerPosZ = -1; From 3c5ecdd8e4d634a39ddd7c3770192cfc917c8f71 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Tue, 25 Sep 2018 20:24:30 +0200 Subject: [PATCH 6/8] Add Ban Command --- Main.cs | 2 +- Model/DatabaseContext.cs | 1 + Server/Commands/Admin.cs | 22 ++++++++++++++++++++-- Server/Entities/Ban.cs | 2 ++ Server/Entities/User.cs | 1 + Server/Extensions/ClientExtension.cs | 22 ++++++++++++++++++++++ 6 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Main.cs b/Main.cs index 3f6166a1..b6dc0e75 100644 --- a/Main.cs +++ b/Main.cs @@ -25,7 +25,7 @@ namespace reallife_gamemode using (var context = new DatabaseContext()) { - context.Users.FirstOrDefault(); + context.Bans.FirstOrDefault(); context.SaveChanges(); } } diff --git a/Model/DatabaseContext.cs b/Model/DatabaseContext.cs index 22d87bf1..709f14f9 100644 --- a/Model/DatabaseContext.cs +++ b/Model/DatabaseContext.cs @@ -40,6 +40,7 @@ namespace reallife_gamemode.Model public DbSet Users { get; set; } public DbSet UserVehicles { get; set; } public DbSet BankAccounts { get; set; } + public DbSet Bans { get; set; } //Logs //public DbSet BanLogs { get; set; } diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index 7ee9ddc4..bf739c67 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -550,9 +550,27 @@ namespace reallife_gamemode.Server.Commands else player.SendChatMessage("~m~Du sitzt in keinem Fahrzeug!"); break; - } - + } } + + [Command("ban", "~m~Benutzung: ~s~/ban [User] [Zeit in Minuten(0 für Permanent)] [Grund] ", GreedyArg = true)] + public void CmdAdminBan(Client admin, string user, int mins, string reason) + { + if (ClientExtension.IsLoggedIn(admin) == false) + { + ChatService.PlayerNotLoggedIn(admin); + return; + } + if (!admin.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(admin); + return; + } + Client target = ClientService.GetClientByName(user); + ClientExtension.BanPlayer(admin, target, reason, mins); + } + + //TEST COMMAND [Command("own")] public void CmdAdminOwn(Client player) diff --git a/Server/Entities/Ban.cs b/Server/Entities/Ban.cs index 895c4a27..5919b614 100644 --- a/Server/Entities/Ban.cs +++ b/Server/Entities/Ban.cs @@ -25,6 +25,8 @@ namespace reallife_gamemode.Server.Entities public string Reason { get; set; } public string BannedBy { get; set; } + [Timestamp] + public byte[] Applied { get; set; } public byte[] UntilDateTime { get; set; } } } diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs index 9bb71bab..34c4ee3c 100644 --- a/Server/Entities/User.cs +++ b/Server/Entities/User.cs @@ -28,6 +28,7 @@ namespace reallife_gamemode.Server.Entities public int LogUserId { get; set; } [Timestamp] public byte[] RegistrationDate { get; set; } + [EmailAddress] [StringLength(64)] public string Email { get; set; } diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs index d45bede9..71c8a776 100644 --- a/Server/Extensions/ClientExtension.cs +++ b/Server/Extensions/ClientExtension.cs @@ -28,5 +28,27 @@ namespace reallife_gamemode.Server.Extensions { return player.GetData("isLoggedIn"); } + + public static void BanPlayer(Client admin, Client target, string reason, int mins) + { + if(mins == 0) + { + NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " permanent gebannt. [" + reason + "]"); + //user.Kick(); + mins--; + } + else + { + NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " für " + mins + " Minuten gebannt. [" + reason + "]"); + //user.Kick(); + } + + using (var banUser = new DatabaseContext()) + { + var user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, UntilDateTime = BitConverter.GetBytes(DateTime.Now.Ticks - mins)}; + banUser.Bans.Add(user); + banUser.SaveChanges(); + } + } } } From b5bdb6f12383ac515b54775a11f0a5b2aaf51179 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 26 Sep 2018 20:00:13 +0200 Subject: [PATCH 7/8] Change login-process for Ban-System --- Client/Login/main.js | 27 +++++++++++++++-------- Server/Entities/Ban.cs | 6 ++--- Server/Events/Connect.cs | 32 ++++++++++++++++++++++++++- Server/Events/Login.cs | 4 +++- Server/Extensions/ClientExtension.cs | 33 +++++++++++++++++----------- 5 files changed, 75 insertions(+), 27 deletions(-) diff --git a/Client/Login/main.js b/Client/Login/main.js index ee786ad7..64ae00f6 100644 --- a/Client/Login/main.js +++ b/Client/Login/main.js @@ -3,17 +3,10 @@ * @author VegaZ, hydrant * @copyright (c) 2008 - 2018 Life of German */ - var loginBrowser; -loginBrowser = mp.browsers.new('package://Login/login.html'); -mp.gui.chat.activate(false); -mp.gui.cursor.show(true, true); -mp.game.ui.displayHud(false); -mp.game.ui.displayRadar(false); - var loginCam = mp.cameras.new('login', new mp.Vector3(-1883.736, -781.4911, 78.27616), new mp.Vector3(3.185999, 0, -79.59519), 40); -loginCam.setActive(true); -mp.game.cam.renderScriptCams(true, false, 0, true, false); + +mp.events.callRemote('IsPlayerBanned'); mp.events.add('loginInformationToServer', (password) => { @@ -73,6 +66,22 @@ mp.events.add('registerFail', (reason) => { showCefError(reason); }); +mp.events.add('showLogin', () => { + + loginBrowser = mp.browsers.new('package://Login/login.html'); + mp.gui.chat.activate(false); + mp.gui.cursor.show(true, true); + mp.game.ui.displayHud(false); + mp.game.ui.displayRadar(false); + + loginCam.setActive(true); + mp.game.cam.renderScriptCams(true, false, 0, true, false); +}); + function showCefError(error) { loginBrowser.execute(`showError(\`` + error + `\`)`); } + +//function isPlayerBanned() { + +//} \ No newline at end of file diff --git a/Server/Entities/Ban.cs b/Server/Entities/Ban.cs index 5919b614..9a9438c9 100644 --- a/Server/Entities/Ban.cs +++ b/Server/Entities/Ban.cs @@ -25,8 +25,8 @@ namespace reallife_gamemode.Server.Entities public string Reason { get; set; } public string BannedBy { get; set; } - [Timestamp] - public byte[] Applied { get; set; } - public byte[] UntilDateTime { get; set; } + + public int Applied { get; set; } + public int UntilDateTime { get; set; } } } diff --git a/Server/Events/Connect.cs b/Server/Events/Connect.cs index 69e1552b..632e42ce 100644 --- a/Server/Events/Connect.cs +++ b/Server/Events/Connect.cs @@ -24,6 +24,36 @@ namespace reallife_gamemode.Server.Events player.Position = new Vector3(-1883.736, -781.4911, -10); player.FreezePosition = true; } - + [RemoteEvent("IsPlayerBanned")] + public void IsPlayerBanned(Client player) + { + using (var loginUser = new Model.DatabaseContext()) + { + var user = loginUser.Users.SingleOrDefault(b => b.Name == player.Name); + if (user.BanId != null) + { + using (var banUser = new DatabaseContext()) + { + + var dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + var bannedUser = banUser.Bans.SingleOrDefault(u => u.Id == user.BanId); + if (bannedUser.Applied == bannedUser.UntilDateTime) + { + player.SendChatMessage("!{#FF4040}Du wurdest permanent gebannt! [" + bannedUser.Reason + "]"); + //player.Kick(); + } + else + { + var timeStamp = bannedUser.UntilDateTime; + player.SendChatMessage("Du bist noch bis zum !{#FF4040}" + dt.AddSeconds(timeStamp).ToLocalTime() + " Uhr ~s~gebannt. [" + bannedUser.Reason + "]"); + //player.Kick(); + } + + } + } + else player.TriggerEvent("showLogin"); + } + } + } } diff --git a/Server/Events/Login.cs b/Server/Events/Login.cs index 874285ff..f3dac381 100644 --- a/Server/Events/Login.cs +++ b/Server/Events/Login.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using GTANetworkAPI; +using reallife_gamemode.Model; +using reallife_gamemode.Server.Entities; /** * @overview Life of German Reallife - Event Login (Login.cs) @@ -36,7 +38,7 @@ namespace reallife_gamemode.Server.Events if (user.Password != NAPI.Util.GetHashSha256(password)) { player.TriggerEvent("loginFail", "Passwort inkorrekt!"); - } + } else { player.TriggerEvent("loginSuccess"); diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs index 71c8a776..2d0666e8 100644 --- a/Server/Extensions/ClientExtension.cs +++ b/Server/Extensions/ClientExtension.cs @@ -31,23 +31,30 @@ namespace reallife_gamemode.Server.Extensions public static void BanPlayer(Client admin, Client target, string reason, int mins) { - if(mins == 0) - { - NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " permanent gebannt. [" + reason + "]"); - //user.Kick(); - mins--; - } - else - { - NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " für " + mins + " Minuten gebannt. [" + reason + "]"); - //user.Kick(); - } - using (var banUser = new DatabaseContext()) { - var user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, UntilDateTime = BitConverter.GetBytes(DateTime.Now.Ticks - mins)}; + int unixTimestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; + Ban user; + if (mins == 0) + { + NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " permanent gebannt. [" + reason + "]"); + user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp}; + //TODO user.Kick(); + mins--; + } + else + { + NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " für " + mins + " Minuten gebannt. [" + reason + "]"); + user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp + mins * 60 }; + //TODO user.Kick(); + } + banUser.Bans.Add(user); banUser.SaveChanges(); + + var targetUser = banUser.Users.FirstOrDefault(u => u.Name == target.Name); + targetUser.BanId = user.Id; + banUser.SaveChanges(); } } } From 6bea1700a014e6eb50954594317ae83350db760e Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 26 Sep 2018 21:27:47 +0200 Subject: [PATCH 8/8] Add /unban Command --- Server/Commands/Admin.cs | 16 ++++++++++++++++ Server/Extensions/ClientExtension.cs | 15 +++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index bf739c67..102bed3a 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -569,6 +569,22 @@ namespace reallife_gamemode.Server.Commands Client target = ClientService.GetClientByName(user); ClientExtension.BanPlayer(admin, target, reason, mins); } + [Command("unban", "~m~Benutzung: ~s~/unban [User] ", GreedyArg = true)] + public void CmdAdminUnban(Client admin, string user) + { + if (ClientExtension.IsLoggedIn(admin) == false) + { + ChatService.PlayerNotLoggedIn(admin); + return; + } + if (!admin.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(admin); + return; + } + Client target = ClientService.GetClientByName(user); + ClientExtension.UnbanPlayer(admin, target); + } //TEST COMMAND diff --git a/Server/Extensions/ClientExtension.cs b/Server/Extensions/ClientExtension.cs index 2d0666e8..d272dffb 100644 --- a/Server/Extensions/ClientExtension.cs +++ b/Server/Extensions/ClientExtension.cs @@ -18,7 +18,7 @@ namespace reallife_gamemode.Server.Extensions { public static User GetUser(this Client client) { - using(DatabaseContext dbContext = new DatabaseContext()) + using (DatabaseContext dbContext = new DatabaseContext()) { return dbContext.Users.FirstOrDefault(u => u.Name == client.Name); } @@ -38,7 +38,7 @@ namespace reallife_gamemode.Server.Extensions if (mins == 0) { NAPI.Chat.SendChatMessageToAll("!{#FF4040}[BAN] " + target.Name + " wurde von " + admin.Name + " permanent gebannt. [" + reason + "]"); - user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp}; + user = new Ban { UserId = GetUser(target).Id, Reason = reason, BannedBy = admin.Name, Applied = unixTimestamp, UntilDateTime = unixTimestamp }; //TODO user.Kick(); mins--; } @@ -57,5 +57,16 @@ namespace reallife_gamemode.Server.Extensions banUser.SaveChanges(); } } + public static void UnbanPlayer(Client admin, Client target) + { + using (var unbanUser = new DatabaseContext()) + { + var targetUser = unbanUser.Bans.FirstOrDefault(u => u.Id == target.GetUser().BanId); + unbanUser.Bans.Remove(targetUser); + unbanUser.SaveChanges(); + } + admin.SendChatMessage(target.Name + " wurde entbannt."); + //TODO ***Admin Info: {ADMIN-NAME} hat {USER-NAME} entbannt. + } } }