package net.thesocialos.server;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.thesocialos.shared.ChannelApiEvents.ChApiChatUserChngState;
import net.thesocialos.shared.ChannelApiEvents.ChApiChatUserChngState.STATETYPE;
import net.thesocialos.shared.ChannelApiEvents.ChApiChatUserDisconnect;
import net.thesocialos.shared.model.User;
import com.google.appengine.api.channel.ChannelPresence;
import com.google.appengine.api.channel.ChannelService;
import com.google.appengine.api.channel.ChannelServiceFactory;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
@SuppressWarnings("serial")
public class ChannelDisconnect extends HttpServlet {
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
ChannelService channelService = ChannelServiceFactory.getChannelService();
ChannelPresence presence = channelService.parsePresence(req);
Objectify ofy = ObjectifyService.begin();
User user;
try {
// System.out.println(presence.clientId() + " disconnect");
user = UserHelper.getUserWithEmail(ChannelApiHelper.getUserForAppkey(presence.clientId()), ofy);
} catch (Exception e) {
return;
}
user.isConnected = false;
user.chatState = STATETYPE.OFFLINE;
ofy.put(user);
sendConnectionToContacts(ofy.get(user.getContacts()).values().iterator(), user.getEmail());
}
private void sendConnectionToContacts(Iterator<User> contacts, String email) {
while (contacts.hasNext()) {
User user = contacts.next();
if (user.isConnected)
ChannelApiHelper.sendMessage(user.getEmail(),
ChannelApiHelper.encodeMessage(new ChApiChatUserDisconnect(email)));
ChannelApiHelper.sendMessage(user.getEmail(), ChannelApiHelper.encodeMessage(new ChApiChatUserChngState(
STATETYPE.OFFLINE, null, Key.create(User.class, email))));
}
}
}