Futbolcup Duyuru

Bu script, yöneticinin yapacağı duyuruları oyun içinde almanızı sağlayacak.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Futbolcup Duyuru

// @description    Bu script, yöneticinin yapacağı duyuruları oyun içinde almanızı sağlayacak.

// @version        1.0.1.2
// @icon           https://i.ibb.co/TBcPm2m/announcement.png

// @namespace      https://greasyfork.org/users/790242
// @author         Criyessei

// @supportURL     https://board.playzo.de/index.php/User/965-Oguzhan-Ozen/

// @include        /^https?:\/\/futbolcup.net.+/

// @require        https://code.jquery.com/jquery-3.3.1.min.js

// @compatible     chrome
// @compatible     firefox
// @compatible     opera

// @connect        greasyfork.org
// @connect        board.playzo.de

// @grant          GM_getValue
// @grant          GM_setValue
// @grant          GM_deleteValue
// @grant          GM_addStyle
// @grant          GM_xmlhttpRequest

// @license        MIT

// @run-at         document-body
// @noframes
// ==/UserScript==

/*globals $*/
/* eslint no-lone-blocks: 0 */

const checkUpdate = true;
const devoloperMode = false;

if(location.protocol!='https:'){ //Routing to secure protocol
    let pageHref = location.href;
    location.href = 'https'+pageHref.substring(pageHref.indexOf(':'));
    return;
}
else if(location.search.indexOf('action=logout')!=-1){
    location.href = location.origin; //Go main page
    return;
}

(async function() {
    'use strict';

    //Check if the script run for first time
    if(GM_getValue('data') == undefined) firstRun();

    //Make sure the game is fully loaded
    await sleep(1000);
    await gameLoad();

    //Check whether there is a new update for the script
    if(checkUpdate){
        let updateDialog = await checkVersion();
        if(updateDialog instanceof $){ //If the update dialog is shown
            await new Promise(function WaitDialogClosed(res, rej){
                let mo = new MutationObserver(function (e) {
                    if (e[0].removedNodes[0] == updateDialog[0]){
                        mo.disconnect();
                        return res();
                    }
                });
                mo.observe(updateDialog[0].parentElement, { childList: true });
            });
        }
    }

    //if a new announcement is published, it will be shown the user
    checkAnnouncement()
        .catch(err => {
        console.error(
            '%c[%c Futbolcup Duyuru %c]%c %cERROR%c|%c ' + err.message+ '\n\t' + err.stack,
            'background-color:black; color:white;',
            'font-weight:bold; background-color:DeepSkyBlue; color:black;',
            'background-color:black; color:white;',
            '',
            'font-weight:bold; color:Maroon',
            'color: gray;',
            ''
        );
    });
})();

function sleep(ms){
    return new Promise(res=> setTimeout(res, ms));
}
function gameLoad(){
    return new Promise(function(res,rej){
        setTimeout(function(){
            if(!$('#body').hasClass('loading')) res(10);
            else{
                let counter=0,
                    a = setInterval(function(){
                        ++counter;
                        if(!$('#body').hasClass('loading')){
                            clearInterval(a);
                            res(counter*50);
                        }
                    },50);
            }
        },10);
    });
}

function firstRun(){
    let data = {};
    data.lastReadAnnouncementId = null;
    GM_setValue('data', data);
}

