From 59f20f28134876191969084ad6b59ce1660bf8f1 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Thu, 16 Nov 2023 17:22:04 +0100 Subject: [PATCH 01/22] #2116 WIP Reworking dungeonroute card --- .gitignore | 3 +- .../src/laravel-echo-server-template.json | 4 +- .../views/common/dungeonroute/card.blade.php | 218 +----------------- .../dungeonroute/cardhorizontal.blade.php | 216 +++++++++++++++++ .../dungeonroute/cardvertical.blade.php | 216 +++++++++++++++++ 5 files changed, 438 insertions(+), 219 deletions(-) create mode 100644 resources/views/common/dungeonroute/cardhorizontal.blade.php create mode 100644 resources/views/common/dungeonroute/cardvertical.blade.php diff --git a/.gitignore b/.gitignore index a09c307aa8..b1f3b41e9e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ /resouces/assets/js/precompile.js /storage/*.key /storage/debugbar/*.json +/storage/framework/maintenance.php /vendor /version /.idea @@ -34,4 +35,4 @@ docker-compose/mysql docker-compose/mysql-combatlog docker-compose/laravel-echo-server/laravel-echo-server.json docker-compose/laravel-echo-server/laravel-echo-server.lock -docker-compose/redis-data \ No newline at end of file +docker-compose/redis-data diff --git a/docker-compose/laravel-echo-server/src/laravel-echo-server-template.json b/docker-compose/laravel-echo-server/src/laravel-echo-server-template.json index 23851834ba..aa9604e14f 100644 --- a/docker-compose/laravel-echo-server/src/laravel-echo-server-template.json +++ b/docker-compose/laravel-echo-server/src/laravel-echo-server-template.json @@ -16,7 +16,7 @@ "database": "redis", "databaseConfig": { "redis": { - "port": 6379, + "port": 6380, "host": "redis" }, "sqlite": { @@ -37,4 +37,4 @@ "http": true, "redis": true } -} \ No newline at end of file +} diff --git a/resources/views/common/dungeonroute/card.blade.php b/resources/views/common/dungeonroute/card.blade.php index fe22e52ba4..190b5c9d83 100644 --- a/resources/views/common/dungeonroute/card.blade.php +++ b/resources/views/common/dungeonroute/card.blade.php @@ -1,216 +1,2 @@ -@inject('cacheService', 'App\Service\Cache\CacheServiceInterface') - -hasUniqueAffix(\App\Models\Affix::AFFIX_FORTIFIED)) { - $dominantAffix = strtolower(\App\Models\Affix::AFFIX_FORTIFIED); - } else if ($dungeonroute->hasUniqueAffix(\App\Models\Affix::AFFIX_TYRANNICAL)) { - $dominantAffix = strtolower(\App\Models\Affix::AFFIX_TYRANNICAL); - } - $seasonalAffix = $dungeonroute->getSeasonalAffix(); - - if (!isset($tierAffixGroup)) { - // Try to come up with a sensible default - if ($dungeonroute->affixes->count() === 1) { - $tierAffixGroup = $dungeonroute->affixes->first(); - } else { - // If the affix list contains the current affix, we can use that to display the tier instead - $tierAffixGroup = $currentAffixGroup === null ? null : ($dungeonroute->affixes->filter(function (\App\Models\AffixGroup\AffixGroup $affixGroup) use ($currentAffixGroup) { - return $affixGroup->id === $currentAffixGroup->id; - })->isNotEmpty() ? $currentAffixGroup : null); - } - } - -// Attempt a default value if there's only one affix set - $tierAffixGroup = $tierAffixGroup ?? $dungeonroute->affixes->count() === 1 ?: null; - $enemyForcesPercentage = $dungeonroute->getEnemyForcesPercentage(); - $enemyForcesWarning = $dungeonroute->enemy_forces < $dungeonroute->mappingVersion->enemy_forces_required || $enemyForcesPercentage >= 105; - - $activeFloors = $dungeonroute->dungeon->floors()->active()->get(); - $owlClass = $dungeonroute->has_thumbnail && $activeFloors->count() > 1 ? 'multiple' : 'single'; - - ob_start(); ?> -
-
-
-
    - @if( $dungeonroute->has_thumbnail ) - @foreach($activeFloors as $floor) - @if($floor->facade) - @continue - @endif -
  • - -
  • - @endforeach - @else - - @endif -
-
-
-
-
-
- - @if( !$dungeonroute->mappingVersion->isLatestForDungeon() ) -
- -
- @endif - @if( $showAffixes ) -
- - @foreach($dungeonroute->affixes as $affixgroup) -
- @include('common.affixgroup.affixgroup', [ - 'affixgroup' => $affixgroup, - 'showText' => false, - 'dungeon' => $dungeonroute->dungeon, - ]) -
- @endforeach - -
-
- -
- @if($seasonalAffix !== null) -
- -
- @endif -
-
-
- @if($tierAffixGroup !== null) -

- @include('common.dungeonroute.tier', ['dungeon' => $dungeonroute->dungeon, 'affixgroup' => $tierAffixGroup]) -

