Notes update

This commit is contained in:
Toastie 2024-06-22 01:06:32 +12:00
commit bf48e26516
Signed by: toastie_t0ast
GPG key ID: 27F3B6855AFD40A4
55 changed files with 3653 additions and 7416 deletions

210
.astro/types.d.ts vendored Normal file
View file

@ -0,0 +1,210 @@
declare module 'astro:content' {
interface Render {
'.md': Promise<{
Content: import('astro').MarkdownInstance<{}>['Content'];
headings: import('astro').MarkdownHeading[];
remarkPluginFrontmatter: Record<string, any>;
}>;
}
}
declare module 'astro:content' {
export { z } from 'astro/zod';
type Flatten<T> = T extends { [K: string]: infer U } ? U : never;
export type CollectionKey = keyof AnyEntryMap;
export type CollectionEntry<C extends CollectionKey> = Flatten<AnyEntryMap[C]>;
export type ContentCollectionKey = keyof ContentEntryMap;
export type DataCollectionKey = keyof DataEntryMap;
// This needs to be in sync with ImageMetadata
export type ImageFunction = () => import('astro/zod').ZodObject<{
src: import('astro/zod').ZodString;
width: import('astro/zod').ZodNumber;
height: import('astro/zod').ZodNumber;
format: import('astro/zod').ZodUnion<
[
import('astro/zod').ZodLiteral<'png'>,
import('astro/zod').ZodLiteral<'jpg'>,
import('astro/zod').ZodLiteral<'jpeg'>,
import('astro/zod').ZodLiteral<'tiff'>,
import('astro/zod').ZodLiteral<'webp'>,
import('astro/zod').ZodLiteral<'gif'>,
import('astro/zod').ZodLiteral<'svg'>,
import('astro/zod').ZodLiteral<'avif'>,
]
>;
}>;
type BaseSchemaWithoutEffects =
| import('astro/zod').AnyZodObject
| import('astro/zod').ZodUnion<[BaseSchemaWithoutEffects, ...BaseSchemaWithoutEffects[]]>
| import('astro/zod').ZodDiscriminatedUnion<string, import('astro/zod').AnyZodObject[]>
| import('astro/zod').ZodIntersection<BaseSchemaWithoutEffects, BaseSchemaWithoutEffects>;
type BaseSchema =
| BaseSchemaWithoutEffects
| import('astro/zod').ZodEffects<BaseSchemaWithoutEffects>;
export type SchemaContext = { image: ImageFunction };
type DataCollectionConfig<S extends BaseSchema> = {
type: 'data';
schema?: S | ((context: SchemaContext) => S);
};
type ContentCollectionConfig<S extends BaseSchema> = {
type?: 'content';
schema?: S | ((context: SchemaContext) => S);
};
type CollectionConfig<S> = ContentCollectionConfig<S> | DataCollectionConfig<S>;
export function defineCollection<S extends BaseSchema>(
input: CollectionConfig<S>
): CollectionConfig<S>;
type AllValuesOf<T> = T extends any ? T[keyof T] : never;
type ValidContentEntrySlug<C extends keyof ContentEntryMap> = AllValuesOf<
ContentEntryMap[C]
>['slug'];
export function getEntryBySlug<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}),
>(
collection: C,
// Note that this has to accept a regular string too, for SSR
entrySlug: E
): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
export function getDataEntryById<C extends keyof DataEntryMap, E extends keyof DataEntryMap[C]>(
collection: C,
entryId: E
): Promise<CollectionEntry<C>>;
export function getCollection<C extends keyof AnyEntryMap, E extends CollectionEntry<C>>(
collection: C,
filter?: (entry: CollectionEntry<C>) => entry is E
): Promise<E[]>;
export function getCollection<C extends keyof AnyEntryMap>(
collection: C,
filter?: (entry: CollectionEntry<C>) => unknown
): Promise<CollectionEntry<C>[]>;
export function getEntry<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}),
>(entry: {
collection: C;
slug: E;
}): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(entry: {
collection: C;
id: E;
}): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof ContentEntryMap,
E extends ValidContentEntrySlug<C> | (string & {}),
>(
collection: C,
slug: E
): E extends ValidContentEntrySlug<C>
? Promise<CollectionEntry<C>>
: Promise<CollectionEntry<C> | undefined>;
export function getEntry<
C extends keyof DataEntryMap,
E extends keyof DataEntryMap[C] | (string & {}),
>(
collection: C,
id: E
): E extends keyof DataEntryMap[C]
? Promise<DataEntryMap[C][E]>
: Promise<CollectionEntry<C> | undefined>;
/** Resolve an array of entry references from the same collection */
export function getEntries<C extends keyof ContentEntryMap>(
entries: {
collection: C;
slug: ValidContentEntrySlug<C>;
}[]
): Promise<CollectionEntry<C>[]>;
export function getEntries<C extends keyof DataEntryMap>(
entries: {
collection: C;
id: keyof DataEntryMap[C];
}[]
): Promise<CollectionEntry<C>[]>;
export function reference<C extends keyof AnyEntryMap>(
collection: C
): import('astro/zod').ZodEffects<
import('astro/zod').ZodString,
C extends keyof ContentEntryMap
? {
collection: C;
slug: ValidContentEntrySlug<C>;
}
: {
collection: C;
id: keyof DataEntryMap[C];
}
>;
// Allow generic `string` to avoid excessive type errors in the config
// if `dev` is not running to update as you edit.
// Invalid collection names will be caught at build time.
export function reference<C extends string>(
collection: C
): import('astro/zod').ZodEffects<import('astro/zod').ZodString, never>;
type ReturnTypeOrOriginal<T> = T extends (...args: any[]) => infer R ? R : T;
type InferEntrySchema<C extends keyof AnyEntryMap> = import('astro/zod').infer<
ReturnTypeOrOriginal<Required<ContentConfig['collections'][C]>['schema']>
>;
type ContentEntryMap = {
"releases": {
"4_3_17.md": {
id: "4_3_17.md";
slug: "4_3_17";
body: string;
collection: "releases";
data: InferEntrySchema<"releases">
} & { render(): Render[".md"] };
"4_3_18.md": {
id: "4_3_18.md";
slug: "4_3_18";
body: string;
collection: "releases";
data: InferEntrySchema<"releases">
} & { render(): Render[".md"] };
"5.0.8-beta.md": {
id: "5.0.8-beta.md";
slug: "508-beta";
body: string;
collection: "releases";
data: InferEntrySchema<"releases">
} & { render(): Render[".md"] };
};
};
type DataEntryMap = {
};
type AnyEntryMap = ContentEntryMap & DataEntryMap;
type ContentConfig = typeof import("../src/content/config");
}

