انتقل إلى الدليل

الوثائق 9.6.24

تكامل الخادم

استدعِ exports من كود خادم موثوق فقط. لا يختار العميل استثناءاته أو صلاحياته أو مكافآته.

مثال للقراءة فقط#

يفحص المثال حالة المسؤول ولا يمنح صلاحية. تحقق من export وتنسيق المعرف في الحزمة المثبتة.

local playerId = 12
local isAdmin = exports['tosun-ac']:isAdmin(playerId)

تحقق قبل الاستثناء#

تحقق من الجلسة واللاعب والموقع والصلاحيات والمدة على الخادم. لا تعرض استثناءات عبر RegisterNetEvent دون تحقق. اتبع دليل أمان Cfx.

اقرأ دليل Cfx الرسمي

إشعار النقل#

يجب على كل سكربت خادم ينقل لاعبًا (منزل، مرآب، سجن، مستشفى، وظيفة) استدعاء MarkTeleport قبل النقل مباشرة. لا يحتاج إلى قائمة ثقة ويخفف فحوص الحركة والظهور لفترة قصيرة فقط؛ تبقى حماية الأسلحة والأموال والحقن مفعلة. عندما ترسل كل سكربتات النقل هذا الإشعار يمكنك رفع عقوبة النقل v16 إلى الطرد من إعدادات مكافحة الغش.

exports['tosun-ac']:MarkTeleport(source, 8000)
SetEntityCoords(GetPlayerPed(source), x, y, z)

الموارد الموثوقة#

عمليات التصدير التي تعفي اللاعبين أو تمنح الصلاحيات أو تنفذ إجراءات جماعية (SetExempt وaddAdmin وwhitelistPlayer وغيرها) تقبل الموارد الموثوقة فقط. يُطبع الاستدعاء المرفوض مرة واحدة في وحدة التحكم مع السطر الذي يجب إضافته. احفظ القائمة في server.cfg حتى لا تستبدلها تحديثات مكافحة الغش. يعرض أمر وحدة التحكم tosunac_integration القائمة الموثوقة وآخر الاستدعاءات المرفوضة.

set tosun_ac_trusted_resources "my-housing,my-clothing"

الأسلحة الممنوحة خارج المخزون#

يجب على السكربتات التي تمنح أسلحة دون إضافتها إلى المخزون، مثل الساحات والبينتبول والقوائم، استدعاء AllowWeapon عند منح السلاح. وإلا فسيسجله فحص الأسلحة والمخزون في 9.4.0 كسلاح تم إنشاؤه. مرّر اسم سلاح واحد أو علامة النجمة لكل الأسلحة؛ المدة القصوى ساعة واحدة. أضف أسلحة الإضافات التي لا يعرفها نظام مكافحة الغش إلى extraWeapons في الإعدادات.

exports['tosun-ac']:AllowWeapon(source, "WEAPON_PISTOL", 600000)

إبقاء الصلاحية على الخادم#

اعتمد TOSUN-AC-EXPORTS.md في الحزمة. الأسماء حساسة لحالة الأحرف. مدد الإعفاء بالمللي ثانية؛ AddWhitelist وWhitelistArea بالثواني. شغّل tosun-ac قبل السكربتات المعتمدة، وعالج توقفه دون تخطي الحماية بصمت. نجاح الاتصال لا يتحقق من قواعد عملك.

يحتاج SetExempt وAllowWeapon مورداً موثوقاً. أضف موارد مراجعة واحتفظ بالعناصر الحالية، وافحص الرفض عبر tosunac_integration. تعطيل enforcement وضع تدقيق تمر فيه الاتصالات مع التحذير؛ لا تتركه حلاً دائماً.

set tosun_ac_trusted_resources "my-clothing,my-arena"

# وحدة تحكم الخادم:
tosunac_integration

الإبلاغ قبل النقل مباشرة#

تحقق من اللاعب والوجهة المحددة على الخادم والصلاحية والنشاط ثم استدعِ MarkTeleport قبل الحركة. يجب أن يأتي src وdestination من عملية خادم موثقة، لا معطيات عميل حرة. المثال ليس حدث شبكة مستقلاً.

لا يحتاج قائمة ثقة. يخفف الحركة وفحوص الرؤية/godmode/الكاميرا المرتبطة مؤقتاً، وتبقى الأسلحة والأموال والأحداث والحقن محمية. بالإعدادات الافتراضية وللموارد خارج قائمة الثقة: 15 ثانية للاتصال و180 ثانية للاعب خلال عشر دقائق. التمديد يستهلك الميزانية؛ لا تستدعِ كل tick.

-- داخل عملية خادم تم التحقق منها:
local ok = exports["tosun-ac"]:MarkTeleport(src, 8000, "house_enter")
if ok then
    SetEntityCoords(GetPlayerPed(src), destination.x, destination.y, destination.z)
end

السماح بسلاح محدد#

في ساحة تمنح سلاحاً دون عنصر مخزون، تحقق من المباراة ثم استدعِ AllowWeapon من المورد الموثوق. اختر سلاحاً ومدة لازمة. يؤثر فقط على الملكية ومسار الضرر المرتبط، لا كامل AC.

الحد ساعة؛ تجنب النجمة دون الحاجة لكل الأسلحة. SetExempt إعفاء كامل موثوق حتى خمس دقائق. يتجاهل BypassDetection قيمة detectionKey ويعطي إعفاء كاملاً حتى دقيقة، وليس فحصاً محدداً.

لا تحتفظ بـsource المؤقت للاعب المنقطع لاستخدامه لاحقاً. تحقق من الجلسة عند الإجراء الحساس. المورد الموثوق يظل مسؤولاً عن التحقق من الصلاحية والهدف.

  • الإجراء المشروع يعمل وينتهي السماح بوقته.
  • العميل لا يختار لاعباً آخر أو مدة أو سلاحاً أو وجهة.
  • الاتصال غير الموثوق يعيد false وتحذيراً.
  • بعد إعادة التشغيل افحص الحالة والإجراءات العادية.
-- my-arena: مورد موثوق وجلسة متحقق منها
local allowed = exports["tosun-ac"]:AllowWeapon(src, "WEAPON_PISTOL", 60000)
-- امنح السلاح فقط ضمن عملية ساحة موثقة.

أنه الإعفاء المؤقت عبر API الخادم الصحيحة#

