예제 #1
0
        private async Task HandleToteFinish(ToteFinishedMessage msg)
        {
            var tote = await _getTote.GetAsync(msg.ToteId);

            if (tote.State != ToteState.Started && tote.State != ToteState.Closed)
            {
                MessengerActor.Send(new MessageToChannel(msg.UserId,
                                                         "Чот не получается завершить тотализатор. А ты случаем не жулик?"));
                return;
            }

            await _finishTote.FinishAsync(tote.Id);

            var rewards = _rewardsLogic.CalcRewards(tote, msg.OptionId);

            foreach (var reward in rewards.ProportionalReward)
            {
                LedgerActor.Address.Tell(new ValidatedTransferMessage(tote.AccountId(), reward.Account.UserId, reward.Amount,
                                                                      tote.Currency,
                                                                      $"Поздравляем! Тотализатор \"{tote.Description}\" завершён, вот законный выигрыш!",
                                                                      false, $"(Тотализатор *{tote.Description}*)"));
            }

            LedgerActor.Address.Tell(new ValidatedTransferAllFundsMessage(tote.AccountId(), tote.Owner, tote.Currency,
                                                                          "Ваше вознаграждение за проведённый тотализатор!", $"(Тотализатор *{tote.Description}*)"));
            MessengerActor.Address.Tell(new UpdateToteReportsMessage(tote.Id));
            MessengerActor.Address.Tell(new ToteWinnersLoosersReportMessage(rewards, tote));
        }
예제 #2
0
        private async Task HandlePlaceBet(TotePlaceBetMessage msg)
        {
            var sw   = new Stopwatch();
            var tote = await _getTote.GetAsync(msg.ToteId);

            if (tote.State != ToteState.Started)
            {
                MessengerActor.Send(new MessageToChannel(msg.User,
                                                         "В тотализатор на данном этапе невозможно сделать ставку"));
                return;
            }
            if (msg.User == tote.Owner)
            {
                MessengerActor.Send(new MessageToChannel(msg.User,
                                                         "Не разрешать организатору ставить на своём тотализаторе нас научил Рррроман."));
                return;
            }
            if (string.IsNullOrEmpty(msg.OptionId))
            {
                MessengerActor.Send(new MessageToChannel(msg.User,
                                                         "Чтоб сделать ставку нужно выбрать один вариант исхода."));
                return;
            }

            if (msg.Amount <= 0.01m)
            {
                MessengerActor.Send(new MessageToChannel(msg.User,
                                                         "Мы принимаем только ставки, начиная с нищебродского 0.01"));
                return;
            }


            sw.Start();
            var resp = await LedgerActor.Address.Ask <List <AccountWithAmount> >(new GetAccountBalanceRequestMessage { UserId = msg.User, Currency = tote.Currency });

            sw.Stop();
            _logger.LogInformation($"PlaceBet Took {sw.ElapsedMilliseconds}ms");
            if (resp.Count == 0 || resp[0].Amount < msg.Amount)
            {
                MessengerActor.Send(new MessageToChannel(msg.User,
                                                         $"Печально, но на твоём счёте нет столько {tote.Currency} :("));
                return;
            }


            await _addBetToTote.AddAsync(tote.Id, msg.OptionId, msg.User, msg.Amount);

            LedgerActor.Address.Tell(new ValidatedTransferMessage(msg.User, tote.AccountId(), msg.Amount, tote.Currency,
                                                                  "Ставка на тотализатор", true));
            MessengerActor.Send(new MessageToChannel(msg.User,
                                                     $"Ваша ставка в количестве {tote.Currency}{msg.Amount} отправлена на счёт тотализатора!"));
            MessengerActor.Address.Tell(new UpdateToteReportsMessage(tote.Id));
        }
