diff --git a/OngekiScoreLog/app/AggregateBattleScore.php b/OngekiScoreLog/app/AggregateBattleScore.php
new file mode 100644
index 0000000..d47b730
--- /dev/null
+++ b/OngekiScoreLog/app/AggregateBattleScore.php
@@ -0,0 +1,61 @@
+basic_level !== null){
+ foreach ($normalDifficulties as $difficulty) {
+ \App\AggregateBattleScore::record($music->id, $difficulty);
+ }
+ }
+
+ if($music->lunatic_level !== null){
+ \App\AggregateBattleScore::record($music->id, $lunaticDifficulty);
+ }
+ }
+
+ \App\Facades\Slack::Debug("Max Battle Scoreの集計を行いました。");
+ }
+
+ public static function record($song_id, $difficulty){
+ $max = AggregateBattleScore::calculation($song_id, $difficulty);
+
+ $key = $song_id . "_" . $difficulty;
+ AggregateBattleScore::updateOrCreate(
+ ['id' => $key],
+ ['song_id' => $song_id, 'difficulty' => $difficulty, 'max' => $max]
+ );
+ }
+
+ private static function calculation($song_id, $difficulty){
+ $sql = DB::table('score_datas')
+ ->select('song_id', 'difficulty', DB::raw('MAX(battle_high_score) as max_battle_high_score'))
+ ->where('song_id', $song_id)
+ ->where('difficulty', $difficulty)
+ ->groupBy('song_id', 'difficulty')
+ ;
+ try {
+ return $sql->get()[0]->max_battle_high_score;
+ } catch (\Throwable $th) {
+ return 0;
+ }
+ }
+}
diff --git a/OngekiScoreLog/app/Console/Kernel.php b/OngekiScoreLog/app/Console/Kernel.php
index 48d3f58..83ac983 100644
--- a/OngekiScoreLog/app/Console/Kernel.php
+++ b/OngekiScoreLog/app/Console/Kernel.php
@@ -32,10 +32,15 @@ protected function schedule(Schedule $schedule)
\App\Facades\Slack::Info(" すべてのユーザーの課金情報をリセットしました。");
})->monthlyOn(1, '7:00');
+ // Max BattleScoreの集計
+ $schedule->call(function () {
+ \App\AggregateBattleScore::execute();
+ })->dailyAt('4:10');
+
// Max OverDamageの集計
$schedule->call(function () {
\App\AggregateOverdamage::execute();
- })->dailyAt('4:30');
+ })->dailyAt('4:10');
}
/**
diff --git a/OngekiScoreLog/app/Http/Controllers/AdminController.php b/OngekiScoreLog/app/Http/Controllers/AdminController.php
index 8012529..4e88c4a 100644
--- a/OngekiScoreLog/app/Http/Controllers/AdminController.php
+++ b/OngekiScoreLog/app/Http/Controllers/AdminController.php
@@ -143,6 +143,12 @@ public function GetApply($type, $action = null){
return redirect('/admin?message=' . $message);
}
+ public function GetGenerateBattleScore(){
+ ini_set("max_execution_time", 0);
+ \App\AggregateBattleScore::execute();
+ return redirect('/admin?message=' . "Generate Battle Score: max. 実行しました!");
+ }
+
public function GetGenerateOverDamage(){
ini_set("max_execution_time", 0);
\App\AggregateOverdamage::execute();
diff --git a/OngekiScoreLog/app/Http/Controllers/ViewUserController.php b/OngekiScoreLog/app/Http/Controllers/ViewUserController.php
index 107d36e..e2d7446 100644
--- a/OngekiScoreLog/app/Http/Controllers/ViewUserController.php
+++ b/OngekiScoreLog/app/Http/Controllers/ViewUserController.php
@@ -8,6 +8,7 @@
use App\User;
use App\UserStatus;
use App\ScoreData;
+use App\AggregateBattleScore;
use App\AggregateOverdamage;
use App\Facades\OngekiUtility;
use DateTime;
@@ -44,7 +45,7 @@ public function getUserPage(Request $request, $id, $mode = null){
}
$status[0]->badge = "";
if($user->role == 7){
- $status[0]->badge .= ' ProjectPrimera Developer';
+ $status[0]->badge .= ' ProjectPrimera Developer';
}
if(\App\UserInformation::IsPremiumPlan($user->id)){
$status[0]->badge .= ' OngekiNet Premium';
@@ -340,6 +341,73 @@ public function getUserPage(Request $request, $id, $mode = null){
return view('user', compact('id', 'status', 'score', 'stat', 'mode', 'submenuActive', 'sidemark', 'archive'));
}
+
+ public function getBattleScorePage($id, $difficulty = ""){
+ // 存在しないdifficultyが指定された場合はリダイレクト
+ if(!in_array($difficulty, ["", "basic", "advanced", "expert", "master", "lunatic"])){
+ return redirect("/user/" . $id . "/battlescore");
+ }
+
+ $userStatus = new UserStatus();
+ $user = User::where('id' ,$id)->first();
+ $status = $userStatus->getRecentUserData($id);
+ if(count($status) === 0){
+ if(is_null($user)){
+ abort(404);
+ }else{
+ return view("user_error", ['message' => '
このユーザーはOngekiScoreLogに登録していますが、オンゲキNETからスコア取得を行っていません。(UserID: ' . $id . ')
スコアの取得方法はこちらをお読みください。
']);
+ }
+ }
+ $status[0]->badge = "";
+ if($user->role == 7){
+ $status[0]->badge .= ' ProjectPrimera Developer';
+ }
+ if(\App\UserInformation::IsPremiumPlan($user->id)){
+ $status[0]->badge .= ' OngekiNet Premium';
+ }else if(\App\UserInformation::IsStandardPlan($user->id)){
+ $status[0]->badge .= ' OngekiNet Standard';
+ }
+
+ // トップランカーのスコアを取得してkey: song_id, difficulty, value: over_damage_high_score の配列を作る
+ $lastUpdate = (new DateTime())->setTimestamp(0);
+ $topRankerScore = [];
+ {
+ $temp = AggregateBattleScore::all();
+ foreach ($temp as $value) {
+ $key = $value->song_id . "_" . $value->difficulty;
+ $topRankerScore[$key] = $value->max;
+
+ // 最終更新日時を取得
+ if($lastUpdate < $value->updated_at){
+ $lastUpdate = $value->updated_at;
+ }
+ }
+ }
+
+ // 自分のスコアを取得
+ $score = (new ScoreData)->getRecentUserScore($id)->addMusicData()->exclusionDeletedMusic()->getValue();
+
+ // 難易度を指定のものに絞る
+ $scoreDatas = [];
+ {
+ foreach ($score as $value) {
+ $key = $value->song_id;
+ if($value->over_damage_high_score !== "0.00"){
+ if(($difficulty === "" && ($value->difficulty === 3 || $value->difficulty === 10))
+ || ($difficulty === "basic" && $value->difficulty === 0)
+ || ($difficulty === "advanced" && $value->difficulty === 1)
+ || ($difficulty === "expert" && $value->difficulty === 2)
+ || ($difficulty === "master" && $value->difficulty === 3)
+ || ($difficulty === "lunatic" && $value->difficulty === 10)
+ ){
+ $scoreDatas[] = $value;
+ }
+ }
+ }
+ }
+ return view('user_battlescore', compact('id', 'difficulty', 'status', 'lastUpdate', 'scoreDatas', 'topRankerScore'));
+ }
+
public function getOverDamegePage($id, $difficulty = ""){
// 存在しないdifficultyが指定された場合はリダイレクト
if(!in_array($difficulty, ["", "basic", "advanced", "expert", "master", "lunatic"])){
@@ -358,7 +426,7 @@ public function getOverDamegePage($id, $difficulty = ""){
}
$status[0]->badge = "";
if($user->role == 7){
- $status[0]->badge .= ' ProjectPrimera Developer';
+ $status[0]->badge .= ' ProjectPrimera Developer';
}
if(\App\UserInformation::IsPremiumPlan($user->id)){
$status[0]->badge .= ' OngekiNet Premium';
diff --git a/OngekiScoreLog/app/Http/Controllers/ViewUserTrophyController.php b/OngekiScoreLog/app/Http/Controllers/ViewUserTrophyController.php
index 9423705..e4fff2b 100644
--- a/OngekiScoreLog/app/Http/Controllers/ViewUserTrophyController.php
+++ b/OngekiScoreLog/app/Http/Controllers/ViewUserTrophyController.php
@@ -29,7 +29,7 @@ function getIndex(int $id){
$status[0]->badge = "";
if($user->role == 7){
- $status[0]->badge .= ' ProjectPrimera Developer';
+ $status[0]->badge .= ' ProjectPrimera Developer';
}
if(\App\UserInformation::IsPremiumPlan($user->id)){
$status[0]->badge .= ' OngekiNet Premium';
@@ -37,7 +37,7 @@ function getIndex(int $id){
$status[0]->badge .= ' OngekiNet Standard';
}
- $trophies = json_decode(json_encode(UserTrophy::where('user_id', $id)->get()), true);
+ $trophies = json_decode(json_encode(UserTrophy::where('user_id', $id)->orderBy('grade', 'desc')->orderBy('updated_at', 'desc')->get()), true);
$trophyIdToStr = [
0 => "ノーマル",
diff --git a/OngekiScoreLog/database/migrations/2024_04_26_000000_create_aggregate_battlescore.php b/OngekiScoreLog/database/migrations/2024_04_26_000000_create_aggregate_battlescore.php
new file mode 100644
index 0000000..06742a6
--- /dev/null
+++ b/OngekiScoreLog/database/migrations/2024_04_26_000000_create_aggregate_battlescore.php
@@ -0,0 +1,34 @@
+string('id')->primary();
+ $table->integer('song_id')->unsigned();
+ $table->integer("difficulty")->unsigned();
+ $table->integer("max");
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('aggregate_battlescore');
+ }
+}
diff --git a/OngekiScoreLog/resources/views/admin/index.blade.php b/OngekiScoreLog/resources/views/admin/index.blade.php
index b80b4dd..081511b 100644
--- a/OngekiScoreLog/resources/views/admin/index.blade.php
+++ b/OngekiScoreLog/resources/views/admin/index.blade.php
@@ -43,6 +43,10 @@
統計データ生成
超絶重いので実行する時間とタイミングに注意!
+ Battle Score
+
+
+
Over Damage
diff --git a/OngekiScoreLog/resources/views/layouts/components/sidebar.blade.php b/OngekiScoreLog/resources/views/layouts/components/sidebar.blade.php
index 27d1e40..d9c3096 100644
--- a/OngekiScoreLog/resources/views/layouts/components/sidebar.blade.php
+++ b/OngekiScoreLog/resources/views/layouts/components/sidebar.blade.php
@@ -19,7 +19,7 @@
簡易表示
詳細表示
Technical Score
- Battle Score
+ Battle Score
Over Damage
称号
レーティング情報
diff --git a/OngekiScoreLog/resources/views/layouts/components/user/song_status_battlescore.blade.php b/OngekiScoreLog/resources/views/layouts/components/user/song_status_battlescore.blade.php
new file mode 100644
index 0000000..cf974f9
--- /dev/null
+++ b/OngekiScoreLog/resources/views/layouts/components/user/song_status_battlescore.blade.php
@@ -0,0 +1,77 @@
+
+
登録されている全ユーザーのバトルスコアのうち、一番高いものと比較することが出来ます。
+ (※全国ランキング1位のスコアではありません!)
+
最終更新: {{$lastUpdate->format('Y-m-d H:i:s')}} (?%表示は未集計です)
+
+
+
+
+
+ @component('layouts/components/user/table_scale_button') @endcomponent
+
+
+
+
+
+ Title |
+ Dif |
+ BS |
+ Top |
+ diff |
+ 達成度 |
+ Update |
+
+
+
+
+ Title |
+ Dif |
+ BS |
+ Top |
+ diff |
+ 達成度 |
+ Update |
+
+
+
+ @foreach ($score as $s)
+
+ {{$s->title}}song_id . "/" . strtolower($s->difficulty_str))}}">{{$s->title}} |
+ {{$s->difficulty}}{{substr($s->difficulty_str, 0, 3)}} |
+ {{number_format($s->battle_high_score)}} |
+ @if (array_key_exists($s->song_id . "_" . $s->difficulty, $topRankerScore))
+ {{number_format($topRankerScore[$s->song_id . "_" . $s->difficulty])}} |
+ {{number_format(abs(($s->battle_high_score - $topRankerScore[$s->song_id . "_" . $s->difficulty])))}} |
+ @if ($topRankerScore[$s->song_id . "_" . $s->difficulty] == 0)
+ {{-- ありえなさそうだけどDIV/0対策 --}}
+ 100.00% |
+ @elseif ($s->battle_high_score == $topRankerScore[$s->song_id . "_" . $s->difficulty])
+ {{-- 1位なので100%! --}}
+ 100.00% |
+ @elseif ($s->battle_high_score == 0)
+ {{-- 未プレイなので0%にする --}}
+ 0.00% |
+ @else
+ {{-- 1位ではないので計算 --}}
+ {{number_format(floor((($s->battle_high_score / $topRankerScore[$s->song_id . "_" . $s->difficulty]))))}}% |
+ @endif
+ @else
+ ?% |
+ ?% |
+ ?% |
+ @endif
+ {{date('Y-m-d', strtotime($s->updated_at))}} |
+
+ @endforeach
+
+
+
+
+
diff --git a/OngekiScoreLog/resources/views/user.blade.php b/OngekiScoreLog/resources/views/user.blade.php
index 54f9fb0..c18b5af 100644
--- a/OngekiScoreLog/resources/views/user.blade.php
+++ b/OngekiScoreLog/resources/views/user.blade.php
@@ -15,7 +15,7 @@
-
+ Battle
OverDamage
称号
Rating
diff --git a/OngekiScoreLog/resources/views/user_battlescore.blade.php b/OngekiScoreLog/resources/views/user_battlescore.blade.php
new file mode 100644
index 0000000..3328b03
--- /dev/null
+++ b/OngekiScoreLog/resources/views/user_battlescore.blade.php
@@ -0,0 +1,72 @@
+@extends('layouts.app')
+
+@section('title', $status[0]->name)
+@section('hero_subtitle', $status[0]->trophy)
+@section('hero_title', $status[0]->name)
+@section('additional_head')
+
+@endsection
+@section('additional_footer')
+
+
+@endsection
+@section('sidemark_mypage_battle', "is-active")
+
+@section('submenu')
+ 簡易
+ 詳細
+ Technical
+ Battle
+ OverDamage
+ 称号
+ Rating
+ 更新差分
+@endsection
+
+@section('content')
+ @component('layouts/components/user/user_status')
+ @slot('badge')
+ {!!$status[0]->badge!!}
+ @endslot
+ @slot('name')
+ {{$status[0]->name}}
+ @endslot
+ @slot('trophy')
+ {{$status[0]->trophy}}
+ @endslot
+ @slot('level')
+ {{$status[0]->level}}
+ @endslot
+ @slot('battle_point')
+ {{$status[0]->battle_point}}
+ @endslot
+ @slot('rating')
+ {{$status[0]->rating}}
+ @endslot
+ @slot('rating_max')
+ {{$status[0]->rating_max}}
+ @endslot
+ @slot('money')
+ {{$status[0]->money}}
+ @endslot
+ @slot('money_max')
+ {{$status[0]->total_money}}
+ @endslot
+ @slot('total_play')
+ {{$status[0]->total_play}}
+ @endslot
+ @slot('friend_code')
+ {{$status[0]->friend_code}}
+ @endslot
+ @slot('comment')
+ {!! nl2br(e($status[0]->comment)) !!}
+ @endslot
+ @endcomponent
+
+ {{-- @component('layouts/components/user/song_filter')
+ @endcomponent --}}
+
+ @component('layouts/components/user/song_status_battlescore', ['score' => $scoreDatas, 'topRankerScore' => $topRankerScore, 'id' => $id, 'difficulty' => $difficulty, 'lastUpdate' => $lastUpdate])
+ @endcomponent
+
+@endsection
diff --git a/OngekiScoreLog/resources/views/user_music.blade.php b/OngekiScoreLog/resources/views/user_music.blade.php
index c9d695b..77fc6c7 100644
--- a/OngekiScoreLog/resources/views/user_music.blade.php
+++ b/OngekiScoreLog/resources/views/user_music.blade.php
@@ -19,8 +19,9 @@
@section('submenu')
簡易
詳細
- Battle
Technical
+ Battle
+ OverDamage
称号
Rating
更新差分
diff --git a/OngekiScoreLog/resources/views/user_overdamage.blade.php b/OngekiScoreLog/resources/views/user_overdamage.blade.php
index 9933e0d..c92805a 100644
--- a/OngekiScoreLog/resources/views/user_overdamage.blade.php
+++ b/OngekiScoreLog/resources/views/user_overdamage.blade.php
@@ -16,7 +16,7 @@
簡易
詳細
Technical
- Battle
+ Battle
OverDamage
称号
Rating
diff --git a/OngekiScoreLog/resources/views/user_progress.blade.php b/OngekiScoreLog/resources/views/user_progress.blade.php
index 71bc478..fc8cfa7 100644
--- a/OngekiScoreLog/resources/views/user_progress.blade.php
+++ b/OngekiScoreLog/resources/views/user_progress.blade.php
@@ -15,7 +15,7 @@
簡易
詳細
Technical
- Battle
+ Battle
OverDamage
称号
Rating
diff --git a/OngekiScoreLog/resources/views/user_rating.blade.php b/OngekiScoreLog/resources/views/user_rating.blade.php
index f11f619..37f2b48 100644
--- a/OngekiScoreLog/resources/views/user_rating.blade.php
+++ b/OngekiScoreLog/resources/views/user_rating.blade.php
@@ -15,7 +15,7 @@
簡易
詳細
Technical
- Battle
+ Battle
OverDamage
称号
Rating
diff --git a/OngekiScoreLog/resources/views/user_rating_error.blade.php b/OngekiScoreLog/resources/views/user_rating_error.blade.php
index 730497e..e69affa 100644
--- a/OngekiScoreLog/resources/views/user_rating_error.blade.php
+++ b/OngekiScoreLog/resources/views/user_rating_error.blade.php
@@ -15,7 +15,7 @@
簡易
詳細
Technical
- Battle
+ Battle
OverDamage
称号
Rating
diff --git a/OngekiScoreLog/resources/views/user_trophy.blade.php b/OngekiScoreLog/resources/views/user_trophy.blade.php
index 5210c9d..02f3ce6 100644
--- a/OngekiScoreLog/resources/views/user_trophy.blade.php
+++ b/OngekiScoreLog/resources/views/user_trophy.blade.php
@@ -15,7 +15,7 @@
簡易
詳細
Technical
- Battle
+ Battle
OverDamage
称号
Rating
@@ -83,14 +83,14 @@
- @for ($i = count($trophies) - 1; $i >= 0; --$i)
-
- {{$trophies[$i]['name']}} |
- {{$trophies[$i]['grade']}}{{$trophyIdToStr[$trophies[$i]['grade']]}} |
- {{$trophies[$i]['detail']}} |
- {{date('Y-m-d', strtotime($trophies[$i]['updated_at']))}} |
-
- @endfor
+ @foreach ($trophies as $trophy)
+
+ {{$trophy['name']}} |
+ {{$trophy['grade']}}{{$trophyIdToStr[$trophy['grade']]}} |
+ {{$trophy['detail']}} |
+ {{date('Y-m-d', strtotime($trophy['updated_at']))}} |
+
+ @endforeach
diff --git a/OngekiScoreLog/routes/web.php b/OngekiScoreLog/routes/web.php
index aa1f1c5..67cb5bd 100644
--- a/OngekiScoreLog/routes/web.php
+++ b/OngekiScoreLog/routes/web.php
@@ -20,6 +20,7 @@
Route::get('/user/{id}/trophy', 'ViewUserTrophyController@getIndex')->where(['id' => '\d+']);
Route::get('/user/{id}/music/{music}/{difficulty}', 'ViewUserMusicController@getIndex')->where(['id' => '\d+', 'music' => '\d+', 'difficulty' => '\w+']);
Route::get('/user/{id}/music/{music}', 'ViewUserMusicController@getRedirect')->where(['id' => '\d+', 'music' => '\d+']);
+Route::get('/user/{id}/battlescore/{difficulty?}', 'ViewUserController@getBattleScorePage')->where(['id' => '\d+', 'difficulty' => '\w+']);
Route::get('/user/{id}/overdamage/{difficulty?}', 'ViewUserController@getOverDamegePage')->where(['id' => '\d+', 'difficulty' => '\w+']);
Route::get('/user/{id}/{mode?}', 'ViewUserController@getUserPage')->where(['id' => '\d+']);
@@ -59,6 +60,7 @@
Route::get('/admin/config', 'AdminController@GetConfig');
Route::get('/admin/aggregate', 'AdminController@GetAggregate');
Route::get('/admin/apply/{type}/{action?}', 'AdminController@GetApply');
+ Route::get('/admin/generate/battle-score', 'AdminController@GetGenerateBattleScore');
Route::get('/admin/generate/over-damage', 'AdminController@GetGenerateOverDamage');
Route::get('/admin/log/{path}/{fileName}', 'SimpleViewController@getLogFile');
});