'running', /* translators: 1: current article number, 2: total articles. */ 'stage' => sprintf( __( 'Generating article %1$d of %2$d…', 'prautoblogger' ), $done + 1, $total ), 'started' => is_array( $current ) ? ( $current['started'] ?? time() ) : time(), 'last_updated' => time(), ), self::TTL ); } /** * Write the final "complete" status. * * @param array $r Result counters (generated/published/rejected/cost). * @return void */ public static function write_final( array $r ): void { set_transient( self::KEY, array( 'status' => 'complete', 'generated' => $r['generated'], 'published' => $r['published'], 'rejected' => $r['rejected'], 'cost' => $r['cost'], ), self::TTL ); } /** * Log the pipeline summary line. * * @param array $r Result counters (generated/published/rejected/cost). * @return void */ public static function log_summary( array $r ): void { PRAutoBlogger_Logger::instance()->info( sprintf( 'Pipeline complete: %d generated, %d published, %d rejected. Cost: $%.4f', $r['generated'], $r['published'], $r['rejected'], $r['cost'] ), 'pipeline' ); } /** * Write an initial "running" status before the first tick fires. * Mirrors the shape on_ajax_generate_now() already writes so the poller * sees a consistent "running" state whether triggered from board or settings page. * * @return void */ public static function write_initial(): void { set_transient( self::KEY, array( 'status' => 'running', 'stage' => __( 'Starting generation…', 'prautoblogger' ), 'started' => time(), 'last_updated' => time(), ), self::TTL ); } /** * Write a terminal "error" status. * * @param string $message Operator-facing error description. * @return void */ public static function write_error( string $message ): void { set_transient( self::KEY, array( 'status' => 'error', 'message' => $message, ), self::TTL ); } }