Browse Source

Add support for external messages and actions

Fixes issue 2927

Change-Id: Ide1f4303fe71708bf44c7436a998b814ad01515f
Reviewed-on: http://gerrit.dmdirc.com/975
Reviewed-by: Gregory Holmes <greg@dmdirc.com>
Automatic-Compile: DMDirc Local Commits <dmdirc@googlemail.com>
tags/0.6.4rc1
Chris Smith 14 years ago
parent
commit
b35ae339e9

+ 20
- 14
src/com/dmdirc/Query.java View File

@@ -43,6 +43,7 @@ import com.dmdirc.ui.interfaces.InputWindow;
43 43
 import com.dmdirc.ui.interfaces.QueryWindow;
44 44
 
45 45
 import java.awt.Toolkit;
46
+import java.util.List;
46 47
 
47 48
 /**
48 49
  * The Query class represents the client's view of a query with another user.
@@ -130,22 +131,31 @@ public class Query extends MessageTarget implements PrivateActionListener,
130 131
             return;
131 132
         }
132 133
 
133
-        final ClientInfo client = server.getParser().getLocalClient();
134
-
135 134
         for (String part : splitLine(window.getTranscoder().encode(line))) {
136 135
             if (!part.isEmpty()) {
137 136
                 server.getParser().sendMessage(getNickname(), part);
138 137
 
139
-                final StringBuffer buff = new StringBuffer("querySelfMessage");
140
-
141
-                ActionManager.processEvent(CoreActionType.QUERY_SELF_MESSAGE, buff, this, part);
142
-
143
-                addLine(buff, client.getNickname(), client.getUsername(),
144
-                        client.getHostname(), part);
138
+                doNotification("querySelfMessage",
139
+                        CoreActionType.QUERY_SELF_MESSAGE,
140
+                        server.getParser().getLocalClient(), line);
145 141
             }
146 142
         }
147 143
     }
148 144
 
145
+    /** {@inheritDoc} */
146
+    @Override
147
+    protected boolean processNotificationArg(final Object arg, final List<Object> args) {
148
+        if (arg instanceof ClientInfo) {
149
+            final ClientInfo clientInfo = (ClientInfo) arg;
150
+            args.add(clientInfo.getNickname());
151
+            args.add(clientInfo.getUsername());
152
+            args.add(clientInfo.getHostname());
153
+            return true;
154
+        } else {
155
+            return super.processNotificationArg(arg, args);
156
+        }
157
+    }
158
+
149 159
     /** {@inheritDoc} */
150 160
     @Override
151 161
     public int getMaxLineLength() {
@@ -172,12 +182,8 @@ public class Query extends MessageTarget implements PrivateActionListener,
172 182
             server.getParser().sendAction(getNickname(),
173 183
                     window.getTranscoder().encode(action));
174 184
 
175
-            final StringBuffer buff = new StringBuffer("querySelfAction");
176
-
177
-            ActionManager.processEvent(CoreActionType.QUERY_SELF_ACTION, buff, this, action);
178
-
179
-            addLine(buff, client.getNickname(), client.getUsername(),
180
-                    client.getHostname(), window.getTranscoder().encode(action));
185
+            doNotification("querySelfAction", CoreActionType.QUERY_SELF_ACTION,
186
+                    server.getParser().getLocalClient(), action);
181 187
         } else {
182 188
             addLine("actionTooLong", action.length());
183 189
         }

+ 53
- 8
src/com/dmdirc/ServerEventHandler.java View File

@@ -41,14 +41,18 @@ import com.dmdirc.parser.irc.IRCParser;
41 41
  *
42 42
  * @author chris
43 43
  */
44
-public final class ServerEventHandler extends EventHandler
45
-        implements ChannelSelfJoinListener, PrivateMessageListener, PrivateActionListener,
46
-        ErrorInfoListener, PrivateCtcpListener, PrivateCtcpReplyListener, SocketCloseListener,
47
-        PrivateNoticeListener, MotdStartListener, MotdLineListener, MotdEndListener, NumericListener, PingFailureListener,
48
-        PingSuccessListener, AwayStateListener, ConnectErrorListener, NickInUseListener, Post005Listener,
49
-        AuthNoticeListener, UnknownNoticeListener, UserModeChangeListener, InviteListener, WallopListener,
50
-        WalluserListener, WallDesyncListener, NickChangeListener, ServerErrorListener, PingSentListener,
51
-        UserModeDiscoveryListener, ServerNoticeListener {
44
+public final class ServerEventHandler extends EventHandler implements
45
+        ChannelSelfJoinListener, PrivateMessageListener, PrivateActionListener,
46
+        ErrorInfoListener, PrivateCtcpListener, PrivateCtcpReplyListener,
47
+        SocketCloseListener, PrivateNoticeListener, MotdStartListener,
48
+        MotdLineListener, MotdEndListener, NumericListener, PingFailureListener,
49
+        PingSuccessListener, AwayStateListener, ConnectErrorListener,
50
+        NickInUseListener, Post005Listener, AuthNoticeListener,
51
+        UnknownNoticeListener, UserModeChangeListener, InviteListener,
52
+        WallopListener, WalluserListener, WallDesyncListener,
53
+        NickChangeListener, ServerErrorListener, PingSentListener,
54
+        UserModeDiscoveryListener, ServerNoticeListener, UnknownMessageListener,
55
+        UnknownActionListener {
52 56
 
53 57
     /** The server instance that owns this event handler. */
54 58
     private final Server owner;
@@ -309,6 +313,46 @@ public final class ServerEventHandler extends EventHandler
309 313
                 sHost, sTarget, sMessage);
310 314
     }
