예제 #1
0
    public void EndGame()
    {
        if (isGameOver)
        {
            return;
        }

        StopAllCoroutines();
        isGameOver = true;

        var gd = GameData.instance;

        if (score > gd.bestScore)
        {
            isNewRecord  = true;
            gd.bestScore = score;
            SocialPlatform.ReportScore(score, success => {
                if (!success)
                {
                    PlayerPrefs.SetInt("UnreportedScore", score);
                    PlayerPrefs.Save();
                }
            });
        }
        else
        {
            isNewRecord = false;
        }

        SocialPlatform.CheckAchievements(score);
        gd.coins += m_Coins;
        gd.gamesPlayed++;

        m_EventDispatcher.Invoke(EventId.EndGame);
    }
예제 #2
0
    public void OnHomeClick()
    {
        Time.timeScale = 1.0f;

        var gd    = GameData.instance;
        var score = GameController.instance.score;
        var coins = GameController.instance.coins;

        if (score > gd.bestScore)
        {
            gd.bestScore = score;
            SocialPlatform.ReportScore(score, success => {
                if (!success)
                {
                    PlayerPrefs.SetInt("UnreportedScore", score);
                    PlayerPrefs.Save();
                }
            });
            SocialPlatform.CheckAchievements(score);
        }

        gd.coins += coins;

        SceneManager.LoadScene(SceneManager.GetActiveScene()
                               .buildIndex);
    }
예제 #3
0
        /// <summary>
        ///  获取授权token相关授权信息
        ///    todo 扩展每个AppId独立的加密秘钥
        /// </summary>
        /// <param name="newIdentity"></param>
        /// <param name="plat"></param>
        /// <returns></returns>
        private PortalTokenResp GeneratePortalToken(UserIdentity newIdentity, SocialPlatform plat)
        {
            var tenantId = CoreAppContext.Identity.tenant_id;
            var tokenStr = string.Concat(newIdentity.id, "|", tenantId, "|", (int)newIdentity.auth_type, "|", (int)plat, "|",
                                         NumHelper.RandomNum(6));

            var token = CoreUserContext.GetToken(_portalTokenSecret, tokenStr);

            return(new PortalTokenResp {
                token = token, data = newIdentity
            });
        }
예제 #4
0
        /// <summary>
        ///  根据第三方信息处理登录或注册
        ///     (如果未绑定过系统账号,根据配置处理是否默认注册绑定
        /// </summary>
        /// <param name="plat"></param>
        /// <param name="code"></param>
        /// <param name="state"></param>
        /// <param name="authType"></param>
        /// <returns></returns>
        private async Task <PortalTokenResp> OauthRegLogin(SocialPlatform plat, string code, string state, PortalAuthorizeType authType)
        {
            // 先获取第三方账号最新信息,更新至本地
            var oauthUserRes = await AddOrUpdateOauthUser(plat, code, state);

            if (!oauthUserRes.IsSuccess())
            {
                return(new PortalTokenResp().WithResp(oauthUserRes)); // oauthUserRes.ConvertToResultInherit<PortalTokenResp>();
            }
            // 【已绑定过的用户】   执行登录
            var oauthUser = oauthUserRes.data;

            if (oauthUser.owner_uid > 0)
            {
                //  尝试直接登录
                var userRes = await UserInfoRep.Instance.GetById(oauthUser.owner_uid);

                return(!userRes.IsSuccess()
                    ? new PortalTokenResp().WithResp(userRes)
                    : await LoginFinallyExecute(userRes.data, authType, false, plat));
            }

            //  管理员只能通过第三方绑定信息登录,如果没有,登录失败
            if (authType == PortalAuthorizeType.Admin)
            {
                return new PortalTokenResp()
                       {
                           ret = (int)RespTypes.ParaError, msg = "非管理员账号,登录失败!"
                       }
            }
            ;

            // 【已绑定过的用户】  根据系统配置,检查是否默认绑定注册
            var regConfig = GetOauthRegConfig();

            if (regConfig.OauthRegisterType == OauthRegisterType.JustRegister)
            {
                return(await OauthReg(oauthUser));
            }

            // 执行第三方临时授权,返回临时授权后通知前端,执行绑定相关操作
            oauthUser.status = regConfig.OauthRegisterType == OauthRegisterType.Bind
                ? UserStatus.WaitOauthBind
                : UserStatus.WaitOauthChooseBind;

            var ide = InitialOauthTempIdentity(oauthUser, plat);

            PortalEvents.TriggerOauthTempLoginEvent(ide.data, AppReqContext.Identity, plat);
            return(GeneratePortalToken(ide.data, plat));
        }
예제 #5
0
    private void Start()
    {
        SocialPlatform.Activate();

        Social.localUser.Authenticate(success =>
        {
            if (success)
            {
                LoadScore();
            }
            else
            {
                SceneManager.LoadScene("Main");
            }
        });
    }
