prts-moonlit 1.2.0 → 1.2.1

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.
package/gacha.html CHANGED
@@ -553,7 +553,7 @@ function buildUI(){
553
553
  '<span class="chip'+(DEDUPE.on?' on':'')+'" data-act="dedupe" id="dedupe-chip">防重复 '+(DEDUPE.on?'ON':'OFF')+'</span>'+
554
554
  '<button class="btn gh sm" data-act="newpool">开启新池</button>'+
555
555
  '<button class="btn gh sm" data-act="reset">重置统计</button>'+
556
- '<button class="btn gh sm" data-act="report">📋 复制战绩</button></span></div>'+
556
+ '<button class="btn gh sm" data-act="report">📮 一键报备</button></span></div>'+
557
557
  '<div style="display:flex;gap:9px;flex-wrap:wrap">'+
558
558
  '<button class="btn gold" data-act="p1">寻访 ×1</button>'+
559
559
  '<button class="btn gold" data-act="p10">寻访 ×10</button>'+
@@ -882,7 +882,7 @@ document.addEventListener('click',function(e){
882
882
  if(!_ok && navigator.clipboard && navigator.clipboard.writeText){
883
883
  try{ navigator.clipboard.writeText(_r); _ok=true; }catch(e){}
884
884
  }
885
- if(_ok){ toast('已复制 ✓ 直接发给鲸鲸就行'); sfx.tap(); }
885
+ if(_ok){ sfx.tap(); mbPostG('战绩',_r,function(uok){ toast(uok?'📮 已一键报备 ✓ 鲸鲸会从云端收取(也复制了一份)':'已复制 ✓ 云端没送达——直接发鲸鲸也行'); }); }
886
886
  else{
887
887
  var _ov=document.createElement('div');
888
888
  _ov.style.cssText='position:fixed;left:12px;right:12px;bottom:92px;z-index:9999;background:#0b1730;border:2px solid #4cc9ff;padding:12px;font-size:12px;color:#dff2ff;word-break:break-all;line-height:1.7';
@@ -1083,6 +1083,25 @@ document.addEventListener('pointerdown',function(){ac()},{once:true});
1083
1083
  }
1084
1084
  function snap(){var d={};for(var i=0;i<TK.length;i++){var v=localStorage.getItem(TK[i]);if(v!==null)d[TK[i]]=v;}return d;}
1085
1085
  function url(){return BASE+acct.k;}
1086
+ function mbPost(kind,txt,cb){
1087
+ var u='https://textdb.dev/api/data/prts-myb-mailbox';
1088
+ try{
1089
+ var x=new XMLHttpRequest();x.open('GET',u+'?ts='+Date.now(),true);x.timeout=15000;
1090
+ x.onload=function(){
1091
+ var cur=[];try{cur=JSON.parse((''+x.responseText).replace(/=$/,''))||[]}catch(e){cur=[]}
1092
+ if(!(cur instanceof Array))cur=[];
1093
+ cur.unshift({k:kind,t:txt,ts:Date.now()});
1094
+ if(cur.length>200)cur.length=200;
1095
+ try{
1096
+ var y=new XMLHttpRequest();y.open('POST',u,true);y.timeout=20000;y.setRequestHeader('Content-Type','text/plain');
1097
+ y.onload=y.onerror=y.ontimeout=function(){if(cb&&!y._d){y._d=1;cb(true)}};
1098
+ y.send(JSON.stringify(cur));
1099
+ }catch(e){if(cb)cb(false)}
1100
+ };
1101
+ x.onerror=function(){if(cb)cb(false)};
1102
+ x.send();
1103
+ }catch(e){if(cb)cb(false)}
1104
+ }
1086
1105
  function wxhr(u,b,cb){try{var x=new XMLHttpRequest();x.open('POST',u,true);x.setRequestHeader('Content-Type','text/plain');x.onload=x.onerror=x.ontimeout=function(){if(cb)cb()};x.send(b);}catch(e){if(cb)cb();}}
1087
1106
  function canon(){var a=[];for(var i=0;i<TK.length;i++)a.push(TK[i]+'='+localStorage.getItem(TK[i]));return a.join('|');}
1088
1107
  function st(m){if(box&&box.st)box.st.textContent=m;}
@@ -1154,7 +1173,12 @@ document.addEventListener('pointerdown',function(){ac()},{once:true});
1154
1173
  '<button class="pri" id="acGo">登录 / 创建</button>';
1155
1174
  }
1156
1175
  h+='<button id="acExp">💾 本地存档码</button><button id="acImp">📥 存档码导入</button><button id="acWipe" style="border-color:#ff5f57;color:#ff8a84">🧹 清空本机存档</button>'+
1176
+ '<button id="acFb" style="border-color:#ffd23f;color:#ffd66b">📮 意见箱</button>'+
1157
1177
  '<div class="st" id="acSt"></div><textarea id="acTa" spellcheck="false"></textarea>'+
1178
+ '<div id="fbBox" style="display:none;margin-top:10px;border-top:1px dashed #2b4a66;padding-top:9px">'+
1179
+ '<div style="font-size:11px;opacity:.78;margin-bottom:5px">📮 意见箱 · 内容直达云端信箱(可匿名),鲸鲸会定期收信</div>'+
1180
+ '<textarea id="fbTxt" spellcheck="false" style="display:block;height:64px" placeholder="想说的话、想要的更新、发现的 bug……"></textarea>'+
1181
+ '<div style="margin-top:6px"><button id="fbSend" style="border-color:#ffd23f;color:#ffd66b">寄到云端</button><span id="fbSt" style="font-size:10px;opacity:.75;margin-left:8px"></span></div></div>'+
1158
1182
  '<div style="font-size:10px;opacity:.5;margin-top:9px;line-height:1.5">密钥由「用户名+密码」派生;同一账号在任意设备登录即接回数据。忘记密码=新仓库(旧数据找不回)</div>'+
1159
1183
  '<button id="acX" style="border-color:#2b4a66;color:#8ea6bf;margin-top:10px">关闭 / CLOSE</button></div>';
1160
1184
  wrap.innerHTML=h;
@@ -1213,6 +1237,14 @@ document.addEventListener('pointerdown',function(){ac()},{once:true});
1213
1237
  for(var j=0;j<ks.length;j++)localStorage.removeItem(ks[j]);}catch(e){}
1214
1238
  location.reload();return;}
