コード例 #1
0
ファイル: MessageHandler.cs プロジェクト: Zaharkov/Twitchie
        public void WriteRawMessage(string rawMessage, bool whisper = false, bool needWait = false)
        {
            var container = new MessageContainer(rawMessage);

            if (whisper)
            {
                Task.Run(() =>
                {
                    var added = false;
                    while (!IsCanSendWhisper(container, TokenSource.Token, ref added))
                        Thread.Sleep(1000);

                    TokenSource.Token.ThrowIfCancellationRequested();

                    WriteMessage(container);
                }, TokenSource.Token);

                return;
            }

            Action action = () =>
            {
                var added = false;
                while (!IsCanSendMessage(container, TokenSource.Token, needWait, ref added))
                    Thread.Sleep(1000);

                if (!needWait)
                    TokenSource.Token.ThrowIfCancellationRequested();

                WriteMessage(container);
            };

            if (needWait)
            {
                var task = Task.Run(action);
                task.Wait();
            }
            else
            {
                Task.Run(action, TokenSource.Token);
            }
        }
コード例 #2
0
ファイル: MessageHandler.cs プロジェクト: Zaharkov/Twitchie
        private static bool IsCanSendWhisper(MessageContainer messageContainer, CancellationToken token, ref bool added)
        {
            lock (LockForCheckWhisper)
            {
                if (!added)
                {
                    WhisperContainers.Add(messageContainer);
                    added = true;
                }

                if (token.IsCancellationRequested)
                {
                    WhisperContainers.Remove(messageContainer);
                    token.ThrowIfCancellationRequested();
                }

                var timeCheckSecond = DateTime.Now.AddSeconds(-1);
                var timeCheckMinute = DateTime.Now.AddSeconds(-60);
                var countSecond = 0;
                var countMinute = 0;
                var copy = WhisperContainers.ToList();

                foreach (var message in copy)
                {
                    if (message.Time > timeCheckSecond)
                        countSecond++;
                }

                foreach (var message in copy)
                {
                    if (message.Time > timeCheckMinute)
                        countMinute++;
                    else
                        WhisperContainers.Remove(message);
                }
                return countSecond < (int)WhisperLimit.PerSecond && countMinute < (int)WhisperLimit.PerMinute;
            }
        }
コード例 #3
0
ファイル: MessageHandler.cs プロジェクト: Zaharkov/Twitchie
 private void WriteMessage(MessageContainer messageContainer)
 {
     lock (LockForSend)
     {
         messageContainer.Time = DateTime.Now;
         _textWriter.WriteLine(messageContainer.Message);
         _textWriter.Flush();
     }
 }
コード例 #4
0
ファイル: MessageHandler.cs プロジェクト: Zaharkov/Twitchie
        private static bool IsCanSendMessage(MessageContainer messageContainer, CancellationToken token, bool needWait, ref bool added)
        {
            lock (LockForCheckMessage)
            {
                if (!added)
                {
                    MessageContainers.Add(messageContainer);
                    added = true;
                }

                if (token.IsCancellationRequested && !needWait)
                {
                    MessageContainers.Remove(messageContainer);
                    token.ThrowIfCancellationRequested();
                }

                var timeCheck = DateTime.Now.AddSeconds(-30);
                var count = 0;
                var copy = MessageContainers.ToList();

                foreach (var message in copy)
                {
                    if (message.Time > timeCheck)
                        count++;
                    else
                        MessageContainers.Remove(message);
                }

                return count < (int)GlobalMessageLimit;
            }
        }