lunacystudy

Untitled

Apr 3rd, 2019
3,629
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. javascript:(function() {
  2. var url_prefix = window.game_data.link_base_pure;
  3. var url = url_prefix + "overview_villages&mode=units";
  4. var overviews_url = url_prefix + "overview_villages";
  5. var parse_html = function(html_string) {
  6.     var parser = new DOMParser();
  7.     return parser.parseFromString(html_string, "text/html");
  8. };
  9. var parse_row = function(row, unit_labels) {
  10.     var trs = row.querySelectorAll('tr');
  11.     var units = [];
  12.     var available_tds = trs[0].querySelectorAll('td.unit-item');
  13.     var outward_tds = trs[2].querySelectorAll('td.unit-item');
  14.     var transit_tds = trs[3].querySelectorAll('td.unit-item');
  15.  
  16.     available_tds.forEach(function(td, i) {
  17.         units.push({
  18.             label: unit_labels[i],
  19.             current: td.textContent.trim(),
  20.             supporting: outward_tds[i].textContent.trim(),
  21.             total: (parseInt(td.textContent) +
  22.                 parseInt(outward_tds[i].textContent) +
  23.                 parseInt(transit_tds[i].textContent)).toString(),
  24.         });
  25.     });
  26.     units = units.filter(function(unit) {
  27.         return parseInt(unit.total);
  28.     });
  29.     return {
  30.         village: '',
  31.         units: units,
  32.     };
  33. };
  34. var parse_rows = function(rows, labels) {
  35.     var coord_regex = /\(([0-9]{3}\|[0-9]{3})\)/;
  36.     return Array.prototype.map.call(rows, function(row) {
  37.         var village_string = row.querySelector('a span[data-text]').textContent;
  38.         var regex_result = coord_regex.exec(village_string);
  39.         var parsed = parse_row(row, labels);
  40.         parsed.village = regex_result[1];
  41.         return parsed;
  42.     });
  43. };
  44. var total_villages = function(villages, labels) {
  45.   var total_units = {};
  46.   labels.forEach(function(label) {
  47.     total_units[label] = {
  48.         current: 0,
  49.         supporting: 0,
  50.         total: 0,
  51.       };
  52.   });
  53.   villages.forEach(function(village, i) {
  54.     var units = village.units;
  55.     units.forEach(function(unit) {
  56.       var key = unit.label;
  57.       var value = total_units[key];
  58.       value.label = key;
  59.       value.current += parseInt(unit.current);
  60.       value.supporting += parseInt(unit.supporting);
  61.       value.total += parseInt(unit.total);
  62.       total_units[key] = value;
  63.     });
  64.   });
  65.   var total_units_array = [];
  66.   for (var i in total_units) {
  67.     total_units_array.push(total_units[i]);
  68.   }
  69.   total_units_array = total_units_array.filter(function(unit) {
  70.     return parseInt(unit.total);
  71.   });
  72.   return total_units_array;
  73. };
  74. var most_chars = function(units, property) {
  75.     /* hurts tool lookup for uses of unit.label, unit.current, unit.total */
  76.     var character_lengths = units.map(unit => String(unit[property]).length);
  77.     return Math.max(... character_lengths);
  78. };
  79. var pad_left = function(string, length) {
  80.   string = String(string);
  81.     if (string.length >= length)
  82.         return string;
  83.     var to_pad = length - string.length;
  84.     var padding = Array(to_pad).fill(' ').join('');
  85.     return padding + string;
  86. };
  87. var grid = function(units) {
  88.     var grid_sizes = {
  89.         label: most_chars(units, 'label'),
  90.         current: most_chars(units, 'current'),
  91.         supporting: most_chars(units, 'supporting'),
  92.         total: most_chars(units, 'total'),
  93.     };
  94.     var unit_strings = units.map(function(unit) {
  95.         return pad_left(unit.label, grid_sizes.label) + " | Available: " +
  96.         pad_left(unit.current, grid_sizes.current) + " | Supporting: " +
  97.         pad_left(unit.supporting, grid_sizes.supporting) + " | Total: " +
  98.         pad_left(unit.total, grid_sizes.total);
  99.     });
  100.     return unit_strings.join("\n");
  101. };
  102. var request_rows = function(all_present_rows, callback) {
  103.     var requested_rows = [];
  104.     var inputs_html = Array.prototype.map.call(all_present_rows, function(row, i) {
  105.         return '<label><input type="checkbox" checked value="' + i + '" />' + row.querySelector('a span[data-text]').textContent.trim() + '</label><br />';
  106.     }).join('');
  107.     var $all = $('<div><label><input type="checkbox" checked />' + _('All') + '</label></div>');
  108.     var $inputs = $('<div>' + inputs_html + '</div>');
  109.     var $buttons = $('<div class="center"><button class="btn btn-confirm-yes">' + _('Confirm') + '</button>' +
  110.         '<button class="btn btn-confirm-no">' + _('Cancel') + '</button></div>');
  111.     $all.find('input').change(function() {
  112.         $inputs.find('input').prop('checked', this.checked);
  113.     });
  114.     $inputs.find('input').change(function() {
  115.         var $all_checkbox = $all.find('input');
  116.         if ($inputs.find('input:checked').length !== $inputs.find('input').length) {
  117.             $all_checkbox.prop('checked', false);
  118.         } else {
  119.             $all_checkbox.prop('checked', true);
  120.         }
  121.     });
  122.     $buttons.find('button.btn-confirm-yes').click(function() {
  123.         Dialog.close();
  124.         var result = $inputs.find('input:checked').map(function() {
  125.             var input = this;
  126.             return all_present_rows[input.value];
  127.         });
  128.         callback(result);
  129.     });
  130.     $buttons.find('button.btn-confirm-no').click(function() {
  131.         Dialog.close();
  132.     });
  133.  
  134.     var $dialog = $all.add($inputs).add($buttons);
  135.     Dialog.show('ls_tw_troop_report', $dialog);
  136. };
  137. var target = document.querySelector('textarea');
  138. if (!target) {
  139.     UI.ErrorMessage(_('Could not find a text box to fill'));
  140. } else {
  141.     /*
  142.      * Make 3 requests: one to get the currently selected overview;
  143.      * one to get the troop counts;
  144.      * and one to restore the selected overview.
  145.      */
  146.     var restore_url;
  147.     $.ajax(overviews_url, {
  148.         success: function(body) {
  149.             var other_document = parse_html(body);
  150.             restore_url = other_document.querySelector('#overview_menu td.selected a, #paged_view_content td.selected a').href;
  151.            
  152.             $.ajax(url, {
  153.                 success: function(body) {
  154.                     var other_document = parse_html(body);
  155.                     var container = other_document.querySelector('table#units_table');
  156.                     var label_containers = container.querySelectorAll('th [title]');
  157.                     var labels = Array.prototype.map.call(label_containers, function(container) {
  158.                         return container.title;
  159.                     });
  160.                     var rows = container.querySelectorAll('tbody');
  161.                     request_rows(rows, function(requested_rows) {
  162.                         var villages = parse_rows(requested_rows, labels);
  163.                         var totals = total_villages(villages, labels);
  164.                         target.value += _('Total units') + '\n[code]\n' + grid(totals) + '\n[/code]';
  165.                         villages.forEach(function(village) {
  166.                             target.value += '\n[coord]' + village.village + '[/coord]\n[code]\n' + grid(village.units) + '\n[/code]';
  167.                         });
  168.                     });
  169.  
  170.                     $.ajax(restore_url);
  171.                 },
  172.             });
  173.         },
  174.     });
  175. }})();
Advertisement
Add Comment
Please, Sign In to add comment