-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbsky.app_quick_block.user.js
More file actions
157 lines (140 loc) · 7.15 KB
/
Copy pathbsky.app_quick_block.user.js
File metadata and controls
157 lines (140 loc) · 7.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// ==UserScript==
// @name (KTN) Bluesky Quick Block (fork)
// @description (KTN) Bluesky Quick Block (fork) based on gh/Tanza3D/bluesky-quick-block
// @author ktnjared (original by Tanza3D)
// @version 20250217
// @run-at document-start
// @grant GM_addStyle
// @icon https://www.google.com/s2/favicons?sz=64&domain=bsky.app
// @homepageURL https://github.com/ktnjared/userscripts/
// @downloadURL https://github.com/ktnjared/userscripts/raw/refs/heads/main/bsky.app_quick_block.user.js
// @updateURL https://github.com/ktnjared/userscripts/raw/refs/heads/main/bsky.app_quick_block.user.js
// @match *://bsky.app/*
// ==/UserScript==
(function () {
'use strict';
// Put language codes here if there are multiple locales under the same language code. (Currently only for "zh")
const HAS_REGION = ["zh"];
// The message matching the language setting on Bluesky is used. If it's not one of these, English is used as a fallback.
const TL = {
en: "Are you sure you want to block {handle} ({did})? You will have to refresh the page to reflect this change.",
de: "Bist du sicher, dass du {handle} ({did}) blockieren willst? Du musst die Seite aktualisieren, um diese Änderung zu berücksichtigen.",
es: "¿Estás cierto de que quieres bloquear a {handle} ({did})? Tendrás que actualizar la página para reflejar este cambio.",
ja: "本当に{handle}({did})をブロックしますか? 反映させるにはページを再読み込みする必要があります。",
"zh-CN": "您确定要阻止 {handle}({did})吗?您将需要刷新页面以反映此更改。",
"zh-TW": "您確定要封鎖 {handle}({did})嗎?您將需要刷新頁面以反映此更改。",
"zh-HK": "你確定要阻止 {handle}({did})嗎?您需要重新加載頁面才能使其生效。",
};
const TLButton = {
en: "Block user",
de: "Benutzer blockieren",
es: "Bloquear a usuario",
ja: "ユーザーをブロックする",
"zh-CN": "封锁用户",
"zh-TW": "塊使用者",
"zh-HK": "封锁用户",
};
function getLocale() {
const langCheck = (lang) => {
const tokens = lang.split("-");
if (!(tokens[0] in HAS_REGION)) {
if (TL.hasOwnProperty(tokens[0])) {
return tokens[0];
}
} else {
if (TL.hasOwnProperty(lang)) {
return lang;
}
}
return "";
}
const browserLangList = navigator.languages;
for (let lang of browserLangList) {
const check = langCheck(lang);
if (check !== "") {
return check;
}
}
const blueskyLang = document.getElementsByTagName("HTML")[0].lang;
const check = langCheck(blueskyLang);
if (check !== "") {
return check;
}
return "en";
}
(function() {
'use strict';
function addButtonToDropdown(menu) {
if (!menu.classList.contains('new-dropdown-button')) {
menu.classList.add("new-dropdown-button");
menu.addEventListener('click', () => {
var account = JSON.parse(localStorage.getItem('BSKY_STORAGE')).session.currentAccount;
setTimeout(() => {
var list = document.querySelector('[role="menu"][data-state="open"]').querySelector(".css-175oi2r");
var buttonToClone = list.querySelector('[data-testid="postDropdownMuteWordsBtn"');
var button = buttonToClone.cloneNode(true)
list.appendChild(button);
let locale = getLocale();
button.querySelector(".css-146c3p1").innerText = TLButton[locale];
list.insertBefore(button, buttonToClone);
var postItem = menu.closest('[data-testid^="feedItem-by-"]');
if(postItem == null) postItem = menu.closest('[data-testid^="postThreadItem-by-"]');
console.log(postItem);
var handle = "";
var tmp = postItem.querySelectorAll('a');
console.log(tmp);
for(var i of tmp) {
if(i.querySelector("span") == null) continue;
console.log(i.querySelector("span").innerText)
if(i.querySelector("span").innerText.trim().startsWith("@") && i.href.includes("/profile")) handle = i.querySelector("span").innerText.trim();
}
var pfp = postItem.querySelector('[data-testid="userAvatarImage"]').querySelector("img").src;
var did = pfp.split("/");
for(var v of did) {
if(v.startsWith("did:")) {
did = v.split("@")[0];
}
}
button.style.background = "#ff000040";
button.addEventListener("click", async () => {
let locale = getLocale();
if (window.confirm(TL[locale].replace("{handle}", handle).replace("{did}", did))) {
await fetch(account.pdsUrl+"xrpc/com.atproto.repo.createRecord", {
method: "POST",
headers: {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0",
"Accept": "*/*",
"Content-Type": "application/json",
"Authorization": "Bearer " + account.accessJwt,
"Origin": "https://bsky.app",
},
body: JSON.stringify({
collection: "app.bsky.graph.block",
repo: account.did,
record: {
subject: did,
createdAt: new Date().toISOString(),
$type: "app.bsky.graph.block"
}
})
});
}
});
}, 30)
});
}
}
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
const dropdowns = document.querySelectorAll('[data-testid="postDropdownBtn"]');
for (var dropdown of dropdowns) {
addButtonToDropdown(dropdown);
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
})();
})();