MediaWiki:Common.js: различия между версиями

Материал из Space Station 14 Вики
мНет описания правки
мНет описания правки
Строка 1: Строка 1:
const currentURL = window.location.href;
const currentURL = window.location.href;


const serversStatus = [
const serversStatus = [{
   {
   name: "main",
    name: "main",
  connect: "https://game2.station14.ru/main/server/status"
    connect: "https://game2.station14.ru/main/server/status"
}, {
  },
   name: "nova",
   {
  connect: "https://game2.station14.ru/nova/server/status"
    name: "nova",
}, {
    connect: "https://game2.station14.ru/nova/server/status"
   name: "athara",
  },
  connect: "https://game2.station14.ru/athara/server/status"
   {
}, {
    name: "athara",
   name: "solaris",
    connect: "https://game2.station14.ru/athara/server/status"
  connect: "https://game2.station14.ru/solaris/server/status"
  },
}, {
   {
   name: "echo",
    name: "solaris",
  connect: "https://game2.station14.ru/echo/server/status"
    connect: "https://game2.station14.ru/solaris/server/status"
}, {
  },
   name: "elysium",
   {
  connect: "https://game2.station14.ru/elysium/server/status"
    name: "echo",
}, {
    connect: "https://game2.station14.ru/echo/server/status"
   name: "nebula",
  },
  connect: "https://game2.station14.ru/nebula/server/status"
   {
}, {
    name: "elysium",
   name: "wl",
    connect: "https://game2.station14.ru/elysium/server/status"
  connect: "https://game2.station14.ru/wl/server/status"
  },
}, {
   {
   name: "frontier",
    name: "nebula",
  connect: "https://thingproxy.freeboard.io/fetch/https://arles.station14.ru/frontier-main/server/status"
    connect: "https://game2.station14.ru/nebula/server/status"
}, {
  },
   name: "fallout",
   {
  connect: "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status"
    name: "wl",
}, {
    connect: "https://game2.station14.ru/wl/server/status"
   name: "marines",
  },
  connect: "https://game1.station14.ru/marines-main/server/status"
   {
}, {
  name: "frontier",
   name: "stalker",
  connect: "https://thingproxy.freeboard.io/fetch/https://arles.station14.ru/frontier-main/server/status"
  connect: "https://thingproxy.freeboard.io/fetch/https://game.stalkers14.xyz/status"
  },
}];
   {
  name: "fallout",
  connect: "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status"
  },
   {
  name: "marines",
  connect: "https://game1.station14.ru/marines-main/server/status"
  },
   {
  name:"stalker",
  connect: "https://thingproxy.freeboard.io/fetch/https://game.stalkers14.xyz/status"
  }
];


function kerisarTest() {
function kerisarTest() {
Строка 67: Строка 54:
     "https://thumb.cloud.mail.ru/weblink/thumb/xw1/LLmd/Qui7Xbp6g");
     "https://thumb.cloud.mail.ru/weblink/thumb/xw1/LLmd/Qui7Xbp6g");
   jsTest.appendChild(kerisarPicture);
   jsTest.appendChild(kerisarPicture);
 
 
 
 
   const iFrameFrontier = document.createElement('iframe');
   const iFrameFrontier = document.createElement('iframe');
   iFrameFrontier.setAttribute('src',"https://arles.station14.ru/frontier-main/server/status");
   iFrameFrontier.setAttribute('src', "https://arles.station14.ru/frontier-main/server/status");
   jsTest.appendChild(iFrameFrontier);
   jsTest.appendChild(iFrameFrontier);
 
 
   const iFrameFallout = document.createElement('iframe');
   const iFrameFallout = document.createElement('iframe');
   iFrameFrontier.setAttribute('src',"https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status");
   iFrameFrontier.setAttribute('src', "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status");
   jsTest.appendChild(iFrameFallout);
   jsTest.appendChild(iFrameFallout);
 
 
   const iFrameStalker = document.createElement('iframe');
   const iFrameStalker = document.createElement('iframe');
   iFrameFrontier.setAttribute('src',"https://game.stalkers14.xyz/status");
   iFrameFrontier.setAttribute('src', "https://game.stalkers14.xyz/status");
   jsTest.appendChild(iFrameStalker);
   jsTest.appendChild(iFrameStalker);
 
 
 
 
 
 
   const scriptTest = document.createElement('script');
   const scriptTest = document.createElement('script');
   scriptTest.setAttribute('src',"https://game.stalkers14.xyz/status");
   scriptTest.setAttribute('src', "https://game.stalkers14.xyz/status");
   jsTest.appendChild(scriptTest);
   jsTest.appendChild(scriptTest);


var bootstrap_enabled = (typeof $().modal == 'function');
  var bootstrap_enabled = (typeof $().modal == 'function');
 
  console.log("bootstrap_enabled", bootstrap_enabled);


console.log("bootstrap_enabled", bootstrap_enabled);
 
}
}


Строка 111: Строка 98:


function shangeServersInfo(serverObj, serverName) {
function shangeServersInfo(serverObj, serverName) {
console.log(serverObj, serverName);
  console.log(serverObj, serverName);
 
if (currentURL.includes("Kerisar")) {
  if (currentURL.includes("Kerisar")) {
      const serverStatusFrame = document.getElementById(serverName);
    const serverStatusFrame = document.getElementById(serverName);
      //console.log("serverStatusFrame", serverStatusFrame);
    //console.log("serverStatusFrame", serverStatusFrame);
     
 
      serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" + serverObj.round;
    serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" + serverObj.round;
      if (serverObj.status === 0) {
    if (serverObj.status === 0) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Лобби";
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Лобби";
      }
    }
      if (serverObj.status === 1) {
    if (serverObj.status === 1) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Раунд идёт";
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Раунд идёт";
      }
    }
      if (serverObj.status === 2) {
    if (serverObj.status === 2) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Завершение";
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Завершение";
      }
      serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map;
      serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time;
      serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players;
      serverStatusFrame.querySelector(".serverPresetSet").textContent = serverObj.preset;
     }
     }
    serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map;
    serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time;
    serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players;
    serverStatusFrame.querySelector(".serverPresetSet").textContent = serverObj.preset;
  }
}
}


Строка 137: Строка 124:


function getTimeDifference(roundStartTime, callback) {
function getTimeDifference(roundStartTime, callback) {
    const xhr = new XMLHttpRequest();
  const xhr = new XMLHttpRequest();
    const connect = 'http://worldtimeapi.org/api/timezone/Europe/Moscow';
  const connect = 'http://worldtimeapi.org/api/timezone/Europe/Moscow';
   
 
    xhr.open('GET', connect, true);
  xhr.open('GET', connect, true);
    xhr.onload = function() {
  xhr.onload = function() {
        if (xhr.status >= 200 && xhr.status < 300) {
    if (xhr.status >= 200 && xhr.status < 300) {
            const data = JSON.parse(xhr.responseText);
      const data = JSON.parse(xhr.responseText);
            const currentTime = new Date(data.datetime);
      const currentTime = new Date(data.datetime);
            const serverStartTime = new Date(roundStartTime);
      const serverStartTime = new Date(roundStartTime);
 
      // Разница во времени в миллисекундах
      const timeDifference = currentTime - serverStartTime;
 
      // Преобразуем разницу в секунды, минуты, часы и т.д.
      const seconds = Math.floor((timeDifference / 1000) % 60);
      const minutes = Math.floor((timeDifference / (1000 * 60)) % 60);
      const hours = Math.floor((timeDifference / (1000 * 60 * 60)) % 24);
      const days = Math.floor(timeDifference / (1000 * 60 * 60 * 24));


            // Разница во времени в миллисекундах
      // Передаем результат в коллбэк без деструктуризации
            const timeDifference = currentTime - serverStartTime;
      callback(null, {
        days: days,
        hours: hours,
        minutes: minutes,
        seconds: seconds,
        totalMilliseconds: timeDifference
      });
    } else {
      callback('Ошибка при выполнении запроса: ' + xhr.status, null);
    }
  };


            // Преобразуем разницу в секунды, минуты, часы и т.д.
  xhr.onerror = function() {
            const seconds = Math.floor((timeDifference / 1000) % 60);
    callback('Ошибка при выполнении запроса', null);
            const minutes = Math.floor((timeDifference / (1000 * 60)) % 60);
  };
            const hours = Math.floor((timeDifference / (1000 * 60 * 60)) % 24);
            const days = Math.floor(timeDifference / (1000 * 60 * 60 * 24));


            // Передаем результат в коллбэк без деструктуризации
  xhr.send();
            callback(null, {
                days: days,
                hours: hours,
                minutes: minutes,
                seconds: seconds,
                totalMilliseconds: timeDifference
            });
        } else {
            callback('Ошибка при выполнении запроса: ' + xhr.status, null);
        }
    };
   
    xhr.onerror = function() {
        callback('Ошибка при выполнении запроса', null);
    };
   
    xhr.send();
}
}




