قرار المالك 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>
68 lines
2.4 KiB
PHP
68 lines
2.4 KiB
PHP
<?php
|
|
// ============================================================
|
|
// account_manager.php
|
|
// Handles rotation and selection of social media accounts
|
|
// ============================================================
|
|
|
|
require_once __DIR__ . '/../core/bootstrap.php';
|
|
|
|
class AccountManager {
|
|
private $con;
|
|
|
|
public function __construct() {
|
|
$this->con = Database::get('main');
|
|
}
|
|
|
|
/**
|
|
* Get an available account for a specific platform that hasn't been used too recently.
|
|
*
|
|
* @param string $platform 'facebook' or 'instagram'
|
|
* @param int $cooldownMinutes Minimum minutes since last active
|
|
* @return array|null Account details or null if none available
|
|
*/
|
|
public function getAvailableAccount($platform, $cooldownMinutes = 30) {
|
|
// Select an active account that was last active more than X minutes ago,
|
|
// or has never been active (last_active is NULL).
|
|
// Order by last_active ascending to rotate through them (least recently used first).
|
|
|
|
$stmt = $this->con->prepare("
|
|
SELECT id, username, total_posts, total_comments, proxy_ip, proxy_port, proxy_username, proxy_password
|
|
FROM social_accounts
|
|
WHERE platform = ?
|
|
AND status = 'active'
|
|
AND (last_active IS NULL OR last_active <= DATE_SUB(NOW(), INTERVAL ? MINUTE))
|
|
ORDER BY last_active ASC, id ASC
|
|
LIMIT 1
|
|
");
|
|
|
|
$stmt->execute([$platform, $cooldownMinutes]);
|
|
return $stmt->fetch(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
/**
|
|
* Update the last active timestamp for an account
|
|
*/
|
|
public function markAccountActive($accountId) {
|
|
$stmt = $this->con->prepare("UPDATE social_accounts SET last_active = NOW() WHERE id = ?");
|
|
$stmt->execute([$accountId]);
|
|
}
|
|
|
|
/**
|
|
* Increment comment count
|
|
*/
|
|
public function incrementCommentCount($accountId) {
|
|
$stmt = $this->con->prepare("UPDATE social_accounts SET total_comments = total_comments + 1, last_active = NOW() WHERE id = ?");
|
|
$stmt->execute([$accountId]);
|
|
}
|
|
|
|
/**
|
|
* Mark an account as restricted or banned
|
|
*/
|
|
public function markAccountStatus($accountId, $status) {
|
|
if (!in_array($status, ['active', 'restricted', 'banned'])) return false;
|
|
|
|
$stmt = $this->con->prepare("UPDATE social_accounts SET status = ? WHERE id = ?");
|
|
return $stmt->execute([$status, $accountId]);
|
|
}
|
|
}
|