diff --git a/packages/moderation/src/data/messages/description/headers-as-body.md b/packages/moderation/src/data/messages/description/accessability/headers-as-body.md similarity index 100% rename from packages/moderation/src/data/messages/description/headers-as-body.md rename to packages/moderation/src/data/messages/description/accessability/headers-as-body.md diff --git a/packages/moderation/src/data/messages/description/image-only.md b/packages/moderation/src/data/messages/description/accessability/image-only.md similarity index 100% rename from packages/moderation/src/data/messages/description/image-only.md rename to packages/moderation/src/data/messages/description/accessability/image-only.md diff --git a/packages/moderation/src/data/messages/description/accessability/non-english/non-english-server.md b/packages/moderation/src/data/messages/description/accessability/non-english/non-english-server.md new file mode 100644 index 000000000..2ddce75ab --- /dev/null +++ b/packages/moderation/src/data/messages/description/accessability/non-english/non-english-server.md @@ -0,0 +1,7 @@ +## No English Description + +Per section 2.2 of %RULES%, a server's [Summary](%PROJECT_SETTINGS_LINK%) and %PROJECT_DESCRIPTION_FLINK% must be in English, unless meant exclusively for a non-english audience. + +You may include your non-English Description if you would like but we ask that you also add an English translation of the Description to your project page, if you would like to use an online translator to do this, we recommend [DeepL](https://www.deepl.com/translator). + +Alternatively, if your server does not support English, please ensure the accuracy of your selected %PROJECT_LANGUAGE_SETTINGS_FLINK%. diff --git a/packages/moderation/src/data/messages/description/non-english.md b/packages/moderation/src/data/messages/description/accessability/non-english/non-english.md similarity index 100% rename from packages/moderation/src/data/messages/description/non-english.md rename to packages/moderation/src/data/messages/description/accessability/non-english/non-english.md diff --git a/packages/moderation/src/data/messages/description/non-standard-text.md b/packages/moderation/src/data/messages/description/accessability/non-standard-text.md similarity index 100% rename from packages/moderation/src/data/messages/description/non-standard-text.md rename to packages/moderation/src/data/messages/description/accessability/non-standard-text.md diff --git a/packages/moderation/src/data/messages/description/insufficient-packs.md b/packages/moderation/src/data/messages/description/insufficient-packs.md deleted file mode 100644 index a6467057f..000000000 --- a/packages/moderation/src/data/messages/description/insufficient-packs.md +++ /dev/null @@ -1,8 +0,0 @@ -## Insufficient Description - -Per section 2.1 of %RULES%, your project's Description should clearly inform the reader of the content, purpose, and appeal of your project. - -Currently, it looks like there are some missing details. - -What does your modpack add? What features does it have? Why would a user want to download it? Be specific! -See descriptions like [Simply Optimized](https://modrinth.com/modpack/sop) or [Aged](https://modrinth.com/modpack/aged) for examples of what a good description looks like. diff --git a/packages/moderation/src/data/messages/description/insufficient-projects.md b/packages/moderation/src/data/messages/description/insufficient-projects.md deleted file mode 100644 index 9157b8301..000000000 --- a/packages/moderation/src/data/messages/description/insufficient-projects.md +++ /dev/null @@ -1,8 +0,0 @@ -## Insufficient Description - -Per section 2.1 of %RULES%, your project's Description should clearly inform the reader of the content, purpose, and appeal of your project. - -Currently, it looks like there are some missing details. - -What does your project add? What features does it have? Why would a user want to download it? Be specific! -See descriptions like [Sodium](https://modrinth.com/mod/sodium) or [LambDynamicLights](https://modrinth.com/mod/lambdynamiclights) for examples of what a good description looks like. diff --git a/packages/moderation/src/data/messages/description/insufficient/insufficient-packs.md b/packages/moderation/src/data/messages/description/insufficient/insufficient-packs.md new file mode 100644 index 000000000..f104e8b3b --- /dev/null +++ b/packages/moderation/src/data/messages/description/insufficient/insufficient-packs.md @@ -0,0 +1,8 @@ +## Insufficient Description + +Per section 2.1 of %RULES%, your project's %PROJECT_DESCRIPTION_FLINK% should clearly inform the reader of the content, purpose, and appeal of your project. + +Currently, it looks like there are some missing details. + +What does your modpack add? What features does it have? Why would a user want to download it? +Check out descriptions like [What Is My FPS??](https://modrinth.com/modpack/WIMP) or [Aged](https://modrinth.com/modpack/aged) for inspiration when creating a quality and informative description. diff --git a/packages/moderation/src/data/messages/description/insufficient/insufficient-projects.md b/packages/moderation/src/data/messages/description/insufficient/insufficient-projects.md new file mode 100644 index 000000000..617cc6679 --- /dev/null +++ b/packages/moderation/src/data/messages/description/insufficient/insufficient-projects.md @@ -0,0 +1,8 @@ +## Insufficient Description + +Per section 2.1 of %RULES%, your project's %PROJECT_DESCRIPTION_FLINK% should clearly inform the reader of the content, purpose, and appeal of your project. + +Currently, it looks like there are some missing details. + +What does your project add? What features does it have? Why would a user want to download it? +Check out descriptions like [Sodium](https://modrinth.com/mod/sodium) or [The Aether](https://modrinth.com/mod/aether) for inspiration when creating a quality and informative description. diff --git a/packages/moderation/src/data/messages/description/insufficient/insufficient-servers.md b/packages/moderation/src/data/messages/description/insufficient/insufficient-servers.md new file mode 100644 index 000000000..5c0cbe69c --- /dev/null +++ b/packages/moderation/src/data/messages/description/insufficient/insufficient-servers.md @@ -0,0 +1,8 @@ +## Insufficient Description + +Per section 2.1 of %RULES%, your server's %PROJECT_DESCRIPTION_FLINK% should clearly inform the reader of the content, purpose, and appeal of your server. + +Currently, it looks like there are some missing details. + +What is your server about? What features does it have? Why would a user want to join? +Check out descriptions like [Flatnet](https://modrinth.com/server/flatnet) or [Cobblemon Islands](https://modrinth.com/server/cobblemon-islands-server) for inspiration when creating a quality and informative description. diff --git a/packages/moderation/src/data/messages/description/insufficient.md b/packages/moderation/src/data/messages/description/insufficient/insufficient.md similarity index 100% rename from packages/moderation/src/data/messages/description/insufficient.md rename to packages/moderation/src/data/messages/description/insufficient/insufficient.md diff --git a/packages/moderation/src/data/messages/paid-access-server.md b/packages/moderation/src/data/messages/paid-access-server.md new file mode 100644 index 000000000..b26346b35 --- /dev/null +++ b/packages/moderation/src/data/messages/paid-access-server.md @@ -0,0 +1,5 @@ +## Unsupported Listing + +Modrinth does not support the listing of servers that require players to pay for access or donate to be able to join. + +We ask that you remove such restrictions from your server before resubmission, ensuring that all Modrinth users are able to enjoy your server as advertised for free. diff --git a/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-prohibited.md b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-prohibited.md new file mode 100644 index 000000000..8d12b2ed3 --- /dev/null +++ b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-prohibited.md @@ -0,0 +1,11 @@ +## Forbidden Overrides + +It looks like the custom modpack for your server is distributing content from outside of the Modrinth ecosystem, known as "Overrides." + +Some of these overrides are forbidden from distribution on Modrinth. + +We ask that you please remove the content listed below from your server's custom modpack before resubmission. + +For all other content distributed as overrides, we ask that you verify you are abiding by all licensing requirements and have permission to distribute the content included in your modpack. By resubmitting your server while including this content, you acknowledge that you have seen this notice and have all necessary rights and permissions to upload your custom server pack to Modrinth. + +%OVERRIDES% diff --git a/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-verification-list.md b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-verification-list.md new file mode 100644 index 000000000..829996599 --- /dev/null +++ b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-verification-list.md @@ -0,0 +1,3 @@ +Please confirm you have permission to distribute the following content as overrides: + +%OVERRIDES% diff --git a/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-verification.md b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-verification.md new file mode 100644 index 000000000..47e094ce9 --- /dev/null +++ b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_overrides-verification.md @@ -0,0 +1,9 @@ +## Permission Verification + +It looks like the custom modpack for your server may be distributing content from outside of the Modrinth ecosystem. + +Per section 4 of [Modrinth's Content Rules](https://modrinth.com/legal/rules), we ask that you verify you are abiding by all licensing requirements and have permission to distribute the content included in your modpack. + +By resubmitting your server while including this content, you acknowledge that you have seen this notice and have all necessary rights and permissions to upload your custom server pack to Modrinth. + +Keep in mind, if your server's custom modpack is found to be in violation of [Modrinth's Content Rules](https://modrinth.com/legal/rules), your listing may be temporarily or permanently removed from Modrinth with or without warning. diff --git a/packages/moderation/src/data/messages/reupload/custom_server.md b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_permissions.md similarity index 84% rename from packages/moderation/src/data/messages/reupload/custom_server.md rename to packages/moderation/src/data/messages/reupload/custom_server/custom_server_permissions.md index 513ee7196..f01171f50 100644 --- a/packages/moderation/src/data/messages/reupload/custom_server.md +++ b/packages/moderation/src/data/messages/reupload/custom_server/custom_server_permissions.md @@ -1,5 +1,5 @@ ## Reuploads are forbidden -This server appears to have uploaded a Modpack by another creator. -Per section 4 of %RULES%, we ask that you provide proof of your permission to distribute this pack on Modrinth. +This server appears to have uploaded a Modpack by another creator. +Per section 4 of %RULES%, we ask that you provide proof of your permission to distribute this pack on Modrinth. Either implicit permission abiding by the terms of the content's license(s) or explicit permission from the original creator of the pack. diff --git a/packages/moderation/src/data/messages/reupload/identity-verification/identity_verification-server.md b/packages/moderation/src/data/messages/reupload/identity-verification/identity_verification-server.md new file mode 100644 index 000000000..24f8da695 --- /dev/null +++ b/packages/moderation/src/data/messages/reupload/identity-verification/identity_verification-server.md @@ -0,0 +1,10 @@ +## Identity Verification + +**Welcome to Modrinth!** + +We're happy to see you here and are looking forward to sharing your server with our users. +First, we just want to make sure you have the necessary authority to create this listing. + +To verify, please contact our support team `support@modrinth.com` from a known public contact associated with the ownership or management of this server, such as `%CONTACT%`. + +If you would like to use an alternate known contact for verification, please let us know here in this moderation thread before contacting our support team, and ensure the method is something publicly known to be credibly linked to your server or its management, thank you. diff --git a/packages/moderation/src/data/messages/reupload/identity_verification.md b/packages/moderation/src/data/messages/reupload/identity-verification/identity_verification.md similarity index 57% rename from packages/moderation/src/data/messages/reupload/identity_verification.md rename to packages/moderation/src/data/messages/reupload/identity-verification/identity_verification.md index 198504cd1..1016caef2 100644 --- a/packages/moderation/src/data/messages/reupload/identity_verification.md +++ b/packages/moderation/src/data/messages/reupload/identity-verification/identity_verification.md @@ -1,6 +1,8 @@ ## Identity Verification -**Welcome to Modrinth!** We're happy to see you here, we just want to make sure you're you. +**Welcome to Modrinth!** -Since this project already exists on the internet we ask that you provide evidence you are the rightful owner of this content. +We're happy to see you here, we just want to make sure you're you. + +Since this project already exists on the internet we ask that you provide evidence you are the rightful owner of this content. For instance, by submitting a screenshot accessing the settings of the project's existing pages such as %PLATFORM%. diff --git a/packages/moderation/src/data/messages/status-alerts/private/private-server.md b/packages/moderation/src/data/messages/status-alerts/private/private-server.md new file mode 100644 index 000000000..8578d082a --- /dev/null +++ b/packages/moderation/src/data/messages/status-alerts/private/private-server.md @@ -0,0 +1,6 @@ +## Private Community + +Under normal circumstances, your server would be rejected due to the issues listed below. +However, since your server is intended for a private community, these requirements will be waived and your server project will be unlisted. This means it will remain accessible through a direct link without appearing in public search results, allowing you to share it privately. +If you're okay with this, or submitted your server to be unlisted already, than no further action is necessary. +If you would like public modrinth users to see and connect to your server, please address all moderation concerns before resubmitting. diff --git a/packages/moderation/src/data/messages/status-alerts/private.md b/packages/moderation/src/data/messages/status-alerts/private/private.md similarity index 84% rename from packages/moderation/src/data/messages/status-alerts/private.md rename to packages/moderation/src/data/messages/status-alerts/private/private.md index f167e345c..ed82add51 100644 --- a/packages/moderation/src/data/messages/status-alerts/private.md +++ b/packages/moderation/src/data/messages/status-alerts/private/private.md @@ -1,6 +1,6 @@ ## Private Use -Under normal circumstances, your project would be rejected due to the issues listed below. -However, since your project is not intended for public use, these requirements will be waived and your project will be unlisted. This means it will remain accessible through a direct link without appearing in public search results, allowing you to share it privately. -If you're okay with this, or submitted your project to be unlisted already, than no further action is necessary. +Under normal circumstances, your project would be rejected due to the issues listed below. +However, since your project is not intended for public use, these requirements will be waived and your project will be unlisted. This means it will remain accessible through a direct link without appearing in public search results, allowing you to share it privately. +If you're okay with this, or submitted your project to be unlisted already, than no further action is necessary. If you would like to publish your project publicly, please address all moderation concerns before resubmitting this project. diff --git a/packages/moderation/src/data/messages/summary/formatting.md b/packages/moderation/src/data/messages/summary/formatting.md index f641e593f..945c2afa3 100644 --- a/packages/moderation/src/data/messages/summary/formatting.md +++ b/packages/moderation/src/data/messages/summary/formatting.md @@ -1,6 +1,6 @@ ## Invalid Summary Formatting -Per section 5.3 of %RULES%, your Summary can not include any extra formatting such as lists, or links. +Per section 5.3 of %RULES%, your %PROJECT_SUMMARY_FLINK% can not include any extra formatting such as lists, or links. Your project summary should provide a brief overview of your project that informs and entices users. diff --git a/packages/moderation/src/data/messages/summary/insufficient.md b/packages/moderation/src/data/messages/summary/insufficient.md index 12e012ca2..0d65ce263 100644 --- a/packages/moderation/src/data/messages/summary/insufficient.md +++ b/packages/moderation/src/data/messages/summary/insufficient.md @@ -1,5 +1,5 @@ ## Insufficient Summary -Per section 5.3 of %RULES%, your project summary should provide a brief overview of your project that informs and entices users. +Per section 5.3 of %RULES%, your project %PROJECT_SUMMARY_FLINK% should provide a brief overview of your project that informs and entices users. -This is the first thing most people will see about your mod other than the Logo, so it's important it be accurate, reasonably detailed, and exciting. +This is the first thing most people will see about your %PROJECT_TYPE% other than the Logo, so it's important it be accurate, reasonably detailed, and exciting. diff --git a/packages/moderation/src/data/messages/summary/non-english.md b/packages/moderation/src/data/messages/summary/non-english.md index 94c680967..4ae933462 100644 --- a/packages/moderation/src/data/messages/summary/non-english.md +++ b/packages/moderation/src/data/messages/summary/non-english.md @@ -1,5 +1,5 @@ ## No English Summary -Per section 2.2 of %RULES%, a project's Summary and Description must be in English, unless meant exclusively for non-English use, such as translations. +Per section 2.2 of %RULES%, a project's %PROJECT_SUMMARY_FLINK% and %PROJECT_DESCRIPTION_FLINK% must be in English, unless meant exclusively for non-English use, such as translations. You may include your non-English Summary but we ask that you also add an English translation. diff --git a/packages/moderation/src/data/messages/summary/repeat-ip.md b/packages/moderation/src/data/messages/summary/repeat-ip.md index 62c57a368..e02e11640 100644 --- a/packages/moderation/src/data/messages/summary/repeat-ip.md +++ b/packages/moderation/src/data/messages/summary/repeat-ip.md @@ -1,6 +1,6 @@ ## Insufficient Summary -Currently, your summary includes your server's Address, this is redundant information that should instead be appropriately listed in your server's %PROJECT_SETTINGS_FLINK%. +Currently, your %PROJECT_SUMMARY_FLINK% includes your server's Address, this is redundant information that should instead be appropriately listed in the %PROJECT_SERVER_SETTINGS_FLINK%. Your server's summary should provide a brief overview of your server that informs and entices players. diff --git a/packages/moderation/src/data/messages/summary/repeat-title.md b/packages/moderation/src/data/messages/summary/repeat-title.md index cd2570ac0..69a8ae4cc 100644 --- a/packages/moderation/src/data/messages/summary/repeat-title.md +++ b/packages/moderation/src/data/messages/summary/repeat-title.md @@ -1,6 +1,6 @@ ## Insufficient Summary -Per section 5.3 of %RULES%, your Summary can not be the same as your project's Title. +Per section 5.3 of %RULES%, your %PROJECT_SUMMARY_FLINK% can not be the same as your project's Title. Your project summary should provide a brief overview of your project that informs and entices users. diff --git a/packages/moderation/src/data/nags/links.ts b/packages/moderation/src/data/nags/links.ts index b2264bfdc..cf57b9a78 100644 --- a/packages/moderation/src/data/nags/links.ts +++ b/packages/moderation/src/data/nags/links.ts @@ -78,15 +78,12 @@ export const linksNags: Nag[] = [ 'Add any relevant links targeted outside of Modrinth, such as source code, an issue tracker, or a Discord invite.', }), status: 'suggestion', - shouldShow: (context: NagContext) => - !context.projectV3?.minecraft_server && - !( - context.project.issues_url || - context.project.source_url || - context.project.wiki_url || - context.project.discord_url || - context.project.donation_urls?.length - ), + shouldShow: (context: NagContext) => { + return ( + !context.projectV3?.minecraft_server && + Object.keys(context.projectV3?.link_urls ?? {}).length === 0 + ) + }, link: { path: 'settings/links', title: defineMessage({ @@ -109,11 +106,9 @@ export const linksNags: Nag[] = [ }), status: 'suggestion', shouldShow: (context: NagContext) => { - return !( - context.projectV3?.link_urls?.site?.url || - context.projectV3?.link_urls?.store?.url || - context.projectV3?.link_urls?.discord?.url || - context.projectV3?.link_urls?.wiki?.url + return ( + !!context.projectV3?.minecraft_server && + Object.keys(context.projectV3?.link_urls ?? {}).length === 0 ) }, link: { @@ -125,6 +120,30 @@ export const linksNags: Nag[] = [ shouldShow: (context: NagContext) => context.currentRoute !== 'type-id-settings-links', }, }, + { + id: 'identical-links', + title: defineMessage({ + id: 'nags.identical-links.title', + defaultMessage: 'Identical Links', + }), + description: defineMessage({ + id: 'nags.identical-links.description', + defaultMessage: + 'Some of your external links appear to be identical. Each link should be entered only once and with the appropriate link type.', + }), + status: 'required', + shouldShow: (context: NagContext) => + new Set(Object.values(context.projectV3?.link_urls ?? {}).map((link) => link.url)).size !== + Object.values(context.projectV3?.link_urls ?? {}).map((link) => link.url).length, + link: { + path: 'settings/links', + title: defineMessage({ + id: 'nags.settings.links.title', + defaultMessage: 'Visit links settings', + }), + shouldShow: (context: NagContext) => context.currentRoute !== 'type-id-settings-links', + }, + }, { id: 'verify-external-links', title: defineMessage({ diff --git a/packages/moderation/src/data/nags/server-projects.ts b/packages/moderation/src/data/nags/server-projects.ts index caf092fca..eef72a822 100644 --- a/packages/moderation/src/data/nags/server-projects.ts +++ b/packages/moderation/src/data/nags/server-projects.ts @@ -6,11 +6,11 @@ export const serverProjectsNags: Nag[] = [ id: 'select-country', title: defineMessage({ id: 'nags.select-country.title', - defaultMessage: 'Select a country', + defaultMessage: 'Select a region', }), description: defineMessage({ id: 'nags.select-country.description', - defaultMessage: 'Let players know what country your server is located in.', + defaultMessage: 'Let players know what region your server is located in.', }), status: 'required', shouldShow: (context: NagContext) => diff --git a/packages/moderation/src/data/stages/description.ts b/packages/moderation/src/data/stages/description.ts index 61628bf37..1573b9c7f 100644 --- a/packages/moderation/src/data/stages/description.ts +++ b/packages/moderation/src/data/stages/description.ts @@ -17,7 +17,8 @@ const description: Stage = { weight: 400, suggestedStatus: 'flagged', severity: 'medium', - message: async () => (await import('../messages/description/insufficient.md?raw')).default, + message: async () => + (await import('../messages/description/insufficient/insufficient.md?raw')).default, relevantExtraInput: [ { label: 'Please elaborate on how the author can improve their description.', @@ -26,6 +27,11 @@ const description: Stage = { required: true, }, ], + disablesActions: [ + 'description_insufficient_packs', + 'description_insufficient_projects', + 'description_insufficient_servers', + ], } as ButtonAction, { id: 'description_insufficient_packs', @@ -34,9 +40,11 @@ const description: Stage = { weight: 401, suggestedStatus: 'flagged', severity: 'medium', - shouldShow: (project) => project.project_type === 'modpack', + shouldShow: (project, projectV3) => + project.project_type === 'modpack' && !projectV3?.minecraft_server, message: async () => - (await import('../messages/description/insufficient-packs.md?raw')).default, + (await import('../messages/description/insufficient/insufficient-packs.md?raw')).default, + disablesActions: ['description_insufficient'], } as ButtonAction, { id: 'description_insufficient_projects', @@ -45,9 +53,23 @@ const description: Stage = { weight: 401, suggestedStatus: 'flagged', severity: 'medium', - shouldShow: (project) => project.project_type !== 'modpack', + shouldShow: (project, projectV3) => + project.project_type !== 'modpack' && !projectV3?.minecraft_server, message: async () => - (await import('../messages/description/insufficient-projects.md?raw')).default, + (await import('../messages/description/insufficient/insufficient-projects.md?raw')).default, + disablesActions: ['description_insufficient'], + } as ButtonAction, + { + id: 'description_insufficient_servers', + type: 'button', + label: 'Insufficient', + weight: 401, + suggestedStatus: 'flagged', + severity: 'medium', + shouldShow: (project, projectV3) => !!projectV3?.minecraft_java_server, + message: async () => + (await import('../messages/description/insufficient/insufficient-servers.md?raw')).default, + disablesActions: ['description_insufficient'], } as ButtonAction, { id: 'description_non_english', @@ -56,7 +78,23 @@ const description: Stage = { weight: 402, suggestedStatus: 'flagged', severity: 'medium', - message: async () => (await import('../messages/description/non-english.md?raw')).default, + shouldShow: (project, projectV3) => !projectV3?.minecraft_java_server, + message: async () => + (await import('../messages/description/accessability/non-english/non-english.md?raw')) + .default, + } as ButtonAction, + { + id: 'description_non_english-server', + type: 'button', + label: 'Non-english', + weight: 402, + suggestedStatus: 'flagged', + severity: 'medium', + shouldShow: (project, projectV3) => !!projectV3?.minecraft_java_server, + message: async () => + ( + await import('../messages/description/accessability/non-english/non-english-server.md?raw') + ).default, } as ButtonAction, { id: 'description_unfinished', @@ -74,7 +112,8 @@ const description: Stage = { weight: 404, suggestedStatus: 'flagged', severity: 'low', - message: async () => (await import('../messages/description/headers-as-body.md?raw')).default, + message: async () => + (await import('../messages/description/accessability/headers-as-body.md?raw')).default, } as ButtonAction, { id: 'description_image_only', @@ -83,7 +122,8 @@ const description: Stage = { weight: 405, suggestedStatus: 'flagged', severity: 'medium', - message: async () => (await import('../messages/description/image-only.md?raw')).default, + message: async () => + (await import('../messages/description/accessability/image-only.md?raw')).default, } as ButtonAction, { id: 'description_non_standard_text', @@ -93,7 +133,7 @@ const description: Stage = { suggestedStatus: 'flagged', severity: 'medium', message: async () => - (await import('../messages/description/non-standard-text.md?raw')).default, + (await import('../messages/description/accessability/non-standard-text.md?raw')).default, } as ButtonAction, { id: 'description_clarity', diff --git a/packages/moderation/src/data/stages/reupload.ts b/packages/moderation/src/data/stages/reupload.ts index a74fe36cd..90e8e84d1 100644 --- a/packages/moderation/src/data/stages/reupload.ts +++ b/packages/moderation/src/data/stages/reupload.ts @@ -1,6 +1,6 @@ import { CopyrightIcon } from '@modrinth/assets' -import type { ButtonAction } from '../../types/actions' +import type { ButtonAction, ToggleAction } from '../../types/actions' import type { Stage } from '../../types/stage' const reupload: Stage = { @@ -24,6 +24,7 @@ const reupload: Stage = { 'reupload_request_proof', 'reupload_identity_verification', 'reupload_request_proof_server', + 'reupload_identity_verification_server', ], relevantExtraInput: [ { @@ -55,6 +56,7 @@ const reupload: Stage = { 'reupload_request_proof', 'reupload_identity_verification', 'reupload_request_proof_server', + 'reupload_identity_verification_server', ], } as ButtonAction, { @@ -72,6 +74,7 @@ const reupload: Stage = { 'reupload_request_proof', 'reupload_identity_verification', 'reupload_request_proof_server', + 'reupload_identity_verification_server', ], } as ButtonAction, { @@ -89,6 +92,7 @@ const reupload: Stage = { 'reupload_insufficient_fork', 'reupload_identity_verification', 'reupload_request_proof_server', + 'reupload_identity_verification_server', ], }, { @@ -100,7 +104,8 @@ const reupload: Stage = { severity: 'high', shouldShow: (project, projectV3) => !projectV3?.minecraft_server, message: async () => - (await import('../messages/reupload/identity_verification.md?raw')).default, + (await import('../messages/reupload/identity-verification/identity_verification.md?raw')) + .default, relevantExtraInput: [ { label: 'Where else can the project be found?', @@ -115,10 +120,36 @@ const reupload: Stage = { 'reupload_request_proof_server', ], }, + { + id: 'reupload_identity_verification_server', + type: 'button', + label: 'Verify Identity', + weight: 1100, + suggestedStatus: 'rejected', + severity: 'high', + shouldShow: (project, projectV3) => !!projectV3?.minecraft_server, + message: async () => + ( + await import('../messages/reupload/identity-verification/identity_verification-server.md?raw') + ).default, + relevantExtraInput: [ + { + label: 'known public contact method', + variable: 'CONTACT', + required: true, + }, + ], + disablesActions: [ + 'reupload_reupload', + 'reupload_insufficient_fork', + 'reupload_request_proof', + 'reupload_request_proof_server', + ], + }, { id: 'reupload_request_proof_server', type: 'button', - label: 'Custom modpack permissions', + label: 'Reuploaded pack', weight: 1100, suggestedStatus: 'rejected', severity: 'high', @@ -126,7 +157,9 @@ const reupload: Stage = { !!projectV3?.minecraft_server && projectV3?.minecraft_java_server?.content?.kind === 'modpack' && projectV3?.minecraft_java_server?.content?.['project_id'] === project.id, - message: async () => (await import('../messages/reupload/custom_server.md?raw')).default, + message: async () => + (await import('../messages/reupload/custom_server/custom_server_permissions.md?raw')) + .default, disablesActions: [ 'reupload_reupload', 'reupload_unclear_fork', @@ -135,6 +168,83 @@ const reupload: Stage = { 'reupload_request_proof', ], }, + { + id: 'reupload_custom_pack_verification', + type: 'button', + label: 'Override verification', + weight: 1100, + suggestedStatus: 'rejected', + severity: 'high', + shouldShow: (project, projectV3) => + !!projectV3?.minecraft_server && + projectV3?.minecraft_java_server?.content?.kind === 'modpack' && + projectV3?.minecraft_java_server?.content?.['project_id'] === project.id, + message: async () => + ( + await import('../messages/reupload/custom_server/custom_server_overrides-verification.md?raw') + ).default, + enablesActions: [ + { + id: 'reupload_custom_pack_verification-list', + type: 'toggle', + label: 'List overrides?', + weight: 1101, + message: async () => + ( + await import('../messages/reupload/custom_server/custom_server_overrides-verification-list.md?raw') + ).default, + relevantExtraInput: [ + { + label: 'Add list of overrides.', + variable: 'OVERRIDES', + large: true, + required: false, + }, + ], + } as ToggleAction, + ], + + disablesActions: [ + 'reupload_reupload', + 'reupload_unclear_fork', + 'reupload_insufficient_fork', + 'reupload_identity_verification', + 'reupload_request_proof', + 'reupload_custom_pack_prohibited', + ], + }, + { + id: 'reupload_custom_pack_prohibited', + type: 'button', + label: 'Forbidden Overrides', + weight: 1100, + suggestedStatus: 'rejected', + severity: 'high', + shouldShow: (project, projectV3) => + !!projectV3?.minecraft_server && + projectV3?.minecraft_java_server?.content?.kind === 'modpack' && + projectV3?.minecraft_java_server?.content?.['project_id'] === project.id, + message: async () => + ( + await import('../messages/reupload/custom_server/custom_server_overrides-prohibited.md?raw') + ).default, + relevantExtraInput: [ + { + label: 'Add list of overrides.', + variable: 'OVERRIDES', + large: true, + required: true, + }, + ], + disablesActions: [ + 'reupload_reupload', + 'reupload_unclear_fork', + 'reupload_insufficient_fork', + 'reupload_identity_verification', + 'reupload_request_proof', + 'reupload_custom_pack_verification', + ], + }, ], } diff --git a/packages/moderation/src/data/stages/rule-following.ts b/packages/moderation/src/data/stages/rule-following.ts index f72ee0d9c..821b8f78c 100644 --- a/packages/moderation/src/data/stages/rule-following.ts +++ b/packages/moderation/src/data/stages/rule-following.ts @@ -28,6 +28,15 @@ const ruleFollowing: Stage = { }, ], } as ButtonAction, + { + id: 'paid_access_server', + type: 'button', + label: 'Paid access server', + weight: 0, + suggestedStatus: 'rejected', + severity: 'critical', + message: async () => (await import('../messages/paid-access-server.md?raw')).default, + }, ], } diff --git a/packages/moderation/src/data/stages/status-alerts.ts b/packages/moderation/src/data/stages/status-alerts.ts index 77b48d2a9..1df949991 100644 --- a/packages/moderation/src/data/stages/status-alerts.ts +++ b/packages/moderation/src/data/stages/status-alerts.ts @@ -1,6 +1,6 @@ import { TriangleAlertIcon } from '@modrinth/assets' -import type { ButtonAction, DropdownAction, DropdownActionOption } from '../../types/actions' +import type { ButtonAction } from '../../types/actions' import type { Stage } from '../../types/stage' const statusAlerts: Stage = { @@ -41,16 +41,27 @@ const statusAlerts: Stage = { suggestedStatus: 'flagged', disablesActions: ['status_corrections_applied', 'status_account_issues'], shouldShow: (project, projectV3) => !projectV3?.minecraft_server, - message: async () => (await import('../messages/status-alerts/private.md?raw')).default, + message: async () => + (await import('../messages/status-alerts/private/private.md?raw')).default, + } as ButtonAction, + { + id: 'status_private_use-server', + type: 'button', + label: 'Private community', + weight: -999999, + suggestedStatus: 'flagged', + disablesActions: ['status_corrections_applied', 'status_account_issues'], + shouldShow: (project, projectV3) => !!projectV3?.minecraft_server, + message: async () => + (await import('../messages/status-alerts/private/private-server.md?raw')).default, } as ButtonAction, { id: 'status_server_use', type: 'button', label: 'Server use', weight: -999999, - suggestedStatus: 'flagged', - disablesActions: ['status_corrections_applied', 'status_account_issues'], - shouldShow: (project) => project.project_type === 'modpack', + shouldShow: (project, projectV3) => + project.project_type === 'modpack' && !projectV3?.minecraft_server, message: async () => (await import('../messages/status-alerts/serverpack.md?raw')).default, } as ButtonAction, { @@ -63,57 +74,15 @@ const statusAlerts: Stage = { message: async () => (await import('../messages/status-alerts/account_issues.md?raw')).default, } as ButtonAction, - { - id: 'status_tec_source_request', - type: 'button', - label: `Request Source`, - suggestedStatus: 'rejected', - severity: 'critical', - disablesActions: ['status_corrections_applied', 'status_private_use'], - shouldShow: (project) => - project.project_type === 'mod' || - project.project_type === 'shader' || - project.project_type.toString() === 'plugin', - weight: -999999, - message: async () => '', - enablesActions: [ - { - id: 'status_tec_source_request_options', - type: 'dropdown', - label: 'Why are you requesting source?', - options: [ - { - label: 'Obfuscated', - weight: 999999, - message: async () => - (await import('../messages/status-alerts/tec/source_request-obfs.md?raw')).default, - } as DropdownActionOption, - { - label: 'Binaries', - weight: 999000, - message: async () => - (await import('../messages/status-alerts/tec/source_request-bins.md?raw')).default, - } as DropdownActionOption, - ], - } as DropdownAction, - ], - } as ButtonAction, { id: 'status_automod_confusion', type: 'button', label: `Automod confusion`, weight: -999999, + shouldShow: (project, projectV3) => !projectV3?.minecraft_server, message: async () => (await import('../messages/status-alerts/automod_confusion.md?raw')).default, } as ButtonAction, - { - id: 'status_serverpack', - type: 'button', - label: `Serverpack`, - weight: -999999, - shouldShow: (project) => project.project_type === 'modpack', - message: async () => (await import('../messages/status-alerts/serverpack.md?raw')).default, - } as ButtonAction, ], } diff --git a/packages/moderation/src/locales/en-US/index.json b/packages/moderation/src/locales/en-US/index.json index edc4426a1..5cb10f107 100644 --- a/packages/moderation/src/locales/en-US/index.json +++ b/packages/moderation/src/locales/en-US/index.json @@ -71,6 +71,12 @@ "nags.gpl-license-source-required.title": { "defaultMessage": "Provide source code" }, + "nags.identical-links.description": { + "defaultMessage": "Some of your external links appear to be identical. Each link should be entered only once and with the appropriate link type." + }, + "nags.identical-links.title": { + "defaultMessage": "Identical Links" + }, "nags.image-heavy-description.description": { "defaultMessage": "Your Description should contain sufficient plain text or image alt-text, keeping it accessible to those using screen readers or with slow internet connections." }, @@ -141,10 +147,10 @@ "defaultMessage": "Select compatibility" }, "nags.select-country.description": { - "defaultMessage": "Let players know what country your server is located in." + "defaultMessage": "Let players know what region your server is located in." }, "nags.select-country.title": { - "defaultMessage": "Select a country" + "defaultMessage": "Select a region" }, "nags.select-language.description": { "defaultMessage": "List the language or languages supported by your server." diff --git a/packages/moderation/src/utils.ts b/packages/moderation/src/utils.ts index aa139b9ea..6ab5eb95e 100644 --- a/packages/moderation/src/utils.ts +++ b/packages/moderation/src/utils.ts @@ -237,6 +237,19 @@ export function arrayOrNone(arr: string[]): string { return arr.length > 0 ? arr.join(', ') : 'None' } +export function formatProjectTypes(type: string, lower: boolean = false) { + let value = type + .replaceAll('mod', 'Mod') + .replaceAll('resourcepack', 'Resource Pack') + .replaceAll('datapack', 'Data Pack') + .replaceAll('plugin', 'Plugin') + .replaceAll('shader', 'Shaders') + .replaceAll('minecraft_java_server', 'Server') + .replaceAll('minecraft_server', 'Server') + if (lower) value = value.toLowerCase() + return value +} + export function flattenStaticVariables(): Record { const vars: Record = {} @@ -255,7 +268,7 @@ export function flattenStaticVariables(): Record { `our guide to [Licensing your Mods](https://modrinth.com/news/article/licensing-guide)` vars[`NEW_ENVIRONMENTS_LINK`] = `https://modrinth.com/news/article/new-environments` vars[`LEARN_MORE_ABOUT_SERVERS_FLINK`] = - `[learn more about server projects from our news feed](https://modrinth.com/news/)` + `[learn more about server projects from our news feed](https://modrinth.com/news/article/introducing-server-projects/)` return vars } @@ -334,9 +347,8 @@ export function flattenProjectVariables( vars[`PROJECT_TITLE_FLINK`] = `[Name](https://modrinth.com/project/${project.id}/settings)` vars[`PROJECT_SLUG_FLINK`] = `[URL](https://modrinth.com/project/${project.id}/settings)` vars[`PROJECT_SUMMARY_FLINK`] = `[Summary](https://modrinth.com/project/${project.id}/settings)` - // Depreciated vars[`PROJECT_ENVIRONMENT_FLINK`] = - `[Environment Information](https://modrinth.com/project/${project.id}/settings/environment)` + `[Environment Information](https://modrinth.com/project/${project.id}/settings/environment)` // Depreciated vars[`PROJECT_TAGS_LINK`] = `https://modrinth.com/project/${project.id}/settings/tags` vars[`PROJECT_TAGS_FLINK`] = `[Tags](https://modrinth.com/project/${project.id}/settings/tags)` vars[`PROJECT_DESCRIPTION_LINK`] = @@ -358,6 +370,12 @@ export function flattenProjectVariables( vars[`PROJECT_MODERATION_LINK`] = `https://modrinth.com/project/${project.id}/moderation` vars[`PROJECT_MODERATION_FLINK`] = `[moderation tab](https://modrinth.com/project/${project.id}/moderation)` + vars[`PROJECT_SERVER_SETTINGS`] = `https://modrinth.com/project/${project.id}/settings/server` + vars[`PROJECT_SERVER_SETTINGS_FLINK`] = + `[Server Settings](https://modrinth.com/project/${project.id}/settings/server)` + vars[`PROJECT_LANGUAGE_SETTINGS`] = `https://modrinth.com/project/${project.id}/settings/server` + vars[`PROJECT_LANGUAGE_SETTINGS_FLINK`] = + `[Language Settings](https://modrinth.com/project/${project.id}/settings/server)` return vars } @@ -377,6 +395,13 @@ export function flattenProjectV3Variables( vars['PROJECT_V3_REVIEW_STATUS'] = projectV3.side_types_migration_review_status vars['PROJECT_V3_TYPES'] = projectV3.project_types.join(', ') + vars['PROJECT_TYPE_FORMATTED'] = formatProjectTypes(projectV3.project_types[0]) + vars['PROJECT_TYPE_FORMATTED_LOWER'] = formatProjectTypes(projectV3.project_types[0], true) + vars['PROJECT_TYPES_FORMATTED'] = formatProjectTypes(projectV3.project_types.join(' / ')) + vars['PROJECT_TYPES_FORMATTED_LOWER'] = formatProjectTypes( + projectV3.project_types.join(' / '), + true, + ) vars['PROJECT_SITE_URL'] = projectV3.link_urls?.site?.url || 'None' vars['PROJECT_STORE_URL'] = projectV3.link_urls?.store?.url || 'None'