예제 #1
0
        /// <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);
                    }
                }
            }
        }
예제 #2
0
        /// <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, "오류로 인해 처리되지 않았습니다.");
            }
        }
예제 #3
0
 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);
     }
 }
예제 #4
0
        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;
            }
        }
예제 #5
0
        /// <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);
            }
        }
예제 #6
0
        /// <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);
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
 /// <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);
     }
 }
예제 #9
0
        /// <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);
            }
        }
예제 #10
0
        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);
        }
예제 #11
0
        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);
        }
예제 #12
0
        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;
                }
            }
        }