damogn
Hero
- Joined
- 4 Feb 2018
- Messages
- 1,010
Om rösträknaren är nere så kan man räkna röster med hjälp av sin egen webbläsare:
1) Skapa ett bokmärke (på vilken sida som helst).
2) Editera det. Sätt namn till vad som helst (t.ex. Rösträknare).
3) I URL tar du bort allt som står och klistrar in allt detta:
När du sedan öppnar en runda och trycker på bokmärket (och väntar 2 sekunder) så kan du sedan scrolla till slutet av sidan och se röstläget.
Scriptet räknar röster genom att titta efter rader som innehåller Röst: och sen användarnamn via regex
const voteRegex = /Röst:\s*@?([A-Za-z0-9_åäöÅÄÖ\- ]+)/;
som t.ex.
Röst: Användarnamn
Röst: @Användarnamn
Alltså
- Kräver exakt texten Röst:
- Tillåter mellanslag
- Tillåter ett frivilligt @
- Fångar sedan namnet
Detta script kan ändras för att fånga på andra sätt. Testa det och säg till vad som ska ändras.
1) Skapa ett bokmärke (på vilken sida som helst).
2) Editera det. Sätt namn till vad som helst (t.ex. Rösträknare).
3) I URL tar du bort allt som står och klistrar in allt detta:
Code:
javascript:(async function(){
const currentUrl=window.location.href;
const match=currentUrl.match(/(https:\/\/www\.rollspel\.nu\/threads\/[^\/]+\/)/);
if(!match){alert("Kunde inte hitta trådens URL.");return;}
const threadUrl=match[1];
const voteRegex=/Röst:\s*@?([A-Za-z0-9_åäöÅÄÖ\- ]+)/;
const votes=[];
for(let page=1;page<=50;page++){
const url=page===1?threadUrl:`${threadUrl}page-${page}`;
try{
const response=await fetch(url);
if(!response.ok)throw new Error(`Misslyckades att hämta sida ${page}`);
const html=await response.text();
const parser=new DOMParser();
const doc=parser.parseFromString(html,'text/html');
const posts=doc.querySelectorAll('article[data-author]');
posts.forEach(post=>{
const username=post.getAttribute('data-author');
post.querySelectorAll('blockquote').forEach(bq=>bq.remove());
const content=post.querySelector('.message-content')?.innerHTML;
const postId=post.id?.replace('js-post-','');
if(content){
const tempDiv=document.createElement('div');
tempDiv.innerHTML=content;
const cleanContent=tempDiv.textContent||tempDiv.innerText;
cleanContent.split('\n').forEach(line=>{
const match=line.match(voteRegex);
if(match&&postId){
votes.push({from:username,to:match[1],postId});
}
});
}
});
const nextPage=doc.querySelector('.pageNav-jump--next');
if(!nextPage)break;
}catch(err){
console.error(err);
break;
}
}
const votesByUser={};
votes.forEach(v=>{
if(!votesByUser[v.from])votesByUser[v.from]=[];
votesByUser[v.from].push(v);
});
const voteCounts={};
Object.values(votesByUser).forEach(voteList=>{
voteList.forEach(v=>{
voteCounts[v.to]=(voteCounts[v.to]||0)+1;
});
});
let mostVoted=null;
let mostVotes=-1;
for(const[person,count]of Object.entries(voteCounts)){
if(count>mostVotes){
mostVotes=count;
mostVoted=person;
}
}
const table=document.createElement('table');
table.style.borderCollapse='collapse';
table.style.marginTop='20px';
table.style.fontFamily='Arial, sans-serif';
table.style.width='100%';
table.style.maxWidth='800px';
table.style.margin='20px auto';
table.style.border='2px solid #333';
table.style.backgroundColor='#f4f4f9';
table.innerHTML=`<thead>
<tr>
<th style="border:1px solid #333;background-color:#3c8dbc;color:white;padding:8px;font-size:18px;">Röstgivare</th>
<th style="border:1px solid #333;background-color:#3c8dbc;color:white;padding:8px;font-size:18px;">Röster</th>
</tr>
</thead>`;
const tbody=document.createElement('tbody');
Object.entries(votesByUser).forEach(([from,voteList])=>{
const tr=document.createElement('tr');
tr.style.backgroundColor='#ffffff';
tr.style.borderBottom='1px solid #ddd';
const voteLinks=voteList.map(v=>
`<a href="${threadUrl}post-${v.postId}" target="_blank" style="color:#007bff;">${v.to}</a>`
);
tr.innerHTML=`
<td style="border:1px solid #333;padding:8px;text-align:center;font-size:16px;">${from}</td>
<td style="border:1px solid #333;padding:8px;text-align:center;font-size:16px;">${voteLinks.join(', ')}</td>
`;
tbody.appendChild(tr);
});
table.appendChild(tbody);
document.body.appendChild(table);
const hr=document.createElement('hr');
hr.style.margin='20px 0';
hr.style.borderTop='3px solid #333';
document.body.appendChild(hr);
const dangerText=document.createElement('div');
dangerText.textContent=`Risk för utröstning: ${mostVoted} (${mostVotes})`;
dangerText.style.fontSize='22px';
dangerText.style.fontWeight='bold';
dangerText.style.color='#d9534f';
dangerText.style.textAlign='center';
document.body.appendChild(dangerText);
})();
När du sedan öppnar en runda och trycker på bokmärket (och väntar 2 sekunder) så kan du sedan scrolla till slutet av sidan och se röstläget.
Scriptet räknar röster genom att titta efter rader som innehåller Röst: och sen användarnamn via regex
const voteRegex = /Röst:\s*@?([A-Za-z0-9_åäöÅÄÖ\- ]+)/;
som t.ex.
Röst: Användarnamn
Röst: @Användarnamn
Alltså
- Kräver exakt texten Röst:
- Tillåter mellanslag
- Tillåter ett frivilligt @
- Fångar sedan namnet
Detta script kan ändras för att fånga på andra sätt. Testa det och säg till vad som ska ändras.