311 315
 
316
+    /** {@inheritDoc} */
317
+    @Override
318
+    public void onUnknownMessage(final Parser tParser, final String sMessage,
319
+            final String sTarget, final String sHost) {
320
+        checkParser(tParser);
321
+
322
+        if (tParser.getLocalClient().equals(tParser.getClient(sHost))) {
323
+            // Local client
324
+            if (!owner.hasQuery(sTarget)) {
325
+                owner.addQuery(sTarget);
326
+            }
327
+
328
+            owner.getQuery(sTarget).doNotification("querySelfExternalMessage",
329
+                    CoreActionType.QUERY_SELF_MESSAGE, tParser.getLocalClient(), sMessage);
330
+        } else {
331
+            owner.doNotification("unknownMessage", CoreActionType.SERVER_UNKNOWNNOTICE,
332
+                    sHost, sTarget, sMessage);
333
+        }
334
+    }
335
+
336
+    /** {@inheritDoc} */
337
+    @Override
338
+    public void onUnknownAction(final Parser tParser, final String sMessage,
339
+            final String sTarget, final String sHost) {
340
+        checkParser(tParser);
341
+
342
+        if (tParser.getLocalClient().equals(tParser.getClient(sHost))) {
343
+            // Local client
344
+            if (!owner.hasQuery(sTarget)) {
345
+                owner.addQuery(sTarget);
346
+            }
347
+
348
+            owner.getQuery(sTarget).doNotification("querySelfExternalAction",
349
+                    CoreActionType.QUERY_SELF_ACTION, tParser.getLocalClient(), sMessage);
350
+        } else {
351
+            owner.doNotification("unknownAction", CoreActionType.SERVER_UNKNOWNACTION,
352
+                    sHost, sTarget, sMessage);
353
+        }
354
+    }
355
+
312 356
     /** {@inheritDoc} */
313 357
     @Override
314 358
     public void onUserModeChanged(final Parser tParser,
@@ -407,4 +451,5 @@ public final class ServerEventHandler extends EventHandler
407 451
                     + owner.getStatus().getTransitionHistory());
408 452
         }
409 453
     }
454
+
410 455
 }

+ 6
- 2
src/com/dmdirc/actions/CoreActionType.java View File

@@ -94,8 +94,12 @@ public enum CoreActionType implements ActionType {
94 94
     
95 95
     /** Auth notice received. */
96 96
     SERVER_AUTHNOTICE(ServerEvents.SERVER_EVENT_WITH_ARG, "Received auth notice"),
97
+    /** Unknown action received. */
98
+    SERVER_UNKNOWNACTION(ServerEvents.SERVER_UNKNOWN_EVENT, "Received unknown action"),
97 99
     /** Unknown notice received. */
98 100
     SERVER_UNKNOWNNOTICE(ServerEvents.SERVER_UNKNOWN_EVENT, "Received unknown notice"),
101
+    /** Unknown message received. */
102
+    SERVER_UNKNOWNMESSAGE(ServerEvents.SERVER_UNKNOWN_EVENT, "Received unknown message"),
99 103
     
100 104
     /** User modes changed. */
101 105
     SERVER_USERMODES(ServerEvents.SERVER_SOURCED_EVENT_WITH_ARG, "User modes changed"),
@@ -201,9 +205,9 @@ public enum CoreActionType implements ActionType {
201 205
     /** Query action received. */
202 206
     QUERY_ACTION(QueryEvents.QUERY_EVENT_WITH_ARG, "Private action received"),
203 207
     /** Query message sent. */
204
-    QUERY_SELF_MESSAGE(QueryEvents.QUERY_EVENT_WITH_ARG, "Private message sent"),
208
+    QUERY_SELF_MESSAGE(QueryEvents.QUERY_SOURCED_EVENT_WITH_ARG, "Private message sent"),
205 209
     /** Query action sent. */
206
-    QUERY_SELF_ACTION(QueryEvents.QUERY_EVENT_WITH_ARG, "Private action sent"),
210
+    QUERY_SELF_ACTION(QueryEvents.QUERY_SOURCED_EVENT_WITH_ARG, "Private action sent"),
207 211
     /** Query quit event. */
208 212
     QUERY_QUIT(QueryEvents.QUERY_EVENT_WITH_ARG, "Query: user quit"),
209 213
     /** Query nick change. */

+ 4
- 1
src/com/dmdirc/actions/metatypes/QueryEvents.java View File

@@ -24,6 +24,7 @@ package com.dmdirc.actions.metatypes;
24 24
 
25 25
 import com.dmdirc.Query;
26 26
 import com.dmdirc.actions.interfaces.ActionMetaType;
27
+import com.dmdirc.parser.interfaces.ClientInfo;
27 28
 
28 29
 /**
29 30
  * Defines query-related events.
@@ -35,7 +36,9 @@ public enum QueryEvents implements ActionMetaType {
35 36
     /** Query event type. */
36 37
     QUERY_EVENT(new String[]{"query"}, Query.class),
37 38
     /** Query event with argument. */
38
-    QUERY_EVENT_WITH_ARG(new String[]{"query", "message"}, Query.class, String.class);
39
+    QUERY_EVENT_WITH_ARG(new String[]{"query", "message"}, Query.class, String.class),
40
+    /** Query event with argument and source. */
41
+    QUERY_SOURCED_EVENT_WITH_ARG(new String[]{"query", "source", "message"}, Query.class, ClientInfo.class, String.class);
39 42
     
40 43
     /** The names of the arguments for this meta type. */
41 44
     private String[] argNames;

Loading…
Cancel
Save