chore: squashed some commits, which are not for public viewing

fix: fixed ImageSection being broken on mobile
feat: added proper imprint
feat: added name to privacy-policy
feat: bump version
fix: fixed footer not rendering correct on some mobile devices
chore: bump version
feat: imported html from Config repo
Updated packages
Migration from astro to solid-start
Add database and auth
Add discord rest testing
Database schema rework
API meeting progress
Fix styles
This commit is contained in:
Aron Malcher 2024-01-05 01:29:38 +01:00
parent eb3acd206c
commit 2e529cede8
Signed by: aronmal
GPG key ID: 816B7707426FC612
50 changed files with 9903 additions and 5045 deletions

8
.eslintrc.json Normal file
View file

@ -0,0 +1,8 @@
{
"parser": "@typescript-eslint/parser",
"env": {
"node": true
},
"plugins": ["solid"],
"extends": ["eslint:recommended", "plugin:solid/typescript"]
}

43
.gitignore vendored
View file

@ -1,28 +1,29 @@
# build output src/drizzle/migrations
dist/
# generated types dist
.astro/ .vinxi
.output
.vercel
.netlify
netlify
# Environment
.env
.env*.local
# dependencies # dependencies
node_modules/ /node_modules
# logs # IDEs and editors
npm-debug.log* /.idea
yarn-debug.log* .project
yarn-error.log* .classpath
pnpm-debug.log* *.launch
.settings/
# environment variables # Temp
.env gitignore
.env.production
# macOS-specific files # System Files
.DS_Store .DS_Store
Thumbs.db
/.idea/
/.fleet/
/.next/
next-env.d.ts

3
.prettierrc.json Normal file
View file

@ -0,0 +1,3 @@
{
"plugins": ["prettier-plugin-organize-imports"]
}

View file

@ -1,54 +1,30 @@
# Astro Starter Kit: Basics # SolidStart
```sh Everything you need to build a Solid project, powered by [`solid-start`](https://start.solidjs.com);
npm create astro@latest -- --template basics
## Creating a project
```bash
# create a new project in the current directory
npm init solid@latest
# create a new project in my-app
npm init solid@latest my-app
``` ```
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics) ## Developing
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics)
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json)
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554) ```bash
npm run dev
## 🚀 Project Structure # or start the server and open the app in a new browser tab
npm run dev -- --open
Inside of your Astro project, you'll see the following folders and files:
```text
/
├── public/
│ └── favicon.svg
├── src/
│ ├── components/
│ │ └── Card.astro
│ ├── layouts/
│ │ └── Layout.astro
│ └── pages/
│ └── index.astro
└── package.json
``` ```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. ## Building
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. Solid apps are built with _adapters_, which optimise your project for deployment to different environments.
Any static assets, like images, can be placed in the `public/` directory. By default, `npm run build` will generate a Node app that you can run with `npm start`. To use a different adapter, add it to the `devDependencies` in `package.json` and specify in your `vite.config.js`.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).

View file

@ -1,4 +0,0 @@
import { defineConfig } from "astro/config";
// https://astro.build/config
export default defineConfig({});

View file

@ -0,0 +1,20 @@
GET https://discord.com/api/users/@me
Authorization: Bearer {{$dotenv DISCORD_ACCESS_TOKEN}}
###
GET https://discord.com/api/users/@me/guilds
Authorization: Bearer {{$dotenv DISCORD_ACCESS_TOKEN}}
###
GET https://discord.com/api/users/@me/guilds/{{$dotenv DISCORD_GUILD_ID}}/member
Authorization: Bearer {{$dotenv DISCORD_ACCESS_TOKEN}}
###
POST https://discord.com/api/oauth2/token/revoke
Content-Type: application/x-www-form-urlencoded
Authorization: Basic {{$dotenv DISCORD_CLIENT_ID}}:{{$dotenv DISCORD_CLIENT_SECRET}}
token={{$dotenv DISCORD_ACCESS_TOKEN}}&token_type_hint=access_token

11
drizzle.config.ts Normal file
View file

@ -0,0 +1,11 @@
import "dotenv/config"
import type { Config } from "drizzle-kit"
export default {
schema: "./src/drizzle/schema.ts",
out: "./src/drizzle/migrations",
driver: "pg",
dbCredentials: {
connectionString: process.env.DATABASE_URL ?? "",
},
} satisfies Config

View file

@ -1,31 +0,0 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
server_name _;
root /usr/share/nginx/html;
index index.html index.htm;
include /etc/nginx/mime.types;
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
internal;
}
location / {
try_files $uri $uri/index.html =404;
}
}
}

View file

