Add Resetera and pubkey fingerprint, and block bots
This commit is contained in:
parent
3804cbe39e
commit
5e368d6e34
11 changed files with 136 additions and 184 deletions
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
User-agent: *
|
|
||||||
Disallow: .htaccess
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ3QAZd3E95gxef2kiXppWa/xhcwBtnKMZJaW6s4d7Tm Bad Manners <me@badmanners.xyz>
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ3QAZd3E95gxef2kiXppWa/xhcwBtnKMZJaW6s4d7Tm Bad Manners <me@badmanners.xyz>
|
||||||
1
public/ssh.pub.fingerprint
Normal file
1
public/ssh.pub.fingerprint
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
SHA256:KdH6YixZQlyFZvTw0M60qVqei4ds4sfomVikMbw0n6E
|
||||||
15
src/components/icons/brands/IconResetera.astro
Normal file
15
src/components/icons/brands/IconResetera.astro
Normal 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>
|
||||||
|
|
@ -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
38
src/data/ai_bots.ts
Normal 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;
|
||||||
|
|
@ -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
10
src/pages/robots.txt.ts
Normal 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" } });
|
||||||
|
};
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue