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 +58 -3
- package/index.html +77 -16
- package/ledger.html +55 -1
- package/package.json +1 -1
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"
|
|
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('已复制 ✓
|
|
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
|
-
|
|
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.
|
|
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{'<':'<','>':'>','&':'&','"':'"'}[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);
|
|
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.
|
|
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
|
|
2640
|
+
'① 九条指令:01 对话 / 02 人格 / 03 采购中心 / 04 干员寻访 / 05 任务 / 06 战绩 / 07 档案 / 08 账本 / 09 运势<br>'+
|
|
2637
2641
|
'② 小鱼干:打卡与任务赚取,去 03 采购中心兑换券<br>'+
|
|
2638
|
-
'③
|
|
2642
|
+
'③ 运势:「09 运势」每日一签 · 0 点翻新,专属三牌归位转场超帅<br>'+
|
|
2639
2643
|
'④ 云存档:点 @ 登录 →「云端导入」接回数据 /「云端上传」备份上云;也有「本地存档码」跨设备搬运<br>'+
|
|
2640
|
-
'⑤ 恢复出厂:@ 面板内「清空本机存档」,一键清空本机数据(云端不受影响)<br>'+'⑥ AI 对话:01 里保存 API 配置(地址/Key/模型)→
|
|
2641
|
-
'<div class="box" style="margin-top:10px"><div class="tag"
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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>
|