プロジェクト

全般

プロフィール

ダウンロード (2.82 KB) 統計
| ブランチ: | タグ: | リビジョン:

github / src / com / mizo0203 / twitter / timeline / talker / TwitterTimelineTalker.java @ eb7a557c

1
package com.mizo0203.twitter.timeline.talker;
2

    
3
import java.util.Locale;
4
import java.util.regex.Matcher;
5
import java.util.regex.Pattern;
6
import twitter4j.StallWarning;
7
import twitter4j.Status;
8
import twitter4j.StatusDeletionNotice;
9
import twitter4j.StatusListener;
10
import twitter4j.TwitterStream;
11
import twitter4j.TwitterStreamFactory;
12
import twitter4j.conf.Configuration;
13

    
14
public class TwitterTimelineTalker {
15

    
16
  /**
17
   * ISO 639 言語コード - 日本語 (ja)
18
   */
19
  public static final String LANG_JA = Locale.JAPAN.getLanguage();
20

    
21
  private Talker.YukkuriVoice mYukkuriVoice = Talker.YukkuriVoice.REIMU;
22
  private final TwitterStream mTwitterStream;
23
  private final Talker mTalker;
24

    
25
  public TwitterTimelineTalker(Configuration configuration, Talker talker) {
26
    mTwitterStream = new TwitterStreamFactory(configuration).getInstance();
27
    mTwitterStream.addListener(new OnStatusEvent());
28
    mTalker = talker;
29
  }
30

    
31
  public void start() {
32
    // OnStatusEvent に Twitter タイムラインが通知される
33
    mTwitterStream.user();
34
  }
35

    
36
  private static String getUserNameWithoutContext(String name) {
37
    Pattern p = Pattern.compile("([^@@]+).+");
38
    Matcher m = p.matcher(name);
39
    return m.replaceFirst("$1");
40
  }
41

    
42
  private class OnStatusEvent implements StatusListener {
43

    
44
    public void onStatus(final Status status) {
45
      if (!LANG_JA.equalsIgnoreCase(status.getLang())) {
46
        return;
47
      }
48

    
49
      final StringBuffer buffer = new StringBuffer();
50

    
51
      if (status.isRetweet()) {
52
        Status retweetedStatus = status.getRetweetedStatus();
53
        buffer.append(getUserNameWithoutContext(status.getUser().getName()) + "さんがリツイート。");
54
        buffer.append(getUserNameWithoutContext(retweetedStatus.getUser().getName()) + "さんから、");
55
        buffer.append(retweetedStatus.getText());
56
      } else {
57
        buffer.append(getUserNameWithoutContext(status.getUser().getName()) + "さんから、");
58
        buffer.append(status.getText());
59
      }
60

    
61
      mTalker.talkAsync(UrlUtil.convURLEmpty(buffer).replaceAll("\n", "。"), mYukkuriVoice);
62

    
63
      // 読み上げは、霊夢と魔理沙が交互に行なう
64
      if (mYukkuriVoice == Talker.YukkuriVoice.REIMU) {
65
        mYukkuriVoice = Talker.YukkuriVoice.MARISA;
66
      } else {
67
        mYukkuriVoice = Talker.YukkuriVoice.REIMU;
68
      }
69

    
70
    }
71

    
72
    public void onDeletionNotice(StatusDeletionNotice sdn) {
73
      System.err.println("onDeletionNotice.");
74
    }
75

    
76
    public void onTrackLimitationNotice(int i) {
77
      System.err.println("onTrackLimitationNotice.(" + i + ")");
78
    }
79

    
80
    public void onScrubGeo(long lat, long lng) {
81
      System.err.println("onScrubGeo.(" + lat + ", " + lng + ")");
82
    }
83

    
84
    public void onException(Exception excptn) {
85
      System.err.println("onException.");
86
    }
87

    
88
    @Override
89
    public void onStallWarning(StallWarning arg0) {}
90
  }
91

    
92
}
(4-4/5)