/// <summary> /// 마스터가 특정 유저의 권한을 변경하는 경우 이 함수를 실행합니다. /// </summary> /// <param name="user">변경을 시도하는 주체입니다.(권한이 있어야함)</param> /// <param name="json">변경 내용이 담긴 JObject입니다 ( (string)id, (bool)positive - 수락여부)</param> public void Member_Modify(User user, JObject json) { if (user.ID == (string)json["id"]) { NetworkMessageList.TipMessage(user.socket, "자기 자신은 탈퇴시킬 수 없습니다. 메인메뉴 탭을 이용해주세요."); return; } if (master != user.ID) { NetworkMessageList.TipMessage(user.socket, "해당 그룹의 마스터만 이 작업을 수행할 수 있습니다."); return; } MysqlNode node; int old_level = GetLevel((string)json["id"]);; // 이전의 레벨을 기억한다. if ((bool)json["positive"]) // 가입 요청 수락 { node = new MysqlNode(private_data.mysqlOption, "UPDATE takes_course SET level=?level WHERE course_no=?group_name AND student_id=?id AND level=?old_level"); node["old_level"] = 0; node["level"] = 1; } else { node = new MysqlNode(private_data.mysqlOption, "DELETE FROM takes_course WHERE course_no=?group_name AND student_id=?id"); } node["group_name"] = key; node["id"] = (string)json["id"]; int result = node.ExecuteNonQuery(); // MYSQL 실행 if (result > 0) // 성공한경우 { OpenMenu(user, "Member"); // 변경 주체의 윈도우를 갱신시킨다. (새로고침) NetworkMessageList.TipMessage(user.socket, "요청이 정상적으로 처리되었습니다."); if ((bool)json["positive"]) // 긍정적인 요청 { PostSystem.SendPost("그룹에 가입되었습니다.", "스터디 그룹 [" + name + "] 에 가입되었습니다!\r\n\r\n해당 그룹에서 많은 활동 부탁드립니다.", master, (string)json["id"]); } else // 부정적인 요청 (탈퇴) { if (old_level == 1) // 이전에 해당 유저가 회원이었을 경우 { PostSystem.SendPost("그룹에서 강퇴되었습니다.", "스터디 그룹 [" + name + "] 에서 강퇴되었음을 알립니다.", master, (string)json["id"]); } else // 이전에 해당 유저가 회원이 아니었던 경우 { PostSystem.SendPost("그룹 가입 신청이 거절되었습니다.", "스터디 그룹 [" + name + "] 에서 가입 신청이 거절됨을 알립니다.", master, (string)json["id"]); } } } else { NetworkMessageList.TipMessage(user.socket, "오류로 인해 처리되지 않았습니다."); } }
/// <summary> /// 가천 라이브러리에서 새로운 게시글이 올라오면 이 함수를 이벤트로 실행시킵니다. /// </summary> /// <param name="gclass">게시글이 올라온 강의</param> /// <param name="postItem">게시글</param> public static void NewPost(GachonClass gclass, PostItem postItem) { MysqlNode node = new MysqlNode(private_data.mysqlOption, "SELECT * FROM keyword"); JArray array = new JArray(); string ignore_id = ""; using (node.ExecuteReader()) { while (node.Read()) { if (ignore_id == node.GetString("student_id")) { continue; } string keyword = node.GetString("keyword"); if (CheckValid(keyword, gclass.Title, postItem.Title)) { ignore_id = node.GetString("student_id"); PostSystem.SendPost( string.Format("[{0}] 새로운 게시글 등록", gclass.Title), string.Format("[게시글 정보]\r\n{0} - {1}\r\n\r\n{2}\r\n\r\nURL : {3}", postItem.Title, postItem.Publisher, postItem.Content, postItem.url), "admin_keyword", ignore_id , false); ESocket socket = GachonSocket.GetOnlineUser(ignore_id); if (socket != null) { if (User.Items.ContainsKey(socket)) { User.Items[socket].ToChatMessage("[" + gclass.Title + "] 에 새로운 게시글이 등록되었습니다.", ChatType.System); if (postItem.posttype == BoardType.PostType.Homework) { NetworkMessageList.AddHomework(socket, gclass.Title, postItem.Title, postItem.e_time); } } } } } } }
/// <summary> /// 유저가 가입 신청을 할때 실행되는 함수입니다. /// </summary> /// <param name="user">가입 신청할 유저</param> public void SignUpRequest(User user) { // 해당 유저가 이 그룹에 대해 아무런 정보가 없을때 if (GetLevel(user) == -1) { // 그룹 구성원 목록에 레벨 0으로 추가 MysqlNode node = new MysqlNode(private_data.mysqlOption, "INSERT INTO takes_course(student_id,course_no,level) VALUES (?id,?name,?level)"); node["id"] = user.ID; node["name"] = key; node["level"] = 0; node.ExecuteInsertQuery(); // 가입 완료 메세지 전송 JObject json = new JObject(); json["type"] = NetworkProtocol.Study_SignUp; json["ui"] = false; user.socket.Send(json); user.ToChatMessage(key + "그룹에 가입 신청을 완료했습니다.", ChatType.Notice); // 마스터에게 가입 메세지 전송 PostSystem.SendPost("그룹 가입 신청", "스터디 그룹\r\n[" + key + "]\r\n\r\n가입 신청자\r\n" + user.name + " (" + user.gachonAccount.StudentNumber + ")\r\n\r\n새로운 회원가입 요청이 있습니다. 해당 그룹의 구역에서 가입 요청을 처리할 수 있습니다.", "admin_group", master); } }
public static void NewStudy(User user, JObject message) { string key = (string)message["name"]; if (key.Length < 2 || key.Length > 10) { NetworkMessageList.TipMessage(user.socket, "스터디 이름은 2글자 이상 10글자 이내입니다."); return; } MysqlNode node = new MysqlNode(private_data.mysqlOption, "INSERT INTO course(no,type,name) VALUES (?name,'Group',?name)"); node["name"] = key; int result = node.ExecuteNonQuery(); if (result == -1) { NetworkMessageList.TipMessage(user.socket, "이미 같은 이름의 스터디 그룹이 존재합니다."); return; } else if (result <= 0) { NetworkMessageList.TipMessage(user.socket, "데이터베이스의 예기치 못한 오류가 있습니다."); return; } // 현재 위치를 데이터베이스에 저장 Vector4 position = user.position; node = new MysqlNode(private_data.mysqlOption, "INSERT INTO `group`(group_name,master,x,y,z,q) VALUES (?name,?master,?x,?y,?z,?q)"); node["name"] = key; node["master"] = user.ID; node["x"] = position.x; node["y"] = position.y; node["z"] = position.z; node["q"] = position.q; node.ExecuteNonQuery(); node = new MysqlNode(private_data.mysqlOption, "INSERT INTO takes_course(student_id,course_no) VALUES (?id,?key)"); node["id"] = user.ID; node["key"] = key; node.ExecuteNonQuery(); // 성공적으로 만들어진경우 Study group = new Study(key, position); group.Start(); JObject json = new JObject(); json["type"] = NetworkProtocol.CloseNewStudy; user.socket.Send(json); NetworkMessageList.TipMessage(user.socket, "스터디 그룹을 성공적으로 만들었습니다!"); StringBuilder sb = new StringBuilder(); sb.AppendLine("스터디 이름 : " + key); sb.AppendLine("그룹 마스터 : " + user.ID); sb.AppendLine(""); sb.AppendLine("새로운 스터디를 개설하신것을 축하드립니다!!!"); sb.AppendLine("스터디의 펫말을 통해 새로운 그룹원을 초대하고, 그룹 내에서 진행된 대화를 확인할 수 있습니다."); sb.AppendLine(""); sb.AppendLine("앞으로 더 많은 기능이 추가될 예정이니 많은 관심 부탁드립니다~~"); sb.AppendLine(""); sb.AppendLine("만약 스터디 그룹에 대해 문의사항이 있다면"); sb.AppendLine("스터디 알림(admin_group)으로 메세지를 보내주시기 바랍니다."); sb.AppendLine(""); sb.AppendLine("-가천 빌리지-"); PostSystem.SendPost("새로운 스터디가 만들어졌습니다.", sb.ToString(), "admin_group", user.ID); }
private static void Server_Receive(ESocket socket, JObject Message) { if ((int)Message["type"] >= 1000) { switch ((int)Message["type"]) { case AndroidProtocol.TestMessage: Console.WriteLine("안드로이드 테스트 메세지 : " + (string)Message["message"]); break; case AndroidProtocol.Login: Function.Login(socket, (string)Message["id"], (string)Message["password"], false); break; case AndroidProtocol.GroupList: AndroidFunction.SendTakesList(socket); return; case AndroidProtocol.KeywordList: AndroidFunction.KeywordList(socket); break; case AndroidProtocol.KeywordAdd: AndroidFunction.NewKeyword(socket, (string)Message["keyword"]); break; case AndroidProtocol.PostList: if (Message["no"] != null) { AndroidFunction.GetPostList(socket, (int)Message["no"]); } break; case AndroidProtocol.Info: AndroidFunction.ReturnInfo(socket); break; } } else { switch ((int)Message["type"]) { case NetworkProtocol.Login: Function.Login(socket, (string)Message["id"], (string)Message["password"], true); break; case NetworkProtocol.EnterWorld: User.Items[socket].Start(); break; case NetworkProtocol.Move: User.Items[socket].Move(new Vector4((float)Message["x"], (float)Message["y"], (float)Message["z"], (float)Message["q"])); break; case NetworkProtocol.Chat: User.Items[socket].ChatMessage((string)Message["message"], ChatType.Normal); break; case NetworkProtocol.Action: Function.NPC_Action((NPC)GameObject.Items[(int)Message["no"]], User.Items[socket]); break; case NetworkProtocol.Post_Open: PostSystem.GetPage(User.Items[socket], (int)Message["page"]); break; case NetworkProtocol.Post_Detail: PostSystem.GetItem(User.Items[socket], (int)Message["no"]); break; case NetworkProtocol.NewStudy: StudySystem.NewStudy(User.Items[socket], Message); break; case NetworkProtocol.Keyword_Remove: KeywordSystem.RemoveItem(User.Items[socket], (string)Message["keyword"]); break; case NetworkProtocol.Keyword_Add: KeywordSystem.AddItem(User.Items[socket], (string)Message["keyword"]); break; case NetworkProtocol.Inventory_Remove: User.Items[socket].RemoveItem((int)Message["no"]); break; case NetworkProtocol.File_Download: User.Items[socket].DownloadItem((int)Message["no"], (string)Message["path"], (bool)Message["open"]); break; case NetworkProtocol.Study_SignUp: Study.Items[(string)Message["name"]].SignUpRequest(User.Items[socket]); break; case NetworkProtocol.Study_UI: Study.Items[(string)Message["name"]].OpenMenu(User.Items[socket], (string)Message["tab"]); break; case NetworkProtocol.Study_Member_Request: Study.Items[(string)Message["name"]].Member_Modify(User.Items[socket], Message); break; case NetworkProtocol.Study_SaveChatting: Study.Items[(string)Message["name"]].SaveChatting(User.Items[socket]); break; case NetworkProtocol.Study_FileUpload: Study.Items[(string)Message["group_name"]].FileUpload(User.Items[socket], (int)Message["no"]); break; case NetworkProtocol.Study_FileDownload: Study.Items[(string)Message["group_name"]].FileDownload(User.Items[socket], (int)Message["no"]); break; case NetworkProtocol.SendPost: NetworkMessageList.SendMessageResult(socket, PostSystem.SendPost(socket, Message)); break; case NetworkProtocol.GetFileInPost: PostSystem.GetFile(socket, Message); break; } } }