View file

@ -1,37 +0,0 @@
name: Deploy to GitHub Pages
on:
push:
branches: [main]
paths: [website/**]
jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14.x
cache: yarn
- name: Build website
working-directory: website
run: |
yarn install --frozen-lockfile
yarn build
# Popular action to deploy to GitHub Pages:
# Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# Build output to publish to the `gh-pages` branch:
publish_dir: ./website/build
# Assign commit authorship to the official GH-Actions bot for deploys to `gh-pages` branch:
# https://github.com/actions/checkout/issues/13#issuecomment-724415212
# The GH actions bot is used by default if you didn't specify the two fields.
# You can swap them out with your own user credentials.
user_name: github-actions[bot]
user_email: 41898282+github-actions[bot]@users.noreply.github.com

View file

@ -1,22 +0,0 @@
name: Test deployment
on:
pull_request:
branches: [main]
paths: [website/**]
jobs:
test-deploy:
name: Test deployment
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 14.x
cache: yarn
- name: Test build
working-directory: website
run: |
yarn install --frozen-lockfile
yarn build

22
.gitignore vendored
View file

@ -1,20 +1,2 @@
# Dependencies
/node_modules
# Production
/build
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
node_modules
dist

View file

@ -1,3 +1,3 @@
# ellie-patchnotes
# Ellie Patchnotes
[![Netlify Status](https://api.netlify.com/api/v1/badges/6819b1e5-ef88-4867-86fd-862281cda04d/deploy-status)](https://app.netlify.com/sites/ellie-patchnotes/deploys)
## Release notes site built with Astro

6
astro.config.mjs Normal file
View file

@ -0,0 +1,6 @@
import { defineConfig } from 'astro/config';
// https://astro.build/config
export default defineConfig({
site: 'https://notes.elliebot.net',
});

View file

@ -1,3 +0,0 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};

View file

@ -1,48 +0,0 @@
---
slug: 4.1.3-patch-notes
title: 4.1.3 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Added
- Added support for embed arrays in commands such as 'say, 'greet, 'bye, etc...
- Website to create them is live at https://eb.elliebot.net (old one is moved to https://oldeb.elliebot.net)
- Embed arrays don't have a plainText property (it's renamed to 'content')
- Embed arrays use color hex values instead of an integer
- Old embed format will still work
- There shouldn't be any breaking changes
- Added `'stondel` command which, when toggled, will make the bot delete online stream messages on the server when the stream goes offline
- Added a simple bank system.
- Users can deposit, withdraw and check the balance of their currency in the bank.
- Users can't check other user's bank balances.
- Added a button on a '$ command which, when clicked, sends you a message with your bank balance that only you can see.
- Added `'h <command group>`
- Using this command will list all commands in the specified group
- Atm only 'bank is a proper group (`'h bank`)
- Added "Bank Accounts" entry to `'economy`
### Changed
- Reaction roles rewritten completely
- Supports multiple exclusivity groups per message
- Supports level requirements
- However they can only be added one by one
- Use the following commands for more information
- `'h 'reroa`
- `'h 'reroli`
- `'h 'rerot`
- `'h 'rerorm`
- `'h 'rerodela`
- Pagination is now using buttons instead of reactions
- Bot will now support much higher XP values for global and server levels
### Fixed
- Fixed `'deletexp` command
- `'give` command should send DMs again
- `'modules` command now has a medusa module description

View file

@ -1,10 +0,0 @@
---
slug: 4.1.4-patch-notes
title: 4.1.4 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Fixed
- Fixed `'yun`

View file

@ -1,17 +0,0 @@
---
slug: 4.1.5-patch-notes
title: 4.1.5 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Changed
- `'clubdesc <msg>` will now have a nicer response
### Fixed
- `'give` DM will once again show an amount
- Fixed an issue with filters not working and with custom reactions no longer being able to override commands.
- Fixed `'stock` command

View file

@ -1,8 +0,0 @@
---
slug: 4.1.6-patch-notes
title: 4.1.6 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
Not anything to mention in this update to list as a patch note

View file

@ -1,32 +0,0 @@
---
slug: 4.3.10-patch-notes
title: 4.3.10 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
Here are the current patch notes for Ellie
## Added
- 'filterlist / 'fl command which lists link and invite filtering channels and status
- Added support for %target% placeholder in 'alias command
- Added 'forwardtochannel which will forward messages to the current channel. It has lower priority than fwtoall
- Added 'exprtoggleglobal / 'extg which can be used to toggle usage of global expressions on the server
## Changed
- Several club related command have their error messages improved
- Updated help text for 'antispam and 'antiraid
- You can now specify time and date (time is optional) in .remind command instead of relative time, in the format HH:mm dd.MM.YYYY
## Fixed
- Fixed 'cmdcd console error
- Fixed an error when currency is add per xp
- Fixed 'feedadd
- Fixed 'prune @target not working
- Fixed command cooldown calculation

View file

@ -1,12 +0,0 @@
---
slug: small-update
title: Small update on things
authors: [EmotionChild]
tags: [Update]
---
Hey guys sorry for the lack of patch notes I have been really busy with IRL stuff hopefully I can get back into writing the patch notes and publishing them again I am sorry for the lack of posts here and I plan on changing that
Thanks for reading,
EmotionChild

View file

@ -1,38 +0,0 @@
---
slug: 4.3.11-patch-notes
title: 4.3.11 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Added
- Added `'stickeradd` command
### Changed
- `'waifuinfo` optimized
- You can now specify an optional custom message in `'feed` and `'yun` which will be posted along with an update
- Greet/bye messages will now get disabled if they're set to a deleted/unknown channel
- Updated response strings
- `'translate` now supports many more languages
- `'translangs` prettier output
### Fixed
- Added logging for thread events
- Fixed a bug for `'quotedeleteauthor` causing the executing user to delete own messages
- Fixed TimeOut punishment not alklowing duration
- Fixed a nullref in streamrole service
- Fixed some potential causes for ratelimit due to default message retry settings
- Fixed a patron rewards bug caused by monthly donation checking not accounting for year increase
- Fixed a patron rewards bug for users who connected the same discord account with multiple patreon accounts
- `'deletecurrency` will now also reset banked currency
- Fixed DMHelpText reply
- `'h` command show now properly show both channel and server user permission requirements
- Many fixes and improvements to medusa system
- Fixed trivia --nohint
- `'joinrace` will no longer fail if the user isn't in the database yet

View file

@ -1,12 +0,0 @@
---
slug: 4.3.12-patch-notes
title: 4.3.12 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Fixed
- Fixed `'betstats` not working on european locales
- Timed `'ban` will work on users who are not in the server
- Fixed some general bugs

View file

@ -1,12 +0,0 @@
---
slug: 4.3.13-patch-notes
title: 4.3.13 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Fixed
- Fixed `'log` userpresence
- `'q` will now use yt-dlp if anything other than ytProvider: Ytdl is set in data/searches.yml
- Fixed Title links on some embeds

View file

@ -1,13 +0,0 @@
---
slug: 4.3.14-patch-notes
title: 4.3.14 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Fixed
- `'banktake` had ok/error responses flipped. No functional change
- PermRole should deny messages in threads todo
- Fixed chucknorris jokes
- `'logserver` will now work as intended

View file

@ -1,13 +0,0 @@
---
slug: 4.3.15-patch-notes
title: 4.3.15 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Fixed
- Fixed -w 0 in trivia
- Fixed `'rps` amount field in the response
- Fixed `'showembed` output
- Fixed bank award's incorrect output message

View file

@ -1,11 +0,0 @@
---
slug: 4.3.16-patch-notes
title: 4.3.16 patch notes
authors: [EmotionChild]
tags: [Patchnote]
---
### Fixed
- Fixed missing events from `'logevents`
- Fixed `'log` thread deleted and thread created events not working properly

View file

@ -1,11 +0,0 @@
EmotionChild:
name: EmotionChild
title: Lead Developer and Project Lead
url: https://www.emotionchild.com
image_url: https://github.com/EmotionChild.png
Ellie Devs:
name: Ellie Devs
title: Dev / management team
url: https://github.com/EllieBotDevs
image_url: https://github.com/EllieBotDevs.png

View file

@ -1,130 +0,0 @@
// @ts-check
// Note: type annotations allow type checking and IDEs autocompletion
const lightCodeTheme = require('prism-react-renderer/themes/github');
const darkCodeTheme = require('prism-react-renderer/themes/dracula');
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'Ellie patchnotes',
tagline: 'Ellie patch notes',
url: 'https://patchnotes.elliebot.net',
baseUrl: '/',
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
favicon: 'img/favicon.ico',
trailingSlash: false,
// GitHub pages deployment config.
// If you aren't using GitHub pages, you don't need these.
organizationName: 'EllieBotDevs', // Usually your GitHub org/user name.
projectName: 'ellie-patchnotes', // Usually your repo name.
// Even if you don't use internalization, you can use this field to set useful
// metadata like html lang. For example, if your site is Chinese, you may want
// to replace "en" with "zh-Hans".
i18n: {
defaultLocale: 'en',
locales: ['en'],
},
presets: [
[
'classic',
/** @type {import('@docusaurus/preset-classic').Options} */
({
docs: false,
blog: {
routeBasePath: '/',
showReadingTime: true,
readingTime: ({content, frontMatter, defaultReadingTime}) =>
frontMatter.hide_reading_time ? undefined : defaultReadingTime({content}),
// Please change this to your repo.
// Remove this to remove the "edit this page" links.
editUrl:
'https://github.com/EllieBotDevs/ellie-patchnotes/tree/dev/blog',
blogTitle: 'Ellie patchnotes',
blogDescription: 'Here you can find the patch notes for Ellie',
postsPerPage: 'ALL',
feedOptions: {
type: 'all',
copyright: `Copyright © ${new Date().getFullYear()} EllieBotDevs.`,
},
},
theme: {
customCss: require.resolve('./src/css/custom.css'),
},
}),
],
],
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
navbar: {
title: 'Ellie patchnotes',
logo: {
alt: 'Ellie patchnotes',
src: 'img/favicon.ico',
},
items: [
{
href: 'https://github.com/EllieBotDevs/ellie-patchnotes',
label: 'GitHub',
position: 'right',
},
],
},
footer: {
style: 'dark',
links: [
{
title: 'Our other sites',
items: [
{
label: 'Documentation Site',
to: 'https://docs.elliebot.net',
},
{
label: 'Ellie blog',
to: 'https://blog.elliebot.net',
},
{
label: 'Main site',
to: 'https://elliebot.net',
}
],
},
{
title: 'Community',
items: [
{
label: 'Discord',
href: 'https://discord.com/invite/SVQVzJq',
},
{
label: 'Twitter',
href: 'https://twitter.com/Computergeex5',
},
],
},
{
title: 'More',
items: [
{
label: 'GitHub',
href: 'https://github.com/EllieBotDevs/ellie-patchnotes',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} EllieBotDevs.`,
},
prism: {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
},
}),
};
module.exports = config;

View file

@ -1,41 +1,19 @@
{
"name": "ellie-patchnotes",
"version": "0.0.0",
"private": true,
"type": "module",
"version": "0.0.1",
"scripts": {
"docusaurus": "docusaurus",
"start": "docusaurus start",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids"
"dev": "astro dev",
"start": "astro dev",
"build": "astro check && astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@docusaurus/core": "2.4.1",
"@docusaurus/preset-classic": "2.4.1",
"@docusaurus/types": "^2.4.1",
"@mdx-js/react": "^1.6.22",
"clsx": "^1.1.1",
"prism-react-renderer": "^1.3.1",
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "2.4.1"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
"@astrojs/check": "^0.4.0",
"astro": "^4.1.1",
"sass": "^1.69.5",
"sharp": "^0.32.5",
"typescript": "^5.3.3"
}
}

View file

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -1,31 +0,0 @@
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
// But you can create a sidebar manually
/*
tutorialSidebar: [
{
type: 'category',
label: 'Tutorial',
items: ['hello'],
},
],
*/
};
module.exports = sidebars;

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

View file

@ -0,0 +1,19 @@
---
import { ViewTransitions } from 'astro:transitions';
import SEO, { type Props as SEOProps } from './SEO.astro';
import { SiteTitle, SiteDescription } from '../consts';
export type Props = Partial<SEOProps>;
const { title = SiteTitle, name = SiteTitle, description = SiteDescription, ...seo } = Astro.props;
---
<SEO {title} {description} {name} {...seo} />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Lato:wght@400;700&family=Source+Code+Pro&display=swap"
rel="stylesheet"
/>
<ViewTransitions />

View file

@ -0,0 +1,11 @@
---
import '../styles/global.scss';
---
<footer>
<p>© 2024 EllieBotDevs</p>
<div class="footer_links">
<a href="https://discord.gg/etQdZxSyEH">Discord</a>
<a href="https://toastielab.dev/EllieBotDevs/ellie-patchnotes">Toastielab</a>
</div>
</footer>

View file

@ -0,0 +1,25 @@
---
import type { HTMLAttributes } from 'astro/types';
type Props = HTMLAttributes<'time'> & {
date: Date;
};
const { date, ...attrs } = Astro.props;
---
<time datetime={date.toISOString()} {...attrs}>
{
date.toLocaleDateString('en-us', {
year: 'numeric',
month: 'short',
day: 'numeric',
})
}
</time>
<style>
time {
display: block;
}
</style>

View file

@ -0,0 +1,23 @@
---
import '../styles/global.scss';
import { SiteTitle } from '../consts';
---
<header>
<nav>
<h2 id="site_title">
<a href="/">
{SiteTitle}
</a>
</h2>
<div class="links">
<a href="mailto:contact@elliebot.net">Contact</a>
</div>
</nav>
</header>
<style>
.links a {
text-decoration: none;
}
</style>

View file

@ -1,64 +0,0 @@
import React from 'react';
import clsx from 'clsx';
import styles from './styles.module.css';
const FeatureList = [
{
title: 'Easy to Use',
Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
description: (
<>
Docusaurus was designed from the ground up to be easily installed and
used to get your website up and running quickly.
</>
),
},
{
title: 'Focus on What Matters',
Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
description: (
<>
Docusaurus lets you focus on your docs, and we&apos;ll do the chores. Go
ahead and move your docs into the <code>docs</code> directory.
</>
),
},
{
title: 'Powered by React',
Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
description: (
<>
Extend or customize your website layout by reusing React. Docusaurus can
be extended while reusing the same header and footer.
</>
),
},
];
function Feature({Svg, title, description}) {
return (
<div className={clsx('col col--4')}>
<div className="text--center">
<Svg className={styles.featureSvg} role="img" />
</div>
<div className="text--center padding-horiz--md">
<h3>{title}</h3>
<p>{description}</p>
</div>
</div>
);
}
export default function HomepageFeatures() {
return (
<section className={styles.features}>
<div className="container">
<div className="row">
{FeatureList.map((props, idx) => (
<Feature key={idx} {...props} />
))}
</div>
</div>
</section>
);
}

View file

@ -1,11 +0,0 @@
.features {
display: flex;
align-items: center;
padding: 2rem 0;
width: 100%;
}
.featureSvg {
height: 200px;
width: 200px;
}

87
src/components/SEO.astro Normal file
View file

@ -0,0 +1,87 @@
---
import type { ImageMetadata } from 'astro';
type Image = {
src: string | ImageMetadata;
alt: string;
};
type SEOMetadata = {
name: string;
title: string;
description: string;
image?: Image | undefined;
canonicalURL?: URL | string | undefined;
locale?: string;
};
type OpenGraph = Partial<SEOMetadata> & {
type?: string;
};
type Twitter = Partial<SEOMetadata> & {
handle?: string;
card?: 'summary' | 'summary_large_image';
};
export type Props = SEOMetadata & {
og?: OpenGraph;
twitter?: Twitter;
};
const {
name,
title,
description,
image,
locale = 'en',
canonicalURL = new URL(Astro.url.pathname, Astro.site),
} = Astro.props;
const og = {
name,
title,
description,
canonicalURL,
image,
locale,
type: 'website',
...(Astro.props.og ?? {}),
} satisfies OpenGraph;
const twitter = {
name,
title,
description,
canonicalURL,
image,
locale,
card: 'summary_large_image',
...Astro.props.twitter,
};
function normalizeImageUrl(image: string | ImageMetadata) {
return typeof image === 'string' ? image : image.src;
}
---
<!-- Page Metadata -->
<link rel="canonical" href={canonicalURL} />
<meta name="description" content={description} />
<!-- OpenGraph Tags -->
<meta property="og:title" content={og.title} />
<meta property="og:type" content={og.type} />
<meta property="og:url" content={canonicalURL} />
<meta property="og:locale" content={og.locale} />
<meta property="og:description" content={og.description} />
<meta property="og:site_name" content={og.name} />
{og.image && <meta property="og:image" content={normalizeImageUrl(og.image.src)} />}
{og.image && <meta property="og:image:alt" content={og.image.alt} />}
<!-- Twitter Tags -->
<meta name="twitter:card" content={twitter.card} />
<meta name="twitter:site" content={twitter.handle} />
<meta name="twitter:title" content={twitter.title} />
<meta name="twitter:description" content={twitter.description} />
{twitter.image && <meta name="twitter:image" content={normalizeImageUrl(twitter.image.src)} />}
{twitter.image && <meta name="twitter:image:alt" content={twitter.image.alt} />}

5
src/consts.ts Normal file
View file

@ -0,0 +1,5 @@
// Place any global data in this file.
// You can import this data from anywhere in your site by using the `import` keyword.
export const SiteTitle = 'Ellie Notes';
export const SiteDescription = 'The patchnotes of EllieBot!';

15
src/content/config.ts Normal file
View file

@ -0,0 +1,15 @@
import { defineCollection, z } from 'astro:content';
const releases = defineCollection({
// Type-check frontmatter using a schema
schema:
z.object({
title: z.string(),
description: z.string(),
versionNumber: z.string(),
// Transform string to Date object
date: z.date({ coerce: true }),
}),
});
export const collections = { releases };

View file

@ -0,0 +1,13 @@
---
title: 'Ellie Bot 4.3.17!'
date: '2023-09-06'
versionNumber: '4.3.17'
description: 'Ellie Bot version 4.3.17 release notes.'
---
## Ellie Bot v4.3.17
### Fixed
- Fix to waifu gifts being character limited
- Fixes UserUpdated and UserPresence not correctly ignoring users that are logignored

View file

@ -0,0 +1,24 @@
---
title: 'Ellie Bot 4.3.18!'
date: '2023-12-26'
versionNumber: '4.3.18'
description: 'Ellie Bot version 4.3.18 release notes.'
---
## Ellie Bot v4.3.18
### Added
- Added `'cacheusers` command
- Added `'clubreject` which lets you reject club applications
### Fixed
- Fixed `icon_url` when using `'showembed`
- Fixed `'quoteshow` not showing sometimes
- Notifications will no longer be sent if dms are off when using `'give`
- Users should no longer be able to apply to clubs while in a club already (especially not to the same club they're already in)
### Removed
- `'revimg` and `'revav` as google removed reverse image search

View file

@ -0,0 +1,30 @@
---
title: 'Ellie Bot 5.0.8-beta1!'
date: '2024-06-21'
versionNumber: '5.0.8-beta1'
description: 'Ellie Bot version 5.0.8 release notes.'
---
### Added
- Added `'setserverbanner` and `'setservericon` commands
- Added overloads section to `'h command` which will show you all versions of command usage with param names
- You can now check commands for submodules, for example `'cmds SelfAssignedRoles` will show brief help for each of the commands in that submodule
- Added dropdown menus for 'mdls and 'cmds (both module and group versions) which will give you the option to see more detailed help for each specific module, group or command respectively
- Self-Hosters only:
- Added a dangerous cleanup command that you don't have to know about
### Changed
- Quotes will now use alphanumerical ids (like expressions)
### Fixed
- `'verbose` will now be respected for expression errors
- Using `'pick` will now correctly show the name of the user who picked the currency
- Fixed `'h` not working on some commands
- `'langset` and `'langsetd` should no longer allow unsupported languages and nonsense to be typed in
### Known Issues
- Db does not populate the models correctly and thus the bot refuses to boot, this will hopefully be fixed by the next beta release.

View file

@ -1,30 +0,0 @@
/**
* Any CSS included here will be global. The classic template
* bundles Infima by default. Infima is a CSS framework designed to
* work well for content-centric websites.
*/
/* You can override the default Infima variables here. */
:root {
--ifm-color-primary: #2e8555;
--ifm-color-primary-dark: #29784c;
--ifm-color-primary-darker: #277148;
--ifm-color-primary-darkest: #205d3b;
--ifm-color-primary-light: #33925d;
--ifm-color-primary-lighter: #359962;
--ifm-color-primary-lightest: #3cad6e;
--ifm-code-font-size: 95%;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
}
/* For readability concerns, you should choose a lighter palette in dark mode. */
[data-theme='dark'] {
--ifm-color-primary: #25c2a0;
--ifm-color-primary-dark: #21af90;
--ifm-color-primary-darker: #1fa588;
--ifm-color-primary-darkest: #1a8870;
--ifm-color-primary-light: #29d5b0;
--ifm-color-primary-lighter: #32d8b4;
--ifm-color-primary-lightest: #4fddbf;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}

2
src/env.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" />

View file

@ -0,0 +1,23 @@
---
import BaseHead, { type Props as HeadProps } from '../components/BaseHead.astro';
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
type Props = HeadProps;
const { ...head } = Astro.props;
---
<!doctype html>
<meta charset="utf-8" />
<html lang="en">
<head>
<BaseHead {...head} />
<body>
<div class="glow"></div>
<Header />
<slot />
<Footer />
</body>
</head>
</html>

View file

@ -0,0 +1,38 @@
---
import type { CollectionEntry } from 'astro:content';
import BaseHead from '../components/BaseHead.astro';
import FormattedDate from '../components/FormattedDate.astro';
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
type Props = {
release: CollectionEntry<'releases'>;
};
const { release } = Astro.props;
---
<!doctype html>
<html lang="en">
<head>
<BaseHead
title={release.data.title}
description={release.data.description}
/>
</head><body>
<div class="glow"></div>
<Header />
<div class="post single" transition:persist transition:name="post">
<div class="version_wrapper">
<div class="version_info">
<div class="version_number">{release.data.versionNumber}</div>
<FormattedDate class="date" date={release.data.date} />
</div>
</div>
<div class="content">
<slot />
</div>
</div>
<Footer />
</body>
</html>

37
src/pages/index.astro Normal file
View file

@ -0,0 +1,37 @@
---
import { getCollection } from 'astro:content';
import FormattedDate from '../components/FormattedDate.astro';
import Layout from '../layouts/IndexLayout.astro';
const posts = await getCollection('releases');
posts.sort((a, b) => +b.data.date - +a.data.date);
---
<Layout>
<main>
<title>Ellie Notes</title>
<h1 class="page_title">Changelogs</h1>
<hr />
<ul class="posts" transition:name="post">
{
posts.map((post) => (
<li class="post">
<div class="version_wrapper">
<div class="version_info">
<a href={`/releases/${post.slug}`}>
<div class="version_number">{post.data.versionNumber}</div>
<FormattedDate class="date" date={post.data.date} />
</a>
</div>
</div>
<div class="content">
{post.render().then(({ Content }) => (
<Content />
))}
</div>
</li>
))
}
</ul>
</main>
</Layout>

View file

@ -1,23 +0,0 @@
/**
* CSS files with the .module.css suffix will be treated as CSS modules
* and scoped locally.
*/
.heroBanner {
padding: 4rem 0;
text-align: center;
position: relative;
overflow: hidden;
}
@media screen and (max-width: 996px) {
.heroBanner {
padding: 2rem;
}
}
.buttons {
display: flex;
align-items: center;
justify-content: center;
}

View file

@ -1,7 +0,0 @@
---
title: Markdown page example
---
# Markdown page example
You don't need React to write simple standalone pages.

View file

@ -0,0 +1,21 @@
---
import { getCollection } from 'astro:content';
import Layout from '../../layouts/PostLayout.astro';
export async function getStaticPaths() {
const releases = await getCollection('releases');
return releases.map((release) => ({
params: { slug: release.slug },
props: { release },
}));
}
const { release } = Astro.props;
const { Content } = await release.render();
---
<Layout {release}>
<Content />
</Layout>

61
src/styles/colors.scss Normal file
View file

@ -0,0 +1,61 @@
@function color($color, $tone) {
// @warn map-get($palette,$color);
@if map-has-key($palette, $color) {
$color: map-get($palette, $color);
@if map-has-key($color, $tone) {
$tone: map-get($color, $tone);
@return $tone;
}
@warn "unknown tone `#{$tone}` in color";
@return null;
}
@warn "unknown color `#{$color}` in palette";
@return null;
}
$white: #ffffff;
$palette: (
purple: (
50: #f2e8fd,
100: #e6d1fa,
200: #cfa3f5,
300: #ba75f0,
400: #a846ec,
500: #9818e7,
600: #7b13b4,
700: #5b0e81,
800: #3a084e,
900: #15031c,
950: #020002,
),
orange: (
50: #fbf0ea,
100: #f8e3d9,
200: #f2cab7,
300: #ecb194,
400: #e59872,
500: #df7f4f,
600: #d05f26,
700: #a1491d,
800: #713315,
900: #421e0c,
950: #2a1308,
),
gray: (
50: #f6f6f9,
100: #e6e7ef,
200: #c7c9db,
300: #a8abc7,
400: #898eb4,
500: #6a71a0,
600: #545b83,
700: #404664,
800: #2c3145,
900: #181b26,
950: #0e1016,
),
);

3
src/styles/global.scss Normal file
View file

@ -0,0 +1,3 @@
@import 'colors.scss';
@import 'type.scss';
@import 'layout.scss';

291
src/styles/layout.scss Normal file
View file

@ -0,0 +1,291 @@
$container: 1040px;
$tablet: 768px;
$mobile: 420px;
* {
box-sizing: border-box;
}
body {
margin: 0 auto;
padding: 0 1em;
width: 1040px;
max-width: 100%;
background-color: $white;
@media (prefers-color-scheme: dark) {
background-color: color(purple, 950);
}
@media (max-width: $tablet) {
font-size: 16px;
}
}
.glow {
width: 100%;
height: 100%;
position: absolute;
z-index: -1;
top: 0;
left: 0;
overflow: hidden;
&:after {
content: '';
display: block;
position: absolute;
top: -120px;
left: calc(50% - 360px);
width: 720px;
height: 240px;
background: radial-gradient(
50% 50% at 50% 50%,
rgba(color(orange, 500), 0.2) 0%,
rgba(color(orange, 500), 0) 100%
);
@media (prefers-color-scheme: dark) {
background: radial-gradient(
50% 50% at 50% 50%,
rgba(255, 255, 255, 0.06) 0%,
rgba(255, 255, 255, 0) 100%
);
}
}
}
::selection {
background: color(orange, 200);
@media (prefers-color-scheme: dark) {
background: color(orange, 600);
}
}
a,
a:visited {
color: color(orange, 600);
@media (prefers-color-scheme: dark) {
color: color(orange, 300);
}
transition: 0.1s ease;
&:hover {
color: color(orange, 500);
}
}
hr {
margin: 1em 0;
border: 0;
border-bottom: 1px solid color(gray, 100);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 900);
}
}
nav {
display: flex;
align-items: center;
justify-content: space-between;
margin: 0 0 2em 0;
padding: 2em 0;
a {
transition: 0.1s ease;
&:hover {
opacity: 0.6;
}
}
#site_title {
margin: 0;
}
#site_title a {
display: flex;
align-items: center;
gap: 10px;
color: color(gray, 950);
@media (prefers-color-scheme: dark) {
color: $white;
}
font-size: 16px;
font-weight: 700;
letter-spacing: 2px;
line-height: 1;
text-decoration: none;
text-transform: uppercase;
}
.links a {
margin-left: 1em;
color: color(gray, 800);
@media (prefers-color-scheme: dark) {
color: color(gray, 200);
}
}
}
.content {
ol,
ul {
padding-left: 2em;
margin-bottom: 1em;
}
ul {
list-style: none;
li {
position: relative;
margin-bottom: 0.75em;
&:before {
content: '';
display: block;
position: absolute;
left: -1em;
top: 0.63em;
width: 8px;
height: 8px;
background: linear-gradient(25deg, color(purple, 500), color(orange, 500));
border-radius: 99px;
}
}
}
}
.page_title {
margin: 1.5em 0;
@media (max-width: $tablet) {
margin: 0.5em 0;
}
}
.posts {
list-style: none;
padding: 0;
}
.post {
display: flex;
width: 100%;
@media (max-width: $tablet) {
flex-flow: column;
}
&:last-child .content,
&.single .content {
border-bottom: 0;
}
}
.version_wrapper {
flex-basis: 260px;
@media (max-width: $container) {
flex-basis: 140px;
}
flex-grow: 0;
flex-shrink: 0;
margin: 4.5em 0 0 0;
@media (max-width: $tablet) {
flex-basis: 0;
margin-top: 2em;
}
.version_info {
position: sticky;
top: 1em;
@media (max-width: $tablet) {
position: relative;
top: 0;
}
}
a {
float: left;
color: $white;
text-decoration: none;
transition: 0.1s ease;
&:hover {
opacity: 0.6;
}
}
}
.version_number {
display: inline-block;
font-family: $codeFont;
line-height: 1;
margin-bottom: 8px;
padding: 4px 12px;
color: $white;
background: linear-gradient(
25deg,
color(purple, 800),
color(purple, 700),
mix(color(purple, 500), color(orange, 500)),
color(orange, 500)
);
border-radius: 8px;
}
.date {
clear: both;
@media (max-width: $tablet) {
display: inline;
margin-left: 1em;
}
color: color(gray, 800);
@media (prefers-color-scheme: dark) {
color: color(gray, 200);
}
font-family: $codeFont;
font-size: $fontSizeSmall;
}
.content {
margin: 0;
padding: 4em 0;
@media (max-width: $tablet) {
margin: 1em 0;
padding: 0 0 2em 0;
}
border-bottom: 1px solid color(gray, 100);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 900);
}
*:first-child {
margin-top: 0;
}
img {
max-width: 100%;
height: auto;
border-radius: 12px;
border: 1px solid color(gray, 200);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 800);
}
}
}
footer {
display: flex;
padding: 2em 0;
@media (max-width: $tablet) {
padding: 1em 0;
}
color: color(gray, 500);
justify-content: space-between;
border-top: 1px solid color(gray, 100);
@media (prefers-color-scheme: dark) {
border-color: color(gray, 900);
}
a {
margin-left: 1em;
color: color(gray, 500);
text-decoration: none;
&:hover {
color: color(gray, 500);
opacity: 0.6;
}
}
}