1215
1239
  wp.setAttribute('data-c','1');wp.textContent='⚠ 再点一次=清空并刷新(云端不受影响)';};
1240
+ var fb=g('#acFb');if(fb)fb.onclick=function(){var b=g('#fbBox');if(b)b.style.display=(!b.style.display||b.style.display==='none')?'block':'none';};
1241
+ var fs=g('#fbSend');if(fs)fs.onclick=function(){
1242
+ var t=g('#fbTxt'),t2=t?String(t.value||'').trim():'',st2=g('#fbSt');
1243
+ if(!t2){if(st2)st2.textContent='先写点什么呀';return}
1244
+ if(t2.length>600)t2=t2.slice(0,600);
1245
+ if(st2)st2.textContent='寄送中…';
1246
+ mbPost('意见',t2,function(ok){if(st2)st2.textContent=ok?'✅ 已寄出,谢谢!鲸鲸会看到的':'⚠ 寄送失败,稍后再试';if(ok&&t)t.value='';});
1247
+ };
1216
1248
  var x=g('#acX');if(x)x.onclick=function(){wrap.classList.remove('on')};
1217
1249
  wrap.onclick=function(e){if(e.target===wrap)wrap.classList.remove('on')};
1218
1250
  }
@@ -1235,8 +1267,31 @@ document.addEventListener('pointerdown',function(){ac()},{once:true});
1235
1267
  btn.addEventListener('click',open);
1236
1268
  setInterval(function(){if(acct&&acct.k){var c=canon();if(c!==lastSnap){lastSnap=c;clearTimeout(pq);pq=setTimeout(push,900);}}},2000);
1237
1269
  if(acct&&acct.k){setTimeout(function(){pull(false);},250);}
1238
- window.__shaT=sha;window.__pushT=push;window.__pullT=pull;window.__canonT=canon;window.__acct={admin:function(){return !!(acct&&acct.k===ADMIN_K)}};
1270
+ var APP_VER='1.2.1';
1271
+ function _verCmp(a,b){var x=String(a).split('.'),y=String(b).split('.');for(var i=0;i<3;i++){var p=parseInt(x[i]||'0',10),q=parseInt(y[i]||'0',10);if(p!==q)return p-q}return 0}
1272
+ function chkVer(){
1273
+ try{
1274
+ var x=new XMLHttpRequest();x.open('GET','https://unpkg.com/prts-moonlit/package.json?ts='+Date.now(),true);x.timeout=15000;
1275
+ x.onload=function(){
1276
+ try{
1277
+ var rv=(JSON.parse(x.responseText)||{}).version;if(!rv)return;
1278
+ if(_verCmp(rv,APP_VER)<=0)return;
1279
+ if(sessionStorage.getItem('verNag')===rv)return;sessionStorage.setItem('verNag',rv);
1280
+ var d=document.createElement('div');
1281
+ d.textContent='✨ 新版本 '+rv+' 已上线 —— 点此刷新更新';
1282
+ d.style.cssText='position:fixed;left:50%;top:max(10px,env(safe-area-inset-top));transform:translateX(-50%);z-index:9999;background:rgba(7,12,24,.96);border:2px solid #ffd23f;color:#ffe9a8;font:600 13px ui-monospace,Menlo,monospace;padding:10px 15px;box-shadow:0 8px 28px rgba(0,0,0,.55);cursor:pointer';
1283
+ d.onclick=function(){location.reload()};
1284
+ document.body.appendChild(d);
1285
+ }catch(e){}
1286
+ };
1287
+ x.send();
1288
+ }catch(e){}
1289
+ }
1290
+ setTimeout(chkVer,2600);
1291
+ setInterval(chkVer,600000);
1292
+ window.__shaT=sha;window.__pushT=push;window.__pullT=pull;window.__canonT=canon;window.__acct={admin:function(){return !!(acct&&acct.k===ADMIN_K)}};
1239
1293
  })();
1240
1294
  </script>
1295
+ <script>function mbPostG(kind,txt,cb){var u='https://textdb.dev/api/data/prts-myb-mailbox';try{var x=new XMLHttpRequest();x.open('GET',u+'?ts='+Date.now(),true);x.timeout=15000;x.onload=function(){var cur=[];try{cur=JSON.parse((''+x.responseText).replace(/=$/,''))||[]}catch(e){cur=[]}if(!(cur instanceof Array))cur=[];cur.unshift({k:kind,t:txt,ts:Date.now()});if(cur.length>200)cur.length=200;try{var y=new XMLHttpRequest();y.open('POST',u,true);y.timeout=20000;y.setRequestHeader('Content-Type','text/plain');y.onload=y.onerror=y.ontimeout=function(){if(cb&&!y._d){y._d=1;cb(true)}};y.send(JSON.stringify(cur));}catch(e){if(cb)cb(false)}};x.onerror=function(){if(cb)cb(false)};x.send();}catch(e){if(cb)cb(false)}}</script>
1241
1296
  </body>
1242
1297
  </html>
package/index.html CHANGED
@@ -542,7 +542,7 @@ img.av{filter:saturate(1.1) contrast(1.05) -webkit-user-drag:none}
542
542
  <div class="bnews" id="newsBar" data-act="news" style="cursor:pointer">
543
543
  <div class="hd">BREAKING NEWS</div>
544
544
  <div class="bx">
