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