Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -0,0 +1,387 @@
using System;
using System.Collections;
namespace Server.Engines.Reports
{
public enum BarGraphRenderMode
{
Bars,
Lines
}
public class BarGraph : Chart
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("bg", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new BarGraph();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private int m_Ticks;
private BarGraphRenderMode m_RenderMode;
private string m_xTitle;
private string m_yTitle;
private int m_FontSize = 7;
private int m_Interval = 1;
private BarRegion[] m_Regions;
public int Ticks
{
get
{
return this.m_Ticks;
}
set
{
this.m_Ticks = value;
}
}
public BarGraphRenderMode RenderMode
{
get
{
return this.m_RenderMode;
}
set
{
this.m_RenderMode = value;
}
}
public string xTitle
{
get
{
return this.m_xTitle;
}
set
{
this.m_xTitle = value;
}
}
public string yTitle
{
get
{
return this.m_yTitle;
}
set
{
this.m_yTitle = value;
}
}
public int FontSize
{
get
{
return this.m_FontSize;
}
set
{
this.m_FontSize = value;
}
}
public int Interval
{
get
{
return this.m_Interval;
}
set
{
this.m_Interval = value;
}
}
public BarRegion[] Regions
{
get
{
return this.m_Regions;
}
set
{
this.m_Regions = value;
}
}
public BarGraph(string name, string fileName, int ticks, string xTitle, string yTitle, BarGraphRenderMode rm)
{
this.m_Name = name;
this.m_FileName = fileName;
this.m_Ticks = ticks;
this.m_xTitle = xTitle;
this.m_yTitle = yTitle;
this.m_RenderMode = rm;
}
private BarGraph()
{
}
public override void SerializeAttributes(PersistenceWriter op)
{
base.SerializeAttributes(op);
op.SetInt32("t", this.m_Ticks);
op.SetInt32("r", (int)this.m_RenderMode);
op.SetString("x", this.m_xTitle);
op.SetString("y", this.m_yTitle);
op.SetInt32("s", this.m_FontSize);
op.SetInt32("i", this.m_Interval);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
base.DeserializeAttributes(ip);
this.m_Ticks = ip.GetInt32("t");
this.m_RenderMode = (BarGraphRenderMode)ip.GetInt32("r");
this.m_xTitle = Utility.Intern(ip.GetString("x"));
this.m_yTitle = Utility.Intern(ip.GetString("y"));
this.m_FontSize = ip.GetInt32("s");
this.m_Interval = ip.GetInt32("i");
}
public static int LookupReportValue(Snapshot ss, string reportName, string valueName)
{
for (int j = 0; j < ss.Children.Count; ++j)
{
Report report = ss.Children[j] as Report;
if (report == null || report.Name != reportName)
continue;
for (int k = 0; k < report.Items.Count; ++k)
{
ReportItem item = report.Items[k];
if (item.Values[0].Value == valueName)
return Utility.ToInt32(item.Values[1].Value);
}
break;
}
return -1;
}
public static BarGraph DailyAverage(SnapshotHistory history, string reportName, string valueName)
{
int[] totals = new int[24];
int[] counts = new int[24];
int min = history.Snapshots.Count - (7 * 24); // averages over one week
if (min < 0)
min = 0;
for (int i = min; i < history.Snapshots.Count; ++i)
{
Snapshot ss = history.Snapshots[i];
int val = LookupReportValue(ss, reportName, valueName);
if (val == -1)
continue;
int hour = ss.TimeStamp.TimeOfDay.Hours;
totals[hour] += val;
counts[hour]++;
}
BarGraph barGraph = new BarGraph("Hourly average " + valueName, "graphs_" + valueName.ToLower() + "_avg", 10, "Time", valueName, BarGraphRenderMode.Lines);
barGraph.m_FontSize = 6;
for (int i = 7; i <= totals.Length + 7; ++i)
{
int val;
if (counts[i % totals.Length] == 0)
val = 0;
else
val = (totals[i % totals.Length] + (counts[i % totals.Length] / 2)) / counts[i % totals.Length];
int realHours = i % totals.Length;
int hours;
if (realHours == 0)
hours = 12;
else if (realHours > 12)
hours = realHours - 12;
else
hours = realHours;
barGraph.Items.Add(hours + (realHours >= 12 ? " PM" : " AM"), val);
}
return barGraph;
}
public static BarGraph Growth(SnapshotHistory history, string reportName, string valueName)
{
BarGraph barGraph = new BarGraph("Growth of " + valueName + " over time", "graphs_" + valueName.ToLower() + "_growth", 10, "Time", valueName, BarGraphRenderMode.Lines);
barGraph.FontSize = 6;
barGraph.Interval = 7;
DateTime startPeriod = history.Snapshots[0].TimeStamp.Date + TimeSpan.FromDays(1.0);
DateTime endPeriod = history.Snapshots[history.Snapshots.Count - 1].TimeStamp.Date;
ArrayList regions = new ArrayList();
DateTime curDate = DateTime.MinValue;
int curPeak = -1;
int curLow = 1000;
int curTotl = 0;
int curCont = 0;
int curValu = 0;
for (int i = 0; i < history.Snapshots.Count; ++i)
{
Snapshot ss = history.Snapshots[i];
DateTime timeStamp = ss.TimeStamp;
if (timeStamp < startPeriod || timeStamp >= endPeriod)
continue;
int val = LookupReportValue(ss, reportName, valueName);
if (val == -1)
continue;
DateTime thisDate = timeStamp.Date;
if (curDate == DateTime.MinValue)
curDate = thisDate;
curCont++;
curTotl += val;
curValu = curTotl / curCont;
if (curDate != thisDate && curValu >= 0)
{
string mnthName = thisDate.ToString("MMMM");
if (regions.Count == 0)
{
regions.Add(new BarRegion(barGraph.Items.Count, barGraph.Items.Count, mnthName));
}
else
{
BarRegion region = (BarRegion)regions[regions.Count - 1];
if (region.m_Name == mnthName)
region.m_RangeTo = barGraph.Items.Count;
else
regions.Add(new BarRegion(barGraph.Items.Count, barGraph.Items.Count, mnthName));
}
barGraph.Items.Add(thisDate.Day.ToString(), curValu);
curPeak = val;
curLow = val;
}
else
{
if (val > curPeak)
curPeak = val;
if (val > 0 && val < curLow)
curLow = val;
}
curDate = thisDate;
}
barGraph.Regions = (BarRegion[])regions.ToArray(typeof(BarRegion));
return barGraph;
}
public static BarGraph OverTime(SnapshotHistory history, string reportName, string valueName, int step, int max, int ival)
{
BarGraph barGraph = new BarGraph(valueName + " over time", "graphs_" + valueName.ToLower() + "_ot", 10, "Time", valueName, BarGraphRenderMode.Lines);
TimeSpan ts = TimeSpan.FromHours((max * step) - 0.5);
DateTime mostRecent = history.Snapshots[history.Snapshots.Count - 1].TimeStamp;
DateTime minTime = mostRecent - ts;
barGraph.FontSize = 6;
barGraph.Interval = ival;
ArrayList regions = new ArrayList();
for (int i = 0; i < history.Snapshots.Count; ++i)
{
Snapshot ss = history.Snapshots[i];
DateTime timeStamp = ss.TimeStamp;
if (timeStamp < minTime)
continue;
if ((i % step) != 0)
continue;
int val = LookupReportValue(ss, reportName, valueName);
if (val == -1)
continue;
int realHours = timeStamp.TimeOfDay.Hours;
int hours;
if (realHours == 0)
hours = 12;
else if (realHours > 12)
hours = realHours - 12;
else
hours = realHours;
string dayName = timeStamp.DayOfWeek.ToString();
if (regions.Count == 0)
{
regions.Add(new BarRegion(barGraph.Items.Count, barGraph.Items.Count, dayName));
}
else
{
BarRegion region = (BarRegion)regions[regions.Count - 1];
if (region.m_Name == dayName)
region.m_RangeTo = barGraph.Items.Count;
else
regions.Add(new BarRegion(barGraph.Items.Count, barGraph.Items.Count, dayName));
}
barGraph.Items.Add(hours + (realHours >= 12 ? " PM" : " AM"), val);
}
barGraph.Regions = (BarRegion[])regions.ToArray(typeof(BarRegion));
return barGraph;
}
}
}

