GN_SortNanoArtefacts

Сортировка наноартефактов существ

当前为 2016-12-08 提交的版本,查看 最新版本

// ==UserScript==
// @name        GN_SortNanoArtefacts
// @namespace   Gradient
// @description Сортировка наноартефактов существ
// @include     /^https{0,1}:\/\/((www|qrator)\.heroeswm\.ru|178\.248\.235\.15)\/arts_for_monsters\.php.*/
// @version     1.0.4
// ==/UserScript==

"use strict";

//----------------------------------------------------------------------------//

(function(){ // wrapper start

//----------------------------------------------------------------------------//
// UnifiedLibrary 1.7.0 start
//----------------------------------------------------------------------------//

var script_name = 'GN_SortNanoArtefacts'; // Enter your script name here

//----------------------------------------------------------------------------//
// SysUtils
//----------------------------------------------------------------------------//

var GN_SysUtils = new SysUtils(script_name);
var SU = GN_SysUtils;

//----------------------------------------------------------------------------//

function SysUtils(name){  // wrapper start

//----------------------------------------------------------------------------//
  
this.show_error = function(error_string, use_alert){
  if(use_alert)
    alert(error_string);
  
  throw new Error(error_string);
};
  
if(arguments.length != 1)
  this.show_error('Wrong SysUtils arguments');
  
if(!arguments[0])
  this.show_error('Empty SysUtils argument');
  
//----------------------------------------------------------------------------//  
 
this.save_value = function(desc, value){
  var div = document.getElementById('GN_GM_Handler');
  div.setAttribute('desc',      desc);
  div.setAttribute('value',     value);
  div.setAttribute('operation', 'save');
  
  div.click();
  
  if(div.getAttribute('state') != 'complete')
    this.show_error('Ошибка при сохранении значения');
};
  
//----------------------------------------------------------------------------//  

this.load_value = function(value, def){
  var div = document.getElementById('GN_GM_Handler');
  div.setAttribute('desc',      value);
  div.setAttribute('operation', 'load');
  
  div.click();
  
  if(div.getAttribute('state') != 'complete')
    this.show_error('Ошибка при загрузке значения');

  return (div.getAttribute('is_null') == 'true' ? def : div.getAttribute('value'));
};

//----------------------------------------------------------------------------//

var current_id = null;

//----------------------------------------------------------------------------//

function check_mandatory_scripts(alerter){
  var persistent_storage_sign = document.getElementById('GN_GM_Handler');
  var common_values_sign      = document.getElementById('GN_CommonValuesSign');
  var alert_sign              = document.getElementById('GN_AlertSign');
  
  if(!alert_sign){
    alert_sign = document.createElement('div');
    alert_sign.id = 'GN_AlertSign';
    alert_sign.setAttribute('alerted', 'false');
    document.body.appendChild(alert_sign);
  }
  
  var alerted = alert_sign.getAttribute('alerted') != 'false';
      
  if(!persistent_storage_sign){
    alert_sign.setAttribute('alerted', 'true');
    alerter('Скрипт ' + name + ' требует для своей работы скрипт управления данными (GN_PersistentStorage), который должен стоять первым в порядке выполнения скриптов.\n'
          + 'Подробнее здесь: "https://gf.qytechs.cn/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  }
  
  if(!common_values_sign){
    alert_sign.setAttribute('alerted', 'true');
    alerter('Скрипт ' + name + ' требует для своей работы скрипт, хранящий данные (GN_CommonValuesFiller), который должен стоять вторым в порядке выполнения скриптов.\n'
          + 'Подробнее здесь: "https://gf.qytechs.cn/ru/scripts/14049-Как-устанавливать-скрипты-читать-здесь"', !alerted);
  }
}

this.check_login = function(){
  var re = /.*?pl_id=(\d+)[^\d]*?/gmi;
  var matches = re.exec(document.cookie.toString());
  
  if(!matches)
    this.show_error('Пользователь не авторизован');
    
  current_id = +matches[1];
  
  check_mandatory_scripts(this.show_error);
};

//----------------------------------------------------------------------------//

this.show_el = function(el, visible){
  el.style.display = visible ? '' : 'none';
};

//----------------------------------------------------------------------------//

this.check_login();

//----------------------------------------------------------------------------//  
  
} // wrapper end

//----------------------------------------------------------------------------//
// CommonValues
//----------------------------------------------------------------------------//

var GN_CommonValues = new CommonValues();

//----------------------------------------------------------------------------//

function CommonValues(){  // wrapper start

//----------------------------------------------------------------------------//
// Fractions
//----------------------------------------------------------------------------//

this.fractions = JSON.parse(SU.load_value('GN_CommonValues_Fractions', '[]'));

//----------------------------------------------------------------------------//
// Creatures
//----------------------------------------------------------------------------//

this.creatures = JSON.parse(SU.load_value('GN_CommonValues_Creatures', '[]'));
  
//----------------------------------------------------------------------------//
  
this.get_creature = function(id){
  for(var i = 0; i < this.creatures.length; ++i)
    if(this.creatures[i].id == id)
      return this.creatures[i];

  return null;
};
    
//----------------------------------------------------------------------------//
  
} // wrapper end

//----------------------------------------------------------------------------//
// UnifiedLibrary end
//----------------------------------------------------------------------------//

var show_error = SU.show_error;
var save_value = SU.save_value;
var load_value = SU.load_value;
var show_el    = SU.show_el;
  
var CV = GN_CommonValues;
var fractions = CV.fractions;
  
var options = [
  { label: 'Неизвестные:',     id: 'UnknownChb',   title: 'Показывать наноартефакты на неизвестных существ' },
  { label: 'Нейтральные:',     id: 'NeutralChb',   title: 'Показывать наноартефакты на нейтральных существ' },
  { label: 'Неапнутые:',       id: 'NoUpChb',      title: 'Показывать наноартефакты на неапнутых существ' },
  { label: 'Апнутые:',         id: 'UpChb',        title: 'Показывать наноартефакты на апнутых существ' },
  { label: 'На +1:',           id: 'OnePowerChb',  title: 'Показывать наноартефакты +1' },
  { label: 'На +2:',           id: 'TwoPowerChb',  title: 'Показывать наноартефакты +2' },
  { label: 'Скрывать пустые:', id: 'HideEmptyChb', title: 'Скрывать существа, у которых нет наников по фильтру' }
];
  
var settings  = load_settings();
var artefacts = [];
var fid       = 0;

//----------------------------------------------------------------------------//
  
start_work();
  
//----------------------------------------------------------------------------//
  
function start_work(){
  var header_sign = document.querySelector('table[width="98%"][border="0"][align="center"]');
  
  if(!header_sign)
    show_error('Не найден элемент привязки для таблицы настроек');
  
  draw_header(header_sign.parentNode);
  get_artefacts();
  fill_fractions();
  accept_filter();
}
  
//----------------------------------------------------------------------------//
    
function draw_header(parent){
  var table = document.createElement('table');
  table.style.width = '90%';
  table.setAttribute('align', 'center');
  parent.insertBefore(table, parent.firstChild.nextSibling);
  
  var tr = document.createElement('tr');
  table.appendChild(tr);
  
  var expander = document.createElement('td');
  expander.setAttribute('align', 'center');
  var is_expanded = load_value(script_name + 'SettingsExpand', 'false') == 'true';
  expander.setAttribute('expand', is_expanded ? 'true' : 'false');
  expander.textContent = is_expanded ? 'Скрыть настройки' : 'Показать настройки';
  expander.addEventListener('click', function(e){
    e.preventDefault();
    
    var expanded = expander.getAttribute('expand') == 'false';
    show_el(settings_table, expanded);
    
    save_value(script_name + 'SettingsExpand', expanded ? 'true' : 'false');

    expander.setAttribute('expand', expanded ? 'true' : 'false');
    expander.textContent = expanded ? 'Скрыть настройки' : 'Показать настройки';
  });
  
  tr.appendChild(expander);
  
  tr = document.createElement('tr');
  table.appendChild(tr);
  
  var td = document.createElement('td');
  tr.appendChild(td);
  
  var settings_table = document.createElement('table');
  settings_table.setAttribute('align', 'center');
  td.appendChild(settings_table);
  
  tr = document.createElement('tr');
  settings_table.appendChild(tr);
    
  td = document.createElement('td');
  tr.appendChild(td);
  
  table = document.createElement('table');
  td.appendChild(table);
  
  for(var i = 0; i < options.length; i += 4){
    tr = document.createElement('tr');
    table.appendChild(tr);
  
    for(var j = i; j < i + 4 && j < options.length; ++j){
      td = document.createElement('td');
      tr.appendChild(td);
  
      var text = document.createTextNode(options[j].label);
      td.appendChild(text);
  
      td = document.createElement('td');
      tr.appendChild(td);

      var chb = document.createElement('input');
      chb.type    = 'checkbox';
      chb.title   = options[j].title;
      chb.id      = script_name + options[j].id;
      chb.checked = settings[options[j].id];

      td.appendChild(chb);
    }    
  }
  
  tr = document.createElement('tr');
  settings_table.appendChild(tr);
  
  td = document.createElement('td');
  tr.appendChild(td);
  
  td.appendChild(document.createTextNode('Выбор класса:'));
  
  var select = document.createElement('select');
  select.id = script_name + 'FractionsSelect';
  select.style.width = '150px';
  
  var option = document.createElement('option');
  select.appendChild(option);
  td.appendChild(select);
 
  tr = document.createElement('tr');
  settings_table.appendChild(tr);
  
  td = document.createElement('td');
  td.setAttribute('align', 'right');
  tr.appendChild(td);
  
  var saver = document.createElement('input');
  saver.type = 'button';
  saver.value = 'Применить';
  saver.addEventListener('click', function(e){
    e.preventDefault();
    
    save_settings();
    accept_filter();
  });
  td.appendChild(saver);
  
  show_el(settings_table, is_expanded);
}
  
//----------------------------------------------------------------------------//
  
function get_artefacts(){
  var table = document.querySelector('table.wbwhite[width="90%"][cellpadding="4"][align="center"]');
  
  if(!table)
    return;
  
  var trs = table.firstChild.childNodes;
  for(var i = 0; i < trs.length; ++i){
    var tr = trs[i];
    var artefact = {
      id:       '',
      creature: null,
      element:  tr
    };
    
    var a = tr.querySelector('a[href*="army_info.php"]');
    artefact.id       = /army_info\.php\?name=(.+)/.exec(a.href)[1];
    artefact.creature = CV.get_creature(artefact.id);
    artefacts.push(artefact);
  }
}
  
//----------------------------------------------------------------------------//
  
function fill_fractions(){
  var tmp = artefacts.filter(function(current){
    return current.creature !== null;
  });

  if(tmp.length)
    fid = +tmp[0].creature.f;

  tmp = fractions.filter(function(current){
    return current.id == fid;  
  });
  
  var select = document.getElementById(script_name + 'FractionsSelect');
  
  tmp.forEach(function(current){
    var option = document.createElement('option');
    option.setAttribute('f', current.id);
    option.setAttribute('c', current.c);
    option.text = current.name;
    
    select.appendChild(option);
  });  
}
  
//----------------------------------------------------------------------------//
  
function accept_filter(){
  var select = document.getElementById(script_name + 'FractionsSelect');
  var option = select.options[select.selectedIndex];
  var all_values = !option.hasAttribute('f') && !option.hasAttribute('c');
  var f, c;
  
  if(!all_values){
    f = +option.getAttribute('f');
    c = +option.getAttribute('c');
  }
  
  artefacts.forEach(function(current){
    var cr = current.creature;
    var is_suitable =   (settings.UnknownChb ? true : !!cr)
                     && (cr ?  ((settings.NeutralChb ? true : cr.f)
                             && (settings.NoUpChb    ? true : cr.is_up)
                             && (settings.UpChb      ? true : !cr.is_up))
                            : true);

    var powers = current.element.lastChild.querySelectorAll('td[width="40"]');
    var visible_counter = powers.length;
    
    for(var i = 0; i < powers.length; ++i){
      var val     = +/(\d+)/.exec(powers[i].textContent)[1];
      var visible = val == 1 ? settings.OnePowerChb 
                             : (val == 2 ? settings.TwoPowerChb 
                                         : false);
      show_el(powers[i].parentNode, visible);

      if(!visible)
        --visible_counter;
    }

    is_suitable =   is_suitable 
                 && (settings.HideEmptyChb ? visible_counter : true)
                 && (all_values ? true 
                                : (cr ? (cr.f == f && cr.c.indexOf(c) != -1)
                                      : true));

    show_el(current.element, is_suitable);
  });
}

//----------------------------------------------------------------------------//

function load_settings(){
  var settings_ = load_value(script_name + 'Settings');

  if(settings_)
    return JSON.parse(settings_);
  
  settings_ = {};
  
  options.forEach(function(current){
    settings_[current.id] = true;
  });
  
  return settings_;
}

//----------------------------------------------------------------------------//
  
function save_settings(){
  options.forEach(function(current){
    var chb = document.getElementById(script_name + current.id);
    settings[current.id] = chb.checked;
  });

  save_value(script_name + 'Settings', JSON.stringify(settings));
}
  
//----------------------------------------------------------------------------//
  
}());  // wrapper end

//----------------------------------------------------------------------------//

QingJ © 2025

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