示例#1
0
        /// <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.");
            }
        }
示例#2
0
        /// <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");
        }