public ユーザ管理() { this.ユーザリスト = new SelectableList <ユーザ設定>(); // 現在は、AutoPlayer と Guest しかいない。 var user = (ユーザ設定)null; user = new ユーザ設定("AutoPlayer"); if (null == user.ユーザID) // DBにいない { user = ユーザ設定.作成する(new User() { Id = "AutoPlayer", Name = "AutoPlayer", }); } if (null != user) { this.ユーザリスト.Add(user); } user = new ユーザ設定("Guest"); if (null == user.ユーザID) // DBにいない { user = ユーザ設定.作成する(new User() { Id = "Guest", Name = "Guest", AutoPlay_LeftCymbal = 0, AutoPlay_HiHat = 0, AutoPlay_LeftPedal = 0, AutoPlay_Snare = 0, AutoPlay_Bass = 0, AutoPlay_HighTom = 0, AutoPlay_LowTom = 0, AutoPlay_FloorTom = 0, AutoPlay_RightCymbal = 0, // 他は規定値 }); } #if DEBUG_ // hack: テストコード: デバッグ用に固定パスを使用する。 user.曲検索フォルダ.Add(new VariablePath(@"$(Exe)..\..\..\曲データ")); #endif if (null != user) { this.ユーザリスト.Add(user); } }
/// <summary> /// 指定した曲ファイルに対応するレコードがデータベースになければレコードを追加し、 /// あればそのレコードを更新する。 /// </summary> public static void 曲を追加または更新する(VariablePath 曲ファイルパス, ユーザ設定 ユーザ設定) { try { using (var songdb = new SongDB()) { var 一パス検索クエリ = songdb.Songs.Where((song) => (song.Path == 曲ファイルパス.数なしパス)); if (0 == 一パス検索クエリ.Count()) { // (A) 同一パスを持つレコードがDBになかった var 調べる曲のハッシュ = _ファイルのハッシュを算出して返す(曲ファイルパス); var 一ハッシュレコード = songdb.Songs.Where((song) => (song.HashId == 調べる曲のハッシュ)).SingleOrDefault(); if (null == 一ハッシュレコード) { #region " (A-a) 同一ハッシュを持つレコードがDBになかった → 新規追加 " //---------------- var 拡張子名 = Path.GetExtension(曲ファイルパス.数なしパス); var score = (SSTFormatCurrent.スコア)null; #region " スコアを読み込む " //---------------- if (".sstf" == 拡張子名) { score = new SSTFormatCurrent.スコア(曲ファイルパス.数なしパス); } else if (".dtx" == 拡張子名) { score = SSTFormatCurrent.DTXReader.ReadFromFile(曲ファイルパス.数なしパス); } else { throw new Exception($"未対応のフォーマットファイルです。[{曲ファイルパス.変数付きパス}]"); } //---------------- #endregion using ( score ) { // Songs レコード新規追加。 var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); songdb.Songs.InsertOnSubmit( new Song() { HashId = _ファイルのハッシュを算出して返す(曲ファイルパス), Title = score.曲名, Path = 曲ファイルパス.数なしパス, LastWriteTime = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"), Level = score.難易度, MinBPM = BPMs.最小BPM, MaxBPM = BPMs.最大BPM, TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCrash], TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat], TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot], TotalNotes_Snare = ノーツ数[表示レーン種別.Snare], TotalNotes_Bass = ノーツ数[表示レーン種別.Bass], TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1], TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2], TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3], TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCrash], // プレビュー画像は、曲ファイルからの相対パス。 PreImage = (score.プレビュー画像.Nullでも空でもない()) ? Path.Combine(Path.GetDirectoryName(曲ファイルパス.数なしパス), score.プレビュー画像) : "", Artist = score.アーティスト名, }); } songdb.DataContext.SubmitChanges(); Log.Info($"DBに曲を追加しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } else { #region " (A-b) 同一ハッシュを持つレコードがDBにあった → 更新 " //---------------- var 拡張子名 = Path.GetExtension(曲ファイルパス.数なしパス); var score = (SSTFormatCurrent.スコア)null; #region " スコアを読み込む " //---------------- if (".sstf" == 拡張子名) { score = new SSTFormatCurrent.スコア(曲ファイルパス.数なしパス); } else if (".dtx" == 拡張子名) { score = SSTFormatCurrent.DTXReader.ReadFromFile(曲ファイルパス.数なしパス); } else { throw new Exception($"未対応のフォーマットファイルです。[{曲ファイルパス.変数付きパス}]"); } //---------------- #endregion using ( score ) { // Songs レコード更新。 var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); var song = 一ハッシュレコード; song.Title = score.曲名; song.Path = 曲ファイルパス.数なしパス; song.LastWriteTime = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"); song.Level = score.難易度; song.MinBPM = BPMs.最小BPM; song.MaxBPM = BPMs.最大BPM; song.TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCrash]; song.TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat]; song.TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot]; song.TotalNotes_Snare = ノーツ数[表示レーン種別.Snare]; song.TotalNotes_Bass = ノーツ数[表示レーン種別.Bass]; song.TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1]; song.TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2]; song.TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3]; song.TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCrash]; // プレビュー画像は、曲ファイルからの相対パス。 song.PreImage = (score.プレビュー画像.Nullでも空でもない()) ? Path.Combine(Path.GetDirectoryName(曲ファイルパス.数なしパス), score.プレビュー画像) : ""; song.Artist = score.アーティスト名; } songdb.DataContext.SubmitChanges(); Log.Info($"パスが異なりハッシュが同一であるレコードが検出されたため、曲の情報を更新しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } } else { // (B) 同一パスを持つレコードがDBにあった var record = 一パス検索クエリ.Single(); string レコードの最終更新日時 = record.LastWriteTime; string 調べる曲の最終更新日時 = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"); if (レコードの最終更新日時 != 調べる曲の最終更新日時) { #region " (B-a) 最終更新日時が変更されている → 更新 " //---------------- var 拡張子名 = Path.GetExtension(曲ファイルパス.数なしパス); var score = (SSTFormatCurrent.スコア)null; #region " スコアを読み込む " //---------------- if (".sstf" == 拡張子名) { score = new SSTFormatCurrent.スコア(曲ファイルパス.数なしパス); } else if (".dtx" == 拡張子名) { score = SSTFormatCurrent.DTXReader.ReadFromFile(曲ファイルパス.数なしパス); } else { throw new Exception($"未対応のフォーマットファイルです。[{曲ファイルパス.変数付きパス}]"); } //---------------- #endregion using ( score ) { var hash = _ファイルのハッシュを算出して返す(曲ファイルパス); var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); // HashId 以外のカラムを更新する。 record.Title = score.曲名; record.LastWriteTime = 調べる曲の最終更新日時; record.Level = score.難易度; record.MinBPM = BPMs.最小BPM; record.MaxBPM = BPMs.最大BPM; record.TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCrash]; record.TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat]; record.TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot]; record.TotalNotes_Snare = ノーツ数[表示レーン種別.Snare]; record.TotalNotes_Bass = ノーツ数[表示レーン種別.Bass]; record.TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1]; record.TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2]; record.TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3]; record.TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCrash]; // プレビュー画像は、曲ファイルからの相対パス。 record.PreImage = (score.プレビュー画像.Nullでも空でもない()) ? Path.Combine(Path.GetDirectoryName(曲ファイルパス.数なしパス), score.プレビュー画像) : ""; record.Artist = score.アーティスト名; if (hash != record.HashId) { // ハッシュはキーなので、これが変わったら、古いレコードを削除して、新しいレコードを追加する。 var newRecord = record.Clone(); songdb.Songs.DeleteOnSubmit(record); songdb.DataContext.SubmitChanges(); // 一度Submitして先にレコード削除を確定しないと、次のInsertがエラーになる。(PathカラムはUnique属性なので) newRecord.HashId = hash; songdb.Songs.InsertOnSubmit(newRecord); } songdb.DataContext.SubmitChanges(); } Log.Info($"最終更新日時が変更されているため、曲の情報を更新しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } else { #region " (B-b) それ以外 " //---------------- //---------------- #endregion } } } } catch (Exception e) { Log.ERROR($"曲DBへの曲の追加に失敗しました。({e.Message})[{曲ファイルパス.変数付きパス}]"); throw; } }
private static Dictionary <表示レーン種別, int> _ノーツ数を算出して返す(SSTFormatCurrent.スコア score, ユーザ設定 ユーザ設定) { var ノーツ数 = new Dictionary <表示レーン種別, int>(); foreach (表示レーン種別 lane in Enum.GetValues(typeof(表示レーン種別))) { ノーツ数.Add(lane, 0); } foreach (var chip in score.チップリスト) { var チップの対応表 = ユーザ設定.ドラムとチップと入力の対応表[chip.チップ種別]; // AutoPlay ON のチップは、すべてがONである場合を除いて、カウントしない。 if (ユーザ設定.AutoPlay[チップの対応表.AutoPlay種別]) { if (!(ユーザ設定.AutoPlayがすべてONである)) { continue; } } // AutoPlay OFF 時でもユーザヒットの対象にならないチップはカウントしない。 if (!(チップの対応表.AutoPlayOFF.ユーザヒット)) { continue; } ノーツ数[チップの対応表.表示レーン種別]++; } return(ノーツ数); }