Agency Docs
QBESXStandalone

Agency-Lifeinvader V3 الإعدادات

وكالة إعلانات المدينة لـ FiveM على QBCore أو Qbox أو ESX أو بنظام مستقل بالكامل.

v3.2.1مدفوع5 صفحات

01الإعدادات

تثبيت سريع · config.lua · Agency-Lifeinvader V3

تنزيل config.lua

--[[ ============================================================================ AGENCY LIFEINVADER 3.2 · config.lua ---------------------------------------------------------------------------- The ad agency of the city. Players write ads that run across the screen of every player: categories, boosts, scheduling, drafts, a live feed, review by admins or the staff of the agency job, and an Auto-Check for spam. Finds QBCore, Qbox or ESX by itself and runs fully standalone without any of them, with or without a database. Admins change prices, review and the categories in the menu (/aladmin, tab Settings). Those values are saved for the whole server and win over this file until "Reset to config.lua" is pressed. ============================================================================ ]] Config = {} -- ============================================================================= -- 1. GENERAL -- ============================================================================= Config.Framework = 'auto' -- 'auto' | 'qbcore' (also Qbox) | 'esx' | 'standalone' Config.Locale = 'en' -- en de fr es it pt nl pl cs sv da no fi ro hu hr bg el tr ru uk ar hi ja ko zh -- Debug mode: every request and every ad of the queue in the server console. -- Admins can switch it in the menu as well. Config.Debug = false -- Where ads, drafts and player settings are saved. 'auto' uses oxmysql when -- it runs (the V3 tables, created and upgraded by themselves) and otherwise -- the server's own key value store, so a server without a database works too. Config.Storage = 'auto' -- 'auto' | 'mysql' | 'kvp' -- How messages are shown: 'auto' = Agency-Notify when it runs, then a -- notification on Agency Phone, then your framework, then the GTA feed. -- While the app is open, messages appear in it. -- Agency-Notify is free: https://agencyscripts.dev/en/product/notify Config.Notify = 'auto' -- 'auto' | 'agency' | 'framework' | 'gta' -- ============================================================================= -- 2. LOOK -- ============================================================================= Config.UI = { brand = 'LIFEINVADER', -- name in the app and on every ad subtitle = '', -- line under the name, '' = "Ad agency" in the server language -- A file in html/, a nui:// or https:// link, or '' for a megaphone icon. -- Best as a square PNG with a transparent background (logo.png is the -- gold Agency logo). logo = 'logo.png', tintLogo = false, -- true draws the logo in the accent colour (good for a white logo) accent = '#E2B649', -- accent colour of app and ads (Agency gold) scale = 1.0, -- size of the app, 0.8 to 1.3 (players size their ad banners themselves) } -- ============================================================================= -- 3. KEYS AND COMMANDS -- ============================================================================= -- Players can change both keys in the GTA settings (Key Bindings > FiveM). -- F6 is free in all Agency scripts (Vehiclekeys F5, Housing F7, Admin F10). Config.Keys = { open = 'F6', -- opens the app feed = '', -- opens the live feed directly, '' = no key (players can set one) } Config.Commands = { open = 'alad', -- the app feed = 'alfeed', -- the live feed test = 'altest', -- shows a sample ad to yourself, to try the banner position admin = 'aladmin', -- admin panel agency = 'alagency', -- staff panel of the ad agency job } -- ============================================================================= -- 4. ADS -- ============================================================================= Config.Ads = { minLength = 10, -- characters an ad needs at least maxLength = 300, -- characters at most maxLines = 6, -- lines one ad may have maxRepetitions = 5, -- how often one ad may run (categories can lower it) interval = { min = 30, max = 300, default = 60 }, -- seconds between two runs of the same ad duration = { min = 5, max = 60, default = 8 }, -- seconds an ad stays on screen delays = { 0, 10, 30, 60, 300 }, -- start delays the form offers, in seconds anonymous = true, -- players may post without their name schedule = { enabled = true, maxHoursAhead = 24 }, -- post an ad for a later time -- Seconds between two ads across the whole city. Ads wait in a queue and -- never flood the screen, however many are booked. gap = 15, maxOnScreen = 3, -- banners on a player's screen at the same time } Config.Boost = { enabled = true, multiplier = 2.0, -- a boosted ad costs this many times the price priority = 8, -- and jumps this far ahead in the queue } -- ============================================================================= -- 5. PRICES AND PAYMENT -- ============================================================================= -- Price of one run = (base + perSecond x seconds on screen) x category factor, -- times 2 with a boost. The total is that times the number of runs. Config.Pricing = { base = 5000, perSecond = 500, } Config.Money = { -- What players pay with. The first one is picked in the form, the player -- can switch when there are more. 'bank' | 'cash' methods = { 'bank', 'cash' }, currency = '$', -- Rejected, withdrawn and stopped ads pay back what has not run yet. -- A player who is offline gets it the next time he joins. refunds = true, -- Agency Pay from Agency Phone: the phone opens, the player confirms the -- payment there, the money comes from his bank account. Offered as soon -- as the phone runs; enabled = false hides it. agencyPay = { enabled = true, resource = 'agency-phone', timeout = 90 }, } -- ============================================================================= -- 6. CATEGORIES -- ============================================================================= -- id stays the same once ads use it -- label used when the language files have no text for this id -- icon briefcase car home wrench party pin food shop music heart star megaphone tag bolt -- price factor on the price (0.9 = 10 % cheaper) -- priority places ahead in the queue -- review ads of this category always wait for a staff member -- maxRepetitions runs at most (below Config.Ads.maxRepetitions) -- minInterval seconds at least between two runs Config.Categories = { { id = 'jobs', label = 'Jobs', icon = 'briefcase', price = 0.9, priority = 2, review = false, maxRepetitions = 4, minInterval = 30 }, { id = 'vehicles', label = 'Vehicles', icon = 'car', price = 1.15, priority = 1, review = false, maxRepetitions = 5, minInterval = 45 }, { id = 'realestate', label = 'Real Estate', icon = 'home', price = 1.25, priority = 1, review = true, maxRepetitions = 4, minInterval = 60 }, { id = 'services', label = 'Services', icon = 'wrench', price = 1.0, priority = 2, review = false, maxRepetitions = 5, minInterval = 30 }, { id = 'events', label = 'Events', icon = 'party', price = 1.1, priority = 3, review = false, maxRepetitions = 5, minInterval = 30 }, { id = 'other', label = 'Other', icon = 'pin', price = 1.0, priority = 0, review = false, maxRepetitions = 3, minInterval = 45 }, } -- ============================================================================= -- 7. REVIEW -- ============================================================================= Config.Review = { -- Every ad waits for an admin or a staff member of the agency before it -- runs. Admins switch this in the menu. required = false, -- Auto-Check: simple rules on your own server, no outside service. It -- looks for shouting, links, phone number walls, repeated texts and spam -- and holds such ads back for review. Admins see why. autoCheck = { enabled = true, holdOnFlag = true, -- flagged ads wait for review threshold = 4, -- penalty points that count as flagged duplicateMinutes = 30, -- the same text again within this time is a repeat duplicateLimit = 1, -- repeats allowed before it counts links = { 'http://', 'https://', 'www.', 'discord.gg', 'bit.ly' }, suspicious = { '@everyone', 'free money', 'hack', 'exploit', 'cheap cash', 'real money' }, blocked = {}, -- ads with one of these words are refused outright points = { duplicate_message = 3, aggressive_frequency = 2, excessive_caps = 1, excessive_symbols = 1, external_link = 2, contact_heavy = 1, suspicious_term = 2, long_copy = 1, }, }, } -- ============================================================================= -- 8. LIMITS PER PLAYER -- ============================================================================= Config.Limits = { cooldown = 45, -- seconds between two ads of one player maxWaiting = 3, -- ads waiting for review maxRunning = 4, -- ads running or scheduled maxDrafts = 12, staffBypass = true, -- admins are not limited } -- ============================================================================= -- 9. AD BANNERS -- ============================================================================= -- Defaults for every player. Players change position, size, sound and the -- categories they want to see in the app (tab Settings). Config.Banner = { position = 'middle-left', -- 'top-left' | 'top-right' | 'middle-left' | 'middle-right' | 'bottom-left' | 'bottom-right' scale = 1.0, -- 0.8 to 1.3 sound = true, width = 380, -- pixels showAuthor = true, -- false hides who posted, on every ad sounds = { ad = { name = 'TEXT_ARRIVE_TONE', set = 'HUD_AWARDS' }, publish = { name = 'PURCHASE', set = 'HUD_LIQUOR_STORE_SOUNDSET' }, }, } -- ============================================================================= -- 10. THE AD AGENCY (JOB) -- ============================================================================= -- Staff of the agency get a panel (/alagency): the company account, what -- the ads earn, and the review of waiting ads. The company earns a share of -- every ad as it runs; the staff member who approved an ad gets a commission -- on every run of it. Config.Agency = { enabled = true, job = 'lifeinvader', -- job of the staff (QBCore, Qbox, ESX) ace = 'agency.lifeinvader.staff', -- without a framework: players with this ACE are staff grade = 0, -- lowest job grade that opens the panel bossGrade = 3, -- grade that may take money out of the company account review = true, -- staff may approve and reject waiting ads revenue = 100, -- % of every ad's price that goes to the company account commission = 10, -- % for the staff member who approved the ad, taken from the company share account = 'lifeinvader', -- name of the company (society) account -- 'auto' finds Renewed-Banking, qb-banking, qb-management, okokBanking and -- esx_addonaccount (society_<account>). 'internal' keeps the money in -- this script; bosses pay it out in the panel. bank = 'auto', payTo = 'bank', -- commission and payouts go to 'bank' or 'cash' } -- ============================================================================= -- 11. AGENCY PHONE AND AGENCY PAD -- ============================================================================= -- When Agency Phone or Agency Pad (27.0.2 or newer) runs on the server, -- Lifeinvader puts its own app on them by itself: the live feed, new ads, -- my ads and drafts, right on the device. Nothing to set up. Config.Devices = { phone = true, -- app on Agency Phone pad = true, -- app on Agency Pad label = 'Lifeinvader', installed = true, -- already on the home screen, not only in the App Store -- Messages about your ads (approved, rejected, refunds) come as app -- notifications on the phone while its app is there. notifications = true, } -- ============================================================================= -- 12. ADMINS -- ============================================================================= -- Admins: players with the ACE below, group.admin or group.superadmin, one of -- the framework groups, or one of the identifiers. Config.Admin = { ace = 'agency.lifeinvader.admin', groups = { 'admin', 'god', 'superadmin' }, identifiers = { -- 'license:xxxxxxxx', 'discord:xxxxxxxx', 'steam:xxxxxxxx', }, } -- ============================================================================= -- 13. HISTORY -- ============================================================================= Config.History = { keepDays = 30, -- finished ads and admin log entries older than this are removed feed = 30, -- ads in the live feed mine = 20, -- a player's own ads in "My ads" } -- ============================================================================= -- 14. STANDALONE -- ============================================================================= -- Without QBCore, Qbox or ESX: -- money: 'auto' uses Agency-Banking when it runs, otherwise ads are free. -- 'hooks' uses the functions below, 'free' never charges. -- staff: players with Config.Agency.ace, admins by Config.Admin. Config.Standalone = { money = 'auto', -- 'auto' | 'banking' | 'hooks' | 'free' -- getMoney = function(src, account) return 0 end, -- account: 'cash' | 'bank' -- removeMoney = function(src, account, amount) return true end, -- addMoney = function(src, account, amount) return true end, -- getName = function(src) return GetPlayerName(src) end, -- the character name on ads -- addCompanyMoney = function(account, amount) return true end, -- company account of the agency } -- ============================================================================= -- 15. YOUR OWN WORDING -- ============================================================================= -- Any text of the language files can be replaced here and survives updates: -- Config.Text = { ui_publish = 'Send it!', ad_published = 'Your ad is live.' } Config.Text = {}

