/// <summary> /// 検索処理の実行 /// </summary> /// <returns></returns> private async Task ExecuteSearch() { try { EnableProcessingMode(); // DBが古い場合はアップグレードする if (DatabaseMigration.GetCurrentVersion() < DatabaseContext.Version) { DatabaseMigration.UpgradeDatabase(); } var parameter = new ActivityLogSearchParameter { IsJoinedRoom = joinCheckBox.IsChecked ?? false, IsMetPlayer = meetCheckBox.IsChecked ?? false, IsSendInvite = sendInvCheckBox.IsChecked ?? false, IsSendRequestInvite = sendReqInvCheckBox.IsChecked ?? false, IsReceivedInvite = recvInvCheckBox.IsChecked ?? false, IsReceivedRequestInvite = recvReqInvCheckBox.IsChecked ?? false, IsSendFriendRequest = sendFriendReqCheckBox.IsChecked ?? false, IsReceivedFriendRequest = recvFriendReqCheckBox.IsChecked ?? false, IsAcceptFriendRequest = acptFriendReqCheckBox.IsChecked ?? false, FromDateTime = fromDatePicker.SelectedDate, UntilDateTime = untilDatePicker.SelectedDate?.AddDays(1), IsReceivedInviteResponse = recvInvResCheckBox.IsChecked ?? false, IsReceivedRequestInviteResponse = recvReqInvResCheckBox.IsChecked ?? false, IsPlayedVideo = videoCheckBox.IsChecked ?? false, }; var activityLogs = await VRChatActivityLogModel.SearchActivityLogs(parameter); var keywords = keywordBox.Text.Split(' ').Where(s => s != string.Empty).ToArray(); ActivityLogGridModelCollection.Clear(); foreach (var activityLog in activityLogs) { var gridModel = new ActivityLogGridModel(activityLog); if (keywords.Any()) { var contained = keywords.All(k => gridModel.Content?.Contains(k, StringComparison.CurrentCultureIgnoreCase) ?? false); if (!contained) { continue; } } ActivityLogGridModelCollection.Add(gridModel); } DisableProcessingMode(); } catch (Exception) { MessageBox.Show("エラーが発生しました。プログラムを終了します。", "VRChatActivityLogViewer", MessageBoxButton.OK, MessageBoxImage.Error); Application.Current.Shutdown(); } }
/// <summary> /// 処理を実行します。 /// </summary> /// <returns></returns> public int Run() { var logger = Logger.GetLogger(); try { ClearErrorInfoFile(); // ログ解析 var activityLogs = new List <ActivityLog>(); foreach (var file in Directory.EnumerateFiles(VRChatLogFilePath, "output_log_*")) { logger.Debug("ログを解析中 " + file); activityLogs.AddRange(ParseVRChatLog(file)); } activityLogs = activityLogs.OrderBy(a => a.Timestamp).ToList(); // DBファイルチェック if (!File.Exists(DatabaseContext.DBFilePath)) { logger.Info("データベースファイルが見つかりませんでした。新しく作成します。"); DatabaseMigration.CreateDatabase(); logger.Info("データベースファイルを作成しました。"); } // DBバージョンチェック var currentVersion = DatabaseMigration.GetCurrentVersion(); if (currentVersion < DatabaseContext.Version) { logger.Info("古いバージョンのデータベースを使用しています。データベースのアップグレードを行います。"); DatabaseMigration.UpgradeDatabase(); logger.Info("データベースをアップグレードしました。"); } else if (DatabaseContext.Version < currentVersion) { throw new InvalidOperationException("新しいバージョンのアプリで作成されたデータベースが存在するため、処理を中断します。"); } // DB更新 using (var db = new DatabaseContext()) { var lastActivity = db.ActivityLogs.Find(db.ActivityLogs.Max(a => a.ID)); if (lastActivity != null) { var idBackup = lastActivity.ID; lastActivity.ID = null; for (int i = 0; i < activityLogs.Count; i++) { if (activityLogs[i].Timestamp == lastActivity.Timestamp) { if (activityLogs[i].Equals(lastActivity)) { activityLogs.RemoveRange(0, i + 1); break; } } } lastActivity.ID = idBackup; } using (var transaction = db.Database.BeginTransaction()) { try { foreach (var activityLog in activityLogs) { db.Add(activityLog); db.SaveChanges(); } transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } } } logger.Info(activityLogs.Count + "件追加しました。"); } catch (Exception ex) { logger.Error(ex); WriteErrorInfoFile(); return(-1); } return(0); }