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)); }
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)); }
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); } }
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; } }
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}")); } }