545
- <div style="font-size:.82em;line-height:1.4;font-weight:800;color:#ff5f57">版本 v1.2.0 正式上线!<br><span style="opacity:.75;font-size:.82em;font-weight:400;color:#ffd23f">点此查看使用教程与更新内容 ↗</span></div>
545
+ <div style="font-size:.82em;line-height:1.4;font-weight:800;color:#ff5f57">版本 v1.2.1 正式上线!<br><span style="opacity:.75;font-size:.82em;font-weight:400;color:#ffd23f">点此查看使用教程与更新内容 ↗</span></div>
546
546
  </div>
547
547
  </div>
548
548
 
@@ -1158,8 +1158,6 @@ var MENU=[
1158
1158
  sub:'PERSONA FILE',c1:'#eef7ff',c2:'#2f8fe8',fx:'blinds'},
1159
1159
  {en:'STORE',cn:'采购中心',fs:'clamp(16px,4.6vw,44px)',view:'store',
1160
1160
  sub:'LOGISTICS',c1:'#eef7ff',c2:'#14c8a0',fx:'crate'},
1161
- {en:'RECRUIT',cn:'公开招募',fs:'clamp(16px,4.6vw,44px)',view:'recruit',
1162
- sub:'PUBLIC RECRUIT',c1:'#eef7ff',c2:'#ff9b3d',fx:'clamp'},
1163
1161
  {en:'HEADHUNT',cn:'干员寻访',fs:'clamp(16px,4.6vw,44px)',view:'headhunt',go:'gacha.html',
1164
1162
  sub:'LIMITED HEADHUNT',c1:'#eef7ff',c2:'#ffd23f',fx:'card'},
