From 7a2711de71afe35e58f568347269460b33ad0fd9 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 13 Aug 2021 01:09:08 +0200 Subject: [PATCH 1/6] :sparkles: docker compose --- .docker/env | 1 + docker-compose.yml | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 .docker/env create mode 100644 docker-compose.yml diff --git a/.docker/env b/.docker/env new file mode 100644 index 00000000..595b7ba2 --- /dev/null +++ b/.docker/env @@ -0,0 +1 @@ +MONGO_URL=mongodb://db:27017/fosscord?readPreference=secondaryPreferred diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..5861e12f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: "3" +services: + db: + hostname: fosscord_db + image: mongo:latest + volumes: + - ./db:/data/db + restart: unless-stopped + api: + hostname: fosscord_api + image: fosscord/api + depends_on: + - db + ports: + - 3001:3001 + env_file: ./.docker/env + gateway: + hostname: fosscord_gateway + image: fosscord/gateway + depends_on: + - db + ports: + - 3002:3002 + env_file: ./.docker/env \ No newline at end of file From 0802d5e6a849c822b7225423c8b20a38763ff45f Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 13 Aug 2021 12:58:18 +0200 Subject: [PATCH 2/6] :sparkles: server bundle --- {api/.github => .github}/FUNDING.yml | 0 .../.github => .github}/workflows/release.yml | 39 +++++---- .gitignore | 4 + .vscode/launch.json | 17 ---- api/.github/ISSUE_TEMPLATE/-feature--.md | 20 ----- api/.github/workflows/codeql-analysis.yml | 71 ----------------- api/.github/workflows/docker-publish.yml | 47 ----------- bundle/package-lock.json | Bin 0 -> 92755 bytes bundle/package.json | 42 ++++++++++ bundle/src/Server.ts | 33 ++++++++ bundle/src/start.ts | 74 ++++++++++++++++++ bundle/tsconfig.json | 68 ++++++++++++++++ gateway/.github/workflows/docker-publish.yml | 47 ----------- util/package.json | 4 +- 14 files changed, 247 insertions(+), 219 deletions(-) rename {api/.github => .github}/FUNDING.yml (100%) rename {api/.github => .github}/workflows/release.yml (64%) create mode 100644 .gitignore delete mode 100644 .vscode/launch.json delete mode 100644 api/.github/ISSUE_TEMPLATE/-feature--.md delete mode 100644 api/.github/workflows/codeql-analysis.yml delete mode 100644 api/.github/workflows/docker-publish.yml create mode 100644 bundle/package-lock.json create mode 100644 bundle/package.json create mode 100644 bundle/src/Server.ts create mode 100644 bundle/src/start.ts create mode 100644 bundle/tsconfig.json delete mode 100644 gateway/.github/workflows/docker-publish.yml diff --git a/api/.github/FUNDING.yml b/.github/FUNDING.yml similarity index 100% rename from api/.github/FUNDING.yml rename to .github/FUNDING.yml diff --git a/api/.github/workflows/release.yml b/.github/workflows/release.yml similarity index 64% rename from api/.github/workflows/release.yml rename to .github/workflows/release.yml index 3ef40aeb..b0a31780 100644 --- a/api/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,13 +15,13 @@ jobs: include: - os: windows build: npm run bundle:windows - artifact: fosscord-api-windows.exe + artifact: fosscord-server-windows.exe - os: macos build: npm run bundle:macos - artifact: fosscord-api-macos.app.tgz + artifact: fosscord-server-macos.app.tgz - os: ubuntu build: npm run bundle:linux - artifact: fosscord-api-linux.tgz + artifact: fosscord-server-linux.tgz runs-on: ${{ matrix.os }}-latest steps: - uses: actions/checkout@v2 @@ -29,6 +29,8 @@ jobs: with: node-version: 14 - run: npm install + env: + MONGOMS_VERSION: 4.4.3 - run: npm run build - run: ${{ matrix.build }} - uses: actions/upload-artifact@v2 @@ -46,43 +48,52 @@ jobs: uses: Saionaro/extract-package-version@v1.0.6 - uses: actions/download-artifact@v2 with: - name: fosscord-api-windows-${{ github.sha }}.exe + name: fosscord-server-windows.exe - uses: actions/download-artifact@v2 with: - name: fosscord-api-macos-${{ github.sha }}.app.tgz + name: fosscord-server-macos.app.tgz - uses: actions/download-artifact@v2 with: - name: fosscord-api-linux-${{ github.sha }}.tgz + name: fosscord-server-linux.tgz - uses: actions/create-release@v1 id: create-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: v${{ steps.extract_version.outputs.version }} - release_name: Release ${{ steps.extract_version.outputs.version }} + release_name: Server v${{ steps.extract_version.outputs.version }} draft: false prerelease: true # TODO: change this to false + body: > + ## Download + + - [Windows](https://github.com/fosscord/fosscord-server/releases/download/v${{ steps.extract_version.outputs.version }}/fosscord-server-windows.exe) + + - [MacOS](https://github.com/fosscord/fosscord-server/releases/download/v${{ steps.extract_version.outputs.version }}/fosscord-server-macos.app.tgz) + + - [Linux](https://github.com/fosscord/fosscord-server/releases/download/v${{ steps.extract_version.outputs.version }}/fosscord-server-linux.tgz) + - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: fosscord-api-windows-${{ github.sha }}.exe - asset_name: fosscord-api-windows.exe + asset_path: fosscord-server-windows.exe + asset_name: fosscord-server-windows.exe asset_content_type: application/vnd.microsoft.portable-executable - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: fosscord-api-macos-${{ github.sha }}.app.tgz - asset_name: fosscord-api-macos.app.tgz + asset_path: fosscord-server-macos.app.tgz + asset_name: fosscord-server-macos.app.tgz asset_content_type: application/gzip - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: fosscord-api-linux-${{ github.sha }}.tgz - asset_name: fosscord-api-linux.tgz - asset_content_type: application/gzip + asset_path: fosscord-server-linux.tgz + asset_name: fosscord-server-linux.tgz + asset_content_type: application/gzip \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..32ef9beb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_STORE +db/ +dist/ +node_modules \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 07fd32ac..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "sourceMaps": true, - "type": "node", - "request": "launch", - "name": "Launch Server", - "program": "${workspaceFolder}/dist/index.js", - "preLaunchTask": "tsc: build - tsconfig.json", - "outFiles": ["${workspaceFolder}/dist/**/*.js"] - } - ] -} diff --git a/api/.github/ISSUE_TEMPLATE/-feature--.md b/api/.github/ISSUE_TEMPLATE/-feature--.md deleted file mode 100644 index cefcf6b6..00000000 --- a/api/.github/ISSUE_TEMPLATE/-feature--.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: "[Feature] " -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/api/.github/workflows/codeql-analysis.yml b/api/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 3a3a8e92..00000000 --- a/api/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ master ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ master ] - schedule: - - cron: '25 10 * * 5' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 diff --git a/api/.github/workflows/docker-publish.yml b/api/.github/workflows/docker-publish.yml deleted file mode 100644 index 46d9d04d..00000000 --- a/api/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: docker-publish - -on: - push: - branches: - - 'master' - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Cache Docker layers - uses: actions/cache@v2 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ${{ secrets.DOCKERHUB_TAGS }} - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache-new - - - # Hackfix to cleanup cache; replace after buildx 0.6 and BuildKit 0.9 are released - # https://github.com/docker/build-push-action/pull/406#issuecomment-879184394 - name: Move cache fix - run: | - rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/bundle/package-lock.json b/bundle/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..8f012973359fb0f03e883c924d150f28ae08a667 GIT binary patch literal 92755 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 C^W~uc literal 0 HcmV?d00001 diff --git a/bundle/package.json b/bundle/package.json new file mode 100644 index 00000000..f4188565 --- /dev/null +++ b/bundle/package.json @@ -0,0 +1,42 @@ +{ + "name": "@fosscord/server", + "version": "1.0.0", + "description": "", + "main": "src/start.js", + "scripts": { + "linkInstall": "npm run --prefix ../util/ link && npm run --prefix ../api/ link && npm run --prefix ../cdn/ link && npm run --prefix ../gateway/ link", + "postinstall": "npm run linkInstall && npm link @fosscord/util && npm link @fosscord/api && npm link @fosscord/gateway && npm link @fosscord/cdn", + "build": "tsc -b .", + "start": "npm run build && node dist/start.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/fosscord/fosscord-api.git" + }, + "keywords": [], + "author": "Fosscord", + "license": "AGPLV3", + "bugs": { + "url": "https://github.com/fosscord/fosscord-api/issues" + }, + "homepage": "https://github.com/fosscord/fosscord-api#readme", + "devDependencies": { + "@types/async-exit-hook": "^2.0.0", + "@types/express": "^4.17.13", + "@types/node": "^16.6.1", + "@types/node-os-utils": "^1.2.0", + "typescript": "^4.3.5" + }, + "dependencies": { + "@fosscord/api": "file:../api", + "@fosscord/cdn": "file:../cdn", + "@fosscord/gateway": "file:../gateway", + "@fosscord/util": "file:../util", + "async-exit-hook": "^2.0.1", + "express": "^4.17.1", + "link": "^0.1.5", + "mongodb-memory-server-global-4.4": "^7.3.6", + "node-os-utils": "^1.3.5" + } +} diff --git a/bundle/src/Server.ts b/bundle/src/Server.ts new file mode 100644 index 00000000..14abc128 --- /dev/null +++ b/bundle/src/Server.ts @@ -0,0 +1,33 @@ +process.on("unhandledRejection", console.error); +process.on("uncaughtException", console.error); + +import http from "http"; +import { FosscordServer as APIServer } from "@fosscord/api"; +import { Server as GatewayServer } from "@fosscord/gateway"; +import { CDNServer } from "@fosscord/cdn/"; +import express from "express"; +import { Config } from "../../util/dist"; + +const app = express(); +const server = http.createServer(); +const port = Number(process.env.PORT) || 8080; +const production = true; +server.on("request", app); + +// @ts-ignore +const api = new APIServer({ server, port, production, app }); +// @ts-ignore +const cdn = new CDNServer({ server, port, production, app }); +// @ts-ignore +const gateway = new GatewayServer({ server, port, production }); + +async function main() { + await api.start(); + await cdn.start(); + await gateway.start(); + + if (!Config.get().gateway.endpoint) await Config.set({ gateway: { endpoint: `ws://localhost:${port}` } }); + if (!Config.get().cdn.endpoint) await Config.set({ cdn: { endpoint: `http://localhost:${port}` } }); +} + +main().catch(console.error); diff --git a/bundle/src/start.ts b/bundle/src/start.ts new file mode 100644 index 00000000..2ae2ce87 --- /dev/null +++ b/bundle/src/start.ts @@ -0,0 +1,74 @@ +import fs from "fs"; +import { MongoMemoryServer } from "mongodb-memory-server-global-4.4"; +import path from "path"; +import cluster from "cluster"; +import os from "os"; +import osu from "node-os-utils"; +import exitHook from "async-exit-hook"; + +const cores = Number(process.env.threads) || 1 || os.cpus().length; + +if (cluster.isMaster && !process.env.masterStarted) { + const dbPath = path.join(__dirname, "..", "..", "db"); + const dbName = "fosscord"; + const storageEngine = "wiredTiger"; + const port = 27020; + const ip = "127.0.0.1"; + var mongod: MongoMemoryServer; + fs.mkdirSync(dbPath, { recursive: true }); + + exitHook((callback: any) => { + (async () => { + console.log(`Stopping MongoDB ...`); + await mongod.stop(); + console.log(`Stopped MongoDB`); + callback(); + })(); + }); + + process.env.masterStarted = "true"; + + setInterval(async () => { + const [cpuUsed, memory, network] = await Promise.all([osu.cpu.usage(), osu.mem.info(), osu.netstat.inOut()]); + if (typeof network === "object") { + console.log(`Network: in ${network.total.inputMb}mb | out ${network.total.outputMb}mb`); + } + + console.log( + `[CPU] ${cpuUsed.toFixed(2)}% | [Memory] ${memory.usedMemMb.toFixed(0)}mb/${memory.totalMemMb.toFixed(0)}mb` + ); + }, 1000 * 60); + + (async () => { + console.log(`[Database] starting ...`); + mongod = new MongoMemoryServer({ + instance: { + port, + ip, + dbName, + dbPath, + storageEngine, + auth: false, // by default `mongod` is started with '--noauth', start `mongod` with '--auth' + }, + }); + await mongod.start(); + process.env.MONGO_URL = mongod.getUri(dbName); + + console.log(`[CPU] ${osu.cpu.model()} Cores x${osu.cpu.count()}`); + console.log(`[System] ${await osu.os.oos()} ${os.arch()}`); + console.log(`[Database] started`); + console.log(`[Process] running with pid: ${process.pid}`); + + // Fork workers. + for (let i = 0; i < cores; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker: any, code: any, signal: any) => { + console.log(`[Worker] died with pid: ${worker.process.pid} , restarting ...`); + cluster.fork(); + }); + })(); +} else { + require("./Server.js"); +} diff --git a/bundle/tsconfig.json b/bundle/tsconfig.json new file mode 100644 index 00000000..6bf2e6b7 --- /dev/null +++ b/bundle/tsconfig.json @@ -0,0 +1,68 @@ +{ + "include": ["src/**/*.ts"], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ESNext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "lib": ["ES2020"] /* Specify library files to be included in the compilation. */, + "allowJs": true /* Allow javascript files to be compiled. */, + "checkJs": true /* Report errors in .js files. */, + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": false /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist/" /* Redirect output structure to the directory. */, + "rootDir": "./src/" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* Enable strict null checks. */, + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + "strictPropertyInitialization": false /* Enable strict checking of property initialization in classes. */, + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "types": ["node"] /* Type declaration files to be included in compilation. */, + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/gateway/.github/workflows/docker-publish.yml b/gateway/.github/workflows/docker-publish.yml deleted file mode 100644 index 46d9d04d..00000000 --- a/gateway/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: docker-publish - -on: - push: - branches: - - 'master' - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Cache Docker layers - uses: actions/cache@v2 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ${{ secrets.DOCKERHUB_TAGS }} - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache-new - - - # Hackfix to cleanup cache; replace after buildx 0.6 and BuildKit 0.9 are released - # https://github.com/docker/build-push-action/pull/406#issuecomment-879184394 - name: Move cache fix - run: | - rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/util/package.json b/util/package.json index 0478fe69..69af0f26 100644 --- a/util/package.json +++ b/util/package.json @@ -5,9 +5,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "tsc -b .", - "prepublish": "npm run build" + "build": "tsc -b ." }, "repository": { "type": "git", From 90d5307a5668030b414d35deeb2bb9b6845b76e0 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 13 Aug 2021 12:59:59 +0200 Subject: [PATCH 3/6] rename @fosscord/server-util to -> @fosscord/util --- api/package-lock.json | Bin 686195 -> 687550 bytes api/package.json | 3 ++ api/src/Server.ts | 8 +++--- api/src/index.ts | 2 -- api/src/middlewares/Authentication.ts | 21 +++++++------- api/src/middlewares/ErrorHandler.ts | 2 -- api/src/middlewares/RateLimit.ts | 21 ++++++++------ api/src/routes/auth/login.ts | 2 +- api/src/routes/auth/register.ts | 2 +- api/src/routes/channels/#channel_id/index.ts | 3 +- .../routes/channels/#channel_id/invites.ts | 3 +- .../#channel_id/messages/#message_id/ack.ts | 4 +-- .../#channel_id/messages/#message_id/index.ts | 4 +-- .../messages/#message_id/reactions.ts | 4 +-- .../#channel_id/messages/bulk-delete.ts | 4 +-- .../channels/#channel_id/messages/index.ts | 2 +- .../channels/#channel_id/permissions.ts | 12 ++++++-- api/src/routes/channels/#channel_id/pins.ts | 4 +-- api/src/routes/channels/#channel_id/typing.ts | 3 +- .../routes/channels/#channel_id/webhooks.ts | 2 +- api/src/routes/gateway.ts | 2 +- api/src/routes/guilds/#guild_id/bans.ts | 4 +-- api/src/routes/guilds/#guild_id/channels.ts | 9 +++--- api/src/routes/guilds/#guild_id/delete.ts | 4 +-- api/src/routes/guilds/#guild_id/index.ts | 5 ++-- api/src/routes/guilds/#guild_id/invites.ts | 2 +- .../#guild_id/members/#member_id/index.ts | 6 ++-- .../#guild_id/members/#member_id/nick.ts | 2 +- .../#member_id/roles/#role_id/index.ts | 2 +- .../routes/guilds/#guild_id/members/index.ts | 2 +- api/src/routes/guilds/#guild_id/regions.ts | 4 +-- api/src/routes/guilds/#guild_id/roles.ts | 7 +++-- api/src/routes/guilds/#guild_id/templates.ts | 2 +- api/src/routes/guilds/#guild_id/vanity-url.ts | 2 +- .../routes/guilds/#guild_id/welcome_screen.ts | 4 +-- .../routes/guilds/#guild_id/widget.json.ts | 2 +- api/src/routes/guilds/#guild_id/widget.png.ts | 2 +- api/src/routes/guilds/#guild_id/widget.ts | 2 +- api/src/routes/guilds/index.ts | 2 +- api/src/routes/guilds/templates/index.ts | 2 +- api/src/routes/invites/index.ts | 2 +- api/src/routes/users/@me/channels.ts | 7 +++-- api/src/routes/users/@me/delete.ts | 2 +- api/src/routes/users/@me/disable.ts | 2 +- api/src/routes/users/@me/guilds.ts | 14 +++++----- api/src/routes/users/@me/index.ts | 2 +- api/src/routes/users/@me/relationships.ts | 7 +++-- api/src/schema/Channel.ts | 2 +- api/src/schema/Guild.ts | 2 +- api/src/schema/Message.ts | 2 +- api/src/test/test.ts | 2 +- api/src/util/Channel.ts | 8 +++--- api/src/util/Config.ts | 4 +-- api/src/util/Event.ts | 26 ------------------ api/src/util/Member.ts | 7 +++-- api/src/util/Message.ts | 16 +++++------ api/src/util/User.ts | 2 +- api/src/util/cdn.ts | 2 +- api/src/util/ipAddress.ts | 2 +- api/src/util/passwordStrength.ts | 2 +- cdn/package-lock.json | Bin 121877 -> 123232 bytes cdn/package.json | 3 ++ cdn/src/Server.ts | 24 ++++++++-------- cdn/src/routes/attachments.ts | 2 +- cdn/src/routes/avatars.ts | 2 +- cdn/src/routes/external.ts | 2 +- 66 files changed, 154 insertions(+), 165 deletions(-) delete mode 100644 api/src/util/Event.ts diff --git a/api/package-lock.json b/api/package-lock.json index 8e9a42cd38f00927240753c6b12106f1a20f90e3..0a9af8e07350a55d6934cebc2d2c6f302ab9eedb 100644 GIT binary patch delta 298 zcmezTL37`4%?T@~UrAz=owzbYHZ8xnI61#4MZdHpGe^lvK`AXWC)G+%56s{AWgaU# zlsz$5nhmT*XZpj5j3SbzMoKzdoSd9WIho0+dBv$9z3u@%VaAgcZ_7@$U&6k*FRqx8 z*;vnf`tA3uUXv?WET&h;v-3?d6q(*3!pu9}ER;iVy1^D!>&^e!(jq74#&T*y-B1lS zw~*5VHd@$M)OrIcIbL0Nf#J?EnA( delta 112 zcmdn@Tl4b=%?T?f9t+v*z&Mq4a)7AF<_ymLk&|muxu>t~XA{~!{VOXg); await this.setupSchema(); - console.log("[Database] connected"); await Config.init(); - await RabbitMQ.init(); + await initEvent(); this.app.use(CORS); this.app.use(Authentication); @@ -93,11 +92,12 @@ export class FosscordServer extends Server { app.use("/api/v9", api); app.use("/api", api); // allow unversioned requests - api.get("*", (req: Request, res: Response) => { + api.get("*", (req: Request, res: Response, next) => { res.status(404).json({ message: "404: Not Found", code: 0 }); + next(); }); this.app = app; diff --git a/api/src/index.ts b/api/src/index.ts index 554c296f..6037e31f 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -7,9 +7,7 @@ export * from "./schema/Invite"; export * from "./schema/Message"; export * from "./util/Config"; export * from "./util/Constants"; -export * from "./util/Event"; export * from "./util/instanceOf"; -export * from "./util/Event"; export * from "./util/instanceOf"; export * from "./util/Member"; export * from "./util/RandomInviteID"; diff --git a/api/src/middlewares/Authentication.ts b/api/src/middlewares/Authentication.ts index 01b7ef57..00cd9ea7 100644 --- a/api/src/middlewares/Authentication.ts +++ b/api/src/middlewares/Authentication.ts @@ -1,15 +1,15 @@ import { NextFunction, Request, Response } from "express"; import { HTTPError } from "lambert-server"; -import { checkToken, Config } from "@fosscord/server-util"; +import { checkToken, Config } from "@fosscord/util"; export const NO_AUTHORIZATION_ROUTES = [ - /^\/api(\/v\d+)?\/auth\/login/, - /^\/api(\/v\d+)?\/auth\/register/, - /^\/api(\/v\d+)?\/webhooks\//, - /^\/api(\/v\d+)?\/ping/, - /^\/api(\/v\d+)?\/gateway/, - /^\/api(\/v\d+)?\/experiments/, - /^\/api(\/v\d+)?\/guilds\/\d+\/widget\.(json|png)/ + "/auth/login", + "/auth/register", + "/webhooks/", + "/ping", + "/gateway", + "/experiments" + // /^\/api(\/v\d+)?\/guilds\/\d+\/widget\.(json|png)/ ]; export const API_PREFIX = /^\/api(\/v\d+)?/; @@ -24,13 +24,14 @@ declare global { } } } +// TODO wenn client offen ist, wird http://localhost:8080/api/v9/users/@me/guild-events blockiert? export async function Authentication(req: Request, res: Response, next: NextFunction) { if (req.method === "OPTIONS") return res.sendStatus(204); if (!req.url.startsWith("/api")) return next(); const apiPath = req.url.replace(API_PREFIX, ""); - if (apiPath.startsWith("/invites") && req.method === "GET") return next(); - if (NO_AUTHORIZATION_ROUTES.some((x) => x.test(req.url))) return next(); + if (apiPath.startsWith("/invites") && req.method === "GET") return next(); // @ts-ignore + if (NO_AUTHORIZATION_ROUTES.some((x) => apiPath.startsWith(x) || x.test?.(req.url))) return next(); if (!req.headers.authorization) return next(new HTTPError("Missing Authorization Header", 401)); try { diff --git a/api/src/middlewares/ErrorHandler.ts b/api/src/middlewares/ErrorHandler.ts index 2e6b1d8b..04d56026 100644 --- a/api/src/middlewares/ErrorHandler.ts +++ b/api/src/middlewares/ErrorHandler.ts @@ -25,8 +25,6 @@ export function ErrorHandler(error: Error, req: Request, res: Response, next: Ne if (httpcode > 511) httpcode = 400; res.status(httpcode).json({ code: code, message, errors }); - - return; } catch (error) { console.error(error); return res.status(500).json({ code: 500, message: "Internal Server Error" }); diff --git a/api/src/middlewares/RateLimit.ts b/api/src/middlewares/RateLimit.ts index c8fdeba2..a1bb0c44 100644 --- a/api/src/middlewares/RateLimit.ts +++ b/api/src/middlewares/RateLimit.ts @@ -1,16 +1,17 @@ -import { db, MongooseCache, Bucket, Config } from "@fosscord/server-util"; +// @ts-nocheck +import { db, Bucket, Config } from "@fosscord/util"; import { NextFunction, Request, Response, Router } from "express"; import { getIpAdress } from "../util/ipAddress"; import { API_PREFIX_TRAILING_SLASH } from "./Authentication"; -const Cache = new MongooseCache( - db.collection("ratelimits"), - [ - // TODO: uncomment $match and fix error: not receiving change events - // { $match: { blocked: true } } - ], - { onlyEvents: false, array: true } -); +// const Cache = new MongooseCache( +// db.collection("ratelimits"), +// [ +// // TODO: uncomment $match and fix error: not receiving change events +// // { $match: { blocked: true } } +// ], +// { onlyEvents: false, array: true } +// ); // Docs: https://discord.com/developers/docs/topics/rate-limits @@ -31,6 +32,7 @@ TODO: use config values */ +// TODO: FIX with new event handling export default function RateLimit(opts: { bucket?: string; window: number; @@ -44,6 +46,7 @@ export default function RateLimit(opts: { success?: boolean; onlyIp?: boolean; }): any { + return (req, res, next) => next(); Cache.init(); // will only initalize it once return async (req: Request, res: Response, next: NextFunction): Promise => { diff --git a/api/src/routes/auth/login.ts b/api/src/routes/auth/login.ts index c3661608..f55d5351 100644 --- a/api/src/routes/auth/login.ts +++ b/api/src/routes/auth/login.ts @@ -2,7 +2,7 @@ import { Request, Response, Router } from "express"; import { check, FieldErrors, Length } from "../../util/instanceOf"; import bcrypt from "bcrypt"; import jwt from "jsonwebtoken"; -import { Config, UserModel } from "@fosscord/server-util"; +import { Config, UserModel } from "@fosscord/util"; import { adjustEmail } from "./register"; import RateLimit from "../../middlewares/RateLimit"; diff --git a/api/src/routes/auth/register.ts b/api/src/routes/auth/register.ts index 66a1fc8d..fecde874 100644 --- a/api/src/routes/auth/register.ts +++ b/api/src/routes/auth/register.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { trimSpecial, User, Snowflake, UserModel, Config } from "@fosscord/server-util"; +import { trimSpecial, User, Snowflake, UserModel, Config } from "@fosscord/util"; import bcrypt from "bcrypt"; import { check, Email, EMAIL_REGEX, FieldErrors, Length } from "../../util/instanceOf"; import "missing-native-js-functions"; diff --git a/api/src/routes/channels/#channel_id/index.ts b/api/src/routes/channels/#channel_id/index.ts index 81e5054e..3bfa80be 100644 --- a/api/src/routes/channels/#channel_id/index.ts +++ b/api/src/routes/channels/#channel_id/index.ts @@ -1,8 +1,7 @@ -import { ChannelDeleteEvent, ChannelModel, ChannelUpdateEvent, getPermission, GuildUpdateEvent, toObject } from "@fosscord/server-util"; +import { ChannelDeleteEvent, ChannelModel, ChannelUpdateEvent, emitEvent, getPermission, GuildUpdateEvent, toObject } from "@fosscord/util"; import { Router, Response, Request } from "express"; import { HTTPError } from "lambert-server"; import { ChannelModifySchema } from "../../../schema/Channel"; -import { emitEvent } from "../../../util/Event"; import { check } from "../../../util/instanceOf"; const router: Router = Router(); // TODO: delete channel diff --git a/api/src/routes/channels/#channel_id/invites.ts b/api/src/routes/channels/#channel_id/invites.ts index c9db4dd2..438f8c51 100644 --- a/api/src/routes/channels/#channel_id/invites.ts +++ b/api/src/routes/channels/#channel_id/invites.ts @@ -3,11 +3,10 @@ import { HTTPError } from "lambert-server"; import { check } from "../../../util/instanceOf"; import { random } from "../../../util/RandomInviteID"; -import { emitEvent } from "../../../util/Event"; import { InviteCreateSchema } from "../../../schema/Invite"; -import { getPermission, ChannelModel, InviteModel, InviteCreateEvent, toObject } from "@fosscord/server-util"; +import { getPermission, ChannelModel, InviteModel, InviteCreateEvent, toObject, emitEvent } from "@fosscord/util"; const router: Router = Router(); diff --git a/api/src/routes/channels/#channel_id/messages/#message_id/ack.ts b/api/src/routes/channels/#channel_id/messages/#message_id/ack.ts index f4d9e696..bbc779dd 100644 --- a/api/src/routes/channels/#channel_id/messages/#message_id/ack.ts +++ b/api/src/routes/channels/#channel_id/messages/#message_id/ack.ts @@ -1,6 +1,6 @@ -import { getPermission, MessageAckEvent, ReadStateModel } from "@fosscord/server-util"; +import { emitEvent, getPermission, MessageAckEvent, ReadStateModel } from "@fosscord/util"; import { Request, Response, Router } from "express"; -import { emitEvent } from "../../../../../util/Event"; + import { check } from "../../../../../util/instanceOf"; const router = Router(); diff --git a/api/src/routes/channels/#channel_id/messages/#message_id/index.ts b/api/src/routes/channels/#channel_id/messages/#message_id/index.ts index a7c23d2f..3c58d034 100644 --- a/api/src/routes/channels/#channel_id/messages/#message_id/index.ts +++ b/api/src/routes/channels/#channel_id/messages/#message_id/index.ts @@ -1,8 +1,8 @@ -import { ChannelModel, getPermission, MessageDeleteEvent, MessageModel, MessageUpdateEvent, toObject } from "@fosscord/server-util"; +import { ChannelModel, emitEvent, getPermission, MessageDeleteEvent, MessageModel, MessageUpdateEvent, toObject } from "@fosscord/util"; import { Router, Response, Request } from "express"; import { HTTPError } from "lambert-server"; import { MessageCreateSchema } from "../../../../../schema/Message"; -import { emitEvent } from "../../../../../util/Event"; + import { check } from "../../../../../util/instanceOf"; import { handleMessage, postHandleMessage } from "../../../../../util/Message"; diff --git a/api/src/routes/channels/#channel_id/messages/#message_id/reactions.ts b/api/src/routes/channels/#channel_id/messages/#message_id/reactions.ts index 168a870f..34d2ce3a 100644 --- a/api/src/routes/channels/#channel_id/messages/#message_id/reactions.ts +++ b/api/src/routes/channels/#channel_id/messages/#message_id/reactions.ts @@ -1,5 +1,6 @@ import { ChannelModel, + emitEvent, EmojiModel, getPermission, MemberModel, @@ -12,10 +13,9 @@ import { PublicUserProjection, toObject, UserModel -} from "@fosscord/server-util"; +} from "@fosscord/util"; import { Router, Response, Request } from "express"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../../../util/Event"; const router = Router(); // TODO: check if emoji is really an unicode emoji or a prperly encoded external emoji diff --git a/api/src/routes/channels/#channel_id/messages/bulk-delete.ts b/api/src/routes/channels/#channel_id/messages/bulk-delete.ts index e53cd597..8132462f 100644 --- a/api/src/routes/channels/#channel_id/messages/bulk-delete.ts +++ b/api/src/routes/channels/#channel_id/messages/bulk-delete.ts @@ -1,7 +1,7 @@ import { Router, Response, Request } from "express"; -import { ChannelModel, Config, getPermission, MessageDeleteBulkEvent, MessageModel } from "@fosscord/server-util"; +import { ChannelModel, Config, emitEvent, getPermission, MessageDeleteBulkEvent, MessageModel } from "@fosscord/util"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../../util/Event"; + import { check } from "../../../../util/instanceOf"; const router: Router = Router(); diff --git a/api/src/routes/channels/#channel_id/messages/index.ts b/api/src/routes/channels/#channel_id/messages/index.ts index fea4d6a4..6ae6491f 100644 --- a/api/src/routes/channels/#channel_id/messages/index.ts +++ b/api/src/routes/channels/#channel_id/messages/index.ts @@ -1,5 +1,5 @@ import { Router, Response, Request } from "express"; -import { Attachment, ChannelModel, ChannelType, getPermission, MessageDocument, MessageModel, toObject } from "@fosscord/server-util"; +import { Attachment, ChannelModel, ChannelType, getPermission, MessageDocument, MessageModel, toObject } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { MessageCreateSchema } from "../../../../schema/Message"; import { check, instanceOf, Length } from "../../../../util/instanceOf"; diff --git a/api/src/routes/channels/#channel_id/permissions.ts b/api/src/routes/channels/#channel_id/permissions.ts index 12364293..4cbc7522 100644 --- a/api/src/routes/channels/#channel_id/permissions.ts +++ b/api/src/routes/channels/#channel_id/permissions.ts @@ -1,7 +1,15 @@ -import { ChannelModel, ChannelPermissionOverwrite, ChannelUpdateEvent, getPermission, MemberModel, RoleModel } from "@fosscord/server-util"; +import { + ChannelModel, + ChannelPermissionOverwrite, + ChannelUpdateEvent, + emitEvent, + getPermission, + MemberModel, + RoleModel +} from "@fosscord/util"; import { Router, Response, Request } from "express"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; + import { check } from "../../../util/instanceOf"; const router: Router = Router(); diff --git a/api/src/routes/channels/#channel_id/pins.ts b/api/src/routes/channels/#channel_id/pins.ts index 65d6b975..18a5861b 100644 --- a/api/src/routes/channels/#channel_id/pins.ts +++ b/api/src/routes/channels/#channel_id/pins.ts @@ -2,14 +2,14 @@ import { ChannelModel, ChannelPinsUpdateEvent, Config, + emitEvent, getPermission, MessageModel, MessageUpdateEvent, toObject -} from "@fosscord/server-util"; +} from "@fosscord/util"; import { Router, Request, Response } from "express"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; const router: Router = Router(); diff --git a/api/src/routes/channels/#channel_id/typing.ts b/api/src/routes/channels/#channel_id/typing.ts index de549883..21d453d8 100644 --- a/api/src/routes/channels/#channel_id/typing.ts +++ b/api/src/routes/channels/#channel_id/typing.ts @@ -1,8 +1,7 @@ -import { ChannelModel, MemberModel, toObject, TypingStartEvent } from "@fosscord/server-util"; +import { ChannelModel, emitEvent, MemberModel, toObject, TypingStartEvent } from "@fosscord/util"; import { Router, Request, Response } from "express"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; const router: Router = Router(); diff --git a/api/src/routes/channels/#channel_id/webhooks.ts b/api/src/routes/channels/#channel_id/webhooks.ts index 6c1aea2a..7852f8f3 100644 --- a/api/src/routes/channels/#channel_id/webhooks.ts +++ b/api/src/routes/channels/#channel_id/webhooks.ts @@ -1,6 +1,6 @@ import { Router, Response, Request } from "express"; import { check, Length } from "../../../util/instanceOf"; -import { ChannelModel, getPermission, trimSpecial } from "@fosscord/server-util"; +import { ChannelModel, getPermission, trimSpecial } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { isTextChannel } from "./messages/index"; diff --git a/api/src/routes/gateway.ts b/api/src/routes/gateway.ts index f2bc5b34..3120718e 100644 --- a/api/src/routes/gateway.ts +++ b/api/src/routes/gateway.ts @@ -1,4 +1,4 @@ -import { Config } from "@fosscord/server-util"; +import { Config } from "@fosscord/util"; import { Router, Response, Request } from "express"; const router = Router(); diff --git a/api/src/routes/guilds/#guild_id/bans.ts b/api/src/routes/guilds/#guild_id/bans.ts index d9752f61..bb3eac03 100644 --- a/api/src/routes/guilds/#guild_id/bans.ts +++ b/api/src/routes/guilds/#guild_id/bans.ts @@ -1,9 +1,9 @@ import { Request, Response, Router } from "express"; -import { BanModel, getPermission, GuildBanAddEvent, GuildBanRemoveEvent, GuildModel, toObject } from "@fosscord/server-util"; +import { BanModel, emitEvent, getPermission, GuildBanAddEvent, GuildBanRemoveEvent, GuildModel, toObject } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { getIpAdress } from "../../../util/ipAddress"; import { BanCreateSchema } from "../../../schema/Ban"; -import { emitEvent } from "../../../util/Event"; + import { check } from "../../../util/instanceOf"; import { removeMember } from "../../../util/Member"; import { getPublicUser } from "../../../util/User"; diff --git a/api/src/routes/guilds/#guild_id/channels.ts b/api/src/routes/guilds/#guild_id/channels.ts index 52361f5e..8d97cf96 100644 --- a/api/src/routes/guilds/#guild_id/channels.ts +++ b/api/src/routes/guilds/#guild_id/channels.ts @@ -8,11 +8,12 @@ import { toObject, ChannelUpdateEvent, AnyChannel, - getPermission -} from "@fosscord/server-util"; + getPermission, + emitEvent +} from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { ChannelModifySchema } from "../../../schema/Channel"; -import { emitEvent } from "../../../util/Event"; + import { check } from "../../../util/instanceOf"; import { createChannel } from "../../../util/Channel"; const router = Router(); @@ -64,7 +65,7 @@ router.patch( const channel = await ChannelModel.findOneAndUpdate({ id: req.body, guild_id }, opts).exec(); - await emitEvent({ event: "CHANNEL_UPDATE", data: channel, channel_id: body.id, guild_id } as ChannelUpdateEvent); + await emitEvent({ event: "CHANNEL_UPDATE", data: toObject(channel), channel_id: body.id, guild_id } as ChannelUpdateEvent); res.json(toObject(channel)); } diff --git a/api/src/routes/guilds/#guild_id/delete.ts b/api/src/routes/guilds/#guild_id/delete.ts index 6cca289e..ba1c2fde 100644 --- a/api/src/routes/guilds/#guild_id/delete.ts +++ b/api/src/routes/guilds/#guild_id/delete.ts @@ -1,5 +1,6 @@ import { ChannelModel, + emitEvent, EmojiModel, GuildDeleteEvent, GuildModel, @@ -8,10 +9,9 @@ import { MessageModel, RoleModel, UserModel -} from "@fosscord/server-util"; +} from "@fosscord/util"; import { Router, Request, Response } from "express"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; const router = Router(); diff --git a/api/src/routes/guilds/#guild_id/index.ts b/api/src/routes/guilds/#guild_id/index.ts index dc4ddb39..1afa603f 100644 --- a/api/src/routes/guilds/#guild_id/index.ts +++ b/api/src/routes/guilds/#guild_id/index.ts @@ -1,6 +1,7 @@ import { Request, Response, Router } from "express"; import { ChannelModel, + emitEvent, EmojiModel, getPermission, GuildDeleteEvent, @@ -12,10 +13,10 @@ import { RoleModel, toObject, UserModel -} from "@fosscord/server-util"; +} from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { GuildUpdateSchema } from "../../../schema/Guild"; -import { emitEvent } from "../../../util/Event"; + import { check } from "../../../util/instanceOf"; import { handleFile } from "../../../util/cdn"; import "missing-native-js-functions"; diff --git a/api/src/routes/guilds/#guild_id/invites.ts b/api/src/routes/guilds/#guild_id/invites.ts index 1894ec96..08048d61 100644 --- a/api/src/routes/guilds/#guild_id/invites.ts +++ b/api/src/routes/guilds/#guild_id/invites.ts @@ -1,4 +1,4 @@ -import { getPermission, InviteModel, toObject } from "@fosscord/server-util"; +import { getPermission, InviteModel, toObject } from "@fosscord/util"; import { Request, Response, Router } from "express"; const router = Router(); diff --git a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts index 9a1676e6..eac6684a 100644 --- a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts +++ b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts @@ -8,13 +8,13 @@ import { getPermission, PermissionResolvable, RoleModel, - GuildMemberUpdateEvent -} from "@fosscord/server-util"; + GuildMemberUpdateEvent, + emitEvent +} from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { addMember, isMember, removeMember } from "../../../../../util/Member"; import { check } from "../../../../../util/instanceOf"; import { MemberChangeSchema } from "../../../../../schema/Member"; -import { emitEvent } from "../../../../../util/Event"; const router = Router(); diff --git a/api/src/routes/guilds/#guild_id/members/#member_id/nick.ts b/api/src/routes/guilds/#guild_id/members/#member_id/nick.ts index 9078409d..5784b5d5 100644 --- a/api/src/routes/guilds/#guild_id/members/#member_id/nick.ts +++ b/api/src/routes/guilds/#guild_id/members/#member_id/nick.ts @@ -1,4 +1,4 @@ -import { getPermission, PermissionResolvable } from "@fosscord/server-util"; +import { getPermission, PermissionResolvable } from "@fosscord/util"; import { Request, Response, Router } from "express"; import { check } from "lambert-server"; import { MemberNickChangeSchema } from "../../../../../schema/Member"; diff --git a/api/src/routes/guilds/#guild_id/members/#member_id/roles/#role_id/index.ts b/api/src/routes/guilds/#guild_id/members/#member_id/roles/#role_id/index.ts index b7a43c74..fad0695e 100644 --- a/api/src/routes/guilds/#guild_id/members/#member_id/roles/#role_id/index.ts +++ b/api/src/routes/guilds/#guild_id/members/#member_id/roles/#role_id/index.ts @@ -1,4 +1,4 @@ -import { getPermission } from "@fosscord/server-util"; +import { getPermission } from "@fosscord/util"; import { Request, Response, Router } from "express"; import { addRole, removeRole } from "../../../../../../../util/Member"; diff --git a/api/src/routes/guilds/#guild_id/members/index.ts b/api/src/routes/guilds/#guild_id/members/index.ts index a157d8f5..70303436 100644 --- a/api/src/routes/guilds/#guild_id/members/index.ts +++ b/api/src/routes/guilds/#guild_id/members/index.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { GuildModel, MemberModel, toObject } from "@fosscord/server-util"; +import { GuildModel, MemberModel, toObject } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { instanceOf, Length } from "../../../../util/instanceOf"; import { PublicMemberProjection, isMember } from "../../../../util/Member"; diff --git a/api/src/routes/guilds/#guild_id/regions.ts b/api/src/routes/guilds/#guild_id/regions.ts index 3a46d766..5ec649ee 100644 --- a/api/src/routes/guilds/#guild_id/regions.ts +++ b/api/src/routes/guilds/#guild_id/regions.ts @@ -1,4 +1,4 @@ -import { Config } from "@fosscord/server-util"; +import { Config } from "@fosscord/util"; import { Request, Response, Router } from "express"; const router = Router(); @@ -7,4 +7,4 @@ router.get("/", async (req: Request, res: Response) => { return res.json(Config.get().regions.available); }); -export default router; \ No newline at end of file +export default router; diff --git a/api/src/routes/guilds/#guild_id/roles.ts b/api/src/routes/guilds/#guild_id/roles.ts index 77206a0f..a4bc44e0 100644 --- a/api/src/routes/guilds/#guild_id/roles.ts +++ b/api/src/routes/guilds/#guild_id/roles.ts @@ -9,10 +9,11 @@ import { MemberModel, GuildRoleCreateEvent, GuildRoleUpdateEvent, - GuildRoleDeleteEvent -} from "@fosscord/server-util"; + GuildRoleDeleteEvent, + emitEvent +} from "@fosscord/util"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; + import { check } from "../../../util/instanceOf"; import { RoleModifySchema } from "../../../schema/Roles"; import { getPublicUser } from "../../../util/User"; diff --git a/api/src/routes/guilds/#guild_id/templates.ts b/api/src/routes/guilds/#guild_id/templates.ts index 8306ac37..fdca1c40 100644 --- a/api/src/routes/guilds/#guild_id/templates.ts +++ b/api/src/routes/guilds/#guild_id/templates.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { TemplateModel, GuildModel, getPermission, toObject, UserModel, Snowflake } from "@fosscord/server-util"; +import { TemplateModel, GuildModel, getPermission, toObject, UserModel, Snowflake } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { TemplateCreateSchema, TemplateModifySchema } from "../../../schema/Template"; import { check } from "../../../util/instanceOf"; diff --git a/api/src/routes/guilds/#guild_id/vanity-url.ts b/api/src/routes/guilds/#guild_id/vanity-url.ts index 323b2647..86adfeb0 100644 --- a/api/src/routes/guilds/#guild_id/vanity-url.ts +++ b/api/src/routes/guilds/#guild_id/vanity-url.ts @@ -1,4 +1,4 @@ -import { getPermission, GuildModel, InviteModel, trimSpecial } from "@fosscord/server-util"; +import { getPermission, GuildModel, InviteModel, trimSpecial } from "@fosscord/util"; import { Router, Request, Response } from "express"; import { HTTPError } from "lambert-server"; import { check, Length } from "../../../util/instanceOf"; diff --git a/api/src/routes/guilds/#guild_id/welcome_screen.ts b/api/src/routes/guilds/#guild_id/welcome_screen.ts index 656a0ee0..c717042e 100644 --- a/api/src/routes/guilds/#guild_id/welcome_screen.ts +++ b/api/src/routes/guilds/#guild_id/welcome_screen.ts @@ -1,7 +1,7 @@ import { Request, Response, Router } from "express"; -import { GuildModel, getPermission, toObject, Snowflake } from "@fosscord/server-util"; +import { GuildModel, getPermission, toObject, Snowflake } from "@fosscord/util"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; + import { check } from "../../../util/instanceOf"; import { isMember } from "../../../util/Member"; import { GuildAddChannelToWelcomeScreenSchema } from "../../../schema/Guild"; diff --git a/api/src/routes/guilds/#guild_id/widget.json.ts b/api/src/routes/guilds/#guild_id/widget.json.ts index 6f777ab4..8719bd85 100644 --- a/api/src/routes/guilds/#guild_id/widget.json.ts +++ b/api/src/routes/guilds/#guild_id/widget.json.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { Config, Permissions, GuildModel, InviteModel, ChannelModel, MemberModel } from "@fosscord/server-util"; +import { Config, Permissions, GuildModel, InviteModel, ChannelModel, MemberModel } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { random } from "../../../util/RandomInviteID"; diff --git a/api/src/routes/guilds/#guild_id/widget.png.ts b/api/src/routes/guilds/#guild_id/widget.png.ts index a0a8c938..80dc9f2b 100644 --- a/api/src/routes/guilds/#guild_id/widget.png.ts +++ b/api/src/routes/guilds/#guild_id/widget.png.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { GuildModel } from "@fosscord/server-util"; +import { GuildModel } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import fs from "fs"; import path from "path"; diff --git a/api/src/routes/guilds/#guild_id/widget.ts b/api/src/routes/guilds/#guild_id/widget.ts index 0e6df186..85eed5e9 100644 --- a/api/src/routes/guilds/#guild_id/widget.ts +++ b/api/src/routes/guilds/#guild_id/widget.ts @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { getPermission, GuildModel } from "@fosscord/server-util"; +import { getPermission, GuildModel } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { check } from "../../../util/instanceOf"; import { WidgetModifySchema } from "../../../schema/Widget"; diff --git a/api/src/routes/guilds/index.ts b/api/src/routes/guilds/index.ts index 25b55896..c97a8205 100644 --- a/api/src/routes/guilds/index.ts +++ b/api/src/routes/guilds/index.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { RoleModel, GuildModel, Snowflake, Guild, RoleDocument, Config } from "@fosscord/server-util"; +import { RoleModel, GuildModel, Snowflake, Guild, RoleDocument, Config } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { check } from "./../../util/instanceOf"; import { GuildCreateSchema } from "../../schema/Guild"; diff --git a/api/src/routes/guilds/templates/index.ts b/api/src/routes/guilds/templates/index.ts index 0f332de0..7fed3c5d 100644 --- a/api/src/routes/guilds/templates/index.ts +++ b/api/src/routes/guilds/templates/index.ts @@ -1,6 +1,6 @@ import { Request, Response, Router } from "express"; const router: Router = Router(); -import { TemplateModel, GuildModel, toObject, UserModel, RoleModel, Snowflake, Guild, Config } from "@fosscord/server-util"; +import { TemplateModel, GuildModel, toObject, UserModel, RoleModel, Snowflake, Guild, Config } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { GuildTemplateCreateSchema } from "../../../schema/Guild"; import { getPublicUser } from "../../../util/User"; diff --git a/api/src/routes/invites/index.ts b/api/src/routes/invites/index.ts index 8c04713c..992694df 100644 --- a/api/src/routes/invites/index.ts +++ b/api/src/routes/invites/index.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { getPermission, InviteModel, toObject } from "@fosscord/server-util"; +import { getPermission, InviteModel, toObject } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { addMember } from "../../util/Member"; const router: Router = Router(); diff --git a/api/src/routes/users/@me/channels.ts b/api/src/routes/users/@me/channels.ts index a425a25f..db9f8832 100644 --- a/api/src/routes/users/@me/channels.ts +++ b/api/src/routes/users/@me/channels.ts @@ -8,10 +8,11 @@ import { trimSpecial, Channel, DMChannel, - UserModel -} from "@fosscord/server-util"; + UserModel, + emitEvent +} from "@fosscord/util"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; + import { DmChannelCreateSchema } from "../../../schema/Channel"; import { check } from "../../../util/instanceOf"; diff --git a/api/src/routes/users/@me/delete.ts b/api/src/routes/users/@me/delete.ts index edda8e2d..f863237d 100644 --- a/api/src/routes/users/@me/delete.ts +++ b/api/src/routes/users/@me/delete.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { GuildModel, MemberModel, UserModel } from "@fosscord/server-util"; +import { GuildModel, MemberModel, UserModel } from "@fosscord/util"; import bcrypt from "bcrypt"; const router = Router(); diff --git a/api/src/routes/users/@me/disable.ts b/api/src/routes/users/@me/disable.ts index 0e5b734e..2d3a9850 100644 --- a/api/src/routes/users/@me/disable.ts +++ b/api/src/routes/users/@me/disable.ts @@ -1,4 +1,4 @@ -import { UserModel } from "@fosscord/server-util"; +import { UserModel } from "@fosscord/util"; import { Router, Response, Request } from "express"; import bcrypt from "bcrypt"; diff --git a/api/src/routes/users/@me/guilds.ts b/api/src/routes/users/@me/guilds.ts index 6528552b..a9b53b75 100644 --- a/api/src/routes/users/@me/guilds.ts +++ b/api/src/routes/users/@me/guilds.ts @@ -1,7 +1,7 @@ import { Router, Request, Response } from "express"; -import { GuildModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent, toObject } from "@fosscord/server-util"; +import { GuildModel, MemberModel, UserModel, GuildDeleteEvent, GuildMemberRemoveEvent, toObject, emitEvent } from "@fosscord/util"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; + import { getPublicUser } from "../../../util/User"; const router: Router = Router(); @@ -32,10 +32,10 @@ router.delete("/:id", async (req: Request, res: Response) => { emitEvent({ event: "GUILD_DELETE", data: { - id: guild_id, + id: guild_id }, - user_id: req.user_id, - } as GuildDeleteEvent), + user_id: req.user_id + } as GuildDeleteEvent) ]); const user = await getPublicUser(req.user_id); @@ -44,9 +44,9 @@ router.delete("/:id", async (req: Request, res: Response) => { event: "GUILD_MEMBER_REMOVE", data: { guild_id: guild_id, - user: user, + user: user }, - guild_id: guild_id, + guild_id: guild_id } as GuildMemberRemoveEvent); return res.sendStatus(204); diff --git a/api/src/routes/users/@me/index.ts b/api/src/routes/users/@me/index.ts index 7bd4a486..c073e78a 100644 --- a/api/src/routes/users/@me/index.ts +++ b/api/src/routes/users/@me/index.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from "express"; -import { UserModel, toObject, PublicUserProjection } from "@fosscord/server-util"; +import { UserModel, toObject, PublicUserProjection } from "@fosscord/util"; import { getPublicUser } from "../../../util/User"; import { UserModifySchema } from "../../../schema/User"; import { check } from "../../../util/instanceOf"; diff --git a/api/src/routes/users/@me/relationships.ts b/api/src/routes/users/@me/relationships.ts index a8f03143..642ee5f9 100644 --- a/api/src/routes/users/@me/relationships.ts +++ b/api/src/routes/users/@me/relationships.ts @@ -5,11 +5,12 @@ import { toObject, RelationshipType, RelationshipRemoveEvent, - UserDocument -} from "@fosscord/server-util"; + UserDocument, + emitEvent +} from "@fosscord/util"; import { Router, Response, Request } from "express"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "../../../util/Event"; + import { check, Length } from "../../../util/instanceOf"; const router = Router(); diff --git a/api/src/schema/Channel.ts b/api/src/schema/Channel.ts index 48c3a1d2..18a8f835 100644 --- a/api/src/schema/Channel.ts +++ b/api/src/schema/Channel.ts @@ -1,4 +1,4 @@ -import { ChannelType } from "@fosscord/server-util"; +import { ChannelType } from "@fosscord/util"; import { Length } from "../util/instanceOf"; export const ChannelModifySchema = { diff --git a/api/src/schema/Guild.ts b/api/src/schema/Guild.ts index 0443e64c..ce40b49f 100644 --- a/api/src/schema/Guild.ts +++ b/api/src/schema/Guild.ts @@ -1,4 +1,4 @@ -import { ChannelSchema, GuildChannel } from "@fosscord/server-util"; +import { ChannelSchema, GuildChannel } from "@fosscord/util"; import { Length } from "../util/instanceOf"; export const GuildCreateSchema = { diff --git a/api/src/schema/Message.ts b/api/src/schema/Message.ts index 8423d706..2dd54f0c 100644 --- a/api/src/schema/Message.ts +++ b/api/src/schema/Message.ts @@ -1,4 +1,4 @@ -import { Embed, EmbedImage } from "@fosscord/server-util"; +import { Embed, EmbedImage } from "@fosscord/util"; import { Length } from "../util/instanceOf"; export const MessageCreateSchema = { diff --git a/api/src/test/test.ts b/api/src/test/test.ts index 478edcc4..c37c762b 100644 --- a/api/src/test/test.ts +++ b/api/src/test/test.ts @@ -1,3 +1,3 @@ -import { Snowflake } from "@fosscord/server-util"; +import { Snowflake } from "@fosscord/util"; console.log(Snowflake.deconstruct("0")); diff --git a/api/src/util/Channel.ts b/api/src/util/Channel.ts index 4d322812..ef04d521 100644 --- a/api/src/util/Channel.ts +++ b/api/src/util/Channel.ts @@ -2,18 +2,18 @@ import { ChannelCreateEvent, ChannelModel, ChannelType, + emitEvent, getPermission, GuildModel, Snowflake, TextChannel, + toObject, VoiceChannel -} from "@fosscord/server-util"; +} from "@fosscord/util"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "./Event"; // TODO: DM channel export async function createChannel(channel: Partial, user_id: string = "0") { - // Always check if user has permission first const permissions = await getPermission(user_id, channel.guild_id); permissions.hasThrow("MANAGE_CHANNELS"); @@ -50,7 +50,7 @@ export async function createChannel(channel: Partial recipient_ids: null }).save(); - await emitEvent({ event: "CHANNEL_CREATE", data: channel, guild_id: channel.guild_id } as ChannelCreateEvent); + await emitEvent({ event: "CHANNEL_CREATE", data: toObject(channel), guild_id: channel.guild_id } as ChannelCreateEvent); return channel; } diff --git a/api/src/util/Config.ts b/api/src/util/Config.ts index e2e0d312..c86afbe7 100644 --- a/api/src/util/Config.ts +++ b/api/src/util/Config.ts @@ -1,7 +1,7 @@ // @ts-nocheck import Ajv, { JSONSchemaType } from "ajv"; -import { getConfigPathForFile } from "@fosscord/server-util/dist/util/Config"; -import { Config } from "@fosscord/server-util"; +import { getConfigPathForFile } from "@fosscord/util/dist/util/Config"; +import { Config } from "@fosscord/util"; export interface RateLimitOptions { count: number; diff --git a/api/src/util/Event.ts b/api/src/util/Event.ts deleted file mode 100644 index 4dd56417..00000000 --- a/api/src/util/Event.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Config, Event, EventModel, RabbitMQ } from "@fosscord/server-util"; - -export async function emitEvent(payload: Omit) { - if (RabbitMQ.connection) { - const id = (payload.channel_id || payload.user_id || payload.guild_id) as string; - if (!id) console.error("event doesn't contain any id", payload); - const data = typeof payload.data === "object" ? JSON.stringify(payload.data) : payload.data; // use rabbitmq for event transmission - await RabbitMQ.channel?.assertExchange(id, "fanout", { durable: false }); - - // assertQueue isn't needed, because a queue will automatically created if it doesn't exist - const successful = RabbitMQ.channel?.publish(id, "", Buffer.from(`${data}`), { type: payload.event }); - if (!successful) throw new Error("failed to send event"); - } else { - // use mongodb for event transmission - // TODO: use event emitter for local server bundle - const obj = { - created_at: new Date(), // in seconds - ...payload - }; - // TODO: bigint isn't working - - return await new EventModel(obj).save(); - } -} - -export async function emitAuditLog(payload: any) {} diff --git a/api/src/util/Member.ts b/api/src/util/Member.ts index 7b06720b..ee3f64ad 100644 --- a/api/src/util/Member.ts +++ b/api/src/util/Member.ts @@ -11,11 +11,12 @@ import { toObject, UserModel, GuildDocument, - Config -} from "@fosscord/server-util"; + Config, + emitEvent +} from "@fosscord/util"; import { HTTPError } from "lambert-server"; -import { emitEvent } from "./Event"; + import { getPublicUser } from "./User"; export const PublicMemberProjection = { diff --git a/api/src/util/Message.ts b/api/src/util/Message.ts index e811f522..a55c3365 100644 --- a/api/src/util/Message.ts +++ b/api/src/util/Message.ts @@ -1,14 +1,14 @@ -import { ChannelModel, Embed, Message, MessageCreateEvent, MessageUpdateEvent } from "@fosscord/server-util"; -import { Snowflake } from "@fosscord/server-util"; -import { MessageModel } from "@fosscord/server-util"; -import { PublicMemberProjection } from "@fosscord/server-util"; -import { toObject } from "@fosscord/server-util"; -import { getPermission } from "@fosscord/server-util"; +import { ChannelModel, Embed, emitEvent, Message, MessageCreateEvent, MessageUpdateEvent } from "@fosscord/util"; +import { Snowflake } from "@fosscord/util"; +import { MessageModel } from "@fosscord/util"; +import { PublicMemberProjection } from "@fosscord/util"; +import { toObject } from "@fosscord/util"; +import { getPermission } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import fetch from "node-fetch"; import cheerio from "cheerio"; -import { emitEvent } from "./Event"; -import { MessageType } from "@fosscord/server-util/dist/util/Constants"; + +import { MessageType } from "@fosscord/util/dist/util/Constants"; // TODO: check webhook, application, system author const LINK_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g; diff --git a/api/src/util/User.ts b/api/src/util/User.ts index 107fc759..392c7101 100644 --- a/api/src/util/User.ts +++ b/api/src/util/User.ts @@ -1,4 +1,4 @@ -import { toObject, UserModel, PublicUserProjection } from "@fosscord/server-util"; +import { toObject, UserModel, PublicUserProjection } from "@fosscord/util"; import { HTTPError } from "lambert-server"; export { PublicUserProjection }; diff --git a/api/src/util/cdn.ts b/api/src/util/cdn.ts index aed8ca0a..3c71d980 100644 --- a/api/src/util/cdn.ts +++ b/api/src/util/cdn.ts @@ -1,4 +1,4 @@ -import { Config } from "@fosscord/server-util"; +import { Config } from "@fosscord/util"; import FormData from "form-data"; import { HTTPError } from "lambert-server"; import fetch from "node-fetch"; diff --git a/api/src/util/ipAddress.ts b/api/src/util/ipAddress.ts index f2c8fd4d..0a724daa 100644 --- a/api/src/util/ipAddress.ts +++ b/api/src/util/ipAddress.ts @@ -1,4 +1,4 @@ -import { Config } from "@fosscord/server-util"; +import { Config } from "@fosscord/util"; import { Request } from "express"; // use ipdata package instead of simple fetch because of integrated caching import fetch from "node-fetch"; diff --git a/api/src/util/passwordStrength.ts b/api/src/util/passwordStrength.ts index cc503843..dfffa2c0 100644 --- a/api/src/util/passwordStrength.ts +++ b/api/src/util/passwordStrength.ts @@ -1,4 +1,4 @@ -import { Config } from "@fosscord/server-util"; +import { Config } from "@fosscord/util"; import "missing-native-js-functions"; const reNUMBER = /[0-9]/g; diff --git a/cdn/package-lock.json b/cdn/package-lock.json index 6a51d710c7d0bc4a5cc574a1616f270772b86db4..0c87d5c315b76ba383b037038a3151c12ad6f253 100644 GIT binary patch delta 360 zcmbQbgZ;rF_6aM+GZKqE^NLFnb8>={i!uvJl&lm=ib_)_E{>FQNXsuSPR=h%(Jw8@ z%mGR$rDf)%TIuP5`IGPEi%(krG5aCo?%UuQ(MX?jGP1W;{7iS9Y?$DEo8+R>qC|iMfRZIhjcy**F6|i^(ro zH!~aSnNOa_<~8{wlbQgUyxwHNEZNQSEDx9_E3j~CL)}^pc0f^Taehu&Y6{3Ks1xB% z$jhD_Xdt`!AKT;qoN%8`Heiw9LH6eKLP); await Config.init(); - console.log("[Database] connected"); this.app.use((req, res, next) => { res.set("Access-Control-Allow-Origin", "*"); // TODO: use better CSP policy @@ -33,31 +31,31 @@ export class CDNServer extends Server { await this.registerRoutes(path.join(__dirname, "routes/")); this.app.use("/icons/", avatarsRoute); - this.log("info", "[Server] Route /icons registered"); + this.log("verbose", "[Server] Route /icons registered"); this.app.use("/emojis/", avatarsRoute); - this.log("info", "[Server] Route /emojis registered"); + this.log("verbose", "[Server] Route /emojis registered"); this.app.use("/stickers/", avatarsRoute); - this.log("info", "[Server] Route /stickers registered"); + this.log("verbose", "[Server] Route /stickers registered"); this.app.use("/banners/", avatarsRoute); - this.log("info", "[Server] Route /banners registered"); - + this.log("verbose", "[Server] Route /banners registered"); + this.app.use("/splashes/", avatarsRoute); - this.log("info", "[Server] Route /splashes registered"); + this.log("verbose", "[Server] Route /splashes registered"); this.app.use("/app-icons/", avatarsRoute); - this.log("info", "[Server] Route /app-icons registered"); + this.log("verbose", "[Server] Route /app-icons registered"); this.app.use("/app-assets/", avatarsRoute); - this.log("info", "[Server] Route /app-assets registered"); + this.log("verbose", "[Server] Route /app-assets registered"); this.app.use("/discover-splashes/", avatarsRoute); - this.log("info", "[Server] Route /discover-splashes registered"); + this.log("verbose", "[Server] Route /discover-splashes registered"); this.app.use("/team-icons/", avatarsRoute); - this.log("info", "[Server] Route /team-icons registered"); + this.log("verbose", "[Server] Route /team-icons registered"); return super.start(); } diff --git a/cdn/src/routes/attachments.ts b/cdn/src/routes/attachments.ts index c387aa37..6ce64ed4 100644 --- a/cdn/src/routes/attachments.ts +++ b/cdn/src/routes/attachments.ts @@ -1,5 +1,5 @@ import { Router, Response, Request } from "express"; -import { Config, Snowflake } from "@fosscord/server-util"; +import { Config, Snowflake } from "@fosscord/util"; import { storage } from "../util/Storage"; import FileType from "file-type"; import { HTTPError } from "lambert-server"; diff --git a/cdn/src/routes/avatars.ts b/cdn/src/routes/avatars.ts index 60befe2c..03388afc 100644 --- a/cdn/src/routes/avatars.ts +++ b/cdn/src/routes/avatars.ts @@ -1,5 +1,5 @@ import { Router, Response, Request } from "express"; -import { Config, Snowflake } from "@fosscord/server-util"; +import { Config, Snowflake } from "@fosscord/util"; import { storage } from "../util/Storage"; import FileType from "file-type"; import { HTTPError } from "lambert-server"; diff --git a/cdn/src/routes/external.ts b/cdn/src/routes/external.ts index 3abe9c22..625b6bbd 100644 --- a/cdn/src/routes/external.ts +++ b/cdn/src/routes/external.ts @@ -4,7 +4,7 @@ import { Router, Response, Request } from "express"; import fetch from "node-fetch"; import crypto from "crypto"; import { HTTPError } from "lambert-server"; -import { Snowflake } from "@fosscord/server-util"; +import { Snowflake } from "@fosscord/util"; import { storage } from "../util/Storage"; const router = Router(); From 0a08938d181bb6c30f480aa2f479bc4a22fce9df Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 13 Aug 2021 13:00:16 +0200 Subject: [PATCH 4/6] cleanup rtc --- rtc/package-lock.json | Bin 47678 -> 0 bytes rtc/package.json | 48 --- rtc/src/index.ts | 10 - rtc/src/models/Activity.ts | 132 --------- rtc/src/models/Application.ts | 67 ----- rtc/src/models/AuditLog.ts | 220 -------------- rtc/src/models/Ban.ts | 32 -- rtc/src/models/Channel.ts | 109 ------- rtc/src/models/Emoji.ts | 29 -- rtc/src/models/Event.ts | 540 ---------------------------------- rtc/src/models/Guild.ts | 161 ---------- rtc/src/models/Interaction.ts | 32 -- rtc/src/models/Invite.ts | 95 ------ rtc/src/models/Member.ts | 109 ------- rtc/src/models/Message.ts | 368 ----------------------- rtc/src/models/RateLimit.ts | 25 -- rtc/src/models/ReadState.ts | 26 -- rtc/src/models/Role.ts | 42 --- rtc/src/models/Status.ts | 13 - rtc/src/models/Team.ts | 17 -- rtc/src/models/Template.ts | 51 ---- rtc/src/models/User.ts | 252 ---------------- rtc/src/models/VoiceState.ts | 34 --- rtc/src/models/Webhook.ts | 84 ------ rtc/src/models/index.ts | 89 ------ rtc/src/util/BitField.ts | 143 --------- rtc/src/util/Config.ts | 284 ------------------ rtc/src/util/Constants.ts | 28 -- rtc/src/util/Database.ts | 151 ---------- rtc/src/util/Intents.ts | 21 -- rtc/src/util/MessageFlags.ts | 14 - rtc/src/util/MongoBigInt.ts | 82 ------ rtc/src/util/Permissions.ts | 262 ----------------- rtc/src/util/RabbitMQ.ts | 18 -- rtc/src/util/Regex.ts | 3 - rtc/src/util/Snowflake.ts | 127 -------- rtc/src/util/String.ts | 7 - rtc/src/util/UserFlags.ts | 22 -- rtc/src/util/checkToken.ts | 24 -- rtc/src/util/index.ts | 9 - rtc/src/util/toBigInt.ts | 3 - rtc/tsconfig.json | 70 ----- webrtc/package.json | 1 + webrtc/src/Server.ts | 5 +- 44 files changed, 3 insertions(+), 3856 deletions(-) delete mode 100644 rtc/package-lock.json delete mode 100644 rtc/package.json delete mode 100644 rtc/src/index.ts delete mode 100644 rtc/src/models/Activity.ts delete mode 100644 rtc/src/models/Application.ts delete mode 100644 rtc/src/models/AuditLog.ts delete mode 100644 rtc/src/models/Ban.ts delete mode 100644 rtc/src/models/Channel.ts delete mode 100644 rtc/src/models/Emoji.ts delete mode 100644 rtc/src/models/Event.ts delete mode 100644 rtc/src/models/Guild.ts delete mode 100644 rtc/src/models/Interaction.ts delete mode 100644 rtc/src/models/Invite.ts delete mode 100644 rtc/src/models/Member.ts delete mode 100644 rtc/src/models/Message.ts delete mode 100644 rtc/src/models/RateLimit.ts delete mode 100644 rtc/src/models/ReadState.ts delete mode 100644 rtc/src/models/Role.ts delete mode 100644 rtc/src/models/Status.ts delete mode 100644 rtc/src/models/Team.ts delete mode 100644 rtc/src/models/Template.ts delete mode 100644 rtc/src/models/User.ts delete mode 100644 rtc/src/models/VoiceState.ts delete mode 100644 rtc/src/models/Webhook.ts delete mode 100644 rtc/src/models/index.ts delete mode 100644 rtc/src/util/BitField.ts delete mode 100644 rtc/src/util/Config.ts delete mode 100644 rtc/src/util/Constants.ts delete mode 100644 rtc/src/util/Database.ts delete mode 100644 rtc/src/util/Intents.ts delete mode 100644 rtc/src/util/MessageFlags.ts delete mode 100644 rtc/src/util/MongoBigInt.ts delete mode 100644 rtc/src/util/Permissions.ts delete mode 100644 rtc/src/util/RabbitMQ.ts delete mode 100644 rtc/src/util/Regex.ts delete mode 100644 rtc/src/util/Snowflake.ts delete mode 100644 rtc/src/util/String.ts delete mode 100644 rtc/src/util/UserFlags.ts delete mode 100644 rtc/src/util/checkToken.ts delete mode 100644 rtc/src/util/index.ts delete mode 100644 rtc/src/util/toBigInt.ts delete mode 100644 rtc/tsconfig.json diff --git a/rtc/package-lock.json b/rtc/package-lock.json deleted file mode 100644 index 4977468dc5b18a77ddc1d0cd28ac95acaf85febf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47678 zcmeHw*V3y>lJ52HrVNTy(cU)!c5z(YF2oft7X^gn<3?YD2>6#V0JXlbe^u(oy*B5rgO$J6zT+_)F?!L1 z0rpGZFC%lg<`J-|-$i4^nUZctL;y~J1{~bK$3yIPo{jQ7XxRB;Kp`UV4GzKI6peRe zAQBhJxL$LX%#_rj-y1Q6K)5YUb_E_j*ul1S>%S1h6hz6g&EUJLD@W_QW{P)2ks@*- zUyNvdx5e-b*EdPE1<{o301~tgOcg5?8+`lNEAWF|V_O?dv_S`Jk*YsM4X3Gc?#`%q zO+=>AdWkx2aCaE4<}}GEdm<=Jtj2EESgqH3y+U?Syic+#mY{1$&-ecN*UK$=0m|8B zYQCBIFNrCIu%>&*!?3Tgwu=J^UA6E+1 zR<*St{N1d&o8l!OQG9%sgYi?LV}UvXW066m0_Jn9&preMP=sKBKgEd33mlZy+})~+ z$!-*uIZpQvX4w<{l|l>BR#Ml6P!4Bdncl3Kki&ud4JdT z(3LVkc(Xnc3lx9c(iYM5Tb1%;rnNPt$F@YPt7~(7w5}Bl+CVhXTeZYSe^?^-P5D%z zx5LV0ET$ys4?^&&uruI6{rzL}??M#dcKHNmAE5ODGV!n#TtcD`$fAELkxh@D@22$y zCdqSr>NR>yU0>k+{;I#5F0D1e?~c1lzc%idNrNa!8-k};2FEMC#u}GS&4S^Vx>~vU z9%Pp(_wAoiW+@Yw!4g=U( zHEROHa3iT)M#qcsqxM?iY-b7k;NyI>#A^cdfpd!)fm`+LArLtpO&^5a^aY!18Sbyr*1cAcps zmOkH}3iX;S>a}{WIjs%LjV(@bZR|92LeEg0(}Ed=8oy^7SOfL^!H%pLcCF#m{F-h% zojLOf@<2w;&`0jkQ)82`fA6Q}V4S$EKML{9J<=H8oB$w$JH5b|rA~#}_&BYucFRiF z8ZlzUpIOIolWDZO3PKaRP9U{QC$fY#yrJ25lp4=;>c>iTVpvs_T~qzNvD?m_?%~kz zcUZksXS#2is2H<%F}|3z45GKb{)eDKq5wkprx+7@fmwH|Z^o0A(Qzef<=ZmrhWo&v zt)4LRWxEG_r5!a_`61h|O`MQg>XsUZCWldFJs_5C&nwL-b3f>;B%`xlcd>DMG_#>x z=1bT)bjfi214bE80<41nzh!&3CAo~_3ma>S&a&K^&Zl@!tq4?MVist7*{S zu;@4l6~XannxCT}5S;Pniz48E`v$`%_)}4`4-OkU>y8;cVjQfTPk!e#1*j?z*=eSQ z2)f1!rVySa^_eUGB1F1y_O5VWsKL=b$GA~!guW1LiCY$!%IRcOw%C-eP?S{IPCKN> z%WRL^Vcp$gwkWBRxGwMA30rGU#N`Yxkf(|xpgX6^wM1m2cfwW$)dmGn z3ycCuVBh`!_`iPzvUH87EoLti&%~nJSJMGK7+etRU*ro=hk83DB7!PPYB~)PyWHR& z=o>>F>6|1|PVt(V>M7RW6@Zu=kbw9j@E!qzFGOIYQ^#7rGYk3sx?q;ps#^CYy2;lU zWce7L{QjoZU)XEHp*Jq(FINR7^qWfK$gg)4TAM9qr$UJ;ZCdzo-Z{CfGE=y@4ISCUt?MMs7 z+sx~B<0DS8LYUzQiX--+OM6Eauy%K(c&7Sftg+&Ly67$3-LO*WdIxe_D$}iMWz9B4 z{&Y=dDa z1%38NqSA^nkC9l{y~{>I59)+i>B5HxgY-OS2I4@zt(vk%D7}dzHuwJ8vl=+EpK=A& zLno6yHVlW|ddZz5lGW=T|SHmx!Ebb*t~pw;NBy2a57Iij^* zV>}s}cEjNjZ)$7Dzyb+^!eb@QLLVr@bt*UhF4wFKMN=+Dm%fn6+ElP~%tJff4MtU~ zsDwEE6|yiKZZ)nnNkkVHhaOEKGXu9I4C(Z6W;n30mfvZtkl7L)Xu@Dp<7V?k)7h%y zDPdqj_egroH|K^`0DJOp8`^+Qz^lZ$XXCzqp??K9;B zv*IKnjips#h&7v4yk_GbX3a*8<4K~;YGFr6=$bIM{iRytv7TQT9xL|nSWrr9az^*L z(5fDHD}PlkF#M@{IeWEHA3m4I4?~}OyK&_#i54P$ zUKzbEDcDZG7gp)9wLoVJbrTM$Lxr%+f~HlZ!m_{EbghHbZ_n1MCDK-XcNjJHq3q2H zldwx#D5-avq=_ATm6i1>Q*pV$VxdS3>gX@92w)NPi2yTSzM2;@>bDxHMXKrACm;`*$l{rX3O6MHJn~PJ51z=JvfDv@7pH0%0C^_cd zYr2Z3H+g)o^m~<~&{@e1@$rzVh658HnJ0zu@P|(d3I_nOXi(t?AcTO#lP89w+TKcS zS{(K;z1Cf}g4tB=p9pn|k+_KNR%L@6ng(g?4BlhHKpZxa?X={YEEmYw0a@!hFHL2bkvU`LY9#>QRpfv4rKyE^F2G+Hay?*SE{Zikj{Jy`GtE+mM>>Arp z(k7&~I`qj=m3t-jl2z2$N z_7V|06P2Kv+kW+6d6Rl;OdL^sz*PrZD#W?|uu$-2z0)3w9Y(TO7FupD=8Xyzv3yxc zrGPRRKqK{GwkswFn2$e3wyyGm>l5PknN0=R%1n7324ve^%qE+yFdVqXgs@ek#XI3* zpojWw7dEXEK^}G`qR>@a5>4V^pVo#wfz&sI&s6xWup7<{!F$4WtP*p1{?JmM^(*8! zqWaRd!%^lQEEoEIcQn@~8*Xy6c^w-ea-d@hrJ_CqoE@uCP@L95oN=bgf@KQ7 zx~c9b9y(A-mECtjSM8Er+vs#hU9E9l%6l>~p5{!hX}=6GQ2TxiOq3grkcmFM^yRUl zQ>A#iCtA*dAzKROIM|-+d&)4_2A}2oCZ{19tKbzvK-LJ4H5-DXx|`$IW55 zQ!#mbIQ5ujdofwgXPe{tu&T70$XuPc4c`?F+t8aEd^o8n^O;Zk*j&~swh;;ji&_)e zbeKs{=AFlJ3VhB~k!J=GxGedhK~0mqAQ9goTBv+wK{rQlwV%_qlI%l&ZGVnf^!AtI=soZ&i z6`o8OImbO9`33V^7w#=V0n4!wp(=>iE&Kgn65djFW6@LINZqAC@|3~LSx$Uurs+@S#W1p=ObU#9w%lX)~PhmZ{Kpf z(BwDQak{3HFN5{M`8&&c2JMvSzZ>KLN)g%?@LQnQ_#Ex+K;E@mHJMz<^15Tw(?N*r zHVaE?&?xFy-Br!S?4!}JC(B*v)jK-fS+9T|?3hAL;4u%;`3hd0bo9Y)OY^7s!eY?D zE40s|_3ihREP*wuPa!)orXWCZ&Y%YK#UCbe&cpz4=MTUefapEPj$RBxd|Ka>#udU- z>!p3OV)g?g*zk%;(!6gBe0;b8^{l;(>}(`~={0M_sO0F}pgHho(-}GzNMv#xn}?n+ z?FWK4X^tOzKUvL}VLYV>-xZfTssMqzBcKcyYR|_|fR(qgvo!`mb=Y7?O;|2QOEK&X z>HTW)a4k2!NlHs+xJfDPPq~T7rr3!OfoTD3!Bc+Nc4aeQ32D_Rt;IG-P<#ELv%1U2Q7@wU-H1H-Od5g{fliCN6tgzkLP5fIh4v zPR2b&I?Yz6>&W&v_>FHOj<8_OMHx6wmvl330r5X zX^zfEB4(bMa;%8a`@OwfIe{9Eoa$y(a?FYZ;(}H0VN7tj?ZqF;VI*;dKAb?1;*|;b z4KM)LvYx564nNs+57U9aE?2}6k1xByuz+%mTze>KiU3wX0#MQYMiFS4OUSZA>5LapRRbmGb=OBaQXd1`~Bn& z5VXfT!vKb_y`&Sxd&GKkzz$?%&Qr#^)B-ErMyIylQuusTs*?rOnSlg)zlQ~5V#O8w zp^L3rjdhp8fT=H)sK)$=TYOgtC!12x(k*fay`%?l!3})T-n0xfsjX`7PJv5>JA~m( z7bw}+OFfuMw+WGU)KEp*8&909MRqz^t|yb~WZ#{0&SX8L6@#x~=ut(jMr(-^l|~(x zMk|IjM12Yth-!yP-RxHyf>GG_yPYz56`Kcc__-Pt4oKok#~U7iw+Q^jI1oCob40%N zjTaefkT%m7C-B6-=d9Df)9hwNLF6_{3Mtlp4DJn{m##0 zf#GCH0L$cHQ>qz6^Zmo?!2`k!#G6-HDx>R3ZQ>)2A~c`OpYzUw%mf0d6X4sQ#pt6M z1n9+6=(4c|#t4t?N0b#dEqaazg3L2>on8tHLENqfAT0D91r^~i-s#kjYWJ@cQ=O5Ost|5lASCi}^TNk~dq=N(X~F8G z8SNT{f!3AmWw95|$xF@yY)=(@y~xR$nh;NtBzLp3a zNA;;m`E23?5>Hp36FAa)aAJ8+Zvh97^274?_Qs#rk{M9S)>w6P-r-vqGhzoLVR` z!*IOo4-{o;+GWo!?*o52n38t4)wivBV3fVqY+hT5M0+}!F@)P5V#_%@0^e+NDvV(! z`}vH_la|aBO-awEGc-d#J!S7DHOl?I3i7uaQa5JH3Id!z8dNFwXhBei?#ACy1(~mJ z`4v7kdaKzeT#N&u;i%5Bxt{JS)SB4$nuR%aJQO^4u_m_ouH3C|$l7ivJr43?Il8TW zyw2qeSgA?*5m-DML&LL?Lr{I8%aobCB|J>(v+igl9J#3zESSJHP~Vrg>`+^Elu~cf znHMGlKj=#294%okS1z#&mr=ylv2A%)r&`$z=iWgq2Q6l8jE=8#SycB33jlxEA-MPf ze@hurn0QKSgiPY;U+NG%m@pTmnHlet5`BBTAuTxC@NcwB<(1tMSlpbuhmLG-R@AuG z^Z8Op;+=|1wEW|0HKWFqbd-;EN82m|3=gS}HI(+%a9+^Y%Cxh!}(>`T*tuFhwus!Rk061_N=~sCd$`K3rB0d*RdB{l@|4NO+{3a0*j>GveOu|=Du>p z=8j~ zic8rdEM5%bWYgFf(>j7NIA@&vtyc;*mW5UKr5Z)7TY6_R<59#R5MpZZvxCo0;g;=# z8XmcBX=TjxjwSD_)q1JS5!2f6s)y8oyM@nf#9MTp?i7t(F@PgB3JI+C{1tdW~iU29f) ztzLKBYwvayy0S5Z{$$g3YYlr*II?B;gv9Knk8`o6Sof&6nb3cr`?#Y6|zCRTCaIef6$k6Qc64-#n2wS4sFSHO^w;J-gN)4J} zw>oQs&6iWGdMr$V^(rjzsV|Q+Y`Tx{1&AE?phL7SHg%>sf6xOFl^LGDWkzX`kBz-4`h?e=PGwG@C2FbhH= zM!lYjF;H7RK*mu6xK%ALfJ&{0ziS=z3pt3uktBPC*kXoM@ zOn0o=LmGN%D>CS4YV*coxGimjs&*JnJGjMkMx*i6)$syFw{&ym3NF9d1+023ac*PM z<5>T8 zWngHJW2Nj?p^Vajf$$~o@vgAkQ3Xic9f{V4>o1__vIng}RE|S-(DYTum+D%jG%YNCc%IPrf8IAT}XzR#6s2yfIXQxaNwH)m5Rcp!Wl`uqm`N_?T0eGoNuIt)E>8%j3~+Q3TJ&qaCF%@tv-K2C zyyQIW(FeK_fK(}W=~5Rx_0vk(y8*d%ly09UBN4y4yK(3GXZTNv#QQVint+R@!}V)q zeqX7D1=z4;4Q3Rh1i`3uVDb9UX?3N2#b^!s$LXL&*DBV|3v7MdHSE?56Q`qvI$>rt zL(#hnti}--Xqj+inNY43baXy<(crN&k`wXgqVS_FBiV-!%e(}o7+ z>_I>_#&WfTSfeS}T=INF`6V`pnsvZA3Nk7w&2Upy24gQ^m4EwtzG=R|aM$)D12Clj zp;w61F5AK$>IyAR#Df?WaTDp zzkg_wp1YPtG_Saw@9}b)V#Sk;DouXE_`{8O;u@6Bv5HK2c;G&);kgs4Tp9S#3rUlV zn25Sno(De?*(YWfE6T&RIh@GT!l5LHgxK{9+LAx?*9->s)4eQ`d_8V2O-qucd{?!m zC<1m<-#{b_J=Ev^mZ_I%4XqO#uP6lDcSVNsXY|Odv;7slI#p@BYhb;CuCsHkjuy58 z)A3JUwZk{4DOKoqYV1+nDy5Y(b=n(6cebw5-aPiVQcIedv4#@+VRRRhix{_}#nQK; zIfUFI(=N%LO0=`BS~NGIyu-3%tx9^mzEe*uVw6>SW!VN2%);$xGC-Q)p@i$WHX2)U zd92Pn+TC>sM(p%kR?DL`Es90X5)wz4Kux~tF=|DvYl@&{!CnGue34>3S4Bk%^rgf- z_3{&?oWZ&Zn#_D?yw1cR(oq31kS;*tg>+er!*uq@bjPnmbG)FogSoA57)+W=1jm5( zd|a-US^;xJpyur4IsIlqoC%^&V1FF-9(sjm#1vYq zs6P&clZ0%BS2*Q96@zH;6LK4UcmkwWBAW=L!u(|L3KM)tv6uV)gJT!*9vRx zDD^_OU^U1oIcRa=N|^4KdS^8DwDAHx*qB_|daX7qHS|%_6}nxpPjV1UgT)k4!uj5N z<&&nY9fa>6Ffx1UdfqbjzfoUmr~6IE@r+c#QpXRC^OYcwsOy)gYVz46gK4u?c{iNw zu^}N0N|G-Q4#%3z)O_BX<1=&IuJYK55Zd&%V!J2f&?^ZBk5B5hPl2Z3(@D8+wwk>m zZ#EZN<7dzGde!(m$-6dq_b;KyhZgHD3h`3(TqQok?I?QJj=@6{K>{aRjQTV89dWlWMV zS{O)za6kuxJ*d(s?a2*M3qj4Ez!4U{H`~s5PUgXI*1=8ph&C(j@!A@kTCI@-3OV)OOemEqZ0(5K zNV5gjuZA>gbe1K3TRX|MrZX|e)yb*78IbKBC1A%E=QKs}=w2O}e6ViQrwL?9-s?UF zJQpQANAx~bmILd@QTJ{B4Ptw9m&iqU7Heb0`3$3iz3!F4=GLw2(ilOE#ATo9keA5u zFHvP>-is~b*IK;j%=w|0bNfaFz*4$F=POhAFMfGJECxV8qR~uV;t{u*f|B!YW9kdz zsY^2w0*eQJ{dX0_K%{C;)9Dqs&*MYwlcER&Dyq7TsJu`;U;KK4htd=GNxgry#f6RZ zcHmg@(g6KH>9Xc?H`Z5%^ow6D@Equ~zyYKqhd+tN?}P_b3*Wx+Dq}8F zFTnai0lmFP8q%Aa159E3`#enl;x`HWGmu^kP6oiZ-~T1O@@9?NWt<>UfEfJq^Sn6V z7kyVicJS}oAVEj;U;LhcWZu4r4?bLEx=;g>l@1JEtzv(1=l(4INhf58{GX|7e||uG zAC-W8U8#4}rTXuK6K|@Cm?Rj<_#<$kZaVM-V$nYNyI0hGWe@)A=DcfN%{jKa;TWtD z$Lag`IlfQ?3|~G0y8*~t?M4p2uY2uZpZKn_CiXG_)znx;8Rd8<=G%jHM;fqjcjTO@ zPWf-Syu9wIAEBAN!t;XsZ{MC4M@6@K&{ZFvOJ0|7(^nsyxy?z(Gd1q4f3Bjq!khVZ zu3SW|?k}m#x8c1d4bZ(kaQ4~K9rPoXZ(rW{x`+OSp=)hOT1jP$Ka|W5b#p=w&gq}2 zgMN;F&Nf%RE1!#ZIDGp@sylC{(@nJSakB$CUxD7Pm*hwebRgqhlkdyTb@vk#n(Mdw zTKXJ$f#K*^Hp0(J+b`G#KPy;wdNFdmU?FR=Nj5b~(MdS)_XU%&L5x*+T7jo_5dCwe z_I1ee^p8>6|Sp)YDVsK^Oc#Otwa5tTar7b9~M%kNdm^xU*A~Hd9NvbY}zudGYCWH5(74fio?`iRTF7T5Hotv*0!w}u%N#KP7Ujc~at>*rg>sIbjmR@A z0v*gRZr+|nF6&)Es|t`ymBc6g)bqqD)ve%N6`0V2Nc|kW+7nU9<^eNe@(Z_JPwkq@ zuniUZFVkr~Q5d;we&~Oli2-3ge~5N$q^wuQU4#?;%bKevl6+0$WO)1mA2XYai-=rp zbcV}!`=rBF^PCs({t*wIM;Z)M-r-0+zZ$f!Z;hTVA;{CVzg{==tV#OcPUvv)36>lt z^>f!91HY#_p(j)Q7wul26^+L+I+!e9)Vcf@ZC0KI_lFymC(ZOSIvXbPK8)vo&fes4 zi{R^v7&5&6)a}UQ=a2h>=h>DY*r#$&78uw2LvQRtHRle893*g3BrKH}uVjKCe$^prT?=MU>9e!0`1s)6|3KC+A!{ee_mnj}Cw{S|oi zKW)$OCvCd(BoVg3`p}d2c$*9APWas@hmt6pv zHF*$IT-VaUt7)v!r@Cc6N0DEqH% zIGr7vbVY5{vHpLXO($!xK&l=$n|`o#blds=cKs;T>KB}NvqtWsF=9!|Hv7$4NrIB} zwe5bR=g-z?<;-;O%XsGj=wf<(0{}RltX|!|N$N^FY0LxWnn4(@z6)f9~b-H96Y$Tfd(j(w!uF|+X z;;o5_w8iZRroGg+M=(Vd=*rZ$pRwZeI!bBDg)0G{+6(wrOvM5#kuYq0?nQrn_vD;_ zBx4MqQT#A&xF-u(zCRS1z*k|!{Hq!!Cnn-SXVDA@aEblHY*QX-07Ty5XkGeM0m|3+ zK29~($N?Z(^m^CjkI6x%e~Na;$*5)woTZixb>Zx4VmhC=jw#(#b1 z;%rfO4)4Eav*L_(e!dq6xDa}wSePpr$yf6hCv_Lc#+f&XF|ScNIQ7-49astvFzdA181xuOO*eCvXGvoi3U5PJppUy&L<~%g=AKJHjvOweA zABv3pE4%i^jfk_e{-V#LZmw|teAI;aLN470IG#+mp5e!tgdECONYnR=yoFc3?Qd$qBQr=p5SGN`B3`YZyVGwxyJF=6yoTF8qmkxHb@{!DNz__5zV22+{@e|F zuPmP5sF{(8U!v`9vRIR0?+1+ZnHUuKKep3uRv0r+`vXNwcU0kH-wOR3B}+frTsJ%6 z(&Y-#Y=ijUH`cw~-kvw>Qr`R9dif>>fH2$~0B#lh=ec(N;$FI0xKic=q7_9omp+ou zcB$Q77D>^+TU2uGYnvxOze?BKM0@}0U2C&bBTj!sS_C>)_x)9qrm}eg04t?FOu#1e zfbK{>1GVx0y-95ro7*f|f>4t0h_8sljQj?*nXE|09G#W-M;X0aq7cfj=t=vRzyIa` E0p@i;%m4rY diff --git a/rtc/package.json b/rtc/package.json deleted file mode 100644 index 0478fe69..00000000 --- a/rtc/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "@fosscord/server-util", - "version": "1.3.52", - "description": "Utility functions for the all server repositories", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "tsc -b .", - "prepublish": "npm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/fosscord/fosscord-server-util.git" - }, - "keywords": [ - "discord", - "fosscord", - "fosscord-server-util", - "discord open source", - "discord-open-source" - ], - "author": "Fosscord", - "license": "GPLV3", - "bugs": { - "url": "https://github.com/fosscord/fosscord-server-util/issues" - }, - "homepage": "https://docs.fosscord.com/", - "dependencies": { - "@types/jsonwebtoken": "^8.5.0", - "@types/mongoose-autopopulate": "^0.10.1", - "@types/mongoose-lean-virtuals": "^0.5.1", - "@types/node": "^14.14.25", - "ajv": "^8.5.0", - "amqplib": "^0.8.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "jsonwebtoken": "^8.5.1", - "missing-native-js-functions": "^1.2.2", - "mongodb": "^3.6.9", - "mongoose": "^5.12.3", - "mongoose-autopopulate": "^0.12.3", - "typescript": "^4.1.3" - }, - "devDependencies": { - "@types/amqplib": "^0.8.1" - } -} diff --git a/rtc/src/index.ts b/rtc/src/index.ts deleted file mode 100644 index 3565fb6b..00000000 --- a/rtc/src/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./util/checkToken"; - -export * as Constants from "./util/Constants"; -export * from "./models/index"; -export * from "./util/index"; - -import Config from "./util/Config"; -import db, { MongooseCache, toObject } from "./util/Database"; - -export { Config, db, MongooseCache, toObject }; diff --git a/rtc/src/models/Activity.ts b/rtc/src/models/Activity.ts deleted file mode 100644 index 17abd1ca..00000000 --- a/rtc/src/models/Activity.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { User } from ".."; -import { ClientStatus, Status } from "./Status"; -import { Schema, model, Types, Document } from "mongoose"; -import toBigInt from "../util/toBigInt"; - -export interface Presence { - user: User; - guild_id?: string; - status: Status; - activities: Activity[]; - client_status: ClientStatus; -} - -export interface Activity { - name: string; - type: ActivityType; - url?: string; - created_at?: Date; - timestamps?: { - start?: number; - end?: number; - }[]; - application_id?: string; - details?: string; - state?: string; - emoji?: { - name: string; - id?: string; - amimated?: boolean; - }; - party?: { - id?: string; - size?: [number, number]; - }; - assets?: { - large_image?: string; - large_text?: string; - small_image?: string; - small_text?: string; - }; - secrets?: { - join?: string; - spectate?: string; - match?: string; - }; - instance?: boolean; - flags?: bigint; -} - -export const ActivitySchema = { - name: { type: String, required: true }, - type: { type: Number, required: true }, - url: String, - created_at: Date, - timestamps: [ - { - start: Number, - end: Number, - }, - ], - application_id: String, - details: String, - state: String, - emoji: { - name: String, - id: String, - amimated: Boolean, - }, - party: { - id: String, - size: [Number, Number], - }, - assets: { - large_image: String, - large_text: String, - small_image: String, - small_text: String, - }, - secrets: { - join: String, - spectate: String, - match: String, - }, - instance: Boolean, - flags: { type: String, get: toBigInt }, -}; - -export const ActivityBodySchema = { - name: String, - type: Number, - $url: String, - $created_at: Date, - $timestamps: [ - { - $start: Number, - $end: Number, - }, - ], - $application_id: String, - $details: String, - $state: String, - $emoji: { - $name: String, - $id: String, - $amimated: Boolean, - }, - $party: { - $id: String, - $size: [Number, Number], - }, - $assets: { - $large_image: String, - $large_text: String, - $small_image: String, - $small_text: String, - }, - $secrets: { - $join: String, - $spectate: String, - $match: String, - }, - $instance: Boolean, - $flags: BigInt, -}; - -export enum ActivityType { - GAME = 0, - STREAMING = 1, - LISTENING = 2, - CUSTOM = 4, - COMPETING = 5, -} diff --git a/rtc/src/models/Application.ts b/rtc/src/models/Application.ts deleted file mode 100644 index fae6e8db..00000000 --- a/rtc/src/models/Application.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Team } from "./Team"; - -export interface Application { - id: string; - name: string; - icon: string | null; - description: string; - rpc_origins: string[] | null; - bot_public: boolean; - bot_require_code_grant: boolean; - terms_of_service_url: string | null; - privacy_policy_url: string | null; - owner_id: string; - summary: string | null; - verify_key: string; - team: Team | null; - guild_id: string; // if this application is a game sold on Discord, this field will be the guild to which it has been linked - primary_sku_id: string | null; // if this application is a game sold on Discord, this field will be the id of the "Game SKU" that is created, if exists - slug: string | null; // if this application is a game sold on Discord, this field will be the URL slug that links to the store page - cover_image: string | null; // the application's default rich presence invite cover image hash - flags: number; // the application's public flags -} - -export interface ApplicationCommand { - id: string; - application_id: string; - name: string; - description: string; - options?: ApplicationCommandOption[]; -} - -export interface ApplicationCommandOption { - type: ApplicationCommandOptionType; - name: string; - description: string; - required?: boolean; - choices?: ApplicationCommandOptionChoice[]; - options?: ApplicationCommandOption[]; -} - -export interface ApplicationCommandOptionChoice { - name: string; - value: string | number; -} - -export enum ApplicationCommandOptionType { - SUB_COMMAND = 1, - SUB_COMMAND_GROUP = 2, - STRING = 3, - INTEGER = 4, - BOOLEAN = 5, - USER = 6, - CHANNEL = 7, - ROLE = 8, -} - -export interface ApplicationCommandInteractionData { - id: string; - name: string; - options?: ApplicationCommandInteractionDataOption[]; -} - -export interface ApplicationCommandInteractionDataOption { - name: string; - value?: any; - options?: ApplicationCommandInteractionDataOption[]; -} diff --git a/rtc/src/models/AuditLog.ts b/rtc/src/models/AuditLog.ts deleted file mode 100644 index 02b2c444..00000000 --- a/rtc/src/models/AuditLog.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { Schema, Document, Types } from "mongoose"; -import db from "../util/Database"; -import { ChannelPermissionOverwrite } from "./Channel"; -import { PublicUser } from "./User"; - -export interface AuditLogResponse { - webhooks: []; // TODO: - users: PublicUser[]; - audit_log_entries: AuditLogEntries[]; - integrations: []; // TODO: -} - -export interface AuditLogEntries { - target_id?: string; - user_id: string; - id: string; - action_type: AuditLogEvents; - options?: { - delete_member_days?: string; - members_removed?: string; - channel_id?: string; - messaged_id?: string; - count?: string; - id?: string; - type?: string; - role_name?: string; - }; - changes: AuditLogChange[]; - reason?: string; -} - -export interface AuditLogChange { - new_value?: AuditLogChangeValue; - old_value?: AuditLogChangeValue; - key: string; -} - -export interface AuditLogChangeValue { - name?: string; - description?: string; - icon_hash?: string; - splash_hash?: string; - discovery_splash_hash?: string; - banner_hash?: string; - owner_id?: string; - region?: string; - preferred_locale?: string; - afk_channel_id?: string; - afk_timeout?: number; - rules_channel_id?: string; - public_updates_channel_id?: string; - mfa_level?: number; - verification_level?: number; - explicit_content_filter?: number; - default_message_notifications?: number; - vanity_url_code?: string; - $add?: {}[]; - $remove?: {}[]; - prune_delete_days?: number; - widget_enabled?: boolean; - widget_channel_id?: string; - system_channel_id?: string; - position?: number; - topic?: string; - bitrate?: number; - permission_overwrites?: ChannelPermissionOverwrite[]; - nsfw?: boolean; - application_id?: string; - rate_limit_per_user?: number; - permissions?: string; - color?: number; - hoist?: boolean; - mentionable?: boolean; - allow?: string; - deny?: string; - code?: string; - channel_id?: string; - inviter_id?: string; - max_uses?: number; - uses?: number; - max_age?: number; - temporary?: boolean; - deaf?: boolean; - mute?: boolean; - nick?: string; - avatar_hash?: string; - id?: string; - type?: number; - enable_emoticons?: boolean; - expire_behavior?: number; - expire_grace_period?: number; - user_limit?: number; -} - -export interface AuditLogEntriesDocument extends Document, AuditLogEntries { - id: string; -} - -export const AuditLogChanges = { - name: String, - description: String, - icon_hash: String, - splash_hash: String, - discovery_splash_hash: String, - banner_hash: String, - owner_id: String, - region: String, - preferred_locale: String, - afk_channel_id: String, - afk_timeout: Number, - rules_channel_id: String, - public_updates_channel_id: String, - mfa_level: Number, - verification_level: Number, - explicit_content_filter: Number, - default_message_notifications: Number, - vanity_url_code: String, - $add: [{}], - $remove: [{}], - prune_delete_days: Number, - widget_enabled: Boolean, - widget_channel_id: String, - system_channel_id: String, - position: Number, - topic: String, - bitrate: Number, - permission_overwrites: [{}], - nsfw: Boolean, - application_id: String, - rate_limit_per_user: Number, - permissions: String, - color: Number, - hoist: Boolean, - mentionable: Boolean, - allow: String, - deny: String, - code: String, - channel_id: String, - inviter_id: String, - max_uses: Number, - uses: Number, - max_age: Number, - temporary: Boolean, - deaf: Boolean, - mute: Boolean, - nick: String, - avatar_hash: String, - id: String, - type: Number, - enable_emoticons: Boolean, - expire_behavior: Number, - expire_grace_period: Number, - user_limit: Number, -}; - -export const AuditLogSchema = new Schema({ - target_id: String, - user_id: { type: String, required: true }, - id: { type: String, required: true }, - action_type: { type: Number, required: true }, - options: { - delete_member_days: String, - members_removed: String, - channel_id: String, - messaged_id: String, - count: String, - id: String, - type: { type: Number }, - role_name: String, - }, - changes: [ - { - new_value: AuditLogChanges, - old_value: AuditLogChanges, - key: String, - }, - ], - reason: String, -}); - -// @ts-ignore -export const AuditLogModel = db.model("AuditLog", AuditLogSchema, "auditlogs"); - -export enum AuditLogEvents { - GUILD_UPDATE = 1, - CHANNEL_CREATE = 10, - CHANNEL_UPDATE = 11, - CHANNEL_DELETE = 12, - CHANNEL_OVERWRITE_CREATE = 13, - CHANNEL_OVERWRITE_UPDATE = 14, - CHANNEL_OVERWRITE_DELETE = 15, - MEMBER_KICK = 20, - MEMBER_PRUNE = 21, - MEMBER_BAN_ADD = 22, - MEMBER_BAN_REMOVE = 23, - MEMBER_UPDATE = 24, - MEMBER_ROLE_UPDATE = 25, - MEMBER_MOVE = 26, - MEMBER_DISCONNECT = 27, - BOT_ADD = 28, - ROLE_CREATE = 30, - ROLE_UPDATE = 31, - ROLE_DELETE = 32, - INVITE_CREATE = 40, - INVITE_UPDATE = 41, - INVITE_DELETE = 42, - WEBHOOK_CREATE = 50, - WEBHOOK_UPDATE = 51, - WEBHOOK_DELETE = 52, - EMOJI_CREATE = 60, - EMOJI_UPDATE = 61, - EMOJI_DELETE = 62, - MESSAGE_DELETE = 72, - MESSAGE_BULK_DELETE = 73, - MESSAGE_PIN = 74, - MESSAGE_UNPIN = 75, - INTEGRATION_CREATE = 80, - INTEGRATION_UPDATE = 81, - INTEGRATION_DELETE = 82, -} diff --git a/rtc/src/models/Ban.ts b/rtc/src/models/Ban.ts deleted file mode 100644 index f09950ee..00000000 --- a/rtc/src/models/Ban.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; -import { PublicUserProjection, UserModel } from "./User"; - -export interface Ban extends Document { - user_id: string; - guild_id: string; - executor_id: string; - ip: string; - reason?: string; -} - -export const BanSchema = new Schema({ - user_id: { type: String, required: true }, - guild_id: { type: String, required: true }, - executor_id: { type: String, required: true }, - reason: String, - ip: String, // ? Should we store this in here, or in the UserModel? -}); - -BanSchema.virtual("user", { - ref: UserModel, - localField: "user_id", - foreignField: "id", - justOne: true, - autopopulate: { select: PublicUserProjection }, -}); - -BanSchema.set("removeResponse", ["user_id"]); - -// @ts-ignore -export const BanModel = db.model("Ban", BanSchema, "bans"); diff --git a/rtc/src/models/Channel.ts b/rtc/src/models/Channel.ts deleted file mode 100644 index 1dd05896..00000000 --- a/rtc/src/models/Channel.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; -import toBigInt from "../util/toBigInt"; -import { PublicUserProjection, UserModel } from "./User"; - -// @ts-ignore -export interface AnyChannel extends Channel, DMChannel, TextChannel, VoiceChannel { - recipient_ids: null | string[]; -} - -export interface ChannelDocument extends Document, AnyChannel { - id: string; -} - -export const ChannelSchema = new Schema({ - id: String, - created_at: { type: Schema.Types.Date, required: true }, - name: String, // can't be required for dm channels - type: { type: Number, required: true }, - guild_id: String, - owner_id: String, - parent_id: String, - recipient_ids: [String], - position: Number, - last_message_id: String, - last_pin_timestamp: Date, - nsfw: Boolean, - rate_limit_per_user: Number, - topic: String, - permission_overwrites: [ - { - allow: { type: String, get: toBigInt }, - deny: { type: String, get: toBigInt }, - id: String, - type: { type: Number }, - }, - ], -}); - -ChannelSchema.virtual("recipients", { - ref: UserModel, - localField: "recipient_ids", - foreignField: "id", - justOne: false, - autopopulate: { select: PublicUserProjection }, -}); - -ChannelSchema.set("removeResponse", ["recipient_ids"]); - -// @ts-ignore -export const ChannelModel = db.model("Channel", ChannelSchema, "channels"); - -export interface Channel { - id: string; - created_at: Date; - name: string; - type: number; -} - -export interface TextBasedChannel { - last_message_id?: string; - last_pin_timestamp?: number; -} - -export interface GuildChannel extends Channel { - guild_id: string; - position: number; - parent_id?: string; - permission_overwrites: ChannelPermissionOverwrite[]; -} - -export interface ChannelPermissionOverwrite { - allow: bigint; // for bitfields we use bigints - deny: bigint; // for bitfields we use bigints - id: string; - type: ChannelPermissionOverwriteType; -} - -export enum ChannelPermissionOverwriteType { - role = 0, - member = 1, -} - -export interface VoiceChannel extends GuildChannel { - video_quality_mode?: number; - bitrate?: number; - user_limit?: number; -} - -export interface TextChannel extends GuildChannel, TextBasedChannel { - nsfw: boolean; - rate_limit_per_user: number; - topic?: string; -} -// @ts-ignore -export interface DMChannel extends Channel, TextBasedChannel { - owner_id: string; - recipient_ids: string[]; -} - -export enum ChannelType { - GUILD_TEXT = 0, // a text channel within a server - DM = 1, // a direct message between users - GUILD_VOICE = 2, // a voice channel within a server - GROUP_DM = 3, // a direct message between multiple users - GUILD_CATEGORY = 4, // an organizational category that contains up to 50 channels - GUILD_NEWS = 5, // a channel that users can follow and crosspost into their own server - GUILD_STORE = 6, // a channel in which game developers can sell their game on Discord -} diff --git a/rtc/src/models/Emoji.ts b/rtc/src/models/Emoji.ts deleted file mode 100644 index 3e5cad53..00000000 --- a/rtc/src/models/Emoji.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; - -export interface Emoji extends Document { - id: string; - animated: boolean; - available: boolean; - guild_id: string; - managed: boolean; - name: string; - require_colons: boolean; - url: string; - roles: string[]; // roles this emoji is whitelisted to (new discord feature?) -} - -export const EmojiSchema = new Schema({ - id: { type: String, required: true }, - animated: Boolean, - available: Boolean, - guild_id: String, - managed: Boolean, - name: String, - require_colons: Boolean, - url: String, - roles: [String], -}); - -// @ts-ignore -export const EmojiModel = db.model("Emoji", EmojiSchema, "emojis"); diff --git a/rtc/src/models/Event.ts b/rtc/src/models/Event.ts deleted file mode 100644 index 1564107d..00000000 --- a/rtc/src/models/Event.ts +++ /dev/null @@ -1,540 +0,0 @@ -import { ConnectedAccount, PublicUser, Relationship, User, UserSettings } from "./User"; -import { DMChannel, Channel } from "./Channel"; -import { Guild } from "./Guild"; -import { Member, PublicMember, UserGuildSettings } from "./Member"; -import { Emoji } from "./Emoji"; -import { Presence } from "./Activity"; -import { Role } from "./Role"; -import { Invite } from "./Invite"; -import { Message, PartialEmoji } from "./Message"; -import { VoiceState } from "./VoiceState"; -import { ApplicationCommand } from "./Application"; -import { Interaction } from "./Interaction"; -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; - -export interface Event { - guild_id?: string; - user_id?: string; - channel_id?: string; - created_at?: Date; - event: EVENT; - data?: any; -} - -export interface EventDocument extends Event, Document {} - -export const EventSchema = new Schema({ - guild_id: String, - user_id: String, - channel_id: String, - created_at: { type: Date, required: true }, - event: { type: String, required: true }, - data: Object, -}); - -// @ts-ignore -export const EventModel = db.model("Event", EventSchema, "events"); - -// ! Custom Events that shouldn't get sent to the client but processed by the server - -export interface InvalidatedEvent extends Event { - event: "INVALIDATED"; -} - -// ! END Custom Events that shouldn't get sent to the client but processed by the server - -export interface ReadyEventData { - v: number; - user: PublicUser & { - mobile: boolean; - desktop: boolean; - email: string | null; - flags: bigint; - mfa_enabled: boolean; - nsfw_allowed: boolean; - phone: string | null; - premium: boolean; - premium_type: number; - verified: boolean; - bot: boolean; - }; - private_channels: DMChannel[]; // this will be empty for bots - session_id: string; // resuming - guilds: Guild[]; - analytics_token?: string; - connected_accounts?: ConnectedAccount[]; - consents?: { - personalization?: { - consented?: boolean; - }; - }; - country_code?: string; // e.g. DE - friend_suggestion_count?: number; - geo_ordered_rtc_regions?: string[]; // ["europe","russie","india","us-east","us-central"] - experiments?: [number, number, number, number, number][]; - guild_experiments?: [ - // ? what are guild_experiments? - // this is the structure of it: - number, - null, - number, - [[number, { e: number; s: number }[]]], - [number, [[number, [number, number]]]], - { b: number; k: bigint[] }[] - ][]; - guild_join_requests?: []; // ? what is this? this is new - shard?: [number, number]; - user_settings?: UserSettings; - relationships?: Relationship[]; // TODO - read_state: { - entries: []; // TODO - partial: boolean; - version: number; - }; - user_guild_settings?: { - entries: UserGuildSettings[]; - version: number; - partial: boolean; - }; - application?: { - id: string; - flags: bigint; - }; - merged_members?: Omit[][]; - // probably all users who the user is in contact with - users?: { - avatar: string | null; - discriminator: string; - id: string; - username: string; - bot: boolean; - public_flags: bigint; - }[]; -} - -export interface ReadyEvent extends Event { - event: "READY"; - data: ReadyEventData; -} - -export interface ChannelCreateEvent extends Event { - event: "CHANNEL_CREATE"; - data: Channel; -} - -export interface ChannelUpdateEvent extends Event { - event: "CHANNEL_UPDATE"; - data: Channel; -} - -export interface ChannelDeleteEvent extends Event { - event: "CHANNEL_DELETE"; - data: Channel; -} - -export interface ChannelPinsUpdateEvent extends Event { - event: "CHANNEL_PINS_UPDATE"; - data: { - guild_id?: string; - channel_id: string; - last_pin_timestamp?: number; - }; -} - -export interface GuildCreateEvent extends Event { - event: "GUILD_CREATE"; - data: Guild; -} - -export interface GuildUpdateEvent extends Event { - event: "GUILD_UPDATE"; - data: Guild; -} - -export interface GuildDeleteEvent extends Event { - event: "GUILD_DELETE"; - data: { - id: string; - unavailable?: boolean; - }; -} - -export interface GuildBanAddEvent extends Event { - event: "GUILD_BAN_ADD"; - data: { - guild_id: string; - user: User; - }; -} - -export interface GuildBanRemoveEvent extends Event { - event: "GUILD_BAN_REMOVE"; - data: { - guild_id: string; - user: User; - }; -} - -export interface GuildEmojiUpdateEvent extends Event { - event: "GUILD_EMOJI_UPDATE"; - data: { - guild_id: string; - emojis: Emoji[]; - }; -} - -export interface GuildIntegrationUpdateEvent extends Event { - event: "GUILD_INTEGRATIONS_UPDATE"; - data: { - guild_id: string; - }; -} - -export interface GuildMemberAddEvent extends Event { - event: "GUILD_MEMBER_ADD"; - data: PublicMember & { - guild_id: string; - }; -} - -export interface GuildMemberRemoveEvent extends Event { - event: "GUILD_MEMBER_REMOVE"; - data: { - guild_id: string; - user: User; - }; -} - -export interface GuildMemberUpdateEvent extends Event { - event: "GUILD_MEMBER_UPDATE"; - data: { - guild_id: string; - roles: string[]; - user: User; - nick?: string; - joined_at?: Date; - premium_since?: number; - pending?: boolean; - }; -} - -export interface GuildMembersChunkEvent extends Event { - event: "GUILD_MEMBERS_CHUNK"; - data: { - guild_id: string; - members: PublicMember[]; - chunk_index: number; - chunk_count: number; - not_found: string[]; - presences: Presence[]; - nonce?: string; - }; -} - -export interface GuildRoleCreateEvent extends Event { - event: "GUILD_ROLE_CREATE"; - data: { - guild_id: string; - role: Role; - }; -} - -export interface GuildRoleUpdateEvent extends Event { - event: "GUILD_ROLE_UPDATE"; - data: { - guild_id: string; - role: Role; - }; -} - -export interface GuildRoleDeleteEvent extends Event { - event: "GUILD_ROLE_DELETE"; - data: { - guild_id: string; - role_id: string; - }; -} - -export interface InviteCreateEvent extends Event { - event: "INVITE_CREATE"; - data: Omit & { - channel_id: string; - guild_id?: string; - }; -} - -export interface InviteDeleteEvent extends Event { - event: "INVITE_DELETE"; - data: { - channel_id: string; - guild_id?: string; - code: string; - }; -} - -export type MessagePayload = Omit & { - channel_id: string; - guild_id?: string; - author: PublicUser; - member: PublicMember; - mentions: (PublicUser & { member: PublicMember })[]; -}; - -export interface MessageCreateEvent extends Event { - event: "MESSAGE_CREATE"; - data: MessagePayload; -} - -export interface MessageUpdateEvent extends Event { - event: "MESSAGE_UPDATE"; - data: MessagePayload; -} - -export interface MessageDeleteEvent extends Event { - event: "MESSAGE_DELETE"; - data: { - id: string; - channel_id: string; - guild_id?: string; - }; -} - -export interface MessageDeleteBulkEvent extends Event { - event: "MESSAGE_DELETE_BULK"; - data: { - ids: string[]; - channel_id: string; - guild_id?: string; - }; -} - -export interface MessageReactionAddEvent extends Event { - event: "MESSAGE_REACTION_ADD"; - data: { - user_id: string; - channel_id: string; - message_id: string; - guild_id?: string; - member?: PublicMember; - emoji: PartialEmoji; - }; -} - -export interface MessageReactionRemoveEvent extends Event { - event: "MESSAGE_REACTION_REMOVE"; - data: { - user_id: string; - channel_id: string; - message_id: string; - guild_id?: string; - emoji: PartialEmoji; - }; -} - -export interface MessageReactionRemoveAllEvent extends Event { - event: "MESSAGE_REACTION_REMOVE_ALL"; - data: { - channel_id: string; - message_id: string; - guild_id?: string; - }; -} - -export interface MessageReactionRemoveEmojiEvent extends Event { - event: "MESSAGE_REACTION_REMOVE_EMOJI"; - data: { - channel_id: string; - message_id: string; - guild_id?: string; - emoji: PartialEmoji; - }; -} - -export interface PresenceUpdateEvent extends Event { - event: "PRESENCE_UPDATE"; - data: Presence; -} - -export interface TypingStartEvent extends Event { - event: "TYPING_START"; - data: { - channel_id: string; - user_id: string; - timestamp: number; - guild_id?: string; - member?: PublicMember; - }; -} - -export interface UserUpdateEvent extends Event { - event: "USER_UPDATE"; - data: User; -} - -export interface VoiceStateUpdateEvent extends Event { - event: "VOICE_STATE_UPDATE"; - data: VoiceState & { - member: PublicMember; - }; -} - -export interface VoiceServerUpdateEvent extends Event { - event: "VOICE_SERVER_UPDATE"; - data: { - token: string; - guild_id: string; - endpoint: string; - }; -} - -export interface WebhooksUpdateEvent extends Event { - event: "WEBHOOKS_UPDATE"; - data: { - guild_id: string; - channel_id: string; - }; -} - -export type ApplicationCommandPayload = ApplicationCommand & { - guild_id: string; -}; - -export interface ApplicationCommandCreateEvent extends Event { - event: "APPLICATION_COMMAND_CREATE"; - data: ApplicationCommandPayload; -} - -export interface ApplicationCommandUpdateEvent extends Event { - event: "APPLICATION_COMMAND_UPDATE"; - data: ApplicationCommandPayload; -} - -export interface ApplicationCommandDeleteEvent extends Event { - event: "APPLICATION_COMMAND_DELETE"; - data: ApplicationCommandPayload; -} - -export interface InteractionCreateEvent extends Event { - event: "INTERACTION_CREATE"; - data: Interaction; -} - -export interface MessageAckEvent extends Event { - event: "MESSAGE_ACK"; - data: { - channel_id: string; - message_id: string; - version?: number; - manual?: boolean; - mention_count?: number; - }; -} - -export interface RelationshipAddEvent extends Event { - event: "RELATIONSHIP_ADD"; - data: Relationship & { - should_notify?: boolean; - user: PublicUser; - }; -} - -export interface RelationshipRemoveEvent extends Event { - event: "RELATIONSHIP_REMOVE"; - data: Omit; -} - -// located in collection events - -export enum EVENTEnum { - Ready = "READY", - ChannelCreate = "CHANNEL_CREATE", - ChannelUpdate = "CHANNEL_UPDATE", - ChannelDelete = "CHANNEL_DELETE", - ChannelPinsUpdate = "CHANNEL_PINS_UPDATE", - GuildCreate = "GUILD_CREATE", - GuildUpdate = "GUILD_UPDATE", - GuildDelete = "GUILD_DELETE", - GuildBanAdd = "GUILD_BAN_ADD", - GuildBanRemove = "GUILD_BAN_REMOVE", - GuildEmojUpdate = "GUILD_EMOJI_UPDATE", - GuildIntegrationsUpdate = "GUILD_INTEGRATIONS_UPDATE", - GuildMemberAdd = "GUILD_MEMBER_ADD", - GuildMemberRempve = "GUILD_MEMBER_REMOVE", - GuildMemberUpdate = "GUILD_MEMBER_UPDATE", - GuildMemberSpeaking = "GUILD_MEMBER_SPEAKING", - GuildMembersChunk = "GUILD_MEMBERS_CHUNK", - GuildRoleCreate = "GUILD_ROLE_CREATE", - GuildRoleDelete = "GUILD_ROLE_DELETE", - GuildRoleUpdate = "GUILD_ROLE_UPDATE", - InviteCreate = "INVITE_CREATE", - InviteDelete = "INVITE_DELETE", - MessageCreate = "MESSAGE_CREATE", - MessageUpdate = "MESSAGE_UPDATE", - MessageDelete = "MESSAGE_DELETE", - MessageDeleteBulk = "MESSAGE_DELETE_BULK", - MessageReactionAdd = "MESSAGE_REACTION_ADD", - MessageReactionRemove = "MESSAGE_REACTION_REMOVE", - MessageReactionRemoveAll = "MESSAGE_REACTION_REMOVE_ALL", - MessageReactionRemoveEmoji = "MESSAGE_REACTION_REMOVE_EMOJI", - PresenceUpdate = "PRESENCE_UPDATE", - TypingStart = "TYPING_START", - UserUpdate = "USER_UPDATE", - WebhooksUpdate = "WEBHOOKS_UPDATE", - InteractionCreate = "INTERACTION_CREATE", - VoiceStateUpdate = "VOICE_STATE_UPDATE", - VoiceServerUpdate = "VOICE_SERVER_UPDATE", - ApplicationCommandCreate = "APPLICATION_COMMAND_CREATE", - ApplicationCommandUpdate = "APPLICATION_COMMAND_UPDATE", - ApplicationCommandDelete = "APPLICATION_COMMAND_DELETE", -} - -export type EVENT = - | "READY" - | "CHANNEL_CREATE" - | "CHANNEL_UPDATE" - | "CHANNEL_DELETE" - | "CHANNEL_PINS_UPDATE" - | "GUILD_CREATE" - | "GUILD_UPDATE" - | "GUILD_DELETE" - | "GUILD_BAN_ADD" - | "GUILD_BAN_REMOVE" - | "GUILD_EMOJI_UPDATE" - | "GUILD_INTEGRATIONS_UPDATE" - | "GUILD_MEMBER_ADD" - | "GUILD_MEMBER_REMOVE" - | "GUILD_MEMBER_UPDATE" - | "GUILD_MEMBER_SPEAKING" - | "GUILD_MEMBERS_CHUNK" - | "GUILD_ROLE_CREATE" - | "GUILD_ROLE_DELETE" - | "GUILD_ROLE_UPDATE" - | "INVITE_CREATE" - | "INVITE_DELETE" - | "MESSAGE_CREATE" - | "MESSAGE_UPDATE" - | "MESSAGE_DELETE" - | "MESSAGE_DELETE_BULK" - | "MESSAGE_REACTION_ADD" - // TODO: add a new event: bulk add reaction: - // | "MESSAGE_REACTION_BULK_ADD" - | "MESSAGE_REACTION_REMOVE" - | "MESSAGE_REACTION_REMOVE_ALL" - | "MESSAGE_REACTION_REMOVE_EMOJI" - | "PRESENCE_UPDATE" - | "TYPING_START" - | "USER_UPDATE" - | "WEBHOOKS_UPDATE" - | "INTERACTION_CREATE" - | "VOICE_STATE_UPDATE" - | "VOICE_SERVER_UPDATE" - | "APPLICATION_COMMAND_CREATE" - | "APPLICATION_COMMAND_UPDATE" - | "APPLICATION_COMMAND_DELETE" - | "MESSAGE_ACK" - | "RELATIONSHIP_ADD" - | "RELATIONSHIP_REMOVE" - | CUSTOMEVENTS; - -export type CUSTOMEVENTS = "INVALIDATED"; diff --git a/rtc/src/models/Guild.ts b/rtc/src/models/Guild.ts deleted file mode 100644 index 13a7d078..00000000 --- a/rtc/src/models/Guild.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; -import { ChannelModel } from "./Channel"; -import { EmojiModel } from "./Emoji"; -import { MemberModel } from "./Member"; -import { RoleModel } from "./Role"; - -export interface GuildDocument extends Document, Guild { - id: string; -} - -export interface Guild { - id: string; - afk_channel_id?: string; - afk_timeout?: number; - application_id?: string; - banner?: string; - default_message_notifications?: number; - description?: string; - discovery_splash?: string; - explicit_content_filter?: number; - features: string[]; - icon?: string; - large?: boolean; - max_members?: number; // e.g. default 100.000 - max_presences?: number; - max_video_channel_users?: number; // ? default: 25, is this max 25 streaming or watching - member_count?: number; - presence_count?: number; // users online - // members?: Member[]; // * Members are stored in a seperate collection - // roles: Role[]; // * Role are stored in a seperate collection - // channels: GuildChannel[]; // * Channels are stored in a seperate collection - // emojis: Emoji[]; // * Emojis are stored in a seperate collection - // voice_states: []; // * voice_states are stored in a seperate collection - //TODO: - presences?: object[]; - mfa_level?: number; - name: string; - owner_id: string; - preferred_locale?: string; // only community guilds can choose this - premium_subscription_count?: number; - premium_tier?: number; // nitro boost level - public_updates_channel_id?: string; - region?: string; - rules_channel_id?: string; - splash?: string; - system_channel_flags?: number; - system_channel_id?: string; - unavailable?: boolean; - vanity_url?: { - code: string; - uses: number; - }; - verification_level?: number; - welcome_screen: { - enabled: boolean; - description: string; - welcome_channels: { - description: string; - emoji_id?: string; - emoji_name: string; - channel_id: string }[]; - }; - widget_channel_id?: string; - widget_enabled?: boolean; -} - -export const GuildSchema = new Schema({ - id: { type: String, required: true }, - afk_channel_id: String, - afk_timeout: Number, - application_id: String, - banner: String, - default_message_notifications: Number, - description: String, - discovery_splash: String, - explicit_content_filter: Number, - features: { type: [String], default: [] }, - icon: String, - large: Boolean, - max_members: { type: Number, default: 100000 }, - max_presences: Number, - max_video_channel_users: { type: Number, default: 25 }, - member_count: Number, - presences: { type: [Object], default: [] }, - presence_count: Number, - mfa_level: Number, - name: { type: String, required: true }, - owner_id: { type: String, required: true }, - preferred_locale: String, - premium_subscription_count: Number, - premium_tier: Number, - public_updates_channel_id: String, - region: String, - rules_channel_id: String, - splash: String, - system_channel_flags: Number, - system_channel_id: String, - unavailable: Boolean, - vanity_url: { - code: String, - uses: Number - }, - verification_level: Number, - voice_states: { type: [Object], default: [] }, - welcome_screen: { - enabled: Boolean, - description: String, - welcome_channels: [{ - description: String, - emoji_id: String, - emoji_name: String, - channel_id: String }], - }, - widget_channel_id: String, - widget_enabled: Boolean, -}); - -GuildSchema.virtual("channels", { - ref: ChannelModel, - localField: "id", - foreignField: "guild_id", - justOne: false, - autopopulate: true, -}); - -GuildSchema.virtual("roles", { - ref: RoleModel, - localField: "id", - foreignField: "guild_id", - justOne: false, - autopopulate: true, -}); - -// nested populate is needed for member users: https://gist.github.com/yangsu/5312204 -GuildSchema.virtual("members", { - ref: MemberModel, - localField: "id", - foreignField: "guild_id", - justOne: false, -}); - -GuildSchema.virtual("emojis", { - ref: EmojiModel, - localField: "id", - foreignField: "guild_id", - justOne: false, - autopopulate: true, -}); - -GuildSchema.virtual("joined_at", { - ref: MemberModel, - localField: "id", - foreignField: "guild_id", - justOne: true, -}).get((member: any, virtual: any, doc: any) => { - return member?.joined_at; -}); - -// @ts-ignore -export const GuildModel = db.model("Guild", GuildSchema, "guilds"); diff --git a/rtc/src/models/Interaction.ts b/rtc/src/models/Interaction.ts deleted file mode 100644 index 764247a5..00000000 --- a/rtc/src/models/Interaction.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AllowedMentions, Embed } from "./Message"; - -export interface Interaction { - id: string; - type: InteractionType; - data?: {}; - guild_id: string; - channel_id: string; - member_id: string; - token: string; - version: number; -} - -export enum InteractionType { - Ping = 1, - ApplicationCommand = 2, -} - -export enum InteractionResponseType { - Pong = 1, - Acknowledge = 2, - ChannelMessage = 3, - ChannelMessageWithSource = 4, - AcknowledgeWithSource = 5, -} - -export interface InteractionApplicationCommandCallbackData { - tts?: boolean; - content: string; - embeds?: Embed[]; - allowed_mentions?: AllowedMentions; -} diff --git a/rtc/src/models/Invite.ts b/rtc/src/models/Invite.ts deleted file mode 100644 index 01f12003..00000000 --- a/rtc/src/models/Invite.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Schema, Document, Types } from "mongoose"; -import db from "../util/Database"; -import { ChannelModel } from "./Channel"; -import { PublicUserProjection, UserModel } from "./User"; -import { GuildModel } from "./Guild"; - -export interface Invite { - code: string; - temporary: boolean; - uses: number; - max_uses: number; - max_age: number; - created_at: Date; - expires_at: Date; - guild_id: string; - channel_id: string; - inviter_id: string; - - // ? What is this? - target_user_id?: string; - target_user_type?: number; -} - -export interface InviteDocument extends Invite, Document {} - -export const InviteSchema = new Schema({ - code: String, - temporary: Boolean, - uses: Number, - max_uses: Number, - max_age: Number, - created_at: Date, - expires_at: Date, - guild_id: String, - channel_id: String, - inviter_id: String, - - // ? What is this? - target_user_id: String, - target_user_type: Number, -}); - -InviteSchema.virtual("channel", { - ref: ChannelModel, - localField: "channel_id", - foreignField: "id", - justOne: true, - autopopulate: { - select: { - id: true, - name: true, - type: true, - }, - }, -}); - -InviteSchema.virtual("inviter", { - ref: UserModel, - localField: "inviter_id", - foreignField: "id", - justOne: true, - autopopulate: { - select: PublicUserProjection, - }, -}); - -InviteSchema.virtual("guild", { - ref: GuildModel, - localField: "guild_id", - foreignField: "id", - justOne: true, - autopopulate: { - select: { - id: true, - name: true, - splash: true, - banner: true, - description: true, - icon: true, - features: true, - verification_level: true, - vanity_url_code: true, - welcome_screen: true, - nsfw: true, - - // TODO: hide the following entries: - // channels: false, - // roles: false, - // emojis: false, - }, - }, -}); - -// @ts-ignore -export const InviteModel = db.model("Invite", InviteSchema, "invites"); diff --git a/rtc/src/models/Member.ts b/rtc/src/models/Member.ts deleted file mode 100644 index d1c9ad9b..00000000 --- a/rtc/src/models/Member.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { PublicUser, PublicUserProjection, User, UserModel } from "./User"; -import { Schema, Types, Document } from "mongoose"; -import db from "../util/Database"; - -export const PublicMemberProjection = { - id: true, - guild_id: true, - nick: true, - roles: true, - joined_at: true, - pending: true, - deaf: true, - mute: true, - premium_since: true, -}; - -export interface Member { - id: string; - guild_id: string; - nick?: string; - roles: string[]; - joined_at: Date; - premium_since?: number; - deaf: boolean; - mute: boolean; - pending: boolean; - settings: UserGuildSettings; - read_state: Record; - // virtual - user?: User; -} - -export interface MemberDocument extends Member, Document { - id: string; -} - -export interface UserGuildSettings { - channel_overrides: { - channel_id: string; - message_notifications: number; - mute_config: MuteConfig; - muted: boolean; - }[]; - message_notifications: number; - mobile_push: boolean; - mute_config: MuteConfig; - muted: boolean; - suppress_everyone: boolean; - suppress_roles: boolean; - version: number; -} - -export interface MuteConfig { - end_time: number; - selected_time_window: number; -} - -const MuteConfig = { - end_time: Number, - selected_time_window: Number, -}; - -export const MemberSchema = new Schema({ - id: { type: String, required: true }, - guild_id: String, - nick: String, - roles: [String], - joined_at: Date, - premium_since: Number, - deaf: Boolean, - mute: Boolean, - pending: Boolean, - read_state: Object, - settings: { - channel_overrides: [ - { - channel_id: String, - message_notifications: Number, - mute_config: MuteConfig, - muted: Boolean, - }, - ], - message_notifications: Number, - mobile_push: Boolean, - mute_config: MuteConfig, - muted: Boolean, - suppress_everyone: Boolean, - suppress_roles: Boolean, - version: Number, - }, -}); - -MemberSchema.virtual("user", { - ref: UserModel, - localField: "id", - foreignField: "id", - justOne: true, - autopopulate: { - select: PublicUserProjection, - }, -}); - -// @ts-ignore -export const MemberModel = db.model("Member", MemberSchema, "members"); - -// @ts-ignore -export interface PublicMember extends Omit { - user: PublicUser; -} diff --git a/rtc/src/models/Message.ts b/rtc/src/models/Message.ts deleted file mode 100644 index 15a6f40d..00000000 --- a/rtc/src/models/Message.ts +++ /dev/null @@ -1,368 +0,0 @@ -import { Schema, Types, Document } from "mongoose"; -import db from "../util/Database"; -import { PublicUser, PublicUserProjection, UserModel } from "./User"; -import { MemberModel, PublicMember } from "./Member"; -import { Role, RoleModel } from "./Role"; -import { Channel } from "./Channel"; -import { Snowflake } from "../util"; -import { InteractionType } from "./Interaction"; - -export interface Message { - id: string; - channel_id: string; - guild_id?: string; - author_id?: string; - webhook_id?: string; - application_id?: string; - content?: string; - timestamp: Date; - edited_timestamp: Date | null; - tts?: boolean; - mention_everyone?: boolean; - mention_user_ids: string[]; - mention_role_ids: string[]; - mention_channels_ids: string[]; - attachments: Attachment[]; - embeds: Embed[]; - reactions: Reaction[]; - nonce?: string | number; - pinned?: boolean; - type: MessageType; - activity?: { - type: number; - party_id: string; - }; - flags?: bigint; - stickers?: any[]; - message_reference?: { - message_id: string; - channel_id?: string; - guild_id?: string; - }; - interaction?: { - id: string; - type: InteractionType; - name: string; - user_id: string; // the user who invoked the interaction - // user: User; // TODO: autopopulate user - }; - components: MessageComponent[]; - - // * mongoose virtuals: - // TODO: - // application: Application; // TODO: auto pouplate application - author?: PublicUser; - member?: PublicMember; - mentions?: (PublicUser & { - member: PublicMember; - })[]; - mention_roles?: Role[]; - mention_channels?: Channel[]; - created_at?: Date; - // thread // TODO -} - -const PartialEmoji = { - id: String, - name: { type: String, required: true }, - animated: { type: Boolean, required: true }, -}; - -const MessageComponent: any = { - type: { type: Number, required: true }, - style: Number, - label: String, - emoji: PartialEmoji, - custom_id: String, - url: String, - disabled: Boolean, - components: [Object], -}; - -export interface MessageComponent { - type: number; - style?: number; - label?: string; - emoji?: PartialEmoji; - custom_id?: string; - url?: string; - disabled?: boolean; - components: MessageComponent[]; -} - -export enum MessageComponentType { - ActionRow = 1, - Button = 2, -} - -export interface MessageDocument extends Document, Message { - id: string; -} - -export enum MessageType { - DEFAULT = 0, - RECIPIENT_ADD = 1, - RECIPIENT_REMOVE = 2, - CALL = 3, - CHANNEL_NAME_CHANGE = 4, - CHANNEL_ICON_CHANGE = 5, - CHANNEL_PINNED_MESSAGE = 6, - GUILD_MEMBER_JOIN = 7, - USER_PREMIUM_GUILD_SUBSCRIPTION = 8, - USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_1 = 9, - USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_2 = 10, - USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_3 = 11, - CHANNEL_FOLLOW_ADD = 12, - GUILD_DISCOVERY_DISQUALIFIED = 14, - GUILD_DISCOVERY_REQUALIFIED = 15, - REPLY = 19, - APPLICATION_COMMAND = 20, -} - -export interface Attachment { - id: string; // attachment id - filename: string; // name of file attached - size: number; // size of file in bytes - url: string; // source url of file - proxy_url: string; // a proxied url of file - height?: number; // height of file (if image) - width?: number; // width of file (if image) - content_type?: string; -} - -export interface Embed { - title?: string; //title of embed - type?: EmbedType; // type of embed (always "rich" for webhook embeds) - description?: string; // description of embed - url?: string; // url of embed - timestamp?: Date; // timestamp of embed content - color?: number; // color code of the embed - footer?: { - text: string; - icon_url?: string; - proxy_icon_url?: string; - }; // footer object footer information - image?: EmbedImage; // image object image information - thumbnail?: EmbedImage; // thumbnail object thumbnail information - video?: EmbedImage; // video object video information - provider?: { - name?: string; - url?: string; - }; // provider object provider information - author?: { - name?: string; - url?: string; - icon_url?: string; - proxy_icon_url?: string; - }; // author object author information - fields?: { - name: string; - value: string; - inline?: boolean; - }[]; -} - -export enum EmbedType { - rich = "rich", - image = "image", - video = "video", - gifv = "gifv", - article = "article", - link = "link", -} - -export interface EmbedImage { - url?: string; - proxy_url?: string; - height?: number; - width?: number; -} - -export interface Reaction { - count: number; - //// not saved in the database // me: boolean; // whether the current user reacted using this emoji - emoji: PartialEmoji; - user_ids: string[]; -} - -export interface PartialEmoji { - id?: string; - name: string; - animated?: boolean; -} - -export interface AllowedMentions { - parse?: ("users" | "roles" | "everyone")[]; - roles?: string[]; - users?: string[]; - replied_user?: boolean; -} - -export const Attachment = { - id: String, // attachment id - filename: String, // name of file attached - size: Number, // size of file in bytes - url: String, // source url of file - proxy_url: String, // a proxied url of file - height: Number, // height of file (if image) - width: Number, // width of file (if image) - content_type: String, -}; - -export const EmbedImage = { - url: String, - proxy_url: String, - height: Number, - width: Number, -}; - -const Reaction = { - count: Number, - user_ids: [String], - emoji: { - id: String, - name: String, - animated: Boolean, - }, -}; - -export const Embed = { - title: String, //title of embed - type: { type: String }, // type of embed (always "rich" for webhook embeds) - description: String, // description of embed - url: String, // url of embed - timestamp: Date, // timestamp of embed content - color: Number, // color code of the embed - footer: { - text: String, - icon_url: String, - proxy_icon_url: String, - }, // footer object footer information - image: EmbedImage, // image object image information - thumbnail: EmbedImage, // thumbnail object thumbnail information - video: EmbedImage, // video object video information - provider: { - name: String, - url: String, - }, // provider object provider information - author: { - name: String, - url: String, - icon_url: String, - proxy_icon_url: String, - }, // author object author information - fields: [ - { - name: String, - value: String, - inline: Boolean, - }, - ], -}; - -export const MessageSchema = new Schema({ - id: String, - channel_id: String, - author_id: String, - webhook_id: String, - guild_id: String, - application_id: String, - content: String, - timestamp: Date, - edited_timestamp: Date, - tts: Boolean, - mention_everyone: Boolean, - mention_user_ids: [String], - mention_role_ids: [String], - mention_channel_ids: [String], - attachments: [Attachment], - embeds: [Embed], - reactions: [Reaction], - nonce: Schema.Types.Mixed, // can be a long or a string - pinned: Boolean, - type: { type: Number }, - activity: { - type: { type: Number }, - party_id: String, - }, - flags: Types.Long, - stickers: [], - message_reference: { - message_id: String, - channel_id: String, - guild_id: String, - }, - components: [MessageComponent], - // virtual: - // author: { - // ref: UserModel, - // localField: "author_id", - // foreignField: "id", - // justOne: true, - // autopopulate: { select: { id: true, user_data: false } }, - // }, -}); - -MessageSchema.virtual("author", { - ref: UserModel, - localField: "author_id", - foreignField: "id", - justOne: true, - autopopulate: { select: PublicUserProjection }, -}); - -MessageSchema.virtual("member", { - ref: MemberModel, - localField: "author_id", - foreignField: "id", - justOne: true, -}); - -MessageSchema.virtual("mentions", { - ref: UserModel, - localField: "mention_user_ids", - foreignField: "id", - justOne: false, - autopopulate: { select: PublicUserProjection }, -}); - -MessageSchema.virtual("mention_roles", { - ref: RoleModel, - localField: "mention_role_ids", - foreignField: "id", - justOne: false, - autopopulate: true, -}); - -MessageSchema.virtual("mention_channels", { - ref: RoleModel, - localField: "mention_channel_ids", - foreignField: "id", - justOne: false, - autopopulate: { select: { id: true, guild_id: true, type: true, name: true } }, -}); - -MessageSchema.virtual("referenced_message", { - ref: "Message", - localField: "message_reference.message_id", - foreignField: "id", - justOne: true, - autopopulate: true, -}); - -MessageSchema.virtual("created_at").get(function (this: MessageDocument) { - return new Date(Snowflake.deconstruct(this.id).timestamp); -}); - -MessageSchema.set("removeResponse", ["mention_channel_ids", "mention_role_ids", "mention_user_ids", "author_id"]); - -// TODO: missing Application Model -// MessageSchema.virtual("application", { -// ref: Application, -// localField: "mention_role_ids", -// foreignField: "id", -// justOne: true, -// }); - -// @ts-ignore -export const MessageModel = db.model("Message", MessageSchema, "messages"); diff --git a/rtc/src/models/RateLimit.ts b/rtc/src/models/RateLimit.ts deleted file mode 100644 index 6a0e1ffd..00000000 --- a/rtc/src/models/RateLimit.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Schema, Document, Types } from "mongoose"; -import db from "../util/Database"; - -export interface Bucket { - id: "global" | "error" | string; // channel_239842397 | guild_238927349823 | webhook_238923423498 - user_id: string; - hits: number; - blocked: boolean; - expires_at: Date; -} - -export interface BucketDocument extends Bucket, Document { - id: string; -} - -export const BucketSchema = new Schema({ - id: { type: String, required: true }, - user_id: { type: String, required: true }, // bot, user, oauth_application, webhook - hits: { type: Number, required: true }, // Number of times the user hit this bucket - blocked: { type: Boolean, required: true }, - expires_at: { type: Date, required: true }, -}); - -// @ts-ignore -export const BucketModel = db.model("Bucket", BucketSchema, "ratelimits"); diff --git a/rtc/src/models/ReadState.ts b/rtc/src/models/ReadState.ts deleted file mode 100644 index 9c4fb323..00000000 --- a/rtc/src/models/ReadState.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { PublicMember } from "./Member"; -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; - -export interface ReadState extends Document { - message_id: string; - channel_id: string; - user_id: string; - last_message_id?: string; - last_pin_timestamp?: Date; - mention_count: number; - manual: boolean; -} - -export const ReadStateSchema = new Schema({ - message_id: String, - channel_id: String, - user_id: String, - last_message_id: String, - last_pin_timestamp: Date, - mention_count: Number, - manual: Boolean, -}); - -// @ts-ignore -export const ReadStateModel = db.model("ReadState", ReadStateSchema, "readstates"); diff --git a/rtc/src/models/Role.ts b/rtc/src/models/Role.ts deleted file mode 100644 index c1111c84..00000000 --- a/rtc/src/models/Role.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; -import toBigInt from "../util/toBigInt"; - -export interface Role { - id: string; - guild_id: string; - color: number; - hoist: boolean; - managed: boolean; - mentionable: boolean; - name: string; - permissions: bigint; - position: number; - tags?: { - bot_id?: string; - }; -} - -export interface RoleDocument extends Document, Role { - id: string; -} - -export const RoleSchema = new Schema({ - id: String, - guild_id: String, - color: Number, - hoist: Boolean, - managed: Boolean, - mentionable: Boolean, - name: String, - permissions: { type: String, get: toBigInt }, - position: Number, - tags: { - bot_id: String, - }, -}); - -RoleSchema.set("removeResponse", ["guild_id"]); - -// @ts-ignore -export const RoleModel = db.model("Role", RoleSchema, "roles"); diff --git a/rtc/src/models/Status.ts b/rtc/src/models/Status.ts deleted file mode 100644 index 5a9bf2ca..00000000 --- a/rtc/src/models/Status.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type Status = "idle" | "dnd" | "online" | "offline"; - -export interface ClientStatus { - desktop?: string; // e.g. Windows/Linux/Mac - mobile?: string; // e.g. iOS/Android - web?: string; // e.g. browser, bot account -} - -export const ClientStatus = { - desktop: String, - mobile: String, - web: String, -}; diff --git a/rtc/src/models/Team.ts b/rtc/src/models/Team.ts deleted file mode 100644 index 795c82d2..00000000 --- a/rtc/src/models/Team.ts +++ /dev/null @@ -1,17 +0,0 @@ -export interface Team { - icon: string | null; - id: string; - members: { - membership_state: number; - permissions: string[]; - team_id: string; - user_id: string; - }[]; - name: string; - owner_user_id: string; -} - -export enum TeamMemberState { - INVITED = 1, - ACCEPTED = 2, -} diff --git a/rtc/src/models/Template.ts b/rtc/src/models/Template.ts deleted file mode 100644 index ad0f9104..00000000 --- a/rtc/src/models/Template.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Schema, model, Types, Document } from "mongoose"; -import db from "../util/Database"; -import { PublicUser, User, UserModel, PublicUserProjection } from "./User"; -import { Guild, GuildModel } from "./Guild"; - -export interface Template extends Document { - id: string; - code: string; - name: string; - description?: string; - usage_count?: number; - creator_id: string; - creator: User; - created_at: Date; - updated_at: Date; - source_guild_id: String; - serialized_source_guild: Guild; -} - -export const TemplateSchema = new Schema({ - id: String, - code: String, - name: String, - description: String, - usage_count: Number, - creator_id: String, - created_at: Date, - updated_at: Date, - source_guild_id: String, -}); - -TemplateSchema.virtual("creator", { - ref: UserModel, - localField: "creator_id", - foreignField: "id", - justOne: true, - autopopulate: { - select: PublicUserProjection, - }, -}); - -TemplateSchema.virtual("serialized_source_guild", { - ref: GuildModel, - localField: "source_guild_id", - foreignField: "id", - justOne: true, - autopopulate: true, -}); - -// @ts-ignore -export const TemplateModel = db.model