package com.w67clement.mineapi.system.messaging;
import com.w67clement.mineapi.MineAPI;
import io.netty.buffer.Unpooled;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.plugin.messaging.Messenger;
/**
* Created by w67clement on 20/01/2016.
* <p>
* Class of project: MineAPI
*/
public class MessagingManager
{
private final MineAPI plugin;
private boolean isInit = false;
private PacketRegistry packetRegistry = PacketRegistry.getInstance();
public MessagingManager(MineAPI plugin)
{
this.plugin = plugin;
}
public PacketRegistry getPacketRegistry()
{
return this.packetRegistry;
}
public void init()
{
if (!isInit)
{
Bukkit.getMessenger().registerOutgoingPluginChannel(this.plugin, "MineMessaging");
Bukkit.getMessenger().registerIncomingPluginChannel(this.plugin, "MineMessaging", new MessagingListener(this));
}
else
throw new UnsupportedOperationException("MessagingManager is already initialized.");
}
public void sendPacket(String plugin, MessagingPacket packet)
{
Validate.notNull(plugin, "Plugin cannot be null.");
Validate.notNull(packet, "Packet cannot be null.");
if (plugin.length() > 64)
plugin = plugin.substring(0, 64);
PacketBuffer buffer = new PacketBuffer(Unpooled.buffer());
int id = packetRegistry.getIdByPacket(plugin, packet.getClass());
buffer.writeString(plugin);
buffer.writeVarIntToBuffer(id);
packet.encode(buffer);
// To bytes method from http://stackoverflow.com/questions/19296386/netty-java-getting-data-from-bytebuf
byte[] bytes;
int length = buffer.readableBytes();
if (buffer.hasArray()) {
bytes = buffer.array();
} else {
bytes = new byte[length];
buffer.getBytes(buffer.readerIndex(), bytes);
}
MineAPI.sendMessageToConsole(MineAPI.DEBUG_PREFIX + "Attempt to send packet: " + packet.toString(), true);
MineAPI.sendMessageToConsole(MineAPI.DEBUG_PREFIX + "Packet's bytes size: " + bytes.length + ", is too big: " + (Messenger.MAX_MESSAGE_SIZE < bytes.length ? "true" : "false"), true);
Bukkit.getServer().sendPluginMessage(this.plugin, "MineMessaging", bytes);
}
}