Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        /// <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.プレビュー音声ファイル名 : "",
                            });

                            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.プレビュー音声ファイル名 : "";

                            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.プレビュー音声ファイル名 : "";

                            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;
            }
        }
Esempio n. 3
0
        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(ノーツ数);
        }