diff --git a/api/assets/openapi.json b/api/assets/openapi.json
index 03550323..a8a657b2 100644
--- a/api/assets/openapi.json
+++ b/api/assets/openapi.json
@@ -2,7 +2,7 @@
"openapi": "3.0.0",
"servers": [
{
- "url": "https://api.fosscord.com/v{version}",
+ "url": "https://api.fosscord.com/api/v{version}",
"description": "Official fosscord instance",
"variables": {
"version": {
@@ -2960,7 +2960,7 @@
"type": {
"type": "string"
},
- "verifie": {
+ "verified": {
"type": "boolean"
},
"visibility": {
@@ -2980,7 +2980,7 @@
"type",
"user",
"user_id",
- "verifie",
+ "verified",
"visibility"
]
},
diff --git a/api/assets/preload-plugins/fosscord-login.js b/api/assets/preload-plugins/fosscord-login.js
new file mode 100644
index 00000000..38f82200
--- /dev/null
+++ b/api/assets/preload-plugins/fosscord-login.js
@@ -0,0 +1,12 @@
+// Remove `<link id="logincss" rel="stylesheet" href="/assets/fosscord-login.css" />` from header when we're not accessing `/login` or `/register`
+// fosscord-login.css replaces discord's TOS tooltip with something more fitting for fosscord, which when included in the main app, causes other tooltips
+// to be affected, which is potentially unwanted.
+//
+// This script removes fosscord-login.css when a user reloads the page. From testing, it appears fosscord already properly removes
+// fosscord-login.css after login is successful, but not if you reload the page after logging in. This script is to remove fosscord-login.css in
+// that specific case.
+
+var token = JSON.parse(localStorage.getItem("token"));
+if (!token && location.pathname !== "/login" && location.pathname !== "/register") {
+ document.getElementById("logincss").remove();
+}
diff --git a/api/assets/schemas.json b/api/assets/schemas.json
index d531df21..441752ad 100644
--- a/api/assets/schemas.json
+++ b/api/assets/schemas.json
@@ -355,11 +355,11 @@
"type": {
"type": "string"
},
- "verifie": {
+ "verified": {
"type": "boolean"
}
},
- "required": ["name", "type", "verifie"]
+ "required": ["name", "type", "verified"]
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
diff --git a/api/src/routes/guilds/#guild_id/vanity-url.ts b/api/src/routes/guilds/#guild_id/vanity-url.ts
index 63173345..29cd25e2 100644
--- a/api/src/routes/guilds/#guild_id/vanity-url.ts
+++ b/api/src/routes/guilds/#guild_id/vanity-url.ts
@@ -9,11 +9,19 @@ const InviteRegex = /\W/g;
router.get("/", route({ permission: "MANAGE_GUILD" }), async (req: Request, res: Response) => {
const { guild_id } = req.params;
+ const guild = await Guild.findOneOrFail({ id: guild_id });
- const invite = await Invite.findOne({ where: { guild_id: guild_id, vanity_url: true } });
- if (!invite) return res.json({ code: null });
+ if (!guild.features.includes("ALIASABLE_NAMES")) {
+ const invite = await Invite.findOne({ where: { guild_id: guild_id, vanity_url: true } });
+ if (!invite) return res.json({ code: null });
- return res.json({ code: invite.code, uses: invite.uses });
+ return res.json({ code: invite.code, uses: invite.uses });
+ } else {
+ const invite = await Invite.find({ where: { guild_id: guild_id, vanity_url: true } });
+ if (!invite || invite.length == 0) return res.json({ code: null });
+
+ return res.json(invite.map((x) => ({ code: x.code, uses: x.uses })));
+ }
});
export interface VanityUrlSchema {
@@ -24,18 +32,33 @@ export interface VanityUrlSchema {
code?: string;
}
-// TODO: check if guild is elgible for vanity url
router.patch("/", route({ body: "VanityUrlSchema", permission: "MANAGE_GUILD" }), async (req: Request, res: Response) => {
const { guild_id } = req.params;
const body = req.body as VanityUrlSchema;
const code = body.code?.replace(InviteRegex, "");
+ const guild = await Guild.findOneOrFail({ id: guild_id });
+ if (!guild.features.includes("VANITY_URL")) throw new HTTPError("Your guild doesn't support vanity urls");
+
+ if (!code || code.length === 0) throw new HTTPError("Code cannot be null or empty");
+
const invite = await Invite.findOne({ code });
if (invite) throw new HTTPError("Invite already exists");
const { id } = await Channel.findOneOrFail({ guild_id, type: ChannelType.GUILD_TEXT });
- await Invite.update({ vanity_url: true, guild_id }, { code: code, channel_id: id });
+ await new Invite({
+ vanity_url: true,
+ code: code,
+ temporary: false,
+ uses: 0,
+ max_uses: 0,
+ max_age: 0,
+ created_at: new Date(),
+ expires_at: new Date(),
+ guild_id: guild_id,
+ channel_id: id
+ }).save();
return res.json({ code: code });
});
diff --git a/api/src/util/handlers/Message.ts b/api/src/util/handlers/Message.ts
index 21664368..2d9f7032 100644
--- a/api/src/util/handlers/Message.ts
+++ b/api/src/util/handlers/Message.ts
@@ -82,10 +82,12 @@ export async function handleMessage(opts: MessageOptions): Promise<Message> {
if (opts.message_reference) {
permission.hasThrow("READ_MESSAGE_HISTORY");
// code below has to be redone when we add custom message routing and cross-channel replies
- const guild = await Guild.findOneOrFail({ id: channel.guild_id });
- if (!guild.features.includes("CROSS_CHANNEL_REPLIES")) {
- if (opts.message_reference.guild_id !== channel.guild_id) throw new HTTPError("You can only reference messages from this guild");
- if (opts.message_reference.channel_id !== opts.channel_id) throw new HTTPError("You can only reference messages from this channel");
+ if (message.guild_id !== null) {
+ const guild = await Guild.findOneOrFail({ id: channel.guild_id });
+ if (!guild.features.includes("CROSS_CHANNEL_REPLIES")) {
+ if (opts.message_reference.guild_id !== channel.guild_id) throw new HTTPError("You can only reference messages from this guild");
+ if (opts.message_reference.channel_id !== opts.channel_id) throw new HTTPError("You can only reference messages from this channel");
+ }
}
// TODO: should be checked if the referenced message exists?
// @ts-ignore
|