Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Часть функционала IRC | Vesence or exp 3.1 ready

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
6 Окт 2024
Сообщения
157
Реакции
0
Выберите загрузчик игры
  1. Прочие моды
Привет YouGame!:bayan:
Сделал простой IRC на весенс или эксп 3.1 :da:
Для работы нужен сервер на node.js
Сам класс IRC
IRC:
Expand Collapse Copy
package vesence.dlc.modules.impl.misc;

import com.google.common.eventbus.Subscribe;
import vesence.dlc.VesenceDLC;
import vesence.dlc.events.EventDisplay;
import vesence.dlc.modules.api.Category;
import vesence.dlc.modules.api.Module;
import vesence.dlc.modules.api.ModuleSystem;
import vesence.dlc.modules.api.ServerCategory;
import vesence.dlc.utils.client.IMinecraft;
import lombok.Getter;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;

import java.net.*;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@ModuleSystem(name = "IRC", type = Category.Misc, server = ServerCategory.NO, description = "IRC чат между игроками клиента")
public class IRC extends Module implements IMinecraft {

    private static final int MAX_MESSAGES = 50;
    private static final String SERVER_HOST = "localhost";
    private static final int SERVER_PORT = 8080;

    @Getter
    private final List<IRCMessage> messages = new CopyOnWriteArrayList<>();

    private boolean connected = false;
    private ScheduledExecutorService scheduler;
    private String username;
    private DatagramSocket socket;
    private InetAddress serverAddress;
    private final Random random = new Random();

    private final String[] NICKNAMES = {
            "Alex", "Steve", "Hero", "Ninja", "Shadow", "Dragon", "Phoenix", "Wolf",
            "Tiger", "Hunter", "Warrior", "Mage", "Archer", "Knight", "Samurai",
            "Viking", "Pirate", "Wizard", "Spartan", "Gladiator", "Assassin",
            "Ranger", "Paladin", "Berserk", "Crusader", "Nomad", "Traveler",
            "Explorer", "Builder", "Miner", "Farmer", "Fisher", "Alchemist",
            "Enchanter", "Blacksmith", "Merchant", "Bard", "Monk", "Priest",
            "Necromancer", "Sorcerer", "Druid", "Shaman", "Summoner", "Elemental",
            "Ghost", "Spectre", "Phantom", "Reaper", "Angel", "Demon"
    };

    @Override
    public boolean onEnable() {
        super.onEnable();
        connect();
        return false;
    }

    @Override
    public boolean onDisable() {
        super.onDisable();
        disconnect();
        return false;
    }

    private void connect() {
        try {
            username = generateRandomNickname();

            serverAddress = InetAddress.getByName(SERVER_HOST);
            socket = new DatagramSocket();

            connected = true;
            addSystemMessage("IRC модуль активирован. Ваш ник: " + username);


            sendToServer("JOIN:" + username + ":присоединился");


            startReceiving();

        } catch (Exception e) {
            addSystemMessage("Ошибка подключения: " + e.getMessage());
        }
    }

    private String generateRandomNickname() {
        String baseName = NICKNAMES[random.nextInt(NICKNAMES.length)];

        return baseName + (random.nextInt(900) + 100);
    }

    private void disconnect() {
        connected = false;
        if (scheduler != null) {
            scheduler.shutdown();
            scheduler = null;
        }
        if (socket != null && !socket.isClosed()) {

            if (username != null) {
                sendToServer("LEAVE:" + username + ":покинул");
            }
            socket.close();
        }

        addSystemMessage("IRC модуль деактивирован");
    }

    private void startReceiving() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(() -> {
            if (connected && socket != null && !socket.isClosed()) {
                try {
                    byte[] buffer = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                    socket.setSoTimeout(1000);

                    socket.receive(packet);
                    String received = new String(packet.getData(), 0, packet.getLength());
                    handleReceivedMessage(received);

                } catch (SocketTimeoutException e) {
                } catch (Exception e) {
                    if (connected) {
                        System.err.println("Error receiving message: " + e.getMessage());
                    }
                }
            }
        }, 0, 100, TimeUnit.MILLISECONDS);
    }

    private void handleReceivedMessage(String message) {
        try {
            String[] parts = message.split(":", 3);
            if (parts.length < 3) {
                System.err.println("Invalid message format: " + message);
                return;
            }

            String type = parts[0];
            String sender = parts[1];
            String content = parts[2];

            if ("MSG".equals(type)) {
                if (sender.equals(username)) {
                    return;
                }

                IRCMessage ircMessage = new IRCMessage(
                        sender,
                        content,
                        System.currentTimeMillis(),
                        false
                );
                addMessage(ircMessage);

                if (mc.player != null) {
                    mc.player.sendMessage(new StringTextComponent(
                            TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                    sender + TextFormatting.GRAY + ": " + TextFormatting.WHITE + content
                    ), mc.player.getUniqueID());
                }
            }
            else if ("JOIN".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " присоединился к чату");
                }
            }
            else if ("LEAVE".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " покинул чат");
                }
            }

        } catch (Exception e) {
            System.err.println("Error parsing message: " + e.getMessage());
        }
    }

    public void sendMessage(String message) {
        if (!connected || socket == null || socket.isClosed()) {
            addSystemMessage("IRC не активирован");
            return;
        }

        if (message.isEmpty()) {
            return;
        }

        try {
            IRCMessage ircMessage = new IRCMessage(
                    username,
                    message,
                    System.currentTimeMillis(),
                    false
            );
            addMessage(ircMessage);

            sendToServer("MSG:" + username + ":" + message);

            if (mc.player != null) {
                mc.player.sendMessage(new StringTextComponent(
                        TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                username + TextFormatting.GRAY + ": " + TextFormatting.WHITE + message
                ), mc.player.getUniqueID());
            }

        } catch (Exception e) {
            addSystemMessage("Ошибка отправки: " + e.getMessage());
        }
    }

    private void sendToServer(String data) {
        new Thread(() -> {
            try {
                if (socket == null || socket.isClosed()) {
                    return;
                }

                byte[] buffer = data.getBytes("UTF-8");
                DatagramPacket packet = new DatagramPacket(
                        buffer, buffer.length, serverAddress, SERVER_PORT
                );
                socket.send(packet);
            } catch (Exception e) {
                System.err.println("Failed to send to server: " + e.getMessage());
            }
        }).start();
    }

    private void addMessage(IRCMessage message) {
        messages.add(message);

        while (messages.size() > MAX_MESSAGES) {
            messages.remove(0);
        }
    }

    private void addSystemMessage(String message) {
        addMessage(new IRCMessage("System", message, System.currentTimeMillis(), true));

        if (mc.player != null) {
            mc.player.sendMessage(new StringTextComponent(
                    TextFormatting.DARK_GRAY + "[IRC] " + TextFormatting.GRAY + message
            ), mc.player.getUniqueID());
        }
    }

    @Subscribe
    public void onDisplay(EventDisplay event) {
        if (!isState()) return;

    }

    public static class IRCMessage {
        @Getter private final String username;
        @Getter private final String message;
        @Getter private final long timestamp;
        @Getter private final boolean system;

        public IRCMessage(String username, String message, long timestamp, boolean system) {
            this.username = username;
            this.message = message;
            this.timestamp = timestamp;
            this.system = system;
        }

        public String getFormattedTime() {
            return String.format("%tH:%tM", timestamp, timestamp);
        }

        public String getDisplayText() {
            String time = "[" + getFormattedTime() + "] ";
            String name = system ? TextFormatting.GRAY + username : TextFormatting.BLUE + username;
            return time + name + TextFormatting.WHITE + ": " + message;
        }
    }
}

