Tietääkö kukaan toimiiko joku Firefoxin tai Google Chromen ignore-plugari luotettavasti ja helposti ohjelmointiputkassa? Onko kellään valmista konffia mihinkään?
Siis laajasti käytössä oleville foorumisoftillehan näitä löytyy helpommin, mutta ohjelmointiputkan softaa ei käsittääkseni ole missään muualla käytössä, joten ainoat jotka moisen mahdollisesti on konffannut löytynee täältä..
Niin, tietysti homma toimisi helpommin ja tehokkaammin, jos suoraan foorumisoftassa olisi ignore-toiminto. Mutta sellaista lie turha toivoa?
Kuvittelenko vaan, vai tiedänkö mihin tarvitset tätä? :D
Macro kirjoitti:
Kuvittelenko vaan, vai tiedänkö mihin tarvitset tätä? :D
Voihan se olla, että arvasit. Tarvitsisin sitä mielenterveyteni säilyttämiseen.
Sen verran voin vielä tarkentaa, että moinen on ollut kyllä mielessä jo pidemmän aikaa, ainakin puoli vuotta. Ja tilanne on koko ajan asteittain pahentunut.
Ellei kenelläkään ole jo valmiina moista, helpoin tietämäni tapa on käyttää Firefoxia ja siihen Greasemonkey-lisäosaa, jonka avulla nettisivuja voi manipuloida javascriptillä.
Tässä pikaisesti tekemäni raakile, jota saa vapaasti muokata ja levittää. Jatkokehitysidea halukkaalle: piilotettu viesti korvautuu linkillä, joka tuo viestin takaisin näkyviin.
Ohjeet:
- asenna Firefoxiisi Greasemonkey
- tallenna alla oleva skripti koneellesi tiedostoon op_ignore.user.js
- muokkaa koodiin usersToIgnore-kohtaan estettävät käyttäjät
- avaa kyseinen tiedosto Firefoxilla: Tiedosto -> Avaa tiedosto..., asenna ja käytä (Greasemonkey tunnistaa skriptin omakseen .user.js-päätteestä)
- selaimen alareunasta apinan kuvasta voit säätää skriptin toimintaa
// ==UserScript== // @name Ohjelmointiputka ignore // @namespace opscripts // @description Removes posts of specified authors in a thread // @include https://www.ohjelmointiputka.net/keskustelu/aihe.php* // ==/UserScript== var usersToIgnore = ["estettavanKayttajanNimimerkki", "toinenEstettava"]; function ignoreComment(commentNode) { commentAs = commentNode.getElementsByTagName('a'); if (commentAs.length >= 2) { for (var i = 0; i < usersToIgnore.length; i++) { if (commentAs[1].innerHTML == usersToIgnore[i]) { return true; } } } return false; } // find all comment headers var allComments = document.evaluate( "//tr[@class='taulukkoyla']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (i = 0; i < allComments.snapshotLength; i++) { thisComment = allComments.snapshotItem(i); if (ignoreComment(thisComment)) { thisComment.innerHTML = "<td colspan='3'>(poistettu)</td>"; // comment header thisComment.nextSibling.style.display = "None"; // comment content } }
Näyttää mahtavan yksinkertaiselta. Tuotahan voisi jopa jatkokehittää jossain välissä jos olisi aikaa. Mulla on jo valmiiksi jatkokehitysideakin. Käyttäjän vieressä tai vaikka sen nimeä oikealla klikkaamalla voisi olla linkki ignoraamiseen ja sitten ignoraus voisi olla voimassa esim. 3 kk, jos vaikka myöhemmin parantaa tapansa. Saisihan sen sitten 3kk päästä helposti uudelleen ignoreen.
Oli ihan pakko itsekkin testata, hyvältä näyttää.
Pitää kyllä testata, että viittii jatkossa käydä täällä...
Kiitos. Toimii hyvin. Jotenkin ei itellä käynyt mielessä Greasemonkey.
EDIT: PEELO - Paradoksaalisen Eeppinen Estotoiminto Lokalisoituna Ohjelmointiputkaan
EDIT2: Vanha linkki poistettu
Hienoa, kiitos!
Tässä on vaihtoehtoinen menetelmä, joka piilottaa kaikki viestit. Viestin pääsee lukemaan viemällä hiiren lähettäjärivin päälle. Koodi on CSS:ää ja toimii ainakin Fx 3.5:llä. (Ei ole aivan korrektia kaikilta osin.) Koodissa on Firefoxin tukema URL-valitsin, jolla sen saa rajattua keskusteluihin. Koodin saa helposti käyttöön Stylish-lisäosalla tai kirjoittamalla käyttäjän CSS-tiedostoon.
@-moz-document url-prefix("https://www.ohjelmointiputka.net/keskustelu/aihe.php") { table { border-collapse: separate; border-spacing: 0; } tr.taulukkoyla td { border: 1px solid white; } tr.taulukkoyla + tr { display: none; } tr.taulukkoyla:hover + tr, tr.taulukkoyla + tr:hover { display: block; position: absolute; margin-left: 2em; margin-top: -3px; border: 2px solid black; background-color: white; } }
Kiitos avusta. Jos kuitenkin ymmärsin oikein, että tuo piilottaa kaikkien käyttäjien viestit, niin siitä ei ainakaan minulle ole mitään hyötyä.
Siis kyllähän minä itsekin osaan hypätä viestin yli jos satun muistamaan että kirjoittaja on ignoraamisen arvoinen. Ongelma tulee lähinnä siinä kun viikon parin päästä on unohtanut ja taas vastannut käyttäjälle ja vasta jossain kolmannen viestin kohdalla, kun v-käyrä on jo taivaissa, muistaa mistä käyttäjästä oli kysymys.
Siinä tapauksessa riittäisi myös yksinkertainen korostus:
a[href^="profiili.php"][href$="id=6298"] { color: red; text-decoration: line-through; }
Mitäs näitä enää heittelemään, kun JS-ratkaisukin jo annettiin... Mutta ehkä joku joskus lukee ja oppii CSS:ää. :)
EDIT: PEELO - Paradoksaalisen Eeppinen Estotoiminto Lokalisoituna Ohjelmointiputkaan
EDIT2: Vanha linkki poistettu
Loistava skripti, kiitos siitä. Tässä tuo tsurigan skripti pienillä muutoksilla jotta toimii myös Operassa user-js:nä, testattu toimivaksi uusimmalla versiolla. En tosin ole testannut toimiiko enää greasemonkey:lla, mutta toivottavasti :P.
// ==UserScript== // @name Ohjelmointiputka ignore // @namespace opscripts // @description Adds cookie based ignore feature // @include https://www.ohjelmointiputka.net/keskustelu/aihe.php* // @version 1.3.2 // @todo Moderator compliance // ==/UserScript== /* Opera: turn this script on only for ohjelmointiputka.net/keskustelu/aihe.php */ if( location.hostname.indexOf('ohjelmointiputka.net') != -1 && location.pathname.indexOf('keskustelu/aihe.php') != -1) { /** CONFIG BEGIN */ /* The length of ignores */ var ignoreDays = 90; /* Your nickname */ var self = ''; /** FUNCTIONS BEGIN */ /* Opera: unsafeWindow object */ if (navigator.appName.indexOf('Opera') != -1) { var unsafeWindow = window; } // ECMAScript only const IGNOREADD = 1; const IGNOREREMOVE = 2; const IGNORERESET = 3; var controls = function() { return '<td align="right" width="0%">' + arguments[0] + '</td><td>' + arguments[1] + '</td>'; }; var toggleLink = function (text) { return '<a onclick="toggleComment(this);" ' + 'style="text-decoration: underline;">' + text + '</a>'; }; var muteLink = function (operation, name) { return '<a onclick="setIgnoreCookie(' + operation + ', ' + '\'' + name + '\');" ' + 'style="text-decoration: underline;">' + ((operation == IGNOREADD) ? 'Estä': 'Salli') + '</a>'; }; var commentOn = function (username, headerNode, quoteNode) { return '<td width="100%">' + headerNode + '</td>' + controls( toggleLink('Piilota'), quoteNode ); }; var commentOff = function (username, messageId) { return '<td width="100%" style="color: #666; ' + 'font-style: italic; font-weight: bold;">' + '<a name="' + messageId + '"></a>' + username + '</td>' + controls( toggleLink('Näytä'), muteLink(IGNOREREMOVE, username) ); }; var messages = {}; var ignores = {}; /* Determines whether to ignore a comment */ function toIgnore(commentNode) { commentAs = commentNode.getElementsByTagName('a'); var author = ''; if (commentAs.length >= 2) { author = commentAs[1].textContent; for (var username in ignores) { if (author === username) { // Parse message properties var messageId = commentAs[0].name; var headerNode = commentAs[0].parentNode.innerHTML; var quoteNode = commentAs[2].parentNode.innerHTML; messages[messageId] = { 'username': username, 'headerNode': headerNode, 'quoteNode': quoteNode }; return commentAs[2]; } }; } return author; } /* Reads all ignores from a cookie */ function fetchignores() { var cookies = unescape(document.cookie); if (cookies.length > 0) { var ps = cookies.indexOf('ignored=') + 8; if (ps !== 7) { var pe = cookies.indexOf(';', ps) - 8; if (pe === -9) { pe = cookies.length; } var ignoreList = cookies.substr(ps, pe).split('|'); var changed = false; ignoreList.forEach(function (ignore) { var pair = ignore.split(','); var username = pair[0]; var exDate = pair[1]; // See whether user's ignore is still on if (new Date() < exDate) { ignores[username] = exDate; } else { changed = true; } }); // Reset cookie if some ignores were removed if (changed) { unsafeWindow.setIgnoreCookie(IGNORERESET); } } } } /* Sets ignore cookie */ unsafeWindow.setIgnoreCookie = function (operation, name) { var exDate = new Date(); exDate.setDate(exDate.getDate() + ignoreDays); if (operation === IGNOREADD) { ignores[name] = exDate.valueOf(); } else if (operation === IGNOREREMOVE) { delete ignores[name]; } var ignoreList = ''; for (var username in ignores) { ignoreList += '|' + username + ',' + ignores[username]; } ignoreList = ignoreList.substr(1); // Set cookie or delete it if there's no one on the ignore list document.cookie = 'ignored=' + escape(ignoreList) + ';expires=' + ((ignoreList.length !== 0) ? exDate.toGMTString(): 'Thu, 01-Jan-1970 00:00:01 GMT'); // Reload to see changes live if (operation !== IGNORERESET) { location.reload(); } }; /* Toggles comment visibility */ unsafeWindow.toggleComment = function(a) { var commentHeader = a.parentNode.parentNode; var commentNode = commentHeader.nextSibling; // Get the id from the message's empty anchor tag var messageId = a.parentNode .previousSibling.firstChild.name; // Show if (commentNode.style.display === 'none') { commentHeader.innerHTML = commentOn( messages[messageId].username, messages[messageId].headerNode, messages[messageId].quoteNode ); commentNode.style.display = 'block'; } // Hide else { commentHeader.innerHTML = commentOff( messages[messageId].username, messageId ); commentNode.style.display = 'none'; } }; function runIgnoreScript() { /** ACTION BEGIN */ // list all ignored users fetchignores(); // find all comment headers var allComments = document.evaluate( "//tr[@class='taulukkoyla']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); /* * Hide all ignored users' comments and * add ignore links. */ for (var i = 0; i < allComments.snapshotLength; i++) { var comment = allComments.snapshotItem(i); var a = toIgnore(comment); //alert(a); // Hide ignored comment if (typeof a === 'object') { unsafeWindow.toggleComment(a); } // Add ignore link else if (a.length > 0 && a !== self) { comment.lastChild.innerHTML = muteLink(IGNOREADD, a); } } } if (navigator.appName.indexOf('Opera') != -1) { /* Opera needs this script to be run in onLoad */ document.addEventListener('load', function(event) { runIgnoreScript(); }, false); } else { /* in Greasemonky just run it */ runIgnoreScript(); } }
Pakko myöntää, että minulla ainakin oli aika rajoittunut kuva javascriptistä ennen tätä viestiketjua =D
edit:: kokeilinpa nyt niin itsensä estäminen on ainoa keino pästä muokkaamaan lähettämäänsä viestiä. liekö bugi vai feature? =P
edit2:: ja jostain kumman syystä tsurigan nimen kohdalla ei ole estä-linkkiä =D
ByteMan kirjoitti:
edit2:: ja jostain kumman syystä tsurigan nimen kohdalla ei ole estä-linkkiä =D
Muuta koodissa self-muuttujan sisältö. (Itse jouduin muuttamaan pari versiota sitten kyseisen muuttujan ownNick-nimiseksi, muuten heitti virheilmoitusta siitä rivistä, eikä koodi toiminut. Kenties jokin nimikonflikti.)
Jos tuohon vielä ehdotus kelpaa, niin oman nimimerkin voisi yrittää kaivaa sivulta (<p id="kirj">).
e.parentNode.previousSibling.firstChild is null
rivillä 281, 1.5.1 versiolla.
rivit 280-284
// Get the id from the message's empty anchor tag @ FIX!! var messageId = e.parentNode .previousSibling .firstChild .name;
tsuriga kirjoitti:
Operassa toimii kirjautuneena ihan hyvin, mutta iskee kirjautumattomana virhettä ensimmäisen estetyn viestin kohdalla. Sain toimimaan Operassa vain ottamalla eventListenerin pois ja ajamalla ronskisti suoraan. Johtusko siitä, että Opera tunnistaa .user.js-skriptit Greasemonkey-skripteiksi ja ajaa ne ymmärtääkseni muutenkin vasta kun sivu on valmis?
Vaikuttaa siltä että user-js skripteille ei ole mitään kiinteätä suoritusajankohtaa, ainakin itsellä tuon uusimman toiminta vaihteli. Välillä toimi oikeen, mutta useimmiten kaatuu rivillä 182 koska sideBar on null. Avaamalla Operan kehitystyökalun, skripti yllättäen toimiikin (enemmän javascriptia ajettavana, sivu kerkeää latautua ennen user-js:n ajoa?).
Mutta eventListenerin lisäämisen jälkeen koodi toimii oikein ainakin kirjautuneena, se miksi homma kaatuu kun skripti on käytössä kirjautumatta ei vielä selvinnyt.
Myös self muuttuja piti nimetä uudestaan kuten Chiman jo totesikin.
tsuriga: Millä Operan versiolla testasit tuota? Itsellä Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.2.15 Version/10.10, ajattelin jos tuossa user-js:n käsittelyssä on jokin asia muuttunut.
edit: Paitsi että eihän tuo toiminutkaan, estä linkit kyllä ilemstyvät ja niiden klikkaaminen kyllä lisää käyttäjän estolistalle, mutta viestiti jäävät näkyviin ja estetyn käyttäjän jälkeen tulevat estä-linkit häviävät.
Joo ei sitä aina näköjään muista ottaa omia konffeja (omaa nickiä) pois. Testailin samalla Operan versiolla, UA:ssa ei muuta eroa kuin Windowsin versio ja kieli.
http://www.opera.com/browser/tutorials/userjs/
To tell Opera that a script file uses Greasemonkey notation, the name of the file containing the script must end with .user.js. --
They are executed when the page completes loading, after creating the DOM for the page, but before running any onload handlers that have been defined.
Ottaapa tuosta nyt selvän jos kerran toiminta vaihtelee mielivaltaisesti :S.
Tuossa Milon pastessa lukeekin jo valmiiksi "FIX" kommentissa ;). Kyse on siis siitä, että toggle-funkkari pitää opettaa etsimään tuo messageId yhdellä ja samalla säännöllä, oltiinpa sitten kirjautuneita tai ei. Self jäi kummittelemaan ko Error Consoleen ei tullu siitä mitään erhettä, muutan seuraavaan versioon.
Ps. Tästäpä oppia, kuinka versionhallintaa ei kannata hoitaa :), ei nimittäin löydy itteltä noita vanhoja versioita ollenkaan.
tsuriga kirjoitti:
Joo ei sitä aina näköjään muista ottaa omia konffeja (omaa nickiä) pois. Testailin samalla Operan versiolla, UA:ssa ei muuta eroa kuin Windowsin versio ja kieli.
Hehe, kyllähän tuo ajetaan oikeassa kohdassa vasta sivun latauduttua, olin typottanut tuon user.js:n ;-). Mutta tuo Milon mainitsema virhe tulee Operalla riippumatta siitä onko kirjautuneena vai ei.
Tulikettu-3.5:lla ja rasva-apinalla tuli testattua. Siinähän sanottiin, että toimii rasva-apinalla ja oopperalla.
Varsin harmittavaa, että idiootit netissä on loppumaton luonnonvara. Ei sillä ettenkö itse olisi joskus käyttäytynyt tyhmästi, mutta sekin on ollut yleensä mielentilasta kiinni. Jatkuvalla syötöllä peeloilu on aina oma asiansa. Täten ehdotan laajennoksen suomenkieliseksi nimeksi Peeloa.
tsuriga kirjoitti:
Ps. Tästäpä oppia, kuinka versionhallintaa ei kannata hoitaa :), ei nimittäin löydy itteltä noita vanhoja versioita ollenkaan.
Ei muuta kuin projekti pystyyn jonnekin Sourceforgeen tms. :D
tsuriga kirjoitti:
Ps. Tästäpä oppia, kuinka versionhallintaa ei kannata hoitaa :), ei nimittäin löydy itteltä noita vanhoja versioita ollenkaan.
Windows alustalla työskentelevälle suosittelen tutustumaan Reliable Softwaren Code Co-Op versionhallinta ohjelmaan: http://www.relisoft.com/co_op/index.htm
Itse käytän tuota omissa Inferno projekteissani. On edullinen ja hyvä!
Miksi maksaa suljetusta windows-riippuvaisesta kun on olemassa git, subversion ja useita muita avoimia laajalti suurissa avoimen lähdekoodin projekteissa koeteltuja järjestelmiä?
Kray kirjoitti:
Miksi maksaa suljetusta windows-riippuvaisesta kun on olemassa git, subversion ja useita muita avoimia laajalti suurissa avoimen lähdekoodin projekteissa koeteltuja järjestelmiä?
Kuinka moni noista toimii ilman käyttöön omistettua palvelinta, sallii käyttöönoton minuutissa ilman asetusten säätämistä, tarjoaa visuaalisen differin, yksinkertaisen käyttöliittymän, wikin, ei tarvitse erillistä tietokantaa bugitietokannan ylläpitoon, yms ... ?
Miksi nykyään kaiken pitää olla ilmaista? Itse olen valmis maksamaan hyvästä ohjelmasta, mikä antaa mahdollisuuden keskittyä työntekoon turhan säätämisen sijaan.
jalski kirjoitti:
toimii ilman käyttöön omistettua palvelinta
git
jalski kirjoitti:
sallii käyttöönoton minuutissa ilman asetusten säätämistä
git
jalski kirjoitti:
tarjoaa visuaalisen differin, yksinkertaisen käyttöliittymän, wikin, ei tarvitse erillistä tietokantaa bugitietokannan ylläpitoon, yms ... ?
Näin vinkkinä, kyseessä ei ole versiohallinnan tehtävä. Monille näille löytyy kuitenkin helppokäyttöisiä frontendejä tarjoamaan tälläista toiminnallisuutta, tai käytetään hostauspalvelua, esim. sourceforge tai github.
Toi jalskin mainitseman firman sivuilla oleva vertailutaulukko on muuten siitä hassu että siellä ei ole esim. Gitiä tai Mercurialia. Herää hieman epäilys siitä, että vertailuun otetuista olisi jätetty mahdollisesti firman tuotteelle pärjäävät pois. Muutenkin hieman koomista pistää ominaisuudeksi "ilmainen tuki" kun vertailaan maksuttomiin softiin. Vai antaako noi tukea "ilmaista tukea" tuotteelleen vaikka sitä ei ostaisikaan...
Sinänsä olen kyllä samaa mieltä Jalskin kanssa, että usein löytyy toimiva ratkaisu jolla säästää aikaa ja vaivaa.
Kray kirjoitti:
jalski kirjoitti:
tarjoaa visuaalisen differin, yksinkertaisen käyttöliittymän, wikin, ei tarvitse erillistä tietokantaa bugitietokannan ylläpitoon, yms ... ?
Näin vinkkinä, kyseessä ei ole versiohallinnan tehtävä. Monille näille löytyy kuitenkin helppokäyttöisiä frontendejä tarjoamaan tälläista toiminnallisuutta, tai käytetään hostauspalvelua, esim. sourceforge tai github.
Minulle tuo on kyllä versionhallinnan tehtävä. Eikös versionhallinnan tehtävänä nimenomaan ole kehitysversioiden ja niissä tapahtuneiden muutosten helppo ylläpito?
Eikä tuota git:tiä nyt ihan minuutissa käyttöönoteta, lukematta ensin manuaalia ja opettelematta komentoja.
Grez kirjoitti:
Toi jalskin mainitseman firman sivuilla oleva vertailutaulukko on muuten siitä hassu että siellä ei ole esim. Gitiä tai Mercurialia. Herää hieman epäilys siitä, että vertailuun otetuista olisi jätetty mahdollisesti firman tuotteelle pärjäävät pois. Muutenkin hieman koomista pistää ominaisuudeksi "ilmainen tuki" kun vertailaan maksuttomiin softiin. Vai antaako noi tukea "ilmaista tukea" tuotteelleen vaikka sitä ei ostaisikaan...
Luulenpa, että Mercurial ja Git eivät ole vielä olleet käytössä, kun tuo vertailutaulukko joskus on tehty.
Päivitys versioon 1.6.0. Toimii nyt sekä Greasemonkeyllä että Operalla sekä kirjautuneena että kirjautumattomana. Lisätty mahdollisuus määritellä ignoren kestot tapauskohtaisesti, korjattu keksien vanhenemisajan määrittelyä ymv. Kirjautuneen käyttäjän nimi haetaan nyt sivulta. Nimi vaihdettu Merrin ehdotuksesta. Asennus: Poista vanha (GM ei ylikirjoita vanhaa nimivaihdoksen takia) ja asenna uusi. GM osaa napata skriptin suoraan tuosta tai projektisivujen linkeistä, projektisivulla on ladattavissa myös paketit, joissa on lisenssi ja README mukana. Tulevia muutoksia README:ssä.
P.S. Ideoita otetaan vastaan, varsinkin käyttöliittymämockuppeja kakkosversion ikoneita ajatellen.
P.P.S. En ole suunnitellut toteuttavani ideaa estettyjen käyttäjien aloittamien ketjujen piilottamisesta. Olisko se haluttukin ominaisuus?
P.P.P.S. Servulta löytyy myös versio 1.6.1, johon laitoin yksinkertaisen latausruudun (body piilotetaan latauksen ajaksi, jää vain taustaväri). Vaatii joko user.css:n muokkausta tai Stylish-lisäosan, CSS stylishiin löytyy tiedostosta peelo_1.6.1.user.css.
EDIT2: Vanhat linkit poistettu
Eipähän taas hurmoksessa muistunut, että keksithän eivät suinkaan ole yksityisiä tietovarastoja, vaan ne lähetetään aivan turhaan serverille jokaisen sivulatauksen (tässä /keskustelu/). Poistan kakkosversiossa keksit käytöstä, joten Opera-versiossa estettävät käyttäjät pitää jatkossa syöttää käsin, kunnes Opera tukee samanlaista offline-tallennusta kuin GM (GM_setValue).
Plugarin käyttöaste ei varmaan ole mitää järettömän trafiikin luovaa luokkaa, mutta suosittelen päivittämään kakkosversioon heti kunhan saan moisen pyöräytettyä ulos.
Aihe on jo aika vanha, joten et voi enää vastata siihen.