Example #1
0
        async Task <TrackableUserContext> IUserInitiator.Create(IUserEventObserver observer, string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ResultException(ResultCodeType.ArgumentError);
            }

            // create context

            var userContext = new TrackableUserContext
            {
                Data = new TrackableUserData
                {
                    Name          = name.Trim(),
                    RegisterTime  = DateTime.UtcNow,
                    LastLoginTime = DateTime.UtcNow,
                    LoginCount    = 1,
                },
                Achivements = new TrackableDictionary <int, UserAchievement>()
            };

            await MongoDbStorage.UserContextMapper.CreateAsync(
                MongoDbStorage.Instance.UserCollection,
                userContext, _id);

            await OnUserInitiated(userContext, observer);

            return(userContext);
        }
Example #2
0
        async Task<TrackableUserContext> IUserInitiator.Create(IUserEventObserver observer, string name)
        {
            if (string.IsNullOrWhiteSpace(name))
                throw new ResultException(ResultCodeType.ArgumentError);

            // create context

            var userContext = new TrackableUserContext
            {
                Data = new TrackableUserData
                {
                    Name = name.Trim(),
                    RegisterTime = DateTime.UtcNow,
                    LastLoginTime = DateTime.UtcNow,
                    LoginCount = 1,
                },
                Achivements = new TrackableDictionary<int, UserAchievement>()
            };

            await MongoDbStorage.UserContextMapper.CreateAsync(
                MongoDbStorage.Instance.UserCollection,
                userContext, _id);

            await OnUserInitiated(userContext, observer);
            return userContext;
        }
Example #3
0
 public UserActor(ClusterNodeContext clusterContext, string id, IUserEventObserver observer)
 {
     _logger         = LogManager.GetLogger($"UserActor({id})");
     _clusterContext = clusterContext;
     _id             = id;
     _eventObserver  = (UserEventObserver)observer;
     _enteredRoomMap = new Dictionary <string, RoomRef>();
 }
        private async Task OnUserInitiated(TrackableUserContext userContext, IUserEventObserver observer)
        {
            _userContext = userContext.Clone();
            _userContext.SetDefaultTracker();
            _userContextSaveTracker = new TrackableUserContextTracker();
            _userEventObserver      = (UserEventObserver)observer;

            _channel.WithNoReply().UnbindType(Self, new[] { typeof(IUserInitiator) });
            await _channel.BindType(Self, new TaggedType[] { typeof(IUser) });
        }
        public static SurrogateForIUserEventObserver Convert(IUserEventObserver value)
        {
            if (value == null)
            {
                return(null);
            }
            var o = (UserEventObserver)value;

            return(new SurrogateForIUserEventObserver {
                Channel = o.Channel, ObserverId = o.ObserverId
            });
        }
Example #6
0
    public override void OnShow(object param)
    {
        _userEventObserver = (IUserEventObserver)param;

        var loginServer     = PlayerPrefs.GetString("LoginServer", "127.0.0.1:9001");
        var loginServerType = PlayerPrefs.GetString("LoginServerType", "Tcp");
        var loginId         = PlayerPrefs.GetString("LoginId", "test");
        var loginPassword   = PlayerPrefs.GetString("LoginPassword", "1234");

        ServerInput.text     = loginServer;
        ServerProtocol.value = ServerProtocol.options.FindIndex(v => v.text.Equals(loginServerType, StringComparison.OrdinalIgnoreCase));
        IdInput.text         = loginId;
        PasswordInput.text   = loginPassword;
    }
        async Task <TrackableUserContext> IUserInitiator.Load(IUserEventObserver observer)
        {
            // load context

            var userContext = (TrackableUserContext)(await RedisStorage.UserContextMapper.LoadAsync(RedisStorage.Db, "User_" + _id));

            if (userContext == null)
            {
                throw new ResultException(ResultCodeType.UserNeedToBeCreated);
            }

            await OnUserInitiated(userContext, observer);

            return(userContext);
        }
        async Task <TrackableUserContext> IUserInitiator.Create(IUserEventObserver observer, string nickname)
        {
            // create context

            var userContext = new TrackableUserContext
            {
                Data = new TrackableUserData
                {
                    Nickname     = nickname,
                    RegisterTime = DateTime.UtcNow,
                },
                Notes = new TrackableDictionary <int, string>()
            };
            await RedisStorage.UserContextMapper.CreateAsync(RedisStorage.Db, userContext, "User_" + _id);

            await OnUserInitiated(userContext, observer);

            return(userContext);
        }
Example #9
0
        async Task <TrackableUserContext> IUserInitiator.Load(IUserEventObserver observer)
        {
            // load context

            var userContext = (TrackableUserContext)await MongoDbStorage.UserContextMapper.LoadAsync(
                MongoDbStorage.Instance.UserCollection,
                _id);

            if (userContext == null)
            {
                throw new ResultException(ResultCodeType.UserNeedToBeCreated);
            }

            await OnUserInitiated(userContext, observer);

            // user post-login handler

            userContext.SetDefaultTracker();
            userContext.Data.LoginCount   += 1;
            userContext.Data.LastLoginTime = DateTime.UtcNow;
            userContext.Tracker.ApplyTo(_userContextSaveTracker);

            return(userContext);
        }
 public static SurrogateForIUserEventObserver Convert(IUserEventObserver value)
 {
     if (value == null) return null;
     var o = (UserEventObserver)value;
     return new SurrogateForIUserEventObserver { Channel = o.Channel, ObserverId = o.ObserverId };
 }
Example #11
0
        private async Task OnUserInitiated(TrackableUserContext userContext, IUserEventObserver observer)
        {
            _userContext = userContext.Clone();
            _userContext.SetDefaultTracker();
            _userContextSaveTracker = new TrackableUserContextTracker();

            _userEventObserver = (UserEventObserver)observer;

            _channel.WithNoReply().UnbindType(Self, new[] { typeof(IUserInitiator) });
            await _channel.BindType(Self, new TaggedType[] { typeof(IUser) });
        }
Example #12
0
        async Task<TrackableUserContext> IUserInitiator.Load(IUserEventObserver observer)
        {
            // load context

            var userContext = (TrackableUserContext)await MongoDbStorage.UserContextMapper.LoadAsync(
                MongoDbStorage.Instance.UserCollection,
                _id);
            if (userContext == null)
                throw new ResultException(ResultCodeType.UserNeedToBeCreated);

            await OnUserInitiated(userContext, observer);

            // user post-login handler

            userContext.SetDefaultTracker();
            userContext.Data.LoginCount += 1;
            userContext.Data.LastLoginTime = DateTime.UtcNow;
            userContext.Tracker.ApplyTo(_userContextSaveTracker);

            return userContext;
        }
