IRCSession.java 8.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/**
 * $Revision$
 * $Date$
 *
 * Copyright (C) 2006 Jive Software. 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 org.jivesoftware.wildfire.gateway.protocols.irc;

13
import org.jivesoftware.wildfire.gateway.*;
14 15 16
import org.jivesoftware.wildfire.roster.RosterItem;
import org.jivesoftware.util.Log;
import org.xmpp.packet.JID;
17
import org.xmpp.packet.Presence;
18 19 20
import org.schwering.irc.lib.IRCConnection;

import java.io.IOException;
21
import java.util.concurrent.ConcurrentHashMap;
22 23 24 25 26 27 28 29 30 31 32

/**
 * Represents an IRC session.
 *
 * This is the interface with which the base transport functionality will
 * communicate with IRC.
 *
 * @author Daniel Henninger
 */
public class IRCSession extends TransportSession {

33 34
    final private PseudoRosterManager pseudoRosterManager = new PseudoRosterManager();

35 36 37 38 39 40 41 42 43 44
    /**
     * Create a MSN Session instance.
     *
     * @param registration Registration informationed used for logging in.
     * @param jid JID associated with this session.
     * @param transport Transport instance associated with this session.
     * @param priority Priority of this session.
     */
    public IRCSession(Registration registration, JID jid, IRCTransport transport, Integer priority) {
        super(registration, jid, transport, priority);
45

46 47 48 49 50
        pseudoRoster = pseudoRosterManager.getPseudoRoster(registration);
        for (String contact : pseudoRoster.getContacts()) {
            buddyStatuses.put(contact, PresenceType.unavailable);
        }

51 52 53 54 55 56 57 58
        String server = "irc.freenode.net";
        int[] ports = new int[] { 7000, 6667 };
        String username = registration.getUsername();
        String password = registration.getPassword();
        password = (password == null || password.equals("")) ? null : password;
        String nickname = registration.getNickname();

        conn = new IRCConnection(server, ports, password, nickname, username, "Wildfire User");
59 60 61
        conn.setPong(true);
        conn.setDaemon(false);
        conn.setColors(false);
62 63
        ircListener = new IRCListener(this);
        conn.addIRCEventListener(ircListener);
64 65
    }

66 67 68 69 70 71 72
    /**
     * Our pseudo roster.
     *
     * No server side buddy list, so we track it all here.
     */
    private PseudoRoster pseudoRoster;

73 74 75
    /**
     * IRC connection.
     */
76
    public IRCConnection conn;
77

78 79 80 81 82 83 84 85 86 87
    /**
     * IRC listener.
     */
    IRCListener ircListener;

    /**
     * Tracks status of 'buddy list'.
     */
    ConcurrentHashMap<String, PresenceType> buddyStatuses = new ConcurrentHashMap<String, PresenceType>();

88 89 90 91 92 93 94
    /**
     * Logs the session into IRC.
     *
     * @param presenceType Initial presence state.
     * @param verboseStatus Initial full status information.
     */
    public void logIn(PresenceType presenceType, String verboseStatus) {
95 96 97 98 99
        try {
            conn.connect();
        }
        catch (IOException e) {
            Log.error("IO error while connecting to IRC: "+e.toString());
100 101 102 103 104 105 106
        }
    }

    /**
     * Logs the session out of IRC.
     */
    public void logOut() {
107
        ircListener.setSilenced(true);
108 109 110
        conn.doQuit();
    }

111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    /**
     * Retrieves the buddy status list.
     */
    public ConcurrentHashMap<String, PresenceType> getBuddyStatuses() {
        return buddyStatuses;
    }

    /**
     * Gets the current presence status of a buddy.
     *
     * @param username Username to look up.
     */
    public PresenceType getBuddyStatus(String username) {
        return buddyStatuses.get(username);
    }

