指定したユーザの情報取得にStreaming APIを利用するようにした #26115
@@ -1357,4 +1357,22 @@ | ||
1357 | 1357 | return username; |
1358 | 1358 | } |
1359 | 1359 | |
1360 | + /** | |
1361 | + * 指定したユーザ名からユーザidを取得する | |
1362 | + * @param screenName | |
1363 | + * @return 取得に失敗した場合は0を返す, 成功した場合はユーザidを返す | |
1364 | + */ | |
1365 | + public long getUserID(String screenName) { | |
1366 | + long id = 0; | |
1367 | + try { | |
1368 | + User u = this.twitter.showUser(screenName); | |
1369 | + if( u != null ) { | |
1370 | + id = u.getId(); | |
1371 | + } | |
1372 | + } catch (TwitterException e) { | |
1373 | + e.printStackTrace(); | |
1374 | + } | |
1375 | + return id; | |
1376 | + } | |
1377 | + | |
1360 | 1378 | } |
@@ -69,6 +69,7 @@ | ||
69 | 69 | /** |
70 | 70 | * 指定した単語を検索対象に加える |
71 | 71 | * @param word |
72 | + * @param listener | |
72 | 73 | */ |
73 | 74 | public void addSearchWord(String word, TweetStreamingListener listener) { |
74 | 75 | listeners.put(word, listener); |
@@ -84,8 +85,23 @@ | ||
84 | 85 | updateFilter(); |
85 | 86 | } |
86 | 87 | |
87 | - public void addUserSearch(Long userid, TweetStreamingListener listener) { | |
88 | + /** | |
89 | + * 指定したユーザを検索対象に加える | |
90 | + * @param userid | |
91 | + * @param listener | |
92 | + */ | |
93 | + public void addSearchUser(Long userid, TweetStreamingListener listener) { | |
94 | + userListener.put(userid, listener); | |
95 | + updateFilter(); | |
96 | + } | |
88 | 97 | |
98 | + /** | |
99 | + * 指定したユーザを検索対象から外す | |
100 | + * @param userid | |
101 | + */ | |
102 | + public void removeSearchUser(Long userid) { | |
103 | + userListener.remove(userid); | |
104 | + updateFilter(); | |
89 | 105 | } |
90 | 106 | |
91 | 107 | /** |
@@ -92,6 +108,16 @@ | ||
92 | 108 | * filterの更新 |
93 | 109 | */ |
94 | 110 | private void updateFilter() { |
111 | + //指定したユーザの情報を取得するようにする | |
112 | + Long[] users = userListener.keySet().toArray(new Long[0]); | |
113 | + if( users != null ) { | |
114 | + long[] usersLong = new long[users.length]; | |
115 | + for(int i=0; i < users.length; i++) { | |
116 | + usersLong[i] = users[i]; | |
117 | + } | |
118 | + filter.follow(usersLong); | |
119 | + } | |
120 | + //指定したワードの情報を取得するようにする | |
95 | 121 | String[] words = listeners.keySet().toArray(new String[0]); |
96 | 122 | filter.track(words); |
97 | 123 | try { |
@@ -110,6 +136,7 @@ | ||
110 | 136 | */ |
111 | 137 | @Override |
112 | 138 | public void onStatus(Status status) { |
139 | + //検索ワード情報振り分け | |
113 | 140 | Set<String> keys = listeners.keySet(); |
114 | 141 | synchronized (listeners) { |
115 | 142 | for(String word : keys) { |
@@ -121,6 +148,19 @@ | ||
121 | 148 | } |
122 | 149 | } |
123 | 150 | } |
151 | + | |
152 | + //ユーザ情報振り分け | |
153 | + Set<Long> userKeys = userListener.keySet(); | |
154 | + synchronized(userListener) { | |
155 | + for(long id : userKeys) { | |
156 | + if( status.getUser().getId() == id ) { | |
157 | + TweetStreamingListener listener = userListener.get(id); | |
158 | + listener.update(status); | |
159 | + //最終更新id | |
160 | + userLastUpdate.put(id, status.getId()); | |
161 | + } | |
162 | + } | |
163 | + } | |
124 | 164 | } |
125 | 165 | |
126 | 166 | /** |
@@ -137,6 +177,19 @@ | ||
137 | 177 | } |
138 | 178 | |
139 | 179 | /** |
180 | + * ユーザの最終更新ステータスidの取得 | |
181 | + * @param userid | |
182 | + * @return | |
183 | + */ | |
184 | + public long getUserLastUpdateID(long userid) { | |
185 | + Long id = userLastUpdate.get(userid); | |
186 | + if( id == null ) { | |
187 | + return 0; | |
188 | + } | |
189 | + return id; | |
190 | + } | |
191 | + | |
192 | + /** | |
140 | 193 | * |
141 | 194 | */ |
142 | 195 | @Override |
@@ -103,6 +103,23 @@ | ||
103 | 103 | } |
104 | 104 | |
105 | 105 | /** |
106 | + * 指定したユーザを監視するリスナー | |
107 | + * @param userid | |
108 | + * @param listener | |
109 | + */ | |
110 | + public void setUserListener(long userid, TweetStreamingListener listener) { | |
111 | + searchStream.addSearchUser(userid, listener); | |
112 | + } | |
113 | + | |
114 | + /** | |
115 | + * 指定したユーザを監視するリスナーを停止 | |
116 | + * @param userid | |
117 | + */ | |
118 | + public void stopUserListener(long userid) { | |
119 | + searchStream.removeSearchUser(userid); | |
120 | + } | |
121 | + | |
122 | + /** | |
106 | 123 | * 指定したワードの最終更新status IDを取得 |
107 | 124 | * @param word |
108 | 125 | * @return |
@@ -110,4 +127,13 @@ | ||
110 | 127 | public long getSearchLastUpdateID(String word) { |
111 | 128 | return searchStream.getLastUpdateID(word); |
112 | 129 | } |
130 | + | |
131 | + /** | |
132 | + * 指定したユーザの最終更新status idを取得 | |
133 | + * @param userid | |
134 | + * @return | |
135 | + */ | |
136 | + public long getUserLastUpdateID(long userid) { | |
137 | + return searchStream.getUserLastUpdateID(userid); | |
138 | + } | |
113 | 139 | } |
@@ -24,6 +24,8 @@ | ||
24 | 24 | private TweetManager tweetManager; |
25 | 25 | //検索したいユーザ |
26 | 26 | private String screenName; |
27 | + //検索したいユーザid(streaming api利用時) | |
28 | + private long userid = 0; | |
27 | 29 | //sinceid |
28 | 30 | private long sinceID; |
29 | 31 |
@@ -67,6 +69,12 @@ | ||
67 | 69 | */ |
68 | 70 | @Override |
69 | 71 | public List<Status> getNewTweetData() { |
72 | + //streaming利用時のsinceidを取得 | |
73 | + long streamingSinceID = tweetManager.getStreamManager().getUserLastUpdateID(userid); | |
74 | + if( streamingSinceID > 0 ) { | |
75 | + sinceID = streamingSinceID; | |
76 | + } | |
77 | + | |
70 | 78 | List<Status> status = null; |
71 | 79 | try { |
72 | 80 | status = tweetManager.getNewUserTimeline(screenName, sinceID); |
@@ -85,8 +93,10 @@ | ||
85 | 93 | |
86 | 94 | @Override |
87 | 95 | public void setUpdateListener(TweetStreamingListener listener) { |
88 | - // TODO 自動生成されたメソッド・スタブ | |
89 | - | |
96 | + this.userid = tweetManager.getUserID(this.screenName); | |
97 | + if( this.userid != 0 && listener != null ) { | |
98 | + tweetManager.getStreamManager().setUserListener(userid, listener); | |
99 | + } | |
90 | 100 | } |
91 | 101 | |
92 | 102 | /** |
@@ -93,7 +103,7 @@ | ||
93 | 103 | * streaming api有効時のアップデートを受け取るlistenerを削除 |
94 | 104 | */ |
95 | 105 | public void stopUpdateListener() { |
96 | - //TODO | |
106 | + tweetManager.getStreamManager().stopUserListener(userid); | |
97 | 107 | } |
98 | 108 | |
99 | 109 | } |
\ No newline at end of file |