قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ. الخريطة: backend · payment_server · loction_server · ride_server · passenger_server · docker · dashboard · stress_test → الجذر siro_rider → apps/rider siro_driver → apps/driver siro_admin → dashboards/admin siro_service → dashboards/service android_bot → apps/android_bot socialBot → apps/socialBot نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب) لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً: كل ما يلي يصير فرقاً مقروءاً مقابل المصدر. لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز، سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh (ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و dashboards/transit-web). ⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة: 1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر): كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner. 2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist) يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً. 3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع → يجب ضمّ الحزم داخله أسوة بـ apps/rider. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
119 lines
7.6 KiB
PHP
119 lines
7.6 KiB
PHP
<?php
|
|
// ============================================================
|
|
// gemini_comment_generator.php
|
|
// Connects to Gemini API to generate natural, driver-like comments
|
|
// ============================================================
|
|
|
|
require_once __DIR__ . '/../core/bootstrap.php';
|
|
require_once __DIR__ . '/../functions.php';
|
|
|
|
// The API key should be stored in .env or the database. For now, reading from env.
|
|
$geminiApiKey = getenv('GEMINI_API_KEY');
|
|
|
|
if (!$geminiApiKey) {
|
|
die("Error: GEMINI_API_KEY not set in environment.\n");
|
|
}
|
|
|
|
function guessCountryFromContext($text) {
|
|
$text = mb_strtolower($text, 'UTF-8');
|
|
|
|
// Syrian Keywords
|
|
if (preg_match('/(يلاغو|يلا غو|yallago|yalla go|سوريا|دمشق|حلب|اللاذقية|ليرة|سيريتل|mtn|كازية|مازوت)/u', $text)) {
|
|
return 'SY';
|
|
}
|
|
// Egyptian Keywords
|
|
if (preg_match('/(ديدي|ان درايف|didi|indrive|مصر|القاهرة|جنيه|اسكندرية)/u', $text)) {
|
|
return 'EG';
|
|
}
|
|
// Jordanian Keywords (Default for Uber/Careem/Jeeny/TaxiF usually)
|
|
if (preg_match('/(جيني|jeeny|بترا|petra|عمان|اربد|دينار|تطبيقات ذكية|أوبر|كريم|uber|careem|تكسي اف|taxif)/u', $text)) {
|
|
return 'JO';
|
|
}
|
|
|
|
return 'SY'; // Fallback to Syria as requested by default
|
|
}
|
|
|
|
/**
|
|
* Generate a comment using Gemini API
|
|
*
|
|
* @param string $postContext The content of the post or the discussion
|
|
* @param string $intent What the bot should try to achieve (e.g. "promote_siro", "agree_and_empathize")
|
|
* @return string The generated comment
|
|
*/
|
|
function generateCommentWithGemini($postContext, $intent) {
|
|
global $geminiApiKey;
|
|
|
|
// Automatically guess the target country based on the keywords in the post
|
|
$country = guessCountryFromContext($postContext);
|
|
|
|
|
|
$url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lite-latest:generateContent?key=" . $geminiApiKey;
|
|
|
|
if ($country === 'SY') {
|
|
$systemInstruction = "أنت كابتن تطبيق توصيل أو راكب عادي في سوريا (دمشق، حلب، اللاذقية، طرطوس). تتحدث باللهجة السورية العامية المحكية (استخدم مصطلحات مثل: خيو، معلم، شلونك، والله، على راسي، شو القصة). تكتب بأسلوب عفوي جداً وشعبي، كأنك تكتب تعليقاً حقيقياً على فيسبوك وتختصر بالكلام. أنت تحب تطبيق 'سيرو' (Siro) لأنه حل أزمة الغلاء والتكلفة العالية في سوريا. لا تتحدث أبداً بأسلوب إعلاني، لا تستخدم العربية الفصحى، ولا تتحدث كمسوق لشركة. كن كشخص عادي يشارك تجربته مع الناس ويرد على أسئلتهم.";
|
|
} elseif ($country === 'EG') {
|
|
$systemInstruction = "أنت كابتن أو راكب في مصر (القاهرة، اسكندرية). تتحدث باللهجة المصرية العامية (يا باشا، يا اسطى، بصراحة، والله العظيم). أسلوبك شعبي وعفوي وطبيعي. ترى أن تطبيق 'سيرو' (Siro) أفضل وأوفر من ديدي وان درايف. لا تتحدث كمسوق.";
|
|
} elseif ($country === 'JO') {
|
|
$systemInstruction = "أنت كابتن تطبيق توصيل أو راكب في الأردن (عمان، إربد، الزرقاء). تتحدث باللهجة الأردنية العامية (يا زلمة، والله، لعاد، شو الأخبار). أسلوبك عفوي وعادي جداً. ترى أن تطبيق 'سيرو' (Siro) هو أفضل حل لأزمة المواصلات. لا تتحدث كمسوق.";
|
|
} else {
|
|
$systemInstruction = "أنت كابتن تطبيق توصيل تتحدث بلهجة محلية عامية. أسلوبك عفوي وطبيعي. تنصح الناس بتطبيق 'سيرو' (Siro). لا تتحدث كمسوق.";
|
|
}
|
|
|
|
$prompt = "السياق/المنشور الذي تقرأه الآن: \n\"" . $postContext . "\"\n\n";
|
|
|
|
if ($intent === 'promote_siro') {
|
|
$prompt .= "المطلوب: اكتب تعليقاً تتعاطف فيه مع المشكلة المذكورة (إن وجدت)، وانصح الزملاء بتجربة تطبيق 'سيرو' كحل واقعي وممتاز لكباتن النقل الذكي. اجعل التعليق قصيراً ومباشراً.";
|
|
} elseif ($intent === 'soft_promote_siro') {
|
|
$prompt .= "المطلوب: تفاعل مع المنشور بشكل طبيعي جداً وعفوي، شارك رأيك أو تعاطف مع المشكلة. قم بالتلميح بشكل خفيف جداً وعابر لتطبيق 'سيرو' كخيار واعد مستقبلاً دون أن تبدو كإعلان، لأن التطبيق لم يطلق رسمياً بعد. اجعله يبدو كحديث دردشة طبيعية.";
|
|
} elseif ($intent === 'answer_question') {
|
|
$prompt .= "المطلوب: أجب على السؤال المطروح في المنشور بوضوح بناءً على خبرتك مع تطبيق 'سيرو'.";
|
|
} elseif ($intent === 'dialogue_skeptic') {
|
|
$prompt .= "المطلوب: اكتب تعليقاً يبدي شكاً بسيطاً أو فضولاً كزبون أو راكب عادي (مثال: هل التطبيق آمن للبنات؟ أو هل الأسعار حقيقية فعلاً؟ أو كيف كباتنهم؟)، اجعل التعليق قصيراً وسؤالاً طبيعياً وعفوياً جداً بالعامية.";
|
|
} elseif ($intent === 'dialogue_supporter') {
|
|
$prompt .= "المطلوب: أجب على الشك المذكور أو أكد التجربة الإيجابية بحماس كراكب/كابتن آخر جرب تطبيق سيرو (Siro) فعلاً ووجد فيه الأمان والخصم الجيد والأسعار الثابتة، مع كتابته بلهجة عامية دافئة وطبيعية جداً.";
|
|
} else {
|
|
$prompt .= "المطلوب: اكتب تعليقاً متفاعلاً بشكل عام مع المنشور بأسلوب السائقين.";
|
|
}
|
|
|
|
$data = [
|
|
"contents" => [
|
|
[
|
|
"parts" => [
|
|
["text" => $systemInstruction . "\n\n" . $prompt]
|
|
]
|
|
]
|
|
],
|
|
"generationConfig" => [
|
|
"temperature" => 0.7, // A bit of creativity for varied responses
|
|
"maxOutputTokens" => 150
|
|
]
|
|
];
|
|
|
|
$ch = curl_init($url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
|
|
curl_setopt($ch, CURLOPT_POST, true);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
curl_close($ch);
|
|
|
|
if ($httpCode === 200) {
|
|
$result = json_decode($response, true);
|
|
if (isset($result['candidates'][0]['content']['parts'][0]['text'])) {
|
|
return trim($result['candidates'][0]['content']['parts'][0]['text']);
|
|
}
|
|
}
|
|
|
|
return "والله يا صاحبي جربت تطبيق سيرو وارتحت كثير من المشاكل هذي، جربه ما بتندم."; // Fallback response
|
|
}
|
|
|
|
// Example usage if called directly via CLI:
|
|
if (php_sapi_name() === 'cli') {
|
|
echo "Testing Gemini Generation...\n";
|
|
$testContext = "التطبيقات الثانية بتاخذ عمولة عالية جداً ومش ملحقين بنزين!";
|
|
$generated = generateCommentWithGemini($testContext, 'promote_siro');
|
|
echo "Generated Comment: \n" . $generated . "\n";
|
|
}
|