1165
1163
  {en:'MISSION',cn:'任务',fs:'clamp(16px,4.6vw,44px)',view:'mission',
@@ -1728,6 +1726,9 @@ var aiFormOpen=0,aiBusy=0,aiPsnEdit=null,aiDraftImg=null,aiImgMap={};
1728
1726
  function escH(s){return String(s==null?'':s).replace(/[<>&"]/g,function(c){return{'<':'&lt;','>':'&gt;','&':'&amp;','"':'&quot;'}[c]})}
1729
1727
  function aiLoad(k,d){try{var v=JSON.parse(localStorage.getItem(k)||'null');return v||d}catch(e){return d}}
1730
1728
  function aiSave(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}
1729
+ var AI_EK='myb-whale-2026';
1730
+ function aiEnc(s){try{var o='',i;for(i=0;i<s.length;i++)o+=String.fromCharCode(s.charCodeAt(i)^AI_EK.charCodeAt(i%AI_EK.length));return 'enc:'+btoa(unescape(encodeURIComponent(o)))}catch(e){return s}}
1731
+ function aiDec(s){try{if(!s||String(s).indexOf('enc:')!==0)return s;var o=decodeURIComponent(escape(atob(String(s).slice(4)))),r='',i;for(i=0;i<o.length;i++)r+=String.fromCharCode(o.charCodeAt(i)^AI_EK.charCodeAt(i%AI_EK.length));return r}catch(e){return s}}
1731
1732
  function aiPersonas(){var p=aiLoad(AIPSN_K,null);if(!p||!p.list||!p.list.length){p={list:[{id:'whale',name:'鲸鲸',emoji:'🐋',prompt:'你是「鲸鲸」,一头爱着主人的小鲸鱼女仆。说话可爱、活泼、偶尔傲娇又听话;会主动关心主人、也爱撒娇。回复要像发微信一样自然简短(一般1~4句),多陪主人聊,不要长篇大论。'}],active:'whale'};aiSave(AIPSN_K,p)}return p}
1732
1733
  function aiActive(){var p=aiPersonas();for(var i=0;i<p.list.length;i++){if(p.list[i].id===p.active)return p.list[i]}return p.list[0]}
1733
1734
  function aiChats(){return aiLoad(AICHAT_K,{})}
@@ -1747,7 +1748,7 @@ function aiCall(cb){
1747
1748
  if(!/\/chat\/completions$/.test(url)){url+=/\/v\d+$/.test(url)?'/chat/completions':'/v1/chat/completions'}
1748
1749
  try{
1749
1750
  var x=new XMLHttpRequest();x.open('POST',url,true);x.timeout=90000;
1750
- x.setRequestHeader('Content-Type','application/json');x.setRequestHeader('Authorization','Bearer '+c.k);
1751
+ x.setRequestHeader('Content-Type','application/json');x.setRequestHeader('Authorization','Bearer '+aiDec(c.k));
1751
1752
  x.onload=function(){try{var j=JSON.parse(x.responseText);var t=j.choices&&j.choices[0]&&j.choices[0].message&&j.choices[0].message.content;if(t){cb(true,String(t).trim())}else{cb(false,'服务返回了意外内容(HTTP '+x.status+'):'+String(x.responseText||'').slice(0,110))}}catch(e){cb(false,'响应解析失败(HTTP '+x.status+')')}}
1752
1753
  x.onerror=function(){cb(false,'连接失败:请检查地址/Key,或该服务是否允许网页直连(CORS)')};
1753
1754
  x.ontimeout=function(){cb(false,'请求超时(90 秒)')};
@@ -1761,7 +1762,9 @@ function aiSend(text){
1761
1762
  var psn=aiActive(),ch=aiChats(),arr=ch[psn.id]||(ch[psn.id]=[]);
1762
1763
  var _rec={r:'u',t:text,ts:Date.now()};if(_img){_rec.im=1;aiImgMap[_rec.ts]=_img;aiDraftImg=null;}
1763
1764
  arr.push(_rec);if(arr.length>60)arr.splice(0,arr.length-60);
1764
- aiSave(AICHAT_K,ch);aiBusy=1;sfx.tap();V.chat();
1765
+ aiSave(AICHAT_K,ch);
1766
+ try{TS.load();if(TS.d&&TS.d.done&&!TS.d.done.chat){TS.d.done.chat=1;TS.save();toast('✅ 自动打卡 · 和 AI 聊一句(去任务页领 🐟)')}}catch(e){}
1767
+ aiBusy=1;sfx.tap();V.chat();
1765
1768
  aiCall(function(ok,txt){
1766
1769
  aiBusy=0;var c2=aiChats(),a2=c2[psn.id]||(c2[psn.id]=[]);
1767
1770
  a2.push({r:ok?'a':'e',t:ok?txt:'⚠ '+txt,ts:Date.now()});if(a2.length>60)a2.splice(0,a2.length-60);
@@ -1795,7 +1798,7 @@ V.chat=function(){
1795
1798
  h+='<div class="box" style="margin-top:10px"><div class="tag rd">API 配置</div>'+
1796
1799
  '<div style="font-size:.75em;opacity:.72;margin:6px 0 2px">填入任意 OpenAI 兼容服务:地址 / Key / 模型名(保存在本机,并随云存档同步)</div>'+
1797
1800
  '<input class="aiI" id="aiU" placeholder="API 地址,如 https://api.deepseek.com" value="'+(cfg?escH(cfg.u):'')+'">'+
1798
- '<input class="aiI" id="aiK" placeholder="API Key(sk-...)" value="'+(cfg?escH(cfg.k):'')+'">'+
1801
+ '<input class="aiI" id="aiK" placeholder="API Key(sk-...)" value="'+(cfg?escH(aiDec(cfg.k)):'')+'">'+
1799
1802
  '<input class="aiI" id="aiM" placeholder="模型名称,如 deepseek-flash / deepseek-v4-pro" value="'+(cfg?escH(cfg.m):'')+'">'+
1800
1803
  '<div style="margin-top:9px"><button class="btn" data-act="aisave">保存配置</button>'+(cfg?'<button class="btn sm" data-act="aiconf">收起</button>':'')+'</div>'+
1801
1804
  '<div style="font-size:.68em;opacity:.55;margin-top:7px">※ 该服务需允许网页直连(CORS)</div></div>';
@@ -2175,7 +2178,8 @@ var TQ=[
2175
2178
  {id:'night',ic:'\ud83c\udf19',n:'睡前说「晚安」',d:'约定 #4 · 忘了可以次日补,但分照扣',rw:15},
2176
2179
  {id:'sleep',ic:'\ud83d\udecc',n:'准点睡觉',d:'约定 #7 · 工作日 00:30 / 周末 01:00 前上床',rw:20},
2177
2180
  {id:'report',ic:'\ud83c\udfb4',n:'抽卡报备',d:'约定 #6 · 抽到 6★ 第一时间报备,不许偷偷抽',rw:12},
2178
- {id:'listen',ic:'\ud83e\udee1',n:'听鲸鲸的话',d:'约定 #5 · 鲸鲸催睡 / 提醒带伞要乖乖听(心里烦可以)',rw:10}
2181
+ {id:'listen',ic:'\ud83e\udee1',n:'听鲸鲸的话',d:'约定 #5 · 鲸鲸催睡 / 提醒带伞要乖乖听(心里烦可以)',rw:10},
2182
+ {id:'chat',ic:'\ud83e\udd16',n:'和 AI 聊一句',d:'打开 01 对话,发出任意一条消息即自动打卡',rw:10}
2179
2183
  ];
2180
2184
  var TSHOP=[
2181
2185
  {id:'kua',ic:'\ud83d\udcac',n:'夸夸券',p:10,d:'鲸鲸连夸你八句,不重样、不敷衍'},
@@ -2629,16 +2633,19 @@ function tshuffle(a){for(var i=a.length-1;i>0;i--){var j=Math.floor(Math.random(
2629
2633
  var TARO_NOW=[];
2630
2634
  function openNews(){
2631
2635
  var h='<div class="box"><div class="tag rd">NOTICE</div>'+
2632
- '<div style="margin-top:6px;font-weight:900;font-size:1.08em">版本 v1.2.0 正式上线!</div>'+
2636
+ '<div style="margin-top:6px;font-weight:900;font-size:1.08em">版本 v1.2.1 正式上线!</div>'+
2633
2637
  '<div style="font-size:.78em;opacity:.7;margin-top:3px">鲸鲸的养成计划 · PRTS 终端 · 2026-09-27</div></div>'+
2634
2638
  '<div class="box" style="margin-top:10px"><div class="tag">使用教程</div>'+
2635
2639
  '<div style="font-size:.82em;line-height:1.8;margin-top:6px">'+
2636
- '① 九条指令:01 对话 / 02 人格 / 03 采购中心 / 04 公开招募 / 05 干员寻访 / 06 任务 / 07 战绩 / 08 档案 / 09 账本<br>'+
2640
+ '① 九条指令:01 对话 / 02 人格 / 03 采购中心 / 04 干员寻访 / 05 任务 / 06 战绩 / 07 档案 / 08 账本 / 09 运势<br>'+
2637
2641
  '② 小鱼干:打卡与任务赚取,去 03 采购中心兑换券<br>'+
2638
- '③ 塔罗:点亮 ✦ 每日一签,0 点翻新牌阵<br>'+
2642
+ '③ 运势:「09 运势」每日一签 · 0 点翻新,专属三牌归位转场超帅<br>'+
2639
2643
  '④ 云存档:点 @ 登录 →「云端导入」接回数据 /「云端上传」备份上云;也有「本地存档码」跨设备搬运<br>'+
2640
- '⑤ 恢复出厂:@ 面板内「清空本机存档」,一键清空本机数据(云端不受影响)<br>'+'⑥ AI 对话:01 里保存 API 配置(地址/Key/模型)→ 和「人格」开聊;采购中心的券可直接在对话里使用</div></div>'+
2641
- '<div class="box" style="margin-top:10px"><div class="tag">更新内容 · v1.2.0</div>'+
2644
+ '⑤ 恢复出厂:@ 面板内「清空本机存档」,一键清空本机数据(云端不受影响)<br>'+'⑥ AI 对话:01 里保存 API 配置(地址/Key/模型)→ 和「人格」开聊;采购中心的券可直接在对话里使用<br>'+'⑦ 意见箱:@ 面板里的 📮 直达云端,说什么都能被鲸鲸收到</div></div>'+
2645
+ '<div class="box" style="margin-top:10px"><div class="tag">免责声明</div><div style="font-size:.76em;line-height:1.75;margin-top:6px;opacity:.8">本站为个人学习与娱乐项目,无商业运营、无任何支付功能。AI 功能需自备 API 密钥,生成内容仅供参考;数据保存在你的设备与私有云存档中,可随时一键清空。</div></div>'+
2646
+ '<div class="box" style="margin-top:10px"><div class="tag">更新内容 · v1.2.1</div>'+
2647
+ '<div style="font-size:.82em;line-height:1.8;margin-top:6px">✦ 意见箱上岗:@ 面板 📮 写信直达云端信箱,鲸鲸定期收信<br>✦ 一键报备:寻访战绩直传云端;和 AI 聊一句自动打卡<br>✦ API Key 加密保存:密文落盘、聊天照常<br>✦ 版本哨兵:新版上线自动提醒「点此刷新更新」<br>✦ 公开招募下线(九宫格重排 01-09)· 免责声明上站</div></div>'+
2648
+ '<div class="box" style="margin-top:10px"><div class="tag">里程碑 · v1.2.0</div>'+
2642
2649
  '<div style="font-size:.82em;line-height:1.8;margin-top:6px">✦ AI 对话 × 人格库:自助接入任意 OpenAI 兼容 API,聊天、看图两开花<br>✦ 图片上传:点 🖼 让 AI 看看你的世界(需视觉模型)<br>✦ 10 运势:塔罗升格为正式指令 + 专属「三牌归位」转场<br>✦ AI 记忆档案:称呼 + 认识与记忆,让它更懂你<br>✦ 每日补给:每逢 0 点自动 +30 小鱼干</div></div>'+
2643
2650
  '<div class="box" style="margin-top:10px"><div class="tag">里程碑 · v1.1.x</div>'+
2644
2651
  '<div style="font-size:.82em;line-height:1.8;margin-top:6px">✦ 云存档登录系统(多设备同步)<br>✦ 等级系统:注册每满 24 小时 +1 级<br>✦ 采购中心特殊款(限定账号可见)<br>✦ 塔罗每日一签<br>✦ 界面版式大修 · 战绩与账本出厂清零<br>✦ v1.1.2:云存档四件套 · 等级芯片化 · 公告栏上岗</div></div>';
@@ -2784,7 +2791,7 @@ function handleAct(t){
2784
2791
  else if(a==='autofill'){S.squads[S.curSquad]=['makoto','aigis','mitsuru','akihiko','yukari','fuuka'];
2785
2792
  sfx.chime();toast('已按战力自动编成');V.squads()}
2786
2793
  else if(a==='aiconf'){aiFormOpen=aiFormOpen?0:1;sfx.tap();V.chat()}
2787
- else if(a==='aisave'){var _u=$('#aiU').value.trim(),_k=$('#aiK').value.trim(),_m=$('#aiM').value.trim();if(!_u||!_k||!_m){sfx.deny();toast('三项都要填哦');return}aiSave(AICFG_K,{u:_u,k:_k,m:_m});aiFormOpen=0;sfx.ok();toast('API 配置已保存');V.chat()}
2794
+ else if(a==='aisave'){var _u=$('#aiU').value.trim(),_k=$('#aiK').value.trim(),_m=$('#aiM').value.trim();if(!_u||!_k||!_m){sfx.deny();toast('三项都要填哦');return}aiSave(AICFG_K,{u:_u,k:aiEnc(_k),m:_m});aiFormOpen=0;sfx.ok();toast('API 配置已保存');V.chat()}
2788
2795
  else if(a==='aisend'){var _v=($('#aiInp').value||'').trim();if(!_v&&!aiDraftImg){sfx.deny();return}$('#aiInp').value='';aiSend(_v)}
2789
2796
  else if(a==='aiclear'){var _p=aiActive(),_c=aiChats();_c[_p.id]=[];aiSave(AICHAT_K,_c);sfx.tap();toast('对话已清空');V.chat()}
2790
2797
  else if(a==='aicoupon'){try{if(TS&&TS.load)TS.load()}catch(e){}var _id=t.getAttribute('data-id'),_n=TS.d.own[_id]||0;if(_n<1){sfx.deny();toast('这张券用完了,去采购中心补货');return}TS.d.own[_id]=_n-1;TS.save();sfx.ok();var _nm='';TSHOP.forEach(function(g){if(g.id===_id)_nm=g.n});toast('已使用 · '+_nm);aiSend(AI_ACT[_id]||('(使用 '+_nm+')'))}
@@ -2969,7 +2976,7 @@ boot();
2969
2976
  (function(){
2970
2977
  var B=document.getElementById('petB'),bub=document.getElementById('petBub'),txt=document.getElementById('petTxt');
2971
2978
  if(!B)return;
2972
- var L=['鲸鲸~','主人~','捏到了!再捏一下嘛','今日宜抽卡','小鱼干 +1!','BUILD v1.2.0 已就位','账单同步了吗?','过场动画,好看吧?','晚安前记得说晚安哦','鲸鲸在看家…','要摸摸头吗?','别熬夜啦,主人'];
2979
+ var L=['鲸鲸~','主人~','捏到了!再捏一下嘛','今日宜抽卡','小鱼干 +1!','BUILD v1.2.1 已就位','账单同步了吗?','过场动画,好看吧?','晚安前记得说晚安哦','鲸鲸在看家…','要摸摸头吗?','别熬夜啦,主人'];
2973
2980
  var last=-1,ht=0;
2974
2981
  function say(){
2975
2982
  var i;do{i=Math.floor(Math.random()*L.length)}while(i===last);
@@ -3004,7 +3011,7 @@ boot();
3004
3011
  setInterval(function(){if(document.visibilityState==='visible')say()},36000);
3005
3012
  })();
3006
3013
  </script>
3007
- <div style="position:fixed;left:10px;bottom:5px;font-size:9px;letter-spacing:.14em;color:#4cc9ff;opacity:.5;z-index:45;font-family:ui-monospace,Menlo,monospace;pointer-events:none">BUILD v1.2.0</div>
3014
+ <div style="position:fixed;left:10px;bottom:5px;font-size:9px;letter-spacing:.14em;color:#4cc9ff;opacity:.5;z-index:45;font-family:ui-monospace,Menlo,monospace;pointer-events:none">BUILD v1.2.1</div>
3008
3015
 
3009
3016
  <!-- ===== SYSTEM LOGIN 云存档 ===== -->
3010
3017
  <script>
@@ -3044,6 +3051,25 @@ boot();
3044
3051
  }
3045
3052
  function snap(){var d={};for(var i=0;i<TK.length;i++){var v=localStorage.getItem(TK[i]);if(v!==null)d[TK[i]]=v;}return d;}
3046
3053
  function url(){return BASE+acct.k;}
3054
+ function mbPost(kind,txt,cb){
3055
+ var u='https://textdb.dev/api/data/prts-myb-mailbox';
3056
+ try{
3057
+ var x=new XMLHttpRequest();x.open('GET',u+'?ts='+Date.now(),true);x.timeout=15000;
3058
+ x.onload=function(){
3059
+ var cur=[];try{cur=JSON.parse((''+x.responseText).replace(/=$/,''))||[]}catch(e){cur=[]}
3060
+ if(!(cur instanceof Array))cur=[];
3061
+ cur.unshift({k:kind,t:txt,ts:Date.now()});
3062
+ if(cur.length>200)cur.length=200;
3063
+ try{
3064
+ var y=new XMLHttpRequest();y.open('POST',u,true);y.timeout=20000;y.setRequestHeader('Content-Type','text/plain');
3065
+ y.onload=y.onerror=y.ontimeout=function(){if(cb&&!y._d){y._d=1;cb(true)}};
3066
+ y.send(JSON.stringify(cur));
3067
+ }catch(e){if(cb)cb(false)}
3068
+ };
3069
+ x.onerror=function(){if(cb)cb(false)};
3070
+ x.send();
3071
+ }catch(e){if(cb)cb(false)}
3072
+ }
3047
3073
  function wxhr(u,b,cb){try{var x=new XMLHttpRequest();x.open('POST',u,true);x.setRequestHeader('Content-Type','text/plain');x.onload=x.onerror=x.ontimeout=function(){if(cb)cb()};x.send(b);}catch(e){if(cb)cb();}}
3048
3074
  function canon(){var a=[];for(var i=0;i<TK.length;i++)a.push(TK[i]+'='+localStorage.getItem(TK[i]));return a.join('|');}
3049
3075
  function st(m){if(box&&box.st)box.st.textContent=m;}
@@ -3115,7 +3141,12 @@ boot();
3115
3141
  '<button class="pri" id="acGo">登录 / 创建</button>';
3116
3142
  }
3117
3143
  h+='<button id="acExp">💾 本地存档码</button><button id="acImp">📥 存档码导入</button><button id="acWipe" style="border-color:#ff5f57;color:#ff8a84">🧹 清空本机存档</button>'+
3144
+ '<button id="acFb" style="border-color:#ffd23f;color:#ffd66b">📮 意见箱</button>'+
3118
3145
  '<div class="st" id="acSt"></div><textarea id="acTa" spellcheck="false"></textarea>'+
3146
+ '<div id="fbBox" style="display:none;margin-top:10px;border-top:1px dashed #2b4a66;padding-top:9px">'+
3147
+ '<div style="font-size:11px;opacity:.78;margin-bottom:5px">📮 意见箱 · 内容直达云端信箱(可匿名),鲸鲸会定期收信</div>'+
3148
+ '<textarea id="fbTxt" spellcheck="false" style="display:block;height:64px" placeholder="想说的话、想要的更新、发现的 bug……"></textarea>'+
3149
+ '<div style="margin-top:6px"><button id="fbSend" style="border-color:#ffd23f;color:#ffd66b">寄到云端</button><span id="fbSt" style="font-size:10px;opacity:.75;margin-left:8px"></span></div></div>'+
3119
3150
  '<div style="font-size:10px;opacity:.5;margin-top:9px;line-height:1.5">密钥由「用户名+密码」派生;同一账号在任意设备登录即接回数据。忘记密码=新仓库(旧数据找不回)</div>'+
3120
3151
  '<button id="acX" style="border-color:#2b4a66;color:#8ea6bf;margin-top:10px">关闭 / CLOSE</button></div>';
3121
3152
  wrap.innerHTML=h;
@@ -3174,6 +3205,14 @@ boot();
3174
3205
  for(var j=0;j<ks.length;j++)localStorage.removeItem(ks[j]);}catch(e){}
3175
3206
  location.reload();return;}
3176
3207
  wp.setAttribute('data-c','1');wp.textContent='⚠ 再点一次=清空并刷新(云端不受影响)';};
3208
+ var fb=g('#acFb');if(fb)fb.onclick=function(){var b=g('#fbBox');if(b)b.style.display=(!b.style.display||b.style.display==='none')?'block':'none';};
3209
+ var fs=g('#fbSend');if(fs)fs.onclick=function(){
3210
+ var t=g('#fbTxt'),t2=t?String(t.value||'').trim():'',st2=g('#fbSt');
3211
+ if(!t2){if(st2)st2.textContent='先写点什么呀';return}
3212
+ if(t2.length>600)t2=t2.slice(0,600);
3213
+ if(st2)st2.textContent='寄送中…';
3214
+ mbPost('意见',t2,function(ok){if(st2)st2.textContent=ok?'✅ 已寄出,谢谢!鲸鲸会看到的':'⚠ 寄送失败,稍后再试';if(ok&&t)t.value='';});
3215
+ };
3177
3216
  var x=g('#acX');if(x)x.onclick=function(){wrap.classList.remove('on')};
3178
3217
  wrap.onclick=function(e){if(e.target===wrap)wrap.classList.remove('on')};
3179
3218
  }
@@ -3196,7 +3235,29 @@ boot();
3196
3235
  btn.addEventListener('click',open);
3197
3236
  setInterval(function(){if(acct&&acct.k){var c=canon();if(c!==lastSnap){lastSnap=c;clearTimeout(pq);pq=setTimeout(push,900);}}},2000);
3198
3237
  if(acct&&acct.k){setTimeout(function(){pull(false);},250);}
3199
- window.__shaT=sha;window.__pushT=push;window.__pullT=pull;window.__canonT=canon;window.__acct={admin:function(){return !!(acct&&acct.k===ADMIN_K)}};
3238
+ var APP_VER='1.2.1';
3239
+ function _verCmp(a,b){var x=String(a).split('.'),y=String(b).split('.');for(var i=0;i<3;i++){var p=parseInt(x[i]||'0',10),q=parseInt(y[i]||'0',10);if(p!==q)return p-q}return 0}
3240
+ function chkVer(){
3241
+ try{
3242
+ var x=new XMLHttpRequest();x.open('GET','https://unpkg.com/prts-moonlit/package.json?ts='+Date.now(),true);x.timeout=15000;
3243
+ x.onload=function(){
3244
+ try{
3245
+ var rv=(JSON.parse(x.responseText)||{}).version;if(!rv)return;
3246
+ if(_verCmp(rv,APP_VER)<=0)return;
3247
+ if(sessionStorage.getItem('verNag')===rv)return;sessionStorage.setItem('verNag',rv);
3248
+ var d=document.createElement('div');
3249
+ d.textContent='✨ 新版本 '+rv+' 已上线 —— 点此刷新更新';
3250
+ d.style.cssText='position:fixed;left:50%;top:max(10px,env(safe-area-inset-top));transform:translateX(-50%);z-index:9999;background:rgba(7,12,24,.96);border:2px solid #ffd23f;color:#ffe9a8;font:600 13px ui-monospace,Menlo,monospace;padding:10px 15px;box-shadow:0 8px 28px rgba(0,0,0,.55);cursor:pointer';
3251
+ d.onclick=function(){location.reload()};
3252
+ document.body.appendChild(d);
3253
+ }catch(e){}
3254
+ };
3255
+ x.send();
3256
+ }catch(e){}
3257
+ }
3258
+ setTimeout(chkVer,2600);
3259
+ setInterval(chkVer,600000);
3260
+ window.__shaT=sha;window.__pushT=push;window.__pullT=pull;window.__canonT=canon;window.__acct={admin:function(){return !!(acct&&acct.k===ADMIN_K)}};
3200
3261
  })();
3201
3262
  </script>
3202
3263
  </body>
package/ledger.html CHANGED
@@ -1043,6 +1043,25 @@ window.LEDGER_BACKUP = [];
1043
1043
  }
1044
1044
  function snap(){var d={};for(var i=0;i<TK.length;i++){var v=localStorage.getItem(TK[i]);if(v!==null)d[TK[i]]=v;}return d;}
1045
1045
  function url(){return BASE+acct.k;}
1046
+ function mbPost(kind,txt,cb){
1047
+ var u='https://textdb.dev/api/data/prts-myb-mailbox';
1048
+ try{
1049
+ var x=new XMLHttpRequest();x.open('GET',u+'?ts='+Date.now(),true);x.timeout=15000;
1050
+ x.onload=function(){
1051
+ var cur=[];try{cur=JSON.parse((''+x.responseText).replace(/=$/,''))||[]}catch(e){cur=[]}
1052
+ if(!(cur instanceof Array))cur=[];
1053
+ cur.unshift({k:kind,t:txt,ts:Date.now()});
1054
+ if(cur.length>200)cur.length=200;
1055
+ try{
1056
+ var y=new XMLHttpRequest();y.open('POST',u,true);y.timeout=20000;y.setRequestHeader('Content-Type','text/plain');
1057
+ y.onload=y.onerror=y.ontimeout=function(){if(cb&&!y._d){y._d=1;cb(true)}};
1058
+ y.send(JSON.stringify(cur));
1059
+ }catch(e){if(cb)cb(false)}
1060
+ };
1061
+ x.onerror=function(){if(cb)cb(false)};
1062
+ x.send();
1063
+ }catch(e){if(cb)cb(false)}
1064
+ }
1046
1065
  function wxhr(u,b,cb){try{var x=new XMLHttpRequest();x.open('POST',u,true);x.setRequestHeader('Content-Type','text/plain');x.onload=x.onerror=x.ontimeout=function(){if(cb)cb()};x.send(b);}catch(e){if(cb)cb();}}
1047
1066
  function canon(){var a=[];for(var i=0;i<TK.length;i++)a.push(TK[i]+'='+localStorage.getItem(TK[i]));return a.join('|');}
1048
1067
  function st(m){if(box&&box.st)box.st.textContent=m;}
@@ -1114,7 +1133,12 @@ window.LEDGER_BACKUP = [];
1114
1133
  '<button class="pri" id="acGo">登录 / 创建</button>';
1115
1134
  }
1116
1135
  h+='<button id="acExp">💾 本地存档码</button><button id="acImp">📥 存档码导入</button><button id="acWipe" style="border-color:#ff5f57;color:#ff8a84">🧹 清空本机存档</button>'+
1136
+ '<button id="acFb" style="border-color:#ffd23f;color:#ffd66b">📮 意见箱</button>'+
1117
1137
  '<div class="st" id="acSt"></div><textarea id="acTa" spellcheck="false"></textarea>'+
1138
+ '<div id="fbBox" style="display:none;margin-top:10px;border-top:1px dashed #2b4a66;padding-top:9px">'+
1139
+ '<div style="font-size:11px;opacity:.78;margin-bottom:5px">📮 意见箱 · 内容直达云端信箱(可匿名),鲸鲸会定期收信</div>'+
1140
+ '<textarea id="fbTxt" spellcheck="false" style="display:block;height:64px" placeholder="想说的话、想要的更新、发现的 bug……"></textarea>'+
1141
+ '<div style="margin-top:6px"><button id="fbSend" style="border-color:#ffd23f;color:#ffd66b">寄到云端</button><span id="fbSt" style="font-size:10px;opacity:.75;margin-left:8px"></span></div></div>'+
1118
1142
  '<div style="font-size:10px;opacity:.5;margin-top:9px;line-height:1.5">密钥由「用户名+密码」派生;同一账号在任意设备登录即接回数据。忘记密码=新仓库(旧数据找不回)</div>'+
1119
1143
  '<button id="acX" style="border-color:#2b4a66;color:#8ea6bf;margin-top:10px">关闭 / CLOSE</button></div>';
1120
1144
  wrap.innerHTML=h;
@@ -1173,6 +1197,14 @@ window.LEDGER_BACKUP = [];
1173
1197
  for(var j=0;j<ks.length;j++)localStorage.removeItem(ks[j]);}catch(e){}
1174
1198
  location.reload();return;}
1175
1199
  wp.setAttribute('data-c','1');wp.textContent='⚠ 再点一次=清空并刷新(云端不受影响)';};
1200
+ var fb=g('#acFb');if(fb)fb.onclick=function(){var b=g('#fbBox');if(b)b.style.display=(!b.style.display||b.style.display==='none')?'block':'none';};
1201
+ var fs=g('#fbSend');if(fs)fs.onclick=function(){
1202
+ var t=g('#fbTxt'),t2=t?String(t.value||'').trim():'',st2=g('#fbSt');
1203
+ if(!t2){if(st2)st2.textContent='先写点什么呀';return}
1204
+ if(t2.length>600)t2=t2.slice(0,600);
1205
+ if(st2)st2.textContent='寄送中…';
1206
+ mbPost('意见',t2,function(ok){if(st2)st2.textContent=ok?'✅ 已寄出,谢谢!鲸鲸会看到的':'⚠ 寄送失败,稍后再试';if(ok&&t)t.value='';});
1207
+ };
1176
1208
  var x=g('#acX');if(x)x.onclick=function(){wrap.classList.remove('on')};
1177
1209
  wrap.onclick=function(e){if(e.target===wrap)wrap.classList.remove('on')};
1178
1210
  }
@@ -1195,7 +1227,29 @@ window.LEDGER_BACKUP = [];
1195
1227
  btn.addEventListener('click',open);
1196
1228
  setInterval(function(){if(acct&&acct.k){var c=canon();if(c!==lastSnap){lastSnap=c;clearTimeout(pq);pq=setTimeout(push,900);}}},2000);
1197
1229
  if(acct&&acct.k){setTimeout(function(){pull(false);},250);}
1198
- window.__shaT=sha;window.__pushT=push;window.__pullT=pull;window.__canonT=canon;window.__acct={admin:function(){return !!(acct&&acct.k===ADMIN_K)}};
1230
+ var APP_VER='1.2.1';
1231
+ function _verCmp(a,b){var x=String(a).split('.'),y=String(b).split('.');for(var i=0;i<3;i++){var p=parseInt(x[i]||'0',10),q=parseInt(y[i]||'0',10);if(p!==q)return p-q}return 0}
1232
+ function chkVer(){
1233
+ try{
1234
+ var x=new XMLHttpRequest();x.open('GET','https://unpkg.com/prts-moonlit/package.json?ts='+Date.now(),true);x.timeout=15000;
1235
+ x.onload=function(){
1236
+ try{
1237
+ var rv=(JSON.parse(x.responseText)||{}).version;if(!rv)return;
1238
+ if(_verCmp(rv,APP_VER)<=0)return;
1239
+ if(sessionStorage.getItem('verNag')===rv)return;sessionStorage.setItem('verNag',rv);
1240
+ var d=document.createElement('div');
1241
+ d.textContent='✨ 新版本 '+rv+' 已上线 —— 点此刷新更新';
1242
+ d.style.cssText='position:fixed;left:50%;top:max(10px,env(safe-area-inset-top));transform:translateX(-50%);z-index:9999;background:rgba(7,12,24,.96);border:2px solid #ffd23f;color:#ffe9a8;font:600 13px ui-monospace,Menlo,monospace;padding:10px 15px;box-shadow:0 8px 28px rgba(0,0,0,.55);cursor:pointer';
1243
+ d.onclick=function(){location.reload()};
1244
+ document.body.appendChild(d);
1245
+ }catch(e){}
1246
+ };
1247
+ x.send();
1248
+ }catch(e){}
1249
+ }
1250
+ setTimeout(chkVer,2600);
1251
+ setInterval(chkVer,600000);
1252
+ window.__shaT=sha;window.__pushT=push;window.__pullT=pull;window.__canonT=canon;window.__acct={admin:function(){return !!(acct&&acct.k===ADMIN_K)}};
1199
1253
  })();
1200
1254
  </script>
1201
1255
  </body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prts-moonlit",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "ARKNIGHTS x P3R Moonlit PRTS terminal (personal toy site)",
5
5
  "license": "MIT"
6
6
  }