package polly.mud; import polly.mud.connection.ConnectionListener; import polly.mud.connection.MudEvent; import polly.mud.connection.MudMessageEvent; import polly.mud.connection.MudTCPConnection; import de.skuzzle.polly.sdk.MyPolly; import de.skuzzle.polly.sdk.Types; import de.skuzzle.polly.sdk.Types.StringType; import de.skuzzle.polly.sdk.User; import de.skuzzle.polly.sdk.eventlistener.MessageAdapter; import de.skuzzle.polly.sdk.eventlistener.MessageEvent; import de.skuzzle.polly.sdk.eventlistener.MessageListener; public class MudController implements ConnectionListener { public synchronized static MudController getInstance() { if (instance == null) { throw new RuntimeException("not initialized"); } return instance; } static synchronized void create(MyPolly myPolly, String nickName) { if (instance != null) { throw new RuntimeException("only one instance allowed"); } instance = new MudController(myPolly, nickName); } private static MudController instance; private final String nickName; private final MyPolly myPolly; private String forward; private MessageListener forwardListener; private MudTCPConnection connection; private MudController(MyPolly myPolly, String nickName) { this.myPolly = myPolly; this.nickName = nickName; } public synchronized void activateForward(final String channel) { this.forward = channel; if (this.forwardListener != null) { this.myPolly.irc().removeMessageListener(this.forwardListener); } this.forwardListener = new MessageAdapter() { private final String PREFIX = "mud "; private synchronized void onMessage(MessageEvent e) { if (e.getMessage().startsWith(PREFIX)) { final User user = myPolly.users().getUser(e.getUser()); if (user == null || !myPolly.roles().hasPermission( user, MyPlugin.MUD_PERMISSION)) { return; } final String message = e.getMessage().substring(PREFIX.length()); if (connection != null) { connection.submit(message); } } } @Override public void privateMessage(MessageEvent e) { this.onMessage(e); } @Override public void publicMessage(MessageEvent e) { this.onMessage(e); } }; this.myPolly.irc().addMessageListener(this.forwardListener); } @Override public synchronized void received(MudMessageEvent e) { System.out.println(e.getMessage()); if (e.getMessage().equals("By what name do you wish to be hailed?")) { System.out.println("Sending nick name to server..."); e.getSource().submit(this.nickName); } if (this.forward != null && !e.getMessage().startsWith(">")) { this.myPolly.irc().sendMessage(this.forward, e.getMessage(), this); } final String SAYS_PREFIX = " says '"; final int i = e.getMessage().indexOf(SAYS_PREFIX); if (i != -1) { final String message = e.getMessage().substring( i + SAYS_PREFIX.length(), e.getMessage().length() - 1); // strip trailing ' System.out.println("'" + message + "'"); final Types t = this.myPolly.parse(message); if (t != null) { if (t instanceof StringType) { final StringType st = (StringType) t; if (st.getValue().equals(message)) { return; } } e.getSource().submit("say " + t.valueString(this.myPolly.formatting())); } } } @Override public synchronized void connected(MudEvent e) { System.out.println("Connected"); this.connection = e.getSource(); } @Override public synchronized void disconnected(MudEvent e) { System.out.println("Disconnected"); if (this.forwardListener != null) { this.myPolly.irc().removeMessageListener(this.forwardListener); } } }