Команда .irc
.irc:
Expand Collapse Copy
package vesence.dlc.command.impl.feature;

import vesence.dlc.command.*;
import vesence.dlc.command.impl.CommandException;
import vesence.dlc.modules.api.ModuleRegistry;
import net.minecraft.util.text.TextFormatting;

import java.util.List;

public class IRCComand implements Command, CommandWithAdvice, MultiNamedCommand {

    private final Prefix prefix;
    private final Logger logger;

    public IRCComand(Prefix prefix, Logger logger) {
        this.prefix = prefix;
        this.logger = logger;
    }

    @Override
    public void execute(Parameters parameters) {
        String message = parameters.asString(0)
                .orElseThrow(() -> new CommandException(TextFormatting.RED + "Введите сообщение для отправки!"));
        
        StringBuilder messageBuilder = new StringBuilder(message);
        for (int i = 1; i < 10; i++) {
            String part = parameters.asString(i).orElse(null);
            if (part == null) break;
            messageBuilder.append(" ").append(part);
        }

        String fullMessage = messageBuilder.toString();

        ModuleRegistry registry = vesence.dlc.VesenceDLC.getInstance().getFunctionRegistry();

        if (registry.getIrc() == null || !registry.getIrc().isState()) {
            throw new CommandException(TextFormatting.RED + "IRC модуль не активирован! Активируйте его в разделе Misc");
        }
        
        registry.getIrc().sendMessage(fullMessage);
        
    }

    @Override
    public String name() {
        return "irc";
    }

    @Override
    public String description() {
        return "Отправляет сообщение в IRC чат между игроками клиента";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(
                commandPrefix + "irc <сообщение> - Отправить сообщение в общий IRC чат",
                "Пример: " + commandPrefix + "irc Всем привет!",
                "Сообщения увидят все игроки с активированным IRC модулем"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("chat");
    }
}

И server.js
server.js:
Expand Collapse Copy
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

class IRCServer {
    constructor(port = 8080) {
        this.port = port;
        this.clients = new Map();
        this.start();
    }

    start() {
        server.on('message', (msg, rinfo) => {
            try {
                const message = msg.toString();
                console.log(`📨 Raw message: ${message} from ${rinfo.address}:${rinfo.port}`);
                
                const parts = message.split(':', 3);
                if (parts.length < 3) {
                    console.error('Invalid message format:', message);
                    return;
                }
                
                const type = parts[0];
                const username = parts[1];
                const content = parts[2];
                
                const clientKey = `${rinfo.address}:${rinfo.port}`;
                
                console.log(`📨 ${type} from ${username} (${clientKey}): ${content}`);
                
                switch(type) {
                    case 'JOIN':
                        this.clients.set(clientKey, username);
                        this.broadcast(`JOIN:${username}:присоединился`, rinfo);
                        break;
                        
                    case 'LEAVE':
                        this.clients.delete(clientKey);
                        this.broadcast(`LEAVE:${username}:покинул`, rinfo);
                        break;
                        
                    case 'MSG':
                        this.broadcast(`MSG:${username}:${content}`, rinfo);
                        break;
                }
                
            } catch (error) {
                console.error('Error handling message:', error);
            }
        });

        server.on('listening', () => {
            const address = server.address();
            console.log(`✅ IRC Server running on ${address.address}:${address.port}`);
            console.log(`📍 Connect using: ${address.address}:${address.port}`);
        });

        server.on('error', (err) => {
            console.error('Server error:', err);
        });

        server.bind(this.port);
    }

    broadcast(message, excludeRinfo) {
        const messageBuffer = Buffer.from(message);
        let sentCount = 0;
        
        this.clients.forEach((username, clientKey) => {
            const [address, port] = clientKey.split(':');
            
            if (excludeRinfo &&
                address === excludeRinfo.address &&
                parseInt(port) === excludeRinfo.port) {
                return;
            }
            
            server.send(messageBuffer, parseInt(port), address, (err) => {
                if (err) {
                    console.error('Error sending to', clientKey, err);
                    this.clients.delete(clientKey);
                } else {
                    sentCount++;
                }
            });
        });
        
        console.log(`📤 Broadcast to ${sentCount} clients: ${message}`);
    }
}

new IRCServer(8080);
Привет YouGame!:bayan:
Сделал простой IRC на весенс или эксп 3.1 :da:
Для работы нужен сервер на node.js
Сам класс IRC
IRC:
Expand Collapse Copy
package vesence.dlc.modules.impl.misc;

import com.google.common.eventbus.Subscribe;
import vesence.dlc.VesenceDLC;
import vesence.dlc.events.EventDisplay;
import vesence.dlc.modules.api.Category;
import vesence.dlc.modules.api.Module;
import vesence.dlc.modules.api.ModuleSystem;
import vesence.dlc.modules.api.ServerCategory;
import vesence.dlc.utils.client.IMinecraft;
import lombok.Getter;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;

import java.net.*;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@ModuleSystem(name = "IRC", type = Category.Misc, server = ServerCategory.NO, description = "IRC чат между игроками клиента")
public class IRC extends Module implements IMinecraft {

    private static final int MAX_MESSAGES = 50;
    private static final String SERVER_HOST = "localhost";
    private static final int SERVER_PORT = 8080;

    @Getter
    private final List<IRCMessage> messages = new CopyOnWriteArrayList<>();

    private boolean connected = false;
    private ScheduledExecutorService scheduler;
    private String username;
    private DatagramSocket socket;
    private InetAddress serverAddress;
    private final Random random = new Random();

    private final String[] NICKNAMES = {
            "Alex", "Steve", "Hero", "Ninja", "Shadow", "Dragon", "Phoenix", "Wolf",
            "Tiger", "Hunter", "Warrior", "Mage", "Archer", "Knight", "Samurai",
            "Viking", "Pirate", "Wizard", "Spartan", "Gladiator", "Assassin",
            "Ranger", "Paladin", "Berserk", "Crusader", "Nomad", "Traveler",
            "Explorer", "Builder", "Miner", "Farmer", "Fisher", "Alchemist",
            "Enchanter", "Blacksmith", "Merchant", "Bard", "Monk", "Priest",
            "Necromancer", "Sorcerer", "Druid", "Shaman", "Summoner", "Elemental",
            "Ghost", "Spectre", "Phantom", "Reaper", "Angel", "Demon"
    };

    @Override
    public boolean onEnable() {
        super.onEnable();
        connect();
        return false;
    }

    @Override
    public boolean onDisable() {
        super.onDisable();
        disconnect();
        return false;
    }

    private void connect() {
        try {
            username = generateRandomNickname();

            serverAddress = InetAddress.getByName(SERVER_HOST);
            socket = new DatagramSocket();

            connected = true;
            addSystemMessage("IRC модуль активирован. Ваш ник: " + username);


            sendToServer("JOIN:" + username + ":присоединился");


            startReceiving();

        } catch (Exception e) {
            addSystemMessage("Ошибка подключения: " + e.getMessage());
        }
    }

    private String generateRandomNickname() {
        String baseName = NICKNAMES[random.nextInt(NICKNAMES.length)];

        return baseName + (random.nextInt(900) + 100);
    }

    private void disconnect() {
        connected = false;
        if (scheduler != null) {
            scheduler.shutdown();
            scheduler = null;
        }
        if (socket != null && !socket.isClosed()) {

            if (username != null) {
                sendToServer("LEAVE:" + username + ":покинул");
            }
            socket.close();
        }

        addSystemMessage("IRC модуль деактивирован");
    }

    private void startReceiving() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(() -> {
            if (connected && socket != null && !socket.isClosed()) {
                try {
                    byte[] buffer = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                    socket.setSoTimeout(1000);

                    socket.receive(packet);
                    String received = new String(packet.getData(), 0, packet.getLength());
                    handleReceivedMessage(received);

                } catch (SocketTimeoutException e) {
                } catch (Exception e) {
                    if (connected) {
                        System.err.println("Error receiving message: " + e.getMessage());
                    }
                }
            }
        }, 0, 100, TimeUnit.MILLISECONDS);
    }

    private void handleReceivedMessage(String message) {
        try {
            String[] parts = message.split(":", 3);
            if (parts.length < 3) {
                System.err.println("Invalid message format: " + message);
                return;
            }

            String type = parts[0];
            String sender = parts[1];
            String content = parts[2];

            if ("MSG".equals(type)) {
                if (sender.equals(username)) {
                    return;
                }

                IRCMessage ircMessage = new IRCMessage(
                        sender,
                        content,
                        System.currentTimeMillis(),
                        false
                );
                addMessage(ircMessage);

                if (mc.player != null) {
                    mc.player.sendMessage(new StringTextComponent(
                            TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                    sender + TextFormatting.GRAY + ": " + TextFormatting.WHITE + content
                    ), mc.player.getUniqueID());
                }
            }
            else if ("JOIN".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " присоединился к чату");
                }
            }
            else if ("LEAVE".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " покинул чат");
                }
            }

        } catch (Exception e) {
            System.err.println("Error parsing message: " + e.getMessage());
        }
    }

    public void sendMessage(String message) {
        if (!connected || socket == null || socket.isClosed()) {
            addSystemMessage("IRC не активирован");
            return;
        }

        if (message.isEmpty()) {
            return;
        }

        try {
            IRCMessage ircMessage = new IRCMessage(
                    username,
                    message,
                    System.currentTimeMillis(),
                    false
            );
            addMessage(ircMessage);

            sendToServer("MSG:" + username + ":" + message);

            if (mc.player != null) {
                mc.player.sendMessage(new StringTextComponent(
                        TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                username + TextFormatting.GRAY + ": " + TextFormatting.WHITE + message
                ), mc.player.getUniqueID());
            }

        } catch (Exception e) {
            addSystemMessage("Ошибка отправки: " + e.getMessage());
        }
    }

    private void sendToServer(String data) {
        new Thread(() -> {
            try {
                if (socket == null || socket.isClosed()) {
                    return;
                }

                byte[] buffer = data.getBytes("UTF-8");
                DatagramPacket packet = new DatagramPacket(
                        buffer, buffer.length, serverAddress, SERVER_PORT
                );
                socket.send(packet);
            } catch (Exception e) {
                System.err.println("Failed to send to server: " + e.getMessage());
            }
        }).start();
    }

    private void addMessage(IRCMessage message) {
        messages.add(message);

        while (messages.size() > MAX_MESSAGES) {
            messages.remove(0);
        }
    }

    private void addSystemMessage(String message) {
        addMessage(new IRCMessage("System", message, System.currentTimeMillis(), true));

        if (mc.player != null) {
            mc.player.sendMessage(new StringTextComponent(
                    TextFormatting.DARK_GRAY + "[IRC] " + TextFormatting.GRAY + message
            ), mc.player.getUniqueID());
        }
    }

    @Subscribe
    public void onDisplay(EventDisplay event) {
        if (!isState()) return;

    }

    public static class IRCMessage {
        @Getter private final String username;
        @Getter private final String message;
        @Getter private final long timestamp;
        @Getter private final boolean system;

        public IRCMessage(String username, String message, long timestamp, boolean system) {
            this.username = username;
            this.message = message;
            this.timestamp = timestamp;
            this.system = system;
        }

        public String getFormattedTime() {
            return String.format("%tH:%tM", timestamp, timestamp);
        }

        public String getDisplayText() {
            String time = "[" + getFormattedTime() + "] ";
            String name = system ? TextFormatting.GRAY + username : TextFormatting.BLUE + username;
            return time + name + TextFormatting.WHITE + ": " + message;
        }
    }
}

