您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows the count of attributes, relations, assets, etc. on each entity's corresponding submenu item
- // ==UserScript==
- // @name Kanka Subpage Elements Counter
- // @namespace http://tampermonkey.net/
- // @license MIT
- // @version 5
- // @description Shows the count of attributes, relations, assets, etc. on each entity's corresponding submenu item
- // @author Salvatos
- // @match https://app.kanka.io/*
- // @icon https://www.google.com/s2/favicons?domain=kanka.io
- // @connect kanka.io
- // @grant GM_addStyle
- // ==/UserScript==
- // Get JSON export URL for the current entity
- const exportLink = document.querySelector('a[href$=".json"]');
- if (exportLink) {
- var apiURL = exportLink.href;
- // Request JSON for the target entity
- var xhr = new XMLHttpRequest();
- xhr.open("GET", apiURL, true);
- xhr.responseType = 'json';
- xhr.onload = function (e) {
- if (xhr.readyState === 4) {
- if (xhr.status === 200) {
- let abilities = xhr.response.data.entity_abilities.length,
- attributes = xhr.response.data.attributes.length,
- events = xhr.response.data.entity_events.length,
- inventory = xhr.response.data.inventory.length,
- elements = (xhr.response.data.elements) ? xhr.response.data.elements.length : null;
- // Quick little function for recurring HTML
- function badgeTag(withVar) {
- return `<div class="badge float-right border">${withVar}</div>`;
- }
- // Abilities
- if (abilities > 0) {
- document.querySelector('.entity-menu a[href$="/entity_abilities"]').insertAdjacentHTML("beforeend", badgeTag(abilities));
- }
- // Attributes
- if (attributes > 0) {
- document.querySelector('.entity-menu a[href$="/attributes"]').insertAdjacentHTML("beforeend", badgeTag(attributes));
- }
- // Events/reminders
- if (events > 0) {
- document.querySelector('.entity-menu a[href$="/entity_events"]').insertAdjacentHTML("beforeend", badgeTag(events));
- }
- // Inventory
- if (inventory > 0) {
- document.querySelector('.entity-menu a[href$="/inventory"]').insertAdjacentHTML("beforeend", badgeTag(inventory));
- }
- // Quest elements (Kanka only shows elements that are entities, not "loose" ones)
- if (elements > 0) {
- // If there’s already a count, update it instead of creating a new badge
- if (document.querySelector('.entity-menu a[href$="/quest_elements"] .badge')) {
- document.querySelector('.entity-menu a[href$="/quest_elements"] .badge').innerHTML = elements;
- }
- else {
- document.querySelector('.entity-menu a[href$="/quest_elements"]').insertAdjacentHTML("beforeend", badgeTag(elements));
- }
- }
- // Assets are already handled by Kanka like child entities
- // Relations not provided (only pinned relations, which we can already see)
- } else {
- console.error(xhr.statusText);
- }
- }
- };
- xhr.onerror = function (e) {
- console.error(xhr.statusText);
- };
- xhr.send(null);
- }
- GM_addStyle(`
- /* More sensible font size for "badges" in the sidebar */
- .entity-submenu .badge {
- font-size: .750rem;
- }
- `);