Selfmade M0d

Erweitert pr0gramm.com um weitere Funktionen

当前为 2017-11-19 提交的版本,查看 最新版本

// ==UserScript==
// @name		Selfmade M0d
// @author		Frubi
// @description:de	(Beta) Erweitert pr0gramm.com um weitere Funktionen zum Blocken von Content
// @include		*://pr0gramm.com/*
// @grant       none
// @version		1.6.0Beta
// @namespace https://gf.qytechs.cn/users/158955
// @description Erweitert pr0gramm.com um weitere Funktionen
// ==/UserScript==
console.log("Selfmade M0d running");
 const defaultSettings = 
{
    isActive : true,
    skipUploadByTag : false,
    blockedTags : [],
    onlyGoodTags : true,
    amountOfTagsChecked: -1,
    skipUploadByUser : false,
    blockedUsers : [],
    skipUploadByTotalBenis : false,
    minBenis : 0,
    skipUploadByAverageBenis : false,
    minAverageBenis : 0,
    skipUploadByUserRank : false,
    blockedUserRanks : [],
    nextUploadDirection : -1,
    autoRateSkippedUploads : false,
    blockCommentsByUser : false,
    commentBlacklist: [],
    blockCommentsByBlacklist: false,
    blockCommentsByBenis: false,
    commentMinBenis: 0
}
let settings = Object.assign({},defaultSettings);

let readSettings = function()
{
   let tmp = JSON.parse(localStorage.getItem("Selfmade_M0d_Settings"));
   if(tmp != null)
   {
        Object.keys(tmp).forEach(function(e)
        {
            if(settings[e] != undefined)
                settings[e] = tmp[e];    
        });
   }
}

let checkPageReady;
let checkURL = function()
{
    clearInterval(checkPageReady);
    if(url.length > 24)
    {
        checkPageReady = setInterval(function()
        {
            if($('.tags').length != 0 && $('.block-user').length == 0)
            {
                clearInterval(checkPageReady);
                addBlockTagSign();
                addBlockUserSign();
                
                if(settings.isActive)
                {
                    executeModules();
                }
            }
            else if($('.tab-bar').length != 0 && $('.Selfmade_M0d').length == 0 && url.includes('settings'))
            {
                clearInterval(checkPageReady);
                addSettingsTab();
            }
        },10);
    }
}

let addSettingsTab = function()
{
    let tmp = $('.Selfmade_M0d');
    if(tmp.length != 0)
    {
        return;
    }
    let button = document.createElement('a');
    button.innerText = 'Selfmade M0d';
    button.className = "Selfmade_M0d";
    button.href = '/settings/Selfmade_M0d';
    $(button).click(function(e)
    {
        e.preventDefault();
        window.history.replaceState({},"Selfmade M0d Settings","/settings/Selfmade_M0d");
        createSettings();
    });
    $('.tab-bar')[0].appendChild(button); 
}

