diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 00000000..e18ecad2 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + postgresql + true + org.postgresql.Driver + jdbc:postgresql://localhost:5432/spacebar + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/data_source_mapping.xml b/.idea/data_source_mapping.xml new file mode 100644 index 00000000..c2a7ad0f --- /dev/null +++ b/.idea/data_source_mapping.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 00000000..6df4889b --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 5e704d48..8bf9617e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -73,6 +73,9 @@ "ts.external.directory.path": "/home/Rory/git/spacebar/server-master/node_modules/typescript/lib" }, "keyToStringList": { + "DatabaseDriversLRU": [ + "postgresql" + ], "GitStage.ChangesTree.GroupingKeys": [ "directory", "module", @@ -102,6 +105,18 @@ + diff --git a/src/api/routes/applications/detectable.ts b/src/api/routes/applications/detectable.ts index 1a111f42..aadb4a0e 100644 --- a/src/api/routes/applications/detectable.ts +++ b/src/api/routes/applications/detectable.ts @@ -18,8 +18,13 @@ import { route } from "@spacebar/api"; import { Request, Response, Router } from "express"; +import { ApplicationDetectableResponse } from "@spacebar/schemas*"; const router: Router = Router({ mergeParams: true }); +const cache = { + data: {}, + lastUpdated: 0 +} router.get( "/", @@ -31,8 +36,15 @@ router.get( }, }), async (req: Request, res: Response) => { - //TODO - res.send([]).status(200); + // cache for 6 hours + if (Date.now() - cache.lastUpdated > 6 * 60 * 60 * 1000) { + const response = await fetch("https://discord.com/api/v10/applications/detectable"); // because, well, it's unauthenticated anyways + const data = await response.json(); + cache.data = data as ApplicationDetectableResponse; + cache.lastUpdated = Date.now(); + } + + res.status(200).json(cache.data); }, ); diff --git a/src/gateway/events/Connection.ts b/src/gateway/events/Connection.ts index 7dfd44d9..b187019e 100644 --- a/src/gateway/events/Connection.ts +++ b/src/gateway/events/Connection.ts @@ -28,6 +28,7 @@ import { Message } from "./Message"; import { Deflate, Inflate } from "fast-zlib"; import { URL } from "url"; import { Config, ErlpackType } from "@spacebar/util"; +// import zlib from "node:zlib"; let erlpack: ErlpackType | null = null; try { @@ -116,10 +117,18 @@ export async function Connection( // @ts-ignore socket.compress = searchParams.get("compress") || ""; if (socket.compress) { - if (socket.compress !== "zlib-stream") + if (socket.compress === "zlib-stream") { + socket.deflate = new Deflate(); + socket.inflate = new Inflate(); + } else if (socket.compress === "zstd-stream") { + // TODO + return socket.close( + CLOSECODES.Decode_error + ); + + } else { return socket.close(CLOSECODES.Decode_error); - socket.deflate = new Deflate(); - socket.inflate = new Inflate(); + } } socket.events = {}; diff --git a/src/util/entities/User.ts b/src/util/entities/User.ts index 9cc3ff70..eb42d9f2 100644 --- a/src/util/entities/User.ts +++ b/src/util/entities/User.ts @@ -113,13 +113,13 @@ export class User extends BaseClass { @Column({ nullable: true, select: false }) email?: string; // email of the user - @Column() + @Column({ type: "bigint" }) flags: number = 0; // UserFlags // TODO: generate - @Column() + @Column({ type: "bigint" }) public_flags: number = 0; - @Column() + @Column({ type: "bigint" }) purchased_flags: number = 0; @Column() diff --git a/src/util/migration/postgres/1760622755599-ReconcileMigrationAttempts.ts b/src/util/migration/postgres/1760622755599-ReconcileMigrationAttempts.ts index 0138817d..d38f0d8c 100644 --- a/src/util/migration/postgres/1760622755599-ReconcileMigrationAttempts.ts +++ b/src/util/migration/postgres/1760622755599-ReconcileMigrationAttempts.ts @@ -1,74 +1,53 @@ -// import { MigrationInterface, QueryRunner } from "typeorm"; -// -// export class ApplicationCommands1760622755598 implements MigrationInterface { -// name = 'ApplicationCommands1760622755598' -// -// public async up(queryRunner: QueryRunner): Promise { -// await queryRunner.query(`ALTER TABLE "webhooks" DROP CONSTRAINT "fk_d64f38834fa676f6caa4786ddd6"`); -// await queryRunner.query(`ALTER TABLE "webhooks" DROP COLUMN "source_channel_id"`); -// await queryRunner.query(`ALTER TABLE "webhooks" ADD "source_channel_id" character varying`); -// await queryRunner.query(`ALTER TABLE "messages" DROP COLUMN "username"`); -// await queryRunner.query(`ALTER TABLE "messages" ADD "username" character varying`); -// await queryRunner.query(`ALTER TABLE "messages" DROP COLUMN "avatar"`); -// await queryRunner.query(`ALTER TABLE "messages" ADD "avatar" character varying`); -// await queryRunner.query(`ALTER TABLE "channels" ALTER COLUMN "default_thread_rate_limit_per_user" DROP NOT NULL`); -// await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "client_status" SET NOT NULL`); -// await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "friend_discovery_flags" DROP DEFAULT`); -// await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "view_nsfw_guilds" DROP DEFAULT`); -// await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "flags"`); -// await queryRunner.query(`ALTER TABLE "users" ADD "flags" integer NOT NULL`); -// await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "public_flags"`); -// await queryRunner.query(`ALTER TABLE "users" ADD "public_flags" integer NOT NULL`); -// await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "purchased_flags"`); -// await queryRunner.query(`ALTER TABLE "users" ADD "purchased_flags" integer NOT NULL`); -// await queryRunner.query(`ALTER TABLE "team_members" DROP COLUMN "role"`); -// await queryRunner.query(`ALTER TABLE "team_members" ADD "role" character varying NOT NULL`); -// await queryRunner.query(`ALTER TABLE "applications" DROP COLUMN "guild_id"`); -// await queryRunner.query(`ALTER TABLE "applications" ADD "guild_id" character varying`); -// await queryRunner.query(`ALTER TABLE "applications" DROP COLUMN "custom_install_url"`); -// await queryRunner.query(`ALTER TABLE "applications" ADD "custom_install_url" character varying`); -// await queryRunner.query(`ALTER TABLE "categories" DROP COLUMN "icon"`); -// await queryRunner.query(`ALTER TABLE "categories" ADD "icon" character varying`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" DROP COLUMN "userSettings"`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" ADD "userSettings" character varying`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" DROP COLUMN "frecencySettings"`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" ADD "frecencySettings" character varying`); -// await queryRunner.query(`ALTER TABLE "webhooks" ADD CONSTRAINT "FK_4495b7032a33c6b8b605d030398" FOREIGN KEY ("source_channel_id") REFERENCES "channels"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); -// await queryRunner.query(`ALTER TABLE "applications" ADD CONSTRAINT "FK_e5bf78cdbbe9ba91062d74c5aba" FOREIGN KEY ("guild_id") REFERENCES "guilds"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); -// } -// -// public async down(queryRunner: QueryRunner): Promise { -// await queryRunner.query(`ALTER TABLE "applications" DROP CONSTRAINT "FK_e5bf78cdbbe9ba91062d74c5aba"`); -// await queryRunner.query(`ALTER TABLE "webhooks" DROP CONSTRAINT "FK_4495b7032a33c6b8b605d030398"`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" DROP COLUMN "frecencySettings"`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" ADD "frecencySettings" text`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" DROP COLUMN "userSettings"`); -// await queryRunner.query(`ALTER TABLE "user_settings_protos" ADD "userSettings" text`); -// await queryRunner.query(`ALTER TABLE "categories" DROP COLUMN "icon"`); -// await queryRunner.query(`ALTER TABLE "categories" ADD "icon" text`); -// await queryRunner.query(`ALTER TABLE "applications" DROP COLUMN "custom_install_url"`); -// await queryRunner.query(`ALTER TABLE "applications" ADD "custom_install_url" text`); -// await queryRunner.query(`ALTER TABLE "applications" DROP COLUMN "guild_id"`); -// await queryRunner.query(`ALTER TABLE "applications" ADD "guild_id" text`); -// await queryRunner.query(`ALTER TABLE "team_members" DROP COLUMN "role"`); -// await queryRunner.query(`ALTER TABLE "team_members" ADD "role" text NOT NULL`); -// await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "purchased_flags"`); -// await queryRunner.query(`ALTER TABLE "users" ADD "purchased_flags" bigint NOT NULL`); -// await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "public_flags"`); -// await queryRunner.query(`ALTER TABLE "users" ADD "public_flags" bigint NOT NULL`); -// await queryRunner.query(`ALTER TABLE "users" DROP COLUMN "flags"`); -// await queryRunner.query(`ALTER TABLE "users" ADD "flags" bigint NOT NULL`); -// await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "view_nsfw_guilds" SET DEFAULT true`); -// await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "friend_discovery_flags" SET DEFAULT '0'`); -// await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "client_status" DROP NOT NULL`); -// await queryRunner.query(`ALTER TABLE "channels" ALTER COLUMN "default_thread_rate_limit_per_user" SET NOT NULL`); -// await queryRunner.query(`ALTER TABLE "messages" DROP COLUMN "avatar"`); -// await queryRunner.query(`ALTER TABLE "messages" ADD "avatar" text`); -// await queryRunner.query(`ALTER TABLE "messages" DROP COLUMN "username"`); -// await queryRunner.query(`ALTER TABLE "messages" ADD "username" text`); -// await queryRunner.query(`ALTER TABLE "webhooks" DROP COLUMN "source_channel_id"`); -// await queryRunner.query(`ALTER TABLE "webhooks" ADD "source_channel_id" character varying(255) DEFAULT NULL`); -// await queryRunner.query(`ALTER TABLE "webhooks" ADD CONSTRAINT "fk_d64f38834fa676f6caa4786ddd6" FOREIGN KEY ("source_channel_id") REFERENCES "channels"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); -// } -// -// } +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class ReconcileMigrationAttempts1760622755598 implements MigrationInterface { + name = 'ReconcileMigrationAttempts1760622755598' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "webhooks" DROP CONSTRAINT "fk_d64f38834fa676f6caa4786ddd6"`); + await queryRunner.query(`ALTER TABLE "webhooks" ALTER COLUMN "source_channel_id" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "messages" ALTER COLUMN "username" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "messages" ALTER COLUMN "avatar" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "channels" ALTER COLUMN "default_thread_rate_limit_per_user" DROP NOT NULL`); + await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "client_status" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "friend_discovery_flags" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "view_nsfw_guilds" DROP DEFAULT`); + await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "flags" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "public_flags" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "purchased_flags" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "team_members" ALTER COLUMN "role" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "team_members" ALTER COLUMN "role" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "applications" ALTER COLUMN "guild_id" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "applications" ALTER COLUMN "custom_install_url" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "categories" ALTER COLUMN "icon" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "user_settings_protos" ALTER COLUMN "userSettings" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "user_settings_protos" ALTER COLUMN "frecencySettings" TYPE character varying`); + await queryRunner.query(`ALTER TABLE "webhooks" ADD CONSTRAINT "FK_4495b7032a33c6b8b605d030398" FOREIGN KEY ("source_channel_id") REFERENCES "channels"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE "applications" ADD CONSTRAINT "FK_e5bf78cdbbe9ba91062d74c5aba" FOREIGN KEY ("guild_id") REFERENCES "guilds"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "applications" DROP CONSTRAINT "FK_e5bf78cdbbe9ba91062d74c5aba"`); + await queryRunner.query(`ALTER TABLE "webhooks" DROP CONSTRAINT "FK_4495b7032a33c6b8b605d030398"`); + await queryRunner.query(`ALTER TABLE "user_settings_protos" ALTER COLUMN "frecencySettings" TYPE text`); + await queryRunner.query(`ALTER TABLE "user_settings_protos" ALTER COLUMN "userSettings" TYPE text`); + await queryRunner.query(`ALTER TABLE "categories" ALTER COLUMN "icon" TYPE text`); + await queryRunner.query(`ALTER TABLE "applications" ALTER COLUMN "custom_install_url" TYPE text`); + await queryRunner.query(`ALTER TABLE "applications" ALTER COLUMN "guild_id" TYPE text`); + await queryRunner.query(`ALTER TABLE "team_members" ALTER COLUMN "role" TYPE text`); + await queryRunner.query(`ALTER TABLE "team_members" ALTER COLUMN "role" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "purchased_flags" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "public_flags" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "users" ALTER COLUMN "flags" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "view_nsfw_guilds" SET DEFAULT true`); + await queryRunner.query(`ALTER TABLE "user_settings" ALTER COLUMN "friend_discovery_flags" SET DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "sessions" ALTER COLUMN "client_status" DROP NOT NULL`); + await queryRunner.query(`ALTER TABLE "channels" ALTER COLUMN "default_thread_rate_limit_per_user" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "messages" ALTER COLUMN "avatar" TYPE text`); + await queryRunner.query(`ALTER TABLE "messages" ALTER COLUMN "username" TYPE text`); + await queryRunner.query(`ALTER TABLE "webhooks" ALTER COLUMN "source_channel_id" TYPE character varying(255)`); + await queryRunner.query(`ALTER TABLE "webhooks" ALTER COLUMN "source_channel_id" SET DEFAULT NULL`); + await queryRunner.query(`ALTER TABLE "webhooks" ADD CONSTRAINT "fk_d64f38834fa676f6caa4786ddd6" FOREIGN KEY ("source_channel_id") REFERENCES "channels"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); + } + +}