diff --git a/app/Filament/Pages/Dashboard.php b/app/Filament/Pages/Dashboard.php index b973e631c..620a8745a 100644 --- a/app/Filament/Pages/Dashboard.php +++ b/app/Filament/Pages/Dashboard.php @@ -37,10 +37,18 @@ public function getHeaderWidgets(): array public function queueSpeedtest(GeneralSettings $settings) { + $ookla_server_id = null; + + if (! blank($settings->speedtest_server)) { + $item = array_rand($settings->speedtest_server); + + $ookla_server_id = $settings->speedtest_server[$item]; + } + $speedtest = [ 'enabled' => ! blank($settings->speedtest_schedule), 'schedule' => optional($settings)->speedtest_schedule, - 'ookla_server_id' => optional($settings)->speedtest_server, + 'ookla_server_id' => $ookla_server_id, ]; ExecSpeedtest::dispatch(speedtest: $speedtest, scheduled: false); diff --git a/app/Filament/Pages/Settings/GeneralPage.php b/app/Filament/Pages/Settings/GeneralPage.php index fea5b3a5e..92b273e08 100644 --- a/app/Filament/Pages/Settings/GeneralPage.php +++ b/app/Filament/Pages/Settings/GeneralPage.php @@ -10,6 +10,7 @@ use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; use Filament\Pages\SettingsPage; +use Illuminate\Support\Facades\Http; use Squire\Models\Timezone; class GeneralPage extends SettingsPage @@ -66,10 +67,28 @@ protected function getFormSchema(): array ->helperText('Leave empty to disable the schedule. You can also use the cron expression generator [HERE](https://crontab.cronhub.io/) to help you make schedules.') ->nullable() ->columnSpan(1), - TextInput::make('speedtest_server') + Select::make('speedtest_server') + ->label('Speedtest server ID') ->helperText('Leave empty to let the system pick the best server.') ->nullable() - ->columnSpan(1), + ->multiple() + ->maxItems(10) + ->searchable() + ->getSearchResultsUsing(function (string $search) { + $url = "https://www.speedtest.net/api/js/servers?engine=js&search={$search}&https_functional=true&limit=10"; + + $response = Http::get($url); + + $options = $response->collect()->map(function ($item) { + return [ + 'id' => $item['id'], + 'name' => $item['id'].': '.$item['name'].' ('.$item['sponsor'].')', + ]; + }); + + return $options->pluck('name', 'id'); + }) + ->columnSpan(2), ]) ->compact() ->columns([ diff --git a/app/Jobs/SearchForSpeedtests.php b/app/Jobs/SearchForSpeedtests.php index eccbf2757..e35f417f3 100644 --- a/app/Jobs/SearchForSpeedtests.php +++ b/app/Jobs/SearchForSpeedtests.php @@ -21,10 +21,18 @@ class SearchForSpeedtests implements ShouldQueue */ public function handle(GeneralSettings $settings) { + $ookla_server_id = null; + + if (! blank($settings->speedtest_server)) { + $item = array_rand($settings->speedtest_server); + + $ookla_server_id = $settings->speedtest_server[$item]; + } + $speedtest = [ 'enabled' => ! blank($settings->speedtest_schedule), 'schedule' => optional($settings)->speedtest_schedule, - 'ookla_server_id' => optional($settings)->speedtest_server, + 'ookla_server_id' => $ookla_server_id, ]; if ($speedtest['enabled']) { diff --git a/app/Settings/GeneralSettings.php b/app/Settings/GeneralSettings.php index 7991c49c2..ee48bc82b 100644 --- a/app/Settings/GeneralSettings.php +++ b/app/Settings/GeneralSettings.php @@ -10,7 +10,8 @@ class GeneralSettings extends Settings public ?string $speedtest_schedule; - public ?string $speedtest_server; + /** @var string[] */ + public $speedtest_server; public string $site_name; diff --git a/database/migrations/2022_12_16_164913_transform_speedtest_server_id.php b/database/migrations/2022_12_16_164913_transform_speedtest_server_id.php new file mode 100644 index 000000000..58059f8ca --- /dev/null +++ b/database/migrations/2022_12_16_164913_transform_speedtest_server_id.php @@ -0,0 +1,20 @@ +speedtest_server = [$settings->speedtest_server]; + $settings->save(); + } +};