/// <summary> /// 해당 소켓의 로그인 ID를 설정합니다. /// </summary> /// <param name="socket">새로운 소켓</param> /// <param name="id">로그인 ID</param> /// <param name="GameUser">게임 유저인가? (게임접속중이면 소켓메세지 전송에 우선순위 부여)</param> public static void Connect(ESocket socket, string id, bool GameUser = true) { lock (lockobject) { // Socket -> String if (!session_string.ContainsKey(socket)) { session_string.Add(socket, id); } // String -> Socket if (!session.ContainsKey(id)) { session[id] = new List <ESocket>(); } if (GameUser) { session[id].Insert(0, socket); } else { session[id].Add(socket); } List <JObject> message = PostSystem.GetMessage(id); if (message != null) { foreach (JObject json in message) { socket.Send(json); } } } }
/// <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, "오류로 인해 처리되지 않았습니다."); } }
public static void NPC_Action(NPC npc, User user) { //user.ToChatMessage(npc.function + "를 선택", ChatType.System); if (npc.function == "우편함 열기") { PostSystem.GetPage(user, 1); } if (npc.function == "키워드 알림 설정") { KeywordSystem.GetList(user); } }
private static void Server_Receive(ESocket socket, Newtonsoft.Json.Linq.JObject Message) { switch ((int)Message["type"]) { case NetworkProtocol.Login: Function.Login(socket, (string)Message["id"], (string)Message["password"]); 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"]); break; } }
/// <summary> /// 플레이어가 로딩이 끝났을때 다른 플레이어에게 플레이어 입장 소식을 알리고, 이 플레이어에게 정보를 전달합니다. /// </summary> public override void Start() { base.Start(); // 해당 유저에게도 월드에 있는 다른 오브젝트 표시 foreach (GameObject item in GameObject.Items.Values) { if (item != this) { JObject json = item.InfoData(); json["type"] = NetworkProtocol.NewObject; socket.Send(json); } } // 인벤토리 로드 MysqlNode node = new MysqlNode(private_data.mysqlOption, "SELECT * FROM inventory_items WHERE student_id=?id"); node["id"] = ID; using (node.ExecuteReader()) { while (node.Read()) { JObject item = new JObject(); item["type"] = NetworkProtocol.Inventory_Add; item["no"] = node.GetInt("file_no"); item["size"] = node.GetInt("size"); item["name"] = node.GetString("name"); item["date"] = node.GetDateTime("date"); item["owner"] = node.GetString("owner"); socket.Send(item); } } // 과제 정보 로드 node = new MysqlNode(private_data.mysqlOption, "SELECT takes_course.course_no, title, end_date FROM takes_course JOIN homework_list ON takes_course.course_no=homework_list.course_no WHERE student_id=?id and DATE(NOW()) <= DATE(end_date)"); node["id"] = ID; using (node.ExecuteReader()) { while (node.Read()) { NetworkMessageList.AddHomework(socket, GachonObjects.AllClass[node.GetString("course_no")].Title, node.GetString("title"), node.GetDateTime("end_date")); } } NetworkMessageList.TipMessage(socket, "가천 빌리지에 오신것을 환영합니다!"); ToChatMessage("가천 빌리지에 오신것을 환영합니다!", ChatType.Notice); int NewMessage = PostSystem.GetNewMessageCount(ID); if (NewMessage > 0) { ToChatMessage("[우편함] " + NewMessage + "개의 읽지 않은 우편이 존재합니다!", ChatType.System); } }
/// <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); } } } } } } }
public override void Start() { base.Start(); // 해당 유저에게도 월드에 있는 다른 오브젝트 표시 foreach (GameObject item in GameObject.Items.Values) { if (item != this) { JObject json = item.InfoData(); json["type"] = NetworkProtocol.NewObject; socket.Send(json); } } // 인벤토리 로드 MysqlNode node = new MysqlNode(private_data.mysqlOption, "SELECT * FROM inventory_items WHERE student_id=?id"); node["id"] = ID; using (node.ExecuteReader()) { while (node.Read()) { JObject item = new JObject(); item["type"] = NetworkProtocol.Inventory_Add; item["no"] = node.GetInt("file_no"); item["size"] = node.GetInt("size"); item["name"] = node.GetString("name"); item["date"] = node.GetDateTime("date"); item["owner"] = node.GetString("owner"); socket.Send(item); } } NetworkMessageList.TipMessage(socket, "가천 빌리지에 오신것을 환영합니다!"); ToChatMessage("가천 빌리지에 오신것을 환영합니다!", ChatType.Notice); ToChatMessage("[컴퓨터 네트워크] 과목에 새로운 게시글이 등록되었습니다.", ChatType.System); ToChatMessage("이승화 : 귓속말 테스트~~~", ChatType.Whisper); ToChatMessage("위의 2개의 메세지는 디버그를 위해 출력되었습니다.", ChatType.Notice); int NewMessage = PostSystem.GetNewMessageCount(ID); if (NewMessage > 0) { ToChatMessage("[우편함] " + NewMessage + "개의 읽지 않은 우편이 존재합니다!", ChatType.System); } }
/// <summary> /// 해당 NPC가 유저에게 상호작용의 결과를 반환합니다. /// </summary> /// <param name="npc"></param> /// <param name="user"></param> public static void NPC_Action(NPC npc, User user) { //user.ToChatMessage(npc.function + "를 선택", ChatType.System); if (npc.function == "우편함 열기") { // 해당 유저에게 우편함 첫번째 페이지 전송 PostSystem.GetPage(user, 1); } if (npc.function == "키워드 알림 설정") { // 해당 유저에게 모든 키워드 목록 전송 KeywordSystem.GetList(user); } if (npc.function == "그룹 상호작용") { // 해당 유저에게 OpenMenu 실행 Study StudyGroup = (Study)npc; StudyGroup.OpenMenu(user); } }
/// <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 GetPage(User user, int page_no) { if (page_no < 1) { page_no = 1; } int newcount = PostSystem.GetNewMessageCount(user.ID); int count = PostSystem.GetMessageCount(user.ID); int all_page = 1; if (count == 0) { all_page = 1; } else { all_page = (count - 1) / 5 + 1; } if (page_no > all_page) { page_no = all_page; } MysqlNode mysqlNode = new MysqlNode(private_data.mysqlOption, "SELECT * FROM post_name where receiver=?id order by date desc limit " + ((page_no - 1) * 5) + ", 5"); mysqlNode["id"] = user.ID; JArray array = new JArray(); using (mysqlNode.ExecuteReader()) { while (mysqlNode.Read()) { JObject item = new JObject(); item["title"] = mysqlNode.GetString("title"); string content = WebSupport.ParseSupport.NoEnterString(mysqlNode.GetString("content")); if (content.Length < 20) { item["content"] = content; } else { item["content"] = content.Substring(0, 20) + "..."; } item["no"] = mysqlNode.GetInt("no"); item["sender"] = mysqlNode.GetString("sender_name"); DateTime date = mysqlNode.GetDateTime("date"); if (date.DayOfYear == DateTime.Now.DayOfYear) { item["date"] = date.ToString("HH:mm:ss"); } else { item["date"] = date.ToString("yyyy-MM-dd"); } item["read"] = mysqlNode.GetInt("read"); array.Add(item); } } JObject json = new JObject(); json["type"] = NetworkProtocol.Post_Open; json["items"] = array; json["newcount"] = newcount; json["count"] = count; json["page"] = page_no; json["all_page"] = all_page; user.socket.Send(json); }
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; } } }