function checkVersion(){
    let scriptLink = "https://greasyfork.org/scripts/428892-futbolcup-duyuru",
        scriptName = "Futbolcup%20Duyuru",
        versionControlLink = `${scriptLink}/code/${scriptName}.meta.js`,
        downloadLink = `${scriptLink}/code/${scriptName}.user.js`;

    return new Promise((res, rej) => {
        GM_xmlhttpRequest({
            method: "GET",
            url: versionControlLink,
            onload: function(response) {
                let text = response.responseText,
                    b = text.indexOf('@version')+8,
                    b1 = text.indexOf('/',b),
                    version = text.substring(b,b1).trim(),
                    currentVersion = GM_info.script.version;
                if(version!=currentVersion){
                    let header = {
                        css : {'text-align':'center'},
                        content :
                        `<span class="icon" style="background:url(/designs/redesign/images/layout/icons_sprite.png?v=2.2.6.14231) 0 -1180px no-repeat;margin-Right:10px;float:left;margin:6px;"></span>`+
                        `"Futbolcup Duyuru" scriptinin ${version} versiyonu çıktı!!!`
                    };
                    let div = {
                        footer : !0,
                        close  : !0,
                        class  : 'container'
                    };
                    div.content =
                        `<img src="https://image.ibb.co/jrcFap/Untitled.png" style="height:73px; float:left; margin:-15px 0 0 -15px;">`+
                        `<p style="font-size:15px; margin-Bottom:10px; font-weight:bold; color:red; text-align:center;">`+
                        `   Mevcut versiyon ${currentVersion}`+
                        `   <label style="color:green; margin-Left:50px;">Yeni versiyon : ${version}</label>`+
                        `</p>`+
                        `<p style="font-size:14px; font-weight:bold; color:blue;">`+
                        `   Scripti güncellemek istiyorsanız , <a href="${downloadLink}" style="font-size:14px">buraya tıklayın</a>. Açılan sayfadan scripti güncelleyin. Daha sonra bu sayfayı yenileyin!! (F5 yada yenileme butonu)`+
                        `</p>`+
                        `<p style="margin-Top:20px;text-align:center;">${CreateButton('relaodPage', 'Sayfayı Yenile')}</p>`;
                    let updateDialog = showDialog(div,header);
                    $('#relaodPage').click(()=>location.reload());
                    res(updateDialog);
                }
                else{
                    console.log('[Version control] => %cVersion up to date.','color:green;');
                    res();
                }
            },
            onerror: function() {
                console.log('[Version control] => %cFail!','color:red;');
                res(-1);
            }
        });
    });
}
function checkAnnouncement(){
    return new Promise((res, rej) => {
        GM_xmlhttpRequest({
            method: "GET",
            url: "https://board.playzo.de/index.php/Thread/111164-Oyun-%C4%B0%C3%A7i-Duyuru/?pageNo=99999",
            onload: result => {
                try{
                    //Create page
                    let page = $('<html />').html(result.response);

                    //Getting announcements
                    let announcements = page.find('ul.wbbThreadPostList>li[id^="post"]');
                    if(!announcements.length) return rej(new Error("Error code 1"));

                    //Get last announcement
                    let lastAnnon = announcements.last();
                    if(!lastAnnon.attr('id').startsWith('post')) return rej(new Error("Error code 2"));
                    let lastAnnonId = parseInt(lastAnnon.attr('id').replace('post',''));
                    if(isNaN(lastAnnonId)) return rej(new Error("Error code 3"));

                    let data = GM_getValue('data');
                    if((!devoloperMode || false) && data.lastReadAnnouncementId==null){
                        //The announcement published before the script is run for the first time will not be displayed to the user.
                        data.lastReadAnnouncementId = lastAnnonId;
                        GM_setValue('data', data);
                        return res();
                    }

                    //Check whether the last announcement is read
                    let wasntRead = (data.lastReadAnnouncementId || 0) < lastAnnonId;
                    if(!wasntRead) {
                        console.log("Latest announcement["+lastAnnonId+"] is read. data.lastReadAnnouncementId=" + data.lastReadAnnouncementId);
                        return res(); //no any new announcement to show
                    }

                    //Show new announcement
                    showAnnouncement(lastAnnon);

                    //Announcement shown will not be displayed again
                    data.lastReadAnnouncementId = lastAnnonId;
                    GM_setValue('data', data);

                    res();
                }
                catch(err){
                    rej(err);
                }
            },
            onerror: function(err) {
                console.log('[Check Announcement] => %cFail!','color:red;');
                rej(err);
            }
        });
    });
}

function showDialog(div,header=undefined,setMid=true){
    $('html, body').animate({ scrollTop: 0 }, 'fast');
    $('#container > .shadow').show();

    let focus = $('<div>').attr('id',div.id || null).css({
        'padding'   : '15px',
        'width'     : '580px',
        'wordWrap'  : 'break-word',
        'textAlign' : 'center!important',
        'box-sizing': 'border-box'
    }).css(div.css || {}).addClass('focus visible').addClass(div.class || null).html(div.content || '');

    if(typeof header == 'object'){
        let h2 = $('<h2>').css(header.css || {}).html(header.content || '').css({
            width        : '100%',
            paddingLeft  : '0px',
            paddingRight : '0px',
            top          : '0px',
            transform    : 'translateY(-100%)'
        });
        focus.prepend(h2);
    }

    if(div.footer) focus.append('<div class="footer"></div>');

    if(div.close) focus.append('<div class="close" style="position:absolute;top:-46px"></div>');

    $('#container').append(focus);

    setPosition(focus, 190, setMid);
    return focus;
}
function setPosition(focus, topOffset = 190, setMid=true){
    if(setMid){
        //Set In The Midst
        topOffset = 0/*$(window).scrollTop()*/ + ($(window).innerHeight() - focus.height()) / 2;
        if (topOffset < 190) topOffset = 190;
    }
    focus.css({
        'position': 'absolute',
        'top'     : topOffset + 'px',
        'left'    : ($(window).scrollLeft() + ($(window).innerWidth() / 2) - (focus.width() / 2 + focus.parent().offset().left)) + 'px'
    });
}