예제 #3
0
        private async Task HandleToss(TossACoinMessage msg)
        {
            if (msg.Amount <= 0 && !msg.TossAll)
            {
                await _slackResponse.ResponseWithText(msg.ResponseUrl,
                                                      "Гоблины в растерянности и не умеют переводить такие суммы.");

                return;
            }

            var toUser = msg.ToUser;

            if (msg.FromUser == toUser)
            {
                await _slackResponse.ResponseWithText(msg.ResponseUrl,
                                                      "Мы конечно можем взять монетки из твоего хранилища и положить их обратно... Ну хорошо. Вжуууух! Сделано!");

                return;
            }

            var resp = await _getUserBalance.GetAsync(_currentPeriod.Period, msg.FromUser, msg.Currency, false);

            var userAccount = resp.Count == 0 ? 0 : resp[0].Amount;
            var amount      = msg.TossAll ? userAccount : msg.Amount;

            if (userAccount < amount || userAccount == 0)
            {
                await _slackResponse.ResponseWithText(msg.ResponseUrl,
                                                      $":cry: печально, но на счетах твоих нет столько ({amount}) {msg.Currency}.\nПроверить баланс можно командой /balance.",
                                                      true);
            }
            else
            {
                Address.Tell(new ValidatedTransferMessage(msg.FromUser, msg.ToUser, amount, msg.Currency,
                                                          msg.Comment));
                var reply = $"Запрос выполнен, {msg.Currency}{amount} отправлены пользователю <@{toUser}>";
                if (!string.IsNullOrEmpty(msg.Comment))
                {
                    reply += $" с комментарием {msg.Comment}";
                }

                MessengerActor.Send(new MessageToChannel(msg.FromUser,
                                                         $"Ваш перевод на {msg.Currency}{amount} выполнен. {msg.Comment}"));
                await _slackResponse.ResponseWithText(msg.ResponseUrl, reply);
            }
        }
예제 #4
0
        private async Task TransferToUser(ValidatedTransferMessage msg)
        {
            _logger.LogInformation("Got Transfer {command}", JsonConvert.SerializeObject(msg));
            try
            {
                await _toss.TransferAsync(_currentPeriod.Period, msg.FromAccount, msg.ToAccount, msg.Amount, msg.Currency);

                if (!msg.ToServiceAccount)
                {
                    var fromUserCaption = msg.FromUserCaption ?? $"<@{msg.FromAccount}>";
                    var ann             = new StringBuilder();
                    var hoho            = new StringBuilder();
                    hoho.AppendLine("Привет!")
                    .AppendLine("День перестал быть томным, лови монетки!")
                    .AppendLine($"Перевод {msg.Currency}{msg.Amount} от {fromUserCaption}.");
                    ann.AppendLine($"<@{msg.ToAccount}> получил {msg.Amount}{msg.Currency} {msg.Comment}");
                    if (!string.IsNullOrEmpty(msg.Comment))
                    {
                        hoho.AppendLine("Комментарий к переводу:")
                        .Append(">")
                        .AppendLine(msg.Comment);
                    }

                    hoho.AppendLine()
                    .AppendLine("Что можно сделать с монетками:")
                    .AppendLine("`/balance` - посмотреть свой баланс")
                    .AppendLine("`/toss` - передать другому пользователю")
                    .AppendLine("`/tote` - сказочно разбогатеть с тотализатором")
                    .AppendLine("Всё в твоих руках!");
                    MessengerActor.Send(new MessageToChannel(msg.ToAccount, hoho.ToString()));
                    if (!_slackCfg.Value.Admins.Contains(msg.ToAccount) && _slackCfg.Value.Admins.Contains(msg.FromAccount))
                    {
                        MessengerActor.Send(new MessageToChannel(_app.Value.AnnouncementsChannelId, ann.ToString()));
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error tossing");
                throw;
            }
        }
예제 #5
0
        private async Task HandleNegativePromo(PromoTransferMessage msg)
        {
            var resp = await _getUserBalance.GetAsync(_currentPeriod.Period, msg.ToUser, msg.Currency, false);

            var userAccount = resp.Count == 0 ? 0 : resp[0].Amount;

            var amount = Math.Abs(msg.Amount);

            if (userAccount < amount || userAccount == 0)
            {
                await _slackResponse.ResponseWithText(msg.ResponseUrl,
                                                      $"Повезло! Было бы у тебя нужное количество монет - они бы пропали :)",
                                                      true);
            }
            else
            {
                Address.Tell(new ValidatedTransferMessage(msg.ToUser, msg.FromUser, amount, msg.Currency,
                                                          "Промокоды бывают не очень-то хорошими!"));
                MessengerActor.Send(new MessageToChannel(msg.ToUser, $"Промокод промокоду рознь, прости, но этот - не самый удачный. Вжух и {amount}{msg.Currency} сгорают."));
                MessengerActor.Send(new MessageToChannel(_app.Value.AnnouncementsChannelId, $"<@{msg.ToUser}> нашёл чооорный промокод `{msg.Code}` и *теряет* {amount}{msg.Currency}"));
            }
        }