Начинающий
- Статус
- Оффлайн
- Регистрация
- 6 Окт 2024
- Сообщения
- 157
- Реакции
- 0
- Выберите загрузчик игры
- Прочие моды
Привет YouGame!
Сделал простой IRC на весенс или эксп 3.1
Для работы нужен сервер на node.js
Сам класс IRC
Команда .irc
И server.js

Сделал простой IRC на весенс или эксп 3.1

Для работы нужен сервер на node.js
Сам класс IRC
IRC:
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:
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:
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Привет YouGame!
Сделал простой IRC на весенс или эксп 3.1
Для работы нужен сервер на node.js
Сам класс IRC
IRC: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: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: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);
