HWM_hunt_notes

заметки для существ на экране карты

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name        HWM_hunt_notes
// @namespace   Helther
// @author      helther
// @description заметки для существ на экране карты
// @include     /^https{0,1}:\/\/(www\.heroeswm\.ru|178\.248\.235\.15)\/map\.php.*/
// @version     1.0.6
// @license MIT
// ==/UserScript==

var script_name = 'HWM_hunt_notes';
var hunt_name_prefix = 'HWM_note_';

function get_cookie(name) {
  let matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
  ));
  return matches ? decodeURIComponent(matches[1]) : undefined;
}

function set_cookie(name, value, options = {}) {

  options = {
    path: '/',
    ...options
  };

  if (options.expires instanceof Date) {
    options.expires = options.expires.toUTCString();
  }

  let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

  for (let optionKey in options) {
    updatedCookie += "; " + optionKey;
    let optionValue = options[optionKey];
    if (optionValue !== true) {
      updatedCookie += "=" + optionValue;
    }
  }

  document.cookie = updatedCookie;
}

function delete_cookie(name) {
  set_cookie(name, "", {
    'max-age': -1
  })
}

function get_hwm_cookies() {
  let matches = document.cookie.match(new RegExp(
    "("+hunt_name_prefix + "[^= ]*) *(?=\=)", "g"));
  return matches ? matches : undefined;
}

function clear_cookies() {
  let names = get_hwm_cookies()
  for (let name of names) {
      delete_cookie(name)
  }
}

function get_parent_nodes() {
  let buttons = document.querySelectorAll('div.map_buttons_container');
  let buttons_list = Array.from(buttons)
  const elements_map = new Map()
  buttons_list.forEach(node => {
    let parent = node ? node.parentNode : null
    if (parent) {
      let hunt_ref = parent.querySelector("a[href*='army_info.php?name']")
      if (hunt_ref) {
        let name_key = "?name="
        let pos_start = hunt_ref.href.indexOf(name_key)
        if (pos_start !== -1)
          elements_map.set(hunt_ref.href.substring(pos_start + name_key.length), node)
        else {
          throw "Failed to find hunt name"
        }
      }
      else {
        throw "Failed to find href"
      }
    }
    else {
      throw "Failed to find buttons parent"
    }
  })
  return elements_map
}

function create_note(hunt, next_sibling) {
  let note = document.createElement('textarea');
  note.type	       = 'text';
  note.className   = 'wblight';
  note.width       = next_sibling.width;
  note.align       = 'center';
  note.maxLength   = 3500;
  note.placeholder = 'Вводите...';
  note.rows 	     = 4;
  let note_val = get_cookie(hunt_name_prefix + hunt)
  if (note_val)
    note.value = note_val

  let save_button = document.createElement('input');
  save_button.type	    = 'button';
    save_button.value 	= 'Сохранить заметку';
    save_button.id     	= script_name + 'Save';
  save_button.width     = next_sibling.width;
  save_button.align     = 'center';
  save_button.addEventListener('click', function(e){
    e.preventDefault();
    if (note.length !== 0)
      set_cookie(hunt_name_prefix + hunt, note.value, {'max-age': 10000})
  });

  next_sibling.parentNode.insertBefore(note, next_sibling);
  next_sibling.parentNode.insertBefore(save_button, next_sibling);
}

function create_clear_all_btn() {
  let buttons = document.querySelector('div.map_buttons_container');
  let parent = buttons ? buttons.parentNode.parentNode.parentNode : null
  if (parent) {
    let button = document.createElement('input');
    button.type	     = 'button';
    button.value 	 = 'Очистить все заметки (Осторожно!)';
    button.id        = script_name + 'ClearAll';
    button.width     = parent.width;
    button.align     = 'center';
    button.addEventListener('click', function(e){
      e.preventDefault();
      if (window.confirm("Вы уверены, что хотите всё потереть к хуям?")) {
        clear_cookies();
      }
    });
    parent.appendChild(button)
  }
}

// =============================== wrapper start ============================//
(function(){ try {

  'use strict';

  let hunt_names_divs_map = get_parent_nodes()
  for (const [key, value] of hunt_names_divs_map) {
    // console.log(`${key} = ${value}`);
    create_note(key, value)
  }
  create_clear_all_btn()

} catch(e){
    alert('Ошибка в скрипте ' + script_name + ', не смейте обращаться к разработчику:\n' + e);
    throw e;
  }}()); // wrapper end