function standartServersInfo(connect, name) {
function standartServersInfo(connect, name) {
getServersInfo(connect, function(error, data) {
  getServersInfo(connect, function(error, data) {
     if (error) {
     if (error) {
       console.error(error); // Обработка ошибок
       console.error(error); // Обработка ошибок
Строка 184: Строка 171:
       //console.log("Ответ получен", data)
       //console.log("Ответ получен", data)
       const serverInfo = {
       const serverInfo = {
      name: data.name,
        name: data.name,
         round: data.round_id,
         round: data.round_id,
         status: data.run_level,
         status: data.run_level,
Строка 193: Строка 180:
         preset: data.preset
         preset: data.preset
       };
       };
      shangeServersInfo(serverInfo, name);
      shangeServersInfo(serverInfo, name);
       console.log(serverInfo);
       console.log(serverInfo);
     }
     }
Строка 201: Строка 188:


function standartServersInfoAll() {
function standartServersInfoAll() {
for (var i = 0; i < serversStatus.length; i++) {
  for (var i = 0; i < serversStatus.length; i++) {
standartServersInfo(serversStatus[i].connect, serversStatus[i].name);
    standartServersInfo(serversStatus[i].connect, serversStatus[i].name);
}
  }
}
}


function customCSS(textCSS){
function customCSS(textCSS) {
const styleSheet = document.createElement("style");
  const styleSheet = document.createElement("style");
styleSheet.textContent = textCSS;
  styleSheet.textContent = textCSS;
//console.log(textCSS);
  //console.log(textCSS);
 
document.head.appendChild(styleSheet);
  document.head.appendChild(styleSheet);
}
}


Строка 233: Строка 220:


$(document).ready(function() {
$(document).ready(function() {
if (currentURL.includes("Kerisar")) {
  if (currentURL.includes("Kerisar")) {
kerisarTest();
    kerisarTest();
standartServersInfoAll();
    standartServersInfoAll();
}
  }
var cssEls = document.querySelectorAll('.customCSS');
  var cssEls = document.querySelectorAll('.customCSS');
 
if (cssEls.length > 0) {
  if (cssEls.length > 0) {
for (var i = 0; i < cssEls.length; i++) {
    for (var i = 0; i < cssEls.length; i++) {
const textCSS = cssEls[i].textContent;
      const textCSS = cssEls[i].textContent;
console.log(textCSS);
      console.log(textCSS);
customCSS(textCSS);
      customCSS(textCSS);
}
    }
}
  }
var needBootstrap = document.querySelectorAll('.needBootstrap');
  var needBootstrap = document.querySelectorAll('.needBootstrap');
if (needBootstrap.length > 0) {
  if (needBootstrap.length > 0) {
console.log("needBootstrap() start");
    console.log("needBootstrap() start");
needBootstrap();
    needBootstrap();
}
  }
 
});
 


document.addEventListener('DOMContentLoaded', function() {
  var needBootstrap = document.querySelectorAll('.needBootstrap');
  if (needBootstrap.length > 0) {
    console.log("needBootstrap() start");
    needBootstrap();
  }
});
});


Строка 296: Строка 292:
/* Variables for interface text used throughout the script, for ease of translating */
/* Variables for interface text used throughout the script, for ease of translating */
var i18n = {
var i18n = {
    // Collapsible elements and page loader
  // Collapsible elements and page loader
    hideText: 'скрыть',
  hideText: 'скрыть',
    showText: 'показать',
  showText: 'показать',
   
 
    // Page loader
  // Page loader
    loadErrorTitle: 'Возникла ошибка при загрузке содержимого'
  loadErrorTitle: 'Возникла ошибка при загрузке содержимого'
};
};


Строка 309: Строка 305:
mcw.events = {};
mcw.events = {};
/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */
/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */
mw.hook( 'wikipage.content' ).add( function( $wikipageContent ) {
mw.hook('wikipage.content').add(function($wikipageContent) {
/**
  /**
* Page loader
  * Page loader
*
  *
* Allows a page to be downloaded and displayed on demand.
  * Allows a page to be downloaded and displayed on demand.
* Use with Template:LoadPage and Template:LoadBox
  * Use with Template:LoadPage and Template:LoadBox
*/
  */
 
  (function() {
    var $loadPage = $wikipageContent.find('.load-page');
    if (!$loadPage.length) {
      return;
    }
 
    // We need the spinner to show loading is happening, but we don't want
    // to have a delay while the module downloads, so we'll load this now,
    // regardless of if something is clicked
    mw.loader.load('jquery.spinner');
 
    // Create button starting with hide text
    // Will be changed to the show text while calculating the maximum button size
    var $buttonTemplate = $('<span>').addClass('mw-editsection-like load-page-button')
      .append('[ ', $('<span>').addClass('jslink').text(i18n.hideText), ' ]');
 
    var extractList = function($contentContainer, listClass) {
      var $content = $contentContainer.find('.mw-parser-output > ul > li > ul').children(':not(.nbttree-inherited)');
      if (listClass) {
        $content.addClass(listClass);
      }
 
      return $content;
    };
 
    $loadPage.each(function() {
      var $body = $(this);
      var page = $body.data('page');
      if (!page) {
        return;
      }
 
      var template = $body.data('template');
      var treeview = $body.data('treeview');
      var treeviewClass = $body.data('treeviewclass');
      var $heading;
      var $contentContainer;
      var $content;
      var $button = $buttonTemplate.clone();
      var $buttonLink = $button.find('.jslink');
      if (treeview) {
        $heading = $body;
        $contentContainer = $('<div>');
      } else {
        $heading = $body.children().first();
        $contentContainer = $body.find('.load-page-content');
      }
 
      // Add the button
      $heading.append($button);
 
      // Move the edit button to the right spot
      $contentContainer.find('.mw-editsection, .mw-editsection-like').insertAfter($button);
 
      // Find max button width, and set its min-width to it
      var hideWidth = $button.width();
      $buttonLink.text(i18n.showText);
      var showWidth = $button.width();
 
      if (hideWidth !== showWidth) {
        $button.css('min-width', hideWidth > showWidth ? hideWidth : showWidth);
      }
 
      $buttonLink.click(function() {
        if ($body.hasClass('pageloader-contentloaded')) {
          if ($buttonLink.text() === i18n.showText) {
            if (treeview) {
              $content.insertAfter($body);
            } else {
              $contentContainer.show();
            }
            $buttonLink.text(i18n.hideText);
          } else {
            if (treeview) {
              $content.detach();
            } else {
              $contentContainer.hide();
            }
            $buttonLink.text(i18n.showText);
          }
          return;
        }
 
        // See if this was loaded elsewhere before making a request
        var gotContent;
        $('.pageloader-contentloaded').each(function() {
          var $fLoader = $(this);
          if ($fLoader.data('page') === page && $fLoader.data('pageloader-content')) {
            $contentContainer.html($fLoader.data('pageloader-content')).removeClass('noscript');
            mw.hook('wikipage.content').fire($contentContainer);
 
            if (treeview) {
              $body.find('.noscript').remove();
              $content = extractList($contentContainer, treeviewClass);
              $content.insertAfter($body);
            }
 
            $buttonLink.text(i18n.hideText);
            $body.addClass('pageloader-contentloaded');
            gotContent = true;
            return false;
          }
        });
        if (gotContent) {
          return;
        }
 
        // Just in-case the spinner module is still not ready yet
        var $spinner = $();
        mw.loader.using('jquery.spinner', function() {
          // $spinner will be false if the content somehow loaded before the module did
          if ($spinner) {
            $spinner = $.createSpinner().addClass('mw-editsection-like')
              .css('min-width', $button.css('min-width'));
            $button.hide().after($spinner);
          }
        });
 
        var requestData = {
          action: 'parse',
          prop: 'text'
        };
        if (template) {
          requestData.page = page;
        } else {
          requestData.title = mw.config.get('wgPageName');
          requestData.text = '{' + '{:' + page + '}}';
        }
        new mw.Api().get(requestData).done(function(data) {
          var html = data.parse.text['*'];
          $contentContainer.html(html).removeClass('noscript');
 
          // Resolve self-links
          if (template) {
            var curPage = '/' + mw.config.get('wgPageName');
            $contentContainer.find('a').each(function() {
              var $link = $(this);
              if ($link.attr('href') === curPage) {
                $link.replaceWith($('<strong>').addClass('selflink').append($link.contents()));
              }
            });
            html = $contentContainer.html();
          }
 
          $body.data('pageloader-content', html);
 
          // Fire content hook on the new content, running all this stuff again and more :)
          mw.hook('wikipage.content').fire($contentContainer);
 
          if (treeview) {
            $body.find('.noscript').remove();
            $content = extractList($contentContainer, treeviewClass);
            $content.insertAfter($body);
          }
 
          $spinner.remove();
          $spinner = false;
          $buttonLink.text(i18n.hideText);
          $button.show();
          $body.addClass('pageloader-contentloaded');
        }).fail(function(_, error) {
          $spinner.remove();
          $spinner = false;
          $button.show();
 
          var errorText = '';
          if (error.textStatus) {
            errorText = error.textStatus;
          } else if (error.error) {
            errorText = error.error.info;
          }


( function() {
          mw.notify(errorText, {
var $loadPage = $wikipageContent.find( '.load-page' );
            title: i18n.loadErrorTitle,
if ( !$loadPage.length ) {
            autoHide: false
return;
          });
}
        });
      });
// We need the spinner to show loading is happening, but we don't want
    });
// to have a delay while the module downloads, so we'll load this now,
  }());
// regardless of if something is clicked
mw.loader.load( 'jquery.spinner' );
// Create button starting with hide text
// Will be changed to the show text while calculating the maximum button size
var $buttonTemplate = $( '<span>' ).addClass( 'mw-editsection-like load-page-button' )
.append( '[ ', $( '<span>' ).addClass( 'jslink' ).text( i18n.hideText ), ' ]' );
var extractList = function( $contentContainer, listClass ) {
var $content = $contentContainer.find( '.mw-parser-output > ul > li > ul' ).children( ':not(.nbttree-inherited)' );
if ( listClass ) {
$content.addClass( listClass );
}
return $content;
};
$loadPage.each( function() {
var $body = $( this );
var page = $body.data( 'page' );
if ( !page ) {
return;
}
var template = $body.data( 'template' );
var treeview = $body.data( 'treeview' );
var treeviewClass = $body.data( 'treeviewclass' );
var $heading;
var $contentContainer;
var $content;
var $button = $buttonTemplate.clone();
var $buttonLink = $button.find( '.jslink' );
if ( treeview ) {
$heading = $body;
$contentContainer = $( '<div>' );
} else {
$heading = $body.children().first();
$contentContainer = $body.find( '.load-page-content' );
}
// Add the button
$heading.append( $button );
// Move the edit button to the right spot
$contentContainer.find( '.mw-editsection, .mw-editsection-like' ).insertAfter( $button );
// Find max button width, and set its min-width to it
var hideWidth = $button.width();
$buttonLink.text( i18n.showText );
var showWidth = $button.width();
if ( hideWidth !== showWidth ) {
$button.css( 'min-width', hideWidth > showWidth ? hideWidth : showWidth );
}
$buttonLink.click( function() {
if ( $body.hasClass( 'pageloader-contentloaded' ) ) {
if ( $buttonLink.text() === i18n.showText ) {
if ( treeview ) {
$content.insertAfter( $body );
} else {
$contentContainer.show();
}
$buttonLink.text( i18n.hideText );
} else {
if ( treeview ) {
$content.detach();
} else {
$contentContainer.hide();
}
$buttonLink.text( i18n.showText );
}
return;
}
// See if this was loaded elsewhere before making a request
var gotContent;
$( '.pageloader-contentloaded' ).each( function() {
var $fLoader = $( this );
if ( $fLoader.data( 'page' ) === page && $fLoader.data( 'pageloader-content' ) ) {
$contentContainer.html( $fLoader.data( 'pageloader-content' ) ).removeClass( 'noscript' );
mw.hook( 'wikipage.content' ).fire( $contentContainer );
if ( treeview ) {
$body.find( '.noscript' ).remove();
$content = extractList( $contentContainer, treeviewClass );
$content.insertAfter( $body );
}
$buttonLink.text( i18n.hideText );
$body.addClass( 'pageloader-contentloaded' );
gotContent = true;
return false;
}
} );
if ( gotContent ) {
return;
}
// Just in-case the spinner module is still not ready yet
var $spinner = $();
mw.loader.using( 'jquery.spinner', function() {
// $spinner will be false if the content somehow loaded before the module did
if ( $spinner ) {
$spinner = $.createSpinner().addClass( 'mw-editsection-like' )
.css( 'min-width', $button.css( 'min-width' ) );
$button.hide().after( $spinner );
}
} );
var requestData = {
action: 'parse',
prop: 'text'
};
if ( template ) {
requestData.page = page;
} else {
requestData.title = mw.config.get( 'wgPageName' );
requestData.text = '{' + '{:' + page + '}}';
}
new mw.Api().get( requestData ).done( function( data ) {
var html = data.parse.text['*'];
$contentContainer.html( html ).removeClass( 'noscript' );
// Resolve self-links
if ( template ) {
var curPage = '/' + mw.config.get( 'wgPageName' );
$contentContainer.find( 'a' ).each( function() {
var $link = $( this );
if ( $link.attr( 'href' ) === curPage ) {
$link.replaceWith( $( '<strong>' ).addClass( 'selflink' ).append( $link.contents() ) );
}
} );
html = $contentContainer.html();
}
$body.data( 'pageloader-content', html );
// Fire content hook on the new content, running all this stuff again and more :)
mw.hook( 'wikipage.content' ).fire( $contentContainer );
if ( treeview ) {
$body.find( '.noscript' ).remove();
$content = extractList( $contentContainer, treeviewClass );
$content.insertAfter( $body );
}
$spinner.remove();
$spinner = false;
$buttonLink.text( i18n.hideText );
$button.show();
$body.addClass( 'pageloader-contentloaded' );
} ).fail( function( _, error ) {
$spinner.remove();
$spinner = false;
$button.show();
var errorText = '';
if ( error.textStatus ) {
errorText = error.textStatus;
} else if ( error.error ) {
errorText = error.error.info;
}
mw.notify( errorText, { title: i18n.loadErrorTitle, autoHide: false } );
} );
} );
} );
}() );


/**
  /**
* Element animator
  * Element animator
*
  *
* Will cycle the active class on any child elements
  * Will cycle the active class on any child elements
* within an element with the animated class.
  * within an element with the animated class.
*/
  */
( function() {
  (function() {
if ( !mcw.animate ) {
    if (!mcw.animate) {
mcw.animate = setInterval( function() {
      mcw.animate = setInterval(function() {
$( '.animated' ).each( function() {
        $('.animated').each(function() {
var $elem = $( this );
          var $elem = $(this);
var $current = $elem.children( '.active' );
          var $current = $elem.children('.active');
var $next = $current.nextAll( ':not(.skip):first' );
          var $next = $current.nextAll(':not(.skip):first');
// Loop back to the start
          // Loop back to the start
if ( !$next.length ) {
          if (!$next.length) {
$next = $elem.children( ':not(.skip):first' );
            $next = $elem.children(':not(.skip):first');
}
          }
$current.removeClass( 'active' );
          $current.removeClass('active');
$next.addClass( 'active' );
          $next.addClass('active');
} );
        });
}, 2000 );
      }, 2000);
}
    }
}() );
  }());


} );
});


// SS220 import end
// SS220 import end

Версия от 16:20, 14 августа 2024

const currentURL = window.location.href;

const serversStatus = [{
  name: "main",
  connect: "https://game2.station14.ru/main/server/status"
}, {
  name: "nova",
  connect: "https://game2.station14.ru/nova/server/status"
}, {
  name: "athara",
  connect: "https://game2.station14.ru/athara/server/status"
}, {
  name: "solaris",
  connect: "https://game2.station14.ru/solaris/server/status"
}, {
  name: "echo",
  connect: "https://game2.station14.ru/echo/server/status"
}, {
  name: "elysium",
  connect: "https://game2.station14.ru/elysium/server/status"
}, {
  name: "nebula",
  connect: "https://game2.station14.ru/nebula/server/status"
}, {
  name: "wl",
  connect: "https://game2.station14.ru/wl/server/status"
}, {
  name: "frontier",
  connect: "https://thingproxy.freeboard.io/fetch/https://arles.station14.ru/frontier-main/server/status"
}, {
  name: "fallout",
  connect: "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status"
}, {
  name: "marines",
  connect: "https://game1.station14.ru/marines-main/server/status"
}, {
  name: "stalker",
  connect: "https://thingproxy.freeboard.io/fetch/https://game.stalkers14.xyz/status"
}];

function kerisarTest() {
  console.log("Проверка консоли");
  const currentUrl = window.location.href;
  console.log("currentUrl", currentUrl);

  const jsTest = document.getElementById("jsTest");
  console.log("jsTest", jsTest);
  const buttonTest = document.createElement('button');
  buttonTest.classList.add('testButtonJs');
  buttonTest.textContent = "Привет, я кнопка. Пока я ничего не делаю";
  jsTest.appendChild(buttonTest);
  const kerisarPicture = document.createElement('img');
  kerisarPicture.setAttribute('src',
    "https://thumb.cloud.mail.ru/weblink/thumb/xw1/LLmd/Qui7Xbp6g");
  jsTest.appendChild(kerisarPicture);


  const iFrameFrontier = document.createElement('iframe');
  iFrameFrontier.setAttribute('src', "https://arles.station14.ru/frontier-main/server/status");
  jsTest.appendChild(iFrameFrontier);

  const iFrameFallout = document.createElement('iframe');
  iFrameFrontier.setAttribute('src', "https://thingproxy.freeboard.io/fetch/http://188.92.78.98:1221/status");
  jsTest.appendChild(iFrameFallout);

  const iFrameStalker = document.createElement('iframe');
  iFrameFrontier.setAttribute('src', "https://game.stalkers14.xyz/status");
  jsTest.appendChild(iFrameStalker);



  const scriptTest = document.createElement('script');
  scriptTest.setAttribute('src', "https://game.stalkers14.xyz/status");
  jsTest.appendChild(scriptTest);

  var bootstrap_enabled = (typeof $().modal == 'function');

  console.log("bootstrap_enabled", bootstrap_enabled);

}

function getServersInfo(connect, callback) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', connect, true);
  xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
      const data = JSON.parse(xhr.responseText);
      callback(null, data);
    } else {
      callback('Ошибка при выполнении запроса: ' + xhr.status, null);
    }
  };
  xhr.onerror = function() {
    callback('Ошибка при выполнении запроса', null);
  };
  xhr.send();
}

function shangeServersInfo(serverObj, serverName) {
  console.log(serverObj, serverName);

  if (currentURL.includes("Kerisar")) {
    const serverStatusFrame = document.getElementById(serverName);
    //console.log("serverStatusFrame", serverStatusFrame);

    serverStatusFrame.querySelector(".serverInfoRoundSet").textContent = "#" + serverObj.round;
    if (serverObj.status === 0) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Лобби";
    }
    if (serverObj.status === 1) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Раунд идёт";
    }
    if (serverObj.status === 2) {
      serverStatusFrame.querySelector(".serverStatusSet").textContent = "Завершение";
    }
    serverStatusFrame.querySelector(".serverMapSet").textContent = serverObj.map;
    serverStatusFrame.querySelector(".serverTimeSet").textContent = serverObj.time;
    serverStatusFrame.querySelector(".serverPlayersSet").textContent = serverObj.players;
    serverStatusFrame.querySelector(".serverPresetSet").textContent = serverObj.preset;
  }
}



function getTimeDifference(roundStartTime, callback) {
  const xhr = new XMLHttpRequest();
  const connect = 'http://worldtimeapi.org/api/timezone/Europe/Moscow';

  xhr.open('GET', connect, true);
  xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
      const data = JSON.parse(xhr.responseText);
      const currentTime = new Date(data.datetime);
      const serverStartTime = new Date(roundStartTime);

      // Разница во времени в миллисекундах
      const timeDifference = currentTime - serverStartTime;

      // Преобразуем разницу в секунды, минуты, часы и т.д.
      const seconds = Math.floor((timeDifference / 1000) % 60);
      const minutes = Math.floor((timeDifference / (1000 * 60)) % 60);
      const hours = Math.floor((timeDifference / (1000 * 60 * 60)) % 24);
      const days = Math.floor(timeDifference / (1000 * 60 * 60 * 24));

      // Передаем результат в коллбэк без деструктуризации
      callback(null, {
        days: days,
        hours: hours,
        minutes: minutes,
        seconds: seconds,
        totalMilliseconds: timeDifference
      });
    } else {
      callback('Ошибка при выполнении запроса: ' + xhr.status, null);
    }
  };

  xhr.onerror = function() {
    callback('Ошибка при выполнении запроса', null);
  };

  xhr.send();
}


function standartServersInfo(connect, name) {
  getServersInfo(connect, function(error, data) {
    if (error) {
      console.error(error); // Обработка ошибок
    } else {
      //console.log("Ответ получен", data)
      const serverInfo = {
        name: data.name,
        round: data.round_id,
        status: data.run_level,
        map: data.map,
        time: getTimeDifference(data.round_start_time),
        //time: new Date(data.round_start_time).toLocaleString(),
        players: data.players,
        preset: data.preset
      };
      shangeServersInfo(serverInfo, name);
      console.log(serverInfo);
    }
  });
}


function standartServersInfoAll() {
  for (var i = 0; i < serversStatus.length; i++) {
    standartServersInfo(serversStatus[i].connect, serversStatus[i].name);
  }
}

function customCSS(textCSS) {
  const styleSheet = document.createElement("style");
  styleSheet.textContent = textCSS;
  //console.log(textCSS);

  document.head.appendChild(styleSheet);
}

function needBootstrap() {
  const link = document.createElement('link');
  link.href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css";
  link.rel = "stylesheet";
  link.integrity = "sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC";
  link.crossOrigin = "anonymous";

  const script = document.createElement('script');
  script.src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js";
  script.integrity = "sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM";
  script.crossOrigin = "anonymous";

  // Добавляем теги в <head>
  document.head.appendChild(link);
  document.head.appendChild(script);
}


