-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.js
276 lines (227 loc) · 8.17 KB
/
main.js
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
const select = document.getElementById("user-select");
const botaoUser = document.getElementById("buscarUser");
const botaoUnf = document.getElementById("buscarUnf");
const salvo = recuperarLocalStorage("users");
let cursorFollowers = null;
let cursorFollows = null;
select.addEventListener("change", function() {
if (select.value === "") {
botaoUser.style.width = "100%";
botaoUnf.style.display = "none";
} else {
botaoUser.style.width = "49%";
botaoUnf.style.width = "49%";
botaoUnf.style.display = "inline-block";
}
});
function salvarLocalStorage(chave, informacao) {
localStorage.setItem(chave, JSON.stringify(informacao));
}
function recuperarLocalStorage(chave) {
const dados = localStorage.getItem(chave);
return dados ? JSON.parse(dados) : null;
}
function apagarLocalStorage() {
localStorage.removeItem("users");
location.reload();
}
function salvarUser(handle) {
let users = recuperarLocalStorage("users") ?? [];
if (!users.includes(handle)) {
users.push(handle);
}
salvarLocalStorage("users", users);
}
if (salvo) {
salvo.forEach(handle => {
const option = document.createElement('option');
option.value = handle;
option.textContent = handle;
select.appendChild(option);
});
}
function mostrarUnfollowers(dados) {
let html = "";
if (dados && dados.length > 0) {
document.getElementById("total").innerHTML = dados.length;
document.getElementById("unfollowers").style.display = "inline-block";
dados.forEach(user => {
html += `
<a target="_blank" href="https://bsky.app/profile/${user.handle}" class="no-underline">
<div class="flex items-center p-2.5 border-b border-gray-300 bg-white text-black text-left transition-colors duration-300 ease-in-out hover:bg-gray-200">
<div>
<img src="${user.avatar}" class="w-12 h-12 rounded-full mr-3" alt="Avatar do usuário selecionado">
</div>
<div>
${user.displayName || "Sem nome de perfil"} <br>
@${user.handle || "Sem nome de usuário"}
</div>
</div>
</a>`;
});
} else {
html = "<p>Sem Dados.</p>";
}
document.getElementById("users").innerHTML = html;
}
function mostrarUser(dados) {
let html = "";
const userContainer = document.getElementById("user-container");
const { avatar, displayName, handle } = dados;
html += `
<p class="pb-1 text-start text-sm font-medium text-black">Usuário selecionado:</p>
<a target="_blank" href="https://bsky.app/profile/${handle}" class="no-underline">
<div class="flex items-center p-2.5 border-b border-gray-300 bg-white text-black text-left transition-colors duration-300 ease-in-out hover:bg-gray-200">
<div>
<img src="${avatar}" class="w-12 h-12 rounded-full mr-3" alt="Avatar do usuário que não segue de volta">
</div>
<div>
${displayName || "Sem nome de perfil"} <br>
@${handle || "Sem nome de usuário"}
</div>
</div>
</a>`;
userContainer.innerHTML = html;
userContainer.style.display = "inline-block";
}
function carregando(valor) {
const msg = document.getElementById("mensagem");
msg.style.display = valor ? "flex" : "none";
return valor === "";
}
function mostrarComoUsar() {
const comoUsar = document.getElementById("como-usar");
const button = document.getElementById("como-usar-btn");
if(comoUsar.style.display === "none") {
comoUsar.style.display = "flex";
button.innerText = "Fechar";
} else {
comoUsar.style.display = "none";
button.innerText = "Como Usar";
}
}
async function getProfile(handle) {
try {
let url = `https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=${handle}`;
let dados = await fetch(url);
if (!dados.ok) {
console.error("Erro ao recuperar perfil.");
return null;
}
let data = await dados.json();
return { avatar: data.avatar, displayName: data.displayName, handle: data.handle };
} catch (erro) {
console.error("Erro ao recuperar perfil:", erro);
return null;
}
}
async function getFollowers(user) {
try {
let proxima = true;
let data = [];
while (proxima) {
let url = `https://public.api.bsky.app/xrpc/app.bsky.graph.getFollowers?actor=${user}&limit=100`;
if (cursorFollowers) {
url += `&cursor=${cursorFollowers}`;
}
let dadosRecebidos = await fetch(url);
if (!dadosRecebidos.ok) {
console.error("Erro ao recuperar seguidores.");
break;
}
let dados = await dadosRecebidos.json();
data.push(dados);
cursorFollowers = dados.cursor;
proxima = cursorFollowers != null;
}
let followers = [];
data.forEach(set => {
followers = followers.concat(set.followers);
});
return followers;
} catch (erro) {
console.error("Erro ao recuperar seguidores:", erro);
return [];
}
}
async function getFollows(user) {
try {
let proxima = true;
let data = [];
while (proxima) {
let url = `https://public.api.bsky.app/xrpc/app.bsky.graph.getFollows?actor=${user}&limit=100`;
if (cursorFollows) {
url += `&cursor=${cursorFollows}`;
}
let dadosRecebidos = await fetch(url);
if (!dadosRecebidos.ok) {
console.error("Erro ao recuperar seguidos.");
break;
}
let dados = await dadosRecebidos.json();
data.push(dados);
cursorFollows = dados.cursor;
proxima = cursorFollows != null;
}
let follows = [];
data.forEach(set => {
follows = follows.concat(set.follows);
});
return follows;
} catch (error) {
console.error("Erro ao recuperar seguidos:", error);
return [];
}
}
async function findUnfollowers(handle) {
const followers = await getFollowers(handle);
const follows = await getFollows(handle);
if (followers && follows) {
let unfollowers = follows.filter(follow => {
return !followers.some(follower => follower.did === follow.did);
});
return { unfollowers };
}
return { unfollowers: [] };
}
async function notFollowingBack() {
const handle = document.getElementById("user-select").value;
if (handle === "") {
alert("Por favor, selecione um usuário.");
return;
}
if (carregando(handle)) return;
const dadosUser = await getProfile(handle);
const data = await findUnfollowers(handle);
mostrarUser(dadosUser);
mostrarUnfollowers(data.unfollowers);
document.getElementById("mensagem").style.display = "none";
salvarUser(document.getElementById("user-select").value)
}
async function buscarUsers() {
const query = document.getElementById("user").value;
const select = document.getElementById("user-select");
if (!query) {
alert("Por favor, insira um nome de usuário para realizar a busca.");
return;
}
try {
const retorno = await fetch(`https://public.api.bsky.app/xrpc/app.bsky.actor.searchActors?q=${query}&limit=100`);
if (!retorno.ok) {
throw new Error("Erro ao buscar usuários");
}
const data = await retorno.json();
if (data.actors.length === 0) {
alert("Nenhum usuário encontrado.");
return;
}
data.actors.forEach(user => {
const option = document.createElement("option");
option.value = user.handle;
option.textContent = user.handle;
select.appendChild(option);
});
} catch (erro) {
alert(`Erro: ${erro.message}`);
}
}