public void Fallback(User user, ReceivedMessage message)
        {
            var priceGroups = Math.GetPrices().ToList();
            var splitted    = message.Text.Split('—');

            if (splitted.Length == 2 && int.TryParse(splitted[0], out var beginning))
            {
                for (var i = 0; i < priceGroups.Count; i++)
                {
                    if (priceGroups[i].Item1 != beginning)
                    {
                        continue;
                    }

                    var state = StateContainer.Deserialize <AddOfferState>(
                        Room.GetRoomVariables(user).Get <VariableContainer>("state")
                        );
                    state.SelectedPriceGroup = i;
                    Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));
                    Room.SwitchAction <AuctionRoom.PriceSelectionAction>(user);
                    Room.GetAction <AuctionRoom.PriceSelectionAction>().Enter(user);
                    return;
                }
            }

            Enter(user);
        }
예제 #2
0
        public void OfferSelected(User user, ReceivedMessage message)
        {
            var state = StateContainer.Deserialize <BuySellState>(
                Room.GetRoomVariables(user).Get <VariableContainer>("state")
                );
            var offers = Offers.Load();

            var(itemOffers, _) = GetOffers(offers, state);
            if (state.SelectedItemCount == null)
            {
                // Selecting price1
                if (!decimal.TryParse(message.Text, out var price))
                {
                    Enter(user);
                    return;
                }

                var matchingOffers = itemOffers.Where(o => o.Price == price).ToList();
                state.SelectedItemCount = matchingOffers.Select(o => o.Count).Sum();
                state.SelectedItemPrice = price;
                Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));
                Room.SendMessage(user,
                                 $"Введите количество предметов (от 0 до {state.SelectedItemCount})",
                                 new[] { new[] { "0" } });
            }
            else
            {
                // Selecting count
                if (!int.TryParse(message.Text, out var count) || count < 0 || count > state.SelectedItemCount)
                {
                    Room.SendMessage(user,
                                     $"Введите количество предметов (от 0 до {state.SelectedItemCount})",
                                     new[] { new[] { "0" } });
                    return;
                }

                if (count == 0)
                {
                    // Looks like cancel
                    Back(user, message);
                    return;
                }

                var matchingOffers = itemOffers
                                     .Where(o => o.Price == state.SelectedItemPrice)
                                     .OrderBy(o => o.Created)
                                     .ToList();

                var buyedCount = Buy(matchingOffers, user, count);
                Room.SendMessage(user, $"Вы купили {buyedCount} штук!");

                offers.Save();
                Back(user, message);
            }

            Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));
        }
예제 #3
0
        public void Fallback(User user, ReceivedMessage message)
        {
            if (int.TryParse(message.Text, out var quantity))
            {
                var state = StateContainer.Deserialize <AddOfferState>(
                    Room.GetRoomVariables(user).Get <VariableContainer>("state")
                    );
                if (quantity <= state.MaxQuantityAvailable && quantity >= 0)
                {
                    state.QuantitySelected = quantity;
                    Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));

                    if (state.QuantitySelected != 0)
                    {
                        var offers = Offers.Load();
                        if (!offers.TryGetValue(state.SelectedItemId, out var itemOffers))
                        {
                            itemOffers = new ItemOffer(new List <Offer>(), new List <Offer>());
                            offers[state.SelectedItemId] = itemOffers;
                        }

                        var offer = new Offer(
                            user.Info.UserId,
                            state.SelectedItemPrice,
                            state.QuantitySelected,
                            DateTimeOffset.Now,
                            state.SelectedItemId
                            );

                        if (state.Selling)
                        {
                            if (user.ItemManager.Remove(new ItemInfo(offer.ItemId, offer.Count)))
                            {
                                itemOffers.SellOffers.Add(offer);
                            }
                        }
                        else
                        {
                            if (user.Info.TryDecreaseGold(state.SelectedItemPrice * state.QuantitySelected))
                            {
                                itemOffers.BuyOffers.Add(offer);
                            }
                        }

                        offers.Save();
                    }

                    Room.SwitchAction <AuctionRoom.AddOfferAction>(user);
                    Room.GetAction <AuctionRoom.AddOfferAction>().Enter(user);
                    return;
                }
            }

            // Something wrong
            Enter(user);
        }
예제 #4
0
        public void Enter(User user)
        {
            var state = StateContainer.Deserialize <AddOfferState>(
                Room.GetRoomVariables(user).Get <VariableContainer>("state")
                );
            // TODO: Calculate maxValue here, not in AddOfferAction
            var maxValue = state.MaxQuantityAvailable == int.MaxValue ? "∞" : state.MaxQuantityAvailable.ToString();

            Room.SendMessage(user, $"Теперь введите количество (не больше {maxValue})", Room.GetButtons(user));
        }
예제 #5
0
        public void Enter(User user)
        {
            var state = StateContainer.Deserialize <AddOfferState>(
                Room.GetRoomVariables(user).Get <VariableContainer>("state")
                );
            var prices = Math.GetSubPrices(state.SelectedPriceGroup)
                         .OrderBy(x => x)
                         .Select(x => new[] { x.ToString() })
                         .Concat(new[] { new[] { "Назад" } })
                         .ToArray();

            Room.SendMessage(user, "Выберите стоимость из списка", prices);
        }
예제 #6
0
        public void Fallback(User user, ReceivedMessage message)
        {
            var state = StateContainer.Deserialize <AddOfferState>(
                Room.GetRoomVariables(user).Get <VariableContainer>("state")
                );
            var prices = Math.GetSubPrices(state.SelectedPriceGroup).ToList();

            if (int.TryParse(message.Text, out var price) && prices.Contains(price))
            {
                state.SelectedItemPrice = price;
                Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));
                Room.SwitchAction <AuctionRoom.QuantitySelectionAction>(user);
                Room.GetAction <AuctionRoom.QuantitySelectionAction>().Enter(user);
                return;
            }

            Enter(user);
        }
예제 #7
0
        public void Enter(User user)
        {
            var state = StateContainer.Deserialize <BuySellState>(
                Room.GetRoomVariables(user).Get <VariableContainer>("state")
                );

            var(itemOffers, itemName) = GetOffers(Offers.Load(), state);
            if (itemOffers == null || itemName == null)
            {
                Back(user, null);
                return;
            }

            var prices = new SortedDictionary <decimal, List <int> >();

            foreach (var offer in itemOffers.OrderBy(o => o.Created))
            {
                if (prices.TryGetValue(offer.Price, out var price))
                {
                    price.Add(offer.Count);
                }
                else
                {
                    prices[offer.Price] = new List <int> {
                        offer.Count
                    };
                }
            }

            var messageOffers = string.Join("\n", prices.Select(
                                                kv => $"{kv.Key} золота: {string.Join("+", kv.Value.OrderBy(i => i))} шт."
                                                ));
            var message = $"<b>{itemName}</b>\n{messageOffers}";

            var buttons = prices
                          .Select(kv => new[] { kv.Key.Format() })
                          .Concat(new[] { new[] { "Назад" } })
                          .ToArray();

            Room.SendMessage(user, message, buttons);
        }