guard('cf7stg_save'); if (!Settings::is_bot_token_constant()) { $token = (string)($_POST['bot_token'] ?? ''); if ($token !== '') Settings::set_bot_token($token); } if (!Settings::is_chat_id_constant()) { Settings::set_chat_id(sanitize_text_field((string)($_POST['chat_id'] ?? ''))); } Settings::set_site_title(sanitize_text_field((string)($_POST['site_title'] ?? ''))); $this->redirect_back(['saved' => 1]); } public function handle_test(): void { $this->guard('cf7stg_test'); try { TelegramClient::send_message( Settings::get_chat_id(), '✅ Тестовое сообщение из плагина CF7 Spam → Telegram (' . esc_html(Settings::get_site_title()) . ')' ); Settings::set_last_test(['ok' => true, 'at' => current_time('mysql'), 'err' => '']); $this->redirect_back(['test' => 'ok']); } catch (TelegramException $e) { Settings::set_last_test(['ok' => false, 'at' => current_time('mysql'), 'err' => $e->getMessage()]); $this->redirect_back(['test' => 'err']); } } public function handle_retro(): void { $this->guard('cf7stg_retro'); $count = max(1, min(RetroImporter::MAX_COUNT, (int)($_POST['retro_count'] ?? 10))); $days = max(0, (int)($_POST['retro_days'] ?? 0)); $repeat = !empty($_POST['retro_repeat']); $result = RetroImporter::import($count, $days, $repeat); $this->redirect_back(['retro_added' => (int)$result['added'], 'retro_skipped' => (int)$result['skipped']]); } public function handle_retry_failed(): void { $this->guard('cf7stg_retry_failed'); $n = Queue::retry_all_failed(); $this->redirect_back(['retried' => $n]); } public function handle_purge_sent(): void { $this->guard('cf7stg_purge_sent'); $n = Queue::purge_sent(); $this->redirect_back(['purged' => $n]); } public function handle_save_drop(): void { $this->guard('cf7stg_save_drop'); Settings::set_dry_run_drop(!empty($_POST['dry_run_drop'])); Settings::set_hard_drop_enabled(!empty($_POST['hard_drop_enabled'])); $threshold = (int)($_POST['drop_score_threshold'] ?? -5); Settings::set_drop_score_threshold($threshold); $this->redirect_back(['drop_saved' => 1]); } public function handle_reset_drop_counters(): void { $this->guard('cf7stg_reset_drop_counters'); Settings::reset_drop_counters(); $this->redirect_back(['drop_reset' => 1]); } private function guard(string $action): void { if (!current_user_can('manage_options')) wp_die('forbidden'); check_admin_referer($action, self::NONCE); } private function redirect_back(array $extra = []): void { $url = add_query_arg(array_merge(['page' => self::PAGE_SLUG], $extra), admin_url('options-general.php')); wp_safe_redirect($url); exit; } }