Package edu.maristit.xmppwebchat

Source Code of edu.maristit.xmppwebchat.ChatListener

/**
* Copyright (C) 2011  Adam Hocek. Contact: ahocek@gmail.com, Udaya K Ghattamaneni.
* Contact: ghattamaneni.uday@gmail.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
*/
package edu.maristit.xmppwebchat;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.cometd.bayeux.client.ClientSessionChannel;
import org.cometd.bayeux.server.BayeuxServer;
import org.cometd.bayeux.server.ServerChannel;
import org.cometd.bayeux.server.ServerSession;

import org.cometd.server.AbstractService;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.ToContainsFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.RosterPacket;
import org.jivesoftware.smack.packet.Presence.Mode;
import org.jivesoftware.smack.packet.Presence.Type;
import org.jivesoftware.smackx.Form;
import org.jivesoftware.smackx.ReportedData;
import org.jivesoftware.smackx.ReportedData.Column;
import org.jivesoftware.smackx.ReportedData.Row;
import org.jivesoftware.smackx.muc.InvitationListener;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.packet.DelayInformation;
import org.jivesoftware.smackx.packet.VCard;
import org.jivesoftware.smackx.search.UserSearchManager;
import org.json.JSONArray;

public class ChatListener extends AbstractService implements ClientSessionChannel.MessageListener,
        ChatManagerListener, MessageListener {

    private String chatRoom = "ChatRoom";
    private XMPPConnection connection;
    private Roster roster;
    private Chat chat = null;
    private List<Buddy> buddies = new ArrayList<Buddy>();
    private List<MultiUserChat> myChatRooms = new ArrayList<MultiUserChat>();
    private List<Map<String, String>> offlines = new ArrayList<Map<String, String>>();
    private String conferenceServer = "";
    private ServerSession serverSession;
    public List<Map<String, String>> messageArchives = new ArrayList<Map<String, String>>();

    public void processMessage(Chat chat, Message message) {
        String from = message.getFrom();
        String body = message.getBody();
        String[] username = from.split("/");

        //client.isConnected()
        System.out.println(String.format("Received message '%1$s' from %2$s",
                body, from));

        try {
            if (this.chat == null) {
                this.chat = chat;
            }
            if (body != null) {
                sendToPage(body, username[0], chat.getParticipant());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void sendHistory() {

        System.out.println("Requesting history:" + (new JSONArray(messageArchives)).toString());
        serverSession.deliver(getServerSession(), "/" + chatRoom, (new JSONArray(messageArchives)).toString(), null);

    }

    public void destroy() {
        try {
            System.out.println("Destroying:" + this);
            System.out.println("logging out Client:" + chatRoom
                    + ",User:" + connection.getUser());
            for (MultiUserChat chatRoom : myChatRooms) {
                try {
                    chatRoom.destroy("Logged out.", "");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            connection.getChatManager().removeChatListener(this);

            serverSession.disconnect();

            connection.disconnect();

            try {
                this.finalize();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ChatListener(BayeuxServer bayeuxServer, String name) {
        super(bayeuxServer, name);
        ServerChannel sc = bayeuxServer.getChannel("/" + name);
        if (sc != null) {
            sc.remove();
        }
        addService("/" + name, "processCometMessage");
        this.chatRoom = name;

    }

    public void init(XMPPConnection connection) {

        try {

            this.connection = connection;

            if (connection.isAuthenticated()) {
                String[] username = connection.getUser().split("/");

                if (username.length > 0) {
                    chatRoom = username[0].toString();
                }
                System.out.println("ChatRoom:" + chatRoom
                        + " created for user:" + connection.getUser());
                printRoster();

                MultiUserChat.addInvitationListener(connection,
                        new InvitationListener() {

                            @Override
                            public void invitationReceived(Connection conn,
                                    String room, String inviter, String reason,
                                    String password, Message arg5) {
                                // Reject the invitation
                                // MultiUserChat.decline(conn, room, inviter,
                                // "I'm busy right now");
                                // MultiUserChat.addInvitationListener(connection,
                                // listener)
                                joinConference(room);
                            }
                        });

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void processCometMessage(ServerSession remote, Map<String, String> fields) {
        this.serverSession = remote;
        //System.out.println("Got:'"+fields+"' in:"+chatRoom);

        if (chatRoom.equals(chatRoom)) {


            if (fields.containsKey("")) {
            } else if (fields.containsKey("chat")) {
                System.out.println("Sending CHat" + fields);
                sendChatMessage(fields);
            } else if (fields.containsKey("status")) {
                Mode mode = Mode.available;
                if (fields.get("mode").equalsIgnoreCase("dnd")) {
                    mode = Mode.dnd;
                } else if (fields.get("mode").equalsIgnoreCase("away")) {
                    mode = Mode.away;
                } else if (fields.get("mode").equalsIgnoreCase("xa")) {
                    mode = Mode.xa;
                } else if (fields.get("mode").equalsIgnoreCase("available")) {
                    mode = Mode.available;
                }
                changeStatus(fields.get("status"), mode);
            } else if (fields.containsKey("request")) {

                List<String> groupsString = new ArrayList<String>();
                for (RosterGroup grp : roster.getGroups()) {
                    groupsString.add(grp.getName());
                }
                sendGroups((new JSONArray(groupsString)).toString());
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                sendBuddy(buddies);
                System.out.println("BUDDIES Requested:" + buddies);
                sendHistory();
                sendOfflineChat();
               

            } else if (fields.containsKey("logout")) {

                this.destroy();
                // System.out.println("Destroying :" + this.toString());
            } else if (fields.containsKey("addUser")) {
                System.out.println("Adding User:" + fields.get("addUser"));
                String user = fields.get("addUser").toString();
                String[] groups = fields.get("groups").split(",");
                addUser(user, fields.get("name"), groups);
                try {
                    String presence = "";
                    if (roster.getPresence(user).isAvailable()) {
                        if (roster.getPresence(user).getMode() == null) {
                            presence = "available";
                        } else {
                            presence = roster.getPresence(user).getMode().toString();
                        }
                    } else {
                        presence = "unavailable";
                    }

                    sendPresenceToPage(user, new Buddy(user, user,
                            presence));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else if (fields.containsKey("removeUser")) {
//        //System.out.println("Removing User:" + fields.get("removeUser"));
                String email = fields.get("removeUser").toString();
                removeUser(email);
            } else if (fields.containsKey("startConf")) {
                conferenceServer = fields.get("confServer");
//        System.out.println("Creating Conference:"
//            + fields.get("startConf"));
                String users[] = fields.get("confUsers").split("\\|");
                startConference(fields.get("startConf"), fields.get("confServer"), Arrays.asList(users), "");
            } else if (fields.containsKey("joinConf")) {
                conferenceServer = fields.get("confServer");
                //System.out.println("Joining Conference:"
                //+ fields.get("joinConf"));
                joinConference(fields.get("joinConf"));
            } else if (fields.containsKey("confMessage")) {
//        System.out.println("Sending Message '"
//            + fields.get("confMessage") + "' to Conference:"
//            + fields.get("confName"));
                sendMessageToConference(fields.get("confName") + "@"
                        + fields.get("confServer"), fields.get("confMessage"));
            } else if (fields.containsKey("inviteConf")) {
//        System.out.println("Inviting '"
//            + fields.get("confUsers") + "' to Conference:");
                String users[] = fields.get("confUsers").split("\\|");
                inviteConference(fields.get("inviteConf"), Arrays.asList(users));
            } else if (fields.containsKey("closeChat")) {
                System.out.println("Called Close Chat :" + fields.get("closeChat"));

                for (Map map : messageArchives) {
                    if (map.get("name").toString().equalsIgnoreCase(fields.get("closeChat"))) {
                        System.out.println("Closing Chat :" + fields.get("closeChat"));
                        map.put("open", "false");

                    }
                }
            } else if (fields.containsKey("openChat")) {
                System.out.println("Called Open Chat :" + fields.get("openChat"));

                for (Map map : messageArchives) {
                    if (map.get("name").toString().equalsIgnoreCase(fields.get("openChat"))) {
                        System.out.println("Opened Chat :" + fields.get("openChat"));
                        map.put("open", "true");
                    }
                }
            } else if (fields.containsKey("moveChat")) {
                System.out.println("Called Move Chat :" + fields.get("moveChat"));

                for (Map map : messageArchives) {
                    if (map.get("name").toString().equalsIgnoreCase(fields.get("moveChat"))) {
//                        System.out.println("Moving Chat to:" + fields.get("X").toString()+","+fields.get("Y").toString());
//                        map.put("X", fields.get("X").toString());
//                        map.put("Y", fields.get("Y").toString());
                    }
                }
            }
        }
    }

    private void changeStatus(String status, Mode mode) {

        // Presence.Type type = Type.available;
        Presence presence = new Presence(Type.available);
        presence.setMode(mode);
        presence.setStatus(status);
        if (connection.isConnected()) {
            connection.sendPacket(presence);
        } else {
            try {
                connection.connect();
                connection.sendPacket(presence);
            } catch (XMPPException e) {
                e.printStackTrace();
            }
        }
        System.out.println(connection.getUser() + " Status Changed to "
                + status);

    }

    private void sendNotification(Map<String, String> notificationMessage) {
        // Payload notification = new JsonPayload(topic);
        // notification.addField("notification", notificationMessage);
        //streamingServer.publish(topic, notificationMessage);
        Map tempMap = new HashMap();
        if (notificationMessage.containsKey("user")) {
            if (!notificationMessage.containsKey("displayName")) {
                for (Buddy buddy : buddies) {
                    if (buddy.getEmail().equalsIgnoreCase(notificationMessage.get("user"))) {
                        if (!buddy.getName().equalsIgnoreCase("")) {
                            notificationMessage.put("displayName", buddy.getName());
                            break;
                        } else {
                            notificationMessage.put("displayName", buddy.getEmail());
                            break;
                        }
                    }
                }
            }

            String usr = notificationMessage.get("user");
            if (usr.equalsIgnoreCase(chatRoom)) {
                if (notificationMessage.containsKey("touser")) {
                    usr = notificationMessage.get("touser");
                }
                //System.out.println(":" + notificationMessage);
                if (notificationMessage.get("displayName") == null) {
                    notificationMessage.put("displayName", chatRoom);
                }
            }
            Date d = new Date();
            SimpleDateFormat sd = new SimpleDateFormat("M/d/yyyy H:m:s");
            //String timeStamp = "("+d.month+"/"+day+"/"+year+" "+hours+":"+minutes+":"+seconds+")

            boolean flag = false;
            for (Map map : messageArchives) {
                if (map.get("name").toString().equalsIgnoreCase(usr)) {
                    if (notificationMessage.get("chat") != null && !notificationMessage.get("chat").equalsIgnoreCase("null")) {
                        map.put("chat", map.get("chat")
                                + "<br/><b>(" + sd.format(d) + ") " + notificationMessage.get("displayName") + " :</b> "
                                + notificationMessage.get("chat"));
                        //map.get(usr, tempMap);
                        map.put("open", "true");
                    }
                    flag = true;
                }
            }
            if (!flag) {
                if (notificationMessage.get("chat") != null && !notificationMessage.get("chat").equalsIgnoreCase("null")) {
                    tempMap.put("name", usr);
                    tempMap.put("displayName", notificationMessage.get("displayName"));
                    tempMap.put("chat", "<br/><b>(" + sd.format(d) + ") " + notificationMessage.get("displayName") + " :</b> "
                            + notificationMessage.get("chat"));
                    tempMap.put("type", "user");
                    tempMap.put("open", "true");
                    messageArchives.add(tempMap);
                }
            }


        } else if (notificationMessage.containsKey("roomName")) {
            Date d = new Date();
            SimpleDateFormat sd = new SimpleDateFormat("M/d/yyyy H:m:s");
            String room = notificationMessage.get("roomName");
            boolean flag = false;
            for (Map map : messageArchives) {
                if (map.get("name").toString().equalsIgnoreCase(room)) {
                    String message = map.get("confChat") + "<br/><b>(" + sd.format(d) + ") "
                            + notificationMessage.get("fromUser") + " : </b>"
                            + notificationMessage.get("confChat");
                    map.put("confChat", message);
                    map.put("open", "true");
                    flag = true;
                }
            }
            if (!flag) {
                tempMap.put("type", "conference");
                tempMap.put("fromUser", "");
                tempMap.put("name", room);
                String message = "<b>(" + sd.format(d) + ") "+notificationMessage.get("fromUser") + " :</b> "
                        + notificationMessage.get("confChat");
                tempMap.put("confChat", message);
                tempMap.put("server", notificationMessage.get("server"));
                tempMap.put("open", "true");
                messageArchives.add(tempMap);
            }
        }
        System.out.println("Send to client:" + chatRoom + ":" + notificationMessage);
        serverSession.deliver(getServerSession(), "/" + chatRoom, notificationMessage, null);
    }

    private void sendOfflineChat() {
        for (Map<String, String> offline : offlines) {
            Map<String, String> chatMessage = new HashMap<String, String>();

            chatMessage.put("user", offline.get("from"));
            chatMessage.put("chat", "" + offline.get("message"));
            try {
                if (chat == null) {
                    System.out.println("Chat not started");
                    this.chat = connection.getChatManager().createChat(
                            offline.get("from"), this);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Sending offline:" + chatMessage + ",to:"
                    + chatRoom);
            sendNotification(chatMessage);
        }
        offlines.clear();
    }

    private void sendChatMessage(Map<String, String> fields) {
        if (fields.containsKey("chat")) {
            Map<String, String> chatMessage = new HashMap<String, String>();

            chatMessage.put("user", chatRoom);
            chatMessage.put("chat", "" + fields.get("chat"));
            chatMessage.put("touser", "" + fields.get("touser"));
            try {
                if (chat == null) {
                    System.out.println("Chat not started");
                    this.chat = connection.getChatManager().createChat(
                            fields.get("touser"), this);

                } else {
                    if (!fields.get("touser").isEmpty()
                            && !chat.getParticipant().equalsIgnoreCase(
                            fields.get("touser"))) {
                        this.chat = connection.getChatManager().createChat(
                                fields.get("touser"), this);
                    }
                    // System.out.println("Participant"+chat.getParticipant());
                }
                chat.sendMessage(fields.get("chat"));
                System.out.println("Sent to Chat server:" + fields);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Called sent to Client:" + chatMessage);
            sendNotification(chatMessage);
        } else {
            // System.err.println("Incoming payload did not contain chat message, full message: "
            // + fields.toString());
            System.out.println("Fields has no Chat:" + fields.containsKey("chat"));
        }
    }

    private void sendToPage(String message, String userName, String displayName) {
        Map<String, String> chatMessage = new HashMap<String, String>();
        String username = "" + userName;
        chatMessage.put("user", username);
        //chatMessage.put("displayName", displayName);
        chatMessage.put("chat", "" + message);
        sendNotification(chatMessage);
    }

    private void sendToConfPage(String roomName, String message, String userName, String server) {
        Map<String, String> chatMessage = new HashMap<String, String>();

        chatMessage.put("fromUser", userName);
        chatMessage.put("roomName", roomName);
        chatMessage.put("confChat", message);
        chatMessage.put("server", server);
        sendNotification(chatMessage);
    }

    private void sendBuddy(List<Buddy> buddies) {
        List<Buddy> users = new ArrayList<Buddy>();
//        try {
//            String[] domain = chatRoom.split("@");
//            UserSearchManager search = new UserSearchManager(connection);
//            Form searchForm = search.getSearchForm("search." + domain[1]);
//            Form answerForm = searchForm.createAnswerForm();
//
//            answerForm.setAnswer("Username", true);
//            answerForm.setAnswer("Name", true);
//            answerForm.setAnswer("search", "*");
//            ReportedData data = search.getSearchResults(answerForm, "search." + domain[1]);
//            //System.out.println("Data:"+data);
//            for (Iterator<Row> i = data.getRows(); i.hasNext();) {
//                Row r = i.next();
//                // System.out.print("Row:"+r.toString());
//                Buddy b = new Buddy("", "", "");
//                for (Iterator<Column> j = data.getColumns(); j.hasNext();) {
//                    String col = ((Column) j.next()).getVariable();
//                    System.out.print(col + ":");
//                    for (Iterator it1 = r.getValues(col); it1.hasNext();) {
//                        String val = it1.next().toString();
//                        System.out.println(val);
//                        if (col.equalsIgnoreCase("jid")) {
//                            b.setEmail(val);
//                        }
//                        if (col.equalsIgnoreCase("Name")) {
//                            b.setName(val);
//                        }
//                        //map.put(col,val);
//                    }
//                }
//                users.add(b);
//            }
//            System.out.println("users Requested:" + users);
//        } catch (Exception e) {
//            System.out.println("Search Service error:" + e.getMessage());
//            //e.printStackTrace();
//        }
        // String username = "User " + userName;
        Map<String, String> chatMessage = new HashMap<String, String>();

        Collections.sort(buddies, new Comparator() {

            public int compare(Object o1, Object o2) {
                Buddy p1 = (Buddy) o1;
                Buddy p2 = (Buddy) o2;
                return p1.getPresence().compareToIgnoreCase(p2.getPresence());
            }
        });
        chatMessage.put("buddies", buddies.toString());
        chatMessage.put("allUsers", users.toString());
        sendNotification(chatMessage);
    }

    private void sendGroups(String groups) {
        // String username = "User " + userName;
        Map<String, String> chatMessage = new HashMap<String, String>();
        chatMessage.put("groups", groups.toString());
        sendNotification(chatMessage);
    }

    private void sendPresenceToPage(String userName, Buddy buddy) {
        Map<String, String> chatMessage = new HashMap<String, String>();
        String username = userName;
        chatMessage.put("user", username);
        chatMessage.put("buddyStatus", "" + buddy);
        sendNotification(chatMessage);
    }

    public void printRoster() throws Exception {
        roster = connection.getRoster();
        roster.setSubscriptionMode(Roster.SubscriptionMode.manual);
        roster.addRosterListener(new RosterListener() {

            public void entriesAdded(Collection<String> addresses) {
            }

            public void entriesDeleted(Collection<String> addresses) {
            }

            public void entriesUpdated(Collection<String> addresses) {
            }

            public void presenceChanged(Presence presence) {
                try {
                    if (connection.isConnected()) {
//                        System.out.println("Presence changed: "
//                                + presence.getFrom()
//                                + "->"
//                                + presence
//                                + " in:"
//                                + connection.getAccountManager().getAccountAttribute("username"));
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
                String[] username = presence.getFrom().split("/");

                //System.out.println("Buddies in " + chatRoom + ":" + buddies);
                for (Buddy buddy : buddies) {
                    if (username[0].equalsIgnoreCase(buddy.getEmail())) {
                        if (presence.isAvailable()) {
                            if (presence.getMode() != null) {
                                buddy.setPresence(presence.getMode().name());
                            } else {
                                buddy.setPresence("available");
                            }
                        } else {
                            buddy.setPresence("unavailable");
                        }
                        if (presence.getStatus() == null) {
                            buddy.setStatus("");
                        } else {
                            buddy.setStatus(presence.getStatus());
                        }
                        sendPresenceToPage(username[0], buddy);
                        break;
                    }
                }
            }
        });

        PacketListener myListener = new PacketListener() {

            @Override
            public void processPacket(Packet packet) {
                // Do something with the incoming packet here.
                 //System.out.println("Packet:"+packet.getClass());
                if (packet.getClass().toString().equalsIgnoreCase(
                        "class org.jivesoftware.smack.packet.Presence")) {

                    Presence pr = (Presence) packet;
                    // System.out.println("packet XML:"+packet.toXML());
                    if (pr.getType().equals(Presence.Type.subscribe)) {
                        try {
                            String[] from = pr.getFrom().split("/");
                            System.out.println("Packet Type in process:"
                                    + pr.getType() + ", from:" + from[0]);
                            Presence subscribed = new Presence(
                                    Presence.Type.subscribed);
                            subscribed.setTo(from[0]);
                            subscribed.setFrom(chatRoom);
                            connection.sendPacket(subscribed);

                            connection.getRoster().createEntry(from[0],
                                    from[0], null);
                            boolean found = false;
                            for (Buddy buddy : buddies) {
                                if (buddy.getEmail().equalsIgnoreCase(from[0])) {
                                    found = true;
                                    break;
                                }
                            }
                            if (!found) {
                                buddies.add(new Buddy(from[0], from[0],
                                        "unavailable"));
                            }
                            sendPresenceToPage(from[0], new Buddy(
                                    from[0], from[0], roster.getPresence(
                                    from[0]).getMode().toString()));
                        } catch (XMPPException e) {
                            e.printStackTrace();
                        }
                    }
                }
                if (packet.getClass().toString().equalsIgnoreCase(
                        "class org.jivesoftware.smack.packet.Message")) {
                    Message m = (Message) packet;

                    if (m.getBody() != null) {
                        //System.out.println("Body is " + m.getBody());
                        DelayInformation inf = null;
                        try {
                            inf = (DelayInformation) packet.getExtension("x",
                                    "jabber:x:delay");

                            // get offline message timestamp
                            System.out.println("Inf:" + inf + ",PacketType:");
                            if (inf != null) {

                                Map<String, String> messages = new HashMap<String, String>();
                                String[] username = m.getFrom().split("/");
                                messages.put("from", username[0]);
                                messages.put("message", m.getBody());
                                // Date date = inf.getStamp();
                                messages.put("time", inf.getStamp().toString());
                                System.out.println("Adding offline:" + messages);
                                offlines.add(messages);
                            }
                        } catch (Exception e) {
                            // log.error(e);
                            e.printStackTrace();
                        }
                    }
                    // m.getXmlns()
                    // System.out.println("XML:" + packet.toXML());
                }
            }
        };
        // Register the listener.
        connection.addPacketListener(myListener, new ToContainsFilter(chatRoom));
       
        String[] domain = chatRoom.split("@");
        Collection<RosterEntry> entries = roster.getEntries();
        for (RosterEntry entry : entries) {
            String entryName = entry.getName();
            VCard vCard = new VCard();
            try {
                if (!domain[1].equalsIgnoreCase("gmail.com") && !domain[1].equalsIgnoreCase("chat.facebook.com")) {
                    vCard.load(connection, entry.getUser()); // load someone's VCard
                    entryName = vCard.getFirstName();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(String.format("Buddy:%1$s,Name:%2$s - Status:%3$s", entry.getUser(), entryName, entry.getStatus()));
            System.out.println("Status:" + roster.getPresence(entry.getUser()));
            List<String> groups = new ArrayList<String>();
            if (entry.getGroups() != null && entry.getGroups().size() > 0) {
                for (RosterGroup rg : entry.getGroups()) {
                    groups.add(rg.getName());
                }
            }
            if (roster.getPresence(entry.getUser()).isAvailable()) {
                if (roster.getPresence(entry.getUser()).getMode() == null) {
                    buddies.add(new Buddy(entryName, entry.getUser(),
                            "available", groups));
                } else {
                    buddies.add(new Buddy(entryName, entry.getUser(),
                            roster.getPresence(entry.getUser()).getMode().toString(), groups));
                }
            } else {
                buddies.add(new Buddy(entryName, entry.getUser(),
                        "unavailable", groups));
            }
        }
    }

    public void addUser(String userName, String email, String[] groups) {
        // this.roster = connection.getRoster();
        // List<String> groupsList = new ArrayList<String>();
        try {
            if (groups.length <= 0) {
                buddies.add(new Buddy(userName, email, "unavailable"));
            } else {

                buddies.add(new Buddy(userName, email, "unavailable", Arrays.asList(groups)));
            }
            roster.createEntry(email, userName, groups);

        } catch (XMPPException e) {
            e.printStackTrace();
        }

    }

    public void removeUser(String email) {
        try {
            RosterPacket pack = new RosterPacket();
            pack.setType(IQ.Type.SET);
            RosterPacket.Item item = new RosterPacket.Item(email, email);
            item.setItemType(RosterPacket.ItemType.remove);
            pack.addRosterItem(item);
            connection.sendPacket(pack);
            roster.removeEntry(roster.getEntry(email));
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void chatCreated(Chat chat, boolean createdLocally) {
        // System.out.println(String.format("New Message Received message from '%1$s' ",
        // chat.getParticipant()));
        if (!createdLocally)
      ;
        chat.addMessageListener(this);
    }

    public void startConference(String roomName, String server,
            List<String> users, String reason) {
        // Create a MultiUserChat using a Connection for a room
        MultiUserChat muc = new MultiUserChat(connection, roomName + "@"
                + server);
        PacketListener myListener = new PacketListener() {

            @Override
            public void processPacket(Packet packet) {
                //System.out.println("PacketData:" + packet.toXML());
                if (packet.getClass().toString().equalsIgnoreCase(
                        "class org.jivesoftware.smack.packet.Message")) {
                    Message m = (Message) packet;

                    if (m.getBody() != null) {
                       // System.out.println("Body is " + m.getBody());
                        DelayInformation inf = null;
                        try {
                            inf = (DelayInformation) packet.getExtension(
                                    "x", "jabber:x:delay");


                            String[] username = m.getFrom().split("/");

                            String t[] = username[0].split("@");
                            if (t.length >= 2) {
                                System.out.println("Room:" + t[0] + ",msg:" + m.getBody() + ",User:" + username[1]);
                                sendToConfPage(t[0], m.getBody(), username[1], t[1]);
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
        muc.addMessageListener(myListener);

        PacketListener peopleListener = new PacketListener() {

            @Override
            public void processPacket(Packet packet) {
                //System.out.println("People PacketData:" + packet.toXML());
                if (packet.getClass().toString().equalsIgnoreCase(
                        "class org.jivesoftware.smack.packet.Presence")) {
                    Presence p = (Presence) packet;

                    try {
                        System.out.println("Presence from: " + p.getFrom());
                        System.out.println("Presence :" + p.toString());

                        String[] username = p.getFrom().split("/");
                        String t[] = username[0].split("@");
                        //System.out.println("Room:"+t[0]+",msg:"+m.getBody()+",User:"+username[1]);
                        if (p.toString().equalsIgnoreCase("available")) {
                            sendToConfPage(t[0], "** '" + username[1] + "' joined the room **", "", t[1]);
                        } else if (p.toString().equalsIgnoreCase("unavailable")) {
                            sendToConfPage(t[0], "** '" + username[1] + "' left the room **", "", t[1]);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        muc.addParticipantListener(peopleListener);
        try {
            // Create the room
            //System.out.println(muc);
            muc.create(chatRoom);
            // Send an empty room configuration form which indicates that we
            // want
            // an instant room
            muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));
            for (String user : users) {
                muc.invite(user, reason);
            }

            System.out.println("Created Chat Room :" + roomName + " with " + users);
            myChatRooms.add(muc);
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }

    public void sendMessageToConference(String room, String message) {
        try {
            getChatRoomByName(room).sendMessage(message);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void inviteConference(String roomName, List<String> users) {
        MultiUserChat muc = null;
        if (roomName.contains("@")) {
            muc = getChatRoomByName(roomName);
        } else {
            muc = getChatRoomByName(roomName + "@" + conferenceServer);
        }
        System.out.println("invited #:" + users.size());
        if (muc != null) {
            for (String user : users) {
                muc.invite(user, "Invite");
                System.out.println("invited :" + user);
            }
        }
    }

    public void joinConference(String room) {
        MultiUserChat muc = new MultiUserChat(connection, room);
        try {
            muc.join(chatRoom);
            myChatRooms.add(muc);
            PacketListener myListener = new PacketListener() {

                @Override
                public void processPacket(Packet packet) {
                    //System.out.println("\nIN:" + chatRoom);
                    //System.out.println("PacketClass:" + packet.getClass());
                    //System.out.println("PacketProperties:"
                    //+ packet.getPropertyNames());
                    //System.out.println("PacketData:" + packet.toXML());
                    if (packet.getClass().toString().equalsIgnoreCase(
                            "class org.jivesoftware.smack.packet.Message")) {
                        Message m = (Message) packet;

                        if (m.getBody() != null) {
                            System.out.println("Body is " + m.getBody());
                            DelayInformation inf = null;
                            try {
                                inf = (DelayInformation) packet.getExtension(
                                        "x", "jabber:x:delay");

                                // get offline message timestamp

                                String[] username = m.getFrom().split("/");

                                String t[] = username[0].split("@");
                                System.out.println("Room:" + t[0] + ",msg:" + m.getBody() + ",User:" + username[1]);
                                sendToConfPage(t[0], m.getBody(), username[1], t[1]);

                            } catch (Exception e) {
                                // log.error(e);
                                e.printStackTrace();
                            }
                        }

                    }
                }
            };
            muc.addMessageListener(myListener);

            PacketListener peopleListener = new PacketListener() {

                @Override
                public void processPacket(Packet packet) {
                    //System.out.println("People PacketData:" + packet.toXML());
                    if (packet.getClass().toString().equalsIgnoreCase(
                            "class org.jivesoftware.smack.packet.Presence")) {
                        Presence p = (Presence) packet;

                        try {
                            System.out.println("Presence from: " + p.getFrom());
                            System.out.println("Presence :" + p.toString());

                            String[] username = p.getFrom().split("/");
                            String t[] = username[0].split("@");
                            //System.out.println("Room:"+t[0]+",msg:"+m.getBody()+",User:"+username[1]);
                            if (p.toString().equalsIgnoreCase("available")) {
                                sendToConfPage(t[0], "** '" + username[1] + "' joined the room **", "", t[1]);
                            } else if (p.toString().equalsIgnoreCase("unavailable")) {
                                sendToConfPage(t[0], "** '" + username[1] + "' left the room **", "", t[1]);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            muc.addParticipantListener(peopleListener);
            System.out.println("Joined Chat Room :" + room);
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }

    public MultiUserChat getChatRoomByName(String roomName) {
        for (MultiUserChat chatRoom : myChatRooms) {
            System.out.println("My Room Names:" + chatRoom.getRoom());
            if (chatRoom.getRoom().equalsIgnoreCase(roomName)) {
                return chatRoom;
            }
        }
        return null;
    }

    public void destroyGroupChat(String room) {
        try {
            getChatRoomByName(room).destroy("Finish", "");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onMessage(ClientSessionChannel arg0,
            org.cometd.bayeux.Message message) {
        Map<String, Object> data = message.getDataAsMap();
        String fromUser = (String) data.get("user");
        String text = (String) data.get("chat");
        System.out.printf("%s: %s%n", fromUser, text);

    }
}
TOP

Related Classes of edu.maristit.xmppwebchat.ChatListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.