argument('mode'); $groupName = $this->argument('group'); $firstArticle = (int) $this->argument('first'); $lastArticle = (int) $this->argument('last'); if (! \in_array($mode, ['binaries', 'backfill'], true)) { $this->error('Mode must be either "binaries" or "backfill".'); return self::FAILURE; } try { $nntp = $this->getNntp(); $groupMySQL = UsenetGroup::getByName($groupName)->toArray(); if ($groupMySQL === null) { $this->error("Group not found: {$groupName}"); return self::FAILURE; } if (NNTPService::isError($nntp->selectGroup($groupMySQL['name'])) && NNTPService::isError($nntp->dataError($nntp, $groupMySQL['name']))) { return self::FAILURE; } $binaries = new BinariesService; $binaries->setNntp($nntp); $return = $binaries->scan( $groupMySQL, $firstArticle, $lastArticle, ((int) Settings::settingValue('safepartrepair') === 1 ? 'update' : 'backfill') ); if (empty($return)) { return self::SUCCESS; } $this->updateGroupRecords($mode, $groupMySQL, $return); return self::SUCCESS; } catch (\Throwable $e) { Log::error($e->getTraceAsString()); $this->error($e->getMessage()); return self::FAILURE; } } /** * Update group records based on mode. */ private function updateGroupRecords(string $mode, array $groupMySQL, array $return): void { $columns = []; switch ($mode) { case 'binaries': if ($return['lastArticleNumber'] <= $groupMySQL['last_record']) { return; } $unixTime = is_numeric($return['lastArticleDate']) ? $return['lastArticleDate'] : strtotime($return['lastArticleDate']); $columns[1] = sprintf('last_record_postdate = FROM_UNIXTIME(%s)', $unixTime); $columns[2] = sprintf('last_record = %s', $return['lastArticleNumber']); $query = sprintf( 'UPDATE usenet_groups SET %s, %s, last_updated = NOW() WHERE id = %d AND last_record < %s', $columns[1], $columns[2], $groupMySQL['id'], $return['lastArticleNumber'] ); break; case 'backfill': if ($return['firstArticleNumber'] >= $groupMySQL['first_record']) { return; } $unixTime = is_numeric($return['firstArticleDate']) ? $return['firstArticleDate'] : strtotime($return['firstArticleDate']); $columns[1] = sprintf('first_record_postdate = FROM_UNIXTIME(%s)', $unixTime); $columns[2] = sprintf('first_record = %s', $return['firstArticleNumber']); $query = sprintf( 'UPDATE usenet_groups SET %s, %s, last_updated = NOW() WHERE id = %d AND first_record > %s', $columns[1], $columns[2], $groupMySQL['id'], $return['firstArticleNumber'] ); break; default: return; } DB::update($query); } /** * Get NNTP connection. */ private function getNntp(): NNTPService { $nntp = new NNTPService; $connectResult = config('nntmux_nntp.use_alternate_nntp_server') === true ? $nntp->doConnect(false, true) : $nntp->doConnect(); if ($connectResult !== true) { $errorMessage = 'Unable to connect to usenet.'; if (NNTPService::isError($connectResult)) { $errorMessage .= ' Error: '.$connectResult->getMessage(); } throw new \Exception($errorMessage); } return $nntp; } }