using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace CLre_server.Fixes { [AttributeUsage(AttributeTargets.Class)] public class BugfixAttribute : Attribute { public string name { get; set; } public string description { get; set; } public Type target { get; set; } public string more { get; set; } public uint id { get; set; } public BugfixType component { get; set; } } public enum BugfixType : byte { Miscellaneous = 0x00, HarmonyPatch, Initialiser, Workaround, API, Debug } internal static class BugfixAttributeUtility { public static void LogBugfixes() { List keys = new List(); Dictionary fixes = new Dictionary(); foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) { BugfixAttribute b = t.GetCustomAttribute(true); if (b != null) { if (!fixes.ContainsKey(b.id)) { BugfixStruct bugfixStruct = new BugfixStruct{id = b.id}; bugfixStruct.Merge(b); fixes[b.id] = bugfixStruct; keys.Add(b.id); } else { BugfixStruct bugfixStruct = fixes[b.id]; bugfixStruct.Merge(b); fixes[b.id] = bugfixStruct; } } } keys.Sort(); //keys.Sort((u, u1) => u.CompareTo(u1)); StringBuilder sb = new StringBuilder(); sb.AppendFormat("Applying {0} CLre fixes\n", keys.Count); sb.AppendFormat("-----------------------------\n"); foreach (uint i in keys) { sb.Append(fixes[i].ToString()); sb.Append("\n"); } sb.AppendFormat("-----------------------------\n"); API.Utility.Logging.Log(sb.ToString()); } private struct BugfixStruct { public string name; public string description; public Type target; public string more; public uint id; private uint total; private uint[] bugfixTypeCount; public void Merge(BugfixAttribute b) { if (name == null && b.name != null) name = b.name; if (description == null && b.description != null) description = b.description; if (target == null && b.target != null) target = b.target; if (more == null && b.more != null) more = b.more; total++; if (bugfixTypeCount == null) bugfixTypeCount = new uint[Enum.GetNames(typeof(BugfixType)).Length]; bugfixTypeCount[(byte) b.component]++; } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.AppendFormat(" {0}: ", name); if (more != null) { sb.AppendFormat("[MORE: {0}] ", more); } else if (description != null) { sb.Append(description); sb.Append(" "); } if (target != null) { sb.AppendFormat("[TARGET: {0}] ", target.FullName); } sb.AppendFormat("[ID: {0}] ", id); sb.AppendFormat("({0}M/{1}P/{2}I/{3}W/{4}A/{5}D/{6}T)", bugfixTypeCount[(byte) BugfixType.Miscellaneous], bugfixTypeCount[(byte) BugfixType.HarmonyPatch], bugfixTypeCount[(byte) BugfixType.Initialiser], bugfixTypeCount[(byte) BugfixType.Workaround], bugfixTypeCount[(byte) BugfixType.API], bugfixTypeCount[(byte) BugfixType.Debug], total); return sb.ToString(); } } } }