- @endif -
- @endif -
-
-
- {{ - empty($dungeonroute->description) ? __('views/common.dungeonroute.card.no_description') : $dungeonroute->description - }} -
-
-
-
- @if( $enemyForcesWarning ) - - @else - - @endif - {{ sprintf( - '%s/%s (%s%%)', - $dungeonroute->enemy_forces, - $dungeonroute->mappingVersion->enemy_forces_required, - $enemyForcesPercentage - ) }} -
-
- @if( $dungeonroute->level_min !== config('keystoneguru.keystone.levels.min') && $dungeonroute->level_max !== config('keystoneguru.keystone.levels.max')) - @include('common.dungeonroute.level', ['levelMin' => $dungeonroute->level_min, 'levelMax' => $dungeonroute->level_max]) - @endif -
-
- -
-
-
- - remember( - sprintf('view:dungeonroute_card_%d_%d_%d', (int)$showAffixes, (int)$showDungeonImage, $dungeonroute->id), - $cacheFn, - config('keystoneguru.view.common.dungeonroute.card.cache.ttl') - ); -} else { - echo $cacheFn(); -} -?> +{{--@include('common.dungeonroute.cardhorizontal')--}} +@include('common.dungeonroute.cardvertical') diff --git a/resources/views/common/dungeonroute/cardhorizontal.blade.php b/resources/views/common/dungeonroute/cardhorizontal.blade.php new file mode 100644 index 0000000000..0d38843af3 --- /dev/null +++ b/resources/views/common/dungeonroute/cardhorizontal.blade.php @@ -0,0 +1,216 @@ +@inject('cacheService', 'App\Service\Cache\CacheServiceInterface') + +hasUniqueAffix(\App\Models\Affix::AFFIX_FORTIFIED)) { + $dominantAffix = strtolower(\App\Models\Affix::AFFIX_FORTIFIED); + } else if ($dungeonroute->hasUniqueAffix(\App\Models\Affix::AFFIX_TYRANNICAL)) { + $dominantAffix = strtolower(\App\Models\Affix::AFFIX_TYRANNICAL); + } + $seasonalAffix = $dungeonroute->getSeasonalAffix(); + + if (!isset($tierAffixGroup)) { + // Try to come up with a sensible default + if ($dungeonroute->affixes->count() === 1) { + $tierAffixGroup = $dungeonroute->affixes->first(); + } else { + // If the affix list contains the current affix, we can use that to display the tier instead + $tierAffixGroup = $currentAffixGroup === null ? null : ($dungeonroute->affixes->filter(function (\App\Models\AffixGroup\AffixGroup $affixGroup) use ($currentAffixGroup) { + return $affixGroup->id === $currentAffixGroup->id; + })->isNotEmpty() ? $currentAffixGroup : null); + } + } + +// Attempt a default value if there's only one affix set + $tierAffixGroup = $tierAffixGroup ?? $dungeonroute->affixes->count() === 1 ?: null; + $enemyForcesPercentage = $dungeonroute->getEnemyForcesPercentage(); + $enemyForcesWarning = $dungeonroute->enemy_forces < $dungeonroute->mappingVersion->enemy_forces_required || $enemyForcesPercentage >= 105; + + $activeFloors = $dungeonroute->dungeon->floors()->active()->get(); + $owlClass = $dungeonroute->has_thumbnail && $activeFloors->count() > 1 ? 'multiple' : 'single'; + + ob_start(); ?> +
+
+
+
    + @if( $dungeonroute->has_thumbnail ) + @foreach($activeFloors as $floor) + @if($floor->facade) + @continue + @endif +
  • + +
  • + @endforeach + @else + + @endif +
+
+
+
+
+
+ + @if( !$dungeonroute->mappingVersion->isLatestForDungeon() ) +
+ +
+ @endif + @if( $showAffixes ) +
+ + @foreach($dungeonroute->affixes as $affixgroup) +
+ @include('common.affixgroup.affixgroup', [ + 'affixgroup' => $affixgroup, + 'showText' => false, + 'dungeon' => $dungeonroute->dungeon, + ]) +
+ @endforeach + +
+
+ +
+ @if($seasonalAffix !== null) +
+ +
+ @endif +
+
+
+ @if($tierAffixGroup !== null) +

+ @include('common.dungeonroute.tier', ['dungeon' => $dungeonroute->dungeon, 'affixgroup' => $tierAffixGroup]) +

+ @endif +
+ @endif +
+
+
+ {{ + empty($dungeonroute->description) ? __('views/common.dungeonroute.card.no_description') : $dungeonroute->description + }} +
+
+
+
+ @if( $enemyForcesWarning ) + + @else + + @endif + {{ sprintf( + '%s/%s (%s%%)', + $dungeonroute->enemy_forces, + $dungeonroute->mappingVersion->enemy_forces_required, + $enemyForcesPercentage + ) }} +
+
+ @if( $dungeonroute->level_min !== config('keystoneguru.keystone.levels.min') && $dungeonroute->level_max !== config('keystoneguru.keystone.levels.max')) + @include('common.dungeonroute.level', ['levelMin' => $dungeonroute->level_min, 'levelMax' => $dungeonroute->level_max]) + @endif +
+
+ +
+
+
+ + remember( + sprintf('view:dungeonroute_card_%d_%d_%d', (int)$showAffixes, (int)$showDungeonImage, $dungeonroute->id), + $cacheFn, + config('keystoneguru.view.common.dungeonroute.card.cache.ttl') + ); +} else { + echo $cacheFn(); +} +?> diff --git a/resources/views/common/dungeonroute/cardvertical.blade.php b/resources/views/common/dungeonroute/cardvertical.blade.php new file mode 100644 index 0000000000..441dd11478 --- /dev/null +++ b/resources/views/common/dungeonroute/cardvertical.blade.php @@ -0,0 +1,216 @@ +@inject('cacheService', 'App\Service\Cache\CacheServiceInterface') + +hasUniqueAffix(\App\Models\Affix::AFFIX_FORTIFIED)) { + $dominantAffix = strtolower(\App\Models\Affix::AFFIX_FORTIFIED); + } else if ($dungeonroute->hasUniqueAffix(\App\Models\Affix::AFFIX_TYRANNICAL)) { + $dominantAffix = strtolower(\App\Models\Affix::AFFIX_TYRANNICAL); + } + $seasonalAffix = $dungeonroute->getSeasonalAffix(); + + if (!isset($tierAffixGroup)) { + // Try to come up with a sensible default + if ($dungeonroute->affixes->count() === 1) { + $tierAffixGroup = $dungeonroute->affixes->first(); + } else { + // If the affix list contains the current affix, we can use that to display the tier instead + $tierAffixGroup = $currentAffixGroup === null ? null : ($dungeonroute->affixes->filter(function (\App\Models\AffixGroup\AffixGroup $affixGroup) use ($currentAffixGroup) { + return $affixGroup->id === $currentAffixGroup->id; + })->isNotEmpty() ? $currentAffixGroup : null); + } + } + +// Attempt a default value if there's only one affix set + $tierAffixGroup = $tierAffixGroup ?? $dungeonroute->affixes->count() === 1 ?: null; + $enemyForcesPercentage = $dungeonroute->getEnemyForcesPercentage(); + $enemyForcesWarning = $dungeonroute->enemy_forces < $dungeonroute->mappingVersion->enemy_forces_required || $enemyForcesPercentage >= 105; + + $activeFloors = $dungeonroute->dungeon->floors()->active()->get(); + $owlClass = $dungeonroute->has_thumbnail && $activeFloors->count() > 1 ? 'multiple' : 'single'; + + ob_start(); ?> +
+
+
+
    + @if( $dungeonroute->has_thumbnail ) + @foreach($activeFloors as $floor) + @if($floor->facade) + @continue + @endif +
  • + +
  • + @endforeach + @else + + @endif +
+
+
+
+
+
+ + @if( !$dungeonroute->mappingVersion->isLatestForDungeon() ) +
+ +
+ @endif + @if( $showAffixes ) +
+ + @foreach($dungeonroute->affixes as $affixgroup) +
+ @include('common.affixgroup.affixgroup', [ + 'affixgroup' => $affixgroup, + 'showText' => false, + 'dungeon' => $dungeonroute->dungeon, + ]) +
+ @endforeach + +
+
+ +
+ @if($seasonalAffix !== null) +
+ +
+ @endif +
+
+
+ @if($tierAffixGroup !== null) +

+ @include('common.dungeonroute.tier', ['dungeon' => $dungeonroute->dungeon, 'affixgroup' => $tierAffixGroup]) +

+ @endif +
+ @endif +
+
+
+ {{ + empty($dungeonroute->description) ? __('views/common.dungeonroute.card.no_description') : $dungeonroute->description + }} +
+
+
+
+ @if( $enemyForcesWarning ) + + @else + + @endif + {{ sprintf( + '%s/%s (%s%%)', + $dungeonroute->enemy_forces, + $dungeonroute->mappingVersion->enemy_forces_required, + $enemyForcesPercentage + ) }} +
+
+ @if( $dungeonroute->level_min !== config('keystoneguru.keystone.levels.min') && $dungeonroute->level_max !== config('keystoneguru.keystone.levels.max')) + @include('common.dungeonroute.level', ['levelMin' => $dungeonroute->level_min, 'levelMax' => $dungeonroute->level_max]) + @endif +
+
+ +
+
+
+ + remember( + sprintf('view:dungeonroute_card_%d_%d_%d', (int)$showAffixes, (int)$showDungeonImage, $dungeonroute->id), + $cacheFn, + config('keystoneguru.view.common.dungeonroute.card.cache.ttl') + ); +} else { + echo $cacheFn(); +} +?> From 7e2af226e2c350ac40dfda6a97d17b34535675d1 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Thu, 16 Nov 2023 23:26:44 +0100 Subject: [PATCH 02/22] #2116 Reworked dungeonroute cards to be in a vertical style --- .../DungeonRoute/DevDiscoverService.php | 2 +- config/keystoneguru.php | 8 +- resources/assets/css/custom.css | 54 ++-- .../dungeonroute/handlers/carouselhandler.js | 2 +- .../common/dungeonroute/cardlist.blade.php | 2 +- .../dungeonroute/cardvertical.blade.php | 241 +++++++++--------- .../dungeonroute/discover/panel.blade.php | 10 +- 7 files changed, 171 insertions(+), 148 deletions(-) diff --git a/app/Service/DungeonRoute/DevDiscoverService.php b/app/Service/DungeonRoute/DevDiscoverService.php index 956332e8e7..08caffa646 100644 --- a/app/Service/DungeonRoute/DevDiscoverService.php +++ b/app/Service/DungeonRoute/DevDiscoverService.php @@ -21,7 +21,7 @@ private function popularBuilder(): Builder { $this->ensureExpansion(); - return DungeonRoute::query()->limit(10) + return DungeonRoute::query()->limit(12) ->when($this->closure !== null, $this->closure) ->select('dungeon_routes.*') ->with(['author', 'affixes', 'ratings', 'mappingVersion', 'dungeon']) diff --git a/config/keystoneguru.php b/config/keystoneguru.php index d43469fad1..b8d49ab007 100644 --- a/config/keystoneguru.php +++ b/config/keystoneguru.php @@ -205,10 +205,10 @@ 'discover' => [ /** Limits for how much dungeonroutes to display on certain pages */ 'limits' => [ - 'overview' => 10, - 'category' => 20, - 'affix_overview' => 10, - 'search' => 20, + 'overview' => 12, + 'category' => 24, + 'affix_overview' => 12, + 'search' => 24, 'per_dungeon' => 4, ], /** How many routes to load more when the user uses the infinite scroll */ diff --git a/resources/assets/css/custom.css b/resources/assets/css/custom.css index 043a14aacd..65c4d3019f 100644 --- a/resources/assets/css/custom.css +++ b/resources/assets/css/custom.css @@ -65,14 +65,16 @@ ul.light-slider { list-style: none outside none; padding-left: 0; - margin-bottom:0; + margin-bottom: 0; } + .light-slider li { display: block; float: left; margin-right: 6px; - cursor:pointer; + cursor: pointer; } + .light-slider img { display: block; height: auto; @@ -82,14 +84,30 @@ ul.light-slider { /** Light Slider */ @media (min-width: 1200px) { /* Container is required for the page load to have a proper width */ - .card_dungeonroute .single, - .card_dungeonroute .light-slider-container, - .card_dungeonroute .multiple, - .card_dungeonroute img.thumbnail, - .card_dungeonroute img.dungeon { + .card_dungeonroute.horizontal .single, + .card_dungeonroute.horizontal .light-slider-container, + .card_dungeonroute.horizontal .multiple, + .card_dungeonroute.horizontal img.thumbnail, + .card_dungeonroute.horizontal img.dungeon { width: 288px; height: 192px; } + + + .card_dungeonroute.vertical img.thumbnail, + .card_dungeonroute.vertical img.dungeon { + width: 100%; + } + + .card_dungeonroute.vertical .title { + height: 2rem; + overflow: hidden; + } + + .card_dungeonroute.vertical .description_row { + height: 4rem; + overflow: hidden; + } } /*.discover img.dungeon {*/ @@ -135,29 +153,29 @@ ul.light-slider { z-index: 1; } -.discover .card_dungeonroute .description { +.discover .card_dungeonroute.horizontal .description { text-overflow: ellipsis; overflow: hidden; } -.discover .card_dungeonroute.dungeon_image .header, -.discover .card_dungeonroute.dungeon_image .description, -.discover .card_dungeonroute.dungeon_image .enemy_forces { +.discover .card_dungeonroute.horizontal.dungeon_image .header, +.discover .card_dungeonroute.horizontal.dungeon_image .description, +.discover .card_dungeonroute.horizontal.dungeon_image .enemy_forces { text-shadow: #000 1px 1px; } @media (min-width: 1200px) { - .discover .card_dungeonroute, - .discover .card_dungeonroute .col { + .discover .card_dungeonroute.horizontal, + .discover .card_dungeonroute.horizontal .col { max-height: 192px; } - .discover .card_dungeonroute .header { + .discover .card_dungeonroute.horizontal .header { overflow: hidden; } - .discover .card_dungeonroute .description_row, - .discover .card_dungeonroute .description_row .col { + .discover .card_dungeonroute.horizontal .description_row, + .discover .card_dungeonroute.horizontal .description_row .col { max-height: 80px; max-width: 532px; overflow: hidden; @@ -165,14 +183,14 @@ ul.light-slider { } @media (min-width: 1800px) { - .discover .card_dungeonroute .description_row .col { + .discover .card_dungeonroute.horizontal .description_row .col { display: flex !important; } } /** Prevent descriptions from taking on a huge height if people enter only */ @media (max-width: 1200px) { - .discover .card_dungeonroute .description_row { + .discover .card_dungeonroute.horizontal .description_row { max-height: 250px; } } diff --git a/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js b/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js index 5d5156becd..043e1579f4 100644 --- a/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js +++ b/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js @@ -10,7 +10,7 @@ class CarouselHandler { $(function () { let baseSettings = { item: 1, - // autoWidth: true, + autoWidth: true, // slideMove: 1, // slidemove will be 1 if loop is true slideMargin: 0, diff --git a/resources/views/common/dungeonroute/cardlist.blade.php b/resources/views/common/dungeonroute/cardlist.blade.php index d588e55877..6c2f465e3c 100644 --- a/resources/views/common/dungeonroute/cardlist.blade.php +++ b/resources/views/common/dungeonroute/cardlist.blade.php @@ -29,7 +29,7 @@ get(($i * $cols) + $j); ?> -
+
@if($dungeonroute !== null) @include('common.dungeonroute.card', [ 'dungeonroute' => $dungeonroute, diff --git a/resources/views/common/dungeonroute/cardvertical.blade.php b/resources/views/common/dungeonroute/cardvertical.blade.php index 441dd11478..6dc3f80bfd 100644 --- a/resources/views/common/dungeonroute/cardvertical.blade.php +++ b/resources/views/common/dungeonroute/cardvertical.blade.php @@ -42,11 +42,11 @@ $enemyForcesWarning = $dungeonroute->enemy_forces < $dungeonroute->mappingVersion->enemy_forces_required || $enemyForcesPercentage >= 105; $activeFloors = $dungeonroute->dungeon->floors()->active()->get(); - $owlClass = $dungeonroute->has_thumbnail && $activeFloors->count() > 1 ? 'multiple' : 'single'; + $owlClass = $dungeonroute->has_thumbnail && $activeFloors->count() > 1 ? 'multiple' : 'single'; ob_start(); ?>
-
+
    @if( $dungeonroute->has_thumbnail ) @@ -64,131 +64,136 @@ @endif
-
-
-
-
- - @if( !$dungeonroute->mappingVersion->isLatestForDungeon() ) -
- -
- @endif - @if( $showAffixes ) -
- - @foreach($dungeonroute->affixes as $affixgroup) -
- @include('common.affixgroup.affixgroup', [ - 'affixgroup' => $affixgroup, - 'showText' => false, - 'dungeon' => $dungeonroute->dungeon, - ]) -
- @endforeach - -
-
- +
+
+
+
+ + @if( !$dungeonroute->mappingVersion->isLatestForDungeon() ) +
+
- @if($seasonalAffix !== null) -
- + @endif + @if( $showAffixes ) +
+ + @foreach($dungeonroute->affixes as $affixgroup) +
+ @include('common.affixgroup.affixgroup', [ + 'affixgroup' => $affixgroup, + 'showText' => false, + 'dungeon' => $dungeonroute->dungeon, + ]) +
+ @endforeach + +
+
+ +
+ @if($seasonalAffix !== null) +
+ +
+ @endif
- @endif +
+
+ @if($tierAffixGroup !== null) +

+ @include('common.dungeonroute.tier', ['dungeon' => $dungeonroute->dungeon, 'affixgroup' => $tierAffixGroup]) +

+ @endif +
+ @endif +
+
+
+ {{ + empty($dungeonroute->description) ? __('views/common.dungeonroute.card.no_description') : $dungeonroute->description + }}
-
- @if($tierAffixGroup !== null) -

- @include('common.dungeonroute.tier', ['dungeon' => $dungeonroute->dungeon, 'affixgroup' => $tierAffixGroup]) -

- @endif +
+
+ @if( $enemyForcesWarning ) + + @else + + @endif + {{ sprintf( + '%s/%s (%s%%)', + $dungeonroute->enemy_forces, + $dungeonroute->mappingVersion->enemy_forces_required, + $enemyForcesPercentage + ) }} +
+
+ @if( $dungeonroute->level_min !== config('keystoneguru.keystone.levels.min') && $dungeonroute->level_max !== config('keystoneguru.keystone.levels.max')) + @include('common.dungeonroute.level', ['levelMin' => $dungeonroute->level_min, 'levelMax' => $dungeonroute->level_max]) + @endif +
- @endif -
-
-
- {{ - empty($dungeonroute->description) ? __('views/common.dungeonroute.card.no_description') : $dungeonroute->description - }} -
-
-
-
- @if( $enemyForcesWarning ) - - @else - - @endif - {{ sprintf( - '%s/%s (%s%%)', - $dungeonroute->enemy_forces, - $dungeonroute->mappingVersion->enemy_forces_required, - $enemyForcesPercentage - ) }} -
-
- @if( $dungeonroute->level_min !== config('keystoneguru.keystone.levels.min') && $dungeonroute->level_max !== config('keystoneguru.keystone.levels.max')) - @include('common.dungeonroute.level', ['levelMin' => $dungeonroute->level_min, 'levelMax' => $dungeonroute->level_max]) - @endif -
-
-
- {{ - empty($dungeonroute->description) ? __('views/common.dungeonroute.card.no_description') : $dungeonroute->description - }} +   +{{-- {{--}} +{{-- empty($dungeonroute->description) ? __('views/common.dungeonroute.card.no_description') : $dungeonroute->description--}} +{{-- }}--}}
diff --git a/resources/views/common/dungeonroute/cardlist.blade.php b/resources/views/common/dungeonroute/cardlist.blade.php index 6c2f465e3c..c3aa3e454a 100644 --- a/resources/views/common/dungeonroute/cardlist.blade.php +++ b/resources/views/common/dungeonroute/cardlist.blade.php @@ -1,20 +1,22 @@ count(); if( $count > 0 && $header !== null ) { ?>
@@ -31,7 +33,7 @@ ?>
@if($dungeonroute !== null) - @include('common.dungeonroute.card', [ + @include($orientation === 'horizontal' ? 'common.dungeonroute.cardhorizontal' : 'common.dungeonroute.cardvertical', [ 'dungeonroute' => $dungeonroute, 'currentAffixGroup' => $currentAffixGroup, 'tierAffixGroup' => $affixgroup, diff --git a/resources/views/common/dungeonroute/cardvertical.blade.php b/resources/views/common/dungeonroute/cardvertical.blade.php index 6dc3f80bfd..00f56fed0f 100644 --- a/resources/views/common/dungeonroute/cardvertical.blade.php +++ b/resources/views/common/dungeonroute/cardvertical.blade.php @@ -41,7 +41,7 @@ $enemyForcesPercentage = $dungeonroute->getEnemyForcesPercentage(); $enemyForcesWarning = $dungeonroute->enemy_forces < $dungeonroute->mappingVersion->enemy_forces_required || $enemyForcesPercentage >= 105; - $activeFloors = $dungeonroute->dungeon->floors()->active()->get(); + $activeFloors = $dungeonroute->dungeon->activeFloors; $owlClass = $dungeonroute->has_thumbnail && $activeFloors->count() > 1 ? 'multiple' : 'single'; ob_start(); ?> @@ -71,7 +71,7 @@ style="background-image: url('{{ $dungeonroute->dungeon->getImageTransparentUrl() }}'); background-size: cover; background-position-y: center;" @endif > -
+
@if( $dungeonroute->level_min !== config('keystoneguru.keystone.levels.min') && $dungeonroute->level_max !== config('keystoneguru.keystone.levels.max')) diff --git a/resources/views/common/forms/mapsettings.blade.php b/resources/views/common/forms/mapsettings.blade.php index fb346b3306..6511dcdc21 100644 --- a/resources/views/common/forms/mapsettings.blade.php +++ b/resources/views/common/forms/mapsettings.blade.php @@ -1,5 +1,5 @@ - @auth() - @if(\Auth::user()->hasRole('admin')) +{{-- @auth()--}} +{{-- @if(\Auth::user()->hasRole('admin'))--}}
@@ -37,8 +37,8 @@
- @endif - @endauth +{{-- @endif--}} +{{-- @endauth--}}

{{ __('views/common.forms.mapsettings.enemies') }}

diff --git a/resources/views/common/maps/controls/pulls.blade.php b/resources/views/common/maps/controls/pulls.blade.php index 9caf33a043..f23a7bde24 100644 --- a/resources/views/common/maps/controls/pulls.blade.php +++ b/resources/views/common/maps/controls/pulls.blade.php @@ -29,7 +29,6 @@ 'anchor' => 'right', 'newKillZoneSelector' => '#new_pull_btn', 'killZonesContainerSelector' => '#killzones_container', - 'mapSettingsMapFacadeStyleSelector' => '#map_settings_map_facade_style', 'killZonesPullsSettingsMapNumberStyleSelector' => '#killzones_pulls_settings_map_number_style', 'killZonesPullsSettingsNumberStyleSelector' => '#killzones_pulls_settings_number_style', 'killZonesPullsSettingsDeleteAllSelector' => '#killzones_pulls_settings_delete_all', diff --git a/resources/views/common/maps/map.blade.php b/resources/views/common/maps/map.blade.php index afa281ae5a..11e2e24381 100644 --- a/resources/views/common/maps/map.blade.php +++ b/resources/views/common/maps/map.blade.php @@ -19,7 +19,7 @@ $user = Auth::user(); $isAdmin = isset($admin) && $admin; $embed = isset($embed) && $embed; -$embedStyle = isset($embedStyle) ? $embedStyle : ''; +$embedStyle = $embedStyle ?? ''; $edit = isset($edit) && $edit; $mapClasses = $mapClasses ?? ''; $dungeonroute = $dungeonroute ?? null; @@ -43,7 +43,8 @@ $unkilledEnemyOpacity = $_COOKIE['map_unkilled_enemy_opacity'] ?? '50'; $unkilledImportantEnemyOpacity = $_COOKIE['map_unkilled_important_enemy_opacity'] ?? '80'; $defaultEnemyAggressivenessBorder = (int)($_COOKIE['map_enemy_aggressiveness_border'] ?? 0); -$useFacade = ($_COOKIE['map_facade_style'] ?? 'split_floors') === 'facade'; +$mapFacadeStyle = \App\User::getCurrentUserMapFacadeStyle(); +$useFacade = $mapFacadeStyle === \App\User::MAP_FACADE_STYLE_FACADE; // Allow echo to be overridden $echo = $echo ?? Auth::check() && !$sandboxMode; @@ -93,6 +94,7 @@ 'defaultUnkilledEnemyOpacity' => $unkilledEnemyOpacity, 'defaultUnkilledImportantEnemyOpacity' => $unkilledImportantEnemyOpacity, 'defaultEnemyAggressivenessBorder' => $defaultEnemyAggressivenessBorder, + 'mapFacadeStyle' => $mapFacadeStyle, 'noUI' => $noUI, 'showControls' => $show['controls'], 'gestureHandling' => $gestureHandling, @@ -111,8 +113,8 @@ @include('common.general.statemanager', [ 'echo' => $echo, - 'patreonBenefits' => Auth::check() ? $user->getPatreonBenefits() : collect(), - 'userData' => $user, + 'patreonBenefits' => optional($user)->getPatreonBenefits() ?? collect(), + 'userData' => optional($user)->makeVisible('map_facade_style'), 'mapContext' => $mapContext->getProperties(), ]) @@ -217,18 +219,18 @@
@if(!$noUI) -{{-- @if(!$adFree && $showAds)--}} -{{-- @if($isMobile)--}} -{{-- @include('common.thirdparty.adunit', ['id' => 'map_footer', 'type' => 'footer'])--}} -{{-- @endif--}} -{{-- @endif--}} + {{-- @if(!$adFree && $showAds)--}} + {{-- @if($isMobile)--}} + {{-- @include('common.thirdparty.adunit', ['id' => 'map_footer', 'type' => 'footer'])--}} + {{-- @endif--}} + {{-- @endif--}}
-{{-- @if(!$adFree && $showAds)--}} -{{-- @include('common.thirdparty.adunit', ['id' => 'map_footer', 'type' => 'footer', 'class' => 'map_ad_background', 'map' => true])--}} -{{-- @endif--}} + {{-- @if(!$adFree && $showAds)--}} + {{-- @include('common.thirdparty.adunit', ['id' => 'map_footer', 'type' => 'footer', 'class' => 'map_ad_background', 'map' => true])--}} + {{-- @endif--}}
-{{-- @if(!$adFree && $showAds)--}} -{{-- @if( $mapContext instanceof \App\Logic\MapContext\MapContextDungeonExplore )--}} -{{--
--}} -{{-- @include('common.thirdparty.adunit', ['id' => 'map_sidebar_right', 'type' => 'sidebar_map_right', 'class' => 'map_ad_background', 'map' => true])--}} -{{--
--}} -{{-- @elseif(!$dungeon->speedrun_enabled)--}} -{{--
--}} -{{-- @include('common.thirdparty.adunit', ['id' => 'map_footer_right', 'type' => 'footer_map_right', 'class' => 'map_ad_background', 'map' => true])--}} -{{--
--}} -{{-- @endif--}} -{{-- @endif--}} + {{-- @if(!$adFree && $showAds)--}} + {{-- @if( $mapContext instanceof \App\Logic\MapContext\MapContextDungeonExplore )--}} + {{--
--}} + {{-- @include('common.thirdparty.adunit', ['id' => 'map_sidebar_right', 'type' => 'sidebar_map_right', 'class' => 'map_ad_background', 'map' => true])--}} + {{--
--}} + {{-- @elseif(!$dungeon->speedrun_enabled)--}} + {{--
--}} + {{-- @include('common.thirdparty.adunit', ['id' => 'map_footer_right', 'type' => 'footer_map_right', 'class' => 'map_ad_background', 'map' => true])--}} + {{--
--}} + {{-- @endif--}} + {{-- @endif--}} diff --git a/resources/views/dungeonroute/discover/panel.blade.php b/resources/views/dungeonroute/discover/panel.blade.php index 452ee4d68a..c507e7b1f6 100644 --- a/resources/views/dungeonroute/discover/panel.blade.php +++ b/resources/views/dungeonroute/discover/panel.blade.php @@ -8,7 +8,7 @@ */ $dungeon = $dungeon ?? null; -$cols = $cols ?? 3; +$cols = $cols ?? 4; $showMore = $showMore ?? false; $loadMore = $loadMore ?? false; $showDungeonImage = $showDungeonImage ?? false; diff --git a/routes/web.php b/routes/web.php index fa6423d921..313f098b58 100644 --- a/routes/web.php +++ b/routes/web.php @@ -577,6 +577,11 @@ Route::post('/member/{user}/adfree', [AjaxTeamController::class, 'addAdFreeGiveaway']); Route::delete('/member/{user}/adfree', [AjaxTeamController::class, 'removeAdFreeGiveaway']); }); + + // User + Route::group(['prefix' => 'user/{publicKey}'], function () { + Route::put('/', [AjaxUserController::class, 'store']); + }); }); }); From 2cc025f920a647ff0feb8b6a1c0c8411268478d6 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Fri, 17 Nov 2023 23:19:23 +0100 Subject: [PATCH 04/22] #2085 Fixed crashing everything --- app/Models/Expansion.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/Expansion.php b/app/Models/Expansion.php index 6580f410c1..6f4b6deae1 100644 --- a/app/Models/Expansion.php +++ b/app/Models/Expansion.php @@ -74,9 +74,9 @@ class Expansion extends CacheModel private Collection $currentSeasonCache; private Collection $nextSeasonCache; - public function __construct() + public function __construct(array $attributes = []) { - parent::__construct(); + parent::__construct($attributes); $this->currentSeasonCache = collect(); $this->nextSeasonCache = collect(); From 283d62fb76e6dea8786efab415c800ca48396cb2 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Fri, 17 Nov 2023 23:22:25 +0100 Subject: [PATCH 05/22] #2085 Fixed crashing everything v2 --- app/Models/Expansion.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/Expansion.php b/app/Models/Expansion.php index 6f4b6deae1..4c09018358 100644 --- a/app/Models/Expansion.php +++ b/app/Models/Expansion.php @@ -76,10 +76,10 @@ class Expansion extends CacheModel public function __construct(array $attributes = []) { - parent::__construct($attributes); - $this->currentSeasonCache = collect(); $this->nextSeasonCache = collect(); + + parent::__construct($attributes); } From 5f27fc7656daa7280e163a691274e86a94d55d7c Mon Sep 17 00:00:00 2001 From: Wotuu Date: Fri, 17 Nov 2023 23:36:09 +0100 Subject: [PATCH 06/22] #2085 Placing map icons in facade mode now properly places them on the correct floor & location --- .../Ajax/AjaxMapIconController.php | 29 +++++++++++++++---- .../Ajax/AjaxMappingModelBaseController.php | 2 ++ .../Controllers/Ajax/AjaxUserController.php | 2 -- app/Models/Expansion.php | 2 +- app/User.php | 1 + 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Ajax/AjaxMapIconController.php b/app/Http/Controllers/Ajax/AjaxMapIconController.php index cebe3a626b..5f6780d4ec 100644 --- a/app/Http/Controllers/Ajax/AjaxMapIconController.php +++ b/app/Http/Controllers/Ajax/AjaxMapIconController.php @@ -11,6 +11,7 @@ use App\Models\Mapping\MappingModelInterface; use App\Models\Team; use App\Service\Coordinates\CoordinatesServiceInterface; +use App\User; use Exception; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Contracts\Routing\ResponseFactory; @@ -75,24 +76,42 @@ public function store( } } - return $this->storeModel($validated, MapIcon::class, $mapIcon, function (MapIcon $mapIcon) use ($validated, $dungeonRoute) { + return $this->storeModel($validated, MapIcon::class, $mapIcon, function (MapIcon $mapIcon) use ($validated, $dungeonRoute, $coordinatesService) { // Set the team_id if the user has the rights to do this. May be null if not set or no rights for it. + $updateAttributes = []; + $teamId = $validated['team_id']; if ($teamId !== null) { $team = Team::find($teamId); if ($team !== null && $team->isUserCollaborator(Auth::user())) { - $mapIcon->update([ + $updateAttributes = [ 'team_id' => $teamId, 'dungeon_route_id' => null, - ]); + ]; } } + // The incoming lat/lngs are facade lat/lngs, save the icon on the proper floor + if (User::getCurrentUserMapFacadeStyle() === User::MAP_FACADE_STYLE_FACADE) { + $latLng = $coordinatesService->convertFacadeMapLocationToMapLocation( + $dungeonRoute->mappingVersion, + $mapIcon->getLatLng() + ); + + $updateAttributes = array_merge($updateAttributes, [ + 'lat' => $latLng->getLat(), + 'lng' => $latLng->getLng(), + 'floor_id' => $latLng->getFloor()->id, + ]); + + $mapIcon->setRelation('floor', $latLng->getFloor()); + } + // Set the mapping version if it was placed in the context of a dungeon, or reset it to null if not in context // of a dungeon - $mapIcon->update([ + $mapIcon->update(array_merge($updateAttributes, [ 'mapping_version_id' => $dungeonRoute === null ? $validated['mapping_version_id'] : null, - ]); + ])); // Prevent people being able to update icons that only the admin should if they're supplying a valid dungeon route if ($mapIcon->exists && $mapIcon->dungeon_route_id === null && $dungeonRoute !== null && $mapIcon->team_id === null) { diff --git a/app/Http/Controllers/Ajax/AjaxMappingModelBaseController.php b/app/Http/Controllers/Ajax/AjaxMappingModelBaseController.php index 0ed5881796..22e1d29fe2 100644 --- a/app/Http/Controllers/Ajax/AjaxMappingModelBaseController.php +++ b/app/Http/Controllers/Ajax/AjaxMappingModelBaseController.php @@ -62,6 +62,8 @@ protected function storeModel(array $validated, string $modelClass, MappingModel } if (Auth::check()) { + $model->load(['floor', 'floor.dungeon']); + broadcast(new ModelChangedEvent($model->floor->dungeon, Auth::getUser(), $model)); } diff --git a/app/Http/Controllers/Ajax/AjaxUserController.php b/app/Http/Controllers/Ajax/AjaxUserController.php index b1fe367db7..ae49e55b4a 100644 --- a/app/Http/Controllers/Ajax/AjaxUserController.php +++ b/app/Http/Controllers/Ajax/AjaxUserController.php @@ -8,8 +8,6 @@ use App\User; use Auth; use Exception; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; use Teapot\StatusCode; diff --git a/app/Models/Expansion.php b/app/Models/Expansion.php index 4c09018358..0e0c3da852 100644 --- a/app/Models/Expansion.php +++ b/app/Models/Expansion.php @@ -78,7 +78,7 @@ public function __construct(array $attributes = []) { $this->currentSeasonCache = collect(); $this->nextSeasonCache = collect(); - + parent::__construct($attributes); } diff --git a/app/User.php b/app/User.php index 15fccebd9e..b19dfdf81e 100644 --- a/app/User.php +++ b/app/User.php @@ -100,6 +100,7 @@ class User extends Authenticatable 'name', 'email', 'echo_color', + 'map_facade_style', 'password', 'legal_agreed', 'legal_agreed_ms', From b497c1151fbc893515e978daa28eef51965be8ca Mon Sep 17 00:00:00 2001 From: Wotuu Date: Sat, 18 Nov 2023 00:02:31 +0100 Subject: [PATCH 07/22] #2085 Overriding constructors on models seems to be a nono, they get bypassed sometimes. --- app/Models/Expansion.php | 20 ++++++++++---------- app/Models/Mapping/MappingVersion.php | 24 ++++++++++-------------- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/app/Models/Expansion.php b/app/Models/Expansion.php index 0e0c3da852..c1593c4ea2 100644 --- a/app/Models/Expansion.php +++ b/app/Models/Expansion.php @@ -71,16 +71,8 @@ class Expansion extends CacheModel self::EXPANSION_DRAGONFLIGHT => 'Dragonflight', ]; - private Collection $currentSeasonCache; - private Collection $nextSeasonCache; - - public function __construct(array $attributes = []) - { - $this->currentSeasonCache = collect(); - $this->nextSeasonCache = collect(); - - parent::__construct($attributes); - } + private ?Collection $currentSeasonCache = null; + private ?Collection $nextSeasonCache = null; /** @@ -122,6 +114,10 @@ public function timewalkingevent(): HasOne */ public function currentSeason(GameServerRegion $gameServerRegion): ?Season { + if ($this->currentSeasonCache === null) { + $this->currentSeasonCache = collect(); + } + if ($this->currentSeasonCache->has($gameServerRegion->short)) { return $this->currentSeasonCache->get($gameServerRegion->short); } @@ -146,6 +142,10 @@ public function currentSeason(GameServerRegion $gameServerRegion): ?Season */ public function nextSeason(GameServerRegion $gameServerRegion): ?Season { + if ($this->nextSeasonCache === null) { + $this->nextSeasonCache = collect(); + } + if ($this->nextSeasonCache->has($gameServerRegion->short)) { return $this->nextSeasonCache->get($gameServerRegion->short); } diff --git a/app/Models/Mapping/MappingVersion.php b/app/Models/Mapping/MappingVersion.php index 464ac8d0d0..2465be4698 100644 --- a/app/Models/Mapping/MappingVersion.php +++ b/app/Models/Mapping/MappingVersion.php @@ -91,23 +91,11 @@ class MappingVersion extends Model public $timestamps = true; - /** @var Collection */ - private Collection $cachedFloorUnionsOnFloor; - - /** @var Collection */ - private Collection $cachedFloorUnionForFloor; + private ?Collection $cachedFloorUnionsOnFloor = null; + private ?Collection $cachedFloorUnionForFloor = null; private ?int $isLatestForDungeonCache = null; - public function __construct(array $attributes = []) - { - parent::__construct($attributes); - - $this->cachedFloorUnionsOnFloor = collect(); - $this->cachedFloorUnionForFloor = collect(); - } - - /** * @return bool */ @@ -241,6 +229,10 @@ public function getPrettyName(): string */ public function getFloorUnionsOnFloor(int $floorId): Collection { + if ($this->cachedFloorUnionsOnFloor === null) { + $this->cachedFloorUnionsOnFloor = collect(); + } + if ($this->cachedFloorUnionsOnFloor->has($floorId)) { return $this->cachedFloorUnionsOnFloor->get($floorId); } @@ -263,6 +255,10 @@ public function getFloorUnionsOnFloor(int $floorId): Collection */ public function getFloorUnionForFloor(int $floorId): ?FloorUnion { + if ($this->cachedFloorUnionForFloor === null) { + $this->cachedFloorUnionForFloor = collect(); + } + if ($this->cachedFloorUnionForFloor->has($floorId)) { return $this->cachedFloorUnionForFloor->get($floorId); } From 1e59a068f40bae40b31e37bd30fe4e1b18c47a12 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Sat, 18 Nov 2023 23:42:16 +0100 Subject: [PATCH 08/22] #2085 Drawn lines and paths now also get converted properly when drawn on a facade. --- .../Ajax/AjaxBrushlineController.php | 31 +++++--- .../Controllers/Ajax/AjaxPathController.php | 30 ++++++-- app/Http/Controllers/DungeonController.php | 3 +- .../Controllers/Traits/SavesPolylines.php | 40 +++++++++-- resources/views/admin/dungeon/list.blade.php | 4 +- resources/views/home.blade.php | 72 ++++++++++--------- 6 files changed, 122 insertions(+), 58 deletions(-) diff --git a/app/Http/Controllers/Ajax/AjaxBrushlineController.php b/app/Http/Controllers/Ajax/AjaxBrushlineController.php index 76ad618d87..7e82361691 100644 --- a/app/Http/Controllers/Ajax/AjaxBrushlineController.php +++ b/app/Http/Controllers/Ajax/AjaxBrushlineController.php @@ -10,6 +10,7 @@ use App\Models\Brushline; use App\Models\DungeonRoute; use App\Models\Polyline; +use App\Service\Coordinates\CoordinatesServiceInterface; use Exception; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Contracts\Routing\ResponseFactory; @@ -23,14 +24,19 @@ class AjaxBrushlineController extends Controller use SavesPolylines; /** - * @param APIBrushlineFormRequest $request - * @param DungeonRoute $dungeonRoute - * @param Brushline|null $brushline + * @param APIBrushlineFormRequest $request + * @param CoordinatesServiceInterface $coordinatesService + * @param DungeonRoute $dungeonRoute + * @param Brushline|null $brushline * @return Brushline * @throws AuthorizationException */ - function store(APIBrushlineFormRequest $request, DungeonRoute $dungeonRoute, ?Brushline $brushline = null) - { + function store( + APIBrushlineFormRequest $request, + CoordinatesServiceInterface $coordinatesService, + DungeonRoute $dungeonRoute, + ?Brushline $brushline = null + ) { $dungeonRoute = optional($brushline)->dungeonRoute ?? $dungeonRoute; $this->authorize('edit', $dungeonRoute); @@ -54,11 +60,20 @@ function store(APIBrushlineFormRequest $request, DungeonRoute $dungeonRoute, ?Br try { if ($success) { // Create a new polyline and save it - $polyline = $this->savePolyline(Polyline::findOrNew($brushline->polyline_id), $brushline, $validated['polyline']); + $changedFloor = null; + $polyline = $this->savePolyline( + $coordinatesService, + $dungeonRoute->mappingVersion, + Polyline::findOrNew($brushline->polyline_id), + $brushline, + $validated['polyline'], + $changedFloor + ); // Couple the path to the polyline $brushline->update([ 'polyline_id' => $polyline->id, + 'floor_id' => optional($changedFloor)->id ?? $brushline->floor_id, ]); // Load the polyline so it can be echoed back to the user @@ -84,9 +99,9 @@ function store(APIBrushlineFormRequest $request, DungeonRoute $dungeonRoute, ?Br } /** - * @param Request $request + * @param Request $request * @param DungeonRoute $dungeonRoute - * @param Brushline $brushline + * @param Brushline $brushline * @return Response|ResponseFactory * @throws AuthorizationException */ diff --git a/app/Http/Controllers/Ajax/AjaxPathController.php b/app/Http/Controllers/Ajax/AjaxPathController.php index c161820358..254eaae021 100644 --- a/app/Http/Controllers/Ajax/AjaxPathController.php +++ b/app/Http/Controllers/Ajax/AjaxPathController.php @@ -10,6 +10,7 @@ use App\Models\DungeonRoute; use App\Models\Path; use App\Models\Polyline; +use App\Service\Coordinates\CoordinatesServiceInterface; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; @@ -23,13 +24,18 @@ class AjaxPathController extends Controller use SavesPolylines; /** - * @param APIPathFormRequest $request - * @param DungeonRoute $dungeonRoute - * @param Path|null $path + * @param APIPathFormRequest $request + * @param CoordinatesServiceInterface $coordinatesService + * @param DungeonRoute $dungeonRoute + * @param Path|null $path * @return Path * @throws AuthorizationException */ - function store(APIPathFormRequest $request, DungeonRoute $dungeonRoute, ?Path $path = null) + function store( + APIPathFormRequest $request, + CoordinatesServiceInterface $coordinatesService, + DungeonRoute $dungeonRoute, + ?Path $path = null) { $dungeonRoute = optional($path)->dungeonRoute ?? $dungeonRoute; @@ -54,11 +60,20 @@ function store(APIPathFormRequest $request, DungeonRoute $dungeonRoute, ?Path $p try { if ($success) { // Create a new polyline and save it - $polyline = $this->savePolyline(Polyline::findOrNew($path->polyline_id), $path, $validated['polyline']); + $changedFloor = null; + $polyline = $this->savePolyline( + $coordinatesService, + $dungeonRoute->mappingVersion, + Polyline::findOrNew($path->polyline_id), + $path, + $validated['polyline'], + $changedFloor + ); // Couple the path to the polyline $path->update([ 'polyline_id' => $polyline->id, + 'floor_id' => optional($changedFloor)->id ?? $path->floor_id, ]); // Load the polyline so it can be echoed back to the user @@ -82,13 +97,14 @@ function store(APIPathFormRequest $request, DungeonRoute $dungeonRoute, ?Path $p } catch (Exception $ex) { $result = response('Not found', Http::NOT_FOUND); } + return $result; } /** - * @param Request $request + * @param Request $request * @param DungeonRoute $dungeonRoute - * @param Path $path + * @param Path $path * @return array|ResponseFactory|Response * @throws AuthorizationException */ diff --git a/app/Http/Controllers/DungeonController.php b/app/Http/Controllers/DungeonController.php index 1f373cbe4d..bec8a6ee93 100644 --- a/app/Http/Controllers/DungeonController.php +++ b/app/Http/Controllers/DungeonController.php @@ -134,7 +134,8 @@ public function savenew(DungeonFormRequest $request) public function list() { return view('admin.dungeon.list', [ - 'models' => Dungeon::select('dungeons.*') + 'models' => Dungeon::with(['currentMappingVersion']) + ->select('dungeons.*') ->join('expansions', 'expansions.id', 'dungeons.expansion_id') ->orderByDesc('expansions.released_at') ->orderBy('dungeons.name') diff --git a/app/Http/Controllers/Traits/SavesPolylines.php b/app/Http/Controllers/Traits/SavesPolylines.php index c731951616..738970cac3 100644 --- a/app/Http/Controllers/Traits/SavesPolylines.php +++ b/app/Http/Controllers/Traits/SavesPolylines.php @@ -8,8 +8,12 @@ namespace App\Http\Controllers\Traits; +use App\Logic\Structs\LatLng; +use App\Models\Floor\Floor; +use App\Models\Mapping\MappingVersion; use App\Models\Patreon\PatreonBenefit; use App\Models\Polyline; +use App\Service\Coordinates\CoordinatesServiceInterface; use App\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Auth; @@ -17,14 +21,40 @@ trait SavesPolylines { /** - * @param Polyline $polyline - * @param Model $ownerModel + * @param CoordinatesServiceInterface $coordinatesService + * @param MappingVersion $mappingVersion + * @param Polyline $polyline + * @param Model $ownerModel * @param array{color: string, color_animated: string, weight: int, vertices_json: string} $data - * + * @param Floor|null $changedFloor * @return Polyline */ - private function savePolyline(Polyline $polyline, Model $ownerModel, array $data): Polyline - { + private function savePolyline( + CoordinatesServiceInterface $coordinatesService, + MappingVersion $mappingVersion, + Polyline $polyline, + Model $ownerModel, + array $data, + ?Floor &$changedFloor + ): Polyline { + // The incoming lat/lngs are facade lat/lngs, save the icon on the proper floor + if (User::getCurrentUserMapFacadeStyle() === User::MAP_FACADE_STYLE_FACADE) { + $vertices = json_decode($data['vertices_json'], true); + $realVertices = []; + foreach ($vertices as $vertex) { + $latLng = $coordinatesService->convertFacadeMapLocationToMapLocation( + $mappingVersion, + new LatLng($vertex['lat'], $vertex['lng'], $ownerModel->floor), + $changedFloor + ); + + $realVertices[] = $latLng->toArray(); + $changedFloor = $latLng->getFloor(); + } + + $data['vertices_json'] = json_encode($realVertices); + } + return Polyline::updateOrCreate([ 'id' => $polyline->id, ], [ diff --git a/resources/views/admin/dungeon/list.blade.php b/resources/views/admin/dungeon/list.blade.php index 9216d33c0f..17965b38d8 100644 --- a/resources/views/admin/dungeon/list.blade.php +++ b/resources/views/admin/dungeon/list.blade.php @@ -12,7 +12,7 @@ @@ -51,7 +51,7 @@ @foreach ($models as $dungeon) currentMappingVersion; ?> diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 01b1e4a464..6b698a2491 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -249,50 +249,52 @@
-
+ @if($demoRoutes->isNotEmpty()) +
-
-

- {{ __('views/home.live_demo') }} -

-
+
+

+ {{ __('views/home.live_demo') }} +

+
-
-
-
- @include('common.dungeon.select', [ - 'id' => $dungeonSelectId, - 'label' => false, - 'dungeons' => $demoRouteDungeons, - 'showAll' => false, - 'showSeasons' => true, - 'required' => false - ]) +
+
+
+ @include('common.dungeon.select', [ + 'id' => $dungeonSelectId, + 'label' => false, + 'dungeons' => $demoRouteDungeons, + 'showAll' => false, + 'showSeasons' => true, + 'required' => false + ]) +
-
-
-
+ +
+ + @endif
From d1a7f1f0e89178c1f845c038fb80cd06523efec7 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Sat, 18 Nov 2023 23:47:35 +0100 Subject: [PATCH 09/22] #2130 Added release v7.6 --- database/seeders/releases/v7.6.json | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 database/seeders/releases/v7.6.json diff --git a/database/seeders/releases/v7.6.json b/database/seeders/releases/v7.6.json new file mode 100644 index 0000000000..dfc92725bc --- /dev/null +++ b/database/seeders/releases/v7.6.json @@ -0,0 +1,28 @@ +{ + "id": 215, + "release_changelog_id": 222, + "version": "v7.6", + "title": "Combined floors (as in MDT) for new dungeons now available", + "silent": 0, + "spotlight": 0, + "created_at": "2023-11-18T22:46:34+00:00", + "updated_at": "2023-11-18T22:46:34+00:00", + "changelog": { + "id": 222, + "release_id": 215, + "description": "You can toggle combined floors on through the settings on the pulls sidebar. For certain dungeons (currently only Black Rook Hold, Throne of the Tides and the Dawn of the Infinite) this will show all floors in a single map. You can toggle this behaviour off again through the same settings menu.", + "changes": [ + { + "release_changelog_id": 222, + "release_changelog_category_id": 3, + "ticket_id": 2085, + "change": "Combined floors are now available.", + "category": { + "id": 3, + "key": "map_changes", + "name": "releasechangelogcategories.map_changes" + } + } + ] + } +} From 41e1bb086caadd72d7043bc485c3ca93164e3568 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Mon, 20 Nov 2023 12:12:24 +0100 Subject: [PATCH 10/22] #2132 Fixed dungeons that are not in the current expansion, but are in the current season's links in the route discovery page not showing any routes at all. --- .../DungeonRouteDiscoverController.php | 22 ++++++++----------- app/Logic/MapContext/MapContext.php | 5 ++++- app/Models/Dungeon.php | 2 +- .../discover/season/category.blade.php | 1 + 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/DungeonRouteDiscoverController.php b/app/Http/Controllers/DungeonRouteDiscoverController.php index da025ca514..9353b35e48 100644 --- a/app/Http/Controllers/DungeonRouteDiscoverController.php +++ b/app/Http/Controllers/DungeonRouteDiscoverController.php @@ -35,7 +35,7 @@ public function search() public function discover(ExpansionService $expansionService) { return redirect()->route('dungeonroutes.expansion', [ - 'expansion' => $expansionService->getCurrentExpansion(GameServerRegion::getUserOrDefaultRegion()) + 'expansion' => $expansionService->getCurrentExpansion(GameServerRegion::getUserOrDefaultRegion()), ]); } @@ -447,17 +447,16 @@ public function discovernew(Expansion $expansion, DiscoverServiceInterface $disc */ public function discoverdungeonpopular(Expansion $expansion, Dungeon $dungeon, DiscoverServiceInterface $discoverService) { - $this->authorize('view', $expansion); + $this->authorize('view', $dungeon->expansion); $this->authorize('view', $dungeon); return view('dungeonroute.discover.dungeon.category', [ 'breadcrumbs' => 'dungeonroutes.discoverdungeon.popular', - 'expansion' => $expansion, + 'expansion' => $dungeon->expansion, 'category' => 'popular', 'title' => sprintf(__('controller.dungeonroutediscover.dungeon.popular'), __($dungeon->name)), 'dungeon' => $dungeon, 'dungeonroutes' => $discoverService - ->withExpansion($expansion) ->withLimit(config('keystoneguru.discover.limits.category')) ->popularByDungeon($dungeon), ]); @@ -482,7 +481,7 @@ public function discoverdungeonthisweek( { $expansion = $this->applyCorrectedExpansion($expansion, $dungeon, $discoverService, $seasonService); - $this->authorize('view', $expansion); + $this->authorize('view', $dungeon->expansion); $this->authorize('view', $dungeon); $userRegion = GameServerRegion::getUserOrDefaultRegion(); @@ -498,12 +497,11 @@ public function discoverdungeonthisweek( return view('dungeonroute.discover.dungeon.category', [ 'breadcrumbs' => 'dungeonroutes.discoverdungeon.thisweek', - 'expansion' => $expansion, + 'expansion' => $dungeon->expansion, 'category' => 'thisweek', 'title' => sprintf(__('controller.dungeonroutediscover.dungeon.this_week_affixes'), __($dungeon->name)), 'dungeon' => $dungeon, 'dungeonroutes' => $currentAffixGroup === null ? collect() : $discoverService - ->withExpansion($expansion) ->withLimit(config('keystoneguru.discover.limits.category')) ->popularByDungeonAndAffixGroup($dungeon, $currentAffixGroup), 'affixgroup' => $currentAffixGroup, @@ -529,7 +527,7 @@ public function discoverdungeonnextweek( { $expansion = $this->applyCorrectedExpansion($expansion, $dungeon, $discoverService, $seasonService); - $this->authorize('view', $expansion); + $this->authorize('view', $dungeon->expansion); $this->authorize('view', $dungeon); $userRegion = GameServerRegion::getUserOrDefaultRegion(); @@ -545,12 +543,11 @@ public function discoverdungeonnextweek( return view('dungeonroute.discover.dungeon.category', [ 'breadcrumbs' => 'dungeonroutes.discoverdungeon.nextweek', - 'expansion' => $expansion, + 'expansion' => $dungeon->expansion, 'category' => 'nextweek', 'title' => sprintf(__('controller.dungeonroutediscover.dungeon.next_week_affixes'), __($dungeon->name)), 'dungeon' => $dungeon, 'dungeonroutes' => $nextAffixGroup === null ? collect() : $discoverService - ->withExpansion($expansion) ->withLimit(config('keystoneguru.discover.limits.category')) ->popularByDungeonAndAffixGroup($dungeon, $nextAffixGroup), 'affixgroup' => $nextAffixGroup, @@ -566,17 +563,16 @@ public function discoverdungeonnextweek( */ public function discoverdungeonnew(Expansion $expansion, Dungeon $dungeon, DiscoverServiceInterface $discoverService) { - $this->authorize('view', $expansion); + $this->authorize('view', $dungeon->expansion); $this->authorize('view', $dungeon); return view('dungeonroute.discover.dungeon.category', [ 'breadcrumbs' => 'dungeonroutes.discoverdungeon.new', - 'expansion' => $expansion, + 'expansion' => $dungeon->expansion, 'category' => 'new', 'title' => sprintf(__('controller.dungeonroutediscover.dungeon.new'), __($dungeon->name)), 'dungeon' => $dungeon, 'dungeonroutes' => $discoverService - ->withExpansion($expansion) ->withLimit(config('keystoneguru.discover.limits.category')) ->newByDungeon($dungeon), ]); diff --git a/app/Logic/MapContext/MapContext.php b/app/Logic/MapContext/MapContext.php index 8cc861ad62..a087004850 100644 --- a/app/Logic/MapContext/MapContext.php +++ b/app/Logic/MapContext/MapContext.php @@ -89,7 +89,10 @@ function () use ($mapFacadeStyle) { $useFacade = $mapFacadeStyle === 'facade'; /** @var Dungeon $dungeon */ - $dungeon = $this->floor->dungeon()->without(['floors', 'mapicons', 'enemypacks'])->first(); + $dungeon = $this->floor->dungeon() + ->with(['dungeonSpeedrunRequiredNpcs10Man', 'dungeonSpeedrunRequiredNpcs25Man']) + ->without(['floors', 'mapicons', 'enemypacks']) + ->first(); // Filter out floors that we do not need $dungeon->setRelation('floors', $this->getFloors()); diff --git a/app/Models/Dungeon.php b/app/Models/Dungeon.php index 93d636b58b..43cb9c3af2 100644 --- a/app/Models/Dungeon.php +++ b/app/Models/Dungeon.php @@ -88,7 +88,7 @@ class Dungeon extends CacheModel implements MappingModelInterface 'slug', ]; - public $with = ['expansion', 'gameVersion', 'floors', 'dungeonSpeedrunRequiredNpcs10Man', 'dungeonSpeedrunRequiredNpcs25Man']; + public $with = ['expansion', 'gameVersion', 'floors']; public $hidden = ['slug', 'active', 'mdt_id', 'zone_id', 'created_at', 'updated_at']; public $timestamps = false; diff --git a/resources/views/dungeonroute/discover/season/category.blade.php b/resources/views/dungeonroute/discover/season/category.blade.php index c5ca2fea5f..c3596c3b56 100644 --- a/resources/views/dungeonroute/discover/season/category.blade.php +++ b/resources/views/dungeonroute/discover/season/category.blade.php @@ -30,6 +30,7 @@ 'currentAffixGroup' => $currentAffixGroup, 'affixgroup' => $affixgroup, 'dungeonroutes' => $dungeonroutes, + 'showDungeonImage' => true, 'loadMore' => $dungeonroutes->count() >= config('keystoneguru.discover.limits.category'), ]) From 83104e9eccd7c2b75cad7e2baa9f2b5986abdc31 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Mon, 20 Nov 2023 13:01:03 +0000 Subject: [PATCH 11/22] Automated commit for mapping updates --- .../seeders/dungeondata/mapping_versions.json | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/database/seeders/dungeondata/mapping_versions.json b/database/seeders/dungeondata/mapping_versions.json index a6f82aa9da..0db56384e2 100644 --- a/database/seeders/dungeondata/mapping_versions.json +++ b/database/seeders/dungeondata/mapping_versions.json @@ -3297,10 +3297,10 @@ "enemy_forces_required_teeming": 1000, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 2040, "mdt_mapping_hash": "a4f438519558a24c8b72bf3a36e80b38", "created_at": "2023-11-10T20:45:38.000000Z", - "updated_at": "2023-11-10T20:45:38.000000Z", + "updated_at": "2023-11-20T12:58:10.000000Z", "merged": false }, { @@ -3311,10 +3311,10 @@ "enemy_forces_required_teeming": 1000, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 2160, "mdt_mapping_hash": "cf40af434ee4889edb551d0e37e38af5", "created_at": "2023-11-10T20:45:40.000000Z", - "updated_at": "2023-11-10T20:45:40.000000Z", + "updated_at": "2023-11-20T12:58:57.000000Z", "merged": false }, { @@ -3325,10 +3325,10 @@ "enemy_forces_required_teeming": 336, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 1800, "mdt_mapping_hash": "68f61a6779479cd201f1390d06207e03", "created_at": "2023-11-10T20:45:42.000000Z", - "updated_at": "2023-11-10T20:45:42.000000Z", + "updated_at": "2023-11-20T12:59:46.000000Z", "merged": false }, { @@ -3381,10 +3381,10 @@ "enemy_forces_required_teeming": 1000, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 2100, "mdt_mapping_hash": "87fabbcc1de7850e77bf2cf7c1046132", "created_at": "2023-11-10T20:45:50.000000Z", - "updated_at": "2023-11-10T20:45:50.000000Z", + "updated_at": "2023-11-20T12:55:51.000000Z", "merged": false }, { @@ -3395,10 +3395,10 @@ "enemy_forces_required_teeming": 1000, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 1980, "mdt_mapping_hash": "9987f90688db010a9c0b11690c5730da", "created_at": "2023-11-12T21:19:29.000000Z", - "updated_at": "2023-11-12T21:19:29.000000Z", + "updated_at": "2023-11-20T12:57:25.000000Z", "merged": false }, { @@ -3409,10 +3409,10 @@ "enemy_forces_required_teeming": 1000, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 2220, "mdt_mapping_hash": "4f550668259a7d45059bea2fc26aff15", "created_at": "2023-11-12T21:19:31.000000Z", - "updated_at": "2023-11-12T21:19:31.000000Z", + "updated_at": "2023-11-20T13:00:36.000000Z", "merged": false }, { @@ -3423,10 +3423,10 @@ "enemy_forces_required_teeming": 1000, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 2040, "mdt_mapping_hash": "f6f071ee1012ac1e9746f147a4507e45", "created_at": "2023-11-12T21:19:33.000000Z", - "updated_at": "2023-11-12T21:19:33.000000Z", + "updated_at": "2023-11-20T12:54:59.000000Z", "merged": false }, { @@ -3437,10 +3437,10 @@ "enemy_forces_required_teeming": 237, "enemy_forces_shrouded": null, "enemy_forces_shrouded_zul_gamux": null, - "timer_max_seconds": 0, + "timer_max_seconds": 1800, "mdt_mapping_hash": "59105803bd0ab566ea1d6815eafb5e10", "created_at": "2023-11-12T22:10:08.000000Z", - "updated_at": "2023-11-12T22:10:08.000000Z", + "updated_at": "2023-11-20T12:56:36.000000Z", "merged": false } ] \ No newline at end of file From 20bbf607ce669efbcf1b4465e4b938391629da64 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Mon, 20 Nov 2023 13:04:44 +0000 Subject: [PATCH 12/22] Automated commit for mapping updates --- .../dungeondata/mapping_commit_logs.json | 752 +++++++++--------- .../seeders/dungeondata/mapping_versions.json | 30 +- 2 files changed, 394 insertions(+), 388 deletions(-) diff --git a/database/seeders/dungeondata/mapping_commit_logs.json b/database/seeders/dungeondata/mapping_commit_logs.json index e31d95e6b3..470c884092 100644 --- a/database/seeders/dungeondata/mapping_commit_logs.json +++ b/database/seeders/dungeondata/mapping_commit_logs.json @@ -3,2208 +3,2214 @@ "id": 1, "merged": 1, "created_at": "2022-11-21T22:36:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 2, "merged": 1, "created_at": "2022-11-22T21:48:34.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 3, "merged": 1, "created_at": "2022-11-22T22:01:30.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 4, "merged": 1, "created_at": "2022-11-22T22:27:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 5, "merged": 1, "created_at": "2022-11-23T13:31:09.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 6, "merged": 1, "created_at": "2022-11-23T21:53:50.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 7, "merged": 1, "created_at": "2022-11-24T17:41:25.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 8, "merged": 1, "created_at": "2022-11-24T21:56:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 9, "merged": 1, "created_at": "2022-11-25T13:11:29.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 10, "merged": 1, "created_at": "2022-11-25T17:21:09.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 11, "merged": 1, "created_at": "2022-11-25T20:22:35.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 12, "merged": 1, "created_at": "2022-11-25T23:45:52.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 13, "merged": 1, "created_at": "2022-11-26T09:35:03.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 14, "merged": 1, "created_at": "2022-11-26T09:40:43.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 15, "merged": 1, "created_at": "2022-11-26T21:02:05.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 16, "merged": 1, "created_at": "2022-11-26T22:11:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 17, "merged": 1, "created_at": "2022-11-27T14:21:33.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 18, "merged": 1, "created_at": "2022-11-28T10:11:32.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 19, "merged": 1, "created_at": "2022-11-28T17:26:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 20, "merged": 1, "created_at": "2022-11-28T21:39:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 21, "merged": 1, "created_at": "2022-11-28T21:51:31.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 22, "merged": 1, "created_at": "2022-11-28T22:26:04.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 23, "merged": 1, "created_at": "2022-12-08T13:12:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 24, "merged": 1, "created_at": "2022-12-16T10:25:30.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 25, "merged": 1, "created_at": "2022-12-17T23:11:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 26, "merged": 1, "created_at": "2022-12-18T00:51:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 27, "merged": 1, "created_at": "2022-12-19T17:11:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 28, "merged": 1, "created_at": "2022-12-21T22:24:29.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 29, "merged": 1, "created_at": "2022-12-24T21:56:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 30, "merged": 1, "created_at": "2022-12-27T21:02:49.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 31, "merged": 1, "created_at": "2022-12-27T22:54:43.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 32, "merged": 1, "created_at": "2022-12-28T00:06:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 33, "merged": 1, "created_at": "2023-01-30T21:25:02.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 34, "merged": 1, "created_at": "2023-01-30T21:25:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 35, "merged": 1, "created_at": "2023-01-31T21:44:29.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 36, "merged": 1, "created_at": "2023-02-04T23:56:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 37, "merged": 1, "created_at": "2023-02-05T16:51:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 38, "merged": 1, "created_at": "2023-02-05T22:34:48.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 39, "merged": 1, "created_at": "2023-02-05T23:41:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 40, "merged": 1, "created_at": "2023-02-06T10:24:08.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 41, "merged": 1, "created_at": "2023-02-22T10:11:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 42, "merged": 1, "created_at": "2023-02-23T14:21:24.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 43, "merged": 1, "created_at": "2023-02-24T21:06:33.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 44, "merged": 1, "created_at": "2023-02-25T17:20:56.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 45, "merged": 1, "created_at": "2023-03-01T23:41:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 46, "merged": 1, "created_at": "2023-03-03T13:30:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 47, "merged": 1, "created_at": "2023-03-05T15:50:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 48, "merged": 1, "created_at": "2023-03-06T20:51:51.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 49, "merged": 1, "created_at": "2023-03-07T14:15:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 50, "merged": 1, "created_at": "2023-03-09T11:40:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 51, "merged": 1, "created_at": "2023-03-09T21:40:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 52, "merged": 1, "created_at": "2023-03-10T22:40:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 53, "merged": 1, "created_at": "2023-03-11T00:05:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 54, "merged": 1, "created_at": "2023-03-13T11:20:08.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 55, "merged": 1, "created_at": "2023-03-17T22:55:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 56, "merged": 1, "created_at": "2023-03-27T15:10:09.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 57, "merged": 1, "created_at": "2023-03-31T15:42:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 58, "merged": 1, "created_at": "2023-03-31T15:43:24.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 59, "merged": 1, "created_at": "2023-03-31T17:00:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 60, "merged": 1, "created_at": "2023-04-03T13:05:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 61, "merged": 1, "created_at": "2023-04-04T08:09:06.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 62, "merged": 1, "created_at": "2023-04-04T09:40:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 63, "merged": 1, "created_at": "2023-04-05T14:00:28.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 64, "merged": 1, "created_at": "2023-04-05T16:40:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 65, "merged": 1, "created_at": "2023-04-06T08:35:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 66, "merged": 1, "created_at": "2023-04-06T17:05:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 67, "merged": 1, "created_at": "2023-04-06T21:40:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 68, "merged": 1, "created_at": "2023-04-06T23:15:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 69, "merged": 1, "created_at": "2023-04-07T14:00:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 70, "merged": 1, "created_at": "2023-04-07T14:52:54.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 71, "merged": 1, "created_at": "2023-04-07T15:40:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 72, "merged": 1, "created_at": "2023-04-07T17:40:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 73, "merged": 1, "created_at": "2023-04-07T20:15:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 74, "merged": 1, "created_at": "2023-04-07T22:20:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 75, "merged": 1, "created_at": "2023-04-08T09:05:10.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 76, "merged": 1, "created_at": "2023-04-08T16:30:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 77, "merged": 1, "created_at": "2023-04-08T17:45:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 78, "merged": 1, "created_at": "2023-04-08T20:30:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 79, "merged": 1, "created_at": "2023-04-08T22:10:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 80, "merged": 1, "created_at": "2023-04-09T08:50:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 81, "merged": 1, "created_at": "2023-04-09T14:23:32.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 82, "merged": 1, "created_at": "2023-04-11T15:06:56.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 83, "merged": 1, "created_at": "2023-04-11T15:16:40.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 84, "merged": 1, "created_at": "2023-04-12T12:16:45.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 85, "merged": 1, "created_at": "2023-04-14T14:45:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 86, "merged": 1, "created_at": "2023-04-23T08:55:31.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 87, "merged": 1, "created_at": "2023-04-23T10:55:55.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 88, "merged": 1, "created_at": "2023-04-23T19:47:01.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 89, "merged": 1, "created_at": "2023-04-26T09:08:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 90, "merged": 1, "created_at": "2023-04-26T10:23:30.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 91, "merged": 1, "created_at": "2023-04-28T08:21:52.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 92, "merged": 1, "created_at": "2023-04-28T09:06:34.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 93, "merged": 1, "created_at": "2023-04-29T09:15:52.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 94, "merged": 1, "created_at": "2023-04-29T20:16:58.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 95, "merged": 1, "created_at": "2023-05-01T12:24:06.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 96, "merged": 1, "created_at": "2023-05-01T21:20:26.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 97, "merged": 1, "created_at": "2023-05-03T11:47:46.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 98, "merged": 1, "created_at": "2023-05-03T14:25:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 99, "merged": 1, "created_at": "2023-05-05T09:18:53.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 100, "merged": 1, "created_at": "2023-05-09T08:59:04.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 101, "merged": 1, "created_at": "2023-05-12T11:18:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 102, "merged": 1, "created_at": "2023-05-13T08:45:24.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 103, "merged": 1, "created_at": "2023-05-13T10:20:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 104, "merged": 1, "created_at": "2023-05-13T13:15:32.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 105, "merged": 1, "created_at": "2023-05-13T20:25:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 106, "merged": 1, "created_at": "2023-05-14T05:59:42.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 107, "merged": 1, "created_at": "2023-05-14T06:13:50.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 108, "merged": 1, "created_at": "2023-05-14T16:15:30.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 109, "merged": 1, "created_at": "2023-05-14T17:50:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 110, "merged": 1, "created_at": "2023-05-14T22:30:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 111, "merged": 1, "created_at": "2023-05-15T12:28:49.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 112, "merged": 1, "created_at": "2023-05-16T21:28:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 113, "merged": 1, "created_at": "2023-05-19T10:57:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 114, "merged": 1, "created_at": "2023-05-19T21:17:34.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 115, "merged": 1, "created_at": "2023-05-21T09:06:02.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 116, "merged": 1, "created_at": "2023-05-26T06:02:03.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 117, "merged": 1, "created_at": "2023-05-26T07:10:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 118, "merged": 1, "created_at": "2023-05-26T10:00:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 119, "merged": 1, "created_at": "2023-06-12T13:45:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 120, "merged": 1, "created_at": "2023-06-13T14:18:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 121, "merged": 1, "created_at": "2023-06-18T21:10:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 122, "merged": 1, "created_at": "2023-06-28T19:09:06.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 123, "merged": 1, "created_at": "2023-06-28T20:27:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 124, "merged": 1, "created_at": "2023-06-29T22:20:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 125, "merged": 1, "created_at": "2023-07-03T16:35:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 126, "merged": 1, "created_at": "2023-07-03T16:36:53.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 127, "merged": 1, "created_at": "2023-07-03T16:37:33.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 128, "merged": 1, "created_at": "2023-07-09T11:30:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 129, "merged": 1, "created_at": "2023-07-09T21:22:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 130, "merged": 1, "created_at": "2023-07-10T07:45:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 131, "merged": 1, "created_at": "2023-07-10T09:50:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 132, "merged": 1, "created_at": "2023-07-10T12:38:52.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 133, "merged": 1, "created_at": "2023-07-10T13:01:57.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 134, "merged": 1, "created_at": "2023-07-11T10:10:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 135, "merged": 1, "created_at": "2023-07-21T09:04:35.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 136, "merged": 1, "created_at": "2023-07-21T11:00:25.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 137, "merged": 1, "created_at": "2023-07-22T16:22:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 138, "merged": 1, "created_at": "2023-07-25T16:00:30.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 139, "merged": 1, "created_at": "2023-07-26T10:15:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 140, "merged": 1, "created_at": "2023-07-26T10:15:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 141, "merged": 1, "created_at": "2023-07-26T10:15:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 142, "merged": 1, "created_at": "2023-07-26T10:15:39.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 143, "merged": 1, "created_at": "2023-07-26T10:17:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 144, "merged": 1, "created_at": "2023-07-26T10:17:31.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 145, "merged": 1, "created_at": "2023-07-26T10:17:32.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 146, "merged": 1, "created_at": "2023-07-26T10:17:32.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 147, "merged": 1, "created_at": "2023-07-26T10:17:33.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 148, "merged": 1, "created_at": "2023-07-26T10:17:39.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 149, "merged": 1, "created_at": "2023-07-26T10:17:46.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 150, "merged": 1, "created_at": "2023-07-26T10:18:47.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 151, "merged": 1, "created_at": "2023-07-26T10:19:09.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 152, "merged": 1, "created_at": "2023-07-26T10:19:09.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 153, "merged": 1, "created_at": "2023-07-26T10:20:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 154, "merged": 1, "created_at": "2023-07-26T10:20:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 155, "merged": 1, "created_at": "2023-07-26T10:21:59.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 156, "merged": 1, "created_at": "2023-07-26T10:22:00.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 157, "merged": 1, "created_at": "2023-07-26T10:22:05.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 158, "merged": 1, "created_at": "2023-07-26T10:22:08.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 159, "merged": 1, "created_at": "2023-07-26T10:22:11.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 160, "merged": 1, "created_at": "2023-07-26T10:22:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 161, "merged": 1, "created_at": "2023-07-26T10:22:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 162, "merged": 1, "created_at": "2023-07-26T10:22:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 163, "merged": 1, "created_at": "2023-07-26T10:22:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 164, "merged": 1, "created_at": "2023-07-26T10:22:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 165, "merged": 1, "created_at": "2023-07-26T10:22:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 166, "merged": 1, "created_at": "2023-07-26T10:22:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 167, "merged": 1, "created_at": "2023-07-26T10:22:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 168, "merged": 1, "created_at": "2023-07-26T10:22:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 169, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 170, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 171, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 172, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 173, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 174, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 175, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 176, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 177, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 178, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 179, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 180, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 181, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 182, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 183, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 184, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 185, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 186, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 187, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 188, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 189, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 190, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 191, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 192, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 193, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 194, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 195, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 196, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 197, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 198, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 199, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 200, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 201, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 202, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 203, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 204, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 205, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 206, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 207, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 208, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 209, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 210, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 211, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 212, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 213, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 214, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 215, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 216, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 217, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 218, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 219, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 220, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 221, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 222, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 223, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 224, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 225, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 226, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 227, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 228, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 229, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 230, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 231, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 232, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 233, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 234, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 235, "merged": 1, "created_at": "2023-07-26T10:22:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 236, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 237, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 238, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 239, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 240, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 241, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 242, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 243, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 244, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 245, "merged": 1, "created_at": "2023-07-26T10:22:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 246, "merged": 1, "created_at": "2023-07-26T10:22:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 247, "merged": 1, "created_at": "2023-07-26T10:22:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 248, "merged": 1, "created_at": "2023-07-28T12:08:27.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 249, "merged": 1, "created_at": "2023-07-29T07:24:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 250, "merged": 1, "created_at": "2023-08-01T21:45:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 251, "merged": 1, "created_at": "2023-08-04T14:54:33.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 252, "merged": 1, "created_at": "2023-08-04T15:06:43.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 253, "merged": 1, "created_at": "2023-08-06T09:50:23.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 254, "merged": 1, "created_at": "2023-08-09T20:57:45.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 255, "merged": 1, "created_at": "2023-08-11T22:45:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 256, "merged": 1, "created_at": "2023-08-12T08:15:25.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 257, "merged": 1, "created_at": "2023-08-13T16:20:24.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 258, "merged": 1, "created_at": "2023-08-13T20:20:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 259, "merged": 1, "created_at": "2023-08-13T22:50:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 260, "merged": 1, "created_at": "2023-08-14T09:20:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 261, "merged": 1, "created_at": "2023-08-14T10:55:26.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 262, "merged": 1, "created_at": "2023-08-14T15:45:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 263, "merged": 1, "created_at": "2023-08-14T18:25:27.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 264, "merged": 1, "created_at": "2023-08-14T22:30:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 265, "merged": 1, "created_at": "2023-08-15T11:15:27.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 266, "merged": 1, "created_at": "2023-08-15T13:00:27.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 267, "merged": 1, "created_at": "2023-08-15T16:15:27.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 268, "merged": 1, "created_at": "2023-08-15T22:25:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 269, "merged": 1, "created_at": "2023-08-17T01:00:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 270, "merged": 1, "created_at": "2023-08-20T13:45:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 271, "merged": 1, "created_at": "2023-08-20T16:20:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 272, "merged": 1, "created_at": "2023-08-20T21:35:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 273, "merged": 1, "created_at": "2023-08-21T10:20:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 274, "merged": 1, "created_at": "2023-08-21T21:25:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 275, "merged": 1, "created_at": "2023-08-22T14:00:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 276, "merged": 1, "created_at": "2023-08-22T16:05:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 277, "merged": 1, "created_at": "2023-08-22T19:05:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 278, "merged": 1, "created_at": "2023-08-22T22:05:15.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 279, "merged": 1, "created_at": "2023-08-23T15:25:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 280, "merged": 1, "created_at": "2023-08-23T20:10:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 281, "merged": 1, "created_at": "2023-08-24T00:35:13.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 282, "merged": 1, "created_at": "2023-08-24T08:55:14.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 283, "merged": 1, "created_at": "2023-08-24T14:10:43.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 284, "merged": 1, "created_at": "2023-08-24T18:19:39.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 285, "merged": 1, "created_at": "2023-08-24T18:25:59.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 286, "merged": 1, "created_at": "2023-08-24T18:42:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 287, "merged": 1, "created_at": "2023-08-24T19:59:12.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 288, "merged": 1, "created_at": "2023-08-31T16:10:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 289, "merged": 1, "created_at": "2023-08-31T17:25:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 290, "merged": 1, "created_at": "2023-09-01T09:00:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 291, "merged": 1, "created_at": "2023-09-02T10:15:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 292, "merged": 1, "created_at": "2023-09-02T13:15:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 293, "merged": 1, "created_at": "2023-09-02T16:35:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 294, "merged": 1, "created_at": "2023-09-03T08:45:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 295, "merged": 1, "created_at": "2023-09-03T22:00:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 296, "merged": 1, "created_at": "2023-09-04T12:20:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 297, "merged": 1, "created_at": "2023-09-05T21:20:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 298, "merged": 1, "created_at": "2023-09-06T09:25:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 299, "merged": 1, "created_at": "2023-09-06T21:55:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 300, "merged": 1, "created_at": "2023-09-07T09:45:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 301, "merged": 1, "created_at": "2023-09-07T12:20:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 302, "merged": 1, "created_at": "2023-09-07T15:35:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 303, "merged": 1, "created_at": "2023-09-07T22:00:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 304, "merged": 1, "created_at": "2023-09-08T09:50:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 305, "merged": 1, "created_at": "2023-09-08T15:25:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 306, "merged": 1, "created_at": "2023-09-09T22:15:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 307, "merged": 1, "created_at": "2023-09-10T15:40:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 308, "merged": 1, "created_at": "2023-09-10T21:00:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 309, "merged": 1, "created_at": "2023-09-12T22:00:31.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 310, "merged": 1, "created_at": "2023-09-14T22:05:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 311, "merged": 1, "created_at": "2023-09-15T15:35:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 312, "merged": 1, "created_at": "2023-09-15T22:10:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 313, "merged": 1, "created_at": "2023-09-16T22:10:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 314, "merged": 1, "created_at": "2023-09-17T08:20:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 315, "merged": 1, "created_at": "2023-09-18T11:10:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 316, "merged": 1, "created_at": "2023-09-18T16:15:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 317, "merged": 1, "created_at": "2023-09-18T21:45:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 318, "merged": 1, "created_at": "2023-09-19T21:50:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 319, "merged": 1, "created_at": "2023-09-22T11:40:09.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 320, "merged": 1, "created_at": "2023-09-22T13:05:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 321, "merged": 1, "created_at": "2023-09-22T16:30:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 322, "merged": 1, "created_at": "2023-09-22T18:09:53.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 323, "merged": 1, "created_at": "2023-09-22T22:40:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 324, "merged": 1, "created_at": "2023-09-23T08:00:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 325, "merged": 1, "created_at": "2023-09-23T09:30:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 326, "merged": 1, "created_at": "2023-09-24T15:03:08.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 327, "merged": 1, "created_at": "2023-09-24T17:50:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 328, "merged": 1, "created_at": "2023-09-24T20:25:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 329, "merged": 1, "created_at": "2023-09-26T08:55:58.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 330, "merged": 1, "created_at": "2023-09-26T21:35:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 331, "merged": 1, "created_at": "2023-09-27T21:40:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 332, "merged": 1, "created_at": "2023-09-28T08:14:52.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 333, "merged": 1, "created_at": "2023-09-28T21:35:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 334, "merged": 1, "created_at": "2023-09-29T21:55:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 335, "merged": 1, "created_at": "2023-09-30T22:30:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 336, "merged": 1, "created_at": "2023-10-01T10:35:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 337, "merged": 1, "created_at": "2023-10-01T22:05:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 338, "merged": 1, "created_at": "2023-10-02T14:05:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 339, "merged": 1, "created_at": "2023-10-02T21:40:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 340, "merged": 1, "created_at": "2023-10-03T21:50:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 341, "merged": 1, "created_at": "2023-10-04T22:35:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 342, "merged": 1, "created_at": "2023-10-05T16:00:24.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 343, "merged": 1, "created_at": "2023-10-05T22:05:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 344, "merged": 1, "created_at": "2023-10-07T22:50:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 345, "merged": 1, "created_at": "2023-10-08T22:00:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 346, "merged": 1, "created_at": "2023-10-10T20:46:37.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 347, "merged": 1, "created_at": "2023-10-10T20:54:42.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 348, "merged": 1, "created_at": "2023-10-11T08:02:16.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 349, "merged": 1, "created_at": "2023-10-12T21:50:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 350, "merged": 1, "created_at": "2023-10-17T19:06:24.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 351, "merged": 1, "created_at": "2023-10-17T19:56:06.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 352, "merged": 1, "created_at": "2023-10-18T15:00:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 353, "merged": 1, "created_at": "2023-10-21T21:10:22.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 354, "merged": 1, "created_at": "2023-10-21T22:35:17.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 355, "merged": 1, "created_at": "2023-10-27T12:15:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 356, "merged": 1, "created_at": "2023-10-27T12:34:38.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 357, "merged": 1, "created_at": "2023-10-31T11:05:21.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 358, "merged": 1, "created_at": "2023-10-31T13:32:30.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 359, "merged": 1, "created_at": "2023-10-31T14:55:20.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 360, "merged": 1, "created_at": "2023-11-02T11:18:47.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 361, "merged": 1, "created_at": "2023-11-02T12:19:47.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 362, "merged": 1, "created_at": "2023-11-02T13:35:54.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 363, "merged": 1, "created_at": "2023-11-02T16:00:19.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 364, - "merged": 0, + "merged": 1, "created_at": "2023-11-03T10:20:18.000000Z", - "updated_at": "2023-11-03T10:20:18.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 365, - "merged": 0, + "merged": 1, "created_at": "2023-11-03T22:28:08.000000Z", - "updated_at": "2023-11-03T22:28:08.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 366, - "merged": 0, + "merged": 1, "created_at": "2023-11-10T21:21:52.000000Z", - "updated_at": "2023-11-10T21:21:52.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 367, - "merged": 0, + "merged": 1, "created_at": "2023-11-10T21:46:04.000000Z", - "updated_at": "2023-11-10T21:46:04.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" }, { "id": 368, - "merged": 0, + "merged": 1, "created_at": "2023-11-12T21:19:59.000000Z", - "updated_at": "2023-11-12T21:19:59.000000Z" + "updated_at": "2023-11-20T13:01:08.000000Z" + }, + { + "id": 369, + "merged": 0, + "created_at": "2023-11-20T13:01:07.000000Z", + "updated_at": "2023-11-20T13:01:07.000000Z" } ] \ No newline at end of file diff --git a/database/seeders/dungeondata/mapping_versions.json b/database/seeders/dungeondata/mapping_versions.json index 0db56384e2..63f0282c40 100644 --- a/database/seeders/dungeondata/mapping_versions.json +++ b/database/seeders/dungeondata/mapping_versions.json @@ -3231,7 +3231,7 @@ "mdt_mapping_hash": "da56947483ab2c5b528fff82d2bafe71", "created_at": "2023-11-03T09:17:58.000000Z", "updated_at": "2023-11-03T09:17:58.000000Z", - "merged": false + "merged": true }, { "id": 260, @@ -3245,7 +3245,7 @@ "mdt_mapping_hash": null, "created_at": "2023-11-03T09:17:58.000000Z", "updated_at": "2023-11-03T09:17:58.000000Z", - "merged": false + "merged": true }, { "id": 261, @@ -3259,7 +3259,7 @@ "mdt_mapping_hash": null, "created_at": "2023-11-03T09:17:58.000000Z", "updated_at": "2023-11-03T09:17:58.000000Z", - "merged": false + "merged": true }, { "id": 262, @@ -3273,7 +3273,7 @@ "mdt_mapping_hash": "42cfaf44cdfa4748217796b070237cd1", "created_at": "2023-11-03T11:10:46.000000Z", "updated_at": "2023-11-03T11:10:46.000000Z", - "merged": false + "merged": true }, { "id": 263, @@ -3287,7 +3287,7 @@ "mdt_mapping_hash": "2d59f6f14750f0ef85d0fd3152dcb0af", "created_at": "2023-11-03T12:59:19.000000Z", "updated_at": "2023-11-03T12:59:20.000000Z", - "merged": false + "merged": true }, { "id": 264, @@ -3301,7 +3301,7 @@ "mdt_mapping_hash": "a4f438519558a24c8b72bf3a36e80b38", "created_at": "2023-11-10T20:45:38.000000Z", "updated_at": "2023-11-20T12:58:10.000000Z", - "merged": false + "merged": true }, { "id": 265, @@ -3315,7 +3315,7 @@ "mdt_mapping_hash": "cf40af434ee4889edb551d0e37e38af5", "created_at": "2023-11-10T20:45:40.000000Z", "updated_at": "2023-11-20T12:58:57.000000Z", - "merged": false + "merged": true }, { "id": 266, @@ -3329,7 +3329,7 @@ "mdt_mapping_hash": "68f61a6779479cd201f1390d06207e03", "created_at": "2023-11-10T20:45:42.000000Z", "updated_at": "2023-11-20T12:59:46.000000Z", - "merged": false + "merged": true }, { "id": 267, @@ -3343,7 +3343,7 @@ "mdt_mapping_hash": "59105803bd0ab566ea1d6815eafb5e10", "created_at": "2023-11-10T20:45:44.000000Z", "updated_at": "2023-11-10T20:45:44.000000Z", - "merged": false + "merged": true }, { "id": 268, @@ -3357,7 +3357,7 @@ "mdt_mapping_hash": "8602861b04509feac19e3ea57b4d1232", "created_at": "2023-11-10T20:45:46.000000Z", "updated_at": "2023-11-10T20:45:46.000000Z", - "merged": false + "merged": true }, { "id": 269, @@ -3371,7 +3371,7 @@ "mdt_mapping_hash": "3058f194a3822e06060398b7d594a3ba", "created_at": "2023-11-10T20:45:48.000000Z", "updated_at": "2023-11-10T20:45:49.000000Z", - "merged": false + "merged": true }, { "id": 270, @@ -3385,7 +3385,7 @@ "mdt_mapping_hash": "87fabbcc1de7850e77bf2cf7c1046132", "created_at": "2023-11-10T20:45:50.000000Z", "updated_at": "2023-11-20T12:55:51.000000Z", - "merged": false + "merged": true }, { "id": 271, @@ -3399,7 +3399,7 @@ "mdt_mapping_hash": "9987f90688db010a9c0b11690c5730da", "created_at": "2023-11-12T21:19:29.000000Z", "updated_at": "2023-11-20T12:57:25.000000Z", - "merged": false + "merged": true }, { "id": 272, @@ -3413,7 +3413,7 @@ "mdt_mapping_hash": "4f550668259a7d45059bea2fc26aff15", "created_at": "2023-11-12T21:19:31.000000Z", "updated_at": "2023-11-20T13:00:36.000000Z", - "merged": false + "merged": true }, { "id": 273, @@ -3427,7 +3427,7 @@ "mdt_mapping_hash": "f6f071ee1012ac1e9746f147a4507e45", "created_at": "2023-11-12T21:19:33.000000Z", "updated_at": "2023-11-20T12:54:59.000000Z", - "merged": false + "merged": true }, { "id": 274, From 177a5abfaef4351a5d27bbf11b58aaee116abb23 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Mon, 20 Nov 2023 14:13:54 +0100 Subject: [PATCH 13/22] #2130 Fixed simulationcraft integration not working with the current season's dungeons --- app/Logic/SimulationCraft/RaidEventsCollection.php | 2 +- .../common/maps/controls/elements/dungeonroute/info.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Logic/SimulationCraft/RaidEventsCollection.php b/app/Logic/SimulationCraft/RaidEventsCollection.php index abb23dd5f8..9d0942d692 100644 --- a/app/Logic/SimulationCraft/RaidEventsCollection.php +++ b/app/Logic/SimulationCraft/RaidEventsCollection.php @@ -85,7 +85,7 @@ public function toString(): string $this->options->battle_shout, $this->options->mystic_touch, $this->options->chaos_brand, - $this->options->dungeonroute->dungeon->timer_max_seconds, + $this->options->dungeonroute->mappingVersion->timer_max_seconds, $this->options->dungeonroute->title, $this->options->shrouded_bounty_type === SimulationCraftRaidEventsOptions::SHROUDED_BOUNTY_TYPE_NONE ? '' : sprintf('keystone_bounty=%s', $this->options->shrouded_bounty_type), diff --git a/resources/views/common/maps/controls/elements/dungeonroute/info.blade.php b/resources/views/common/maps/controls/elements/dungeonroute/info.blade.php index 4e0f58ad73..9dedaeb947 100644 --- a/resources/views/common/maps/controls/elements/dungeonroute/info.blade.php +++ b/resources/views/common/maps/controls/elements/dungeonroute/info.blade.php @@ -14,7 +14,7 @@ gmdate('i:s', $dungeonroute->dungeon->getTimerUpgradePlusTwoSeconds()), gmdate('i:s', $dungeonroute->dungeon->getTimerUpgradePlusThreeSeconds())) }}"> - {{ gmdate('i:s', $dungeonroute->dungeon->timer_max_seconds) }} + {{ gmdate('i:s', $dungeonroute->mappingVersion->timer_max_seconds) }}
From 0e350cd7284a98bff7c469c57b020f6d9306663b Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Mon, 20 Nov 2023 21:14:18 +0100 Subject: [PATCH 14/22] #2116 Fixed image carousel being bugged when loaded in the table view. --- .../common/dungeonroute/handlers/carouselhandler.js | 10 ++++++---- .../assets/js/custom/inline/dungeonroute/table.js | 2 +- .../common/handlebars/thumbnailcarousel.blade.php | 1 - 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js b/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js index 043e1579f4..6b1c29f051 100644 --- a/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js +++ b/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js @@ -3,7 +3,7 @@ class CarouselHandler { } - refreshCarousel(prefix = '') { + refreshCarousel(prefix = '', settingsOverride = {}) { // Only perform this when the page is actually fully loaded - otherwise space calculations go wrong // and owl carousel completely flips and breaks pages. @@ -104,9 +104,11 @@ class CarouselHandler { // }); // $(`${prefix} .light-slider.multiple`).each(function(item){ // $(this).lightSlider($.extend({}, baseSettings, {loop: true})); - // }); - $(`${prefix} .light-slider.single`).lightSlider(baseSettings); - $(`${prefix} .light-slider.multiple`).lightSlider($.extend({}, baseSettings, {loop: true})); + // });` + let settings = $.extend({}, baseSettings, settingsOverride); + + $(`${prefix} .light-slider.single`).lightSlider(settings); + $(`${prefix} .light-slider.multiple`).lightSlider($.extend({}, settings, {loop: true})); }); } } diff --git a/resources/assets/js/custom/inline/dungeonroute/table.js b/resources/assets/js/custom/inline/dungeonroute/table.js index 7b602ddf3f..ddfcb1be05 100644 --- a/resources/assets/js/custom/inline/dungeonroute/table.js +++ b/resources/assets/js/custom/inline/dungeonroute/table.js @@ -194,7 +194,7 @@ class DungeonrouteTable extends InlineCode { let $deleteBtns = $('.dungeonroute-delete'); $deleteBtns.unbind('click').bind('click', self._promptDeleteDungeonRouteClicked); - self.carouselHandler.refreshCarousel(); + self.carouselHandler.refreshCarousel('', {autoWidth: false}); }); self._dt.on('click', 'tbody td.clickable', function (clickEvent) { diff --git a/resources/views/common/handlebars/thumbnailcarousel.blade.php b/resources/views/common/handlebars/thumbnailcarousel.blade.php index 3a22943c50..a4536caed3 100644 --- a/resources/views/common/handlebars/thumbnailcarousel.blade.php +++ b/resources/views/common/handlebars/thumbnailcarousel.blade.php @@ -11,7 +11,6 @@ function handlebarsThumbnailCarouselParse(row) { if (row.has_thumbnail) { for (let index in row.dungeon.floors) { let floor = row.dungeon.floors[index]; - console.log(floor); if (floor.facade) { continue; } From ba745d7a2ce16b067bb119a6d848205bd2ee26b1 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Mon, 20 Nov 2023 22:25:21 +0100 Subject: [PATCH 15/22] #2116 Somehow autoWidth was never a solution. Now generating bigger thumbnails to make the site look better on discovery pages. --- app/Service/DungeonRoute/ThumbnailService.php | 2 +- .../inline/common/dungeonroute/handlers/carouselhandler.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Service/DungeonRoute/ThumbnailService.php b/app/Service/DungeonRoute/ThumbnailService.php index 6e00226ed4..506d3315fa 100644 --- a/app/Service/DungeonRoute/ThumbnailService.php +++ b/app/Service/DungeonRoute/ThumbnailService.php @@ -70,7 +70,7 @@ public function refreshThumbnail(DungeonRoute $dungeonRoute, int $floorIndex, in // Rescale it Log::channel('scheduler')->info(sprintf('Scaling and moving image from %s to %s', $tmpFile, $target)); - Image::make($tmpFile)->resize(288, 192)->save($target); + Image::make($tmpFile)->resize(384, 256)->save($target); Log::channel('scheduler')->info( sprintf('Check if %s exists: %s', $target, var_export(file_exists($target), true)) diff --git a/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js b/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js index 6b1c29f051..ea581067d9 100644 --- a/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js +++ b/resources/assets/js/custom/inline/common/dungeonroute/handlers/carouselhandler.js @@ -10,7 +10,7 @@ class CarouselHandler { $(function () { let baseSettings = { item: 1, - autoWidth: true, + autoWidth: false, // slideMove: 1, // slidemove will be 1 if loop is true slideMargin: 0, From 98cf7b4c5fb3050ac2576c91ec6ebdedb338b6f3 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Mon, 20 Nov 2023 21:25:55 +0000 Subject: [PATCH 16/22] Automated commit for mapping updates --- database/seeders/dungeondata/dungeons.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/seeders/dungeondata/dungeons.json b/database/seeders/dungeondata/dungeons.json index ace967e949..a0e4d7143a 100644 --- a/database/seeders/dungeondata/dungeons.json +++ b/database/seeders/dungeondata/dungeons.json @@ -2334,7 +2334,7 @@ "id": 64, "index": 5, "mdt_sub_level": null, - "ui_map_id": 1019, + "ui_map_id": 1029, "name": "dungeons.bfa.waycrest_manor.floors.the_rupture", "default": 0, "facade": 0, @@ -2350,7 +2350,7 @@ "active": 1, "floorcouplings": [ { - "id": 575, + "id": 903, "floor1_id": 64, "floor2_id": 63, "direction": "up" From 4d562b78eb497b258c2fa7c55df0772e064cc488 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Mon, 20 Nov 2023 23:36:18 +0100 Subject: [PATCH 17/22] #2130 Some performance improvements while waiting for tomorrow so I can release --- .../Ajax/AjaxDungeonRouteController.php | 6 ++- app/Models/DungeonRoute.php | 3 -- ...221552_update_indices_in_enemies_table.php | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2023_11_20_221552_update_indices_in_enemies_table.php diff --git a/app/Http/Controllers/Ajax/AjaxDungeonRouteController.php b/app/Http/Controllers/Ajax/AjaxDungeonRouteController.php index 289ed77f00..b3392623af 100644 --- a/app/Http/Controllers/Ajax/AjaxDungeonRouteController.php +++ b/app/Http/Controllers/Ajax/AjaxDungeonRouteController.php @@ -85,7 +85,8 @@ public function list(Request $request) // Which relationship should be load? $tagsRelationshipName = $teamPublicKey ? 'tagsteam' : 'tagspersonal'; - $routes = DungeonRoute::with(['dungeon', 'affixes', 'author', 'routeattributes', 'ratings', 'metricAggregations', $tagsRelationshipName]) + $routes = DungeonRoute::with(['faction', 'specializations', 'classes', 'races', 'dungeon', 'affixes', + 'author', 'routeattributes', 'ratings', 'metricAggregations', $tagsRelationshipName]) // Specific selection of dungeon columns; if we don't do it somehow the Affixes and Attributes of the result is cleared. // Probably selecting similar named columns leading Laravel to believe the relation is already satisfied. ->selectRaw('dungeon_routes.*, mapping_versions.enemy_forces_required_teeming, mapping_versions.enemy_forces_required, MAX(mapping_versions.id) as dungeon_latest_mapping_version_id') @@ -234,7 +235,8 @@ public function htmlsearch(APIDungeonRouteSearchFormRequest $request, ExpansionS $expansion = $expansionService->getCurrentExpansion(GameServerRegion::getUserOrDefaultRegion()); } - $query = DungeonRoute::with(['author', 'affixes', 'ratings', 'routeattributes', 'dungeon', 'dungeon.activeFloors', 'mappingVersion']) + $query = DungeonRoute::with(['faction', 'specializations', 'classes', 'races', 'author', 'affixes', + 'ratings', 'routeattributes', 'dungeon', 'dungeon.activeFloors', 'mappingVersion']) ->join('dungeons', 'dungeon_routes.dungeon_id', 'dungeons.id') ->join('mapping_versions', 'mapping_versions.dungeon_id', 'dungeons.id') ->when($expansion !== null, function (Builder $builder) use ($expansion) { diff --git a/app/Models/DungeonRoute.php b/app/Models/DungeonRoute.php index 26345814a3..6ecfccda9a 100644 --- a/app/Models/DungeonRoute.php +++ b/app/Models/DungeonRoute.php @@ -779,9 +779,6 @@ public function getEnemyForcesTooMuch(): int */ public function getSetupAttribute(): array { - // Temp test to fix a bug "Attempted to lazy load [faction] on model [App\Models\DungeonRoute] but lazy loading is disabled." - $this->load(['faction', 'specializations', 'classes', 'races']); - return [ 'faction' => $this->faction, 'specializations' => $this->specializations, diff --git a/database/migrations/2023_11_20_221552_update_indices_in_enemies_table.php b/database/migrations/2023_11_20_221552_update_indices_in_enemies_table.php new file mode 100644 index 0000000000..185fce8e15 --- /dev/null +++ b/database/migrations/2023_11_20_221552_update_indices_in_enemies_table.php @@ -0,0 +1,40 @@ +dropIndex(['floor_id', 'mapping_version_id']); + + $table->index(['floor_id']); + $table->index(['mapping_version_id']); + $table->index(['mapping_version_id', 'floor_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('enemies', function (Blueprint $table) { + $table->index(['floor_id', 'mapping_version_id']); + + $table->dropIndex(['floor_id']); + $table->dropIndex(['mapping_version_id']); + $table->dropIndex(['mapping_version_id', 'floor_id']); + }); + } +} From e15411a84494a291b127a40b022d6e63bbb84dfe Mon Sep 17 00:00:00 2001 From: Wotuu Date: Mon, 20 Nov 2023 22:36:57 +0000 Subject: [PATCH 18/22] Automated commit for mapping updates --- database/seeders/dungeondata/mapping_commit_logs.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/database/seeders/dungeondata/mapping_commit_logs.json b/database/seeders/dungeondata/mapping_commit_logs.json index 470c884092..b576ee9c06 100644 --- a/database/seeders/dungeondata/mapping_commit_logs.json +++ b/database/seeders/dungeondata/mapping_commit_logs.json @@ -2212,5 +2212,11 @@ "merged": 0, "created_at": "2023-11-20T13:01:07.000000Z", "updated_at": "2023-11-20T13:01:07.000000Z" + }, + { + "id": 370, + "merged": 0, + "created_at": "2023-11-20T21:30:36.000000Z", + "updated_at": "2023-11-20T21:30:36.000000Z" } ] \ No newline at end of file From ebac9a65eff1d98e9bb1a49211d9cd5da51e923f Mon Sep 17 00:00:00 2001 From: Wotuu Date: Tue, 21 Nov 2023 09:55:34 +0100 Subject: [PATCH 19/22] #2130 Re-added ->load in the getSetupAttribute() function, something in Telescope requires it but at least now the route loading stuff properly loads it now. --- app/Models/DungeonRoute.php | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/app/Models/DungeonRoute.php b/app/Models/DungeonRoute.php index 6ecfccda9a..8585d12d75 100644 --- a/app/Models/DungeonRoute.php +++ b/app/Models/DungeonRoute.php @@ -204,6 +204,22 @@ public function getRouteKeyName(): string return 'public_key'; } + /** + * @return array The setup as used in the front-end. + */ + public function getSetupAttribute(): array + { + // Telescope has an issue where somehow it doesn't have these relations loaded and causes crashes + $this->load(['faction', 'specializations', 'classes', 'races']); + + return [ + 'faction' => $this->faction, + 'specializations' => $this->specializations, + 'classes' => $this->classes, + 'races' => $this->races, + ]; + } + /** * @return string */ @@ -774,19 +790,6 @@ public function getEnemyForcesTooMuch(): int $this->enemy_forces - ($this->teeming ? $this->mappingVersion->enemy_forces_required_teeming : $this->mappingVersion->enemy_forces_required)); } - /** - * @return array The setup as used in the front-end. - */ - public function getSetupAttribute(): array - { - return [ - 'faction' => $this->faction, - 'specializations' => $this->specializations, - 'classes' => $this->classes, - 'races' => $this->races, - ]; - } - /** * @param User|null $user * From 8a0d7d49f98656644556fa3e0526eed42ab56fb4 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Tue, 21 Nov 2023 13:48:02 +0100 Subject: [PATCH 20/22] #2071 Saving a floor now uses proper Laravel form validation --- .../Controllers/Floor/FloorController.php | 35 ++++++------------- app/Http/Requests/Floor/FloorFormRequest.php | 14 ++++++-- .../Builders/DungeonRouteBuilder.php | 6 ++-- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app/Http/Controllers/Floor/FloorController.php b/app/Http/Controllers/Floor/FloorController.php index 9f0b9a165d..9bbcefafe0 100644 --- a/app/Http/Controllers/Floor/FloorController.php +++ b/app/Http/Controllers/Floor/FloorController.php @@ -32,38 +32,23 @@ class FloorController extends Controller * @return Floor * @throws Exception */ - public function store(Request $request, Dungeon $dungeon, Floor $floor = null) + public function store(FloorFormRequest $request, Dungeon $dungeon, Floor $floor = null) { $beforeFloor = $floor === null ? null : clone $floor; + $validated = $request->validated(); + if ($floor === null) { - $floor = new Floor(); - // May not be set when editing - $floor->dungeon_id = $dungeon->id; + $floor = Floor::create(array_merge([ + 'dungeon_id' => $dungeon->id + ], $validated)); + $success = $floor instanceof Floor; + } else { + $success = $floor->update($validated); } - $floor->index = $request->get('index'); - $floor->mdt_sub_level = $request->get('mdt_sub_level'); - $floor->ui_map_id = $request->get('ui_map_id'); - $floor->name = $request->get('name'); - $floor->default = $request->get('default', false); - $floor->facade = $request->get('facade', false); - $defaultMinEnemySize = config('keystoneguru.min_enemy_size_default'); - $floor->min_enemy_size = $request->get('min_enemy_size', $defaultMinEnemySize); - $floor->min_enemy_size = empty($floor->min_enemy_size) ? null : $floor->min_enemy_size; - - $defaultMaxEnemySize = config('keystoneguru.max_enemy_size_default'); - $floor->max_enemy_size = $request->get('max_enemy_size', $defaultMaxEnemySize); - $floor->max_enemy_size = empty($floor->max_enemy_size) ? null : $floor->max_enemy_size; - - $floor->enemy_engagement_max_range = $request->get('enemy_engagement_max_range') ?? 150; - $floor->enemy_engagement_max_range_patrols = $request->get('enemy_engagement_max_range_patrols') ?? 50; - - $floor->percentage_display_zoom = $request->get('percentage_display_zoom'); - $floor->active = $request->get('active') ?? 0; - // Update or insert it - if ($floor->save()) { + if ($success) { // Delete all directly connected floors $floor->floorcouplings()->delete(); diff --git a/app/Http/Requests/Floor/FloorFormRequest.php b/app/Http/Requests/Floor/FloorFormRequest.php index e54d522065..45895d6e93 100644 --- a/app/Http/Requests/Floor/FloorFormRequest.php +++ b/app/Http/Requests/Floor/FloorFormRequest.php @@ -24,8 +24,18 @@ public function authorize() public function rules() { return [ - 'name' => ['required'], - 'index' => ['required'], + 'active' => ['nullable', 'bool'], + 'default' => ['nullable', 'bool'], + 'facade' => ['nullable', 'bool'], + 'name' => ['required', 'string'], + 'index' => ['required', 'integer'], + 'mdt_sub_level' => ['nullable', 'integer'], + 'ui_map_id' => ['required', 'integer'], + 'min_enemy_size' => ['nullable', 'integer'], + 'max_enemy_size' => ['nullable', 'integer'], + 'enemy_engagement_max_range' => ['nullable', 'integer'], + 'enemy_engagement_max_range_patrols' => ['nullable', 'integer'], + 'percentage_display_zoom' => ['nullable', 'integer'], ]; } } diff --git a/app/Service/CombatLog/Builders/DungeonRouteBuilder.php b/app/Service/CombatLog/Builders/DungeonRouteBuilder.php index 54b09f37b1..ac267f5cde 100644 --- a/app/Service/CombatLog/Builders/DungeonRouteBuilder.php +++ b/app/Service/CombatLog/Builders/DungeonRouteBuilder.php @@ -302,7 +302,8 @@ protected function findUnkilledEnemyForNpcAtIngameLocation( ); // If the closest enemy was still pretty far away - check if there was a patrol that may have been closer - if ($closestEnemy->getDistanceBetweenEnemies() > $this->currentFloor->enemy_engagement_max_range_patrols) { + if ($closestEnemy->getDistanceBetweenEnemies() > + ($this->currentFloor->enemy_engagement_max_range_patrols ?? config('keystoneguru.enemy_engagement_max_range_patrols_default'))) { $this->findClosestEnemyAndDistanceFromList( $filteredEnemies, $activePullEnemy, @@ -318,7 +319,8 @@ protected function findUnkilledEnemyForNpcAtIngameLocation( $closestEnemy->getDistanceBetweenEnemies(), $closestEnemy->getDistanceBetweenLastPullAndEnemy() ); - } else if ($closestEnemy->getDistanceBetweenEnemies() > $this->currentFloor->enemy_engagement_max_range) { + } else if ($closestEnemy->getDistanceBetweenEnemies() > + ($this->currentFloor->enemy_engagement_max_range ?? config('keystoneguru.enemy_engagement_max_range_default'))) { if ($closestEnemy->getEnemy()->npc->classification_id >= App\Models\NpcClassification::ALL[App\Models\NpcClassification::NPC_CLASSIFICATION_BOSS]) { $this->log->findUnkilledEnemyForNpcAtIngameLocationEnemyIsBossIgnoringTooFarAwayCheck(); } else { From ed07a0fe79a161026e27fdebd12f60baf0e699c6 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Tue, 21 Nov 2023 14:24:00 +0100 Subject: [PATCH 21/22] #2130 Updated release v7.6 --- .../Controllers/Floor/FloorController.php | 8 +++---- database/seeders/releases/v7.6.json | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Floor/FloorController.php b/app/Http/Controllers/Floor/FloorController.php index 9bbcefafe0..96aaa2ff48 100644 --- a/app/Http/Controllers/Floor/FloorController.php +++ b/app/Http/Controllers/Floor/FloorController.php @@ -25,9 +25,9 @@ class FloorController extends Controller use ChangesMapping; /** - * @param Request $request - * @param Dungeon $dungeon - * @param Floor|null $floor + * @param FloorFormRequest $request + * @param Dungeon $dungeon + * @param Floor|null $floor * * @return Floor * @throws Exception @@ -40,7 +40,7 @@ public function store(FloorFormRequest $request, Dungeon $dungeon, Floor $floor if ($floor === null) { $floor = Floor::create(array_merge([ - 'dungeon_id' => $dungeon->id + 'dungeon_id' => $dungeon->id, ], $validated)); $success = $floor instanceof Floor; } else { diff --git a/database/seeders/releases/v7.6.json b/database/seeders/releases/v7.6.json index dfc92725bc..e4924d373d 100644 --- a/database/seeders/releases/v7.6.json +++ b/database/seeders/releases/v7.6.json @@ -12,6 +12,28 @@ "release_id": 215, "description": "You can toggle combined floors on through the settings on the pulls sidebar. For certain dungeons (currently only Black Rook Hold, Throne of the Tides and the Dawn of the Infinite) this will show all floors in a single map. You can toggle this behaviour off again through the same settings menu.", "changes": [ + { + "release_changelog_id": 222, + "release_changelog_category_id": 1, + "ticket_id": 2116, + "change": "Redesigned route discovery pages. Should fix issues with the layout when someone has put a long description for a route.", + "category": { + "id": 1, + "key": "general_changes", + "name": "releasechangelogcategories.general_changes" + } + }, + { + "release_changelog_id": 222, + "release_changelog_category_id": 1, + "ticket_id": 2132, + "change": "In the route discovery pages, various links for dungeons that are _not_ part of the current expansion, but _are_ part of the current season now show results as intended.", + "category": { + "id": 1, + "key": "general_changes", + "name": "releasechangelogcategories.general_changes" + } + }, { "release_changelog_id": 222, "release_changelog_category_id": 3, From 22b1b78414fbf730ec8e4edb25d6cf81a63edbe9 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Tue, 21 Nov 2023 14:28:21 +0100 Subject: [PATCH 22/22] #2130 If the app is down for maintenance we pause the generation of thumbnails. --- app/Service/DungeonRoute/ThumbnailService.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Service/DungeonRoute/ThumbnailService.php b/app/Service/DungeonRoute/ThumbnailService.php index 506d3315fa..c01cc81bf4 100644 --- a/app/Service/DungeonRoute/ThumbnailService.php +++ b/app/Service/DungeonRoute/ThumbnailService.php @@ -21,6 +21,12 @@ class ThumbnailService implements ThumbnailServiceInterface */ public function refreshThumbnail(DungeonRoute $dungeonRoute, int $floorIndex, int $attempts = 0): void { + if (app()->isDownForMaintenance()) { + Log::channel('scheduler')->info('Not generating thumbnail - app is down for maintenance'); + + return; + } + // 1. Headless chrome saves file in a temp location // 2. File is downsized to a smaller thumbnail (can't make the browser window smaller since that'd mess up the image) // 3. Moved to public folder