Example #13
0
        async Task <IUser> IUserLogin.Login(string id, string password, IUserEventObserver observer)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ResultException(ResultCodeType.ArgumentError);
            }
            if (string.IsNullOrEmpty(password))
            {
                throw new ResultException(ResultCodeType.ArgumentError);
            }

            // check account

            if (_isInternalAccess == false)
            {
                if (id.ToLower().StartsWith("bot") || id.ToLower().StartsWith("test"))
                {
                    throw new ResultException(ResultCodeType.LoginFailedNoUser);
                }

                if (await Authenticator.AuthenticateAsync(id, password) == false)
                {
                    throw new ResultException(ResultCodeType.LoginFailedIncorrectPassword);
                }
            }
            else
            {
                if (id.ToLower().StartsWith("bot") == false && id.ToLower().StartsWith("test") == false)
                {
                    if (await Authenticator.AuthenticateAsync(id, password) == false)
                    {
                        throw new ResultException(ResultCodeType.LoginFailedIncorrectPassword);
                    }
                }
            }

            // try to create user actor with user-id

            var user = await _clusterContext.UserTable.WithTimeout(TimeSpan.FromSeconds(30)).GetOrCreate(id, new object[] { observer });

            if (user.Actor == null)
            {
                throw new ResultException(ResultCodeType.InternalError);
            }
            if (user.Created == false)
            {
                throw new ResultException(ResultCodeType.LoginFailedAlreadyConnected);
            }

            // bound actor to this channel or new channel on user gateway

            IRequestTarget boundTarget;

            try
            {
                boundTarget = await _channel.BindActorOrOpenChannel(
                    user.Actor, new TaggedType[] { typeof(IUser) },
                    ActorBindingFlags.OpenThenNotification | ActorBindingFlags.CloseThenStop | ActorBindingFlags.StopThenCloseChannel,
                    "UserGateway", null);
            }
            catch (Exception e)
            {
                _logger.Error($"BindActorOrOpenChannel error (UserId={id})", e);
                user.Actor.Tell(InterfacedPoisonPill.Instance);
                throw new ResultException(ResultCodeType.InternalError);
            }

            // once login done, stop this
            Self.Tell(InterfacedPoisonPill.Instance);

            return(boundTarget.Cast <UserRef>());
        }
Example #14
0
    private IEnumerator ProcessLogin(ChannelType channelType, string credential)
    {
        WriteLine(string.Format("ProcessLogin({0}, {1})", channelType, credential));

        // create communicator

        var communicator = UnityCommunicatorFactory.Create();
        {
            var channelFactory = communicator.ChannelFactory;
            channelFactory.Type                = channelType;
            channelFactory.ConnectEndPoint     = new IPEndPoint(IPAddress.Loopback, 9001);
            channelFactory.CreateChannelLogger = () => LogManager.GetLogger("Channel");
            channelFactory.PacketSerializer    = PacketSerializer.CreatePacketSerializer <DomainProtobufSerializer>();
        }

        var channel = communicator.CreateChannel();

        // connect to gateway

        var t0 = channel.ConnectAsync();

        yield return(t0.WaitHandle);

        if (t0.Exception != null)
        {
            WriteLine("Connection Failed: " + t0.Exception);
            yield break;
        }

        // login with an user-login actor

        var userLogin = channel.CreateRef <UserLoginRef>();
        var t1        = userLogin.Login("C123");

        yield return(t1.WaitHandle);

        if (t1.Exception != null)
        {
            WriteLine("Login Failed: " + t1.Exception);
            yield break;
        }

        // initiate user from user-initiator

        var userInitiator = (UserInitiatorRef)t1.Result.Item2;

        if (userInitiator.IsChannelConnected() == false)
        {
            yield return(userInitiator.ConnectChannelAsync().WaitHandle);
        }

        var observer = communicator.ObserverRegistry.Create <IUserEventObserver>(this);
        var t2       = userInitiator.Load(observer);

        yield return(t2.WaitHandle);

        if (t2.Exception != null)
        {
            WriteLine("Load Failed: " + t2.Exception);
            if (t2.Exception is ResultException && ((ResultException)t2.Exception).ResultCode == ResultCodeType.UserNeedToBeCreated)
            {
                var t3 = userInitiator.Create(observer, "Unity");
                yield return(t3.WaitHandle);

                if (t3.Exception != null)
                {
                    WriteLine("Create Failed: " + t3.Exception);
                    yield break;
                }
                _userContext = t3.Result;
            }
            else
            {
                yield break;
            }
        }
        else
        {
            _userContext = t2.Result;
        }

        _communicator = communicator;
        _user         = userInitiator.Cast <UserRef>();
        _userObserver = observer;

        var userJson = JsonConvert.SerializeObject(_userContext, s_jsonSerializerSettings);

        WriteLine(string.Format("UserLoaded: {0}]\n", userJson));
    }