From 24359aca4db0aa7aeb9a2228ede592efc62604fb Mon Sep 17 00:00:00 2001 From: phil Date: Thu, 8 Jan 2026 11:02:10 -0500 Subject: [PATCH] regional bsky mod labeler checks and label info --- index.html | 75 ++++++++++++++++++++++++++++++++++++++++++--- useful-accounts.txt | 13 ++++++++ 2 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 useful-accounts.txt diff --git a/index.html b/index.html index 372f640..dbc5057 100644 --- a/index.html +++ b/index.html @@ -90,6 +90,24 @@ }, ]; + window.regionalModAccounts = [ // https://github.com/mary-ext/atproto-scraping?tab=readme-ov-file#bluesky-labelers + 'https://mod-br.bsky.app', + 'https://mod-de.bsky.app', + 'https://mod-in.bsky.app', + 'https://mod-ru.bsky.app', + 'https://mod-tr.bsky.app', + ]; + + window.bskyAccountDeathLabels = { + ['needs-review']: 'Automated action, cleared by manual review from Bluesky moderation team. Your content can ve accessed via direct links on Bluesky, but invisible in feeds and replies to posts.', + ['!suspend']: 'Moderation action from Bluesky moderation team. Makes your content inaccessible on the Bluesky app.', + ['!takedown']: 'Moderation action from Bluesky moderation team. Makes your content inaccessible on the Bluesky app.', + ['!hide']: 'Almost always used with !takedown, makes your content inaccessible on the Bluesky app.', + // other labels shouldn't cause problems that make you think your pds is broken + // 'spam': just hides replies by default + makes your posts click-through + // 'intolerant', etc: similar to spam + }; + if (window.blehYeahReady) blehYeahReady(); else window.yeahBlehIsReady = true; @@ -503,11 +521,13 @@ Alpine.data('modLabels', did => ({ loading: false, error: null, + regionalErrors: [], labels: [], async init() { this.loading = true; this.error = null; + this.regionalErrors = []; this.labels = []; const query = window.SimpleQuery('https://mod.bsky.app'); @@ -518,6 +538,12 @@ }); this.labels = res.labels ?? []; // TODO: handle cursors? + + for (const region of window.regionalModAccounts) { + // intentionally no await, these come in async + // (...and could get messy if we start re-checking labels before they're done) + this.checkRegionLabels(region); + } } catch (e) { if (window.isXrpcErr(e)) { this.error = e.error; @@ -528,6 +554,23 @@ } this.loading = false; }, + + async checkRegionLabels(labeler) { + const query = window.SimpleQuery(labeler); + try { + const res = await query('com.atproto.label.queryLabels', { + params: { uriPatterns: [did] }, + }); + if (res?.labels?.length > 0) this.labels.push(...res.labels); + } catch (e) { + if (window.isXrpcErr(e)) { + this.regionalErrors.push(`${labeler}: ${e.error}`); + } else { + this.regionalErrors.push(`Failed to check ${labeler} (see console)`); + console.error(`labeler: ${labeler}`, e); + } + } + } })); Alpine.data('pdsHistory', (did, currentPds) => ({ @@ -1015,8 +1058,8 @@ @@ -1043,20 +1086,44 @@ + + Loading… + + + +