Команда .irc
.irc:
Expand Collapse Copy
package vesence.dlc.command.impl.feature;

import vesence.dlc.command.*;
import vesence.dlc.command.impl.CommandException;
import vesence.dlc.modules.api.ModuleRegistry;
import net.minecraft.util.text.TextFormatting;

import java.util.List;

public class IRCComand implements Command, CommandWithAdvice, MultiNamedCommand {

    private final Prefix prefix;
    private final Logger logger;

    public IRCComand(Prefix prefix, Logger logger) {
        this.prefix = prefix;
        this.logger = logger;
    }

    @Override
    public void execute(Parameters parameters) {
        String message = parameters.asString(0)
                .orElseThrow(() -> new CommandException(TextFormatting.RED + "Введите сообщение для отправки!"));
       
        StringBuilder messageBuilder = new StringBuilder(message);
        for (int i = 1; i < 10; i++) {
            String part = parameters.asString(i).orElse(null);
            if (part == null) break;
            messageBuilder.append(" ").append(part);
        }

        String fullMessage = messageBuilder.toString();

        ModuleRegistry registry = vesence.dlc.VesenceDLC.getInstance().getFunctionRegistry();

        if (registry.getIrc() == null || !registry.getIrc().isState()) {
            throw new CommandException(TextFormatting.RED + "IRC модуль не активирован! Активируйте его в разделе Misc");
        }
       
        registry.getIrc().sendMessage(fullMessage);
       
    }

    @Override
    public String name() {
        return "irc";
    }

    @Override
    public String description() {
        return "Отправляет сообщение в IRC чат между игроками клиента";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(
                commandPrefix + "irc <сообщение> - Отправить сообщение в общий IRC чат",
                "Пример: " + commandPrefix + "irc Всем привет!",
                "Сообщения увидят все игроки с активированным IRC модулем"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("chat");
    }
}

И server.js
server.js:
Expand Collapse Copy
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

class IRCServer {
    constructor(port = 8080) {
        this.port = port;
        this.clients = new Map();
        this.start();
    }

    start() {
        server.on('message', (msg, rinfo) => {
            try {
                const message = msg.toString();
                console.log(`📨 Raw message: ${message} from ${rinfo.address}:${rinfo.port}`);
               
                const parts = message.split(':', 3);
                if (parts.length < 3) {
                    console.error('Invalid message format:', message);
                    return;
                }
               
                const type = parts[0];
                const username = parts[1];
                const content = parts[2];
               
                const clientKey = `${rinfo.address}:${rinfo.port}`;
               
                console.log(`📨 ${type} from ${username} (${clientKey}): ${content}`);
               
                switch(type) {
                    case 'JOIN':
                        this.clients.set(clientKey, username);
                        this.broadcast(`JOIN:${username}:присоединился`, rinfo);
                        break;
                       
                    case 'LEAVE':
                        this.clients.delete(clientKey);
                        this.broadcast(`LEAVE:${username}:покинул`, rinfo);
                        break;
                       
                    case 'MSG':
                        this.broadcast(`MSG:${username}:${content}`, rinfo);
                        break;
                }
               
            } catch (error) {
                console.error('Error handling message:', error);
            }
        });

        server.on('listening', () => {
            const address = server.address();
            console.log(`✅ IRC Server running on ${address.address}:${address.port}`);
            console.log(`📍 Connect using: ${address.address}:${address.port}`);
        });

        server.on('error', (err) => {
            console.error('Server error:', err);
        });

        server.bind(this.port);
    }

    broadcast(message, excludeRinfo) {
        const messageBuffer = Buffer.from(message);
        let sentCount = 0;
       
        this.clients.forEach((username, clientKey) => {
            const [address, port] = clientKey.split(':');
           
            if (excludeRinfo &&
                address === excludeRinfo.address &&
                parseInt(port) === excludeRinfo.port) {
                return;
            }
           
            server.send(messageBuffer, parseInt(port), address, (err) => {
                if (err) {
                    console.error('Error sending to', clientKey, err);
                    this.clients.delete(clientKey);
                } else {
                    sentCount++;
                }
            });
        });
       
        console.log(`📤 Broadcast to ${sentCount} clients: ${message}`);
    }
}

new IRCServer(8080);
Забыл! вот SS
1763907898702.png
 
можна вопрос? а если типы будут брать ирс у тебя значит все клиенты где он спащен могут разговаривать между собой?
 
можна вопрос? а если типы будут брать ирс у тебя значит все клиенты где он спащен могут разговаривать между собой?
Не, у всех разные хосты и айпишники и порты поэтому если кто то не узнает твой айпи и порт хоста то не сможет
А собствено зачем не проще с дримкора взять ?
Просто
я ждал где то 5 часов пока одобрили
 
можна вопрос? а если типы будут брать ирс у тебя значит все клиенты где он спащен могут разговаривать между собой?
Еблан, сервер нужен, сказали же. Те кто юзает 1 сервер те будут
 
Привет YouGame!:bayan:
Сделал простой IRC на весенс или эксп 3.1 :da:
Для работы нужен сервер на node.js
Сам класс IRC
IRC:
Expand Collapse Copy
package vesence.dlc.modules.impl.misc;

import com.google.common.eventbus.Subscribe;
import vesence.dlc.VesenceDLC;
import vesence.dlc.events.EventDisplay;
import vesence.dlc.modules.api.Category;
import vesence.dlc.modules.api.Module;
import vesence.dlc.modules.api.ModuleSystem;
import vesence.dlc.modules.api.ServerCategory;
import vesence.dlc.utils.client.IMinecraft;
import lombok.Getter;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;

import java.net.*;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@ModuleSystem(name = "IRC", type = Category.Misc, server = ServerCategory.NO, description = "IRC чат между игроками клиента")
public class IRC extends Module implements IMinecraft {

    private static final int MAX_MESSAGES = 50;
    private static final String SERVER_HOST = "localhost";
    private static final int SERVER_PORT = 8080;

    @Getter
    private final List<IRCMessage> messages = new CopyOnWriteArrayList<>();

    private boolean connected = false;
    private ScheduledExecutorService scheduler;
    private String username;
    private DatagramSocket socket;
    private InetAddress serverAddress;
    private final Random random = new Random();

    private final String[] NICKNAMES = {
            "Alex", "Steve", "Hero", "Ninja", "Shadow", "Dragon", "Phoenix", "Wolf",
            "Tiger", "Hunter", "Warrior", "Mage", "Archer", "Knight", "Samurai",
            "Viking", "Pirate", "Wizard", "Spartan", "Gladiator", "Assassin",
            "Ranger", "Paladin", "Berserk", "Crusader", "Nomad", "Traveler",
            "Explorer", "Builder", "Miner", "Farmer", "Fisher", "Alchemist",
            "Enchanter", "Blacksmith", "Merchant", "Bard", "Monk", "Priest",
            "Necromancer", "Sorcerer", "Druid", "Shaman", "Summoner", "Elemental",
            "Ghost", "Spectre", "Phantom", "Reaper", "Angel", "Demon"
    };

    @Override
    public boolean onEnable() {
        super.onEnable();
        connect();
        return false;
    }

    @Override
    public boolean onDisable() {
        super.onDisable();
        disconnect();
        return false;
    }

    private void connect() {
        try {
            username = generateRandomNickname();

            serverAddress = InetAddress.getByName(SERVER_HOST);
            socket = new DatagramSocket();

            connected = true;
            addSystemMessage("IRC модуль активирован. Ваш ник: " + username);


            sendToServer("JOIN:" + username + ":присоединился");


            startReceiving();

        } catch (Exception e) {
            addSystemMessage("Ошибка подключения: " + e.getMessage());
        }
    }

    private String generateRandomNickname() {
        String baseName = NICKNAMES[random.nextInt(NICKNAMES.length)];

        return baseName + (random.nextInt(900) + 100);
    }

    private void disconnect() {
        connected = false;
        if (scheduler != null) {
            scheduler.shutdown();
            scheduler = null;
        }
        if (socket != null && !socket.isClosed()) {

            if (username != null) {
                sendToServer("LEAVE:" + username + ":покинул");
            }
            socket.close();
        }

        addSystemMessage("IRC модуль деактивирован");
    }

    private void startReceiving() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(() -> {
            if (connected && socket != null && !socket.isClosed()) {
                try {
                    byte[] buffer = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                    socket.setSoTimeout(1000);

                    socket.receive(packet);
                    String received = new String(packet.getData(), 0, packet.getLength());
                    handleReceivedMessage(received);

                } catch (SocketTimeoutException e) {
                } catch (Exception e) {
                    if (connected) {
                        System.err.println("Error receiving message: " + e.getMessage());
                    }
                }
            }
        }, 0, 100, TimeUnit.MILLISECONDS);
    }

    private void handleReceivedMessage(String message) {
        try {
            String[] parts = message.split(":", 3);
            if (parts.length < 3) {
                System.err.println("Invalid message format: " + message);
                return;
            }

            String type = parts[0];
            String sender = parts[1];
            String content = parts[2];

            if ("MSG".equals(type)) {
                if (sender.equals(username)) {
                    return;
                }

                IRCMessage ircMessage = new IRCMessage(
                        sender,
                        content,
                        System.currentTimeMillis(),
                        false
                );
                addMessage(ircMessage);

                if (mc.player != null) {
                    mc.player.sendMessage(new StringTextComponent(
                            TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                    sender + TextFormatting.GRAY + ": " + TextFormatting.WHITE + content
                    ), mc.player.getUniqueID());
                }
            }
            else if ("JOIN".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " присоединился к чату");
                }
            }
            else if ("LEAVE".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " покинул чат");
                }
            }

        } catch (Exception e) {
            System.err.println("Error parsing message: " + e.getMessage());
        }
    }

    public void sendMessage(String message) {
        if (!connected || socket == null || socket.isClosed()) {
            addSystemMessage("IRC не активирован");
            return;
        }

        if (message.isEmpty()) {
            return;
        }

        try {
            IRCMessage ircMessage = new IRCMessage(
                    username,
                    message,
                    System.currentTimeMillis(),
                    false
            );
            addMessage(ircMessage);

            sendToServer("MSG:" + username + ":" + message);

            if (mc.player != null) {
                mc.player.sendMessage(new StringTextComponent(
                        TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                username + TextFormatting.GRAY + ": " + TextFormatting.WHITE + message
                ), mc.player.getUniqueID());
            }

        } catch (Exception e) {
            addSystemMessage("Ошибка отправки: " + e.getMessage());
        }
    }

    private void sendToServer(String data) {
        new Thread(() -> {
            try {
                if (socket == null || socket.isClosed()) {
                    return;
                }

                byte[] buffer = data.getBytes("UTF-8");
                DatagramPacket packet = new DatagramPacket(
                        buffer, buffer.length, serverAddress, SERVER_PORT
                );
                socket.send(packet);
            } catch (Exception e) {
                System.err.println("Failed to send to server: " + e.getMessage());
            }
        }).start();
    }

    private void addMessage(IRCMessage message) {
        messages.add(message);

        while (messages.size() > MAX_MESSAGES) {
            messages.remove(0);
        }
    }

    private void addSystemMessage(String message) {
        addMessage(new IRCMessage("System", message, System.currentTimeMillis(), true));

        if (mc.player != null) {
            mc.player.sendMessage(new StringTextComponent(
                    TextFormatting.DARK_GRAY + "[IRC] " + TextFormatting.GRAY + message
            ), mc.player.getUniqueID());
        }
    }

    @Subscribe
    public void onDisplay(EventDisplay event) {
        if (!isState()) return;

    }

    public static class IRCMessage {
        @Getter private final String username;
        @Getter private final String message;
        @Getter private final long timestamp;
        @Getter private final boolean system;

        public IRCMessage(String username, String message, long timestamp, boolean system) {
            this.username = username;
            this.message = message;
            this.timestamp = timestamp;
            this.system = system;
        }

        public String getFormattedTime() {
            return String.format("%tH:%tM", timestamp, timestamp);
        }

        public String getDisplayText() {
            String time = "[" + getFormattedTime() + "] ";
            String name = system ? TextFormatting.GRAY + username : TextFormatting.BLUE + username;
            return time + name + TextFormatting.WHITE + ": " + message;
        }
    }
}

Команда .irc
.irc:
Expand Collapse Copy
package vesence.dlc.command.impl.feature;

import vesence.dlc.command.*;
import vesence.dlc.command.impl.CommandException;
import vesence.dlc.modules.api.ModuleRegistry;
import net.minecraft.util.text.TextFormatting;

import java.util.List;

public class IRCComand implements Command, CommandWithAdvice, MultiNamedCommand {

    private final Prefix prefix;
    private final Logger logger;

    public IRCComand(Prefix prefix, Logger logger) {
        this.prefix = prefix;
        this.logger = logger;
    }

    @Override
    public void execute(Parameters parameters) {
        String message = parameters.asString(0)
                .orElseThrow(() -> new CommandException(TextFormatting.RED + "Введите сообщение для отправки!"));
       
        StringBuilder messageBuilder = new StringBuilder(message);
        for (int i = 1; i < 10; i++) {
            String part = parameters.asString(i).orElse(null);
            if (part == null) break;
            messageBuilder.append(" ").append(part);
        }

        String fullMessage = messageBuilder.toString();

        ModuleRegistry registry = vesence.dlc.VesenceDLC.getInstance().getFunctionRegistry();

        if (registry.getIrc() == null || !registry.getIrc().isState()) {
            throw new CommandException(TextFormatting.RED + "IRC модуль не активирован! Активируйте его в разделе Misc");
        }
       
        registry.getIrc().sendMessage(fullMessage);
       
    }

    @Override
    public String name() {
        return "irc";
    }

    @Override
    public String description() {
        return "Отправляет сообщение в IRC чат между игроками клиента";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(
                commandPrefix + "irc <сообщение> - Отправить сообщение в общий IRC чат",
                "Пример: " + commandPrefix + "irc Всем привет!",
                "Сообщения увидят все игроки с активированным IRC модулем"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("chat");
    }
}

И server.js
server.js:
Expand Collapse Copy
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

class IRCServer {
    constructor(port = 8080) {
        this.port = port;
        this.clients = new Map();
        this.start();
    }

    start() {
        server.on('message', (msg, rinfo) => {
            try {
                const message = msg.toString();
                console.log(`📨 Raw message: ${message} from ${rinfo.address}:${rinfo.port}`);
               
                const parts = message.split(':', 3);
                if (parts.length < 3) {
                    console.error('Invalid message format:', message);
                    return;
                }
               
                const type = parts[0];
                const username = parts[1];
                const content = parts[2];
               
                const clientKey = `${rinfo.address}:${rinfo.port}`;
               
                console.log(`📨 ${type} from ${username} (${clientKey}): ${content}`);
               
                switch(type) {
                    case 'JOIN':
                        this.clients.set(clientKey, username);
                        this.broadcast(`JOIN:${username}:присоединился`, rinfo);
                        break;
                       
                    case 'LEAVE':
                        this.clients.delete(clientKey);
                        this.broadcast(`LEAVE:${username}:покинул`, rinfo);
                        break;
                       
                    case 'MSG':
                        this.broadcast(`MSG:${username}:${content}`, rinfo);
                        break;
                }
               
            } catch (error) {
                console.error('Error handling message:', error);
            }
        });

        server.on('listening', () => {
            const address = server.address();
            console.log(`✅ IRC Server running on ${address.address}:${address.port}`);
            console.log(`📍 Connect using: ${address.address}:${address.port}`);
        });

        server.on('error', (err) => {
            console.error('Server error:', err);
        });

        server.bind(this.port);
    }

    broadcast(message, excludeRinfo) {
        const messageBuffer = Buffer.from(message);
        let sentCount = 0;
       
        this.clients.forEach((username, clientKey) => {
            const [address, port] = clientKey.split(':');
           
            if (excludeRinfo &&
                address === excludeRinfo.address &&
                parseInt(port) === excludeRinfo.port) {
                return;
            }
           
            server.send(messageBuffer, parseInt(port), address, (err) => {
                if (err) {
                    console.error('Error sending to', clientKey, err);
                    this.clients.delete(clientKey);
                } else {
                    sentCount++;
                }
            });
        });
       
        console.log(`📤 Broadcast to ${sentCount} clients: ${message}`);
    }
}

new IRCServer(8080);

Забыл! вот SS
Посмотреть вложение 320688
зная какие пастеры пошли, у них денег на вдс нет
 
Привет YouGame!:bayan:
Сделал простой IRC на весенс или эксп 3.1 :da:
Для работы нужен сервер на node.js
Сам класс IRC
IRC:
Expand Collapse Copy
package vesence.dlc.modules.impl.misc;

import com.google.common.eventbus.Subscribe;
import vesence.dlc.VesenceDLC;
import vesence.dlc.events.EventDisplay;
import vesence.dlc.modules.api.Category;
import vesence.dlc.modules.api.Module;
import vesence.dlc.modules.api.ModuleSystem;
import vesence.dlc.modules.api.ServerCategory;
import vesence.dlc.utils.client.IMinecraft;
import lombok.Getter;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;

import java.net.*;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@ModuleSystem(name = "IRC", type = Category.Misc, server = ServerCategory.NO, description = "IRC чат между игроками клиента")
public class IRC extends Module implements IMinecraft {

