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]": { "[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode" "editor.defaultFormatter": "esbenp.prettier-vscode"
}, },
"prettier.requireConfig": true,
"prettier.configPath": ".prettierrc.mjs", "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 { defineConfig, envField } from "astro/config";
import tailwindIntegration from "@astrojs/tailwind"; import tailwindIntegration from "@astrojs/tailwind";
import htaccessIntegration from "astro-htaccess"; import htaccessIntegration from "astro-htaccess";
import { AI_BOTS } from "./src/data/ai_bots";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
@ -11,6 +12,15 @@ export default defineConfig({
}), }),
htaccessIntegration({ htaccessIntegration({
generateHtaccessFile: import.meta.env.APACHE_CONFIG === "true", 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: [ redirects: [
{ {
match: /^\/@\/(aryion|ekas?(portal)?)\b/, match: /^\/@\/(aryion|ekas?(portal)?)\b/,
@ -124,6 +134,10 @@ export default defineConfig({
match: /^\/@\/redd\.?it\b/, match: /^\/@\/redd\.?it\b/,
url: "https://www.reddit.com/user/BadManners_", url: "https://www.reddit.com/user/BadManners_",
}, },
{
match: /^\/@\/resetera\b/,
url: "https://www.resetera.com/members/bad-manners.181209/",
},
{ {
match: /^\/@\/signal\b/, match: /^\/@\/signal\b/,
url: "https://signal.me/#eu/ytt_rk0fFmAB2JAW-x2PbUiJyc_H3kYmfL_Pq4QNh5QIDsiFtjdFHaqFRs1D36tB", url: "https://signal.me/#eu/ytt_rk0fFmAB2JAW-x2PbUiJyc_H3kYmfL_Pq4QNh5QIDsiFtjdFHaqFRs1D36tB",

View file

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

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