يأخذ SetExempt على الخادم src والمللي ثانية والسبب، وعلى العميل state والمللي ثانية والسبب. لا يمكن تبادل التوقيعين. إعفاء العميل لا يمنح سلطة على الخادم. في مسار خادم موثوق، يزيل SetPlayerExempt مع state false الإعفاء المؤقت للاعب. نسّق الأنشطة المتداخلة أولاً: الحالة على مستوى اللاعب وليست رمزاً مستقلاً لكل مورد. قد تنهي إزالتها إعفاء نشاط آخر. بالمقابل قد تبقي قائمة الموظفين أو اللوحة IsExemptFromPunish صحيحة. فضّل MarkTeleport أو AllowWeapon عندما يكفي النطاق الأضيق.

  1. أنهِ أو ألغ النشاط المصرح بلاعب حالي متحقق منه، وأزل الإعفاء عندما لا يعود مطلوباً.
  2. اختبر الإلغاء والانقطاع والانتهاء الطبيعي؛ لا تمدد الإعفاء الكامل باستمرار في حلقة خلفية.
  3. تحقق بلاعب عادي إن كانت الحماية الباقية من موظف أو قائمة اللوحة أو نشاط آخر.
-- Trusted server resource; src belongs to an authorised workflow.
-- Clear the temporary exemption when that workflow finishes or is cancelled.
local cleared = exports["tosun-ac"]:SetPlayerExempt(src, false, 0, "menu_finished")

استخدم المساعدات بسياسة نتيجة واضحة#

تضاف مساعدات الجسر إلى manifest موردك ولا تستبدل الصلاحيات. يفحص TosunAC.IsAvailable تشغيل AC وTosunAC.IsTrusted ثقة المستدعي. يعيد PlayerExempt قيمتي ok وmode: تعني full إعفاء كاملاً موثوقاً، وsoft تساهلاً محدوداً في الحركة والرؤية. النتيجة الصحيحة لا تعني حصانة كاملة. إن احتاج النشاط full فعلاً، حدّد كيفية إيقافه أو رفضه عندما يتوفر soft فقط، بدلاً من الاستمرار بصمت ضمن نطاق آخر. يزيل PlayerExemptOff الإعفاء الكامل المؤقت عبر API الخادم.

  1. حمّل مساعد الخادم قبل السكربت الذي يستخدم TosunAC مع الحفاظ على تبعيات manifest الأخرى.
  2. افحص ok وmode عند البدء وسجّل المورد والسبب والنتيجة غير السرية فقط.
  3. تعامل صراحة مع AC المتوقف أو الاستدعاء المرفوض؛ شخّص ترتيب البدء أو الثقة قبل التكرار.
-- Add these lines to your own resource manifest:
client_script "@tosun-ac/bridge/tosun_ac_client.lua"
server_script "@tosun-ac/bridge/tosun_ac_server.lua"

استخدم exports القراءة للتشخيص لا للحكم#

يعطي GetStatus ملخصاً صغيراً يتضمن framework المضبوط وعدد المتصلين، وليس تدقيقاً لكل التكاملات. يصف GetIntegrationStatus ثقة المورد المستدعي لا جميع السكربتات. يجيب IsMovementExempt وIsExemptFromPunish عن سؤالين مختلفين. اسم GetDetections تاريخي: يقرأ حظر اللاعب في ts_anticheat لا كل سجلات الكشف الحديثة. النتيجة الفارغة ليست شهادة بأن اللاعب نظيف. نفّذ استعلامات القاعدة أو اللاعبين الواسعة عند الحاجة لا كل tick. استخدم الكائن المرتجع لغرضه الموثق دون إضافة أسرار أو بيانات شخصية غير لازمة إلى خرج تصحيح عام.

  1. عند التشخيص سجّل المورد المستدعي وفحص الحالة أو الإعفاء المحدد الذي استُخدم.
  2. قارن نطاق مسار معروف المتوقع بنتيجته الفعلية قبل تغيير العقوبات.
  3. راجع TOSUN-AC-EXPORTS.md المثبت بعد التحديث، وخاصة الأسماء القديمة وترتيب معاملات الخادم والعميل.

اربط الحركة المؤجلة باتصال اللاعب وعمر الـ resource#

عندما يحتاج دخول المنزل إلى انتظار قصير، لا يكفي حفظ رقم source للاعب. قد يحصل اتصال جديد على الرقم نفسه بعد مغادرته. مقطع server.lua أدناه دالة محلية لمسار عمل على الخادم تم التصريح به مسبقاً، وليس حدث شبكة يمكن للعميل استدعاؤه. يجب أن تكون الوجهة موقعاً تحقق منه الخادم. يربط كائن Lua فريد داخل pending الحركة المؤجلة بهذا المسار. تُحذف الخانة عند قطع الاتصال، ولا ينفذ المؤقت شيئاً إن لم يجد الكائن نفسه. لا يتلقى اللاعب الجديد صاحب source القديم الحركة السابقة. تحقق من حق دخول المنزل قبل الاستدعاء.

يمسح المثال السجلات المعلّقة عند توقف tosun-ac أو إغلاق الـ resource الخاص بك. وبعد الانتظار يعيد فحص حالة الـ resource ووجود اللاعب وped. يلتقط pcall أخطاء استدعاء export، ولا تتحرك الشخصية إلا إذا أعاد MarkTeleport القيمة true. لا تمنح هذه الفحوص ملكية منزل أو دوراً وظيفياً أو إذناً للوجهة؛ يجب التحقق منها قبل الاستدعاء. يطلب الكود تسامحاً محدوداً للحركة فقط، ولا يزيل الإعفاءات الكاملة أو يغيّر أذونات سكربتات أخرى. اختبر المغادرة أثناء الانتظار وإيقاف AC والدخول الطبيعي كلّاً على حدة. لا تحتاج إلى حلقة دائمة أو مؤقت يفحص جميع اللاعبين؛ هناك انتظار واحد لمسار العمل الذي بدأته.

-- server.lua: call only from an already authorised server workflow.
-- destination is a server-validated location, never raw client input.
local pending = {}

local function scheduleValidatedMove(src, destination)
    src = tonumber(src)
    if not src or not GetPlayerName(src) then return false end
    if GetResourceState("tosun-ac") ~= "started" then return false end
    local ticket = {}
    local target = {x = destination.x, y = destination.y, z = destination.z}
    pending[src] = ticket
    SetTimeout(1500, function()
        if pending[src] ~= ticket then return end
        pending[src] = nil
        if not GetPlayerName(src) then return end
        if GetResourceState("tosun-ac") ~= "started" then return end
        local ped = GetPlayerPed(src)
        if not ped or ped == 0 then return end
        local called, allowed = pcall(function()
            return exports["tosun-ac"]:MarkTeleport(src, 8000, "house_delayed_entry")
        end)
        if called and allowed == true then
            SetEntityCoords(ped, target.x, target.y, target.z)
        end
    end)
    return true -- Scheduled, not yet moved.
