/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package automenta.spacenet.plugin.comm.irc; import automenta.spacenet.plugin.comm.Agent; import automenta.spacenet.plugin.comm.Creates; import automenta.spacenet.plugin.comm.Message; import automenta.spacenet.plugin.comm.Next; import automenta.spacenet.var.graph.MemGraph; import java.util.LinkedList; import java.util.List; import jerklib.Channel; import jerklib.Session; import jerklib.events.ChannelMsgEvent; import jerklib.events.IRCEvent; import jerklib.events.NoticeEvent; import jerklib.events.PrivateMsgEvent; /** * * @author seh */ public class IRCGrapher extends IRCAgent { private Object prevNode; private final MemGraph graph; private Session session; private List<String> toJoin = new LinkedList(); public IRCGrapher(String network, MemGraph graph) { super(network); this.graph = graph; } public void joinChannel(String channel) { if (session!=null) session.joinChannel(channel); else { toJoin.add(channel); } } @Override protected void onConnected(Session session) { this.session = session; for (String c : toJoin) { session.joinChannel(c); } toJoin.clear(); } @Override protected void onJoined(Session session, Channel channel) { graph.addNode(getChannelNode(channel.getName())); } public automenta.spacenet.plugin.comm.Channel getChannelNode(String id) { //TODO use cache return new automenta.spacenet.plugin.comm.Channel(id); } public Agent getAgentNode(String id) { //TODO use cache return new Agent(id, null); } protected void onEvent(IRCEvent e) { Object newNode = null; if (e instanceof ChannelMsgEvent) { ChannelMsgEvent cme = (ChannelMsgEvent) e; String aName = cme.getNick(); Channel c = cme.getChannel(); String cName = c.getName(); Object channelNode = getChannelNode(cName); Object agentNode = getAgentNode(aName); newNode = new Message(cme.getMessage()); graph.addNode(newNode); graph.addEdge(new Creates(), channelNode, newNode); graph.addEdge(new Creates(), agentNode, newNode); } else if (e instanceof PrivateMsgEvent) { PrivateMsgEvent pme = (PrivateMsgEvent) e; String aName = pme.getNick(); Object agentNode = getAgentNode(aName); newNode = new Message(pme.getMessage()); graph.addNode(newNode); graph.addEdge(new Creates(), agentNode, newNode); } else if (e instanceof NoticeEvent) { NoticeEvent ne = (NoticeEvent) e; newNode = new Message(ne.getNoticeMessage()); graph.addNode(newNode); } else { System.err.println("unhandled IRC message: " + e + " of type: " + e.getClass()); } if (newNode != null) { if (prevNode != null) { //link prev->new graph.addEdge(new Next(), prevNode, newNode); } prevNode = newNode; } } }