$(document).ready(function() {
  if (currentURL.includes("Kerisar")) {
    kerisarTest();
    standartServersInfoAll();
  }
  var cssEls = document.querySelectorAll('.customCSS');

  if (cssEls.length > 0) {
    for (var i = 0; i < cssEls.length; i++) {
      const textCSS = cssEls[i].textContent;
      console.log(textCSS);
      customCSS(textCSS);
    }
  }
  var needBootstrap = document.querySelectorAll('.needBootstrap');
  if (needBootstrap.length > 0) {
    console.log("needBootstrap() start");
    needBootstrap();
  }

});


document.addEventListener('DOMContentLoaded', function() {
  var needBootstrap = document.querySelectorAll('.needBootstrap');
  if (needBootstrap.length > 0) {
    console.log("needBootstrap() start");
    needBootstrap();
  }
});

/*WikiEditor/Викификатор*/
if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
  mw.loader.load(
    '//ru.wikipedia.org/w/index.php?title=MediaWiki:Gadget-wikificator.js&action=raw&ctype=text/javascript'
  );
}
var customizeToolbar = function() {
  $('#wpTextbox1').wikiEditor('addToToolbar', {
    'section': 'advanced',
    'group': 'format',
    'tools': {
      'wikify': {
        label: 'Викификатор',
        type: 'button',
        icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
        action: {
          type: 'callback',
          execute: function(context) {
            Wikify();
          }
        }
      }
    }
  });
};
if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) !== -1) {
  mw.loader.using('user.options', function() {
    if (mw.user.options.get('usebetatoolbar')) {
      mw.loader.using('ext.wikiEditor.toolbar', function() {
        $(document).ready(customizeToolbar);
      });
    }
  });
}


