package models; import models.chat.ChatPort; import models.chat.MerchantPort; import play.Logger; import play.libs.F.ArchivedEventStream; import play.libs.F.EventStream; public class ChatRoom { public String mid; public int limit = 15; public volatile int socketNumber = 0; public ChatRoom(String mid) { super(); this.mid = mid; } public ChatRoom(String mid, int limit) { super(); this.mid = mid; this.limit = limit; } // ~~~~~~~~~ Let's chat! public ArchivedEventStream<ChatRoom.Event> chatEvents = new ArchivedEventStream<ChatRoom.Event>(limit); /** * For WebSocket, when a user join the room we return a continuous event * stream of ChatEvent */ public EventStream<ChatRoom.Event> join(String user, String uid, String image) { chatEvents.publish(new Join(user, uid, image)); socketNumber++; MerchantPort mp = MerchantPort.findByMid(this.mid); if(mp != null){ mp.socketNumber = this.socketNumber; mp.save(); } Logger.debug("current room mid is : %s, uid is %s, nickname is %s joined. user counts are %d.", this.mid, uid, user, socketNumber); return chatEvents.eventStream(); } /** * A user leave the room */ public void leave(String user, String uid, String image) { chatEvents.publish(new Leave(user, uid, image)); socketNumber--; Logger.debug("current room mid is : %s, uid is %s, nickname is %s, leaved. user counts are %d.", this.mid, uid, user, socketNumber); if (socketNumber == 0) { ChatRoomFactory.rooms().remove(this.mid); MerchantPort mp = MerchantPort.findByMid(this.mid); if(mp != null){ mp.delete(); Logger.info("MerchantPort (mid:%s, port:%d) deleted.", mp.mid, mp.port); ChatPort.updateRoomCount(ChatRoomFactory.rooms().size(), mp.port); Logger.info("Update rooms counts(%d) on port %d", ChatRoomFactory.rooms().size(), mp.port); } Logger.info("room id is : %s, and remove room from ChatRoomFactory.", this.mid); } else { MerchantPort mp = MerchantPort.findByMid(this.mid); if(mp != null){ mp.socketNumber = this.socketNumber; mp.save(); } } } /** * A user say something on the room */ public void say(String user, String uid, String image, String text) { if (text == null || text.trim().equals("")) { return; } chatEvents.publish(new Message(user, uid, image, text)); } // ~~~~~~~~~ Chat room events public static abstract class Event { final public String type; final public Long timestamp; public Event(String type) { this.type = type; this.timestamp = System.currentTimeMillis(); } } public static class Join extends Event { final public String user; final public String uid; final public String image; public Join(String user, String uid, String image) { super("join"); this.user = user; this.uid = uid; this.image = image; } } public static class Leave extends Event { final public String user; final public String uid; final public String image; public Leave(String user, String uid, String image) { super("leave"); this.user = user; this.uid = uid; this.image = image; } } public static class Message extends Event { final public String user; final public String uid; final public String image; final public String text; public Message(String user, String uid, String image, String text) { super("message"); this.user = user; this.uid = uid; this.image = image; this.text = text; } } }