Advertisement
Nolifeq

Untitled

Jan 4th, 2025 (edited)
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.85 KB | None | 0 0
  1. // ==UserScript==
  2. // @name         [ɢᴏʏʟᴇ] ʀᴀᴘᴏʀᴛ ᴀɪʀ-ᴛʀᴀꜰꜰɪᴄ ᴄᴏɴᴛʀᴏʟ & ᴀᴅᴀᴍ
  3. // @version      1.0
  4. // @description  Wysyła raport na Discord, gdy pojawi się nowy gracz, zniknie gracz lub zmieni się jego stan nieaktywności dla dwóch klanów.
  5. // @author       Nolifequ
  6. // @icon         https://i.ibb.co/nM9YHWn/f-mag01.png
  7. // @match        https://fobos.margonem.pl/
  8. // @icon         https://www.google.com/s2/favicons?sz=64&domain=margonem.pl
  9. // ==/UserScript==
  10.  
  11. // Konfiguracja Webhooka Discord
  12. const webhookUrl = 'https://discord.com/api/webhooks/1325250343025508424/8wGURTbiviaGf0COqtcTwhp97tzRr3m86ri4ihGULj-hMAMZefawwRhjhgWA8l9uHo6A';
  13.  
  14. // Funkcja do wysyłania wiadomości na Discord
  15. async function sendDiscordMessage(message) {
  16.     const response = await fetch(webhookUrl, {
  17.         method: 'POST',
  18.         headers: {
  19.             'Content-Type': 'application/json',
  20.         },
  21.         body: JSON.stringify({ content: message }),
  22.     });
  23.     if (!response.ok) {
  24.         console.error('Błąd podczas wysyłania wiadomości na Discord:', response.statusText);
  25.     }
  26. }
  27.  
  28. // Funkcja do generowania raportu dla obu klanów
  29. function generatePlayerReport(players) {
  30.     const clanNames = ['Air-Traffic Control', 'adam']; // Nazwy klanów
  31.     const mapName = map.name; // Nazwa mapy (pobrana z window.map.name)
  32.     let activePlayers = []; // Lista aktywnych graczy
  33.     let inactivePlayers = []; // Lista nieaktywnych graczy (stasis)
  34.     let professionSummary = {}; // Podsumowanie profesji
  35.  
  36.     // Przechodzenie przez sparse array
  37.     for (const key in players) {
  38.         if (players.hasOwnProperty(key) && players[key] !== null && typeof players[key] === 'object') {
  39.             const player = players[key];
  40.             if (player.clan && clanNames.includes(player.clan.name)) { // Tylko gracze z wybranych klanów
  41.                 const playerInfo = `**${player.nick}**(${player.lvl}${player.prof})`;
  42.  
  43.                 // Zliczanie profesji
  44.                 if (!professionSummary[player.prof]) {
  45.                     professionSummary[player.prof] = 0;
  46.                 }
  47.                 professionSummary[player.prof]++;
  48.  
  49.                 if (player.stasis > 0) {
  50.                     inactivePlayers.push(`👻 ${playerInfo}`);
  51.                 } else if (player.stasis_incoming_seconds > 0) {
  52.                     // Dodaj ogólny komunikat o nieaktywności za niecałą minutę
  53.                     inactivePlayers.push(`👻 za <1min ${playerInfo}`);
  54.                 } else {
  55.                     activePlayers.push(playerInfo);
  56.                 }
  57.             }
  58.         }
  59.     }
  60.  
  61.     // Tworzenie raportu
  62.     let report = `Enemy z **Air-Traffic Control/Adam** na **${mapName}**:\n`;
  63.     if (activePlayers.length > 0) {
  64.         report += activePlayers.join(', ') + '\n';
  65.     }
  66.     if (inactivePlayers.length > 0) {
  67.         report += inactivePlayers.join(', ') + '\n';
  68.     }
  69.  
  70.     // Dodanie podsumowania
  71.     const totalPlayers = activePlayers.length + inactivePlayers.length;
  72.     const professionDetails = Object.entries(professionSummary)
  73.         .map(([prof, count]) => `${count}${prof}`)
  74.         .join(',');
  75.     report += `**${totalPlayers}** (${professionDetails})\n`;
  76.  
  77.     return report;
  78. }
  79.  
  80. // Funkcja do filtrowania graczy z obu klanów
  81. function filterClanPlayers(players) {
  82.     const clanNames = ['Air-Traffic Control', 'adam']; // Nazwy klanów
  83.     const clanPlayers = {};
  84.  
  85.     for (const key in players) {
  86.         if (players.hasOwnProperty(key) && players[key] !== null && typeof players[key] === 'object') {
  87.             const player = players[key];
  88.             if (player.clan && clanNames.includes(player.clan.name)) {
  89.                 clanPlayers[key] = player;
  90.             }
  91.         }
  92.     }
  93.  
  94.     return clanPlayers;
  95. }
  96.  
  97. // Funkcja do porównywania listy graczy
  98. function comparePlayers(oldPlayers, newPlayers) {
  99.     const changes = {
  100.         newPlayers: [],
  101.         removedPlayers: [],
  102.         statusChanges: [],
  103.     };
  104.  
  105.     // Sprawdź nowych graczy i zmiany statusu
  106.     for (const key in newPlayers) {
  107.         if (newPlayers.hasOwnProperty(key)) {
  108.             const newPlayer = newPlayers[key];
  109.             const oldPlayer = oldPlayers[key];
  110.  
  111.             if (!oldPlayer) {
  112.                 changes.newPlayers.push(newPlayer);
  113.             } else if (
  114.                 oldPlayer.stasis !== newPlayer.stasis ||
  115.                 oldPlayer.stasis_incoming_seconds !== newPlayer.stasis_incoming_seconds
  116.             ) {
  117.                 changes.statusChanges.push(newPlayer);
  118.             }
  119.         }
  120.     }
  121.  
  122.     // Sprawdź usuniętych graczy
  123.     for (const key in oldPlayers) {
  124.         if (oldPlayers.hasOwnProperty(key) && !newPlayers[key]) {
  125.             changes.removedPlayers.push(oldPlayers[key]);
  126.         }
  127.     }
  128.  
  129.     return changes;
  130. }
  131.  
  132. // Funkcja do cyklicznego sprawdzania zmian
  133. function startTracking() {
  134.     let previousPlayers = {}; // Poprzednia lista graczy z obu klanów
  135.  
  136.     // Wysyłanie raportu przy pierwszym uruchomieniu
  137.     const initialPlayers = filterClanPlayers(g.other);
  138.     if (Object.keys(initialPlayers).length > 0) {
  139.         const report = generatePlayerReport(initialPlayers);
  140.         sendDiscordMessage(report);
  141.     } else {
  142.         console.log('Brak graczy z klanów Air-Traffic Control/Adam na mapie przy pierwszym uruchomieniu.');
  143.     }
  144.  
  145.     // Ustawienie interwału do cyklicznego sprawdzania zmian
  146.     setInterval(() => {
  147.         const currentPlayers = filterClanPlayers(g.other); // Aktualna lista graczy z obu klanów
  148.         const changes = comparePlayers(previousPlayers, currentPlayers);
  149.  
  150.         if (
  151.             changes.newPlayers.length > 0 ||
  152.             changes.removedPlayers.length > 0 ||
  153.             changes.statusChanges.length > 0
  154.         ) {
  155.             const report = generatePlayerReport(currentPlayers);
  156.             sendDiscordMessage(report);
  157.         }
  158.  
  159.         previousPlayers = { ...currentPlayers }; // Zaktualizuj poprzednią listę graczy
  160.     }, 10000); // Sprawdzaj co 10 sekund
  161. }
  162.  
  163. // Funkcja inicjalizująca skrypt
  164. function initScript() {
  165.     console.log('Inicjalizacja skryptu...');
  166.  
  167.     // Czekaj, aż g.other będzie dostępny
  168.     const checkInterval = setInterval(() => {
  169.         if (g && g.other && typeof g.other === 'object') {
  170.             console.log('Dane załadowane. Uruchamiam śledzenie zmian...');
  171.             clearInterval(checkInterval); // Zatrzymaj sprawdzanie
  172.             startTracking(); // Uruchom śledzenie zmian
  173.         } else {
  174.             console.log('Oczekiwanie na załadowanie danych...');
  175.         }
  176.     }, 1000); // Sprawdzaj co 1 sekundę
  177. }
  178.  
  179. // Uruchomienie skryptu po pełnym załadowaniu strony
  180. window.addEventListener('load', () => {
  181.     console.log('Strona została załadowana. Rozpoczynam inicjalizację skryptu...');
  182.     setTimeout(initScript, 5000); // Dodaj opóźnienie 5 sekund
  183. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement