init
5
public/.well-known/security.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
Contact: mailto:anotherhadi.clapped234[at]passmail.net
|
||||
Expires: 2028-12-31T23:00:00.000Z
|
||||
Encryption: /anotherhadi.asc
|
||||
Preferred-Languages: en, fr
|
||||
Canonical: /.well-known/security.txt
|
||||
BIN
public/H.ico
Normal file
|
After Width: | Height: | Size: 11 KiB |
52
public/anotherhadi.asc
Normal file
@@ -0,0 +1,52 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
/jkWmwL9
|
||||
=4VM7
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
BIN
public/avatar.jpg
Normal file
|
After Width: | Height: | Size: 67 KiB |
7
public/favicon.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<svg width="326" height="285" viewBox="0 0 326 285" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M238.618 262.918C228.872 264.857 218.771 263.862 209.591 260.06C200.41 256.257 192.564 249.818 187.044 241.556C181.523 233.294 178.577 223.581 178.577 213.644L178.791 184.582L178.577 113.165C178.577 103.228 181.523 93.5151 187.044 85.2532C192.564 76.9914 200.41 70.5521 209.591 66.7496C218.771 62.947 228.872 61.9521 238.618 63.8906C248.363 65.8291 257.315 70.614 264.341 77.6401C271.367 84.6663 276.152 93.6181 278.091 103.364C280.029 113.109 279.034 123.211 275.232 132.391C271.429 141.571 264.99 149.417 256.728 154.938C248.466 160.458 238.753 163.405 228.816 163.405H70.5431C60.6067 163.405 50.8933 166.351 42.6315 171.871C34.3696 177.392 27.9303 185.238 24.1278 194.418C20.3252 203.598 19.3303 213.7 21.2688 223.445C23.2073 233.191 27.9922 242.143 35.0183 249.169C42.0445 256.195 50.9963 260.98 60.7418 262.918C70.4874 264.857 80.5889 263.862 89.769 260.06C98.9491 256.257 106.795 249.818 112.316 241.556C117.836 233.294 120.783 223.581 120.783 213.644V46.1787" stroke="#66BF84" stroke-width="40.6071" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M245.086 256.45C235.341 258.388 225.239 257.393 216.059 253.591C206.879 249.788 199.033 243.349 193.512 235.087C187.992 226.825 185.046 217.112 185.046 207.175L185.26 178.113L185.046 106.696C185.046 96.7596 187.992 87.0463 193.512 78.7844C199.033 70.5225 206.879 64.0832 216.059 60.2807C225.239 56.4782 235.341 55.4833 245.086 57.4218C254.832 59.3603 263.784 64.1452 270.81 71.1713C277.836 78.1974 282.621 87.1492 284.559 96.8948C286.498 106.64 285.503 116.742 281.701 125.922C277.898 135.102 271.459 142.948 263.197 148.469C254.935 153.989 245.222 156.936 235.285 156.936H77.0119C67.0754 156.936 57.3621 159.882 49.1002 165.403C40.8383 170.923 34.399 178.769 30.5965 187.949C26.794 197.13 25.7991 207.231 27.7376 216.977C29.6761 226.722 34.4609 235.674 41.4871 242.7C48.5132 249.726 57.4651 254.511 67.2106 256.45C76.9561 258.388 87.0576 257.393 96.2377 253.591C105.418 249.788 113.264 243.349 118.785 235.087C124.305 226.825 127.251 217.112 127.251 207.175V39.7099" stroke="#CEEAF1" stroke-width="40.6071" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M251.555 249.981C241.81 251.919 231.708 250.924 222.528 247.122C213.348 243.319 205.502 236.88 199.981 228.618C194.461 220.356 191.515 210.643 191.515 200.706L191.729 171.644L191.515 100.227C191.515 90.2907 194.461 80.5774 199.981 72.3155C205.502 64.0537 213.348 57.6144 222.528 53.8118C231.708 50.0093 241.81 49.0144 251.555 50.9529C261.301 52.8914 270.253 57.6763 277.279 64.7024C284.305 71.7286 289.09 80.6804 291.028 90.4259C292.967 100.171 291.972 110.273 288.17 119.453C284.367 128.633 277.928 136.479 269.666 142C261.404 147.52 251.691 150.467 241.754 150.467H83.4809C73.5444 150.467 63.8311 153.413 55.5692 158.934C47.3073 164.454 40.868 172.3 37.0655 181.481C33.263 190.661 32.2681 200.762 34.2066 210.508C36.1451 220.253 40.9299 229.205 47.9561 236.231C54.9822 243.257 63.9341 248.042 73.6796 249.981C83.4251 251.919 93.5266 250.924 102.707 247.122C111.887 243.319 119.733 236.88 125.254 228.618C130.774 220.356 133.72 210.643 133.72 200.706V33.241" stroke="#ECBFA8" stroke-width="40.6071" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M258.024 243.512C248.279 245.45 238.177 244.456 228.997 240.653C219.817 236.85 211.971 230.411 206.45 222.149C200.93 213.887 197.983 204.174 197.983 194.238L198.197 165.175L197.983 93.7584C197.983 83.8219 200.93 74.1086 206.45 65.8467C211.971 57.5848 219.817 51.1455 228.997 47.343C238.177 43.5405 248.279 42.5456 258.024 44.4841C267.77 46.4226 276.722 51.2074 283.748 58.2336C290.774 65.2597 295.559 74.2115 297.497 83.9571C299.436 93.7026 298.441 103.804 294.638 112.984C290.836 122.164 284.396 130.011 276.135 135.531C267.873 141.051 258.159 143.998 248.223 143.998H89.9496C80.0132 143.998 70.2998 146.944 62.038 152.465C53.7761 157.985 47.3368 165.832 43.5342 175.012C39.7317 184.192 38.7368 194.293 40.6753 204.039C42.6138 213.784 47.3987 222.736 54.4248 229.762C61.451 236.789 70.4028 241.573 80.1483 243.512C89.8939 245.45 99.9954 244.456 109.175 240.653C118.356 236.85 126.202 230.411 131.722 222.149C137.243 213.887 140.189 204.174 140.189 194.238V26.7722" stroke="#9E97F8" stroke-width="40.6071" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M264.493 237.043C254.747 238.982 244.646 237.987 235.466 234.184C226.286 230.382 218.439 223.942 212.919 215.681C207.399 207.419 204.452 197.705 204.452 187.769L204.666 158.706L204.452 87.2897C204.452 77.3532 207.399 67.6399 212.919 59.378C218.439 51.1162 226.286 44.6769 235.466 40.8743C244.646 37.0718 254.747 36.0769 264.493 38.0154C274.238 39.9539 283.19 44.7388 290.216 51.7649C297.243 58.7911 302.027 67.7429 303.966 77.4884C305.904 87.2339 304.91 97.3355 301.107 106.516C297.305 115.696 290.865 123.542 282.603 129.062C274.341 134.583 264.628 137.529 254.692 137.529H96.4184C86.4819 137.529 76.7686 140.476 68.5067 145.996C60.2448 151.517 53.8055 159.363 50.003 168.543C46.2005 177.723 45.2056 187.825 47.1441 197.57C49.0826 207.316 53.8674 216.268 60.8936 223.294C67.9197 230.32 76.8716 235.105 86.6171 237.043C96.3626 238.982 106.464 237.987 115.644 234.184C124.824 230.382 132.671 223.942 138.191 215.681C143.711 207.419 146.658 197.705 146.658 187.769V20.3035" stroke="#FCFCFC" stroke-width="40.6071" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.3 KiB |
BIN
public/images/blog/github-osint-users.png
Normal file
|
After Width: | Height: | Size: 671 KiB |
BIN
public/images/projects/github-recon.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
public/images/projects/n4c.png
Normal file
|
After Width: | Height: | Size: 765 KiB |
BIN
public/images/projects/nixy.png
Normal file
|
After Width: | Height: | Size: 412 KiB |
BIN
public/oneko.gif
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
284
public/scripts/oneko.js
Normal file
@@ -0,0 +1,284 @@
|
||||
// oneko.js: https://github.com/adryd325/oneko.js
|
||||
|
||||
(function oneko() {
|
||||
const isReducedMotion =
|
||||
window.matchMedia(`(prefers-reduced-motion: reduce)`) === true ||
|
||||
window.matchMedia(`(prefers-reduced-motion: reduce)`).matches === true;
|
||||
|
||||
if (isReducedMotion) return;
|
||||
|
||||
const nekoEl = document.createElement("div");
|
||||
let persistPosition = true;
|
||||
|
||||
let nekoPosX = 32;
|
||||
let nekoPosY = 32;
|
||||
|
||||
let mousePosX = 0;
|
||||
let mousePosY = 0;
|
||||
|
||||
let frameCount = 0;
|
||||
let idleTime = 0;
|
||||
let idleAnimation = null;
|
||||
let idleAnimationFrame = 0;
|
||||
|
||||
const nekoSpeed = 10;
|
||||
const spriteSets = {
|
||||
idle: [[-3, -3]],
|
||||
alert: [[-7, -3]],
|
||||
scratchSelf: [
|
||||
[-5, 0],
|
||||
[-6, 0],
|
||||
[-7, 0],
|
||||
],
|
||||
scratchWallN: [
|
||||
[0, 0],
|
||||
[0, -1],
|
||||
],
|
||||
scratchWallS: [
|
||||
[-7, -1],
|
||||
[-6, -2],
|
||||
],
|
||||
scratchWallE: [
|
||||
[-2, -2],
|
||||
[-2, -3],
|
||||
],
|
||||
scratchWallW: [
|
||||
[-4, 0],
|
||||
[-4, -1],
|
||||
],
|
||||
tired: [[-3, -2]],
|
||||
sleeping: [
|
||||
[-2, 0],
|
||||
[-2, -1],
|
||||
],
|
||||
N: [
|
||||
[-1, -2],
|
||||
[-1, -3],
|
||||
],
|
||||
NE: [
|
||||
[0, -2],
|
||||
[0, -3],
|
||||
],
|
||||
E: [
|
||||
[-3, 0],
|
||||
[-3, -1],
|
||||
],
|
||||
SE: [
|
||||
[-5, -1],
|
||||
[-5, -2],
|
||||
],
|
||||
S: [
|
||||
[-6, -3],
|
||||
[-7, -2],
|
||||
],
|
||||
SW: [
|
||||
[-5, -3],
|
||||
[-6, -1],
|
||||
],
|
||||
W: [
|
||||
[-4, -2],
|
||||
[-4, -3],
|
||||
],
|
||||
NW: [
|
||||
[-1, 0],
|
||||
[-1, -1],
|
||||
],
|
||||
};
|
||||
|
||||
function init() {
|
||||
let nekoFile = "/oneko.gif";
|
||||
const curScript = document.currentScript;
|
||||
if (curScript && curScript.dataset.cat) {
|
||||
nekoFile = curScript.dataset.cat;
|
||||
}
|
||||
if (curScript && curScript.dataset.persistPosition) {
|
||||
if (curScript.dataset.persistPosition === "") {
|
||||
persistPosition = true;
|
||||
} else {
|
||||
persistPosition = JSON.parse(
|
||||
curScript.dataset.persistPosition.toLowerCase(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (persistPosition) {
|
||||
let storedNeko = JSON.parse(window.localStorage.getItem("oneko"));
|
||||
if (storedNeko !== null) {
|
||||
nekoPosX = storedNeko.nekoPosX;
|
||||
nekoPosY = storedNeko.nekoPosY;
|
||||
mousePosX = storedNeko.mousePosX;
|
||||
mousePosY = storedNeko.mousePosY;
|
||||
frameCount = storedNeko.frameCount;
|
||||
idleTime = storedNeko.idleTime;
|
||||
idleAnimation = storedNeko.idleAnimation;
|
||||
idleAnimationFrame = storedNeko.idleAnimationFrame;
|
||||
nekoEl.style.backgroundPosition = storedNeko.bgPos;
|
||||
}
|
||||
}
|
||||
|
||||
nekoEl.id = "oneko";
|
||||
nekoEl.ariaHidden = true;
|
||||
nekoEl.style.width = "32px";
|
||||
nekoEl.style.height = "32px";
|
||||
nekoEl.style.position = "fixed";
|
||||
nekoEl.style.pointerEvents = "none";
|
||||
nekoEl.style.imageRendering = "pixelated";
|
||||
nekoEl.style.left = `${nekoPosX - 16}px`;
|
||||
nekoEl.style.top = `${nekoPosY - 16}px`;
|
||||
nekoEl.style.zIndex = 2147483647;
|
||||
|
||||
nekoEl.style.backgroundImage = `url(${nekoFile})`;
|
||||
|
||||
document.body.appendChild(nekoEl);
|
||||
|
||||
document.addEventListener("mousemove", function (event) {
|
||||
mousePosX = event.clientX;
|
||||
mousePosY = event.clientY;
|
||||
});
|
||||
|
||||
if (persistPosition) {
|
||||
window.addEventListener("beforeunload", function (event) {
|
||||
window.localStorage.setItem(
|
||||
"oneko",
|
||||
JSON.stringify({
|
||||
nekoPosX: nekoPosX,
|
||||
nekoPosY: nekoPosY,
|
||||
mousePosX: mousePosX,
|
||||
mousePosY: mousePosY,
|
||||
frameCount: frameCount,
|
||||
idleTime: idleTime,
|
||||
idleAnimation: idleAnimation,
|
||||
idleAnimationFrame: idleAnimationFrame,
|
||||
bgPos: nekoEl.style.backgroundPosition,
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
window.requestAnimationFrame(onAnimationFrame);
|
||||
}
|
||||
|
||||
let lastFrameTimestamp;
|
||||
|
||||
function onAnimationFrame(timestamp) {
|
||||
// Stops execution if the neko element is removed from DOM
|
||||
if (!nekoEl.isConnected) {
|
||||
return;
|
||||
}
|
||||
if (!lastFrameTimestamp) {
|
||||
lastFrameTimestamp = timestamp;
|
||||
}
|
||||
if (timestamp - lastFrameTimestamp > 100) {
|
||||
lastFrameTimestamp = timestamp;
|
||||
frame();
|
||||
}
|
||||
window.requestAnimationFrame(onAnimationFrame);
|
||||
}
|
||||
|
||||
function setSprite(name, frame) {
|
||||
const sprite = spriteSets[name][frame % spriteSets[name].length];
|
||||
nekoEl.style.backgroundPosition = `${sprite[0] * 32}px ${sprite[1] * 32}px`;
|
||||
}
|
||||
|
||||
function resetIdleAnimation() {
|
||||
idleAnimation = null;
|
||||
idleAnimationFrame = 0;
|
||||
}
|
||||
|
||||
function idle() {
|
||||
idleTime += 1;
|
||||
|
||||
// every ~ 20 seconds
|
||||
if (
|
||||
idleTime > 10 &&
|
||||
Math.floor(Math.random() * 200) == 0 &&
|
||||
idleAnimation == null
|
||||
) {
|
||||
let avalibleIdleAnimations = ["sleeping", "scratchSelf"];
|
||||
if (nekoPosX < 32) {
|
||||
avalibleIdleAnimations.push("scratchWallW");
|
||||
}
|
||||
if (nekoPosY < 32) {
|
||||
avalibleIdleAnimations.push("scratchWallN");
|
||||
}
|
||||
if (nekoPosX > window.innerWidth - 32) {
|
||||
avalibleIdleAnimations.push("scratchWallE");
|
||||
}
|
||||
if (nekoPosY > window.innerHeight - 32) {
|
||||
avalibleIdleAnimations.push("scratchWallS");
|
||||
}
|
||||
idleAnimation =
|
||||
avalibleIdleAnimations[
|
||||
Math.floor(Math.random() * avalibleIdleAnimations.length)
|
||||
];
|
||||
}
|
||||
|
||||
switch (idleAnimation) {
|
||||
case "sleeping":
|
||||
if (idleAnimationFrame < 8) {
|
||||
setSprite("tired", 0);
|
||||
break;
|
||||
}
|
||||
setSprite("sleeping", Math.floor(idleAnimationFrame / 4));
|
||||
if (idleAnimationFrame > 192) {
|
||||
resetIdleAnimation();
|
||||
}
|
||||
break;
|
||||
case "scratchWallN":
|
||||
case "scratchWallS":
|
||||
case "scratchWallE":
|
||||
case "scratchWallW":
|
||||
case "scratchSelf":
|
||||
setSprite(idleAnimation, idleAnimationFrame);
|
||||
if (idleAnimationFrame > 9) {
|
||||
resetIdleAnimation();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
setSprite("idle", 0);
|
||||
return;
|
||||
}
|
||||
idleAnimationFrame += 1;
|
||||
}
|
||||
|
||||
function frame() {
|
||||
frameCount += 1;
|
||||
const diffX = nekoPosX - mousePosX;
|
||||
const diffY = nekoPosY - mousePosY;
|
||||
const distance = Math.sqrt(diffX ** 2 + diffY ** 2);
|
||||
|
||||
if (distance < nekoSpeed || distance < 48) {
|
||||
idle();
|
||||
return;
|
||||
}
|
||||
|
||||
idleAnimation = null;
|
||||
idleAnimationFrame = 0;
|
||||
|
||||
if (idleTime > 1) {
|
||||
setSprite("alert", 0);
|
||||
// count down after being alerted before moving
|
||||
idleTime = Math.min(idleTime, 7);
|
||||
idleTime -= 1;
|
||||
return;
|
||||
}
|
||||
|
||||
let direction;
|
||||
direction = diffY / distance > 0.5 ? "N" : "";
|
||||
direction += diffY / distance < -0.5 ? "S" : "";
|
||||
direction += diffX / distance > 0.5 ? "W" : "";
|
||||
direction += diffX / distance < -0.5 ? "E" : "";
|
||||
setSprite(direction, frameCount);
|
||||
|
||||
nekoPosX -= (diffX / distance) * nekoSpeed;
|
||||
nekoPosY -= (diffY / distance) * nekoSpeed;
|
||||
|
||||
nekoPosX = Math.min(Math.max(16, nekoPosX), window.innerWidth - 16);
|
||||
nekoPosY = Math.min(Math.max(16, nekoPosY), window.innerHeight - 16);
|
||||
|
||||
nekoEl.style.left = `${nekoPosX - 16}px`;
|
||||
nekoEl.style.top = `${nekoPosY - 16}px`;
|
||||
}
|
||||
|
||||
init();
|
||||
})();
|
||||
5
public/security.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
Contact: mailto:anotherhadi.clapped234[at]passmail.net
|
||||
Expires: 2028-12-31T23:00:00.000Z
|
||||
Encryption: /anotherhadi.asc
|
||||
Preferred-Languages: en, fr
|
||||
Canonical: /.well-known/security.txt
|
||||