let createSettings = function()
{     
    $('.pane.form-page').empty();
    
    $('.active').toggleClass('active');
    $('.Selfmade_M0d').addClass('active');
    
    let settingsPageContent = `
    <div class='form-section'>
    
        <div class='Selfmade_M0d' id='bt' style='display:block'>
            Geblockte Tags:<br>
            <div style='margin-top:5px'></div>
            <input placeholder='tag1,tag2,tag3,...' title='Tags mit Komma trennen!'></input>
            <input type="checkbox" class="box-from-label" name="onlyGoodTags">
                <label for="onlyGoodTags"> Ignoriere Tags mit negativen Benis </label>
            Anzahl der zu berücksichtigen Tags: <input type="number" min="-1" max="999" value="-1" title="-1 = alle">
        </div>
        <br><hr size="1" style="color:gray">
        <div class='Selfmade_M0d' id='bu' style='display:block' title='Nutzernamen mit Komma trennen!'>
            Geblockte Nutzer:<br>
            <div style='margin-top:5px'></div>
            <input placeholder='nutzer1,nutzer2,nutzer3,...'></input>
            <input type='checkbox' class="box-from-label" name="bc">
                <label for="bc"> Kommentare von geblockten Nutzern entfernen</label>
        </div>
        <br><hr size="1" style="color:gray">
        <div class="Selfmade_M0d" id='bc' style='display:block'>
            Geblockte Wörter in den Kommentaren:<br>
            <div style='margin-top:5px'></div>
            <input placeholder='wort1,wort2,wort3,...' title='Wörter mit Komma trennen!'></input><br>
            <input type="checkbox" class="box-from-label" name="ComMinBenis">
                <label for="ComMinBenis" style="display:inline-block"> Mindest Benis bei Kommentaren:</label> <input type="number" min="-999" max="999" value="0">
        </div>
        <br><hr size="1" style="color:gray">
        <div class='Selfmade_M0d' id='br' style='display:block'>
            Geblockte Ränge:<br>
            <div style="margin-left:25px;">
                <input type="checkbox" class='box-from-label' name='Neuschwuchtel'>
                    <label for='Neuschwuchtel' style='color:#E108E9' >Neuschwuchtel</label>
                <input type="checkbox" class='box-from-label' name='Schwuchtel'>
                    <label for='Schwuchtel' style='color:#FFFFFF'>Schwuchtel</label>
                <input type="checkbox" class='box-from-label' name='Altschwuchtel'>
                    <label for='Altschwuchtel' style='color:#5BB91C'> Altschwuchtel</label>
                <input type="checkbox" class='box-from-label' name="Edler Spender">
                    <label for="Edler Spender" style='color:#1cb992'> Edler Spender</label>
                <input type="checkbox" class='box-from-label' name="Gesperrt">
                    <label for="Gesperrt" style='color:#444444'> Gesperrt </label>
                <input type="checkbox" class='box-from-label' name="Fliesentischbesitzer">
                    <label for="Fliesentischbesitzer" style='color:#6C432B'> Fliesentischbesitzer</label>
                <input type="checkbox" class='box-from-label' name="Lebende Legende">
                    <label for="Lebende Legende" style='color:#1cb992'> Lebende Legende</label>
                <input type="checkbox" class='box-from-label' name="Moderator">
                    <label for="Moderator" style='color:#008FFF'> Moderator</label>
                <input type="checkbox" class='box-from-label' name="Administrator">
                    <label for="Administrator" style='color:#FF9900'> Administrator</label>
            </div>	
        </div>
        <br><hr size="1" style="color:gray">
        <div class='Selfmade_M0d' id='mb' style='display:block'>
            <input type="checkbox" class="box-from-label" name="minBenis" >
                <label for="minBenis" style="display:inline-block">Mindest Benis: </label><input type="number" min="-999" max="999" value="0"><br>
            <input type="checkbox" class="box-from-label" name="minAverageBenis" >
                <label for="minAverageBenis" style="display:inline-block"> Mindest Durchschnittsbenis: </label><input type="number" min="-999" max="999" value="0">
        </div>
        <br><hr size="1" style="color:gray">
        <div class='Selfmade_M0d' id='sr' style='display:block'>
            <input type="checkbox" class="box-from-label" name="sr">
                <label for="sr"> Nach rechts Skippen</label>
        </div>
        <br>
        <div class="Selfmade_M0d" id='save'>
            <input type="submit" value="Speichern" class="confirm settings-save"></input>
        </div>
        <br>
        <div class='Selfmade_M0d' id='reset'>
            <a class='action clear-settings-button'>Einstellungen zurücksetzen</a>
        </div>
    </div>
    `

    $('.pane.form-page').append(settingsPageContent);

    settings.blockedTags.forEach(function(e)
    {
        createNameTag($('#bt input')[0], e);
    });

    $('#bt input:first').keyup(function(e){
        if(e.key == ',')
        {
            let text = this.value.slice(0,this.value.length-1).trim().toLowerCase();
            if(text.length <3) 
            {
                this.value = text;
                return;
            }
            createNameTag(this, text);
        }
    });

    $('#bt input')[1].checked = settings.onlyGoodTags;
    $('#bt input')[2].value = settings.amountOfTagsChecked;

    settings.blockedUsers.forEach(function(e)
    {
        createNameTag($('#bu input')[0], e);
    });

    $('#bu input:first').keyup(function(e){
        if(e.key == ',')
        {
            let text = this.value.slice(0,this.value.length-1).trim();
            if(text.length <3) 
            {
                this.value = text;
                return;
            }
            createNameTag(this, text);
        }
    });
    $('#bu input')[1].checked = settings.blockCommentsByUser;

    settings.commentBlacklist.forEach(function(e)
    {
        createNameTag($('#bc input')[0], e);
    });

    $('#bc input:first').keyup(function(e){
        if(e.key == ',' || e.key == ' ')
        {
            let text = this.value.slice(0,this.value.length-1).trim().toLowerCase();
            if(text.length <3) 
            {
                this.value = text;
                return;
            }
            createNameTag(this, text);
        }
    });
    $('#bc input')[1].checked = settings.blockCommentsByBenis;
    $('#bc input')[2].value = settings.commentMinBenis;

    settings.blockedUserRanks.forEach(function(e)
    {
        let tmp = $('label:contains(' + e + ')');
        if(tmp.length != 0)
            $('label:contains(' + e + ')').prev()[0].checked = true;
    });

    $('#mb input')[0].checked = settings.skipUploadByTotalBenis;
    $('#mb input')[1].value = settings.minBenis;
    $('#mb input')[2].checked = settings.skipUploadByAverageBenis;
    $('#mb input')[3].value = settings.minAverageBenis;

    $('#sr input')[0].checked = settings.nextUploadDirection==-1?true:false;

    $('#save input').click(function()
    { 
        saveSettings();
        showNotification("Einstellungen gespeichert");
    });
    $('#reset a').click(function()
    {
        localStorage.removeItem('Selfmade_M0d_Settings');
        settings = Object.assign({},defaultSettings);
        $('a.Selfmade_M0d').click();
        showNotification("Einstellungen zurückgesetzt");
    });

    $('.box-from-label').next().each(function()
    {
        $(this).click(function()
        {
            $(this).prev()[0].checked = !$(this).prev()[0].checked;
        });
    });
}

