yahoosession.java

来自「基于Jabber协议的即时消息服务器」· Java 代码 · 共 406 行

JAVA
406
字号
/** * $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.yahoo;import org.jivesoftware.util.Log;import org.jivesoftware.wildfire.gateway.*;import org.jivesoftware.wildfire.roster.RosterItem;import org.jivesoftware.wildfire.user.UserNotFoundException;import org.xmpp.packet.JID;import org.xmpp.packet.Message;import org.xmpp.packet.PacketError;import org.xmpp.packet.Presence;import ymsg.network.*;import java.io.IOException;import java.util.*;/** * Represents a Yahoo session. *  * This is the interface with which the base transport functionality will * communicate with Yahoo. * * @author Daniel Henninger * Heavily inspired by Noah Campbell's work. */public class YahooSession extends TransportSession {    final private PseudoRosterManager pseudoRosterManager = new PseudoRosterManager();    /**     * Create a Yahoo 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 YahooSession(Registration registration, JID jid, YahooTransport transport, Integer priority) {        super(registration, jid, transport, priority);        pseudoRoster = pseudoRosterManager.getPseudoRoster(registration);        yahooSession = new Session();        yahooSession.addSessionListener(new YahooSessionListener(this));    }    /**     * Our pseudo roster.     *     * We only really use it for nickname tracking.     */    private PseudoRoster pseudoRoster;    /**     * How many attempts have been made so far?     */    private Integer loginAttempts = 0;    /**     * Yahoo session     */    private final Session yahooSession;    /**     * Stored Last Presence Type     */    public PresenceType presenceType = null;    /**     * Stored Last Verbose Status     */    public String verboseStatus = null;    /**     * Log in to Yahoo.     *     * @param presenceType Type of presence.     * @param verboseStatus Long representation of status.     */    public void logIn(PresenceType presenceType, String verboseStatus) {        this.presenceType = presenceType;        this.verboseStatus = verboseStatus;        final PresenceType pType = presenceType;        if (!isLoggedIn() && getLoginStatus() != TransportLoginStatus.LOGGING_IN && loginAttempts <= 3) {            setLoginStatus(TransportLoginStatus.LOGGING_IN);            new Thread() {                public void run() {                    try {                        loginAttempts++;                        yahooSession.setStatus(StatusConstants.STATUS_AVAILABLE);                        yahooSession.login(registration.getUsername(), registration.getPassword());                        setLoginStatus(TransportLoginStatus.LOGGED_IN);                        Presence p = new Presence();                        p.setTo(getJID());                        p.setFrom(getTransport().getJID());                        getTransport().sendPacket(p);                        yahooSession.setStatus(((YahooTransport)getTransport()).convertJabStatusToYahoo(pType));                        getRegistration().setLastLogin(new Date());                        syncUsers();                    }                    catch (LoginRefusedException e) {                        yahooSession.reset();                        Log.warn("Yahoo login failed for " + getJID());                        Message m = new Message();                        m.setType(Message.Type.error);                        m.setTo(getJID());                        m.setFrom(getTransport().getJID());                        m.setBody("Failed to log into Yahoo! messenger account.  (login refused)");                        getTransport().sendPacket(m);                        setLoginStatus(TransportLoginStatus.LOGGED_OUT);                    }                    catch (IOException e) {                        Log.error("Yahoo login caused IO exception:", e);                        Message m = new Message();                        m.setType(Message.Type.error);                        m.setTo(getJID());                        m.setFrom(getTransport().getJID());                        m.setBody("Failed to log into Yahoo! messenger account.  (unknown error)");                        getTransport().sendPacket(m);                        setLoginStatus(TransportLoginStatus.LOGGED_OUT);                                            }                }            }.run();        }    }    /**     * Log out of Yahoo.     */    public void logOut() {        setLoginStatus(TransportLoginStatus.LOGGED_OUT);        loginAttempts = 0;        try {            yahooSession.logout();        }        catch (IOException e) {            Log.debug("Failed to log out from Yahoo.");        }        yahooSession.reset();        Presence p = new Presence(Presence.Type.unavailable);        p.setTo(getJID());        p.setFrom(getTransport().getJID());        getTransport().sendPacket(p);    }    /**     * Syncs up the yahoo roster with the jabber roster.     */    public void syncUsers() {        List<TransportBuddy> legacyusers = new ArrayList<TransportBuddy>();        for (YahooGroup group : yahooSession.getGroups()) {            for (Enumeration e = group.getMembers().elements(); e.hasMoreElements();) {                YahooUser user = (YahooUser)e.nextElement();                PseudoRosterItem rosterItem = pseudoRoster.getItem(user.getId());                String nickname = null;                if (rosterItem != null) {                    nickname = rosterItem.getNickname();                }                if (nickname == null) {                    nickname = user.getId();                }                legacyusers.add(new TransportBuddy(user.getId(), nickname, group.getName()));            }        }        try {            getTransport().syncLegacyRoster(getJID(), legacyusers);        }        catch (UserNotFoundException e) {            Log.error("Unable to sync yahoo contact list for " + getJID());        }        // Ok, now lets check presence        for (Object userObj : yahooSession.getUsers().values()) {            YahooUser user = (YahooUser)userObj;            Presence p = new Presence();            p.setTo(getJID());            p.setFrom(getTransport().convertIDToJID(user.getId()));            String custommsg = user.getCustomStatusMessage();            if (custommsg != null) {                p.setStatus(custommsg);            }            ((YahooTransport)getTransport()).setUpPresencePacket(p, user.getStatus());            getTransport().sendPacket(p);        }    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#addContact(org.jivesoftware.wildfire.roster.RosterItem)     */    public void addContact(RosterItem item) {        // Syncing will take are of add.        String contact = getTransport().convertJIDToID(item.getJid());        syncContactGroups(contact, item.getGroups());        if (pseudoRoster.hasItem(contact)) {            PseudoRosterItem rosterItem = pseudoRoster.getItem(contact);            rosterItem.setNickname(item.getNickname());        }        else {            pseudoRoster.createItem(contact, item.getNickname(), null);        }    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#removeContact(org.jivesoftware.wildfire.roster.RosterItem)     */    public void removeContact(RosterItem item) {        String contact = getTransport().convertJIDToID(item.getJid());        for (YahooGroup yahooGroup : yahooSession.getGroups()) {            if (yahooGroup.getIndexOfFriend(contact) != -1) {                try {                    yahooSession.removeFriend(contact, yahooGroup.getName());                    pseudoRoster.removeItem(contact);                }                catch (IOException e) {                    Log.error("Failed to remove yahoo user.");                }            }        }    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#updateContact(org.jivesoftware.wildfire.roster.RosterItem)     */    public void updateContact(RosterItem item) {        String contact = getTransport().convertJIDToID(item.getJid());        syncContactGroups(contact, item.getGroups());        if (pseudoRoster.hasItem(contact)) {            PseudoRosterItem rosterItem = pseudoRoster.getItem(contact);            rosterItem.setNickname(item.getNickname());        }        else {            pseudoRoster.createItem(contact, item.getNickname(), null);        }    }    /**     * Given a legacy contact and a list of groups, makes sure that the list is in sync with     * the actual group list.     *     * @param contact Email address of contact.     * @param groups List of groups contact should be in.     */    public void syncContactGroups(String contact, List<String> groups) {        if (groups.isEmpty()) {            groups.add("Transport Buddies");        }        HashMap<String,YahooGroup> yahooGroups = new HashMap<String,YahooGroup>();        // Lets create a hash of these for easier reference.        for (YahooGroup yahooGroup : yahooSession.getGroups()) {            yahooGroups.put(yahooGroup.getName(), yahooGroup);        }        // Create groups(add user to them) that do not currently exist.        for (String group : groups) {            if (!yahooGroups.containsKey(group)) {                try {                    yahooSession.addFriend(contact, group);                }                catch (IOException e) {                    Log.error("Error while syncing Yahoo groups.");                }            }        }        // Now we handle adds and removes, syncing the two lists.        for (YahooGroup yahooGroup : yahooSession.getGroups()) {            if (groups.contains(yahooGroup.getName())) {                if (yahooGroup.getIndexOfFriend(contact) == -1) {                    try {                        yahooSession.addFriend(contact, yahooGroup.getName());                    }                    catch (IOException e) {                        Log.error("Error while syncing Yahoo groups.");                    }                }            }            else {                if (yahooGroup.getIndexOfFriend(contact) != -1) {                    try {                        yahooSession.removeFriend(contact, yahooGroup.getName());                    }                    catch (IOException e) {                        Log.error("Error while syncing Yahoo groups.");                    }                }            }        }    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#sendMessage(org.xmpp.packet.JID, String)     */    public void sendMessage(JID jid, String message) {        try {            yahooSession.sendMessage(jid.getNode(), message);        }        catch (IOException e) {            Log.error("Failed to send message to yahoo user.");        }    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#sendServerMessage(String)     */    public void sendServerMessage(String message) {        // We don't care.    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#updateStatus(org.jivesoftware.wildfire.gateway.PresenceType, String)     */    public void updateStatus(PresenceType presenceType, String verboseStatus) {        try {            if (isLoggedIn()) {                yahooSession.setStatus(((YahooTransport)getTransport()).convertJabStatusToYahoo(presenceType));            }            else {                // TODO: Should we consider auto-logging back in?            }        }        catch (Exception e) {            Log.error("Unable to set Yahoo Status:", e);        }        Presence p = new Presence();        if (presenceType == PresenceType.away) {            p.setShow(Presence.Show.away);        }        else if (presenceType == PresenceType.xa) {            p.setShow(Presence.Show.xa);        }        else if (presenceType == PresenceType.dnd) {            p.setShow(Presence.Show.dnd);        }        else if (presenceType == PresenceType.chat) {            p.setShow(Presence.Show.chat);        }        p.setTo(getJID());        p.setFrom(getTransport().getJID());        getTransport().sendPacket(p);        this.presenceType = presenceType;        this.verboseStatus = verboseStatus;    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#retrieveContactStatus(org.xmpp.packet.JID)     */    public void retrieveContactStatus(JID jid) {        YahooUser user = yahooSession.getUser(jid.getNode());        Presence p = new Presence();        p.setTo(getJID());        if (user != null) {            // User was found so update presence accordingly            p.setFrom(getTransport().convertIDToJID(user.getId()));            String custommsg = user.getCustomStatusMessage();            if (custommsg != null) {                p.setStatus(custommsg);            }            ((YahooTransport)getTransport()).setUpPresencePacket(p, user.getStatus());        }        else {            // User was not found so send an error presence            p.setFrom(jid);            p.setError(PacketError.Condition.forbidden);        }        getTransport().sendPacket(p);    }    /**     * @see org.jivesoftware.wildfire.gateway.TransportSession#resendContactStatuses(org.xmpp.packet.JID)     */    public void resendContactStatuses(JID jid) {        for (Object userObj : yahooSession.getUsers().values()) {            YahooUser user = (YahooUser)userObj;            Presence p = new Presence();            p.setTo(jid);            p.setFrom(getTransport().convertIDToJID(user.getId()));            String custommsg = user.getCustomStatusMessage();            if (custommsg != null) {                p.setStatus(custommsg);            }            ((YahooTransport)getTransport()).setUpPresencePacket(p, user.getStatus());            getTransport().sendPacket(p);        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?