본문 바로가기

Unity/뒤끝

[뒤끝 파헤치기] #15. 쪽지 기능

반응형

해당 강의는 PC환경에 최적화 된 글 입니다.

목록 바로가기

https://cheolmini.tistory.com/53

 

[뒤끝 파헤치기] #15. 쪽지 기능

뒤끝 파헤치기 열다섯번째 강의글 입니다.

 

동기, 비동기식으로 다른 유저에게 쪽지를 보내고, 나에게 온 쪽지를 읽고, 삭제를 해볼것입니다.


1. 뒤끝 콘솔 설정

 

뒤끝 콘솔 - 소셜 관리 - 설정

 

해당 옵션을 설정 해야지 오류가 발생하지 않습니다.

 

2. 예외처리 함수

 

참고만 해주세요

 

    void Error(string errorCode, string type)
    {
        if (errorCode == "DuplicatedParameterException")
        {
            if (type == "UserFunc") print("중복된 사용자 아이디 입니다.");
            else if (type == "UserNickname") print("중복된 닉네임 입니다.");
            else if (type == "Friend") print("이미 요청되었거나 친구입니다.");
        }
        else if (errorCode == "BadUnauthorizedException")
        {
            if (type == "UserFunc") print("잘못된 사용자 아이디 혹은 비밀번호 입니다.");
            else if (type == "Message") print("잘못된 닉네임입니다.");
        }
        else if (errorCode == "UndefinedParameterException")
        {
            if (type == "UserNickname") print("닉네임을 다시 입력해주세요");
        }
        else if (errorCode == "BadParameterException")
        {
            if (type == "UserNickname") print("닉네임 앞/뒤 공백이 있거나 20자 이상입니다.");
            else if (type == "UserPW") print("잘못된 이메일입니다.");
            else if (type == "gameData") print("잘못된 유형의 테이블 입니다.");
            else if (type == "Message") print("보내는 사람, 받는 사람이 같습니다.");
        }
        else if (errorCode == "NotFoundException")
        {
            if (type == "UserPW") print("등록된 이메일이 없습니다.");
            else if (type == "Coupon") print("중복 사용이거나 기간이 만료된 쿠폰입니다.");
            else if (type == "gameData") print("해당 테이블을 찾을 수 없습니다.");
        }
        else if (errorCode == "Too Many Request")
        {
            if (type == "UserPW") print("요청 횟수를 초과하였습니다. (1일 5회)");
        }
        else if (errorCode == "PreconditionFailed")
        {
            if (type == "gameData") print("해당 테이블은 비활성화 된 테이블 입니다.");
            else if (type == "Friend") print("받는 사람 혹은 보내는 사람의 요청갯수가 꽉 찬 상태입니다.");
            else if (type == "Message") print("설정한 글자수를 초과하였습니다.");
        }
        else if (errorCode == "ServerErrorException")
        {
            if (type == "gameData") print("하나의 row이 400KB를 넘습니다");
        }
        else if (errorCode == "ForbiddenError")
        {
            if (type == "gameData") print("타인의 정보는 삭제가 불가능합니다.");
            else if (type == "Message") print("콘솔에서 쪽지 최대보유수를 설정해주세요");
        }
        else if (errorCode == "MethodNotAllowedParameterException")
        {
            if (type == "Message") print("상대방의 쪽지가 가득 찾습니다.");
        }
    }

 



동기 방식


1. 쪽지 보내기

Backend.Social.Message.SendMessage("gamerIndate", "오늘 하루도 좋은 하루 보내");

 

상대방의 inDate 값을 통해 쪽지를 발송합니다.

 

getGammerIndate 함수는 아래 강의글에 있습니다.

 

https://cheolmini.tistory.com/69

 

  public void sendMessage()
    {
        BackendReturnObject BRO = Backend.Social.Message.SendMessage(getGammerIndate(messageNickname.text), messageContents.text);

        if (BRO.IsSuccess())
        {
            print($"{messageNickname.text}님께 동기 방식 쪽지 보내기 성공");
            messageNickname.text = "";
            messageContents.text = "";
        }
        else Error(BRO.GetErrorCode(), "Message");
    }

 

