aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.java
blob: 1f31171fad764c7ef34e2e9e0893628b0a4e950f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package net.lacolaco.smileessence.entity;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import net.lacolaco.smileessence.util.ListUtils;
import twitter4j.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class DirectMessage {
    // キャッシュ これも weak reference
    private static Cache<Long, DirectMessage> storage = CacheBuilder.newBuilder().weakValues().build();

    public synchronized static DirectMessage fetch(long statusId) {
        return storage.getIfPresent(statusId);
    }

    public synchronized static void remove(long statusId) {
        storage.invalidate(statusId);
    }

    public synchronized static DirectMessage fromTwitter(twitter4j.DirectMessage st) {
        DirectMessage t = fetch(st.getId());
        if (t == null) {
            t = new DirectMessage(st);
            storage.put(st.getId(), t);
        } else {
            t.update(st);
        }
        return t;
    }

    public synchronized static List<DirectMessage> fromTwitter(List<twitter4j.DirectMessage> sts) {
        return ListUtils.map(sts, DirectMessage::fromTwitter);
    }

    // インスタンス
    private long id;
    private User sender;
    private User recipient;
    private String text;
    private Date createdAt;

    private UserMentionEntity[] mentions;
    private HashtagEntity[] hashtags;
    private MediaEntity[] media;
    private URLEntity[] urls;
    private SymbolEntity[] symbols;

    private DirectMessage(twitter4j.DirectMessage st) {
        update(st);
    }

    private void update(twitter4j.DirectMessage message) {
        id = message.getId();
        sender = User.fromTwitter(message.getSender());
        recipient = User.fromTwitter(message.getRecipient());
        text = message.getText();
        createdAt = message.getCreatedAt();

        mentions = message.getUserMentionEntities();
        hashtags = message.getHashtagEntities();
        media = message.getExtendedMediaEntities().length > 0 ? message.getExtendedMediaEntities() : message.getMediaEntities();
        urls = message.getURLEntities();
        symbols = message.getSymbolEntities();
    }

    public long getId() {
        return id;
    }

    public User getSender() {
        return sender;
    }

    public User getRecipient() {
        return recipient;
    }

    public String getText() {
        return text;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

    public UserMentionEntity[] getMentions() {
        return mentions;
    }

    public HashtagEntity[] getHashtags() {
        return hashtags;
    }

    public MediaEntity[] getMedia() {
        return media;
    }

    public URLEntity[] getUrls() {
        return urls;
    }

    public SymbolEntity[] getSymbols() {
        return symbols;
    }

    public List<String> getMentioningScreenNames(String excludeScreenName) {
        List<String> names = getMentioningScreenNames();
        if (excludeScreenName != null) {
            names.remove(excludeScreenName);
        }
        return names;
    }

    public List<String> getMentioningScreenNames() {
        List<String> names = new ArrayList<>();
        names.add(getSender().getScreenName());
        if (getSender() != getRecipient()) {
            names.add(getRecipient().getScreenName());
        }
        if (getMentions() != null) {
            for (UserMentionEntity entity : getMentions()) {
                if (names.contains(entity.getScreenName())) {
                    continue;
                }
                names.add(entity.getScreenName());
            }
        }
        return names;
    }

    public String getMessageSummary() {
        return String.format("@%s: %s", getSender().getScreenName(), getText());
    }
}