Virrcheg / Dharma Inviter

// ==UserScript==
// @name         Dharma Inviter
// @namespace    https://vk.com/

// @version      10
// @description  By His grace
// @author       Vishvashanti


// @match        http://smm.sattva-shop.ru/*
// @match        http://vk.com/*
// @match        https://vk.com/*
// @grant        none
// @require http://code.jquery.com/jquery-latest.js
// ==/UserScript==
/* jshint -W097 */
"use strict";

// Your code here...

$('#page_layout').append('<canvas id="myCanvas" width="130" height="50" style="border:1px solid #d3d3d3; display:none;"></canvas>'+
                         '<div style="padding: 5px; background: rgb(78, 114, 154) none repeat scroll 0% 0%; color: rgb(255, 255, 255); width: 127px; position: absolute; z-index: 10000; left: 0px; top: 0px;" id="">'+
                         '<div id="inviter"><a style = "color:#fff;" href = "#" onclick = "window.start_invite()">Начать инвайтинг</a></div><div id="start_invitation"></div></div>');
window.current_offset = 0;
window.check_timeoutid = [];

window.isset = function() {
    // +   original by: Kevin van Zonneveld 
    // +   improved by: FremyCompany
    // +   improved by: Onno Marsman
    // *     example 1: isset( undefined, true);
    // *     returns 1: false
    // *     example 2: isset( 'Kevin van Zonneveld' );
    // *     returns 2: true

    var a=arguments, l=a.length, i=0;

    if (l===0) {
        throw new Error('Empty isset'); 
    }

    while (i!==l) {
        if (typeof(a[i])=='undefined' || a[i]===null) { 
            return false; 
        } else { 
            i++; 
        }
    }
    return true;
}

window.getRandomInt = function(min, max) {
    return Math.floor(Math.random() * (max - min)) + min;
}

window.log = function(text){

    $('#inviter').html(text);
}



String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

window.get_section_friends_prepare_data = function(data){
    var text = data;
    text = text.replace(/^<!--/, '').replace(/-<>-(!?)>/g, '--$1>');

    var answer = text.split('<!>');
    window.get_section_friends_answer = answer;
    if (answer[5]=="{}")
    {
        return 1;
    }
    else
    {
        var members = answer[5];
        members = members.replace('{"members": ','');
        members = members.replaceAll('}','');
        //        members = members.replace('}','');
        var a = eval(members);

        window.inviter_answer = answer;
        return a;
    }
}

window.invite_friend = function(gid,hash,mid){

    jQuery.post('al_page.php','act=a_invite&al=1&gid='+gid+'&hash='+hash+'&mid='+mid,
                function(data){
        var text = data;
        text = text.replace(/^<!--/, '').replace(/-<>-(!?)>/g, '--$1>');

        var answer = text.split('<!>');

        window.inviter_answer = answer;

    }
               );
}

window.get_sattva_uid = function(gid,uid){
    jQuery.post('https://sattva-shop.ru/inviter_group.php','t=get&gid='+gid+'&uid='+uid+'&start_offset='+window.start_offset+'&finish_offset='+window.finish_offset,
                function(data){
        ;
    });    
}
window.put_sattva_uid = function(gid,uid,result){
    jQuery.post('https://sattva-shop.ru/inviter_group.php','t=put&gid='+gid+'&uid='+uid+'&result='+result+'&start_offset='+window.start_offset+'&finish_offset='+window.finish_offset,
                function(data){
        ;
    });    
}



window.get_captcha_key = function(gid,members,captcha_sid){
    window.log('Получаем капчу...');

    var c = document.getElementById('myCanvas');
    var ctx = myCanvas.getContext('2d');
    var img = new Image;
    img.onload = function(){
        ctx.drawImage(img,0,0); // Or at whatever offset you like
        var dataURL = c.toDataURL();
        window.log('Распознаем капчу...');
        jQuery.post('https://sattva-shop.ru/r.php',
                    {data:dataURL,owner:gid},
                    function(data){
            window.log('Отправили капчу');
            window.start_invite_array(gid,members,captcha_sid,data);
        });
    };
    img.src = "/captcha.php?sid="+captcha_sid+"&s=1";    



}