예제 #6
0
        /// <summary>
        ///   添加或更新第三方授权用户信息
        /// </summary>
        /// <param name="plat"></param>
        /// <param name="code"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        private static async Task <Resp <OauthUserMo> > AddOrUpdateOauthUser(SocialPlatform plat, string code,
                                                                             string state)
        {
            var userWxRes = await GetOauthUserByCode(plat, code, state);

            if (!userWxRes.IsSuccess())
            {
                return(new Resp <OauthUserMo>().WithResp(userWxRes));
            }

            var userRes = await OauthUserRep.Instance.GetOauthUserByAppUserId(userWxRes.data.app_user_id, plat);

            if (userRes.IsSuccess())
            {
                //  如果存在,更新已有信息
                var user = userRes.data;

                user.SetInfoFromSocial(userWxRes.data);
                user.social_plat = plat;
                user.status      = UserStatus.Normal;

                await OauthUserRep.Instance.UpdateUserWithToken(user);

                return(new Resp <OauthUserMo>(user));
            }

            //  其他错误,直接返回
            if (!userRes.IsRespType(RespTypes.ObjectNull))
            {
                return(userRes);
            }

            // 如果是新授权用户,添加新的信息
            var newUser = new OauthUserMo();

            newUser.SetInfoFromSocial(userWxRes.data);

            var idRes = await OauthUserRep.Instance.Add(newUser);

            if (!idRes.IsSuccess())
            {
                return(new Resp <OauthUserMo>().WithResp(idRes.ret, "添加授权用户信息失败!")); // idRes.ConvertToResult<OauthUserMo>();
            }
            newUser.id = idRes.data;
            return(new Resp <OauthUserMo>(newUser));
        }
예제 #7
0
        public static OauthPlatform ToOauthPlat(this SocialPlatform oauthPlat)
        {
            switch (oauthPlat)
            {
            case SocialPlatform.WeChat:
                return(OauthPlatform.WeChat);

            case SocialPlatform.AliPay:
                return(OauthPlatform.AliPay);

            case SocialPlatform.Sina:
                return(OauthPlatform.Sina);

            case SocialPlatform.WeChatApp:
                return(OauthPlatform.WeChatApp);
            }
            throw new ArgumentException("正在获取一个未实现的Oauth平台接口!");
        }
예제 #8
0
        /// <summary>
        ///  系统用户主动绑定第三方平台
        /// 【当前MemberContext信息为 系统用户信息(User  or  admin)】
        /// </summary>
        /// <param name="plat"></param>
        /// <param name="code"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public async Task <Resp> OauthBind(SocialPlatform plat, string code, string state)
        {
            var oauthUserRes = await AddOrUpdateOauthUser(plat, code, state);

            if (!oauthUserRes.IsSuccess())
            {
                return(oauthUserRes);
            }

            var identityRes = await GetMyself();

            if (!identityRes.IsSuccess())
            {
                return(identityRes);
            }

            return(await OauthUserRep.Instance.BindUserIdByOauthId(oauthUserRes.data.id, identityRes.data.id.ToInt64()));
        }
예제 #9
0
    private void LoadScore()
    {
        var unreportedScore = 0;

        if (PlayerPrefs.HasKey("UnreportedScore"))
        {
            unreportedScore = PlayerPrefs.GetInt("UnreportedScore");
            PlayerPrefs.DeleteKey("UnreportedScore");
            PlayerPrefs.Save();
        }

        SocialPlatform.LoadMyScore(score =>
        {
            var prefsScore = GameData.instance.bestScore;

            var bestScore = Mathf.Max(unreportedScore, Mathf.Max(score, prefsScore));
            GameData.instance.bestScore = bestScore;

            if (PlayerPrefs.GetInt("ReportAchievementFailed", 0) == 1)
            {
                PlayerPrefs.DeleteKey("ReportAchievementFailed");
                PlayerPrefs.Save();
                SocialPlatform.CheckAchievements(bestScore);
            }

            if (unreportedScore > score)
            {
                SocialPlatform.ReportScore(bestScore, success =>
                {
                    if (!success)
                    {
                        PlayerPrefs.SetInt("UnreportedScore", bestScore);
                        PlayerPrefs.Save();
                    }

                    SceneManager.LoadScene("Main");
                });
            }
            else
            {
                SceneManager.LoadScene("Main");
            }
        });
    }