View File

@@ -0,0 +1,68 @@
using System;
namespace Server.Engines.Reports
{
public abstract class Chart : PersistableObject
{
protected string m_Name;
protected string m_FileName;
protected ChartItemCollection m_Items;
public Chart()
{
this.m_Items = new ChartItemCollection();
}
public string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
public string FileName
{
get
{
return this.m_FileName;
}
set
{
this.m_FileName = value;
}
}
public ChartItemCollection Items
{
get
{
return this.m_Items;
}
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetString("n", this.m_Name);
op.SetString("f", this.m_FileName);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_Name = Utility.Intern(ip.GetString("n"));
this.m_FileName = Utility.Intern(ip.GetString("f"));
}
public override void SerializeChildren(PersistenceWriter op)
{
for (int i = 0; i < this.m_Items.Count; ++i)
this.m_Items[i].Serialize(op);
}
public override void DeserializeChildren(PersistenceReader ip)
{
while (ip.HasChild)
this.m_Items.Add(ip.GetChild() as ChartItem);
}
}
}

View File

@@ -0,0 +1,72 @@
using System;
namespace Server.Engines.Reports
{
public class ChartItem : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("ci", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new ChartItem();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private string m_Name;
private int m_Value;
public string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
public int Value
{
get
{
return this.m_Value;
}
set
{
this.m_Value = value;
}
}
private ChartItem()
{
}
public ChartItem(string name, int value)
{
this.m_Name = name;
this.m_Value = value;
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetString("n", this.m_Name);
op.SetInt32("v", this.m_Value);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_Name = Utility.Intern(ip.GetString("n"));
this.m_Value = ip.GetInt32("v");
}
}
}

View File

@@ -0,0 +1,196 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.ChartItem.
/// </summary>
public class ChartItemCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public ChartItemCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.ChartItem at a specific position in the ChartItemCollection.
/// </summary>
public Server.Engines.Reports.ChartItem this[int index]
{
get
{
return ((Server.Engines.Reports.ChartItem)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
public int Add(string name, int value)
{
return this.Add(new ChartItem(name, value));
}
/// <summary>
/// Append a Server.Engines.Reports.ChartItem entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ChartItem instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.ChartItem value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.ChartItem instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ChartItem instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.ChartItem instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.ChartItem value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.ChartItem instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ChartItem instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.ChartItem instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.ChartItem value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.ChartItem instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.ChartItem instance to remove.</param>
public void Remove(Server.Engines.Reports.ChartItem value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.ChartItem instance.
/// </summary>
/// <returns>An Server.Engines.Reports.ChartItem's enumerator.</returns>
public new ChartItemCollectionEnumerator GetEnumerator()
{
return new ChartItemCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.ChartItem instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.ChartItem instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.ChartItem value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.ChartItem.
/// </summary>
public class ChartItemCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly ChartItemCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.ChartItem _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal ChartItemCollectionEnumerator(ChartItemCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.ChartItem object in the enumerated ChartItemCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.ChartItem Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,63 @@
using System;
namespace Server.Engines.Reports
{
public class PieChart : Chart
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("pc", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new PieChart();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private bool m_ShowPercents;
public bool ShowPercents
{
get
{
return this.m_ShowPercents;
}
set
{
this.m_ShowPercents = value;
}
}
public PieChart(string name, string fileName, bool showPercents)
{
this.m_Name = name;
this.m_FileName = fileName;
this.m_ShowPercents = showPercents;
}
private PieChart()
{
}
public override void SerializeAttributes(PersistenceWriter op)
{
base.SerializeAttributes(op);
op.SetBoolean("p", this.m_ShowPercents);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
base.DeserializeAttributes(ip);
this.m_ShowPercents = ip.GetBoolean("p");
}
}
}

View File

@@ -0,0 +1,80 @@
using System;
namespace Server.Engines.Reports
{
public class ItemValue : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("iv", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new ItemValue();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private string m_Value;
private string m_Format;
public string Value
{
get
{
return this.m_Value;
}
set
{
this.m_Value = value;
}
}
public string Format
{
get
{
return this.m_Format;
}
set
{
this.m_Format = value;
}
}
private ItemValue()
{
}
public ItemValue(string value)
: this(value, null)
{
}
public ItemValue(string value, string format)
{
this.m_Value = value;
this.m_Format = format;
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetString("v", this.m_Value);
op.SetString("f", this.m_Format);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_Value = ip.GetString("v");
this.m_Format = Utility.Intern(ip.GetString("f"));
if (this.m_Format == null)
Utility.Intern(ref this.m_Value);
}
}
}

View File

@@ -0,0 +1,201 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.ItemValue.
/// </summary>
public class ItemValueCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public ItemValueCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.ItemValue at a specific position in the ItemValueCollection.
/// </summary>
public Server.Engines.Reports.ItemValue this[int index]
{
get
{
return ((Server.Engines.Reports.ItemValue)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
public int Add(string value)
{
return this.Add(new ItemValue(value));
}
public int Add(string value, string format)
{
return this.Add(new ItemValue(value, format));
}
/// <summary>
/// Append a Server.Engines.Reports.ItemValue entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ItemValue instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.ItemValue value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.ItemValue instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ItemValue instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.ItemValue instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.ItemValue value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.ItemValue instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ItemValue instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.ItemValue instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.ItemValue value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.ItemValue instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.ItemValue instance to remove.</param>
public void Remove(Server.Engines.Reports.ItemValue value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.ItemValue instance.
/// </summary>
/// <returns>An Server.Engines.Reports.ItemValue's enumerator.</returns>
public new ItemValueCollectionEnumerator GetEnumerator()
{
return new ItemValueCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.ItemValue instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.ItemValue instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.ItemValue value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.ItemValue.
/// </summary>
public class ItemValueCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly ItemValueCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.ItemValue _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal ItemValueCollectionEnumerator(ItemValueCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.ItemValue object in the enumerated ItemValueCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.ItemValue Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,113 @@
using System;
namespace Server.Engines.Reports
{
public class Report : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("rp", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new Report();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private string m_Name;
private string m_Width;
private readonly ReportColumnCollection m_Columns;
private readonly ReportItemCollection m_Items;
public string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
public string Width
{
get
{
return this.m_Width;
}
set
{
this.m_Width = value;
}
}
public ReportColumnCollection Columns
{
get
{
return this.m_Columns;
}
}
public ReportItemCollection Items
{
get
{
return this.m_Items;
}
}
private Report()
: this(null, null)
{
}
public Report(string name, string width)
{
this.m_Name = name;
this.m_Width = width;
this.m_Columns = new ReportColumnCollection();
this.m_Items = new ReportItemCollection();
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetString("n", this.m_Name);
op.SetString("w", this.m_Width);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_Name = Utility.Intern(ip.GetString("n"));
this.m_Width = Utility.Intern(ip.GetString("w"));
}
public override void SerializeChildren(PersistenceWriter op)
{
for (int i = 0; i < this.m_Columns.Count; ++i)
this.m_Columns[i].Serialize(op);
for (int i = 0; i < this.m_Items.Count; ++i)
this.m_Items[i].Serialize(op);
}
public override void DeserializeChildren(PersistenceReader ip)
{
while (ip.HasChild)
{
PersistableObject child = ip.GetChild();
if (child is ReportColumn)
this.m_Columns.Add((ReportColumn)child);
else if (child is ReportItem)
this.m_Items.Add((ReportItem)child);
}
}
}
}

View File

@@ -0,0 +1,92 @@
using System;
namespace Server.Engines.Reports
{
public class ReportColumn : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("rc", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new ReportColumn();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private string m_Width;
private string m_Align;
private string m_Name;
public string Width
{
get
{
return this.m_Width;
}
set
{
this.m_Width = value;
}
}
public string Align
{
get
{
return this.m_Align;
}
set
{
this.m_Align = value;
}
}
public string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
private ReportColumn()
{
}
public ReportColumn(string width, string align)
: this(width, align, null)
{
}
public ReportColumn(string width, string align, string name)
{
this.m_Width = width;
this.m_Align = align;
this.m_Name = name;
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetString("w", this.m_Width);
op.SetString("a", this.m_Align);
op.SetString("n", this.m_Name);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_Width = Utility.Intern(ip.GetString("w"));
this.m_Align = Utility.Intern(ip.GetString("a"));
this.m_Name = Utility.Intern(ip.GetString("n"));
}
}
}

View File

@@ -0,0 +1,201 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.ReportColumn.
/// </summary>
public class ReportColumnCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public ReportColumnCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.ReportColumn at a specific position in the ReportColumnCollection.
/// </summary>
public Server.Engines.Reports.ReportColumn this[int index]
{
get
{
return ((Server.Engines.Reports.ReportColumn)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
public int Add(string width, string align)
{
return this.Add(new ReportColumn(width, align));
}
public int Add(string width, string align, string name)
{
return this.Add(new ReportColumn(width, align, name));
}
/// <summary>
/// Append a Server.Engines.Reports.ReportColumn entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ReportColumn instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.ReportColumn value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.ReportColumn instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ReportColumn instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.ReportColumn instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.ReportColumn value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.ReportColumn instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ReportColumn instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.ReportColumn instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.ReportColumn value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.ReportColumn instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.ReportColumn instance to remove.</param>
public void Remove(Server.Engines.Reports.ReportColumn value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.ReportColumn instance.
/// </summary>
/// <returns>An Server.Engines.Reports.ReportColumn's enumerator.</returns>
public new ReportColumnCollectionEnumerator GetEnumerator()
{
return new ReportColumnCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.ReportColumn instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.ReportColumn instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.ReportColumn value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.ReportColumn.
/// </summary>
public class ReportColumnCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly ReportColumnCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.ReportColumn _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal ReportColumnCollectionEnumerator(ReportColumnCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.ReportColumn object in the enumerated ReportColumnCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.ReportColumn Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,51 @@
using System;
namespace Server.Engines.Reports
{
public class ReportItem : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("ri", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new ReportItem();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private readonly ItemValueCollection m_Values;
public ItemValueCollection Values
{
get
{
return this.m_Values;
}
}
public ReportItem()
{
this.m_Values = new ItemValueCollection();
}
public override void SerializeChildren(PersistenceWriter op)
{
for (int i = 0; i < this.m_Values.Count; ++i)
this.m_Values[i].Serialize(op);
}
public override void DeserializeChildren(PersistenceReader ip)
{
while (ip.HasChild)
this.m_Values.Add(ip.GetChild() as ItemValue);
}
}
}

View File

@@ -0,0 +1,206 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.ReportItem.
/// </summary>
public class ReportItemCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public ReportItemCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.ReportItem at a specific position in the ReportItemCollection.
/// </summary>
public Server.Engines.Reports.ReportItem this[int index]
{
get
{
return ((Server.Engines.Reports.ReportItem)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
public int Add(string name, object value)
{
return this.Add(name, value, null);
}
public int Add(string name, object value, string format)
{
ReportItem item = new ReportItem();
item.Values.Add(name);
item.Values.Add(value == null ? "" : value.ToString(), format);
return this.Add(item);
}
/// <summary>
/// Append a Server.Engines.Reports.ReportItem entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ReportItem instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.ReportItem value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.ReportItem instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ReportItem instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.ReportItem instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.ReportItem value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.ReportItem instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ReportItem instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.ReportItem instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.ReportItem value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.ReportItem instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.ReportItem instance to remove.</param>
public void Remove(Server.Engines.Reports.ReportItem value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.ReportItem instance.
/// </summary>
/// <returns>An Server.Engines.Reports.ReportItem's enumerator.</returns>
public new ReportItemCollectionEnumerator GetEnumerator()
{
return new ReportItemCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.ReportItem instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.ReportItem instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.ReportItem value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.ReportItem.
/// </summary>
public class ReportItemCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly ReportItemCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.ReportItem _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal ReportItemCollectionEnumerator(ReportItemCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.ReportItem object in the enumerated ReportItemCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.ReportItem Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,77 @@
using System;
namespace Server.Engines.Reports
{
public class Snapshot : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("ss", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new Snapshot();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private DateTime m_TimeStamp;
private ObjectCollection m_Children;
public DateTime TimeStamp
{
get
{
return this.m_TimeStamp;
}
set
{
this.m_TimeStamp = value;
}
}
public ObjectCollection Children
{
get
{
return this.m_Children;
}
set
{
this.m_Children = value;
}
}
public Snapshot()
{
this.m_Children = new ObjectCollection();
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetDateTime("t", this.m_TimeStamp);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_TimeStamp = ip.GetDateTime("t");
}
public override void SerializeChildren(PersistenceWriter op)
{
for (int i = 0; i < this.m_Children.Count; ++i)
this.m_Children[i].Serialize(op);
}
public override void DeserializeChildren(PersistenceReader ip)
{
while (ip.HasChild)
this.m_Children.Add(ip.GetChild());
}
}
}

View File

@@ -0,0 +1,191 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.Snapshot.
/// </summary>
public class SnapshotCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public SnapshotCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.Snapshot at a specific position in the SnapshotCollection.
/// </summary>
public Server.Engines.Reports.Snapshot this[int index]
{
get
{
return ((Server.Engines.Reports.Snapshot)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
/// <summary>
/// Append a Server.Engines.Reports.Snapshot entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.Snapshot instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.Snapshot value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.Snapshot instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.Snapshot instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.Snapshot instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.Snapshot value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.Snapshot instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.Snapshot instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.Snapshot instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.Snapshot value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.Snapshot instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.Snapshot instance to remove.</param>
public void Remove(Server.Engines.Reports.Snapshot value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.Snapshot instance.
/// </summary>
/// <returns>An Server.Engines.Reports.Snapshot's enumerator.</returns>
public new SnapshotCollectionEnumerator GetEnumerator()
{
return new SnapshotCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.Snapshot instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.Snapshot instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.Snapshot value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.Snapshot.
/// </summary>
public class SnapshotCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly SnapshotCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.Snapshot _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal SnapshotCollectionEnumerator(SnapshotCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.Snapshot object in the enumerated SnapshotCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.Snapshot Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,80 @@
using System;
using System.IO;
namespace Server.Engines.Reports
{
public class SnapshotHistory : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("sh", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new SnapshotHistory();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private SnapshotCollection m_Snapshots;
public SnapshotCollection Snapshots
{
get
{
return this.m_Snapshots;
}
set
{
this.m_Snapshots = value;
}
}
public SnapshotHistory()
{
this.m_Snapshots = new SnapshotCollection();
}
public void Save()
{
string path = Path.Combine(Core.BaseDirectory, "reportHistory.xml");
PersistenceWriter pw = new XmlPersistenceWriter(path, "Stats");
pw.WriteDocument(this);
pw.Close();
}
public void Load()
{
string path = Path.Combine(Core.BaseDirectory, "reportHistory.xml");
if (!File.Exists(path))
return;
PersistenceReader pr = new XmlPersistenceReader(path, "Stats");
pr.ReadDocument(this);
pr.Close();
}
public override void SerializeChildren(PersistenceWriter op)
{
for (int i = 0; i < this.m_Snapshots.Count; ++i)
this.m_Snapshots[i].Serialize(op);
}
public override void DeserializeChildren(PersistenceReader ip)
{
while (ip.HasChild)
this.m_Snapshots.Add(ip.GetChild() as Snapshot);
}
}
}

View File

@@ -0,0 +1,126 @@
using System;
using Server.Accounting;
namespace Server.Engines.Reports
{
public abstract class BaseInfo : IComparable
{
private static TimeSpan m_SortRange;
private string m_Account;
private string m_Display;
private PageInfoCollection m_Pages;
public BaseInfo(string account)
{
this.m_Account = account;
this.m_Pages = new PageInfoCollection();
}
public static TimeSpan SortRange
{
get
{
return m_SortRange;
}
set
{
m_SortRange = value;
}
}
public string Account
{
get
{
return this.m_Account;
}
set
{
this.m_Account = value;
}
}
public PageInfoCollection Pages
{
get
{
return this.m_Pages;
}
set
{
this.m_Pages = value;
}
}
public string Display
{
get
{
if (this.m_Display != null)
return this.m_Display;
if (this.m_Account != null)
{
IAccount acct = Accounts.GetAccount(this.m_Account);
if (acct != null)
{
Mobile mob = null;
for (int i = 0; i < acct.Length; ++i)
{
Mobile check = acct[i];
if (check != null && (mob == null || check.AccessLevel > mob.AccessLevel))
mob = check;
}
if (mob != null && mob.Name != null && mob.Name.Length > 0)
return (this.m_Display = mob.Name);
}
}
return (this.m_Display = this.m_Account);
}
}
public int GetPageCount(PageResolution res, DateTime min, DateTime max)
{
return StaffHistory.GetPageCount(this.m_Pages, res, min, max);
}
public void Register(PageInfo page)
{
this.m_Pages.Add(page);
}
public void Unregister(PageInfo page)
{
this.m_Pages.Remove(page);
}
public int CompareTo(object obj)
{
BaseInfo cmp = obj as BaseInfo;
int v = cmp.GetPageCount(cmp is StaffInfo ? PageResolution.Handled : PageResolution.None, DateTime.UtcNow - m_SortRange, DateTime.UtcNow) -
this.GetPageCount(this is StaffInfo ? PageResolution.Handled : PageResolution.None, DateTime.UtcNow - m_SortRange, DateTime.UtcNow);
if (v == 0)
v = String.Compare(this.Display, cmp.Display);
return v;
}
}
public class StaffInfo : BaseInfo
{
public StaffInfo(string account)
: base(account)
{
}
}
public class UserInfo : BaseInfo
{
public UserInfo(string account)
: base(account)
{
}
}
}

View File

@@ -0,0 +1,331 @@
using System;
using Server.Engines.Help;
namespace Server.Engines.Reports
{
public enum PageResolution
{
None,
Handled,
Deleted,
Logged,
Canceled
}
public class PageInfo : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("pi", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new PageInfo();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private StaffHistory m_History;
private StaffInfo m_Resolver;
private UserInfo m_Sender;
public StaffInfo Resolver
{
get
{
return this.m_Resolver;
}
set
{
if (this.m_Resolver == value)
return;
lock (StaffHistory.RenderLock)
{
if (this.m_Resolver != null)
this.m_Resolver.Unregister(this);
this.m_Resolver = value;
if (this.m_Resolver != null)
this.m_Resolver.Register(this);
}
}
}
public UserInfo Sender
{
get
{
return this.m_Sender;
}
set
{
if (this.m_Sender == value)
return;
lock (StaffHistory.RenderLock)
{
if (this.m_Sender != null)
this.m_Sender.Unregister(this);
this.m_Sender = value;
if (this.m_Sender != null)
this.m_Sender.Register(this);
}
}
}
private PageType m_PageType;
private PageResolution m_Resolution;
private DateTime m_TimeSent;
private DateTime m_TimeResolved;
private string m_SentBy;
private string m_ResolvedBy;
private string m_Message;
private ResponseInfoCollection m_Responses;
public StaffHistory History
{
get
{
return this.m_History;
}
set
{
if (this.m_History == value)
return;
if (this.m_History != null)
{
this.Sender = null;
this.Resolver = null;
}
this.m_History = value;
if (this.m_History != null)
{
this.Sender = this.m_History.GetUserInfo(this.m_SentBy);
this.UpdateResolver();
}
}
}
public PageType PageType
{
get
{
return this.m_PageType;
}
set
{
this.m_PageType = value;
}
}
public PageResolution Resolution
{
get
{
return this.m_Resolution;
}
}
public DateTime TimeSent
{
get
{
return this.m_TimeSent;
}
set
{
this.m_TimeSent = value;
}
}
public DateTime TimeResolved
{
get
{
return this.m_TimeResolved;
}
}
public string SentBy
{
get
{
return this.m_SentBy;
}
set
{
this.m_SentBy = value;
if (this.m_History != null)
this.Sender = this.m_History.GetUserInfo(this.m_SentBy);
}
}
public string ResolvedBy
{
get
{
return this.m_ResolvedBy;
}
}
public string Message
{
get
{
return this.m_Message;
}
set
{
this.m_Message = value;
}
}
public ResponseInfoCollection Responses
{
get
{
return this.m_Responses;
}
set
{
this.m_Responses = value;
}
}
public void UpdateResolver()
{
string resolvedBy;
DateTime timeResolved;
PageResolution res = this.GetResolution(out resolvedBy, out timeResolved);
if (this.m_History != null && this.IsStaffResolution(res))
this.Resolver = this.m_History.GetStaffInfo(resolvedBy);
else
this.Resolver = null;
this.m_ResolvedBy = resolvedBy;
this.m_TimeResolved = timeResolved;
this.m_Resolution = res;
}
public bool IsStaffResolution(PageResolution res)
{
return (res == PageResolution.Handled);
}
public static PageResolution ResFromResp(string resp)
{
switch ( resp )
{
case "[Handled]":
return PageResolution.Handled;
case "[Deleting]":
return PageResolution.Deleted;
case "[Logout]":
return PageResolution.Logged;
case "[Canceled]":
return PageResolution.Canceled;
}
return PageResolution.None;
}
public PageResolution GetResolution(out string resolvedBy, out DateTime timeResolved)
{
for (int i = this.m_Responses.Count - 1; i >= 0; --i)
{
ResponseInfo resp = this.m_Responses[i];
PageResolution res = ResFromResp(resp.Message);
if (res != PageResolution.None)
{
resolvedBy = resp.SentBy;
timeResolved = resp.TimeStamp;
return res;
}
}
resolvedBy = this.m_SentBy;
timeResolved = this.m_TimeSent;
return PageResolution.None;
}
public static string GetAccount(Mobile mob)
{
if (mob == null)
return null;
Accounting.Account acct = mob.Account as Accounting.Account;
if (acct == null)
return null;
return acct.Username;
}
public PageInfo()
{
this.m_Responses = new ResponseInfoCollection();
}
public PageInfo(PageEntry entry)
{
this.m_PageType = entry.Type;
this.m_TimeSent = entry.Sent;
this.m_SentBy = GetAccount(entry.Sender);
this.m_Message = entry.Message;
this.m_Responses = new ResponseInfoCollection();
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetInt32("p", (int)this.m_PageType);
op.SetDateTime("ts", this.m_TimeSent);
op.SetString("s", this.m_SentBy);
op.SetString("m", this.m_Message);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_PageType = (PageType)ip.GetInt32("p");
this.m_TimeSent = ip.GetDateTime("ts");
this.m_SentBy = ip.GetString("s");
this.m_Message = ip.GetString("m");
}
public override void SerializeChildren(PersistenceWriter op)
{
lock (this)
{
for (int i = 0; i < this.m_Responses.Count; ++i)
this.m_Responses[i].Serialize(op);
}
}
public override void DeserializeChildren(PersistenceReader ip)
{
while (ip.HasChild)
this.m_Responses.Add(ip.GetChild() as ResponseInfo);
}
}
}

View File

@@ -0,0 +1,191 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.PageInfo.
/// </summary>
public class PageInfoCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public PageInfoCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.PageInfo at a specific position in the PageInfoCollection.
/// </summary>
public Server.Engines.Reports.PageInfo this[int index]
{
get
{
return ((Server.Engines.Reports.PageInfo)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
/// <summary>
/// Append a Server.Engines.Reports.PageInfo entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.PageInfo instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.PageInfo value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.PageInfo instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.PageInfo instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.PageInfo instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.PageInfo value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.PageInfo instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.PageInfo instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.PageInfo instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.PageInfo value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.PageInfo instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.PageInfo instance to remove.</param>
public void Remove(Server.Engines.Reports.PageInfo value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.PageInfo instance.
/// </summary>
/// <returns>An Server.Engines.Reports.PageInfo's enumerator.</returns>
public new PageInfoCollectionEnumerator GetEnumerator()
{
return new PageInfoCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.PageInfo instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.PageInfo instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.PageInfo value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.PageInfo.
/// </summary>
public class PageInfoCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly PageInfoCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.PageInfo _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal PageInfoCollectionEnumerator(PageInfoCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.PageInfo object in the enumerated PageInfoCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.PageInfo Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,72 @@
using System;
namespace Server.Engines.Reports
{
public class QueueStatus : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("qs", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new QueueStatus();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private DateTime m_TimeStamp;
private int m_Count;
public DateTime TimeStamp
{
get
{
return this.m_TimeStamp;
}
set
{
this.m_TimeStamp = value;
}
}
public int Count
{
get
{
return this.m_Count;
}
set
{
this.m_Count = value;
}
}
public QueueStatus()
{
}
public QueueStatus(int count)
{
this.m_TimeStamp = DateTime.UtcNow;
this.m_Count = count;
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetDateTime("t", this.m_TimeStamp);
op.SetInt32("c", this.m_Count);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_TimeStamp = ip.GetDateTime("t");
this.m_Count = ip.GetInt32("c");
}
}
}

View File

@@ -0,0 +1,191 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.QueueStatus.
/// </summary>
public class QueueStatusCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public QueueStatusCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.QueueStatus at a specific position in the QueueStatusCollection.
/// </summary>
public Server.Engines.Reports.QueueStatus this[int index]
{
get
{
return ((Server.Engines.Reports.QueueStatus)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
/// <summary>
/// Append a Server.Engines.Reports.QueueStatus entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.QueueStatus instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.QueueStatus value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.QueueStatus instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.QueueStatus instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.QueueStatus instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.QueueStatus value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.QueueStatus instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.QueueStatus instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.QueueStatus instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.QueueStatus value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.QueueStatus instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.QueueStatus instance to remove.</param>
public void Remove(Server.Engines.Reports.QueueStatus value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.QueueStatus instance.
/// </summary>
/// <returns>An Server.Engines.Reports.QueueStatus's enumerator.</returns>
public new QueueStatusCollectionEnumerator GetEnumerator()
{
return new QueueStatusCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.QueueStatus instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.QueueStatus instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.QueueStatus value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.QueueStatus.
/// </summary>
public class QueueStatusCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly QueueStatusCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.QueueStatus _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal QueueStatusCollectionEnumerator(QueueStatusCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.QueueStatus object in the enumerated QueueStatusCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.QueueStatus Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,91 @@
using System;
namespace Server.Engines.Reports
{
public class ResponseInfo : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("rs", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new ResponseInfo();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private DateTime m_TimeStamp;
private string m_SentBy;
private string m_Message;
public DateTime TimeStamp
{
get
{
return this.m_TimeStamp;
}
set
{
this.m_TimeStamp = value;
}
}
public string SentBy
{
get
{
return this.m_SentBy;
}
set
{
this.m_SentBy = value;
}
}
public string Message
{
get
{
return this.m_Message;
}
set
{
this.m_Message = value;
}
}
public ResponseInfo()
{
}
public ResponseInfo(string sentBy, string message)
{
this.m_TimeStamp = DateTime.UtcNow;
this.m_SentBy = sentBy;
this.m_Message = message;
}
public override void SerializeAttributes(PersistenceWriter op)
{
op.SetDateTime("t", this.m_TimeStamp);
op.SetString("s", this.m_SentBy);
op.SetString("m", this.m_Message);
}
public override void DeserializeAttributes(PersistenceReader ip)
{
this.m_TimeStamp = ip.GetDateTime("t");
this.m_SentBy = ip.GetString("s");
this.m_Message = ip.GetString("m");
}
}
}

View File

@@ -0,0 +1,196 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------
namespace Server.Engines.Reports
{
using System;
using System.Collections;
/// <summary>
/// Strongly typed collection of Server.Engines.Reports.ResponseInfo.
/// </summary>
public class ResponseInfoCollection : System.Collections.CollectionBase
{
/// <summary>
/// Default constructor.
/// </summary>
public ResponseInfoCollection()
: base()
{
}
/// <summary>
/// Gets or sets the value of the Server.Engines.Reports.ResponseInfo at a specific position in the ResponseInfoCollection.
/// </summary>
public Server.Engines.Reports.ResponseInfo this[int index]
{
get
{
return ((Server.Engines.Reports.ResponseInfo)(this.List[index]));
}
set
{
this.List[index] = value;
}
}
public int Add(string sentBy, string message)
{
return this.Add(new ResponseInfo(sentBy, message));
}
/// <summary>
/// Append a Server.Engines.Reports.ResponseInfo entry to this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ResponseInfo instance.</param>
/// <returns>The position into which the new element was inserted.</returns>
public int Add(Server.Engines.Reports.ResponseInfo value)
{
return this.List.Add(value);
}
/// <summary>
/// Determines whether a specified Server.Engines.Reports.ResponseInfo instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ResponseInfo instance to search for.</param>
/// <returns>True if the Server.Engines.Reports.ResponseInfo instance is in the collection; otherwise false.</returns>
public bool Contains(Server.Engines.Reports.ResponseInfo value)
{
return this.List.Contains(value);
}
/// <summary>
/// Retrieve the index a specified Server.Engines.Reports.ResponseInfo instance is in this collection.
/// </summary>
/// <param name="value">Server.Engines.Reports.ResponseInfo instance to find.</param>
/// <returns>The zero-based index of the specified Server.Engines.Reports.ResponseInfo instance. If the object is not found, the return value is -1.</returns>
public int IndexOf(Server.Engines.Reports.ResponseInfo value)
{
return this.List.IndexOf(value);
}
/// <summary>
/// Removes a specified Server.Engines.Reports.ResponseInfo instance from this collection.
/// </summary>
/// <param name="value">The Server.Engines.Reports.ResponseInfo instance to remove.</param>
public void Remove(Server.Engines.Reports.ResponseInfo value)
{
this.List.Remove(value);
}
/// <summary>
/// Returns an enumerator that can iterate through the Server.Engines.Reports.ResponseInfo instance.
/// </summary>
/// <returns>An Server.Engines.Reports.ResponseInfo's enumerator.</returns>
public new ResponseInfoCollectionEnumerator GetEnumerator()
{
return new ResponseInfoCollectionEnumerator(this);
}
/// <summary>
/// Insert a Server.Engines.Reports.ResponseInfo instance into this collection at a specified index.
/// </summary>
/// <param name="index">Zero-based index.</param>
/// <param name="value">The Server.Engines.Reports.ResponseInfo instance to insert.</param>
public void Insert(int index, Server.Engines.Reports.ResponseInfo value)
{
this.List.Insert(index, value);
}
/// <summary>
/// Strongly typed enumerator of Server.Engines.Reports.ResponseInfo.
/// </summary>
public class ResponseInfoCollectionEnumerator : System.Collections.IEnumerator
{
/// <summary>
/// Collection to enumerate.
/// </summary>
private readonly ResponseInfoCollection _collection;
/// <summary>
/// Current index
/// </summary>
private int _index;
/// <summary>
/// Current element pointed to.
/// </summary>
private Server.Engines.Reports.ResponseInfo _currentElement;
/// <summary>
/// Default constructor for enumerator.
/// </summary>
/// <param name="collection">Instance of the collection to enumerate.</param>
internal ResponseInfoCollectionEnumerator(ResponseInfoCollection collection)
{
this._index = -1;
this._collection = collection;
}
/// <summary>
/// Gets the Server.Engines.Reports.ResponseInfo object in the enumerated ResponseInfoCollection currently indexed by this instance.
/// </summary>
public Server.Engines.Reports.ResponseInfo Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Gets the current element in the collection.
/// </summary>
object IEnumerator.Current
{
get
{
if (((this._index == -1) ||
(this._index >= this._collection.Count)))
{
throw new System.IndexOutOfRangeException("Enumerator not started.");
}
else
{
return this._currentElement;
}
}
}
/// <summary>
/// Reset the cursor, so it points to the beginning of the enumerator.
/// </summary>
public void Reset()
{
this._index = -1;
this._currentElement = null;
}
/// <summary>
/// Advances the enumerator to the next queue of the enumeration, if one is currently available.
/// </summary>
/// <returns>true, if the enumerator was succesfully advanced to the next queue; false, if the enumerator has reached the end of the enumeration.</returns>
public bool MoveNext()
{
if ((this._index <
(this._collection.Count - 1)))
{
this._index = (this._index + 1);
this._currentElement = this._collection[this._index];
return true;
}
this._index = this._collection.Count;
return false;
}
}
}
}

View File

@@ -0,0 +1,451 @@
using System;
using System.Collections;
using System.IO;
namespace Server.Engines.Reports
{
public class StaffHistory : PersistableObject
{
#region Type Identification
public static readonly PersistableType ThisTypeID = new PersistableType("stfhst", new ConstructCallback(Construct));
private static PersistableObject Construct()
{
return new StaffHistory();
}
public override PersistableType TypeID
{
get
{
return ThisTypeID;
}
}
#endregion
private PageInfoCollection m_Pages;
private QueueStatusCollection m_QueueStats;
private Hashtable m_UserInfo;
private Hashtable m_StaffInfo;
public PageInfoCollection Pages
{
get
{
return this.m_Pages;
}
set
{
this.m_Pages = value;
}
}
public QueueStatusCollection QueueStats
{
get
{
return this.m_QueueStats;
}
set
{
this.m_QueueStats = value;
}
}
public Hashtable UserInfo
{
get
{
return this.m_UserInfo;
}
set
{
this.m_UserInfo = value;
}
}
public Hashtable StaffInfo
{
get
{
return this.m_StaffInfo;
}
set
{
this.m_StaffInfo = value;
}
}
public void AddPage(PageInfo info)
{
lock (SaveLock)
this.m_Pages.Add(info);
info.History = this;
}
public StaffHistory()
{
this.m_Pages = new PageInfoCollection();
this.m_QueueStats = new QueueStatusCollection();
this.m_UserInfo = new Hashtable(StringComparer.OrdinalIgnoreCase);
this.m_StaffInfo = new Hashtable(StringComparer.OrdinalIgnoreCase);
}
public StaffInfo GetStaffInfo(string account)
{
lock (RenderLock)
{
if (account == null || account.Length == 0)
return null;
StaffInfo info = this.m_StaffInfo[account] as StaffInfo;
if (info == null)
this.m_StaffInfo[account] = info = new StaffInfo(account);
return info;
}
}
public UserInfo GetUserInfo(string account)
{
if (account == null || account.Length == 0)
return null;
UserInfo info = this.m_UserInfo[account] as UserInfo;
if (info == null)
this.m_UserInfo[account] = info = new UserInfo(account);
return info;
}
public static readonly object RenderLock = new object();
public static readonly object SaveLock = new object();
public void Save()
{
lock (SaveLock)
{
string path = Path.Combine(Core.BaseDirectory, "staffHistory.xml");
PersistenceWriter pw = new XmlPersistenceWriter(path, "Staff");
pw.WriteDocument(this);
pw.Close();
}
}
public void Load()
{
string path = Path.Combine(Core.BaseDirectory, "staffHistory.xml");
if (!File.Exists(path))
return;
PersistenceReader pr = new XmlPersistenceReader(path, "Staff");
pr.ReadDocument(this);
pr.Close();
}
public override void SerializeChildren(PersistenceWriter op)
{
for (int i = 0; i < this.m_Pages.Count; ++i)
this.m_Pages[i].Serialize(op);
for (int i = 0; i < this.m_QueueStats.Count; ++i)
this.m_QueueStats[i].Serialize(op);
}
public override void DeserializeChildren(PersistenceReader ip)
{
DateTime min = DateTime.UtcNow - TimeSpan.FromDays(8.0);
while (ip.HasChild)
{
PersistableObject obj = ip.GetChild();
if (obj is PageInfo)
{
PageInfo pageInfo = obj as PageInfo;
pageInfo.UpdateResolver();
if (pageInfo.TimeSent >= min || pageInfo.TimeResolved >= min)
{
this.m_Pages.Add(pageInfo);
pageInfo.History = this;
}
else
{
pageInfo.Sender = null;
pageInfo.Resolver = null;
}
}
else if (obj is QueueStatus)
{
QueueStatus queueStatus = obj as QueueStatus;
if (queueStatus.TimeStamp >= min)
this.m_QueueStats.Add(queueStatus);
}
}
}
public StaffInfo[] GetStaff()
{
StaffInfo[] staff = new StaffInfo[this.m_StaffInfo.Count];
int index = 0;
foreach (StaffInfo staffInfo in this.m_StaffInfo.Values)
staff[index++] = staffInfo;
return staff;
}
public void Render(ObjectCollection objects)
{
lock (RenderLock)
{
objects.Add(this.GraphQueueStatus());
StaffInfo[] staff = this.GetStaff();
BaseInfo.SortRange = TimeSpan.FromDays(7.0);
Array.Sort(staff);
objects.Add(this.GraphHourlyPages(this.m_Pages, PageResolution.None, "New pages by hour", "graph_new_pages_hr"));
objects.Add(this.GraphHourlyPages(this.m_Pages, PageResolution.Handled, "Handled pages by hour", "graph_handled_pages_hr"));
objects.Add(this.GraphHourlyPages(this.m_Pages, PageResolution.Deleted, "Deleted pages by hour", "graph_deleted_pages_hr"));
objects.Add(this.GraphHourlyPages(this.m_Pages, PageResolution.Canceled, "Canceled pages by hour", "graph_canceled_pages_hr"));
objects.Add(this.GraphHourlyPages(this.m_Pages, PageResolution.Logged, "Logged-out pages by hour", "graph_logged_pages_hr"));
BaseInfo.SortRange = TimeSpan.FromDays(1.0);
Array.Sort(staff);
objects.Add(this.ReportTotalPages(staff, TimeSpan.FromDays(1.0), "1 Day"));
objects.AddRange((PersistableObject[])this.ChartTotalPages(staff, TimeSpan.FromDays(1.0), "1 Day", "graph_daily_pages"));
BaseInfo.SortRange = TimeSpan.FromDays(7.0);
Array.Sort(staff);
objects.Add(this.ReportTotalPages(staff, TimeSpan.FromDays(7.0), "1 Week"));
objects.AddRange((PersistableObject[])this.ChartTotalPages(staff, TimeSpan.FromDays(7.0), "1 Week", "graph_weekly_pages"));
BaseInfo.SortRange = TimeSpan.FromDays(30.0);
Array.Sort(staff);
objects.Add(this.ReportTotalPages(staff, TimeSpan.FromDays(30.0), "1 Month"));
objects.AddRange((PersistableObject[])this.ChartTotalPages(staff, TimeSpan.FromDays(30.0), "1 Month", "graph_monthly_pages"));
for (int i = 0; i < staff.Length; ++i)
objects.Add(this.GraphHourlyPages(staff[i]));
}
}
public static int GetPageCount(StaffInfo staff, DateTime min, DateTime max)
{
return GetPageCount(staff.Pages, PageResolution.Handled, min, max);
}
public static int GetPageCount(PageInfoCollection pages, PageResolution res, DateTime min, DateTime max)
{
int count = 0;
for (int i = 0; i < pages.Count; ++i)
{
if (res != PageResolution.None && pages[i].Resolution != res)
continue;
DateTime ts = pages[i].TimeResolved;
if (ts >= min && ts < max)
++count;
}
return count;
}
private BarGraph GraphQueueStatus()
{
int[] totals = new int[24];
int[] counts = new int[24];
DateTime max = DateTime.UtcNow;
DateTime min = max - TimeSpan.FromDays(7.0);
for (int i = 0; i < this.m_QueueStats.Count; ++i)
{
DateTime ts = this.m_QueueStats[i].TimeStamp;
if (ts >= min && ts < max)
{
DateTime date = ts.Date;
TimeSpan time = ts.TimeOfDay;
int hour = time.Hours;
totals[hour] += this.m_QueueStats[i].Count;
counts[hour]++;
}
}
BarGraph barGraph = new BarGraph("Average pages in queue", "graph_pagequeue_avg", 10, "Time", "Pages", BarGraphRenderMode.Lines);
barGraph.FontSize = 6;
for (int i = 7; i <= totals.Length + 7; ++i)
{
int val;
if (counts[i % totals.Length] == 0)
val = 0;
else
val = (totals[i % totals.Length] + (counts[i % totals.Length] / 2)) / counts[i % totals.Length];
int realHours = i % totals.Length;
int hours;
if (realHours == 0)
hours = 12;
else if (realHours > 12)
hours = realHours - 12;
else
hours = realHours;
barGraph.Items.Add(hours + (realHours >= 12 ? " PM" : " AM"), val);
}
return barGraph;
}
private BarGraph GraphHourlyPages(StaffInfo staff)
{
return this.GraphHourlyPages(staff.Pages, PageResolution.Handled, "Average pages handled by " + staff.Display, "graphs_" + staff.Account.ToLower() + "_avg");
}
private BarGraph GraphHourlyPages(PageInfoCollection pages, PageResolution res, string title, string fname)
{
int[] totals = new int[24];
int[] counts = new int[24];
DateTime[] dates = new DateTime[24];
DateTime max = DateTime.UtcNow;
DateTime min = max - TimeSpan.FromDays(7.0);
bool sentStamp = (res == PageResolution.None);
for (int i = 0; i < pages.Count; ++i)
{
if (res != PageResolution.None && pages[i].Resolution != res)
continue;
DateTime ts = (sentStamp ? pages[i].TimeSent : pages[i].TimeResolved);
if (ts >= min && ts < max)
{
DateTime date = ts.Date;
TimeSpan time = ts.TimeOfDay;
int hour = time.Hours;
totals[hour]++;
if (dates[hour] != date)
{
counts[hour]++;
dates[hour] = date;
}
}
}
BarGraph barGraph = new BarGraph(title, fname, 10, "Time", "Pages", BarGraphRenderMode.Lines);
barGraph.FontSize = 6;
for (int i = 7; i <= totals.Length + 7; ++i)
{
int val;
if (counts[i % totals.Length] == 0)
val = 0;
else
val = (totals[i % totals.Length] + (counts[i % totals.Length] / 2)) / counts[i % totals.Length];
int realHours = i % totals.Length;
int hours;
if (realHours == 0)
hours = 12;
else if (realHours > 12)
hours = realHours - 12;
else
hours = realHours;
barGraph.Items.Add(hours + (realHours >= 12 ? " PM" : " AM"), val);
}
return barGraph;
}
private Report ReportTotalPages(StaffInfo[] staff, TimeSpan ts, string title)
{
DateTime max = DateTime.UtcNow;
DateTime min = max - ts;
Report report = new Report(title + " Staff Report", "400");
report.Columns.Add("65%", "left", "Staff Name");
report.Columns.Add("35%", "center", "Page Count");
for (int i = 0; i < staff.Length; ++i)
report.Items.Add(staff[i].Display, GetPageCount(staff[i], min, max));
return report;
}
private PieChart[] ChartTotalPages(StaffInfo[] staff, TimeSpan ts, string title, string fname)
{
DateTime max = DateTime.UtcNow;
DateTime min = max - ts;
PieChart staffChart = new PieChart(title + " Staff Chart", fname + "_staff", true);
int other = 0;
for (int i = 0; i < staff.Length; ++i)
{
int count = GetPageCount(staff[i], min, max);
if (i < 12 && count > 0)
staffChart.Items.Add(staff[i].Display, count);
else
other += count;
}
if (other > 0)
staffChart.Items.Add("Other", other);
PieChart resChart = new PieChart(title + " Resolutions", fname + "_resol", true);
int countTotal = GetPageCount(this.m_Pages, PageResolution.None, min, max);
int countHandled = GetPageCount(this.m_Pages, PageResolution.Handled, min, max);
int countDeleted = GetPageCount(this.m_Pages, PageResolution.Deleted, min, max);
int countCanceled = GetPageCount(this.m_Pages, PageResolution.Canceled, min, max);
int countLogged = GetPageCount(this.m_Pages, PageResolution.Logged, min, max);
int countUnres = countTotal - (countHandled + countDeleted + countCanceled + countLogged);
resChart.Items.Add("Handled", countHandled);
resChart.Items.Add("Deleted", countDeleted);
resChart.Items.Add("Canceled", countCanceled);
resChart.Items.Add("Logged Out", countLogged);
resChart.Items.Add("Unresolved", countUnres);
return new PieChart[] { staffChart, resChart };
}
}
}