package ring.intermud3; import java.util.ArrayList; import java.util.List; import java.util.Map; import ring.commands.CommandResult; import ring.deployer.DeployedMUDFactory; import ring.players.Player; import com.aelfengard.i3.ChanInfo; import com.aelfengard.i3.ErrorCallback; import com.aelfengard.i3.I3ChannelListener; import com.aelfengard.i3.I3Client; import com.aelfengard.i3.I3EventListener; import com.aelfengard.i3.I3NotConnectedException; import com.aelfengard.i3.LPCMixed; import com.aelfengard.i3.MudInfo; import com.aelfengard.i3.packet.ChannelEPacket; import com.aelfengard.i3.packet.ChannelMPacket; import com.aelfengard.i3.packet.ChannelTPacket; import com.aelfengard.i3.packet.EmoteToPacket; import com.aelfengard.i3.packet.ErrorPacket; import com.aelfengard.i3.packet.TellPacket; /** * A per-player Intermud3 client built on top of the i3.jar library. * @author projectmoon * */ public class Intermud3Client { private static I3Client client = Intermud3Daemon.currentDaemon().getClient(); private Player player; public Intermud3Client(Player player) { this.player = player; client.addEventListener(new I3EventsListener()); } public boolean isConnected() { return client.isConnected(); } public void sendTell(String toMud, String toUser, String message) { TellPacket tpacket = new TellPacket(); tpacket.setOriginatorMudName(new LPCMixed(DeployedMUDFactory.currentMUD().getName())); tpacket.setOriginatorUsername(new LPCMixed(player.getName())); tpacket.setOrigVisName(new LPCMixed(player.getName())); tpacket.setTargetMudName(new LPCMixed(toMud)); tpacket.setTargetUsername(new LPCMixed(toUser)); tpacket.setMessage(new LPCMixed(message)); try { client.send(tpacket); //For receiving tells, see the event handler below. } catch (I3NotConnectedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void submitWhoRequest(String mudName) throws I3NotConnectedException { client.sendWho(new LPCMixed(player.getName()), new LPCMixed(mudName)); //Rest is handled by the event handler. } public void sendEmote(String toMud, String toUser, String message) { } public void joinChannel(String channel) { } public void leaveChannel(String channel) { } public List<String> getMuds() { List<String> muds = new ArrayList<String>(); for (Map.Entry<String,MudInfo> entry : client.getMudList().entrySet()) { if (entry.getValue().getState().asInteger() == MudInfo.MUD_STATE_UP) { muds.add(entry.getKey()); } } return muds; } public List<String> getChannels() { List<String> channels = new ArrayList<String>(); for (Map.Entry<String,ChanInfo> entry : client.getChannelList().entrySet()) { if (entry.getValue().getChannelType() == ChanInfo.CHANNEL_TYPE_SELECTIVELY_BANNED) { channels.add(entry.getKey()); } } return channels; } private class I3EventsListener implements I3EventListener { public void whoReply(LPCMixed targetUsername, LPCMixed originatorMudName, List<LPCMixed> whoInfo) { System.out.println("Testing vs " + player.getName()); if (player.getName().equalsIgnoreCase(targetUsername.asString())) { CommandResult res = new CommandResult(); String list = "Players on [B]" + originatorMudName.asString() + "[R]:\n"; for (LPCMixed info : whoInfo) { List<LPCMixed> entry = info.asList(); list += (entry.get(0) + " [" + entry.get(1) + "/" + entry.get(2) + "]") + "\n"; } res.setText(list); res.setSuccessful(true); res.send(); } } public void whoFailed(LPCMixed targetUsername, LPCMixed targetMudName, LPCMixed errorMessage) { System.out.println("WHO failed: " + errorMessage.asString()); } public List<LPCMixed> whoRequest() { return null; } public void tell(TellPacket packet, ErrorCallback callback) { if (player.getName().equals(packet.getTargetUsername().asString())) { String message = "[B]" + packet.getOriginatorUsername() + "@" + packet.getOriginatorMudName() + "[R] tells you: " + packet.getMessage(); CommandResult res = new CommandResult(); res.setText(message); res.setSuccessful(true); res.send(); } else { callback.returnError("Unknown user"); } } public void tellFailed(LPCMixed username, LPCMixed targetMudName, LPCMixed targetUsername, LPCMixed errorMessage) { System.out.println("TELL FAILED: " + errorMessage.asString()); } public void i3Error(ErrorPacket packet) { System.out.println("I3 ERROR: [" + packet.getErrorCode() + "] " + packet.getErrorMessage()); } public void emoteTo(EmoteToPacket packet, ErrorCallback callback) { /* if ("some guy".equals(packet.getTargetUsername().asString())) { String theirName = packet.getOriginatorUsername() + "@" + packet.getOriginatorMudName(); System.out.println(packet.getMessage().asString().replace("$N", theirName)); } else { callback.returnError("Unknown user"); } */ //TODO implement emotes. } } } class I3ChannelsListener implements I3ChannelListener { public void i3Message(ChannelMPacket packet) { String theirName = packet.getVisName() + "@" + packet.getOriginatorMudName(); System.out.println(theirName + ": " + packet.getMessage()); } public void i3Message(ChannelEPacket packet) { String theirName = packet.getVisName() + "@" + packet.getOriginatorMudName(); String msg = packet.getMessage().asString().replace("$N", theirName); System.out.println(theirName + ": " + msg); } public void i3Message(ChannelTPacket packet) { String theirName = packet.getOriginatorVisName() + "@" + packet.getOriginatorMudName(); String targetName = packet.getTargetVisName() + "@" + packet.getTargettedMudName(); String msg = packet.getMessageOthers().asString().replace("$N", theirName).replace("$O", targetName); System.out.println(theirName + ": " + msg); } public void channelRemoved(String channel, LPCMixed reason) { System.out.println("You've been removed from " + channel + ": " + reason.asString()); } }