let createNameTag = function(element, data)
{
    let wrapper = document.createElement('span');
    $(wrapper).addClass('tag');
    
    $(wrapper).text(data);

    let x = document.createElement('a');

    $(x).href='#';
    $(x).html("&nbsp;&nbsp;x");
    $(x).css("color","red");

    $(x).click(function(e)
    {
        e.preventDefault();
        $(this).parent().remove();
    });

    wrapper.append(x);

    element.value = "";

    $(element).prev().append(wrapper);
}

let saveSettings = function()
{    
    settings.blockedTags = [];
    $('#bt input').prev().find('span').each(function()
    {
        let text = this.innerText.slice(0,this.innerText.length-3);
        settings.blockedTags.push(text.toLowerCase());
    });

    settings.skipUploadByTag = settings.blockedTags.length >0?true:false;
    settings.onlyGoodTags = $('#bt input')[1].checked;
    settings.amountOfTagsChecked = Number($('#bt input')[2].value);

    settings.blockedUsers = [];
    $('#bu input:first').prev().find('span').each(function()
    {
        let text = this.innerText.slice(0,this.innerText.length-3);
        settings.blockedUsers.push(text.toLowerCase());
    });

    settings.skipUploadByUser = settings.blockedUsers.length >0 ? true:false;
    settings.blockCommentsByUser = $('#bu input')[1].checked;

    settings.commentBlacklist = [];
    $('#bc input:first').prev().find('span').each(function()
    {
        let text = this.innerText.slice(0,this.innerText.length-3);
        settings.commentBlacklist.push(text.toLowerCase());
    });
    settings.blockCommentsByBlacklist = settings.commentBlacklist.length >0 ? true:false;
    settings.blockCommentsByBenis = $('#bc input')[1].checked;
    settings.commentMinBenis = Number($('#bc input')[2].value);

    settings.blockedUserRanks = [];
    let tmp = $('#br input:checked').next();
    for(let i = 0; i < tmp.length; i++)
    {
        settings.blockedUserRanks.push(tmp[i].innerText.trim());
    }
    settings.skipUploadByUserRank = settings.blockedUserRanks.length >0 ? true:false;

    settings.skipUploadByTotalBenis = $('#mb input')[0].checked;
    settings.minBenis = Number($('#mb input')[1].value);
    settings.skipUploadByAverageBenis = $('#mb input')[2].checked;
    settings.minAverageBenis = Number($('#mb input')[3].value);

    settings.nextUploadDirection = $('#sr input')[0].checked ? -1:1;

    settings.autoRateSkippedUploads = false;

    quickSave();
}

