コード例 #1
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote == null)
            {
                return(false,
                       "Чтобы закрыть тотализатор, нужно его сначала создать :) например: `/tote new :coin: Кто своровал суп?`");
            }

            if (tote.State != ToteState.Started && tote.State != ToteState.Closed)
            {
                return(false, "Закрыть можно только запущенный тотализатор");
            }

            if (tote.Options.Length > 6)
            {
                return(false, "Нам в принципе не жалко и больше исходов хранить, но ты часом не наркоман ли?");
            }

            await _startTote.CloseAsync(tote.Id);

            await _slackResponse.ResponseWithText(cmd.ResponseUrl,
                                                  "Приём ставок закрыт! Теперь ожидай информации и закрывай тотализатор командой `/tote finish`", true);

            MessengerActor.Address.Tell(new UpdateToteReportsMessage(tote.Id));
            return(true, string.Empty);
        }
コード例 #2
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote == null)
            {
                return(false,
                       "Чтобы запустить тотализатор, нужно его сначала создать :) например: `/tote new :coin: Кто своровал суп?`");
            }

            if (tote.State != ToteState.Created)
            {
                return(false, "Запустить можно только новый созданный тотализатор");
            }

            if (tote.Options.Length < 2)
            {
                return(false,
                       "Для запуска нужно добавить хотя бы два варианта исхода для ставок, например `/tote add Президентом будет Владимир Путин.`");
            }

            if (tote.Options.Length > 50)
            {
                return(false, "Нам в принципе не жалко и болеее 50 исходов хранить, но ты часом не наркоман ли?");
            }

            await _startTote.StartAsync(tote.Id);

            await _slackResponse.ResponseWithText(cmd.ResponseUrl,
                                                  "Тотализатор запущен. Самое время прорекламировать его в каналах! Используй `/tote`. Потом закрывай приём ставок командой `/tote close`", true);

            return(true, string.Empty);
        }
コード例 #3
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote.State == ToteState.Created)
            {
                var option = cmd.Text.Substring(4).Trim();
                if (string.IsNullOrEmpty(option))
                {
                    return(false, "Формат команды: `/tote add Какой-то вариант на который можно делать ставку`");
                }

                if (tote.Options.Any(a => String.Equals(a.Name, option, StringComparison.InvariantCultureIgnoreCase)))
                {
                    return(false, "Не получится добавить два варианта с одинаковым названием. Но спасибо за тестирование.");
                }

                var ret = await _addToteOption.AddAsync(tote, option);

                var response = LongMessagesToUser.ToteDetails(ret);
                await _slackResponse.ResponseWithBlocks(cmd.ResponseUrl, response, false);

                return(true, string.Empty);
            }

            return(false, "Добавлять варианты можно только пока тотализатор создан, но не запущен");
        }
コード例 #4
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote != null && (tote.State == ToteState.Created || tote.State == ToteState.Started))
            {
                return(false,
                       "Сначала нужно завершить текущий тотализатор. Нам просто слишком лениво обрабатывать много тотализаторов одновременно, сорян");
            }

            var rest  = cmd.Text.Substring(3).Trim();
            var parts = rest.Split(" ");

            if (parts.Length > 1)
            {
                var currency = _app.Value.LimitToDefaultCurrency ? _app.Value.DefaultCurrency : CommandsPartsParse.FindCurrency(parts, _app.Value.DefaultCurrency);

                if (!_app.Value.LimitToDefaultCurrency && string.IsNullOrEmpty(currency))
                {
                    return(false,
                           "Не понял в какой валюте запускать тотализатор. Пример запуска: `/tote new :currency: Кого уволят первым?`, где :currency: - любой тип монеток, существующий у пользователей на руках, например :coin:.");
                }

                rest = rest.Substring(rest.IndexOf(currency, StringComparison.OrdinalIgnoreCase) + currency.Length)
                       .Trim();

                if (string.IsNullOrEmpty(rest))
                {
                    return(false,
                           "Для старта тотализатора обязательно укажи его название. Например: `/tote new :currency: Кто победит в поедании печенек на скорость?`, где :currency: - любой тип монеток, существующий у пользователей на руках.");
                }

                var newTote = await _createNewTote.CreateNewAsync(cmd.UserId, currency, rest);

                var response = LongMessagesToUser.ToteDetails(newTote);
                await _slackResponse.ResponseWithBlocks(cmd.ResponseUrl, response, false);

                return(true, string.Empty);
            }

            return(false,
                   "Для старта тотализатора обязательно укажи вид монет и его название. Например: `/tote new :currency: Кто победит в поедании печенек на скорость?`, где :currency: - любой тип монеток, существующий у пользователей на руках.");
        }
コード例 #5
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote == null)
            {
                return(false,
                       "Чтобы отменить тотализатор, нужно его сначала создать и запустить :) например: `/tote new :coin: Кто своровал суп?`");
            }

            if (tote.State == ToteState.Finished)
            {
                return(false, "Уже завершённый тотализатор отменить никак нельзя");
            }

            await _cancelTote.CancelAsync(tote.Id);

            TotesActor.Address.Tell(new ToteCancelledMessage(tote.Id));
            return(true, "Аукцион отменён, начинаем отправку ставок обратно");
        }
コード例 #6
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote == null)
            {
                return(false, "Команда /tote без параметров публикует в канале информацию о тотализаторе. Для этого тотализатор нужно сначала создать. Смотри `/tote help`.");
            }

            if (cmd.Context.Type == ChannelType.Direct)
            {
                await _slackResponse.ResponseWithBlocks(cmd.ResponseUrl, LongMessagesToUser.ToteDetails(tote), false);
            }
            else
            {
                TotesActor.Address.Tell(new ToteStatusMessage(cmd.Context, tote));
            }

            return(true, string.Empty);
        }
コード例 #7
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote.State == ToteState.Created)
            {
                if (int.TryParse(cmd.Text.Substring(6).Trim(), out var option))
                {
                    return(false,
                           "Формат команды: `/tote remove <number>`, где number - порядковый номер варианта");
                }

                var ret = await _removeToteOption.RemoveAsync(tote, option);

                var response = LongMessagesToUser.ToteDetails(ret);
                await _slackResponse.ResponseWithBlocks(cmd.ResponseUrl, response, true);

                return(true, string.Empty);
            }

            return(false, "Удалять варианты можно только пока тотализатор создан, но не запущен");
        }
コード例 #8
0
        public async Task <(bool result, string response)> Process(SlackTextCommand cmd)
        {
            var tote = await _getCurrentTote.GetAsync(cmd.UserId);

            if (tote == null)
            {
                return(false, "Чтоб завершить тотализатор, надо его сначала создать");
            }

            if (tote.State != ToteState.Started && tote.State != ToteState.Closed)
            {
                return(false, $"Завершить можно только закрытый или запущенный тотализатор, сейчас {tote.State}");
            }

            if (tote.Owner != cmd.UserId)
            {
                return(false, "Завершить можно только свой тотализатор");
            }

            await _slack.PostAsync(new BlocksMessage(LongMessagesToUser.ToteFinishButtons(tote), cmd.UserId));

            return(true, "Отправляем меню для выбора победителя");
        }