Exemplo n.º 1
0
        private async Task <AccumulateResult> AccumulateScoreAsync(
            FEZScreenShooter shooter, FEZScoreAnalyzer analyzer, ScoreFileRepository scoreFileRepository,
            ScoreScreenShotRepository screenShotRepository, ScoreRepository scoreRepository, AppSetting appSetting,
            CancellationToken token)
        {
            try
            {
                // スクリーンショットを取得
                using (var bitmap = shooter.Shoot())
                {
                    if (bitmap == null)
                    {
                        return(AccumulateResult.FEZNotRunning);
                    }

                    // スクリーンショットからスコアを取得
                    var score = analyzer.Analyze(bitmap);

                    // 取得できなければ終了
                    if (score == null)
                    {
                        return(AccumulateResult.NotScoreCapture);
                    }

                    // スコア画面を開きながらアプリを再起動した場合などを想定して、
                    // 最新スコアの詳細スコアが全て同じものは既に登録済みとして終了する
                    var latestScore = LatestScore.Value;
                    if (score.PC与ダメージ == latestScore.PC与ダメージ &&
                        score.キルダメージボーナス == latestScore.キルダメージボーナス &&
                        score.召喚解除ボーナス == latestScore.召喚解除ボーナス &&
                        score.建築与ダメージ == latestScore.建築与ダメージ &&
                        score.領域破壊ボーナス == latestScore.領域破壊ボーナス &&
                        score.領域ダメージボーナス == latestScore.領域ダメージボーナス &&
                        score.貢献度 == latestScore.貢献度 &&
                        score.クリスタル運用ボーナス == latestScore.クリスタル運用ボーナス &&
                        score.召喚行動ボーナス == latestScore.召喚行動ボーナス)
                    {
                        return(AccumulateResult.NotScoreCapture);
                    }

                    RegisterToDbUpdateWhenPropertyChanged(score);

                    // 画像保存
                    if (appSetting.IsAutoImageSave.Value)
                    {
                        await screenShotRepository.SaveAsPngAsync(score, bitmap);
                    }

                    // テキスト保存
                    if (appSetting.IsLatestScoreOutputAsText.Value)
                    {
                        await scoreFileRepository.SaveAsLatestScoreAsync(appSetting.LatestScoreTextFormat.Value, score);
                    }

                    // DB保存
                    await scoreRepository.ScoreDbSet.AddAsync(score);

                    await scoreRepository.SaveChangesAsync();

                    // プロパティも更新
                    ScoreCollection.Add(score);
                    LatestScore.Value = score;
                }
            }
            catch (OperationCanceledException)
            { }
            catch (Exception ex)
            {
                ApplicationError.HandleUnexpectedError(ex);
            }

            return(AccumulateResult.Successed);
        }