Informatie TribalWarsLibrary [twLib]

Warre

Teamleden
Tribal Wars Team
Reactiescore
1.053
Beste scripters,

Wat is de TribalWarsLibrary?
Rond deze tijd zullen jullie waarschijnlijk allemaal bezig zijn met het nakijken en herwerken van jullie scripts, daarom leek het mij een ideaal moment om de TribalWarsLibrary aan te kondigen. De TribalWarsLibrary of kortweg twLib is een javascript code library geschreven door en voor scripters van TW.NL waar veel gebruikte functies in opgenomen kunnen worden zodat deze doorheen verschillende scripts gebruikt kunnen worden.

Op dit moment bevat twLib enkel een herwerking van het door scripters veel gebruikte "$.twAjax()" jaren geleden geschreven door Unfriendly Sander & Hardcode, maar samen met jullie hulp hoop ik twLib te kunnen uitbouwen tot een volwaardige library.


TribalWarsLibrary Code
De code van twLib is te vinden in onderstaande spoiler of via volgende url: https://media.innogames.com/com_DS_NL/scripts/resources/TribalWarsLibrary.js

JavaScript:
/**** TribalWarsLibrary.js ****/
if (typeof window.twLib === 'undefined') {
  window.twLib = {
    queues: null,
    init: function() {
      if (this.queues === null) {
        this.queues = this.queueLib.createQueues(5);
      }
    },
    queueLib: {
      maxAttempts: 3,
      Item: function (action, arg, promise = null) {
        this.action = action;
        this.arguments = arg;
        this.promise = promise;
        this.attempts = 0;
      },
      Queue: function() {
        this.list = [];
        this.working = false;
        this.length = 0;

        this.doNext = function () {
          let item = this.dequeue();
          let self = this;

          if (item.action == 'openWindow') {
            window.open(...item.arguments).addEventListener('DOMContentLoaded', function() {
              self.start();
            });
          } else {
            $[item.action](...item.arguments).done(function () {
              item.promise.resolve.apply(null, arguments);
              self.start();
            }).fail(function () {
              item.attempts += 1;
              if (item.attempts < twLib.queueLib.maxAttempts) {
                self.enqueue(item, true);
              } else {
                item.promise.reject.apply(null, arguments);
              }

              self.start();
            });
          }
        };

        this.start = function () {
          if (this.length) {
            this.working = true;
            this.doNext();
          } else {
            this.working = false;
          }
        };

        this.dequeue = function () {
          this.length -= 1;
          return this.list.shift();
        };

        this.enqueue = function (item, front = false) {
          (front) ? this.list.unshift(item) : this.list.push(item);
          this.length += 1;

          if (!this.working) {
            this.start();
          }
        };
      },
      createQueues: function(amount) {
        let arr = [];

        for (let i = 0; i < amount; i++) {
          arr[i] = new twLib.queueLib.Queue();
        }

        return arr;
      },
      addItem: function(item) {
        let leastBusyQueue = twLib.queues.map(q => q.length).reduce((next, curr) => (curr < next) ? curr : next, 0);
        twLib.queues[leastBusyQueue].enqueue(item);
      },
      orchestrator: function(type, arg) {
        let promise = $.Deferred();
        let item = new twLib.queueLib.Item(type, arg, promise);

        twLib.queueLib.addItem(item);

        return promise;
      }
    },
    ajax: function() {
      return twLib.queueLib.orchestrator('ajax', arguments);
    },
    get: function() {
      return twLib.queueLib.orchestrator('get', arguments);
    },
    post: function() {
      return twLib.queueLib.orchestrator('post', arguments);
    },
    openWindow: function() {
      let item = new twLib.queueLib.Item('openWindow', arguments);

      twLib.queueLib.addItem(item);
    }
  };

  twLib.init();
}


TribalWarsLibrary Functies
Code​
Uitleg​
twLib.ajax();Gebruik deze code in plaats van de standaard jQuery $.ajax() om te vermijden dat TW requests blokkeert wanneer het er meer dan 5 / sec zijn. Alle parameters die normaal meegegeven worden aan $.ajax() kunnen ook aan deze functie mee gegeven worden.
twLib.get();Gebruik deze code in plaats van de standaard jQuery $.get() om te vermijden dat TW requests blokkeert wanneer het er meer dan 5 / sec zijn. Alle parameters die normaal meegegeven worden aan $.get() kunnen ook aan deze functie mee gegeven worden.
twLib.post();Gebruik deze code in plaats van de standaard jQuery $.post() om te vermijden dat TW requests blokkeert wanneer het er meer dan 5 / sec zijn. Alle parameters die normaal meegegeven worden aan $.post() kunnen ook aan deze functie mee gegeven worden.
twLib.openWindow();Gebruik deze code in plaats van de standaard javascript window.open() om te vermijden dat TW pagina's niet laden als er meer dan 5 / sec geopend worden. Alle parameters die normaal meegegeven worden aan window.open() kunnen ook aan deze functie mee gegeven worden.


TribalWarsLibrary Gebruik
De code kan in principe op verschillende manieren geïmplementeerd worden, in het snellijstscript zelf of pas achteraf in de eigen code, via de url of rechtstreeks.
Het is alleen belangrijk dat verschillende scripts de vorige code niet overschrijven, laat dus altijd de "if (typeof window.twLib === 'undefined')" in de code staan.

De beste manier om de code toe te voegen is in mijn ogen in de geuploade versie van het script op volgende manier:
JavaScript:
if (typeof window.twLib === 'undefined') {
  $.getScript('https://media.innogames.com/com_DS_NL/scripts/resources/TribalWarsLibrary.js', myScript);
} else {
  myScript();
}

function myScript() {
  /*
  Eigen code hier, twLib functies kunnen nu gebruikt worden.
  */
}

Ontwikkeling van TribalWarsLibrary
Feedback op de huidige code is zeer welkom, samen kunnen we alleen maar verbeteren.
Heb jij zelf een stuk code dat je gebruikt in verschillende scripts? Aarzel dan niet om het toe te voegen aan twLib door hier een post achter te laten!

Keep up the good work,
Warre
 
Laatst bewerkt:

Warre

Teamleden
Tribal Wars Team
Reactiescore
1.053
Wijzigingen in de code tegenover de originele $.twAjax():
  • Omgezet in eigen library in plaats van toe te voegen aan jQuery.
  • get, post en openWindow functies toegevoegd.
  • attempts toegevoegd waardoor elke ajax, get en post 3 keer geprobeerd worden alvorens een reject teruggestuurd wordt (met de oude code gebeurde het soms dat een request niet afgewerkt werd omdat het alsnog te snel ging, hiermee zou dat verholpen moeten zijn).
  • Elk van de huidige functies maakt gebruik van dezelfde 5 queue's waardoor je meerdere functie tegelijk kan uitvoeren en alles toch gewoon zal werken.
Zaken waar ik nog net 100% tevreden over ben:
  • Het openen van tabs gaat aan ongeveer 2.5 / seconde, niet aan 5 per seconde wat in principe zou moeten kunnen, hier weet ik geen beter alternatief voor. Maar het gaat aan een redelijke snelheid vind ik zelf dus ook niet perse nodig.
Feedback en toevoegingen altijd welkom!
 
Laatst bewerkt: