// 生成と終了 public ユーザ管理() { using (Log.Block(FDKUtilities.現在のメソッド名)) { this.ユーザリスト = new SelectableList <ユーザ設定>(); // 現在は、AutoPlayer と Guest しかいない。 var user = (ユーザ設定)null; user = new ユーザ設定("AutoPlayer"); if (null == user.ユーザID) // DBにいない { Log.Info("ユーザ AutoPlayer がデータベースに存在していません。"); user = ユーザ設定.作成する(new User() { Id = "AutoPlayer", Name = "AutoPlayer", }); Log.Info("ユーザ 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 (null != user) { this.ユーザリスト.Add(user); } } }
private int _総ノーツ数を算出して返す(SSTFormatCurrent.スコア score, ユーザ設定 options) { int 総ノーツ数 = 0; foreach (var chip in score.チップリスト) { var ドラムチッププロパティ = options.ドラムチッププロパティ管理[chip.チップ種別]; // AutoPlay ON のチップは、すべての AutoPlay が ON である場合を除いて、カウントしない。 //if( options.AutoPlay[ ドラムチッププロパティ.AutoPlay種別 ] && // !( options.AutoPlayがすべてONである ) ) // continue; // AutoPlay OFF 時でもユーザヒットの対象にならないチップはカウントしない。 //if( !( ドラムチッププロパティ.AutoPlayOFF_ユーザヒット ) ) // continue; bool 判定対象である = true; bool チップのAutoPlayはONである = options.AutoPlay[ドラムチッププロパティ.AutoPlay種別]; if (チップのAutoPlayはONである) { if (options.AutoPlayがすべてONである) { 判定対象である = ドラムチッププロパティ.AutoPlayON_自動ヒット_判定; } else { 判定対象である = false; } } else { 判定対象である = ドラムチッププロパティ.AutoPlayOFF_ユーザヒット_判定; } if (判定対象である) { 総ノーツ数++; } } return(総ノーツ数); }
// 操作 public void スコアと設定を反映する(SSTFormatCurrent.スコア 譜面, ユーザ設定 設定) { this.総ノーツ数 = (null != 譜面 && null != 設定) ? this._総ノーツ数を算出して返す(譜面, 設定) : 0; this._譜面レベル = 譜面?.難易度 ?? 0.5; }
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(ノーツ数); }
/// <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 score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); // 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 = ノーツ数[表示レーン種別.LeftCymbal], TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat], TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot], TotalNotes_Snare = ノーツ数[表示レーン種別.Snare], TotalNotes_Bass = ノーツ数[表示レーン種別.Bass], TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1], TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2], TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3], TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCymbal], PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : "", Artist = score.アーティスト名, PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : "", BGMAdjust = 0, }); songdb.DataContext.SubmitChanges(); Log.Info($"DBに曲を追加しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } else { #region " (A-b) 同一ハッシュを持つレコードがDBにあった → 更新 " //---------------- var 拡張子名 = Path.GetExtension(曲ファイルパス.数なしパス); var score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); // 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 = ノーツ数[表示レーン種別.LeftCymbal]; 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 = ノーツ数[表示レーン種別.RightCymbal]; song.PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : ""; song.Artist = score.アーティスト名; song.PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : ""; song.BGMAdjust = song.BGMAdjust; 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 score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); 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 = ノーツ数[表示レーン種別.LeftCymbal]; 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 = ノーツ数[表示レーン種別.RightCymbal]; record.PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : ""; record.Artist = score.アーティスト名; record.PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : ""; record.BGMAdjust = record.BGMAdjust; 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への曲の追加に失敗しました。({VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )})[{曲ファイルパス.変数付きパス}]"); //throw; } }