/// <summary> /// 이 그룹에서 파일을 해당 유저의 인벤토리로 전송하고, 메세지를 표시합니다. /// </summary> /// <param name="user"></param> /// <param name="no"></param> public void FileDownload(User user, int no) { int level = GetLevel(user); if (GetLevel(user) < 1) { user.ToChatMessage("해당 그룹에서 파일을 다운로드할 권한이 없습니다.", ChatType.Notice); return; } if (user.HaveItem(no)) { NetworkMessageList.TipMessage(user.socket, "같은 파일이 이미 인벤토리에 존재합니다."); return; } if (!HaveItem(no)) { NetworkMessageList.TipMessage(user.socket, "요청하신 파일이 이 그룹에 존재하지 않습니다. (이미 삭제되었을 가능성이 있습니다)"); return; } bool result = user.AddFileItem(no); if (result) { NetworkMessageList.TipMessage(user.socket, "인벤토리에 파일이 복사되었습니다."); } else { NetworkMessageList.TipMessage(user.socket, "예기치 못한 오류로 인해 파일을 인벤토리에 복사하지 못했습니다."); } }
public static void AddItem(User user, string keyword) { keyword = keyword.Trim(); if (keyword.Length == 0) { NetworkMessageList.TipMessage(user.socket, "추가하실 키워드를 입력해주세요."); return; } MysqlNode node = new MysqlNode(private_data.mysqlOption, "INSERT INTO keyword(student_id, keyword) VALUES (?id, ?keyword)"); node["id"] = user.ID; node["keyword"] = keyword; int result = node.ExecuteNonQuery(); if (result != 1) { NetworkMessageList.TipMessage(user.socket, "이미 등록된 키워드입니다."); } else if (result == 0) { NetworkMessageList.TipMessage(user.socket, "오류로 인해 키워드 추가가 불가능합니다 (ERROR CODE : " + result + ")"); } else { user.ToChatMessage("[키워드] \"" + keyword + "\" 가 추가되었습니다.", ChatType.Notice); GetList(user); } }
public static void NewKeyword(ESocket socket, string keyword) { string id = GachonSocket.GetId(socket); if (id != null) { keyword = keyword.Trim(); if (keyword.Length == 0) { NetworkMessageList.TipMessage(socket, "추가하실 키워드를 입력해주세요."); return; } MysqlNode node = new MysqlNode(private_data.mysqlOption, "INSERT INTO keyword(student_id, keyword) VALUES (?id, ?keyword)"); node["id"] = id; node["keyword"] = keyword; int result = node.ExecuteNonQuery(); if (result != 1) { NetworkMessageList.TipMessage(socket, "이미 등록된 키워드입니다."); } else if (result == 0) { NetworkMessageList.TipMessage(socket, "오류로 인해 키워드 추가가 불가능합니다 (ERROR CODE : " + result + ")"); } else { NetworkMessageList.TipMessage(socket, "[키워드] \"" + keyword + "\" 가 추가되었습니다."); KeywordList(socket); } } }
/// <summary> /// 특정 유저가 파일을 그룹에 추가합니다. (파일은 이미 업로드된 상태) /// </summary> /// <param name="user">파일을 올릴 유저</param> /// <param name="no">파일 번호 (Mysql)</param> public void FileUpload(User user, int no) { // 해당 유저의 권한 체크 int level = GetLevel(user); if (GetLevel(user) < 1) { user.ToChatMessage("해당 그룹에 파일을 업로드할 권한이 없습니다.", ChatType.Notice); return; } if (!user.HaveItem(no)) // 해당 유저가 그 아이템(파일)을 정말 가지고 있는가 { NetworkMessageList.TipMessage(user.socket, "해당 파일이 인벤토리에 없어서 업로드에 실패했습니다."); return; } // Mysql에 파일 정보 추가 MysqlNode node = new MysqlNode(private_data.mysqlOption, "INSERT INTO group_file(group_name, file_no, upload_user) VALUES (?group_name, ?file_no, ?user)"); node["group_name"] = key; node["file_no"] = no; node["user"] = user.ID; int result = node.ExecuteNonQuery(); if (result > 0) { NetworkMessageList.TipMessage(user.socket, "파일을 스터디에 성공적으로 업로드했습니다."); OpenMenu(user, "File"); } else { NetworkMessageList.TipMessage(user.socket, "예기치 못한 오류로 업로드에 실패했습니다."); } }
public static void GetFile(ESocket socket, JObject message) { // 파일 다운로드는 게임에서만 지원 if (User.Items.ContainsKey(socket)) { User user = User.Items[socket]; // 요청한 파일, 우편이 실제 있는지 확인 MysqlNode node = new MysqlNode(private_data.mysqlOption, "SELECT 'true' FROM post WHERE no=?no and file=?file_no and receiver=?id"); node["no"] = (int)message["post_no"]; node["file_no"] = (int)message["file_no"]; node["id"] = user.ID; using (node.ExecuteReader()) { if (node.Read()) { if (user.AddFileItem((int)message["file_no"])) { NetworkMessageList.TipMessage(socket, "우편함의 첨부파일이 인벤토리에 추가되었습니다."); } else { NetworkMessageList.TipMessage(socket, "파일이 이미 인벤토리에 존재합니다."); } } else { NetworkMessageList.TipMessage(socket, "잘못된 요청입니다."); } } } }
public static void Login(ESocket socket, string id, string password, bool GameLogin = true) { #region 입력값이 비어있는지 체크 if (id.Trim() == "") { NetworkMessageList.TipMessage(socket, "아이디를 입력해주세요."); return; } if (password.Trim() == "") { NetworkMessageList.TipMessage(socket, "비밀번호를 입력해주세요."); return; } #endregion // 해당 입력값을 기준으로 GachonUser.GetObject 함수를 실행시킵니다. // 유효한 로그인일경우 GachonUser 클래스를 통해 실제 가천대 웹사이트와 세션이 연결되며, // 유효하지 않은 로그인일 경우 NULL값을 반환합니다. GachonUser gachonAccount = GachonUser.GetObject(id, password); if (gachonAccount == null) { NetworkMessageList.TipMessage(socket, "로그인에 실패했습니다."); return; } // 만약 게임에서 이 로그인을 요청한 경우 (안드로이드가 아닌) if (GameLogin) { // 게임 오브젝트로 관리될 새로운 User 클래스를 만들고, 소켓과 GachonUser 객체를 연결시킵니다. User user = null; try { user = new User(socket, gachonAccount); } catch (DuplicationError e) // User 클래스는 같은 GachonUser 에 대해 중복으로 생성될수 없기때문에 발생하는 에러입니다. { NetworkMessageList.TipMessage(socket, "이 계정은 다른 클라이언트에서 접속중입니다."); return; } // 유저의 위치를 임의값으로 설정 (시작 포인트) user.position = new Vector4(-69.30f, 5.33f, 47.17f, 0f); // 접속 성공 메세지 전송 JObject json = new JObject(); json["type"] = NetworkProtocol.EnterWorld; json["no"] = user.no; // 플레이어를 나타내는 객체가 무엇인지 알려준다. (서버에서 관리되는 고유 번호) socket.Send(json); } else { // 로그인 성공 메세지를 보내준다. JObject json = new JObject(); json["type"] = AndroidProtocol.Login; json["data"] = id + ":" + password; socket.Send(json); } // 가천 소켓에 이 세션을 연결시킨다. GachonSocket.Connect(socket, id, true); }
/// <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> 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); } }
public static void RemoveItem(User user, string keyword) { MysqlNode node = new MysqlNode(private_data.mysqlOption, "DELETE FROM keyword WHERE student_id=?id and keyword=?keyword"); node["id"] = user.ID; node["keyword"] = keyword; int result = node.ExecuteNonQuery(); if (result != 1) { NetworkMessageList.TipMessage(user.socket, "오류로 인해 키워드 삭제가 불가능합니다 (ERROR CODE : " + result + ")"); } else { user.ToChatMessage("[키워드] \"" + keyword + "\" 가 삭제되었습니다.", ChatType.Notice); GetList(user); } }
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> /// 특정 유저에게 그동안의 채팅 기록을 인벤토리로 전송합니다. /// </summary> /// <param name="user">파일을 받을 유저</param> public void SaveChatting(User user) { // 권한 체크 if (GetLevel(user) <= 0) { NetworkMessageList.TipMessage(user.socket, "권한이 부족합니다."); return; } // 파일 이름 . 그룹 이름에는 특수문자가 들어있을 수 있음 그렇기때문에 파일 이름에 그룹 이름을 추가하지 않음. string FileName = FileSystem.GetRandomName(user.ID + key); File.AppendAllText(FileName, GetChattingData()); // 파일 쓰기 // 서버에 새로운 파일 등록 long no = FileSystem.FileQuery(FileName, DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt", user); // 유저에게 해당 파일을 인벤토리로 전송 user.AddFileItem((int)no); NetworkMessageList.TipMessage(user.socket, "해당 그룹의 채팅 내용이 인벤토리의 TXT 파일로 저장되었습니다!"); }
public static void Login(ESocket socket, string id, string password) { if (id.Trim() == "") { NetworkMessageList.TipMessage(socket, "아이디를 입력해주세요."); return; } if (password.Trim() == "") { NetworkMessageList.TipMessage(socket, "비밀번호를 입력해주세요."); return; } GachonUser gachonAccount = GachonUser.GetObject(id, password); if (gachonAccount == null) { NetworkMessageList.TipMessage(socket, "로그인에 실패했습니다."); return; } User user = null; try { user = new User(socket, gachonAccount); } catch (DuplicationError e) { NetworkMessageList.TipMessage(socket, "이 계정은 다른 클라이언트에서 접속중입니다."); return; } GachonSocket.Connect(socket, id, true); user.position = new Vector4(-69.30f, 5.33f, 47.17f, 0f); JObject json = new JObject(); json["type"] = NetworkProtocol.EnterWorld; json["no"] = user.no; // 플레이어를 나타내는 객체가 무엇인지 알려준다. socket.Send(json); }
public static bool SendPost(ESocket socket, JObject message) { // 유효성 검사 string id = GachonSocket.GetId(socket); if (id == null) { NetworkMessageList.TipMessage(socket, "로그인 권한을 얻을 수 없습니다. 다시 접속해주세요."); return(false); } string title = ((string)message["title"]).Trim(); if (string.IsNullOrEmpty(title)) { NetworkMessageList.TipMessage(socket, "우편 제목을 입력해주세요."); return(false); } string content = ((string)message["content"]); if (string.IsNullOrEmpty(content)) { content = ""; // 우편 내용은 없어도 가능 } string receiver = ((string)message["receiver"]); if (string.IsNullOrEmpty(receiver)) { NetworkMessageList.TipMessage(socket, "받을 사람을 입력해주세요."); return(false); } string receiver_id = GachonLibrary.GachonUser.GetID(receiver); if (receiver_id == null) { NetworkMessageList.TipMessage(socket, "데이터베이스에서 해당 유저를 찾을 수 없습니다. (가천빌리지에 한번이라도 로그인 해야함)"); return(false); } else if (receiver_id == "") { NetworkMessageList.TipMessage(socket, "수신자가 중복으로 존재합니다. 이름 뿐만 아니라 학번 또는 아이디 정보를 입력하여 받는 사람을 정확히 지정해주세요."); return(false); } if (User.Items.ContainsKey(socket)) // 게임 접속 유저일경우 { User user = User.Items[socket]; int file_no = -1; if (message["file"] != null) { file_no = (int)message["file"]; if (!user.HaveItem(file_no)) { NetworkMessageList.TipMessage(socket, "해당 파일에 대한 권한이 없습니다. 인벤토리를 확인해주세요."); return(false); } } SendPost(title, content, id, receiver_id, true, file_no); NetworkMessageList.TipMessage(socket, "우편을 성공적으로 전송하였습니다."); GetPage(user, 1); // 우편 리스트를 보며주는 UI로 연결 return(true); } else // 게임 유저가 아닐경우 (안드로이드) { SendPost(title, content, id, receiver_id); return(true); } }
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_Connect(ESocket socket) { Console.WriteLine("로그인"); NetworkMessageList.TipMessage(socket, "서버에 연결되었습니다."); }