let styleAdded = false;
function showAnnouncement(newAnnon){
    if(!styleAdded){
        styleAdded = true;

        GM_addStyle(`
#announcement .containerPadding {padding: 14px 21px 14px;}
@media only screen and (max-width: 800px) {
#announcement .containerPadding {padding: 7px;}
}
@media only screen and (min-width: 641px) and (max-width: 800px) {
#announcement .containerPadding {padding-left: 14px;padding-right: 14px;}
}

#announcement .quoteBox {background-color: #eff6ed;clear: both;min-height: 28px;margin-bottom: 4px;position: relative; background-color: #eff6ed; border: 1px solid #365b1e; margin: 3px 0;}
#announcement .quoteBox.containerPadding {padding-left: 54px;}
#announcement .quoteBox::before {content: "‘‘"; color: #888888; font-family: FontAwesome; font-size: 45px; font-weight: bold; position: absolute; left: 12px; top: 1px;}
#announcement .quoteBox > header {padding-bottom: 4px;border-bottom: 1px dotted #365b1e;margin-bottom: 7px;}
#announcement .quoteBox > header > h3 {font-weight: bold;}
#announcement .quoteBox .quoteBox {background-image: none;padding-left: 21px;min-height: 0;}
#announcement .quoteBox .quoteBox::before {display: none;}
#announcement .quoteBox header > h3 > a{color:#894617;cursor: pointer; text-decoration: none;}

@media only screen and (max-width: 800px) {
#announcement .quoteBox::before {font-size: 14px;left: 7px;}
#announcement .quoteBox.containerPadding {padding-left: 28px;}
#announcement .quoteBox .quoteBox {padding-left: 7px;}
}

#announcement .spoilerBox {background-color: #eff6ed;clear: both;padding-bottom: 7px;}
#announcement .spoilerBox > header {margin-bottom: 7px;}
#announcement .spoilerBox > div {overflow: hidden;padding-bottom: 7px;}

#announcement .inlineCode {background-color: #eff6ed;border: 1px solid #365b1e;border-radius: 3px;display: inline-block;font-family: Consolas, 'Courier New', monospace;margin: 0 2px;padding: 0 5px;word-break: break-all;word-wrap: break-word;}
ul.smileyList > li {display: inline;}

#announcement .bbcodeTable {display: inline-block;}
@media screen and (max-width: 800px) {
#announcement .bbcodeTable {display: block;}
}
        `);
    }

    //Set announcement header
    let annonHeaderPrefix = "[Futbolcup Duyuru] ";
    let defaultAnnonHeader = "DUYURU";
    let annonHeader = newAnnon.find('div.messageHeadline > h1:first-child').text().trim();
    if(typeof annonHeader!="string" || annonHeader == "" || annonHeader.length<3) annonHeader = defaultAnnonHeader;


    let header = { //Scriptin açılış menüsünün baş kısmı
        content : annonHeaderPrefix + annonHeader,
        css : {'text-align':'center'}
    };
    let div = { //Scriptin açılış menüsünün içeriği
        footer : !0,
        close  : !0,
        class  : 'container'
    };

    let messageTextDiv = newAnnon.find('div.messageText:first');
    if(!messageTextDiv) throw new Error("Error code 4");

    messageTextDiv.find('.container').removeClass('container')
    messageTextDiv.find('a').attr('target','_blank');

    div.content =
        `<div id="announcement">` + messageTextDiv.html() + '</div>';

    let focus = showDialog(div,header);

    //Görüntü düzenleme
    {
        focus.removeClass('focus');
        focus.css({
            'z-index': 11,
            'text-align': 'left',
            'width': '580px',
            'border-left': '1px solid #747474',
            'border-right': '1px solid #747474'
        });
        focus.find('>h2').css({
            'position':'absolute',
            'left':'-1px',
            'width':'579px'
        });
        focus.find('>div.close').css({
            'right': '-12px',
            'height': '24px',
            'width': '24px',
            'background': 'url(https://futbolcup.net/designs/redesign/images/layout/close.png)',
            'cursor': 'pointer'
        });
        focus.find('>div.footer').css('width', '100%');
        setPosition(focus, 190, true);
    }

    let contentDiv = focus.find('#announcement');

    //Resimleri ayarlama
    {
        contentDiv.find('a.externalURL > img').each(function(){
            let a = $(this).parent();
            a.before(this);
            a.remove();
        });
        let contentWidth = contentDiv.width();
        contentDiv.find('img').each(function(){
            let t = $(this);
            if(t.width() > contentWidth){
                t.attr('width', '100%');
            }
        });
    }

    //Listeleri ayarlama
    {
        contentDiv.find('ul, ol').css({'padding-left':'40px'});
        contentDiv.find('li').css({
            'list-style': 'inherit'
        });
    }
}
function CreateButton(id,value,buttonStyle='',spanStyle=''){
    return `<span class="button disHighlight" id="${id}" style="cursor:pointer; ${buttonStyle}">`+
        `   <a class="button" style="text-decoration:none;">`+
        `      <span style="${spanStyle}">${value}</span>`+
        `   </a>`+
        `</span>`;
}