// 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; } }
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); } }
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; } }