Varulv Rösträknare som bokmärke

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:
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.
 
Back
Top