diff --git a/api/assets/background.png b/api/assets/background.png
new file mode 100644
index 00000000..58369ab8
--- /dev/null
+++ b/api/assets/background.png
Binary files differdiff --git a/api/assets/fosscord-login.css b/api/assets/fosscord-login.css
index d507c545..ca0af064 100644
--- a/api/assets/fosscord-login.css
+++ b/api/assets/fosscord-login.css
@@ -14,7 +14,7 @@
}
h3.title-jXR8lp.marginBottom8-AtZOdT.base-1x0h_U.size24-RIRrxO::after {
margin-top: -32px;
- content: "Welcome to Fosscord!";
+ content: "Welcome to Slowcord!";
visibility: visible;
display: block;
}
@@ -62,7 +62,22 @@ h3.title-jXR8lp.marginBottom8-AtZOdT.base-1x0h_U.size24-RIRrxO::after {
margin-top: -16px;
}
-/* shrink login box to same size as register */
-.authBoxExpanded-2jqaBe {
- width: 480px !important;
+/* funny styling */
+.wrapper-6URcxg {
+ justify-content: flex-start !important;
+
+ background: url("/assets/background.png");
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+}
+
+.authBoxExpanded-2jqaBe,
+.authBox-hW6HRx {
+ width: max(40vw, 500px) !important;
+ height: 100vh !important;
+ padding: 100px !important;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 0 !important;
}
diff --git a/api/assets/preload-plugins/loginRedirect.js b/api/assets/preload-plugins/loginRedirect.js
new file mode 100644
index 00000000..895536ef
--- /dev/null
+++ b/api/assets/preload-plugins/loginRedirect.js
@@ -0,0 +1,13 @@
+const redirectIfOnLogin = () => {
+ const path = window.location.pathname;
+ if (path == "/login" || path == "/register") {
+ window.location.reload();
+ }
+}
+
+const observer = new MutationObserver((mutations) => {
+ redirectIfOnLogin();
+});
+observer.observe(document, { subtree: true, childList: true })
+
+redirectIfOnLogin();
\ No newline at end of file
diff --git a/api/assets/schemas.json b/api/assets/schemas.json
index 7a96be3c..5259131b 100644
--- a/api/assets/schemas.json
+++ b/api/assets/schemas.json
@@ -1,4 +1,739 @@
{
+ "MessageCreateSchema": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "integer"
+ },
+ "content": {
+ "type": "string"
+ },
+ "nonce": {
+ "type": "string"
+ },
+ "channel_id": {
+ "type": "string"
+ },
+ "tts": {
+ "type": "boolean"
+ },
+ "flags": {
+ "type": "string"
+ },
+ "embeds": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Embed"
+ }
+ },
+ "embed": {
+ "$ref": "#/definitions/Embed"
+ },
+ "allowed_mentions": {
+ "type": "object",
+ "properties": {
+ "parse": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "roles": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "replied_user": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false
+ },
+ "message_reference": {
+ "type": "object",
+ "properties": {
+ "message_id": {
+ "type": "string"
+ },
+ "channel_id": {
+ "type": "string"
+ },
+ "guild_id": {
+ "type": "string"
+ },
+ "fail_if_not_exists": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "channel_id",
+ "message_id"
+ ]
+ },
+ "payload_json": {
+ "type": "string"
+ },
+ "file": {},
+ "attachments": {
+ "description": "TODO: we should create an interface for attachments\nTODO: OpenWAAO<-->attachment-style metadata conversion",
+ "type": "array",
+ "items": {}
+ },
+ "sticker_ids": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false,
+ "definitions": {
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "text"
+ ]
+ },
+ "image": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "thumbnail": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "video": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "provider": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "icon_url": {
+ "type": "string"
+ },
+ "proxy_icon_url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "inline": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "value"
+ ]
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "EmbedImage": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string"
+ },
+ "proxy_url": {
+ "type": "string"
+ },
+ "height": {
+ "type": "integer"
+ },
+ "width": {
+ "type": "integer"
+ }
+ },
+ "additionalProperties": false
+ },
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
+ "ChannelModifySchema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "maxLength": 100,
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ 0,
+ 1,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 2,
+ 255,
+ 3,
+ 33,
+ 34,
+ 35,
+ 4,
+ 5,
+ 6,
+ 64,
+ 7,
+ 8,
+ 9
+ ],
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "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"
+ }
+ },
+ "additionalProperties": false
+ },
+ "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"
+ },
+ "premium_since": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "bio",
+ "bot",
+ "discriminator",
+ "id",
+ "premium_since",
+ "public_flags",
+ "username"
+ ]
+ },
+ "PublicConnectedAccount": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "verified": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "type",
+ "verified"
+ ]
+ }
+ },
+ "$schema": "http://json-schema.org/draft-07/schema#"
+ },
+ "RouteResponse": {
+ "type": "object",
+ "properties": {
+ "status": {
+ "type": "integer"
+ },
+ "body": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "headers": {
+ "$ref": "#/definitions/Record<string,string>"
+ }
+ },
+ "additionalProperties": false,
+ "definitions": {
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "text"
+ ]
+ },
+ "image": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "thumbnail": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "video": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "provider": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "icon_url": {
+ "type": "string"
+ },
+ "proxy_icon_url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "inline": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "value"
+ ]
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "EmbedImage": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string"
+ },
+ "proxy_url": {
+ "type": "string"
+ },
+ "height": {
+ "type": "integer"
+ },
+ "width": {
+ "type": "integer"
+ }
+ },
+ "additionalProperties": false
+ },
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
+ "ChannelModifySchema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "maxLength": 100,
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ 0,
+ 1,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 2,
+ 255,
+ 3,
+ 33,
+ 34,
+ 35,
+ 4,
+ 5,
+ 6,
+ 64,
+ 7,
+ 8,
+ 9
+ ],
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "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"
+ }
+ },
+ "additionalProperties": false
+ },
+ "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"
+ },
+ "premium_since": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "bio",
+ "bot",
+ "discriminator",
+ "id",
+ "premium_since",
+ "public_flags",
+ "username"
+ ]
+ },
+ "PublicConnectedAccount": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "verified": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "type",
+ "verified"
+ ]
+ }
+ },
+ "$schema": "http://json-schema.org/draft-07/schema#"
+ },
"LoginSchema": {
"type": "object",
"properties": {
@@ -26,6 +761,315 @@
"login",
"password"
],
+ "definitions": {
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "text"
+ ]
+ },
+ "image": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "thumbnail": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "video": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "provider": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "icon_url": {
+ "type": "string"
+ },
+ "proxy_icon_url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "inline": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "value"
+ ]
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "EmbedImage": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string"
+ },
+ "proxy_url": {
+ "type": "string"
+ },
+ "height": {
+ "type": "integer"
+ },
+ "width": {
+ "type": "integer"
+ }
+ },
+ "additionalProperties": false
+ },
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
+ "ChannelModifySchema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "maxLength": 100,
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ 0,
+ 1,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 2,
+ 255,
+ 3,
+ 33,
+ 34,
+ 35,
+ 4,
+ 5,
+ 6,
+ 64,
+ 7,
+ 8,
+ 9
+ ],
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "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"
+ }
+ },
+ "additionalProperties": false
+ },
+ "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"
+ },
+ "premium_since": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "bio",
+ "bot",
+ "discriminator",
+ "id",
+ "premium_since",
+ "public_flags",
+ "username"
+ ]
+ },
+ "PublicConnectedAccount": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "verified": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "type",
+ "verified"
+ ]
+ }
+ },
"$schema": "http://json-schema.org/draft-07/schema#"
},
"RegisterSchema": {
@@ -62,6 +1106,9 @@
},
"captcha_key": {
"type": "string"
+ },
+ "promotional_email_opt_in": {
+ "type": "boolean"
}
},
"additionalProperties": false,
@@ -69,6 +1116,315 @@
"consent",
"username"
],
+ "definitions": {
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "text"
+ ]
+ },
+ "image": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "thumbnail": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "video": {
+ "$ref": "#/definitions/EmbedImage"
+ },
+ "provider": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "author": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "icon_url": {
+ "type": "string"
+ },
+ "proxy_icon_url": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "fields": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "inline": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "value"
+ ]
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "EmbedImage": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string"
+ },
+ "proxy_url": {
+ "type": "string"
+ },
+ "height": {
+ "type": "integer"
+ },
+ "width": {
+ "type": "integer"
+ }
+ },
+ "additionalProperties": false
+ },
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
+ "ChannelModifySchema": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "maxLength": 100,
+ "type": "string"
+ },
+ "type": {
+ "enum": [
+ 0,
+ 1,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 2,
+ 255,
+ 3,
+ 33,
+ 34,
+ 35,
+ 4,
+ 5,
+ 6,
+ 64,
+ 7,
+ 8,
+ 9
+ ],
+ "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"
+ }
+ },
+ "additionalProperties": false,
+ "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"
+ }
+ },
+ "additionalProperties": false
+ },
+ "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"
+ },
+ "premium_since": {
+ "type": "string",
+ "format": "date-time"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "bio",
+ "bot",
+ "discriminator",
+ "id",
+ "premium_since",
+ "public_flags",
+ "username"
+ ]
+ },
+ "PublicConnectedAccount": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "verified": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "name",
+ "type",
+ "verified"
+ ]
+ }
+ },
"$schema": "http://json-schema.org/draft-07/schema#"
},
"ChannelModifySchema": {
@@ -86,6 +1442,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -168,14 +1526,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -306,6 +1656,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -321,6 +1683,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -472,104 +1836,39 @@
},
"$schema": "http://json-schema.org/draft-07/schema#"
},
- "MessageCreateSchema": {
+ "InviteCreateSchema": {
"type": "object",
"properties": {
- "content": {
+ "target_user_id": {
"type": "string"
},
- "nonce": {
+ "target_type": {
"type": "string"
},
- "tts": {
- "type": "boolean"
- },
- "flags": {
+ "validate": {
"type": "string"
},
- "embeds": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/Embed"
- }
+ "max_age": {
+ "type": "integer"
},
- "embed": {
- "$ref": "#/definitions/Embed"
+ "max_uses": {
+ "type": "integer"
},
- "allowed_mentions": {
- "type": "object",
- "properties": {
- "parse": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "roles": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "users": {
- "type": "array",
- "items": {
- "type": "string"
- }
- },
- "replied_user": {
- "type": "boolean"
- }
- },
- "additionalProperties": false
+ "temporary": {
+ "type": "boolean"
},
- "message_reference": {
- "type": "object",
- "properties": {
- "message_id": {
- "type": "string"
- },
- "channel_id": {
- "type": "string"
- },
- "guild_id": {
- "type": "string"
- },
- "fail_if_not_exists": {
- "type": "boolean"
- }
- },
- "additionalProperties": false,
- "required": [
- "channel_id",
- "message_id"
- ]
+ "unique": {
+ "type": "boolean"
},
- "payload_json": {
+ "target_user": {
"type": "string"
},
- "file": {},
- "attachments": {
- "type": "array",
- "items": {}
- },
- "sticker_ids": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "target_user_type": {
+ "type": "integer"
}
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -700,6 +1999,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -715,6 +2026,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -866,47 +2179,18 @@
},
"$schema": "http://json-schema.org/draft-07/schema#"
},
- "InviteCreateSchema": {
+ "MessageAcknowledgeSchema": {
"type": "object",
"properties": {
- "target_user_id": {
- "type": "string"
- },
- "target_type": {
- "type": "string"
- },
- "validate": {
- "type": "string"
- },
- "max_age": {
- "type": "integer"
- },
- "max_uses": {
- "type": "integer"
- },
- "temporary": {
- "type": "boolean"
- },
- "unique": {
+ "manual": {
"type": "boolean"
},
- "target_user": {
- "type": "string"
- },
- "target_user_type": {
+ "mention_count": {
"type": "integer"
}
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -1037,6 +2321,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -1052,6 +2348,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -1203,26 +2501,21 @@
},
"$schema": "http://json-schema.org/draft-07/schema#"
},
- "MessageAcknowledgeSchema": {
+ "BulkDeleteSchema": {
"type": "object",
"properties": {
- "manual": {
- "type": "boolean"
- },
- "mention_count": {
- "type": "integer"
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
}
},
"additionalProperties": false,
+ "required": [
+ "messages"
+ ],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -1353,6 +2646,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -1368,6 +2673,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -1519,29 +2826,30 @@
},
"$schema": "http://json-schema.org/draft-07/schema#"
},
- "BulkDeleteSchema": {
+ "ChannelPermissionOverwriteSchema": {
"type": "object",
"properties": {
- "messages": {
- "type": "array",
- "items": {
- "type": "string"
- }
+ "allow": {
+ "type": "string"
+ },
+ "deny": {
+ "type": "string"
+ },
+ "id": {
+ "type": "string"
+ },
+ "type": {
+ "$ref": "#/definitions/ChannelPermissionOverwriteType"
}
},
"additionalProperties": false,
"required": [
- "messages"
+ "allow",
+ "deny",
+ "id",
+ "type"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -1672,6 +2980,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -1687,6 +3007,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -1838,38 +3160,22 @@
},
"$schema": "http://json-schema.org/draft-07/schema#"
},
- "ChannelPermissionOverwriteSchema": {
+ "PurgeSchema": {
"type": "object",
"properties": {
- "allow": {
+ "before": {
"type": "string"
},
- "deny": {
+ "after": {
"type": "string"
- },
- "id": {
- "type": "string"
- },
- "type": {
- "$ref": "#/definitions/ChannelPermissionOverwriteType"
}
},
"additionalProperties": false,
"required": [
- "allow",
- "deny",
- "id",
- "type"
+ "after",
+ "before"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -2000,6 +3306,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -2015,6 +3333,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -2183,14 +3503,6 @@
"name"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -2321,6 +3633,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -2336,6 +3660,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -2528,14 +3854,6 @@
"url"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -2666,6 +3984,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -2681,6 +4011,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -2844,14 +4176,6 @@
"url"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -2982,6 +4306,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -2997,6 +4333,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -3160,14 +4498,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -3298,6 +4628,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -3313,6 +4655,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -3494,14 +4838,6 @@
"user_id"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -3632,6 +4968,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -3647,6 +4995,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -3825,14 +5175,6 @@
"user_id"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -3963,6 +5305,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -3978,6 +5332,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -4153,14 +5509,6 @@
]
},
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -4291,6 +5639,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -4306,6 +5666,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -4484,14 +5846,6 @@
"image"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -4622,6 +5976,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -4637,6 +6003,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -4803,14 +6171,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -4941,6 +6301,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -4956,6 +6328,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -5140,18 +6514,7 @@
}
},
"additionalProperties": false,
- "required": [
- "name"
- ],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -5282,6 +6645,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -5297,6 +6672,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -5496,6 +6873,9 @@
"preferred_locale": {
"type": "string"
},
+ "premium_progress_bar_enabled": {
+ "type": "boolean"
+ },
"name": {
"maxLength": 100,
"type": "string"
@@ -5520,18 +6900,7 @@
}
},
"additionalProperties": false,
- "required": [
- "name"
- ],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -5662,6 +7031,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -5677,6 +7058,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -5836,18 +7219,13 @@
"items": {
"type": "string"
}
+ },
+ "nick": {
+ "type": "string"
}
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -5978,6 +7356,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -5993,6 +7383,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -6156,14 +7548,6 @@
"nick"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -6294,6 +7678,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -6309,6 +7705,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -6472,14 +7870,6 @@
"days"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -6610,6 +8000,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -6625,6 +8027,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -6806,14 +8210,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -6944,6 +8340,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -6959,6 +8367,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -7129,14 +8539,6 @@
]
},
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -7267,6 +8669,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -7282,6 +8696,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -7456,14 +8872,6 @@
"tags"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -7594,6 +9002,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -7609,6 +9029,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -7775,14 +9197,6 @@
"name"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -7913,6 +9327,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -7928,6 +9354,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -8094,14 +9522,6 @@
"name"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -8232,6 +9652,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -8247,6 +9679,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -8409,14 +9843,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -8547,6 +9973,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -8562,6 +10000,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -8744,14 +10184,6 @@
"channel_id"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -8882,6 +10314,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -8897,6 +10341,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -9072,8 +10518,7 @@
"additionalProperties": false,
"required": [
"channel_id",
- "description",
- "emoji_name"
+ "description"
]
}
},
@@ -9086,14 +10531,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -9224,6 +10661,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -9239,6 +10688,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -9406,14 +10857,6 @@
"enabled"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -9544,6 +10987,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -9559,6 +11014,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -9728,14 +11185,6 @@
"name"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -9866,6 +11315,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -9881,6 +11342,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -10056,14 +11519,6 @@
"user"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -10194,6 +11649,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -10209,6 +11676,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -10390,14 +11859,6 @@
"object"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -10528,6 +11989,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -10543,6 +12016,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -10712,14 +12187,6 @@
"recipients"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -10850,6 +12317,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -10865,6 +12344,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -11017,7 +12498,6 @@
"$schema": "http://json-schema.org/draft-07/schema#"
},
"UserModifySchema": {
- "additionalProperties": false,
"type": "object",
"properties": {
"username": {
@@ -11052,17 +12532,16 @@
},
"code": {
"type": "string"
+ },
+ "email": {
+ "type": "string"
+ },
+ "discriminator": {
+ "type": "string"
}
},
+ "additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -11193,6 +12672,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -11208,6 +12699,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -11374,14 +12867,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -11512,6 +12997,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -11527,6 +13024,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -11694,14 +13193,6 @@
"username"
],
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -11832,6 +13323,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -11847,6 +13350,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
@@ -12172,14 +13677,6 @@
},
"additionalProperties": false,
"definitions": {
- "ChannelPermissionOverwriteType": {
- "enum": [
- 0,
- 1,
- 2
- ],
- "type": "number"
- },
"Embed": {
"type": "object",
"properties": {
@@ -12310,6 +13807,18 @@
},
"additionalProperties": false
},
+ "Record<string,string>": {
+ "type": "object",
+ "additionalProperties": false
+ },
+ "ChannelPermissionOverwriteType": {
+ "enum": [
+ 0,
+ 1,
+ 2
+ ],
+ "type": "number"
+ },
"ChannelModifySchema": {
"type": "object",
"properties": {
@@ -12325,6 +13834,8 @@
11,
12,
13,
+ 14,
+ 15,
2,
255,
3,
diff --git a/api/client_test/index.html b/api/client_test/index.html
index b438b492..7a3e4695 100644
--- a/api/client_test/index.html
+++ b/api/client_test/index.html
@@ -71,10 +71,10 @@
}
</script>
<script src="/assets/checkLocale.js"></script>
- <script src="/assets/1e18f2aac02e172db283.js"></script>
- <script src="/assets/681e53cdfefa5b82249a.js"></script>
- <script src="/assets/7a036838c0a0e73f59d8.js"></script>
- <script src="/assets/b6cf2184a7a05e7525ce.js"></script>
+ <script src="/assets/83ace7450e110d16319e.js"></script>
+ <script src="/assets/e02290aaa8dac5d195c2.js"></script>
+ <script src="/assets/4f3b3c576b879a5f75d1.js"></script>
+ <script src="/assets/699456246fdfe7589855.js"></script>
<!-- plugin marker -->
</body>
</html>
diff --git a/api/locales/pl/auth.json b/api/locales/pl/auth.json
index 3988e9cd..711cb4d7 100644
--- a/api/locales/pl/auth.json
+++ b/api/locales/pl/auth.json
@@ -1,13 +1,13 @@
{
"login": {
- "INVALID_LOGIN": "E-mail lub telefon nie został znaleziony",
+ "INVALID_LOGIN": "E-mail lub numer telefonu nie został znaleziony",
"INVALID_PASSWORD": "Nieprawidłowe hasło",
"ACCOUNT_DISABLED": "To konto jest nieaktywne"
},
"register": {
"REGISTRATION_DISABLED": "Rejestracja nowych użytkowników jest wyłączona",
"INVITE_ONLY": "Aby się zarejestrować, musisz zostać zaproszony",
- "EMAIL_INVALID": "Nieprawidłowy email",
+ "EMAIL_INVALID": "Nieprawidłowy E-mail",
"EMAIL_ALREADY_REGISTERED": "E-mail jest już zarejestrowany",
"DATE_OF_BIRTH_UNDERAGE": "Musisz mieć {{years}} lat lub więcej",
"CONSENT_REQUIRED": "Musisz zaakceptować Regulamin i Politykę Prywatności.",
diff --git a/api/locales/pl/common.json b/api/locales/pl/common.json
index 3b618c1f..98c0906b 100644
--- a/api/locales/pl/common.json
+++ b/api/locales/pl/common.json
@@ -10,9 +10,9 @@
"BASE_TYPE_OBJECT": "To pole musi być obiektem",
"BASE_TYPE_ARRAY": "To pole musi być tablicą",
"UNKOWN_FIELD": "Nieznany klucz: {{key}}",
- "BASE_TYPE_CONSTANT": "To pole musi być {{value}}",
+ "BASE_TYPE_CONSTANT": "To pole musi wynosić {{value}}",
"EMAIL_TYPE_INVALID_EMAIL": "Źle sformułowany adres e-mail",
"DATE_TYPE_PARSE": "Nie można przetworzyć {{date}}. Powinno być ISO8601",
- "BASE_TYPE_BAD_LENGTH": "Długość musi wynosić między {{length}}"
+ "BASE_TYPE_BAD_LENGTH": "Długość musi wynosić pomiędzy {{length}}"
}
}
diff --git a/api/package.json b/api/package.json
index 65472522..29fa82a1 100644
--- a/api/package.json
+++ b/api/package.json
@@ -30,7 +30,7 @@
"discord-open-source"
],
"author": "Fosscord",
- "license": "AGPLV3",
+ "license": "AGPL-3.0-only",
"bugs": {
"url": "https://github.com/fosscord/fosscord-server/issues"
},
diff --git a/api/scripts/generate_schema.js b/api/scripts/generate_schema.js
index 7e742ec1..b56c3fbc 100644
--- a/api/scripts/generate_schema.js
+++ b/api/scripts/generate_schema.js
@@ -27,7 +27,16 @@ const Excluded = [
"Response",
"e.Response",
"request.Response",
- "supertest.Response"
+ "supertest.Response",
+
+ // TODO: Figure out how to exclude schemas from node_modules?
+ "SomeJSONSchema",
+ "UncheckedPartialSchema",
+ "PartialSchema",
+ "UncheckedPropertiesSchema",
+ "PropertiesSchema",
+ "AsyncSchema",
+ "AnySchema",
];
function modify(obj) {
@@ -39,11 +48,18 @@ function modify(obj) {
}
function main() {
- const program = TJS.getProgramFromFiles(walk(path.join(__dirname, "..", "src", "routes")), compilerOptions);
+ const files = [
+ ...walk(path.join(__dirname, "..", "src", "routes")),
+ ...walk(path.join(__dirname, "..", "..", "util", "src")),
+ ];
+ const program = TJS.getProgramFromFiles(
+ files,
+ compilerOptions
+ );
const generator = TJS.buildGenerator(program, settings);
if (!generator || !program) return;
- const schemas = generator.getUserSymbols().filter((x) => (x.endsWith("Schema") || x.endsWith("Response")) && !Excluded.includes(x));
+ let schemas = generator.getUserSymbols().filter((x) => (x.endsWith("Schema") || x.endsWith("Response")) && !Excluded.includes(x));
console.log(schemas);
var definitions = {};
diff --git a/api/src/middlewares/RateLimit.ts b/api/src/middlewares/RateLimit.ts
index ca6de98f..1a38cfcf 100644
--- a/api/src/middlewares/RateLimit.ts
+++ b/api/src/middlewares/RateLimit.ts
@@ -1,4 +1,4 @@
-import { Config, getRights, listenEvent, Rights } from "@fosscord/util";
+import { Config, listenEvent } from "@fosscord/util";
import { NextFunction, Request, Response, Router } from "express";
import { getIpAdress } from "@fosscord/api";
import { API_PREFIX_TRAILING_SLASH } from "./Authentication";
@@ -9,7 +9,6 @@ import { API_PREFIX_TRAILING_SLASH } from "./Authentication";
/*
? bucket limit? Max actions/sec per bucket?
-(ANSWER: a small fosscord instance might not need a complex rate limiting system)
TODO: delay database requests to include multiple queries
TODO: different for methods (GET/POST)
@@ -45,25 +44,21 @@ export default function rateLimit(opts: {
onlyIp?: boolean;
}): any {
return async (req: Request, res: Response, next: NextFunction): Promise<any> => {
- // exempt user? if so, immediately short circuit
- const rights = await getRights(req.user_id);
- if (rights.has("BYPASS_RATE_LIMITS")) return;
-
const bucket_id = opts.bucket || req.originalUrl.replace(API_PREFIX_TRAILING_SLASH, "");
var executor_id = getIpAdress(req);
- if (!opts.onlyIp && req.user_id) executor_id = req.user_id;
+ if (!opts.onlyIp && req.user_id) executor_id = req.user_id;
var max_hits = opts.count;
if (opts.bot && req.user_bot) max_hits = opts.bot;
if (opts.GET && ["GET", "OPTIONS", "HEAD"].includes(req.method)) max_hits = opts.GET;
else if (opts.MODIFY && ["POST", "DELETE", "PATCH", "PUT"].includes(req.method)) max_hits = opts.MODIFY;
- let offender = Cache.get(executor_id + bucket_id);
+ const offender = Cache.get(executor_id + bucket_id);
if (offender) {
- let reset = offender.expires_at.getTime();
- let resetAfterMs = reset - Date.now();
- let resetAfterSec = Math.ceil(resetAfterMs / 1000);
+ const reset = offender.expires_at.getTime();
+ const resetAfterMs = reset - Date.now();
+ const resetAfterSec = resetAfterMs / 1000;
if (resetAfterMs <= 0) {
offender.hits = 0;
@@ -75,11 +70,6 @@ export default function rateLimit(opts: {
if (offender.blocked) {
const global = bucket_id === "global";
- // each block violation pushes the expiry one full window further
- reset += opts.window * 1000;
- offender.expires_at = new Date(offender.expires_at.getTime() + opts.window * 1000);
- resetAfterMs = reset - Date.now();
- resetAfterSec = Math.ceil(resetAfterMs / 1000);
console.log("blocked bucket: " + bucket_id, { resetAfterMs });
return (
diff --git a/api/src/routes/auth/register.ts b/api/src/routes/auth/register.ts
index 94dd6502..126f3dbc 100644
--- a/api/src/routes/auth/register.ts
+++ b/api/src/routes/auth/register.ts
@@ -31,6 +31,8 @@ export interface RegisterSchema {
date_of_birth?: Date; // "2000-04-03"
gift_code_sku_id?: string;
captcha_key?: string;
+
+ promotional_email_opt_in?: boolean;
}
router.post("/", route({ body: "RegisterSchema" }), async (req: Request, res: Response) => {
diff --git a/api/src/routes/channels/#channel_id/messages/index.ts b/api/src/routes/channels/#channel_id/messages/index.ts
index 2d6a2977..54e6edcc 100644
--- a/api/src/routes/channels/#channel_id/messages/index.ts
+++ b/api/src/routes/channels/#channel_id/messages/index.ts
@@ -50,8 +50,10 @@ export function isTextChannel(type: ChannelType): boolean {
}
export interface MessageCreateSchema {
+ type?: number;
content?: string;
nonce?: string;
+ channel_id?: string;
tts?: boolean;
flags?: string;
embeds?: Embed[];
@@ -161,7 +163,7 @@ const messageUpload = multer({
limits: {
fileSize: 1024 * 1024 * 100,
fields: 10,
- files: 1
+ // files: 1
},
storage: multer.memoryStorage()
}); // max upload 50 mb
@@ -176,7 +178,7 @@ const messageUpload = multer({
// Send message
router.post(
"/",
- messageUpload.single("file"),
+ messageUpload.any(),
async (req, res, next) => {
if (req.body.payload_json) {
req.body = JSON.parse(req.body.payload_json);
@@ -190,18 +192,21 @@ router.post(
var body = req.body as MessageCreateSchema;
const attachments: Attachment[] = [];
- if (req.file) {
+ const channel = await Channel.findOneOrFail({ where: { id: channel_id }, relations: ["recipients", "recipients.user"] });
+ if (!channel.isWritable()) {
+ throw new HTTPError(`Cannot send messages to channel of type ${channel.type}`, 400)
+ }
+
+ const files = req.files as Express.Multer.File[] ?? [];
+ for (var currFile of files) {
try {
- const file = await uploadFile(`/attachments/${req.params.channel_id}`, req.file);
+ const file = await uploadFile(`/attachments/${channel.id}`, currFile);
attachments.push({ ...file, proxy_url: file.url });
- } catch (error) {
+ }
+ catch (error) {
return res.status(400).json(error);
}
}
- const channel = await Channel.findOneOrFail({ where: { id: channel_id }, relations: ["recipients", "recipients.user"] });
- if (!channel.isWritable()) {
- throw new HTTPError(`Cannot send messages to channel of type ${channel.type}`, 400)
- }
const embeds = body.embeds || [];
if (body.embed) embeds.push(body.embed);
diff --git a/api/src/routes/guilds/#guild_id/index.ts b/api/src/routes/guilds/#guild_id/index.ts
index 4ec3df72..45e30a74 100644
--- a/api/src/routes/guilds/#guild_id/index.ts
+++ b/api/src/routes/guilds/#guild_id/index.ts
@@ -20,6 +20,7 @@ export interface GuildUpdateSchema extends Omit<GuildCreateSchema, "channels"> {
afk_timeout?: number;
afk_channel_id?: string;
preferred_locale?: string;
+ premium_progress_bar_enabled?: boolean;
}
router.get("/", route({}), async (req: Request, res: Response) => {
diff --git a/api/src/routes/guilds/#guild_id/member-verification.ts b/api/src/routes/guilds/#guild_id/member-verification.ts
new file mode 100644
index 00000000..265a1b35
--- /dev/null
+++ b/api/src/routes/guilds/#guild_id/member-verification.ts
@@ -0,0 +1,14 @@
+import { Router, Request, Response } from "express";
+import { route } from "@fosscord/api";
+const router = Router();
+
+router.get("/",route({}), async (req: Request, res: Response) => {
+ // TODO: member verification
+
+ res.status(404).json({
+ message: "Unknown Guild Member Verification Form",
+ code: 10068
+ });
+});
+
+export default router;
diff --git a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts
index 34836292..2ff89eae 100644
--- a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts
+++ b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts
@@ -1,5 +1,5 @@
import { Request, Response, Router } from "express";
-import { Member, getPermission, Role, GuildMemberUpdateEvent, emitEvent, Sticker, Emoji, Guild } from "@fosscord/util";
+import { Member, getPermission, getRights, Role, GuildMemberUpdateEvent, emitEvent, Sticker, Emoji, Rights, Guild } from "@fosscord/util";
import { HTTPError } from "lambert-server";
import { route } from "@fosscord/api";
@@ -7,6 +7,7 @@ const router = Router();
export interface MemberChangeSchema {
roles?: string[];
+ nick?: string;
}
router.get("/", route({}), async (req: Request, res: Response) => {
@@ -34,6 +35,8 @@ router.patch("/", route({ body: "MemberChangeSchema" }), async (req: Request, re
member.roles = body.roles.map((x) => new Role({ id: x })); // foreign key constraint will fail if role doesn't exist
}
+ if (body.nick) member.nick = body.nick;
+
await member.save();
member.roles = member.roles.filter((x) => x.id !== everyone.id);
@@ -52,27 +55,47 @@ router.put("/", route({}), async (req: Request, res: Response) => {
// TODO: Lurker mode
+ const rights = await getRights(req.user_id);
+
let { guild_id, member_id } = req.params;
- if (member_id === "@me") member_id = req.user_id;
+ if (member_id === "@me") {
+ member_id = req.user_id;
+ rights.hasThrow("JOIN_GUILDS");
+ } else {
+ // TODO: join others by controller
+ }
var guild = await Guild.findOneOrFail({
- where: { id: guild_id } });
+ where: { id: guild_id }
+ });
var emoji = await Emoji.find({
- where: { guild_id: guild_id } });
+ where: { guild_id: guild_id }
+ });
var roles = await Role.find({
- where: { guild_id: guild_id } });
+ where: { guild_id: guild_id }
+ });
var stickers = await Sticker.find({
- where: { guild_id: guild_id } });
-
+ where: { guild_id: guild_id }
+ });
+
await Member.addToGuild(member_id, guild_id);
- res.send({...guild, emojis: emoji, roles: roles, stickers: stickers});
+ res.send({ ...guild, emojis: emoji, roles: roles, stickers: stickers });
});
-router.delete("/", route({ permission: "KICK_MEMBERS" }), async (req: Request, res: Response) => {
+router.delete("/", route({}), async (req: Request, res: Response) => {
+ const permission = await getPermission(req.user_id);
+ const rights = await getRights(req.user_id);
const { guild_id, member_id } = req.params;
+ if (member_id !== "@me" || member_id === req.user_id) {
+ // TODO: unless force-joined
+ rights.hasThrow("SELF_LEAVE_GROUPS");
+ } else {
+ rights.hasThrow("KICK_BAN_MEMBERS");
+ permission.hasThrow("KICK_MEMBERS");
+ }
await Member.removeFromGuild(member_id, guild_id);
res.sendStatus(204);
diff --git a/api/src/routes/guilds/#guild_id/roles/#role_id/index.ts b/api/src/routes/guilds/#guild_id/roles/#role_id/index.ts
new file mode 100644
index 00000000..16b5a59f
--- /dev/null
+++ b/api/src/routes/guilds/#guild_id/roles/#role_id/index.ts
@@ -0,0 +1,69 @@
+import { Router, Request, Response } from "express";
+import { Role, Member, GuildRoleUpdateEvent, GuildRoleDeleteEvent, emitEvent, handleFile } from "@fosscord/util";
+import { route } from "@fosscord/api";
+import { HTTPError } from "lambert-server";
+import { RoleModifySchema } from "../";
+
+const router = Router();
+
+router.get("/", route({}), async (req: Request, res: Response) => {
+ const { guild_id, role_id } = req.params;
+ await Member.IsInGuildOrFail(req.user_id, guild_id);
+ const role = await Role.findOneOrFail({ guild_id, id: role_id });
+ return res.json(role);
+});
+
+router.delete("/", route({ permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => {
+ const { guild_id, role_id } = req.params;
+ if (role_id === guild_id) throw new HTTPError("You can't delete the @everyone role");
+
+ await Promise.all([
+ Role.delete({
+ id: role_id,
+ guild_id: guild_id
+ }),
+ emitEvent({
+ event: "GUILD_ROLE_DELETE",
+ guild_id,
+ data: {
+ guild_id,
+ role_id
+ }
+ } as GuildRoleDeleteEvent)
+ ]);
+
+ res.sendStatus(204);
+});
+
+// TODO: check role hierarchy
+
+router.patch("/", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => {
+ const { role_id, guild_id } = req.params;
+ const body = req.body as RoleModifySchema;
+
+ if (body.icon && body.icon.length) body.icon = await handleFile(`/role-icons/${role_id}`, body.icon as string);
+ else body.icon = undefined;
+
+ const role = new Role({
+ ...body,
+ id: role_id,
+ guild_id,
+ permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0"))
+ });
+
+ await Promise.all([
+ role.save(),
+ emitEvent({
+ event: "GUILD_ROLE_UPDATE",
+ guild_id,
+ data: {
+ guild_id,
+ role
+ }
+ } as GuildRoleUpdateEvent)
+ ]);
+
+ res.json(role);
+});
+
+export default router;
diff --git a/api/src/routes/guilds/#guild_id/roles.ts b/api/src/routes/guilds/#guild_id/roles/index.ts
index b6894e3f..53465105 100644
--- a/api/src/routes/guilds/#guild_id/roles.ts
+++ b/api/src/routes/guilds/#guild_id/roles/index.ts
@@ -81,59 +81,6 @@ router.post("/", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" })
res.json(role);
});
-router.delete("/:role_id", route({ permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => {
- const guild_id = req.params.guild_id;
- const { role_id } = req.params;
- if (role_id === guild_id) throw new HTTPError("You can't delete the @everyone role");
-
- await Promise.all([
- Role.delete({
- id: role_id,
- guild_id: guild_id
- }),
- emitEvent({
- event: "GUILD_ROLE_DELETE",
- guild_id,
- data: {
- guild_id,
- role_id
- }
- } as GuildRoleDeleteEvent)
- ]);
-
- res.sendStatus(204);
-});
-
-// TODO: check role hierarchy
-
-router.patch("/:role_id", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => {
- const { role_id, guild_id } = req.params;
- const body = req.body as RoleModifySchema;
-
- if (body.icon) body.icon = await handleFile(`/role-icons/${role_id}`, body.icon as string);
-
- const role = new Role({
- ...body,
- id: role_id,
- guild_id,
- permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0"))
- });
-
- await Promise.all([
- role.save(),
- emitEvent({
- event: "GUILD_ROLE_UPDATE",
- guild_id,
- data: {
- guild_id,
- role
- }
- } as GuildRoleUpdateEvent)
- ]);
-
- res.json(role);
-});
-
router.patch("/", route({ body: "RolePositionUpdateSchema" }), async (req: Request, res: Response) => {
const { guild_id } = req.params;
const body = req.body as RolePositionUpdateSchema;
diff --git a/api/src/routes/guilds/#guild_id/welcome_screen.ts b/api/src/routes/guilds/#guild_id/welcome-screen.ts
index 7141f17e..5c7a9daa 100644
--- a/api/src/routes/guilds/#guild_id/welcome_screen.ts
+++ b/api/src/routes/guilds/#guild_id/welcome-screen.ts
@@ -10,7 +10,7 @@ export interface GuildUpdateWelcomeScreenSchema {
channel_id: string;
description: string;
emoji_id?: string;
- emoji_name: string;
+ emoji_name?: string;
}[];
enabled?: boolean;
description?: string;
@@ -36,6 +36,8 @@ router.patch("/", route({ body: "GuildUpdateWelcomeScreenSchema", permission: "M
if (body.description) guild.welcome_screen.description = body.description;
if (body.enabled != null) guild.welcome_screen.enabled = body.enabled;
+ await guild.save();
+
res.sendStatus(204);
});
diff --git a/api/src/routes/guilds/index.ts b/api/src/routes/guilds/index.ts
index 10721413..489dea49 100644
--- a/api/src/routes/guilds/index.ts
+++ b/api/src/routes/guilds/index.ts
@@ -9,7 +9,7 @@ export interface GuildCreateSchema {
/**
* @maxLength 100
*/
- name: string;
+ name?: string;
region?: string;
icon?: string | null;
channels?: ChannelModifySchema[];
diff --git a/api/src/routes/invites/index.ts b/api/src/routes/invites/index.ts
index 21da2d18..eeafb22a 100644
--- a/api/src/routes/invites/index.ts
+++ b/api/src/routes/invites/index.ts
@@ -13,7 +13,7 @@ router.get("/:code", route({}), async (req: Request, res: Response) => {
res.status(200).send(invite);
});
-router.post("/:code", route({right: "JOIN_GUILDS"}), async (req: Request, res: Response) => {
+router.post("/:code", route({right: "USE_MASS_INVITES"}), async (req: Request, res: Response) => {
const { code } = req.params;
const { guild_id } = await Invite.findOneOrFail({ code })
const { features } = await Guild.findOneOrFail({ id: guild_id});
diff --git a/api/src/routes/ping.ts b/api/src/routes/ping.ts
index 5cdea705..3c1da2c3 100644
--- a/api/src/routes/ping.ts
+++ b/api/src/routes/ping.ts
@@ -1,10 +1,26 @@
import { Router, Response, Request } from "express";
import { route } from "@fosscord/api";
+import { Config } from "@fosscord/util";
const router = Router();
router.get("/", route({}), (req: Request, res: Response) => {
- res.send("pong");
+ const { general } = Config.get();
+ res.send({
+ ping: "pong!",
+ instance: {
+ id: general.instanceId,
+ name: general.instanceName,
+ description: general.instanceDescription,
+ image: general.image,
+
+ correspondenceEmail: general.correspondenceEmail,
+ correspondenceUserID: general.correspondenceUserID,
+
+ frontPage: general.frontPage,
+ tosPage: general.tosPage,
+ },
+ });
});
export default router;
diff --git a/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts b/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts
index 723a5160..03162ec8 100644
--- a/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts
+++ b/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts
@@ -5,6 +5,22 @@ const router: Router = Router();
const skus = new Map([
[
+ "978380684370378762",
+ [
+ {
+ id: "978380692553465866",
+ name: "Nitro Lite Monthly",
+ interval: 1,
+ interval_count: 1,
+ tag_inclusive: true,
+ sku_id: "978380684370378762",
+ currency: "usd",
+ price: 0,
+ price_tier: null,
+ }
+ ]
+ ],
+ [
"521842865731534868",
[
{
diff --git a/api/src/routes/users/@me/index.ts b/api/src/routes/users/@me/index.ts
index 1af413c4..dc0d1cb1 100644
--- a/api/src/routes/users/@me/index.ts
+++ b/api/src/routes/users/@me/index.ts
@@ -1,7 +1,8 @@
import { Router, Request, Response } from "express";
-import { User, PrivateUserProjection, emitEvent, UserUpdateEvent, handleFile, FieldErrors } from "@fosscord/util";
+import { User, PrivateUserProjection, emitEvent, UserUpdateEvent, handleFile, FieldErrors, adjustEmail, Config } from "@fosscord/util";
import { route } from "@fosscord/api";
import bcrypt from "bcrypt";
+import { HTTPError } from "lambert-server";
const router: Router = Router();
@@ -21,6 +22,8 @@ export interface UserModifySchema {
password?: string;
new_password?: string;
code?: string;
+ email?: string;
+ discriminator?: string;
}
router.get("/", route({}), async (req: Request, res: Response) => {
@@ -30,11 +33,13 @@ router.get("/", route({}), async (req: Request, res: Response) => {
router.patch("/", route({ body: "UserModifySchema" }), async (req: Request, res: Response) => {
const body = req.body as UserModifySchema;
+ const user = await User.findOneOrFail({ where: { id: req.user_id }, select: [...PrivateUserProjection, "data"] });
+
+ if (user.email == "demo@maddy.k.vu") throw new HTTPError("Demo user, sorry", 400);
+
if (body.avatar) body.avatar = await handleFile(`/avatars/${req.user_id}`, body.avatar as string);
if (body.banner) body.banner = await handleFile(`/banners/${req.user_id}`, body.banner as string);
- const user = await User.findOneOrFail({ where: { id: req.user_id }, select: [...PrivateUserProjection, "data"] });
-
if (body.password) {
if (user.data?.hash) {
const same_password = await bcrypt.compare(body.password, user.data.hash || "");
@@ -46,6 +51,14 @@ router.patch("/", route({ body: "UserModifySchema" }), async (req: Request, res:
}
}
+ if (body.email) {
+ body.email = adjustEmail(body.email);
+ if (!body.email && Config.get().register.email.required)
+ throw FieldErrors({ email: { message: req.t("auth:register.EMAIL_INVALID"), code: "EMAIL_INVALID" } });
+ if (!body.password)
+ throw FieldErrors({ password: { message: req.t("auth:register.INVALID_PASSWORD"), code: "INVALID_PASSWORD" } });
+ }
+
if (body.new_password) {
if (!body.password && !user.email) {
throw FieldErrors({
@@ -55,14 +68,14 @@ router.patch("/", route({ body: "UserModifySchema" }), async (req: Request, res:
user.data.hash = await bcrypt.hash(body.new_password, 12);
}
- if(body.username){
- var check_username = body?.username?.replace(/\s/g, '');
- if(!check_username) {
- throw FieldErrors({
- username: { code: "BASE_TYPE_REQUIRED", message: req.t("common:field.BASE_TYPE_REQUIRED") }
- });
- }
- }
+ if (body.username) {
+ var check_username = body?.username?.replace(/\s/g, '');
+ if (!check_username) {
+ throw FieldErrors({
+ username: { code: "BASE_TYPE_REQUIRED", message: req.t("common:field.BASE_TYPE_REQUIRED") }
+ });
+ }
+ }
user.assign(body);
await user.save();
diff --git a/api/src/util/handlers/Message.ts b/api/src/util/handlers/Message.ts
index e9f0ac55..48f87dfe 100644
--- a/api/src/util/handlers/Message.ts
+++ b/api/src/util/handlers/Message.ts
@@ -38,7 +38,7 @@ const DEFAULT_FETCH_OPTIONS: any = {
headers: {
"user-agent": "Mozilla/5.0 (compatible; Fosscord/1.0; +https://github.com/fosscord/fosscord)"
},
- size: 1024 * 1024 * 1,
+ // size: 1024 * 1024 * 5, // grabbed from config later
compress: true,
method: "GET"
};
@@ -154,7 +154,10 @@ export async function postHandleMessage(message: Message) {
for (const link of links) {
try {
- const request = await fetch(link, DEFAULT_FETCH_OPTIONS);
+ const request = await fetch(link, {
+ ...DEFAULT_FETCH_OPTIONS,
+ size: Config.get().limits.message.maxEmbedDownloadSize,
+ });
const text = await request.text();
const $ = cheerio.load(text);
@@ -191,7 +194,7 @@ export async function postHandleMessage(message: Message) {
channel_id: message.channel_id,
data
} as MessageUpdateEvent),
- Message.update({ id: message.id, channel_id: message.channel_id }, data)
+ Message.update({ id: message.id, channel_id: message.channel_id }, { embeds: data.embeds })
]);
}
|