Add Resetera and pubkey fingerprint, and block bots

This commit is contained in:
Bad Manners 2024-09-04 18:07:00 -03:00
parent 3804cbe39e
commit 5e368d6e34
No known key found for this signature in database
GPG key ID: 8C88292CCB075609
11 changed files with 136 additions and 184 deletions

View file

@ -11,6 +11,8 @@
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"prettier.requireConfig": true,
"prettier.configPath": ".prettierrc.mjs",
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}

View file

@ -1,6 +1,7 @@
import { defineConfig, envField } from "astro/config";
import tailwindIntegration from "@astrojs/tailwind";
import htaccessIntegration from "astro-htaccess";
import { AI_BOTS } from "./src/data/ai_bots";
// https://astro.build/config
export default defineConfig({
@ -11,6 +12,15 @@ export default defineConfig({
}),
htaccessIntegration({
generateHtaccessFile: import.meta.env.APACHE_CONFIG === "true",
customRules: [
// Block AI bots
"<IfModule mod_rewrite.c>",
" RewriteEngine on",
" RewriteBase /",
` RewriteCond %{HTTP_USER_AGENT} ${AI_BOTS.map((bot) => `^${bot}$`).join("|")} [NC]`,
" RewriteRule ^ [F]",
"</IfModule>",
],
redirects: [
{
match: /^\/@\/(aryion|ekas?(portal)?)\b/,
@ -124,6 +134,10 @@ export default defineConfig({
match: /^\/@\/redd\.?it\b/,
url: "https://www.reddit.com/user/BadManners_",
},
{
match: /^\/@\/resetera\b/,
url: "https://www.resetera.com/members/bad-manners.181209/",
},
{
match: /^\/@\/signal\b/,
url: "https://signal.me/#eu/ytt_rk0fFmAB2JAW-x2PbUiJyc_H3kYmfL_Pq4QNh5QIDsiFtjdFHaqFRs1D36tB",

View file

@ -1,2 +0,0 @@
User-agent: *
Disallow: .htaccess

View file

@ -1 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ3QAZd3E95gxef2kiXppWa/xhcwBtnKMZJaW6s4d7Tm Bad Manners <me@badmanners.xyz>
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ3QAZd3E95gxef2kiXppWa/xhcwBtnKMZJaW6s4d7Tm Bad Manners <me@badmanners.xyz>

View file

@ -0,0 +1 @@
SHA256:KdH6YixZQlyFZvTw0M60qVqei4ds4sfomVikMbw0n6E

View file

@ -0,0 +1,15 @@
---
import SVGIcon from "../SVGIcon.astro";
type Props = {
width: string;
height: string;
class?: string;
};
---
<SVGIcon {...Astro.props} viewBox="0 0 24 24">
<path
d="M 0,4.0461603 V 24 h 10.489299 l 4.733529,-4.733529 -0.03777,-0.03525 -4.695762,-4.695762 v 4.695762 H 4.7687789 V 10.489299 8.8149392 4.7687789 h 4.0461603 1.6743598 8.741922 v 5.7205201 h -4.695762 l 4.695762,4.695762 0.03525,0.03777 L 24,10.489299 V 0 H 4.0461603 0 Z"
></path>
</SVGIcon>

View file

@ -18,6 +18,7 @@ export { default as IconMastodon } from "./IconMastodon.astro";
export { default as IconNeocities } from "./IconNeocities.astro";
export { default as IconPicarto } from "./IconPicarto.astro";
export { default as IconReddit } from "./IconReddit.astro";
export { default as IconResetera } from "./IconResetera.astro";
export { default as IconSignal } from "./IconSignal.astro";
export { default as IconSoFurry } from "./IconSoFurry.astro";
export { default as IconSteam } from "./IconSteam.astro";

38
src/data/ai_bots.ts Normal file
View file

@ -0,0 +1,38 @@
export const AI_BOTS = [
"AI2Bot",
"Ai2Bot-Dolma",
"Amazonbot",
"Applebot",
"Applebot-Extended",
"Bytespider",
"CCBot",
"ChatGPT-User",
"Claude-Web",
"ClaudeBot",
"Diffbot",
"FacebookBot",
"FriendlyCrawler",
"GPTBot",
"Google-Extended",
"GoogleOther",
"GoogleOther-Image",
"GoogleOther-Video",
"ICC-Crawler",
"ImagesiftBot",
"Meta-ExternalAgent",
"Meta-ExternalFetcher",
"OAI-SearchBot",
"PerplexityBot",
"PetalBot",
"Scrapy",
"Timpibot",
"VelenPublicWebCrawler",
"Webzio-Extended",
"YouBot",
"anthropic-ai",
"cohere-ai",
"facebookexternalhit",
"img2dataset",
"omgili",
"omgilibot",
] as const;

View file

@ -23,6 +23,7 @@ import {
IconNeocities,
IconPicarto,
IconReddit,
IconResetera,
IconSignal,
IconSoFurry,
IconSteam,
@ -79,11 +80,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
data-clipboard={Astro.site}
data-noun="URL"
>
<IconLink
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconLink height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="sr-only select-none">https://badmanners.xyz</p>
</a>
</li>
@ -98,11 +95,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
aria-label="Main gallery"
data-age-restricted
>
<IconBriefcase
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconBriefcase height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="sr-only select-none">Gallery on https://gallery.badmanners.xyz</p>
</a>
</li>
@ -114,11 +107,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Pronouns (he/they)"
>
<IconCommentDots
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconCommentDots height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">@BadManners on pronouns.cc</p>
<p class="p-pronoun hidden">he/him/his/his/himself</p>
<p class="p-pronoun hidden">they/them/their/theirs/themself</p>
@ -134,11 +123,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
data-clipboard="me@badmanners.xyz"
data-noun="E-mail address"
>
<IconEnvelope
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconEnvelope height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="sr-only select-none">me@badmanners.xyz</p>
</a>
</li>
@ -150,11 +135,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Bluesky"
>
<IconBluesky
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconBluesky height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">@badmanners.xyz on Bluesky</p>
</a>
</li>
@ -166,11 +147,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Codeberg"
>
<IconCodeberg
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconCodeberg height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadManners on Codeberg</p>
</a>
</li>
@ -182,11 +159,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Cohost"
>
<IconCohost
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconCohost height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadManners on Cohost</p>
</a>
</li>
@ -199,11 +172,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
data-noun="Discord username"
aria-disabled="true"
>
<IconDiscord
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconDiscord height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmanners on Discord</p>
</button>
</li>
@ -215,11 +184,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Eka's Portal"
>
<IconEkasPortal
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconEkasPortal height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadManners on Eka's Portal</p>
</a>
</li>
@ -231,11 +196,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Fur Affinity"
>
<IconFurAffinity
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconFurAffinity height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadManners on Fur Affinity</p>
</a>
</li>
@ -247,11 +208,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="GitGud"
>
<IconGitGud
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconGitGud height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadMannersXYZ on GitGud</p>
</a>
</li>
@ -263,11 +220,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="GitHub"
>
<IconGithub
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconGithub height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadMannersXYZ on GitHub</p>
</a>
</li>
@ -279,11 +232,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="GitLab"
>
<IconGitlab
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconGitlab height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">Bad_Manners on GitLab</p>
</a>
</li>
@ -297,11 +246,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
data-clipboard="badmanners.vore@gmail.com"
data-noun="Gmail address"
>
<IconGoogle
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconGoogle height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="sr-only select-none">badmanners.vore@gmail.com</p>
</a>
</li>
@ -314,11 +259,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
data-clipboard={gpgKey}
data-noun="GPG key"
>
<IconKey
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconKey height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="sr-only select-none">GPG public key</p>
</a>
</li>
@ -330,11 +271,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Inkbunny"
>
<IconInkbunny
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconInkbunny height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadManners on Inkbunny</p>
</a>
</li>
@ -346,11 +283,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Itaku"
>
<IconItaku
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconItaku height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmanners on Itaku</p>
</a>
</li>
@ -362,11 +295,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Itch.io"
>
<IconItchIO
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconItchIO height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">Bad Manners on Itch.io</p>
</a>
</li>
@ -378,11 +307,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Keybase"
>
<IconKeybase
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconKeybase height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmanners on Keybase</p>
</a>
</li>
@ -394,11 +319,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Keyoxide"
>
<IconKeyoxide
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconKeyoxide height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="sr-only select-none">
<span class="p-uid">aspe:keyoxide.org:UWYBVFCBFXTVUF2U6FS6AYJHLU</span> on Keyoxide
</p>
@ -412,11 +333,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Ko-fi"
>
<IconKofi
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconKofi height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmanners on Ko-fi</p>
</a>
</li>
@ -428,11 +345,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Mastodon"
>
<IconMastodon
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconMastodon height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">@BadManners@meow.social on Mastodon</p>
</a>
</li>
@ -444,11 +357,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Neocities"
>
<IconNeocities
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconNeocities height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmanners.neocities.org on Neocities</p>
</a>
</li>
@ -460,11 +369,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Picarto"
>
<IconPicarto
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconPicarto height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadManners on Picarto</p>
</a>
</li>
@ -476,14 +381,22 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Reddit"
>
<IconReddit
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconReddit height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">/u/BadManners_ on Reddit</p>
</a>
</li>
<li>
<a
id="resetera"
class="u-url text-link group block w-full py-2 transition-colors motion-reduce:transition-none"
href="https://www.resetera.com/members/bad-manners.181209/"
rel="me"
aria-label="Resetera"
>
<IconResetera height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">Bad Manners on Resetera</p>
</a>
</li>
<li>
<a
id="signal"
@ -492,11 +405,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Signal"
>
<IconSignal
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconSignal height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmanners.10 on Signal</p>
</a>
</li>
@ -508,11 +417,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="SoFurry"
>
<IconSoFurry
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconSoFurry height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">Bad Manners on SoFurry</p>
</a>
</li>
@ -525,11 +430,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
data-clipboard={sshKey}
data-noun="SSH key"
>
<IconSSH
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconSSH height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="sr-only select-none">SSH public key</p>
</a>
</li>
@ -541,11 +442,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Steam"
>
<IconSteam
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconSteam height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmanners_ on Steam</p>
</a>
</li>
@ -557,11 +454,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="SubscribeStar"
>
<IconSubscribeStar
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconSubscribeStar height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">Bad Manners on SubscribeStar</p>
</a>
</li>
@ -573,11 +466,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Telegram"
>
<IconTelegram
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconTelegram height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">@bad_manners on Telegram</p>
</a>
</li>
@ -589,11 +478,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Tumblr"
>
<IconTumblr
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconTumblr height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">badmannersxyz on Tumblr</p>
</a>
</li>
@ -605,11 +490,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Twitch"
>
<IconTwitch
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconTwitch height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">bad__manners on Twitch</p>
</a>
</li>
@ -621,11 +502,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="Weasyl"
>
<IconWeasyl
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconWeasyl height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">BadManners on Weasyl</p>
</a>
</li>
@ -637,11 +514,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="X"
>
<IconX
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconX height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">@BadManners__ on X</p>
</a>
</li>
@ -653,11 +526,7 @@ const sshKey = await readFile("./public/ssh.pub", { encoding: "utf-8" });
rel="me"
aria-label="YouTube"
>
<IconYouTube
height="1.75rem"
width="1.75rem"
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
/>
<IconYouTube height="1.75rem" width="1.75rem" class="contact-icon" />
<p class="p-nickname sr-only select-none">@BadMannersXYZ on YouTube</p>
</a>
</li>

10
src/pages/robots.txt.ts Normal file
View file

@ -0,0 +1,10 @@
import type { APIRoute } from "astro";
import { AI_BOTS } from "../data/ai_bots";
export const GET: APIRoute = async () => {
const robots = [AI_BOTS.map((bot) => `User-agent: ${bot}`), "Disallow: /", "", "User-agent: *", "Disallow: .htaccess"]
.flat()
.join("\n");
return new Response(robots, { headers: { "Content-Type": "text/plain; charset=utf-8" } });
};

View file

@ -27,4 +27,8 @@
.button-close {
@apply rounded-full p-[6px] text-stone-800 hover:bg-stone-300 hover:text-stone-800 focus:bg-stone-300 focus:text-stone-800 sm:p-2 dark:text-zinc-300 dark:hover:bg-zinc-500 dark:hover:text-zinc-800 dark:focus:bg-zinc-500 dark:focus:text-zinc-800;
}
.contact-icon {
@apply inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100;
}
}