window.start_invite_array = function(gid,members,captcha_sid,captcha_key){
    "use strict";  


    var offset = window.current_members_offset;
    window.log('Отправляем инвайт участнику №:' + (window.current_offset+offset));


    if(!window.isset(members[offset])) {
        window.current_offset = 0 + window.current_offset + 40;
        window.start_invite_work();
    }
    else {
        var hash = members[offset][11];
        var mid  = members[offset][0]; 


        if (window.allowed_uids.indexOf(parseInt(mid))==-1){
            window.current_members_offset = 0 + window.current_members_offset + 1;                    
            window.start_invite_array(gid,members,false,false);
            return;
        }


        let promise = new Promise((resolve, reject) => {
            var query = 'act=a_invite&al=1&gid='+gid+'&hash='+hash+'&mid='+mid;
            if (captcha_sid){
                query = query + "&captcha_sid="+captcha_sid+"&captcha_key="+captcha_key;
            }
            jQuery.post('al_page.php',query,
                        function(data){
                var text = data;
                text = text.replace(/^<!--/, '').replace(/-<>-(!?)>/g, '--$1>');

                var answer = text.split('<!>');

                window.inviter_answer = answer;

                resolve(answer);

            });
        });

        // promise.then навешивает обработчики на успешный результат или ошибку
        promise
            .then(
            result => {
                var next = 0;
                if (result[6]=="Пользователь запретил приглашать себя на встречи."){
                    window.put_sattva_uid(gid,mid,1);
                    window.log('запретил');

                    next = 1;
                }
                if (result[6]=="Приглашение выслано."){
                    window.put_sattva_uid(gid,mid,2);
                    window.log('OK');
                    next = 1;
                }
                if (result[6]=="Приглашение уже высылалось."){
                    window.put_sattva_uid(gid,mid,1);
                    window.log('уже высылалось');

                    next = 1;
                }

                if (result[6]==0){

                    if (result[5]=="Ошибка доступа"){   
                        window.put_sattva_uid(gid,mid,1);
                        next = 1;
                        window.log('ошибка доступа');
                    }
                    else{
                        window.get_captcha_key(gid,members,result[5]);
                    }
                }

                if (next){
                    window.current_members_offset = 0 + window.current_members_offset + 1;                    
                    setTimeout(function() { window.start_invite_array(gid,members,false,false); }, window.getRandomInt(2000,2500));
                }



            },
            error => {
                // вторая функция - запустится при вызове reject
                alert("Rejected in array: " + error); // error - аргумент reject
            }
        );

    }

}

window.check_invite_array = function(gid,result){
    var uids = [];

//    var current_time = Math.floor(Date.now() / 1000);

    result.forEach(function(element, index, array) {
        uids[uids.length] = element[0];
    });

    uids = JSON.stringify(uids);
    jQuery.post('https://sattva-shop.ru/inviter_group.php','t=check&gid='+gid+'&result='+uids+'&nocity='+window.nocity+'&repeat='+window.repeat,
                function(data){

        if (window.check_timeoutid.length){
            var i;
            for (i=0;i<=window.check_timeoutid.length;i++){
                clearTimeout(window.check_timeoutid[i]);
            }
            window.check_timeoutid=[];                      
            window.allowed_uids = JSON.parse(data);
            window.start_invite_array(gid,result,false,false);
        }


    });      

    window.check_timeoutid[window.check_timeoutid.length] = setTimeout(function(){
        window.check_invite_array(gid,result); 
    }, 60000);

}

window.start_invite = function(){

    window.start_offset = parseInt(prompt("Please enter start offset", ""));
    if (!window.start_offset) return;
    window.current_offset = parseInt(prompt("Please enter current offset", ""));
    if (!window.current_offset) return;
    window.finish_offset = parseInt(prompt("Please enter finish offset", ""));
    if (!window.finish_offset) return;
    //window.current_gid =parseInt(prompt("Please enter gid", ""));
    var a = window.location.href;
    a = a.split("group_id=");
    if (!window.isset(a[1])){
        alert('wrong address');
        return;
    }
    a = a[1];
    a = a.split("&");
    window.current_gid = a[0];
    
    window.nocity = parseInt(prompt("Turn of city control (1-all users, 0 — only req cities)", ""));
    window.repeat = parseInt(prompt("Turn of repeat control (1-all users, 0 — without repeation)", ""));
    
    window.start_invite_work();    
}



window.start_invite_work = function(){
    "use strict";
    var gid = window.current_gid;

    var offset = window.current_offset;

    if (offset>=window.finish_offset){
        alert('Закончили пачку');
        return;
    }



    window.log('Получаем пачку со смещением: '+offset);

    // Создаётся объект promise
    let promise = new Promise((resolve, reject) => {
        jQuery.post('friends','act=get_section_friends&al=1&gid='+gid+'&offset='+offset+'&section=members&sugg_rev=0',
                    function(data){
            resolve(window.get_section_friends_prepare_data(data));
        });
    });

    // promise.then навешивает обработчики на успешный результат или ошибку
    promise
        .then(
        result => {
            // первая функция-обработчик - запустится при вызове resolve
            //alert("Fulfilled: " + result); // result - аргумент resolve
            if (result==1){
                alert ('finished');
                return;
            }
            window.current_members_offset = 0;
            window.check_invite_array(gid,result);
            //window.start_invite_array(gid,result,false,false);

        },
        error => {
            // вторая функция - запустится при вызове reject
            alert("Rejected: " + error); // error - аргумент reject
        }
    );


    //    var mid = f[0];
    //    var hash = f[11];
    //"Пользователь запретил приглашать себя на встречи."
    //"Приглашение выслано."
}