コード例 #1
0
ファイル: HeistManager.cs プロジェクト: EvanQuan/Chubberino
        private void JoinHeist(ChatMessage message, Player player, IApplicationContext context)
        {
            if (!OngoingHeists.TryGetValue(message.Channel, out IHeist heist))
            {
                Client.SpoolMessageAsMe(message.Channel, player, Messages.NoHeistExists);
                return;
            }

            String strippedCommand = message.Message.GetNextWord(out _).GetNextWord(out _);

            if (String.IsNullOrWhiteSpace(strippedCommand))
            {
                Client.SpoolMessageAsMe(message.Channel, player, Messages.HowToJoin);
                return;
            }

            strippedCommand.GetNextWord(out String proposedWager);

            if (proposedWager.TryGetWager(out var wager))
            {
                heist.UpdateWager(context, player, wager);
                return;
            }

            Client.SpoolMessageAsMe(message.Channel, player, Messages.InvalidWager.Format(proposedWager));
        }
コード例 #2
0
ファイル: HeistManager.cs プロジェクト: EvanQuan/Chubberino
        public void LeaveAllHeists(IApplicationContext context, Player player)
        {
            IEnumerable <IHeist> heists = OngoingHeists
                                          .Where(x => x.Value.Wagers.Any(x => x.PlayerTwitchID == player.TwitchUserID))
                                          .Select(x => x.Value);

            foreach (var heist in heists)
            {
                heist.UpdateWager(context, player, p => 0, silent: true);
            }
        }
コード例 #3
0
ファイル: HeistManager.cs プロジェクト: EvanQuan/Chubberino
        private void InitiateNewHeist(ChatMessage message)
        {
            using var context = ContextFactory.GetContext();

            var player = context.GetPlayer(Client, message);

            // Trying to initiate new heist
            var now = DateTime.Now;

            var oldLastHeistInitiated = player.LastHeistInitiated;

            var timeSinceLastHeistInitiated = now - oldLastHeistInitiated;

            if (timeSinceLastHeistInitiated >= HeistCooldown)
            {
                // Update last heist initiated to prevent initiating
                // multiple heists in multiple channels.
                player.LastHeistInitiated = now;
                context.SaveChanges();

                var heist = new Heist(message, Random, Client);
                OngoingHeists.TryAdd(message.Channel, heist);

                Client.SpoolMessageAsMe(message.Channel, player,
                                        Messages.NewHeistInitiated.Format(HeistWaitTime.Format()));


                // Join the heist in a separate thread so that the heist
                // countdown can start immediately as the join is being
                // processed. This should only save around a second or so of
                // time.
                Task.Run(() => JoinHeist(message, player, context));

                // Since we are sleeping, this needs to be async.
                ThreadService.Sleep(HeistWaitTime);

                if (!heist.Start(context))
                {
                    // No one joined the heist. Let the user initiate another heist.
                    player.LastHeistInitiated = oldLastHeistInitiated;
                    context.SaveChanges();
                }

                OngoingHeists.TryRemove(message.Channel, out _);
                return;
            }

            var timeUntilNextHeistAvailable = HeistCooldown - timeSinceLastHeistInitiated;

            var timeToWait = timeUntilNextHeistAvailable.Format();

            Client.SpoolMessageAsMe(message.Channel, player,
                                    Messages.Wait.Format(timeToWait, Random.NextElement(EmoteManager.Get(message.Channel, EmoteCategory.Waiting))));
        }
コード例 #4
0
ファイル: HeistManager.cs プロジェクト: EvanQuan/Chubberino
        public void Heist(ChatMessage message)
        {
            using var context = ContextFactory.GetContext();

            var player = context.GetPlayer(Client, message);

            // Find if there's another ongoing heist in this channel to join.
            if (OngoingHeists.TryGetValue(message.Channel, out IHeist currentHeist))
            {
                JoinHeist(message, player, context);
                return;
            }

            // Run in a separate thread as it involves sleeping to wait for joiners.
            Task.Run(() => InitiateNewHeist(message));
        }