    private static final int MAX_MESSAGES = 50;
    private static final String SERVER_HOST = "localhost";
    private static final int SERVER_PORT = 8080;

    @Getter
    private final List<IRCMessage> messages = new CopyOnWriteArrayList<>();

    private boolean connected = false;
    private ScheduledExecutorService scheduler;
    private String username;
    private DatagramSocket socket;
    private InetAddress serverAddress;
    private final Random random = new Random();

    private final String[] NICKNAMES = {
            "Alex", "Steve", "Hero", "Ninja", "Shadow", "Dragon", "Phoenix", "Wolf",
            "Tiger", "Hunter", "Warrior", "Mage", "Archer", "Knight", "Samurai",
            "Viking", "Pirate", "Wizard", "Spartan", "Gladiator", "Assassin",
            "Ranger", "Paladin", "Berserk", "Crusader", "Nomad", "Traveler",
            "Explorer", "Builder", "Miner", "Farmer", "Fisher", "Alchemist",
            "Enchanter", "Blacksmith", "Merchant", "Bard", "Monk", "Priest",
            "Necromancer", "Sorcerer", "Druid", "Shaman", "Summoner", "Elemental",
            "Ghost", "Spectre", "Phantom", "Reaper", "Angel", "Demon"
    };

    @Override
    public boolean onEnable() {
        super.onEnable();
        connect();
        return false;
    }

    @Override
    public boolean onDisable() {
        super.onDisable();
        disconnect();
        return false;
    }

    private void connect() {
        try {
            username = generateRandomNickname();

            serverAddress = InetAddress.getByName(SERVER_HOST);
            socket = new DatagramSocket();

            connected = true;
            addSystemMessage("IRC модуль активирован. Ваш ник: " + username);


            sendToServer("JOIN:" + username + ":присоединился");


            startReceiving();

        } catch (Exception e) {
            addSystemMessage("Ошибка подключения: " + e.getMessage());
        }
    }

    private String generateRandomNickname() {
        String baseName = NICKNAMES[random.nextInt(NICKNAMES.length)];

        return baseName + (random.nextInt(900) + 100);
    }

    private void disconnect() {
        connected = false;
        if (scheduler != null) {
            scheduler.shutdown();
            scheduler = null;
        }
        if (socket != null && !socket.isClosed()) {

            if (username != null) {
                sendToServer("LEAVE:" + username + ":покинул");
            }
            socket.close();
        }

        addSystemMessage("IRC модуль деактивирован");
    }

    private void startReceiving() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(() -> {
            if (connected && socket != null && !socket.isClosed()) {
                try {
                    byte[] buffer = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                    socket.setSoTimeout(1000);

                    socket.receive(packet);
                    String received = new String(packet.getData(), 0, packet.getLength());
                    handleReceivedMessage(received);

                } catch (SocketTimeoutException e) {
                } catch (Exception e) {
                    if (connected) {
                        System.err.println("Error receiving message: " + e.getMessage());
                    }
                }
            }
        }, 0, 100, TimeUnit.MILLISECONDS);
    }

    private void handleReceivedMessage(String message) {
        try {
            String[] parts = message.split(":", 3);
            if (parts.length < 3) {
                System.err.println("Invalid message format: " + message);
                return;
            }

            String type = parts[0];
            String sender = parts[1];
            String content = parts[2];

            if ("MSG".equals(type)) {
                if (sender.equals(username)) {
                    return;
                }

                IRCMessage ircMessage = new IRCMessage(
                        sender,
                        content,
                        System.currentTimeMillis(),
                        false
                );
                addMessage(ircMessage);

                if (mc.player != null) {
                    mc.player.sendMessage(new StringTextComponent(
                            TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                    sender + TextFormatting.GRAY + ": " + TextFormatting.WHITE + content
                    ), mc.player.getUniqueID());
                }
            }
            else if ("JOIN".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " присоединился к чату");
                }
            }
            else if ("LEAVE".equals(type)) {
                if (!sender.equals(username)) {
                    addSystemMessage(sender + " покинул чат");
                }
            }

        } catch (Exception e) {
            System.err.println("Error parsing message: " + e.getMessage());
        }
    }

    public void sendMessage(String message) {
        if (!connected || socket == null || socket.isClosed()) {
            addSystemMessage("IRC не активирован");
            return;
        }

        if (message.isEmpty()) {
            return;
        }

        try {
            IRCMessage ircMessage = new IRCMessage(
                    username,
                    message,
                    System.currentTimeMillis(),
                    false
            );
            addMessage(ircMessage);

            sendToServer("MSG:" + username + ":" + message);

            if (mc.player != null) {
                mc.player.sendMessage(new StringTextComponent(
                        TextFormatting.BLUE + "[IRC] " + TextFormatting.WHITE +
                                username + TextFormatting.GRAY + ": " + TextFormatting.WHITE + message
                ), mc.player.getUniqueID());
            }

        } catch (Exception e) {
            addSystemMessage("Ошибка отправки: " + e.getMessage());
        }
    }

    private void sendToServer(String data) {
        new Thread(() -> {
            try {
                if (socket == null || socket.isClosed()) {
                    return;
                }

                byte[] buffer = data.getBytes("UTF-8");
                DatagramPacket packet = new DatagramPacket(
                        buffer, buffer.length, serverAddress, SERVER_PORT
                );
                socket.send(packet);
            } catch (Exception e) {
                System.err.println("Failed to send to server: " + e.getMessage());
            }
        }).start();
    }

    private void addMessage(IRCMessage message) {
        messages.add(message);

        while (messages.size() > MAX_MESSAGES) {
            messages.remove(0);
        }
    }

    private void addSystemMessage(String message) {
        addMessage(new IRCMessage("System", message, System.currentTimeMillis(), true));

        if (mc.player != null) {
            mc.player.sendMessage(new StringTextComponent(
                    TextFormatting.DARK_GRAY + "[IRC] " + TextFormatting.GRAY + message
            ), mc.player.getUniqueID());
        }
    }

    @Subscribe
    public void onDisplay(EventDisplay event) {
        if (!isState()) return;

    }

    public static class IRCMessage {
        @Getter private final String username;
        @Getter private final String message;
        @Getter private final long timestamp;
        @Getter private final boolean system;

        public IRCMessage(String username, String message, long timestamp, boolean system) {
            this.username = username;
            this.message = message;
            this.timestamp = timestamp;
            this.system = system;
        }

        public String getFormattedTime() {
            return String.format("%tH:%tM", timestamp, timestamp);
        }

        public String getDisplayText() {
            String time = "[" + getFormattedTime() + "] ";
            String name = system ? TextFormatting.GRAY + username : TextFormatting.BLUE + username;
            return time + name + TextFormatting.WHITE + ": " + message;
        }
    }
}

