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 $ 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 ## Available Scripts
In the project directory, you can run: 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` ### `npm run build`
Builds the app for production to the `dist` folder.<br> 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> The build is minified and the filenames include the hashes.<br>
Your app is ready to be deployed! Your app is ready to be deployed!
## Deployment
Learn more about deploying your application with the [documentations](https://vitejs.dev/guide/static-deploy.html)

View file

@ -10,7 +10,9 @@
}, },
"dependencies": { "dependencies": {
"@types/node": "^20.14.10", "@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": { "devDependencies": {
"typescript": "^5.2.2", "typescript": "^5.2.2",

59
pnpm-lock.yaml generated
View file

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

View file

@ -3,22 +3,28 @@ import "./reviewed.css";
import { sendReview } from "../src/components/api"; import { sendReview } from "../src/components/api";
export default function App() { export default function App() {
const token = window.location.hash const hash = window.location.hash;
.substring(
window.location.hash.indexOf("access_token") + "access_token".length + 1, const hashContent = hash.startsWith('#') ? hash.substring(1) : hash;
)
.substring(0, 30); const params = new URLSearchParams(hashContent);
console.log(token);
if (token === "") { 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 = 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; let ref!: HTMLTextAreaElement;
return ( return (
<div class="reviewOuterparent"> <div class="reviewOuterparent">
<div class="reviewParent"> <div class="reviewParent">
<img src="../fjonkie.png" alt="" /> <p>DISCLAIMER: YOUR DISCORD ID WILL BE ATTACHED TO THE REVIEW IN THE SOURCE CODE.</p>
<span>(it doesnt)</span>
<textarea <textarea
ref={ref} ref={ref}
onKeyPress={async (e) => { onKeyPress={async (e) => {

View file

@ -3,12 +3,12 @@
<head> <head>
<meta charset="UTF-8" /> <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" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>amy reviews</title> <title>amy reviews</title>
<meta content="review" property="og:title" /> <meta content="review" property="og:title" />
<meta content="rewviewdb, but not turkish" property="og:description" /> <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" /> <meta content="#43B581" data-react-helmet="true" name="theme-color" />
</head> </head>

View file

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

View file

@ -1,10 +1,11 @@
// src/App.tsx
import "./App.css"; import "./App.css";
import { AdvancedBr, Singular88, SingularOomfie } from "./components/comps.tsx"; import {AdvancedBr, Singular88, SingularOomfie} from "./components/comps.tsx";
import { createSignal, onMount } from "solid-js"; import {createSignal, onMount} from "solid-js";
import Reviews from "./components/api.tsx"; import Reviews from "./components/api.tsx";
import { Music, MusicEntry, Song } from "./components/music.tsx"; import {Music, MusicEntry, Song} from "./components/music.tsx";
import { Bdpfp, Normalpfp } from "./components/pfp.tsx"; import {Bdpfp, Normalpfp} from "./components/pfp.tsx";
import { InfoCard } from "./components/middlecard.tsx"; import {InfoCard} from "./components/middlecard.tsx";
export const [shouldpopup, setpopup] = createSignal(false); export const [shouldpopup, setpopup] = createSignal(false);
export const [shouldpopup88, setpopup88] = 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"; const isitmybd = () => new Date().toISOString().slice(5, 10) === "08-22";
function getRandomVivsieWord() { function getRandomVivsieWord() {
const words = ["fuck", "shit", "pussy", "penis", "dick"]; const words = ["fuck", "shit", "pussy", "penis", "dick"];
return words[Math.floor(Math.random() * words.length)]; return words[Math.floor(Math.random() * words.length)];
} }
function vivsiepop() { function vivsiepop() {
const blep = document.body.childNodes; const blep = document.body.childNodes;
function fuckshit(node: ChildNode) { function fuckshit(node: ChildNode) {
if (node.nodeType === Node.TEXT_NODE) { if (node.nodeType === Node.TEXT_NODE) {
node.textContent = getRandomVivsieWord(); node.textContent = getRandomVivsieWord();
} else { } else {
node.childNodes.forEach(fuckshit); node.childNodes.forEach(fuckshit);
}
} }
}
blep.forEach(fuckshit); blep.forEach(fuckshit);
} }
function nyaboom() { function nyaboom() {
explodcount++; explodcount++;
const blep = document.body.childNodes; const blep = document.body.childNodes;
function fuckshit(node: ChildNode) { function fuckshit(node: ChildNode) {
if (node.nodeType === Node.TEXT_NODE) { if (node.nodeType === Node.TEXT_NODE) {
(node as Element).textContent = ""; (node as Element).textContent = "";
node.parentElement?.appendChild( node.parentElement?.appendChild(
( (
<img <img
style={{ style={{
width: "1.5em", width: "1.5em",
}} }}
src="./explod.gif" src="./explod.gif"
/> />
) as Element, ) as Element,
); );
} else if (node instanceof HTMLImageElement) { } else if (node instanceof HTMLImageElement) {
node.src = "./explod.gif"; node.src = "./explod.gif";
} else { } else {
node.childNodes.forEach(fuckshit); node.childNodes.forEach(fuckshit);
}
} }
}
blep.forEach(fuckshit); blep.forEach(fuckshit);
} }
function App() { function App() {
const [musicList, setMusicList] = createSignal<Song[]>([]); const [musicList, setMusicList] = createSignal<Song[]>([]);
const [isLoading, setIsLoading] = createSignal(true); const [isLoading, setIsLoading] = createSignal(true);
const [oomfies, setoomfies] = createSignal(<>oomfies</>); const [oomfies, setoomfies] = createSignal(<>oomfies</>);
const [isAnimating, setIsAnimating] = createSignal(false); const [isAnimating, setIsAnimating] = createSignal(false);
onMount(async () => { onMount(async () => {
try { try {
const response = await fetch( const response = await fetch(
"https://bopbot.amy.rip/", "https://bopbot.amy.rip/",
); );
const data = await response.json() as Song[]; const data = await response.json() as Song[];
data.reverse(); data.reverse();
setMusicList(data); setMusicList(data);
} catch (error) { } catch (error) {
console.error("Error fetching music data:", error); console.error("Error fetching music data:", error);
} finally { } finally {
setIsLoading(false); setIsLoading(false);
} }
}); });
let gitgay = ( let gitgay = (
<img <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"
onClick={() => { onClick={() => {
setoomfies( setIsAnimating(true);
<> setTimeout(() => {
<SingularOomfie window.location.href = "https://git.amy.rip/amy";
name="ashley" }, 200);
discordid="836177139798638592" gitgay.src = "/gaybackground.png";
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>
</>,
);
}} }}
> classList={{
{" "} gitgayimg: true,
{oomfies()} animate: isAnimating(),
</div> gaybackground: isAnimating(),
</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" src="https://git.amy.rip/assets/img/logo.png"
/> alt="logo of git.amy.rip"
</div> />
</div> ) as HTMLImageElement;
<AdvancedBr count={3} /> // @ts-ignore
<Music shouldpopup={shouldpopup}> return (
<div class="musicdiv"> <>
<div class="innermusic"> {isitmybd() ? (
<div class="music-close-button-div"> <Bdpfp setpopupEasterEgg={setpopupEasterEgg}/>
<button ) : (
class="close-button" <Normalpfp setpopupEasterEgg={setpopupEasterEgg}/>
onClick={() => { )}
setpopup(false);
}} <p style={{display: "none"}}>AdvancedBr my beloved</p>
> <AdvancedBr count={6}/>
X
</button> <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>
<div class="musiclist"> <AdvancedBr count={2}/>
{isLoading() ? ( <div class="easteregg" style={{opacity: isAnimating() ? "0%" : "100%"}}>
<p>Loading...</p> <div
) : ( class="musicbutton"
musicList().map((link) => <MusicEntry musicInfo={link} />) 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> <AdvancedBr count={3}/>
</div> <Music shouldpopup={shouldpopup}>
</Music> <div class="musicdiv">
<Music shouldpopup={shouldpopupEasterEgg}> <div class="innermusic">
<div class="musicdiv"> <div class="music-close-button-div">
<div class="innermusic"> <button
<div class="music-close-button-div"> class="close-button"
<button onClick={() => {
class="close-button" setpopup(false);
onClick={() => { }}
setpopupEasterEgg(false); >
}} X
> </button>
X </div>
</button> <div class="musiclist">
</div> {isLoading() ? (
<h1>if you're reading this you're very silly</h1> <p>Loading...</p>
</div> ) : (
</div> musicList().map((link) => <MusicEntry musicInfo={link}/>)
</Music> )}
<Music shouldpopup={shouldpopup88}> </div>
<div class="musicdiv"> </div>
<div class="innermusic"> </div>
<div class="music-close-button-div"> </Music>
<button <Music shouldpopup={shouldpopupEasterEgg}>
class="close-button" <div class="musicdiv">
onClick={() => { <div class="innermusic">
setpopup88(false); <div class="music-close-button-div">
}} <button
> class="close-button"
X onClick={() => {
</button> setpopupEasterEgg(false);
</div> }}
<div style={{}}> >
<img src="https://amy.rip/88x31.png" alt="" /> X
<br /> </button>
<span> </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> feel free to link mine, <code style={{"user-select": "all"}}>https://amy.rip/88x31.png</code>
</span> </span>
<div style={{ "background-color": "gray", height: "1px" }} /> <div style={{"background-color": "gray", height: "1px"}}/>
<div> <div>
<Singular88 <Singular88
name="nax" name="nax"
url="https://nax.dev" url="https://nax.dev"
src="https://nax.dev/88x31.gif" src="https://nax.dev/88x31.gif"
/> />
<Singular88 <Singular88
name="sophari" name="sophari"
url="https://sophari.org" url="https://sophari.org"
src="https://sophari.org/img/sophari.gif" src="https://sophari.org/img/sophari.gif"
/> />
<Singular88 <Singular88
name="rini" name="Spike"
url="https://rinici.de/" url="https://potatoe.ca"
src="https://rinici.de/button.png" src="https://potatoe.ca/images/88x31/potatoe.png"
/> />
</div> <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> </>
</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; export default App;

View file

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

View file

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

View file

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