5 * MINUTE_IN_SECONDS, 'display' => wpai_tg_translate('Every 5 Minutes'), ]; $schedules['fifteen_minutes'] = [ 'interval' => 15 * MINUTE_IN_SECONDS, 'display' => wpai_tg_translate('Every 15 Minutes'), ]; $schedules['ten_minutes'] = [ 'interval' => 10 * MINUTE_IN_SECONDS, 'display' => wpai_tg_translate('Every 10 Minutes'), ]; return $schedules; } } ?> api_key = get_option('wpai_tg_openai_key', ''); } public function generate_text($prompt, $model = 'gpt-3.5-turbo', $temperature = 0.7) { if (empty($this->api_key)) { return ['success' => false, 'error' => wpai_tg_translate('No API key provided')]; } $response = wp_remote_post('https://api.openai.com/v1/completions', [ 'headers' => [ 'Authorization' => 'Bearer ' . $this->api_key, 'Content-Type' => 'application/json', ], 'body' => wp_json_encode([ 'model' => $model, 'prompt' => $prompt, 'max_tokens' => 150, 'temperature' => $temperature, ]), 'timeout' => 30, ]); if (is_wp_error($response)) { return ['success' => false, 'error' => $response->get_error_message()]; } $body = json_decode(wp_remote_retrieve_body($response), true); return isset($body['choices'][0]['text']) ? ['success' => true, 'result' => $body['choices'][0]['text']] : ['success' => false, 'error' => 'No text generated']; } public function build_prompt($post_data, $campaign) { $template = $campaign['template_id'] ? get_option('wpai_tg_template_' . $campaign['template_id'], '') : ''; if (empty($template)) { $template = "{{title}} — {{price}}{{currency}}\n{{shortdesc}}\n{{#promo_code}}Використай промокод: {{promo_code}} — {{discount}}!{{/promo_code}}\n👉 Замовити: {{url}}\n#Акція #Товари"; } $prompt = "Ти — копірайтер. Створи короткий продаючий текст для Telegram-поста (2–4 речення) на тему {{tone_vertical}}. Мета: викликати інтерес, м’яко мотивувати до переходу за посиланням. Тон: {{tone_style}}, без вульгарності. Додай CTA в кінці. Мова: українська. Дані: Назва: {{title}}, Категорія: {{category}}, Опис: {{shortdesc}}, Ціна: {{price}}{{currency}}, Промокод: {{promo_code}} (згадай ненав’язливо, якщо є). Заборонено: груба лексика, медичні обіцянки. Поверни лише текст без пояснень."; $replacements = [ '{{tone_vertical}}' => $campaign['tone_vertical'] ?: 'загальна', '{{tone_style}}' => $campaign['tone_style'], '{{title}}' => $post_data['title'], '{{category}}' => $post_data['category'], '{{shortdesc}}' => $post_data['shortdesc'], '{{price}}' => $post_data['price'], '{{currency}}' => $post_data['currency'], '{{promo_code}}' => $post_data['promo_code'] ?? '', ]; return str_replace(array_keys($replacements), array_values($replacements), $prompt); } } ?> prefix . 'ai_tg_promocodes'; $now = current_time('mysql'); $order = $mode === 'random' ? 'RAND()' : 'used_count ASC, created_at ASC'; $query = $wpdb->prepare( "SELECT * FROM $table WHERE is_active = 1 AND (valid_to IS NULL OR valid_to > %s) AND (usage_limit IS NULL OR used_count < usage_limit) AND (campaign_id = %d OR campaign_id IS NULL) ORDER BY $order LIMIT 1", $now, $campaign_id ); $promo = $wpdb->get_row($query); if ($promo) { $wpdb->update($table, ['used_count' => $promo->used_count + 1], ['id' => $promo->id]); return ['code' => $promo->code, 'discount_text' => $promo->discount_text]; } return null; } } ?>