Files
cf7-spam-to-telegram/admin/class-settings-page.php
T

127 lines
4.4 KiB
PHP

<?php
declare(strict_types=1);
namespace Cf7stg;
final class Settings_Page
{
private const PAGE_SLUG = 'cf7stg-settings';
private const NONCE = 'cf7stg_settings_nonce';
public function register(): void
{
add_action('admin_menu', [$this, 'add_menu']);
add_action('admin_post_cf7stg_save', [$this, 'handle_save']);
add_action('admin_post_cf7stg_test', [$this, 'handle_test']);
add_action('admin_post_cf7stg_retro', [$this, 'handle_retro']);
add_action('admin_post_cf7stg_retry_failed', [$this, 'handle_retry_failed']);
add_action('admin_post_cf7stg_purge_sent', [$this, 'handle_purge_sent']);
add_action('admin_post_cf7stg_save_drop', [$this, 'handle_save_drop']);
add_action('admin_post_cf7stg_reset_drop_counters', [$this, 'handle_reset_drop_counters']);
}
public function add_menu(): void
{
add_options_page(
'CF7 Spam → Telegram',
'CF7 Spam → TG',
'manage_options',
self::PAGE_SLUG,
[$this, 'render']
);
}
public function render(): void
{
if (!current_user_can('manage_options')) return;
$page_slug = self::PAGE_SLUG;
$nonce = self::NONCE;
include CF7STG_PLUGIN_DIR . 'admin/views/settings.php';
}
public function handle_save(): void
{
$this->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;
}
}