예제 #10
0
        /// <summary>
        ///     获取授权用户并更新信息
        /// </summary>
        /// <param name="plat"></param>
        /// <param name="code"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        private static async Task <Resp <OauthUser> > GetOauthUserByCode(SocialPlatform plat, string code,
                                                                         string state)
        {
            var handler  = GetOauthAdapter(plat);
            var tokenRes = await handler.GetOauthTokenAsync(code, state);

            if (!tokenRes.IsSuccess())
            {
                return(new Resp <OauthUser>().WithResp(tokenRes)); // tokenRes.ConvertToResult<OauthUserMo>();
            }
            var userWxRes = await handler.GetOauthUserAsync(tokenRes.data.access_token, tokenRes.data.app_user_id);

            if (!userWxRes.IsSuccess())
            {
                return(new Resp <OauthUser>().WithResp(tokenRes)); // tokenRes.ConvertToResult<OauthUserMo>();
            }
            userWxRes.data.SetTokenInfo(tokenRes.data);
            return(userWxRes);
        }
예제 #11
0
    public void OnConnectClick()
    {
        if (Social.localUser.authenticated)
        {
#if UNITY_ANDROID
            SocialPlatform.SignOut();
#endif

            OnLogInChanged();
        }
        else
        {
            Social.localUser.Authenticate(success =>
            {
                if (success)
                {
                    OnLogInChanged();
                }
            });
        }
    }
예제 #12
0
        private static Resp <UserIdentity> InitialUserIdentity(UserInfoBigMo user, SocialPlatform fromPlat)
        {
            user.pass_word = null; //  不可传出

            var checkRes = CheckIdentityStatus(user.status);

            if (!checkRes.IsSuccess())
            {
                return(new Resp <UserIdentity>().WithResp(checkRes));
            }

            var identity = new UserIdentity
            {
                id     = user.id.ToString(),
                name   = user.nick_name ?? user.mobile ?? user.email,
                avatar = user.avatar,
                //from_plat = (int) fromPlat,

                auth_type = PortalAuthorizeType.User
            };

            return(new Resp <UserIdentity>(identity));
        }
예제 #13
0
        private static Resp <UserIdentity> InitialAdminIdentity(AdminInfoMo admin, SocialPlatform fromPlat)
        {
            var checkRes = CheckIdentityStatus(admin.status);

            if (!checkRes.IsSuccess())
            {
                return(new Resp <UserIdentity>().WithResp(checkRes));
            }

            var identity = new UserIdentity
            {
                id     = admin.u_id.ToString(),    // 使用用户表的Id
                name   = admin.admin_name,
                avatar = admin.avatar,
                //from_plat = (int) fromPlat,

                auth_type = admin.admin_type == AdminType.Supper
                    ? PortalAuthorizeType.SuperAdmin
                    : PortalAuthorizeType.Admin
            };

            return(new Resp <UserIdentity>(identity));
        }
예제 #14
0
 /// <summary>
 ///  根据第三方用户编号获取本地授权信息
 /// </summary>
 /// <param name="appUId"></param>
 /// <param name="plat"></param>
 /// <returns></returns>
 public async Task <Resp <OauthUserMo> > GetOauthUserByAppUserId(string appUId, SocialPlatform plat)
 {
     return(await Get(u => u.app_user_id == appUId &&
                      u.owner_tid == OwnerTId &&
                      u.social_plat == plat));
 }
예제 #15
0
        private async Task <PortalTokenResp> RegFinallyExecute(UserInfoBigMo user, PortalAuthorizeType authType,
                                                               bool isFromBind = false, SocialPlatform plat = SocialPlatform.None)
        {
            var idRes = await UserInfoRep.Instance.Add(user);

            if (!idRes.IsSuccess())
            {
                return(new PortalTokenResp().WithResp(idRes));
            }

            if (isFromBind)
            {
                var bindRes = await BindTempOauthUserToUser(user.id);

                if (!bindRes.IsSuccess())
                {
                    return(new PortalTokenResp().WithResp(bindRes)); //bindRes;
                }
                plat = bindRes.data;
            }

            user.pass_word = null;
            var identity = new UserIdentity()
            {
                auth_type = authType,

                id     = user.id.ToString(),
                name   = user.nick_name,
                avatar = user.avatar
            };

            PortalEvents.TriggerRegisterEvent(identity, plat, CoreAppContext.Identity);
            return(GeneratePortalToken(identity, plat));

            ;
        }
예제 #16
0
 public static void TriggerRegisterEvent(UserIdentity identity, SocialPlatform plat, AppIdentity app)
 {
 }
예제 #17
0
 public static void TriggerLoginEvent(UserIdentity identity, AppIdentity app, SocialPlatform plat = SocialPlatform.None)
 {
     // todo  异步推送登录消息
     //return Task.CompletedTask;
     // var authType = (PortalAuthorizeType)identity.AuthenticationType;
 }
예제 #18
0
 public static void TriggerOauthTempLoginEvent(UserIdentity identity, AppIdentity app, SocialPlatform plat = SocialPlatform.None)
 {
 }
예제 #19
0
        private static async Task <Resp <UserIdentity> > GetAuthIdentityById(long userId,
                                                                             PortalAuthorizeType authType, SocialPlatform fromPlat)
        {
            Resp <UserIdentity> identityRes;

            switch (authType)
            {
            case PortalAuthorizeType.Admin:
            case PortalAuthorizeType.SuperAdmin:
                var adminRes = await AdminInfoRep.Instance.GetAdminByUId(userId);

                if (!adminRes.IsSuccess())
                {
                    return(new Resp <UserIdentity>().WithResp(RespTypes.UserUnLogin, "用户未登录!"));
                }

                identityRes = InitialAdminIdentity(adminRes.data, fromPlat);
                break;

            case PortalAuthorizeType.User:
                var userRes = await UserInfoRep.Instance.GetById(userId);

                if (!userRes.IsSuccess())
                {
                    return(new Resp <UserIdentity>().WithResp(RespTypes.UserUnLogin, "用户未登录!"));
                }

                identityRes = InitialUserIdentity(userRes.data, fromPlat);
                break;

            default:
                identityRes = new Resp <UserIdentity>().WithResp(RespTypes.UserUnLogin, "用户未登录!");
                break;
            }

            return(identityRes);
        }
예제 #20
0
        private async Task <PortalTokenResp> LoginFinallyExecute(UserInfoBigMo user,
                                                                 PortalAuthorizeType authType, bool isFromThirdBind = false, SocialPlatform plat = SocialPlatform.None)
        {
            Resp <UserIdentity> identityRes;

            switch (authType)
            {
            case PortalAuthorizeType.Admin:     //  登录时默认只有admin,不会出现 superAdmin

                var adminRes = await AdminInfoRep.Instance.GetAdminByUId(user.id);

                if (!adminRes.IsSuccess())
                {
                    return new PortalTokenResp()
                           {
                               ret = adminRes.ret, msg = "管理员账号/密码错误!"
                           }
                }
                ;

                identityRes = InitialAdminIdentity(adminRes.data, plat);
                break;

            case PortalAuthorizeType.User:
                identityRes = InitialUserIdentity(user, plat);
                break;

            default:
                return(new PortalTokenResp(RespTypes.ParaError, "账号/密码错误!"));
            }

            if (!identityRes.IsSuccess())
            {
                return(new PortalTokenResp().WithResp(identityRes));
            }

            if (isFromThirdBind)
            {
                var bindRes = await BindTempOauthUserToUser(user.id);

                if (!bindRes.IsSuccess())
                {
                    return(new PortalTokenResp().WithResp(bindRes));
                }

                plat = bindRes.data;
            }

            PortalEvents.TriggerLoginEvent(identityRes.data, CoreAppContext.Identity);
            return(GeneratePortalToken(identityRes.data, plat));
        }
예제 #21
0
 /// <summary>
 ///  获取oauth授权地址
 /// </summary>
 /// <param name="plat"></param>
 /// <param name="redirectUrl"></param>
 /// <param name="state"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 public Task <StrResp> GetOauthUrl(SocialPlatform plat, string redirectUrl, string state, OauthClientType type)
 {
     return(GetOauthAdapter(plat).GetOauthUrl(redirectUrl, state, type));
 }
예제 #22
0
 /// <summary>
 ///  通过第三方账号注册登录
 ///     如果没有绑定过用户,会根据系统配置,决定是否直接创建默认账户.
 ///     根据返回的auth_type,前端决定是否进入手动绑定账户页面
 /// </summary>
 /// <param name="plat"></param>
 /// <param name="code"></param>
 /// <param name="state"></param>
 /// <returns></returns>
 public Task <PortalTokenResp> OauthLogin(SocialPlatform plat, string code, string state)
 {
     return(OauthRegLogin(plat, code, state, PortalAuthorizeType.User));
 }
예제 #23
0
 private static IOauthAdapter GetOauthAdapter(SocialPlatform plat)
 {
     return(OauthAdapterHub.GetAdapter(plat.ToOauthPlat()));
 }
예제 #24
0
        private static Resp <UserIdentity> InitialOauthTempIdentity(OauthUserMo oauthUser, SocialPlatform fromPlat)
        {
            var checkRes = CheckIdentityStatus(oauthUser.status);

            if (!checkRes.IsSuccess())
            {
                return(new Resp <UserIdentity>().WithResp(checkRes));
            }

            // 当前是临时第三方信息,【Id】是第三方授权表的oauthId
            //  此场景是给用户授权后选择是否绑定已有账户页面使用
            var identity = new UserIdentity
            {
                id     = oauthUser.id.ToString(),
                name   = oauthUser.nick_name,
                avatar = oauthUser.head_img,
                //from_plat = (int) fromPlat,

                auth_type = PortalAuthorizeType.SocialAppUser,
            };

            return(new Resp <UserIdentity>(identity));
        }