From b7f3535d093cc75fc665b5ffd4ed9d5b563f1aff Mon Sep 17 00:00:00 2001 From: Rory& Date: Tue, 10 Feb 2026 22:26:30 +0100 Subject: [PATCH] Add discovery filtering --- assets/openapi.json | Bin 905819 -> 932748 bytes assets/schemas.json | Bin 389535 -> 405585 bytes src/api/routes/discoverable-guilds.ts | 40 +++++++----------- src/util/entities/Guild.ts | 6 +++ .../1770748070808-GuildDiscoveryHoisting.ts | 15 +++++++ 5 files changed, 36 insertions(+), 25 deletions(-) create mode 100644 src/util/migration/postgres/1770748070808-GuildDiscoveryHoisting.ts diff --git a/assets/openapi.json b/assets/openapi.json index d361c5d1dd004411fbff09d97dd1c266e86b38bf..f7bc123af2eb60605b0a1702d6f0c065a61fbaec 100644 GIT binary patch delta 3357 zcmb_eYitzP71rFjcV-`Bdu<+mV4L;UI2f?KybPfsu`#xB0%3`u5HRc-Fqnt&;s@`N zrF9@Fq-+`R*YXgHfTk)<*i^uT5MW88G!X^XM6E;-VFQE+rG+)LBn<-h&TPC6QBi`_ zA0wT)k8{3z&UYRc_l?-})hxSfSIk-5GFSaoONHtS zSHgLWGGx3gxF6caV8$|x70JE4cES8Qlujn;I60p&ZSBj#`BU&-;P=)nXKu|^Nmf$T z?_zj+t#}$X3oV9gt1v;EK zvt*PS%*j!`8xr6;Nd~I6Nes4?L|^FzUyGOz-)-WM9Q6%zYa8*_B$|)#Afmwgq>!f{ zR-^YQju#707&qU4U(#4XhTff`?Z+QOary~vOo!KYR4UvS z;;{?0%gi95dNMc!_F=R?g1gugC|PB)z|~6o87^`jAdW|&H^aNn)OTBy4tV$(MTp;0 zZ7q&Auk7GnHp97)r5k2d@1DN!nTftd^p3<3!<_SNFUH6yru~zb95Gq*Toz}=h9>Z*3&+`CO)OTbf1YrT&rAGSF>bE?c&%?USMD06@)q9KSbtW zz$aoF_q+-Adn_i5>=ImELS2{O>k@w5B?P;K54(imUqqvDXsu;rf&fpVR1Ho+51i%P zu+b<&qs1cCmoA}Np?4l?0q|d?lInau+u&ln1*l$XLg1e0Fbb_JBIe@k3#5P_Qs7ZZ zuI8yC3y5|$fzIO=-(!XFRgil8CyBb%aIy)1?nTG75up%~`{W!VUr{p((r6Zf6+GVY zrUu@w7UT2;vL#*-n{c^>Rb!QltVEKN_rZ@hiknikD{qJgD~-CV^}j3rJ|z~fnsub5 zt;3v+H+u67y>mt6U7%ggXlrCyIPj4)0^UVrGs6F*5^Muly~cgfGf{PV&GEiyTO!nw z$u(;GYgOH~Rfnr_xJ7&PvTZ_-PgxDVh|qTs>dW17;>a$dN485@C`snC!~N|vD`v7|1t%CsAR{=E@gt=I6FD>p zJGfc{!RID61Scy6ru{NP_a&k;Q(*Y_VGe8eM)G40cd9n=9eN?l7)XfQ7-xned{yd) zKp`!BXma6$jZZ)vDUB0i|H<{z|x5=0PHVpKL>Dzmf^(HA}X(rog)XZEaGea@nFUr1mU( zp}cf*x!W~m%=oG@_vCT>cPx_2t-pb%QofrLB|!= z180imJ+X7u)rvzjc5!U1b*Se5iM)$L*kDPeTI90zfPl^$)IC+!fv^Bm7LrGg;*nYF-FGry^5bu%yVov+Ki;oTyq|A6~J ztI~t$Mr&qEJe*~wu&Ap@o~Nu=!()@+N>YZyf6FX`;|LtdH)RM~_^Psyz`n!stzl<{d;227Uh(g^NQFL!B(*s?~QM1t}m=J$dNadwE`k%lrh-7U9lj4ra1*?i{(ts o-lDWhv7mXTE3*(?uVibto0ap+y3y%AmXVof-GAh!GUM8R0T)uk*#H0l delta 789 zcmZXSTS$~a6vvs{&bRKYyOj`_*petJr4pDGmTOt7mKRDQ)66b(!|F>a@W~}DF{E_A z+T(+uVIe4~L3yCSHYhVH+aQWi%m^O}Dj%Y(z?u~Dp@%=r9OnGbj65emZ9Bn>*!#7gX`r!O}_sF4AzpQZ<4qE4H9`bcjR zD_ouwJWE_SHcj_At>$6@ZLfIlGPEpulkjNGG7VJ1W?AT^GU z!^9mf;BY5Pv`oItD*j;ykDo1v-<>QuNZAOuOcJNV3n1+keF)(~L&A+B88aU`Q7n`7 zEd{0)$yhM$%43E4^T7R>8)zo;F9Zr|b;Is8WT`d5Wx$A@&Gla7@xixp34{$}354p! z-q{pzUSRoMdc?^8C;3ItYp~sob2iyvZlu|;tDT($|5g$R-eCf2b66@4KVvP6;mZtL z2<$eryf0QrlO<+$Gm)l z3o4RW!t8$KHqNd>^EoQ;s1%Q4VIo5`{i6<=`u5;4V#8mF!YyIYM{IED3E7RYKe#Uv z9ckjL1EvZ!w%j&x*ENtSaw_NGxAqEKWW!KM;84gG-3+yDGNK`;L~0pYcC84^DRK10 z{QV)AEX0IU zs@H{CjcRQc@*ZQD;FbrXb1tpm?-)iqzQOLsT<2cD5H>i_@% diff --git a/assets/schemas.json b/assets/schemas.json index b905dc1803eeff598752e23068ec3588f8413c1a..3d4b7447d3c8480266af5f04836886d12b56df3f 100644 GIT binary patch delta 2610 zcmb_eZBUfg6`uR??guQetAqsNd(U^1De_P!Tcpp)sx zO#kfOIrqHxJolXQoaYYw$$2iC-u((OmkGPgj@4bqLmBy*s_O_9doCd>GT-Ad*g=-_hD3=yI>L=Mw5M1R5E_}zY9Bs{Cq zW;lw$chdjG@6cuD`o=@Q!8hb*E(D8d?SV@ZS#h7vP}zx&X=pVwE2?%F8b%QG}zxK77-4((6&d@j(W})lip|OgTgnWVU?TO^ww5yyWrd2v$&s2xpi?%AqVohWP-J z{=zTdgD#pUV&!scd6uf4y_hY=gVj{lvfKgRJnEJUD`LyoGQ=8a5gH0vHo|_Ijg;O0 zjo0X_vXL+DrrH1bzza3BKzR+mpe-;0WvHeWk;n7J$eV5~eVr#_=wqHGg5}w=vKDxb z^K7FDl4c++$6$+W^ANS8;Uq~zB&;o*auvZ7nTE+a5kYpT^T4}Ky!Q#W!j(py69_)1 z{mA|`F(XjR(o_oU`)QW={l-kArRRvl1-bC-p||1eMw+QUiPf@ip|YIG#{ZJ0Dw9lK z*$u2V1;DVXR2$gb4z@^veA2Jb&PHL6mMtRv=|%{b+FDji7s$o5t?=U{O<7!ink!3Y zGI&~KIE(AUIcjHhJzb(8Uwl}W&&ZQOMY*uS?WgnqUr6F0>t2+3+W)9LzTgl~RS?4Y zB*EyHLX~{Q`@bL5Ea+d)CNR!$P^FMVq zxCKUrZu~sU3k_Z-#?`n+>@~(kNr@K&S4dBMoTK4kDFtqu z8GmSJr{V+qe^Uuue~xST?Ktrve}q6P1Eex|aYrXR1kWXAL13KJ#YZ1fk|lp!qvY19 zse^M@Ni`n%octK>pYnQq_!I8M8`sD&{gj!B*~fC(&nIT7?r30NC98CkdJOO7otheV zXm8}H7<`}R^yc#0(H$kD!0CC!WA{W34ppB$wZv=-RcvE?XikjimSnbZ(t|KB}6ARiy! z(RXF=4>kSW0{$B-o;XP@deW`@>;?>+p$;s}B1!s@<@~Os={G}#hj$|K6km_NQhpP@ z^6)k#x%TPVUb{{5%5jZ3F=WxIG2&$@cxRN?OwdQ_@@#$lN&Zoy!9Q6UFNOp)Bl>4K zWv9wBDSlJDEP#6-D^Z-p_b#&#>=k?;WRBOE)mz2i35TD|M)Ym%?#Iseas7OscKS}( zkMd+v3J0O7IMPL|BDj62h#p@7DZx$=E_EVYMK>ap%n~u!$V-v8S-t~8KO##E0p{lV oww=u#9RakzP1A)hwj^OoTkCWih92WPkn*XNKle7-m(P_7|A-W-aGg;Y=P>u-ME#$AFEiG6dln3ukqXX$@Rr~w% zssXMI;YD+!aR$vf!kYzoZI3OI7`b%e27aWa4;^vUf>4b1Y0J?HYk*8FO^dafGkaR) z+inC6mB8;Q8P!$`ap;d66uNY5w?5wP=6Az#B!J`tifB(Kv3pYH?KJ{d38PLuw`d^w zLOsOU31#QVW%*TbRLjzJESp9E!7p+r&V3jAk@2em^!_ynJ;Q1{Drw^?((4rG;$fv5 zP`RkQc;2W?o;1~62amn8pI37fjk diff --git a/src/api/routes/discoverable-guilds.ts b/src/api/routes/discoverable-guilds.ts index 8f059f570..87de37a3b 100644 --- a/src/api/routes/discoverable-guilds.ts +++ b/src/api/routes/discoverable-guilds.ts @@ -44,31 +44,21 @@ router.get( select: { guild_id: true }, }).then((members) => members.map((member) => member.guild_id)) : []; - let guilds; - 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)), - }); - } else { - guilds = showAllGuilds - ? await Guild.find({ - where: { primary_category_id: categories.toString(), id: Not(In(hiddenGuildIds)) }, - take: Math.abs(Number(limit || configLimit)), - }) - : await Guild.find({ - where: { - primary_category_id: categories.toString(), - features: Like("%DISCOVERABLE%"), - id: Not(In(hiddenGuildIds)), - }, - take: Math.abs(Number(limit || configLimit)), - }); - } + + const guilds = await Guild.find({ + where: { + id: Not(In(hiddenGuildIds)), + discovery_excluded: false, + ...(categories == undefined ? {} : { primary_category_id: categories.toString() }), // TODO: isnt this an array? + ...(showAllGuilds ? {} : { features: Like("%DISCOVERABLE%") }), + }, + order: { + discovery_weight: "DESC", + member_count: "DESC", + }, + skip: Math.abs(Number(offset || Config.get().guild.discovery.offset)), + take: Math.abs(Number(limit || configLimit)), + }); const total = guilds ? guilds.length : undefined; diff --git a/src/util/entities/Guild.ts b/src/util/entities/Guild.ts index 56740ab56..aac3daf0e 100644 --- a/src/util/entities/Guild.ts +++ b/src/util/entities/Guild.ts @@ -298,6 +298,12 @@ export class Guild extends BaseClass { @Column({ select: false, type: "simple-array" }) channel_ordering: string[]; + @Column() + discovery_weight: number = 0; + + @Column() + discovery_excluded: boolean = false; + static async createGuild(body: { name?: string; icon?: string | null; diff --git a/src/util/migration/postgres/1770748070808-GuildDiscoveryHoisting.ts b/src/util/migration/postgres/1770748070808-GuildDiscoveryHoisting.ts new file mode 100644 index 000000000..de8783883 --- /dev/null +++ b/src/util/migration/postgres/1770748070808-GuildDiscoveryHoisting.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class GuildDiscoveryHoisting1770748070808 implements MigrationInterface { + name = "GuildDiscoveryHoisting1770748070808"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "guilds" ADD "discovery_weight" integer NOT NULL`); + await queryRunner.query(`ALTER TABLE "guilds" ADD "discovery_excluded" boolean NOT NULL`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "guilds" DROP COLUMN "discovery_excluded"`); + await queryRunner.query(`ALTER TABLE "guilds" DROP COLUMN "discovery_weight"`); + } +}