02ملف SQL

اختياري: ينشئ المورد هذه الجداول بنفسه عند بدء التشغيل. استورد هذا الملف فقط إذا كنت تُعدّ قاعدة البيانات يدويًا:

-- ============================================================================= -- Agency Lifeinvader 3.2: database tables (OPTIONAL) -- ----------------------------------------------------------------------------- -- You do not need to run this file. With oxmysql the script creates these -- tables on the first start and upgrades the tables of Lifeinvader V2 and V3 -- in place. Run it only if your server creates tables by hand. -- ============================================================================= CREATE TABLE IF NOT EXISTS `lifeinvader_ads` ( `id` INT NOT NULL AUTO_INCREMENT, `identifier` VARCHAR(100) NOT NULL, `author_name` VARCHAR(100) DEFAULT NULL, `message` TEXT NOT NULL, `category` VARCHAR(50) DEFAULT 'other', `anonymous` TINYINT DEFAULT 0, `boosted` TINYINT DEFAULT 0, `repetitions_total` INT DEFAULT 1, `repetitions_left` INT DEFAULT 1, `interval_seconds` INT DEFAULT 60, `display_duration` INT DEFAULT 8, `status` VARCHAR(16) NULL DEFAULT 'active', `approved` TINYINT DEFAULT 1, `approved_by` VARCHAR(100) DEFAULT NULL, `rejected_reason` TEXT DEFAULT NULL, `next_send_time` DATETIME DEFAULT NULL, `scheduled_for` DATETIME DEFAULT NULL, `review_requested_at` DATETIME DEFAULT NULL, `reviewed_at` DATETIME DEFAULT NULL, `review_decision` VARCHAR(32) DEFAULT NULL, `queue_priority` INT DEFAULT 0, `ai_score` INT DEFAULT 0, `ai_flags` LONGTEXT DEFAULT NULL, `admin_notes` LONGTEXT DEFAULT NULL, `price_paid` INT DEFAULT NULL, `paid_with` VARCHAR(16) DEFAULT NULL, `refunded` INT DEFAULT 0, `reviewer` VARCHAR(100) DEFAULT NULL, `sent_count` INT DEFAULT 0, `last_sent_at` DATETIME DEFAULT NULL, `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_identifier` (`identifier`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `lifeinvader_ad_drafts` ( `id` INT NOT NULL AUTO_INCREMENT, `identifier` VARCHAR(100) NOT NULL, `title` VARCHAR(120) DEFAULT NULL, `message` TEXT NOT NULL, `category` VARCHAR(50) DEFAULT 'other', `anonymous` TINYINT DEFAULT 0, `boosted` TINYINT DEFAULT 0, `repetitions_total` INT DEFAULT 1, `interval_seconds` INT DEFAULT 60, `display_duration` INT DEFAULT 8, `delay` INT DEFAULT 0, `scheduled_for` DATETIME DEFAULT NULL, `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_identifier` (`identifier`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `lifeinvader_player_settings` ( `id` INT NOT NULL AUTO_INCREMENT, `identifier` VARCHAR(100) NOT NULL, `notification_position` VARCHAR(20) DEFAULT 'middle-left', `notification_enabled` TINYINT DEFAULT 1, `notification_scale` FLOAT DEFAULT 1.0, `ui_transparency` FLOAT DEFAULT 0.55, `accent_color` VARCHAR(20) DEFAULT NULL, `sound_enabled` TINYINT DEFAULT 1, `admin_panel_scale` FLOAT DEFAULT 1.0, `muted_categories` VARCHAR(255) DEFAULT NULL, `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uniq_identifier` (`identifier`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS `lifeinvader_admin_logs` ( `id` INT NOT NULL AUTO_INCREMENT, `admin_identifier` VARCHAR(100) DEFAULT NULL, `admin_name` VARCHAR(100) DEFAULT NULL, `action` VARCHAR(64) NOT NULL, `ad_id` INT DEFAULT NULL, `metadata` LONGTEXT DEFAULT NULL, `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_action` (`action`), KEY `idx_ad_id` (`ad_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

+من المفيد معرفته

يحتوي config.lua على 16 قسمًا مشروحًا، بدءًا من إطار العمل ووصولًا إلى صياغتك الخاصة. ويمكن أيضًا تغيير الأسعار وقواعد المراجعة والتعزيزات والفئات من لوحة الإدارة داخل اللعبة، على مستوى الخادم بأكمله.

عام والمظهر
تحدد Config.Framework وConfig.Locale وConfig.Debug وConfig.Storage وConfig.Notify إطار العمل واللغة ووضع التصحيح ومكان حفظ البيانات وكيفية عرض الرسائل. ويضبط Config.UI اسم العلامة التجارية والعنوان الفرعي والشعار واللون التمييزي وحجم التطبيق.
المفاتيح والأوامر
يضبط Config.Keys المفتاح F6 والمفتاح الاختياري للبث المباشر، بينما يحدد Config.Commands أسماء /alad و/alfeed و/altest و/aladmin و/alagency.
الإعلانات والتعزيزات
يضبط Config.Ads المدة وعدد الأسطر ومرات العرض والفاصل الزمني ومدة ظهور الإعلان على الشاشة وتأخيرات البدء والإعلانات المجهولة والجدولة والفاصل بين إعلانين وعدد اللافتات التي تعرضها الشاشة في الوقت نفسه. ويضبط Config.Boost معامل السعر ومدى تقدم الإعلان المعزّز.
الأسعار والدفع
يضبط Config.Pricing السعر الأساسي والسعر لكل ثانية يظهر فيها الإعلان على الشاشة. ويضبط Config.Money البنك والنقد والعملة والمبالغ المستردة وAgency Pay.
الفئات
يسرد Config.Categories الفئات الست مع الأيقونة ومعامل السعر والأولوية والمراجعة ومرات العرض والفاصل الزمني.
المراجعة والفحص التلقائي
يحدد Config.Review ما إذا كان كل إعلان ينتظر المراجعة، وكيف يقيّم الفحص التلقائي الروابط والصراخ والرموز والأرقام والتكرار والكلمات المشبوهة أو المحظورة.
الحدود
يحدد Config.Limits فترة الانتظار بين إعلانين للاعب واحد، وعدد الإعلانات قيد الانتظار والجارية لكل لاعب، وعدد المسودات، وما إذا كانت هناك قيود على المشرفين.
اللافتات والوظيفة والأجهزة
يحدد Config.Banner الموضع والحجم والصوت والعرض الافتراضي للافتات. ويحدد Config.Agency الوظيفة والرتب وحصة الإيرادات والعمولة وحساب الشركة، بينما يحدد Config.Devices التطبيق في Agency Phone وAgency Pad.
المشرفون والسجل والوضع المستقل والصياغة
يحدد Config.Admin اسم ACE الخاص بالمشرفين والمجموعات والمعرّفات، ويحدد Config.History مدة الاحتفاظ بالإعلانات، ويحدد Config.Standalone الأموال عند عدم استخدام إطار عمل، أما Config.Text فيتيح استبدال أي نص لتبقى صياغتك كما هي بعد التحديثات.

?الأسئلة المتكررة

ما الذي تغيّره الإعدادات في لوحة المشرف؟

قواعد المراجعة والفحص التلقائي والإعلانات المجهولة ووضع التصحيح والأسعار والفاصل بين الإعلانات والتعزيزات وكل فئة. تُحفظ هذه الإعدادات للخادم بأكمله وتكون لها الأولوية على config.lua حتى تضغط على Reset to config.lua أو تشغّل lifeinvader reset في وحدة التحكم.

كيف أغيّر نصًا؟

أضِفه إلى Config.Text باستخدام المفتاح الموجود في ملفات اللغة، على سبيل المثال Config.Text = { ui_publish = 'Send it!' }. وستبقى التغييرات بعد التحديثات.

ما زلت عالقًا بعد هذه الصفحة؟ فريق الدعم يتولّى الأمر من هنا.