1
0
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:
Flam3rboy 2021-10-10 11:03:32 +02:00
parent dbe2258d97
commit dc85a79498
15 changed files with 23 additions and 146 deletions

4
.gitignore vendored
View File

@ -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

View File

@ -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";

View File

@ -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();

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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(""));
// // ->

View File

@ -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);
} }
} }

View File

@ -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]

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 || []) {

View File

@ -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;

View File

@ -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 };