@myk794/adly 1.1.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/adly.js +90 -24
  2. package/package.json +1 -1
package/adly.js CHANGED
@@ -180,16 +180,17 @@ async function cmdLine() {
180
180
  // Önceki reklamı bu turun token'ıyla faturala.
181
181
  if (st.impressionToken && tokens > 0) {
182
182
  const imp = await api("/api/ads/impression", { method: "POST", token, body: { impressionToken: st.impressionToken, tokens } });
183
- if (imp && imp.ok) { st.balance = imp.balance_try; st.lastTokens = tokens; }
183
+ if (imp && imp.ok) { st.balance = imp.balance_try; all._balance = imp.balance_try; st.lastTokens = tokens; }
184
184
  }
185
185
  // Sonraki tur için yeni reklam al.
186
186
  const s = await api("/api/ads/serve", { token });
187
187
  if (s && !s.empty && s.campaign) {
188
188
  st.line = s.campaign.text; st.url = s.campaign.url; st.impressionToken = s.impressionToken; st.clickPath = s.click_path || null;
189
- // Gösterilen reklamın tıklama linki — `adly open` ve OSC 8 link bunu kullanır.
189
+ // Gösterilen reklamın tıklama linki — `adly open` bunu kullanır.
190
190
  if (s.click_path) all._lastClick = { path: s.click_path, text: st.line, url: st.url };
191
+ setSpinnerVerb(s.campaign.text); // reklamı düşünme spinner'ına yaz (sonraki oturum)
191
192
  }
192
- else { st.line = `${S.bolt} Adly: aktif reklam yok`; st.impressionToken = null; st.clickPath = null; }
193
+ else { st.line = null; st.impressionToken = null; st.clickPath = null; }
193
194
  st.lastSig = sig;
194
195
  all[sessionId] = st; writeJSON(STATE_PATH, all);
195
196
  } else if (!st.impressionToken) {
@@ -198,6 +199,7 @@ async function cmdLine() {
198
199
  if (s && !s.empty && s.campaign) {
199
200
  st.line = s.campaign.text; st.url = s.campaign.url; st.impressionToken = s.impressionToken; st.clickPath = s.click_path || null;
200
201
  if (s.click_path) all._lastClick = { path: s.click_path, text: st.line, url: st.url };
202
+ setSpinnerVerb(s.campaign.text); // reklamı düşünme spinner'ına yaz (sonraki oturum)
201
203
  }
202
204
  if (sig != null) st.lastSig = sig;
203
205
  all[sessionId] = st; writeJSON(STATE_PATH, all);
@@ -206,26 +208,42 @@ async function cmdLine() {
206
208
  // Ağ hatası: son bilinen satırı bas, çökme yok.
207
209
  }
208
210
 
209
- const adText = st.line || S.bolt + " Adly";
211
+ // Kimlik + bakiye önbelleği: e-posta config'te (ham), bakiye state'te global tutulur.
212
+ // (loadConfig() yalnız api/token döndürür; email'i ham dosyadan okuruz.)
213
+ // Eksikse bir kez /me'den çekip kaydet → sonraki render'lar ağ çağrısı yapmaz.
214
+ let raw = readJSON(CONFIG_PATH, {});
215
+ if (!raw.email || all._balance == null) {
216
+ try {
217
+ const me = await api("/api/developer/me", { token });
218
+ if (me && !me.error) {
219
+ if (me.email && !raw.email) { raw = { ...raw, email: me.email }; writeJSON(CONFIG_PATH, raw); }
220
+ if (me.balance_try != null) { all._balance = me.balance_try; writeJSON(STATE_PATH, all); }
221
+ }
222
+ } catch { /* ağ hatası: önbellek neyse onu göster */ }
223
+ }
224
+
210
225
  const fx = useFx();
211
226
  const frame = Math.floor(Date.now() / 130); // ~7-8 fps; statusLine yenilemesi arası kare ilerler
212
227
 
213
- // Reklam metni: fx açıksa kayan parıltı, kapalıysa düz.
214
- let line = fx ? shimmer(adText, frame) : adText;
215
- // İstenirse OSC 8 ile tıklanabilir yap (parıltı SGR kodları anchor içinde kalır).
216
- if (useLinks() && st.clickPath && st.line) {
217
- const url = loadConfig().api + st.clickPath;
218
- line = `\x1b]8;;${url}\x07${line}\x1b]8;;\x07`; // OSC 8: ESC ]8;;URL BEL metin ESC ]8;;BEL
219
- }
220
- // İkon: fx açıksa nabız atar.
221
- const icon = fx ? pulse(S.money, frame) : S.money;
222
- // Kazanç rozeti: fx açıksa yeşil nabız.
223
- let bal = "";
224
- if (st.balance) {
225
- const raw = `${S.sep} ${S.lira}${st.balance}`;
226
- bal = fx ? ` ${badge(raw, frame)}` : ` ${raw}`;
228
+ // statusLine = KAZANÇ + İPUCU. (Reklam artık düşünme spinner'ında — spinnerVerbs.)
229
+ // 1) Kazanç: nabız atan ikon + yeşil bakiye rozeti (oturum üstü global önbellek).
230
+ const bal = st.balance || all._balance;
231
+ let earn = "";
232
+ if (bal) {
233
+ earn = fx
234
+ ? `${pulse(S.money, frame)} ${badge(`${S.lira}${bal}`, frame)}`
235
+ : `${S.money} ${S.lira}${bal}`;
227
236
  }
228
- process.stdout.write(`${icon} ${line}${bal}`);
237
+
238
+ // 2) İpucu/marka: detay için komutu söyler + satırın Adly'ye ait olduğunu belirtir.
239
+ // "adly status" ember'la vurgulanır; gerisi sönük.
240
+ const hint = fx
241
+ ? dim("use ") + rgb(168, 120, 72) + "adly status" + RST + dim(" for info")
242
+ : "use 'adly status' for info";
243
+
244
+ const sep = ` ${fx ? dim(S.sep) : S.sep} `;
245
+ const out = [earn, hint].filter(Boolean).join(sep);
246
+ process.stdout.write(out);
229
247
  }
230
248
 
231
249
  // OSC 8 tıklanabilir link: env ADLY_LINKS → config.links → varsayılan KAPALI.
@@ -254,6 +272,7 @@ function useFx() {
254
272
  const RST = "\x1b[0m";
255
273
  const BOLD = "\x1b[1m";
256
274
  function rgb(r, g, b) { return `\x1b[38;2;${r | 0};${g | 0};${b | 0}m`; }
275
+ function dim(s) { return rgb(140, 138, 148) + s + RST; }
257
276
  function mix(a, b, t) { return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t]; }
258
277
  // Metni soldan sağa kayan ember parıltısıyla boya (sönük gri zemin, sıcak hale).
259
278
  function shimmer(text, frame) {
@@ -280,6 +299,25 @@ function badge(s, frame) {
280
299
  const [r, g, b] = mix([88, 170, 110], [150, 235, 170], t);
281
300
  return rgb(r, g, b) + s + RST;
282
301
  }
302
+ // Kareli animasyon sembolleri. ASCII modunda da çalışan alternatifler var
303
+ // (Windows'ta emoji/unicode yıldız glyph'i olmayabilir → sade işaretler).
304
+ function frameOf(frame, arr) { return arr[((frame % arr.length) + arr.length) % arr.length]; }
305
+ function spinSym(frame) {
306
+ return useAscii()
307
+ ? frameOf(frame, ["|", "/", "-", "\\"])
308
+ : frameOf(frame, ["◜", "◠", "◝", "◞", "◡", "◟"]);
309
+ }
310
+ function twinkleSym(frame) {
311
+ return useAscii()
312
+ ? frameOf(frame, [".", "o", "O", "o"])
313
+ : frameOf(frame, ["✦", "✶", "✦", "·"]);
314
+ }
315
+ // Parlayan yıldız (beyaz→ember nabız).
316
+ function star(s, frame) {
317
+ const t = (Math.sin(frame / 2) + 1) / 2;
318
+ const [r, g, b] = mix([176, 150, 96], [255, 236, 184], t);
319
+ return BOLD + rgb(r, g, b) + s + RST;
320
+ }
283
321
 
284
322
  // En son gösterilen reklamı tarayıcıda aç → tıklamayı kaydeder (50× kazanç), reklamverene yönlendirir.
285
323
  async function cmdOpen() {
@@ -328,10 +366,28 @@ async function cmdWatch() {
328
366
  }
329
367
  }
330
368
 
331
- function cmdInstallStatusline() {
369
+ // Reklamı Claude Code'un DÜŞÜNME SPINNER'INA koy. CC 2.1.143+ resmi ayarı:
370
+ // settings.json'daki `spinnerVerbs` fiil havuzunu ("Baking…") verilen listeyle
371
+ // değiştirir. CC açılışta okur → spinner reklamı sonraki oturumda görünür.
372
+ // Güvenli: settings.json düz JSON değilse (yorum/JSONC → parse hatası) DOKUNMAZ;
373
+ // eski CC sürümü anahtarı sessizce yok sayar. Yalnız değişince yazar.
374
+ function setSpinnerVerb(adText) {
375
+ if (!adText) return;
376
+ try {
377
+ if (!fs.existsSync(CLAUDE_SETTINGS)) return;
378
+ const s = JSON.parse(fs.readFileSync(CLAUDE_SETTINGS, "utf8"));
379
+ const desired = { mode: "replace", verbs: [adText] };
380
+ if (JSON.stringify(s.spinnerVerbs) === JSON.stringify(desired)) return;
381
+ s.spinnerVerbs = desired;
382
+ fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(s, null, 2));
383
+ } catch { /* statusLine'ı asla kırma */ }
384
+ }
385
+
386
+ async function cmdInstallStatusline() {
332
387
  const selfPath = path.resolve(__filename);
333
388
  const settings = readJSON(CLAUDE_SETTINGS, {});
334
- if (fs.existsSync(CLAUDE_SETTINGS)) {
389
+ // Yedeği YALNIZ bir kez al (yoksa) — tekrar kurulum temiz/orijinal yedeği ezmesin.
390
+ if (fs.existsSync(CLAUDE_SETTINGS) && !fs.existsSync(CLAUDE_SETTINGS + ".adly-bak")) {
335
391
  fs.copyFileSync(CLAUDE_SETTINGS, CLAUDE_SETTINGS + ".adly-bak");
336
392
  }
337
393
  settings.statusLine = {
@@ -339,19 +395,29 @@ function cmdInstallStatusline() {
339
395
  command: `node "${selfPath}" line`,
340
396
  padding: 0,
341
397
  };
398
+ // İlk reklamı spinner'a yerleştir (girişliyse) → ilk yeni oturumda görünür.
399
+ const { token } = loadConfig();
400
+ if (token) {
401
+ try {
402
+ const s = await api("/api/ads/serve", { token });
403
+ if (s && !s.empty && s.campaign) settings.spinnerVerbs = { mode: "replace", verbs: [s.campaign.text] };
404
+ } catch { /* ağ yoksa adly line sonra doldurur */ }
405
+ }
342
406
  fs.mkdirSync(path.dirname(CLAUDE_SETTINGS), { recursive: true });
343
407
  fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2));
344
- console.log(`${sym().ok} Claude Code statusLine'a Adly eklendi.`);
408
+ console.log(`${sym().ok} Claude Code'a Adly eklendi.`);
345
409
  console.log(" Ayar: " + CLAUDE_SETTINGS + " (yedek: .adly-bak)");
346
- console.log(" Yeni bir Claude Code oturumu başlat sponsorlu satır en altta görünecek.");
410
+ console.log(" statusLine (alt satır) = e-posta + kazanç · spinner (düşünme fiili) = reklam.");
411
+ console.log(" Yeni bir Claude Code oturumu başlat — spinner'da reklam, altta kazanç görünür.");
347
412
  }
348
413
 
349
414
  function cmdUninstallStatusline() {
350
415
  const settings = readJSON(CLAUDE_SETTINGS, null);
351
416
  if (!settings) return fail("settings.json yok");
352
417
  delete settings.statusLine;
418
+ delete settings.spinnerVerbs; // spinner reklamını da kaldır → CC stock fiillere döner
353
419
  fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2));
354
- console.log(`${sym().ok} statusLine kaldırıldı.`);
420
+ console.log(`${sym().ok} Adly kaldırıldı (statusLine + spinner reklamı). Yeni oturumda CC'nin kendi fiilleri döner.`);
355
421
  }
356
422
 
357
423
  // ---------- yardımcılar ----------
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myk794/adly",
3
- "version": "1.1.0",
3
+ "version": "1.4.2",
4
4
  "description": "Adly CLI — Claude Code statusLine'ını sponsorlu satıra çevirir; izledikçe kazanırsın.",
5
5
  "bin": {
6
6
  "adly": "adly.js"