From 12edecb72308f470cab188034ce065362d7f5b14 Mon Sep 17 00:00:00 2001 From: Featyre Date: Sun, 23 Jan 2022 02:03:14 +0800 Subject: [PATCH 01/11] Branding updates --- api/assets/fosscord-login.css | 6 +++--- api/assets/fosscord.css | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/assets/fosscord-login.css b/api/assets/fosscord-login.css index bc32b82ea..34cf542bf 100644 --- a/api/assets/fosscord-login.css +++ b/api/assets/fosscord-login.css @@ -22,10 +22,10 @@ h3.title-jXR8lp.marginBottom8-AtZOdT.base-1x0h_U.size24-RIRrxO::after { /* Logo in top left when bg removed */ #app-mount > div.app-1q1i1E > div > a { /* replace me: original dimensions: 130x36 */ - background: url(https://raw.githubusercontent.com/fosscord/fosscord/9900329e5ef2c17bdeb6893e04c0511f72027f97/assets/logo/temp.svg); + background: url(https://raw.githubusercontent.com/fosscord/fosscord/master/assets-rebrand/svg/Fosscord-Wordmark-Gradient.svg); + width: 130px; + height: 23px; background-size: contain; - width: 128px; - height: 128px; border-radius: 50%; } diff --git a/api/assets/fosscord.css b/api/assets/fosscord.css index 6a8b4c64e..6078fdeb4 100644 --- a/api/assets/fosscord.css +++ b/api/assets/fosscord.css @@ -13,10 +13,14 @@ /* home button icon */ #app-mount > div.app-1q1i1E > div > div.layers-3iHuyZ.layers-3q14ss > div > div > nav > ul > div.scroller-1Bvpku.none-2Eo-qx.scrollerBase-289Jih > div.tutorialContainer-2sGCg9 > div > div.listItemWrapper-KhRmzM > div > svg > foreignObject > div > div { - background-image: url(https://raw.githubusercontent.com/fosscord/fosscord/9900329e5ef2c17bdeb6893e04c0511f72027f97/assets/logo/temp.svg); + background-image: url(https://raw.githubusercontent.com/fosscord/fosscord/master/assets-rebrand/svg/Fosscord-Icon-Rounded-Subtract.svg); background-size: contain; border-radius: 50%; } + +#app-mount > div.app-1q1i1E > div > div.layers-3iHuyZ.layers-3q14ss > div > div > nav > ul > div.scroller-1Bvpku.none-2Eo-qx.scrollerBase-289Jih > div.tutorialContainer-2sGCg9 > div > div.listItemWrapper-KhRmzM > div > svg > foreignObject > div > div, #app-mount > div.app-1q1i1E > div > div.layers-3iHuyZ.layers-3q14ss > div > div > nav > ul > div.scroller-1Bvpku.none-2Eo-qx.scrollerBase-289Jih > div.tutorialContainer-2sGCg9 > div > div.listItemWrapper-KhRmzM > div > svg > foreignObject > div > div:hover { + background-color: white; +} /* Login QR */ #app-mount > div.app-1q1i1E > div > div > div > div > form > div > div > div.transitionGroup-aR7y1d.qrLogin-1AOZMt, #app-mount > div.app-1q1i1E > div > div > div > div > form > div > div > div.verticalSeparator-3huAjp, From a5e06cd02193afe24292a5ae21a9f7e663e2f176 Mon Sep 17 00:00:00 2001 From: Featyre Date: Sun, 23 Jan 2022 23:55:43 +0800 Subject: [PATCH 02/11] Partial integration of categories and discovery --- api/src/routes/categories.ts | 27 ++++++++++++++++++ api/src/routes/discoverable-guilds.ts | 21 ++++++++++---- api/src/routes/discovery.ts | 12 -------- api/src/routes/guild-recommendations.ts | 6 ++-- bundle/package-lock.json | Bin 606883 -> 606977 bytes bundle/package.json | 2 +- util/src/entities/Categories.ts | 36 ++++++++++++++++++++++++ util/src/entities/Config.ts | 2 ++ util/src/entities/Guild.ts | 26 +++-------------- util/src/entities/index.ts | 1 + 10 files changed, 90 insertions(+), 43 deletions(-) create mode 100644 api/src/routes/categories.ts delete mode 100644 api/src/routes/discovery.ts create mode 100644 util/src/entities/Categories.ts diff --git a/api/src/routes/categories.ts b/api/src/routes/categories.ts new file mode 100644 index 000000000..583226766 --- /dev/null +++ b/api/src/routes/categories.ts @@ -0,0 +1,27 @@ +import { Router, Response, Request } from "express"; +import { route } from "@fosscord/api"; + +const router = Router(); + +router.get("/", route({}), (req: Request, res: Response) => { + // TODO: + // Load categories from db instead + + const { locale, primary_only } = req.query; + + let out; + + switch (locale) { + case "en-US": + switch (primary_only) { + case "false": + out = [{"id": 0, "is_primary": true, "name": "General"}, {"id": 10, "is_primary": true, "name": "Travel & Food"}, {"id": 15, "is_primary": false, "name": "Esports"}, {"id": 30, "is_primary": false, "name": "LFG"}, {"id": 32, "is_primary": false, "name": "Theorycraft"}, {"id": 36, "is_primary": false, "name": "Business"}, {"id": 39, "is_primary": false, "name": "Fandom"}, {"id": 43, "is_primary": true, "name": "Emoji"}, {"id": 18, "is_primary": false, "name": "Books"}, {"id": 23, "is_primary": false, "name": "Podcasts"}, {"id": 28, "is_primary": false, "name": "Investing"}, {"id": 7, "is_primary": true, "name": "Sports"}, {"id": 13, "is_primary": true, "name": "Other"}, {"id": 2, "is_primary": true, "name": "Music"}, {"id": 3, "is_primary": true, "name": "Entertainment"}, {"id": 4, "is_primary": true, "name": "Creative Arts"}, {"id": 6, "is_primary": true, "name": "Education"}, {"id": 9, "is_primary": true, "name": "Relationships & Identity"}, {"id": 11, "is_primary": true, "name": "Fitness & Health"}, {"id": 12, "is_primary": true, "name": "Finance"}, {"id": 45, "is_primary": false, "name": "Mobile"}, {"id": 16, "is_primary": false, "name": "Anime & Manga"}, {"id": 17, "is_primary": false, "name": "Movies & TV"}, {"id": 19, "is_primary": false, "name": "Art"}, {"id": 20, "is_primary": false, "name": "Writing"}, {"id": 22, "is_primary": false, "name": "Programming"}, {"id": 25, "is_primary": false, "name": "Memes"}, {"id": 27, "is_primary": false, "name": "Cryptocurrency"}, {"id": 31, "is_primary": false, "name": "Customer Support"}, {"id": 33, "is_primary": false, "name": "Events"}, {"id": 34, "is_primary": false, "name": "Roleplay"}, {"id": 37, "is_primary": false, "name": "Local Group"}, {"id": 38, "is_primary": false, "name": "Collaboration"}, {"id": 40, "is_primary": false, "name": "Wiki & Guide"}, {"id": 42, "is_primary": false, "name": "Subreddit"}, {"id": 1, "is_primary": true, "name": "Gaming"}, {"id": 5, "is_primary": true, "name": "Science & Tech"}, {"id": 8, "is_primary": true, "name": "Fashion & Beauty"}, {"id": 14, "is_primary": true, "name": "General Chatting"}, {"id": 21, "is_primary": false, "name": "Crafts, DIY, & Making"}, {"id": 48, "is_primary": false, "name": "Game Developer"}, {"id": 49, "is_primary": true, "name": "Bots"}, {"id": 24, "is_primary": false, "name": "Tabletop Games"}, {"id": 26, "is_primary": false, "name": "News & Current Events"}, {"id": 29, "is_primary": false, "name": "Studying & Teaching"}, {"id": 35, "is_primary": false, "name": "Content Creator"}, {"id": 44, "is_primary": false, "name": "Comics & Cartoons"}, {"id": 46, "is_primary": false, "name": "Console"}, {"id": 47, "is_primary": false, "name": "Charity & Nonprofit"}] + case "true": + out = [{"id": 0, "is_primary": true, "name": "General"}, {"id": 10, "is_primary": true, "name": "Travel & Food"}, {"id": 43, "is_primary": true, "name": "Emoji"}, {"id": 7, "is_primary": true, "name": "Sports"}, {"id": 13, "is_primary": true, "name": "Other"}, {"id": 2, "is_primary": true, "name": "Music"}, {"id": 3, "is_primary": true, "name": "Entertainment"}, {"id": 4, "is_primary": true, "name": "Creative Arts"}, {"id": 6, "is_primary": true, "name": "Education"}, {"id": 9, "is_primary": true, "name": "Relationships & Identity"}, {"id": 11, "is_primary": true, "name": "Fitness & Health"}, {"id": 12, "is_primary": true, "name": "Finance"}, {"id": 1, "is_primary": true, "name": "Gaming"}, {"id": 5, "is_primary": true, "name": "Science & Tech"}, {"id": 8, "is_primary": true, "name": "Fashion & Beauty"}, {"id": 14, "is_primary": true, "name": "General Chatting"}] + } + } + + res.json(out).status(200); +}); + +export default router; diff --git a/api/src/routes/discoverable-guilds.ts b/api/src/routes/discoverable-guilds.ts index 1cf56f841..a4559b591 100644 --- a/api/src/routes/discoverable-guilds.ts +++ b/api/src/routes/discoverable-guilds.ts @@ -6,15 +6,26 @@ import { route } from "@fosscord/api"; const router = Router(); router.get("/", route({}), async (req: Request, res: Response) => { - const { limit } = req.params; + const { limit, categories } = req.query; 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 || 20)) }); - res.send({ guilds: guilds }); + let guilds; + let total; + switch (categories) { + case "1": + guilds = showAllGuilds + ? await Guild.find({ take: Math.abs(Number(limit || 24)) }) + : await Guild.find({ where: `"primary_category_id" = 1 AND "features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || 24)) }); + total = guilds.length; + default: + guilds = showAllGuilds + ? await Guild.find({ take: Math.abs(Number(limit || 24)) }) + : await Guild.find({ where: `"features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || 24)) }); + total = guilds.length; + } + res.send({ total: total, guilds: guilds, offset: 0, limit: limit}); }); export default router; diff --git a/api/src/routes/discovery.ts b/api/src/routes/discovery.ts deleted file mode 100644 index bc495d423..000000000 --- a/api/src/routes/discovery.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Router, Response, Request } from "express"; -import { route } from "@fosscord/api"; - -const router = Router(); - -router.get("/categories", route({}), (req: Request, res: Response) => { - // TODO: - //const { locale, primary_only } = req.query; - res.json([]).status(200); -}); - -export default router; diff --git a/api/src/routes/guild-recommendations.ts b/api/src/routes/guild-recommendations.ts index 503b19b74..47017a6fd 100644 --- a/api/src/routes/guild-recommendations.ts +++ b/api/src/routes/guild-recommendations.ts @@ -6,14 +6,14 @@ import { route } from "@fosscord/api"; const router = Router(); router.get("/", route({}), async (req: Request, res: Response) => { - const { limit, personalization_disabled } = req.params; + const { limit, personalization_disabled } = req.query; 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)) }); + ? await Guild.find({ take: Math.abs(Number(limit || 24)) }) + : await Guild.find({ where: `"features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || 24)) }); res.send({ recommended_guilds: guilds }); }); diff --git a/bundle/package-lock.json b/bundle/package-lock.json index e8b99037923888c5a45a3d5e0cb11678489edec6..e763f22a3fc8706aa6b04ce832392d76bb8ccab3 100644 GIT binary patch delta 186 zcmZ47s@mA5x`B^-VxW0q%z%3 zi;aD<0lU-WdPdIavn<$Rx1X?L>t)=$fp-}T$b{sSyonPvS;0Cc3%aOJe_+R!w^=~= z9WzjtJw34`wLGyBryY|OHRYP)#M|S<8G)Dyh?#+y1&CRJm<@>8ftX`^oH(beHUPm2 BI~4!` delta 169 zcmZo{Q(fGux`B^-`rI?j+|v_2GV)A+F2E!^IgXo~*)!OAa$=C&bOjD3_Q`(iY?BSx zouvKm1E*Nr^&auRX6(xzhj<$ qo0S!;2*d2=J>u Date: Mon, 24 Jan 2022 07:21:48 +0000 Subject: [PATCH 03/11] category + discovery + custom status fix, new config --- api/assets/fosscord-login.css | 1 - api/src/routes/discoverable-guilds.ts | 29 ++++++++++-------- .../routes/{categories.ts => discovery.ts} | 4 +-- api/src/routes/guild-recommendations.ts | 2 +- bundle/package-lock.json | Bin 607272 -> 607272 bytes bundle/package.json | 2 +- gateway/package.json | 2 +- util/src/entities/Config.ts | 16 +++++++--- util/src/entities/Guild.ts | 2 +- util/src/entities/User.ts | 9 ++---- 10 files changed, 36 insertions(+), 31 deletions(-) rename api/src/routes/{categories.ts => discovery.ts} (97%) diff --git a/api/assets/fosscord-login.css b/api/assets/fosscord-login.css index 34cf542bf..d507c5454 100644 --- a/api/assets/fosscord-login.css +++ b/api/assets/fosscord-login.css @@ -26,7 +26,6 @@ h3.title-jXR8lp.marginBottom8-AtZOdT.base-1x0h_U.size24-RIRrxO::after { width: 130px; height: 23px; background-size: contain; - border-radius: 50%; } /* replace TOS text */ diff --git a/api/src/routes/discoverable-guilds.ts b/api/src/routes/discoverable-guilds.ts index a4559b591..8b7d343f3 100644 --- a/api/src/routes/discoverable-guilds.ts +++ b/api/src/routes/discoverable-guilds.ts @@ -6,26 +6,29 @@ import { route } from "@fosscord/api"; const router = Router(); router.get("/", route({}), async (req: Request, res: Response) => { - const { limit, categories } = req.query; - var showAllGuilds = Config.get().guild.showAllGuildsInDiscovery; + const { offset, limit, categories } = req.query; + var showAllGuilds = Config.get().guild.discovery.showAllGuilds; + var configLimit = Config.get().guild.discovery.limit; // ! 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)) }); let guilds; let total; - switch (categories) { - case "1": - guilds = showAllGuilds - ? await Guild.find({ take: Math.abs(Number(limit || 24)) }) - : await Guild.find({ where: `"primary_category_id" = 1 AND "features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || 24)) }); - total = guilds.length; - default: - guilds = showAllGuilds - ? await Guild.find({ take: Math.abs(Number(limit || 24)) }) - : await Guild.find({ where: `"features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || 24)) }); + if (categories == undefined) { + guilds = showAllGuilds + ? await Guild.find({ take: Math.abs(Number(limit || configLimit)) }) + : await Guild.find({ where: `"features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || configLimit)) }); + total = guilds.length; + } else { + guilds = showAllGuilds + ? await Guild.find({ where: `"primary_category_id" = ${categories}`, take: Math.abs(Number(limit || configLimit)) }) + : await Guild.find({ + where: `"primary_category_id" = ${categories} AND "features" LIKE '%COMMUNITY%'`, + take: Math.abs(Number(limit || configLimit)) + }); total = guilds.length; } - res.send({ total: total, guilds: guilds, offset: 0, limit: limit}); + res.send({ total: total, guilds: guilds, offset: Number(offset || Config.get().guild.discovery.offset), limit: Number(limit || configLimit) }); }); export default router; diff --git a/api/src/routes/categories.ts b/api/src/routes/discovery.ts similarity index 97% rename from api/src/routes/categories.ts rename to api/src/routes/discovery.ts index 583226766..067dd4420 100644 --- a/api/src/routes/categories.ts +++ b/api/src/routes/discovery.ts @@ -3,7 +3,7 @@ import { route } from "@fosscord/api"; const router = Router(); -router.get("/", route({}), (req: Request, res: Response) => { +router.get("/categories", route({}), (req: Request, res: Response) => { // TODO: // Load categories from db instead @@ -21,7 +21,7 @@ router.get("/", route({}), (req: Request, res: Response) => { } } - res.json(out).status(200); + res.send(out); }); export default router; diff --git a/api/src/routes/guild-recommendations.ts b/api/src/routes/guild-recommendations.ts index 47017a6fd..ecc5e5469 100644 --- a/api/src/routes/guild-recommendations.ts +++ b/api/src/routes/guild-recommendations.ts @@ -7,7 +7,7 @@ const router = Router(); router.get("/", route({}), async (req: Request, res: Response) => { const { limit, personalization_disabled } = req.query; - var showAllGuilds = Config.get().guild.showAllGuildsInDiscovery; + var showAllGuilds = Config.get().guild.discovery.showAllGuilds; // ! 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)) }); diff --git a/bundle/package-lock.json b/bundle/package-lock.json index d026e7c7785fe4ff8a10d165315f79892d994f10..573d40598c29a2dafcaf115e83fc172a85d6973d 100644 GIT binary patch delta 88 zcmZ3{p}L|&bwd#=qtWJKR%u~YBRw-cqsb3hRhxH6wC|8$1Y#y2W(HywAZFdZLxOFw dE<)M#@N+EulY6*y+7Gy~0Wtgb18y7{e*qVk9(Mo$ delta 86 zcmZ3{p}L|&bwd&BWPMT2&DE^J!jr4`_$I$%m1*7~(Y`~15r~<9m>Gy!fS7gr4hgo! ex-do4!_TqsPwwH;X+Pk`2E^>!54dq;`~?6uFCTya diff --git a/bundle/package.json b/bundle/package.json index 071a4899c..758275214 100644 --- a/bundle/package.json +++ b/bundle/package.json @@ -91,7 +91,7 @@ "missing-native-js-functions": "^1.2.18", "morgan": "^1.10.0", "multer": "^1.4.2", - "node-fetch": "^2.6.7", + "node-fetch": "^2.6.2", "node-os-utils": "^1.3.5", "patch-package": "^6.4.7", "pg": "^8.7.1", diff --git a/gateway/package.json b/gateway/package.json index 7daddfc0d..6d0d2d1c8 100644 --- a/gateway/package.json +++ b/gateway/package.json @@ -32,7 +32,7 @@ "jsonwebtoken": "^8.5.1", "lambert-server": "^1.2.11", "missing-native-js-functions": "^1.2.18", - "node-fetch": "^3.1.1", + "node-fetch": "^2.6.2", "proxy-agent": "^5.0.0", "typeorm": "^0.2.37", "ws": "^7.4.2" diff --git a/util/src/entities/Config.ts b/util/src/entities/Config.ts index 4da65b368..f4a266dc4 100644 --- a/util/src/entities/Config.ts +++ b/util/src/entities/Config.ts @@ -157,8 +157,12 @@ export interface ConfigValue { available: Region[]; }; guild: { - showAllGuildsInDiscovery: boolean; - homeDiscoveryUseRecommendation: boolean; // TODO: Recommendation, privacy concern? + discovery: { + showAllGuilds: boolean; + useRecommendation: boolean; // TODO: Recommendation, privacy concern? + offset: number; + limit: number; + }; autoJoin: { enabled: boolean; guilds: string[]; @@ -354,8 +358,12 @@ export const DefaultConfigOptions: ConfigValue = { ], }, guild: { - showAllGuildsInDiscovery: false, - homeDiscoveryUseRecommendation: false, + discovery: { + showAllGuilds: false, + useRecommendation: false, + offset: 0, + limit: 24, + }, autoJoin: { enabled: true, canLeave: true, diff --git a/util/src/entities/Guild.ts b/util/src/entities/Guild.ts index 65ba2ae27..18fa7a0ae 100644 --- a/util/src/entities/Guild.ts +++ b/util/src/entities/Guild.ts @@ -287,7 +287,7 @@ export class Guild extends BaseClass { default_message_notifications: 1, // defaults effect: setting the push default at mentions-only will save a lot explicit_content_filter: 0, features: [], - primary_category_id: 0, + primary_category_id: null, id: guild_id, max_members: 250000, max_presences: 250000, diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts index 5f2618e0e..1027331a3 100644 --- a/util/src/entities/User.ts +++ b/util/src/entities/User.ts @@ -289,12 +289,7 @@ export const defaultSettings: UserSettings = { animate_stickers: 0, contact_sync_enabled: false, convert_emoticons: false, - custom_status: { - emoji_id: undefined, - emoji_name: undefined, - expires_at: undefined, - text: undefined, - }, + custom_status: null, default_guilds_restricted: false, detect_platform_accounts: true, developer_mode: false, @@ -334,7 +329,7 @@ export interface UserSettings { emoji_name?: string; expires_at?: number; text?: string; - }; + } | null; default_guilds_restricted: boolean; detect_platform_accounts: boolean; developer_mode: boolean; From 5e868d431b431cc9f2a57efdbfa4d397e5188a3d Mon Sep 17 00:00:00 2001 From: Featyre Date: Mon, 24 Jan 2022 11:27:12 +0000 Subject: [PATCH 04/11] Prep for Category db work --- api/src/routes/discovery.ts | 2 +- util/src/entities/Categories.ts | 6 +----- util/src/util/Categories.ts | 1 + util/src/util/index.ts | 1 + 4 files changed, 4 insertions(+), 6 deletions(-) create mode 100644 util/src/util/Categories.ts diff --git a/api/src/routes/discovery.ts b/api/src/routes/discovery.ts index 067dd4420..6c0042742 100644 --- a/api/src/routes/discovery.ts +++ b/api/src/routes/discovery.ts @@ -5,7 +5,7 @@ const router = Router(); router.get("/categories", route({}), (req: Request, res: Response) => { // TODO: - // Load categories from db instead + // Load categories from db instead of hardcoding const { locale, primary_only } = req.query; diff --git a/util/src/entities/Categories.ts b/util/src/entities/Categories.ts index 2cf89dbcf..1d2721188 100644 --- a/util/src/entities/Categories.ts +++ b/util/src/entities/Categories.ts @@ -15,7 +15,7 @@ import { BaseClassWithoutId } from "./BaseClass"; // }] @Entity("categories") -export class Categories extends BaseClassWithoutId { // Not using snowflake +export class CategoryEntity extends BaseClassWithoutId { // Not using snowflake @PrimaryColumn() id: number; @@ -29,8 +29,4 @@ export class Categories extends BaseClassWithoutId { // Not using snowflake @Column() is_primary: boolean; -} - -export interface DefaultCategoryValue { // TODO: Load Default Discord Categories - } \ No newline at end of file diff --git a/util/src/util/Categories.ts b/util/src/util/Categories.ts new file mode 100644 index 000000000..a3c69da73 --- /dev/null +++ b/util/src/util/Categories.ts @@ -0,0 +1 @@ +//TODO: populate default discord categories + init, get and set methods \ No newline at end of file diff --git a/util/src/util/index.ts b/util/src/util/index.ts index 98e1146ca..f7a273cb3 100644 --- a/util/src/util/index.ts +++ b/util/src/util/index.ts @@ -1,6 +1,7 @@ export * from "./ApiError"; export * from "./BitField"; export * from "./Token"; +//export * from "./Categories"; export * from "./cdn"; export * from "./Config"; export * from "./Constants"; From cc492f07dcc2be60ef6396c690028da4bcea546b Mon Sep 17 00:00:00 2001 From: Featyre Date: Mon, 24 Jan 2022 22:59:14 +0800 Subject: [PATCH 05/11] Partnet + Discover fix and join --- api/src/routes/discoverable-guilds.ts | 4 +- api/src/routes/discovery.ts | 4 ++ api/src/routes/guild-recommendations.ts | 2 +- .../#guild_id/discovery-requirements.ts | 39 ++++++++++++++++++ api/src/routes/guilds/#guild_id/index.ts | 2 +- .../#guild_id/members/#member_id/index.ts | 21 ++++++++-- .../routes/partners/#guild_id/requirements.ts | 40 +++++++++++++++++++ api/src/util/handlers/route.ts | 2 +- 8 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 api/src/routes/guilds/#guild_id/discovery-requirements.ts create mode 100644 api/src/routes/partners/#guild_id/requirements.ts diff --git a/api/src/routes/discoverable-guilds.ts b/api/src/routes/discoverable-guilds.ts index 8b7d343f3..df4448dff 100644 --- a/api/src/routes/discoverable-guilds.ts +++ b/api/src/routes/discoverable-guilds.ts @@ -17,13 +17,13 @@ router.get("/", route({}), async (req: Request, res: Response) => { if (categories == undefined) { guilds = showAllGuilds ? await Guild.find({ take: Math.abs(Number(limit || configLimit)) }) - : await Guild.find({ where: `"features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || configLimit)) }); + : await Guild.find({ where: `"features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || configLimit)) }); total = guilds.length; } else { guilds = showAllGuilds ? await Guild.find({ where: `"primary_category_id" = ${categories}`, take: Math.abs(Number(limit || configLimit)) }) : await Guild.find({ - where: `"primary_category_id" = ${categories} AND "features" LIKE '%COMMUNITY%'`, + where: `"primary_category_id" = ${categories} AND "features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || configLimit)) }); total = guilds.length; diff --git a/api/src/routes/discovery.ts b/api/src/routes/discovery.ts index 6c0042742..b6a25a13f 100644 --- a/api/src/routes/discovery.ts +++ b/api/src/routes/discovery.ts @@ -9,8 +9,12 @@ router.get("/categories", route({}), (req: Request, res: Response) => { const { locale, primary_only } = req.query; + let categories; + let out; + + switch (locale) { case "en-US": switch (primary_only) { diff --git a/api/src/routes/guild-recommendations.ts b/api/src/routes/guild-recommendations.ts index ecc5e5469..3e5b8f328 100644 --- a/api/src/routes/guild-recommendations.ts +++ b/api/src/routes/guild-recommendations.ts @@ -13,7 +13,7 @@ router.get("/", route({}), async (req: Request, res: Response) => { // const guilds = await Guild.find({ where: { features: "DISCOVERABLE" } }); //, take: Math.abs(Number(limit)) }); const guilds = showAllGuilds ? await Guild.find({ take: Math.abs(Number(limit || 24)) }) - : await Guild.find({ where: `"features" LIKE '%COMMUNITY%'`, take: Math.abs(Number(limit || 24)) }); + : await Guild.find({ where: `"features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || 24)) }); res.send({ recommended_guilds: guilds }); }); diff --git a/api/src/routes/guilds/#guild_id/discovery-requirements.ts b/api/src/routes/guilds/#guild_id/discovery-requirements.ts new file mode 100644 index 000000000..ad20633f5 --- /dev/null +++ b/api/src/routes/guilds/#guild_id/discovery-requirements.ts @@ -0,0 +1,39 @@ +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 { guild_id } = req.params; + // TODO: + // Load from database + // Admin control, but for now it allows anyone to be discoverable + + res.send({ + guild_id: guild_id, + safe_environment: true, + healthy: true, + health_score_pending: false, + size: true, + nsfw_properties: {}, + protected: true, + sufficient: true, + sufficient_without_grace_period: true, + valid_rules_channel: true, + retention_healthy: true, + engagement_healthy: true, + age: true, + minimum_age: 0, + health_score: { + avg_nonnew_participators: 0, + avg_nonnew_communicators: 0, + num_intentful_joiners: 0, + perc_ret_w1_intentful: 0 + }, + minimum_size: 0 + }); +}); + +export default router; diff --git a/api/src/routes/guilds/#guild_id/index.ts b/api/src/routes/guilds/#guild_id/index.ts index d8ee86ffc..991c3f932 100644 --- a/api/src/routes/guilds/#guild_id/index.ts +++ b/api/src/routes/guilds/#guild_id/index.ts @@ -34,7 +34,7 @@ router.get("/", route({}), async (req: Request, res: Response) => { // @ts-ignore guild.joined_at = member?.joined_at; - return res.json(guild); + return res.send(guild); }); router.patch("/", route({ body: "GuildUpdateSchema", permission: "MANAGE_GUILD" }), async (req: Request, res: Response) => { 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 ab4897435..18a6ed4ba 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 @@ -1,5 +1,5 @@ import { Request, Response, Router } from "express"; -import { Member, getPermission, Role, GuildMemberUpdateEvent, emitEvent } from "@fosscord/util"; +import { Member, getPermission, Role, GuildMemberUpdateEvent, emitEvent, Sticker, Emoji, Guild } from "@fosscord/util"; import { HTTPError } from "lambert-server"; import { route } from "@fosscord/api"; @@ -43,13 +43,26 @@ router.patch("/", route({ body: "MemberChangeSchema" }), async (req: Request, re }); router.put("/", route({}), async (req: Request, res: Response) => { + + // TODO: Lurker mode + let { guild_id, member_id } = req.params; if (member_id === "@me") member_id = req.user_id; - throw new HTTPError("Maintenance: Currently you can't add a member", 403); - // TODO: only for oauth2 applications + var guild = await Guild.findOneOrFail({ + where: { id: guild_id } }); + + var emoji = await Emoji.find({ + where: { guild_id: guild_id } }); + + var roles = await Role.find({ + where: { guild_id: guild_id } }); + + var stickers = await Sticker.find({ + where: { guild_id: guild_id } }); + + res.send({...guild, emojis: emoji, roles: roles, stickers: stickers}); await Member.addToGuild(member_id, guild_id); - res.sendStatus(204); }); router.delete("/", route({ permission: "KICK_MEMBERS" }), async (req: Request, res: Response) => { diff --git a/api/src/routes/partners/#guild_id/requirements.ts b/api/src/routes/partners/#guild_id/requirements.ts new file mode 100644 index 000000000..545c5c78d --- /dev/null +++ b/api/src/routes/partners/#guild_id/requirements.ts @@ -0,0 +1,40 @@ + +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 { guild_id } = req.params; + // TODO: + // Load from database + // Admin control, but for now it allows anyone to be discoverable + + res.send({ + guild_id: guild_id, + safe_environment: true, + healthy: true, + health_score_pending: false, + size: true, + nsfw_properties: {}, + protected: true, + sufficient: true, + sufficient_without_grace_period: true, + valid_rules_channel: true, + retention_healthy: true, + engagement_healthy: true, + age: true, + minimum_age: 0, + health_score: { + avg_nonnew_participators: 0, + avg_nonnew_communicators: 0, + num_intentful_joiners: 0, + perc_ret_w1_intentful: 0 + }, + minimum_size: 0 + }); +}); + +export default router; diff --git a/api/src/util/handlers/route.ts b/api/src/util/handlers/route.ts index 05658ad3b..0048c4dd7 100644 --- a/api/src/util/handlers/route.ts +++ b/api/src/util/handlers/route.ts @@ -73,7 +73,7 @@ const normalizeBody = (body: any = {}) => { } else { for (const [key, value] of Object.entries(object)) { if (value == null) { - if (key === "icon" || key === "avatar" || key === "banner" || key === "splash") continue; + if (key === "icon" || key === "avatar" || key === "banner" || key === "splash" || key === "discovery_splash") continue; delete object[key]; } else if (typeof value === "object") { normalizeObject(value); From 5c525c1eef8de8c94a47316b23c23bd23ce54922 Mon Sep 17 00:00:00 2001 From: Featyre Date: Tue, 25 Jan 2022 00:30:16 +0800 Subject: [PATCH 06/11] change line --- api/src/routes/guilds/#guild_id/members/#member_id/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 18a6ed4ba..24c74af7f 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 @@ -61,8 +61,8 @@ router.put("/", route({}), async (req: Request, res: Response) => { var stickers = await Sticker.find({ where: { guild_id: guild_id } }); - res.send({...guild, emojis: emoji, roles: roles, stickers: stickers}); await Member.addToGuild(member_id, guild_id); + res.send({...guild, emojis: emoji, roles: roles, stickers: stickers}); }); router.delete("/", route({ permission: "KICK_MEMBERS" }), async (req: Request, res: Response) => { From b01a26cdceb2840b44da7033e2f6615a27273595 Mon Sep 17 00:00:00 2001 From: Featyre Date: Wed, 26 Jan 2022 08:58:36 +0800 Subject: [PATCH 07/11] Dev portal + categories load db --- api/client_test/developers.html | 42 +++++++++++++++++++++++ api/src/middlewares/TestClient.ts | 9 +++++ api/src/routes/applications/detectable.ts | 2 +- api/src/routes/applications/index.ts | 11 ++++++ api/src/routes/discoverable-guilds.ts | 6 ++-- api/src/routes/discovery.ts | 21 +++--------- api/src/routes/experiments.ts | 2 +- api/src/routes/guild-recommendations.ts | 5 ++- api/src/routes/teams.ts | 11 ++++++ util/src/entities/Categories.ts | 6 ++-- 10 files changed, 89 insertions(+), 26 deletions(-) create mode 100644 api/client_test/developers.html create mode 100644 api/src/routes/applications/index.ts create mode 100644 api/src/routes/teams.ts diff --git a/api/client_test/developers.html b/api/client_test/developers.html new file mode 100644 index 000000000..2a4402d75 --- /dev/null +++ b/api/client_test/developers.html @@ -0,0 +1,42 @@ + + + + + + + + + Discord Test Client Developer Portal + + + + +
+ + + + + + diff --git a/api/src/middlewares/TestClient.ts b/api/src/middlewares/TestClient.ts index 5c0b081b9..ecf87681a 100644 --- a/api/src/middlewares/TestClient.ts +++ b/api/src/middlewares/TestClient.ts @@ -83,6 +83,15 @@ export default function TestClient(app: Application) { return res.send(buffer); }); + app.get("/developers*", (req: Request, res: Response) => { + const { useTestClient } = Config.get().client; + res.set("Cache-Control", "public, max-age=" + 60 * 60 * 24); + res.set("content-type", "text/html"); + + if(!useTestClient) return res.send("Test client is disabled on this instance. Use a stand-alone client to connect this instance.") + + res.send(fs.readFileSync(path.join(__dirname, "..", "..", "client_test", "developers.html"), { encoding: "utf8" })); + }); app.get("*", (req: Request, res: Response) => { const { useTestClient } = Config.get().client; res.set("Cache-Control", "public, max-age=" + 60 * 60 * 24); diff --git a/api/src/routes/applications/detectable.ts b/api/src/routes/applications/detectable.ts index 411e95bf7..28ce42dae 100644 --- a/api/src/routes/applications/detectable.ts +++ b/api/src/routes/applications/detectable.ts @@ -5,7 +5,7 @@ const router: Router = Router(); router.get("/", route({}), async (req: Request, res: Response) => { //TODO - res.json([]).status(200); + res.send([]).status(200); }); export default router; diff --git a/api/src/routes/applications/index.ts b/api/src/routes/applications/index.ts new file mode 100644 index 000000000..28ce42dae --- /dev/null +++ b/api/src/routes/applications/index.ts @@ -0,0 +1,11 @@ +import { Request, Response, Router } from "express"; +import { route } from "@fosscord/api"; + +const router: Router = Router(); + +router.get("/", route({}), async (req: Request, res: Response) => { + //TODO + res.send([]).status(200); +}); + +export default router; diff --git a/api/src/routes/discoverable-guilds.ts b/api/src/routes/discoverable-guilds.ts index df4448dff..0aa2baa9e 100644 --- a/api/src/routes/discoverable-guilds.ts +++ b/api/src/routes/discoverable-guilds.ts @@ -13,12 +13,10 @@ router.get("/", route({}), async (req: Request, res: Response) => { // TODO: implement this with default typeorm query // const guilds = await Guild.find({ where: { features: "DISCOVERABLE" } }); //, take: Math.abs(Number(limit)) }); let guilds; - let total; if (categories == undefined) { guilds = showAllGuilds ? await Guild.find({ take: Math.abs(Number(limit || configLimit)) }) : await Guild.find({ where: `"features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || configLimit)) }); - total = guilds.length; } else { guilds = showAllGuilds ? await Guild.find({ where: `"primary_category_id" = ${categories}`, take: Math.abs(Number(limit || configLimit)) }) @@ -26,8 +24,10 @@ router.get("/", route({}), async (req: Request, res: Response) => { where: `"primary_category_id" = ${categories} AND "features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || configLimit)) }); - total = guilds.length; } + + const total = guilds ? guilds.length : undefined; + res.send({ total: total, guilds: guilds, offset: Number(offset || Config.get().guild.discovery.offset), limit: Number(limit || configLimit) }); }); diff --git a/api/src/routes/discovery.ts b/api/src/routes/discovery.ts index b6a25a13f..1991400ef 100644 --- a/api/src/routes/discovery.ts +++ b/api/src/routes/discovery.ts @@ -1,29 +1,16 @@ +import { Categories } from "@fosscord/util"; import { Router, Response, Request } from "express"; import { route } from "@fosscord/api"; const router = Router(); -router.get("/categories", route({}), (req: Request, res: Response) => { +router.get("/categories", route({}), async (req: Request, res: Response) => { // TODO: - // Load categories from db instead of hardcoding + // Get locale instead const { locale, primary_only } = req.query; - let categories; - - let out; - - - - switch (locale) { - case "en-US": - switch (primary_only) { - case "false": - out = [{"id": 0, "is_primary": true, "name": "General"}, {"id": 10, "is_primary": true, "name": "Travel & Food"}, {"id": 15, "is_primary": false, "name": "Esports"}, {"id": 30, "is_primary": false, "name": "LFG"}, {"id": 32, "is_primary": false, "name": "Theorycraft"}, {"id": 36, "is_primary": false, "name": "Business"}, {"id": 39, "is_primary": false, "name": "Fandom"}, {"id": 43, "is_primary": true, "name": "Emoji"}, {"id": 18, "is_primary": false, "name": "Books"}, {"id": 23, "is_primary": false, "name": "Podcasts"}, {"id": 28, "is_primary": false, "name": "Investing"}, {"id": 7, "is_primary": true, "name": "Sports"}, {"id": 13, "is_primary": true, "name": "Other"}, {"id": 2, "is_primary": true, "name": "Music"}, {"id": 3, "is_primary": true, "name": "Entertainment"}, {"id": 4, "is_primary": true, "name": "Creative Arts"}, {"id": 6, "is_primary": true, "name": "Education"}, {"id": 9, "is_primary": true, "name": "Relationships & Identity"}, {"id": 11, "is_primary": true, "name": "Fitness & Health"}, {"id": 12, "is_primary": true, "name": "Finance"}, {"id": 45, "is_primary": false, "name": "Mobile"}, {"id": 16, "is_primary": false, "name": "Anime & Manga"}, {"id": 17, "is_primary": false, "name": "Movies & TV"}, {"id": 19, "is_primary": false, "name": "Art"}, {"id": 20, "is_primary": false, "name": "Writing"}, {"id": 22, "is_primary": false, "name": "Programming"}, {"id": 25, "is_primary": false, "name": "Memes"}, {"id": 27, "is_primary": false, "name": "Cryptocurrency"}, {"id": 31, "is_primary": false, "name": "Customer Support"}, {"id": 33, "is_primary": false, "name": "Events"}, {"id": 34, "is_primary": false, "name": "Roleplay"}, {"id": 37, "is_primary": false, "name": "Local Group"}, {"id": 38, "is_primary": false, "name": "Collaboration"}, {"id": 40, "is_primary": false, "name": "Wiki & Guide"}, {"id": 42, "is_primary": false, "name": "Subreddit"}, {"id": 1, "is_primary": true, "name": "Gaming"}, {"id": 5, "is_primary": true, "name": "Science & Tech"}, {"id": 8, "is_primary": true, "name": "Fashion & Beauty"}, {"id": 14, "is_primary": true, "name": "General Chatting"}, {"id": 21, "is_primary": false, "name": "Crafts, DIY, & Making"}, {"id": 48, "is_primary": false, "name": "Game Developer"}, {"id": 49, "is_primary": true, "name": "Bots"}, {"id": 24, "is_primary": false, "name": "Tabletop Games"}, {"id": 26, "is_primary": false, "name": "News & Current Events"}, {"id": 29, "is_primary": false, "name": "Studying & Teaching"}, {"id": 35, "is_primary": false, "name": "Content Creator"}, {"id": 44, "is_primary": false, "name": "Comics & Cartoons"}, {"id": 46, "is_primary": false, "name": "Console"}, {"id": 47, "is_primary": false, "name": "Charity & Nonprofit"}] - case "true": - out = [{"id": 0, "is_primary": true, "name": "General"}, {"id": 10, "is_primary": true, "name": "Travel & Food"}, {"id": 43, "is_primary": true, "name": "Emoji"}, {"id": 7, "is_primary": true, "name": "Sports"}, {"id": 13, "is_primary": true, "name": "Other"}, {"id": 2, "is_primary": true, "name": "Music"}, {"id": 3, "is_primary": true, "name": "Entertainment"}, {"id": 4, "is_primary": true, "name": "Creative Arts"}, {"id": 6, "is_primary": true, "name": "Education"}, {"id": 9, "is_primary": true, "name": "Relationships & Identity"}, {"id": 11, "is_primary": true, "name": "Fitness & Health"}, {"id": 12, "is_primary": true, "name": "Finance"}, {"id": 1, "is_primary": true, "name": "Gaming"}, {"id": 5, "is_primary": true, "name": "Science & Tech"}, {"id": 8, "is_primary": true, "name": "Fashion & Beauty"}, {"id": 14, "is_primary": true, "name": "General Chatting"}] - } - } + const out = primary_only ? await Categories.find() : await Categories.find({ where: `"is_primary" = "true"` }); res.send(out); }); diff --git a/api/src/routes/experiments.ts b/api/src/routes/experiments.ts index 966ed99c2..7be86fb89 100644 --- a/api/src/routes/experiments.ts +++ b/api/src/routes/experiments.ts @@ -5,7 +5,7 @@ const router = Router(); router.get("/", route({}), (req: Request, res: Response) => { // TODO: - res.send({ fingerprint: "", assignments: [] }); + res.send({ fingerprint: "", assignments: [], guild_experiments:[] }); }); export default router; diff --git a/api/src/routes/guild-recommendations.ts b/api/src/routes/guild-recommendations.ts index 3e5b8f328..1432f39c9 100644 --- a/api/src/routes/guild-recommendations.ts +++ b/api/src/routes/guild-recommendations.ts @@ -11,10 +11,13 @@ router.get("/", route({}), async (req: Request, res: Response) => { // ! 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 genLoadId = (size: Number) => [...Array(size)].map(() => Math.floor(Math.random() * 16).toString(16)).join(''); + const guilds = showAllGuilds ? await Guild.find({ take: Math.abs(Number(limit || 24)) }) : await Guild.find({ where: `"features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || 24)) }); - res.send({ recommended_guilds: guilds }); + res.send({ recommended_guilds: guilds, load_id: `server_recs/${genLoadId(32)}`}).status(200); }); export default router; diff --git a/api/src/routes/teams.ts b/api/src/routes/teams.ts new file mode 100644 index 000000000..7ce3abcb6 --- /dev/null +++ b/api/src/routes/teams.ts @@ -0,0 +1,11 @@ +import { Request, Response, Router } from "express"; +import { route } from "@fosscord/api"; + +const router: Router = Router(); + +router.get("/", route({}), async (req: Request, res: Response) => { + //TODO + res.send([]); +}); + +export default router; diff --git a/util/src/entities/Categories.ts b/util/src/entities/Categories.ts index 1d2721188..269e178f5 100644 --- a/util/src/entities/Categories.ts +++ b/util/src/entities/Categories.ts @@ -15,15 +15,15 @@ import { BaseClassWithoutId } from "./BaseClass"; // }] @Entity("categories") -export class CategoryEntity extends BaseClassWithoutId { // Not using snowflake +export class Categories extends BaseClassWithoutId { // Not using snowflake @PrimaryColumn() id: number; @Column() - default: string; + name: string; - @Column({ type: "simple-json", nullable: false }) + @Column({ type: "simple-json" }) localizations: string; @Column() From a2644052d0da2e1bc27d47762b445cabd4453758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkin=20Alp=20G=C3=BCney?= Date: Thu, 27 Jan 2022 16:54:42 +0300 Subject: [PATCH 08/11] A few minor changes --- util/src/entities/User.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts index 1027331a3..f157ac39a 100644 --- a/util/src/entities/User.ts +++ b/util/src/entities/User.ts @@ -256,7 +256,7 @@ export class User extends BaseClass { disabled: false, deleted: false, email: email, - rights: "0", + rights: "0", // TODO: grant rights correctly, as 0 actually stands for no rights at all nsfw_allowed: true, // TODO: depending on age public_flags: "0", flags: "0", // TODO: generate @@ -283,7 +283,7 @@ export class User extends BaseClass { } export const defaultSettings: UserSettings = { - afk_timeout: 300, + afk_timeout: 3600, allow_accessibility_detection: true, animate_emoji: true, animate_stickers: 0, @@ -291,10 +291,10 @@ export const defaultSettings: UserSettings = { convert_emoticons: false, custom_status: null, default_guilds_restricted: false, - detect_platform_accounts: true, - developer_mode: false, - disable_games_tab: false, - enable_tts_command: true, + detect_platform_accounts: false, + developer_mode: true, + disable_games_tab: true, + enable_tts_command: false, explicit_content_filter: 0, friend_source_flags: { all: true }, gateway_connected: false, @@ -304,17 +304,16 @@ export const defaultSettings: UserSettings = { inline_attachment_media: true, inline_embed_media: true, locale: "en-US", - message_display_compact: false, + message_display_compact: true, native_phone_integration_enabled: true, render_embeds: true, render_reactions: true, restricted_guilds: [], show_current_game: true, status: "online", - stream_notifications_enabled: true, + stream_notifications_enabled: false, theme: "dark", - timezone_offset: 0, - // timezone_offset: // TODO: timezone from request + timezone_offset: 0, // TODO: timezone from request }; export interface UserSettings { From fb5667e18c9175fdcdaab49f3035e0dfcd0fbc60 Mon Sep 17 00:00:00 2001 From: Featyre Date: Wed, 2 Feb 2022 01:02:32 +0800 Subject: [PATCH 09/11] make everything in categories nullable --- util/src/entities/Categories.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/util/src/entities/Categories.ts b/util/src/entities/Categories.ts index 269e178f5..18fc755d9 100644 --- a/util/src/entities/Categories.ts +++ b/util/src/entities/Categories.ts @@ -17,16 +17,16 @@ import { BaseClassWithoutId } from "./BaseClass"; @Entity("categories") export class Categories extends BaseClassWithoutId { // Not using snowflake - @PrimaryColumn() + @PrimaryColumn({ nullable: true }) id: number; - @Column() + @Column({ nullable: true }) name: string; @Column({ type: "simple-json" }) localizations: string; - @Column() + @Column({ nullable: true }) is_primary: boolean; } \ No newline at end of file From 299b9b8d579da0f29b8be533be08e9fa7d50f147 Mon Sep 17 00:00:00 2001 From: Featyre Date: Wed, 2 Feb 2022 01:06:42 +0800 Subject: [PATCH 10/11] Fix primarycolum being assigned to nullable = true --- util/src/entities/Categories.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/src/entities/Categories.ts b/util/src/entities/Categories.ts index 18fc755d9..a3c1280fa 100644 --- a/util/src/entities/Categories.ts +++ b/util/src/entities/Categories.ts @@ -17,7 +17,7 @@ import { BaseClassWithoutId } from "./BaseClass"; @Entity("categories") export class Categories extends BaseClassWithoutId { // Not using snowflake - @PrimaryColumn({ nullable: true }) + @PrimaryColumn() id: number; @Column({ nullable: true }) From 7b3531cb9015ec5bdf95c97b726d5d64f2ca41fa Mon Sep 17 00:00:00 2001 From: Featyre Date: Wed, 2 Feb 2022 02:09:57 +0800 Subject: [PATCH 11/11] Return none for dev portal + todo for categories --- api/src/routes/users/@me/guilds.ts | 8 +++++++- util/src/entities/Categories.ts | 1 + util/src/entities/Guild.ts | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/api/src/routes/users/@me/guilds.ts b/api/src/routes/users/@me/guilds.ts index 22a2c04c5..754a240e3 100644 --- a/api/src/routes/users/@me/guilds.ts +++ b/api/src/routes/users/@me/guilds.ts @@ -8,7 +8,13 @@ const router: Router = Router(); router.get("/", route({}), async (req: Request, res: Response) => { const members = await Member.find({ relations: ["guild"], where: { id: req.user_id } }); - res.json(members.map((x) => x.guild)); + let guild = members.map((x) => x.guild); + + if ("with_counts" in req.query && req.query.with_counts == "true") { + guild = []; // TODO: Load guilds with user role permissions number + } + + res.json(guild); }); // user send to leave a certain guild diff --git a/util/src/entities/Categories.ts b/util/src/entities/Categories.ts index a3c1280fa..81fbc3036 100644 --- a/util/src/entities/Categories.ts +++ b/util/src/entities/Categories.ts @@ -13,6 +13,7 @@ import { BaseClassWithoutId } from "./BaseClass"; // }, // "is_primary": false/true // }] +// Also populate discord default categories @Entity("categories") export class Categories extends BaseClassWithoutId { // Not using snowflake diff --git a/util/src/entities/Guild.ts b/util/src/entities/Guild.ts index 18fa7a0ae..9ac148ee3 100644 --- a/util/src/entities/Guild.ts +++ b/util/src/entities/Guild.ts @@ -270,6 +270,9 @@ export class Guild extends BaseClass { @Column({ nullable: true }) nsfw?: boolean; + // only for developer portal + permissions?: number; + static async createGuild(body: { name?: string; icon?: string | null;