let quickSave = function()
{
    localStorage.setItem("Selfmade_M0d_Settings", JSON.stringify(settings));
}

let createFilter = function()
{
    let filter = $('.filter-setting:eq(2)');
    filter.clone().insertAfter(filter);
    filter = $('.filter-setting:eq(3)');
    let circle = filter[0].children[0].children[0];
    filter[0].children[0].innerText = "Self-made M0d";
    filter[0].children[0].prepend(circle);
    filter[0].children[1].innerText = "Aktiviere das Selfmade M0d Addon. Speichern nicht erforderlich";
    filter.attr("data-flag",8);

    $('#filter-link').click(function(){
        if(settings.isActive)
            filter.addClass("active");
        else
            filter.removeClass("active"); 

    })
    
    filter.click(function()
    {
        if($('.filter-setting:eq(3)').hasClass("active"))
        {
            settings.isActive = false;
            $('.filter-setting:eq(3)').removeClass("active");
        }
        else    
        {
            settings.isActive = true;
            $('.filter-setting:eq(3)').addClass("active");
        }

        quickSave();
    })
}

let nextUpload = function()
{
    if(settings.nextUploadDirection == 1)
    {
        $('.stream-prev').click();
    }
    else if(settings.nextUploadDirection == -1)
    {
        $('.stream-next').click();
    }
}

let rateUpload = function(direction = -1)
{
    showNotification("Upload wurde bewertet");
    if(direction == 1)
    {
        if($('.item-vote:has(.pict)')[0].className.indexOf("voted-up") == -1)
            $('.item-vote:has(.pict) .vote-up').click();
    }
    else if(direction == -1)
    {
        if($('.item-vote:has(.pict)')[0].className.indexOf("voted-down") == -1)
            $('.item-vote:has(.pict) .vote-down').click();
    }
}

let getTags = function()
{
    let tags = [];
    let rawTags;

    if(settings.onlyGoodTags == true)
    {
        rawTags = $('.tag-good');
    }
    else
    {
        rawTags = $('.tag-good,.tag-bad');
    }
    let amount = settings.amountOfTagsChecked;
    if(amount == -1)
    {
        amount = rawTags.length;
    }
    else
    {
        amount = Math.min(amount, rawTags.length)
    }

    for(let i = 0; i <amount; i++)
    {
        tags.push(rawTags[i].children[0].innerText);
    }
    return tags;
}

let getTotalBenis = function()
{
    let score = $('.item-vote .score');
    if(score.length != 0)
    {
        return $('.item-vote .score')[0].innerText;
    }
    return undefined;
}

let getAverageBenis = function()
{
    let score = $('.item-vote .score');
    if(score.length != 0)
    {
        score = $('.item-vote .score')[0].title;
        let divident = Number(score.substr(0,score.indexOf("u")-1));
        let divisor = Number(score.substr(score.indexOf("u")+4,score.indexOf("u")));
        if(divisor == 0)
        {
            return divident;
        }
        return divident / divisor;
    }
    else undefined; 
}

let getUser = function()
{
    return $('.item-details .user')[0].innerText.toLowerCase();
}

let getUserRank = function(user)
{
    switch(user.classList[1])
    {
        case("um0"):
            return "Schwuchtel";
        break;
        case("um1"):
            return "Neuschwuchtel";
        break;
        case("um2"):
            return "Altschwuchtel";
        break;
        case("um3"):
            return "Administrator";
        break;
        case("um4"):
            return "Gesperrt";
        break;
        case("um5"):
            return "Moderator";
        break;
        case("um6"):
            return "Fliesentischbesitzer";
        break;
        case("um7"):
            return "Lebende Legende";
        break;
        case("um8"):
        break;
        case("um9"):
            return "Edler Spender";
        break;
        default:
        break;
    }
}

