diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..cdbe0e2e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Fosscord Documentation + url: https://docs.fosscord.com/ + about: Need documentation and examples for the Fosscord? Head over to Fosscord's official documentation. + - name: Discord's Developer Documentation + url: https://discord.com/developers/docs/intro + about: Need help with the Discord resources? Head here instead of asking on Fosscord! + - name: Fosscord' Official Discord server + url: https://discord.com/invite/Ms5Ev7S6bF + about: Need help with the server? Talk with us in our official server. \ No newline at end of file diff --git a/api/.env.example b/api/.env.example index 0573c605..5974f628 100644 --- a/api/.env.example +++ b/api/.env.example @@ -1,4 +1,8 @@ MONGO_URL=mongodb://localhost/fosscord PORT=3001 PRODUCTION=TRUE -THREADS=# automatically use all available cores, only available if production = true \ No newline at end of file +THREADS=# automatically use all available cores, only available if production = true +#LOG_REQUESTS= +# only log 200 and 204: LOG_REQUESTS=200 204 +# log everything except 200 and 204: LOG_REQUESTS=-200 204 +# log all requests: LOG_REQUESTS=- \ No newline at end of file diff --git a/api/package-lock.json b/api/package-lock.json index a4ad6b2b..aa0c07c5 100644 Binary files a/api/package-lock.json and b/api/package-lock.json differ diff --git a/api/package.json b/api/package.json index 3be75f68..9701e12d 100644 --- a/api/package.json +++ b/api/package.json @@ -84,6 +84,7 @@ "missing-native-js-functions": "^1.2.18", "morgan": "^1.10.0", "multer": "^1.4.2", + "nanocolors": "^0.2.13", "node-fetch": "^2.6.1", "patch-package": "^6.4.7", "proxy-agent": "^5.0.0", diff --git a/api/scripts/droptables.sql b/api/scripts/droptables.sql index cabb9f31..57d1b271 100644 --- a/api/scripts/droptables.sql +++ b/api/scripts/droptables.sql @@ -26,5 +26,6 @@ DROP TABLE webhooks; DROP TABLE channels; DROP TABLE members; DROP TABLE guilds; +DROP TABLE client_relase; -- DROP TABLE users; -- DROP TABLE config; \ No newline at end of file diff --git a/api/src/Server.ts b/api/src/Server.ts index c16bac5c..259c2a6b 100644 --- a/api/src/Server.ts +++ b/api/src/Server.ts @@ -12,6 +12,7 @@ import { initTranslation } from "./middlewares/Translation"; import morgan from "morgan"; import { initInstance } from "./util/Instance"; import { registerRoutes } from "@fosscord/util"; +import { red } from "nanocolors" export interface FosscordServerOptions extends ServerOptions {} @@ -38,17 +39,6 @@ export class FosscordServer extends Server { await initEvent(); await initInstance(); - /* - DOCUMENTATION: uses LOG_REQUESTS environment variable - - # only log 200 and 204 - LOG_REQUESTS=200 204 - # log everything except 200 and 204 - LOG_REQUESTS=-200 204 - # log all requests - LOG_REQUESTS=- - */ - let logRequests = process.env["LOG_REQUESTS"] != undefined; if (logRequests) { this.app.use( @@ -60,7 +50,7 @@ export class FosscordServer extends Server { } }) ); - } + }; this.app.use(CORS); this.app.use(BodyParser({ inflate: true, limit: "10mb" })); @@ -85,19 +75,20 @@ export class FosscordServer extends Server { }); this.app = app; + + //app.use("/__development", ) + //app.use("/__internals", ) app.use("/api/v6", api); app.use("/api/v7", api); app.use("/api/v8", api); app.use("/api/v9", api); app.use("/api", api); // allow unversioned requests + this.app.use(ErrorHandler); TestClient(this.app); - if (logRequests) { - console.log( - "Warning: Request logging is enabled! This will spam your console!\nTo disable this, unset the 'LOG_REQUESTS' environment variable!" - ); - } + if (logRequests) console.log(red(`Warning: Request logging is enabled! This will spam your console!\nTo disable this, unset the 'LOG_REQUESTS' environment variable!`)); + return super.start(); } -} +}; \ No newline at end of file diff --git a/api/src/middlewares/Authentication.ts b/api/src/middlewares/Authentication.ts index 20ba42d8..429cf11e 100644 --- a/api/src/middlewares/Authentication.ts +++ b/api/src/middlewares/Authentication.ts @@ -3,25 +3,27 @@ import { HTTPError } from "lambert-server"; import { checkToken, Config, Rights } from "@fosscord/util"; export const NO_AUTHORIZATION_ROUTES = [ - //Authentication routes + // Authentication routes "/auth/login", "/auth/register", "/auth/location-metadata", - //Routes with a seperate auth system + // Routes with a seperate auth system "/webhooks/", - //Public information endpoints + // Public information endpoints "/ping", "/gateway", "/experiments", - //Public kubernetes integration + "/updates", + "/downloads/", + // Public kubernetes integration "/-/readyz", "/-/healthz", - //Client nalytics + // Client analytics "/science", "/track", - //Public policy pages + // Public policy pages "/policies/instance", - //Asset delivery + // Asset delivery /\/guilds\/\d+\/widget\.(json|png)/ ]; diff --git a/api/src/routes/downloads.ts b/api/src/routes/downloads.ts new file mode 100644 index 00000000..ad78b62f --- /dev/null +++ b/api/src/routes/downloads.ts @@ -0,0 +1,20 @@ +import { Router, Response, Request } from "express"; +import { route } from "@fosscord/api"; +import { Relase, Config } from "@fosscord/util"; + +const router = Router(); + +router.get("/:branch", route({}), async (req: Request, res: Response) => { + const { client } = Config.get(); + const { branch } = req.params; + const { platform } = req.query; + //TODO + + if(!platform || !["linux", "osx", "win"].includes(platform.toString())) return res.status(404) + + const relase = await Relase.findOneOrFail({ name: client.relases.upstreamVersion }); + + res.redirect(relase[`win_url`]); +}); + +export default router; diff --git a/api/src/routes/guild-recommendations.ts b/api/src/routes/guild-recommendations.ts new file mode 100644 index 00000000..503b19b7 --- /dev/null +++ b/api/src/routes/guild-recommendations.ts @@ -0,0 +1,20 @@ +import { Guild, Config } from "@fosscord/util"; + +import { Router, Request, Response } from "express"; +import { route } from "@fosscord/api"; + +const router = Router(); + +router.get("/", route({}), async (req: Request, res: Response) => { + const { limit, personalization_disabled } = req.params; + var showAllGuilds = Config.get().guild.showAllGuildsInDiscovery; + // ! this only works using SQL querys + // TODO: implement this with default typeorm query + // const guilds = await Guild.find({ where: { features: "DISCOVERABLE" } }); //, take: Math.abs(Number(limit)) }); + const guilds = showAllGuilds + ? await Guild.find({ take: Math.abs(Number(limit || 20)) }) + : await Guild.find({ where: `"features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || 100)) }); + res.send({ recommended_guilds: guilds }); +}); + +export default router; diff --git a/api/src/routes/updates.ts b/api/src/routes/updates.ts new file mode 100644 index 00000000..4682ce7c --- /dev/null +++ b/api/src/routes/updates.ts @@ -0,0 +1,20 @@ +import { Router, Response, Request } from "express"; +import { route } from "@fosscord/api"; +import { Config, Relase } from "@fosscord/util"; + +const router = Router(); + +router.get("/", route({}), async (req: Request, res: Response) => { + const { client } = Config.get(); + + const relase = await Relase.findOneOrFail({ name: client.relases.upstreamVersion}) + + res.json({ + name: relase.name, + pub_date: relase.pub_date, + url: relase.url, + notes: relase.notes + }); +}); + +export default router; diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 00000000..a810567d --- /dev/null +++ b/nginx.conf @@ -0,0 +1,20 @@ +# This is an example +server { + server_name fosscord.example.com; + listen 80; + location / { + proxy_pass http://127.0.0.1:3001; + proxy_set_header Host $host; + proxy_pass_request_headers on; + add_header Last-Modified $date_gmt; + add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto https; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Host $remote_addr; + proxy_no_cache 1; + proxy_cache_bypass 1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} \ No newline at end of file diff --git a/util/src/entities/Config.ts b/util/src/entities/Config.ts index 492baa4c..2d003c99 100644 --- a/util/src/entities/Config.ts +++ b/util/src/entities/Config.ts @@ -2,6 +2,7 @@ import { Column, Entity } from "typeorm"; import { BaseClassWithoutId, PrimaryIdColumn } from "./BaseClass"; import crypto from "crypto"; import { Snowflake } from "../util/Snowflake"; +import { SessionsReplace } from ".."; @Entity("config") export class ConfigEntity extends BaseClassWithoutId { @@ -48,6 +49,11 @@ export interface ConfigValue { endpointPublic: string | null; endpointPrivate: string | null; }; + api: { + defaultVersion: string; + activeVersions: string[]; + useFosscordEnhancements: boolean; + }; general: { instanceName: string; instanceDescription: string | null; @@ -172,6 +178,16 @@ export interface ConfigValue { allowTemplateCreation: Boolean; allowDiscordTemplates: Boolean; allowRaws: Boolean; + }, + client: { + useTestClient: Boolean; + relases: { + useLocalRelases: Boolean; //TODO + upstreamVersion: string; + } + }, + metrics: { + timeout: number; } } @@ -186,6 +202,11 @@ export const DefaultConfigOptions: ConfigValue = { endpointPrivate: null, endpointPublic: null, }, + api: { + defaultVersion: "9", + activeVersions: ["6", "7", "8", "9"], + useFosscordEnhancements: true, + }, general: { instanceName: "Fosscord Instance", instanceDescription: "This is a Fosscord instance made in pre-relase days", @@ -346,5 +367,15 @@ export const DefaultConfigOptions: ConfigValue = { allowTemplateCreation: true, allowDiscordTemplates: true, allowRaws: false + }, + client: { + useTestClient: true, + relases: { + useLocalRelases: true, + upstreamVersion: "0.0.264" + } + }, + metrics: { + timeout: 30000 } }; diff --git a/util/src/entities/clientRelase.ts b/util/src/entities/clientRelase.ts new file mode 100644 index 00000000..e021b82b --- /dev/null +++ b/util/src/entities/clientRelase.ts @@ -0,0 +1,26 @@ +import { Column, Entity} from "typeorm"; +import { BaseClass } from "./BaseClass"; + +@Entity("client_relase") +export class Relase extends BaseClass { + @Column() + name: string; + + @Column() + pub_date: string; + + @Column() + url: string; + + @Column() + deb_url: string; + + @Column() + osx_url: string; + + @Column() + win_url: string; + + @Column({ nullable: true }) + notes?: string; +} diff --git a/util/src/entities/index.ts b/util/src/entities/index.ts index b52841c9..fdf18f23 100644 --- a/util/src/entities/index.ts +++ b/util/src/entities/index.ts @@ -26,3 +26,4 @@ export * from "./Template"; export * from "./User"; export * from "./VoiceState"; export * from "./Webhook"; +export * from "./clientRelase"; \ No newline at end of file