/* * Copyright 2006-2010 Daniel Henninger. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */ package net.sf.kraken.protocols.irc; import java.lang.ref.WeakReference; import java.util.ArrayList; import net.sf.kraken.muc.MUCTransportSession; import net.sf.kraken.session.TransportSession; import net.sf.kraken.type.PresenceType; import org.apache.log4j.Logger; import org.dom4j.Element; import org.xmpp.packet.Message; import org.xmpp.packet.Presence; import f00f.net.irc.martyr.commands.KickCommand; import f00f.net.irc.martyr.commands.MessageCommand; import f00f.net.irc.martyr.commands.PartCommand; import f00f.net.irc.martyr.commands.TopicCommand; import f00f.net.irc.martyr.services.AutoJoin; /** * @author Daniel Henninger */ public class IRCMUCSession extends MUCTransportSession<IRCBuddy> { static Logger Log = Logger.getLogger(IRCMUCSession.class); public IRCMUCSession(TransportSession<IRCBuddy> session, String roomname, String nickname, IRCMUCTransport transport) { super(session, roomname, nickname, transport); ircSessionRef = new WeakReference<IRCSession>((IRCSession)session); } /* IRC session for conveniences. */ WeakReference<IRCSession> ircSessionRef = null; AutoJoin autoJoin; public IRCSession getSession() { return ircSessionRef.get(); } /* List of known contacts in this room. */ public ArrayList<String> contacts = new ArrayList<String>(); /** * Retrieve list of contacts from this chat room. * * @return List of contacts in this room. */ public ArrayList<String> getContacts() { return contacts; } @Override public void enterRoom() { autoJoin = new AutoJoin(getSession().getConnection(), roomname); } @Override public void leaveRoom() { try { getSession().getConnection().sendCommand(new PartCommand(roomname)); } catch (Exception e) { Log.debug("IRC: Error while trying to part chat room:", e); } try { autoJoin.disable(); } catch (Exception e) { // Ignore } autoJoin = null; for (String contact : getContacts()) { Presence p = new Presence(); p.setType(Presence.Type.unavailable); p.setTo(session.getJID()); p.setFrom(transport.convertIDToJID(roomname, contact)); Element elem = p.addChildElement("x", "http://jabber.org/protocol/muc#user"); Element item = elem.addElement("item"); item.addAttribute("affiliation", "none"); item.addAttribute("role", "none"); transport.sendPacket(p); } Presence p = new Presence(); p.setType(Presence.Type.unavailable); p.setTo(session.getJID()); p.setFrom(transport.convertIDToJID(roomname, nickname)); Element elem = p.addChildElement("x", "http://jabber.org/protocol/muc#user"); Element item = elem.addElement("item"); item.addAttribute("affiliation", "none"); item.addAttribute("role", "none"); Element status = elem.addElement("status"); status.addAttribute("code", "110"); transport.sendPacket(p); } @Override public void sendMessage(String message) { getSession().getConnection().sendCommand(new MessageCommand(roomname, message)); // Return the favor. transport.sendMessage(session.getJID(), transport.convertIDToJID(roomname, nickname), message, Message.Type.groupchat); } @Override public void sendPrivateMessage(String nickname, String message) { getSession().sendMessage(getSession().getTransport().convertIDToJID(nickname), message); } @Override public void updateStatus(PresenceType presenceType) { // This should be taken care of by the main transport. } @Override public void updateTopic(String topic) { getSession().getConnection().sendCommand(new TopicCommand(roomname, topic)); } @Override public void kickUser(String nickname, String reason) { getSession().getConnection().sendCommand(new KickCommand(roomname, nickname, reason)); } @Override public void grantVoice(String nickname) { // TODO: Map into IRC } @Override public void revokeVoice(String nickname) { // TODO: Map into IRC } @Override public void banUser(String nickname, String reason) { // TODO: Map into IRC } @Override public void grantMembership(String nickname) { // TODO: Does this map into IRC? } @Override public void revokeMembership(String nickname) { // TODO: Does this map into IRC? } @Override public void grantModerator(String nickname) { // TODO: Map into IRC } @Override public void revokeModerator(String nickname) { // TODO: Map into IRC } }