public static WhatsGoingOn TryToDetermineWhatsGoingOn() {
try {
var log = File.Open(FileUtils.GetLogFilename(), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite).ReadAsStringAndDispose();
if (log.Contains(@"ACClient:: ACP_WRONG_PASSWORD")) {
return new WhatsGoingOn(WhatsGoingOnType.OnlineWrongPassword);
}
if (log.Contains(@"ERROR: RaceManager :: Handshake FAILED")) {
return new WhatsGoingOn(WhatsGoingOnType.OnlineConnectionFailed);
}
if (log.Contains(@"COULD NOT FIND SUSPENSION OBJECT SUSP_")) {
return new WhatsGoingOn(WhatsGoingOnType.SuspensionIsMissing);
}
if (log.Contains(@"COULD NOT FIND SUSPENSION OBJECT WHEEL_")) {
return new WhatsGoingOn(WhatsGoingOnType.WheelsAreMissing);
}
if (log.Contains(@"Error, cannot initialize Post Processing, system/cfg/ppfilters/default.ini not found")) {
return new WhatsGoingOn(WhatsGoingOnType.DefaultPpFilterIsMissing) {
Fix = Fixes.FixMissingDefaultPpFilter
};
}
{
var match = Regex.Match(log, @"ERROR: Shader (.+) NOT FOUND, RETURNING NULL");
if (match.Success) {
var shader = match.Groups[1].Value;
Func<CancellationToken, Task> fix = null;
if (shader == @"ksSkyBox" && AcRootDirectory.Instance.Value != null) {
var model = Regex.Matches(log, @"LOADING MODEL (.+\.kn5)").OfType<Match>().LastOrDefault();
if (model?.Success == true) {
var filename = Path.Combine(AcRootDirectory.Instance.Value, model.Groups[1].Value);
fix = c => Fixes.FixMissingKsSkyBoxShader(filename, c);
}
}
return new WhatsGoingOn(WhatsGoingOnType.ShaderIsMissing, match.Groups[1].Value) {
Fix = fix
};
}
}
{
var match = Regex.Match(log, @"Error, cannot initialize Post Processing, (.+) not found", RegexOptions.CultureInvariant);
if (match.Success) return new WhatsGoingOn(WhatsGoingOnType.PpFilterIsMissing, match.Groups[1].Value);
}
var i = log.IndexOf(@"CRASH in:", StringComparison.Ordinal);
if (i == -1) return null;
var crash = log.Substring(i);
if (crash.Contains(@" evaluateTimeFromTrackSpline")) {
return new WhatsGoingOn(WhatsGoingOnType.TimeAttackNotSupported);
}
if (crash.Contains(@"SkyBox::updateCloudsGeneration")) {
return new WhatsGoingOn(WhatsGoingOnType.CloudsMightBeMissing);
}
if (crash.Contains(@"DriverModel::DriverModel")) {
return new WhatsGoingOn(WhatsGoingOnType.DriverModelIsMissing);
}
} catch (Exception e) {
Logging.Write("Can’t determine what’s going on: " + e);
}
return null;
}
}