end

AddEventHandler("playerDropped", function() pending[source] = nil end)
AddEventHandler("onResourceStop", function(name)
    if name == GetCurrentResourceName() or name == "tosun-ac" then
        pending = {}
    end
end)

افحص الثقة من داخل الـ resource الذي ينفذ التكامل#

بعد تعديل قائمة الثقة، ضع هذا التشخيص في الـ resource الذي سيجري الاستدعاء فعلياً. يعمل الأمر من وحدة تحكم الخادم فقط؛ تُتجاهل استدعاءات اللاعبين لأن src لا يساوي صفراً. شغّل my-resource-ac-check مرة واحدة. يعيد GetIntegrationStatus اسم الـ resource المستدعي وقيمتَي trusted وenforcing. ولذلك لا تثبت نتيجة true من resource آخر أن سكربت الملابس أو الساحة الخاص بك موثوق أيضاً. يوفر GetStatus ملخصاً صغيراً للتشغيل يشمل الإصدار والـ framework المحدد، وليس تقرير تدقيق لجميع التكاملات. اربط التشخيص دائماً بالجهة التي ستستدعي export.

حتى إذا نجح pcall، يجب أن تكون القيمة المعادة جدولاً. خطأ الاستدعاء ونتيجة false ملاحظتان مختلفتان؛ لا تقل إن الإعداد تحقق إذا تعذر استدعاء export. عند trusted=false وenforcing=true قارن اسم المستدعي بقائمة الثقة التي راجعتها. قد تعني enforcing=false وضع تدقيق، ولا تثبت أن جميع العمليات الحساسة مقيدة بأمان. يحتوي الخرج على اسم resource والإصدار وframework وقيمتَين منطقيتَين فقط، دون معرّفات لاعبين أو مفاتيح. لا تنفذه في كل tick. بعد التحديث اختبر المسار الطبيعي ومسارات الرفض المتوقعة بصورة مستقلة؛ فالتشخيص للقراءة فقط لا يضمن صلاحيات exports العقوبات.

-- Place in the integrating resource's server.lua.
RegisterCommand("my-resource-ac-check", function(src)
    if src ~= 0 then return end -- Server console only.
    if GetResourceState("tosun-ac") ~= "started" then
        print("[integration] tosun-ac is not started")
        return
    end
    local okTrust, trust = pcall(function()
        return exports["tosun-ac"]:GetIntegrationStatus()
    end)
    local okStatus, status = pcall(function()
        return exports["tosun-ac"]:GetStatus()
    end)
    if not okTrust or type(trust) ~= "table"
        or not okStatus or type(status) ~= "table" then
        print("[integration] status query failed")
        return
    end
    print(("[integration] resource=%s version=%s framework=%s trusted=%s enforcing=%s")
        :format(GetCurrentResourceName(), tostring(status.version),
            tostring(status.framework), tostring(trust.trusted), tostring(trust.enforcing)))
end, false)

تسجيل أحداث مخصصة مع تحقق الخادم#

استخدم RegisterSafeEvent في سكربت الخادم. يجب أن يبدأ اسم الحدث باسم المورد المستدعي. يجب أن يعيد المدقق true تماما بعد فحص اللاعب والمهمة والموقع والعناصر والصلاحيات من بيانات الخادم. مفتاح العميل ليس إذنا. استهلك المهمة المكتملة مرة واحدة لتجنب تكرار المكافأة.

استخدم تصدير العميل TriggerSafeServerEvent. تعني sent الإرسال فقط ولا تؤكد دفعة أو مكافأة. تنتظر queued_until_key مدة أقصاها 30 ثانية؛ وترفض قائمة الانتظار الممتلئة الطلبات الجديدة. لا تكرر الإجراءات المالية آليا. أعد التسجيل بعد إعادة تشغيل AC.

انقل وأزل معالجات RegisterNetEvent المباشرة القديمة. لا يستطيع Tosun AC إلغاء معالجات مورد آخر؛ إبقاء العملية القديمة يترك مسارا للتجاوز. سجل معالجات :safe الخاصة بـ ProtectedEvents على الخادم فقط باستخدام AddEventHandler.

-- my-job/server.lua: own server-owned job state and framework adapter.
local activeJobs = {}
local function registerActions()
    if GetResourceState("tosun-ac") ~= "started" then return end
    local ok, reason = exports["tosun-ac"]:RegisterSafeEvent("my-job:finish",
        function(src)
            local job = activeJobs[src]
            return job ~= nil and job.completed == true
            -- Also verify server-owned position, role and inventory as required.
        end,
        function(src)
            local job = activeJobs[src]
            if not job then return end
            activeJobs[src] = nil -- consume before any yielding reward operation
            -- Give the server-owned reward through your validated framework adapter.
        end, {rateLimit=5, windowMs=10000, maxArgs=0})
    if not ok then print("[my-job] SafeEvent: " .. tostring(reason)) end
end
AddEventHandler("onResourceStart", function(name)
    if name == GetCurrentResourceName() or name == "tosun-ac" then registerActions() end
end)
AddEventHandler("playerDropped", function() activeJobs[source] = nil end)

-- my-job/client.lua:
local sent, state = exports["tosun-ac"]:TriggerSafeServerEvent("my-job:finish")
-- Read state; implement a separate application acknowledgement if needed.

اضبط اسم المورد المستدعي بدقة#

أضف set tosun_ac_trusted_resources "my-housing,my-clothing" إلى server.cfg مع الحفاظ على الأسماء الأخرى التي راجعتها. استخدم اسم المورد/المجلد، لا اسم العرض أو اللاعب أو رتبة Discord. استخدم set وليس setr، وأبق ts.EnforceExportCallerWhitelist = true. الثقة تسمح بالـ exports الحساسة ولا تتحقق من ملكية المنزل أو المخزون أو الوظيفة أو الهدف. شغّل التشخيص داخل المورد الذي ينفذ العملية وتحقق من trusted=true وenforcing=true.

set tosun_ac_trusted_resources "my-housing,my-clothing"

# txAdmin server console:
tosunac_integration

