Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // SPOSÓB UŻYCIA:
- // Otworzyć w przeglądarce Firefox / Opera / Chrome stronę z wpisem
- // otworzyć konsolę (CTRL+SHIFT+K w Fx, CTRL+SHIFT+J w Chrome/Opera)
- // wkleić poniższy kod do konsoli i go wykonać (Enter)
- // rozwiń listę plusujacych
- var vajax = document.getElementsByClassName('showVoters ajax');
- if(vajax.length>0)
- vajax[0].click();
- console.log(new Date().toISOString()); // Data losowania
- alert('Lista plusujących rozwinięta'); // taki workaround, żeby nie bawić się w czekanie na AJAX-a (ale chyba tylko @ Firefox - w innych rozwiń ręcznie lub odpal skrypt 2 razy)
- //////////////////////////////////////////////////////////////
- /////////// zebranie danych z komentarzy
- //////////////////////////////////////////////////////////////
- var cmnts = document.getElementsByClassName('sub')[0].getElementsByClassName('author ellipsis'); // komentarze do wpisu
- var i, j, k, s='', name, prefs, maxPrefs=0, userPrefs, txts, txt, tm, tm0, cnt=0, rejected='';
- var preferences = [], notVoters='';
- // najpierw zebranie listy plusujących
- var vs = ',';
- var vl = document.getElementsByClassName('voters-list')[0].getElementsByTagName('a');
- for(var i=0; i<vl.length; ++i)
- vs += vl[i].innerHTML;
- vs+=',';
- // a tu szukamy już komentarzy z głosami w formacie [[1,2,3,...]] (dopuszczalne spacje i inne białe znaki za cyframi i przecinkami)
- for(i=0; i<cmnts.length; ++i)
- {
- name = cmnts[i].children[0].children[0].innerHTML;
- txts = cmnts[i].parentNode.getElementsByClassName('text');
- if(txts.length>0 && txts[0])
- {
- txt = txts[0].innerHTML;
- tm = txt.match(/\[\[\s*\d+\s*(,\s*\d+\s*)*\]\]/);
- // tm = txt.match(/\[{1,2}\s*\d+\s*(,\s*\d+\s*)*\]{1,2}/); // odkomentować, jeśli dopuszczamy też głosy z pojedynczymi nawiasami kwadratowymi
- if(tm)
- {
- // tm0 = tm[0].replace(/^\[([^\[])/, "[[$1"); // [ -> [[
- // tm0 = tm0.replace(/([^\[])\]$/, "$1]]"); // ] -> ]]
- // tm0 = tm0.replace(/\s*/g, '').replace(/\[/g, '').replace(/\]/g, '');
- tm0 = tm[0].replace(/\s*/g, '').replace(/\[/g, '').replace(/\]/g, '');
- prefs = tm0.split(',');
- prefs2 = Array.from(new Set(prefs)); // usuwamy duplikaty...
- if(prefs2.length != prefs.length)
- {
- alert('Zdublowane... Czyżby próba oszustwa?\n'+name);
- continue;
- }
- // czy zaplusowal(a) pierwszy wpis?
- if(vs.indexOf(','+name+',') == -1)
- {
- notVoters += name+',';
- continue; // zakomentować, jeśli nie dyskwalifikujemy tych, co nie zaplusowali
- }
- userPrefs = {};
- userPrefs.name = name;
- userPrefs.prefs = prefs2;
- preferences.push(userPrefs);
- if(prefs.length > maxPrefs) // szukamy w listach preferencji najwyższego numeru nagrody
- maxPrefs = prefs.length;
- }
- else
- { // Tu sobie zapisujemy odrzucone komentarze - odrzucone ze względu na brak poprawnego głosu: [[w, x, y, z]]
- rejected += name +': ' + txt.replace(/\s+/g, ' ').replace(/(<([^>]+)>)/ig,"").replace(/^\s+|\s+$/g,"") +'\n-----------------------\n';
- }
- }
- } // for(i)
- console.log('----------------\nNie zaplusowali:\n' + notVoters);
- console.log('----------------\nOdrzucone komentarze:\n' + rejected);
- /////////// lista chętnych na kolejne nagrody - wraz z informacją o pozycji na liście preferencji danego użytkownika
- var items = [];
- for(j=0; j<maxPrefs; ++j)
- {
- for(i=0; i<preferences.length; ++i)
- {
- if(preferences[i].prefs.length>0 && preferences[i].prefs[0]>0)
- {
- if(items[preferences[i].prefs[0]] == undefined)
- {
- items[preferences[i].prefs[0]] = [];
- }
- var playerPri = {};
- playerPri.name = preferences[i].name;
- playerPri.priority = j;
- playerPri.item = preferences[i].prefs[0];
- items[preferences[i].prefs[0]].push(playerPri);
- // items[preferences[i].prefs[0]].push(preferences[i].name +'('+ j + ')');
- preferences[i].prefs.shift();
- }
- }
- }
- //////////////////////////////////////////////////////////////
- // zwraca listę nagród wraz z zainteresowanymi (i priorytetem wg listy preferencji użytkownika)
- //////////////////////////////////////////////////////////////
- function listUsersPerItems(arr)
- {
- var i, j, out='';
- for(i=0; i<arr.length; ++i)
- {
- if(arr[i] == undefined)
- continue;
- // var il = arr[i].split(',').length - 1;
- var il = arr[i].length;
- if(arr[i].length>0)
- out += (arr[i][0].item<10?' ':'') + arr[i][0].item + '(' + il + '): ';
- for(j=0; j<arr[i].length; ++j)
- out += arr[i][j].name + '(' + arr[i][j].priority + '), ';
- out += '\n';
- }
- return out;
- }
- //console.log(listUsersPerItems(items));
- //console.log(items.length);
- items.sort(function(a, b) {
- return a.length - b.length;
- }); // posortowanie - od najmniej pożądanej pozycji, do najbardziej
- //console.log(items.length);
- console.log('----------------------------\nLista nagród wraz listą zainteresowanych:\n' + listUsersPerItems(items)); // wypisanie uczestników w podziale na nagrody
- // rozdajemy/losujemy
- //var firstTime = true; ////TEMP EDIT: żeby 4 wylosować dwa razy
- var luckVsOptimalFactor = 4; // współczynnik definiujący, jak bardzo preferować tych, którzy mieli losowaną nagrodę wyżej na liście
- // 0 - wszyscy są traktowani po równo, max = liczba nagród - szanse )
- var winner, winners = [], pos, maxLuck, luckRuler, curLuckRange, rand;
- for(i=0; i<items.length; ++i)
- {
- if(items[i] == undefined || items[i].length<1
- // || items[i][0].item==15 ////TEMP EDIT: nagroda #15 chyba nic nie warta, więc jej też nie losujemy
- )
- continue;
- winner = {};
- if(items[i].length==1)
- {
- // wygrywa, bo nie było innych chętnych
- winner.name = items[i][0].name;
- winner.item = items[i][0].item;
- winner.priority = items[i][0].priority;
- winners.push(winner);
- //alert(winner.name);
- } // if 1 chętny
- else
- { // więcej chętnych
- maxLuck = items.length;
- luckRuler = [];
- luckRangeSum = 0;
- for(k=0; k<items[i].length; ++k)
- {
- curLuckRange = maxLuck - items[i][k].priority * luckVsOptimalFactor;
- if(curLuckRange<1) // żeby dać jakieś minimalne szanse nawet tym, którzy wg współczynnika luckVsOptimalFactor
- curLuckRange = 1; // nie powinni już być brani pod uwagę. W przeciwnym razie można zakomentować te 2 linijki
- ; // tak na wypadek nieumiejętnego zakomentowania powyższej linijki i pozostawienie samego ifa
- luckRangeSum += curLuckRange;
- luckRuler.push(luckRangeSum); // każdy chętny dostaje swój przedział
- }
- rand = (Math.round(Math.random() * 1000000) + new Date().getTime() + items[i].length + luckRangeSum) % luckRangeSum; // losujemy liczbę...
- //alert(luckRuler.toString() + '\nrand='+rand+'\nluckRangeSum='+luckRangeSum);
- k=0;
- while(rand > luckRuler[k]) // ... i sprawdzamy do czyjego przedziału wpadła
- ++k;
- winner.name = items[i][k].name;
- winner.item = items[i][k].item;
- winner.priority = items[i][k].priority;
- winners.push(winner); // dodajemy zwycięzcę do listy
- } // else
- // usuwamy zwycięzce z pozostałych list - żeby nie wygrał ponownie
- for(j=i+1; j<items.length; ++j)
- {
- if(items[j] != undefined && items[j].length>0 && winner.name != undefined)
- {
- pos = items[j].map(function(e) { return e.name; }).indexOf(winner.name);
- if(pos>=0)
- items[j].splice(pos, 1);
- }
- } // for (j)
- // //// TEMP EDIT: gra #4 jest dwa razy {
- // if(items[i][0].item==4 && firstTime)
- // {
- // firstTime = false;
- // --i;
- // TODO: usunąć zwycięzce z bieżącej listy - bo normalnie usuwamy tylko z kolejnych
- // }
- // //// TEMP EDIT - gra $4 KONIEC }
- } // for(i)
- ////////////////////////////////////////////////
- // Funkcja drukująca (w konsoli) zwycięzców
- //////////////////////////////////////////////
- function printWinners(arr)
- {
- var out='------------\nZwycięzcy:\n';
- for(var i=0; i<arr.length; ++i)
- {
- out += arr[i].name + ' - ' + arr[i].item + '(' + arr[i].priority + ')\n';
- }
- // return out;
- console.log(out);
- }
- /*
- // Opcjonalne sortowanie zwycięzców wg kolejności nagród (w przeciwnym razie jest od najmniej popularnej/pożądanej do najbardziej)
- winners.sort(function(a, b) {
- return a.item - b.item;
- });
- */
- printWinners(winners);
- // TODO: uporządkować
Advertisement
Add Comment
Please, Sign In to add comment