From 83be88bb8010bc0beb18498e4d72818a1e46ec20 Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Thu, 30 Oct 2025 16:47:59 -0500 Subject: [PATCH 1/9] fix SQLite --- assets/openapi.json | Bin 1384361 -> 1384928 bytes assets/schemas.json | Bin 4239069 -> 4239136 bytes src/util/entities/ApplicationCommand.ts | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/openapi.json b/assets/openapi.json index d2bc69f3ab085b33073332b026936b90f85f036f..0aa58c79f893b3635ce3dfb7b7b736c7cc39828b 100644 GIT binary patch delta 1113 zcmah|T}V@580O4#&iBrpO-;KnYw1|(HrtOsZJt?8h>93A%Akm7X3C_Tp=B2#4O$8P zT_p6@Rd$t8h(U1Zs!>-ZEQtsrp@DQ;^QtVU-koo{C9y6Z&foJs@AJIxcOE|P$-L}I zB!#3QS@u-i>)$xkdp0)I8~1j2b`778pC0Z#IqDfbG1@;e)<1$()vR%1+Ak6$ZQ3sf z(JiS(oc`9}}8!14iZyfKijF9_RbmEzIm-vSwD; zYq_LAuJJwPzm&hcJ+5W1v^pF6@T6p&J_D`i9a}ttQOq5>{W20R}m$gT@XF^ z!VN7L88ewN(hXt!6aW*}HA4-C4$13tWz85G5EYyy^4 zjM?$17u-d9U(-TfAkioKP^TR9!B*~|AoaipjX5a^Q{$oy-*l3VZ$7Ydsq87m!D|Ow zA++}0%}c=WSL+H{&oSHvjv^bM+sKt3y3kT>ho+*IiFR^T7{rg&$HZZ&<)86qI%tw> z;(P8&F04N%wQ{@Hw(;pY`4IK^lE1joZHvJ0_yBC?jKY-WcbAz^3XsQwDM~6E!h_gw zL2*r<5os62-h5nQ{-W8+Z52*rrAu++vjA-2L!d1?_#LgQ9N#ZnZ1~$O0A`|4%T>Ol z1v7@{WGm-g=_Dii0HgL53N0zGvfK$O|Ejy*sX_yPB*UAy-VIuk5XPlD^rz^jCEf-y zURNRC;E_rPKyUC?r8B4B{ak%#3$C=^7X;g6{Q(Ip7c5?!-EP=}iDMAQ{Z24Wbaw$E dcP%HF2nxYWun;N;m4qt7IzqM9-BlA?`~#->YFGdO delta 1116 zcmbu6T}V@57{@vD-QM@?Y;&f0rJJ8k&F#3M9+}%TC<*Gq3!{XPw!@(`^sMbv2oXbO zUKBVGdb;q!E-EZYh3F6oExHOqg+8DQZRT|-cGrzP+esYV?&1&c*YkV+&;QMR7+QQc zluC1HQ@ZRGIV%O_$(WK5Ppj8&jw=(|qcMCwWv0#PQbRAo`8kV)H0Ki2+FKyBum#?2}m80y`%&{-qT~qaQ150lZg$ocZeI7 z9#IAxbM(IM4AC?Pxh3L(^$6wR?h=X3rNZ_3ca6IH1r3;Bc}kFB`7-U%zc}e4SAv=R zG(8+_xvdmoy4LqR?%5&iB!KypRT9hS4zMXeox2W+Zl#&P25CE} z+myoZdA=6v-rIRd)$r$G&&R~MIN>4tja-7kixthVA~Nqok1YbLL1u-oe;iHFahrIJ z%wKjef6-R*GaqDE?JjT*S1_3MGmr6Z)Blf~=`%MQM@oR5DzrK}ItZ}#B3j!t*HGl` zM+o~nJ6TgvhmlU!V&H@@$a0wppiZ%xB4Zl^Wdhvm$(QAW89Yb2q0U6xAihm4Fc!o{yFO+E z;R$iU+aPNNq|_UL-8IezVVPAM+cUjLIe1PQ0233SY2WMu45}7#z03vc17$XFgs>Kq zV(@ADuxsQSk z1Rp9434-cEjLOqhSrJ4KcwvyFvYQCHD5I+gs=qsatS(j;Q5Qcr@B2RQ^ZcLZ|DMUo zZuP)ax7sJEB(=0i(nwlKC+Y8Tw`;`ahW5th29K-6S?xXTY4SE4X>+z6Zadm~>S!ws zeC5mJj9PA+`uA~!xKetzUY9~c&kAb%-Z~B#WN#f`?@4@pI$e-tms#jhC5)31SFA}K z0>w8B2}5R@>Xg4}g(i+hC-oW{+O5~g;W7Sl;_5V`lAtn`Mk|e4GK!W$nm)*D==*iy zq#PaQs#P@ddXtTIJT-9S9p-kCZ+}@I;Y24#YK1gaugjw&ce7AIkszN+EpPb#gi`-{ z!*b_me$OAad5I2v(>Y;@Dda;aszBdM=G*-ay5 zg=QKurRk`mi)Aa1($$_+LZJZT>1r1f`Hri!ajE*d*$SoD zSU1aw6(d)d-A=ASt4P~|Nc!c8M*QWV?-k38%RUlh_&;P_ynrSN>3%78M`AXmm>6Ol zoq1cH(i>4Tik?&D)4(U*N(VyFSrcZ;zO8vK>gTX85@AJ z2Tfp3`AYIjJ(%Lc@h=v}>@9{Q1G{s1lNRCUyKje{dU>ww&t zL0Up}3q?CjPKpfjnN%BK8H(P<0JAG!Fvm9AgC91HKVoUh5)Lt%hzJ(?Fds71!P1q} zyx`n5cu=J5El3RnXXBt!Pq%`zIcGJWcr03!8!*PId`$%Bq`?@T-jeS V0Ls8dunCld3b0wOx>$K7^9O5}qYwZ9 delta 2105 zcmdth-Ahw(7zc2i)1963bDQ~^^JTv5_>yzxTV}b03`!w|ZuCNQjv*Fp%dJ8RH{Ef% zNkI@i)P)LNlwOF0dAf2eP`M{EJNKVb6*oPlAlhl)j^W%UBrp-~$$HQ&jBUY_sde|l7=iLxnM z_>!bLWpAH1XjP^J<&XJ-s8^99W69q*itp;Qw0udID(}4KAE+LVup&RjdoogJpog!M z2e$bgwX=%yq1u?GU*P4wAAH9@S=Lv2`PrRQU}PG-}>iWv>72E8Lh<`KYTYu`cw=cU}v6weMuLjHuaXYj^+Oj@>7 z7AYwUcbP!8Fw0V+2E(jODSjKq-Tt=bl~}3LTGuPqM~#!H+iSNt=+PwV{&YI9gm~jN zIt@iw)xkB9;*V3TWLZrvQ6|rsM)yy~Fp*=LWz#|sH{Y6U%clM%#G7RNY)rF4^2n@! z3{jkFqpY5S5oRQ=M#!Q2A8-v5rBEV@fL~GUz#PMXZ84l&F=nC7FxnWESUPpz; - @Column({ type: "simple-json", default: [] }) + @Column({ type: "simple-json" }) options: ApplicationCommandOption[]; @Column({ nullable: true, type: String }) From 31c0f160e9357f94d9148db5828328b055edb9a1 Mon Sep 17 00:00:00 2001 From: MathMan05 Date: Thu, 30 Oct 2025 17:21:31 -0500 Subject: [PATCH 2/9] fix --- src/util/entities/ApplicationCommand.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/entities/ApplicationCommand.ts b/src/util/entities/ApplicationCommand.ts index 0c7eaa0f..8ec154f8 100644 --- a/src/util/entities/ApplicationCommand.ts +++ b/src/util/entities/ApplicationCommand.ts @@ -53,7 +53,7 @@ export class ApplicationCommand extends BaseClass { @Column({ nullable: true, type: "simple-json" }) description_localizations?: Record; - @Column({ type: "simple-json" }) + @Column({ type: "simple-json", default: "[]" }) options: ApplicationCommandOption[]; @Column({ nullable: true, type: String }) From 61c1cf967b2d439600bd6a03f8c8236563e6c56b Mon Sep 17 00:00:00 2001 From: lazos Date: Fri, 7 Nov 2025 23:11:35 +0100 Subject: [PATCH 3/9] [FEAT] Docker image --- .dockerignore | 4 ++ .github/workflows/publish-image.yml | 50 +++++++++++++++++++ Dockerfile | 77 +++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 .dockerignore create mode 100644 .github/workflows/publish-image.yml create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..5e0660ec --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.github/ +.husky/ +.idea/ +.vscode/ diff --git a/.github/workflows/publish-image.yml b/.github/workflows/publish-image.yml new file mode 100644 index 00000000..a1f15a17 --- /dev/null +++ b/.github/workflows/publish-image.yml @@ -0,0 +1,50 @@ +name: Publish Image + +on: + push: + branches: ['release'] + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + attestations: write + id-token: write + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + id: push + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v3 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..efcad33f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,77 @@ +ARG BRANCH=master +ARG DEBIAN_CODE=trixie +ARG NODE_VERSION=24 +ARG PYTHON_VERSION=3.13 +ARG USER_NAME=spacebar +ARG USER_GROUP=$USER_NAME +ARG USER_UID=1000 +ARG USER_GID=1000 +ARG WORKDIR=/spacebar + + +FROM python:${PYTHON_VERSION}-slim-${DEBIAN_CODE} AS base_python + + +FROM node:${NODE_VERSION}-${DEBIAN_CODE}-slim AS base + +COPY --from=base_python /usr/local/bin/python* /usr/local/bin/ +COPY --from=base_python /usr/local/bin/pip* /usr/local/bin/ +COPY --from=base_python /usr/local/lib/python* /usr/local/lib/ +COPY --from=base_python /usr/local/lib/libpython* /usr/local/lib/ + + +FROM base AS builder + +ARG BRANCH + +WORKDIR /build + +RUN apt-get update && \ + apt-get install -y --no-install-recommends build-essential pkg-config && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /build/server + +COPY . . + +RUN npm i \ + && npm run setup + + +FROM base AS final + +ARG USER_NAME +ARG USER_GROUP +ARG USER_UID +ARG USER_GID +ARG WORKDIR + +RUN mkdir -p "${WORKDIR}/server" \ + && chown -R "${USER_UID}:${USER_GID}" "${WORKDIR}" + +RUN deluser node 2>/dev/null || true \ + && delgroup node 2>/dev/null || true \ + && rm -fr /home/node \ + && addgroup --gid "$USER_GID" "$USER_GROUP" \ + && adduser \ + --disabled-password \ + --gecos "" \ + --uid "$USER_UID" \ + --gid "$USER_GID" \ + --home "$WORKDIR" \ + --no-create-home \ + "$USER_NAME" + +USER ${USER_NAME} + +#@todo: only bring what we need +COPY --chown=${USER_NAME}:${USER_GROUP} --from=builder /build/server "${WORKDIR}/server" + +ENV PORT="8080" +ENV CONFIG_PATH="${WORKDIR}/config.json" +ENV DATABASE="${WORKDIR}/database.db" + +WORKDIR "${WORKDIR}/server" + +ENTRYPOINT [ "npm", "run" ] +CMD [ "start" ] From 7367870ecfdcda9d67470d2db0666b6f4ae1728b Mon Sep 17 00:00:00 2001 From: lazos Date: Fri, 7 Nov 2025 23:20:47 +0100 Subject: [PATCH 4/9] github action publish image --- .github/workflows/publish-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-image.yml b/.github/workflows/publish-image.yml index a1f15a17..ed1ff734 100644 --- a/.github/workflows/publish-image.yml +++ b/.github/workflows/publish-image.yml @@ -1,8 +1,8 @@ name: Publish Image on: - push: - branches: ['release'] + release: + types: [published] env: REGISTRY: ghcr.io From ac62d44d414412ea0c2c36d43d773a2bd281b2b3 Mon Sep 17 00:00:00 2001 From: lazos Date: Fri, 7 Nov 2025 23:34:29 +0100 Subject: [PATCH 5/9] update dockerignore --- .dockerignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.dockerignore b/.dockerignore index 5e0660ec..05356c09 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,3 +2,7 @@ .husky/ .idea/ .vscode/ + +node_modules/ +dist/ +files/ From 11a1d54c3563c8ac89bda8ef55db2393e5304aea Mon Sep 17 00:00:00 2001 From: lazos Date: Fri, 7 Nov 2025 23:50:13 +0100 Subject: [PATCH 6/9] fixup --- Dockerfile | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index efcad33f..9258fc41 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,3 @@ -ARG BRANCH=master ARG DEBIAN_CODE=trixie ARG NODE_VERSION=24 ARG PYTHON_VERSION=3.13 @@ -6,7 +5,7 @@ ARG USER_NAME=spacebar ARG USER_GROUP=$USER_NAME ARG USER_UID=1000 ARG USER_GID=1000 -ARG WORKDIR=/spacebar +ARG BASEDIR=/spacebar FROM python:${PYTHON_VERSION}-slim-${DEBIAN_CODE} AS base_python @@ -44,10 +43,10 @@ ARG USER_NAME ARG USER_GROUP ARG USER_UID ARG USER_GID -ARG WORKDIR +ARG BASEDIR -RUN mkdir -p "${WORKDIR}/server" \ - && chown -R "${USER_UID}:${USER_GID}" "${WORKDIR}" +RUN mkdir -p "${BASEDIR}/server" \ + && chown -R "${USER_UID}:${USER_GID}" "${BASEDIR}" RUN deluser node 2>/dev/null || true \ && delgroup node 2>/dev/null || true \ @@ -65,13 +64,13 @@ RUN deluser node 2>/dev/null || true \ USER ${USER_NAME} #@todo: only bring what we need -COPY --chown=${USER_NAME}:${USER_GROUP} --from=builder /build/server "${WORKDIR}/server" +COPY --chown=${USER_NAME}:${USER_GROUP} --from=builder /build/server "${BASEDIR}/server" ENV PORT="8080" -ENV CONFIG_PATH="${WORKDIR}/config.json" -ENV DATABASE="${WORKDIR}/database.db" +ENV CONFIG_PATH="${BASEDIR}/config.json" +ENV DATABASE="${BASEDIR}/database.db" -WORKDIR "${WORKDIR}/server" +WORKDIR "${BASEDIR}/server" ENTRYPOINT [ "npm", "run" ] CMD [ "start" ] From 1e281b851c0ee35e0ef593bbe1cca13d0c9f9352 Mon Sep 17 00:00:00 2001 From: lazos Date: Sat, 8 Nov 2025 11:06:53 +0100 Subject: [PATCH 7/9] default port --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9258fc41..ffeef473 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,7 +66,7 @@ USER ${USER_NAME} #@todo: only bring what we need COPY --chown=${USER_NAME}:${USER_GROUP} --from=builder /build/server "${BASEDIR}/server" -ENV PORT="8080" +ENV PORT="3001" ENV CONFIG_PATH="${BASEDIR}/config.json" ENV DATABASE="${BASEDIR}/database.db" From f869e5e0030de615614716703034db3d373f9829 Mon Sep 17 00:00:00 2001 From: lazos Date: Sat, 8 Nov 2025 11:54:46 +0100 Subject: [PATCH 8/9] fixup --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index ffeef473..611a009e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,14 +50,13 @@ RUN mkdir -p "${BASEDIR}/server" \ RUN deluser node 2>/dev/null || true \ && delgroup node 2>/dev/null || true \ - && rm -fr /home/node \ + && rm -fr /home/node 2>/dev/null || true \ && addgroup --gid "$USER_GID" "$USER_GROUP" \ && adduser \ --disabled-password \ --gecos "" \ --uid "$USER_UID" \ --gid "$USER_GID" \ - --home "$WORKDIR" \ --no-create-home \ "$USER_NAME" From 2adee55ef8a9daa35bf63926f06c81c46e87f02a Mon Sep 17 00:00:00 2001 From: CyberL1 Date: Sat, 8 Nov 2025 15:21:39 +0100 Subject: [PATCH 9/9] fix: gif stickers should have `format_type` 4 instead of 0 --- src/schemas/api/guilds/Sticker.ts | 2 +- .../1762611552514-fix-gif-stickers-format_type.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/util/migration/postgres/1762611552514-fix-gif-stickers-format_type.ts diff --git a/src/schemas/api/guilds/Sticker.ts b/src/schemas/api/guilds/Sticker.ts index 89b11ccf..b02e1e21 100644 --- a/src/schemas/api/guilds/Sticker.ts +++ b/src/schemas/api/guilds/Sticker.ts @@ -4,8 +4,8 @@ export enum StickerType { } export enum StickerFormatType { - GIF = 0, // gif is a custom format type and not in discord spec PNG = 1, APNG = 2, LOTTIE = 3, + GIF = 4, } diff --git a/src/util/migration/postgres/1762611552514-fix-gif-stickers-format_type.ts b/src/util/migration/postgres/1762611552514-fix-gif-stickers-format_type.ts new file mode 100644 index 00000000..47de7506 --- /dev/null +++ b/src/util/migration/postgres/1762611552514-fix-gif-stickers-format_type.ts @@ -0,0 +1,11 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class FixGifStickersFormatType1762611552514 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`UPDATE "stickers" SET "format_type" = 4 WHERE "format_type" = 0;`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`UPDATE "stickers" SET "format_type" = 0 WHERE "format_type" = 4;`); + } +}