Esempio n. 1
0
        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);
            }
        }
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 拡張子名  = 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;
            }
        }
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(ノーツ数);
        }