Agency-Watch कस्टम ऐप
अब AgencyOS27 के साथ: जिनके पास घड़ी पहले से है उनके लिए मुफ़्त अपडेट। FiveM के लिए एक असली स्मार्टवॉच, HUD नहीं। दस.

⌚ Agency-Watch के लिए अपना ऐप बनाएँ
घड़ी खुली है। सर्वर मालिक ऐसा ऐप जोड़ सकता है जो बिल्ट-इन ऐप जैसा दिखे और चले, उन्हीं हिस्सों, उन्हीं रंगों और उन्हीं अनुवादों के साथ।
शर्त: Pro एडिशन। कस्टम ऐप तभी मौजूद होते हैं जब सर्वर पर Agency-Phone चल रहा हो और खिलाड़ी के पास हो। Pro के बिना वे रजिस्टर होते हैं पर कभी पहुँचाए नहीं जाते: इंटरफ़ेस को उनका पता नहीं चलता, वे App Store में नहीं दिखते, और सर्वर उनकी भेजी हर कार्रवाई ठुकरा देता है। यह तीन अलग जगहों पर जाँचा जाता है और बंद नहीं किया जा सकता।
| फ़ाइल | ज़रूरी | क्या करती है |
|---|---|---|
apps/<id>/app.lua | हाँ | ऐप रजिस्टर करती है: नाम, आइकन, रंग, कैटेगरी। |
apps/<id>/app.js | हाँ | स्क्रीन: क्या बनाती है और कैसे प्रतिक्रिया देती है। |
apps/<id>/app.css | नहीं | आपकी अपनी स्टाइलिंग। सिर्फ़ style = true होने पर लोड होती है। |
apps/<id>/server.lua | नहीं | सर्वर लॉजिक जिसे आपका ऐप कॉल कर सकता है। |
फ़ोल्डर का नाम ठीक ऐप id जैसा होता है। इसी से घड़ी रास्ता दो बार लिखे बिना app.js और app.css ढूँढती है, और दो बार लिखे रास्ते देर-सबेर अलग हो जाते हैं।
apps/ के नीचे सब कुछ escrow_ignore में है: यह आपकी डिस्क पर पढ़ने और बदलने लायक रहता है, और घड़ी का अपडेट इसे कभी नहीं बदलता।
1 ऐप रजिस्टर करें
apps/hello/app.lua
AgencyWatchApp({
id = 'hello', -- lowercase, digits and _, must match the folder
name = 'Hello',
icon = 'raster', -- one of the built-in icons, see below
color = '#5ac8fa', -- #rrggbb
category = 'tools', -- tools | games | driving | style | connected
style = true, -- also load app.css
texts = { en = 'Hello', de = 'Hallo' }, -- optional, name per language
})
गलत id, बिना नाम, अनजान कैटेगरी या #rrggbb न होने वाले रंग वाला ऐप सर्वर कंसोल में साफ़ तौर पर और कारण के साथ ठुकरा दिया जाता है। आधा रजिस्टर होना जैसी कोई चीज़ नहीं: वरना ऐसी गलती तभी दिखती जब कोई खिलाड़ी ऐप पर टैप करता।
फ़ाइलें जोड़ने के बाद refresh और restart Agency-Watch चलाएँ। शुरू होते समय घड़ी बताती है कि क्या रजिस्टर हुआ।
2 स्क्रीन बनाएँ
apps/hello/app.js
AgencyWatch.app('hello', {
render: function (w) { // required, returns HTML
var d = w.data();
return w.card('Hello, ' + w.esc(d.name)) +
w.section('Steps') +
w.row({ icon: 'schritte', static: true,
top: String(d.steps || 0) }) +
w.button('Roll a die', ' data-roll');
},
bind: function (w) { // optional, runs right after
w.click('[data-roll]', function () {
w.toServer('roll', { sides: 6 }).then(function (a) {
if (a.ok) w.notify('Hello', 'You rolled ' + a.data.value);
});
});
},
});
render हर बार स्क्रीन बनने पर चलता है, इसलिए कॉल के बीच कोई स्थिति नहीं रखता। जो दोबारा बनने के बाद भी बचना चाहिए, वह ऐप ऑब्जेक्ट के बाहर किसी वेरिएबल में रखें।
दोनों फ़ंक्शन एक सुरक्षा जाल के अंदर चलते हैं। आपका कोड एरर फेंके तो आपका ऐप एक एरर लाइन दिखाता है और घड़ी चलती रहती है; असली एरर F8 कंसोल में जाता है।
3 टूलबॉक्स
w में वह सब है जो घड़ी पर किसी ऐप को चाहिए, उससे ज़्यादा कुछ नहीं। जो इंटरफ़ेस सब कुछ कर सके, उसे फिर कभी बदला नहीं जा सकता, इसलिए यह जानबूझकर छोटा है।
| कॉल | आपको क्या मिलता है |
|---|---|
w.data() | एक सपाट स्नैपशॉट: time, hour, minute, date, weekday, name, job, health, armour, pulse, steps, distance, calories, speed, heading, weather, pro. |
w.row({icon, top, bottom, end, attrs, static}) | घड़ी की अपनी स्टाइल में सूची की एक पंक्ति। |
w.section(text) | सेक्शन का शीर्षक। |
w.card(html) | एक सतह। |
w.button(text, attrs) | एक बटन। attrs एक कच्ची एट्रिब्यूट स्ट्रिंग है, जैसे ' data-roll'। |
w.toggle(on) | चालू/बंद स्विच। |
w.center(html) | बीच में, एक बड़ी वैल्यू के लिए। |
w.icon(name) | बिल्ट-इन आइकन में से एक। |
w.esc(text) | टेक्स्ट को एस्केप करता है। जो भी आपका अपना नहीं है, हर चीज़ के लिए इसका इस्तेमाल करें। |
w.text(key, fallback) | घड़ी से एक अनुवाद। |
w.click(selector, fn) | लिसनर जोड़ता है। सिर्फ़ bind के अंदर। |
w.notify(title, text, icon, colour) | घड़ी पर एक सूचना। |
w.refresh() | दोबारा बनाता है, आने वाले एनिमेशन के बिना। |
w.close() | पीछे जाता है, हेडर के तीर की तरह। |
w.toServer(action, data) | सर्वर से पूछता है। एक promise लौटाता है। |
w.id, w.version | आपकी ऐप id और AgencyOS वर्ज़न। |
स्नैपशॉट एक कॉपी है, असली चीज़ तक पहुँच नहीं। घड़ी में कॉन्टैक्ट, संदेश और कार्ड डेटा भी होता है; इनमें से कुछ भी इसमें नहीं है।
4 सर्वर साइड
apps/hello/server.lua
AgencyWatchAction('hello', 'roll', function(src, data)
local sides = tonumber(data and data.sides) or 6
if sides < 2 then sides = 2 end
if sides > 100 then sides = 100 end
return { value = math.random(1, math.floor(sides)) }
end)
w.toServer हमेशा पूरा होता है, { ok: true, data: … } या { ok: false, reason: '…' } के साथ, तब भी जब सर्वर ने कभी जवाब नहीं दिया। आपका ऐप कभी इंतज़ार में अटक नहीं सकता, और कारण हमेशा ऊपरी स्तर पर होता है, चाहे किसी भी तरफ़ ने मना किया हो।
reason | मतलब |
|---|---|
no_pro | Pro एडिशन नहीं है। इसके बिना कस्टम ऐप मौजूद नहीं होते। |
unknown | ऐसा कोई ऐप या ऐसी कोई कार्रवाई रजिस्टर नहीं है। |
too_fast | रेट लिमिट: हर खिलाड़ी के लिए पाँच सेकंड में ज़्यादा से ज़्यादा दस अनुरोध। |
error | आपके हैंडलर ने एरर फेंका। पूरी जानकारी सर्वर कंसोल में है। |
timeout | बारह सेकंड में कोई जवाब नहीं। |
data | अनुरोध एक टेबल नहीं था। |
data में जो आता है वह क्लाइंट से आता है और इच्छा है, तथ्य नहीं। इस्तेमाल से पहले हर वैल्यू जाँचें। जो भी मायने रखता है (पैसा, आइटम, नतीजे), वह सिर्फ़ सर्वर पर होना चाहिए, कहीं और नहीं।
5 स्टाइलिंग
घड़ी के रंग CSS वेरिएबल के रूप में मिलते हैं और वही मानते हैं जो पहनने वाले ने Studio में चुना है। पक्के लिखे रंगों से ऐसा ऐप बनता है जो हरी घड़ी पर भी नीला ही रहता है।
var(--text) var(--text-2) var(--leise)
var(--akzent) var(--gruen) var(--rot) var(--gelb)
var(--karte) var(--karte-hoch) var(--linie)
var(--grund)
अपनी क्लासों के आगे प्रीफ़िक्स लगाएँ। स्क्रीन हर दूसरे ऐप के साथ साझा होती है, और .large नाम की क्लास को जल्दी साथी मिल जाएँगे।
6 बिल्ट-इन आइकन
इनमें से कोई भी app.lua में icon को या w.icon() को दें:
akku auto blitz brief einkauf farben flugzeug gewitter glocke haken helligkeit herz hoch hupe karte karte-pin kein-signal kino kompass kreuz krone lampe laufen lautlos links loeschen minus mobil mond nebel neuladen pause personen pin plus qr raster rechts regen regler runter sanduhr schild schloss schloss-auf schnee schritte signal sonne sp-fall sp-flug sp-ring sp-turm sprechen stoppuhr telefon telefon-aus tempo ton uhr verboten wiedergabe wlan wolke zahnrad
आइकन के नाम जानबूझकर वैसे ही रहते हैं। ये id हैं, लेबल नहीं: खिलाड़ी इन्हें कभी नहीं पढ़ता, और id का नाम बदलने से हर वह ऐप टूट जाता है जो इसे पहले से इस्तेमाल करता है।
📦 घड़ी के साथ एक चलता हुआ उदाहरण आता है
रिसोर्स के अंदर apps/example/ एक पूरा, चलने लायक ऐप है: हिस्से, सर्वर कॉल, एक सूचना और अपना CSS। फ़ोल्डर कॉपी करें, नाम बदलें, और आपके पास ऐसा शुरुआती बिंदु है जो पहले से काम करता है।
इस पेज का छोटा रूप उसके बगल में apps/README.md में है।