vinzzsync-wacli 1.0.0

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 (49) hide show
  1. package/c.js +2 -0
  2. package/func.js +3263 -0
  3. package/index.js +2416 -0
  4. package/index2.js +3611 -0
  5. package/lib/sqlAuth.js +109 -0
  6. package/package.json +21 -0
  7. package/plugins/_loader.js +191 -0
  8. package/plugins/addplugins.js +93 -0
  9. package/plugins/backup.js +91 -0
  10. package/plugins/cekch.js +157 -0
  11. package/plugins/cekgb.js +105 -0
  12. package/plugins/clear.js +12 -0
  13. package/plugins/cmd.js +69 -0
  14. package/plugins/cmfil.js +110 -0
  15. package/plugins/cms.js +474 -0
  16. package/plugins/delplugins.js +57 -0
  17. package/plugins/dmsg.js +112 -0
  18. package/plugins/eval.js +175 -0
  19. package/plugins/evfil.js +86 -0
  20. package/plugins/exit.js +11 -0
  21. package/plugins/fadm.js +107 -0
  22. package/plugins/fakemsg.js +154 -0
  23. package/plugins/fakesize.js +204 -0
  24. package/plugins/fclick.js +111 -0
  25. package/plugins/fitnah.js +87 -0
  26. package/plugins/getfile.js +169 -0
  27. package/plugins/getplugins.js +71 -0
  28. package/plugins/getquoted.js +76 -0
  29. package/plugins/getusn.js +92 -0
  30. package/plugins/groups.js +62 -0
  31. package/plugins/help.js +19 -0
  32. package/plugins/ht.js +45 -0
  33. package/plugins/ht2.js +59 -0
  34. package/plugins/ht3.js +66 -0
  35. package/plugins/isbot.js +177 -0
  36. package/plugins/listplugins.js +103 -0
  37. package/plugins/me.js +95 -0
  38. package/plugins/minigames.js +144 -0
  39. package/plugins/ping.js +124 -0
  40. package/plugins/quoted.js +102 -0
  41. package/plugins/rvo.js +88 -0
  42. package/plugins/savefile.js +334 -0
  43. package/plugins/send.js +52 -0
  44. package/plugins/session.js +18 -0
  45. package/plugins/smsg.js +204 -0
  46. package/plugins/status.js +18 -0
  47. package/plugins/typing_troll.js +91 -0
  48. package/pp.jpg +0 -0
  49. package/vkazee-send-message.js +1238 -0
package/plugins/me.js ADDED
@@ -0,0 +1,95 @@
1
+ function out(m, content) {
2
+ if (m?.reply) {
3
+ void m.reply(content);
4
+ } else {
5
+ if (typeof content === 'string') {
6
+ console.log(content);
7
+ } else {
8
+ console.log(content);
9
+ }
10
+ }
11
+ }
12
+
13
+ export default {
14
+ command: ['me', 'profile'],
15
+
16
+ async run({
17
+ m,
18
+ sock,
19
+ connectionState,
20
+ sessionType,
21
+ debug
22
+ }) {
23
+ try {
24
+ const user = sock?.user || {};
25
+
26
+ const jid = user?.id || '-';
27
+ const lid = user?.lid || user?.lidJid || '-';
28
+ const name = user?.name || '-';
29
+ const verifiedName = user?.verifiedName || '-';
30
+
31
+ let bio = '-';
32
+
33
+ try {
34
+ const status = await sock.fetchStatus(jid);
35
+ bio =
36
+ status?.status ||
37
+ status?.status?.text ||
38
+ '-';
39
+ } catch {}
40
+
41
+ let profilePicture = null;
42
+
43
+ try {
44
+ profilePicture = await sock.profilePictureUrl(
45
+ jid,
46
+ 'image'
47
+ );
48
+ } catch {}
49
+
50
+ const caption =
51
+ `========== BOT PROFILE ==========\n` +
52
+ `ID : ${jid}\n` +
53
+ `LID : ${lid}\n` +
54
+ `Name : ${name}\n` +
55
+ `Verified: ${verifiedName}\n` +
56
+ `Bio : ${bio}\n` +
57
+ `Status : ${connectionState ?? '-'}\n` +
58
+ `Session : ${sessionType ?? '-'}\n` +
59
+ `=================================`;
60
+
61
+ debug('sock.user', user);
62
+ debug('profile', {
63
+ jid,
64
+ lid,
65
+ name,
66
+ verifiedName,
67
+ bio,
68
+ profilePicture
69
+ });
70
+
71
+ if (profilePicture) {
72
+ await sock.sendMessage(
73
+ m.chat,
74
+ {
75
+ image: {
76
+ url: profilePicture
77
+ },
78
+ caption
79
+ },
80
+ {
81
+ quoted: global.v
82
+ }
83
+ );
84
+ } else {
85
+ out(m, {
86
+ text: caption
87
+ });
88
+ }
89
+ } catch (error) {
90
+ out(m, {
91
+ text: `Error: ${error?.message || error}`
92
+ });
93
+ }
94
+ }
95
+ };
@@ -0,0 +1,144 @@
1
+ export default {
2
+ command: 'minigame',
3
+
4
+ async run(ctx) {
5
+ const { sock, m } = ctx;
6
+
7
+ if (!m?.chat) return;
8
+
9
+ await sock.relayMessage(
10
+ m.chat,
11
+ {
12
+ messageContextInfo: {
13
+ deviceListMetadata: {},
14
+ deviceListMetadataVersion: 2,
15
+ botMetadata: {
16
+ messageDisclaimerText: '',
17
+ botResponseId: 'f090cd0f-bad1-4a4a-b0c3-b8f8e852c197',
18
+ verificationMetadata: {
19
+ proofs: [
20
+ {
21
+ version: 1,
22
+ useCase: 1,
23
+ signature: 'TklYRUwuTWVzc2FnZUJ1aWxkZXJWNC43LVZlcmlmaWNhdGlvblNpZ25hdHVyZS5NZXRhZGF0YY28GDo8OXSlgg==',
24
+ certificateChain: [
25
+ 'TklYRUwuTWVzc2FnZUJ1aWxkZXJWNC43LUNlcnRpZmljYXRlQ2hhaW4uTWV0YWRhdGE663ESCbLizCieg4wPebEFhVgH2dAgtZ8ajRuM4EY9p4BB4ay1X8InJh4KPu2GGhxlhPifhj3TFWzDND9OoPAx9ngvHgJ7qW+qq4UWIO3BxUoSc1UlkrSRYrDad3Oddz6dbHJqguhpE4JQ9nTyVT3lFWnuMg2oBEXG2mkdFR1fOnKG03454VeAGFLQfQMoAlq7AfmTFVXn45X8kMduwwCFuSE3sIF8uAMhP5Ng1Rn+mMmGZfne5RsyCa4wuHhv9p5KVKgnP8NXF6Sv6kAx5Dcer/qxZRaofRXTp7kSenmU+HU1w9KQfsEpHdbsfoRXKsscYm2KYl45U+FaFWbdaM1SXso3kE7SmMbNNCoJyX1ra8qoCXn940lJ3NjAb/7V6FjV7kHXXQycABxEtM7f3XaWzBMAnHMv43vTYv0g14snH90OpBPAJoOqA9Fhd+7636dOAT1pEQfCaghq/oSE2+/c0pbXK20WxtrzJnGRO6Kiy3R9KWMiPlbQu5Npoiu25PMFqujhoZiteQY3EoQnxLCHWZuV7ozseUrnfCbSGuzIvvd2iwx3z7k2Vlh5+vuiM9/j6/tstk5KG0AhP/G4aOAnbQfnowH1jpCC51Onnoz9eXDBwYOmA/QCiLgIL9PcJUoMPERaX0bp3Oy5q77VNVzFhIWFWVukfWn7uNmZgKFqfPzLAiy5nBEwfSrf23tmXxjbF0131XO1KbraDB0TVktoWMF45Y2U81rB4yD7WR+MFxMRaA3EF+jC6i/+giHnUHRhb3F4BF3derq03u1EmegX6dnt43U5dnSZmJb9pmQslhBaFlWJqRK82gqfdRtT5r4Q/wamUUgrIGjS',
26
+ 'TklYRUwuTWVzc2FnZUJ1aWxkZXJWNC43LUNlcnRpZmljYXRlQ2hhaW4uTWV0YWRhdGFOvdeboN7QHpWcPzdiI0ToTcoQmXrfuUIXi8v7akW/tOniN+d81uRd3SAcEEBKYyU3FCvolzcQCSd/P1+7jc8AwUqwp7OE0QpcJmqTO7EBLHQHx5B2gEZN0+ELrpuGdG3pQRVs7UB0bhTChnGR3asNYE6akIIrcMBKLaH0A+RjpJ0cOMh4Im9ZysfMWlFkng2Q0rmbBjxmxt/uY2hMDC6FAT6Agty8fSMQZAqU1KgbDpe/0kHA1p0U04N2t7xgi/zCsrPIHrq3YSKn1pYAmUeT+F/CK5Wz2SsEN7DicSMzHsK5XMJ0sWFp4ICrmSp+n5dhzrW/rt2ZB6sEyX4ll1z0dRuApMLNV4+j96Ir+0FzQ1QwNzMDHdQMSYXJulErBjjuK7j6BPG3lGd6yaGIZbfkZmL4ohq/thIIFP99JsUppkox0ENCmXkcwYfvTw8Ob+fv5VeTycFXUIufKV/Sc16Yf4bi5Hlr1U/zQRb/T86KHxUBBYuDW4F0PbrOZUGKaWKoWlHG2ZLTxLYomYbS/K7EyF6zjeLLioB/kQOtqD1K8R5u4tl7WnauJLV6jANHFWRflWdoBTETbgVE2Jew46vvQlk6VQKlava48yGAjZWvjkGCsZWUSu5azahZh9FbNbc/Z/cbY7++g2xxpTFywh698xyGsO4WSEIT9zWv3+esKut+/1BTu/hVZReQnU9NaJSeMpysUZmWmVM0FNQPPNrfYrj6p25MtyfjVT/AtCgEhNrin5q8unHgfDRUpi7WffTH3NFVVHcfOrc99/wHfAHUtAEFTdzjHSwJ+AODaXf/zbAnGXHqKgtcnesf+UhbPBK6HYX0T95EgGOUzwNPujmKUrcKNDFeCksP2QXSZiT1J03T/sGgIBABuuu6UoA1l8Id7qOtDl9umuZVsxFoXfVEzOR702oL3fwCCWJr8U9UJ6aUHa4o/lXP/zFoC4rV9DFvntb5HfPDL2taOmYocN1iI3l9rl4S+Pvoo8iFjRrwJAikIgZ+pbX137sfKdETrgw0QuW+khRtsj6Q90s3vmI/bxRNASxBKws92R/JCSZUenpRtSUrRoY9mvFlq7qsbAWkGA09lzFCVB/sK/kXJLBGgx+298TvhBYyOw=='
27
+ ]
28
+ }
29
+ ]
30
+ }
31
+ }
32
+ },
33
+ botForwardedMessage: {
34
+ message: {
35
+ richResponseMessage: {
36
+ messageType: 1,
37
+ submessages: [
38
+ {
39
+ messageType: 2,
40
+ messageText: '> minigames click here ↓'
41
+ }
42
+ ],
43
+ unifiedResponse: {
44
+ data: Buffer.from(
45
+ JSON.stringify({
46
+ response_id: '183d0aee-fb35-4349-8bc5-7793b11859db',
47
+ sections: [
48
+ {
49
+ view_model: {
50
+ primitive: {
51
+ text: '> minigames click here ↓',
52
+ __typename: 'GenAIMarkdownTextUXPrimitive'
53
+ },
54
+ __typename: 'GenAISingleLayoutViewModel'
55
+ }
56
+ }
57
+ ],
58
+ embedded_screens: [
59
+ {
60
+ title: 'Preview',
61
+ content: [
62
+ {
63
+ __typename: 'FOAIDNixelButtonSheets',
64
+ tabs: [
65
+ {
66
+ id: 'tab_0',
67
+ tab_header: 'Dino Runner',
68
+ sections: [
69
+ {
70
+ __typename: 'GenAIUnifiedResponseSection',
71
+ view_model: {
72
+ __typename: 'GenAISingleLayoutViewModel',
73
+ primitive: {
74
+ __typename: 'GenAIaeacdsnwHtmlPrimitive',
75
+ payload: `<style>*{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}</style>\n<body style=\"margin:0;background:transparent;font-family:Arial,sans-serif;color:#eee;touch-action:manipulation;cursor:pointer\">\n<div style=\"width:100%;max-width:620px;margin:auto;padding:16px;box-sizing:border-box\">\n<div style=\"background:rgba(255,255,255,.06);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.15);border-radius:16px;overflow:hidden;box-shadow:0 8px 32px rgba(0,0,0,.35)\">\n<div style=\"padding:18px 20px;border-bottom:1px solid rgba(255,255,255,.12);display:flex;justify-content:space-between;align-items:center\">\n<div><div style=\"font-size:11px;letter-spacing:1.5px;color:rgba(255,255,255,.45)\">VINZZ DINO</div><div style=\"font-size:21px;font-weight:bold;color:#fff\">Dino Runner</div></div>\n<div style=\"text-align:right\"><div id=\"score\" style=\"font-size:18px;font-weight:bold;color:#fff;text-shadow:0 0 10px rgba(108,92,231,.85);transition:transform .15s\">00000</div><div id=\"best\" style=\"font-size:10px;color:rgba(255,255,255,.4);margin-top:2px\">BEST 00000</div></div>\n</div>\n<div style=\"padding:18px\">\n<canvas id=\"game\" width=\"560\" height=\"190\" style=\"width:100%;height:auto;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.12);border-radius:12px;display:block\"></canvas>\n<div id=\"status\" style=\"text-align:center;margin-top:10px;font-size:12px;color:rgba(255,255,255,.55)\">Speed 5.0x</div>\n</div></div></div>\n<script>\nconst c=document.getElementById('game'),x=c.getContext('2d'),scoreEl=document.getElementById('score'),bestEl=document.getElementById('best'),statusEl=document.getElementById('status');\nconst GY=170;\nlet d,o,clouds,particles,ambient,trail,score,best=0,speed,gameOver,last,shake,flash,runT,spawnTimer,milestone,squash;\nfunction loadBest(){\nlet vals=[];\ntry{let v=localStorage.getItem('dino_best');if(v)vals.push(parseInt(v,10))}catch(e){}\ntry{let v=sessionStorage.getItem('dino_best');if(v)vals.push(parseInt(v,10))}catch(e){}\ntry{let m=document.cookie.match(/(?:^|;\\s*)dino_best=(\\d+)/);if(m)vals.push(parseInt(m[1],10))}catch(e){}\nreturn vals.length?Math.max(...vals.filter(v=>!isNaN(v))):0\n}\nfunction saveBest(v){\nlet val=String(Math.floor(v));\ntry{localStorage.setItem('dino_best',val)}catch(e){}\ntry{sessionStorage.setItem('dino_best',val)}catch(e){}\ntry{document.cookie='dino_best='+val+';max-age=31536000;path=/'}catch(e){}\ntry{\nlet rq=indexedDB.open('dino_db',1);\nrq.onupgradeneeded=()=>{rq.result.createObjectStore('kv')};\nrq.onsuccess=()=>{try{rq.result.transaction('kv','readwrite').objectStore('kv').put(val,'dino_best')}catch(e){}}\n}catch(e){}\n}\nfunction loadBestAsync(cb){\ntry{\nlet rq=indexedDB.open('dino_db',1);\nrq.onupgradeneeded=()=>{rq.result.createObjectStore('kv')};\nrq.onsuccess=()=>{\ntry{\nlet gr=rq.result.transaction('kv','readonly').objectStore('kv').get('dino_best');\ngr.onsuccess=()=>{if(gr.result)cb(parseInt(gr.result,10))}\n}catch(e){}\n}\n}catch(e){}\n}\nbest=loadBest();\nloadBestAsync(v=>{if(!isNaN(v)&&v>best){best=v;bestEl.textContent='BEST '+String(Math.floor(best)).padStart(5,'0')}});\nfunction reset(){\nd={x:55,y:132,w:27,h:30,vy:0,jumping:false};\no=[];\nclouds=[{x:120,y:32,w:44,s:.35},{x:300,y:52,w:60,s:.22},{x:460,y:26,w:36,s:.4},{x:560,y:70,w:50,s:.18}];\nparticles=[];\ntrail=[];\nif(!ambient){ambient=[];for(let i=0;i<18;i++)ambient.push({x:Math.random()*c.width,y:Math.random()*c.height,r:.5+Math.random()*1.5,vx:.1+Math.random()*.3,ph:Math.random()*10})}\nscore=0;speed=5;gameOver=false;last=0;shake=0;flash=0;runT=0;milestone=0;squash=1;\nspawnTimer=70+Math.random()*30;\nbestEl.textContent='BEST '+String(Math.floor(best)).padStart(5,'0');\nstatusEl.textContent='Speed 5.0x'\n}\nfunction burst(px,py,n,col,spd){for(let i=0;i<n;i++)particles.push({x:px,y:py,vx:(Math.random()-.5)*spd,vy:-Math.random()*spd,life:1,col,size:2+Math.random()*2})}\nfunction jumpDino(){\nif(gameOver){reset();return}\nif(!d.jumping){d.jumping=true;d.vy=-13;squash=.7;burst(d.x+13,d.y+30,10,'255,255,255',4)}\n}\nfunction cactus(){\nlet h=24+Math.random()*24;\no.push({x:c.width+20,y:GY-h,w:16+Math.random()*6,h});\nif(Math.random()<.22){o.push({x:c.width+20+34+Math.random()*10,y:GY-(20+Math.random()*18),w:16,h:20+Math.random()*18})}\n}\nfunction hit(a,b){return a.x+4<b.x+b.w&&a.x+a.w-4>b.x&&a.y+4<b.y+b.h&&a.y+a.h>b.y}\nfunction drawTrail(){\ntrail.forEach((p,i)=>{x.fillStyle='rgba(108,92,231,'+(.25*(i/trail.length))+')';x.fillRect(p.x,p.y,27,30)})\n}\nfunction drawDino(){\nx.save();\nlet cx=d.x+13,cy=d.y+30;\nx.translate(cx,cy);\nx.scale(1/squash,squash);\nx.translate(-cx,-cy);\nlet legOff=d.jumping?0:Math.sin(runT*.5)*5;\nx.fillStyle='#eaeaea';\nx.fillRect(d.x,d.y,27,30);\nx.fillRect(d.x+22,d.y+5,13,18);\nx.fillStyle='#6c5ce7';\nx.fillRect(d.x+29,d.y+8,4,4);\nx.fillStyle='#eaeaea';\nx.fillRect(d.x+5,d.y+30,6,8+legOff);\nx.fillRect(d.x+20,d.y+30,6,8-legOff);\nx.restore()\n}\nfunction drawCactus(q){\nx.save();\nx.shadowColor='rgba(255,90,90,.35)';x.shadowBlur=10;\nx.fillStyle='#e17a7a';\nx.fillRect(q.x,q.y,q.w,q.h);\nx.fillRect(q.x-7,q.y+10,7,6);\nx.fillRect(q.x-7,q.y+4,6,12);\nx.fillRect(q.x+q.w,q.y+18,7,6);\nx.fillRect(q.x+q.w+1,q.y+12,6,12);\nx.restore()\n}\nfunction drawParticles(){\nparticles.forEach(p=>{x.fillStyle='rgba('+p.col+','+Math.max(p.life,0)+')';x.fillRect(p.x,p.y,p.size,p.size)})\n}\nfunction drawAmbient(){\nambient.forEach(p=>{let a=.15+Math.sin(runT*.05+p.ph)*.1;x.fillStyle='rgba(180,160,255,'+a+')';x.beginPath();x.arc(p.x,p.y,p.r,0,7);x.fill()})\n}\nfunction draw(){\nx.clearRect(0,0,c.width,c.height);\nx.save();\nif(shake>0)x.translate((Math.random()-.5)*shake,(Math.random()-.5)*shake);\ndrawAmbient();\nx.fillStyle='rgba(255,255,255,.35)';\nclouds.forEach(q=>{let b=Math.sin(runT*.03+q.x)*2;x.fillRect(q.x,q.y+b,q.w,5);x.fillRect(q.x+10,q.y+b-5,q.w*.45,10)});\nx.strokeStyle='rgba(255,255,255,.25)';\nx.lineWidth=2;\nx.setLineDash([10,8]);\nx.lineDashOffset=-runT*speed*.6;\nx.beginPath();x.moveTo(0,GY);x.lineTo(c.width,GY);x.stroke();\nx.setLineDash([]);\ndrawTrail();\ndrawDino();\no.forEach(drawCactus);\ndrawParticles();\nif(flash>0){x.fillStyle='rgba(255,60,60,'+(flash*.35)+')';x.fillRect(0,0,c.width,c.height)}\nx.restore();\nif(gameOver){\nx.fillStyle='rgba(15,15,25,.55)';x.fillRect(0,0,c.width,c.height);\nx.fillStyle='#fff';x.textAlign='center';\nx.font='bold 24px Arial';x.fillText('GAME OVER',c.width/2,85);\nx.font='14px Arial';x.fillText('Tap layar untuk main lagi',c.width/2,112);\nx.textAlign='left'\n}\n}\nfunction loop(t){\nif(!last)last=t;\nlet dt=Math.min((t-last)/16.67,2);\nlast=t;\nrunT+=dt;\nif(!gameOver){\nd.y+=d.vy*dt;d.vy+=.75*dt;\nif(d.y>=132){\nif(d.jumping){burst(d.x+13,GY,10,'255,255,255',3.5);squash=1.35}\nd.y=132;d.vy=0;d.jumping=false\n}\nif(d.jumping)trail.push({x:d.x,y:d.y});\nif(trail.length>6)trail.shift();\nif(!d.jumping)trail.length=0;\nsquash+=(1-squash)*.18*dt;\nif(!d.jumping&&Math.floor(runT)%8===0&&Math.random()<.4)burst(d.x+6,GY-2,1,'255,255,255',1.5);\nambient.forEach(p=>{p.x-=p.vx*dt;if(p.x<-4)p.x=c.width+4});\nspawnTimer-=dt;\nif(spawnTimer<=0){cactus();spawnTimer=Math.max(38,62-speed*1.4)+Math.random()*30}\no.forEach(q=>q.x-=speed*dt);\no=o.filter(q=>q.x>-40);\nclouds.forEach(q=>{q.x-=q.s*dt;if(q.x<-80)q.x=c.width+Math.random()*100});\nparticles.forEach(p=>{p.x+=p.vx*dt;p.y+=p.vy*dt;p.vy+=.3*dt;p.life-=.03*dt});\nparticles=particles.filter(p=>p.life>0);\nspeed=Math.min(11,speed+.0018*dt);\nscore+=dt*.6;\nif(score>best)best=score;\nif(Math.floor(score/500)>milestone){\nmilestone=Math.floor(score/500);\nscoreEl.style.transform='scale(1.35)';\nsetTimeout(()=>scoreEl.style.transform='scale(1)',150)\n}\nscoreEl.textContent=String(Math.floor(score)).padStart(5,'0');\nbestEl.textContent='BEST '+String(Math.floor(best)).padStart(5,'0');\nstatusEl.textContent='Speed '+speed.toFixed(1)+'x';\nfor(const q of o)if(hit(d,q)){\ngameOver=true;shake=14;flash=1;\nsaveBest(best);\nburst(d.x+13,d.y+15,18,'255,90,90',5)\n}\n}\nif(shake>0)shake=Math.max(0,shake-.6*dt);\nif(flash>0)flash=Math.max(0,flash-.05*dt);\ndraw();\nrequestAnimationFrame(loop)\n}\ndocument.addEventListener('pointerdown',e=>{e.preventDefault();jumpDino()});\ndocument.addEventListener('keydown',e=>{if(e.code==='Space'){e.preventDefault();jumpDino()}});\nreset();\nrequestAnimationFrame(loop);\n</script></body>`,
76
+ url: 'https://profile.vinzz-offc.my.id',
77
+ trusted_sources: ['profile.vinzz-offc.my.id']
78
+ }
79
+ }
80
+ }
81
+ ],
82
+ step_entries: []
83
+ },
84
+ {
85
+ id: 'tab_1',
86
+ tab_header: 'Tic Tac Toe',
87
+ sections: [
88
+ {
89
+ __typename: 'GenAIUnifiedResponseSection',
90
+ view_model: {
91
+ __typename: 'GenAISingleLayoutViewModel',
92
+ primitive: {
93
+ __typename: 'GenAIaeacdsnwHtmlPrimitive',
94
+ payload: "<!DOCTYPE html>\n<html lang=\"id\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Tic-Tac-Toe — Dark</title>\n<style>\n:root{\n --bg:transparent;\n --card:transparent;\n --card-2:#2a3942;\n --ink:#e9edef;\n --ink-soft:#aebac1;\n --muted:#8696a0;\n --accent:#00a884;\n --accent-2:#008069;\n --line:#2a3942;\n --line-strong:#374248;\n --cell-bg:#111b21;\n --o:#00a884;\n --x:#e9edef;\n --sys:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;\n}\n*{margin:0;padding:0;box-sizing:border-box}\nhtml,body{\n background:transparent;\n color:var(--ink);\n font-family:var(--sys);\n min-height:100vh;\n overflow-x:hidden;\n -webkit-font-smoothing:antialiased;\n}\n\n.stage{\n min-height:100vh;\n display:flex;flex-direction:column;\n align-items:center;justify-content:center;\n /* Padding diperkecil agar hemat ruang vertikal */\n padding:12px 16px;\n}\n\n.card{\n width:100%;\n /* Ukuran diperkecil dari 360px agar tidak menenggelamkan webview */\n max-width:280px; \n}\n\n.header{\n display:flex;align-items:baseline;justify-content:space-between;\n /* Margin diperkecil sedikit */\n margin-bottom:10px;padding-bottom:8px;\n border-bottom:1px solid var(--line);\n gap:8px;\n}\n.header__title{\n font-size:17px;font-weight:600;\n color:var(--ink);letter-spacing:-.005em;\n}\n.header__sub{font-size:12px;color:var(--muted)}\n\n.status{\n display:flex;align-items:center;justify-content:space-between;\n margin-bottom:10px;font-size:13px;gap:8px;\n}\n.status__turn{display:flex;align-items:center;gap:8px;color:var(--ink-soft)}\n.status__indicator{\n width:9px;height:9px;border-radius:50%;\n background:var(--x);\n position:relative;flex-shrink:0;\n transition:background .2s ease;\n}\n.status__indicator.is-o{background:var(--o)}\n.status__indicator.is-thinking::after{\n content:'';position:absolute;inset:-3px;\n border-radius:50%;border:1.5px solid var(--o);\n animation:ring 1.1s ease-out infinite;\n}\n@keyframes ring{\n 0%{transform:scale(.7);opacity:1}\n 100%{transform:scale(2.2);opacity:0}\n}\n.status__score{\n display:flex;gap:12px;\n font-variant-numeric:tabular-nums;\n color:var(--muted);font-size:12px;\n}\n.status__score b{\n color:var(--ink);font-weight:600;margin-left:3px;\n}\n\n.board{\n width:100%;aspect-ratio:1;\n position:relative;\n display:grid;\n grid-template-columns:1fr 1fr 1fr;\n grid-template-rows:1fr 1fr 1fr;\n background:var(--cell-bg);\n border-radius:8px;overflow:hidden;\n border:1px solid var(--line);\n}\n.cell{\n position:relative;background:transparent;border:none;\n cursor:pointer;padding:0;\n font-family:inherit;color:inherit;\n}\n.cell:disabled{cursor:default}\n.cell:focus-visible{outline:2px solid var(--accent);outline-offset:-3px}\n.cell::before{\n content:'';position:absolute;right:0;top:6%;bottom:6%;\n width:1px;background:var(--line-strong);\n}\n.cell:nth-child(3n)::before{display:none}\n.cell::after{\n content:'';position:absolute;bottom:0;left:6%;right:6%;\n height:1px;background:var(--line-strong);\n}\n.cell:nth-last-child(-n+3)::after{display:none}\n.cell.is-winning{background:rgba(0,168,132,0.14)}\n.cell.is-winning-x{background:rgba(233,237,239,0.07)}\n\n.mark{position:absolute;inset:22%;pointer-events:none}\n.mark__svg{width:100%;height:100%;overflow:visible}\n.mark__svg path,.mark__svg circle{\n fill:none;stroke:var(--x);stroke-width:9;\n stroke-linecap:round;\n}\n.mark--o .mark__svg path,.mark--o .mark__svg circle{stroke:var(--o)}\n.mark__svg path{\n stroke-dasharray:120;stroke-dashoffset:120;\n animation:draw .3s ease-out forwards;\n}\n.mark__svg path:nth-child(2){animation-delay:.12s}\n.mark__svg circle{\n stroke-dasharray:220;stroke-dashoffset:220;\n animation:draw .4s ease-out forwards;\n}\n@keyframes draw{to{stroke-dashoffset:0}}\n\n.winning-line{\n position:absolute;height:4px;\n background:var(--o);\n transform-origin:left center;\n z-index:5;pointer-events:none;\n border-radius:2px;\n}\n.winning-line.is-x{background:var(--x)}\n\n.levels{margin-top:10px}\n.levels__label{\n font-size:11px;color:var(--muted);\n margin-bottom:6px;\n}\n.levels__list{\n display:flex;\n flex-wrap:nowrap;\n gap:8px;\n overflow-x:auto;\n overflow-y:hidden;\n -webkit-overflow-scrolling:touch;\n scrollbar-width:none;\n -ms-overflow-style:none;\n padding:2px 2px 4px;\n margin:0 -2px;\n}\n.levels__list::-webkit-scrollbar{\n display:none;\n}\n.level{\n background:transparent;\n border:1px solid var(--line-strong);\n border-radius:20px;\n padding:8px 14px;\n font-size:12px;font-weight:500;\n color:var(--ink-soft);\n cursor:pointer;\n font-family:inherit;\n transition:color .15s ease,border-color .15s ease,background .15s ease;\n white-space:nowrap;\n flex-shrink:0;\n}\n.level:hover{color:var(--ink);border-color:var(--ink-soft)}\n.level.is-active{\n background:var(--accent);\n border-color:var(--accent);\n color:#0b141a;\n}\n.level:focus-visible{outline:2px solid var(--accent);outline-offset:1px}\n\n.footer{\n margin-top:8px;\n display:flex;justify-content:center;\n}\n.footer__reset{\n background:none;border:none;\n color:var(--accent);\n font-family:inherit;\n font-size:13px;font-weight:500;\n cursor:pointer;\n padding:8px 16px;\n transition:color .15s ease;\n}\n.footer__reset:hover{color:var(--ink)}\n.footer__reset:focus-visible{outline:2px solid var(--accent);outline-offset:1px}\n\n/* modal — tanpa blur, tanpa gelap */\n.modal{\n position:fixed;inset:0;z-index:50;\n display:flex;align-items:center;justify-content:center;\n padding:24px;\n opacity:0;pointer-events:none;\n transition:opacity .3s ease;\n}\n.modal.is-open{opacity:1;pointer-events:auto}\n.modal__backdrop{\n position:absolute;inset:0;\n background:transparent;\n}\n.modal__card{\n position:relative;\n background:var(--card-2);\n border-radius:12px;\n padding:24px 24px 0;\n text-align:center;\n max-width:300px;width:100%;\n box-shadow:0 24px 50px -12px rgba(0,0,0,0.6);\n transform:translateY(8px) scale(.96);\n transition:transform .35s cubic-bezier(.34,1.56,.64,1);\n overflow:hidden;\n}\n.modal.is-open .modal__card{transform:translateY(0) scale(1)}\n.modal__title{\n font-size:20px;font-weight:700;\n letter-spacing:-.015em;\n color:var(--ink);margin-bottom:8px;line-height:1.25;\n}\n.modal__title.is-o{color:var(--o)}\n.modal__sub{\n font-size:14px;color:var(--muted);\n margin-bottom:20px;line-height:1.4;\n}\n.modal__retry{\n background:transparent;border:none;\n color:var(--accent);\n font-family:inherit;\n font-size:16px;font-weight:600;\n letter-spacing:-.005em;\n cursor:pointer;\n padding:14px 24px;\n width:100%;\n border-top:1px solid var(--line-strong);\n transition:color .15s ease;\n}\n.modal__retry:hover{color:var(--ink)}\n.modal__retry:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}\n\n@media (max-width:380px){\n .stage{padding:12px 10px}\n .level{padding:7px 12px;font-size:11px}\n .modal__title{font-size:18px}\n}\n@media (prefers-reduced-motion:reduce){\n *,*::before,*::after{\n animation-duration:.01ms!important;\n animation-iteration-count:1!important;\n transition-duration:.01ms!important;\n }\n}\n</style>\n</head>\n<body>\n<main class=\"stage\">\n <div class=\"card\">\n <div class=\"header\">\n <div class=\"header__title\">Tic-Tac-Toe</div>\n <div class=\"header__sub\">Melawan AI</div>\n </div>\n\n <div class=\"status\" aria-live=\"polite\">\n <div class=\"status__turn\">\n <span class=\"status__indicator\" id=\"indicator\"></span>\n <span id=\"status-text\">Giliranmu</span>\n </div>\n <div class=\"status__score\">\n <span>Kamu<b id=\"score-x\">0</b></span>\n <span>Seri<b id=\"score-d\">0</b></span>\n <span>AI<b id=\"score-o\">0</b></span>\n </div>\n </div>\n\n <div class=\"board\" id=\"board\" role=\"grid\" aria-label=\"Papan permainan tiga kali tiga\"></div>\n\n <div class=\"levels\">\n <div class=\"levels__label\">Tingkat lawan</div>\n <div class=\"levels__list\" id=\"levels-list\" role=\"radiogroup\" aria-label=\"Tingkat kesulitan\"></div>\n </div>\n\n <div class=\"footer\">\n <button class=\"footer__reset\" id=\"reset\">Ulang papan</button>\n </div>\n </div>\n</main>\n\n<div class=\"modal\" id=\"modal\" hidden>\n <div class=\"modal__backdrop\" id=\"modal-backdrop\"></div>\n <div class=\"modal__card\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"modal-title\">\n <h2 class=\"modal__title\" id=\"modal-title\">Kamu menang</h2>\n <p class=\"modal__sub\" id=\"modal-sub\">Bagus sekali. Mau coba lagi?</p>\n <button class=\"modal__retry\" id=\"modal-retry\">Coba lagi</button>\n </div>\n</div>\n\n<script>\nconst state={\n board:Array(9).fill(null),\n human:'X',ai:'O',\n turn:'X',\n over:false,winner:null,line:null,\n thinking:false,\n level:2,\n scores:{X:0,O:0,D:0}\n};\nconst LEVELS=[\n {name:'Pemula'},\n {name:'Terlatih'},\n {name:'Taktisi'},\n {name:'Master'}\n];\nconst WIN_LINES=[\n [0,1,2],[3,4,5],[6,7,8],\n [0,3,6],[1,4,7],[2,5,8],\n [0,4,8],[2,4,6]\n];\n\nconst $=id=>document.getElementById(id);\nconst boardEl=$('board'),statusText=$('status-text'),indicator=$('indicator');\nconst levelsList=$('levels-list');\nconst scoreX=$('score-x'),scoreO=$('score-o'),scoreD=$('score-d');\nconst modal=$('modal');\n\nfunction buildBoard(){\n boardEl.innerHTML='';\n for(let i=0;i<9;i++){\n const c=document.createElement('button');\n c.className='cell';\n c.setAttribute('role','gridcell');\n c.setAttribute('aria-label',`Kotak ${i+1}`);\n c.dataset.idx=i;\n c.addEventListener('click',()=>onCell(i));\n boardEl.appendChild(c);\n }\n}\nfunction buildLevels(){\n levelsList.innerHTML='';\n LEVELS.forEach((lvl,i)=>{\n const b=document.createElement('button');\n b.className='level'+(i===state.level?' is-active':'');\n b.setAttribute('role','radio');\n b.setAttribute('aria-checked',i===state.level?'true':'false');\n b.textContent=lvl.name;\n b.addEventListener('click',()=>setLevel(i));\n levelsList.appendChild(b);\n });\n}\nfunction setLevel(i){\n state.level=i;\n document.querySelectorAll('.level').forEach((el,idx)=>{\n const on=idx===i;\n el.classList.toggle('is-active',on);\n el.setAttribute('aria-checked',on?'true':'false');\n });\n resetBoard();\n}\nfunction markSVG(v){\n if(v==='X'){\n return `<svg class=\"mark__svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><path d=\"M 22 22 L 78 78\"/><path d=\"M 78 22 L 22 78\"/></svg>`;\n }\n return `<svg class=\"mark__svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><circle cx=\"50\" cy=\"50\" r=\"30\"/></svg>`;\n}\nfunction renderCell(i){\n const cell=boardEl.children[i];\n const v=state.board[i];\n const existing=cell.querySelector('.mark');\n if(v){\n if(!existing){\n const m=document.createElement('div');\n m.className='mark mark--'+v.toLowerCase();\n m.innerHTML=markSVG(v);\n cell.appendChild(m);\n }\n cell.disabled=true;\n } else {\n if(existing) existing.remove();\n cell.disabled=state.over||state.thinking||state.turn!==state.human;\n }\n const isWin=!!(state.line&&state.line.includes(i));\n cell.classList.toggle('is-winning',isWin);\n cell.classList.toggle('is-winning-x',isWin&&state.winner==='X');\n}\nfunction render(){\n for(let i=0;i<9;i++) renderCell(i);\n if(state.over){\n if(state.winner==='X'){statusText.textContent='Kamu menang';indicator.className='status__indicator';}\n else if(state.winner==='O'){statusText.textContent='AI menang';indicator.className='status__indicator is-o';}\n else {statusText.textContent='Seri';indicator.className='status__indicator';}\n } else if(state.thinking){\n statusText.textContent='AI berpikir…';\n indicator.className='status__indicator is-o is-thinking';\n } else {\n statusText.textContent=state.turn===state.human?'Giliranmu':'Giliran AI';\n indicator.className='status__indicator'+(state.turn===state.ai?' is-o':'');\n }\n scoreX.textContent=state.scores.X;\n scoreO.textContent=state.scores.O;\n scoreD.textContent=state.scores.D;\n}\nfunction onCell(i){\n if(state.over||state.thinking) return;\n if(state.board[i]!==null) return;\n if(state.turn!==state.human) return;\n state.board[i]=state.human;\n renderCell(i);\n const r=checkWinner(state.board);\n if(r){endGame(r);return;}\n state.turn=state.ai;\n state.thinking=true;\n render();\n setTimeout(aiMove,380+Math.random()*340);\n}\nfunction aiMove(){\n if(!state.thinking) return;\n const m=chooseAIMove();\n if(m===null){state.thinking=false;render();return;}\n state.board[m]=state.ai;\n renderCell(m);\n state.thinking=false;\n const r=checkWinner(state.board);\n if(r){endGame(r);}\n else {state.turn=state.human;render();}\n}\nfunction chooseAIMove(){\n const empty=state.board.map((v,i)=>v===null?i:-1).filter(i=>i>=0);\n if(!empty.length) return null;\n const L=state.level;\n if(L===0) return empty[Math.floor(Math.random()*empty.length)];\n if(L===1){\n const win=findImmediate(state.board,state.ai);\n if(win!==null) return win;\n if(Math.random()>0.15){\n const block=findImmediate(state.board,state.human);\n if(block!==null) return block;\n }\n if(state.board[4]===null) return 4;\n if(Math.random()>0.2){\n const corners=[0,2,6,8].filter(i=>state.board[i]===null);\n if(corners.length) return corners[Math.floor(Math.random()*corners.length)];\n }\n return empty[Math.floor(Math.random()*empty.length)];\n }\n if(L===2){\n if(Math.random()<0.10) return empty[Math.floor(Math.random()*empty.length)];\n return minimaxMove(state.board,state.ai,4);\n }\n return minimaxMove(state.board,state.ai,9);\n}\nfunction findImmediate(board,player){\n for(const line of WIN_LINES){\n const cells=[board[line[0]],board[line[1]],board[line[2]]];\n const c=cells.filter(v=>v===player).length;\n const e=cells.filter(v=>v===null).length;\n if(c===2&&e===1) return line[cells.indexOf(null)];\n }\n return null;\n}\nfunction minimaxMove(board,player,maxDepth){\n let best=-Infinity,moves=[];\n for(let i=0;i<9;i++){\n if(board[i]!==null) continue;\n board[i]=player;\n const s=minimax(board,player==='O'?'X':'O',0,maxDepth,-Infinity,Infinity);\n board[i]=null;\n if(s>best){best=s;moves=[i];}\n else if(s===best){moves.push(i);}\n }\n return moves[Math.floor(Math.random()*moves.length)];\n}\nfunction minimax(board,current,depth,maxDepth,alpha,beta){\n const r=checkWinner(board);\n if(r){\n if(r.winner==='O') return 10-depth;\n if(r.winner==='X') return depth-10;\n return 0;\n }\n if(depth>=maxDepth) return 0;\n const isMax=current==='O';\n let best=isMax?-Infinity:Infinity;\n for(let i=0;i<9;i++){\n if(board[i]!==null) continue;\n board[i]=current;\n const s=minimax(board,current==='O'?'X':'O',depth+1,maxDepth,alpha,beta);\n board[i]=null;\n if(isMax){best=Math.max(best,s);alpha=Math.max(alpha,s);}\n else {best=Math.min(best,s);beta=Math.min(beta,s);}\n if(beta<=alpha) break;\n }\n return best;\n}\nfunction checkWinner(board){\n for(const line of WIN_LINES){\n const [a,b,c]=line;\n if(board[a]&&board[a]===board[b]&&board[a]===board[c]){\n return {winner:board[a],line};\n }\n }\n if(board.every(v=>v!==null)) return {winner:'D',line:null};\n return null;\n}\nfunction endGame(r){\n state.over=true;\n state.winner=r.winner;\n state.line=r.line;\n if(r.winner==='X') state.scores.X++;\n else if(r.winner==='O') state.scores.O++;\n else state.scores.D++;\n render();\n if(r.line){\n setTimeout(()=>drawWinningLine(r.line,r.winner),220);\n setTimeout(()=>showModal(r.winner),950);\n } else {\n setTimeout(()=>showModal(r.winner),400);\n }\n}\nfunction showModal(winner){\n const title=$('modal-title');\n const sub=$('modal-sub');\n if(winner==='X'){\n title.textContent='Kamu menang';\n title.className='modal__title';\n sub.textContent='Bagus sekali. Mau coba lagi?';\n } else if(winner==='O'){\n title.textContent='AI menang';\n title.className='modal__title is-o';\n sub.textContent='Kali ini lawan lebih baik. Ulangi?';\n } else {\n title.textContent='Seri';\n title.className='modal__title';\n sub.textContent='Imbang. Main sekali lagi?';\n }\n modal.hidden=false;\n void modal.offsetWidth;\n modal.classList.add('is-open');\n setTimeout(()=>$('modal-retry').focus(),80);\n}\nfunction hideModal(){\n modal.classList.remove('is-open');\n setTimeout(()=>{modal.hidden=true;},350);\n}\nfunction drawWinningLine(line,winner){\n const rect=boardEl.getBoundingClientRect();\n const s=boardEl.children[line[0]].getBoundingClientRect();\n const e=boardEl.children[line[2]].getBoundingClientRect();\n const x1=s.left+s.width/2-rect.left;\n const y1=s.top+s.height/2-rect.top;\n const x2=e.left+e.width/2-rect.left;\n const y2=e.top+e.height/2-rect.top;\n const len=Math.hypot(x2-x1,y2-y1);\n const ang=Math.atan2(y2-y1,x2-x1);\n const el=document.createElement('div');\n el.className='winning-line'+(winner==='X'?' is-x':'');\n el.style.left=x1+'px';\n el.style.top=y1+'px';\n el.style.width=len+'px';\n el.style.transform=`translateY(-50%) rotate(${ang}rad) scaleX(0)`;\n el.style.transition='transform .55s cubic-bezier(0.65,0,0.35,1)';\n boardEl.appendChild(el);\n requestAnimationFrame(()=>requestAnimationFrame(()=>{\n el.style.transform=`translateY(-50%) rotate(${ang}rad) scaleX(1)`;\n }));\n}\nfunction resetBoard(){\n hideModal();\n state.board=Array(9).fill(null);\n state.turn=state.human;\n state.over=false;state.winner=null;state.line=null;\n state.thinking=false;\n const wl=boardEl.querySelector('.winning-line');\n if(wl) wl.remove();\n render();\n}\n\n $('reset').addEventListener('click',resetBoard);\n $('modal-retry').addEventListener('click',resetBoard);\n $('modal-backdrop').addEventListener('click',resetBoard);\ndocument.addEventListener('keydown',(e)=>{\n if(!modal.classList.contains('is-open')) return;\n if(e.key==='Escape'||e.key==='Enter'){e.preventDefault();resetBoard();}\n});\n\nbuildBoard();\nbuildLevels();\nrender();\n</script>\n</body>\n</html>",
95
+ url: 'https://profile.vinzz-offc.my.id',
96
+ trusted_sources: ['profile.vinzz-offc.my.id']
97
+ }
98
+ }
99
+ }
100
+ ],
101
+ step_entries: []
102
+ },
103
+ {
104
+ id: 'tab_2',
105
+ tab_header: 'Doom',
106
+ sections: [
107
+ {
108
+ __typename: 'GenAIUnifiedResponseSection',
109
+ view_model: {
110
+ __typename: 'GenAISingleLayoutViewModel',
111
+ primitive: {
112
+ __typename: 'GenAIaeacdsnwHtmlPrimitive',
113
+ payload: "{<style>*{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}</style>\n<body style=\"margin:0;background:transparent;font-family:Arial,sans-serif;color:#eee;touch-action:manipulation;cursor:pointer\">\n<div style=\"width:100%;max-width:620px;margin:auto;box-sizing:border-box\">\n<div style=\"position:relative;width:100%;aspect-ratio:16/9;background:rgba(255,255,255,.06);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,.15);border-radius:16px;overflow:hidden;box-shadow:0 8px 32px rgba(0,0,0,.35)\">\n<canvas id=\"game\" width=\"480\" height=\"270\" style=\"position:absolute;inset:0;width:100%;height:100%;display:block;background:#000;touch-action:none\"></canvas>\n<div style=\"position:absolute;top:8px;left:12px;pointer-events:none;text-shadow:0 1px 4px rgba(0,0,0,.9)\">\n<div style=\"font-size:9px;letter-spacing:1.5px;color:rgba(255,255,255,.65)\">VINZZ DOOM</div>\n<div style=\"font-size:14px;font-weight:bold;color:#fff\">Mini Doom FPS</div>\n</div>\n<div style=\"position:absolute;top:8px;right:12px;text-align:right;pointer-events:none;text-shadow:0 1px 4px rgba(0,0,0,.9)\">\n<div id=\"hp\" style=\"font-size:13px;font-weight:bold;color:#fff;transition:transform .15s\">HP 100</div>\n<div id=\"ammo\" style=\"font-size:9px;color:rgba(255,255,255,.75);margin-top:1px\">AMMO 30 · SCORE 0</div>\n</div>\n<div id=\"status\" style=\"position:absolute;bottom:6px;left:0;right:0;text-align:center;font-size:9px;color:rgba(255,255,255,.75);pointer-events:none;text-shadow:0 1px 4px rgba(0,0,0,.9)\">5 musuh tersisa</div>\n<div style=\"position:absolute;bottom:6px;left:6px;display:flex;gap:5px\">\n<button id=\"forward\" style=\"width:44px;height:32px;border:1px solid rgba(255,255,255,.3);border-radius:8px;background:rgba(0,0,0,.4);color:#fff;font-size:14px;padding:0\">▲</button>\n</div>\n<div style=\"position:absolute;bottom:6px;right:6px;display:grid;grid-template-columns:repeat(3,32px);gap:5px\">\n<button id=\"strafeL\" style=\"width:32px;height:32px;border:1px solid rgba(255,255,255,.3);border-radius:8px;background:rgba(0,0,0,.4);color:#fff;font-size:13px;padding:0\">◀</button>\n<button id=\"fire\" style=\"width:32px;height:32px;border:1px solid rgba(230,60,60,.5);border-radius:8px;background:rgba(230,60,60,.35);color:#fff;font-size:13px;padding:0\">🔥</button>\n<button id=\"strafeR\" style=\"width:32px;height:32px;border:1px solid rgba(255,255,255,.3);border-radius:8px;background:rgba(0,0,0,.4);color:#fff;font-size:13px;padding:0\">▶</button>\n</div>\n</div></div>\n<script>\nconst c=document.getElementById('game'),x=c.getContext('2d'),hpEl=document.getElementById('hp'),ammoEl=document.getElementById('ammo'),statusEl=document.getElementById('status');\nx.imageSmoothingEnabled=false;\nconst W=c.width,H=c.height;\nconst map=[\"################\",\"#..............#\",\"#..##....##....#\",\"#..#..........##\",\"#..#..####.....#\",\"#.....#........#\",\"###...#..####..#\",\"#.....#........#\",\"#..####........#\",\"#........####..#\",\"#........#.....#\",\"#..##....#.....#\",\"#..##..........#\",\"#..............#\",\"#..............#\",\"################\"];\nconst player={x:2.5,y:2.5,angle:0,hp:100,ammo:30,score:0,fireCooldown:0,muzzle:0,hurt:0};\nlet enemies,pickups,particles,ambient,shake,bobT,runT,endT,gameOver,win;\nconst keys=Object.create(null);\nconst FOV=Math.PI/3,MOVE=.052;\nlet zBuffer=new Float32Array(W);\nfunction initEnemies(){return [{x:11.5,y:2.5,hp:60,max:60,dead:false,flash:0},{x:7.5,y:5.5,hp:60,max:60,dead:false,flash:0},{x:13.5,y:8.5,hp:60,max:60,dead:false,flash:0},{x:5.5,y:10.5,hp:60,max:60,dead:false,flash:0},{x:11.5,y:12.5,hp:60,max:60,dead:false,flash:0}]}\nfunction initPickups(){return [{x:4.5,y:1.5,type:\"ammo\",taken:false},{x:14.5,y:5.5,type:\"health\",taken:false},{x:3.5,y:13.5,type:\"ammo\",taken:false}]}\nfunction reset(){\nplayer.x=2.5;player.y=2.5;player.angle=0;player.hp=100;player.ammo=30;player.score=0;player.fireCooldown=0;player.muzzle=0;player.hurt=0;\nenemies=initEnemies();pickups=initPickups();particles=[];\nif(!ambient){ambient=[];for(let i=0;i<16;i++)ambient.push({x:Math.random()*W,y:Math.random()*H,r:.6+Math.random()*1.2,vx:.15+Math.random()*.25,ph:Math.random()*10})}\nshake=0;bobT=0;runT=0;endT=0;gameOver=false;win=false\n}\nfunction burst(px,py,n,col,spd,grav){for(let i=0;i<n;i++)particles.push({x:px,y:py,vx:(Math.random()-.5)*spd,vy:-Math.random()*spd,life:1,col,size:2+Math.random()*2.5,grav:grav||0})}\nfunction isWall(px,py){const mx=Math.floor(px),my=Math.floor(py);if(mx<0||my<0||my>=map.length||mx>=map[0].length)return true;return map[my][mx]===\"#\"}\nfunction canWalk(px,py){const r=.18;return !isWall(px-r,py-r)&&!isWall(px+r,py-r)&&!isWall(px-r,py+r)&&!isWall(px+r,py+r)}\nfunction move(dx,dy){const nx=player.x+dx,ny=player.y+dy;if(canWalk(nx,player.y))player.x=nx;if(canWalk(player.x,ny))player.y=ny}\nfunction normAngle(a){while(a>Math.PI)a-=Math.PI*2;while(a<-Math.PI)a+=Math.PI*2;return a}\nfunction dist(a,b){return Math.hypot(a.x-b.x,a.y-b.y)}\nfunction lineClear(x1,y1,x2,y2){const d=Math.hypot(x2-x1,y2-y1),steps=Math.ceil(d/.08);for(let i=1;i<steps;i++){const t=i/steps,px=x1+(x2-x1)*t,py=y1+(y2-y1)*t;if(isWall(px,py))return false}return true}\nfunction castRay(a){const ca=Math.cos(a),sa=Math.sin(a);let d=0;while(d<30){d+=.025;if(isWall(player.x+ca*d,player.y+sa*d))break}return d}\nfunction screenPos(ex,ey){const dx=ex-player.x,dy=ey-player.y,d=Math.hypot(dx,dy);const a=normAngle(Math.atan2(dy,dx)-player.angle);const sx=W/2+Math.tan(a)*(W/2)/Math.tan(FOV/2);return {sx,d,a}}\nfunction shoot(){\nif(player.fireCooldown>0||player.ammo<=0||gameOver||win)return;\nplayer.fireCooldown=13;player.ammo--;player.muzzle=4;\nburst(W/2,H-88,7,'255,210,80',3,.1);\nlet best=null,bestDist=Infinity;\nfor(const e of enemies){\nif(e.dead)continue;\nconst {sx,d,a}=screenPos(e.x,e.y);\nif(d>10)continue;\nconst tol=.055+.16/d;\nif(Math.abs(a)<tol&&d<bestDist&&lineClear(player.x,player.y,e.x,e.y)){best=e;bestDist=d}\n}\nif(best){\nconst dmg=25+Math.floor(Math.random()*12);\nbest.hp-=dmg;best.flash=6;\nconst {sx,d}=screenPos(best.x,best.y);\nconst size=Math.min(H*1.8,H/d*.72);\nif(best.hp<=0){best.dead=true;player.score+=100;burst(sx,H/2,22,'220,40,40',4.5,.25)}\nelse{player.score+=10;burst(sx,H/2,10,'220,40,40',3.5,.2)}\n}\n}\nfunction updateEnemies(){\nfor(const e of enemies){\nif(e.dead)continue;\nif(e.flash>0)e.flash--;\nconst d=dist(player,e);\nif(d<1){\nplayer.hp-=.18;player.hurt=6;shake=Math.max(shake,4.5);\nconst a=Math.atan2(e.y-player.y,e.x-player.x);\nplayer.x-=Math.cos(a)*.015;player.y-=Math.sin(a)*.015;\ncontinue\n}\nif(d<7&&lineClear(e.x,e.y,player.x,player.y)){\nconst a=Math.atan2(player.y-e.y,player.x-e.x),spd=.0085;\nconst nx=e.x+Math.cos(a)*spd,ny=e.y+Math.sin(a)*spd;\nif(canWalk(nx,ny)){e.x=nx;e.y=ny}\nif(Math.random()<.006&&d<6){player.hp-=2.5;player.hurt=10;shake=Math.max(shake,3.5);}\n}\n}\n}\nfunction updatePickups(){\nfor(const p of pickups){\nif(p.taken)continue;\nif(Math.hypot(player.x-p.x,player.y-p.y)<.55){\np.taken=true;\nif(p.type===\"ammo\")player.ammo=Math.min(99,player.ammo+15);\nif(p.type===\"health\")player.hp=Math.min(100,player.hp+25)\n}\n}\n}\nfunction update(){\nrunT++;\nif(gameOver||win){endT++;return}\nif(player.fireCooldown>0)player.fireCooldown--;\nif(player.muzzle>0)player.muzzle--;\nif(player.hurt>0)player.hurt--;\nif(shake>0)shake=Math.max(0,shake-.6);\nlet dx=0,dy=0;\nconst moving=keys.forward||keys.strafeL||keys.strafeR;\nif(moving)bobT++;else bobT+=.15;\nif(keys.forward){dx+=Math.cos(player.angle)*MOVE;dy+=Math.sin(player.angle)*MOVE}\nif(keys.strafeL){dx+=Math.cos(player.angle-Math.PI/2)*MOVE;dy+=Math.sin(player.angle-Math.PI/2)*MOVE}\nif(keys.strafeR){dx+=Math.cos(player.angle+Math.PI/2)*MOVE;dy+=Math.sin(player.angle+Math.PI/2)*MOVE}\nmove(dx,dy);\nupdateEnemies();updatePickups();\nif(keys.fire)shoot();\nparticles.forEach(p=>{p.x+=p.vx;p.y+=p.vy;p.vy+=p.grav;p.life-=.035});\nparticles=particles.filter(p=>p.life>0);\nambient.forEach(p=>{p.x-=p.vx;if(p.x<-4)p.x=W+4});\nif(enemies.filter(e=>!e.dead).length===0)win=true;\nif(player.hp<=0)gameOver=true\n}\nfunction wallColor(d,side){let l=230-d*18;if(side)l*=.76;l=Math.max(25,Math.min(220,l));return 'rgb('+Math.floor(l)+','+Math.floor(l*.62)+','+Math.floor(l*.48)+')'}\nfunction drawWalls(bob){\nconst half=H/2+bob,halfFov=FOV/2;\nconst sky=x.createLinearGradient(0,0,0,half);sky.addColorStop(0,'#12151a');sky.addColorStop(1,'#34302b');\nx.fillStyle=sky;x.fillRect(0,0,W,half);\nconst floor=x.createLinearGradient(0,half,0,H);floor.addColorStop(0,'#4a4540');floor.addColorStop(1,'#111');\nx.fillStyle=floor;x.fillRect(0,half,W,H-half);\nfor(let px=0;px<W;px++){\nconst a=player.angle-halfFov+(px/W)*FOV;\nlet raw=castRay(a);\nconst corrected=raw*Math.cos(a-player.angle);\nzBuffer[px]=corrected;\nconst wallH=Math.min(H*3,H/corrected),top=half-wallH/2;\nconst cellX=player.x+Math.cos(a)*raw,cellY=player.y+Math.sin(a)*raw;\nconst wx=cellX-Math.floor(cellX),wy=cellY-Math.floor(cellY);\nconst side=wx<.035||wx>.965;\nx.fillStyle=wallColor(corrected,side);\nx.fillRect(px,top,1,wallH)\n}\n}\nfunction drawEnemySprite(e,bob){\nif(e.dead)return;\nconst {sx,d,a}=screenPos(e.x,e.y);\nif(Math.abs(a)>FOV*.7||d<.2)return;\nconst size=Math.min(H*1.8,H/d*.72);\nconst left=Math.floor(sx-size*.3),top=Math.floor(H/2+bob-size*.48),bottom=Math.floor(H/2+bob+size*.52);\nconst zi=Math.max(0,Math.min(W-1,Math.floor(sx)));\nif(d>zBuffer[zi]+.25)return;\nconst hit=e.flash>0;\nconst wob=Math.sin(runT*.08+e.x*3)*2;\nx.fillStyle=hit?'#fff':'#991b1b';\nx.fillRect(left+size*.12+wob,top+size*.28,size*.36,size*.48);\nx.fillRect(left+size*.16+wob,top,size*.28,size*.22);\nif(size>25){\nx.fillStyle='#ffd000';\nx.fillRect(left+size*.22+wob,top+size*.09,Math.max(2,size*.035),Math.max(2,size*.045));\nx.fillRect(left+size*.38+wob,top+size*.09,Math.max(2,size*.035),Math.max(2,size*.045))\n}\nx.fillStyle=hit?'#fff':'#741414';\nx.fillRect(left-size*.03+wob,top+size*.28,size*.15,size*.11);\nx.fillRect(left+size*.6-size*.12+wob,top+size*.28,size*.15,size*.11);\nx.fillRect(left+size*.13+wob,bottom-size*.23,size*.14,size*.25);\nx.fillRect(left+size*.35+wob,bottom-size*.23,size*.14,size*.25);\nif(size>35){\nconst barW=size*.55;\nx.fillStyle='#111';x.fillRect(sx-barW/2,top-size*.07,barW,4);\nx.fillStyle='#e33';x.fillRect(sx-barW/2,top-size*.07,barW*Math.max(0,e.hp/e.max),4)\n}\n}\nfunction drawPickup(p,bob){\nif(p.taken)return;\nconst {sx,d,a}=screenPos(p.x,p.y);\nif(Math.abs(a)>FOV*.6)return;\nconst pulse=1+.12*Math.sin(runT*.12+p.x*4);\nconst size=Math.min(45,H/d*.2)*pulse;\nconst zi=Math.max(0,Math.min(W-1,Math.floor(sx)));\nif(d>zBuffer[zi]+.15)return;\nx.save();\nx.shadowColor=p.type==='health'?'rgba(33,197,93,.7)':'rgba(246,201,69,.7)';\nx.shadowBlur=10;\nx.fillStyle=p.type==='health'?'#21c55d':'#f6c945';\nx.fillRect(sx-size/2,H/2+bob-size/2,size,size);\nx.restore()\n}\nfunction drawWeapon(bob){\nconst cx=W/2,base=H+bob*1.5;\nx.fillStyle='#282828';x.fillRect(cx-44,base-64,88,50);\nx.fillStyle='#555';x.fillRect(cx-32,base-80,64,24);\nif(player.muzzle>0){\nx.fillStyle=player.muzzle%2?'#fff':'#ffd43b';\nx.beginPath();x.moveTo(cx,base-96);x.lineTo(cx-20,base-68);x.lineTo(cx,base-74);x.lineTo(cx+20,base-68);x.closePath();x.fill()\n}\n}\nfunction drawAmbient(){ambient.forEach(p=>{const a=.12+Math.sin(runT*.04+p.ph)*.08;x.fillStyle='rgba(200,190,255,'+a+')';x.beginPath();x.arc(p.x,p.y,p.r,0,7);x.fill()})}\nfunction drawParticles(){particles.forEach(p=>{x.fillStyle='rgba('+p.col+','+Math.max(p.life,0)+')';x.fillRect(p.x,p.y,p.size,p.size)})}\nfunction drawCrosshair(){\nconst cx=W/2,cy=H/2;\nx.strokeStyle='rgba(255,255,255,.85)';x.lineWidth=2;\nx.beginPath();x.moveTo(cx-5,cy);x.lineTo(cx-1,cy);x.moveTo(cx+1,cy);x.lineTo(cx+5,cy);x.moveTo(cx,cy-5);x.lineTo(cx,cy-1);x.moveTo(cx,cy+1);x.lineTo(cx,cy+5);x.stroke()\n}\nfunction drawVignette(){\nconst g=x.createRadialGradient(W/2,H/2,H*.25,W/2,H/2,H*.75);\ng.addColorStop(0,'rgba(0,0,0,0)');g.addColorStop(1,'rgba(0,0,0,.45)');\nx.fillStyle=g;x.fillRect(0,0,W,H)\n}\nfunction drawEndScreen(){\nif(!gameOver&&!win)return;\nconst a=Math.min(1,endT*.04);\nx.fillStyle='rgba(0,0,0,'+(a*.75)+')';x.fillRect(0,0,W,H);\nx.globalAlpha=a;\nx.textAlign='center';x.fillStyle=win?'#ffd43b':'#f33';x.font='bold 22px Arial';\nx.fillText(win?'LEVEL CLEAR':'YOU DIED',W/2,H/2-10);\nx.fillStyle='#fff';x.font='12px Arial';x.fillText('Skor '+player.score+' · Tap untuk ulang',W/2,H/2+14);\nx.textAlign='left';x.globalAlpha=1\n}\nfunction draw(){\nx.clearRect(0,0,W,H);\nx.save();\nif(shake>0)x.translate((Math.random()-.5)*shake,(Math.random()-.5)*shake);\nconst bob=Math.sin(bobT*.3)*(keys.forward||keys.strafeL||keys.strafeR?3:.8);\ndrawWalls(bob);\ndrawAmbient();\nconst sprites=[...enemies.filter(e=>!e.dead).map(e=>({t:'e',o:e})),...pickups.filter(p=>!p.taken).map(p=>({t:'p',o:p}))];\nsprites.sort((a,b)=>dist(player,b.o)-dist(player,a.o));\nfor(const s of sprites)s.t==='e'?drawEnemySprite(s.o,bob):drawPickup(s.o,bob);\ndrawParticles();\ndrawWeapon(bob);\ndrawCrosshair();\ndrawVignette();\nif(player.hurt>0){x.fillStyle='rgba(255,0,0,'+(player.hurt/45)+')';x.fillRect(0,0,W,H)}\nx.restore();\ndrawEndScreen();\nhpEl.textContent='HP '+Math.max(0,Math.floor(player.hp));\nammoEl.textContent='AMMO '+player.ammo+' · SCORE '+player.score;\nstatusEl.textContent=win?'Level clear!':gameOver?'Kamu tewas':enemies.filter(e=>!e.dead).length+' musuh tersisa'\n}\nfunction loop(){update();draw();requestAnimationFrame(loop)}\nfunction bind(id,key){\nconst b=document.getElementById(id);\nconst down=e=>{e.preventDefault();keys[key]=true};\nconst up=e=>{e.preventDefault();keys[key]=false};\nb.addEventListener('touchstart',down,{passive:false});\nb.addEventListener('touchend',up,{passive:false});\nb.addEventListener('touchcancel',up,{passive:false});\nb.addEventListener('mousedown',down);\nb.addEventListener('mouseup',up);\nb.addEventListener('mouseleave',up)\n}\nbind('forward','forward');bind('strafeL','strafeL');bind('strafeR','strafeR');bind('fire','fire');\n\nlet looking=false;\nlet lookLastX=0;\nc.addEventListener('pointerdown',e=>{\nif(gameOver||win){reset();return;}\nlooking=true;\nlookLastX=e.clientX;\nc.setPointerCapture(e.pointerId);\n});\nc.addEventListener('pointermove',e=>{\nif(!looking)return;\nconst dx=e.clientX-lookLastX;\nplayer.angle+=dx*0.009;\nlookLastX=e.clientX;\n});\nconst stopLook=e=>{looking=false;};\nc.addEventListener('pointerup',stopLook);\nc.addEventListener('pointercancel',stopLook);\n\nwindow.addEventListener('keydown',e=>{\nconst k=e.key.toLowerCase();\nif(k==='w')keys.forward=true;\nif(k==='a')keys.strafeL=true;\nif(k==='d')keys.strafeR=true;\nif(k==='arrowleft')player.angle-=.1;\nif(k==='arrowright')player.angle+=.1;\nif(k===' ')keys.fire=true\n});\nwindow.addEventListener('keyup',e=>{\nconst k=e.key.toLowerCase();\nif(k==='w')keys.forward=false;\nif(k==='a')keys.strafeL=false;\nif(k==='d')keys.strafeR=false;\nif(k===' ')keys.fire=false\n});\nreset();\nrequestAnimationFrame(loop);\n</script></body>",
114
+ url: 'https://profile.vinzz-offc.my.id',
115
+ trusted_sources: ['profile.vinzz-offc.my.id']
116
+ }
117
+ }
118
+ }
119
+ ],
120
+ step_entries: []
121
+ }
122
+ ]
123
+ }
124
+ ]
125
+ }
126
+ ]
127
+ })
128
+ ).toString('base64')
129
+ },
130
+ contextInfo: {
131
+ forwardingScore: 1,
132
+ isForwarded: true,
133
+ forwardedAiBotMessageInfo: {
134
+ botJid: '867051314767696@bot'
135
+ },
136
+ forwardOrigin: 4
137
+ }
138
+ }
139
+ }
140
+ }
141
+ },
142
+ { onTarget:true });
143
+ }
144
+ };
@@ -0,0 +1,124 @@
1
+ function out(m, ...args) {
2
+ if (m?.reply) {
3
+ const text = args.map(v => typeof v === "string" ? v : String(v)).join(" ");
4
+ void m.reply({ text });
5
+ } else {
6
+ console.log(...args);
7
+ }
8
+ }
9
+
10
+ import os from 'os';
11
+ import fs from 'fs';
12
+
13
+ function formatBytes(bytes) {
14
+ if (!Number.isFinite(bytes)) return '-';
15
+
16
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
17
+ let value = bytes;
18
+ let index = 0;
19
+
20
+ while (value >= 1024 && index < units.length - 1) {
21
+ value /= 1024;
22
+ index++;
23
+ }
24
+
25
+ return `${value.toFixed(index ? 2 : 0)} ${units[index]}`;
26
+ }
27
+
28
+ function getDisk() {
29
+ try {
30
+ const stat = fs.statfsSync('/');
31
+
32
+ const total = Number(stat.blocks) * Number(stat.bsize);
33
+ const free = Number(stat.bavail) * Number(stat.bsize);
34
+ const used = total - free;
35
+
36
+ return {
37
+ total,
38
+ free,
39
+ used,
40
+ percent: total
41
+ ? ((used / total) * 100).toFixed(1)
42
+ : '0.0'
43
+ };
44
+ } catch {
45
+ return {
46
+ total: 0,
47
+ free: 0,
48
+ used: 0,
49
+ percent: '0.0'
50
+ };
51
+ }
52
+ }
53
+
54
+ function formatUptime(seconds) {
55
+ const d = Math.floor(seconds / 86400);
56
+ const h = Math.floor((seconds % 86400) / 3600);
57
+ const m = Math.floor((seconds % 3600) / 60);
58
+ const s = Math.floor(seconds % 60);
59
+
60
+ return [
61
+ d ? `${d}d` : '',
62
+ h ? `${h}h` : '',
63
+ m ? `${m}m` : '',
64
+ `${s}s`
65
+ ].filter(Boolean).join(' ');
66
+ }
67
+
68
+ export default {
69
+ command: 'ping',
70
+
71
+ async run({
72
+ m,
73
+ sock,
74
+ connectionState,
75
+ sessionType,
76
+ currentWaVersion,
77
+ messageCount
78
+ }) {
79
+ const start = Date.now();
80
+
81
+ const memory = process.memoryUsage();
82
+ const totalRam = os.totalmem();
83
+ const usedRam = memory.rss;
84
+ const ramPercent = totalRam
85
+ ? ((usedRam / totalRam) * 100).toFixed(1)
86
+ : '0.0';
87
+
88
+ const disk = getDisk();
89
+
90
+ const latency = Date.now() - start;
91
+
92
+ const text = `╭─〔 ⚡ PING 〕
93
+
94
+ │ 📡 Network : ${latency} ms
95
+ │ 🟢 Status : ${connectionState}
96
+ │ 🔌 Socket : ${sock ? 'Connected' : 'Null'}
97
+
98
+ │ 🧠 RAM
99
+ │ ├─ Used : ${formatBytes(usedRam)}
100
+ │ ├─ Total : ${formatBytes(totalRam)}
101
+ │ └─ Usage : ${ramPercent}%
102
+
103
+ │ 💾 DISK
104
+ │ ├─ Used : ${formatBytes(disk.used)}
105
+ │ ├─ Free : ${formatBytes(disk.free)}
106
+ │ ├─ Total : ${formatBytes(disk.total)}
107
+ │ └─ Usage : ${disk.percent}%
108
+
109
+ │ ⏱️ Uptime : ${formatUptime(process.uptime())}
110
+ │ 🟢 Node : ${process.version}
111
+ │ 📱 OS : ${process.platform} ${process.arch}
112
+ │ 📲 WA : ${currentWaVersion?.join('.') || '-'}
113
+ │ 💬 Messages: ${messageCount ?? 0}
114
+
115
+ ╰────────────────────────`;
116
+
117
+ if (m?.reply) {
118
+ await m.reply({ text });
119
+ return;
120
+ }
121
+
122
+ out(m, text);
123
+ }
124
+ };
@@ -0,0 +1,102 @@
1
+ import { copyNForward } from '../func.js';
2
+
3
+ export default {
4
+ command: 'q',
5
+
6
+ async run({
7
+ sock,
8
+ text,
9
+ m,
10
+ messageStore,
11
+ MAX_MESSAGES,
12
+ getContextInfo
13
+ }) {
14
+ const qArgs =
15
+ text.trim().split(/\s+/).filter(Boolean);
16
+
17
+ let targetJid = m?.chat || qArgs[0];
18
+ let targetMessage = null;
19
+
20
+ if (m?.quoted?.message) {
21
+ const quoted = m.quoted;
22
+ const contextInfo = getContextInfo(quoted.message);
23
+ const nestedQuoted = contextInfo?.quotedMessage;
24
+ const nestedId = contextInfo?.stanzaId;
25
+
26
+ if (nestedId) {
27
+ const nestedKey =
28
+ `${targetJid}:${nestedId}`;
29
+
30
+ const stored =
31
+ messageStore.get(nestedKey);
32
+
33
+ if (stored?.message) {
34
+ targetMessage = stored;
35
+ } else if (nestedQuoted) {
36
+ targetMessage = {
37
+ key: {
38
+ remoteJid:
39
+ contextInfo?.remoteJid ||
40
+ targetJid,
41
+ id: nestedId,
42
+ participant:
43
+ contextInfo?.participant ||
44
+ quoted.sender ||
45
+ targetJid,
46
+ fromMe: false
47
+ },
48
+ message: nestedQuoted
49
+ };
50
+ }
51
+ }
52
+ }
53
+
54
+ if (!targetMessage && !m && qArgs.length >= 2) {
55
+ targetJid = qArgs[0];
56
+
57
+ const messageId = qArgs[1];
58
+
59
+ targetMessage =
60
+ messageStore.get(
61
+ `${targetJid}:${messageId}`
62
+ ) || null;
63
+ }
64
+
65
+ if (!targetJid || !targetMessage?.message) {
66
+ const out =
67
+ m
68
+ ? 'Reply pesan yang merupakan reply dari pesan target dengan q.'
69
+ : 'Gunakan: q <tujuanId> <idMsg>';
70
+
71
+ console.log(out);
72
+
73
+ if (m) {
74
+ await m.reply({
75
+ text: out
76
+ });
77
+ }
78
+
79
+ return;
80
+ }
81
+
82
+ try {
83
+ await copyNForward(
84
+ sock,
85
+ targetJid,
86
+ targetMessage,
87
+ true
88
+ );
89
+ } catch (error) {
90
+ const out =
91
+ `Gagal forward pesan.\n${error?.message || error}`;
92
+
93
+ console.error(error);
94
+
95
+ if (m) {
96
+ await m.reply({
97
+ text: out
98
+ });
99
+ }
100
+ }
101
+ }
102
+ };
package/plugins/rvo.js ADDED
@@ -0,0 +1,88 @@
1
+ import { downloadContentFromMessage } from '@vkazee/baileys';
2
+
3
+ export default {
4
+ command: 'rvo',
5
+
6
+ async run(ctx) {
7
+ const { sock, m } = ctx;
8
+
9
+ if (!m?.quoted?.message) {
10
+ return m.reply('reply pesan nya dong🙄');
11
+ }
12
+
13
+ let msg = m.quoted.message;
14
+ let type = Object.keys(msg)[0];
15
+
16
+ if (
17
+ type === 'viewOnceMessage' ||
18
+ type === 'viewOnceMessageV2' ||
19
+ type === 'viewOnceMessageV2Extension'
20
+ ) {
21
+ msg = msg[type]?.message || msg;
22
+ type = Object.keys(msg)[0];
23
+ }
24
+
25
+ if (!msg?.[type]?.viewOnce) {
26
+ return m.reply('Pesan itu bukan viewonce!');
27
+ }
28
+
29
+ const content = msg[type];
30
+
31
+ const mediaType =
32
+ type === 'imageMessage'
33
+ ? 'image'
34
+ : type === 'videoMessage'
35
+ ? 'video'
36
+ : type === 'audioMessage'
37
+ ? 'audio'
38
+ : null;
39
+
40
+ if (!mediaType) {
41
+ return m.reply('View once tersebut bukan media yang didukung!');
42
+ }
43
+
44
+ const media = await downloadContentFromMessage(content, mediaType);
45
+ const chunks = [];
46
+
47
+ for await (const chunk of media) {
48
+ chunks.push(chunk);
49
+ }
50
+
51
+ const buffer = Buffer.concat(chunks);
52
+ const caption = content.caption || '';
53
+
54
+ if (mediaType === 'video') {
55
+ return sock.sendMessage(
56
+ m.chat,
57
+ { video: buffer, caption },
58
+ {
59
+ quoted: global.v
60
+ }
61
+ );
62
+ }
63
+
64
+ if (mediaType === 'image') {
65
+ return sock.sendMessage(
66
+ m.chat,
67
+ { image: buffer, caption },
68
+ {
69
+ quoted: global.v
70
+ }
71
+ );
72
+ }
73
+
74
+ if (mediaType === 'audio') {
75
+ return sock.sendMessage(
76
+ m.chat,
77
+ {
78
+ audio: buffer,
79
+ mimetype: 'audio/mpeg',
80
+ ptt: true
81
+ },
82
+ {
83
+ quoted: global.v
84
+ }
85
+ );
86
+ }
87
+ }
88
+ };