mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-22 02:12:40 +01:00
🎨 clean up imports + classes
This commit is contained in:
parent
dbe2258d97
commit
dc85a79498
4
.gitignore
vendored
4
.gitignore
vendored
@ -5,4 +5,6 @@ node_modules
|
|||||||
api/assets/*.js
|
api/assets/*.js
|
||||||
api/assets/*.css
|
api/assets/*.css
|
||||||
database.db
|
database.db
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
|
files/
|
||||||
|
.env
|
@ -1,13 +1,10 @@
|
|||||||
import { OptionsJson } from "body-parser";
|
|
||||||
import "missing-native-js-functions";
|
import "missing-native-js-functions";
|
||||||
import { Connection } from "mongoose";
|
|
||||||
import { Server, ServerOptions } from "lambert-server";
|
import { Server, ServerOptions } from "lambert-server";
|
||||||
import { Authentication, CORS } from "./middlewares/";
|
import { Authentication, CORS } from "./middlewares/";
|
||||||
import { Config, initDatabase, initEvent } from "@fosscord/util";
|
import { Config, initDatabase, initEvent } from "@fosscord/util";
|
||||||
import { ErrorHandler } from "./middlewares/ErrorHandler";
|
import { ErrorHandler } from "./middlewares/ErrorHandler";
|
||||||
import { BodyParser } from "./middlewares/BodyParser";
|
import { BodyParser } from "./middlewares/BodyParser";
|
||||||
import { Router, Request, Response, NextFunction } from "express";
|
import { Router, Request, Response, NextFunction } from "express";
|
||||||
import mongoose from "mongoose";
|
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { initRateLimits } from "./middlewares/RateLimit";
|
import { initRateLimits } from "./middlewares/RateLimit";
|
||||||
import TestClient from "./middlewares/TestClient";
|
import TestClient from "./middlewares/TestClient";
|
||||||
|
@ -2,7 +2,7 @@ import { Router, Request, Response } from "express";
|
|||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { random } from "@fosscord/api";
|
import { random } from "@fosscord/api";
|
||||||
import { getPermission, Channel, Invite, InviteCreateEvent, emitEvent, User, Guild, PublicInviteRelation } from "@fosscord/util";
|
import { Channel, Invite, InviteCreateEvent, emitEvent, User, Guild, PublicInviteRelation } from "@fosscord/util";
|
||||||
import { isTextChannel } from "./messages";
|
import { isTextChannel } from "./messages";
|
||||||
|
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
|
@ -22,7 +22,7 @@ const router: Router = Router();
|
|||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
||||||
function isTextChannel(type: ChannelType): boolean {
|
export function isTextChannel(type: ChannelType): boolean {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ChannelType.GUILD_STORE:
|
case ChannelType.GUILD_STORE:
|
||||||
case ChannelType.GUILD_VOICE:
|
case ChannelType.GUILD_VOICE:
|
||||||
@ -39,7 +39,6 @@ function isTextChannel(type: ChannelType): boolean {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
module.exports.isTextChannel = isTextChannel;
|
|
||||||
|
|
||||||
export interface MessageCreateSchema {
|
export interface MessageCreateSchema {
|
||||||
content?: string;
|
content?: string;
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
const jwa = require("jwa");
|
|
||||||
|
|
||||||
var STR64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".split("");
|
|
||||||
|
|
||||||
function base64url(string: string, encoding: string) {
|
|
||||||
// @ts-ignore
|
|
||||||
return Buffer.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
||||||
}
|
|
||||||
|
|
||||||
function to64String(input: number, current = ""): string {
|
|
||||||
if (input < 0 && current.length == 0) {
|
|
||||||
input = input * -1;
|
|
||||||
}
|
|
||||||
var modify = input % 64;
|
|
||||||
var remain = Math.floor(input / 64);
|
|
||||||
var result = STR64[modify] + current;
|
|
||||||
return remain <= 0 ? result : to64String(remain, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
function to64Parse(input: string) {
|
|
||||||
var result = 0;
|
|
||||||
var toProc = input.split("");
|
|
||||||
var e;
|
|
||||||
for (e in toProc) {
|
|
||||||
result = result * 64 + STR64.indexOf(toProc[e]);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
const start = `${base64url("311129357362135041")}.${to64String(Date.now())}`;
|
|
||||||
const signature = jwa("HS256").sign(start, `test`);
|
|
||||||
const token = `${start}.${signature}`;
|
|
||||||
console.log(token);
|
|
||||||
|
|
||||||
// MzExMTI5MzU3MzYyMTM1MDQx.XdQb_rA.907VgF60kocnOTl32MSUWGSSzbAytQ0jbt36KjLaxuY
|
|
||||||
// MzExMTI5MzU3MzYyMTM1MDQx.XdQbaPy.4vGx4L7IuFJGsRe6IL3BeybLIvbx4Vauvx12pwNsy2U
|
|
@ -1,13 +0,0 @@
|
|||||||
import jwt from "jsonwebtoken";
|
|
||||||
|
|
||||||
const algorithm = "HS256";
|
|
||||||
const iat = Math.floor(Date.now() / 1000);
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
const token = jwt.sign({ id: "311129357362135041" }, "secret", {
|
|
||||||
algorithm,
|
|
||||||
});
|
|
||||||
console.log(token);
|
|
||||||
|
|
||||||
const decoded = jwt.verify(token, "secret", { algorithms: [algorithm] });
|
|
||||||
console.log(decoded);
|
|
@ -1,12 +0,0 @@
|
|||||||
import { checkPassword } from "@fosscord/api";
|
|
||||||
|
|
||||||
console.log(checkPassword("123456789012345"));
|
|
||||||
// -> 0.25
|
|
||||||
console.log(checkPassword("ABCDEFGHIJKLMOPQ"));
|
|
||||||
// -> 0.25
|
|
||||||
console.log(checkPassword("ABC123___...123"));
|
|
||||||
// ->
|
|
||||||
console.log(checkPassword(""));
|
|
||||||
// ->
|
|
||||||
// console.log(checkPassword(""));
|
|
||||||
// // ->
|
|
@ -24,6 +24,7 @@ export async function Connection(
|
|||||||
request: IncomingMessage
|
request: IncomingMessage
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
|
// @ts-ignore
|
||||||
socket.on("close", Close);
|
socket.on("close", Close);
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
socket.on("message", Message);
|
socket.on("message", Message);
|
||||||
@ -68,12 +69,10 @@ export async function Connection(
|
|||||||
});
|
});
|
||||||
|
|
||||||
socket.readyTimeout = setTimeout(() => {
|
socket.readyTimeout = setTimeout(() => {
|
||||||
Session.delete({ session_id: socket.session_id }); //should we await?
|
|
||||||
return socket.close(CLOSECODES.Session_timed_out);
|
return socket.close(CLOSECODES.Session_timed_out);
|
||||||
}, 1000 * 30);
|
}, 1000 * 30);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
Session.delete({ session_id: socket.session_id }); //should we await?
|
|
||||||
return socket.close(CLOSECODES.Unknown_error);
|
return socket.close(CLOSECODES.Unknown_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) {
|
|||||||
const items = [];
|
const items = [];
|
||||||
|
|
||||||
for (const role of roles) {
|
for (const role of roles) {
|
||||||
|
// @ts-ignore
|
||||||
const [role_members, other_members] = partition(members, (m: Member) =>
|
const [role_members, other_members] = partition(members, (m: Member) =>
|
||||||
m.roles.find((r) => r.id === role.id)
|
m.roles.find((r) => r.id === role.id)
|
||||||
);
|
);
|
||||||
@ -53,9 +54,12 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) {
|
|||||||
groups.push(group);
|
groups.push(group);
|
||||||
|
|
||||||
for (const member of role_members) {
|
for (const member of role_members) {
|
||||||
member.roles = member.roles.filter((x) => x.id !== guild_id);
|
member.roles = member.roles.filter((x: Role) => x.id !== guild_id);
|
||||||
items.push({
|
items.push({
|
||||||
member: { ...member, roles: member.roles.map((x) => x.id) },
|
member: {
|
||||||
|
...member,
|
||||||
|
roles: member.roles.map((x: Role) => x.id),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
members = other_members;
|
members = other_members;
|
||||||
@ -84,7 +88,9 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function partition<T>(array: T[], isValid: Function) {
|
function partition<T>(array: T[], isValid: Function) {
|
||||||
|
// @ts-ignore
|
||||||
return array.reduce(
|
return array.reduce(
|
||||||
|
// @ts-ignore
|
||||||
([pass, fail], elem) => {
|
([pass, fail], elem) => {
|
||||||
return isValid(elem)
|
return isValid(elem)
|
||||||
? [[...pass, elem], fail]
|
? [[...pass, elem], fail]
|
||||||
|
@ -1,19 +1,8 @@
|
|||||||
import "reflect-metadata";
|
import "reflect-metadata";
|
||||||
import {
|
import { BaseEntity, EntityMetadata, FindConditions, ObjectIdColumn, PrimaryColumn } from "typeorm";
|
||||||
BaseEntity,
|
|
||||||
BeforeInsert,
|
|
||||||
BeforeUpdate,
|
|
||||||
EntityMetadata,
|
|
||||||
FindConditions,
|
|
||||||
ObjectIdColumn,
|
|
||||||
PrimaryColumn,
|
|
||||||
} from "typeorm";
|
|
||||||
import { Snowflake } from "../util/Snowflake";
|
import { Snowflake } from "../util/Snowflake";
|
||||||
import "missing-native-js-functions";
|
import "missing-native-js-functions";
|
||||||
|
|
||||||
// TODO use class-validator https://typeorm.io/#/validation with class annotators (isPhone/isEmail) combined with types from typescript-json-schema
|
|
||||||
// btw. we don't use class-validator for everything, because we need to explicitly set the type instead of deriving it from typescript also it doesn't easily support nested objects
|
|
||||||
|
|
||||||
export class BaseClassWithoutId extends BaseEntity {
|
export class BaseClassWithoutId extends BaseEntity {
|
||||||
constructor(props?: any) {
|
constructor(props?: any) {
|
||||||
super();
|
super();
|
||||||
@ -38,11 +27,12 @@ export class BaseClassWithoutId extends BaseEntity {
|
|||||||
.concat(this.metadata.relations.map((x) => x.propertyName))
|
.concat(this.metadata.relations.map((x) => x.propertyName))
|
||||||
);
|
);
|
||||||
// will not include relational properties
|
// will not include relational properties
|
||||||
|
console.log(properties);
|
||||||
|
|
||||||
for (const key in props) {
|
for (const key in props) {
|
||||||
if (!properties.has(key)) continue;
|
if (!properties.has(key)) continue;
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const setter = this[`set${key.capitalize()}`];
|
const setter = this[`set${key.capitalize()}`]; // use setter function if it exists
|
||||||
|
|
||||||
if (setter) {
|
if (setter) {
|
||||||
setter.call(this, props[key]);
|
setter.call(this, props[key]);
|
||||||
@ -53,12 +43,6 @@ export class BaseClassWithoutId extends BaseEntity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeUpdate()
|
|
||||||
@BeforeInsert()
|
|
||||||
validate() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
toJSON(): any {
|
toJSON(): any {
|
||||||
return Object.fromEntries(
|
return Object.fromEntries(
|
||||||
this.metadata.columns // @ts-ignore
|
this.metadata.columns // @ts-ignore
|
||||||
@ -76,42 +60,6 @@ export class BaseClassWithoutId extends BaseEntity {
|
|||||||
const repository = this.getRepository();
|
const repository = this.getRepository();
|
||||||
return repository.decrement(conditions, propertyPath, value);
|
return repository.decrement(conditions, propertyPath, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static async delete<T>(criteria: FindConditions<T>, options?: RemoveOptions) {
|
|
||||||
// if (!criteria) throw new Error("You need to specify delete criteria");
|
|
||||||
|
|
||||||
// const repository = this.getRepository();
|
|
||||||
// const promises = repository.metadata.relations.map(async (x) => {
|
|
||||||
// if (x.orphanedRowAction !== "delete") return;
|
|
||||||
|
|
||||||
// const foreignKey =
|
|
||||||
// x.foreignKeys.find((key) => key.entityMetadata === repository.metadata) ||
|
|
||||||
// x.inverseRelation?.foreignKeys[0]; // find foreign key for this entity
|
|
||||||
// if (!foreignKey) {
|
|
||||||
// throw new Error(
|
|
||||||
// `Foreign key not found for entity ${repository.metadata.name} in relation ${x.propertyName}`
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// const id = (criteria as any)[foreignKey.referencedColumnNames[0]];
|
|
||||||
// if (!id) throw new Error("id missing in criteria options " + foreignKey.referencedColumnNames);
|
|
||||||
|
|
||||||
// if (x.relationType === "many-to-many") {
|
|
||||||
// return getConnection()
|
|
||||||
// .createQueryBuilder()
|
|
||||||
// .relation(this, x.propertyName)
|
|
||||||
// .of(id)
|
|
||||||
// .remove({ [foreignKey.columnNames[0]]: id });
|
|
||||||
// } else if (
|
|
||||||
// x.relationType === "one-to-one" ||
|
|
||||||
// x.relationType === "many-to-one" ||
|
|
||||||
// x.relationType === "one-to-many"
|
|
||||||
// ) {
|
|
||||||
// return (x.inverseEntityMetadata.target as any).delete({ [foreignKey.columnNames[0]]: id });
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// await Promise.all(promises);
|
|
||||||
// return super.delete(criteria, options);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const PrimaryIdColumn = process.env.DATABASE?.startsWith("mongodb") ? ObjectIdColumn : PrimaryColumn;
|
export const PrimaryIdColumn = process.env.DATABASE?.startsWith("mongodb") ? ObjectIdColumn : PrimaryColumn;
|
||||||
|
@ -46,9 +46,6 @@ export enum MessageType {
|
|||||||
|
|
||||||
@Entity("messages")
|
@Entity("messages")
|
||||||
export class Message extends BaseClass {
|
export class Message extends BaseClass {
|
||||||
@Column()
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@RelationId((message: Message) => message.channel)
|
@RelationId((message: Message) => message.channel)
|
||||||
channel_id: string;
|
channel_id: string;
|
||||||
|
@ -3,9 +3,6 @@ import { BaseClass } from "./BaseClass";
|
|||||||
|
|
||||||
@Entity("rate_limits")
|
@Entity("rate_limits")
|
||||||
export class RateLimit extends BaseClass {
|
export class RateLimit extends BaseClass {
|
||||||
@Column()
|
|
||||||
id: "global" | "error" | string; // channel_239842397 | guild_238927349823 | webhook_238923423498
|
|
||||||
|
|
||||||
@Column() // no relation as it also
|
@Column() // no relation as it also
|
||||||
executor_id: string;
|
executor_id: string;
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ export class User extends BaseClass {
|
|||||||
// randomly generates a discriminator between 1 and 9999 and checks max five times if it already exists
|
// randomly generates a discriminator between 1 and 9999 and checks max five times if it already exists
|
||||||
// if it all five times already exists, abort with USERNAME_TOO_MANY_USERS error
|
// if it all five times already exists, abort with USERNAME_TOO_MANY_USERS error
|
||||||
// else just continue
|
// else just continue
|
||||||
// TODO: is there any better way to generate a random discriminator only once, without checking if it already exists in the mongodb database?
|
// TODO: is there any better way to generate a random discriminator only once, without checking if it already exists in the database?
|
||||||
for (let tries = 0; tries < 5; tries++) {
|
for (let tries = 0; tries < 5; tries++) {
|
||||||
discriminator = Math.randomIntBetween(1, 9999).toString().padStart(4, "0");
|
discriminator = Math.randomIntBetween(1, 9999).toString().padStart(4, "0");
|
||||||
exists = await User.findOne({ where: { discriminator, username: username }, select: ["id"] });
|
exists = await User.findOne({ where: { discriminator, username: username }, select: ["id"] });
|
||||||
@ -219,7 +219,7 @@ export class User extends BaseClass {
|
|||||||
// if nsfw_allowed is null/undefined it'll require date_of_birth to set it to true/false
|
// if nsfw_allowed is null/undefined it'll require date_of_birth to set it to true/false
|
||||||
const language = req.language === "en" ? "en-US" : req.language || "en-US";
|
const language = req.language === "en" ? "en-US" : req.language || "en-US";
|
||||||
|
|
||||||
const user = await new User({
|
const user = new User({
|
||||||
created_at: new Date(),
|
created_at: new Date(),
|
||||||
username: username,
|
username: username,
|
||||||
discriminator,
|
discriminator,
|
||||||
@ -246,7 +246,10 @@ export class User extends BaseClass {
|
|||||||
},
|
},
|
||||||
settings: { ...defaultSettings, locale: language },
|
settings: { ...defaultSettings, locale: language },
|
||||||
fingerprints: [],
|
fingerprints: [],
|
||||||
}).save();
|
});
|
||||||
|
|
||||||
|
console.log(user);
|
||||||
|
await user.save();
|
||||||
|
|
||||||
if (Config.get().guild.autoJoin.enabled) {
|
if (Config.get().guild.autoJoin.enabled) {
|
||||||
for (const guild of Config.get().guild.autoJoin.guilds || []) {
|
for (const guild of Config.get().guild.autoJoin.guilds || []) {
|
||||||
|
@ -12,9 +12,6 @@ export enum WebhookType {
|
|||||||
|
|
||||||
@Entity("webhooks")
|
@Entity("webhooks")
|
||||||
export class Webhook extends BaseClass {
|
export class Webhook extends BaseClass {
|
||||||
@Column()
|
|
||||||
id: string;
|
|
||||||
|
|
||||||
@Column({ type: "simple-enum", enum: WebhookType })
|
@Column({ type: "simple-enum", enum: WebhookType })
|
||||||
type: WebhookType;
|
type: WebhookType;
|
||||||
|
|
||||||
|
@ -1,12 +1,6 @@
|
|||||||
import "reflect-metadata";
|
import "reflect-metadata";
|
||||||
|
|
||||||
// export * as Constants from "../util/Constants";
|
|
||||||
export * from "./util/index";
|
export * from "./util/index";
|
||||||
export * from "./interfaces/index";
|
export * from "./interfaces/index";
|
||||||
export * from "./entities/index";
|
export * from "./entities/index";
|
||||||
export * from "./dtos/index";
|
export * from "./dtos/index";
|
||||||
|
|
||||||
// import Config from "../util/Config";
|
|
||||||
// import db, { MongooseCache, toObject } from "./util/Database";
|
|
||||||
|
|
||||||
// export { Config };
|
|
||||||
|
Loading…
Reference in New Issue
Block a user