    /**
     * Updates the current presence status of a buddy.
     *
     * @param username Username to set presence of.
     * @param presenceType New presence type.
     */
    public void setBuddyStatus(String username, PresenceType presenceType) {
134 135
        PresenceType buddyPresenceType = buddyStatuses.get(username);
        if (buddyPresenceType == null || !buddyPresenceType.equals(presenceType)) {
136 137 138 139 140 141 142 143 144 145 146
            Presence p = new Presence();
            if (presenceType.equals(PresenceType.unavailable)) {
                p.setType(Presence.Type.unavailable);
            }
            p.setTo(getJID());
            p.setFrom(getTransport().convertIDToJID(username));
            getTransport().sendPacket(p);
        }
        buddyStatuses.put(username, presenceType);
    }

147 148 149 150 151
    /**
     * Returns the IRC connection associated with this session.
     */
    public IRCConnection getConnection() {
        return conn;
152 153 154 155 156 157
    }

    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#updateStatus(org.jivesoftware.wildfire.gateway.PresenceType, String)
     */
    public void updateStatus(PresenceType presenceType, String verboseStatus) {
158 159 160 161 162 163 164
        String awayMsg = ((IRCTransport)getTransport()).convertJabStatusToIRC(presenceType, verboseStatus);
        if (awayMsg == null) {
            conn.doAway();
        }
        else {
            conn.doAway(awayMsg);
        }
165 166 167 168 169 170 171 172 173 174 175 176 177
    }

    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#isLoggedIn()
     */
    public Boolean isLoggedIn() {
        return conn.isConnected();
    }

    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#addContact(org.jivesoftware.wildfire.roster.RosterItem)
     */
    public void addContact(RosterItem item) {
178 179 180 181 182 183 184 185 186 187 188 189
        String contact = getTransport().convertJIDToID(item.getJid());
        if (pseudoRoster.hasItem(contact)) {
            PseudoRosterItem rosterItem = pseudoRoster.getItem(contact);
            rosterItem.setNickname(item.getNickname());
            rosterItem.setGroups(item.getGroups().toString());
            conn.doIson(contact);
        }
        else {
            pseudoRoster.createItem(contact, item.getNickname(), item.getGroups().toString());
            buddyStatuses.put(contact, PresenceType.unavailable);
            conn.doIson(contact);
        }
190 191 192 193 194 195
    }

    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#removeContact(org.jivesoftware.wildfire.roster.RosterItem)
     */
    public void removeContact(RosterItem item) {
196 197 198
        String contact = getTransport().convertJIDToID(item.getJid());
        pseudoRoster.removeItem(contact);
        buddyStatuses.remove(contact);
199 200 201 202 203 204
    }

    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#updateContact(org.jivesoftware.wildfire.roster.RosterItem)
     */
    public void updateContact(RosterItem item) {
205 206 207 208 209 210 211 212 213 214 215 216
        String contact = getTransport().convertJIDToID(item.getJid());
        if (pseudoRoster.hasItem(contact)) {
            PseudoRosterItem rosterItem = pseudoRoster.getItem(contact);
            rosterItem.setNickname(item.getNickname());
            rosterItem.setGroups(item.getGroups().toString());
            conn.doIson(contact);
        }
        else {
            pseudoRoster.createItem(contact, item.getNickname(), item.getGroups().toString());
            buddyStatuses.put(contact, PresenceType.unavailable);
            conn.doIson(contact);
        }
217 218 219 220 221 222 223 224 225
    }

    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#sendMessage(org.xmpp.packet.JID, String)
     */
    public void sendMessage(JID jid, String message) {
        conn.doPrivmsg(getTransport().convertJIDToID(jid), message);
    }

226 227 228 229 230 231 232
    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#sendServerMessage(String)
     */
    public void sendServerMessage(String message) {
        conn.send(message);
    }

233 234 235 236
    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#retrieveContactStatus(org.xmpp.packet.JID)
     */
    public void retrieveContactStatus(JID jid) {
237 238 239 240 241 242 243 244
        String contact = getTransport().convertJIDToID(jid);
        Presence p = new Presence();
        if (buddyStatuses.get(contact).equals(PresenceType.unavailable)) {
            p.setType(Presence.Type.unavailable);
        }
        p.setTo(jid);
        p.setFrom(getTransport().convertIDToJID(contact));
        getTransport().sendPacket(p);
245 246 247 248 249 250
    }

    /**
     * @see org.jivesoftware.wildfire.gateway.TransportSession#resendContactStatuses(org.xmpp.packet.JID)
     */
    public void resendContactStatuses(JID jid) {
251 252 253 254 255 256 257 258 259
        for (String contact : buddyStatuses.keySet()) {
            Presence p = new Presence();
            if (buddyStatuses.get(contact).equals(PresenceType.unavailable)) {
                p.setType(Presence.Type.unavailable);
            }
            p.setTo(jid);
            p.setFrom(getTransport().convertIDToJID(contact));
            getTransport().sendPacket(p);
        }
260 261 262
    }

}