-- In the invoking integration resource server script:
local status = exports["tosun-ac"]:GetIntegrationStatus()
print(status.resource, status.trusted, status.enforcing)

خمس قوائم لخمس مهام مختلفة#

قائمة الموارد الموثوقة تسمح باستدعاء exports الخادم الحساسة. قائمة اللاعبين البيضاء تحمي اللاعب. قائمة fake-trigger البيضاء تعطل فخاً واحداً ولا تمنح صلاحية للحدث الحقيقي. ts.ProtectedEvents طبقة النقل القديمة بالمفتاح؛ القيمة الافتراضية تتضمن test:event. baseline الموارد تسجل الملفات المراجعة لفحص سلامتها. إضافة إلى قائمة لا تضيف إلى غيرها. لا تضع كل أحداث framework المكتشفة في ProtectedEvents أو تحولها إلى فخاخ.

الفهرس الكامل لـ exports الخادم في الحزمة#

الأسماء وتعريفات الوسائط مولدة من جرد مصادر الخادم الفعلية لهذه الحزمة. هي مرجع وليست سكربتاً لتنفيذه بالترتيب. حافظ على حالة الأحرف وعلى جهة الخادم/العميل. يشمل أدوات التشخيص والمسح والنقل الداخلية كي لا تخلط اسماً مشابهاً بواجهة عمل آمنة. راجع العقد والنتيجة قبل تعديل البيانات؛ معرفة الاسم لا تعطي صلاحية.

-- tosun-ac / server
-- AddWhitelist(target, durationSec)
-- AllowWeapon(src, weapon, ms)
-- BanPlayerExt(playerId, reason)
-- BypassDetection(playerId, detectionKey, durationMs)
-- ClearArea(playerId, areaName)
-- ForensicLinksOf(license)
-- GetCloudThreatScore(src)
-- GetDetections(playerId, limit)
-- GetIntegrationStatus()
-- GetNearbyPlayers(playerId, radius)
-- GetPlayerInfo(playerId)
-- GetPlayerShieldData(src)
-- GetServerAuthorityStatus()
-- GetStatus()
-- IsExemptFromPunish(src)
-- IsInArea(playerId, areaName)
-- IsMovementExempt(src)
-- IsPlayerProtected(playerId)
-- IsWhitelisted(playerId)
-- KickPlayer(playerId, reason)
-- MarkTeleport(src, ms, reason)
-- NoteCloudViolation(src, reason, punishment)
-- OpenScanCache(sealed)
-- PauseAllDetections(durationMs)
-- PausePlayerDetections(playerId, durationMs)
-- RateLimit(src, key, max, windowMs)
-- RegisterSafeEvent(eventName, validator, handler, options)
-- RemoveWhitelist(target)
-- RequestShieldScreenshot(src)
-- ScanPolicyFingerprint(moduleFile, policy)
-- ScanResourceSnapshot(name, expected, callback)
-- SealScanCache(raw)
-- SetExempt(playerId, durationMs, reason)
-- SetPlayerExempt(playerId, state, durationMs, reason)
-- WhitelistArea(playerId, areaName, durationSec)
-- acV2Challenge(build, license, fp, version)
-- acV2Fingerprint()
-- acV2Integrity(raw)
-- acV2VerifyResponse(raw, build, license, fp, version, nonce, httpCode)
-- addAdmin(playerId)
-- addCheatSignature(pattern, signatureName, severity)
-- addSignatureEscrowSkip(resourceName, note)
-- addSignatureException(resourceName, filePath, signatureName, note)
-- applyTimeWithFramework(h, m)
-- applyWeatherWithFramework(weather)
-- approveResource(resourceName, approvedBy)
-- ban(playerId, reason)
-- batchDetection(playerName, license, steam, discord, ip, dtype, reason, punishment, banID, screenshot, configKey)
-- batchLog(message, playerId, playerName)
-- batchWebhook(url, payload)
-- blockResource(resourceName, reason)
-- centralHandshake()
-- centralPoll()
-- centralStatus()
-- checkIpReputation(ip)
-- cipherHasSession(src)
-- cipherIssueKey(src)
-- cipherVerify(src, payload, signature)
-- clearInventory(src)
-- crashGuardInspect(v)
-- crashGuardReject(src, p)
-- emergencyLockdown(reason)
-- fakeTriggerTrap(eventName, typ)
-- fakeTriggerWhitelist(eventName)
-- freezePlayer(src, freeze)
-- getAdminType(playerId)
-- getBanInfo(banID)
-- getBans(limit, offset)
-- getBaseline()
-- getBatchStats()
-- getCleanupStats()
-- getConfig(configType)
-- getInfectedFiles()
-- getOnlinePlayers()
-- getPlayerLocale(src)
-- getResources()
-- getRuntimeStats()
-- getSourceKey()
-- getStats()
-- getSuspicious()
-- giveWeapon(src, weapon, ammo)
-- healAll()
-- invalidateSignatureCache()
-- isAdmin(playerId)
-- isAdminMenuAllowed(playerId)
-- isPlayerFrozen(src)
-- isPlayerMuted(src)
-- isQuarantined(src)
-- isStaffPlayer(playerId)
-- issueEventKey(src)
-- licenseStatus()
-- lockdownStatus()
-- massFreeze(state)
-- mutePlayer(src, durationSec, reason, actor)
-- offlineBan(data, reason)
-- offlineBanByLicense(...)
-- phoneNotify(targetSrc, title, body, opts)
-- phoneNotifyAdmins(title, body, opts)
-- punish(playerId, reason, image, config, punish)
-- quarantine(src, reason, sec)
-- quarantineList()
-- refreshPanelPermissions()
-- refreshPanelWhitelist()
-- releaseQuarantine(src)
-- reloadSignatureExceptions()
-- reloadSignatureScanCaches()
-- removeAdmin(playerId)
-- removeSignatureEscrowSkip(idOrName)
-- removeSignatureException(id)
-- removeWhitelist(playerId)
-- reportInfection(resource, file, sigs, severity, callback)
-- rescanResources()
-- runCleanup()
-- scanAllResources()
-- scanSingleResource(name)
-- screenCapture(src, requestedBy)
-- setLockdown(state, reason)
-- setPlayerArmor(src, armor)
-- setPlayerHealth(src, hp)
-- setPlayerLocale(src, lang)
-- setSpeedLimit(kmh)
-- slayPlayer(src)
-- spectatePlayer(adminSrc, targetSrc)
-- stripWeapons(src)
-- translate(key, ...)
-- translateForPlayer(src, key, ...)
-- tsAutoSetup()
-- tsBackdoorScanStatus()
-- tsLicenseRecheck()
-- tsScanBackdoors(callback)
-- tsScanEvents()
-- tsSignatureScanStatus()
-- unban(banID)
-- unmutePlayer(src)
-- v6ScreenWatchLatest(serverId)
-- v6ScreenWatchPoll(rid)
-- v6ScreenWatchRequest(serverId, mode, requestedBy, panelUrl, forceBase64)
-- v9StreamHasSession(serverId)
-- warnPlayer(src, reason, actor)
-- webBridgeApplyInventory(src, action, itemName, count, slot)
-- webBridgeApplyMoney(src, moneyType, amount, action)
-- webBridgeFindByCitizen(cid)
-- webBridgeFindByLicense(license)
-- webBridgeGrantAdmin(src)
-- webBridgeRevokeAdmin(src)
-- whitelistPlayer(playerId, duration)