2. 보낸 쪽지 리스트 조회

 

Backend.Social.Message.GetSentMessageList();

 

보낸 쪽지의 리스트를 조회합니다.

 

이때 쪽지의 inDate 값을 저장합니다.

 

    public void getSendMessage()
    {
        BackendReturnObject BRO = Backend.Social.Message.GetSentMessageList();

        if (BRO.IsSuccess())
        {
            JsonData jsonData = BRO.GetReturnValuetoJSON()["rows"];

            for (int i = 0; i < jsonData.Count; i++)
            {
                JsonData Data = jsonData[i];

                string nickname = Data["receiverNickname"][0].ToString();
                string inDate = Data["inDate"][0].ToString();

                for (int j = 0; j < messageSendList.childCount; j++)
                {
                    if (!messageReceivedList.GetChild(j).gameObject.activeSelf)
                    {
                        messageSendList.GetChild(j).GetChild(1).GetComponent<Text>().text = nickname + "\n님께 보냄";
                        messageSendList.GetChild(j).GetChild(2).GetComponent<Text>().text = inDate;
                        messageSendList.GetChild(j).gameObject.SetActive(true);
                        break;
                    }
                }
            }
        }
    }

 

3. 보낸 쪽지 삭제

 

Backend.Social.Message.DeleteSentMessage("messageIndate");

 

저장한 쪽지의 inDate 값을 이용하여 해당 쪽지를 삭제합니다.

 

해당 리스트에서만 삭제됩니다.

 

    public void deleteSendMessage()
    {
        string inDate = EventSystem.current.currentSelectedGameObject.transform.parent.GetChild(2).GetComponent<Text>().text;

        BackendReturnObject BRO = Backend.Social.Message.DeleteSentMessage(inDate);

        if (BRO.IsSuccess())
        {
            EventSystem.current.currentSelectedGameObject.transform.parent.gameObject.SetActive(false);
            print("동기 방식 보낸 쪽지 삭제 완료");
        }
    }

 

4. 받은 쪽지 리스트 조회

 

Backend.Social.Message.GetReceivedMessageList();

 

받은 쪽지 리스트를 조회합니다.

 

이때 쪽지의 inDate 값을 저장합니다.

 

    public void getReceivedMessageAsync()
    {
        BackendAsyncClass.BackendAsync(Backend.Social.Message.GetReceivedMessageList, (callback) =>
        {
            if (callback.IsSuccess())
            {
                JsonData jsonData = callback.GetReturnValuetoJSON()["rows"];

                for (int i = 0; i < jsonData.Count; i++)
                {
                    JsonData Data = jsonData[i];

                    string nickname = Data["senderNickname"][0].ToString();
                    string inDate = Data["inDate"][0].ToString();

                    for (int j = 0; j < messageReceivedList.childCount; j++)
                    {
                        if (!messageReceivedList.GetChild(j).gameObject.activeSelf)
                        {
                            messageReceivedList.GetChild(j).GetChild(1).GetComponent<Text>().text = nickname + "\n님이 보냄";
                            messageReceivedList.GetChild(j).GetChild(2).GetComponent<Text>().text = inDate;
                            messageReceivedList.GetChild(j).gameObject.SetActive(true);
                            break;
                        }
                    }
                }
            }
        });
    }

 

5. 받은 쪽지 읽기

 

Backend.Social.Message.GetReceivedMessage("messageIndate");

 