@ -1,23 +1,42 @@
{ {
"name": "liljudd-website", "name": "liljudd-website",
"type": "module", "type": "module",
"version": "1.0.0",
"scripts": { "scripts": {
"dev": "astro dev", "dev": "vinxi dev",
"start": "astro dev", "build": "vinxi build",
"build": "astro check && astro build", "start": "vinxi start",
"preview": "astro preview", "lint": "eslint --fix \"**/*.{ts,tsx,js,jsx}\"",
"astro": "astro" "push": "drizzle-kit push:pg",
"typecheck": "tsc --noEmit --checkJs false --skipLibCheck"
}, },
"dependencies": { "dependencies": {
"@astrojs/check": "^0.3.1", "@auth/core": "^0.19.0",
"astro": "^3.4.4", "@auth/drizzle-adapter": "^0.3.12",
"sass": "^1.69.5", "@auth/solid-start": "0.1.2",
"typescript": "^5.2.2" "@solidjs/meta": "^0.29.3",
"@solidjs/router": "^0.10.5",
"@solidjs/start": "^0.4.2",
"drizzle-orm": "^0.29.2",
"drizzle-zod": "^0.5.1",
"solid-js": "^1.8.7",
"solid-start": "^0.3.10",
"vinxi": "0.0.62"
}, },
"devDependencies": { "devDependencies": {
"prettier": "^3.0.3", "@typescript-eslint/eslint-plugin": "^6.17.0",
"prettier-plugin-astro": "^0.12.1", "dotenv": "^16.3.1",
"prettier-plugin-organize-imports": "^3.2.3" "drizzle-kit": "^0.20.9",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-solid": "^0.13.1",
"pg": "^8.11.3",
"postgres": "^3.4.3",
"prettier": "^3.1.1",
"prettier-plugin-organize-imports": "^3.2.4",
"sass": "^1.69.6",
"zod": "3.22.4"
},
"engines": {
"node": ">=18"
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -1,3 +0,0 @@
module.exports = {
plugins: ["prettier-plugin-organize-imports", "prettier-plugin-astro"],
};

32
sample_conf.json Normal file
View file

@ -0,0 +1,32 @@
{
"data": {
"guilds": [
{
"guildID": "some ID",
"UTCOffset": 0,
"features": {
"time_planning": {
"channelID": "some ID",
"targetWeekday": 0,
"targetHour": 0,
"targetMinute": 0,
"isAvailableRoleId": "some ID",
"wantsToBeNotifieRoledId": "some ID"
}
},
"matches": [
{
"channelID": "some ID",
"matchType": "",
"createrId": "some ID",
"roleId": "some ID",
"opponentName": "",
"messsageId": "",
"plannedFor": 1704314625000
}
]
}
]
},
"accessToken": "some Token"
}

View file

@ -1,26 +1,30 @@
--- // @refresh reload
import Footer from "@components/Footer.astro"; import { Meta, MetaProvider, Title } from "@solidjs/meta";
import NavBar from "@components/NavBar.astro"; import { Router } from "@solidjs/router";
import "../styles/Layout.scss"; import { FileRoutes } from "@solidjs/start";
import "../styles/GlobalLayout.css"; import { Suspense } from "solid-js";
--- import Footer from "./components/Footer";
import NavBar from "./components/NavBar";
import "./styles/GlobalLayout.css";
import "./styles/Layout.scss";
<!doctype html> export default function App() {
<html lang="en"> return (
<head> <Router
<meta charset="UTF-8" /> root={(props) => (
<meta <MetaProvider>
<Meta
name="description" name="description"
content="The Splatoon Discord bot with unique features." content="The Splatoon Discord bot with unique features."
/> />
<meta name="viewport" content="width=device-width" /> <Title>li'l Judd - Your competitive Splatoon assistant</Title>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta name="generator" content={Astro.generator} />
<title>li'l Judd - Your competitive Splatoon assistant</title>
</head>
<body>
<NavBar /> <NavBar />
<slot /> <Suspense>{props.children}</Suspense>
<Footer /> <Footer />
</body> </MetaProvider>
</html> )}
>
<FileRoutes />
</Router>
);
}

View file

@ -1,8 +1,8 @@
--- import "../styles/components/Footer.scss";
import '../styles/components/Footer.scss'
---
<footer> function Footer() {
return (
<footer>
<div class="footerIcon"> <div class="footerIcon">
<img <img
class="footerImage" class="footerImage"
@ -16,59 +16,117 @@ import '../styles/components/Footer.scss'
<div> <div>
<h3>Navigation</h3> <h3>Navigation</h3>
<div class="footerLinks"> <div class="footerLinks">
<a href="/" target="_self">Home</a> <a href="/">Home</a>
<a href="/features" target="_self">Features</a> <a href="/features">Features</a>
<a href="/how-do-i" target="_self">How do I...?</a> <a href="/how-do-i">How do I...?</a>
<a href="/stack" target="_self">The Stack</a> <a href="/stack">The Stack</a>
<a href="/about" target="_self">About</a> <a href="/about">About</a>
</div> </div>
</div> </div>
<div> <div>
<h3>The Software</h3> <h3>The Software</h3>
<div class="footerLinks"> <div class="footerLinks">
<a href="https://git.moonleay.net/DiscordBots/lilJudd" target="_blank" <a
>The code of the bot <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a href="https://git.moonleay.net/DiscordBots/lilJudd"
target="_blank"
> >
The code of the bot{" "}
<img
src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
alt="external link"
/>
</a>
<a <a
href="https://git.moonleay.net/Websites/liljudd-website" href="https://git.moonleay.net/Websites/liljudd-website"
target="_blank">The code of the website <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a target="_blank"
> >
<a href="https://todo.moonleay.net/share/OmisuzgPDdsrCAXKjGrTfYzWwqNDNclOMGJWeMsi/auth?view=kanban" target="_blank">The todo list <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a> The code of the website{" "}
<a href="/acknowledgements" target="_self">Acknowledgements</a> <img
src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
alt="external link"
/>
</a>
<a
href="https://todo.moonleay.net/share/OmisuzgPDdsrCAXKjGrTfYzWwqNDNclOMGJWeMsi/auth?view=kanban"
target="_blank"
>
The todo list{" "}
<img
src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
alt="external link"
/>
</a>
<a href="/acknowledgements">Acknowledgements</a>
</div> </div>
</div> </div>
<div> <div>
<h3>More</h3> <h3>More</h3>
<div class="footerLinks"> <div class="footerLinks">
<a href="https://moonleay.net/" target="_self">My homepage <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a> <a href="https://moonleay.net/">
<a href="https://moonleay.net/blog/" target="_blank">My blog <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a> My homepage{" "}
<a href="/contact" target="_self">Contact me</a> <img
<a href="https://status.moonleay.net/" target="_blank">Server Status <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a> src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
<a href="https://discord.gg/HTZRktfH4A" target="_blank">Support Discord <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a> alt="external link"
/>
</a>
<a href="https://moonleay.net/blog/" target="_blank">
My blog{" "}
<img
src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
alt="external link"
/>
</a>
<a href="/contact">Contact me</a>
<a href="https://status.moonleay.net/" target="_blank">
Server Status{" "}
<img
src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
alt="external link"
/>
</a>
<a href="https://discord.gg/HTZRktfH4A" target="_blank">
Support Discord{" "}
<img
src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
alt="external link"
/>
</a>
</div> </div>
</div> </div>
<div> <div>
<h3>Legal</h3> <h3>Legal</h3>
<div class="footerLinks"> <div class="footerLinks">
<a href="/imprint" target="_self">Imprint</a> <a href="/imprint">Imprint</a>
<a href="/privacy-policy" target="_self">Privacy Policy</a> <a href="/privacy-policy">Privacy Policy</a>
<a href="/terms-of-service" target="_self">Terms of Service</a> <a href="/terms-of-service">Terms of Service</a>
<a <a
href="https://git.moonleay.net/DiscordBots/lilJudd/src/branch/master/LICENSE" href="https://git.moonleay.net/DiscordBots/lilJudd/src/branch/master/LICENSE"
target="_blank">The license <img src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg" alt="external link"/></a target="_blank"
> >
The license{" "}
<img
src="https://static.moonleay.net/img/lilJuddWeb/logos/external.svg"
alt="external link"
/>
</a>
</div> </div>
</div> </div>
</div> </div>
<div class="footerNotice"> <div class="footerNotice">
<p> <p>
This website is NOT affiliated with Nintendo or any other party. All This website is NOT affiliated with Nintendo or any other party. All
product names, logos, and brands are property of their respective owners. product names, logos, and brands are property of their respective
owners.
</p> </p>
<p> <p>
li'l Judd &copy; 2023 <a href="https://moonleay.net/" target="_blank" li'l Judd &copy; 2022-2024{" "}
>moonleay</a <a href="https://moonleay.net/" target="_blank">
> moonleay
</a>
</p> </p>
</div> </div>
</footer> </footer>
);
}
export default Footer;

View file

@ -1,4 +1,5 @@
--- import "../styles/components/ImageSection.scss";
interface Props { interface Props {
imgUrl: string; imgUrl: string;
imgAlt: string; imgAlt: string;
@ -7,15 +8,18 @@ interface Props {
note: string; note: string;
span?: boolean; span?: boolean;
} }
const { imgUrl, imgAlt, title, description, note, span = false } = Astro.props;
import "../styles/components/ImageSection.scss";
---
<section class:list={["ImageSection", { span }]}> function ImageSection(props: Props) {
<h1>{title}</h1> return (
<section classList={{ ImageSection: true, span: props.span ?? true }}>
<h1>{props.title}</h1>
<div class="imgDiv"> <div class="imgDiv">
<img src={imgUrl} alt={imgAlt} /> <img src={props.imgUrl} alt={props.imgAlt} />
<p>{description}</p> <p>{props.description}</p>
</div> </div>
<p class="noteP">{note}</p> <p class="noteP">{props.note}</p>
</section> </section>
);
}
export default ImageSection;

View file

@ -1,10 +1,11 @@
--- import "../styles/components/NavBar.scss";
import '../styles/components/NavBar.scss';
--- function NavBar() {
<nav> return (
<nav>
<ul> <ul>
<li class="navElem"> <li class="navElem">
<a class="textBx" href="/" target="_self"> <a class="textBx" href="/">
<img <img
id="logo" id="logo"
src="https://static.moonleay.net/img/lilJuddWeb/logos/logox256.png" src="https://static.moonleay.net/img/lilJuddWeb/logos/logox256.png"
@ -14,22 +15,28 @@ import '../styles/components/NavBar.scss';
</a> </a>
</li> </li>
<li class="navElem"> <li class="navElem">
<a href="/features" target="_self">Features</a> <a href="/features">Features</a>
</li> </li>
<li class="navElem"> <li class="navElem">
<a href="/how-do-i" target="_self">How do I...?</a> <a href="/how-do-i">How do I...?</a>
</li> </li>
<li class="navElem"> <li class="navElem">
<a href="/stack" target="_self">The Stack</a> <a href="/stack">The Stack</a>
</li> </li>
<li class="navElem"> <li class="navElem">
<a href="/about" target="_self">About</a> <a href="/about">About</a>
</li> </li>
<li class="navElem"> <li class="navElem">
<a <a
href="https://discord.com/api/oauth2/authorize?client_id=1024410658973941862&permissions=18977581952080&scope=bot" href="https://discord.com/api/oauth2/authorize?client_id=1024410658973941862&permissions=18977581952080&scope=bot"
target="_blank">Invite to your server</a target="_blank"
> >
Invite to your server
</a>
</li> </li>
</ul> </ul>
</nav> </nav>
);
}
export default NavBar;

10
src/drizzle/index.ts Normal file
View file

@ -0,0 +1,10 @@
import { drizzle } from "drizzle-orm/postgres-js"
import postgres from "postgres"
import * as schema from "./schema"
const queryClient = postgres(process.env.DATABASE_URL ?? "")
const db = drizzle(queryClient, {
schema,
})
export default db

139
src/drizzle/schema.ts Normal file
View file

@ -0,0 +1,139 @@
import type { AdapterAccount } from "@auth/core/adapters";
import { relations } from "drizzle-orm";
import {
integer,
pgTable,
primaryKey,
serial,
smallint,
text,
timestamp,
varchar,
} from "drizzle-orm/pg-core";
export const users = pgTable("user", {
id: text("id").primaryKey(),
name: text("name"),
email: text("email").notNull(),
emailVerified: timestamp("email_verified", { mode: "date" }),
image: text("image"),
createdAt: timestamp("created_at").defaultNow(),
});
export const accounts = pgTable(
"account",
{
userId: text("user_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
type: text("type").$type<AdapterAccount["type"]>().notNull(),
provider: text("provider").notNull(),
providerAccountId: text("provider_account_id").notNull(),
refresh_token: text("refresh_token"),
access_token: text("access_token"),
expires_at: integer("expires_at"),
token_type: text("token_type"),
scope: text("scope"),
id_token: text("id_token"),
session_state: text("session_state"),
},
(account) => ({
compoundKey: primaryKey({
columns: [account.provider, account.providerAccountId],
}),
}),
);
export const sessions = pgTable("session", {
sessionToken: text("session_token").primaryKey(),
userId: text("user_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
expires: timestamp("expires", { mode: "date" }).notNull(),
});
export const verificationTokens = pgTable(
"verification_token",
{
identifier: text("identifier").notNull(),
token: text("token").notNull(),
expires: timestamp("expires", { mode: "date" }).notNull(),
},
(vt) => ({
compoundKey: primaryKey({ columns: [vt.identifier, vt.token] }),
}),
);
export const matchPlannings = pgTable("match_planning", {
id: serial("id").primaryKey(),
channelId: varchar("channel_id", { length: 19 }).notNull(),
matchtype: varchar("matchtype", { length: 50 }).notNull(),
createrId: varchar("creater_id", { length: 19 }).notNull(),
roleId: varchar("role_id", { length: 19 }).notNull(),
opponentName: varchar("opponent_name", { length: 100 }).notNull(),
messageId: varchar("message_id", { length: 19 }).notNull(),
plannedFor: timestamp("planned_for", { precision: 3 }).notNull(),
guildId: varchar("guild_id", { length: 19 })
.notNull()
.references(() => guilds.id, { onDelete: "cascade" }),
});
export const matchPlanningsRelations = relations(matchPlannings, ({ one }) => ({
guild: one(guilds, {
fields: [matchPlannings.guildId],
references: [guilds.id],
}),
}));
export const guilds = pgTable("guild", {
id: varchar("id", { length: 19 }).primaryKey(),
});
export const guildsRelations = relations(guilds, ({ one, many }) => ({
matches: many(matchPlannings),
timePlanning: one(timePlannings, {
fields: [guilds.id],
references: [timePlannings.guildId],
}),
}));
export const timePlannings = pgTable("time_planning", {
id: serial("id").primaryKey(),
guildId: varchar("guild_id", { length: 19 })
.references(() => guilds.id, {
onDelete: "cascade",
})
.notNull()
.unique(),
channelId: varchar("channel_id", { length: 19 }).notNull(),
targetWeekday: smallint("target_weekday").notNull(),
targetHour: smallint("target_hour").notNull(),
targetMinute: smallint("target_minute").notNull(),
isAvailableRoleId: varchar("is_available_role_id", { length: 19 }),
wantsToBeNotifieRoledId: varchar("wants_to_be_notified_role_id", {
length: 19,
}),
});
export const timePlanningsRelations = relations(
timePlannings,
({ one, many }) => ({
guild: one(tpMessages),
messages: many(tpMessages),
}),
);
export const tpMessages = pgTable("tp_message", {
messageId: varchar("message_id", { length: 19 }).primaryKey(),
day: smallint("day").notNull(),
planId: varchar("plan_id", { length: 19 })
.notNull()
.references(() => timePlannings.guildId, { onDelete: "cascade" }),
});
export const tpMessagesRelations = relations(tpMessages, ({ one }) => ({
timePlanning: one(timePlannings, {
fields: [tpMessages.messageId],
references: [timePlannings.channelId],
}),
}));

3
src/entry-client.tsx Normal file
View file

@ -0,0 +1,3 @@
import { mount, StartClient } from "@solidjs/start/client";
mount(() => <StartClient />, document.getElementById("app"));

20
src/entry-server.tsx Normal file
View file

@ -0,0 +1,20 @@
import { createHandler, StartServer } from "@solidjs/start/server";
export default createHandler(() => (
<StartServer
document={({ assets, children, scripts }) => (
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
{assets}
</head>
<body id="app">
{children}
{scripts}
</body>
</html>
)}
/>
));

1
src/env.d.ts vendored
View file

@ -1 +0,0 @@
/// <reference types="astro/client" />

1
src/global.d.ts vendored Normal file
View file

@ -0,0 +1 @@
/// <reference types="@solidjs/start/env" />

22
src/routes/[...404].tsx Normal file
View file

@ -0,0 +1,22 @@
import { Title } from "@solidjs/meta";
import { HttpStatusCode } from "@solidjs/start";
import "../styles/pages/index.scss";
export default function NotFound() {
return (
<>
<Title>Not Found</Title>
<HttpStatusCode code={404} />
<section class="section">
<h1>404 - Whoops, ink spill!</h1>
<h5>li'l Judd couldn't find this turf.</h5>
<div>
<p class="p1">
Head back to <a href="/">base</a> and splat into action from there!
🦑🕹
</p>
</div>
</section>
</>
);
}

View file

@ -1,67 +1,82 @@
---
import Layout from "@layouts/Layout.astro";
import "../styles/pages/about.scss"; import "../styles/pages/about.scss";
---
<Layout> function about() {
<h1>About</h1> return (
<>
<div class="aboutdiv"> <div class="aboutdiv">
<h1>About</h1>
<section> <section>
<h2>Why does this bot exist?</h2> <h2>Why does this bot exist?</h2>
<p> <p>
We had a person in our team, who sent <a We had a person in our team, who sent{" "}
<a
href="https://static.moonleay.net/img/lilJuddWeb/about/oldplanningmsg.png" href="https://static.moonleay.net/img/lilJuddWeb/about/oldplanningmsg.png"
target="_blank" target="_blank"
>these planning messages</a >
> and I thought that this should be automated. Some time later the first these planning messages
version of li'l Judd was born. Today the bot has more features and keeps getting more of them! It is </a>{" "}
designed to actually improve the Splatoon experience and not be the and I thought that this should be automated. Some time later the
10000th moderation and general utility bot with the same features as all first version of li'l Judd was born. Today the bot has more features
bots. and keeps getting more of them! It is designed to actually improve
the Splatoon experience and not be the 10000th moderation and
general utility bot with the same features as all bots.
</p> </p>
</section> </section>
<section> <section>
<h2>Who is behind this?</h2> <h2>Who is behind this?</h2>
<p> <p>
The bot is currently being developed by <a The bot is currently being developed by{" "}
href="/contact" <a href="/contact">moonleay</a> (hey that&apos;s me!) with
target="_self">moonleay</a occasional help from his friends!
> (hey that&apos;s me!) with occasional help from his friends!
</p> </p>
</section> </section>
<section> <section>
<h2>How can I trust you?</h2> <h2>How can I trust you?</h2>
<p> <p>
The bot only requests permissions, which are needed for it to work. Additionally, The bot only requests permissions, which are needed for it to work.
if you want to check how the bot works under the hood, you can Additionally, if you want to check how the bot works under the hood,
<a href="https://git.moonleay.net/DiscordBots/lilJudd">read the code</a> you can
and if you still don't trust me, you can always host the bot yourself! <a href="https://git.moonleay.net/DiscordBots/lilJudd">
A guide on how to do that can be found in the README of the git project. read the code
</a>
and if you still don't trust me, you can always host the bot
yourself! A guide on how to do that can be found in the README of
the git project.
</p> </p>
</section> </section>
<section> <section>
<h2>Where is my data stored?</h2> <h2>Where is my data stored?</h2>
<p> <p>
Your data is stored on a VPS from Contabo in Germany. The bot used to be hosted on a server in my basement, Your data is stored on a VPS from Contabo in Germany. The bot used
but I moved it to a VPS, because my internet connection was not stable enough. to be hosted on a server in my basement, but I moved it to a VPS,
because my internet connection was not stable enough.
</p> </p>
</section> </section>
<section> <section>
<h2>So whats in the future?</h2> <h2>So whats in the future?</h2>
<p> <p>
I plan on adding features, which are aimed to improve your and your teams I plan on adding features, which are aimed to improve your and your
competitive experience! You can check out my public todo list <a href="https://todo.moonleay.net/share/OmisuzgPDdsrCAXKjGrTfYzWwqNDNclOMGJWeMsi/auth?view=kanban" target="_blank">here</a>. teams competitive experience! You can check out my public todo list{" "}
<a
href="https://todo.moonleay.net/share/OmisuzgPDdsrCAXKjGrTfYzWwqNDNclOMGJWeMsi/auth?view=kanban"
target="_blank"
>
here
</a>
.
</p> </p>
</section> </section>
<section> <section>
<h2>Hey, there is this really cool idea I have! Can you add it?</h2> <h2>Hey, there is this really cool idea I have! Can you add it?</h2>
<p> <p>
Just message me! I can't promise anything, but I am always open to new Just message me! I can't promise anything, but I am always open to
ideas and improvements! You can find ways to contact me <a new ideas and improvements! You can find ways to contact me{" "}
href="/contact" <a href="/contact">here</a>.
target="_self">here</a
>.
</p> </p>
</section> </section>
</div> </div>
</Layout> </>
);
}
export default about;

View file

@ -1,10 +1,9 @@
---
import Layout from "@layouts/Layout.astro";
import "../styles/pages/acknowledgements.scss"; import "../styles/pages/acknowledgements.scss";
---
<Layout> function acknowledgements() {
<div class="wrapper"> return (
<>
<div class="acknowledgements">
<h1>Acknowledgements</h1> <h1>Acknowledgements</h1>
<section> <section>
<table> <table>
@ -29,11 +28,15 @@ import "../styles/pages/acknowledgements.scss";
<td> <td>
<a <a
href="https://kotlinlang.org/docs/faq.html#is-kotlin-free" href="https://kotlinlang.org/docs/faq.html#is-kotlin-free"
target="_blank">Apache license 2.0</a target="_blank"
> >
Apache license 2.0
</a>
</td> </td>
<td> <td>
<a href="https://kotlinlang.org/" target="_blank">website</a> <a href="https://kotlinlang.org/" target="_blank">
website
</a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -43,11 +46,15 @@ import "../styles/pages/acknowledgements.scss";
<td> <td>
<a <a
href="https://github.com/kordlib/kord/blob/main/LICENSE" href="https://github.com/kordlib/kord/blob/main/LICENSE"
target="_blank">MIT license</a target="_blank"
> >
MIT license
</a>
</td> </td>
<td> <td>
<a href="https://kord.dev/" target="_blank">website</a> <a href="https://kord.dev/" target="_blank">
website
</a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -57,13 +64,15 @@ import "../styles/pages/acknowledgements.scss";
<td> <td>
<a <a
href="https://github.com/Kord-Extensions/kord-extensions/blob/root/LICENSE" href="https://github.com/Kord-Extensions/kord-extensions/blob/root/LICENSE"
target="_blank">Mozilla Public License 2.0</a target="_blank"
> >
Mozilla Public License 2.0
</a>
</td> </td>
<td> <td>
<a href="https://kordex.kotlindiscord.com/" target="_blank" <a href="https://kordex.kotlindiscord.com/" target="_blank">
>website</a website
> </a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -71,12 +80,17 @@ import "../styles/pages/acknowledgements.scss";
<p>PostgreSQL</p> <p>PostgreSQL</p>
</td> </td>
<td> <td>
<a href="https://www.postgresql.org/about/licence/" target="_blank" <a
>PostgreSQL license</a href="https://www.postgresql.org/about/licence/"
target="_blank"
> >
PostgreSQL license
</a>
</td> </td>
<td> <td>
<a href="https://www.postgresql.org/" target="_blank">website</a> <a href="https://www.postgresql.org/" target="_blank">
website
</a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -86,14 +100,18 @@ import "../styles/pages/acknowledgements.scss";
<td> <td>
<a <a
href="https://github.com/Kotlin/kotlinx.coroutines/blob/master/LICENSE.txt" href="https://github.com/Kotlin/kotlinx.coroutines/blob/master/LICENSE.txt"
target="_blank">Apache license 2.0</a target="_blank"
> >
Apache license 2.0
</a>
</td> </td>
<td> <td>
<a <a
href="https://github.com/Kotlin/kotlinx.coroutines" href="https://github.com/Kotlin/kotlinx.coroutines"
target="_blank">repo</a target="_blank"
> >
repo
</a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -103,11 +121,15 @@ import "../styles/pages/acknowledgements.scss";
<td> <td>
<a <a
href="https://github.com/qos-ch/slf4j/blob/master/LICENSE.txt" href="https://github.com/qos-ch/slf4j/blob/master/LICENSE.txt"
target="_blank">MIT license</a target="_blank"
> >
MIT license
</a>
</td> </td>
<td> <td>
<a href="https://www.slf4j.org/" target="_blank">website</a> <a href="https://www.slf4j.org/" target="_blank">
website
</a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -115,14 +137,17 @@ import "../styles/pages/acknowledgements.scss";
<p>Exposed</p> <p>Exposed</p>
</td> </td>
<td> <td>
<a href="https://github.com/JetBrains/Exposed/blob/main/LICENSE.txt" <a href="https://github.com/JetBrains/Exposed/blob/main/LICENSE.txt">
>Apache license 2.0</a Apache license 2.0
> </a>
</td> </td>
<td> <td>
<a href="https://github.com/JetBrains/Exposed" target="_blank" <a
>repo</a href="https://github.com/JetBrains/Exposed"
target="_blank"
> >
repo
</a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -132,14 +157,18 @@ import "../styles/pages/acknowledgements.scss";
<td> <td>
<a <a
href="https://github.com/InsanusMokrassar/krontab/blob/master/LICENSE" href="https://github.com/InsanusMokrassar/krontab/blob/master/LICENSE"
target="_blank">Apache license 2.0</a target="_blank"
> >
Apache license 2.0
</a>
</td> </td>
<td> <td>
<a <a
href="https://github.com/InsanusMokrassar/krontab" href="https://github.com/InsanusMokrassar/krontab"
target="_blank">repo</a target="_blank"
> >
repo
</a>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -150,17 +179,22 @@ import "../styles/pages/acknowledgements.scss";
<a <a
href="https://github.com/misenhower/splatoon3.ink/blob/main/license.md" href="https://github.com/misenhower/splatoon3.ink/blob/main/license.md"
target="_blank" target="_blank"
>MIT License</a> >
MIT License
</a>
</td> </td>
<td> <td>
<a <a href="https://splatoon3.ink/" target="_blank">
href="https://splatoon3.ink/" website
target="_blank" </a>
>website</a>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</section> </section>
</div> </div>
</Layout> </>
);
}
export default acknowledgements;

View file

@ -0,0 +1,4 @@
import { SolidAuth } from "@auth/solid-start"
import { authOptions } from "~/server/auth"
export const { GET, POST } = SolidAuth(authOptions)

85
src/routes/config.tsx Normal file
View file

@ -0,0 +1,85 @@
function config() {
return (
<>
<h1>Configure li&apos;l Judd</h1>
<div>
<div>
<img src="" alt="Server pfp" />
<label>
<select>
<option value="">--Please choose a server--</option>
<option value="server id">Server 1</option>
<option value="server id">Server 2</option>
<option value="server id">Server 3</option>
<option value="server id">Server 4</option>
<option value="server id">Server 5</option>
</select>
</label>
</div>
<article>
<h2>Timezone</h2>
<p>Set the timezone for your server.</p>
<label>
<select>
<option value="-11">UTC-11:00</option>
<option value="-10">UTC-10:00</option>
<option value="-9">UTC-09:00</option>
<option value="-8">UTC-08:00</option>
<option value="-7">UTC-07:00</option>
<option value="-6">UTC-06:00</option>
<option value="-5">UTC-05:00</option>
<option value="-4">UTC-04:00</option>
<option value="-3">UTC-03:00</option>
<option value="-2">UTC-02:00</option>
<option value="-1">UTC-01:00</option>
<option value="0">UTC+00:00</option>
<option value="1">UTC+01:00</option>
<option value="2">UTC+02:00</option>
<option value="3">UTC+03:00</option>
<option value="4">UTC+04:00</option>
<option value="5">UTC+05:00</option>
<option value="6">UTC+06:00</option>
<option value="7">UTC+07:00</option>
<option value="8">UTC+08:00</option>
<option value="9">UTC+09:00</option>
<option value="10">UTC+10:00</option>
<option value="11">UTC+11:00</option>
<option value="12">UTC+12:00</option>
</select>
</label>
</article>
<section>
<h2>Features</h2>
<p>Configure the features of the bot</p>
<article>
<h3>Time Planning</h3>
<input type="checkbox" id="timeplanning" />
<p>Make the bot send a planner into a channel</p>
<p>Select </p>
<label>
<select>
<option value="id">Channel 1</option>
<option value="id">Channel 2</option>
<option value="id">Channel 3</option>
<option value="id">Channel 4</option>
</select>
</label>
</article>
<article>
<h3>Planning Roles</h3>
<input type="checkbox" id="planningroles" />
<p>Add roles to the "Time Planning" feature.</p>
<p>
This feature is bound to the "Time Planning" feature. It will be
activated in the same channel.
</p>
</article>
</section>
<button>Apply</button>
</div>
</>
);
}
export default config;

View file

@ -1,24 +1,39 @@
---
import Layout from "@layouts/Layout.astro";
import "../styles/pages/contact.scss"; import "../styles/pages/contact.scss";
---
<Layout> function contact() {
<div class="wrapper"> return (
<>
<div class="contact">
<h1>Contact</h1> <h1>Contact</h1>
<section class="contact"> <section class="contact">
<a href="mailto:contact@moonleay.net" target="_blank"> <a href="mailto:contact@moonleay.net" target="_blank">
<img src="https://static.moonleay.net/img/lilJuddWeb/logos/email.svg" alt="Email"/> <img
src="https://static.moonleay.net/img/lilJuddWeb/logos/email.svg"
alt="Email"
/>
contact@moonleay.net contact@moonleay.net
</a> </a>
<a href="https://discord.com/users/372703841151614976" target="_blank"> <a
<img src="https://static.moonleay.net/img/lilJuddWeb/logos/discord.svg" alt="Discord"/> href="https://discord.com/users/372703841151614976"
target="_blank"
>
<img
src="https://static.moonleay.net/img/lilJuddWeb/logos/discord.svg"
alt="Discord"
/>
@moonleay @moonleay
</a> </a>
<a href="https://discord.gg/HTZRktfH4A" target="_blank"> <a href="https://discord.gg/HTZRktfH4A" target="_blank">
<img src="https://static.moonleay.net/img/lilJuddWeb/logos/discord.svg" alt="discord"/> <img
/HTZRktfH4A src="https://static.moonleay.net/img/lilJuddWeb/logos/discord.svg"
alt="discord"
/>
li'l Judd's home base
</a> </a>
</section> </section>
</div> </div>
</Layout> </>
);
}
export default contact;

View file

@ -1,11 +1,10 @@
--- import ImageSection from "~/components/ImageSection";
import ImageSection from "@components/ImageSection.astro";
import Layout from "@layouts/Layout.astro";
import "../styles/pages/features.scss"; import "../styles/pages/features.scss";
---
<Layout> function features() {
<div class="container"> return (
<>
<div class="features">
<h1 class="title">Features</h1> <h1 class="title">Features</h1>
<div class="gridlayout"> <div class="gridlayout">
<ImageSection <ImageSection
@ -46,4 +45,8 @@ import "../styles/pages/features.scss";
/> />
</div> </div>
</div> </div>
</Layout> </>
);
}
export default features;

View file

@ -1,40 +1,61 @@
---
import Layout from "@layouts/Layout.astro";
import "../styles/pages/how-do-i.scss"; import "../styles/pages/how-do-i.scss";
---
<Layout> function howDoI() {
<h1 class="title">How do I...?</h1> return (
<section class="section"> <>
<h1 class="hdi-title">How do I...?</h1>
<section class="hdi-section">
<h2>.. enable / disable certain features?</h2> <h2>.. enable / disable certain features?</h2>
<p> <p>
Features can be enabled and disables using the <code>/feature</code> Features can be enabled and disables using the <code>/feature</code>
command.<br />Example: command.
<br />
Example:
</p> </p>
<div class="imgwrapper"> <div class="imgwrapper">
<img class="desktop" <img
class="desktop"
src="https://static.moonleay.net/img/lilJuddWeb/howdoi/featureexample.png" src="https://static.moonleay.net/img/lilJuddWeb/howdoi/featureexample.png"
alt="A screenshot of the example in Discord."/> alt="A screenshot of the example in Discord."
<img class="mobile" src="https://static.moonleay.net/img/lilJuddWeb/howdoi/featureexamplemobile.png" alt="A screenshot of the example in Discord."/> />
<!--<p><code>/feature feature:Time Planning Feature set:Enable channel:#ich-kann-heute</code></p>--> <img
class="mobile"
src="https://static.moonleay.net/img/lilJuddWeb/howdoi/featureexamplemobile.png"
alt="A screenshot of the example in Discord."
/>
{/* <p><code>/feature feature:Time Planning Feature set:Enable channel:#ich-kann-heute</code></p> */}
</div> </div>
</section> </section>
<section class="section"> <section class="hdi-section">
<h2>.. create a match?</h2> <h2>.. create a match?</h2>
<p> <p>
You can create a match time using the <code>/match</code> command.<br You can create a match time using the <code>/match</code> command.
/>Example: <br />
Example:
</p> </p>
<div class="imgwrapper"> <div class="imgwrapper">
<img class="desktop" <img
class="desktop"
src="https://static.moonleay.net/img/lilJuddWeb/howdoi/matchexample.png" src="https://static.moonleay.net/img/lilJuddWeb/howdoi/matchexample.png"
alt="A screenshot of the example in Discord." alt="A screenshot of the example in Discord."
/> />
<img class="mobile" src="https://static.moonleay.net/img/lilJuddWeb/howdoi/matchexamplemobile.png" alt="A screenshot of the example in Discord."/> <img
<!--<p><code>/match match:Ladder Match timestamp:24.12.2069 04:20 opponent:Forbidden</code></p>--> class="mobile"
src="https://static.moonleay.net/img/lilJuddWeb/howdoi/matchexamplemobile.png"
alt="A screenshot of the example in Discord."
/>
{/* <p><code>/match match:Ladder Match timestamp:24.12.2069 04:20 opponent:Forbidden</code></p> */}
</div> </div>
</section> </section>
<section class="footernotesection"> <section class="hdi-footernotesection">
<p>Is something missing here?<br/>Please <a href="/contact" target="_self">contact me</a>!</p> <p>
Is something missing here?
<br />
Please <a href="/contact">contact me</a>!
</p>
</section> </section>
</Layout> </>
);
}
export default howDoI;

View file

@ -1,29 +1,61 @@
---
import Layout from "@layouts/Layout.astro";
import "../styles/pages/imprint.scss"; import "../styles/pages/imprint.scss";
---
<Layout> function imprint() {
<section class="wrapper"> return (
<>
<section class="imprint">
<h1>Imprint</h1> <h1>Imprint</h1>
<p> <section>
In accordance with the applicable legal regulations, we would like to <a href="/contact">
point out that this website is not subject to the imprint obligation. This <h2>Contact me</h2>
notice is for clarification and transparent information for our visitors. </a>
<br />
According to § 5 TMG (Telemedia Act), certain providers of telemedia in
Germany are obliged to provide an imprint with certain information. This
obligation applies in particular to commercial websites or those that are
used for business purposes.
<br />
However, since this website has no business or commercial character and
only provides non-commercial, informative or private content, it is not
subject to the imprint obligation according to § 5 TMG.
<br />
Nevertheless, we strive to keep all information on this website correct
and up-to-date to the best of our knowledge and belief. However, if you
have any questions or concerns, please feel free to contact us using the
<a href="/contact" target="_self">contact options</a> provided.
</p>
</section> </section>
</Layout> <section>
<h2>Liability for contents</h2>
<p>
As a service provider, we are responsible for our own content on
these pages in accordance with general legislation pursuant to
Section 7 (1) of the German Telemedia Act (TMG). According to §§ 8
to 10 TMG, however, we are not obligated as a service provider to
monitor transmitted or stored third-party information or to
investigate circumstances that indicate illegal activity.
Obligations to remove or block the use of information under the
general laws remain unaffected. However, liability in this regard is
only possible from the point in time at which a concrete
infringement of the law becomes known. If we become aware of any
such infringements, we will remove the relevant content immediately.
</p>
<h5>
Source:{" "}
<a href="https://www.e-recht24.de/impressum-generator.html">
eRecht24
</a>
</h5>
</section>
<section>
<h2>Liability for links</h2>
<p>
Our offer contains links to external websites of third parties, on
whose contents we have no influence. Therefore, we cannot assume any
liability for these external contents. The respective provider or
operator of the pages is always responsible for the content of the
linked pages. The linked pages were checked for possible legal
violations at the time of linking. Illegal contents were not
recognizable at the time of linking. However, a permanent control of
the contents of the linked pages is not reasonable without concrete
evidence of a violation of the law. If we become aware of any
infringements, we will remove such links immediately.{" "}
</p>
<h5>
Source:{" "}
<a href="https://www.e-recht24.de/impressum-generator.html">
eRecht24
</a>
</h5>
</section>
</section>
</>
);
}
export default imprint;

View file

@ -1,10 +1,9 @@
--- import "../styles/pages/index.scss";
import Layout from "@layouts/Layout.astro";
import '../styles/pages/index.scss';
---
<Layout> function index() {
<section class="section"> return (
<>
<section class="index">
<h1>li&apos;l Judd</h1> <h1>li&apos;l Judd</h1>
<h5>The competetive Splatoon Bot</h5> <h5>The competetive Splatoon Bot</h5>
<div> <div>
@ -14,4 +13,8 @@ import '../styles/pages/index.scss';
</p> </p>
</div> </div>
</section> </section>
</Layout> </>
);
}
export default index;

View file

@ -1,30 +1,39 @@
---
import Layout from "@layouts/Layout.astro";
import "../styles/pages/privacy-policy.scss"; import "../styles/pages/privacy-policy.scss";
---
<Layout> function privacyPolicy() {
<div class="wrapper"> return (
<>
<div class="privacyPolicy">
<div> <div>
<h1>Privacy Policy for li&apos;l Judd</h1> <h1>Privacy Policy for li&apos;l Judd</h1>
<h4>Last updated: 2023-12-05</h4> <h4>Last updated: 2023-12-05</h4>
</div> </div>
<section> <section>
<h2>1. Introduction</h2> <h2>1. Introduction</h2>
<p>Welcome to li&apos;l Judd! This Privacy Policy explains how we collect, use, disclose, and safeguard your personal information when you use our Discord bot service.</p> <p>
Welcome to li&apos;l Judd! This Privacy Policy explains how we
collect, use, disclose, and safeguard your personal information when
you use our Discord bot service.
</p>
</section> </section>
<section> <section>
<h2>2. Data Controller</h2> <h2>2. Data Controller</h2>
<p>The data controller for the processing of your personal data is: Eric L <p>
<br/> The data controller for the processing of your personal data is
Reachable by email at contact at moonleay dot net (<a href="/contact" target="_self">See contact page.</a>) moonleay.
<br />
Please note that "moonleay" is primarily used as a username and may
not directly reflect my legal or real-world identity.
<br />
You can reach me <a href="/contact">here</a>.
</p> </p>
</section> </section>
<section> <section>
<h2>3. Information We Collect</h2> <h2>3. Information We Collect</h2>
<h3>3.1 Discord User Data</h3> <h3>3.1 Discord User Data</h3>
<p> <p>
We may collect and process the following (personal) data related to your Discord account & guilds: We may collect and process the following (personal) data related to
your Discord account & guilds:
</p> </p>
<ul> <ul>
<li> <li>
@ -47,7 +56,10 @@ import "../styles/pages/privacy-policy.scss";
</li> </li>
</ul> </ul>
<h3>3.2 Usage Data</h3> <h3>3.2 Usage Data</h3>
<p>We may collect information on how you interact with our bot, including but not limited to:</p> <p>
We may collect information on how you interact with our bot,
including but not limited to:
</p>
<ul> <ul>
<li> <li>
<p>- Commands issued</p> <p>- Commands issued</p>
@ -83,48 +95,86 @@ import "../styles/pages/privacy-policy.scss";
<p>We process your personal data on the following legal bases:</p> <p>We process your personal data on the following legal bases:</p>
<ul> <ul>
<li> <li>
<p>- Consent: You have given your consent for the processing of your personal data for one or more specific purposes.</p> <p>
- Consent: You have given your consent for the processing of
your personal data for one or more specific purposes.
</p>
</li> </li>
<li> <li>
<p>- Performance of a contract: The processing is necessary for the performance of the agreement between you and us.</p> <p>
- Performance of a contract: The processing is necessary for the
performance of the agreement between you and us.
</p>
</li> </li>
</ul> </ul>
</section> </section>
<section> <section>
<h2>6. Data Sharing</h2> <h2>6. Data Sharing</h2>
<p>We do not sell, trade, or otherwise transfer your personal information to third parties. However, we may share your information with:</p> <p>
We do not sell, trade, or otherwise transfer your personal
information to third parties. However, we may share your information
with:
</p>
<ul> <ul>
<li> <li>
<p>- Third-party service providers involved in the operation and maintenance of the bot.</p> <p>
- Third-party service providers involved in the operation and
maintenance of the bot.
</p>
</li> </li>
</ul> </ul>
</section> </section>
<section> <section>
<h2>7. Data Security</h2> <h2>7. Data Security</h2>
<p>We implement reasonable security measures to protect your personal information from unauthorized access, disclosure, alteration, and destruction.</p> <p>
We implement reasonable security measures to protect your personal
information from unauthorized access, disclosure, alteration, and
destruction.
</p>
</section> </section>
<section> <section>
<h2>8. Your Rights</h2> <h2>8. Your Rights</h2>
<p>You have the following rights regarding your personal data:</p> <p>You have the following rights regarding your personal data:</p>
<ul> <ul>
<li> <li>
<p>- Right to withdraw consent: You have the right to withdraw your consent at any time. You can do this by contacting us at contact@moonleay.net.</p> <p>
- Right to withdraw consent: You have the right to withdraw your
consent at any time. You can do this by contacting us at
contact@moonleay.net.
</p>
</li> </li>
<li> <li>
<p>- Right to rectification: You can request corrections to inaccurate or incomplete information.</p> <p>
- Right to rectification: You can request corrections to
inaccurate or incomplete information.
</p>
</li> </li>
<li> <li>
<p>- Right to erasure: You can request the deletion of your personal data.</p> <p>
- Right to erasure: You can request the deletion of your
personal data.
</p>
</li> </li>
</ul> </ul>
</section> </section>
<section> <section>
<h2>9. Changes to this Privacy Policy</h2> <h2>9. Changes to this Privacy Policy</h2>
<p>We may update this Privacy Policy to reflect changes in our practices. The updated version will be posted on https://liljudd.ink/privacy-policy.</p> <p>
We may update this Privacy Policy to reflect changes in our
practices. The updated version will be posted on
https://liljudd.ink/privacy-policy.
</p>
</section> </section>
<section> <section>
<h2>10. Contact Information</h2> <h2>10. Contact Information</h2>
<p>If you have any questions or concerns about this Privacy Policy, please contact us at contact@moonleay.net.</p> <p>
If you have any questions or concerns about this Privacy Policy,
please contact us at contact@moonleay.net.
</p>
</section> </section>
</div> </div>
</Layout> </>
);
}
export default privacyPolicy;

View file

@ -1,11 +1,10 @@
--- import "../styles/pages/stack.scss";
import Layout from "@layouts/Layout.astro";
import "../styles/pages/stack.scss"
---
<Layout> function stack() {
<h1 class="title">The Stack</h1> return (
<section class="stacksection"> <>
<h1 class="stack-title">The Stack</h1>
<section class="stack-section">
<img <img
src="https://static.moonleay.net/img/lilJuddWeb/logos/kotlin.svg" src="https://static.moonleay.net/img/lilJuddWeb/logos/kotlin.svg"
alt="Kotlin 'K' logo" alt="Kotlin 'K' logo"
@ -13,11 +12,12 @@ import "../styles/pages/stack.scss"
<div class="stackgrid_3 stackitm"> <div class="stackgrid_3 stackitm">
<h1>The Kotlin programming language</h1> <h1>The Kotlin programming language</h1>
<p> <p>
A programming language, which runs in the JVM. Also my main language. A programming language, which runs in the JVM. Also my main
language.
</p> </p>
</div> </div>
</section> </section>
<section class="stacksection"> <section class="stack-section">
<img <img
src="https://static.moonleay.net/img/lilJuddWeb/logos/kord.png" src="https://static.moonleay.net/img/lilJuddWeb/logos/kord.png"
alt="The Kord logo" alt="The Kord logo"
@ -27,7 +27,7 @@ import "../styles/pages/stack.scss"
<p>A Kotlin library for creating Discord bots. Pretty bare bones.</p> <p>A Kotlin library for creating Discord bots. Pretty bare bones.</p>
</div> </div>
</section> </section>
<section class="stacksection"> <section class="stack-section">
<img <img
src="https://static.moonleay.net/img/lilJuddWeb/logos/kordextensions.png" src="https://static.moonleay.net/img/lilJuddWeb/logos/kordextensions.png"
alt="The Kord-Extensions logo" alt="The Kord-Extensions logo"
@ -37,7 +37,7 @@ import "../styles/pages/stack.scss"
<p>A Kotlin library to improve the Kord experience.</p> <p>A Kotlin library to improve the Kord experience.</p>
</div> </div>
</section> </section>
<section class="stacksection"> <section class="stack-section">
<img <img
src="https://static.moonleay.net/img/lilJuddWeb/logos/pgelephant.png" src="https://static.moonleay.net/img/lilJuddWeb/logos/pgelephant.png"
alt="The PostgreSQL elephant" alt="The PostgreSQL elephant"
@ -50,9 +50,14 @@ import "../styles/pages/stack.scss"
</p> </p>
</div> </div>
</section> </section>
<section class="stacknote"> <section class="stack-note">
<p> <p>
To view all used libraries and their licenses, check the <a href="/acknowledgements">Acknowledgements</a>. To view all used libraries and their licenses, check the{" "}
<a href="/acknowledgements">Acknowledgements</a>.
</p> </p>
</section> </section>
</Layout> </>
);
}
export default stack;

View file

@ -1,52 +1,97 @@
---
import Layout from "@layouts/Layout.astro";
import "../styles/pages/terms-of-service.scss"; import "../styles/pages/terms-of-service.scss";
---
<Layout> function termsOfService() {
<div class="wrapper"> return (
<>
<div class="termsOfService">
<h1>Terms of Service</h1> <h1>Terms of Service</h1>
<div> <div>
<h2>Usage Agreement</h2> <h2>Usage Agreement</h2>
<p> <p>
By inviting the bot and using its features (commands, planning system) are you agreeing to the below mentioned Terms and Privacy Policy (Policy) of the bot.<br/> By inviting the bot and using its features (commands, planning
system) are you agreeing to the below mentioned Terms and Privacy
You acknowledge that you have the privilege to use the bot freely on any Discord Server (Server) you share with it, that you can invite it to any Server that you have "Manage Server" rights for and that this privilege might get revoked for you, if you're subject of breaking the terms and/or policy of this bot, or the <a href="https://discord.com/terms" target="_blank">Terms of Service</a>, <a href="https://discord.com/privacy" target="_blank">Privacy Policy</a> and/or <a href="https://discord.com/guidelines" target="_blank">Community Guidelines</a> of <a href="https://discord.com/" target="_blank">Discord Inc</a>.<br/> Policy (Policy) of the bot.
<br />
Through Inviting the bot may it collect specific data as described in its Policy.<br/> You acknowledge that you have the privilege to use the bot freely on
The intended usage of this data is for core functionalities of the bot such as command handling, guild-specific settings and the time-planning system.<br/> any Discord Server (Server) you share with it, that you can invite
it to any Server that you have "Manage Server" rights for and that
this privilege might get revoked for you, if you're subject of
breaking the terms and/or policy of this bot, or the{" "}
<a href="https://discord.com/terms" target="_blank">
Terms of Service
</a>
,{" "}
<a href="https://discord.com/privacy" target="_blank">
Privacy Policy
</a>{" "}
and/or{" "}
<a href="https://discord.com/guidelines" target="_blank">
Community Guidelines
</a>{" "}
of{" "}
<a href="https://discord.com/" target="_blank">
Discord Inc
</a>
.<br />
Through Inviting the bot may it collect specific data as described
in its Policy.
<br />
The intended usage of this data is for core functionalities of the
bot such as command handling, guild-specific settings and the
time-planning system.
<br />
</p> </p>
</div> </div>
<div> <div>
<h2>Intended Age</h2> <h2>Intended Age</h2>
<p> <p>
The bot may not be used by individuals under the minimal age described in Discord's Terms of Service.<br/> The bot may not be used by individuals under the minimal age
Doing so will be seen as a violation of these terms and will result in a removal of the bot from any servers you own.<br/> described in Discord's Terms of Service.
<br />
Doing so will be seen as a violation of these terms and will result
in a removal of the bot from any servers you own.
<br />
</p> </p>
</div> </div>
<div> <div>
<h2>Affiliation</h2> <h2>Affiliation</h2>
<p> <p>
The Bot is not affiliated with, supported or made by Discord Inc.<br/> The Bot is not affiliated with, supported or made by Discord Inc.
Any direct connection to Discord or any of its Trademark objects is purely coincidental. We do not claim to have the copyright ownership of any of Discord's assets, trademarks or other intellectual property.<br/> <br />
Any direct connection to Discord or any of its Trademark objects is
purely coincidental. We do not claim to have the copyright ownership
of any of Discord's assets, trademarks or other intellectual
property.
<br />
</p> </p>
</div> </div>
<div> <div>
<h2>Liability</h2> <h2>Liability</h2>
<p> <p>
The owner of the bot may not be made liable for individuals breaking these Terms at any given time.<br/> The owner of the bot may not be made liable for individuals breaking
He has faith in the end users being truthfull about their information and not misusing this bot or the services of Discord Inc in a malicious way.<br/> these Terms at any given time.
<br />
We reserve the right to update these terms at our own discretion, giving you a 1-Week (7 days) period to opt out of these terms if you're not agreeing with the new changes. He has faith in the end users being truthfull about their
You may opt out by Removing the bot from any Server you have the rights for. information and not misusing this bot or the services of Discord Inc
in a malicious way.
<br />
We reserve the right to update these terms at our own discretion,
giving you a 1-Week (7 days) period to opt out of these terms if
you're not agreeing with the new changes. You may opt out by
Removing the bot from any Server you have the rights for.
</p> </p>
</div> </div>
<div> <div>
<h2>Contact</h2> <h2>Contact</h2>
<p> <p>
People may get in contact through e-mail at contact@moonleay.net, or through the official Support Discord of the Bot. People may get in contact through e-mail at contact@moonleay.net, or
Other ways of support may be provided but aren't guaranteed. through the official Support Discord of the Bot. Other ways of
support may be provided but aren't guaranteed.
</p> </p>
</div> </div>
</div> </div>
</Layout> </>
);
}
export default termsOfService;

26
src/server/auth.ts Normal file
View file

@ -0,0 +1,26 @@
import Discord from "@auth/core/providers/discord";
import { DrizzleAdapter } from "@auth/drizzle-adapter";
import { type SolidAuthConfig } from "@auth/solid-start";
import db from "~/drizzle";
export const authOptions: SolidAuthConfig = {
providers: [
{
...Discord({
clientId: process.env.DISCORD_CLIENT_ID,
clientSecret: process.env.DISCORD_CLIENT_SECRET,
}),
authorization:
"https://discord.com/api/oauth2/authorize?scope=identify+email+guilds+guilds.members.read",
},
],
adapter: DrizzleAdapter(db),
secret: process.env.AUTH_SECRET,
pages: {
// signIn: "/signin",
// signOut: "/signout",
// error: '/auth/error', // Error code passed in query string as ?error=
// verifyRequest: '/auth/verify-request', // (used for check email message)
// newUser: '/auth/new-user' // New users will be directed here on first sign in (leave the property out if not of interest)
},
};

View file

@ -24,16 +24,16 @@ footer {
} }
.footerTable { .footerTable {
padding: 20px; padding: 15px;
display: grid; display: grid;
@media (max-width: 768px) { @media (max-width: 800px) {
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
gap: 0; gap: 0;
div { div {
padding: 10px; padding: 10px;
} }
} }
@media (min-width: 769px) { @media (min-width: 801px) {
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(4, 1fr);
} }
gap: 20px; gap: 20px;

View file

@ -8,6 +8,7 @@
border-radius: 0.5rem; border-radius: 0.5rem;
width: 100%; width: 100%;
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(0, 0, 0, 0.5);
max-width: 90vw;
@media (min-width: 1150px) { @media (min-width: 1150px) {
max-width: 80vw; max-width: 80vw;

View file

@ -1,14 +1,14 @@
h1 {
font-size: 3rem;
text-align: center;
margin-bottom: 1.2rem;
}
.aboutdiv { .aboutdiv {
max-width: 1100px; max-width: 1100px;
margin: 1rem auto; margin: 1rem auto;
width: 100%; width: 100%;
h1 {
font-size: 3rem;
text-align: center;
margin-bottom: 1.2rem;
}
section { section {
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(0, 0, 0, 0.5);
border-radius: 4px; border-radius: 4px;

View file

@ -1,4 +1,4 @@
.wrapper { .acknowledgements {
h1 { h1 {
@media (min-width: 420px) { @media (min-width: 420px) {
font-size: 3rem; font-size: 3rem;
@ -11,7 +11,8 @@
section { section {
margin: 1rem; margin: 1rem;
p, a { p,
a {
@media (max-width: 420px) { @media (max-width: 420px) {
font-size: 0.75rem; font-size: 0.75rem;
} }
@ -52,7 +53,6 @@
} }
} }
} }
} }
} }
} }

View file

@ -1,4 +1,4 @@
.wrapper { .contact {
margin: 0; margin: 0;
h1 { h1 {

View file

@ -1,4 +1,4 @@
.container { .features {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;

View file

@ -1,10 +1,10 @@
.title { .hdi-title {
font-size: 3rem; font-size: 3rem;
text-align: center; text-align: center;
margin-bottom: 1.2rem; margin-bottom: 1.2rem;
} }
.section { .hdi-section {
max-width: 1100px; max-width: 1100px;
margin: 1rem auto; margin: 1rem auto;
width: 100%; width: 100%;
@ -41,7 +41,7 @@
} }
} }
.footernotesection { .hdi-footernotesection {
max-width: 1100px; max-width: 1100px;
margin: 1rem auto; margin: 1rem auto;
width: 100%; width: 100%;
@ -62,4 +62,3 @@
} }
} }
} }

View file

@ -1,11 +1,11 @@
.wrapper { .imprint {
h1 { h1 {
font-size: 3rem; font-size: 3rem;
text-align: center; text-align: center;
margin-bottom: 1.2rem; margin-bottom: 1.2rem;
} }
p { section {
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(0, 0, 0, 0.5);
border-radius: 4px; border-radius: 4px;
margin: 1rem; margin: 1rem;
@ -16,6 +16,11 @@
margin: 1rem auto; margin: 1rem auto;
width: 100%; width: 100%;
} }
}
h5 {
text-align: right;
}
a { a {
color: white; color: white;
@ -27,6 +32,4 @@
color: rgb(96 59 255) !important; color: rgb(96 59 255) !important;
} }
} }
}
} }

View file

@ -1,4 +1,4 @@
.section { .index {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
@ -15,16 +15,17 @@
div { div {
margin-top: 1.5rem; margin-top: 1.5rem;
}
}
.p1 { .p1 {
font-size: 1rem; font-size: 1rem;
} }
.p2 { .p2 {
font-size: 0.8rem; font-size: 0.8rem;
a { }
.p1 a,
.p2 a {
font-weight: bolder; font-weight: bolder;
text-decoration: underline; text-decoration: underline;
font-size: 0.9rem; font-size: 0.9rem;
@ -34,4 +35,5 @@
color: rgb(96 59 255) !important; color: rgb(96 59 255) !important;
} }
} }
}
} }

View file

@ -1,10 +1,10 @@
.wrapper { .privacyPolicy {
div { div {
h1 { h1 {
font-size: 3rem; font-size: 3rem;
text-align: center; text-align: center;
} }
h4{ h4 {
font-size: 1.5rem; font-size: 1.5rem;
text-align: center; text-align: center;
margin-bottom: 1.2rem; margin-bottom: 1.2rem;

View file

@ -1,10 +1,10 @@
.title { .stack-title {
font-size: 3rem; font-size: 3rem;
text-align: center; text-align: center;
margin-bottom: 1.2rem; margin-bottom: 1.2rem;
} }
.stacksection { .stack-section {
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(0, 0, 0, 0.5);
border-radius: 4px; border-radius: 4px;
margin: 1rem; margin: 1rem;
@ -35,7 +35,7 @@
} }
} }
.stacknote { .stack-note {
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(0, 0, 0, 0.5);
border-radius: 4px; border-radius: 4px;
margin: 1rem; margin: 1rem;

View file

@ -1,4 +1,4 @@
.wrapper { .termsOfService {
h1 { h1 {
font-size: 3rem; font-size: 3rem;
text-align: center; text-align: center;

View file

@ -1,10 +1,19 @@
{ {
"extends": "astro/tsconfigs/strict",
"compilerOptions": { "compilerOptions": {
"baseUrl": ".", "target": "ESNext",
"module": "ESNext",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
"allowJs": true,
"strict": true,
"noEmit": true,
"types": ["vinxi/client"],
"isolatedModules": true,
"paths": { "paths": {
"@components/*": ["src/components/*"], "~/*": ["./src/*"]
"@layouts/*": ["src/layouts/*"]
} }
} }
} }

3
vite.config.ts Normal file
View file

@ -0,0 +1,3 @@
import { defineConfig } from "@solidjs/start/config";
export default defineConfig({});