-- tosun-ac-guardian / server
-- guardianAlive()
-- guardianHold(reason,seconds)

-- tosun_render / server
-- GetStatus()

exports العميل والمهلة المحلية المحدودة#

SetExempt للعميل يأخذ الحالة والمللي ثانية والسبب، وللخادم يأخذ source اللاعب والمللي ثانية والسبب. PauseDetections للعميل يمنح نفس مهلة المظهر والحركة والكاميرا المحدودة وليس توقفاً شاملاً. الاستدعاءات المحلية تشترك في ميزانية تمديد240ثانية لكل عشر دقائق و32سبباً كحد أقصى. IsExempt(config) يحتاج مفتاح الفحص الدقيق؛ IsExempt() يخص الموظف المتحقق أو الإعفاء/الإيقاف الكامل الموثوق. فحوص الأسلحة والأحداث وinjection والمجهولة تبقى فعالة. عالج false ولا تكرر كل frame.

-- tosun-ac / client
-- GetExemptions()
-- IsExempt(config)
-- IsPlayerAdmin()
-- NativeGuardThreat()
-- NativeGuardToken()
-- PauseDetections(durationMs)
-- SetExempt(state, durationMs, reason)
-- SetSpawned(state)
-- ShieldCaptureForBan(callback)
-- ShieldFlushBanVideo(callback)
-- TriggerSafeServerEvent(eventName, ...)
-- getConfig()
-- getV12Tolerance(key, default)
-- incNetRequest()
-- incScreenshotEvent()
-- shieldHook(hookType, detailJson)

فهم الحالة الخاصة وقيم الإرجاع#

TosunAcState واجهة داخل مورد AC؛ تستخدم الموارد الأخرى exports الموثقة. setExempt وsetPause وsetMovement على الخادم تعيد boolean وتحد المدة بخمس دقائق. فشل الإشعار لا يسجل زيادة جديدة؛ الإلغاء أو التقليل يبقى محفوظاً حتى مع false. إعفاء كامل وإيقاف وحركة حالات مستقلة. setStaff يكتب مرآة توافق فقط ولا يمنح إدارة متحققة. isExemptFromBag/isPausedFromBag تقرآن التصاريح الخاصة المتحققة لا bags اللاعب القابلة للتعديل. نجاح الاستدعاء لا يثبت التسليم لكل العملاء أو إيقاف كل فحوص الخادم.

-- Internal AC server API; external resources use guarded exports.
-- TosunAcState.setExempt(id, active, ms) -> boolean
-- TosunAcState.setPause(id, ms) -> boolean
-- TosunAcState.setMovement(id, ms) -> boolean
-- TosunAcState.remaining(id, kind) -> remaining milliseconds
-- TosunAcState.setStaff(id, staff) -> compatibility mirror only
-- AddWhitelist(target, durationSec): seconds
-- WhitelistArea(playerId, areaName, durationSec): seconds
-- IsInArea: named record lookup, not a coordinate/permission check
-- WhitelistArea grants broad client relief, not one chosen detector.
-- BypassDetection: detectionKey is ignored; full exemption, <=60000ms
-- Client: IsExempt("ts.antiFreeCam") -> scoped camera grace
-- Client: IsExempt() -> verified staff/full/pause only

أسماء الأحداث ليست خطة صلاحيات#

هذا الفهرس المولد من المصدر يسرد أحداث بروتوكول AC الثابتة حسب جهة التسجيل. لا يحصر الأسماء المحسوبة أو جميع أحداث مواردك. لا تعِد إرسال أحداث المفتاح أو العقوبة أو الإعدادات أو القائمة الداخلية يدوياً. الاكتشاف يعرف الاسم والاتجاه، لا ملكية العنصر أو استحقاق المكافأة. استخدم RegisterSafeEvent المتحقق للعمليات الحساسة. حماية اللوحة وac_protected_events تغذي قواعد الفخاخ/honeypot لا validators؛ أبق EventScanner.autoProtect=false عند التثبيت.