각 쪽지별 저장한 inDate 값을 이용하여 쪽지를 읽습니다.

 

    public void readMessage()
    {
        string inDate = EventSystem.current.currentSelectedGameObject.transform.parent.GetChild(2).GetComponent<Text>().text;

        BackendReturnObject BRO = Backend.Social.Message.GetReceivedMessage(inDate);

        if (BRO.IsSuccess())
        {
            JsonData jsonData = BRO.GetReturnValuetoJSON()["row"];

            string nickname = jsonData["senderNickname"][0].ToString();
            string content = jsonData["content"][0].ToString();

            messageInfoObj.GetChild(2).GetComponent<Text>().text = $"{nickname} 님이 보냄";
            messageInfoObj.GetChild(3).GetComponent<Text>().text = content;

            messageInfoObj.gameObject.SetActive(true);

            print("동기 방식 쪽지 읽기 완료");
        }
    }

 

6. 받은 쪽지 삭제

 

Backend.Social.Message.DeleteReceivedMessage("messageIndate");

 

저장한 쪽지의 inDate 값을 이용하여 해당 쪽지를 삭제합니다.

 

해당 리스트에서만 삭제됩니다.

 

    public void deleteMessage()
    {
        string inDate = EventSystem.current.currentSelectedGameObject.transform.parent.GetChild(2).GetComponent<Text>().text;

        BackendReturnObject BRO = Backend.Social.Message.DeleteReceivedMessage(inDate);

        if (BRO.IsSuccess())
        {
            EventSystem.current.currentSelectedGameObject.transform.parent.gameObject.SetActive(false);
            print("동기 방식 삭제 완료");
        }
    }


비동기 방식


1. 쪽지 보내기

 

