Verrouillage des communautés lemmy
This commit is contained in:
@@ -39,6 +39,8 @@ async function main() {
|
|||||||
const lemmyConfig = normalizeLemmyConfig(toolsConfig.lemmy);
|
const lemmyConfig = normalizeLemmyConfig(toolsConfig.lemmy);
|
||||||
const client = await createLemmyClient(lemmyConfig);
|
const client = await createLemmyClient(lemmyConfig);
|
||||||
const bundles = await collectBundles(CONTENT_ROOT);
|
const bundles = await collectBundles(CONTENT_ROOT);
|
||||||
|
console.log("Vérification des communautés Lemmy pour les fils existants…");
|
||||||
|
await ensureRestrictedCommunitiesForExistingThreads(bundles, lemmyConfig, client);
|
||||||
const articles = selectArticles(bundles);
|
const articles = selectArticles(bundles);
|
||||||
|
|
||||||
if (articles.length === 0) {
|
if (articles.length === 0) {
|
||||||
@@ -181,6 +183,45 @@ function selectArticles(bundles) {
|
|||||||
return articles;
|
return articles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Garantit que les communautés associées aux articles déjà reliés à Lemmy
|
||||||
|
* sont configurées avec une publication restreinte aux modérateurs.
|
||||||
|
* @param {Array<object>} bundles Bundles collectés sous content/.
|
||||||
|
* @param {object} lemmyConfig Configuration Lemmy.
|
||||||
|
* @param {LemmyHttp} client Client Lemmy.
|
||||||
|
* @returns {Promise<void>} Promesse résolue une fois toutes les communautés vérifiées.
|
||||||
|
*/
|
||||||
|
async function ensureRestrictedCommunitiesForExistingThreads(bundles, lemmyConfig, client) {
|
||||||
|
const visited = new Set();
|
||||||
|
|
||||||
|
for (const bundle of bundles) {
|
||||||
|
const frontmatter = readFrontmatterFile(bundle.indexPath);
|
||||||
|
if (!frontmatter) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const existingComments =
|
||||||
|
typeof frontmatter.data?.[FRONTMATTER_COMMENT_FIELD] === "string"
|
||||||
|
? frontmatter.data[FRONTMATTER_COMMENT_FIELD].trim()
|
||||||
|
: "";
|
||||||
|
if (!existingComments) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const descriptor = buildCommunityDescriptor(bundle.parts, lemmyConfig.community);
|
||||||
|
if (visited.has(descriptor.name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ensuredCommunity = await ensureCommunity(client, descriptor, lemmyConfig.community);
|
||||||
|
if (!ensuredCommunity.created && !ensuredCommunity.updated) {
|
||||||
|
const label = ensuredCommunity.title || descriptor.title || descriptor.name;
|
||||||
|
console.log(`🔒 Communauté Lemmy ${label} déjà verrouillée.`);
|
||||||
|
}
|
||||||
|
visited.add(descriptor.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronise un article unique : communauté, miniature, post Lemmy et mise à jour du frontmatter.
|
* Synchronise un article unique : communauté, miniature, post Lemmy et mise à jour du frontmatter.
|
||||||
* @param {object} article Article préparé par selectArticles.
|
* @param {object} article Article préparé par selectArticles.
|
||||||
@@ -440,27 +481,60 @@ async function buildThumbnailAsset(coverPath, bundle) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recherche une communauté par nom, et la crée si nécessaire.
|
* Recherche une communauté par nom, la crée si nécessaire et force la restriction de publication aux modérateurs.
|
||||||
* @param {LemmyHttp} client Client Lemmy.
|
* @param {LemmyHttp} client Client Lemmy.
|
||||||
* @param {object} descriptor Nom, titre et description attendus.
|
* @param {object} descriptor Nom, titre et description attendus.
|
||||||
* @param {object} communityConfig Paramètres nsfw/visibilité.
|
* @param {object} communityConfig Paramètres nsfw/visibilité.
|
||||||
* @returns {Promise<{ id: number, name: string }>} Communauté finalisée.
|
* @returns {Promise<{ id: number, name: string, title: string, restrictedToMods: boolean, created: boolean, updated: boolean }>} Communauté finalisée.
|
||||||
*/
|
*/
|
||||||
async function ensureCommunity(client, descriptor, communityConfig) {
|
async function ensureCommunity(client, descriptor, communityConfig) {
|
||||||
const existing = await searchCommunity(client, descriptor.name);
|
const existing = await searchCommunity(client, descriptor.name);
|
||||||
if (existing) {
|
if (existing) {
|
||||||
return { id: existing.community.id, name: existing.community.name };
|
const existingCommunity = existing.community;
|
||||||
|
if (existingCommunity.posting_restricted_to_mods !== true) {
|
||||||
|
console.log(
|
||||||
|
`🔓→🔒 Communauté Lemmy ${existingCommunity.title} verrouillée (déjà existante).`
|
||||||
|
);
|
||||||
|
const edited = await client.editCommunity({
|
||||||
|
community_id: existingCommunity.id,
|
||||||
|
posting_restricted_to_mods: true,
|
||||||
|
});
|
||||||
|
const editedCommunity = edited.community_view.community;
|
||||||
|
return {
|
||||||
|
id: editedCommunity.id,
|
||||||
|
name: editedCommunity.name,
|
||||||
|
title: editedCommunity.title,
|
||||||
|
restrictedToMods: editedCommunity.posting_restricted_to_mods === true,
|
||||||
|
created: false,
|
||||||
|
updated: true,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
return {
|
||||||
|
id: existingCommunity.id,
|
||||||
|
name: existingCommunity.name,
|
||||||
|
title: existingCommunity.title,
|
||||||
|
restrictedToMods: existingCommunity.posting_restricted_to_mods === true,
|
||||||
|
created: false,
|
||||||
|
updated: false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
console.log(`🆕🔒 Communauté Lemmy ${descriptor.title} créée et verrouillée.`);
|
||||||
const response = await client.createCommunity({
|
const response = await client.createCommunity({
|
||||||
name: descriptor.name,
|
name: descriptor.name,
|
||||||
title: descriptor.title,
|
title: descriptor.title,
|
||||||
description: descriptor.description,
|
description: descriptor.description,
|
||||||
nsfw: communityConfig.nsfw,
|
nsfw: communityConfig.nsfw,
|
||||||
|
posting_restricted_to_mods: true,
|
||||||
visibility: communityConfig.visibility,
|
visibility: communityConfig.visibility,
|
||||||
});
|
});
|
||||||
|
const createdCommunity = response.community_view.community;
|
||||||
return {
|
return {
|
||||||
id: response.community_view.community.id,
|
id: createdCommunity.id,
|
||||||
name: response.community_view.community.name,
|
name: createdCommunity.name,
|
||||||
|
title: createdCommunity.title,
|
||||||
|
restrictedToMods: createdCommunity.posting_restricted_to_mods === true,
|
||||||
|
created: true,
|
||||||
|
updated: false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user