yalcin-ata / godot-android-plugin-firebase

Godot 3.2.2 Android plugin for Firebase
44 stars 12 forks source link

This is not an Issue (C# Implementation solution) #4

Open lobinuxsoft opened 3 years ago

lobinuxsoft commented 3 years ago

This is my personal implementation, it is not finished but whoever wants to use this plugin in C # will be useful thanks @ yalcin-ata for creating this useful plugin for Godot.

using Godot;
using Godot.Collections;
using System;
using Object = Godot.Object;

public class FirebaseManager : Node
{
    public static FirebaseManager instance;
    private Object Firebase;
    bool initState = false;
    bool isBannerLoaded = false;
    Vector2 bannerSize = Vector2.Zero;
    bool isInterstitialLoaded = false;
    bool isRewardedVideoLoaded = false;
    float gameTimeScale = 0;
    public event FirebaseEvent<Vector2> onBannerActivity;

    uint lastConnectionTry = 0;

    // Called when the node enters the scene tree for the first time.
    public override void _Ready()
    {
        instance = this;

        if (OS.GetName() == "Android")
        {
            InitFirebase();
        }

        gameTimeScale = Engine.TimeScale;
    }

    public override void _Process(float delta)
    {
        if (OS.GetName() == "Android")
        {
            if (!initState)
            {
                if ((OS.GetTicksMsec() - lastConnectionTry) > 10)
                {
                    lastConnectionTry = OS.GetTicksMsec();
                    InitFirebase();
                }
            }
        }
    }

    private void InitFirebase()
    {

        if (Firebase != null)
        {
            Firebase.Call("init", GetInstanceId());
            initState = true;

             // Autentication
             if((bool)Firebase.Call("authentication_google_is_connected") == false){
                 Firebase.Call("authentication_google_sign_in");
             }
        }
        else
        {

            Firebase = Engine.GetSingleton("Firebase");
            Firebase.Call("init", GetInstanceId());
            initState = true;

             // Autentication
             if((bool)Firebase.Call("authentication_google_is_connected") == false){
                 Firebase.Call("authentication_google_sign_in");
             }
        }
    }

    //Firebase implementation
    public void _on_firebase_receive_message(string tag, string from, object key, object data)
    {

        GD.Print($"TAG: {tag} || From: {from} || Key: {key} || Data: {data}");

        switch (from)
        {
            case "AdMob":
                switch ($"{key}")
                {
                    case "Banner":
                        ReceivedBanner(data);
                        break;
                    case "Interstitial":
                        ReceivedInterstitial(data);
                        break;
                    case "RewardedVideo":
                        ReceivedRewardedVideo(data);
                        break;
                }
                break;
        }
    }

    public void AnalyticSendEvents(string eventName, Dictionary dictionary)
    {
        Firebase.Call("analytics_send_events", eventName, dictionary);
    }

    public void AnalyticsSendCustomEvent(string someKey, string someValue)
    {
        Firebase.Call("analytics_send_custom", someKey, someValue);
    }

    private void ReceivedBanner(object data)
    {
        /*
            tag=Firebase from=AdMob key=Banner data=on_ad_loaded
            tag=Firebase from=AdMob key=Banner data=on_ad_failed_to_load:errorCode
        */

        string dataStr = (string)data;

        string[] split = dataStr.Split(':');

        switch (split[0])
        {
            case "on_ad_loaded":
                isBannerLoaded = (bool)Firebase.Call("admob_banner_is_loaded");
                if (isBannerLoaded)
                {

                    // I send the banner measurements through an event.
                    var bz = (Dictionary)Firebase.Call("admob_banner_get_size");

                    var x = (int)bz["width"];
                    var y = (int)bz["height"];

                    //GD.Print($"Banner size x = {x} || Banner size y {y}");

                    Firebase.Call("admob_banner_show", true);
                    onBannerActivity?.Invoke(new Vector2(x, y));
                }
                break;
            case "on_ad_failed_to_load":
                // Send an event with the load failure
                isBannerLoaded = false;

                switch (split[1])
                {
                    case "0":
                        initState = false;
                        break;
                }
                GD.Print($"Banners error {split[1]}");

                Firebase.Call("admob_banner_show", false);
                onBannerActivity?.Invoke(Vector2.Zero);
                break;
        }
    }

    private void ReceivedInterstitial(object data)
    {
        /*
            tag=Firebase from=AdMob key=Interstitial data=on_ad_loaded
            tag=Firebase from=AdMob key=Interstitial data=on_ad_failed_to_load:errorCode
            tag=Firebase from=AdMob key=Interstitial data=on_ad_closed
        */

        string dataStr = (string)data;
        string[] split = dataStr.Split(':');

        switch (split[0])
        {
            case "on_ad_loaded":
                // Show and pause the game
                isInterstitialLoaded = true;
                break;
            case "on_ad_failed_to_load":
                // Send an event with the load failure
                switch (split[1])
                {
                    case "0":
                        initState = false;
                        break;
                }
                isInterstitialLoaded = false;
                break;
            case "on_ad_closed":
                // Reanudar el juego
                isInterstitialLoaded = false;
                break;
        }
    }

    private void ReceivedRewardedVideo(object data)
    {
        /*
            tag=Firebase from=AdMob key=RewardedVideo data={status:on_rewarded_ad_loaded, unit_id:ca-app-pub-AD_UNIT_ID}
            tag=Firebase from=AdMob key=RewardedVideo data={status:on_rewarded_ad_failed_to_load:errorCode, unit_id:ca-app-pub-AD_UNIT_ID}
            tag=Firebase from=AdMob key=RewardedVideo data={status:earned, rewardType, rewardAmount, unit_id:ca-app-pub-AD_UNIT_ID}
            tag=Firebase from=AdMob key=RewardedVideo data={status:closed, unit_id:ca-app-pub-AD_UNIT_ID}
        */

        Dictionary dataDict = (Dictionary)data;
        string status = (string)dataDict["status"];
        string[] split = status.Split(':');

        switch (split[0])
        {
            case "on_rewarded_ad_loaded":
                GD.Print($"Status = {split[0]}");
                isRewardedVideoLoaded = true;
                break;
            case "on_rewarded_ad_failed_to_load":
                switch (split[1])
                {
                    case "0":
                        initState = false;
                        break;
                }
                GD.Print($"Status = {split[0]}:{split[1]}");
                isRewardedVideoLoaded = false;
                break;
            case "earned":
                GD.Print($"Status = {split[0]}");
                isRewardedVideoLoaded = false;
                break;
            case "closed":
                GD.Print($"Status = {split[0]}");
                isRewardedVideoLoaded = false;
                break;
        }
    }
}

public delegate void FirebaseEvent<T>(T data);
detanaputra commented 3 years ago

thank you so much! i have been scratching my head since yesterday!

Lobinux commented 3 years ago

@detanaputra you're welcome.