Пример #1
0
        public DougResponse Give(Command command)
        {
            var amount = int.Parse(command.GetArgumentAt(1));

            if (amount <= 0)
            {
                return(new DougResponse(DougMessages.InvalidAmount));
            }

            if (!command.IsUserArgument())
            {
                return(new DougResponse(DougMessages.InvalidUserArgument));
            }

            var user   = _userRepository.GetUser(command.UserId);
            var target = _userRepository.GetUser(command.GetTargetUserId());

            if (!user.HasEnoughCreditsForAmount(amount))
            {
                return(new DougResponse(user.NotEnoughCreditsForAmountResponse(amount)));
            }

            _creditsRepository.RemoveCredits(user.Id, amount);
            _creditsRepository.AddCredits(target.Id, amount);

            var message = string.Format(DougMessages.UserGaveCredits, _userService.Mention(user), amount, _userService.Mention(target));

            _slack.BroadcastMessage(message, command.ChannelId);

            return(NoResponse);
        }
Пример #2
0
        public DougResponse Gamble(Command command)
        {
            var user   = _userRepository.GetUser(command.UserId);
            var amount = int.Parse(command.GetArgumentAt(0));

            if (amount < 0)
            {
                return(new DougResponse(DougMessages.InvalidAmount));
            }

            if (!user.HasEnoughCreditsForAmount(amount))
            {
                return(new DougResponse(user.NotEnoughCreditsForAmountResponse(amount)));
            }

            var cost   = (int)Math.Ceiling(amount / 10.0);
            var energy = user.Energy - cost;

            if (energy < 0)
            {
                return(new DougResponse(DougMessages.NotEnoughEnergy));
            }

            _statsRepository.UpdateEnergy(command.UserId, energy);

            string baseMessage;

            if (UserCoinFlipWin(user))
            {
                baseMessage = DougMessages.WonGamble;
                _creditsRepository.AddCredits(command.UserId, amount);
            }
            else
            {
                baseMessage = DougMessages.LostGamble;
                _creditsRepository.RemoveCredits(command.UserId, amount);
            }

            var message = string.Format(baseMessage, _userService.Mention(user), amount);

            _slack.BroadcastMessage(message, command.ChannelId);

            return(NoResponse);
        }
Пример #3
0
        public override int OnCriticalHit(User attacker, ICombatable target, int damage, string channel)
        {
            var min     = (int)Math.Floor(damage * 0.01);
            var max     = (int)Math.Ceiling(damage * 0.05);
            var amount  = Math.Max(1, new Random().Next(min, max));
            var message = string.Format(DougMessages.GainedCredit, amount);

            _creditsRepository.AddCredits(attacker.Id, amount);
            _slack.SendEphemeralMessage(message, attacker.Id, channel);

            return(base.OnCriticalHit(attacker, target, damage, channel));
        }
Пример #4
0
        public DougResponse AddSlur(Command command)
        {
            var existingSlur = _slurRepository.GetSlurByText(command.Text);

            if (existingSlur != null)
            {
                return(new DougResponse(DougMessages.SlurAlreadyExists));
            }

            var slur = new Slur(command.Text, command.UserId);

            _slurRepository.AddSlur(slur);

            _creditsRepository.AddCredits(command.UserId, AddSlurCredit);

            return(new DougResponse(string.Format(DougMessages.GainedCredit, AddSlurCredit)));
        }
Пример #5
0
        public DougResponse Sell(User user, int position)
        {
            var item = user.InventoryItems.SingleOrDefault(itm => itm.InventoryPosition == position)?.Item;

            if (item == null)
            {
                return(new DougResponse(string.Format(DougMessages.NoItemInSlot, position)));
            }

            if (!item.IsSellable)
            {
                return(new DougResponse(DougMessages.ItemNotTradable));
            }

            _inventoryRepository.RemoveItem(user, position);

            _creditsRepository.AddCredits(user.Id, item.Price / 2);

            return(new DougResponse(string.Format(DougMessages.SoldItem, item.GetDisplayName(), item.Price / 2)));
        }
Пример #6
0
        private async Task <DougResponse> StealFromUser(User user, User target, string channel)
        {
            _statsRepository.SetSkillCooldown(user.Id, TimeSpan.FromSeconds(Cooldown));

            var userChance   = _eventDispatcher.OnStealingChance(user, user.BaseStealSuccessRate());
            var targetChance = _eventDispatcher.OnGettingStolenChance(target, target.BaseOpponentStealSuccessRate());

            var rollSuccessful = _randomService.RollAgainstOpponent(userChance, targetChance);
            var detected       = !_randomService.RollAgainstOpponent(user.BaseDetectionAvoidance(), target.BaseDetectionChance());

            var amount = _eventDispatcher.OnStealingAmount(user, user.BaseStealAmount());

            if (target.Credits - amount < 0)
            {
                amount = target.Credits;
            }

            string       message;
            DougResponse sneakResponse;

            if (rollSuccessful)
            {
                _creditsRepository.RemoveCredits(target.Id, amount);
                _creditsRepository.AddCredits(user.Id, amount);

                message       = string.Format(DougMessages.StealCreditsCaught, _userService.Mention(user), amount, _userService.Mention(target));
                sneakResponse = new DougResponse(string.Format(DougMessages.StealCredits, amount, _userService.Mention(target)));
            }
            else
            {
                message       = string.Format(DougMessages.StealFailCaught, _userService.Mention(user), _userService.Mention(target));
                sneakResponse = new DougResponse(string.Format(DougMessages.StealFail, _userService.Mention(target)));
            }

            if (detected)
            {
                await _slack.BroadcastMessage(message, channel);
            }

            return(sneakResponse);
        }