Ejemplo n.º 1
0
        /// <summary>
        /// 채팅방에서 나간다.
        /// </summary>
        /// <param name="accountId">계정</param>
        /// <returns>성공 유무</returns>
        public static bool Leave(string accountId)
        {
            int chatRoomIndex;

            if (false == ChatRoomIndexByAccountIdMap.TryGetValue(accountId, out chatRoomIndex))
            {
                cLogger.Warning("cannot find account id (account_id: {0})", accountId);
                return(false);
            }
            ChatRoomIndexByAccountIdMap.TryRemove(accountId, out chatRoomIndex);//Ro

            cChatRoom chatRoom = null;

            if (false == ChatRoomMap.TryGetValue(chatRoomIndex, out chatRoom))
            {
                cLogger.Error("cannot find chat room (chat_room_index: {0}, account_id: {1})",
                              chatRoom.ChatRoomIndex,
                              accountId);

                return(false);
            }

            chatRoom.Leave(accountId);
            cLogger.Information("leave chatroom (chatroom_index: {0}, account_id: {1})\r\n", chatRoomIndex, accountId);
            return(true);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// 전체 채팅방에 메세지를 브로드캐스팅 한다.
 /// </summary>
 /// <param name="accountId">계정</param>
 /// <param name="message">메세지</param>
 public static void BroadcastAll(string accountId, string message)
 {
     Parallel.ForEach(ChatRoomMap, pair =>
     {
         cChatRoom chatRoom = pair.Value;
         if (null != chatRoom)
         {
             chatRoom.Broadcast(accountId, message);
         }
     });
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 전체 플레이어수를 반환한다.
        /// </summary>
        /// <returns></returns>
        public static int GetPeerCount()
        {
            int peerCount = 0;

            foreach (KeyValuePair <int, cChatRoom> pair in ChatRoomMap)
            {
                cChatRoom chatRoom = pair.Value;
                peerCount += chatRoom.GetPeerCount();
            }

            return(peerCount);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 채팅방에 메세지를 브로드캐스팅 한다.
        /// </summary>
        /// <param name="chatRoomIndex">채팅방 인덱스</param>
        /// <param name="accountId">계정</param>
        /// <param name="message">메세지</param>
        /// <returns>성공 유무</returns>
        public static bool Broadcast(int chatRoomIndex, string accountId, string message)
        {
            cChatRoom chatRoom = null;

            if (false == ChatRoomMap.TryGetValue(chatRoomIndex, out chatRoom))
            {
                return(false);
            }

            chatRoom.Broadcast(accountId, message);
            return(true);
        }
Ejemplo n.º 5
0
        public static void OnTimer(object source, ElapsedEventArgs e)
        {
            StringBuilder message = new StringBuilder();

            foreach (cChatRoomPair pair in ChatRoomMap)
            {
                cChatRoom chatRoom = pair.Value;
                message.AppendFormat("| ChatRoomIndex: {0}, MemberCount: {1} |",
                                     chatRoom.ChatRoomIndex, chatRoom.GetPeerCount());
            }

            cLogger.Information("ChatRoomInfo -----> {0}\r\n", message);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 들어갈 수 있는 채팅방을 반환한다.
        /// </summary>
        /// <returns>채팅방</returns>
        private static cChatRoom GetSuitableChatRoom()
        {
            for (int loop1 = 0; NextChatRoomMaxIndex > loop1; ++loop1)
            {
                cChatRoom chatRoom = null;
                if (false == ChatRoomMap.TryGetValue(loop1, out chatRoom))
                {
                    continue;
                }

                if (CHAT_ROOM_MEMBER_MAX_COUNT > chatRoom.GetPeerCount())
                {
                    return(chatRoom);
                }
            }

            return(null);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 채팅방에 들어간다.
        /// </summary>
        /// <param name="accountId">계정</param>
        /// <param name="peer">피어</param>
        public static int Join(string accountId, IPeer peer)
        {
            try
            {
                cChatRoom chatRoom = GetSuitableChatRoom();

                // 새로운 채팅방을 생성한다.
                if (null == chatRoom)
                {
                    chatRoom = new cChatRoom(NextChatRoomMaxIndex);
                    if (false == ChatRoomMap.TryAdd(chatRoom.ChatRoomIndex, chatRoom))
                    {
                        throw new Exception(string.Format("cannot add chat room (chat_room_index: {0}", chatRoom.ChatRoomIndex));
                    }

                    ++NextChatRoomMaxIndex;
                }

                chatRoom.Join(accountId, peer);
                if (false == ChatRoomIndexByAccountIdMap.TryAdd(accountId, chatRoom.ChatRoomIndex))
                {
                    chatRoom.Leave(accountId);
                    throw new Exception(string.Format(
                                            "cannot add chat room index by peer id dictionary (chat_room_index: {0}, account_id: {1}",
                                            chatRoom.ChatRoomIndex, accountId));
                }

                cLogger.Information("join chatroom (chatroom_index: {0}, account_id: {1})\r\n",
                                    chatRoom.ChatRoomIndex,
                                    accountId);
                return(chatRoom.ChatRoomIndex);
            }
            catch (Exception e)
            {
                cLogger.Error("Exception: {0}\r\n", e.Message);
                return(0);
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 채팅방을 변경한다.
        /// </summary>
        /// <param name="accountId">계정</param>
        /// <param name="newChatRoomIndex">새로운 채팅방 인덱스</param>
        /// <returns>성공 유무</returns>
        public static bool ChangeChatRoom(string accountId, int newChatRoomIndex)
        {
            int oldChatRoomIndex;

            if (false == ChatRoomIndexByAccountIdMap.TryGetValue(accountId, out oldChatRoomIndex))
            {
                return(false);
            }

            cChatRoom oldChatRoom = null;

            if (false == ChatRoomMap.TryGetValue(oldChatRoomIndex, out oldChatRoom))
            {
                return(false);
            }

            if (null == oldChatRoom)
            {
                return(false);
            }

            ChatRoomIndexByAccountIdMap.TryUpdate(accountId, newChatRoomIndex, oldChatRoomIndex);


            IPeer peer = oldChatRoom.Leave(accountId);

            cChatRoom newChatRoom = null;

            if (false == ChatRoomMap.TryGetValue(newChatRoomIndex, out newChatRoom))
            {
                oldChatRoom.Join(accountId, peer);
                return(false);
            }

            //여기가 살짝 이상함
            newChatRoom.Join(accountId, peer);
            return(true);
        }