public void OpenSingleChatForm(MemberObj userObj) { if (userObj != null && Members.ContainLoginUserNode(userObj.Id)) { ChatForm chatForm = ChatForms.FindSingleChatForm(userObj.Id); //존재하는 대화창이 없는 경우 생성 if (chatForm == null) { MakeChatForm(userObj); } else { chatForm.SetForward(); } } else //대화가능한 상대방이 없을경우 { if (MessageBox.Show(this, "대화할 상대방이 대화가 불가능한 상태입니다.\r\n 대신 쪽지를 보내시겠습니까?", "알림", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK) MakeSendMemo(userObj); } }
private void ChatForm_FormClosed(object sender, FormClosedEventArgs e) { try { miscCtrl.WriteDialogSaveFile(formKey, chatBox.Text, this.Text); if (ChattersTree.Nodes.Count > 1) { //2명이상과 대화중 폼을 닫을 경우 foreach (TreeNode node in ChattersTree.Nodes) { MemberObj userObj = (MemberObj)node.Tag; if (!ConfigHelper.Id.Equals(userObj.Id)) { //자신 빼고 전송 Logger.info("대화종료 메시지 생성:상대방 id : " + userObj.Id); connection.SendMsgNotifyChatFormClosed(formKey, userObj.Id); } } } ChatForms.RemoveForm(formKey); Logger.info("채팅창 닫음으로 key=" + formKey + " ChatterList 테이블에서 삭제"); connection.ChatterStatusReceived -= ChangeStatusOnChatterStatusReceived; connection.ChatMsgAdded -= AddMsgOnChatMsgAdded; connection.ChatterInvited -= AddChatterOnChatterInvited; connection.ChatterQuit -= DeleteChatterOnChatterQuit; connection.MemberStatusReceived -= this.ChangeStatusOnChatterStatusReceived; } catch (Exception exception) { Logger.error(exception.ToString()); } }
public void OpenSingleChatForm(MemberObj userObj) { if (userObj != null && Members.ContainLoginUserNode(userObj.Id)) { ChatForm chatForm = ChatForms.FindSingleChatForm(userObj.Id); //존재하는 대화창이 없는 경우 생성 if (chatForm == null) { MakeChatForm(userObj); } else { chatForm.SetForward(); } } else //대화가능한 상대방이 없을경우 { if (MessageBox.Show(this, "대화할 상대방이 대화가 불가능한 상태입니다.\r\n 대신 쪽지를 보내시겠습니까?", "알림", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK) { MakeSendMemo(userObj); } } }
/// <summary> /// //다른 클라이언트 목록 및 접속상태 정보(M|팀이름|id!멤버이름|id!멤버이름) /// </summary> /// <param name="msg"></param> public static void AddMembers(string msg) { lock (lockMembers) { string[] tempMsg = msg.Split('|'); if (tempMsg.Length > 2) { string teamName = tempMsg[1]; Dictionary<string, MemberObj> teamMembersTable = new Dictionary<string, MemberObj>(); if (teamName.Trim() == "") { //소속이 미지정인 경우 teamName = MsgrMsg.UNDEFINED_TEAM; } for (int i = 2; i < tempMsg.Length; i++) {//배열 순서 2번째 부터인 id!name을 추출 if (tempMsg[i].Length != 0) { string[] memInfo = tempMsg[i].Split('!'); //<id>와 <name>을 분리하여 memInfo에 저장 MemberObj member = new MemberObj(teamName, memInfo[0], memInfo[1]); membersTable[memInfo[0]] = member; teamMembersTable[memInfo[0]] = member; Logger.info("MemberObj정보추가: " + member.ToString()); } } membersTableByTeam[teamName] = teamMembersTable; //델리게이트 생성 } } }
private void _SetListBoxSource() { List <string> userList; if (mode == AddMemberMode.OnMemoReceived) // 전체 { userList = new List <string>(Members.GetMembers().Keys); } else //로그인사용자만 { userList = new List <string>(Members.GetLoginUsers().Keys); } foreach (string user in userList) { MemberObj userObj = Members.GetByUserId(user); if (userObj == null || userObj.Id == "") { continue; } ListBoxItem item = new ListBoxItem(userObj); if (ListBox.NoMatches == ListBoxSelected.FindStringExact(item.Text)) { ListBoxSource.Items.Add(item); } } }
/// <summary> /// //다른 클라이언트 목록 및 접속상태 정보(M|팀이름|id!멤버이름|id!멤버이름) /// </summary> /// <param name="msg"></param> public static void AddMembers(string msg) { lock (lockMembers) { string[] tempMsg = msg.Split('|'); if (tempMsg.Length > 2) { string teamName = tempMsg[1]; Dictionary <string, MemberObj> teamMembersTable = new Dictionary <string, MemberObj>(); if (teamName.Trim() == "") { //소속이 미지정인 경우 teamName = MsgrMsg.UNDEFINED_TEAM; } for (int i = 2; i < tempMsg.Length; i++) {//배열 순서 2번째 부터인 id!name을 추출 if (tempMsg[i].Length != 0) { string[] memInfo = tempMsg[i].Split('!'); //<id>와 <name>을 분리하여 memInfo에 저장 MemberObj member = new MemberObj(teamName, memInfo[0], memInfo[1]); membersTable[memInfo[0]] = member; teamMembersTable[memInfo[0]] = member; Logger.info("MemberObj정보추가: " + member.ToString()); } } membersTableByTeam[teamName] = teamMembersTable; //델리게이트 생성 } } }
/// <summary> /// 쪽지 및 파일 전송 수신자 추가 폼에서 "접속자" 라디오 버튼 클릭시 /// </summary> private void _DisplayLoginUsers() { try { SetTeamMode(false); ListBoxSource.Items.Clear(); Dictionary <string, IPEndPoint> loginUsers = Members.GetLoginUsers(); foreach (var de in loginUsers) { if (de.Value != null) { MemberObj userObj = Members.GetByUserId(de.Key.ToString()); ListBoxItem item = new ListBoxItem(userObj); if (ListBox.NoMatches == ListBoxSelected.FindStringExact(item.Text)) { ListBoxSource.Items.Add(item); } } } } catch (Exception exception) { Logger.error(exception.ToString()); } }
/// <summary> /// 대화창에서 파일보내기 버튼 클릭시 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void chatSendFile_Click(object sender, EventArgs e) { try { if (ChattersTree.Nodes.Count == 0) {//채팅참가자 리스트뷰에 참가자가 없다면 MessageBox.Show("파일전송을 할 대상자가 없습니다.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information); Logger.info("ChattersTree 에 파일수신 상대방 없음"); } string fileName = null; if (openFileDialog.ShowDialog(this) == DialogResult.OK) { fileName = openFileDialog.FileName; foreach (TreeNode node in ChattersTree.Nodes) { MemberObj userObj = (MemberObj)node.Tag; if (userObj.Status != MsgrUserStatus.LOGOUT) { SendFileForm sendform = new SendFileForm(connection, userObj, fileName); sendform.Show(); sendform.Activate(); } } } } catch (Exception exception) { Logger.error(exception.ToString()); } }
/// <summary> /// 접속자 명단 다시보기 /// </summary> private void _RefreshListBoxSource() { try { string teamname = (String)ComboBoxTeam.SelectedItem; if (teamname == "기타") { teamname = ""; } Dictionary <string, MemberObj> teamMembers = Members.GetMembersByTeam(teamname); ListBoxSource.Items.Clear(); foreach (var de in teamMembers) { //string tempname = (String)de.Value; string tempId = de.Key; if (Members.ContainLoginUserNode(tempId)) { //string item = tempname + "(" + tempid + ")"; MemberObj userObj = Members.GetByUserId(tempId); ListBoxItem item = new ListBoxItem(userObj); if (ListBox.NoMatches == ListBoxSelected.FindStringExact(item.Text)) { ListBoxSource.Items.Add(item); } } } } catch (Exception exception) { Logger.error(exception.ToString()); } }
public void SetChatterStatus(string userId, string userName, string status) { TreeNode[] nodearray = ChattersTree.Nodes.Find(userId, false); if (nodearray != null && nodearray.Length != 0) { if (nodearray.Length > 1) { Logger.error(string.Format("채팅창에 참여한 {0}이 하나이상 존재.", userId)); throw new Exception("채팅창 대화자처리 오류"); } TreeNode anode = nodearray[0]; try { MemberObj userObj = (MemberObj)anode.Tag; if (userId.Equals(userObj.Id)) { switch (status) { case MsgrUserStatus.ONLINE: //"online": anode.ImageIndex = 0; anode.SelectedImageIndex = 0; anode.ForeColor = Color.Black; break; case MsgrUserStatus.LOGOUT: //"logout": anode.ImageIndex = 1; anode.SelectedImageIndex = 1; anode.ForeColor = Color.Gray; break; case MsgrUserStatus.BUSY: //"busy": anode.ImageIndex = 2; anode.SelectedImageIndex = 2; anode.ForeColor = Color.Black; break; case MsgrUserStatus.DND: //"DND": anode.ImageIndex = 3; anode.SelectedImageIndex = 3; anode.ForeColor = Color.Black; break; case MsgrUserStatus.AWAY: //"away": anode.ImageIndex = 4; anode.SelectedImageIndex = 4; anode.ForeColor = Color.Black; break; } userObj.Status = status; anode.Text = string.Format("{0}({1})", userObj.Title, userId); anode.Tag = userObj; //userId + CommonDef.CHAT_USER_LOG_IN; } } catch (Exception ex) { Logger.error(ex.ToString()); throw new Exception("대화자 상태정보 처리 오류"); } } }
/// <summary> /// 메신저: 트리에서 대상자선택 /// 0명: 에러 /// 1명: 띄움 /// 2+명: 파일선택 먼저 하고 띄움 /// 채팅창: 상대방선택 /// 0명: 에러 /// 1명: 띄움 /// </summary> /// <param name="connection"></param> /// <param name="receiver"></param> public SendFileForm(MsgrConnection connection, MemberObj receiver) { InitializeComponent(); this.connection = connection; this.formKey = DateTime.Now.ToLongTimeString(); this.receiverObj = receiver; Initialize(); }
public SendMemoForm(MsgrConnection connection, MemberObj userObj) { InitializeComponent(); this.connection = connection; if (userObj != null) this.receiverList.Add(userObj); Initialize(); }
//파일이 선택된경우 바로 실행 public SendFileForm(MsgrConnection connection, MemberObj receiver, string fileName, bool autoStart) : this(connection, receiver, fileName) { if (fileName != null && !fileName.Equals("") && autoStart) { _StartFileSending(); ButtonFileSelect.Enabled = false; } }
//if (InvokeRequired) // { // DoOnChatMsgAdded handler = new DoOnChatMsgAdded(InvokeOnChatMsgAdded); // this.Invoke(handler, e); // } // else // InvokeOnChatMsgAdded(e); //} //public delegate void DoOnChatMsgAdded(CustomEventArgs e); //protected virtual void InvokeOnChatMsgAdded(CustomEventArgs e) //{ //} public void SetChatterOnFormOpening(MemberObj userObj) { if (userObj == null || userObj.Id == null || userObj.Id.Trim() == "" || userObj.Id.Trim() == ConfigHelper.Id) { return; } _AddChatter(userObj); }
/// <summary> /// 대화하기 메뉴를 클릭한 경우 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void chat_Click(object sender, EventArgs e) { try { if (memTree.SelectedNode.GetNodeCount(false) != 0)//선택한 노드가 하위 노드를 가지고 있을 경우 { Logger.info("그룹대화 요청!"); List <MemberObj> groupList = new List <MemberObj>(); //대화선택목록 int chattable = 0; string chatIdList = ConfigHelper.Id; //채팅가능자 foreach (TreeNode node in memTree.SelectedNode.Nodes) { MemberObj userObj = (MemberObj)node.Tag; if (userObj == null) { continue; } if (userObj.Status != MsgrUserStatus.LOGOUT) { chattable++; chatIdList = "/" + userObj.Id; } groupList.Add(userObj); } if (chattable == 0) //대화가능한 상대방이 없을경우 { DialogResult result = MessageBox.Show(this, "요청한 상대방 모두가 대화가 불가능한 상태입니다.\r\n 대신 쪽지를 보내시겠습니까?", "알림", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); if (result == DialogResult.OK) { OpenSendMemoBySelectedNode();//쪽지보내기 } } else if (chattable == 1) { MemberObj userObj = (MemberObj)groupList[0]; Logger.info("대화선택:" + userObj.Id); OpenSingleChatForm(userObj); } else { MakeChatForm(groupList, chatIdList); } } else //선택한 노드가 최하위 노드인 경우 { Logger.info("일대일대화 요청"); MemberObj userObj = (MemberObj)memTree.SelectedNode.Tag; OpenSingleChatForm(userObj); } } catch (Exception exception) { Logger.error(exception.ToString()); } }
public SendMemoForm(MsgrConnection connection, MemberObj userObj) { InitializeComponent(); this.connection = connection; if (userObj != null) { this.receiverList.Add(userObj); } Initialize(); }
private void _AddNextChatter(MemberObj userObj) { if (userObj == null || userObj.Id == null || userObj.Id.Trim() == "" || userObj.Id.Trim() == ConfigHelper.Id) { return; } _AddChatter(userObj); PostUserJoinMessage(userObj.Name); }
//파일이 선택된경우 바로 실행 public SendFileForm(MsgrConnection connection, MemberObj receiver, string fileName) : this(connection, receiver) { if (fileName != null && !fileName.Equals("")) { sendFile = new FileInfo(fileName); SelectFile(); _StartFileSending(); ButtonFileSelect.Enabled = false; } }
private void MakeSendFileForm(MemberObj userObj, string fileName)//key=id, value=name { try { SendFileForm sendform = new SendFileForm(connection, userObj, fileName); sendform.Show(); sendform.Activate(); } catch (Exception e) { Logger.error(e.ToString()); } }
/// <summary> /// 사용자 상태 변경 처리 /// </summary> /// <param name="statid"></param> /// <param name="presence"></param> private void ChangeStatusOnMemberStatusReceived(object sender, CustomEventArgs e) { try { MemberObj memberObj = (MemberObj)e.GetItem; TreeNode[] teamNode = memTree.Nodes.Find(memberObj.TeamName, false); TreeNode[] memNode = teamNode[0].Nodes.Find(memberObj.Id, false); MemberObj userObj = (MemberObj)memNode[0].Tag; switch (memberObj.Status) { case MsgrUserStatus.BUSY: //"busy": memNode[0].ImageIndex = 6; memNode[0].SelectedImageIndex = 6; userObj.Status = MsgrUserStatus.BUSY; break; case MsgrUserStatus.AWAY: //"away": memNode[0].ImageIndex = 4; memNode[0].SelectedImageIndex = 4; userObj.Status = MsgrUserStatus.AWAY; break; case MsgrUserStatus.LOGOUT: //"logout": memNode[0].ForeColor = Color.Gray; memNode[0].ImageIndex = 0; memNode[0].SelectedImageIndex = 0; Members.RemoveLoginUser(memberObj.Id); userObj.Status = MsgrUserStatus.LOGOUT; break; case MsgrUserStatus.ONLINE: //"online": memNode[0].ForeColor = Color.Black; memNode[0].ImageIndex = 1; memNode[0].SelectedImageIndex = 1; userObj.Status = MsgrUserStatus.ONLINE; break; case MsgrUserStatus.DND: //"DND": memNode[0].ImageIndex = 5; memNode[0].SelectedImageIndex = 5; userObj.Status = MsgrUserStatus.DND; break; } memNode[0].Text = userObj.Title; memNode[0].Tag = userObj; Logger.info(memberObj.Id + "의 상태값" + memberObj.Status + " 로 변경"); } catch (Exception ex) { Logger.error(" 상태값 변경 오류 : " + ex.ToString()); } }
/// <summary> /// 사용자가 대화하기를 선택시 대화창 생성 /// </summary> /// <param name="chatter"></param> /// <param name="ids"></param> private void MakeChatForm(MemberObj userObj) { try { if (userObj.Id == null || userObj.Id == "") return; ChatForm chatForm = new ChatForm(connection, miscCtrl, userObj); chatForm.Show(); } catch (Exception exception) { Logger.error(exception.ToString()); } }
private void memTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { try { if (memTree.SelectedNode.GetNodeCount(true) == 0) { //팀원 노드 선택 MemberObj userObj = (MemberObj)e.Node.Tag; Logger.info("대화선택:" + userObj.Id); OpenSingleChatForm(userObj); } } catch (Exception exception) { Logger.error(exception.ToString()); } }
private string _OpenSendFileFormBySelectedNode(TreeNode node, string fileName) { string invalidList = ""; MemberObj userObj = (MemberObj)node.Tag; if (userObj.Status != MsgrUserStatus.LOGOUT) { MakeSendFileForm(userObj, fileName); } else { invalidList = string.Format(",{0}({1})", userObj.Name, userObj.Id); } return(invalidList); }
/// <summary> /// 사용자가 대화하기를 선택시 대화창 생성 /// </summary> /// <param name="chatter"></param> /// <param name="ids"></param> private void MakeChatForm(MemberObj userObj) { try { if (userObj.Id == null || userObj.Id == "") { return; } ChatForm chatForm = new ChatForm(connection, miscCtrl, userObj); chatForm.Show(); } catch (Exception exception) { Logger.error(exception.ToString()); } }
public ChatForm(MsgrConnection connection, MiscController miscCtrl, MemberObj chatterObj) { try { InitializeComponent(); this.connection = connection; this.miscCtrl = miscCtrl; formKey = ChatUtils.GetFormKey(chatterObj.Id, ConfigHelper.Id); Initialize(); Logger.info(string.Format("채팅창생성 key[{0}]", formKey)); SetChatterOnFormOpening(chatterObj);//대화창에 참가자 노드 추가(key=id, text=name) } catch (Exception ex) { Logger.error(ex.ToString()); MessageBox.Show("화면 초기화중 오류가 발생했습니다.\n 담당자에게 문의하세요.", "초기화 오류", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// 채팅창 트리노드에서 로그인상태인 사용자 id만 구함 /// </summary> /// <param name="Nodes"></param> /// <returns></returns> //public static List<string> GetLoggedInIdFromNodeTag(TreeNodeCollection nodes) //{ // List<string> chatterList = new List<string>(); // for (int i = 0; i < nodes.Count; i++) { // MemberObj userObj = (MemberObj)nodes[i].Tag; // if (userObj == null) // continue; // if (userObj.Status != MsgrUserStatus.LOGOUT) { // chatterList.Add(userObj.Id); // } // } // return chatterList; //} public static List <MemberObj> GetLoggedInMemberFromNodeTag(TreeNodeCollection nodes) { List <MemberObj> memberList = new List <MemberObj>(); foreach (TreeNode node in nodes) { MemberObj userObj = (MemberObj)node.Tag; if (userObj == null) { continue; } if (!ConfigHelper.Id.Equals(userObj.Id) && userObj.Status != MsgrUserStatus.LOGOUT) { //자신 빼고 전송 memberList.Add(userObj); } } return(memberList); }
public static MemberObj FindMemberObjTagFromTreeNodes(TreeNodeCollection nodeCollection, string findId) { TreeNode[] nodes = nodeCollection.Find(findId, true); foreach (TreeNode node in nodes) { MemberObj userObj = (MemberObj)node.Tag; if (userObj == null) { continue; } if (userObj.Id == findId) { return(userObj); } } return(null); }
private void MnDialog_Click(object sender, EventArgs e) { try { if (memTree.SelectedNode.GetNodeCount(true) != 0) { return; //팀원 노드 선택 } MemberObj userObj = (MemberObj)memTree.SelectedNode.Tag; Logger.info("대화선택:" + userObj.Id); OpenSingleChatForm(userObj); } catch (Exception ex) { Logger.error(ex.ToString()); } }
private void MakeSendMemo(MemberObj receiver) { try { SendMemoForm form; if (receiver == null) { form = new SendMemoForm(connection); } else { form = new SendMemoForm(connection, receiver); } form.Show(); } catch (Exception e) { Logger.error(e.ToString()); } }
/// <summary> /// case "pass"://고객정보 전달 수신 /// pass|ani|senderID|receiverID|TONG_DATE|TONG_TIME|CustomerName /// </summary> public TransferObj(string[] msgToken) { //pass|ani|senderID|receiverID|TONG_DATE|TONG_TIME|CustomerName this.ani = msgToken[1]; this.senderId = msgToken[2]; MemberObj member = Members.GetByUserId(senderId); this.senderName = member.Name; this.receiverId = msgToken[3]; this.tongDate = msgToken[4]; this.tongTime = msgToken[5]; if (msgToken.Length > 6) { this.customerName = msgToken[6]; } else { this.customerName = ""; } }
/// <summary> /// 트리노드에 대화자 노드 추가 /// </summary> /// <param name="id">user id</param> /// <param name="name">user name</param> public void AddChatterToNode(MemberObj userObj) { if (userObj == null || userObj.Id == null || userObj.Id.Trim() == "" || userObj.Id.Trim() == ConfigHelper.Id) { return; } TreeNode[] nodearray = ChattersTree.Nodes.Find(userObj.Id, false); if (nodearray != null && nodearray.Length != 0) { //있는경우는 오류 Logger.error(string.Format("AddChatterToNode:{0}({1})이 이미 존재함.", userObj.Name, userObj.Id)); //throw new Exception("대화자 노드처리 오류"); } else { _AddNextChatter(userObj); } }
/// <summary> /// 1. 노드 추가 /// 2. 창타이틀에 이름 반영 /// 3. 색깔반영 /// </summary> /// <param name="id"></param> /// <param name="name"></param> private void _AddChatter(MemberObj userObj) { TreeNode node = ChattersTree.Nodes.Add(userObj.Id, userObj.Title + "(" + userObj.Id + ")"); node.Tag = userObj; //node.ImageIndex = 0; //node.SelectedImageIndex = 0; node.BackColor = Color.FromArgb(205, 220, 237); if (ChattersTree.Nodes.Count == 1) { this.Text += userObj.Name; } else { this.Text += "/" + userObj.Name; } //채팅참여했다가 나간후 다시 참여한 경우, 원래 색을 그대로 쓴다. if (!htUserColorTable.Contains(userObj.Id)) { htUserColorTable.Add(userObj.Id, msgColor.GetColor(ChattersTree.Nodes.Count)); } //상태지정 SetChatterStatus(userObj.Id, userObj.Name, userObj.Status); }
/// <summary> /// ___________1:1창__________다자창_______ /// /// on | key(out->in) key변경없음 /// 노드상태변경 노드상태변경 /// /// out | key(in->out) quit처리(**비정상종료로 quit없이 아웃됨) /// 노드상태변경 /// 메시지display /// /// busy | key변경없음 key변경없음 /// 노드상태변경 노드상태변경 /// /// away | 동일 /// /// dnd | 동일 /// /// </summary> /// <param name="id"></param> public void ChangeStatusOnChatterStatusReceived(object sender, CustomEventArgs e) { try { MemberObj memberObj = (MemberObj)e.GetItem; if (this.formKey.Contains(ConfigHelper.Id)) { switch (memberObj.Status) { case MsgrUserStatus.ONLINE: //1:1채팅인 경우만 if (HasSingleChatter()) { //1.키변경 string newFormKey = ChatUtils.GetFormKeyWithUserAdded(formKey, ConfigHelper.Id, memberObj.Id); ChatForms.UpdateFormKey(newFormKey, formKey); //2.노드상태변경 //3.메시지디스플레이 SetChatterLogIn(memberObj.Id, Members.GetByUserId(memberObj.Id).Name); } else { //다자창 //1.키변경없음 //2.노드상태변경 SetChatterLogIn(memberObj.Id, Members.GetByUserId(memberObj.Id).Name); } break; case MsgrUserStatus.LOGOUT: //1:1채팅인 경우만 if (HasSingleChatter()) { //1.키변경 string newFormKey = ChatUtils.GetFormKeyWithUserLogOut(formKey, ConfigHelper.Id, memberObj.Id); ChatForms.UpdateFormKey(newFormKey, formKey); //2.노드상태변경 //3.메시지디스플레이 SetChatterLogOut(memberObj.Id, Members.GetByUserId(memberObj.Id).Name); } else { //다자창 //quit처리 // 1.키변경 string newFormKey = ChatUtils.GetFormKeyWithUserQuit(formKey, ConfigHelper.Id, memberObj.Id); ChatForms.UpdateFormKey(newFormKey, formKey); // 2. 노드삭제 DeleteChatter(memberObj.Id, Members.GetByUserId(memberObj.Id).Name); } break; case MsgrUserStatus.BUSY: case MsgrUserStatus.AWAY: case MsgrUserStatus.DND: //노드상태변경 SetChatterStatus(memberObj.Id, Members.GetByUserId(memberObj.Id).Name, memberObj.Status); break; } } } catch (Exception exception) { Logger.error(exception.ToString()); } }
private void MakeSendMemo(MemberObj receiver) { try { SendMemoForm form; if (receiver == null) form = new SendMemoForm(connection); else form = new SendMemoForm(connection, receiver); form.Show(); } catch (Exception e) { Logger.error(e.ToString()); } }
/// <summary> /// 트리노드에 대화자 노드 추가 /// </summary> /// <param name="id">user id</param> /// <param name="name">user name</param> public void AddChatterToNode(MemberObj userObj) { if (userObj == null || userObj.Id == null || userObj.Id.Trim() == "" || userObj.Id.Trim() == ConfigHelper.Id) return; TreeNode[] nodearray = ChattersTree.Nodes.Find(userObj.Id, false); if (nodearray != null && nodearray.Length != 0) { //있는경우는 오류 Logger.error(string.Format("AddChatterToNode:{0}({1})이 이미 존재함.", userObj.Name, userObj.Id)); //throw new Exception("대화자 노드처리 오류"); } else { _AddNextChatter(userObj); } }
/// <summary> /// 1. 노드 추가 /// 2. 창타이틀에 이름 반영 /// 3. 색깔반영 /// </summary> /// <param name="id"></param> /// <param name="name"></param> private void _AddChatter(MemberObj userObj) { TreeNode node = ChattersTree.Nodes.Add(userObj.Id, userObj.Title + "(" + userObj.Id + ")"); node.Tag = userObj; //node.ImageIndex = 0; //node.SelectedImageIndex = 0; node.BackColor = Color.FromArgb(205, 220, 237); if (ChattersTree.Nodes.Count == 1) this.Text += userObj.Name; else this.Text += "/" + userObj.Name; //채팅참여했다가 나간후 다시 참여한 경우, 원래 색을 그대로 쓴다. if (!htUserColorTable.Contains(userObj.Id)) { htUserColorTable.Add(userObj.Id, msgColor.GetColor(ChattersTree.Nodes.Count)); } //상태지정 SetChatterStatus(userObj.Id, userObj.Name, userObj.Status); }
private void _AddNextChatter(MemberObj userObj) { if (userObj == null || userObj.Id == null || userObj.Id.Trim() == "" || userObj.Id.Trim() == ConfigHelper.Id) return; _AddChatter(userObj); PostUserJoinMessage(userObj.Name); }
//if (InvokeRequired) // { // DoOnChatMsgAdded handler = new DoOnChatMsgAdded(InvokeOnChatMsgAdded); // this.Invoke(handler, e); // } // else // InvokeOnChatMsgAdded(e); //} //public delegate void DoOnChatMsgAdded(CustomEventArgs e); //protected virtual void InvokeOnChatMsgAdded(CustomEventArgs e) //{ //} public void SetChatterOnFormOpening(MemberObj userObj) { if (userObj == null || userObj.Id == null || userObj.Id.Trim() == "" || userObj.Id.Trim() == ConfigHelper.Id) return; _AddChatter(userObj); }
/// <summary> /// 수신된 메시지를 분석하여 각 요청에 맞게 처리 /// </summary> /// <param name="obj">ArrayList로 형변환할 Object</param> protected void MsgFilter(object obj, IPEndPoint iep) { try { string msg = ((string)obj).Trim(); //수신 메시지 string tempFormKey; string[] tempMsg = msg.Split('|'); string code = tempMsg[0]; switch (code) { #region "f"//로그인 실패시(f|n or p) case "f": { isLoggedOn = false; string errmsg; if (tempMsg[1].Equals("n")) { errmsg = "등록되지 않은 사용자 입니다."; } else { errmsg = "비밀번호가 틀렸습니다."; } OnLoginFailed(new CustomEventArgs(errmsg)); } break; #endregion #region "g" //로그인 성공시 (g|name|team|company|com_cd|db_port) case "g": //로그인 성공시 (g|name|team|company|com_cd|db_port) isLoggedOn = true; ConfigHelper.DbServerIp = serverIP; ConfigHelper.DbPort = Convert.ToInt16(tempMsg[5]); //서버측에서 전달된 이름 저장 ConfigHelper.Id = ConfigHelper.TryId; ConfigHelper.Pass = ConfigHelper.TryPass; ConfigHelper.CompanyCode = tempMsg[4]; ConfigHelper.CompanyName = tempMsg[3]; Logger.info("로그인 성공"); ConfigHelper.Name = tempMsg[1]; ConfigHelper.TeamName = tempMsg[2]; OnLoginPassed(new CustomEventArgs()); if (checkThread == null) { checkThread = new Thread(new ThreadStart(SendCheck)); checkThread.Start(); Logger.info("SendCheck 스레드 시작"); } break; #endregion #region "a" //재로그인 이미 로그인상태알려줌 case "a": //중복로그인 시도를 알려줌 isLoggedOn = false; ConfigHelper.Id = ConfigHelper.TryId; ConfigHelper.Pass = ConfigHelper.TryPass; OnLoginDupped(); break; #endregion #region "M" //다른 클라이언트 목록 및 접속상태 정보(M|팀이름|id!멤버이름|id!멤버이름) case "M": //다른 클라이언트 목록 및 접속상태 정보(M|팀이름|id!멤버이름|id!멤버이름) if (tempMsg[1].Equals("e")) { //모든 팀트리 정보 전송완료 메시지일 경우 -> Client_Form을 로그인 상태로 하위 구성요소를 활성화 한다. OnTeamListReceiveDone(); } else { // 팀트리 정보를 수신한 경우 if (tempMsg.Length > 2) { Members.AddMembers(msg); string teamName = tempMsg[1]; OnTeamListReceived(new CustomEventArgs(teamName)); } } break; #endregion #region "y" //로그인 Client 리스트 상태값 case "y": //로그인 Client 리스트 y|id|상태값|ipaddress { MemberObj memberObj = Members.GetByUserId(tempMsg[1]); memberObj.Status = tempMsg[2]; //1. 로그인 리스트 테이블에 추가 Members.AddLoginUser(tempMsg[1], tempMsg[3]); //2. memTree 뷰에 로그인 사용자 상태 변경 OnMemberStatusReceived(new CustomEventArgs(memberObj)); this.OnMemberStatusReceived(new CustomEventArgs(memberObj)); break; } #endregion #region "u" //서버측에서 강제 로그아웃 메시지 수신한 경우 case "u": //서버측에서 강제 로그아웃 메시지 수신한 경우 isLoggedOn = false; OnForcedLogoutNotified(); break; #endregion #region "d" //상대방 대화메시지 case "d": //상대방 대화메시지일 경우 (d|Formkey|id/id/...|name|메시지) { ChatObj chatObj = new ChatObj(tempMsg); if (!chatObj.UserId.Equals(ConfigHelper.Id)) { if (ChatForms.Contain(chatObj.ChatKey)) { //이미 발신자와 채팅중일 경우 OnChatMsgAdded(new CustomEventArgs(chatObj)); } else { //새로운 대화요청일 경우, 대화창 생성 OnNewChatMsgReceived(new CustomEventArgs(chatObj)); } } } break; #endregion #region "c" //대화중 초대 case "c": //c|formkey|id/id/..|name //대화중 초대가 일어난 경우 { ChatObj chatObj = new ChatObj(tempMsg); if (ChatForms.Contain(chatObj.ChatKey)) { OnChatterInvited(new CustomEventArgs(chatObj)); } else { Logger.info(string.Format("'c' key[{0}]를 갖는 채팅창이 존재하지 않음.", chatObj.ChatKey)); } } break; #endregion #region "C" //보낸공지 읽음확인 수신 case "C": //보낸공지 읽음확인 수신(C|확인자id|noticeid) OnNoticeCheckNotified(new CustomEventArgs(tempMsg)); break; #endregion #region "q"|"dc" //다자 대화중 상대방이 대화창 나감 case "q": //다자 대화중 상대방이 대화창 나감 (q|Formkey|id) case "dc": //다자 대화중 상대방이 연결 끊김 (dc|Formkey|id) { ChatObj chatObj = new ChatObj(tempMsg); if (ChatForms.Contain(chatObj.ChatKey)) { OnChatterQuit(new CustomEventArgs(chatObj)); } else { Logger.info(string.Format("'q' key[{0}]를 갖는 채팅창이 존재하지 않음.", chatObj.ChatKey)); } } break; #endregion #region "m" //메모를 수신한 경우 case "m": //메모를 수신한 경우 m|name|id|message|수신자id { MemoObj memoObj = new MemoObj(tempMsg); OnMemoMsgReceived(new CustomEventArgs(memoObj)); MemoUtils.MemoFileWrite(ConfigHelper.Id, memoObj); break; } #endregion #region "i" //사용자 로그인 알림 case "i": //추가 로그인 상담원일 경우 형태 : i|id|소속팀명|ip|이름 { MemberObj memberObj = Members.GetByUserId(tempMsg[1]); memberObj.Status = MsgrUserStatus.ONLINE; //1. 로그인 리스트 테이블에 추가 Members.AddLoginUser(tempMsg[1], tempMsg[3]); //2. memTree 뷰에 로그인 사용자 상태 변경 OnMemberStatusReceived(new CustomEventArgs(memberObj)); //3. 각 채팅창 key변경 및 채팅창 노드/상태변경 OnChatterStatusReceived(new CustomEventArgs(memberObj)); //4. 로그인 했음 메시지 창 띄움 // 추후 구현 } break; #endregion #region "o" //사용자 로그아웃 알림 case "o": //로그아웃 상담원이 발생할 경우 o|id|소속 { MemberObj memberObj = Members.GetByUserId(tempMsg[1]); memberObj.Status = MsgrUserStatus.LOGOUT; //1. 로그인 리스트 테이블에서 삭제 Members.RemoveLoginUser(tempMsg[1]); //2. memTree 뷰에 로그아웃 사용자 상태 변경 OnMemberStatusReceived(new CustomEventArgs(memberObj)); //3. 각 채팅창 key변경 및 채팅창 노드/상태변경 OnChatterStatusReceived(new CustomEventArgs(memberObj)); } break; #endregion #region "n" //공지사항 수신 case "n": //공지사항 메시지 (n|메시지|발신자id|mode|noticetime|제목) { Logger.info("공지사항 수신!"); NoticeObj noticeObj = new NoticeObj(tempMsg); if (!noticeObj.SenderId.Equals(ConfigHelper.Id)) //자기가 보낸 공지일 경우 보이지 않음 { OnInstantNoticeReceived(new CustomEventArgs(noticeObj)); } break; } #endregion #region "A" //사용자부재 미처리건 정보 수신 case "A": //부재중 정보 전달(A|mnum|fnum|nnum|tnum) OnUnCheckedDataReceived(new CustomEventArgs(new int[] { Convert.ToInt32(tempMsg[1]), Convert.ToInt32(tempMsg[2]), Convert.ToInt32(tempMsg[3]), Convert.ToInt32(tempMsg[4]) })); break; #endregion #region "Q" //부재중 안읽은 메모리스트 case "Q": //안읽은 메모 리스트 (Q|sender†content†time†seqnum|...| OnUnCheckedMemoReceived(new CustomEventArgs(tempMsg)); break; #endregion #region "T" //부재중 안읽은 공지리스트 case "T": //안읽은 공지 리스트 (T|sender†content†time†mode†seqnum†title|sender†content†time†mode†seqnum|... OnUnCheckedNoticeReceived(new CustomEventArgs(tempMsg)); break; #endregion #region "R" //부재중 안읽은 파일리스트==> 안쓰임 case "R": //안읽은 파일 리스트 (R|sender†filenum†filename†time†size†seqnum|sender†filenum†filename†time†size†seqnum|... //안쓰임 break; #endregion #region "trans" //부재중 이관 메시시 수신 case "trans": //부재중 이관 메시시 수신(trans|sender†content†time†seqnum|...) OnUnCheckedTransferReceived(new CustomEventArgs(tempMsg)); break; #endregion #region "t" //DB공지상세목록 수신 case "t": //"t|ntime†content†nmode†title†안읽은사람1:안읽은사람2:...|... OnNoticeResultFromDBReceived(new CustomEventArgs(tempMsg)); break; #endregion #region "L" //공지사항목록 수신 case "L": //공지사항 리스트 수신한 경우 L|time‡content‡mode‡sender‡seqnum‡title|... OnNoticeListReceived(new CustomEventArgs(tempMsg)); break; #endregion #region "s" //각 클라이언트 상태값 변경메시지+ IP주소 case "s": //각 클라이언트 상태값 변경 메시지 s|id|상태|IPAddress { if (!tempMsg[1].Equals(ConfigHelper.Id)) { MemberObj memberObj = Members.GetByUserId(tempMsg[1]); memberObj.Status = tempMsg[2]; //1. 트리상태변경 OnMemberStatusReceived(new CustomEventArgs(memberObj)); //2. 로그인리스트 테이블에 추가 Members.AddLoginUser(tempMsg[1], tempMsg[3]); //3. 채팅창 상태변경 // 각 채팅창 key변경 및 채팅창 노드/상태변경 OnChatterStatusReceived(new CustomEventArgs(memberObj)); } } break; #endregion #region "pass" //고객정보 전달 수신 case "pass": //고객정보 전달 수신(pass|ani|senderID|receiverID|일자|시간|CustomerName OnCustomerInfoTransfered(new CustomEventArgs(tempMsg)); break; #endregion #region //전화기능 #region "Ring" //Ringing case "Ring": //발신자 표시(Ring|ani|name|server_type) OnCallRingingReceived(new CustomEventArgs(new string[] { tempMsg[1], tempMsg[2], tempMsg[3] })); break; #endregion #region "Dial" //Dialing case "Dial": //다이얼시 고객정보 팝업(Dial|ani) if (!ConfigHelper.NoPopOutBound) { OnCallDialingReceived(new CustomEventArgs(new string[] { tempMsg[1], "2" })); } break; #endregion #region "Answer" //Answer case "Answer": //offhook시 고객정보 팝업(Answer|ani|type) OnCallAnswerReceived(new CustomEventArgs(new string[] { tempMsg[1], tempMsg[2] })); break; #endregion #region "Abandon" //Abandon case "Abandon": //Abandon 발생시 OnCallAbandonReceived(); break; #endregion #region "Other" //Other 호전환수신 case "Other": //다른사람이 응답시 OnCallOtherAnswerReceived(); break; #endregion #endregion //전화기능 #region default //비정상메시지 default: Logger.info("지정되지 않은 메시지포맷:" + msg); break; #endregion } } catch (Exception ex) { Logger.error(ex.ToString()); } }