let executeModules = function()
{
    let wasSkipped = false;  
    if(settings.skipUploadByTag)
    {
        wasSkipped = skipUploadByTag();
    }
    if(settings.skipUploadByUser && !wasSkipped)
    {
        wasSkipped = skipUploadByUser();
    }
    if(settings.skipUploadByTotalBenis && !wasSkipped)
    {
        wasSkipped = skipUploadByTotalBenis();
    }
    if(settings.skipUploadByAverageBenis && !wasSkipped)
    {
        wasSkipped = skipUploadByAverageBenis();
    }
    if(settings.skipUploadByUserRank && !wasSkipped)
    {   
        wasSkipped = skipUploadByUserRank();
    }
    if(settings.deleteComments && !wasSkipped)
    {
        deleteCommentsByUser();
    }
    else if(!wasSkipped)
    {
        if(settings.blockCommentsByUser)
            blockCommentsByUser();
        if(settings.blockCommentsByBenis)
            blockCommentsByBenis();
        if(settings.skipUploadByUserRank)
            blockCommentsByRank();
        if(settings.blockCommentsByBlacklist)
            blockCommentsByBlacklist();
    }
}

let skipUploadByTag = function()
{
    let tags = getTags();
    for(let i = 0; i < tags.length; i++)
    {
        if(settings.blockedTags.includes(tags[i].toLowerCase()))
        {
            if(settings.autoRateSkippedUploads)
            {
                rateUpload();
            }
            showNotification("Skipped because of Tag: " + tags[i]);
            nextUpload();
            return true;
        }
    }
}

let skipUploadByUser = function()
{
    let user = getUser();
    if(settings.blockedUsers.includes(user))
    {
        if(settings.autoRateSkippedUploads)
            rateUpload();

        showNotification("Skipped because of User: " + user);
        nextUpload();
        return true;
    }  
}

let skipUploadByTotalBenis = function()
{ 
    let score = getTotalBenis();
    if(score != undefined)
    {
        if(score < settings.minBenis)
            {   
                if(settings.autoRateSkippedUploads)
                {
                    rateUpload();
                }
                nextUpload();
                showNotification("Skipped because of Benis: " + score);
                return true;
            }
    }
}

let skipUploadByAverageBenis = function()
{
    let score = getAverageBenis();
    if(score != undefined)
    {
        if(getAverageBenis() < settings.minAverageBenis)
        {   
            if(settings.autoRateSkippedUploads)
            {
                rateUpload();
            }
            nextUpload();
            showNotification("Skipped because of average Benis: " + score);
            return true;
        }
    }
}

let skipUploadByUserRank = function()
{
    let rank = getUserRank($('.item-details .user')[0]);
    if(settings.blockedUserRanks.includes(rank))
    {
            if(settings.autoRateSkippedUploads)
            {
                rateUpload();
            }
            nextUpload();
            showNotification("Skipped because of Userrank: " + rank);
            return true;
    }
}

let addBlockTagSign = function()
{
    let blockTagSign = document.createElement('span');
    blockTagSign.className = "block-tag"
    blockTagSign.innerText = "ø";
    if($('.block-tag').length == 0)
    {
        $('.tag').append(blockTagSign);
        $('.block-tag').css("cursor", "pointer");

        $('.block-tag').each(function()
        {
            let tmp = $(this).siblings()[0].innerText;
            if(settings.blockedTags.includes(tmp.toLowerCase()))
            {
                $(this).css("color", "red");
            }   
            else
            {
                $(this).css("color", "#888");
            }
        });

        $('.block-tag').click(function()
        {
            let tmp = $(this).siblings()[0].innerText;
            if($(this).css("color") == "rgb(255, 0, 0)")
            {
                settings.blockedTags.splice(settings.blockedTags.indexOf(tmp),1);
                if(settings.blockedTags.length > 0)
                    settings.skipUploadByTag  = true;
                else
                    settings.skipUploadByTag  = false;
                $(this).css("color","#888" );
            }
            else
            {
                settings.blockedTags.push(tmp.toLowerCase());
                settings.skipUploadByTag  = true;
                $(this).css("color", "red");
            }
            
            quickSave();
        });
    }
}

