1
0
Fork 0

Compare commits

...

16 commits

Author SHA1 Message Date
amy
4dc6f95e84
this should fix it
Some checks failed
Build / Build (push) Has been cancelled
Build / Deploy (push) Has been cancelled
2025-06-04 18:24:41 +03:30
amy
4d7c437b25
disclaimer 2025-06-01 03:09:35 +03:30
amy
8e249599c9
3d shit 2025-05-28 05:42:37 +03:30
amy
83a18f250d
gen :3 2025-05-23 09:58:00 +03:30
amy
397ed05b87
spike :3 2025-05-23 09:47:08 +03:30
amy
3051036e17
spiro.amy.rip is dead. long live spiro.amy.rip 2025-05-22 04:39:54 +03:30
amy
59f1d1a4d7
yeag i kinda like lavender 2025-05-10 23:08:11 +03:30
amy
2310ba837a
yay 2025-04-30 16:44:33 +03:30
amy
add75dced1
idk if this works or not 2025-04-30 16:25:29 +03:30
amy
e6d9d4c9a0 proxy is down :( 2025-04-29 09:37:38 +03:30
amy
190117d9ef
my name is amy 2025-04-21 02:16:04 +03:30
amy
031f84cc60
:3 2025-03-09 14:43:11 +03:30
amy
87092fcdfb
link updates 2025-03-08 10:48:46 +03:30
Linnea Gräf
7ce8c32639
Smoother transition for add review link 2025-02-14 22:49:53 +03:30
amy
3840775ac7
the jason 2025-02-08 21:35:40 +03:30
lilith
e16d92171d dont read me bro 2025-01-31 13:01:40 +00:00
12 changed files with 674 additions and 496 deletions

View file

@ -4,8 +4,6 @@
$ npm install # or pnpm install or yarn install
```
### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs)
## Available Scripts
In the project directory, you can run:
@ -18,11 +16,5 @@ Open [http://localhost:5173](http://localhost:5173) to view it in the browser.
### `npm run build`
Builds the app for production to the `dist` folder.<br>
It correctly bundles Solid in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.<br>
Your app is ready to be deployed!
## Deployment
Learn more about deploying your application with the [documentations](https://vitejs.dev/guide/static-deploy.html)
Your app is ready to be deployed!

View file

@ -10,7 +10,9 @@
},
"dependencies": {
"@types/node": "^20.14.10",
"solid-js": "^1.8.17"
"@types/three": "^0.176.0",
"solid-js": "^1.8.17",
"three": "^0.176.0"
},
"devDependencies": {
"typescript": "^5.2.2",

59
pnpm-lock.yaml generated
View file

@ -11,9 +11,15 @@ importers:
'@types/node':
specifier: ^20.14.10
version: 20.14.10
'@types/three':
specifier: ^0.176.0
version: 0.176.0
solid-js:
specifier: ^1.8.17
version: 1.8.17
three:
specifier: ^0.176.0
version: 0.176.0
devDependencies:
typescript:
specifier: ^5.2.2
@ -132,6 +138,9 @@ packages:
resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
engines: {node: '>=6.9.0'}
'@dimforge/rapier3d-compat@0.12.0':
resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==}
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
@ -368,6 +377,9 @@ packages:
cpu: [x64]
os: [win32]
'@tweenjs/tween.js@23.1.3':
resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==}
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@ -386,6 +398,18 @@ packages:
'@types/node@20.14.10':
resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==}
'@types/stats.js@0.17.4':
resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==}
'@types/three@0.176.0':
resolution: {integrity: sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==}
'@types/webxr@0.5.22':
resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==}
'@webgpu/types@0.1.60':
resolution: {integrity: sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==}
ansi-styles@3.2.1:
resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
engines: {node: '>=4'}
@ -449,6 +473,9 @@ packages:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
fflate@0.8.2:
resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@ -493,6 +520,9 @@ packages:
resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==}
engines: {node: '>=12.13'}
meshoptimizer@0.18.1:
resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==}
ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
@ -546,6 +576,9 @@ packages:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'}
three@0.176.0:
resolution: {integrity: sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==}
to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
@ -767,6 +800,8 @@ snapshots:
'@babel/helper-validator-identifier': 7.24.7
to-fast-properties: 2.0.0
'@dimforge/rapier3d-compat@0.12.0': {}
'@esbuild/aix-ppc64@0.21.5':
optional: true
@ -901,6 +936,8 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.18.0':
optional: true
'@tweenjs/tween.js@23.1.3': {}
'@types/babel__core@7.20.5':
dependencies:
'@babel/parser': 7.24.7
@ -928,6 +965,22 @@ snapshots:
dependencies:
undici-types: 5.26.5
'@types/stats.js@0.17.4': {}
'@types/three@0.176.0':
dependencies:
'@dimforge/rapier3d-compat': 0.12.0
'@tweenjs/tween.js': 23.1.3
'@types/stats.js': 0.17.4
'@types/webxr': 0.5.22
'@webgpu/types': 0.1.60
fflate: 0.8.2
meshoptimizer: 0.18.1
'@types/webxr@0.5.22': {}
'@webgpu/types@0.1.60': {}
ansi-styles@3.2.1:
dependencies:
color-convert: 1.9.3
@ -1007,6 +1060,8 @@ snapshots:
escape-string-regexp@1.0.5: {}
fflate@0.8.2: {}
fsevents@2.3.3:
optional: true
@ -1034,6 +1089,8 @@ snapshots:
dependencies:
is-what: 4.1.16
meshoptimizer@0.18.1: {}
ms@2.1.2: {}
nanoid@3.3.7: {}
@ -1099,6 +1156,8 @@ snapshots:
dependencies:
has-flag: 3.0.0
three@0.176.0: {}
to-fast-properties@2.0.0: {}
typescript@5.5.2: {}

View file

@ -3,22 +3,28 @@ import "./reviewed.css";
import { sendReview } from "../src/components/api";
export default function App() {
const token = window.location.hash
.substring(
window.location.hash.indexOf("access_token") + "access_token".length + 1,
)
.substring(0, 30);
console.log(token);
if (token === "") {
const hash = window.location.hash;
const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;
const params = new URLSearchParams(hashContent);
const token = params.get('access_token')!;
if (token) {
console.log("Access Token:", token);
// Do something with your token
} else {
console.log("Access Token not found in hash.");
window.location.href =
"https://discord.com/oauth2/authorize?client_id=1208380910525743134&response_type=token&redirect_uri=https%3A%2F%2Famy.rip%2Freview%2F&scope=identify";
"https://discord.com/oauth2/authorize?client_id=1208380910525743134&response_type=token&redirect_uri=https%3A%2F%2Famy.rip%2Freview%2F&scope=identify";
}
console.log(token);
let ref!: HTMLTextAreaElement;
return (
<div class="reviewOuterparent">
<div class="reviewParent">
<img src="../fjonkie.png" alt="" />
<span>(it doesnt)</span>
<p>DISCLAIMER: YOUR DISCORD ID WILL BE ATTACHED TO THE REVIEW IN THE SOURCE CODE.</p>
<textarea
ref={ref}
onKeyPress={async (e) => {

View file

@ -3,12 +3,12 @@
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="https://proxy.spiro.exhq.dev/_/plain/https://dp.nea.moe/avatar/712639419785412668.png" />
<link rel="icon" type="image/svg+xml" href="https://dp.nea.moe/avatar/712639419785412668.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>amy reviews</title>
<meta content="review" property="og:title" />
<meta content="rewviewdb, but not turkish" property="og:description" />
<meta content="https://proxy.spiro.exhq.dev/_/plain/https://dp.nea.moe/avatar/712639419785412668.png" property="og:image" />
<meta content="https://proxy.spiro.amy.rip/_/plain/https://dp.nea.moe/avatar/712639419785412668.png" property="og:image" />
<meta content="#43B581" data-react-helmet="true" name="theme-color" />
</head>

View file

@ -14,11 +14,11 @@
/* browsers agreeing on stuff challenge (impossible) */
background-color: #121212;
overflow-x: hidden;
color: #ffc8dd;
color: lavender;
}
.footer a {
color: #cdb4db;
color: thistle;
}
.footer {
@ -36,7 +36,7 @@
.musicbutton {
background-color: #272525;
color: pink;
color: lavender;
font-family: Roboto, sans-serif;
font-weight: 500;
font-size: 14px;
@ -54,6 +54,30 @@
margin: 1em;
}
.fakemusicbutton {
background-color: #272525;
color: lavender;
font-family: Roboto, sans-serif;
font-weight: 500;
font-size: 14px;
padding: 10px 30px;
box-shadow: none;
border-radius: 5px;
transition: 100ms;
transform: translateY(0);
display: flex;
flex-wrap: wrap;
flex-direction: row;
align-items: center;
border: none;
margin: 1em;
}
.fakemusicbutton:hover {
background-color: transparent;
color: transparent;
}
.musicdiv {
background-color: rgba(0, 0, 0, 0.731);
position: fixed;
@ -125,6 +149,14 @@
height: 18em;
}
.reviewsection {
display: flex;
flex-direction: column;
padding: 0.1em;
/* overflow: hidden; */
max-height: 100%;
}
.cardchild:hover + .actualreviewdiv {
transition: 1s;
transform: rotateY(100);
@ -142,23 +174,23 @@
text-align: center;
}
.reviewheadertext {
margin-bottom: -0.2em;
}
.cardchild p {
margin-bottom: -1.5em;
margin: 0;
padding: 0.1em;
}
.cardchild a {
font-size: 1.5em;
text-align: center;
color: pink;
color: thistle;
text-decoration: underline;
margin-bottom: 0%;
.fadein {
animation: spawntop 1s;
}
transition: opacity 1s ease;
}
.cardchild span {
@ -313,7 +345,7 @@
.header h1 {
font-size: 3.6em;
color: blanchedalmond;
color: lavender;
display: inline-table;
}
@ -386,17 +418,6 @@
}
}
@keyframes spawntop {
0% {
opacity: 0%;
transform: translateY(1em);
}
100% {
opacity: 100%;
transform: translateY(0);
}
}
@keyframes shake {
0% {

View file

@ -1,10 +1,11 @@
// src/App.tsx
import "./App.css";
import { AdvancedBr, Singular88, SingularOomfie } from "./components/comps.tsx";
import { createSignal, onMount } from "solid-js";
import {AdvancedBr, Singular88, SingularOomfie} from "./components/comps.tsx";
import {createSignal, onMount} from "solid-js";
import Reviews from "./components/api.tsx";
import { Music, MusicEntry, Song } from "./components/music.tsx";
import { Bdpfp, Normalpfp } from "./components/pfp.tsx";
import { InfoCard } from "./components/middlecard.tsx";
import {Music, MusicEntry, Song} from "./components/music.tsx";
import {Bdpfp, Normalpfp} from "./components/pfp.tsx";
import {InfoCard} from "./components/middlecard.tsx";
export const [shouldpopup, setpopup] = createSignal(false);
export const [shouldpopup88, setpopup88] = createSignal(false);
@ -15,338 +16,346 @@ let explodcount = 0;
const isitmybd = () => new Date().toISOString().slice(5, 10) === "08-22";
function getRandomVivsieWord() {
const words = ["fuck", "shit", "pussy", "penis", "dick"];
return words[Math.floor(Math.random() * words.length)];
const words = ["fuck", "shit", "pussy", "penis", "dick"];
return words[Math.floor(Math.random() * words.length)];
}
function vivsiepop() {
const blep = document.body.childNodes;
const blep = document.body.childNodes;
function fuckshit(node: ChildNode) {
if (node.nodeType === Node.TEXT_NODE) {
node.textContent = getRandomVivsieWord();
} else {
node.childNodes.forEach(fuckshit);
function fuckshit(node: ChildNode) {
if (node.nodeType === Node.TEXT_NODE) {
node.textContent = getRandomVivsieWord();
} else {
node.childNodes.forEach(fuckshit);
}
}
}
blep.forEach(fuckshit);
blep.forEach(fuckshit);
}
function nyaboom() {
explodcount++;
const blep = document.body.childNodes;
explodcount++;
const blep = document.body.childNodes;
function fuckshit(node: ChildNode) {
if (node.nodeType === Node.TEXT_NODE) {
(node as Element).textContent = "";
node.parentElement?.appendChild(
(
<img
style={{
width: "1.5em",
}}
src="./explod.gif"
/>
) as Element,
);
} else if (node instanceof HTMLImageElement) {
node.src = "./explod.gif";
} else {
node.childNodes.forEach(fuckshit);
function fuckshit(node: ChildNode) {
if (node.nodeType === Node.TEXT_NODE) {
(node as Element).textContent = "";
node.parentElement?.appendChild(
(
<img
style={{
width: "1.5em",
}}
src="./explod.gif"
/>
) as Element,
);
} else if (node instanceof HTMLImageElement) {
node.src = "./explod.gif";
} else {
node.childNodes.forEach(fuckshit);
}
}
}
blep.forEach(fuckshit);
blep.forEach(fuckshit);
}
function App() {
const [musicList, setMusicList] = createSignal<Song[]>([]);
const [isLoading, setIsLoading] = createSignal(true);
const [oomfies, setoomfies] = createSignal(<>oomfies</>);
const [isAnimating, setIsAnimating] = createSignal(false);
onMount(async () => {
try {
const response = await fetch(
"https://bopbot.amy.rip/",
);
const data = await response.json() as Song[];
data.reverse();
setMusicList(data);
} catch (error) {
console.error("Error fetching music data:", error);
} finally {
setIsLoading(false);
}
});
let gitgay = (
<img
onClick={() => {
setIsAnimating(true);
setTimeout(() => {
window.location.href = "https://git.lgbt/exhq";
}, 200);
gitgay.src = "/gaybackground.png";
}}
classList={{
gitgayimg: true,
animate: isAnimating(),
gaybackground: isAnimating(),
}}
src="https://proxy.spiro.exhq.dev/_/plain/https://git.lgbt/assets/img/logo.png"
alt="logo of git.lgbt"
/>
) as HTMLImageElement;
// @ts-ignore
return (
<>
{isitmybd() ? (
<Bdpfp setpopupEasterEgg={setpopupEasterEgg} />
) : (
<Normalpfp setpopupEasterEgg={setpopupEasterEgg} />
)}
<p style={{ display: "none" }}>AdvancedBr my beloved</p>
<AdvancedBr count={6} />
<div class="parent">
<div class="cardchild">
<h1>link tree</h1>
<div class="linktree">{gitgay}</div>
<br />
<div class="linktree">
<span class="gitgaytext">Git</span>
</div>
</div>
<div
style={{
opacity: isAnimating() ? "0%" : "100%",
}}
class="cardchild"
>
<InfoCard bd={isitmybd()} />
</div>
<div
onMouseEnter={() => {
setishover(true);
}}
onmouseleave={() => {
setishover(false);
}}
style={{
opacity: isAnimating() ? "0%" : "100%",
}}
class="cardchild"
>
<Reviews />
</div>
</div>
<AdvancedBr count={2} />
<div class="easteregg" style={{ opacity: isAnimating() ? "0%" : "100%" }}>
<div
class="musicbutton"
onClick={() => {
setpopup(!shouldpopup());
}}
>
<p>typa shit ive been on</p>
<img
style={{
"margin-left": "0.3em",
"max-width": "1.5em",
}}
src="./fireemoji.png"
/>
</div>
<div class="musicbutton">
<div
class="oomfies"
const [musicList, setMusicList] = createSignal<Song[]>([]);
const [isLoading, setIsLoading] = createSignal(true);
const [oomfies, setoomfies] = createSignal(<>oomfies</>);
const [isAnimating, setIsAnimating] = createSignal(false);
onMount(async () => {
try {
const response = await fetch(
"https://bopbot.amy.rip/",
);
const data = await response.json() as Song[];
data.reverse();
setMusicList(data);
} catch (error) {
console.error("Error fetching music data:", error);
} finally {
setIsLoading(false);
}
});
let gitgay = (
<img
onClick={() => {
setoomfies(
<>
<SingularOomfie
name="ashley"
discordid="836177139798638592"
url="https://ashleygraves.eu/"
></SingularOomfie>
<SingularOomfie
name="nea"
discordid="310702108997320705"
url="https://nea.moe"
></SingularOomfie>
<SingularOomfie
name="vozy"
discordid="359175647257690113"
url="https://vozy.exhq.dev"
></SingularOomfie>
<SingularOomfie
name="hazel"
discordid="435026627907420161"
url="https://yellows.ink/"
></SingularOomfie>
<SingularOomfie
name="nax"
discordid="148801388938264576"
url="https://nax.dev/"
></SingularOomfie>
<SingularOomfie
name="squirrelly"
discordid="218032723296649217"
url="https://squirrelly13.neocities.org/"
></SingularOomfie>
<SingularOomfie
name="gen"
discordid="217892728875253760"
url="https://genshibe.ca/"
></SingularOomfie>
<SingularOomfie
name="ushie"
discordid="399862294143696897"
url="https://ushie.dev/"
></SingularOomfie>
<SingularOomfie
name="mugman"
discordid="601836455006044163"
url="https://mugman.tech"
></SingularOomfie>
</>,
);
setIsAnimating(true);
setTimeout(() => {
window.location.href = "https://git.amy.rip/amy";
}, 200);
gitgay.src = "/gaybackground.png";
}}
>
{" "}
{oomfies()}
</div>
</div>
<div class="musicbutton" onClick={vivsiepop}>
<p>amy if it was written by vivsiepop</p>
</div>
<div
class="musicbutton"
onClick={() => {
setpopup88(true);
}}
>
<p>88x31's</p>
</div>
<div
class="musicbutton"
onClick={() => {
if (explodcount > 5) {
document.body.innerHTML = "";
setTimeout(() => {
alert(
"sorry bud, you exploded so much that my document.body is gon",
);
}, 500);
} else {
new Audio("./explod.mp3").play();
nyaboom();
}
}}
>
<img
style={{
"margin-left": "0.3em",
"max-width": "1.5em",
classList={{
gitgayimg: true,
animate: isAnimating(),
gaybackground: isAnimating(),
}}
src="./nyaboom.webp"
/>
</div>
</div>
<AdvancedBr count={3} />
<Music shouldpopup={shouldpopup}>
<div class="musicdiv">
<div class="innermusic">
<div class="music-close-button-div">
<button
class="close-button"
onClick={() => {
setpopup(false);
}}
>
X
</button>
src="https://git.amy.rip/assets/img/logo.png"
alt="logo of git.amy.rip"
/>
) as HTMLImageElement;
// @ts-ignore
return (
<>
{isitmybd() ? (
<Bdpfp setpopupEasterEgg={setpopupEasterEgg}/>
) : (
<Normalpfp setpopupEasterEgg={setpopupEasterEgg}/>
)}
<p style={{display: "none"}}>AdvancedBr my beloved</p>
<AdvancedBr count={6}/>
<div class="parent">
<div class="cardchild">
<h1>link tree</h1>
<div class="linktree">{gitgay}</div>
<br/>
<div class="linktree">
<span class="gitgaytext">Git</span>
</div>
</div>
<div
style={{
opacity: isAnimating() ? "0%" : "100%",
}}
class="cardchild"
>
<InfoCard bd={isitmybd()}/>
</div>
<div
onMouseEnter={() => {
setishover(true);
}}
onmouseleave={() => {
setishover(false);
}}
style={{
opacity: isAnimating() ? "0%" : "100%",
}}
class="cardchild"
>
<Reviews/>
</div>
</div>
<div class="musiclist">
{isLoading() ? (
<p>Loading...</p>
) : (
musicList().map((link) => <MusicEntry musicInfo={link} />)
)}
<AdvancedBr count={2}/>
<div class="easteregg" style={{opacity: isAnimating() ? "0%" : "100%"}}>
<div
class="musicbutton"
onClick={() => {
setpopup(!shouldpopup());
}}
>
<p>typa shit ive been on</p>
<img
style={{
"margin-left": "0.3em",
"max-width": "1.5em",
}}
src="./fireemoji.png"
/>
</div>
<div class="fakemusicbutton">
<p>:3</p>
</div>
<div class="musicbutton">
<div
class="oomfies"
onClick={() => {
setoomfies(
<>
<SingularOomfie
name="ashley"
discordid="836177139798638592"
url="https://ashleygraves.eu/"
></SingularOomfie>
<SingularOomfie
name="nea"
discordid="310702108997320705"
url="https://nea.moe"
></SingularOomfie>
<SingularOomfie
name="vozy"
discordid="359175647257690113"
url="https://vozy.amy.rip"
></SingularOomfie>
<SingularOomfie
name="hazel"
discordid="435026627907420161"
url="https://yellows.ink/"
></SingularOomfie>
<SingularOomfie
name="nax"
discordid="148801388938264576"
url="https://nax.dev/"
></SingularOomfie>
<SingularOomfie
name="squirrelly"
discordid="218032723296649217"
url="https://squirrelly13.neocities.org/"
></SingularOomfie>
<SingularOomfie
name="gen"
discordid="217892728875253760"
url="https://genshibe.ca/"
></SingularOomfie>
<SingularOomfie
name="ushie"
discordid="399862294143696897"
url="https://ushie.dev/"
></SingularOomfie>
<SingularOomfie
name="mugman"
discordid="601836455006044163"
url="https://mugman.tech"
></SingularOomfie>
</>,
);
}}
>
{" "}
{oomfies()}
</div>
</div>
<div class="musicbutton" onClick={vivsiepop}>
<p>amy if it was written by vivsiepop</p>
</div>
<div
class="musicbutton"
onClick={() => {
setpopup88(true);
}}
>
<p>88x31's</p>
</div>
<div
class="musicbutton"
onClick={() => {
if (explodcount > 5) {
document.body.innerHTML = "";
setTimeout(() => {
alert(
"sorry bud, you exploded so much that my document.body is gon",
);
}, 500);
} else {
new Audio("./explod.mp3").play();
nyaboom();
}
}}
>
<img
style={{
"margin-left": "0.3em",
"max-width": "1.5em",
}}
src="./nyaboom.webp"
/>
</div>
</div>
</div>
</div>
</Music>
<Music shouldpopup={shouldpopupEasterEgg}>
<div class="musicdiv">
<div class="innermusic">
<div class="music-close-button-div">
<button
class="close-button"
onClick={() => {
setpopupEasterEgg(false);
}}
>
X
</button>
</div>
<h1>if you're reading this you're very silly</h1>
</div>
</div>
</Music>
<Music shouldpopup={shouldpopup88}>
<div class="musicdiv">
<div class="innermusic">
<div class="music-close-button-div">
<button
class="close-button"
onClick={() => {
setpopup88(false);
}}
>
X
</button>
</div>
<div style={{}}>
<img src="https://amy.rip/88x31.png" alt="" />
<br />
<span>
<AdvancedBr count={3}/>
<Music shouldpopup={shouldpopup}>
<div class="musicdiv">
<div class="innermusic">
<div class="music-close-button-div">
<button
class="close-button"
onClick={() => {
setpopup(false);
}}
>
X
</button>
</div>
<div class="musiclist">
{isLoading() ? (
<p>Loading...</p>
) : (
musicList().map((link) => <MusicEntry musicInfo={link}/>)
)}
</div>
</div>
</div>
</Music>
<Music shouldpopup={shouldpopupEasterEgg}>
<div class="musicdiv">
<div class="innermusic">
<div class="music-close-button-div">
<button
class="close-button"
onClick={() => {
setpopupEasterEgg(false);
}}
>
X
</button>
</div>
<h1>if you're reading this you're very silly</h1>
</div>
</div>
</Music>
<Music shouldpopup={shouldpopup88}>
<div class="musicdiv">
<div class="innermusic">
<div class="music-close-button-div">
<button
class="close-button"
onClick={() => {
setpopup88(false);
}}
>
X
</button>
</div>
<div style={{}}>
<img src="https://amy.rip/88x31.png" alt=""/>
<br/>
<span>
feel free to link mine, <code style={{"user-select": "all"}}>https://amy.rip/88x31.png</code>
</span>
<div style={{ "background-color": "gray", height: "1px" }} />
<div>
<Singular88
name="nax"
url="https://nax.dev"
src="https://nax.dev/88x31.gif"
/>
<Singular88
name="sophari"
url="https://sophari.org"
src="https://sophari.org/img/sophari.gif"
/>
<Singular88
name="rini"
url="https://rinici.de/"
src="https://rinici.de/button.png"
/>
</div>
<div style={{"background-color": "gray", height: "1px"}}/>
<div>
<Singular88
name="nax"
url="https://nax.dev"
src="https://nax.dev/88x31.gif"
/>
<Singular88
name="sophari"
url="https://sophari.org"
src="https://sophari.org/img/sophari.gif"
/>
<Singular88
name="Spike"
url="https://potatoe.ca"
src="https://potatoe.ca/images/88x31/potatoe.png"
/>
<Singular88
name="gen"
url="https://genshibe.ca"
src="https://genshibe.ca/assets/button.png"
/>
</div>
</div>
</div>
</div>
</Music>
<div class="footer">
{" "}
<a href="https://ko-fi.com/amyarson">support me </a>
<br/>
made with by amy.{" "}
<a href="https://git.amy.rip/amy/amy.rip">
this website is opensource
</a>
</div>
</div>
</div>
</Music>
<div class="footer">
{" "}
<a href="https://ko-fi.com/amyarson">support me </a>
<br />
made with by amy.{" "}
<a href="https://git.lgbt/amy/amy.rip">
this website is opensource
</a>
</div>
</>
);
</>
);
}
export default App;

View file

@ -1,125 +1,125 @@
import { createSignal, onMount } from "solid-js";
import { ishover } from "../App";
import {createSignal, onMount} from "solid-js";
import {ishover} from "../App";
interface Review {
reviewID: number;
discordID: string;
reviewText: string;
timestamp: string;
id: number;
reviewer: string;
review: string;
}
interface NeoReview extends Review {
global_name: string;
username: string;
global_name: string;
username: string;
}
export default function Reviews() {
const [reviews, setReviews] = createSignal<NeoReview[]>([]);
onMount(() => {
fetch("https://review.exhq.dev/getreviews")
.then((response) => response.json())
.then((data: Review[]) => {
const promises = data.map((review) =>
fetch(`https://discord-info.api.amy.rip/v1/user/${review.discordID}`)
const [reviews, setReviews] = createSignal<NeoReview[]>([]);
onMount(() => {
fetch("https://maggie.amy.rip/reviews")
.then((response) => response.json())
.then((user) => ({
...review,
global_name: user.global_name,
username: user.username,
})),
);
.then((data: Review[]) => {
const promises = data.map((review) =>
fetch(`https://discord-info.api.amy.rip/v1/user/${review.reviewer}`)
.then((response) => response.json())
.then((user) => ({
...review,
global_name: user.global_name,
username: user.username,
})),
);
Promise.all(promises)
.then((yeah) => {
setReviews(yeah);
})
.catch((error) =>
console.error("Error fetching Discord user data:", error),
);
})
.catch((error) => console.error("Error fetching reviews:", error));
});
Promise.all(promises)
.then((yeah) => {
setReviews(yeah);
})
.catch((error) =>
console.error("Error fetching Discord user data:", error),
);
})
.catch((error) => console.error("Error fetching reviews:", error));
});
return (
<>
<a
style={{
display: ishover() ? "inline" : "none",
}}
href="https://discord.com/oauth2/authorize?client_id=1208380910525743134&response_type=token&redirect_uri=https%3A%2F%2Famy.rip%2Freview%2F&scope=identify"
>
<p class="fadein">add your reviews here</p>
</a>
<h1 class="reviewheadertext">Reviews</h1>
<div class="actualreviewdiv">
{reviews().length > 0 ? (
reviews()
.reverse()
.map((review) => (
<div>
<SingleReview {...review} />
</div>
))
) : (
<div>Loading reviews...</div>
)}
</div>
</>
);
return (
<div class="reviewsection">
<h1 class="reviewheadertext">Reviews</h1>
<a
style={{
opacity: ishover() ? '100%' : '0%',
// visibility: !ishover() ? 'hidden' : 'visible',
}}
href="https://discord.com/oauth2/authorize?client_id=1208380910525743134&response_type=token&redirect_uri=https%3A%2F%2Famy.rip%2Freview%2F&scope=identify"
>
<p class="fadein">add your reviews here</p>
</a>
<div class="actualreviewdiv">
{reviews().length > 0 ? (
reviews()
.reverse()
.map((review) => (
<div>
<SingleReview {...review} />
</div>
))
) : (
<div>Loading reviews...</div>
)}
</div>
</div>
);
}
export const theImager = async (id: string): Promise<string> =>
await fetch(`https://discord-info.api.amy.rip/v1/user/${id}`)
.then((res) => res.json())
.then((data) => "https://proxy.spiro.exhq.dev/_/plain/" + data.avatar.link)
.catch(() => "https://http.cat/status/100");
await fetch(`https://discord-info.api.amy.rip/v1/user/${id}`)
.then((res) => res.json())
.then((data) => data.avatar.link)
.catch(() => "https://http.cat/status/100");
function SingleReview(props: NeoReview) {
const [imageSrc, setImageSrc] = createSignal("");
const [imageSrc, setImageSrc] = createSignal("");
onMount(async () => {
const url = await theImager(props.discordID);
setImageSrc(url);
});
onMount(async () => {
const url = await theImager(String(props.reviewer));
setImageSrc(url);
});
return (
<div class="singlereview">
<img
src={imageSrc()}
alt="User Avatar"
style={{ "max-width": "3em", "border-radius": "30%" }}
/>
<div class="reviewinfo">
<div class="reviewname">
{props.global_name === null ? props.username : props.global_name}
return (
<div class="singlereview">
<img
src={imageSrc()}
alt="User Avatar"
style={{"max-width": "3em", "border-radius": "30%"}}
/>
<div class="reviewinfo">
<div class="reviewname">
{props.global_name === null ? props.username : props.global_name}
</div>
<div class="reviewtext">{props.review}</div>
</div>
</div>
<div class="reviewtext">{props.reviewText}</div>
</div>
</div>
);
);
}
export async function sendReview(
review: string,
token: string,
review: string,
token: string,
): Promise<boolean> {
try {
const response = await fetch(
`https://review.exhq.dev/sendreview?review=${review}`,
{
headers: {
Auth: token,
},
method: "POST",
},
);
try {
const response = await fetch(
`https://maggie.amy.rip/sendreview?review=${review}`,
{
headers: {
Authentication: token,
},
method: "POST",
},
);
if (response.status !== 200) {
return false;
if (response.status !== 200) {
return false;
}
return true;
} catch (error) {
return false;
}
return true;
} catch (error) {
return false;
}
}

View file

@ -36,7 +36,7 @@ export function Cumbrainz() {
const [isLoading, setIsLoading] = createSignal(true);
onMount(async () => {
try {
const the = await fetch("https://music.exhq.dev/")
const the = await fetch("https://api.listenbrainz.org/1/user/amyulated/playing-now")
const thejson = await the.json()
setMusicInfo(thejson)
} catch (error) {

View file

@ -28,8 +28,8 @@ export function MusicEntry(props: {musicInfo:Song}) {
<img style={{
"margin-right": "0.5em"
}}
src={"https://proxy.spiro.exhq.dev/_/plain/" + props.musicInfo.thumbnailUrl}
alt={"album cover of" + props.musicInfo.title}/>
src={props.musicInfo.thumbnailUrl}
alt={"album cover of " + props.musicInfo.title}/>
<div class="innersinglemusic">
<div class="musicartist"> {
shortenName(props.musicInfo.artist)

View file

@ -1,5 +1,7 @@
import HoverComponent from "./name";
import "./pfp.css";
import {RotatingCubeButton} from "./rotatingCubeButton.tsx";
import {createSignal} from "solid-js";
export function Bdpfp({
setpopupEasterEgg,
@ -28,42 +30,39 @@ export function Bdpfp({
}
export function Normalpfp({
setpopupEasterEgg,
}: {
setpopupEasterEgg: (value: boolean) => void;
setpopupEasterEgg,
}: {
setpopupEasterEgg: (value: boolean) => void;
}) {
return (
<div
onContextMenu={(e) => {
e.preventDefault();
setpopupEasterEgg(true);
}}
class="birthdayparent header normal"
>
<img
class="initialanim"
src="https://dp.nea.moe/avatar/603229858612510720.png"
alt="amy's current discord pfp"
onMouseEnter={(e) => {
(e.target as HTMLImageElement).animate(
[{ transform: "rotateZ(0deg)" }, { transform: "rotateZ(360deg)" }],
{
duration: 400,
iterations: 1,
},
);
}}
onClick={(e) => {
(e.target as HTMLImageElement).animate(
[{ transform: "rotateY(0deg)" }, { transform: "rotateY(360deg)" }],
{
duration: 150,
iterations: 1,
},
);
}}
/>
<HoverComponent />
</div>
);
}
// State to control whether the cube or the image is displayed
const [showCube, setShowCube] = createSignal(false);
return (
<div
onContextMenu={(e) => {
e.preventDefault();
setpopupEasterEgg(true);
}}
// On click, toggle the showCube state
onClick={() => setShowCube(true)}
class="birthdayparent header normal"
style={{ cursor: 'pointer', display: 'flex', "justify-content": 'center', "align-items": 'center' }} // Added styles for centering content
>
{showCube() ? (
// If showCube is true, render the RotatingCubeButton
// The onClick for the cube itself can be an empty function or trigger something else
<RotatingCubeButton onClick={() => console.log("Cube pfp clicked!")} />
) : (
// Otherwise, render the original image and HoverComponent
<>
<img
class="initialanim"
src="https://dp.nea.moe/avatar/603229858612510720.png"
alt="amy's current discord pfp"
/>
<HoverComponent />
</>
)}
</div>
);
}

View file

@ -0,0 +1,90 @@
// src/components/RotatingCubeButton.tsx
import { onCleanup, onMount } from 'solid-js';
import * as THREE from 'three';
interface RotatingCubeButtonProps {
onClick: () => void;
}
export const RotatingCubeButton = (props: RotatingCubeButtonProps) => {
let mountRef: HTMLDivElement | undefined;
let renderer: THREE.WebGLRenderer;
let scene: THREE.Scene;
let camera: THREE.PerspectiveCamera;
let cube: THREE.Mesh;
let animationFrameId: number;
onMount(() => {
if (mountRef) {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, 1, 0.1, 1000);
camera.position.z = 2;
renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
renderer.setSize(mountRef.clientWidth, mountRef.clientHeight);
mountRef.appendChild(renderer.domElement);
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load(
'https://dp.nea.moe/avatar/603229858612510720.png',
undefined,
() => {
cube.material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
}
);
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ map: texture });
cube = new THREE.Mesh(geometry, material);
scene.add(cube);
const animate = () => {
animationFrameId = requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
};
animate();
const handleResize = () => {
if (mountRef) {
camera.aspect = mountRef.clientWidth / mountRef.clientHeight;
camera.updateProjectionMatrix();
renderer.setSize(mountRef.clientWidth, mountRef.clientHeight);
}
};
window.addEventListener('resize', handleResize);
onCleanup(() => {
window.removeEventListener('resize', handleResize);
cancelAnimationFrame(animationFrameId);
if (mountRef && renderer.domElement) {
mountRef.removeChild(renderer.domElement);
}
geometry.dispose();
material.dispose();
texture.dispose();
renderer.dispose();
});
}
});
return (
<div
ref={mountRef}
onClick={props.onClick}
style={{
width: '20em',
height: '20em',
display: 'flex',
"justify-content": 'center',
"align-items": 'center',
overflow: 'hidden',
}}
>
</div>
);
};