BackendAsyncClass.BackendAsync(Backend.Social.Message.SendMessage, "gamerIndate", "오늘 하루도 좋은 하루 보내", (callback) => { // 이후 처리 });

 

    public void sendMessageAsync()
    {
        BackendAsyncClass.BackendAsync(Backend.Social.Message.SendMessage, getGammerIndate(messageNickname.text), messageContents.text, (callback) =>
        {
            if (callback.IsSuccess())
            {
                print($"{messageNickname.text}님께 비동기 방식 쪽지 보내기 성공");
                messageNickname.text = "";
                messageContents.text = "";
            }
            else Error(callback.GetErrorCode(), "Message");
        });
    }

 

2. 보낸 쪽지 리스트 조회

 

Backend.Social.Message.GetSentMessageList((callback) => { // 이후 처리 });

 

    public void getSendMessageAsync()
    {
        BackendAsyncClass.BackendAsync(Backend.Social.Message.GetSentMessageList, (callback) =>
        {
            if (callback.IsSuccess())
            {
                JsonData jsonData = callback.GetReturnValuetoJSON()["rows"];

                for (int i = 0; i < jsonData.Count; i++)
                {
                    JsonData Data = jsonData[i];

                    string nickname = Data["receiverNickname"][0].ToString();
                    string inDate = Data["inDate"][0].ToString();

                    for (int j = 0; j < messageSendList.childCount; j++)
                    {
                        if (!messageReceivedList.GetChild(j).gameObject.activeSelf)
                        {
                            messageSendList.GetChild(j).GetChild(1).GetComponent<Text>().text = nickname + "\n님께 보냄";
                            messageSendList.GetChild(j).GetChild(2).GetComponent<Text>().text = inDate;
                            messageSendList.GetChild(j).gameObject.SetActive(true);
                            break;
                        }
                    }
                }
            }
        });
    }

 

3. 보낸 쪽지 삭제

 

BackendAsyncClass.BackendAsync(Backend.Social.Message.DeleteSentMessage, "messageIndate", (callback) => { // 이후 처리 });

 

    public void deleteSendMessage()
    {
        string inDate = EventSystem.current.currentSelectedGameObject.transform.parent.GetChild(2).GetComponent<Text>().text;

        BackendReturnObject BRO = Backend.Social.Message.DeleteSentMessage(inDate);

        if (BRO.IsSuccess())
        {
            EventSystem.current.currentSelectedGameObject.transform.parent.gameObject.SetActive(false);
            print("동기 방식 보낸 쪽지 삭제 완료");
        }
    }


4. 받은 쪽지 리스트 조회

 

BackendAsyncClass.BackendAsync(Backend.Social.Message.GetReceivedMessageList, (callback) => { // 이후 처리 });

 

    public void getReceivedMessageAsync()
    {
        BackendAsyncClass.BackendAsync(Backend.Social.Message.GetReceivedMessageList, (callback) =>
        {
            if (callback.IsSuccess())
            {
                JsonData jsonData = callback.GetReturnValuetoJSON()["rows"];

                for (int i = 0; i < jsonData.Count; i++)
                {
                    JsonData Data = jsonData[i];

                    string nickname = Data["senderNickname"][0].ToString();
                    string inDate = Data["inDate"][0].ToString();

                    for (int j = 0; j < messageReceivedList.childCount; j++)
                    {
                        if (!messageReceivedList.GetChild(j).gameObject.activeSelf)
                        {
                            messageReceivedList.GetChild(j).GetChild(1).GetComponent<Text>().text = nickname + "\n님이 보냄";
                            messageReceivedList.GetChild(j).GetChild(2).GetComponent<Text>().text = inDate;
                            messageReceivedList.GetChild(j).gameObject.SetActive(true);
                            break;
                        }
                    }
                }
            }
        });
    }


5. 받은 쪽지 읽기

 

BackendAsyncClass.BackendAsync(Backend.Social.Message.GetReceivedMessage, "messageIndate", (callback) => { // 이후 처리 });

 

    public void readMessageAsync()
    {
        string inDate = EventSystem.current.currentSelectedGameObject.transform.parent.GetChild(2).GetComponent<Text>().text;

        BackendAsyncClass.BackendAsync(Backend.Social.Message.GetReceivedMessage, inDate, (callback) =>
        {
            if (callback.IsSuccess())
            {
                JsonData jsonData = callback.GetReturnValuetoJSON()["row"];

                string nickname = jsonData["senderNickname"][0].ToString();
                string content = jsonData["content"][0].ToString();

                messageInfoObj.GetChild(2).GetComponent<Text>().text = $"{nickname} 님이 보냄";
                messageInfoObj.GetChild(3).GetComponent<Text>().text = content;

                messageInfoObj.gameObject.SetActive(true);

                print("비동기 방식 쪽지 읽기 완료");
            }
        });
    }


6. 받은 쪽지 삭제

 

BackendAsyncClass.BackendAsync(Backend.Social.Message.DeleteReceivedMessage, "messageIndate", (callback) => { // 이후 처리 });

 

    public void deleteMessage()
    {
        string inDate = EventSystem.current.currentSelectedGameObject.transform.parent.GetChild(2).GetComponent<Text>().text;

        BackendReturnObject BRO = Backend.Social.Message.DeleteReceivedMessage(inDate);

        if (BRO.IsSuccess())
        {
            EventSystem.current.currentSelectedGameObject.transform.parent.gameObject.SetActive(false);
            print("동기 방식 삭제 완료");
        }
    }

 


UI 구성하기

 

스크롤 뷰를 이용하여 쪽지의 리스트를 표현합니다.

 

 


결과

 

동기 방식 쪽지 보내기 및 삭제

 

동기 방식 쪽지 읽기 및 삭제

 

비동기 방식 쪽지 보내기 및 삭제

 

비동기 방식 쪽지 읽기 및 삭제

 


참고 글

 

https://developer.thebackend.io/unity3d/guide/social/message/

 

뒤끝 개발자

모바일 게임 서버를 쉽게 생성, 관리 할 수 있는 뒤끝의 개발자 사이트입니다.

developer.thebackend.io


모든 프로젝트는 깃 허브에 업데이트 할 예정입니다.

 

https://github.com/CM-Games/BackEnd

읽어 주셔서 감사합니다.

 

더보기

검색어

뒤끝베이스

뒤끝강좌

뒤끝

뒤끝매치

뒤끝챗

유니티뒤끝

백앤드

유니티백앤드

유니티서버

유니티데이터저장

뒤끝기초

뒤끝서버

반응형