65
src/styles/type.scss Normal file
View file

@ -0,0 +1,65 @@
$baseFont: 'Lato', sans-serif;
$codeFont: 'Source Code Pro', monospace;
$fontSizeSmall: 15px;
body {
font-family: $baseFont;
font-size: 18px;
line-height: 1.65;
font-weight: 400;
@media (prefers-color-scheme: dark) {
color: color(gray, 200);
}
color: color(gray, 800);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
h1,
h2,
h3,
h4,
h5 {
line-height: 1.2;
margin: 1em 0 0.5em 0;
@media (prefers-color-scheme: dark) {
color: $white;
}
color: color(gray, 950);
font-weight: 700;
}
h1 {
font-size: 3.052em;
}
h2 {
font-size: 2.441em;
}
h3 {
font-size: 1.953em;
}
h4 {
font-size: 1.563em;
}
h5 {
font-size: 1.25em;
}
p {
margin: 0 0 1em 0;
}
code {
font-family: $codeFont;
}
b,
strong {
font-weight: 700;
color: #fff;
@media (prefers-color-scheme: dark) {
color: $white;
}
color: color(gray, 950);
}

View file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

6
tsconfig.json Normal file
View file

@ -0,0 +1,6 @@
{
"extends": "astro/tsconfigs/strict",
"exclude": [
"dist"
]
}

9387
yarn.lock

File diff suppressed because it is too large Load diff