rendered paste bodyusing 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;
}
}
}
}
}