-- tosun-ac/client/AddEventHandler
-- CEventShockingGunshotFired
-- baseevents:onPlayerDied
-- baseevents:onPlayerKilled
-- esx:onPlayerDeath
-- esx_ambulancejob:revive
-- esx_basicneeds:onRevive
-- gameEventTriggered
-- hospital:client:Revive
-- hospital:client:SetDeathState
-- hospital:client:SetLaststand
-- hospital:client:isDead
-- onClientResourceStart
-- onClientResourceStop
-- playerSpawned
-- qb-ambulancejob:client:RevivePlayer
-- qb-medical:client:OnDeath
-- qb-medical:client:OnRevive
-- tosun-ac:nui:pushToolState
-- tosun-ac:uploadTokenUpdated
-- ts_anticheat:adminStateChanged
-- ts_anticheat:adminStatus
-- ts_anticheat:bridge:capture
-- ts_anticheat:bridge:clearInventory
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bridge:giveWeapon
-- ts_anticheat:bridge:heal
-- ts_anticheat:bridge:mute
-- ts_anticheat:bridge:revive
-- ts_anticheat:bridge:setArmor
-- ts_anticheat:bridge:setHealth
-- ts_anticheat:bridge:slay
-- ts_anticheat:bridge:speedLimit
-- ts_anticheat:bridge:stripWeapons
-- ts_anticheat:bridge:teleport
-- ts_anticheat:bridge:time
-- ts_anticheat:bridge:warning
-- ts_anticheat:bridge:weather
-- ts_anticheat:checkTaze
-- ts_anticheat:cipher:assigned
-- ts_anticheat:cipher:request_refresh
-- ts_anticheat:clearDone
-- ts_anticheat:configUpdated
-- ts_anticheat:detectclient
-- ts_anticheat:internal:receiveKey
-- ts_anticheat:internal:trapsChanged
-- ts_anticheat:isAdmin
-- ts_anticheat:joinBundle
-- ts_anticheat:liveSSRequest
-- ts_anticheat:newDetection
-- ts_anticheat:openAdminMenu
-- ts_anticheat:openAdminMenuAuthorized
-- ts_anticheat:panelBroadcast
-- ts_anticheat:panelHeal
-- ts_anticheat:panelRevive
-- ts_anticheat:panelTime
-- ts_anticheat:panelWeather
-- ts_anticheat:promptOpenMenu
-- ts_anticheat:receiveKey
-- ts_anticheat:receiveLiveSS
-- ts_anticheat:receiveLiveVideo
-- ts_anticheat:receivePlayerCount
-- ts_anticheat:receiveScreenshot
-- ts_anticheat:requestCoords
-- ts_anticheat:resourceGuardSync
-- ts_anticheat:shield:requestScreenshot
-- ts_anticheat:shield:uploadConfig
-- ts_anticheat:startVideoLiveStream
-- ts_anticheat:startVideoLiveWeb
-- ts_anticheat:startVideoRecording
-- ts_anticheat:stopVideoLiveStream
-- ts_anticheat:stopVideoLiveWeb
-- ts_anticheat:stopVideoRecording
-- ts_anticheat:syncBanList
-- ts_anticheat:syncConfig
-- ts_anticheat:syncIdentifiers
-- ts_anticheat:syncLogs
-- ts_anticheat:syncPlayers
-- ts_anticheat:takeScreenshot
-- ts_anticheat:unbanDone
-- ts_anticheat:webPanelScreenshot

-- tosun-ac/client/RegisterNUICallback
-- Armour
-- DeleteAll
-- DeleteObjects
-- DeletePeds
-- DeleteVehicles
-- GetPlayerIdentifiers
-- Health
-- addLog
-- armourPlayer
-- banPlayer
-- bringAll
-- bringPlayer
-- cancelAnimation
-- clearNearbyObjects
-- clearNearbyPeds
-- clearNearbyVehicles
-- devtoolsdetected
-- exit
-- freezeAll
-- freezePlayerToggle
-- getBans
-- getLogs
-- getPlayerCount
-- getPlayers
-- giveWeaponPlayer
-- healAll
-- healPlayer
-- isInVehicle
-- kickPlayer
-- liveWatchStart
-- liveWatchStop
-- nuiDependencyMissing
-- nuiWatermark
-- repair
-- returnOCRResult
-- reviveAll
-- revivePlayer
-- screenshotPlayer
-- selfRevive
-- setHealthPlayer
-- setTime
-- setWeather
-- shield_devtools
-- shield_heartbeat
-- shield_heartbeat_fail
-- shield_screenshot
-- shield_tokens
-- shield_video_final
-- shield_video_segment
-- slayPlayer
-- spawnVehicle
-- spectatePlayer
-- stopSpectate
-- stripWeaponsPlayer
-- toggleESP
-- toggleFreecam
-- toggleGodmode
-- toggleInvisible
-- toggleNoclip
-- tosunRenderResult
-- tpToPlayer
-- unbanPlayer
-- verifyModel
-- videoLiveSegmentResult
-- videoRecordingResult
-- videoRecordingStartResult
-- warnPlayerNUI

-- tosun-ac/client/RegisterNetEvent
-- QBCore:Client:OnPlayerLoaded
-- QBCore:Client:OnPlayerUnload
-- esx:onPlayerDeath
-- esx:onPlayerLogout
-- esx:playerLoaded
-- esx_ambulancejob:revive
-- esx_basicneeds:onRevive
-- hospital:client:Revive
-- hospital:client:SetDeathState
-- hospital:client:SetLaststand
-- hospital:client:isDead
-- qb-ambulancejob:client:RevivePlayer
-- qb-medical:client:OnDeath
-- qb-medical:client:OnRevive
-- qbx_core:client:playerLoggedIn
-- qbx_multicharacter:client:chooseChar
-- ts_anticheat:adminStateChanged
-- ts_anticheat:adminStatus
-- ts_anticheat:bridge:capture
-- ts_anticheat:bridge:clearInventory
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bridge:giveWeapon
-- ts_anticheat:bridge:heal
-- ts_anticheat:bridge:mute
-- ts_anticheat:bridge:revive
-- ts_anticheat:bridge:setArmor
-- ts_anticheat:bridge:setHealth
-- ts_anticheat:bridge:slay
-- ts_anticheat:bridge:speedLimit
-- ts_anticheat:bridge:stripWeapons
-- ts_anticheat:bridge:teleport
-- ts_anticheat:bridge:time
-- ts_anticheat:bridge:warning
-- ts_anticheat:bridge:weather
-- ts_anticheat:checkTaze
-- ts_anticheat:cipher:assigned
-- ts_anticheat:cipher:request_refresh
-- ts_anticheat:clearDone
-- ts_anticheat:detectclient
-- ts_anticheat:isAdmin
-- ts_anticheat:joinBundle
-- ts_anticheat:liveSSRequest
-- ts_anticheat:newDetection
-- ts_anticheat:openAdminMenu
-- ts_anticheat:openAdminMenuAuthorized
-- ts_anticheat:panelBroadcast
-- ts_anticheat:panelHeal
-- ts_anticheat:panelRevive
-- ts_anticheat:panelTime
-- ts_anticheat:panelWeather
-- ts_anticheat:promptOpenMenu
-- ts_anticheat:receiveEventKey
-- ts_anticheat:receiveKey
-- ts_anticheat:receiveLiveSS
-- ts_anticheat:receiveLiveVideo
-- ts_anticheat:receivePlayerCount
-- ts_anticheat:receiveScreenshot
-- ts_anticheat:requestCoords
-- ts_anticheat:resourceGuardSync
-- ts_anticheat:shield:requestScreenshot
-- ts_anticheat:shield:uploadConfig
-- ts_anticheat:startVideoLiveStream
-- ts_anticheat:startVideoLiveWeb
-- ts_anticheat:startVideoRecording
-- ts_anticheat:stopVideoLiveStream
-- ts_anticheat:stopVideoLiveWeb
-- ts_anticheat:stopVideoRecording
-- ts_anticheat:syncBanList
-- ts_anticheat:syncConfig
-- ts_anticheat:syncIdentifiers
-- ts_anticheat:syncLogs
-- ts_anticheat:syncPlayers
-- ts_anticheat:takeScreenshot
-- ts_anticheat:unbanDone
-- ts_anticheat:uploadToken
-- ts_anticheat:webPanelScreenshot

