Начинающий
- Статус
- Оффлайн
- Регистрация
- 19 Авг 2022
- Сообщения
- 3
- Реакции
- 0
брух на локалке
Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Ну так его на хост можно поставить :Dбрух на локалке
пасибаИмба брат
говно, гпт. сделанно не на вебсокетах (привет школьники с дебагером)Привет 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);
Забыл! вот SS
Посмотреть вложение 320688
нахуй NodeJS? Без него можно..Привет 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);
Забыл! вот SS
Посмотреть вложение 320688
а на чем тогда сервер делатьнахуй NodeJS? Без него можно..
ахахах, на джаве, на вебсокетах (netty к примеру), и это будет в 100 раз безопаснее банальных http-запросова на чем тогда сервер делать
и в чем же заключается безопасностьахахах, на джаве, на вебсокетах (netty к примеру), и это будет в 100 раз безопаснее банальных http-запросов
1. подключение при инициализации клиента, а далее отправка команд, а не каждый раз новый запрос (оптимизиация) 2. у вебсокетов свой вид подключения (ws://), и чтобы их вытащить из того же к примеру дебагера, в него нужно подключать сертификаты, что большая часть людей делать не будет, а на подобном говнище как node js бро просто открывает дебаггер, отсылает сообщение и достает эндпоинт апишки, далее просто вливает трафик (ддудосит), или же начинает спамить, обходя модерацию, потому-что скорее всего модерация на стороне клиента (если она вообще есть).и в чем же заключается безопасность
на нод... жс... можно... написать... сервер... на вебсокетах... там есть... нормальные библиотеки... и можно... если не лень... сделать рейтлимит... по айпи...1. подключение при инициализации клиента, а далее отправка команд, а не каждый раз новый запрос (оптимизиация) 2. у вебсокетов свой вид подключения (ws://), и чтобы их вытащить из того же к примеру дебагера, в него нужно подключать сертификаты, что большая часть людей делать не будет, а на подобном говнище как node js бро просто открывает дебаггер, отсылает сообщение и достает эндпоинт апишки, далее просто вливает трафик (ддудосит), или же начинает спамить, обходя модерацию, потому-что скорее всего модерация на стороне клиента (если она вообще есть).
рейтлимит по айпи?) а про прокси слышал?) а про влив трафика слышал?.на нод... жс... можно... написать... сервер... на вебсокетах... там есть... нормальные библиотеки... и можно... если не лень... сделать рейтлимит... по айпи...
самые адекватные вебсокеты только на ДЖАВЕна нод... жс... можно... написать... сервер... на вебсокетах... там есть... нормальные библиотеки... и можно... если не лень... сделать рейтлимит... по айпи...
ну потный пидор с 1488 прокси все же додумается найти твой сервер по вебсокетурейтлимит по айпи?) а про прокси слышал?) а про влив трафика слышал?.
ха ха ха я напащу вебсокет сервер на с++ и ты мне ничего не сделаешьсамые адекватные вебсокеты только на ДЖАВЕ
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz