|
@@ -24,9 +24,15 @@ package com.dmdirc.addons.parser_twitter;
|
24
|
24
|
|
25
|
25
|
import com.dmdirc.addons.parser_twitter.api.TwitterAPI;
|
26
|
26
|
import com.dmdirc.addons.parser_twitter.api.TwitterErrorHandler;
|
|
27
|
+import com.dmdirc.addons.parser_twitter.api.TwitterException;
|
27
|
28
|
import com.dmdirc.addons.parser_twitter.api.TwitterMessage;
|
|
29
|
+import com.dmdirc.addons.parser_twitter.api.TwitterRawHandler;
|
28
|
30
|
import com.dmdirc.addons.parser_twitter.api.TwitterStatus;
|
29
|
31
|
import com.dmdirc.addons.parser_twitter.api.TwitterUser;
|
|
32
|
+import com.dmdirc.config.ConfigManager;
|
|
33
|
+import com.dmdirc.config.IdentityManager;
|
|
34
|
+import com.dmdirc.interfaces.ConfigChangeListener;
|
|
35
|
+import com.dmdirc.logger.ErrorManager;
|
30
|
36
|
import com.dmdirc.parser.common.CallbackManager;
|
31
|
37
|
import com.dmdirc.parser.common.DefaultStringConverter;
|
32
|
38
|
import com.dmdirc.parser.common.IgnoreList;
|
|
@@ -37,13 +43,18 @@ import com.dmdirc.parser.interfaces.ChannelInfo;
|
37
|
43
|
import com.dmdirc.parser.interfaces.ClientInfo;
|
38
|
44
|
import com.dmdirc.parser.interfaces.LocalClientInfo;
|
39
|
45
|
import com.dmdirc.parser.interfaces.Parser;
|
40
|
|
-import com.dmdirc.parser.interfaces.callbacks.ChannelMessageListener;
|
41
|
46
|
import com.dmdirc.parser.interfaces.StringConverter;
|
42
|
47
|
import com.dmdirc.parser.interfaces.callbacks.AuthNoticeListener;
|
|
48
|
+import com.dmdirc.parser.interfaces.callbacks.ChannelJoinListener;
|
|
49
|
+import com.dmdirc.parser.interfaces.callbacks.ChannelKickListener;
|
|
50
|
+import com.dmdirc.parser.interfaces.callbacks.ChannelMessageListener;
|
43
|
51
|
import com.dmdirc.parser.interfaces.callbacks.ChannelModeChangeListener;
|
44
|
52
|
import com.dmdirc.parser.interfaces.callbacks.ChannelNamesListener;
|
45
|
53
|
import com.dmdirc.parser.interfaces.callbacks.ChannelSelfJoinListener;
|
46
|
54
|
import com.dmdirc.parser.interfaces.callbacks.ChannelTopicListener;
|
|
55
|
+import com.dmdirc.parser.interfaces.callbacks.DataInListener;
|
|
56
|
+import com.dmdirc.parser.interfaces.callbacks.DataOutListener;
|
|
57
|
+import com.dmdirc.parser.interfaces.callbacks.DebugInfoListener;
|
47
|
58
|
import com.dmdirc.parser.interfaces.callbacks.MotdEndListener;
|
48
|
59
|
import com.dmdirc.parser.interfaces.callbacks.MotdLineListener;
|
49
|
60
|
import com.dmdirc.parser.interfaces.callbacks.MotdStartListener;
|
|
@@ -52,34 +63,21 @@ import com.dmdirc.parser.interfaces.callbacks.NickChangeListener;
|
52
|
63
|
import com.dmdirc.parser.interfaces.callbacks.NumericListener;
|
53
|
64
|
import com.dmdirc.parser.interfaces.callbacks.Post005Listener;
|
54
|
65
|
import com.dmdirc.parser.interfaces.callbacks.PrivateMessageListener;
|
55
|
|
-import com.dmdirc.parser.interfaces.callbacks.UnknownMessageListener;
|
56
|
66
|
import com.dmdirc.parser.interfaces.callbacks.PrivateNoticeListener;
|
57
|
67
|
import com.dmdirc.parser.interfaces.callbacks.ServerReadyListener;
|
58
|
|
-import com.dmdirc.parser.interfaces.callbacks.UserModeDiscoveryListener;
|
59
|
68
|
import com.dmdirc.parser.interfaces.callbacks.SocketCloseListener;
|
|
69
|
+import com.dmdirc.parser.interfaces.callbacks.UnknownMessageListener;
|
|
70
|
+import com.dmdirc.parser.interfaces.callbacks.UserModeDiscoveryListener;
|
60
|
71
|
import com.dmdirc.ui.messages.Styliser;
|
61
|
|
-import java.lang.reflect.InvocationTargetException;
|
|
72
|
+
|
|
73
|
+import java.net.URI;
|
62
|
74
|
import java.util.ArrayList;
|
|
75
|
+import java.util.Calendar;
|
63
|
76
|
import java.util.Collection;
|
64
|
|
-
|
65
|
77
|
import java.util.Collections;
|
66
|
78
|
import java.util.HashMap;
|
67
|
79
|
import java.util.List;
|
68
|
80
|
import java.util.Map;
|
69
|
|
-import com.dmdirc.interfaces.ConfigChangeListener;
|
70
|
|
-import com.dmdirc.addons.parser_twitter.api.TwitterException;
|
71
|
|
-import com.dmdirc.addons.parser_twitter.api.TwitterRawHandler;
|
72
|
|
-import com.dmdirc.config.ConfigManager;
|
73
|
|
-import com.dmdirc.config.IdentityManager;
|
74
|
|
-import com.dmdirc.logger.ErrorManager;
|
75
|
|
-import com.dmdirc.parser.interfaces.callbacks.ChannelJoinListener;
|
76
|
|
-import com.dmdirc.parser.interfaces.callbacks.ChannelKickListener;
|
77
|
|
-import com.dmdirc.parser.interfaces.callbacks.DataInListener;
|
78
|
|
-import com.dmdirc.parser.interfaces.callbacks.DataOutListener;
|
79
|
|
-import com.dmdirc.parser.interfaces.callbacks.DebugInfoListener;
|
80
|
|
-import java.lang.reflect.Method;
|
81
|
|
-import java.net.URI;
|
82
|
|
-import java.util.Calendar;
|
83
|
81
|
|
84
|
82
|
/**
|
85
|
83
|
* Twitter Parser for DMDirc.
|
|
@@ -155,6 +153,20 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
155
|
153
|
|
156
|
154
|
/** Debug enabled. */
|
157
|
155
|
private boolean debugEnabled;
|
|
156
|
+ /** Save last IDs */
|
|
157
|
+ private boolean saveLastIDs;
|
|
158
|
+ /** Status count. */
|
|
159
|
+ private int statusCount;
|
|
160
|
+ /** Get sent messages. */
|
|
161
|
+ private boolean getSentMessage;
|
|
162
|
+ /** Number of api calls to use. */
|
|
163
|
+ private int apicalls;
|
|
164
|
+ /** Auto append @ to nicknames. */
|
|
165
|
+ private boolean autoAt;
|
|
166
|
+ /** Replace opening nickname. */
|
|
167
|
+ private boolean replaceOpeningNickname;
|
|
168
|
+ /** hide 500 errors. */
|
|
169
|
+ private boolean hide500Errors;
|
158
|
170
|
|
159
|
171
|
/**
|
160
|
172
|
* Create a new Twitter Parser!
|
|
@@ -174,8 +186,7 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
174
|
186
|
this.myAddress = address;
|
175
|
187
|
|
176
|
188
|
resetState(true);
|
177
|
|
-
|
178
|
|
- debugEnabled = getConfigManager().getOptionBool(myPlugin.getDomain(), "debugEnabled");
|
|
189
|
+
|
179
|
190
|
if (getConfigManager().hasOptionString(myPlugin.getDomain(), "api.address."+myServerName)) {
|
180
|
191
|
this.apiAddress = getConfigManager().getOption(myPlugin.getDomain(), "api.address."+myServerName);
|
181
|
192
|
} else {
|
|
@@ -948,7 +959,7 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
948
|
959
|
long lastTimelineId = -1;
|
949
|
960
|
long lastDirectMessageId = -1;
|
950
|
961
|
|
951
|
|
- if (getConfigManager().getOptionBool(myPlugin.getDomain(), "saveLastIDs")) {
|
|
962
|
+ if (saveLastIDs) {
|
952
|
963
|
if (getConfigManager().hasOptionString(myPlugin.getDomain(), "lastReplyId-"+myServerName+"-"+myUsername)) {
|
953
|
964
|
lastReplyId = TwitterAPI.parseLong(getConfigManager().getOption(myPlugin.getDomain(), "lastReplyId-"+myServerName+"-"+myUsername), -1);
|
954
|
965
|
}
|
|
@@ -972,7 +983,7 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
972
|
983
|
if (!wantAuth && api.isAllowed()) {
|
973
|
984
|
lastQueryTime = System.currentTimeMillis();
|
974
|
985
|
|
975
|
|
- final int statusesPerAttempt = Math.min(200, getConfigManager().getOptionInt(myPlugin.getDomain(), "statuscount"));
|
|
986
|
+ final int statusesPerAttempt = Math.min(200, statusCount);
|
976
|
987
|
|
977
|
988
|
final List<TwitterStatus> statuses = new ArrayList<TwitterStatus>();
|
978
|
989
|
for (TwitterStatus status : api.getReplies(lastReplyId, statusesPerAttempt)) {
|
|
@@ -1017,7 +1028,7 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1017
|
1028
|
if (directMessage.getID() > lastDirectMessageId) { lastDirectMessageId = directMessage.getID(); }
|
1018
|
1029
|
}
|
1019
|
1030
|
|
1020
|
|
- if (getConfigManager().getOptionBool(myPlugin.getDomain(), "getSentMessages")) {
|
|
1031
|
+ if (getSentMessage) {
|
1021
|
1032
|
for (TwitterMessage directMessage : api.getSentDirectMessages(lastDirectMessageId)) {
|
1022
|
1033
|
directMessages.add(directMessage);
|
1023
|
1034
|
if (directMessage.getID() > lastDirectMessageId) { lastDirectMessageId = directMessage.getID(); }
|
|
@@ -1045,7 +1056,6 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1045
|
1056
|
IdentityManager.getConfigIdentity().setOption(myPlugin.getDomain(), "lastTimelineId-"+myServerName+"-"+myUsername, Long.toString(lastTimelineId));
|
1046
|
1057
|
IdentityManager.getConfigIdentity().setOption(myPlugin.getDomain(), "lastDirectMessageId-"+myServerName+"-"+myUsername, Long.toString(lastDirectMessageId));
|
1047
|
1058
|
|
1048
|
|
- final int apiLimit = getConfigManager().getOptionInt(myPlugin.getDomain(), "apicalls");
|
1049
|
1059
|
final int endCalls = (wantAuth) ? 0 : api.getUsedCalls();
|
1050
|
1060
|
final Long[] apiCalls = (wantAuth) ? new Long[]{0L, 0L, System.currentTimeMillis(), (long)api.getUsedCalls()} : api.getRemainingApiCalls();
|
1051
|
1061
|
doDebug(Debug.apiCalls, "Twitter calls Remaining: "+apiCalls[0]);
|
|
@@ -1071,14 +1081,14 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1071
|
1081
|
sleepTime = 10 * 60 * 1000;
|
1072
|
1082
|
// Also alert the user.
|
1073
|
1083
|
twitterFail("Unable to communicate with twitter, or no API calls allowed at all, retrying in 10 minutes.");
|
1074
|
|
- } else if (api.getUsedCalls() > apiLimit) {
|
|
1084
|
+ } else if (api.getUsedCalls() > apicalls) {
|
1075
|
1085
|
// Sleep for the rest of the hour, we have done too much!
|
1076
|
1086
|
sleepTime = timeLeft;
|
1077
|
1087
|
} else {
|
1078
|
1088
|
// Else work out how many calls we have left.
|
1079
|
1089
|
// Whichever is less between the number of calls we want to make
|
1080
|
1090
|
// and the number of calls twitter is going to allow us to make.
|
1081
|
|
- final long callsLeft = Math.min(apiLimit - api.getUsedCalls(), apiCalls[0]);
|
|
1091
|
+ final long callsLeft = Math.min(apicalls - api.getUsedCalls(), apiCalls[0]);
|
1082
|
1092
|
// How many calls do we make each time?
|
1083
|
1093
|
// If this is less than 0 (If there was a time reset between
|
1084
|
1094
|
// calculating the start and end calls used) then assume 3.
|
|
@@ -1129,11 +1139,12 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1129
|
1139
|
}
|
1130
|
1140
|
clients.clear();
|
1131
|
1141
|
|
1132
|
|
- if (!simpleMyself && getConfigManager().getOptionBool(myPlugin.getDomain(), "autoAt")) {
|
|
1142
|
+ if (!simpleMyself && autoAt) {
|
1133
|
1143
|
myself = new TwitterClientInfo("@" + myUsername, this);
|
1134
|
1144
|
} else {
|
1135
|
1145
|
myself = new TwitterClientInfo(myUsername, this);
|
1136
|
1146
|
}
|
|
1147
|
+ setCachedSettings();
|
1137
|
1148
|
}
|
1138
|
1149
|
|
1139
|
1150
|
/**
|
|
@@ -1184,7 +1195,7 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1184
|
1195
|
final StringBuffer newStatus = new StringBuffer(message);
|
1185
|
1196
|
final TwitterChannelInfo channel = (TwitterChannelInfo) this.getChannel(mainChannelName);
|
1186
|
1197
|
|
1187
|
|
- if (channel != null && getConfigManager().getOptionBool(myPlugin.getDomain(), "replaceOpeningNickname")) {
|
|
1198
|
+ if (channel != null && replaceOpeningNickname) {
|
1188
|
1199
|
final String[] bits = message.split(" ");
|
1189
|
1200
|
if (bits[0].charAt(bits[0].length() - 1) == ':') {
|
1190
|
1201
|
final String name = bits[0].substring(0, bits[0].length() - 1);
|
|
@@ -1289,8 +1300,8 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1289
|
1300
|
/** {@inheritDoc} */
|
1290
|
1301
|
@Override
|
1291
|
1302
|
public void handleTwitterError(final TwitterAPI api, final Throwable t, final String source, final String twitterInput, final String twitterOutput, final String message) {
|
1292
|
|
- final boolean hide500Errors = !debugEnabled && getConfigManager().getOptionBool(myPlugin.getDomain(), "hide500Errors");
|
1293
|
|
- if (hide500Errors && message.matches("^\\(50[0-9]\\).*")) { return; }
|
|
1303
|
+ final boolean showError = !debugEnabled && hide500Errors;
|
|
1304
|
+ if (showError && message.matches("^\\(50[0-9]\\).*")) { return; }
|
1294
|
1305
|
try {
|
1295
|
1306
|
if (!message.isEmpty()) {
|
1296
|
1307
|
twitterFail("Recieved an error from twitter: " + message + (debugEnabled ? " [" + source + "]" : ""));
|
|
@@ -1311,25 +1322,9 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1311
|
1322
|
doDebug(Debug.twitterErrorMore, "");
|
1312
|
1323
|
doDebug(Debug.twitterErrorMore, "Exception:");
|
1313
|
1324
|
|
1314
|
|
- // Hax the error manager to get a nice String[] representing the stack trace and output it.
|
1315
|
|
- try {
|
1316
|
|
- final Method gt = ErrorManager.class.getDeclaredMethod("getTrace", Throwable.class);
|
1317
|
|
- gt.setAccessible(true);
|
1318
|
|
- final String[] trace = (String[]) gt.invoke(ErrorManager.getErrorManager(), t);
|
1319
|
|
-
|
1320
|
|
- for (String out : trace) {
|
1321
|
|
- doDebug(Debug.twitterErrorMore, " "+out);
|
1322
|
|
- }
|
1323
|
|
- } catch (NoSuchMethodException ex) {
|
1324
|
|
- doDebug(Debug.twitterErrorMore, " ... Unable to get StackTrace (nsme: "+ex+")");
|
1325
|
|
- } catch (SecurityException ex) {
|
1326
|
|
- doDebug(Debug.twitterErrorMore, " ... Unable to get StackTrace (se: "+ex+")");
|
1327
|
|
- } catch (IllegalAccessException ex) {
|
1328
|
|
- doDebug(Debug.twitterErrorMore, " ... Unable to get StackTrace (iae: "+ex+")");
|
1329
|
|
- } catch (IllegalArgumentException ex) {
|
1330
|
|
- doDebug(Debug.twitterErrorMore, " ... Unable to get StackTrace (iae2: "+ex+")");
|
1331
|
|
- } catch (InvocationTargetException ex) {
|
1332
|
|
- doDebug(Debug.twitterErrorMore, " ... Unable to get StackTrace (ite: "+ex+")");
|
|
1325
|
+ final String[] trace = ErrorManager.getTrace(t);
|
|
1326
|
+ for (String out : trace) {
|
|
1327
|
+ doDebug(Debug.twitterErrorMore, " "+out);
|
1333
|
1328
|
}
|
1334
|
1329
|
|
1335
|
1330
|
doDebug(Debug.twitterErrorMore, "==================================");
|
|
@@ -1400,9 +1395,9 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1400
|
1395
|
/** {@inheritDoc} */
|
1401
|
1396
|
@Override
|
1402
|
1397
|
public void configChanged(final String domain, final String key) {
|
|
1398
|
+ setCachedSettings();
|
1403
|
1399
|
if (domain.equalsIgnoreCase(myPlugin.getDomain())) {
|
1404
|
1400
|
if (key.equalsIgnoreCase("debugEnabled")) {
|
1405
|
|
- debugEnabled = getConfigManager().getOptionBool(myPlugin.getDomain(), "debugEnabled");
|
1406
|
1401
|
api.setDebug(debugEnabled);
|
1407
|
1402
|
} else if (key.equalsIgnoreCase("autoAt")) {
|
1408
|
1403
|
sendPrivateNotice("'autoAt' setting was changed, reconnect needed.");
|
|
@@ -1423,4 +1418,15 @@ public class Twitter implements Parser, TwitterErrorHandler, TwitterRawHandler,
|
1423
|
1418
|
|
1424
|
1419
|
return myConfigManager;
|
1425
|
1420
|
}
|
|
1421
|
+
|
|
1422
|
+ private void setCachedSettings() {
|
|
1423
|
+ saveLastIDs = getConfigManager().getOptionBool(myPlugin.getDomain(), "saveLastIDs");
|
|
1424
|
+ statusCount = getConfigManager().getOptionInt(myPlugin.getDomain(), "statusCount");
|
|
1425
|
+ getSentMessage = getConfigManager().getOptionBool(myPlugin.getDomain(), "getSentMessage");
|
|
1426
|
+ apicalls = getConfigManager().getOptionInt(myPlugin.getDomain(), "apicalls");
|
|
1427
|
+ autoAt = getConfigManager().getOptionBool(myPlugin.getDomain(), "autoAt");
|
|
1428
|
+ replaceOpeningNickname = getConfigManager().getOptionBool(myPlugin.getDomain(), "replaceOpeningNickname");
|
|
1429
|
+ hide500Errors = getConfigManager().getOptionBool(myPlugin.getDomain(), "hide500Errors");
|
|
1430
|
+ debugEnabled = getConfigManager().getOptionBool(myPlugin.getDomain(), "debugEnabled");
|
|
1431
|
+ }
|
1426
|
1432
|
}
|