private void RPCListener()
 {
     if (gameRoomKey != null)
     {
         FirebaseDBFacade.CreateTableChildAddedListener("RPCListener", reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_RPC));
     }
 }
 private void InitialStateListener()
 {
     if (gameRoomKey != null)
     {
         FirebaseDBFacade.CreateTableChildAddedListener("InitialStateListener", reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_INITITAL_STATE));
     }
 }
 public void AttackPhase(AttackModel param)
 {
     SetParam(MyConst.RPC_DATA_ATTACK, (param));
     GetLatestKey(2, delegate(string resultString) {
         FirebaseDBFacade.RunTransaction(reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_BATTLE_STATUS).Child(resultString), delegate(MutableData mutableData) {
             mutableData.Value = PhaseMutate(mutableData, MyConst.BATTLE_STATUS_ATTACK);
         });
     });
 }
 private void InitializeFirebase()
 {
     SystemLoadScreenController.Instance.StopLoadingScreen();
             #if UNITY_EDITOR
     // Set this before calling into the realtime database.
     FirebaseApp.DefaultInstance.SetEditorDatabaseUrl(MyConst.URL_FIREBASE_DATABASE);
             #endif
     SetReference();
     FirebaseDBFacade.CheckDBConnection(FirebaseDatabase.DefaultInstance.GetReferenceFromUrl(MyConst.URL_FIREBASE_DATABASE_CONNECTION));
 }
    public void SearchRoom(Action <bool> onResult)
    {
        searchingRoom = true;
        RPCDicObserver.AddObserver(this);
        RPCQueryObserver.AddObserver(this);
        //Order first to search fast
        FirebaseDBFacade.QueryTable("SearchRoom", roomReference.OrderByChild(MyConst.GAMEROOM_STATUS).EqualTo("0"));

        onSuccessMatchMake = onResult;
    }
    public void JoinRoom()
    {
        FirebaseDBFacade.RunTransaction(reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_STATUS), delegate(MutableData mutableData) {
            int playerCount = int.Parse(mutableData.Value.ToString());

            playerCount++;
            joinCounter++;

            mutableData.Value = playerCount.ToString();
        });

        StartCoroutine(StartJoinDelay());
    }
 public void AnswerPhase(string param)
 {
     GetLatestKey(1, delegate(string resultString) {
         FirebaseDBFacade.RunTransaction(reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_BATTLE_STATUS).Child(resultString), delegate(MutableData mutableData) {
             mutableData.Value = PhaseMutate(mutableData, MyConst.BATTLE_STATUS_ANSWER, delegate(Dictionary <string, System.Object> battleStatus, int battleCount) {
                 if (GameManager.isHost)
                 {
                     battleStatus [MyConst.RPC_DATA_PLAYER_ANSWER_PARAM] = param;
                 }
                 else
                 {
                     battleStatus [MyConst.RPC_DATA_ENEMY_ANSWER_PARAM] = param;
                 }
             });
         });
     });
 }
    //gets the latest push key from the database
    private void GetLatestKey(int numMod, Action <string> action)
    {
        FirebaseDBFacade.GetTableValueAsync(reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_BATTLE_STATUS), delegate(DataSnapshot dataSnapshot) {
            if (dataSnapshot != null)
            {
                Dictionary <string, System.Object> battleStatus = (Dictionary <string, System.Object>)dataSnapshot.Value;
                switch (numMod)
                {
                case 1:
                    LatestKeyCompute(battleStatus, 1, 1, action);
                    break;

                case 2:
                    LatestKeyCompute(battleStatus, 2, 0, action);
                    break;
                }
            }
        });
    }
    public void SetParam <T> (string objectName, T myObject)
    {
        string rpcKey = reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_RPC).Push().Key;

        Dictionary <string, System.Object> result = new Dictionary <string, System.Object> ();

        result [MyConst.RPC_DATA_USERHOME] = GameManager.isHost;


        Dictionary <string, System.Object> jsonResult = new Dictionary <string, System.Object> ();

        jsonResult [objectName]         = JsonUtility.ToJson(myObject);
        result [MyConst.RPC_DATA_PARAM] = jsonResult;


        string directory = "/" + MyConst.GAMEROOM_ROOM + "/" + gameRoomKey + "/" + MyConst.GAMEROOM_RPC + "/" + rpcKey;

        FirebaseDBFacade.CreateTableChildrenAsync(directory, reference, result);
    }
    public void UpdateBattleStatus(string stateName, int stateCount, string playerParam = "", string enemyParam = "")
    {
        Dictionary <string, System.Object> entryValues = new Dictionary <string, System.Object> ();

        entryValues.Add(MyConst.BATTLE_STATUS_STATE, stateName);
        entryValues.Add(MyConst.BATTLE_STATUS_COUNT, stateCount.ToString());
        if (!string.IsNullOrEmpty(playerParam))
        {
            entryValues.Add(MyConst.RPC_DATA_PLAYER_ANSWER_PARAM, playerParam);
        }

        if (!string.IsNullOrEmpty(enemyParam))
        {
            entryValues.Add(MyConst.RPC_DATA_ENEMY_ANSWER_PARAM, enemyParam);
        }

        battleStatusKey = reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_BATTLE_STATUS).Push().Key;
        string directory = "/" + MyConst.GAMEROOM_ROOM + "/" + gameRoomKey + "/" + MyConst.GAMEROOM_BATTLE_STATUS + "/" + battleStatusKey + "/";

        FirebaseDBFacade.CreateTableChildrenAsync(directory, reference, entryValues);
    }
    private void CheckInitialPhase()
    {
        FirebaseDBFacade.GetTableValueAsync(reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_BATTLE_STATUS), delegate(DataSnapshot dataSnapshot) {
            if (dataSnapshot.Value == null)
            {
                UpdateBattleStatus(MyConst.BATTLE_STATUS_ANSWER, 0, "0", "0");
            }
            else
            {
                Dictionary <string, System.Object> battleStatus = (Dictionary <string, System.Object>)dataSnapshot.Value;

                foreach (KeyValuePair <string, System.Object> battleKey in battleStatus)
                {
                    battleStatusKey = battleKey.Key;
                }
            }

            FirebaseDBFacade.CreateTableChildAddedListener("BattleStatusChildAdded", reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_BATTLE_STATUS));
            FirebaseDBFacade.CreateTableValueChangedListener("BattleStatusValueChanged", reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_BATTLE_STATUS));
        });
    }
 public void CancelRoomSearch()
 {
     if (!isMatchMakeSuccess)
     {
         if (GameManager.isHost)
         {
             DeleteRoom();
             GameManager.isHost = false;
             //return;
         }
     }
     RPCDicObserver.RemoveObserver(this);
     RPCQueryObserver.RemoveObserver(this);
     gameRoomKey   = null;
     searchingRoom = false;
     onSuccessMatchMake(false);
     FirebaseDBFacade.RemoveQuery("SearchRoom");
     FirebaseDBFacade.RemoveReference("InitialStateListener");
     FirebaseDBFacade.RemoveReference("BattleStatusValueChanged");
     FirebaseDBFacade.RemoveReference("BattleStatusChildAdded");
     FirebaseDBFacade.RemoveReference("RPCListener");
 }
    private void RoomCreateJoin(bool isHost, string userPlace)
    {
        GameManager.isHost = isHost;
        RPCListener();

        Dictionary <string, System.Object> result = new Dictionary <string, System.Object> ();

        result [MyConst.RPC_DATA_PLAYER] = JsonUtility.ToJson(MyConst.player);
        Dictionary <string, System.Object> entryValues = result;

        string directory = MyConst.GAMEROOM_ROOM + "/" + gameRoomKey + "/" + MyConst.GAMEROOM_INITITAL_STATE + "/" + userPlace + "/" + MyConst.RPC_DATA_PARAM + "/";

        FirebaseDBFacade.CreateTableChildrenAsync(directory, reference, entryValues);

        //set room status to open when create room
        if (isHost)
        {
            FirebaseDBFacade.SetTableValueAsync(reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey).Child(MyConst.GAMEROOM_STATUS), "0");
        }
        //set battle status to answer when start of game
        CheckInitialPhase();

        InitialStateListener();
    }
 private void DeleteRoom()
 {
     //add check room deleted successfully using childremove in fdfacade
     FirebaseDBFacade.RemoveTableValueAsync(reference.Child(MyConst.GAMEROOM_ROOM).Child(gameRoomKey));
 }
 private void CreateRoom()
 {
     gameRoomKey = FirebaseDBFacade.CreateKey(reference.Child(MyConst.GAMEROOM_ROOM));
     RoomCreateJoin(true, MyConst.GAMEROOM_HOME);
 }