let addBlockUserSign = function()
{
    let blockUserSign = document.createElement('span');
    blockUserSign.className = "block-user"
    blockUserSign.innerText = " ø";
    if($('.block-user').length == 0)
    {
        $(blockUserSign).insertAfter($('.user'));
        $('.block-user').css("cursor", "pointer");

        $('.block-user').each(function()
        {
            if(settings.blockedUsers.includes($(this).prev()[0].innerText))
            {
                $(this).css("color", "red");
            }
        });

        $('.block-user').click(function()
        {
            let user = $(this).prev()[0].innerText;

            if($(this).css("color") == "rgb(255, 0, 0)")
            {
                settings.blockedUsers.splice(settings.blockedUsers.indexOf(user),1);
                if(settings.blockedUsers.length > 0)
                    settings.skipUploadByUser  = true;
                else
                    settings.skipUploadByUser  = false;
                $(this).css("color","" );
            }
            else
            {
                settings.blockedUsers.push(user);
                settings.skipUploadByUser  = true;
                $(this).css("color", "red");
            }      
            quickSave();
        });
    }
}

let blockCommentsByUser = function()
{
    $('.comment:not(textarea)').each(function()
    {
        if(settings.blockedUsers.includes($(this).find($('.comment-foot .user'))[0].innerText))
        {
            blockComment(this);
        }
    });
}

let blockCommentsByBlacklist = function()
{
    $('.comment .comment-content').each(function()
    {
        element = this;
        if($(element).attr("data-comment") != undefined)
            return;

        $($(this).text().toLowerCase().replace(/[^\w\s]/g, '').split(" ")).each(function()
        {
            if(settings.commentBlacklist.includes(String(this)))
            {
                blockComment($(element).parent());
                return false;
            }
        });
    });
}

let blockCommentsByBenis = function()
{
    $('.comment-foot .score').each(function()
    {
        if(parseFloat(this.innerText) < settings.commentMinBenis)
            blockComment($(this).parent().parent());
    });
}

let blockCommentsByRank = function()
{
    $('.comment-foot .user').each(function()
    {
        if(settings.blockedUserRanks.includes(getUserRank(this)))
            blockComment($(this).parent().parent());
    });
}

let blockComment = function(element)
{
    let tmp = $(element).find($('.comment-content'));
    if(tmp.attr("data-comment") == undefined)
    {   
        $(tmp).css("color", "grey");
        $(tmp).css("cursor", "pointer");
        tmp.attr("data-comment", tmp[0].innerText )
        tmp[0].innerText = "[Blocked]";
        tmp.click(function()
        {
            if(this.innerText == "[Blocked]")
                this.innerText = $(this).attr("data-comment");
            else
                this.innerText = "[Blocked]";
        });
        $(element).find('.fold-in').click();
    }
}

let showNotification = function(text)
{
    let element = document.createElement('span');
    $(element).css("cssText",'display:none; position:absolute; bottom:0; left:0; line-height:60px; width:100%; background:#ee4d2e; text-align:center; vertical-align:middle');
    element.innerText = text;
    $('#notificationbox').append(element);
    $(element).slideToggle();
    $('#notificationbox span:not(:last)').animate(
        {
            bottom: "+=60" 
        }
    )
    $(element).click(function()
    {
        $(this).animate(
        {
            left: "-300px"
        },function(){this.remove()});
    });

    setTimeout(function(){
        $(element).animate(
            {
                left: "-300px"
            },function(){element.remove()});
    },3000);
    

}

let url = "https://pr0gramm.com";

$(document).ready(function()
{
    readSettings();
    createFilter();

    window.addEventListener("resize", function(){checkURL()});
    
    let notificationbox = "<div id='notificationbox' style='position:fixed; width:300px; left:0; bottom:0; z-index:11'></div>";
    $('body').append(notificationbox);

    if(window.location.href.includes("Selfmade_M0d"))
    {
        window.location.href = "https://pr0gramm.com/settings/site";
    }
    setInterval(function()
    {
        if(url != window.location.href)
        {
            url = window.location.href;
            checkURL();       
        } 
    },100);  
});

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址