Agency-Phone कस्टम ऐप
अब AgencyOS27 के साथ: जिनके पास पहले से फ़ोन है उनके लिए मुफ़्त अपडेट। FiveM के लिए एक आधुनिक फ़ोन जो QBCore, ESX या.

🧩 Agency-Phone के लिए अपना ऐप बनाएँ
फ़ोन पर ऐप जोड़ने के दो तरीके हैं। जो आपके काम का हो, वह चुनें:
| तरीका | किसके लिए सही | आप क्या बदलते हैं |
|---|---|---|
| A. SDK (बाहरी रिसोर्स) | अपने आइकन के साथ ऐप जोड़ने वाले डेवलपर और स्क्रिप्ट | सिर्फ़ आपका अपना रिसोर्स। agency-phone में कोई बदलाव नहीं। |
| B. Drop-in (agency-phone के अंदर) | फ़ोन के इंटरफ़ेस में नेटिव स्क्रीन जोड़ने वाले सर्वर मालिक | config.lua + apps/ (+ स्क्रीन के लिए html/js) |
अगर आप ऐप दूसरे सर्वरों को देते हैं, तो तरीका A इस्तेमाल करें। इसमें हमारे सोर्स कोड की ज़रूरत नहीं होती और यह अपडेट के बाद भी चलता रहता है।
A SDK: अपने रिसोर्स से ऐप रजिस्टर करें
agency-phone ऐसे एक्सपोर्ट देता है जिनसे कोई भी रिसोर्स रनटाइम पर अपने आइकन वाला ऐप फ़ोन की होम स्क्रीन पर रख सकता है। आपके ऐप का इंटरफ़ेस आपके अपने रिसोर्स में रहता है; फ़ोन आइकन दिखाता है और खिलाड़ी के टैप करते ही कंट्रोल आपको दे देता है। agency-phone में कोई बदलाव नहीं, कोई अनलॉक्ड बिल्ड नहीं।
छोटा उदाहरण
-- client side of YOUR resource
CreateThread(function()
Wait(1500) -- let agency-phone boot
exports['agency-phone']:RegisterApp({
id = 'myshop',
label = 'My Shop',
icon = 'fa-solid fa-cart-shopping', -- FontAwesome 6 class
-- image = 'https://cfx-nui-myresource/icon.png', -- or your own image instead
color = '#ff9500',
colorDark = '#e08600',
})
end)
-- fired when the player taps your icon on the phone
AddEventHandler('agency-phone:client:openApp', function(appId)
if appId ~= 'myshop' then return end
exports['agency-phone']:ClosePhone()
-- open your own NUI here
end)
RegisterApp कॉन्फ़िग
| फ़ील्ड | प्रकार | ज़रूरी | विवरण |
|---|---|---|---|
id | string | हाँ | अनोखी id, छोटे अक्षरों में, बिना स्पेस। |
label | string | हाँ | आइकन के नीचे दिखने वाला नाम। |
icon | string | नहीं | FontAwesome 6 क्लास। image सेट हो तो नज़रअंदाज़। |
image | string | नहीं | अपनी आइकन इमेज, जैसे https://cfx-nui-<resource>/icon.png। |
color / colorDark | string | नहीं | आइकन के पीछे का ग्रेडिएंट (hex)। |
slot | number | नहीं | होम स्क्रीन पर जगह। न दें तो अपने आप तय होती है। |
storeDesc | string | नहीं | Store में आपके ऐप के पेज पर छोटा विवरण। न दें तो label इस्तेमाल होता है। |
SDK एक्सपोर्ट (क्लाइंट)
| एक्सपोर्ट | विवरण |
|---|---|
RegisterApp(config) | अपना ऐप जोड़ें या अपडेट करें। true लौटाता है, या false, err। |
UnregisterApp(id) | अपना ऐप हटाएँ। आपका रिसोर्स रुकने पर यह अपने आप भी होता है। |
GetRegisteredApps() | सभी रजिस्टर्ड बाहरी ऐप्स की टेबल। |
ClosePhone() | फ़ोन बंद करें, जैसे अपना NUI खोलने से पहले। |
टैप इवेंट
खिलाड़ी आपके आइकन पर टैप करे तो agency-phone क्लाइंट पर ये दोनों इवेंट चलाता है। जो पसंद हो, इस्तेमाल करें:
| इवेंट | आर्ग्युमेंट |
|---|---|
agency-phone:client:openApp | appId (अपनी id से फ़िल्टर करें) |
agency-phone:client:openApp:<yourId> | कोई नहीं (पहले से सिर्फ़ आपके ऐप के लिए) |
अपनी fxmanifest.lua में dependency 'agency-phone' जोड़ें ताकि शुरू होने का क्रम सही रहे।
B Drop-in, फ़ोन के अंदर नेटिव स्क्रीन
ऐसी स्क्रीन के लिए जिसे फ़ोन खुद बनाता है (आपका रिसोर्स नहीं)। इसमें agency-phone की अपनी फ़ाइलें बदलती हैं।
| कदम | फ़ाइल | escrow बिल्ड में बदल सकते हैं? |
|---|---|---|
1. AgencyConfig.Apps में ऐप की एंट्री | config.lua | ✓ हाँ |
2. RegisterNUICallback लॉजिक | apps/<id>_client.lua (+ _server.lua) | ✓ हाँ |
3. स्क्रीन <div id="app-<id>"> | html/index.html | ✗ एन्क्रिप्टेड |
4. openApp() में case '<id>': + लोडर | html/js/phone.js | ✗ एन्क्रिप्टेड |
कदम 3 और 4 escrow से एन्क्रिप्ट फ़ाइलों में हैं, इसलिए नेटिव स्क्रीन के लिए सोर्स वाला या अनलॉक्ड बिल्ड चाहिए। आपके पास सिर्फ़ escrow वर्ज़न है, तो तरीका A इस्तेमाल करें (आपकी स्क्रीन आपके अपने रिसोर्स में रहती है)। रिसोर्स के अंदर उदाहरण फ़ाइलें: apps/testapp_client.lua और apps/dispatch_client.lua।
📋 फ़ोन के दूसरे एक्सपोर्ट
क्लाइंट
| एक्सपोर्ट | लौटाता है | विवरण |
|---|---|---|
IsPhoneOpen() | boolean | फ़ोन अभी खुला है। |
IsPhonePoweredOn() | boolean | डिवाइस चालू है। |
HasPhone() | boolean | खिलाड़ी के पास फ़ोन आइटम है। |
HasCarrierContract() | boolean | सक्रिय eSIM या कॉन्ट्रैक्ट। |
GetPhoneData() | table | फ़ोन की स्थिति का स्नैपशॉट। |
PhoneNotification(title, text, icon, color, timeout, acceptIcon, denyIcon) | void | फ़ोन पर सूचना। |
StartCall(contact) | void | { name, number } को कॉल। |
StartAgencyPayCheckout(opts) | void | AgencyPay चेकआउट (नीचे देखें)। |
सर्वर
| एक्सपोर्ट | विवरण |
|---|---|
SendMail(identifier, mailData) | खिलाड़ी को मेल पहुँचाएँ (ऑनलाइन या ऑफ़लाइन)। |
AddChirp(data) | Pulse सोशल फ़ीड में संदेश पोस्ट करें। |
VerifyAgencyPayCharge(source, requestId, minAmount) | सामान देने से पहले सर्वर पर AgencyPay भुगतान की पुष्टि करें (नीचे देखें)। |
⇄ NUI ↔ Lua ब्रिज (तरीका B)
| दिशा | JS साइड | Lua साइड |
|---|---|---|
| JS → Lua | fetchNUI('callbackName', data) | RegisterNUICallback('callbackName', fn) |
| Lua → JS | window.onmessage में action सुनें | SendNUIMessage({ action = '...' }) |
💳 AgencyPay चेकआउट
किसी भी रिसोर्स से खिलाड़ी के वॉलेट से पैसे लें।
exports['agency-phone']:StartAgencyPayCheckout({
merchant = 'My Shop', title = 'Agency Pay', subtitle = 'Checkout',
label = 'Premium Coffee', amount = 24.50,
icon = 'fa-solid fa-mug-hot', accent = '#ff9f0a',
clientEvent = 'myshop:client:agencyPayResult',
serverEvent = 'myshop:server:agencyPayResult',
metadata = { orderId = 'order_2048' },
})
RegisterNetEvent('myshop:client:agencyPayResult', function(result)
if result.status == 'paid' then
-- deliver the goods
end
end)
नतीजे में status (paid / cancelled / failed), amount, cardId, balance और आपका metadata होता है।
क्लाइंट से आपके रिसोर्स तक पहुँचा paid अकेले कुछ साबित नहीं करता। StartAgencyPayCheckout को अपनी id दें और कुछ भी देने से पहले सर्वर पर exports['agency-phone']:VerifyAgencyPayCharge(source, id, amount) कॉल करें। यह true और राशि तभी लौटाता है जब इस खिलाड़ी ने पिछले 60 सेकंड में यही चेकआउट चुकाया हो, और भुगतान को इस्तेमाल हुआ मान लेता है ताकि एक ही भुगतान दो बार न लिया जा सके।
🐛 समस्या समाधान
| समस्या | समाधान |
|---|---|
| आइकन नहीं दिखता (SDK) | agency-phone को नवीनतम Keymaster बिल्ड पर अपडेट करें, RegisterApp से पहले Wait(1500) रखें, और मैनिफ़ेस्ट में dependency 'agency-phone' जोड़ें। |
| टैप करने पर कुछ नहीं होता (SDK) | आपका agency-phone:client:openApp हैंडलर आपकी id से बिल्कुल मेल खाना चाहिए (बड़े-छोटे अक्षर मायने रखते हैं)। |
| अपनी इमेज नहीं दिखती | पूरा NUI पता https://cfx-nui-<your-resource>/path/icon.png इस्तेमाल करें और फ़ाइल को मैनिफ़ेस्ट के files { } में लिखें। |
| आइकन नहीं दिखता (drop-in) | कॉन्फ़िग एंट्री में enabled = true और installed = true। |
सवाल हैं या मदद चाहिए? Agency Scripts के Discord से जुड़ें।