Agency-Watch Özel Uygulamalar
Şimdi AgencyOS27 ile: Saate zaten sahip olan herkes için ücretsiz bir güncelleme.

⌚ Agency-Watch için kendi uygulamanızı geliştirin
Saat açıktır. Bir sunucu sahibi; aynı yapı taşlarını, aynı renkleri ve aynı çevirileri kullanarak yerleşik bir uygulama gibi görünen ve davranan bir uygulama ekleyebilir.
Gereksinim: Pro sürümü. Özel uygulamalar yalnızca Agency-Phone sunucuda çalıştığında ve oyuncu buna sahip olduğunda mevcuttur. Pro olmadan kaydedilirler ancak asla teslim edilmezler: arayüz bunları asla öğrenmez, App Store'da görünmezler ve sunucu gönderdikleri her eylemi reddeder. Bu durum üç ayrı yerde kontrol edilir ve kapatılamaz.
| Dosya | Gerekli | Ne işe yarar |
|---|---|---|
apps/<id>/app.lua | evet | Uygulamayı kaydeder: isim, simge, renk, kategori. |
apps/<id>/app.js | evet | Ekran: ne çizdiği ve nasıl tepki verdiği. |
apps/<id>/app.css | hayır | Kendi stiliniz. Yalnızca şu durumda yüklenir: style = true. |
apps/<id>/server.lua | hayır | Uygulamanızın çağırabileceği sunucu mantığı. |
Klasör, tıpkı app id gibi adlandırılmıştır. Saat bunu bu şekilde bulur: app.js ve app.css yol iki kez yazılmadan, çünkü iki kez yazılan yollar er ya da geç birbirinden farklılaşır.
Altındaki her şey apps/ şudur escrow_ignored: diskinizde okunabilir ve düzenlenebilir kalır ve bir watch güncellemesi asla üzerine yazmaz.
1 Uygulamayı kaydedin
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
})
Hatalı bir id değerine sahip, adı olmayan, bilinmeyen bir kategorideki veya şu renkte olmayan bir uygulama: #rrggbb sunucu konsolunda net bir şekilde ve bir gerekçeyle reddedilir. Yarı kayıtlı diye bir durum yoktur: bu tür hatalar yalnızca bir oyuncu tıkladığında ortaya çıkar.
Çalıştır refresh ve restart Agency-Watch dosyalar eklendikten sonra. Başlangıçta izleyici neyin kaydedildiğini bildirir.
2 Ekranı çiz
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 ekran her oluşturulduğunda çalışır, bu nedenle çağrılar arasında durum saklamaz. Yeniden çizimden etkilenmemesi gereken her şey app nesnesinin dışındaki bir değişkende tutulur.
Her iki fonksiyon da bir güvenlik ağı içinde çalışır. Kodunuz hata verirse uygulamanız bir hata satırı gösterir ve saat çalışmaya devam eder; asıl hata F8 konsoluna iletilir.
3 Araç kutusu
w bir saatteki uygulamanın ihtiyaç duyduğu her şeyi barındırır ve fazlasını içermez. Her şeyi yapabilen bir arayüz bir daha asla değiştirilemez, bu nedenle bu arayüz kasıtlı olarak minimal tutulmuştur.
| Ara | Size ne kazandırır |
|---|---|
w.data() | Düz bir anlık görüntü: 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}) | Saatin kendi tarzında bir liste satırı. |
w.section(text) | Bir bölüm başlığı. |
w.card(html) | Bir yüzey. |
w.button(text, attrs) | Bir buton. attrs ham bir nitelik dizesidir, örneğin ' data-roll'. |
w.toggle(on) | Bir açma/kapama anahtarı. |
w.center(html) | Tek bir büyük değer için ortalanmış. |
w.icon(name) | Yerleşik simgelerden biri. |
w.esc(text) | Metni escape edin. Şunun için kullanın: her şey size ait olmayan. |
w.text(key, fallback) | Saatten bir çeviri. |
w.click(selector, fn) | Bir listener bağlayın. Yalnızca içinde bind. |
w.notify(title, text, icon, colour) | Saatte bir bildirim. |
w.refresh() | Giriş animasyonu olmadan yeniden çiz. |
w.close() | Başlıktaki ok gibi geri döner. |
w.toServer(action, data) | Sunucuya sorar. Bir promise döndürür. |
w.id, w.version | Uygulama ID'niz ve AgencyOS sürümü. |
Anlık görüntü bir tanıtıcı değil, bir kopyadır. Saat ayrıca kişileri, mesajları ve kart verilerini de taşır; bunların hiçbiri orada yer almaz.
4 Sunucu tarafı
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 her zaman çözümlenir, şununla: { ok: true, data: … } veya { ok: false, reason: '…' }, sunucu hiç yanıt vermemiş olsa bile. Uygulamanız asla beklemede takılı kalmaz ve hangi taraf reddetmiş olursa olsun neden her zaman en üst düzeyde yer alır.
reason | Anlam |
|---|---|
no_pro | Pro sürümü yok. Özel uygulamalar bu olmadan var olamaz. |
unknown | Böyle bir uygulama veya kayıtlı böyle bir eylem yok. |
too_fast | Rate limit: oyuncu başına beş saniyede en fazla on istek. |
error | Handler bir hata fırlattı. Ayrıntılar sunucu konsolundadır. |
timeout | On iki saniye içinde yanıt yok. |
data | İstek bir tablo değildi. |
Buraya gelen her şey data istemciden gelir ve bir gerçek değil, temenni. Her değeri kullanmadan önce kontrol edin. Önem taşıyan her şey (para, eşyalar, sonuçlar) sunucuda yer almalıdır ve başka hiçbir yerde bulunmamalıdır.
5 Stillendirme
Saatin renkleri CSS değişkenleri olarak mevcuttur ve kullanıcının Studio içinde seçtiği renkleri takip eder. Sabit kodlanmış renkler, yeşil bir saatte mavi kalan bir uygulama ortaya çıkarır.
var(--text) var(--text-2) var(--leise)
var(--akzent) var(--gruen) var(--rot) var(--gelb)
var(--karte) var(--karte-hoch) var(--linie)
var(--grund)
Kendi class'larınıza ön ek ekleyin. Ekran diğer tüm uygulamalarla paylaşılır ve adı şöyle olan bir class: .large arkadaşlar bulacaktır.
6 Dahili simgeler
Bunlardan herhangi birini şuraya iletin: icon içinde app.lua veya şuna: 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
İkon isimleri kasıtlı olarak olduğu gibi bırakılmıştır. Bunlar etiket değil, id'dir: bir oyuncu bunları asla okumaz ve bir id'yi yeniden adlandırmak onu zaten kullanan tüm uygulamaları bozar.
📦 Çalışan bir örnek saatle birlikte gelir
apps/example/ Resource içinde eksiksiz ve çalıştırılabilir bir uygulama yer alır: yapı taşları, bir sunucu çağrısı, bir bildirim ve kendi CSS dosyası. Klasörü kopyalayın, adını değiştirin ve halihazırda çalışan bir başlangıç noktasına sahip olun.
Bu sayfanın kısa bir versiyonu şuradadır: apps/README.md yanında.