diff --git a/src/api/routes/channels/#channel_id/invites.ts b/src/api/routes/channels/#channel_id/invites.ts
index afaabf47..c8d56fa4 100644
--- a/src/api/routes/channels/#channel_id/invites.ts
+++ b/src/api/routes/channels/#channel_id/invites.ts
@@ -40,7 +40,7 @@ router.post(
const invite = await Invite.create({
code: random(),
- temporary: req.body.temporary,
+ temporary: req.body.temporary || true,
uses: 0,
max_uses: req.body.max_uses,
max_age: req.body.max_age,
diff --git a/src/api/routes/channels/#channel_id/webhooks.ts b/src/api/routes/channels/#channel_id/webhooks.ts
index da8fe73c..13f421f1 100644
--- a/src/api/routes/channels/#channel_id/webhooks.ts
+++ b/src/api/routes/channels/#channel_id/webhooks.ts
@@ -1,9 +1,10 @@
import { Router, Response, Request } from "express";
import { route } from "@fosscord/api";
-import { Channel, Config, trimSpecial, Webhook } from "@fosscord/util";
+import { Channel, Config, handleFile, trimSpecial, User, Webhook, WebhookCreateSchema, WebhookType } from "@fosscord/util";
import { HTTPError } from "lambert-server";
import { isTextChannel } from "./messages/index";
import { DiscordApiErrors } from "@fosscord/util";
+import crypto from "crypto";
const router: Router = Router();
@@ -30,11 +31,32 @@ router.post(
if (webhook_count > maxWebhooks)
throw DiscordApiErrors.MAXIMUM_WEBHOOKS.withParams(maxWebhooks);
- var { avatar, name } = req.body as { name: string; avatar?: string };
+ var { avatar, name } = req.body as WebhookCreateSchema;
name = trimSpecial(name);
+
+ // TODO: move this
if (name === "clyde") throw new HTTPError("Invalid name", 400);
+ if (name === "Fosscord Ghost") throw new HTTPError("Invalid name", 400);
+
+ if (avatar)
+ avatar = await handleFile(`/avatars/${channel_id}`, avatar);
+
+ const hook = Webhook.create({
+ type: WebhookType.Incoming,
+ name,
+ avatar,
+ guild_id: channel.guild_id,
+ channel_id: channel.id,
+ user_id: req.user_id,
+ token: crypto.randomBytes(24).toString("base64"),
+ });
- // TODO: save webhook in database and send response
+ const user = await User.getPublicUser(req.user_id);
+
+ return res.json({
+ ...hook,
+ user: user,
+ });
},
);
diff --git a/src/util/entities/Channel.ts b/src/util/entities/Channel.ts
index 2aba739a..e9e631f1 100644
--- a/src/util/entities/Channel.ts
+++ b/src/util/entities/Channel.ts
@@ -169,6 +169,12 @@ export class Channel extends BaseClass {
})
webhooks?: Webhook[];
+ @Column()
+ flags: number = 0;
+
+ @Column()
+ default_thread_rate_limit_per_user: number = 0;
+
// TODO: DM channel
static async createChannel(
channel: Partial<Channel>,
diff --git a/src/util/entities/Webhook.ts b/src/util/entities/Webhook.ts
index 89538417..da91ccaa 100644
--- a/src/util/entities/Webhook.ts
+++ b/src/util/entities/Webhook.ts
@@ -8,6 +8,7 @@ import { User } from "./User";
export enum WebhookType {
Incoming = 1,
ChannelFollower = 2,
+ Application = 3,
}
@Entity("webhooks")
diff --git a/src/util/schemas/WebhookCreateSchema.ts b/src/util/schemas/WebhookCreateSchema.ts
index 99f6a12f..12ab1869 100644
--- a/src/util/schemas/WebhookCreateSchema.ts
+++ b/src/util/schemas/WebhookCreateSchema.ts
@@ -4,5 +4,5 @@ export interface WebhookCreateSchema {
* @maxLength 80
*/
name: string;
- avatar: string;
+ avatar?: string;
}
|