Команда .irc
.irc:
Expand Collapse Copy
package vesence.dlc.command.impl.feature;

import vesence.dlc.command.*;
import vesence.dlc.command.impl.CommandException;
import vesence.dlc.modules.api.ModuleRegistry;
import net.minecraft.util.text.TextFormatting;

import java.util.List;

public class IRCComand implements Command, CommandWithAdvice, MultiNamedCommand {

    private final Prefix prefix;
    private final Logger logger;

    public IRCComand(Prefix prefix, Logger logger) {
        this.prefix = prefix;
        this.logger = logger;
    }

    @Override
    public void execute(Parameters parameters) {
        String message = parameters.asString(0)
                .orElseThrow(() -> new CommandException(TextFormatting.RED + "Введите сообщение для отправки!"));
       
        StringBuilder messageBuilder = new StringBuilder(message);
        for (int i = 1; i < 10; i++) {
            String part = parameters.asString(i).orElse(null);
            if (part == null) break;
            messageBuilder.append(" ").append(part);
        }

        String fullMessage = messageBuilder.toString();

        ModuleRegistry registry = vesence.dlc.VesenceDLC.getInstance().getFunctionRegistry();

        if (registry.getIrc() == null || !registry.getIrc().isState()) {
            throw new CommandException(TextFormatting.RED + "IRC модуль не активирован! Активируйте его в разделе Misc");
        }
       
        registry.getIrc().sendMessage(fullMessage);
       
    }

    @Override
    public String name() {
        return "irc";
    }

    @Override
    public String description() {
        return "Отправляет сообщение в IRC чат между игроками клиента";
    }

    @Override
    public List<String> adviceMessage() {
        String commandPrefix = prefix.get();
        return List.of(
                commandPrefix + "irc <сообщение> - Отправить сообщение в общий IRC чат",
                "Пример: " + commandPrefix + "irc Всем привет!",
                "Сообщения увидят все игроки с активированным IRC модулем"
        );
    }

    @Override
    public List<String> aliases() {
        return List.of("chat");
    }
}

И server.js
server.js:
Expand Collapse Copy
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

class IRCServer {
    constructor(port = 8080) {
        this.port = port;
        this.clients = new Map();
        this.start();
    }

    start() {
        server.on('message', (msg, rinfo) => {
            try {
                const message = msg.toString();
                console.log(`📨 Raw message: ${message} from ${rinfo.address}:${rinfo.port}`);
               
                const parts = message.split(':', 3);
                if (parts.length < 3) {
                    console.error('Invalid message format:', message);
                    return;
                }
               
                const type = parts[0];
                const username = parts[1];
                const content = parts[2];
               
                const clientKey = `${rinfo.address}:${rinfo.port}`;
               
                console.log(`📨 ${type} from ${username} (${clientKey}): ${content}`);
               
                switch(type) {
                    case 'JOIN':
                        this.clients.set(clientKey, username);
                        this.broadcast(`JOIN:${username}:присоединился`, rinfo);
                        break;
                       
                    case 'LEAVE':
                        this.clients.delete(clientKey);
                        this.broadcast(`LEAVE:${username}:покинул`, rinfo);
                        break;
                       
                    case 'MSG':
                        this.broadcast(`MSG:${username}:${content}`, rinfo);
                        break;
                }
               
            } catch (error) {
                console.error('Error handling message:', error);
            }
        });

        server.on('listening', () => {
            const address = server.address();
            console.log(`✅ IRC Server running on ${address.address}:${address.port}`);
            console.log(`📍 Connect using: ${address.address}:${address.port}`);
        });

        server.on('error', (err) => {
            console.error('Server error:', err);
        });

        server.bind(this.port);
    }

    broadcast(message, excludeRinfo) {
        const messageBuffer = Buffer.from(message);
        let sentCount = 0;
       
        this.clients.forEach((username, clientKey) => {
            const [address, port] = clientKey.split(':');
           
            if (excludeRinfo &&
                address === excludeRinfo.address &&
                parseInt(port) === excludeRinfo.port) {
                return;
            }
           
            server.send(messageBuffer, parseInt(port), address, (err) => {
                if (err) {
                    console.error('Error sending to', clientKey, err);
                    this.clients.delete(clientKey);
                } else {
                    sentCount++;
                }
            });
        });
       
        console.log(`📤 Broadcast to ${sentCount} clients: ${message}`);
    }
}

new IRCServer(8080);

Забыл! вот SS
Посмотреть вложение 320688
/del не особо нужно лучше бы в виде отдельной гуи сделал
 
Назад
Сверху Снизу