// Init event
    void CMSModules_Chat_CMSPages_OfflineSupportForm_Init(object sender, EventArgs e)
    {
        if (!RequestHelper.IsPostBack())
        {
            int roomID = QueryHelper.GetInteger("roomid", 0);

            try
            {
                if (ChatUserHelper.CheckJoinRoomRights(roomID))
                {
                    ChatRoomUserInfo chatRoomUser = ChatRoomUserInfoProvider.GetChatRoomUser(ChatOnlineUserHelper.GetLoggedInChatUser().ChatUserID, roomID);

                    IEnumerable <MessageData> messages = ChatMessageInfoProvider.GetLatestMessages(roomID, 300, chatRoomUser.ChatRoomUserJoinTime);

                    StringBuilder sb = new StringBuilder();

                    // Iterate backwards over the messages, take only non-system messages
                    foreach (MessageData message in messages.Where(m => !m.SystemMessageType.IsSystemMessage()).Reverse())
                    {
                        sb.AppendFormat("{0} {1}: {2}", message.LastModified, message.Nickname, message.MessageText);
                        sb.NewLine();
                    }

                    messageEditElem.MessageText = sb.ToString();
                }
            }
            catch (Exception ex)
            {
                EventLogProvider.LogException("CMSModules_Chat_CMSPages_OfflineSupportForm", "GET ROOM MESSAGES", ex);
            }
        }
    }
    void Grid_OnAction(string actionName, object actionArgument)
    {
        // If room is global also modifyglobal permission has to be checked.. add it to every action which has modify permisison
        ((CMSChatPage)Page).CheckModifyPermission(SiteID);

        int chatRoomUserID = ValidationHelper.GetInteger(actionArgument, 0);

        if (chatRoomUserID == 0)
        {
            return;
        }

        ChatRoomUserInfo chatRoomUser = ChatRoomUserInfoProvider.GetChatRoomUser(chatRoomUserID);

        if (chatRoomUser == null)
        {
            return;
        }

        // Can't perform any action in one to one support room
        if (ChatRoom.IsOneToOneSupport)
        {
            ShowError(GetString("chat.cantrevokerightsofsupportroomcreator"));
            return;
        }

        switch (actionName)
        {
        case "kick":
            if (!chatRoomUser.IsOnline)
            {
                ShowError(GetString("chat.cantkickofflineuser"));
                return;
            }
            ChatRoomUserHelper.KickUserFromRoom(ChatRoomID, ChatUserInfoProvider.GetChatUserInfo(chatRoomUser.ChatRoomUserChatUserID), ChatUserHelper.GetChatUserFromCMSUser(MembershipContext.AuthenticatedUser));
            break;

        case "revoke":
            if (chatRoomUser.ChatRoomUserAdminLevel == AdminLevelEnum.Creator)
            {
                ShowError(GetString("chat.cantrevokecreatorrights"));
                return;
            }
            ChatRoomUserHelper.KickUserPermanentlyFromRoom(ChatRoomID, ChatUserInfoProvider.GetChatUserInfo(chatRoomUser.ChatRoomUserChatUserID), ChatUserHelper.GetChatUserFromCMSUser(MembershipContext.AuthenticatedUser));
            break;
        }
    }
Esempio n. 3
0
    protected void Page_Load(object sender, EventArgs e)
    {
        if (EditedObjectParent != null)
        {
            editElem.ChatRoomID = ((ChatRoomInfo)EditedObjectParent).ChatRoomID;
        }

        // If editing, add user's nickname to macro resolver, so it can be retrieved when applying breacrumb attribute
        ChatRoomUserInfo editedChatUser = EditedObject as ChatRoomUserInfo;

        if (editedChatUser != null && editedChatUser.ChatRoomUserID > 0)
        {
            int chatUserID = editedChatUser.ChatRoomUserChatUserID;

            ChatUserInfo chatUser = ChatUserInfoProvider.GetChatUserInfo(chatUserID);

            MacroContext.CurrentResolver.SetNamedSourceData("EditedChatUserNickname", chatUser.ChatUserNickname);
        }
    }
Esempio n. 4
0
    void EditForm_OnBeforeValidate(object sender, EventArgs e)
    {
        int chatUserID;

        if (IsEditing)
        {
            chatUserID = TypedEditedObject.ChatRoomUserChatUserID;
        }
        else
        {
            int userID = ValidationHelper.GetInteger(fUserSelector.Value, 0);

            UserInfo user = UserInfoProvider.GetUserInfo(userID);
            if (user == null)
            {
                ShowErrorAndStopProcessing("chat.pleaseselectuser");

                return;
            }

            if (user.IsPublic())
            {
                ShowErrorAndStopProcessing("chat.cantaddpermissionstopublicuser");

                return;
            }

            chatUserID = ChatUserHelper.GetChatUserFromCMSUser(user).ChatUserID;

            ChatRoomUserInfo chatRoomUser = ChatRoomUserInfoProvider.GetChatRoomUser(chatUserID, ChatRoomID);

            // If user with already raised privilegies is beign created
            if ((chatRoomUser != null) && (chatRoomUser.ChatRoomUserAdminLevel >= (ChatRoom.ChatRoomPrivate ? AdminLevelEnum.Join : AdminLevelEnum.Admin)))
            {
                ShowErrorAndStopProcessing("chat.errror.userhasalreadyraisedprivilegies");
                return;
            }
        }
    }
        /// <summary>
        /// 客户端进入处理事件
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        private async Task ProcessChat(AspNetWebSocketContext context)
        {
            ChatRoomUserInfo GetUserData = GenerateUserInfo(
                context.Cookies["UserToken"] != null ? context.Cookies["UserToken"].Value : "",
                context.WebSocket
                );

            try
            {
                #region 新用户进入处理

                Common.Log.ErrorLogHelp.WriterLog("-------------------------------------");
                foreach (var item1 in CONNECT_POOL)
                {
                    if (item1.Value.UserSocket != null)
                    {
                        Common.Log.ErrorLogHelp.WriterLog("循环输出:" + item1.Value.UserToken + " ---" + item1.Value.UserSocket.GetHashCode().ToString());
                    }
                }

                Common.Log.ErrorLogHelp.WriterLog("-------------------------------------");
                Common.Log.ErrorLogHelp.WriterLog("我的Token:" + GetUserData.UserToken);
                // 若存在先行删除遗留用户数据
                if (CONNECT_POOL.ContainsKey(GetUserData.UserToken))
                {
                    //释放对象以及删除UserToken
                    CONNECT_POOL.Remove(GetUserData.UserToken);
                    // await GetUserData.UserSocket.CloseAsync(WebSocketCloseStatus.Empty, "清除", CancellationToken.None);
                }
                //分配用户名给新进用户
                CONNECT_POOL.Add(GetUserData.UserToken, GetUserData);
                //告诉客户端它的UserId
                Send_Msg_Type.Send_LoginSession(GetUserData.UserSocket, GetUserData.UserToken.ToString());
                //判断发送对方是否在线-给其他用户发送公告
                foreach (var item in CONNECT_POOL.ToArray())
                {
                    try
                    {
                        if (item.Value.UserSocket != null)
                        {
                            if (item.Value.UserSocket.State == WebSocketState.Open)
                            {
                                if (item.Value.UserSocket != GetUserData.UserSocket)
                                {
                                    Send_Msg_Type.Send_System_Msg(item.Value.UserSocket, "欢迎用户[" + GetUserData.NickName + "]进入本聊天室!!!");
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        //Common.Log.ErrorLogHelp.WriterLog(ex.ToString());
                        //Common.Log.ErrorLogHelp.WriterLog(ex.ToString());
                        //Common.Log.ErrorLogHelp.WriterLog("-------------------------------------");
                        if (ex.Message.IndexOf("无法访问") >= 0)
                        {
                            CONNECT_POOL.Remove(item.Value.UserToken);
                        }
                        //foreach (var item1 in CONNECT_POOL)
                        //    if (item1.Value.UserSocket != null)
                        //            Common.Log.ErrorLogHelp.WriterLog("循环输出:" + item1.Value.UserToken + " ---" + item1.Value.UserSocket.GetHashCode().ToString());
                        //Common.Log.ErrorLogHelp.WriterLog("-------------------------------------");
                        //Common.Log.ErrorLogHelp.WriterLog("我的Token:" + GetUserData.UserToken);
                        //if (ex.Message.IndexOf("无法访问已经") > 0)
                        //CONNECT_POOL.Remove(item.Value.UserToken);
                    }
                }
                #endregion
                while (true)
                {
                    if (context.WebSocket.State == WebSocketState.Open)
                    {
                        try
                        {
                            ArraySegment <byte>    buffer = new ArraySegment <byte>(new byte[2048]);
                            WebSocketReceiveResult result = await context.WebSocket.ReceiveAsync(buffer, CancellationToken.None);

                            #region 消息处理(字符截取、消息转发)

                            #region 关闭Socket处理,删除连接池
                            //判断是否连接关闭
                            if (context.WebSocket.State != WebSocketState.Open)
                            {
                                if (CONNECT_POOL.ContainsKey(GetUserData.UserToken))
                                {
                                    CONNECT_POOL.Remove(GetUserData.UserToken);
                                    // await GetUserData.UserSocket.CloseAsync(WebSocketCloseStatus.Empty, "清除", CancellationToken.None);
                                    //GetUserData.UserSocket.Dispose();
                                }//删除连接池
                                break;
                            }
                            #endregion
                            string   userMsg  = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);//发送过来的消息
                            string[] MsgArray = userMsg.Split('|');
                            //判断发送对方是否在线:
                            foreach (var item in CONNECT_POOL.ToArray())
                            {
                                try
                                {
                                    if (item.Value.UserSocket != null)
                                    {
                                        if (item.Value.UserSocket.State == WebSocketState.Open)
                                        {
                                            if (item.Value.UserSocket != GetUserData.UserSocket)
                                            {
                                                Send_Msg_Type.Send_Other_Msg(item.Value.UserSocket, GetUserData.NickName, MsgArray[1]);
                                            }
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    if (ex.Message.IndexOf("无法访问") >= 0)
                                    {
                                        CONNECT_POOL.Remove(item.Value.UserToken);
                                    }
                                }
                            }
                        }
                        catch (Exception)
                        {
                            //消息转发异常处理,本次消息忽略 继续监听接下来的消息
                        }
                        #endregion
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Common.Log.ErrorLogHelp.WriterLog(ex.ToString());
                throw;
            }
        }