4 using System.Collections.Generic;
13 public partial class Study : MonoBehaviour
15 private delegate
string LogColumnValueProvider ();
42 static Study _instance;
44 static Dictionary<Enum, string> _logEventFormats =
new Dictionary<Enum, string>();
45 static List<StreamWriter> _logWriters =
new List<StreamWriter>();
46 static List<LogColumnValueProvider> _logHeaderColumnValueProviders =
new List<LogColumnValueProvider>();
47 static List<LogColumnValueProvider> _logColumnValueProviders =
new List<LogColumnValueProvider>();
48 static int _logTypeColumnIndex = -1;
49 static int _logEventColumnIndex = -1;
57 public static void LogEvent (Enum eventType, params
object[] args)
59 if (!_studyConfig.LoggingEnabled)
62 string[] columnValues = GetLogColumnValues();
64 if (_logTypeColumnIndex > -1 && _logTypeColumnIndex < columnValues.Length)
65 columnValues[_logTypeColumnIndex] =
"E";
67 if (_logEventColumnIndex > -1 && _logEventColumnIndex < columnValues.Length)
68 columnValues[_logEventColumnIndex] =
string.Format(_logEventFormats[eventType], args);
70 string line =
string.Join(
"\t", columnValues);
78 var assembly = Assembly.GetExecutingAssembly();
80 foreach (var type
in assembly.GetTypes())
85 if (!type.Name.EndsWith(
"LogEvent"))
88 foreach (MemberInfo enumMember
in type.GetMembers())
90 var eventParamsAttrs = enumMember.GetCustomAttributes(typeof(
LogEventAttribute),
false);
92 if (eventParamsAttrs.Length == 0)
95 var eventType = (Enum)Enum.Parse(enumMember.DeclaringType, enumMember.Name);
97 RegisterLogEventType(eventType, eventParamsAttr.ParamNames);
101 var thisType = this.GetType();
103 foreach (
string columnHeading
in LogHeaderColumns)
105 MethodInfo columnValueMethod = thisType.GetMethod(
106 "Get" + columnHeading.Replace(
" ",
"") +
"HeaderColumnValue",
107 BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
109 LogColumnValueProvider columnValueProvider = null;
111 if (columnValueMethod != null)
115 columnValueProvider = Delegate.CreateDelegate(
116 typeof(LogColumnValueProvider), columnValueMethod) as LogColumnValueProvider;
118 _logHeaderColumnValueProviders.Add(columnValueProvider);
122 else _logHeaderColumnValueProviders.Add(null);
125 foreach (
string columnHeading
in LogColumns)
127 MethodInfo columnValueMethod = thisType.GetMethod(
128 "Get" + columnHeading.Replace(
" ",
"") +
"ColumnValue",
129 BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
131 LogColumnValueProvider columnValueProvider = null;
133 if (columnValueMethod != null)
137 columnValueProvider = Delegate.CreateDelegate(
138 typeof(LogColumnValueProvider), columnValueMethod) as LogColumnValueProvider;
140 _logColumnValueProviders.Add(columnValueProvider);
144 else _logColumnValueProviders.Add(null);
147 _logTypeColumnIndex = Array.IndexOf(LogColumns,
"Type");
148 _logEventColumnIndex = Array.IndexOf(LogColumns,
"Event");
158 void OnConnectedToWorldServer ()
160 if (_studyConfig.LoggingEnabled)
163 StartCoroutine(LogMeasures());
173 private static void RegisterLogEventType (Enum eventType, params
string[] paramNames)
175 for (
int i = 0; i < paramNames.Length; i++)
177 var paramName = paramNames[i];
179 if (paramName.Contains(
":"))
181 int colonPos = paramName.IndexOf(
":");
182 string actualParamName = paramName.Substring(0, colonPos);
183 string paramFormat = paramName.Substring(colonPos);
184 paramName = actualParamName +
"={" + i + paramFormat +
"}";
186 else paramName +=
"={" + i +
"}";
188 paramNames[i] = paramName;
191 string eventTypeTypeName = eventType.GetType().Name;
192 eventTypeTypeName = eventTypeTypeName.Remove(eventTypeTypeName.IndexOf(
"LogEvent"));
193 string eventTypeFullName = eventTypeTypeName +
"." + eventType.ToString();
194 _logEventFormats[eventType] = eventTypeFullName +
": {{ " +
string.Join(
", ", paramNames) +
" }}";
197 private static void OpenLogs ()
199 foreach (var logPathPattern
in _studyConfig.LogPaths)
201 string logPath = logPathPattern;
204 .Replace(
"<p>", Game.LocalPlayerID)
205 .Replace(
"<n>", Game.LocalPlayerProfile.Basic.Nickname)
206 .Replace(
"<d>", DateTime.Now.ToString(_instance.
LogDateFormat))
211 try { _logWriters.Add(
new StreamWriter(logPath)); }
218 private static void CloseLogs ()
220 foreach (var logWriter
in _logWriters)
222 if (logWriter != null)
229 private static void WriteLogHeader ()
232 WriteLogLine(
string.Join(
"\t", GetLogHeaderColumnValues()));
233 WriteLogLine(
string.Join(
"\t", _instance.
LogColumns));
236 private static void WriteLogLine (
string line)
238 foreach (var logWriter
in _logWriters)
240 if (logWriter != null)
242 logWriter.WriteLine(line);
248 IEnumerator LogMeasures ()
252 yield
return new WaitForSeconds(MeasureLogInterval);
254 string[] columnValues = GetLogColumnValues();
256 if (_logTypeColumnIndex > -1 && _logTypeColumnIndex < columnValues.Length)
257 columnValues[_logTypeColumnIndex] =
"M";
259 string line =
string.Join(
"\t", columnValues);
264 private static string[] GetLogHeaderColumnValues ()
266 return _logHeaderColumnValueProviders.Select(p => p != null ? p.Invoke() :
"").ToArray();
269 private static string[] GetLogColumnValues ()
271 return _logColumnValueProviders.Select(p => p != null ? p.Invoke() :
"").ToArray();
string LogDateFormat
Formatting for dates in logs.
Attribute to use on enumeration values, marking them as possible log event type.
Study configuration class for game client.
float MeasureLogInterval
The interval at which to log measures.
string LogTimeFileNameFormat
Formatting for times in logs.
string[] LogHeaderColumns
An array of strings representing the log header column headings.
string LogTimeFormat
Formatting for times in logs.
string[] LogColumns
An array of strings representing the log column headings.
ConnectedToWorldServerHandler ConnectedToWorldServer
Event fired when the game client successfully connects to the world server.
string StudyLogsBase
Gets the base path for study logs.
ClientConfig Config
Gets the configuration for this client.
static GameClient Instance
Gets the sole instance of the game client.
Class for managing study-related game components.
static void LogEvent(Enum eventType, params object[] args)
Log a game event.