/
main.js
103 lines (92 loc) · 3.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
let DOM = {}
const bodyExp = /<body>(?<body>[^]+?)<\/body>/gm
const parser = new DOMParser()
async function sleep(timeInMillis = 1000) {
return new Promise((resolve) => setTimeout(resolve, timeInMillis))
}
async function doesSupportCORS() {
const url = `https://old.meneame.net`
try {
await fetch(url)
return true
} catch (e) {
return false
}
}
async function getPageComments(username, page) {
const url = `https://old.meneame.net/user/${username}/commented?page=${page}`
const response = await fetch(url)
const html = (await response.text()) || ''
const container = parser.parseFromString(html, 'text/html')
const commentsCollection = container.getElementsByClassName('comment-text')
return commentsCollection.length
? Array.from(commentsCollection).map((i) => i.innerText.trim())
: []
}
async function getAllComments(username, maxPages = 0) {
const comments = []
let page = 1
while (true) {
console.log('Getting page', page)
const results = await getPageComments(username, page)
if (!results.length) break
comments.push(...results)
page++
if (maxPages && page > maxPages) break
await sleep(10)
}
return comments
}
async function findUserComments(username, str, maxPages) {
const comments = await getAllComments(username, maxPages)
return comments.filter((i) => i.includes(str))
}
async function performSearch() {
const username = DOM.usernameInput.value.trim()
const searchQuery = DOM.searchQueryInput.value.trim()
const maxComments = Number(DOM.maxPagesInput.value)
if (!username || !searchQuery || !searchQuery) {
alert('Por favor rellena todos los campos del formulario')
return
}
const maxPages = Math.ceil(maxComments / 25)
DOM.resultsContainer.innerHTML = ''
DOM.loader.removeAttribute('hidden', true)
let formattedResults
const results = await findUserComments(username, searchQuery, maxPages)
if (results.length) {
formattedResults = results.map((i) => {
const formattedComment = i
.replaceAll(
searchQuery || null,
`<span class="match-string">${searchQuery}</span>`
)
.replaceAll('\n', '<br/>')
return `<div class="comment">${formattedComment}</div>`
})
} else {
formattedResults = [
'<div class="no_results">No se han encontrado resultados</div>',
]
}
DOM.loader.setAttribute('hidden', true)
DOM.resultsContainer.innerHTML = formattedResults.join('')
}
window.addEventListener('DOMContentLoaded', async (event) => {
DOM = {
submitButton: document.getElementById('submitButton'),
usernameInput: document.getElementById('usernameInput'),
maxPagesInput: document.getElementById('maxPagesInput'),
searchQueryInput: document.getElementById('searchQueryInput'),
resultsContainer: document.getElementById('resultsContainer'),
loader: document.getElementById('loader'),
disclaimer: document.getElementById('disclaimer'),
form: document.getElementById('form'),
}
DOM.submitButton.addEventListener('click', performSearch)
if (!(await doesSupportCORS())) {
console.log('CORS are not supported')
disclaimer.removeAttribute('hidden')
form.setAttribute('disabled', 'true')
}
})