All pastes #2104287 Raw Edit

Stuff

public text v1 · immutable
#2104287 ·published 2012-01-20 06:32 UTC
rendered paste body
using System;
using System.Collections.Generic;
using System.Timers;

namespace IrcLib
{
    public class MessageBuffer
    {
        private List<string> m_buffer; 
        private int m_delay;
        private int m_linesPerSec;
        private int m_lineCount;
        private Timer m_timer;
        private DateTime m_timeNow;
        private DateTime m_lineDelay;

        public int QueuedMessages
        {
            get { return m_buffer.Count; }
        }

        public MessageBuffer(int buffersize, int timerInterval, int messageDelay, int maxLinesPerSecond)
        {
            m_buffer = new List<string>(buffersize);
            m_delay = messageDelay;
            m_linesPerSec = maxLinesPerSecond;

            m_timer = new Timer();
            m_timer.Interval = timerInterval;
            m_timer.Elapsed += OnTick;
            m_timer.AutoReset = true;
        }


        public void AddMessage(string text)
        {
            if(m_buffer.Count < m_buffer.Capacity)
            {
                m_buffer.Add(text);
                if(!m_timer.Enabled)
                {
                    m_timeNow = DateTime.Now;
                    m_lineDelay = DateTime.Now;
                    m_timer.Start();
                }
            }
        }

        public void ClearBuffer()
        {
            m_buffer.Clear();
        }

        private void OnTick(object sender, ElapsedEventArgs args)
        {
            if(m_buffer.Count > 0 && m_lineCount < m_linesPerSec)
            {
                SendMessage();
                m_lineCount++;
                m_timeNow = DateTime.Now;
            }
            else if((DateTime.Now - m_timeNow).TotalMilliseconds > m_delay)
            {
                SendMessage();
                m_timeNow = DateTime.Now;
            }
            else if(m_buffer.Count == 0 && m_lineCount > 0)
            {
                if((DateTime.Now - m_lineDelay).TotalSeconds > 1)
                {
                    m_lineCount--;
                    m_lineDelay = DateTime.Now;
                }
            }
            else if(m_buffer.Count == 0 && m_lineCount == 0)
            {
                m_timer.Stop();
            }
        }

        private void SendMessage()
        {
            for (int i = 0; i < m_buffer.Count; i++)
            {
                if (!string.IsNullOrWhiteSpace(m_buffer[i]))
                {
                    Console.WriteLine(m_buffer[i]);
                    m_buffer.RemoveAt(i);
                    break;
                }
            }
        }
    }
}