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);
        }
Exemplo n.º 2
0
        public void OfferSelected(User user, ReceivedMessage message)
        {
            var splitted = message.Text.Split(' ');

            if (splitted.Length < 2)
            {
                goto SomethingWrong;
            }

            var action     = splitted[0];
            var itemName   = string.Join(" ", splitted.Skip(1));
            var itemManger = RoomBase.GetAllItems();
            var item       = itemManger.Keys()
                             .Select(id => itemManger.Get(id))
                             .SingleOrDefault(i => i != null && i.Name == itemName);

            if (item == null)
            {
                goto SomethingWrong;
            }

            var offers = Offers.Load();

            if (!offers.TryGetValue(item.Identifier, out var offer))
            {
                goto SomethingWrong;
            }

            var state = new BuySellState
            {
                SelectedItemId = item.Identifier
            };

            switch (action)
            {
            case "Продать":
            {
                state.Selling = true;
                break;
            }

            case "Купить":
            {
                state.Selling = false;
                break;
            }

            default:
                goto SomethingWrong;
            }

            Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));
            Room.SwitchAction <AuctionRoom.ItemOffersAction>(user);
            Room.GetAction <AuctionRoom.ItemOffersAction>().Enter(user);

            return;

SomethingWrong:
            Enter(user);
        }
Exemplo n.º 3
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));
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
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));
        }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
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);
        }
Exemplo n.º 8
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);
        }
Exemplo n.º 9
0
        public void ItemSelected(User user, ReceivedMessage message)
        {
            var splitted = message.Text.Split(' ');

            var    action = splitted[0];
            string itemName;

            if (action == "Не")
            {
                action  += " " + splitted[1];
                itemName = string.Join(" ", splitted.Skip(2));
            }
            else
            {
                itemName = string.Join(" ", splitted.Skip(1));
            }

            var itemMgr = RoomBase.GetAllItems();
            var item    = itemMgr.Keys().Select(id => itemMgr.Get(id)).SingleOrDefault(i => i?.Name == itemName);

            if (item == null)
            {
                goto SomethingWrong;
            }

            var offers = Offers.Load();

            offers.TryGetValue(item.Identifier, out var itemOffers);

            var sellOffer = itemOffers?.SellOffers.SingleOrDefault(o => o.UserId.Equals(user.Info.UserId));
            var buyOffer  = itemOffers?.SellOffers.SingleOrDefault(o => o.UserId.Equals(user.Info.UserId));

            switch (action)
            {
            case "Не покупать":
            {
                if (buyOffer == null)
                {
                    goto SomethingWrong;
                }

                user.Info.Gold += buyOffer.Price * buyOffer.Count;
                itemOffers.BuyOffers.Remove(buyOffer);
                break;
            }

            case "Не продавать":
            {
                if (sellOffer == null)
                {
                    goto SomethingWrong;
                }

                user.ItemManager.Add(new ItemInfo(sellOffer.ItemId, sellOffer.Count));
                itemOffers.SellOffers.Remove(sellOffer);
                break;
            }

            case "Купить":
            {
                if (buyOffer != null)
                {
                    goto SomethingWrong;
                }

                var state = new AddOfferState
                {
                    Selling              = false,
                    SelectedItemId       = item.Identifier,
                    MaxQuantityAvailable = int.MaxValue
                };

                Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));

                Room.SwitchAction <AuctionRoom.PriceGroupSelectionAction>(user);
                Room.GetAction <AuctionRoom.PriceGroupSelectionAction>().Enter(user);
                break;
            }

            case "Продать":
            {
                if (sellOffer != null)
                {
                    goto SomethingWrong;
                }

                var state = new AddOfferState
                {
                    Selling              = true,
                    SelectedItemId       = item.Identifier,
                    MaxQuantityAvailable = user.ItemManager.Get(item.Identifier)?.Count ?? 0
                };
                Room.GetRoomVariables(user).Set("state", StateContainer.Serialize(state));

                Room.SwitchAction <AuctionRoom.PriceGroupSelectionAction>(user);
                Room.GetAction <AuctionRoom.PriceGroupSelectionAction>().Enter(user);
                break;
            }

            default:
            {
                goto SomethingWrong;
            }
            }

            return;

SomethingWrong:
            Logger.Warn("Something went wrong when adding offer");
            Enter(user);
        }