diff --git a/app/Console/Commands/HelixRankCheckCommand.php b/app/Console/Commands/HelixRankCheckCommand.php new file mode 100644 index 0000000..594f118 --- /dev/null +++ b/app/Console/Commands/HelixRankCheckCommand.php @@ -0,0 +1,67 @@ +getFreeCompanyByName('Siren', 'Helix', $apiService); + $members = $fcInfo->content['FreeCompanyMembers']; + foreach ($members as $member) { + $rankedUser = FreeCompanyRankedUser::where('lodestoneId', $member['ID'])->first(); + + if ($rankedUser === null) + { + $rankedUser = new FreeCompanyRankedUser; + $rankedUser->lodestoneId = $member['ID']; + } + + $rankedUser->displayName = $member['Name']; + $rankedUser->ingameRole = $member['Rank']; + $rankedUser->lastSeen = Carbon::now(); + if ($rankedUser->firstSeen === null) + $rankedUser->firstSeen = Carbon::now(); + + $rankedUser->save(); + } + + return 0; + } +} diff --git a/app/FreeCompanyRankedUser.php b/app/FreeCompanyRankedUser.php new file mode 100644 index 0000000..f76d24d --- /dev/null +++ b/app/FreeCompanyRankedUser.php @@ -0,0 +1,22 @@ +toArray(); + $members = array_map(function ($e) { + $e['lodestoneId'] = (string)$e['lodestoneId']; + $e['shouldBeRole'] = null; + + $editable_roles = config('chaosapi.helix.rank_time'); + // We don't want to edit council or mentor + if (!in_array($e['ingameRole'], array_keys($editable_roles))) return $e; + + // Keep track of the highest role + $highest_role = $e['ingameRole']; + foreach ($editable_roles as $role => $min_days) { + if ($min_days === null) continue; + + $min_date = Carbon::parse($e['firstSeen'])->addDays($min_days); + if ($min_date <= Carbon::now()) + $highest_role = $role; + } + + if (array_search($e['ingameRole'], array_keys($editable_roles)) < array_search($highest_role, array_keys($editable_roles))) + $e['shouldBeRole'] = $highest_role; + + return $e; + }, $members); + + return [ + 'success' => true, + 'error' => null, + 'data' => $members + ]; + } +} diff --git a/config/chaosapi.php b/config/chaosapi.php index a3ebc82..71a088d 100644 --- a/config/chaosapi.php +++ b/config/chaosapi.php @@ -3,5 +3,13 @@ return [ 'middleware-enabled' => !env('APP_DEBUG', false), - 'cachetime' => 60 + 'cachetime' => 60, + + 'helix' => [ + 'rank_time' => [ + "Recruit" => 0, + "Initiate" => 14, + "Member" => 44, + ] + ] ]; diff --git a/database/migrations/2020_09_04_212949_create_free_company_ranked_users_table.php b/database/migrations/2020_09_04_212949_create_free_company_ranked_users_table.php new file mode 100644 index 0000000..b9a3674 --- /dev/null +++ b/database/migrations/2020_09_04_212949_create_free_company_ranked_users_table.php @@ -0,0 +1,34 @@ +bigInteger('lodestoneId')->unsigned()->primary(); + $table->string('ingameRole', 127); + $table->dateTime('firstSeen'); + $table->string('displayName', 127); + $table->dateTime('lastSeen'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('free_company_ranked_users'); + } +} diff --git a/routes/web.php b/routes/web.php index 08e58e9..3fc88d3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -42,6 +42,8 @@ Route::prefix('api')->middleware(ApiAuthorization::class)->group(function() { }); Route::prefix('rank')->group(function() { + Route::get('/check/helix', 'HelixRankCheckController@getRankChanges'); + Route::get('/check/{freeCompanyId}/discord/{discordGuildId}/{discordUserId}/{currentRank}'); Route::get('/check/{freeCompanyId}/website/{hostname}/{websiteId}/{currentRank}'); });