Skip to content

Instantly share code, notes, and snippets.

@Ozerich
Created June 14, 2023 15:37
Show Gist options
  • Save Ozerich/41af7d33c36e33be99da6012238ca184 to your computer and use it in GitHub Desktop.
Save Ozerich/41af7d33c36e33be99da6012238ca184 to your computer and use it in GitHub Desktop.
<?php
namespace App\Operations\Developers;
use App\Models\Game;
use App\Models\User;
use App\Models\UserDeveloper;
use App\Repositories\GamePlatformRepository;
use App\Repositories\GameRepository;
use App\Repositories\UserDeveloperRepository;
use App\Repositories\UserGameRepository;
use App\Repositories\UserRepository;
use OZiTAG\Tager\Backend\Core\Jobs\Job;
class UpdateUserTopDevelopersJob extends Job
{
public function __construct(protected User $user)
{
}
public function handle(UserDeveloperRepository $userDeveloperRepository, UserRepository $userRepository,
GamePlatformRepository $gamePlatformRepository, UserGameRepository $userGameRepository,
GameRepository $gameRepository
)
{
/** @var UserDeveloper[] $items */
$items = $userDeveloperRepository->builder()
->join('developers', 'users_developers.developer_id', '=', 'developers.id')
->where('users_developers.user_id', $this->user->id)
->whereRaw('developers.games_count > users_developers.played')
->orderBy('users_developers.played', 'DESC')
->orderBy('users_developers.last_played_at', 'DESC')
->orderBy('users_developers.onboarding_weight', 'DESC')
->orderBy('developers.priority', 'desc')
->orderBy('developers.games_count', 'desc')
->orderBy('developers.name', 'desc')
->get();
$androidIds = [];
$iosIds = [];
for ($i = 0; $i < count($items); $i++) {
$batch = [$items[$i]];
for ($j = $i + 1; $j < count($items); $j++) {
if ($items[$j]->played == $items[$i]->played && $items[$j]->last_played_at == $items[$i]->last_played_at &&
$items[$i]->onboarding_weight == $items[$j]->onboarding_weight) {
$batch[] = $items[$j];
} else {
$i = $j;
break;
}
}
if (count($batch) == 1) {
$androidIds[] = $batch[0]->developer_id;
$iosIds[] = $batch[0]->developer_id;
if (count($androidIds) >= 10 || count($iosIds) >= 10) break;
continue;
}
$developerPlayedGameIds = [];
foreach ($batch as $userDeveloper) {
$developerGameIds = $gamePlatformRepository->builder()->where('developer_id', $userDeveloper->developer_id)->pluck('game_id')->toArray();
$userGamesIds = $userGameRepository->builder()->where('user_id', $this->user->id)->pluck('game_id')->toArray();
$userPlayedForDeveloperGames = array_intersect($developerGameIds, $userGamesIds);
$developerPlayedGameIds[$userDeveloper->developer_id] = array_values($userPlayedForDeveloperGames);
}
$noIntersectDevelopers = [];
$intersectDevelopers = [];
foreach ($developerPlayedGameIds as $developerId => $developerGames) {
$intersect = false;
foreach ($developerGames as $developerGame) {
foreach ($developerPlayedGameIds as $developer2Id => $developer2Games) {
if ($developer2Id == $developerId) continue;
if (in_array($developerGame, $developer2Games)) {
$intersect = true;
break;
}
}
}
if ($intersect) {
$intersectDevelopers[] = $developerId;
} else {
$noIntersectDevelopers[] = $developerId;
}
}
$iosIds = array_merge($iosIds, $noIntersectDevelopers);
$androidIds = array_merge($androidIds, $noIntersectDevelopers);
if (count($intersectDevelopers) == 0) {
continue;
}
$bestAndroidPlayed = 0;
$bestAndroidDeveloper = null;
$bestIosPlayed = 0;
$bestIosDeveloper = null;
foreach ($intersectDevelopers as $intersectDeveloper) {
$iosCount = 0;
$androidCount = 0;
foreach ($developerPlayedGameIds[$intersectDeveloper] as $gameId) {
/** @var Game $game */
$game = $gameRepository->find($gameId);
if ($game->iosPlatform && $game->iosPlatform->developer_id == $intersectDeveloper) {
$iosCount++;
}
if ($game->androidPlatform && $game->androidPlatform->developer_id == $intersectDeveloper) {
$androidCount++;
}
}
if ($iosCount > $bestIosPlayed) {
$bestIosPlayed = $iosCount;
$bestIosDeveloper = $intersectDeveloper;
}
if ($androidCount > $bestAndroidPlayed) {
$bestAndroidPlayed = $androidCount;
$bestAndroidDeveloper = $intersectDeveloper;
}
}
if ($bestAndroidDeveloper) {
$androidIds[] = $bestAndroidDeveloper;
}
if ($bestIosDeveloper) {
$iosIds[] = $bestIosDeveloper;
}
}
$topDevelopers = $this->run(GetTopDevelopersJob::class, [
'count' => 10
]);
foreach ($topDevelopers as $topDeveloper) {
$androidIds[] = $topDeveloper->id;
$iosIds[] = $topDeveloper->id;
}
$iosIds = array_slice($iosIds, 0, 10);
$androidIds = array_slice($androidIds, 0, 10);
$androidIds = implode(',', $androidIds);
$iosIds = implode(',', $iosIds);
if ($this->user->top_developers_android != $androidIds || $this->user->top_developers_ios != $iosIds) {
$userRepository->builder()->where('id', $this->user->id)->update([
'top_developers_android' => $androidIds,
'top_developers_ios' => $iosIds
]);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment