Scouter

Un cibleur de nouvelle génération directement connecté à une base de données. Idéal pour les forces de l'Orient.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name        Scouter
// @namespace   Violentmonkey Scripts
// @match       https://www.dreadcast.net/Main
// @version     0.0.1
// @author      Pelagia/IsilinBN
// @description Un cibleur de nouvelle génération directement connecté à une base de données. Idéal pour les forces de l'Orient.
// @license     https://github.com/Isilin/dreadcast-scripts?tab=GPL-3.0-1-ov-file
// @require     https://update.greasyfork.org/scripts/507382/Dreadcast%20Development%20Kit.user.js
// @connect     docs.google.com
// @connect     googleusercontent.com
// @connect     sheets.googleapis.com
// @grant       GM_xmlhttpRequest
// @grant       GM_getValue
// @grant       GM_setValue
// @downloadURL
// @updateURL
// ==/UserScript==

$(() => {
  const style = `
    #scouter_content {
      color: white;
    }
    #scouter_content .input_group {
      display: flex;
      gap: 1rem;
      margin-bottom: 1rem;
    }
    #scouter_content input[type=text] {
      padding: 4px 12px;
      display: inline-block;
      border: 1px solid #7ec8d8;
      box-sizing: border-box;
      width: 70%;
      color: white;
    }
    .scouter_infobox_buttons {
      display: flex;
      position: absolute;
      bottom: -30px;
      left: -2px;
      width: auto;
      background-color: #181818;
      color: white;
    }
    .scouter_infobox_buttons .btn {
      border: 1px solid white;
      display: grid;
    }
    .scouter_infobox_buttons .btn:hover {
      background-color: #484848;
    }
    .interieur.data_info, .interieur.data_stats, .interieur.data_crim {
      color: #eee;
    }
    .interieur.data_info h4, .interieur.data_stats h4, .interieur.data_crim h4 {
      margin-bottom: 1rem;
    }
    .data_info_list, .data_stats_list, .data_crim_list {
      display: flex;
      flex-direction: column;
      width: 100%;
      font-size: 13px;
      gap: 0.5rem;
    }
  `;

  const API_TAG = 'scouter_db_api';
  const SHEET_ID_TAG = 'scouter_sheet_id';
  const SHEED_NAME_TAG = 'scouter_sheet_name';
  const SHEET_RANGE_TAG = 'scouter_sheet_range';

  let api, sheetId, sheetName, sheetRange;
  let data;

  const syncParams = () => {
    api = DC.LocalMemory.get(API_TAG);
    sheetId = DC.LocalMemory.get(SHEET_ID_TAG);
    sheetName = DC.LocalMemory.get(SHEED_NAME_TAG);
    sheetRange = DC.LocalMemory.get(SHEET_RANGE_TAG);
  };

  const initPersistence = () => {
    DC.LocalMemory.init(API_TAG, 'AIzaSyAgS_cjEerpTKyHEZa6JjfUwAdxM91Vpuc');
    DC.LocalMemory.init(
      SHEET_ID_TAG,
      '1VgeD1CghIxgP-5AfkKV7woLm4CXqVLQ53XSHH7vHZZk',
    );
    DC.LocalMemory.init(SHEED_NAME_TAG, 'Data');
    DC.LocalMemory.init(SHEET_RANGE_TAG, 'A:T');

    syncParams();
  };

  const loadData = () => {
    DC.Network.loadSpreadsheet(
      sheetId,
      sheetName,
      sheetRange,
      api,
      (result) => {
        data = result;
      },
    );
  };

  const openSettings = () => {
    const save = () => {
      DC.LocalMemory.set(API_TAG, $('#input_api').val());
      DC.LocalMemory.set(SHEET_ID_TAG, $('#input_sheet_id').val());
      DC.LocalMemory.set(SHEED_NAME_TAG, $('#input_sheet_name').val());
      DC.LocalMemory.set(SHEET_RANGE_TAG, $('#input_sheet_range').val());

      syncParams();
      loadData();
      engine.closeDataBox('scouter_modal');
    };

    let content = $(`
      <div id="scouter_content">
        <div class="input_group">
          <legend>Api :</legend><input id="input_api" type="text" value="${api}" />
        </div>
        <div class="input_group">
          <legend>Id :</legend><input id="input_sheet_id" type="text" value="${sheetId}" />
        </div>
        <div class="input_group">
          <legend>Onglet :</legend><input id="input_sheet_name" type="text" value="${sheetName}" />
        </div>
        <div class="input_group">
          <legend>Plage :</legend><input id="input_sheet_range" type="text" value="${sheetRange}" />
        </div>
      </div>
    `).append(DC.UI.TextButton('scouter_save', 'Sauvegarder', save));

    DC.UI.PopUp('scouter_modal', 'Scouter', content);
  };

  const loadUI = (id) => {
    let secondaire = $(
      '.zone_case2 .case_objet_type_Secondaire .obj_itemBox_details .titreinfo',
    ).text();

    // TODO remove true for prod
    if (secondaire === 'Cibleur' || true) {
      // this not set with arrow function
      const charData = data.find((row) => row[0] === id);

      const user_content = $(`#ib_persoBox_${id} .flipmobile-card-front`).clone(
        true,
      );

      $(`
          <div id="buttons_${id}" class="scouter_infobox_buttons">
          </div>
        `)
        .append(
          DC.UI.Button(`set_${id}`, '<i class="fas fa-user" />', () => {
            $(`#ib_persoBox_${id} .flipmobile-card-front`).replaceWith(
              user_content.clone(true),
            );
            $(`#buttons_${id}>div`).css('background-color', '');
            $(`#set_${id}`).css('background-color', '#484848');
          }),
        )
        .append(
          DC.UI.Button(`info_${id}`, '<i class="fas fa-info" />', () => {
            $(`#ib_persoBox_${id} .flipmobile-card-front`)
              .empty()
              .append(
                $(`
                  <div class="interieur data_info">
                    <h4>Infos</h4>
                    <div class="data_info_list">
                      <div><span class="couleur0">Méta-race :</span> <span class="couleur5">${charData[3]}</span></div>
                      <div><span class="couleur0">Genre :</span> <span class="couleur5">${charData[4]}</span></div>
                      <div><span class="couleur0">Âge :</span> <span class="couleur5">${charData[5]} ans</span></div>
                      <div><span class="couleur0">Taille:</span> <span class="couleur5">${charData[6]}cm</span></div>
                      <div><span class="couleur0">Poids :</span> <span class="couleur5">${charData[7]}kg</span></div>
                      <br />
                      <div><span class="couleur0">Statut :</span> <span class="couleur5">${charData[20]}</span></div>
                      <div><span class="couleur0">Emploi :</span> <span class="couleur5">${charData[21]}</span></div>
                      <br />
                      <div><span class="couleur0">Notes :</span> <span class="couleur5">${charData[8]}</span></div>
                    </div>
                  </div>
                `),
              );
            $(`#buttons_${id}>div`).css('background-color', '');
            $(`#info_${id}`).css('background-color', '#484848');
          }),
        )
        .append(
          DC.UI.Button(`health_${id}`, '<i class="fas fa-heartbeat" />', () => {
            $(`#ib_persoBox_${id} .flipmobile-card-front`)
              .empty()
              .append(
                $(`
                  <div class="interieur data_stats">
                    <h4>Statistiques</h4>
                    <div class="data_stats_list">
                      <div>
                        <div><span class="couleur0">Santé :</span> <span class="couleur5">${charData[10]}</span></div>
                        <div><span class="couleur0">Forme :</span> <span class="couleur5">${charData[11]}</span></div>
                      </div>
                      <div>
                        <div><span class="couleur0">FOR :</span> <span class="couleur5">${charData[12]}</span></div>
                        <div><span class="couleur0">AGI :</span> <span class="couleur5">${charData[13]}</span></div>
                        <div><span class="couleur0">RES :</span> <span class="couleur5">${charData[14]}</span></div>
                      </div>
                      <div>
                        <div><span class="couleur0">PER :</span> <span class="couleur5">${charData[15]}</span></div>
                        <div><span class="couleur0">FUR :</span> <span class="couleur5">${charData[16]}</span></div>
                      </div>
                      <div>
                        <div><span class="couleur0">INF :</span> <span class="couleur5">${charData[17]}</span></div>
                        <div><span class="couleur0">MED :</span> <span class="couleur5">${charData[18]}</span></div>
                        <div><span class="couleur0">ING :</span> <span class="couleur5">${charData[19]}</span></div>
                      </div>
                    </div>
                  </div>
                `),
              );
            $(`#buttons_${id}>div`).css('background-color', '');
            $(`#health_${id}`).css('background-color', '#484848');
          }),
        )
        .append(
          DC.UI.Button(`crim_${id}`, '<i class="fas fa-gavel" />', () => {
            $(`#ib_persoBox_${id} .flipmobile-card-front`)
              .empty()
              .append(
                $(`
                  <div class="interieur data_crim">
                    <h4>Casier</h4>
                    <div class="data_crim_list"></div>
                  </div>
                `),
              );

            charData[9].split('\n').forEach((crim) => {
              $(`<span class="couleur5">${crim}</span>`).appendTo(
                $('.data_crim_list'),
              );
            });

            $(`#buttons_${id}>div`).css('background-color', '');
            $(`#crim_${id}`).css('background-color', '#484848');
          }),
        )
        .appendTo($(`#ib_persoBox_${id}`));

      $(`#set_${id}`).css('background-color', '#484848');
    }
  };

  $(document).ready(() => {
    initPersistence();
    loadData();

    if (Util.isDSM?.()) {
      $('#scouter_setting').bind('click', openSettings);
    } else {
      DC.UI.addSubMenuTo(
        'Paramètres ▾',
        DC.UI.SubMenu('Scouter', openSettings),
        6,
      );
    }

    $(document).on('click', 'span.perso.link', function () {
      const id = $(this).attr('id').slice(9);
      $(document).one('ajaxSuccess', { idPerso: id }, (e, xhr, settings) => {
        loadUI(id);
      });
    });

    $(document).on('click', '#action_perso_fiche', function () {
      $(document).one('ajaxSuccess', (e, xhr, settings) => {
        const id = settings.data.slice(3);
        loadUI(id);
      });
    });

    $(document).on('click', '#meubles', function () {
      console.log('ok');
      $(document).one('ajaxSuccess', (e, xhr, settings) => {
        console.log(settings);
        const id = settings.data.slice(3);
        loadUI(id);
      });
    });

    DC.Style.apply(style);
  });
});