gimmickCellar

hashbrown THREE

Jun 30th, 2026 (edited)
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. // ==UserScript==
  2. // @name HashBrown 3
  3. // @author gimmickCellar
  4. // @description hashbrown 2 but actually human made this time
  5. // @match *://*/*
  6. // ==/UserScript==
  7.  
  8. //i am so sorry for the state of this codebase, just be glad it isnt vibecoded
  9. if(!w&&!owot){return "not an nwot, aborting"};
  10. var privateKey;
  11. var publicKeyBase64;
  12. window.hashcache = [];
  13.  
  14. async function startCryptoApi() {
  15. var storedKeys = localStorage.getItem('hb3');
  16. if (storedKeys) {
  17. var keys = JSON.parse(storedKeys);
  18. privateKey = await crypto.subtle.importKey("jwk", keys.priv||keys.jwkpr, {name:"ECDSA",namedCurve:"P-256"},true,["sign"]);
  19. publicKeyBase64 = keys.pubBase64;
  20. } else {
  21. var pair = await crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},true,["sign","verify"]);
  22. privateKey = pair.privateKey;
  23. var pub = pair.publicKey;
  24. var jwkpr = await crypto.subtle.exportKey("jwk",privateKey);
  25. var jwkpu = await crypto.subtle.exportKey("jwk",pub);
  26. var Pub = await crypto.subtle.exportKey("raw",pub);
  27. publicKeyBase64 = btoa(String.fromCharCode(...new Uint8Array(Pub)));
  28. localStorage.setItem('hb3',JSON.stringify({jwkpr,jwkpu,pubBase64:publicKeyBase64}));
  29. }
  30. }
  31.  
  32. w.tileToChar=(tileX,tileY,charX,charY)=>{ //helper, available to other scripts
  33. var x = tileX * 16 + charX;
  34. var y = tileY * 8 + charY;
  35. return {x:x,y:y};
  36. };
  37.  
  38. window.TemperTantrum=()=>{return new Error("VIGUEGYU8ZVGJHVTJYZVGYJA YOU LIED YOU LIED YOU LIED")}; //#UQMOMENT
  39.  
  40. async function url(item){
  41. if(!item)throw TemperTantrum(); // average owot user
  42. var x=item[0];var y=item[1];var chara=item[2];var d=item[3];var u=item[4];var wd=item[5];var dn=item[10]
  43. var msg=`${wd},${x},${y},${chara},${d},${u},${dn}`;
  44. var enc=new TextEncoder().encode(msg);
  45. var sigBuf=await crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},privateKey,enc);
  46. var sigArr=new Uint8Array(sigBuf);
  47. var sigB64=btoa(String.fromCharCode(...sigArr));
  48. var verifier="https://gimmickcellar.nekoweb.org/verifyhash2.html"; //todo: allow this to be changed
  49. var ew=encodeURIComponent(wd);
  50. var eu=encodeURIComponent(u);
  51. var es=encodeURIComponent(sigB64).replace(/\+/g,'%2B');
  52. var ep=encodeURIComponent(publicKeyBase64).replace(/\+/g,'%2B');
  53. return `${verifier}?w=${ew}&x=${x}&y=${y}&c=${chara}&d=${d}&u=${eu}&sig=${es}&pub=${ep}&dn=${dn}`;
  54. }
  55.  
  56. (()=>{
  57. w.on("write",e=>{
  58. if(e.char==="\x08"||e.char===" "||e.char==="\xa0")return;
  59. var u=state.userModel.username;
  60. var wd=state.worldModel.name || "Main"; //wd gasters.,,.,,,, (seriously, this is just compat with slopbrown 2)
  61. var id=nextObjId-1;
  62. var coords=w.tileToChar(e.tileX,e.tileY,e.charX,e.charY);
  63. var x=coords.x;
  64. var y=coords.y;
  65. var tx=e.tileX;
  66. var ty=e.tileY;
  67. var cx=e.charX;
  68. var cy=e.charY;
  69. var chara=e.char.codePointAt(0);
  70. var d=0;
  71. var dn=Date.now(); //screw it we dont need support for hb2
  72. window.hashcache[id]=[x,y,chara,d,u,wd,tx,ty,cx,cy,dn];
  73. });
  74. w.on("writeResponse",e=>{
  75. if((!e.accepted)||window["hashn'tbrown"])return; // hash brown or hashn't brown?
  76. e.accepted.forEach(async id=>{
  77. var a=window.hashcache[id];
  78. if(!a)return;
  79. var linkVal=await url(a);
  80. network.link({tileX:a[6],tileY:a[7],charX:a[8],charY:a[9]},"url",{url:linkVal});
  81. delete window.hashcache[id];
  82. });
  83. });
  84. menu.addCheckboxOption("Disable HashBrown 3",()=>{window["hashn'tbrown"]=true},()=>{window["hashn'tbrown"]=false}) //todo: make this save
  85. startCryptoApi();
  86. })()
Add Comment
Please, Sign In to add comment