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.