/*
* Copyright (C) 1999-2006 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.openfire.fastpath.events;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.jivesoftware.openfire.fastpath.history.AgentChatSession;
import org.jivesoftware.openfire.fastpath.history.ChatSession;
import org.jivesoftware.openfire.fastpath.history.ChatTranscriptManager;
import org.jivesoftware.openfire.user.User;
import org.jivesoftware.openfire.user.UserManager;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.util.EmailService;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.xmpp.workgroup.AgentSession;
import org.jivesoftware.xmpp.workgroup.Workgroup;
import org.jivesoftware.xmpp.workgroup.event.WorkgroupEventDispatcher;
import org.jivesoftware.xmpp.workgroup.event.WorkgroupEventListener;
import org.jivesoftware.xmpp.workgroup.utils.ModelUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.JID;
/**
* EmailTranscriptEvent sends emails to specified users on end of chat events.
*
* @author Derek DeMoro
*/
public class EmailTranscriptEvent implements WorkgroupEventListener {
private static final Logger Log = LoggerFactory.getLogger(EmailTranscriptEvent.class);
public EmailTranscriptEvent() {
WorkgroupEventDispatcher.addListener(this);
Log.debug("EmailTranscriptEvent initialized.");
}
public void workgroupCreated(Workgroup workgroup) {
}
public void workgroupDeleting(Workgroup workgroup) {
}
public void workgroupDeleted(Workgroup workgroup) {
}
public void workgroupOpened(Workgroup workgroup) {
}
public void workgroupClosed(Workgroup workgroup) {
}
public void agentJoined(Workgroup workgroup, AgentSession agentSession) {
}
public void agentDeparted(Workgroup workgroup, AgentSession agentSession) {
}
public void chatSupportStarted(Workgroup workgroup, String sessionID) {
}
public void chatSupportFinished(Workgroup workgroup, String sessionID) {
Log.debug("Chat Support Finished, sending transcripts");
final EmailService emailService = EmailService.getInstance();
String property = JiveGlobals.getProperty("mail.configured");
if (!ModelUtil.hasLength(property)) {
Log.debug("Mail settings are not configured, transcripts will not be sent.");
return;
}
final ChatSession chatSession = ChatTranscriptManager.getChatSession(sessionID);
if (chatSession == null || chatSession.getFirstSession() == null) {
return;
}
final StringBuilder builder = new StringBuilder();
SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyy hh:mm a");
// Get duration of conversation
Date date = new Date(chatSession.getFirstSession().getStartTime());
int duration = getChatDuration(date, chatSession);
TreeMap<String, List<String>> map = new TreeMap<String, List<String>>(chatSession.getMetadata());
String body = JiveGlobals.getProperty("chat.transcript.body");
if (ModelUtil.hasLength(body)) {
builder.append(body).append("\n\n");
}
builder.append("formname=chat transcript\n");
extractAndDisplay(builder, "question", map);
display(builder, "fullname", chatSession.getCustomerName());
extractAndDisplay(builder, "email", map);
extractAndDisplay(builder, "Location", map);
extractAndDisplay(builder, "userID", map);
extractAndDisplay(builder, "username", map);
extractAndDisplay(builder, "workgroup", map);
display(builder, "chatduration", String.valueOf(duration));
display(builder, "chatdate", formatter.format(date));
if (chatSession.getFirstSession() != null && chatSession.getFirstSession().getAgentJID() != null) {
try {
display(builder, "agent", new JID(chatSession.getFirstSession().getAgentJID()).toBareJID());
}
catch (Exception e) {
Log.debug("Could not display agent in transcript.", e);
}
}
for (Iterator<Map.Entry<String, List<String>>> iterator = map.entrySet().iterator(); iterator.hasNext();) {
Map.Entry<String, List<String>> entry = iterator.next();
display(builder, entry.getKey(), getListItem(entry.getValue()));
}
builder.append("ctranscript=\n");
builder.append(ChatTranscriptManager.getTextTranscriptFromSessionID(sessionID));
String subject = JiveGlobals.getProperty("chat.transcript.subject");
String from = JiveGlobals.getProperty("chat.transcript.from");
String to = JiveGlobals.getProperty("chat.transcript.to");
if (!ModelUtil.hasLength(subject) || !ModelUtil.hasLength(from)) {
Log.debug("Transcript settings (chat.transcript.subject, chat.transcript.from) are not configured, " +
"transcripts will not be sent.");
return;
}
if (ModelUtil.hasLength(to)) {
emailService.sendMessage("Chat Transcript", to, "Chat Transcript", from, subject, builder.toString(), null);
Log.debug("Transcript sent to " + to);
}
// NOTE: Do not sent to the customer. They will receive a prompt for a seperate chat transcript
// that does not contain agent information.
// Send to Agents
UserManager um = UserManager.getInstance();
for (Iterator<AgentChatSession> iterator = chatSession.getAgents(); iterator.hasNext();) {
AgentChatSession agentSession = iterator.next();
try {
User user = um.getUser(new JID(agentSession.getAgentJID()).getNode());
emailService.sendMessage("Chat Transcript", user.getEmail(), "Chat Transcript", from, subject, builder.toString(), null);
Log.debug("Transcript sent to agent " + agentSession.getAgentJID());
}
catch (UserNotFoundException e) {
Log.error("Email Transcript Not Sent:" +
"Could not load agent user object for jid " + agentSession.getAgentJID());
}
}
}
private void extractAndDisplay(StringBuilder builder, String var, TreeMap<String, List<String>> map) {
List<String> list = map.remove(var);
if (list != null) {
String value = getListItem(list);
if (ModelUtil.hasLength(value)) {
display(builder, var, value);
}
}
}
private void display(StringBuilder builder, String var, String value) {
builder.append(var).append("=").append(value).append("\n");
}
private String getListItem(List<String> list) {
StringBuffer sb = new StringBuffer();
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String s = iterator.next();
sb.append(s);
if (iterator.hasNext()) {
sb.append(",");
}
}
return sb.toString();
}
private int getChatDuration(Date start, ChatSession session) {
long startTime = start.getTime();
long end = startTime;
List<AgentChatSession> agents = session.getAgentList();
for (AgentChatSession chatSession : agents) {
if (end < chatSession.getEndTime()) {
end = chatSession.getEndTime();
}
}
return (int)((end - startTime) / 1000 / 60);
}
public void agentJoinedChatSupport(Workgroup workgroup, String sessionID, AgentSession agentSession) {
}
public void agentLeftChatSupport(Workgroup workgroup, String sessionID, AgentSession agentSession) {
}
public void shutdown() {
WorkgroupEventDispatcher.removeListener(this);
}
}