package com.laytonsmith.core.events.drivers;
import com.laytonsmith.abstraction.events.MCPluginIncomingMessageEvent;
import com.laytonsmith.annotations.api;
import com.laytonsmith.core.CHVersion;
import com.laytonsmith.core.constructs.CArray;
import com.laytonsmith.core.constructs.CByteArray;
import com.laytonsmith.core.constructs.CString;
import com.laytonsmith.core.constructs.Construct;
import com.laytonsmith.core.constructs.Target;
import com.laytonsmith.core.events.AbstractEvent;
import com.laytonsmith.core.events.BindableEvent;
import com.laytonsmith.core.events.Driver;
import com.laytonsmith.core.events.Prefilters;
import com.laytonsmith.core.exceptions.EventException;
import com.laytonsmith.core.exceptions.PrefilterNonMatchException;
import java.util.Map;
/**
*
* @author Jason Unger <entityreborn@gmail.com>
*/
public class PluginEvents {
@api
public static class plugin_message_received extends AbstractEvent {
@Override
public boolean isCancellable(BindableEvent o) {
return false;
}
@Override
public String getName() {
return "plugin_message_received";
}
@Override
public String docs() {
return "{channel: <string match>}"
+ " Fires when a player's client sends a plugin message."
+ " {player: the player | channel: the channel used |"
+ " bytes: byte array of the data sent}"
+ " {}"
+ " {player|channel|bytes}";
}
@Override
public boolean matches(Map<String, Construct> prefilter, BindableEvent e) throws PrefilterNonMatchException {
if (e instanceof MCPluginIncomingMessageEvent) {
MCPluginIncomingMessageEvent event = (MCPluginIncomingMessageEvent)e;
Prefilters.match(prefilter, "channel", event.getChannel(), Prefilters.PrefilterType.STRING_MATCH);
return true;
}
return false;
}
@Override
public BindableEvent convert(CArray manualObject, Target t) {
return null;
}
@Override
public Map<String, Construct> evaluate(BindableEvent e) throws EventException {
if (e instanceof MCPluginIncomingMessageEvent) {
MCPluginIncomingMessageEvent event = (MCPluginIncomingMessageEvent) e;
Map<String, Construct> ret = evaluate_helper(e);
ret.put("channel", new CString(event.getChannel(), Target.UNKNOWN));
ret.put("player", new CString(event.getPlayer().getName(), Target.UNKNOWN));
// Insert bytes into a CByteArray
CByteArray a = CByteArray.wrap(event.getBytes().clone(), Target.UNKNOWN);
a.rewind();
ret.put("bytes", a);
return ret;
} else {
throw new EventException("Cannot convert to MCPluginIncomingMessageEvent");
}
}
@Override
public Driver driver() {
return Driver.PLUGIN_MESSAGE_RECEIVED;
}
@Override
public boolean modifyEvent(String key, Construct value, BindableEvent event) {
return false;
}
@Override
public CHVersion since() {
return CHVersion.V3_3_1;
}
}
}