-- tosun-ac/server/AddEventHandler
-- QBCore:Server:OnPlayerLoaded
-- QBCore:Server:PlayerLoaded
-- chatMessage
-- clearPedTasksEvent
-- entityControlEvent
-- entityCreated
-- entityCreating
-- esx:playerLoaded
-- eventTriggered
-- explosionEvent
-- fireEvent
-- giveWeaponEvent
-- onResourceStart
-- onResourceStop
-- onServerResourceStart
-- playerConnecting
-- playerDropped
-- playerJoining
-- ptFxEvent
-- qbx_core:server:playerLoaded
-- rconCommand
-- removeAllWeaponsEvent
-- removeWeaponEvent
-- requestControlEvent
-- respawnPlayerPedEvent
-- startProjectileEvent
-- tosun-ac:nuiPermissionRefreshed
-- tosun-ac:panel:characterReady
-- tosun-ac:server:detection
-- tosun-ac:server:logResourceActivity
-- tosun-ac:server:nuiWatermark
-- tosun-ac:server:signedDetection
-- tosun-ac:settingsReloaded
-- ts_anticheat:GetPlayerIdentifiers
-- ts_anticheat:addAdmin_internal
-- ts_anticheat:addLog
-- ts_anticheat:adminDelEntity
-- ts_anticheat:banCommitted
-- ts_anticheat:banPlayer
-- ts_anticheat:banRelay
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bringAllPlayers
-- ts_anticheat:bringPlayer
-- ts_anticheat:cipher:detection
-- ts_anticheat:cipher:request
-- ts_anticheat:clearTasks
-- ts_anticheat:client:scriptsReady
-- ts_anticheat:configUpdated
-- ts_anticheat:deleteObjects
-- ts_anticheat:deletePeds
-- ts_anticheat:deleteVehicles
-- ts_anticheat:freezeAllPlayers
-- ts_anticheat:getBanList
-- ts_anticheat:getLogs
-- ts_anticheat:getPlayerCount
-- ts_anticheat:getPlayers
-- ts_anticheat:healAllPlayers
-- ts_anticheat:internal:pushResourceGuard
-- ts_anticheat:internal:suspicious
-- ts_anticheat:kickPlayer
-- ts_anticheat:liveSSResult
-- ts_anticheat:liveWatchStart
-- ts_anticheat:liveWatchStop
-- ts_anticheat:logAdminMenu
-- ts_anticheat:newLog
-- ts_anticheat:playerBanned
-- ts_anticheat:requestAdminStatus
-- ts_anticheat:requestEventKey
-- ts_anticheat:requestKey
-- ts_anticheat:requestOpenAdminMenu
-- ts_anticheat:returnCoords
-- ts_anticheat:reviveAllPlayers
-- ts_anticheat:screenshotPlayer
-- ts_anticheat:screenshotResult
-- ts_anticheat:server:<computed suffix> [template only; not a runnable exact event]
-- ts_anticheat:server:checkIsAdmin
-- ts_anticheat:server:clientXkzuqBwmTjN7Gab4QzuN9QYZJ1WxxU
-- ts_anticheat:server:requestJoinHandshake
-- ts_anticheat:server:requestResourceGuard
-- ts_anticheat:server:requestSyncData
-- ts_anticheat:server:tazed
-- ts_anticheat:serverClear
-- ts_anticheat:setInvisible
-- ts_anticheat:setTime
-- ts_anticheat:setWeather
-- ts_anticheat:shield:ban_video_saved
-- ts_anticheat:spawnVehicle
-- ts_anticheat:targetArmour
-- ts_anticheat:targetFreeze
-- ts_anticheat:targetGiveWeapon
-- ts_anticheat:targetHeal
-- ts_anticheat:targetRevive
-- ts_anticheat:targetSetHealth
-- ts_anticheat:targetSlay
-- ts_anticheat:targetStripWeapons
-- ts_anticheat:targetWarn
-- ts_anticheat:tpToPlayer
-- ts_anticheat:unbanPlayer
-- ts_anticheat:v10:exec
-- ts_anticheat:v6:detection
-- ts_anticheat:v6:screenshotResult
-- ts_anticheat:verifyModel
-- ts_anticheat:videoResult
-- vehicleComponentControlEvent
-- weaponDamageEvent

-- tosun-ac/server/RegisterNetEvent
-- tosun-ac:panel:characterReady
-- tosun-ac:server:detection
-- tosun-ac:server:logResourceActivity
-- tosun-ac:server:nuiWatermark
-- tosun-guard:acMissing
-- tosun-guard:hello
-- tosun-guard:tick
-- tosun:nativeGuard:status
-- ts_anticheat:GetPlayerIdentifiers
-- ts_anticheat:addLog
-- ts_anticheat:adminDelEntity
-- ts_anticheat:banPlayer
-- ts_anticheat:banRelay
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bringAllPlayers
-- ts_anticheat:bringPlayer
-- ts_anticheat:cipher:detection
-- ts_anticheat:cipher:request
-- ts_anticheat:client:scriptsReady
-- ts_anticheat:deleteObjects
-- ts_anticheat:deletePeds
-- ts_anticheat:deleteVehicles
-- ts_anticheat:freezeAllPlayers
-- ts_anticheat:getBanList
-- ts_anticheat:getLogs
-- ts_anticheat:getPlayerCount
-- ts_anticheat:getPlayers
-- ts_anticheat:healAllPlayers
-- ts_anticheat:kickPlayer
-- ts_anticheat:liveSSResult
-- ts_anticheat:liveWatchStart
-- ts_anticheat:liveWatchStop
-- ts_anticheat:logAdminMenu
-- ts_anticheat:requestAdminStatus
-- ts_anticheat:requestEventKey
-- ts_anticheat:requestKey
-- ts_anticheat:requestOpenAdminMenu
-- ts_anticheat:returnCoords
-- ts_anticheat:reviveAllPlayers
-- ts_anticheat:screenshotPlayer
-- ts_anticheat:screenshotResult
-- ts_anticheat:server:checkIsAdmin
-- ts_anticheat:server:clientXkzuqBwmTjN7Gab4QzuN9QYZJ1WxxU
-- ts_anticheat:server:requestJoinHandshake
-- ts_anticheat:server:requestResourceGuard
-- ts_anticheat:server:requestSyncData
-- ts_anticheat:server:tazed
-- ts_anticheat:serverClear
-- ts_anticheat:setInvisible
-- ts_anticheat:setTime
-- ts_anticheat:setWeather
-- ts_anticheat:shield:banVideo
-- ts_anticheat:shield:heartbeat_fail
-- ts_anticheat:shield:requestUploadConfig
-- ts_anticheat:shield:screenshot
-- ts_anticheat:shield:tokens
-- ts_anticheat:spawnVehicle
-- ts_anticheat:targetArmour
-- ts_anticheat:targetFreeze
-- ts_anticheat:targetGiveWeapon
-- ts_anticheat:targetHeal
-- ts_anticheat:targetRevive
-- ts_anticheat:targetSetHealth
-- ts_anticheat:targetSlay
-- ts_anticheat:targetStripWeapons
-- ts_anticheat:targetWarn
-- ts_anticheat:tpToPlayer
-- ts_anticheat:unbanPlayer
-- ts_anticheat:v10:exec
-- ts_anticheat:v6:detection
-- ts_anticheat:v6:screenshotResult
-- ts_anticheat:verifyModel
-- ts_anticheat:videoResult

-- tosun-ac/server/RegisterServerEvent
-- ts_anticheat:clearTasks

-- tosun-ac/shared/AddEventHandler
-- onClientResourceStart
-- onResourceStop
-- playerDropped
-- ts_anticheat:locale:reload
-- ts_anticheat:locale:setSelf
-- ts_anticheat:locale:sync

-- tosun-ac/shared/RegisterNetEvent
-- ts_anticheat:locale:setSelf
-- ts_anticheat:locale:sync

-- tosun-ac-guardian/server/AddEventHandler
-- onResourceStart
-- onResourceStop

-- tosun_render/server/AddEventHandler
-- onResourceStart

-- tosun-ac/client / RegisterCommand
-- stopspectate
-- tsdelaimed
-- tsfreecam
-- tsmenu
-- unspectate

-- tosun-ac/server / RegisterCommand
-- ac_cleanup
-- acfreeze
-- acping
-- acstats
-- acunfreeze
-- acwarn
-- capture
-- clearinv
-- emergency
-- giveweapon
-- massfreeze
-- mute
-- setarmor
-- sethp
-- speedlimit
-- stripweapons
-- tosunac_backdoorscan
-- tosunac_db_check
-- tosunac_db_status
-- tosunac_doctor
-- tosunac_eventscan
-- tosunac_integration
-- tosunac_license_status
-- tosunac_setup
-- ts
-- ts_adminsync
-- ts_broadcast
-- ts_capture
-- ts_clearinv
-- ts_emergency
-- ts_freeze
-- ts_giveweapon
-- ts_healall
-- ts_kickall
-- ts_lockdown
-- ts_massfreeze
-- ts_modping
-- ts_mute
-- ts_players
-- ts_revive
-- ts_setarmor
-- ts_sethp
-- ts_settime
-- ts_setweather
-- ts_slay
-- ts_speedlimit
-- ts_stripweapons
-- ts_tphere
-- ts_tpto
-- ts_unfreeze
-- ts_unmute
-- ts_v9_help
-- ts_warn
-- ts_warnings
-- unmute

-- tosun-ac/shared / RegisterCommand
-- ts_setlang

-- tosun-ac-guardian/server / RegisterCommand
-- tosunac_guardian_pause
-- tosunac_guardian_resume
-- tosunac_guardian_status

-- tosun_render/server / RegisterCommand
-- tosun_render_status

SafeEvent: إعادة التشغيل والطابور والأخطاء#

RegisterSafeEvent يتطلب اسماً يبدأ باسم المورد وvalidator وhandler. يجب أن يعيد validator القيمة true تماماً بعد فحص حالة الخادم الحالية. احذف handler الشبكة القديم؛ لا يستطيع AC إلغاء معالج مستقل في مورد آخر. أعد التسجيل بعد تشغيل موردك أو tosun-ac مجدداً. حالات العميل: sent وqueued_until_key وqueue_full وinvalid_event_or_arguments وresource_stopping. sent إرسال لا إيصال مكافأة. الطابور حتى32طلباً لمدة30ثانية. خطأ handler لا يعاد ولا يؤكد النجاح تلقائياً. استخدم إيصال تطبيق منفصلاً وعملية لا تتكرر آثارها؛ لا تكرر المال أو العناصر تلقائياً.

-- Client TriggerSafeServerEvent results:
-- true,  "sent"
-- false, "queued_until_key"
-- false, "queue_full"
-- false, "invalid_event_or_arguments"
-- false, "resource_stopping"

-- Server RegisterSafeEvent results:
-- true, "registered"
-- false + server_resource_required / use_own_resource_prefix
-- false + invalid_callbacks_or_options / already_registered / registration_capacity

-- Server log may say: application handler failed.
-- No automatic replay; implement an application receipt.

التقرير في الطابور ليس تأكيد حفظ#

reportInfection(resource, file, sigs, severity[, callback]) يعيد true فقط عند إدراج عملية DB. callback الاختياري مرة واحدة كحد أقصى مع success وaffectedRows؛ النجاح يحتاج عدداً صحيحاً موجباً. إن لم يرد driver لا ضمان اكتمال. Resource 1–190بايت حروف/أرقام/_.-، وfile 1–500بايت، وseverity 1–50 حرف/رقم/_- (warning افتراضياً). sigs نص غير فارغ أو قائمة متصلة1–32نصاً، مجموعها حتى255بايت. يرفض NUL/CR/LF. بيانات غير صالحة أو driver مفقود/رفض أو خطأ متزامن يعيد false. لا تعد العملية تلقائياً عند غموض النتيجة.

-- A reviewed server reporting workflow; fictional non-secret labels.
-- resource: 1..190 bytes, letters/digits/underscore/dot/hyphen
-- file: 1..500 bytes; signatures joined: 1..255 bytes
-- severity: 1..50 bytes, letters/digits/underscore/hyphen (no dot)
local queued = exports["tosun-ac"]:reportInfection(
    "my-housing", "server.lua", {"reviewed_pattern"}, "warning",
    function(success, affectedRows)
        print(success and "[scan] report saved" or "[scan] report not confirmed")
    end)
-- queued=true is dispatch only; it is not the completion callback.
-- Do not automatically retry an operation with an uncertain outcome.