diff --git a/Server/Commands/Admin.cs b/Server/Commands/Admin.cs index d3c259ff..5691d03b 100644 --- a/Server/Commands/Admin.cs +++ b/Server/Commands/Admin.cs @@ -1631,7 +1631,7 @@ namespace reallife_gamemode.Server.Commands using (var dbContext = new DatabaseContext()) { - target.GetUser().GetUserBankAccount(dbContext).Balance = amount; + target.GetUser().GetBankAccount(dbContext).Balance = amount; dbContext.SaveChanges(); } player.SendChatMessage("~b~[ADMIN]~s~ Du hast das Geld von " + target.Name + " auf ~g~$" + amount + "~s~ gesetzt."); @@ -1655,7 +1655,7 @@ namespace reallife_gamemode.Server.Commands using (var dbContext = new DatabaseContext()) { - target.GetUser().GetUserBankAccount(dbContext).Balance += amount; + target.GetUser().GetBankAccount(dbContext).Balance += amount; dbContext.SaveChanges(); } player.SendChatMessage("~b~[ADMIN]~s~ Du hast " + target.Name + " ~g~$" + amount + "~s~ gegeben."); @@ -1752,7 +1752,14 @@ namespace reallife_gamemode.Server.Commands using (var getFaction = new DatabaseContext()) { Entities.Faction receiverUser = getFaction.Factions.FirstOrDefault(u => u.Name == receiver); - BankManager.TransferUserMoneyToFaction(player.GetUser(), receiverUser, amount, "/FPAY"); + + if(receiverUser == null) + { + player.SendChatMessage("~r~[FEHLER]~s~ Diese Fraktion existiert nicht."); + return; + } + + BankManager.TransferMoney(player.GetUser(), receiverUser, amount, "/FPAY"); } } @@ -1774,7 +1781,7 @@ namespace reallife_gamemode.Server.Commands { ShopVehicle sVehicle = getShopVehicle.ShopVehicles.FirstOrDefault(u => u.Id == shopVehicleId); Entities.Faction receiverUser = getShopVehicle.Factions.FirstOrDefault(u => u.Name == "LSPD"); - BankManager.TransferUserMoneyToFaction(player.GetUser(), receiverUser, sVehicle.Price, "Fahrzeug gekauft: " + sVehicle.ModelName); + BankManager.TransferMoney(player.GetUser(), receiverUser, sVehicle.Price, "Fahrzeug gekauft: " + sVehicle.ModelName); //TODO Anpassen Vehicle boughtVehicle = NAPI.Vehicle.CreateVehicle(sVehicle.Model, new Vector3(sVehicle.PositionX, sVehicle.PositionY + 10, sVehicle.PositionZ + 0.5), sVehicle.Heading, sVehicle.PrimaryColor, sVehicle.SecondaryColor, "LoG", sVehicle.Alpha, false, true, 0); diff --git a/Server/Entities/Faction.cs b/Server/Entities/Faction.cs index 88db5333..9dc14faa 100644 --- a/Server/Entities/Faction.cs +++ b/Server/Entities/Faction.cs @@ -1,8 +1,11 @@ using Microsoft.EntityFrameworkCore; +using reallife_gamemode.Model; +using reallife_gamemode.Server.Util; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; using System.Text; /** @@ -13,14 +16,28 @@ using System.Text; namespace reallife_gamemode.Server.Entities { - public class Faction + public class Faction : IBankAccountOwner { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [StringLength(32)] public string Name { get; set; } - public int BankAccount { get; set; } public bool StateOwned { get; set; } + + public IBankAccount GetBankAccount(DatabaseContext databaseContext = null) + { + if (databaseContext == null) + { + using (databaseContext = new DatabaseContext()) + { + return databaseContext.FactionBankAccounts.FirstOrDefault(u => u.FactionId == this.Id); + } + } + else + { + return databaseContext.FactionBankAccounts.FirstOrDefault(u => u.FactionId == this.Id); + } + } } } diff --git a/Server/Entities/FactionBankAccount.cs b/Server/Entities/FactionBankAccount.cs index 7abac2be..a4be3a30 100644 --- a/Server/Entities/FactionBankAccount.cs +++ b/Server/Entities/FactionBankAccount.cs @@ -13,7 +13,7 @@ using System.Text; */ namespace reallife_gamemode.Server.Entities { - public class FactionBankAccount + public class FactionBankAccount : IBankAccount { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] diff --git a/Server/Entities/User.cs b/Server/Entities/User.cs index dd7c4d1f..839d45bc 100644 --- a/Server/Entities/User.cs +++ b/Server/Entities/User.cs @@ -16,7 +16,7 @@ using System.Text; namespace reallife_gamemode.Server.Entities { - public class User + public class User : IBankAccountOwner { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -28,8 +28,8 @@ namespace reallife_gamemode.Server.Entities [StringLength(64)] public string Password { get; set; } public int LogUserId { get; set; } - [Timestamp] - public byte[] RegistrationDate { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public DateTime RegistrationDate { get; set; } [EmailAddress] [StringLength(64)] @@ -131,5 +131,20 @@ namespace reallife_gamemode.Server.Entities } public bool IsAdmin(AdminLevel level) => AdminLevel >= level; + + public IBankAccount GetBankAccount(DatabaseContext databaseContext = null) + { + if (databaseContext == null) + { + using (databaseContext = new DatabaseContext()) + { + return databaseContext.UserBankAccounts.FirstOrDefault(u => u.UserId == this.Id); + } + } + else + { + return databaseContext.UserBankAccounts.FirstOrDefault(u => u.UserId == this.Id); + } + } } } diff --git a/Server/Entities/UserBankAccount.cs b/Server/Entities/UserBankAccount.cs index 25ba6c37..4efcfbc3 100644 --- a/Server/Entities/UserBankAccount.cs +++ b/Server/Entities/UserBankAccount.cs @@ -17,8 +17,9 @@ using System.Linq; namespace reallife_gamemode.Server.Entities { - public class UserBankAccount + public class UserBankAccount : IBankAccount { + [NotMapped] private int _balance; [Key] diff --git a/Server/Extensions/FactionExtension.cs b/Server/Extensions/FactionExtension.cs deleted file mode 100644 index db5f6022..00000000 --- a/Server/Extensions/FactionExtension.cs +++ /dev/null @@ -1,41 +0,0 @@ -using GTANetworkAPI; -using Microsoft.EntityFrameworkCore; -using reallife_gamemode.Model; -using reallife_gamemode.Server.Entities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -/** -* @overview Life of German Reallife - Faction Extension (FactionExtension.cs) -* @author VegaZ -* @copyright (c) 2008 - 2018 Life of German -*/ - -namespace reallife_gamemode.Server.Extensions -{ - public static class FactionExtension - { - /// - /// Gibt das Bankkonto einer Fraktion zurück - /// - /// Die Fraktion, dessen Bankkonto man bekommen möchte - /// Ein eventuell vorhandener Datenbank-Context, falls man Änderungen in der Datenbank vornehmen will - /// - public static FactionBankAccount GetFactionBankAccount(this Faction faction, DatabaseContext context = null) - { - if (context == null) - { - using (context = new DatabaseContext()) - { - return context.FactionBankAccounts.FirstOrDefault(u => u.FactionId == faction.Id); - } - } - else - { - return context.FactionBankAccounts.FirstOrDefault(u => u.FactionId == faction.Id); - } - } - } -} diff --git a/Server/Extensions/UserExtension.cs b/Server/Extensions/UserExtension.cs deleted file mode 100644 index 566810b1..00000000 --- a/Server/Extensions/UserExtension.cs +++ /dev/null @@ -1,62 +0,0 @@ -using GTANetworkAPI; -using Microsoft.EntityFrameworkCore; -using reallife_gamemode.Model; -using reallife_gamemode.Server.Entities; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -/** -* @overview Life of German Reallife - User Extension (UserExtension.cs) -* @author VegaZ -* @copyright (c) 2008 - 2018 Life of German -*/ - -namespace reallife_gamemode.Server.Extensions -{ - public static class UserExtension - { - /// - /// Gibt das Bankkonto eines Users zurück - /// - /// Der User, dessen Bankkonto man bekommen möchte - /// Ein eventuell vorhandener Datenbank-Context, falls man Änderungen in der Datenbank vornehmen will - /// - public static UserBankAccount GetUserBankAccount(this User user, DatabaseContext context = null) - { - if (context == null) - { - using (context = new DatabaseContext()) - { - return context.UserBankAccounts.FirstOrDefault(u => u.UserId == user.Id); - } - } - else - { - return context.UserBankAccounts.FirstOrDefault(u => u.UserId == user.Id); - } - } - - /// - /// Gibt den Character eines Users zurück - /// - /// Der Client, dessen Character man bekommen möchte - /// Ein eventuell vorhandener Datenbank-Context, falls man Änderungen in der Datenbank vornehmen will - /// - public static Character GetUserCharacter(this User user, DatabaseContext context = null) - { - if (context == null) - { - using (context = new DatabaseContext()) - { - return context.Characters.FirstOrDefault(u => u.UserId == user.Id); - } - } - else - { - return context.Characters.FirstOrDefault(u => u.UserId == user.Id); - } - } - } -} diff --git a/Server/Logs/BankAccountTransactionHistory.cs b/Server/Logs/BankAccountTransactionHistory.cs index 425d324f..24426a7f 100644 --- a/Server/Logs/BankAccountTransactionHistory.cs +++ b/Server/Logs/BankAccountTransactionHistory.cs @@ -30,7 +30,7 @@ namespace reallife_gamemode.Server.Logs public int Fee { get; set; } [StringLength(32)] public string Origin { get; set; } - [Timestamp] - public byte[] Timestamp { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public DateTime Timestamp { get; set; } } } diff --git a/Server/Managers/BankManager.cs b/Server/Managers/BankManager.cs index 279515e4..4d4b1d77 100644 --- a/Server/Managers/BankManager.cs +++ b/Server/Managers/BankManager.cs @@ -5,6 +5,7 @@ using System.Text; using GTANetworkAPI; using reallife_gamemode.Server.Entities; using reallife_gamemode.Server.Extensions; +using reallife_gamemode.Server.Util; /** * @overview Life of German Reallife - Managers BankManager (BankManager.cs) @@ -17,127 +18,42 @@ namespace reallife_gamemode.Server.Managers { public class BankManager : Script { - /// - /// Transferiert Geld von einem User zu einem anderen User - /// - /// Der Sender des Geldes - /// Der Empfänger des Geldes - /// Der Geldbetrag - /// Der Überweisungsgrund - public static void TransferUserMoneyToUser(User sender, User receiver, int amount, string origin) + public static TransactionResult TransferMoney(IBankAccountOwner sender, IBankAccountOwner receiver, int amount, string origin) { using (var transferMoney = new Model.DatabaseContext()) { + if (amount < 0) return TransactionResult.NEGATIVE_MONEY_SENT; + + IBankAccount senderAccount = sender.GetBankAccount(transferMoney); + IBankAccount receiverAccount = receiver.GetBankAccount(transferMoney); + + if (senderAccount == null) return TransactionResult.SENDER_NO_BANKACCOUNT; + if (receiverAccount == null) return TransactionResult.RECEIVER_NO_BANKACCOUNT; + + if (senderAccount.Balance < amount) return TransactionResult.SENDER_NOT_ENOUGH_MONEY; + var transactionLog = new Logs.BankAccountTransactionHistory { Sender = sender.Name, - SenderBalance = sender.GetUserBankAccount().Balance, - MoneySent = amount, + SenderBalance = senderAccount.Balance, Receiver = receiver.Name, - ReceiverBalance = receiver.GetUserBankAccount().Balance, - NewReceiverBalance = receiver.GetUserBankAccount().Balance + amount, - NewSenderBalance = sender.GetUserBankAccount().Balance - amount, + ReceiverBalance = receiverAccount.Balance, + NewReceiverBalance = receiverAccount.Balance + amount, + NewSenderBalance = senderAccount.Balance - amount, + MoneySent = amount, Fee = 0, Origin = origin }; + // add log transferMoney.BankAccountTransactionLogs.Add(transactionLog); - sender.GetUserBankAccount(transferMoney).Balance -= amount; - receiver.GetUserBankAccount(transferMoney).Balance += amount; + + senderAccount.Balance -= amount; + receiverAccount.Balance += amount; + transferMoney.SaveChanges(); - } - } - /// - /// Transferiert Geld von einem User zu einer Fraktion - /// - /// Der Sender des Geldes - /// Der Empfänger des Geldes - /// Der Geldbetrag - /// Der Überweisungsgrund - public static void TransferUserMoneyToFaction(User sender, Faction receiver, int amount, string origin) - { - using (var transferMoney = new Model.DatabaseContext()) - { - var transactionLog = new Logs.BankAccountTransactionHistory - { - Sender = sender.Name, - SenderBalance = sender.GetUserBankAccount().Balance, - MoneySent = amount, - Receiver = receiver.Name, - ReceiverBalance = receiver.BankAccount, - NewReceiverBalance = receiver.BankAccount + amount, - NewSenderBalance = sender.GetUserBankAccount().Balance - amount, - Fee = 0, - Origin = origin - }; - - transferMoney.BankAccountTransactionLogs.Add(transactionLog); - sender.GetUserBankAccount(transferMoney).Balance -= amount; - receiver.BankAccount += amount; - transferMoney.SaveChanges(); - } - } - - /// - /// Transferiert Geld von einer Fraktion zu einem User - /// - /// Der Sender des Geldes - /// Der Empfänger des Geldes - /// Der Geldbetrag - /// Der Überweisungsgrund - public static void TransferFactionMoneyToUser(Faction sender, User receiver, int amount, string origin) - { - using (var transferMoney = new Model.DatabaseContext()) - { - var transactionLog = new Logs.BankAccountTransactionHistory - { - Sender = sender.Name, - SenderBalance = sender.BankAccount, - MoneySent = amount, - Receiver = receiver.Name, - ReceiverBalance = receiver.GetUserBankAccount().Balance, - NewReceiverBalance = receiver.GetUserBankAccount().Balance + amount, - NewSenderBalance = sender.BankAccount - amount, - Fee = 0, - Origin = origin - }; - - transferMoney.BankAccountTransactionLogs.Add(transactionLog); - sender.BankAccount -= amount; - receiver.GetUserBankAccount(transferMoney).Balance += amount; - transferMoney.SaveChanges(); - } - } - - /// - /// Transferiert Geld von einer Fraktion zu einer anderen Fraktion - /// - /// Der Sender des Geldes - /// Der Empfänger des Geldes - /// Der Geldbetrag - /// Der Überweisungsgrund - public static void TransferFactionMoneyToFaction(Faction sender, Faction receiver, int amount, string origin) - { - using (var transferMoney = new Model.DatabaseContext()) - { - var transactionLog = new Logs.BankAccountTransactionHistory - { - Sender = sender.Name, - SenderBalance = sender.GetFactionBankAccount().Balance, - MoneySent = amount, - Receiver = receiver.Name, - ReceiverBalance = receiver.BankAccount, - NewReceiverBalance = receiver.BankAccount + amount, - NewSenderBalance = sender.BankAccount - amount, - Fee = 0, - Origin = origin - }; - - transferMoney.BankAccountTransactionLogs.Add(transactionLog); - sender.BankAccount -= amount; - receiver.BankAccount += amount; - transferMoney.SaveChanges(); + return TransactionResult.SUCCESS; } } } diff --git a/Server/Util/IBankAccount.cs b/Server/Util/IBankAccount.cs new file mode 100644 index 00000000..4a8b4a2c --- /dev/null +++ b/Server/Util/IBankAccount.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace reallife_gamemode.Server.Util +{ + public interface IBankAccount + { + int Balance { get; set; } + } +} diff --git a/Server/Util/IBankAccountOwner.cs b/Server/Util/IBankAccountOwner.cs new file mode 100644 index 00000000..a13c7969 --- /dev/null +++ b/Server/Util/IBankAccountOwner.cs @@ -0,0 +1,14 @@ +using reallife_gamemode.Model; +using System; +using System.Collections.Generic; +using System.Text; + +namespace reallife_gamemode.Server.Util +{ + public interface IBankAccountOwner + { + string Name { get; } + + IBankAccount GetBankAccount(DatabaseContext databaseContext = null); + } +} diff --git a/Server/Util/TransactionResult.cs b/Server/Util/TransactionResult.cs new file mode 100644 index 00000000..7ce9b001 --- /dev/null +++ b/Server/Util/TransactionResult.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace reallife_gamemode.Server.Util +{ + public enum TransactionResult + { + SUCCESS, + SENDER_NO_BANKACCOUNT, + RECEIVER_NO_BANKACCOUNT, + SENDER_NOT_ENOUGH_MONEY, + NEGATIVE_MONEY_SENT + } +}