From d7fa45771d8acf1d0127754a5e813b45e62e353b Mon Sep 17 00:00:00 2001 From: The Arcane Brony Date: Sun, 10 Oct 2021 20:34:45 +0200 Subject: Change enums to numbers --- util/src/entities/Sticker.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'util/src/entities/Sticker.ts') diff --git a/util/src/entities/Sticker.ts b/util/src/entities/Sticker.ts index ab224d1d..8956616e 100644 --- a/util/src/entities/Sticker.ts +++ b/util/src/entities/Sticker.ts @@ -36,9 +36,9 @@ export class Sticker extends BaseClass { }) guild?: Guild; - @Column({ type: "simple-enum", enum: StickerType }) - type: StickerType; + @Column() + type: number; - @Column({ type: "simple-enum", enum: StickerFormatType }) - format_type: StickerFormatType; + @Column() + format_type: number; } -- cgit 1.5.1 From 496d7d2780c8710221564302419f16fb07a8edd5 Mon Sep 17 00:00:00 2001 From: The Arcane Brony Date: Sun, 10 Oct 2021 21:30:46 +0200 Subject: Put local types back --- util/src/entities/AuditLog.ts | 4 ++-- util/src/entities/Channel.ts | 4 ++-- util/src/entities/Message.ts | 4 ++-- util/src/entities/Relationship.ts | 4 ++-- util/src/entities/Role.ts | 2 +- util/src/entities/Sticker.ts | 8 ++++---- util/src/entities/TeamMember.ts | 4 ++-- util/src/entities/Webhook.ts | 4 ++-- 8 files changed, 17 insertions(+), 17 deletions(-) (limited to 'util/src/entities/Sticker.ts') diff --git a/util/src/entities/AuditLog.ts b/util/src/entities/AuditLog.ts index 4b3536b6..4b81ed6a 100644 --- a/util/src/entities/AuditLog.ts +++ b/util/src/entities/AuditLog.ts @@ -55,8 +55,8 @@ export class AuditLog extends BaseClass { @ManyToOne(() => User, (user: User) => user.id) user: User; - @Column() - action_type: number; + @Column({ type: "int" }) + action_type: AuditLogEvents; @Column({ type: "simple-json", nullable: true }) options?: { diff --git a/util/src/entities/Channel.ts b/util/src/entities/Channel.ts index e10bd8ed..bd2e5a58 100644 --- a/util/src/entities/Channel.ts +++ b/util/src/entities/Channel.ts @@ -39,8 +39,8 @@ export class Channel extends BaseClass { @Column({ type: "text", nullable: true }) icon?: string | null; - @Column() - type: number; + @Column({ type: "int" }) + type: ChannelType; @OneToMany(() => Recipient, (recipient: Recipient) => recipient.channel, { cascade: true, diff --git a/util/src/entities/Message.ts b/util/src/entities/Message.ts index e364c57b..63cd6ad3 100644 --- a/util/src/entities/Message.ts +++ b/util/src/entities/Message.ts @@ -148,8 +148,8 @@ export class Message extends BaseClass { @Column({ nullable: true }) pinned?: boolean; - @Column() - type: number; + @Column({ type: "int" }) + type: MessageType; @Column({ type: "simple-json", nullable: true }) activity?: { diff --git a/util/src/entities/Relationship.ts b/util/src/entities/Relationship.ts index 2e886e71..c3592c76 100644 --- a/util/src/entities/Relationship.ts +++ b/util/src/entities/Relationship.ts @@ -35,8 +35,8 @@ export class Relationship extends BaseClass { @Column({ nullable: true }) nickname?: string; - @Column() - type: number; + @Column({ type: "int" }) + type: RelationshipType; toPublicRelationship() { return { diff --git a/util/src/entities/Role.ts b/util/src/entities/Role.ts index 4a3dae98..9fca99a5 100644 --- a/util/src/entities/Role.ts +++ b/util/src/entities/Role.ts @@ -36,7 +36,7 @@ export class Role extends BaseClass { @Column() position: number; - @Column({ type: "simple-json", nullable: true, }) + @Column({ type: "simple-json", nullable: true }) tags?: { bot_id?: string; integration_id?: string; diff --git a/util/src/entities/Sticker.ts b/util/src/entities/Sticker.ts index 8956616e..036ff2d0 100644 --- a/util/src/entities/Sticker.ts +++ b/util/src/entities/Sticker.ts @@ -36,9 +36,9 @@ export class Sticker extends BaseClass { }) guild?: Guild; - @Column() - type: number; + @Column({ type: "int" }) + type: StickerType; - @Column() - format_type: number; + @Column({ type: "int" }) + format_type: StickerFormatType; } diff --git a/util/src/entities/TeamMember.ts b/util/src/entities/TeamMember.ts index 5642a211..b726e1e8 100644 --- a/util/src/entities/TeamMember.ts +++ b/util/src/entities/TeamMember.ts @@ -9,8 +9,8 @@ export enum TeamMemberState { @Entity("team_members") export class TeamMember extends BaseClass { - @Column() - membership_state: number; + @Column({ type: "int" }) + membership_state: TeamMemberState; @Column({ type: "simple-array" }) permissions: string[]; diff --git a/util/src/entities/Webhook.ts b/util/src/entities/Webhook.ts index 0d500962..89538417 100644 --- a/util/src/entities/Webhook.ts +++ b/util/src/entities/Webhook.ts @@ -12,8 +12,8 @@ export enum WebhookType { @Entity("webhooks") export class Webhook extends BaseClass { - @Column() - type: number; + @Column({ type: "int" }) + type: WebhookType; @Column({ nullable: true }) name?: string; -- cgit 1.5.1 From 93b76035b64ff3bffe3ab86df1da2475067533c6 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Thu, 14 Oct 2021 19:47:02 +0200 Subject: :sparkles: sticker db entities --- util/src/entities/Sticker.ts | 19 ++++++++++++++++++- util/src/entities/StickerPack.ts | 31 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 util/src/entities/StickerPack.ts (limited to 'util/src/entities/Sticker.ts') diff --git a/util/src/entities/Sticker.ts b/util/src/entities/Sticker.ts index 036ff2d0..94761f60 100644 --- a/util/src/entities/Sticker.ts +++ b/util/src/entities/Sticker.ts @@ -1,4 +1,5 @@ -import { Column, Entity, JoinColumn, ManyToOne } from "typeorm"; +import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; +import { User } from "./User"; import { BaseClass } from "./BaseClass"; import { Guild } from "./Guild"; @@ -25,8 +26,15 @@ export class Sticker extends BaseClass { tags: string; @Column() + @RelationId((sticker: Sticker) => sticker.pack) pack_id: string; + @JoinColumn({ name: "pack_id" }) + @ManyToOne(() => require("./StickerPack").StickerPack, { + onDelete: "CASCADE", + }) + pack: import("./StickerPack").StickerPack; + @Column({ nullable: true }) guild_id?: string; @@ -36,6 +44,15 @@ export class Sticker extends BaseClass { }) guild?: Guild; + @Column({ nullable: true }) + user_id?: string; + + @JoinColumn({ name: "user_id" }) + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) + user?: User; + @Column({ type: "int" }) type: StickerType; diff --git a/util/src/entities/StickerPack.ts b/util/src/entities/StickerPack.ts new file mode 100644 index 00000000..b80fa9c7 --- /dev/null +++ b/util/src/entities/StickerPack.ts @@ -0,0 +1,31 @@ +import { Column, Entity, JoinColumn, OneToMany, OneToOne, RelationId } from "typeorm"; +import { Sticker } from "."; +import { BaseClass } from "./BaseClass"; + +@Entity("stickers") +export class StickerPack extends BaseClass { + @Column() + name: string; + + @Column({ nullable: true }) + description?: string; + + @Column({ nullable: true }) + banner_asset_id?: string; + + @OneToMany(() => Sticker, (sticker: Sticker) => sticker.pack_id, { + cascade: true, + orphanedRowAction: "delete", + }) + stickers: Sticker[]; + + // sku_id: string + + @Column({ nullable: true }) + @RelationId((pack: StickerPack) => pack.cover_sticker) + cover_sticker_id?: string; + + @OneToOne(() => Sticker, { nullable: true }) + @JoinColumn() + cover_sticker?: Sticker; +} -- cgit 1.5.1 From f38ebe65eddbbebe9b658c359d0ed598cbc64a66 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 15 Oct 2021 00:02:23 +0200 Subject: :sparkles: sticker upload --- api/assets/schemas.json | 308 ++++++++++++++++++++++++++++ api/src/routes/guilds/#guild_id/stickers.ts | 49 ++++- util/src/entities/Sticker.ts | 13 +- 3 files changed, 359 insertions(+), 11 deletions(-) (limited to 'util/src/entities/Sticker.ts') diff --git a/api/assets/schemas.json b/api/assets/schemas.json index 2ceaa923..eb97112c 100644 --- a/api/assets/schemas.json +++ b/api/assets/schemas.json @@ -514,6 +514,12 @@ "attachments": { "type": "array", "items": {} + }, + "sticker_ids": { + "type": "array", + "items": { + "type": "string" + } } }, "definitions": { @@ -5341,6 +5347,308 @@ }, "$schema": "http://json-schema.org/draft-07/schema#" }, + "ModifyGuildStickerSchema": { + "type": "object", + "properties": { + "name": { + "minLength": 2, + "maxLength": 30, + "type": "string" + }, + "description": { + "maxLength": 100, + "type": "string" + }, + "tags": { + "maxLength": 200, + "type": "string" + } + }, + "required": [ + "name", + "tags" + ], + "definitions": { + "ChannelPermissionOverwriteType": { + "enum": [ + 0, + 1 + ], + "type": "number" + }, + "Embed": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "type": { + "enum": [ + "article", + "gifv", + "image", + "link", + "rich", + "video" + ], + "type": "string" + }, + "description": { + "type": "string" + }, + "url": { + "type": "string" + }, + "timestamp": { + "type": "string", + "format": "date-time" + }, + "color": { + "type": "integer" + }, + "footer": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "icon_url": { + "type": "string" + }, + "proxy_icon_url": { + "type": "string" + } + }, + "required": [ + "text" + ] + }, + "image": { + "$ref": "#/definitions/EmbedImage" + }, + "thumbnail": { + "$ref": "#/definitions/EmbedImage" + }, + "video": { + "$ref": "#/definitions/EmbedImage" + }, + "provider": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "author": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "icon_url": { + "type": "string" + }, + "proxy_icon_url": { + "type": "string" + } + } + }, + "fields": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "inline": { + "type": "boolean" + } + }, + "required": [ + "name", + "value" + ] + } + } + } + }, + "EmbedImage": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "proxy_url": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "width": { + "type": "integer" + } + } + }, + "ChannelModifySchema": { + "type": "object", + "properties": { + "name": { + "maxLength": 100, + "type": "string" + }, + "type": { + "enum": [ + 0, + 1, + 10, + 11, + 12, + 13, + 2, + 3, + 4, + 5, + 6 + ], + "type": "number" + }, + "topic": { + "type": "string" + }, + "icon": { + "type": [ + "null", + "string" + ] + }, + "bitrate": { + "type": "integer" + }, + "user_limit": { + "type": "integer" + }, + "rate_limit_per_user": { + "type": "integer" + }, + "position": { + "type": "integer" + }, + "permission_overwrites": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/ChannelPermissionOverwriteType" + }, + "allow": { + "type": "string" + }, + "deny": { + "type": "string" + } + }, + "required": [ + "allow", + "deny", + "id", + "type" + ] + } + }, + "parent_id": { + "type": "string" + }, + "id": { + "type": "string" + }, + "nsfw": { + "type": "boolean" + }, + "rtc_region": { + "type": "string" + }, + "default_auto_archive_duration": { + "type": "integer" + } + } + }, + "UserPublic": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "discriminator": { + "type": "string" + }, + "id": { + "type": "string" + }, + "public_flags": { + "type": "integer" + }, + "avatar": { + "type": "string" + }, + "accent_color": { + "type": "integer" + }, + "banner": { + "type": "string" + }, + "bio": { + "type": "string" + }, + "bot": { + "type": "boolean" + } + }, + "required": [ + "bio", + "bot", + "discriminator", + "id", + "public_flags", + "username" + ] + }, + "PublicConnectedAccount": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "verifie": { + "type": "boolean" + } + }, + "required": [ + "name", + "type", + "verifie" + ] + } + }, + "$schema": "http://json-schema.org/draft-07/schema#" + }, "TemplateCreateSchema": { "type": "object", "properties": { diff --git a/api/src/routes/guilds/#guild_id/stickers.ts b/api/src/routes/guilds/#guild_id/stickers.ts index c122b72d..39095dc2 100644 --- a/api/src/routes/guilds/#guild_id/stickers.ts +++ b/api/src/routes/guilds/#guild_id/stickers.ts @@ -1,7 +1,8 @@ -import { Member, Sticker } from "@fosscord/util"; +import { handleFile, Member, Snowflake, Sticker, StickerFormatType, StickerType, uploadFile } from "@fosscord/util"; import { Router, Request, Response } from "express"; import { route } from "@fosscord/api"; import multer from "multer"; +import { HTTPError } from "lambert-server"; const router = Router(); router.get("/", route({}), async (req: Request, res: Response) => { @@ -20,12 +21,47 @@ const bodyParser = multer({ storage: multer.memoryStorage() }).single("file"); -router.post("/", bodyParser, route({ permission: "MANAGE_EMOJIS_AND_STICKERS" }), async (req: Request, res: Response) => { - const { guild_id } = req.params; - await Member.IsInGuildOrFail(req.user_id, guild_id); +router.post( + "/", + bodyParser, + route({ permission: "MANAGE_EMOJIS_AND_STICKERS", body: "ModifyGuildStickerSchema" }), + async (req: Request, res: Response) => { + if (!req.file) throw new HTTPError("missing file"); - res.json(await Sticker.find({ guild_id })); -}); + const { guild_id } = req.params; + const body = req.body as ModifyGuildStickerSchema; + const id = Snowflake.generate(); + + const [sticker] = await Promise.all([ + new Sticker({ + ...body, + guild_id, + id, + type: StickerType.GUILD, + format_type: getStickerFormat(req.file.mimetype), + available: true + }).save(), + uploadFile(`/stickers/${id}`, req.file) + ]); + + res.json(sticker); + } +); + +export function getStickerFormat(mime_type: string) { + switch (mime_type) { + case "image/apng": + return StickerFormatType.APNG; + case "application/json": + return StickerFormatType.LOTTIE; + case "image/png": + return StickerFormatType.PNG; + case "image/gif": + return StickerFormatType.GIF; + default: + throw new HTTPError("invalid sticker format: must be png, apng or lottie"); + } +} router.get("/:sticker_id", route({}), async (req: Request, res: Response) => { const { guild_id, sticker_id } = req.params; @@ -41,7 +77,6 @@ export interface ModifyGuildStickerSchema { */ name: string; /** - * @minLength 2 * @maxLength 100 */ description?: string; diff --git a/util/src/entities/Sticker.ts b/util/src/entities/Sticker.ts index 94761f60..37bc6fbe 100644 --- a/util/src/entities/Sticker.ts +++ b/util/src/entities/Sticker.ts @@ -9,6 +9,7 @@ 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, @@ -22,16 +23,20 @@ export class Sticker extends BaseClass { @Column({ nullable: true }) description?: string; - @Column() - tags: string; + @Column({ nullable: true }) + available?: boolean; - @Column() + @Column({ nullable: true }) + tags?: string; + + @Column({ nullable: true }) @RelationId((sticker: Sticker) => sticker.pack) - pack_id: string; + pack_id?: string; @JoinColumn({ name: "pack_id" }) @ManyToOne(() => require("./StickerPack").StickerPack, { onDelete: "CASCADE", + nullable: true, }) pack: import("./StickerPack").StickerPack; -- cgit 1.5.1