/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package automenta.spacenet.plugin.comm.twitter;
import automenta.spacenet.plugin.comm.Agent;
import automenta.spacenet.plugin.comm.Channel;
import automenta.spacenet.plugin.comm.Creates;
import automenta.spacenet.plugin.comm.Mentions;
import automenta.spacenet.plugin.comm.Message;
import automenta.spacenet.plugin.comm.Next;
import automenta.spacenet.plugin.comm.Retweets;
import automenta.spacenet.var.graph.MemGraph;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import twitter4j.Status;
import twitter4j.Trend;
import twitter4j.Trends;
import twitter4j.User;
public class TwitterGrapher extends TwitterAgent {
private final MemGraph graph;
private Map<String, Agent> idAgent = new HashMap();
private Message previousMessage = null;
public TwitterGrapher(MemGraph graph) {
super();
this.graph = graph;
}
@Override protected void onStatus(Status s) {
Agent a = getAgent(s.getUser());
Message m = new Message(s.getText(), s.getUser().getProfileImageURL());
getGraph().addNode(a);
getGraph().addNode(m);
getGraph().addEdge(new Creates(), a, m);
if (previousMessage != null) {
getGraph().addEdge(new Next(), previousMessage, m);
}
if (s.getRetweetDetails()!=null) {
User retweeingUser = s.getRetweetDetails().getRetweetingUser();
if (retweeingUser != null) {
Agent retweetingAgent = getAgent(retweeingUser);
getGraph().addNode(retweetingAgent);
getGraph().addEdge(new Retweets(), m, retweetingAgent);
}
}
updateMentions(s, m);
previousMessage = m;
}
public Agent getAgent(User u) {
Agent a = idAgent.get(u.getName());
if (a == null) {
a = new Agent(u.getName(), u.getProfileImageURL());
idAgent.put(u.getName(), a);
}
return a;
}
public MemGraph getGraph() {
return graph;
}
protected void updateMentions(Status s, final Message m) {
final List<String> users = new LinkedList();
List<String> tags = new LinkedList();
String t = s.getText();
StringTokenizer st = new StringTokenizer(t, " ");
while (st.hasMoreTokens()) {
String x = st.nextToken();
if (x.startsWith("@")) {
users.add(x);
} else if (x.startsWith("#")) {
tags.add(x);
}
}
for (String x : tags) {
Channel c = new Channel(x);
getGraph().addNode(c);
getGraph().addEdge(new Mentions(), m, c);
}
if (users.size() > 0) {
new Thread(new Runnable() {
@Override public void run() {
for (String us : users) {
User u = getUser(us);
if (u != null) {
Agent a = getAgent(u);
getGraph().addNode(a);
getGraph().addEdge(new Mentions(), m, a);
}
}
}
}).start();
}
}
public void addTrends() {
Trends trends = getTrends();
Channel prevTrend = null;
for (Trend t : trends.getTrends()) {
Channel tc = new Channel(t.getName());
getGraph().addNode(tc);
if (prevTrend!=null) {
getGraph().addEdge(new Next(), prevTrend, tc);
}
prevTrend = tc;
}
}
}