最基本功能的简易“聊天室”

一个简易网页版“聊天室”,主要是ajax的运用。这是一个基于facebook开发的应用的一小块,后台用groovy on grails框架实现,前台页面用了一些FBJS,FBML,所以如果没接触过facebook应用的朋友可能有些陌生,不过逻辑是一致的,很简单,初学者可以参考一下。

view:


   

 
   
     
       
         
          My Balance
       
       
       
           Lifetime
             100
       
       
           Current
           100
       
       
           Rank
           100
       
       
       
       
      
   
   
     
       
     
     
        Modern Family
       
          Wall
          Info
          Fan Stream
       
     
   
   
       Don't miss Wednesday's episode at 9/8c: "Game Changer": The release of a new product Phil wants coincides with his birthday; Mitchell has a newfound desire to toughen up; Cameron gets involved in a neighbor's marital problems.
   
   
     
       
          Fan Stream
          Everyone
          Just My Friends
         
       
       
           
           
           
             
                Add a comment
             
             
                Post
               
                 
               
                Post comment to my Facebook profile
             
           
         
         
         
             
         
         

             
         
       
     
   
 

 

 

controller:

package com.webgiftr

class FanStreamController extends BaseController {
  def beforeInterceptor = [action: this.&authInFrame, only: ['index']]
  ChatService chatService
    def index = {
      def pageId = params.fb_page_id
      //println jsonArray.length()
      //println jsonArray.getJSONObject(0).getString('message')
      render(view: 'index', model: [facebookId: userId, pageId: pageId, friendList:params.fb_sig_friends])

    }

  def fetchChatMessage = {
    def startId = params.startId as Long
    def pageId = params.pageId
    def facebookId = params.facebookId
    def msgList
      msgList = chatService.fetchChatMessage(pageId, facebookId, startId)
    render msgList
  }
  def fetchFriendsChatMessage = {
    def startId = params.startId as Long
    def pageId = params.pageId
    def facebookId = params.facebookId
    String[] friendList = [""]
      if (params.friendList) {
        friendList = params.friendList.split(",")
      } else {
        friendList = [""]
      }
    def msgList
      msgList = chatService.getFriendsChatMessage(pageId, facebookId, startId, friendList)
    render msgList
  }
  def writeChatMessage = {
    def pageId = params.pageId
    def facebookId = params.facebookId
    def message = params.message
    def date = new Date().toString()
    chatService.writeChatMessage(pageId,facebookId,message)
    render (template:"/fanStream/inc/commentsList",model:[pageId:pageId,facebookId:facebookId,message:message,date:date])
  }
  def displayChatMessage = {
    def pageId = params.pageId
    def facebookId = params.facebookId
    def message = params.message
    def date = params.date
    render (template:"/fanStream/inc/commentsList",model:[pageId:pageId,facebookId:facebookId,message:message,date:date])
  }

}

 

service:

package com.webgiftr
import org.json.JSONArray
import org.json.JSONObject
import net.spy.memcached.MemcachedClient

class ChatService {

    boolean transactional = true

    static MemcachedClient memCachedClient = null;

    def init() {
      if(!memCachedClient) {
        memCachedClient = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211))
      }
    }

    def writeChatMessage(String pageId, String facebookId, String message) {
      init()

      def pageChatMessageList = memCachedClient.get(pageId);

      def replaceFlag = true
      if(!pageChatMessageList) {
        pageChatMessageList = []
        pageChatMessageList << [id: 1L, facebookId: facebookId, message: message, date: new Date()]
        replaceFlag = false
      }
      else {
        def currentMessageSize = pageChatMessageList.size()
        // writeChatMessage is invoked for every single message, so currentMessageSize's max value is 500 in theory.
        // TODO: make the max list size configurable
        if(currentMessageSize >= 500) {
          pageChatMessageList.remove(0)
        }
        def id = pageChatMessageList[pageChatMessageList.size() - 1].id + 1
        pageChatMessageList << [id: id, facebookId: facebookId, message: message, date: new Date()]
      }

      def ret
      if (replaceFlag) {
        ret = memCachedClient.replace(pageId, 0, pageChatMessageList)
      }
      else {
        ret = memCachedClient.set(pageId, 0, pageChatMessageList)
      }
      return ret.get().booleanValue()
    }

    def fetchChatMessage(String pageId, String userFacebookId, Long startId) {
      init()

      def batchSize = 50
      List pageChatMessageList = memCachedClient.get(pageId)

      if(!pageChatMessageList) {
        return new JSONArray()
      }

      def resultList = []
      if(startId == 0) {
        def lastIndex = pageChatMessageList.size() - 1
        def startIndex = Math.max((lastIndex - batchSize + 1), 0)
        resultList = pageChatMessageList.getAt(startIndex..lastIndex)
      }
      else {
        resultList = pageChatMessageList.findAll {it.id >  startId && it.facebookId != userFacebookId}
      }

      return makeChatMessageJson(resultList)
    }

    private makeChatMessageJson (chatMessageList) {
       def jsonArray = new JSONArray()
       chatMessageList.each {
         def jsonObject = new JSONObject()
         jsonObject.put('id', it.id)
         jsonObject.put('facebookId', it.facebookId)
         jsonObject.put('message', it.message)
         jsonObject.put('date', it.date)
         jsonArray.put(jsonObject)
       }
       return jsonArray
    }

    def getFriendsChatMessage(String pageId, String userFacebookId, Long startId, String[] friendsFacebookIdList) {
      init()

      List pageChatMessageList = memCachedClient.get(pageId)
      if(!pageChatMessageList) {
        return new JSONArray()
      }

      def batchSize = 50
      def resultList = []
      List friendsAllMessageList
      if (startId == 0) {
        friendsAllMessageList = pageChatMessageList.findAll { (friendsFacebookIdList as List).contains(it.facebookId) || it.facebookId == userFacebookId }.toList()
        if (!friendsAllMessageList) {
          return new JSONArray()
        }
        def lastIndex = friendsAllMessageList.size() - 1
        def startIndex = Math.max((lastIndex - batchSize + 1), 0)
        resultList = friendsAllMessageList.getAt(startIndex..lastIndex)
      }
      else {
        friendsAllMessageList = pageChatMessageList.findAll { (friendsFacebookIdList as List).contains(it.facebookId) }.toList()
        if (!friendsAllMessageList) {
          return new JSONArray()
        }
        resultList = friendsAllMessageList.findAll {it.id >  startId && it.facebookId != userFacebookId}
      }

      return makeChatMessageJson(resultList)
    }
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部