unity/유니티 초보

Unity - firebase realtimeDatabase, auth를 이용한 채팅 구현해보기

rimugiri 2024. 8. 15. 16:40
728x90

전체코드는 이것이다

using Firebase.Auth;
using Firebase.Database;
using Firebase.Extensions;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;

namespace PKW_FireBaseTest
{
    public class FirebaseTest : MonoBehaviour
    {
        private FirebaseAuth _auth;
        private FirebaseUser _user;
        private bool _isInitialLoadComplete = false;
        public event Action<string, string> OnMessageReceived;
        private void Start()
        {
            Init();
        }
        public void Init()
        {
            Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task =>
            {
                var dependencyStatus = task.Result;
                if (dependencyStatus == Firebase.DependencyStatus.Available)
                {
                    FirebaseInit();
                }
                else
                {
                    UnityEngine.Debug.LogError(System.String.Format(
                      "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
                }
            });
        }

        public void FirebaseInit()
        {
            Debug.Log("Firebase Init");

            _auth = FirebaseAuth.DefaultInstance;
            _auth.StateChanged += AuthStateChanged;

            DatabaseReference _data = FirebaseDatabase.DefaultInstance.GetReference("ChatMessage");
            _data.LimitToLast(1).ChildAdded += (sender, e) =>
            {
                // 처음 synchronize 될 때는 데이터를 불러오지 않는다.
                if (!_isInitialLoadComplete)
                {
                    Debug.Log("Initial data load skipped.");
                    _isInitialLoadComplete = true;
                    return;
                }
                ShowMessages(sender, e);
            };
        }

        private void ShowMessages(object sender, ChildChangedEventArgs e)
        {
            DataSnapshot _message = e.Snapshot;
            if (_message == null)
            {
                return;
            }

            Debug.Log($"{_message.Key} : content : {_message.Child("content").Value} username : {_message.Child("username").Value}");
            OnMessageReceived?.Invoke(_message.Child("username").Value.ToString(), _message.Child("content").Value.ToString());
        }

        private void AuthStateChanged(object sender, EventArgs e)
        {
            FirebaseAuth senderAuth = sender as FirebaseAuth;
            if (senderAuth != null)
            {
                _user = senderAuth.CurrentUser;
                if (_user != null)
                {
                    Debug.Log(_user.UserId);
                }
            }
        }

        public void SignIn()
        {
            SignInTaskAysnc();
        }

        private Task SignInTaskAysnc()
        {
            return _auth.SignInAnonymouslyAsync().ContinueWithOnMainThread(task =>
            {
                if (task.IsCanceled)
                {
                    Debug.LogError("SignInAnonymouslyAsync was canceled.");
                    return;
                }
                if (task.IsCompleted)
                {
                    Debug.Log("SignInCompleted");
                    return;
                }
            });
        }

        public void SignOut()
        {
            _auth.SignOut();
            Debug.Log("SignOut");
        }
        public void GetDataBase()
        {
            DatabaseReference _data = FirebaseDatabase.DefaultInstance.GetReference("ChatMessage");
            _data.GetValueAsync().ContinueWithOnMainThread(task =>
            {
                if (task.IsFaulted)
                {
                    Debug.LogError("GetDataBase Error");
                    return;
                }
                else if (task.IsCompleted)
                {
                    DataSnapshot _snapShot = task.Result;
                    foreach (DataSnapshot _message in _snapShot.Children)
                    {
                        Debug.Log($"{_message.Key} : content : {_message.Child("content").Value} username : {_message.Child("username").Value}");
                    }
                }
            });
        }

        public void SendData(string _userName, string _content)
        {
            DatabaseReference _data = FirebaseDatabase.DefaultInstance.GetReference("ChatMessage");
            string _key = _data.Push().Key;
            Dictionary<string, object> _message = new Dictionary<string, object>
            {
                { "content", _content},
                { "username", _userName},
                { "timestamp", ServerValue.Timestamp },
            };

            Dictionary<string, object> _childUpdates = new Dictionary<string, object>()
            {
                {_key, _message }
            };

            _data.UpdateChildrenAsync(_childUpdates).ContinueWithOnMainThread(task =>
            {
                if (task.IsCompleted)
                {
                    Debug.Log("SendData Completed");
                    return;
                }
            });


        }
    }
}
728x90