/// <summary> /// Trades user points. If fail occurres, throws PointsException /// </summary> /// <param name="pointsToTrade"></param> /// <exception cref="PointsException">When user doesn't have enough points</exception> internal void Trade(long pointsToTrade, User sender, User target, string targetUsername) { if (sender.Points - pointsToTrade >= 0) { // User is able to trade sender.RemovePoints(pointsToTrade); if (target == null) { // Target is not online, trade into file _botDataManager.AddUserPointsToFile(targetUsername, pointsToTrade); } else { // User is online target.AddPoints(pointsToTrade); SaveData(); } } else { throw new PointsException("User can't trade this amount of points. User doesn't have enough points to trade."); } }
/// <summary> /// Method handling Points command distribution /// </summary> /// <param name="sender">User who sent the command</param> /// <param name="command">Command to execute</param> /// <param name="args">List of command arguments</param> /// <returns>String result</returns> private string PointsHandler(User sender, Command command, List <string> args) { switch (command.CommandHandlerType) { case CommandHandlerType.Info: // Get points info !med | 0 input args if (sender == null) { // Fail: 5 params: {0:Currency name} {1:Currency plural} {2:Currency units} {3:Number of points} {4:User to which add points} _logger.LogError("Failed to execute command {command}. Sender is null!", command.CommandFormat); return(string.Format(command.FailMessage, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits, "N/A", "N/A")); } // Success: 4 params: {0:User} {1:Total} {2:Currency plural} {3:Currency units} return(string.Format(command.SuccessMessage, sender.DisplayName, sender.Points, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits)); case CommandHandlerType.Add: // Add points, !addhoney 50 Bukk94 | 2 input args {0:Number of points} {1:User to which add points} User receiver = null; try { if (args.Count < 2) { throw new IndexOutOfRangeException($"Command {command.CommandFormat} should contain some arguments. Found {args.Count}."); } if (long.Parse(args[0]) <= 0) { // Can't add 0 or negative amount command.ResetCommandCooldown(); return(""); } receiver = _usersManager.FindOnlineUser(args[1]); if (receiver == null) { // user is not online _botDataManager.AddUserPointsToFile(args[1], long.Parse(args[0])); } else { receiver.AddPoints(long.Parse(args[0])); _usersManager.SaveData(); } _logger.LogInformation("Sucessfully added {total} points to {sender}.", args[0], args[1]); // Success: 4 params: {0:User} {1:Number of points} {2:Currency plural} {3:Currency units} return(string.Format(command.SuccessMessage, args[1], args[0], _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits)); } catch (Exception ex) { _logger.LogError("Critical error occurred during points addition.\n{ex}", ex); // Fail: 5 params: {0:Currency name} {1:Currency plural} {2:Currency units} {3:Number of points} {4:User to which add points} return(string.Format(command.FailMessage, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits, args[0], receiver != null ? receiver.DisplayName : args[1])); } case CommandHandlerType.Remove: //_Remove points, !removehoney 50 Bukk94 | 2 input args {0:Number of points} {1:User to which remove points} User targetUser = null; try { if (args.Count < 2) { throw new IndexOutOfRangeException($"Command {command.CommandFormat} should contain some arguments. Found {args.Count}."); } if (long.Parse(args[0]) <= 0) { // Can't remove 0 or negative amount command.ResetCommandCooldown(); return(""); } targetUser = _usersManager.FindOnlineUser(args[1]); if (targetUser == null) { // user is not online _botDataManager.RemoveUserPointsFromFile(args[1], long.Parse(args[0])); } else { targetUser.RemovePoints(long.Parse(args[0])); _usersManager.SaveData(); } _logger.LogInformation("Sucessfully removed {total} points from {sender}.", args[0], args[1]); // Success: 4 params: {0:User} {1:Number of points} {2:Currency plural} {3:Currency units} return(string.Format(command.SuccessMessage, args[1], args[0], _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits)); } catch (Exception ex) { _logger.LogError("Critical error occurred during points removal.\n{ex}", ex); // Fail: 5 params: {0:Currency name} {1:Currency plural} {2:Currency units} {3:Number of points} {4:User to which remove points} return(string.Format(command.FailMessage, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits, args[0], targetUser != null ? targetUser.DisplayName : args[1])); } case CommandHandlerType.Trade: // Trading, !trade {0} {1} | 2 input args {0:Number of points} {1:User to which trade points} try { if (args.Count < 2) { throw new IndexOutOfRangeException($"Command {command.CommandFormat} should contain some arguments. Found {args.Count}."); } if (sender == null) { throw new NullReferenceException("Something went wrong, sender is null"); } var target = _usersManager.FindOnlineUser(args[1]); if (sender.Username.Equals(target.Username)) { // User is trying to send points to himself command.ResetCommandCooldown(); return(""); } _usersManager.Trade(long.Parse(args[0]), sender, target, args[1]); _logger.LogInformation("{sender} successfully traded {count} points to {target}", sender.DisplayName, args[0], args[1]); // Success: 6 params: {0:User} {1:Target User} {2:Number of points} {3:Currency units} {4:Currency name} {4: Currency plural} return(string.Format(command.SuccessMessage, sender.DisplayName, target != null ? target.DisplayName : args[1], args[0], _pointsManager.CurrencyUnits, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural)); } catch (PointsException ex) { // Fail 5 params: {0:Currency name} {1:Currency plural} {2:Currency units} {3:Number of points} {4:User to which remove points} _logger.LogError("Error occurred during points trading.\n{ex}", ex); return(string.Format(command.FailMessage, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits, args[0], args[1])); } catch (Exception ex) { // Fail 5 params: {0:Currency name} {1:Currency plural} {2:Currency units} {3:Number of points} {4:User to which remove points} _logger.LogError("Critical error occurred during points trading.\n{ex}", ex); return(string.Format(command.ErrorMessage, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits, args[0], args[1])); } case CommandHandlerType.Gamble: try { if (args.Count < 1) { throw new IndexOutOfRangeException($"Command {command.CommandFormat} should contain some arguments. Found {args.Count}."); } if (sender == null) { throw new NullReferenceException("Something went wrong, sender is null"); } int gambleValue = int.Parse(args[0]); if (gambleValue > sender.Points) { throw new PointsException("User doesn't have enough points!"); } Random rand = new Random(Guid.NewGuid().GetHashCode()); int random = rand.Next(1, 100); // 99-100 - triple reward if (random > 100 - _botDataManager.BotSettings.GambleBonusWinPercentage) { sender.AddPoints(gambleValue * 3); _usersManager.SaveData(); return(string.Format(command.SuccessMessage, gambleValue * 3, _pointsManager.CurrencyUnits, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural)); } else if (random > 100 - _botDataManager.BotSettings.GambleWinPercentage - _botDataManager.BotSettings.GambleBonusWinPercentage) { // 79-98 - double reward sender.AddPoints(gambleValue * 2); _usersManager.SaveData(); return(string.Format(command.SuccessMessage, gambleValue * 2, _pointsManager.CurrencyUnits, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural)); } // User lost sender.RemovePoints(gambleValue); _usersManager.SaveData(); return(string.Format(command.FailMessage, args[0], _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits)); } catch (PointsException ex) { // Fail 4 params: {0: Number of points} {1:Currency Name} {2:Currency plural} {3:Currency units} _logger.LogError("Error occurred during gamble command.\n{ex}", ex); return(string.Format(command.ErrorMessage, args[0], _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits)); } catch (Exception ex) { _logger.LogError("Critical error occurred during gamble command.\n{ex}", ex); return(""); } } return("Unknown Points handler"); }