feat: integrate platform room entry, UI migration and erqiwang documentation
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
type ClipboardHost=
|
||||
|{kind:'settings';read:()=>unknown}
|
||||
|{kind:'bridge';call:(name:'gamepastetext',data:string,callback:(value:unknown)=>void)=>void}
|
||||
|{kind:'browser';read:()=>Promise<string>};
|
||||
|
||||
/** 05_Func: settings takes no arguments; WVJB takes "" and returns through its callback. */
|
||||
export async function readClipboardText(host:ClipboardHost):Promise<string>{
|
||||
const value=host.kind==='bridge'?await new Promise<unknown>((resolve,reject)=>{
|
||||
const timer=setTimeout(()=>reject(Error('读取剪贴板超时,请手动输入')),10000);
|
||||
try{host.call('gamepastetext','',value=>{clearTimeout(timer);resolve(value);});}
|
||||
catch(error){clearTimeout(timer);reject(error);}
|
||||
}):await host.read();
|
||||
if(typeof value!=='string')throw Error('Invalid clipboard text');
|
||||
return value;
|
||||
}
|
||||
|
||||
export async function readInviteClipboard(host:ClipboardHost):Promise<string>{
|
||||
return (await readClipboardText(host)).replace(/[^0-9]/g,'');
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "4aeb3de8-f982-4246-95be-7dca058bc99d",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
import {requireRecord} from '../../protocol/contracts/validation.ts';
|
||||
/** Logic.readRoomList/addRoomToList/removeRoomFromList. This is owner-return history, not recently played rooms. */
|
||||
export class OwnedRoomHistory {
|
||||
private readonly key:string;
|
||||
constructor(private readonly storage:Pick<Storage,'getItem'|'setItem'>,gameid:string|number,agentid:string|number){this.key='tsgame_roomlist_'+gameid+agentid;}
|
||||
read():readonly number[]{
|
||||
const text=this.storage.getItem(this.key);
|
||||
if(!text){this.save([]);return [];}
|
||||
const raw=requireRecord(JSON.parse(text),this.key);
|
||||
if(!Array.isArray(raw.data)||raw.data.some(n=>typeof n!=='number'||!Number.isSafeInteger(n)||n<=0))throw Error('Invalid '+this.key);
|
||||
return Object.freeze([...raw.data]);
|
||||
}
|
||||
private code(value:unknown):number {
|
||||
if(!(typeof value==='string'&&/^[0-9]+$/.test(value)||typeof value==='number'))throw Error('Invalid room history roomcode');
|
||||
const code=Number(value);if(!Number.isSafeInteger(code)||code<=0)throw Error('Invalid room history roomcode');return code;
|
||||
}
|
||||
private save(data:readonly number[]):void{this.storage.setItem(this.key,JSON.stringify({data}));}
|
||||
joined(raw:Readonly<Record<string,unknown>>):void{
|
||||
if(Number(raw.state)===99||Number(raw.state)===0&&Number(raw.isowner)===1){const code=this.code(raw.roomcode);this.save(this.read().filter(n=>n!==code));}
|
||||
}
|
||||
exited(raw:Readonly<Record<string,unknown>>,infinite:number):void{
|
||||
if(Number(raw.isowner)!==1||infinite!==0)return;
|
||||
const code=this.code(raw.roomcode),list=this.read();if(!list.includes(code))this.save([code,...list]);
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "ca074aba-afc9-428f-93ea-199d30dba6ef",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
Reference in New Issue
Block a user