/**
 * Taken from https://wiki.ss220.space/index.php?title=MediaWiki:Common.js&oldid=35626
 */

/* Variables for interface text used throughout the script, for ease of translating */
var i18n = {
  // Collapsible elements and page loader
  hideText: 'скрыть',
  showText: 'показать',

  // Page loader
  loadErrorTitle: 'Возникла ошибка при загрузке содержимого'
};

var mcw = window.mcw = {};

/* Keep track of delegated events on dynamic content */
mcw.events = {};
/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */
mw.hook('wikipage.content').add(function($wikipageContent) {
  /**
   * Page loader
   *
   * Allows a page to be downloaded and displayed on demand.
   * Use with Template:LoadPage and Template:LoadBox
   */

  (function() {
    var $loadPage = $wikipageContent.find('.load-page');
    if (!$loadPage.length) {
      return;
    }

    // We need the spinner to show loading is happening, but we don't want
    // to have a delay while the module downloads, so we'll load this now,
    // regardless of if something is clicked
    mw.loader.load('jquery.spinner');

    // Create button starting with hide text
    // Will be changed to the show text while calculating the maximum button size
    var $buttonTemplate = $('<span>').addClass('mw-editsection-like load-page-button')
      .append('[ ', $('<span>').addClass('jslink').text(i18n.hideText), ' ]');

    var extractList = function($contentContainer, listClass) {
      var $content = $contentContainer.find('.mw-parser-output > ul > li > ul').children(':not(.nbttree-inherited)');
      if (listClass) {
        $content.addClass(listClass);
      }

      return $content;
    };

    $loadPage.each(function() {
      var $body = $(this);
      var page = $body.data('page');
      if (!page) {
        return;
      }

      var template = $body.data('template');
      var treeview = $body.data('treeview');
      var treeviewClass = $body.data('treeviewclass');
      var $heading;
      var $contentContainer;
      var $content;
      var $button = $buttonTemplate.clone();
      var $buttonLink = $button.find('.jslink');
      if (treeview) {
        $heading = $body;
        $contentContainer = $('<div>');
      } else {
        $heading = $body.children().first();
        $contentContainer = $body.find('.load-page-content');
      }

      // Add the button
      $heading.append($button);

      // Move the edit button to the right spot
      $contentContainer.find('.mw-editsection, .mw-editsection-like').insertAfter($button);

      // Find max button width, and set its min-width to it
      var hideWidth = $button.width();
      $buttonLink.text(i18n.showText);
      var showWidth = $button.width();

      if (hideWidth !== showWidth) {
        $button.css('min-width', hideWidth > showWidth ? hideWidth : showWidth);
      }

      $buttonLink.click(function() {
        if ($body.hasClass('pageloader-contentloaded')) {
          if ($buttonLink.text() === i18n.showText) {
            if (treeview) {
              $content.insertAfter($body);
            } else {
              $contentContainer.show();
            }
            $buttonLink.text(i18n.hideText);
          } else {
            if (treeview) {
              $content.detach();
            } else {
              $contentContainer.hide();
            }
            $buttonLink.text(i18n.showText);
          }
          return;
        }

        // See if this was loaded elsewhere before making a request
        var gotContent;
        $('.pageloader-contentloaded').each(function() {
          var $fLoader = $(this);
          if ($fLoader.data('page') === page && $fLoader.data('pageloader-content')) {
            $contentContainer.html($fLoader.data('pageloader-content')).removeClass('noscript');
            mw.hook('wikipage.content').fire($contentContainer);

            if (treeview) {
              $body.find('.noscript').remove();
              $content = extractList($contentContainer, treeviewClass);
              $content.insertAfter($body);
            }

            $buttonLink.text(i18n.hideText);
            $body.addClass('pageloader-contentloaded');
            gotContent = true;
            return false;
          }
        });
        if (gotContent) {
          return;
        }

        // Just in-case the spinner module is still not ready yet
        var $spinner = $();
        mw.loader.using('jquery.spinner', function() {
          // $spinner will be false if the content somehow loaded before the module did
          if ($spinner) {
            $spinner = $.createSpinner().addClass('mw-editsection-like')
              .css('min-width', $button.css('min-width'));
            $button.hide().after($spinner);
          }
        });

        var requestData = {
          action: 'parse',
          prop: 'text'
        };
        if (template) {
          requestData.page = page;
        } else {
          requestData.title = mw.config.get('wgPageName');
          requestData.text = '{' + '{:' + page + '}}';
        }
        new mw.Api().get(requestData).done(function(data) {
          var html = data.parse.text['*'];
          $contentContainer.html(html).removeClass('noscript');

          // Resolve self-links
          if (template) {
            var curPage = '/' + mw.config.get('wgPageName');
            $contentContainer.find('a').each(function() {
              var $link = $(this);
              if ($link.attr('href') === curPage) {
                $link.replaceWith($('<strong>').addClass('selflink').append($link.contents()));
              }
            });
            html = $contentContainer.html();
          }

          $body.data('pageloader-content', html);

          // Fire content hook on the new content, running all this stuff again and more :)
          mw.hook('wikipage.content').fire($contentContainer);

          if (treeview) {
            $body.find('.noscript').remove();
            $content = extractList($contentContainer, treeviewClass);
            $content.insertAfter($body);
          }

          $spinner.remove();
          $spinner = false;
          $buttonLink.text(i18n.hideText);
          $button.show();
          $body.addClass('pageloader-contentloaded');
        }).fail(function(_, error) {
          $spinner.remove();
          $spinner = false;
          $button.show();

          var errorText = '';
          if (error.textStatus) {
            errorText = error.textStatus;
          } else if (error.error) {
            errorText = error.error.info;
          }

          mw.notify(errorText, {
            title: i18n.loadErrorTitle,
            autoHide: false
          });
        });
      });
    });
  }());

  /**
   * Element animator
   *
   * Will cycle the active class on any child elements
   * within an element with the animated class.
   */
  (function() {
    if (!mcw.animate) {
      mcw.animate = setInterval(function() {
        $('.animated').each(function() {
          var $elem = $(this);
          var $current = $elem.children('.active');
          var $next = $current.nextAll(':not(.skip):first');
          // Loop back to the start
          if (!$next.length) {
            $next = $elem.children(':not(.skip):first');
          }
          $current.removeClass('active');
          $next.addClass('active');
        });
      }, 2000);
    }
  }());

});

// SS220 import end