Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name [ɢᴏʏʟᴇ] ʀᴀᴘᴏʀᴛ ᴀɪʀ-ᴛʀᴀꜰꜰɪᴄ ᴄᴏɴᴛʀᴏʟ & ᴀᴅᴀᴍ
- // @version 1.0
- // @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.
- // @author Nolifequ
- // @icon https://i.ibb.co/nM9YHWn/f-mag01.png
- // @match https://fobos.margonem.pl/
- // @icon https://www.google.com/s2/favicons?sz=64&domain=margonem.pl
- // ==/UserScript==
- // Konfiguracja Webhooka Discord
- const webhookUrl = 'https://discord.com/api/webhooks/1325250343025508424/8wGURTbiviaGf0COqtcTwhp97tzRr3m86ri4ihGULj-hMAMZefawwRhjhgWA8l9uHo6A';
- // Funkcja do wysyłania wiadomości na Discord
- async function sendDiscordMessage(message) {
- const response = await fetch(webhookUrl, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({ content: message }),
- });
- if (!response.ok) {
- console.error('Błąd podczas wysyłania wiadomości na Discord:', response.statusText);
- }
- }
- // Funkcja do generowania raportu dla obu klanów
- function generatePlayerReport(players) {
- const clanNames = ['Air-Traffic Control', 'adam']; // Nazwy klanów
- const mapName = map.name; // Nazwa mapy (pobrana z window.map.name)
- let activePlayers = []; // Lista aktywnych graczy
- let inactivePlayers = []; // Lista nieaktywnych graczy (stasis)
- let professionSummary = {}; // Podsumowanie profesji
- // Przechodzenie przez sparse array
- for (const key in players) {
- if (players.hasOwnProperty(key) && players[key] !== null && typeof players[key] === 'object') {
- const player = players[key];
- if (player.clan && clanNames.includes(player.clan.name)) { // Tylko gracze z wybranych klanów
- const playerInfo = `**${player.nick}**(${player.lvl}${player.prof})`;
- // Zliczanie profesji
- if (!professionSummary[player.prof]) {
- professionSummary[player.prof] = 0;
- }
- professionSummary[player.prof]++;
- if (player.stasis > 0) {
- inactivePlayers.push(`👻 ${playerInfo}`);
- } else if (player.stasis_incoming_seconds > 0) {
- // Dodaj ogólny komunikat o nieaktywności za niecałą minutę
- inactivePlayers.push(`👻 za <1min ${playerInfo}`);
- } else {
- activePlayers.push(playerInfo);
- }
- }
- }
- }
- // Tworzenie raportu
- let report = `Enemy z **Air-Traffic Control/Adam** na **${mapName}**:\n`;
- if (activePlayers.length > 0) {
- report += activePlayers.join(', ') + '\n';
- }
- if (inactivePlayers.length > 0) {
- report += inactivePlayers.join(', ') + '\n';
- }
- // Dodanie podsumowania
- const totalPlayers = activePlayers.length + inactivePlayers.length;
- const professionDetails = Object.entries(professionSummary)
- .map(([prof, count]) => `${count}${prof}`)
- .join(',');
- report += `**${totalPlayers}** (${professionDetails})\n`;
- return report;
- }
- // Funkcja do filtrowania graczy z obu klanów
- function filterClanPlayers(players) {
- const clanNames = ['Air-Traffic Control', 'adam']; // Nazwy klanów
- const clanPlayers = {};
- for (const key in players) {
- if (players.hasOwnProperty(key) && players[key] !== null && typeof players[key] === 'object') {
- const player = players[key];
- if (player.clan && clanNames.includes(player.clan.name)) {
- clanPlayers[key] = player;
- }
- }
- }
- return clanPlayers;
- }
- // Funkcja do porównywania listy graczy
- function comparePlayers(oldPlayers, newPlayers) {
- const changes = {
- newPlayers: [],
- removedPlayers: [],
- statusChanges: [],
- };
- // Sprawdź nowych graczy i zmiany statusu
- for (const key in newPlayers) {
- if (newPlayers.hasOwnProperty(key)) {
- const newPlayer = newPlayers[key];
- const oldPlayer = oldPlayers[key];
- if (!oldPlayer) {
- changes.newPlayers.push(newPlayer);
- } else if (
- oldPlayer.stasis !== newPlayer.stasis ||
- oldPlayer.stasis_incoming_seconds !== newPlayer.stasis_incoming_seconds
- ) {
- changes.statusChanges.push(newPlayer);
- }
- }
- }
- // Sprawdź usuniętych graczy
- for (const key in oldPlayers) {
- if (oldPlayers.hasOwnProperty(key) && !newPlayers[key]) {
- changes.removedPlayers.push(oldPlayers[key]);
- }
- }
- return changes;
- }
- // Funkcja do cyklicznego sprawdzania zmian
- function startTracking() {
- let previousPlayers = {}; // Poprzednia lista graczy z obu klanów
- // Wysyłanie raportu przy pierwszym uruchomieniu
- const initialPlayers = filterClanPlayers(g.other);
- if (Object.keys(initialPlayers).length > 0) {
- const report = generatePlayerReport(initialPlayers);
- sendDiscordMessage(report);
- } else {
- console.log('Brak graczy z klanów Air-Traffic Control/Adam na mapie przy pierwszym uruchomieniu.');
- }
- // Ustawienie interwału do cyklicznego sprawdzania zmian
- setInterval(() => {
- const currentPlayers = filterClanPlayers(g.other); // Aktualna lista graczy z obu klanów
- const changes = comparePlayers(previousPlayers, currentPlayers);
- if (
- changes.newPlayers.length > 0 ||
- changes.removedPlayers.length > 0 ||
- changes.statusChanges.length > 0
- ) {
- const report = generatePlayerReport(currentPlayers);
- sendDiscordMessage(report);
- }
- previousPlayers = { ...currentPlayers }; // Zaktualizuj poprzednią listę graczy
- }, 10000); // Sprawdzaj co 10 sekund
- }
- // Funkcja inicjalizująca skrypt
- function initScript() {
- console.log('Inicjalizacja skryptu...');
- // Czekaj, aż g.other będzie dostępny
- const checkInterval = setInterval(() => {
- if (g && g.other && typeof g.other === 'object') {
- console.log('Dane załadowane. Uruchamiam śledzenie zmian...');
- clearInterval(checkInterval); // Zatrzymaj sprawdzanie
- startTracking(); // Uruchom śledzenie zmian
- } else {
- console.log('Oczekiwanie na załadowanie danych...');
- }
- }, 1000); // Sprawdzaj co 1 sekundę
- }
- // Uruchomienie skryptu po pełnym załadowaniu strony
- window.addEventListener('load', () => {
- console.log('Strona została załadowana. Rozpoczynam inicjalizację skryptu...');
- setTimeout(initScript, 5000); // Dodaj opóźnienie 5 sekund
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement