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`);
+ }
+
+}