1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-11-05 02:12:28 +01:00

Merge branch 'spacebarchat:master' into fix/lazy-request-filter

This commit is contained in:
TomatoCake 2024-08-24 19:11:02 +02:00 committed by GitHub
commit 78ff85737f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
93 changed files with 38326 additions and 75716 deletions

4
.gitattributes vendored Normal file
View File

@ -0,0 +1,4 @@
* text=auto
*.sh -crlf
*.nix -crlf
.husky/pre-commit -crlf

4
.gitignore vendored
View File

@ -1,4 +1,4 @@
.DS_STORE **/.DS_STORE
db/ db/
dist/ dist/
node_modules node_modules
@ -19,4 +19,4 @@ build
*.tmp *.tmp
tmp/ tmp/
dump/ dump/
result result

View File

@ -2,4 +2,5 @@ assets
dist dist
node_modules node_modules
.github .github
.vscode .vscode
hashes.json

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1723362943, "lastModified": 1723637854,
"narHash": "sha256-dFZRVSgmJkyM0bkPpaYRtG/kRMRTorUIDj8BxoOt1T4=", "narHash": "sha256-med8+5DSWa2UnOqtdICndjDAEjxr5D7zaIiK4pn0Q7c=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a58bc8ad779655e790115244571758e8de055e3d", "rev": "c3aa7b8938b17aebd2deecf7be0636000d62a2b9",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -13,11 +13,21 @@
inherit system; inherit system;
}; };
hashesFile = builtins.fromJSON (builtins.readFile ./hashes.json); hashesFile = builtins.fromJSON (builtins.readFile ./hashes.json);
lib = pkgs.lib;
in rec { in rec {
packages.default = pkgs.buildNpmPackage { packages.default = pkgs.buildNpmPackage {
pname = "spacebar-server-ts"; pname = "spacebar-server-ts";
src = ./.;
name = "spacebar-server-ts"; name = "spacebar-server-ts";
meta = with lib; {
description = "Spacebar server, a FOSS reimplementation of the Discord backend.";
homepage = "https://github.com/spacebarchat/server";
license = licenses.agpl3Plus;
platforms = platforms.all;
mainProgram = "start-bundle";
};
src = ./.;
nativeBuildInputs = with pkgs; [ python3 ]; nativeBuildInputs = with pkgs; [ python3 ];
npmDepsHash = hashesFile.npmDepsHash; npmDepsHash = hashesFile.npmDepsHash;
makeCacheWritable = true; makeCacheWritable = true;

View File

@ -1,3 +1,3 @@
{ {
"npmDepsHash": "sha256-kdS1SwcBu6Dor92iO1ickLgz0T5UL16nyA49xXGajf4=" "npmDepsHash": "sha256-qcHlktC4qrhOJ6AwKbccPkr0cVrAtPhGK+xD/eV+scU="
} }

View File

@ -1,10 +1,10 @@
#!/usr/bin/env nix-shell #!/usr/bin/env nix-shell
#!nix-shell -i "bash -x" -p bash prefetch-npm-deps jq git nix-output-monitor #!nix-shell -i "bash -x" -p bash prefetch-npm-deps jq git nix-output-monitor
nix flake update nix flake update --extra-experimental-features 'nix-command flakes'
DEPS_HASH=`prefetch-npm-deps package-lock.json` DEPS_HASH=`prefetch-npm-deps package-lock.json`
TMPFILE=$(mktemp) TMPFILE=$(mktemp)
jq '.npmDepsHash = "'$DEPS_HASH'"' hashes.json > $TMPFILE jq '.npmDepsHash = "'$DEPS_HASH'"' hashes.json > $TMPFILE
mv -- "$TMPFILE" hashes.json mv -- "$TMPFILE" hashes.json
nom build .# || exit $? nom build .# --extra-experimental-features 'nix-command flakes' || exit $?
git add hashes.json flake.lock flake.nix git add hashes.json flake.lock flake.nix

3354
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -117,6 +117,7 @@
}, },
"optionalDependencies": { "optionalDependencies": {
"erlpack": "^0.1.4", "erlpack": "^0.1.4",
"jimp": "^0.22.12",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"nodemailer-mailgun-transport": "^2.1.5", "nodemailer-mailgun-transport": "^2.1.5",
"nodemailer-mailjet-transport": "github:n0script22/nodemailer-mailjet-transport", "nodemailer-mailjet-transport": "github:n0script22/nodemailer-mailjet-transport",

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -28,15 +28,13 @@ require("missing-native-js-functions");
const openapiPath = path.join(__dirname, "..", "assets", "openapi.json"); const openapiPath = path.join(__dirname, "..", "assets", "openapi.json");
const SchemaPath = path.join(__dirname, "..", "assets", "schemas.json"); const SchemaPath = path.join(__dirname, "..", "assets", "schemas.json");
const schemas = JSON.parse(fs.readFileSync(SchemaPath, { encoding: "utf8" })); const schemas = JSON.parse(fs.readFileSync(SchemaPath, { encoding: "utf8" }));
// const specification = JSON.parse(
// fs.readFileSync(openapiPath, { encoding: "utf8" }),
// );
let specification = { let specification = {
openapi: "3.1.0", openapi: "3.1.0",
info: { info: {
title: "Spacebar Server", title: "Spacebar Server",
description: description:
"Spacebar is a free open source selfhostable discord compatible chat, voice and video platform", "Spacebar is a Discord.com server implementation and extension, with the goal of complete feature parity with Discord.com, all while adding some additional goodies, security, privacy, and configuration options.",
license: { license: {
name: "AGPLV3", name: "AGPLV3",
url: "https://www.gnu.org/licenses/agpl-3.0.en.html", url: "https://www.gnu.org/licenses/agpl-3.0.en.html",
@ -68,8 +66,9 @@ let specification = {
paths: {}, paths: {},
}; };
const schemaRegEx = new RegExp(/^[\w.]+$/);
function combineSchemas(schemas) { function combineSchemas(schemas) {
var definitions = {}; let definitions = {};
for (const name in schemas) { for (const name in schemas) {
definitions = { definitions = {
@ -84,9 +83,8 @@ function combineSchemas(schemas) {
} }
for (const key in definitions) { for (const key in definitions) {
const reg = new RegExp(/^[a-zA-Z0-9.\-_]+$/, "gm"); if (!schemaRegEx.test(key)) {
if (!reg.test(key)) { console.error(`Invalid schema name: ${key}`);
console.error(`Invalid schema name: ${key} (${reg.test(key)})`);
continue; continue;
} }
specification.components = specification.components || {}; specification.components = specification.components || {};
@ -116,7 +114,7 @@ function getTag(key) {
return key.match(/\/([\w-]+)/)[1]; return key.match(/\/([\w-]+)/)[1];
} }
function apiRoutes() { function apiRoutes(missingRoutes) {
const routes = getRouteDescriptions(); const routes = getRouteDescriptions();
// populate tags // populate tags
@ -136,8 +134,9 @@ function apiRoutes() {
if ( if (
!NO_AUTHORIZATION_ROUTES.some((x) => { !NO_AUTHORIZATION_ROUTES.some((x) => {
if (typeof x === "string") return path.startsWith(x); if (typeof x === "string")
return x.test(path); return (method.toUpperCase() + " " + path).startsWith(x);
return x.test(method.toUpperCase() + " " + path);
}) })
) { ) {
obj.security = [{ bearer: [] }]; obj.security = [{ bearer: [] }];
@ -157,32 +156,30 @@ function apiRoutes() {
}, },
}, },
}, },
}.merge(obj.requestBody); };
} }
if (route.responses) { if (route.responses) {
for (const [k, v] of Object.entries(route.responses)) { obj.responses = {};
let schema = {
$ref: `#/components/schemas/${v.body}`,
};
obj.responses = { for (const [k, v] of Object.entries(route.responses)) {
[k]: { if (v.body)
...(v.body obj.responses[k] = {
? { description: obj?.responses?.[k]?.description || "",
description: content: {
obj?.responses?.[k]?.description || "", "application/json": {
content: { schema: {
"application/json": { $ref: `#/components/schemas/${v.body}`,
schema: schema, },
}, },
}, },
} };
: { else
description: "No description available", obj.responses[k] = {
}), description:
}, obj?.responses?.[k]?.description ||
}.merge(obj.responses); "No description available",
};
} }
} else { } else {
obj.responses = { obj.responses = {
@ -218,6 +215,15 @@ function apiRoutes() {
obj.tags = [...(obj.tags || []), getTag(p)].unique(); obj.tags = [...(obj.tags || []), getTag(p)].unique();
if (missingRoutes.additional.includes(path.replace(/\/$/, ""))) {
obj["x-badges"] = [
{
label: "Spacebar-only",
color: "red",
},
];
}
specification.paths[path] = Object.assign( specification.paths[path] = Object.assign(
specification.paths[path] || {}, specification.paths[path] || {},
{ {
@ -227,10 +233,21 @@ function apiRoutes() {
}); });
} }
function main() { async function main() {
console.log("Generating OpenAPI Specification..."); console.log("Generating OpenAPI Specification...");
const routesRes = await fetch(
"https://github.com/spacebarchat/missing-routes/raw/main/missing.json",
{
headers: {
Accept: "application/json",
},
},
);
const missingRoutes = await routesRes.json();
combineSchemas(schemas); combineSchemas(schemas);
apiRoutes(); apiRoutes(missingRoutes);
fs.writeFileSync( fs.writeFileSync(
openapiPath, openapiPath,

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -41,11 +41,16 @@ const Excluded = [
"EntitySchema", "EntitySchema",
"ServerResponse", "ServerResponse",
"Http2ServerResponse", "Http2ServerResponse",
"ExpressResponse",
"global.Express.Response", "global.Express.Response",
"global.Response",
"Response", "Response",
"e.Response", "e.Response",
"request.Response", "request.Response",
"supertest.Response", "supertest.Response",
"DiagnosticsChannel.Response",
"_Response",
"ReadableStream<any>",
// TODO: Figure out how to exclude schemas from node_modules? // TODO: Figure out how to exclude schemas from node_modules?
"SomeJSONSchema", "SomeJSONSchema",

View File

@ -34,7 +34,7 @@ import "missing-native-js-functions";
import morgan from "morgan"; import morgan from "morgan";
import path from "path"; import path from "path";
import { red } from "picocolors"; import { red } from "picocolors";
import { Authentication, CORS } from "./middlewares/"; import { Authentication, CORS, ImageProxy } from "./middlewares/";
import { BodyParser } from "./middlewares/BodyParser"; import { BodyParser } from "./middlewares/BodyParser";
import { ErrorHandler } from "./middlewares/ErrorHandler"; import { ErrorHandler } from "./middlewares/ErrorHandler";
import { initRateLimits } from "./middlewares/RateLimit"; import { initRateLimits } from "./middlewares/RateLimit";
@ -137,6 +137,8 @@ export class SpacebarServer extends Server {
app.use("/api/v9", api); app.use("/api/v9", api);
app.use("/api", api); // allow unversioned requests app.use("/api", api); // allow unversioned requests
app.use("/imageproxy/:hash/:size/:url", ImageProxy);
app.get("/", (req, res) => app.get("/", (req, res) =>
res.sendFile(path.join(PUBLIC_ASSETS_FOLDER, "index.html")), res.sendFile(path.join(PUBLIC_ASSETS_FOLDER, "index.html")),
); );

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -23,37 +23,37 @@ import { HTTPError } from "lambert-server";
export const NO_AUTHORIZATION_ROUTES = [ export const NO_AUTHORIZATION_ROUTES = [
// Authentication routes // Authentication routes
"/auth/login", "POST /auth/login",
"/auth/register", "POST /auth/register",
"/auth/location-metadata", "GET /auth/location-metadata",
"/auth/mfa/totp", "POST /auth/mfa/",
"/auth/mfa/webauthn", "POST /auth/verify",
"/auth/verify", "POST /auth/forgot",
"/auth/forgot", "POST /auth/reset",
"/auth/reset", "GET /invites/",
// Routes with a seperate auth system // Routes with a seperate auth system
/\/webhooks\/\d+\/\w+\/?/, // no token requires auth /POST \/webhooks\/\d+\/\w+\/?/, // no token requires auth
// Public information endpoints // Public information endpoints
"/ping", "GET /ping",
"/gateway", "GET /gateway",
"/experiments", "GET /experiments",
"/updates", "GET /updates",
"/download", "GET /download",
"/scheduled-maintenances/upcoming.json", "GET /scheduled-maintenances/upcoming.json",
// Public kubernetes integration // Public kubernetes integration
"/-/readyz", "GET /-/readyz",
"/-/healthz", "GET /-/healthz",
// Client analytics // Client analytics
"/science", "POST /science",
"/track", "POST /track",
// Public policy pages // Public policy pages
"/policies/instance", "GET /policies/instance/",
// Oauth callback // Oauth callback
"/oauth2/callback", "/oauth2/callback",
// Asset delivery // Asset delivery
/\/guilds\/\d+\/widget\.(json|png)/, /GET \/guilds\/\d+\/widget\.(json|png)/,
// Connections // Connections
/\/connections\/\w+\/callback/, /POST \/connections\/\w+\/callback/,
]; ];
export const API_PREFIX = /^\/api(\/v\d+)?/; export const API_PREFIX = /^\/api(\/v\d+)?/;
@ -78,11 +78,11 @@ export async function Authentication(
) { ) {
if (req.method === "OPTIONS") return res.sendStatus(204); if (req.method === "OPTIONS") return res.sendStatus(204);
const url = req.url.replace(API_PREFIX, ""); const url = req.url.replace(API_PREFIX, "");
if (url.startsWith("/invites") && req.method === "GET") return next();
if ( if (
NO_AUTHORIZATION_ROUTES.some((x) => { NO_AUTHORIZATION_ROUTES.some((x) => {
if (typeof x === "string") return url.startsWith(x); if (typeof x === "string")
return x.test(url); return (req.method + " " + url).startsWith(x);
return x.test(req.method + " " + url);
}) })
) )
return next(); return next();

View File

@ -20,6 +20,19 @@ import bodyParser, { OptionsJson } from "body-parser";
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import { HTTPError } from "lambert-server"; import { HTTPError } from "lambert-server";
const errorMessages: { [key: string]: [string, number] } = {
"entity.too.large": ["Request body too large", 413],
"entity.parse.failed": ["Invalid JSON body", 400],
"entity.verify.failed": ["Entity verification failed", 403],
"request.aborted": ["Request aborted", 400],
"request.size.invalid": ["Request size did not match content length", 400],
"stream.encoding.set": ["Stream encoding should not be set", 500],
"stream.not.readable": ["Stream is not readable", 500],
"parameters.too.many": ["Too many parameters", 413],
"charset.unsupported": ["Unsupported charset", 415],
"encoding.unsupported": ["Unsupported content encoding", 415],
};
export function BodyParser(opts?: OptionsJson) { export function BodyParser(opts?: OptionsJson) {
const jsonParser = bodyParser.json(opts); const jsonParser = bodyParser.json(opts);
@ -29,8 +42,15 @@ export function BodyParser(opts?: OptionsJson) {
jsonParser(req, res, (err) => { jsonParser(req, res, (err) => {
if (err) { if (err) {
// TODO: different errors for body parser (request size limit, wrong body type, invalid body, ...) const [message, status] = errorMessages[err.type] || [
return next(new HTTPError("Invalid Body", 400)); "Invalid Body",
400,
];
const errorMessage =
message.includes("charset") || message.includes("encoding")
? `${message} "${err.charset || err.encoding}"`
: message;
return next(new HTTPError(errorMessage, status));
} }
next(); next();
}); });

View File

@ -0,0 +1,180 @@
/*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { Config, JimpType } from "@spacebar/util";
import { Request, Response } from "express";
import { yellow } from "picocolors";
import crypto from "crypto";
import fetch from "node-fetch";
let sharp: undefined | false | { default: typeof import("sharp") } = undefined;
let Jimp: JimpType | undefined = undefined;
try {
Jimp = require("jimp") as JimpType;
} catch {
// empty
}
let sentImageProxyWarning = false;
const sharpSupported = new Set([
"image/jpeg",
"image/png",
"image/bmp",
"image/tiff",
"image/gif",
"image/webp",
"image/avif",
"image/svg+xml",
]);
const jimpSupported = new Set([
"image/jpeg",
"image/png",
"image/bmp",
"image/tiff",
"image/gif",
]);
const resizeSupported = new Set([...sharpSupported, ...jimpSupported]);
export async function ImageProxy(req: Request, res: Response) {
const path = req.originalUrl.split("/").slice(2);
// src/api/util/utility/EmbedHandlers.ts getProxyUrl
const hash = crypto
.createHmac("sha1", Config.get().security.requestSignature)
.update(path.slice(1).join("/"))
.digest("base64")
.replace(/\+/g, "-")
.replace(/\//g, "_");
try {
if (!crypto.timingSafeEqual(Buffer.from(hash), Buffer.from(path[0])))
throw new Error("Invalid signature");
} catch {
console.log("Invalid signature, expected " + hash + " got " + path[0]);
res.status(403).send("Invalid signature");
return;
}
const abort = new AbortController();
setTimeout(() => abort.abort(), 5000);
const request = await fetch(path.slice(2).join("/"), {
headers: {
"User-Agent": "SpacebarImageProxy/1.0.0 (https://spacebar.chat)",
},
signal: abort.signal,
}).catch((e) => {
if (e.name === "AbortError") res.status(504).send("Request timed out");
else res.status(500).send("Unable to proxy origin: " + e.message);
});
if (!request) return;
if (request.status !== 200) {
res.status(request.status).send(
"Origin failed to respond: " +
request.status +
" " +
request.statusText,
);
return;
}
if (
!request.headers.get("Content-Type") ||
!request.headers.get("Content-Length")
) {
res.status(500).send(
"Origin did not provide a Content-Type or Content-Length header",
);
return;
}
// @ts-expect-error TS doesn't believe that the header cannot be null (it's checked for falsiness above)
if (parseInt(request.headers.get("Content-Length")) > 1024 * 1024 * 10) {
res.status(500).send(
"Origin provided a Content-Length header that is too large",
);
return;
}
// @ts-expect-error TS doesn't believe that the header cannot be null (it's checked for falsiness above)
let contentType: string = request.headers.get("Content-Type");
const arrayBuffer = await request.arrayBuffer();
let resultBuffer = Buffer.from(arrayBuffer);
if (
!sentImageProxyWarning &&
resizeSupported.has(contentType) &&
/^\d+x\d+$/.test(path[1])
) {
if (sharp !== false) {
try {
sharp = await import("sharp");
} catch {
sharp = false;
}
}
if (sharp === false && !Jimp) {
try {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore Typings don't fit
Jimp = await import("jimp");
} catch {
sentImageProxyWarning = true;
console.log(
`[ImageProxy] ${yellow(
'Neither "sharp" or "jimp" NPM packages are installed, image resizing will be disabled',
)}`,
);
}
}
const [width, height] = path[1].split("x").map((x) => parseInt(x));
const buffer = Buffer.from(arrayBuffer);
if (sharp && sharpSupported.has(contentType)) {
resultBuffer = await sharp
.default(buffer)
// Sharp doesn't support "scaleToFit"
.resize(width)
.toBuffer();
} else if (Jimp && jimpSupported.has(contentType)) {
resultBuffer = await Jimp.read(buffer).then((image) => {
contentType = image.getMIME();
return (
image
.scaleToFit(width, height)
// @ts-expect-error Jimp is defined at this point
.getBufferAsync(Jimp.AUTO)
);
});
}
}
res.header("Content-Type", contentType);
res.setHeader(
"Cache-Control",
"public, max-age=" + Config.get().cdn.proxyCacheHeaderSeconds,
);
res.send(resultBuffer);
}

View File

@ -21,3 +21,4 @@ export * from "./BodyParser";
export * from "./CORS"; export * from "./CORS";
export * from "./ErrorHandler"; export * from "./ErrorHandler";
export * from "./RateLimit"; export * from "./RateLimit";
export * from "./ImageProxy";

View File

@ -1,31 +1,24 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { getIpAdress, route, verifyCaptcha } from "@spacebar/api"; import { getIpAdress, route, verifyCaptcha } from "@spacebar/api";
import { import { Config, Email, ForgotPasswordSchema, User } from "@spacebar/util";
Config,
Email,
FieldErrors,
ForgotPasswordSchema,
User,
} from "@spacebar/util";
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
import { HTTPError } from "lambert-server";
const router = Router(); const router = Router();
router.post( router.post(
@ -37,9 +30,6 @@ router.post(
400: { 400: {
body: "APIErrorOrCaptchaResponse", body: "APIErrorOrCaptchaResponse",
}, },
500: {
body: "APIErrorResponse",
},
}, },
}), }),
async (req: Request, res: Response) => { async (req: Request, res: Response) => {
@ -71,50 +61,20 @@ router.post(
} }
} }
const user = await User.findOneOrFail({ res.sendStatus(204);
const user = await User.findOne({
where: [{ phone: login }, { email: login }], where: [{ phone: login }, { email: login }],
select: ["username", "id", "disabled", "deleted", "email"], select: ["username", "id", "email"],
relations: ["security_keys"], }).catch(() => {});
}).catch(() => {
throw FieldErrors({
login: {
message: req.t("auth:password_reset.EMAIL_DOES_NOT_EXIST"),
code: "EMAIL_DOES_NOT_EXIST",
},
});
});
if (!user.email) if (user && user.email) {
throw FieldErrors({ Email.sendResetPassword(user, user.email).catch((e) => {
login: {
message:
"This account does not have an email address associated with it.",
code: "NO_EMAIL",
},
});
if (user.deleted)
return res.status(400).json({
message: "This account is scheduled for deletion.",
code: 20011,
});
if (user.disabled)
return res.status(400).json({
message: req.t("auth:login.ACCOUNT_DISABLED"),
code: 20013,
});
return await Email.sendResetPassword(user, user.email)
.then(() => {
return res.sendStatus(204);
})
.catch((e) => {
console.error( console.error(
`Failed to send password reset email to ${user.username}#${user.discriminator}: ${e}`, `Failed to send password reset email to ${user.username}#${user.discriminator} (${user.id}): ${e}`,
); );
throw new HTTPError("Failed to send password reset email", 500);
}); });
}
}, },
); );

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -287,6 +287,16 @@ router.post(
}); });
} }
const { maxUsername } = Config.get().limits.user;
if (body.username.length > maxUsername) {
throw FieldErrors({
username: {
code: "BASE_TYPE_BAD_LENGTH",
message: `Must be between 2 and ${maxUsername} in length.`,
},
});
}
const user = await User.register({ ...body, req }); const user = await User.register({ ...body, req });
if (body.invite) { if (body.invite) {

View File

@ -115,7 +115,7 @@ router.delete(
} }
await Promise.all([ await Promise.all([
Channel.delete({ id: channel_id }), Channel.deleteChannel(channel),
emitEvent({ emitEvent({
event: "CHANNEL_DELETE", event: "CHANNEL_DELETE",
data: channel, data: channel,

View File

@ -1,30 +1,31 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { route } from "@spacebar/api"; import { route } from "@spacebar/api";
import { import {
Channel,
ChannelPinsUpdateEvent, ChannelPinsUpdateEvent,
Config, Config,
DiscordApiErrors, DiscordApiErrors,
emitEvent, emitEvent,
Message, Message,
MessageCreateEvent,
MessageUpdateEvent, MessageUpdateEvent,
User,
} from "@spacebar/util"; } from "@spacebar/util";
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
@ -60,8 +61,34 @@ router.put(
if (pinned_count >= maxPins) if (pinned_count >= maxPins)
throw DiscordApiErrors.MAXIMUM_PINS.withParams(maxPins); throw DiscordApiErrors.MAXIMUM_PINS.withParams(maxPins);
message.pinned = true;
const author = await User.getPublicUser(req.user_id);
const systemPinMessage = Message.create({
timestamp: new Date(),
type: 6,
guild_id: message.guild_id,
channel_id: message.channel_id,
author,
message_reference: {
message_id: message.id,
channel_id: message.channel_id,
guild_id: message.guild_id,
},
reactions: [],
attachments: [],
embeds: [],
sticker_items: [],
edited_timestamp: undefined,
mentions: [],
mention_channels: [],
mention_roles: [],
mention_everyone: false,
});
await Promise.all([ await Promise.all([
Message.update({ id: message_id }, { pinned: true }), message.save(),
emitEvent({ emitEvent({
event: "MESSAGE_UPDATE", event: "MESSAGE_UPDATE",
channel_id, channel_id,
@ -76,6 +103,12 @@ router.put(
last_pin_timestamp: undefined, last_pin_timestamp: undefined,
}, },
} as ChannelPinsUpdateEvent), } as ChannelPinsUpdateEvent),
systemPinMessage.save(),
emitEvent({
event: "MESSAGE_CREATE",
channel_id: message.channel_id,
data: systemPinMessage,
} as MessageCreateEvent),
]); ]);
res.sendStatus(204); res.sendStatus(204);
@ -98,31 +131,27 @@ router.delete(
async (req: Request, res: Response) => { async (req: Request, res: Response) => {
const { channel_id, message_id } = req.params; const { channel_id, message_id } = req.params;
const channel = await Channel.findOneOrFail({
where: { id: channel_id },
});
if (channel.guild_id) req.permission?.hasThrow("MANAGE_MESSAGES");
const message = await Message.findOneOrFail({ const message = await Message.findOneOrFail({
where: { id: message_id }, where: { id: message_id },
}); });
if (message.guild_id) req.permission?.hasThrow("MANAGE_MESSAGES");
message.pinned = false; message.pinned = false;
await Promise.all([ await Promise.all([
message.save(), message.save(),
emitEvent({ emitEvent({
event: "MESSAGE_UPDATE", event: "MESSAGE_UPDATE",
channel_id, channel_id,
data: message, data: message,
} as MessageUpdateEvent), } as MessageUpdateEvent),
emitEvent({ emitEvent({
event: "CHANNEL_PINS_UPDATE", event: "CHANNEL_PINS_UPDATE",
channel_id, channel_id,
data: { data: {
channel_id, channel_id,
guild_id: channel.guild_id, guild_id: message.guild_id,
last_pin_timestamp: undefined, last_pin_timestamp: undefined,
}, },
} as ChannelPinsUpdateEvent), } as ChannelPinsUpdateEvent),

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -77,8 +77,8 @@ router.patch(
requestBody: "GuildUpdateSchema", requestBody: "GuildUpdateSchema",
permission: "MANAGE_GUILD", permission: "MANAGE_GUILD",
responses: { responses: {
"200": { 200: {
body: "GuildUpdateSchema", body: "GuildCreateResponse",
}, },
401: { 401: {
body: "APIErrorResponse", body: "APIErrorResponse",

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -108,30 +108,23 @@ router.patch(
}); });
if (!guild.features.includes("ALIASABLE_NAMES")) { if (!guild.features.includes("ALIASABLE_NAMES")) {
await Invite.update( await Invite.delete({ guild_id, vanity_url: true });
{ guild_id },
{
code: code,
},
);
return res.json({ code });
} }
await Invite.create({ await Invite.create({
vanity_url: true, vanity_url: true,
code: code, code,
temporary: false, temporary: false,
uses: 0, uses: 0,
max_uses: 0, max_uses: 0,
max_age: 0, max_age: 0,
created_at: new Date(), created_at: new Date(),
expires_at: new Date(),
guild_id: guild_id, guild_id: guild_id,
channel_id: id, channel_id: id,
flags: 0,
}).save(); }).save();
return res.json({ code: code }); return res.json({ code });
}, },
); );

View File

@ -1,25 +1,31 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { random, route } from "@spacebar/api"; import { random, route } from "@spacebar/api";
import { Channel, Guild, Invite, Member, Permissions } from "@spacebar/util"; import {
Channel,
DiscordApiErrors,
Guild,
Invite,
Member,
Permissions,
} from "@spacebar/util";
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
import { HTTPError } from "lambert-server";
const router: Router = Router(); const router: Router = Router();
@ -47,8 +53,17 @@ router.get(
async (req: Request, res: Response) => { async (req: Request, res: Response) => {
const { guild_id } = req.params; const { guild_id } = req.params;
const guild = await Guild.findOneOrFail({ where: { id: guild_id } }); const guild = await Guild.findOneOrFail({
if (!guild.widget_enabled) throw new HTTPError("Widget Disabled", 404); where: { id: guild_id },
select: {
channel_ordering: true,
widget_channel_id: true,
widget_enabled: true,
presence_count: true,
name: true,
},
});
if (!guild.widget_enabled) throw DiscordApiErrors.EMBED_DISABLED;
// Fetch existing widget invite for widget channel // Fetch existing widget invite for widget channel
let invite = await Invite.findOne({ let invite = await Invite.findOne({
@ -71,6 +86,7 @@ router.get(
created_at: new Date(), created_at: new Date(),
guild_id, guild_id,
channel_id: guild.widget_channel_id, channel_id: guild.widget_channel_id,
flags: 0,
}).save(); }).save();
} }

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -19,11 +19,12 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { route } from "@spacebar/api"; import { route } from "@spacebar/api";
import { Guild } from "@spacebar/util"; import { DiscordApiErrors, Guild } from "@spacebar/util";
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
import fs from "fs"; import fs from "fs";
import { HTTPError } from "lambert-server"; import { HTTPError } from "lambert-server";
import path from "path"; import path from "path";
import { storage } from "../../../../cdn/util/Storage";
const router: Router = Router(); const router: Router = Router();
@ -48,10 +49,10 @@ router.get(
const { guild_id } = req.params; const { guild_id } = req.params;
const guild = await Guild.findOneOrFail({ where: { id: guild_id } }); const guild = await Guild.findOneOrFail({ where: { id: guild_id } });
if (!guild.widget_enabled) throw new HTTPError("Unknown Guild", 404); if (!guild.widget_enabled) throw DiscordApiErrors.EMBED_DISABLED;
// Fetch guild information // Fetch guild information
const icon = guild.icon; const icon = "avatars/" + guild_id + "/" + guild.icon;
const name = guild.name; const name = guild.name;
const presence = guild.presence_count + " ONLINE"; const presence = guild.presence_count + " ONLINE";
@ -69,8 +70,7 @@ router.get(
} }
// Setup canvas // Setup canvas
const { createCanvas } = require("canvas"); const { createCanvas, loadImage } = require("canvas");
const { loadImage } = require("canvas");
const sizeOf = require("image-size"); const sizeOf = require("image-size");
// TODO: Widget style templates need Spacebar branding // TODO: Widget style templates need Spacebar branding
@ -211,8 +211,8 @@ async function drawIcon(
scale: number, scale: number,
icon: string, icon: string,
) { ) {
const img = new (require("canvas").Image)(); const { loadImage } = require("canvas");
img.src = icon; const img = await loadImage(await storage.get(icon));
// Do some canvas clipping magic! // Do some canvas clipping magic!
canvas.save(); canvas.save();

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,15 +20,11 @@ import { Router, Request, Response } from "express";
import { route } from "@spacebar/api"; import { route } from "@spacebar/api";
const router = Router(); const router = Router();
router.get( router.get("/", route({}), async (req: Request, res: Response) => {
"/scheduled-maintenances/upcoming.json", res.json({
route({}), page: {},
async (req: Request, res: Response) => { scheduled_maintenances: {},
res.json({ });
page: {}, });
scheduled_maintenances: {},
});
},
);
export default router; export default router;

View File

@ -1,29 +1,99 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
import { route } from "@spacebar/api"; import { route } from "@spacebar/api";
import {
Team,
TeamCreateSchema,
TeamMember,
TeamMemberRole,
TeamMemberState,
User,
} from "@spacebar/util";
import { HTTPError } from "lambert-server";
const router: Router = Router(); const router: Router = Router();
router.get("/", route({}), async (req: Request, res: Response) => { router.get(
//TODO "/",
res.send([]); route({
}); query: {
include_payout_account_status: {
type: "boolean",
description:
"Whether to include team payout account status in the response (default false)",
},
},
responses: {
200: {
body: "TeamListResponse",
},
},
}),
async (req: Request, res: Response) => {
const teams = await Team.find({
where: {
owner_user_id: req.user_id,
},
relations: ["members"],
});
res.send(teams);
},
);
router.post(
"/",
route({
requestBody: "TeamCreateSchema",
responses: {
200: {
body: "Team",
},
},
}),
async (req: Request, res: Response) => {
const user = await User.findOneOrFail({
where: [{ id: req.user_id }],
select: ["mfa_enabled"],
});
if (!user.mfa_enabled)
throw new HTTPError("You must enable MFA to create a team");
const body = req.body as TeamCreateSchema;
const team = Team.create({
name: body.name,
owner_user_id: req.user_id,
});
await team.save();
await TeamMember.create({
user_id: req.user_id,
team_id: team.id,
membership_state: TeamMemberState.ACCEPTED,
permissions: ["*"],
role: TeamMemberRole.ADMIN,
}).save();
res.json(team);
},
);
export default router; export default router;

View File

@ -155,8 +155,8 @@ router.patch(
if (check_username.length > maxUsername) { if (check_username.length > maxUsername) {
throw FieldErrors({ throw FieldErrors({
username: { username: {
code: "USERNAME_INVALID", code: "BASE_TYPE_BAD_LENGTH",
message: `Username must be less than ${maxUsername} in length`, message: `Must be between 2 and ${maxUsername} in length.`,
}, },
}); });
} }

View File

@ -82,6 +82,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
const identify: IdentifySchema = data.d; const identify: IdentifySchema = data.d;
this.capabilities = new Capabilities(identify.capabilities || 0); this.capabilities = new Capabilities(identify.capabilities || 0);
this.large_threshold = identify.large_threshold || 250;
const user = await tryGetUserFromToken(identify.token, { const user = await tryGetUserFromToken(identify.token, {
relations: ["relationships", "relationships.to", "settings"], relations: ["relationships", "relationships.to", "settings"],
@ -126,6 +127,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
os: identify.properties?.os || identify.properties?.$os, os: identify.properties?.os || identify.properties?.$os,
version: 0, version: 0,
}, },
client_status: {},
activities: identify.presence?.activities, // TODO: validation activities: identify.presence?.activities, // TODO: validation
}); });

View File

@ -17,6 +17,7 @@
*/ */
import { import {
getDatabase,
getPermission, getPermission,
GuildMembersChunkEvent, GuildMembersChunkEvent,
Member, Member,
@ -29,19 +30,24 @@ import { check } from "./instanceOf";
import { FindManyOptions, In, Like } from "typeorm"; import { FindManyOptions, In, Like } from "typeorm";
export async function onRequestGuildMembers(this: WebSocket, { d }: Payload) { export async function onRequestGuildMembers(this: WebSocket, { d }: Payload) {
// TODO: check data // Schema validation can only accept either string or array, so transforming it here to support both
if (!d.guild_id) throw new Error('"guild_id" is required');
d.guild_id = Array.isArray(d.guild_id) ? d.guild_id[0] : d.guild_id;
if (d.user_ids && !Array.isArray(d.user_ids)) d.user_ids = [d.user_ids];
check.call(this, RequestGuildMembersSchema, d); check.call(this, RequestGuildMembersSchema, d);
const { guild_id, query, presences, nonce } = const { query, presences, nonce } = d as RequestGuildMembersSchema;
d as RequestGuildMembersSchema; let { limit, user_ids, guild_id } = d as RequestGuildMembersSchema;
let { limit, user_ids } = d as RequestGuildMembersSchema;
guild_id = guild_id as string;
user_ids = user_ids as string[] | undefined;
if ("query" in d && (!limit || Number.isNaN(limit))) if ("query" in d && (!limit || Number.isNaN(limit)))
throw new Error('"query" requires "limit" to be set'); throw new Error('"query" requires "limit" to be set');
if ("query" in d && user_ids) if ("query" in d && user_ids)
throw new Error('"query" and "user_ids" are mutually exclusive'); throw new Error('"query" and "user_ids" are mutually exclusive');
if (user_ids && !Array.isArray(user_ids)) user_ids = [user_ids];
user_ids = user_ids as string[] | undefined;
// TODO: Configurable limit? // TODO: Configurable limit?
if ((query || (user_ids && user_ids.length > 0)) && (!limit || limit > 100)) if ((query || (user_ids && user_ids.length > 0)) && (!limit || limit > 100))
@ -50,24 +56,74 @@ export async function onRequestGuildMembers(this: WebSocket, { d }: Payload) {
const permissions = await getPermission(this.user_id, guild_id); const permissions = await getPermission(this.user_id, guild_id);
permissions.hasThrow("VIEW_CHANNEL"); permissions.hasThrow("VIEW_CHANNEL");
const whereQuery: FindManyOptions["where"] = {}; const memberCount = await Member.count({
if (query) { where: {
whereQuery.user = { guild_id,
username: Like(query + "%"), },
}; });
} else if (user_ids && user_ids.length > 0) {
whereQuery.id = In(user_ids);
}
const memberFind: FindManyOptions = { const memberFind: FindManyOptions = {
where: { where: {
...whereQuery,
guild_id, guild_id,
}, },
relations: ["user", "roles"], relations: ["user", "roles"],
}; };
if (limit) memberFind.take = Math.abs(Number(limit || 100)); if (limit) memberFind.take = Math.abs(Number(limit || 100));
const members = await Member.find(memberFind);
let members: Member[] = [];
if (memberCount > 75000) {
// since we dont have voice channels yet, just return the connecting users member object
members = await Member.find({
...memberFind,
where: {
...memberFind.where,
user: {
id: this.user_id,
},
},
});
} else if (memberCount > this.large_threshold) {
// find all members who are online, have a role, have a nickname, or are in a voice channel, as well as respecting the query and user_ids
const db = getDatabase();
if (!db) throw new Error("Database not initialized");
const repo = db.getRepository(Member);
const q = repo
.createQueryBuilder("member")
.where("member.guild_id = :guild_id", { guild_id })
.leftJoinAndSelect("member.roles", "role")
.leftJoinAndSelect("member.user", "user")
.leftJoinAndSelect("user.sessions", "session")
.andWhere(
"',' || member.roles || ',' NOT LIKE :everyoneRoleIdList",
{ everyoneRoleIdList: "%," + guild_id + ",%" },
)
.andWhere("session.status != 'offline'")
.addOrderBy("user.username", "ASC")
.limit(memberFind.take);
if (query && query != "") {
q.andWhere(`user.username ILIKE :query`, {
query: `${query}%`,
});
} else if (user_ids) {
q.andWhere(`user.id IN (:...user_ids)`, { user_ids });
}
members = await q.getMany();
} else {
if (query) {
// @ts-expect-error memberFind.where is very much defined
memberFind.where.user = {
username: Like(query + "%"),
};
} else if (user_ids && user_ids.length > 0) {
// @ts-expect-error memberFind.where is still very much defined
memberFind.where.id = In(user_ids);
}
members = await Member.find(memberFind);
}
const baseData = { const baseData = {
guild_id, guild_id,
@ -111,7 +167,17 @@ export async function onRequestGuildMembers(this: WebSocket, { d }: Payload) {
}); });
} }
if (notFound.length > 0) chunks[0].not_found = notFound; if (notFound.length > 0) {
if (chunks.length == 0)
chunks.push({
...baseData,
members: [],
presences: presences ? [] : undefined,
chunk_index: 0,
chunk_count: 1,
});
chunks[0].not_found = notFound;
}
chunks.forEach((chunk) => { chunks.forEach((chunk) => {
Send(this, { Send(this, {

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -43,4 +43,5 @@ export interface WebSocket extends WS {
listen_options: ListenEventOpts; listen_options: ListenEventOpts;
capabilities?: Capabilities; capabilities?: Capabilities;
// client?: Client; // client?: Client;
large_threshold: number;
} }

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -25,4 +25,6 @@ export class CdnConfiguration extends EndpointConfiguration {
endpointPublic: string | null = null; endpointPublic: string | null = null;
endpointPrivate: string | null = null; endpointPrivate: string | null = null;
proxyCacheHeaderSeconds: number = 60 * 60 * 24;
} }

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,8 +20,12 @@ import { Column, Entity, JoinColumn, ManyToOne, OneToOne } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Team } from "./Team"; import { Team } from "./Team";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
@Entity("applications") @Entity({
name: "applications",
engine: dbEngine,
})
export class Application extends BaseClass { export class Application extends BaseClass {
@Column() @Column()
name: string; name: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -27,8 +27,12 @@ import {
import { URL } from "url"; import { URL } from "url";
import { deleteFile } from "../util/cdn"; import { deleteFile } from "../util/cdn";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("attachments") @Entity({
name: "attachments",
engine: dbEngine,
})
export class Attachment extends BaseClass { export class Attachment extends BaseClass {
@Column() @Column()
filename: string; // name of file attached filename: string; // name of file attached

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,6 +20,7 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { ChannelPermissionOverwrite } from "./Channel"; import { ChannelPermissionOverwrite } from "./Channel";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
export enum AuditLogEvents { export enum AuditLogEvents {
// guild level // guild level
@ -111,7 +112,10 @@ export enum AuditLogEvents {
ROUTE_UPDATE = 226, ROUTE_UPDATE = 226,
} }
@Entity("audit_logs") @Entity({
name: "audit_logs",
engine: dbEngine,
})
export class AuditLog extends BaseClass { export class AuditLog extends BaseClass {
@JoinColumn({ name: "target_id" }) @JoinColumn({ name: "target_id" })
@ManyToOne(() => User) @ManyToOne(() => User)

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,8 +20,12 @@ import { Column, Entity, JoinColumn, ManyToOne } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { User } from "./User"; import { User } from "./User";
import crypto from "crypto"; import crypto from "crypto";
import { dbEngine } from "../util/Database";
@Entity("backup_codes") @Entity({
name: "backup_codes",
engine: dbEngine,
})
export class BackupCode extends BaseClass { export class BackupCode extends BaseClass {
@JoinColumn({ name: "user_id" }) @JoinColumn({ name: "user_id" })
@ManyToOne(() => User, { onDelete: "CASCADE" }) @ManyToOne(() => User, { onDelete: "CASCADE" })

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity } from "typeorm"; import { Column, Entity } from "typeorm";
import { BaseClassWithoutId } from "./BaseClass"; import { BaseClassWithoutId } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("badges") @Entity({
name: "badges",
engine: dbEngine,
})
export class Badge extends BaseClassWithoutId { export class Badge extends BaseClassWithoutId {
@Column({ primary: true }) @Column({ primary: true })
id: string; id: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,8 +20,12 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
@Entity("bans") @Entity({
name: "bans",
engine: dbEngine,
})
export class Ban extends BaseClass { export class Ban extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })
@RelationId((ban: Ban) => ban.user) @RelationId((ban: Ban) => ban.user)

View File

@ -18,6 +18,7 @@
import { Column, Entity } from "typeorm"; import { Column, Entity } from "typeorm";
import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass"; import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass";
import { dbEngine } from "../util/Database";
// TODO: categories: // TODO: categories:
// [{ // [{
@ -33,7 +34,10 @@ import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass";
// }] // }]
// Also populate discord default categories // Also populate discord default categories
@Entity("categories") @Entity({
name: "categories",
engine: dbEngine,
})
export class Categories extends BaseClassWithoutId { export class Categories extends BaseClassWithoutId {
// Not using snowflake // Not using snowflake

View File

@ -44,6 +44,7 @@ import { Recipient } from "./Recipient";
import { PublicUserProjection, User } from "./User"; import { PublicUserProjection, User } from "./User";
import { VoiceState } from "./VoiceState"; import { VoiceState } from "./VoiceState";
import { Webhook } from "./Webhook"; import { Webhook } from "./Webhook";
import { dbEngine } from "../util/Database";
export enum ChannelType { export enum ChannelType {
GUILD_TEXT = 0, // a text channel within a guild GUILD_TEXT = 0, // a text channel within a guild
@ -69,7 +70,10 @@ export enum ChannelType {
UNHANDLED = 255, // unhandled unowned pass-through channel type UNHANDLED = 255, // unhandled unowned pass-through channel type
} }
@Entity("channels") @Entity({
name: "channels",
engine: dbEngine,
})
export class Channel extends BaseClass { export class Channel extends BaseClass {
@Column() @Column()
created_at: Date; created_at: Date;
@ -459,9 +463,21 @@ export class Channel extends BaseClass {
} }
static async deleteChannel(channel: Channel) { static async deleteChannel(channel: Channel) {
await Message.delete({ channel_id: channel.id }); //TODO we should also delete the attachments from the cdn but to do that we need to move cdn.ts in util // TODO Delete attachments from the CDN for messages in the channel
//TODO before deleting the channel we should check and delete other relations
await Channel.delete({ id: channel.id }); await Channel.delete({ id: channel.id });
const guild = await Guild.findOneOrFail({
where: { id: channel.guild_id },
select: { channel_ordering: true },
});
const updatedOrdering = guild.channel_ordering.filter(
(id) => id != channel.id,
);
await Guild.update(
{ id: channel.guild_id },
{ channel_ordering: updatedOrdering },
);
} }
static async calculatePosition( static async calculatePosition(
@ -487,15 +503,19 @@ export class Channel extends BaseClass {
const channels = await Promise.all( const channels = await Promise.all(
guild.channel_ordering.map((id) => guild.channel_ordering.map((id) =>
Channel.findOneOrFail({ where: { id } }), Channel.findOne({ where: { id } }),
), ),
); );
return channels.reduce((r, v) => { return channels
v.position = (guild as Guild).channel_ordering.indexOf(v.id); .filter((channel) => channel !== null)
r[v.position] = v; .reduce((r, v) => {
return r; v = v as Channel;
}, [] as Array<Channel>);
v.position = (guild as Guild).channel_ordering.indexOf(v.id);
r[v.position] = v;
return r;
}, [] as Array<Channel>);
} }
isDm() { isDm() {

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity } from "typeorm"; import { Column, Entity } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("client_release") @Entity({
name: "client_release",
engine: dbEngine,
})
export class Release extends BaseClass { export class Release extends BaseClass {
@Column() @Column()
name: string; name: string;

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity } from "typeorm"; import { Column, Entity } from "typeorm";
import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass"; import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("config") @Entity({
name: "config",
engine: dbEngine,
})
export class ConfigEntity extends BaseClassWithoutId { export class ConfigEntity extends BaseClassWithoutId {
@PrimaryIdColumn() @PrimaryIdColumn()
key: string; key: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,13 +20,17 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { ConnectedAccountTokenData } from "../interfaces"; import { ConnectedAccountTokenData } from "../interfaces";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
export type PublicConnectedAccount = Pick< export type PublicConnectedAccount = Pick<
ConnectedAccount, ConnectedAccount,
"name" | "type" | "verified" "name" | "type" | "verified"
>; >;
@Entity("connected_accounts") @Entity({
name: "connected_accounts",
engine: dbEngine,
})
export class ConnectedAccount extends BaseClass { export class ConnectedAccount extends BaseClass {
@Column() @Column()
external_id: string; external_id: string;

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity } from "typeorm"; import { Column, Entity } from "typeorm";
import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass"; import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("connection_config") @Entity({
name: "connection_config",
engine: dbEngine,
})
export class ConnectionConfigEntity extends BaseClassWithoutId { export class ConnectionConfigEntity extends BaseClassWithoutId {
@PrimaryIdColumn() @PrimaryIdColumn()
key: string; key: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -19,8 +19,12 @@
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Entity, Column } from "typeorm"; import { Entity, Column } from "typeorm";
import { Embed } from "./Message"; import { Embed } from "./Message";
import { dbEngine } from "../util/Database";
@Entity("embed_cache") @Entity({
name: "embed_cache",
engine: dbEngine,
})
export class EmbedCache extends BaseClass { export class EmbedCache extends BaseClass {
@Column() @Column()
url: string; url: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,8 +20,12 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { User } from "."; import { User } from ".";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { dbEngine } from "../util/Database";
@Entity("emojis") @Entity({
name: "emojis",
engine: dbEngine,
})
export class Emoji extends BaseClass { export class Emoji extends BaseClass {
@Column() @Column()
animated: boolean; animated: boolean;

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity } from "typeorm"; import { Column, Entity } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("security_settings") @Entity({
name: "security_settings",
engine: dbEngine,
})
export class SecuritySettings extends BaseClass { export class SecuritySettings extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })
guild_id: string; guild_id: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -37,6 +37,7 @@ import { Template } from "./Template";
import { User } from "./User"; import { User } from "./User";
import { VoiceState } from "./VoiceState"; import { VoiceState } from "./VoiceState";
import { Webhook } from "./Webhook"; import { Webhook } from "./Webhook";
import { dbEngine } from "../util/Database";
// TODO: application_command_count, application_command_counts: {1: 0, 2: 0, 3: 0} // TODO: application_command_count, application_command_counts: {1: 0, 2: 0, 3: 0}
// TODO: guild_scheduled_events // TODO: guild_scheduled_events
@ -66,7 +67,10 @@ export const PublicGuildRelations = [
// "members.user", // "members.user",
]; ];
@Entity("guilds") @Entity({
name: "guilds",
engine: dbEngine,
})
export class Guild extends BaseClass { export class Guild extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })
@RelationId((guild: Guild) => guild.afk_channel) @RelationId((guild: Guild) => guild.afk_channel)

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -22,10 +22,14 @@ import { Channel } from "./Channel";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { Member } from "./Member"; import { Member } from "./Member";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
export const PublicInviteRelation = ["inviter", "guild", "channel"]; export const PublicInviteRelation = ["inviter", "guild", "channel"];
@Entity("invites") @Entity({
name: "invites",
engine: dbEngine,
})
export class Invite extends BaseClassWithoutId { export class Invite extends BaseClassWithoutId {
@PrimaryIdColumn() @PrimaryIdColumn()
code: string; code: string;

View File

@ -48,6 +48,7 @@ import { Guild } from "./Guild";
import { Message } from "./Message"; import { Message } from "./Message";
import { Role } from "./Role"; import { Role } from "./Role";
import { PublicUser, User } from "./User"; import { PublicUser, User } from "./User";
import { dbEngine } from "../util/Database";
export const MemberPrivateProjection: (keyof Member)[] = [ export const MemberPrivateProjection: (keyof Member)[] = [
"id", "id",
@ -65,7 +66,10 @@ export const MemberPrivateProjection: (keyof Member)[] = [
"user", "user",
]; ];
@Entity("members") @Entity({
name: "members",
engine: dbEngine,
})
@Index(["id", "guild_id"], { unique: true }) @Index(["id", "guild_id"], { unique: true })
export class Member extends BaseClassWithoutId { export class Member extends BaseClassWithoutId {
@PrimaryGeneratedColumn() @PrimaryGeneratedColumn()
@ -290,7 +294,9 @@ export class Member extends BaseClassWithoutId {
}, },
relations: ["user"], relations: ["user"],
}); });
member.nick = nickname;
// @ts-expect-error Member nickname is nullable
member.nick = nickname || null;
await Promise.all([ await Promise.all([
member.save(), member.save(),
@ -300,7 +306,7 @@ export class Member extends BaseClassWithoutId {
data: { data: {
guild_id, guild_id,
user: member.user, user: member.user,
nick: nickname, nick: nickname || null,
}, },
guild_id, guild_id,
} as GuildMemberUpdateEvent), } as GuildMemberUpdateEvent),

View File

@ -39,6 +39,7 @@ import { Guild } from "./Guild";
import { Webhook } from "./Webhook"; import { Webhook } from "./Webhook";
import { Sticker } from "./Sticker"; import { Sticker } from "./Sticker";
import { Attachment } from "./Attachment"; import { Attachment } from "./Attachment";
import { dbEngine } from "../util/Database";
export enum MessageType { export enum MessageType {
DEFAULT = 0, DEFAULT = 0,
@ -68,7 +69,10 @@ export enum MessageType {
UNHANDLED = 255, UNHANDLED = 255,
} }
@Entity("messages") @Entity({
name: "messages",
engine: dbEngine,
})
@Index(["channel_id", "id"], { unique: true }) @Index(["channel_id", "id"], { unique: true })
export class Message extends BaseClass { export class Message extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -23,6 +23,7 @@ import {
PrimaryGeneratedColumn, PrimaryGeneratedColumn,
BaseEntity, BaseEntity,
} from "typeorm"; } from "typeorm";
import { dbEngine } from "../util/Database";
export const PrimaryIdAutoGenerated = process.env.DATABASE?.startsWith( export const PrimaryIdAutoGenerated = process.env.DATABASE?.startsWith(
"mongodb", "mongodb",
@ -30,7 +31,10 @@ export const PrimaryIdAutoGenerated = process.env.DATABASE?.startsWith(
? ObjectIdColumn ? ObjectIdColumn
: PrimaryGeneratedColumn; : PrimaryGeneratedColumn;
@Entity("migrations") @Entity({
name: "migrations",
engine: dbEngine,
})
export class Migration extends BaseEntity { export class Migration extends BaseEntity {
@PrimaryIdAutoGenerated() @PrimaryIdAutoGenerated()
id: number; id: number;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -19,8 +19,12 @@
import { Column, Entity, JoinColumn, ManyToOne, Unique } from "typeorm"; import { Column, Entity, JoinColumn, ManyToOne, Unique } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
@Entity("notes") @Entity({
name: "notes",
engine: dbEngine,
})
@Unique(["owner", "target"]) @Unique(["owner", "target"])
export class Note extends BaseClass { export class Note extends BaseClass {
@JoinColumn({ name: "owner_id" }) @JoinColumn({ name: "owner_id" })

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity } from "typeorm"; import { Column, Entity } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("rate_limits") @Entity({
name: "rate_limits",
engine: dbEngine,
})
export class RateLimit extends BaseClass { export class RateLimit extends BaseClass {
@Column() // no relation as it also @Column() // no relation as it also
executor_id: string; executor_id: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -27,12 +27,16 @@ import {
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Channel } from "./Channel"; import { Channel } from "./Channel";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
// for read receipts // for read receipts
// notification cursor and public read receipt need to be forwards-only (the former to prevent re-pinging when marked as unread, and the latter to be acceptable as a legal acknowledgement in criminal proceedings), and private read marker needs to be advance-rewind capable // notification cursor and public read receipt need to be forwards-only (the former to prevent re-pinging when marked as unread, and the latter to be acceptable as a legal acknowledgement in criminal proceedings), and private read marker needs to be advance-rewind capable
// public read receipt ≥ notification cursor ≥ private fully read marker // public read receipt ≥ notification cursor ≥ private fully read marker
@Entity("read_states") @Entity({
name: "read_states",
engine: dbEngine,
})
@Index(["channel_id", "user_id"], { unique: true }) @Index(["channel_id", "user_id"], { unique: true })
export class ReadState extends BaseClass { export class ReadState extends BaseClass {
@Column() @Column()

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("recipients") @Entity({
name: "recipients",
engine: dbEngine,
})
export class Recipient extends BaseClass { export class Recipient extends BaseClass {
@Column() @Column()
@RelationId((recipient: Recipient) => recipient.channel) @RelationId((recipient: Recipient) => recipient.channel)

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -26,6 +26,7 @@ import {
} from "typeorm"; } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
export enum RelationshipType { export enum RelationshipType {
outgoing = 4, outgoing = 4,
@ -34,7 +35,10 @@ export enum RelationshipType {
friends = 1, friends = 1,
} }
@Entity("relationships") @Entity({
name: "relationships",
engine: dbEngine,
})
@Index(["from_id", "to_id"], { unique: true }) @Index(["from_id", "to_id"], { unique: true })
export class Relationship extends BaseClass { export class Relationship extends BaseClass {
@Column({}) @Column({})

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,8 +20,12 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { dbEngine } from "../util/Database";
@Entity("roles") @Entity({
name: "roles",
engine: dbEngine,
})
export class Role extends BaseClass { export class Role extends BaseClass {
@Column() @Column()
@RelationId((role: Role) => role.guild) @RelationId((role: Role) => role.guild)

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -19,8 +19,12 @@
import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
@Entity("security_keys") @Entity({
name: "security_keys",
engine: dbEngine,
})
export class SecurityKey extends BaseClass { export class SecurityKey extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })
@RelationId((key: SecurityKey) => key.user) @RelationId((key: SecurityKey) => key.user)

View File

@ -21,10 +21,14 @@ import { BaseClass } from "./BaseClass";
import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { ClientStatus, Status } from "../interfaces/Status"; import { ClientStatus, Status } from "../interfaces/Status";
import { Activity } from "../interfaces/Activity"; import { Activity } from "../interfaces/Activity";
import { dbEngine } from "../util/Database";
//TODO we need to remove all sessions on server start because if the server crashes without closing websockets it won't delete them //TODO we need to remove all sessions on server start because if the server crashes without closing websockets it won't delete them
@Entity("sessions") @Entity({
name: "sessions",
engine: dbEngine,
})
export class Session extends BaseClass { export class Session extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })
@RelationId((session: Session) => session.user) @RelationId((session: Session) => session.user)

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,6 +20,7 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
export enum StickerType { export enum StickerType {
STANDARD = 1, STANDARD = 1,
@ -33,7 +34,10 @@ export enum StickerFormatType {
LOTTIE = 3, LOTTIE = 3,
} }
@Entity("stickers") @Entity({
name: "stickers",
engine: dbEngine,
})
export class Sticker extends BaseClass { export class Sticker extends BaseClass {
@Column() @Column()
name: string; name: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -26,8 +26,12 @@ import {
} from "typeorm"; } from "typeorm";
import { Sticker } from "."; import { Sticker } from ".";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("sticker_packs") @Entity({
name: "sticker_packs",
engine: dbEngine,
})
export class StickerPack extends BaseClass { export class StickerPack extends BaseClass {
@Column() @Column()
name: string; name: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -27,8 +27,12 @@ import {
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { TeamMember } from "./TeamMember"; import { TeamMember } from "./TeamMember";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
@Entity("teams") @Entity({
name: "teams",
engine: dbEngine,
})
export class Team extends BaseClass { export class Team extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })
icon?: string; icon?: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -19,13 +19,22 @@
import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
export enum TeamMemberState { export enum TeamMemberState {
INVITED = 1, INVITED = 1,
ACCEPTED = 2, ACCEPTED = 2,
} }
export enum TeamMemberRole {
ADMIN = "admin",
DEVELOPER = "developer",
READ_ONLY = "read_only",
}
@Entity("team_members") @Entity({
name: "team_members",
engine: dbEngine,
})
export class TeamMember extends BaseClass { export class TeamMember extends BaseClass {
@Column({ type: "int" }) @Column({ type: "int" })
membership_state: TeamMemberState; membership_state: TeamMemberState;
@ -33,6 +42,9 @@ export class TeamMember extends BaseClass {
@Column({ type: "simple-array" }) @Column({ type: "simple-array" })
permissions: string[]; permissions: string[];
@Column()
role: TeamMemberRole;
@Column({ nullable: true }) @Column({ nullable: true })
@RelationId((member: TeamMember) => member.team) @RelationId((member: TeamMember) => member.team)
team_id: string; team_id: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -20,8 +20,12 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass"; import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
@Entity("templates") @Entity({
name: "templates",
engine: dbEngine,
})
export class Template extends BaseClass { export class Template extends BaseClass {
@Column({ unique: true }) @Column({ unique: true })
code: string; code: string;

View File

@ -34,6 +34,7 @@ import { Relationship } from "./Relationship";
import { SecurityKey } from "./SecurityKey"; import { SecurityKey } from "./SecurityKey";
import { Session } from "./Session"; import { Session } from "./Session";
import { UserSettings } from "./UserSettings"; import { UserSettings } from "./UserSettings";
import { dbEngine } from "../util/Database";
export enum PublicUserEnum { export enum PublicUserEnum {
username, username,
@ -86,7 +87,10 @@ export interface UserPrivate extends Pick<User, PrivateUserKeys> {
locale: string; locale: string;
} }
@Entity("users") @Entity({
name: "users",
engine: dbEngine,
})
export class User extends BaseClass { export class User extends BaseClass {
@Column() @Column()
username: string; // username max length 32, min 2 (should be configurable) username: string; // username max length 32, min 2 (should be configurable)

View File

@ -1,25 +1,29 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
import { BaseClassWithoutId } from "./BaseClass"; import { BaseClassWithoutId } from "./BaseClass";
import { dbEngine } from "../util/Database";
@Entity("user_settings") @Entity({
name: "user_settings",
engine: dbEngine,
})
export class UserSettings extends BaseClassWithoutId { export class UserSettings extends BaseClassWithoutId {
@PrimaryGeneratedColumn() @PrimaryGeneratedColumn()
index: string; index: string;

View File

@ -1,24 +1,28 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { BaseEntity, Column, Entity, PrimaryColumn } from "typeorm"; import { BaseEntity, Column, Entity, PrimaryColumn } from "typeorm";
import { dbEngine } from "../util/Database";
@Entity("valid_registration_tokens") @Entity({
name: "valid_registration_tokens",
engine: dbEngine,
})
export class ValidRegistrationToken extends BaseEntity { export class ValidRegistrationToken extends BaseEntity {
@PrimaryColumn() @PrimaryColumn()
token: string; token: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -22,9 +22,13 @@ import { Channel } from "./Channel";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { Member } from "./Member"; import { Member } from "./Member";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
//https://gist.github.com/vassjozsef/e482c65df6ee1facaace8b3c9ff66145#file-voice_state-ex //https://gist.github.com/vassjozsef/e482c65df6ee1facaace8b3c9ff66145#file-voice_state-ex
@Entity("voice_states") @Entity({
name: "voice_states",
engine: dbEngine,
})
export class VoiceState extends BaseClass { export class VoiceState extends BaseClass {
@Column({ nullable: true }) @Column({ nullable: true })
@RelationId((voice_state: VoiceState) => voice_state.guild) @RelationId((voice_state: VoiceState) => voice_state.guild)

View File

@ -22,6 +22,7 @@ import { BaseClass } from "./BaseClass";
import { Channel } from "./Channel"; import { Channel } from "./Channel";
import { Guild } from "./Guild"; import { Guild } from "./Guild";
import { User } from "./User"; import { User } from "./User";
import { dbEngine } from "../util/Database";
export enum WebhookType { export enum WebhookType {
Incoming = 1, Incoming = 1,
@ -29,7 +30,10 @@ export enum WebhookType {
Application = 3, Application = 3,
} }
@Entity("webhooks") @Entity({
name: "webhooks",
engine: dbEngine,
})
export class Webhook extends BaseClass { export class Webhook extends BaseClass {
@Column({ type: "int" }) @Column({ type: "int" })
type: WebhookType; type: WebhookType;

23
src/util/imports/Jimp.ts Normal file
View File

@ -0,0 +1,23 @@
/*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/* eslint-disable @typescript-eslint/no-explicit-any */
export type JimpType = {
read: (data: Buffer) => Promise<any>;
};

View File

@ -18,3 +18,4 @@
export * from "./OrmUtils"; export * from "./OrmUtils";
export * from "./Erlpack"; export * from "./Erlpack";
export * from "./Jimp";

View File

@ -28,7 +28,6 @@ import {
Role, Role,
Emoji, Emoji,
PublicMember, PublicMember,
Guild,
Channel, Channel,
PublicUser, PublicUser,
User, User,
@ -43,6 +42,7 @@ import {
ReadyUserGuildSettingsEntries, ReadyUserGuildSettingsEntries,
ReadyPrivateChannel, ReadyPrivateChannel,
GuildOrUnavailable, GuildOrUnavailable,
GuildCreateResponse,
} from "@spacebar/util"; } from "@spacebar/util";
export interface Event { export interface Event {
@ -195,7 +195,7 @@ export interface GuildCreateEvent extends Event {
export interface GuildUpdateEvent extends Event { export interface GuildUpdateEvent extends Event {
event: "GUILD_UPDATE"; event: "GUILD_UPDATE";
data: Guild; data: GuildCreateResponse;
} }
export interface GuildDeleteEvent extends Event { export interface GuildDeleteEvent extends Event {

View File

@ -0,0 +1,17 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class TeamMemberRole1724477620293 implements MigrationInterface {
name = "TeamMemberRole1724477620293";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
"ALTER TABLE `team_members` ADD COLUMN `role` VARCHAR(255) NOT NULL AFTER `permissions`",
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
"ALTER TABLE `team_members` DROP COLUMN `role`",
);
}
}

View File

@ -0,0 +1,17 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class TeamMemberRole1724477620293 implements MigrationInterface {
name = "TeamMemberRole1724477620293";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
"ALTER TABLE `team_members` ADD COLUMN `role` VARCHAR(255) NOT NULL AFTER `permissions`",
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
"ALTER TABLE `team_members` DROP COLUMN `role`",
);
}
}

View File

@ -0,0 +1,15 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class TeamMemberRole1724477620293 implements MigrationInterface {
name = "TeamMemberRole1724477620293";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
"ALTER TABLE team_members ADD COLUMN role text NOT NULL",
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query("ALTER TABLE team_members DROP COLUMN role");
}
}

View File

@ -1,22 +1,22 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
export interface ApplicationCreateSchema { export interface ApplicationCreateSchema {
name: string; name: string;
team_id?: string | number; team_id?: string;
} }

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -26,7 +26,6 @@ export interface GuildCreateSchema {
region?: string; region?: string;
icon?: string | null; icon?: string | null;
channels?: ChannelModifySchema[]; channels?: ChannelModifySchema[];
guild_template_code?: string;
system_channel_id?: string; system_channel_id?: string;
rules_channel_id?: string; rules_channel_id?: string;
} }

View File

@ -1,26 +1,24 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { GuildCreateSchema } from "@spacebar/util"; import { GuildCreateSchema } from "@spacebar/util";
export interface GuildUpdateSchema export interface GuildUpdateSchema extends Omit<GuildCreateSchema, "channels"> {
extends Omit<GuildCreateSchema, "channels" | "name"> {
name?: string;
banner?: string | null; banner?: string | null;
splash?: string | null; splash?: string | null;
description?: string; description?: string;

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -19,7 +19,6 @@
export interface RegisterSchema { export interface RegisterSchema {
/** /**
* @minLength 2 * @minLength 2
* @maxLength 32
*/ */
username: string; username: string;
/** /**

View File

@ -17,7 +17,7 @@
*/ */
export interface RequestGuildMembersSchema { export interface RequestGuildMembersSchema {
guild_id: string; guild_id: string | [string];
query?: string; query?: string;
limit?: number; limit?: number;
presences?: boolean; presences?: boolean;
@ -26,7 +26,7 @@ export interface RequestGuildMembersSchema {
} }
export const RequestGuildMembersSchema = { export const RequestGuildMembersSchema = {
guild_id: String, guild_id: "" as string | string[],
$query: String, $query: String,
$limit: Number, $limit: Number,
$presences: Boolean, $presences: Boolean,

View File

@ -0,0 +1,21 @@
/*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export interface TeamCreateSchema {
name: string;
}

View File

@ -18,8 +18,7 @@
export interface UserModifySchema { export interface UserModifySchema {
/** /**
* @minLength 1 * @minLength 2
* @maxLength 100
*/ */
username?: string; username?: string;
avatar?: string | null; avatar?: string | null;

View File

@ -62,6 +62,7 @@ export * from "./RequestGuildMembersSchema";
export * from "./RoleModifySchema"; export * from "./RoleModifySchema";
export * from "./RolePositionUpdateSchema"; export * from "./RolePositionUpdateSchema";
export * from "./SelectProtocolSchema"; export * from "./SelectProtocolSchema";
export * from "./TeamCreateSchema";
export * from "./TemplateCreateSchema"; export * from "./TemplateCreateSchema";
export * from "./TemplateModifySchema"; export * from "./TemplateModifySchema";
export * from "./TotpDisableSchema"; export * from "./TotpDisableSchema";

View File

@ -1,21 +1,42 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
export interface GuildCreateResponse { import { GuildUpdateSchema, GuildWelcomeScreen } from "@spacebar/util";
export interface GuildCreateResponse extends Omit<GuildUpdateSchema, "name"> {
id: string; id: string;
name: string;
primary_category_id: string | undefined;
large: boolean | undefined;
max_members: number | undefined;
max_presences: number | undefined;
max_video_channel_users: number | undefined;
member_count: number | undefined;
presence_count: number | undefined;
template_id: string | undefined;
mfa_level: number | undefined;
owner_id: string | undefined;
premium_subscription_count: number | undefined;
premium_tier: number | undefined;
welcome_screen: GuildWelcomeScreen;
widget_channel_id: string | undefined;
widget_enabled: boolean;
nsfw_level: number | undefined;
nsfw: boolean;
parent: string | undefined;
} }

View File

@ -1,25 +1,26 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Emoji, Guild, Role, Sticker } from "../../entities"; import { GuildCreateResponse } from "@spacebar/util";
import { Emoji, Role, Sticker } from "../../entities";
export interface MemberJoinGuildResponse { export interface MemberJoinGuildResponse {
guild: Guild; guild: GuildCreateResponse;
emojis: Emoji[]; emojis: Emoji[];
roles: Role[]; roles: Role[];
stickers: Sticker[]; stickers: Sticker[];

View File

@ -0,0 +1,21 @@
/*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { Team } from "@spacebar/util";
export interface TeamListResponse extends Array<Team> {}

View File

@ -16,6 +16,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { GuildCreateResponse } from "@spacebar/util";
import { GeneralConfiguration, LimitsConfiguration } from "../../config"; import { GeneralConfiguration, LimitsConfiguration } from "../../config";
import { DmChannelDTO } from "../../dtos"; import { DmChannelDTO } from "../../dtos";
import { import {
@ -89,7 +90,7 @@ export type APIEmojiArray = Emoji[];
export type APIMemberArray = Member[]; export type APIMemberArray = Member[];
export type APIPublicMember = PublicMember; export type APIPublicMember = PublicMember;
export interface APIGuildWithJoinedAt extends Guild { export interface APIGuildWithJoinedAt extends GuildCreateResponse {
joined_at: string; joined_at: string;
} }

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -40,6 +40,7 @@ export * from "./InstanceStatsResponse";
export * from "./LocationMetadataResponse"; export * from "./LocationMetadataResponse";
export * from "./MemberJoinGuildResponse"; export * from "./MemberJoinGuildResponse";
export * from "./OAuthAuthorizeResponse"; export * from "./OAuthAuthorizeResponse";
export * from "./TeamListResponse";
export * from "./Tenor"; export * from "./Tenor";
export * from "./TokenResponse"; export * from "./TokenResponse";
export * from "./TypedResponses"; export * from "./TypedResponses";

View File

@ -812,7 +812,7 @@ export const DiscordApiErrors = {
"Cannot execute action on a DM channel", "Cannot execute action on a DM channel",
50003, 50003,
), ),
EMBED_DISABLED: new ApiError("Guild widget disabled", 50004), EMBED_DISABLED: new ApiError("Widget Disabled", 50004),
CANNOT_EDIT_MESSAGE_BY_OTHER: new ApiError( CANNOT_EDIT_MESSAGE_BY_OTHER: new ApiError(
"Cannot edit a message authored by another user", "Cannot edit a message authored by another user",
50005, 50005,

View File

@ -1,17 +1,17 @@
/* /*
Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
Copyright (C) 2023 Spacebar and Spacebar Contributors Copyright (C) 2023 Spacebar and Spacebar Contributors
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@ -134,3 +134,6 @@ export { DataSourceOptions, DatabaseType, dbConnection };
export async function closeDatabase() { export async function closeDatabase() {
await dbConnection?.destroy(); await dbConnection?.destroy();
} }
export const dbEngine =
"InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";

BIN
src/webrtc/.DS_Store vendored

Binary file not shown.