Exemplo n.º 1
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary <byte, object>()
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, MessageSubCode.PullQueue },
            };

            var operation = new CreateQueueOperation(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                serverPeer.SendOperationResponse(new OperationResponse
                                                     (message.Code, para)
                {
                    ReturnCode = (int)ErrorCode.OperationInvalid, DebugMessage = "Create queue operation invalid"
                }, new SendParameters());
            }

            var instance = Util.GetCPlayerInstance(Server, message);

            var queueItemRequest = SerializeUtil.Deserialize <FightQueueListItem>(operation.fightInit);

            queueItemRequest.Creator = instance.Name;

            Fight newFight           = instance.CurrentFight;
            bool  wasAllowedNewFight = false;

            if (instance.CurrentFight == null)
            {
                newFight           = _fightManager.AddFight(queueItemRequest);
                wasAllowedNewFight = newFight.addPlayer(1, instance);                 //1 - red, 2 - blue teams
//			    IEffect effect = EffectCache.GetEffect(EffectEnum.INJURY);
//                Log.DebugFormat("Fetched effect of type: {0}", effect.GetType());
//                instance.Effects.Apply(effect);
            }

            //send response with refreshed queue list

            if (wasAllowedNewFight)
            {
                instance.SendPacket(new PulledQueuesPacket(_fightManager));
                foreach (var player in newFight.getPlayers.Values)
                {
                    player.SendPacket(new FightQueueParticipantsPacket(newFight));
                    Log.Debug(CLASSNAME + " - OnHandleMessage:: sending queue info back to client");
                }
            }
            else
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.AlreadyInFight,
                    DebugMessage = "Already queued/engaged in a fight",
                    Parameters   = para,
                }, new SendParameters());
                Log.Debug(CLASSNAME + " - OnHandleMessage:: was not allowed a new fight");
            }
            return(true);
        }
Exemplo n.º 2
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary <byte, object>
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, message.Parameters[(byte)ClientParameterCode.SubOperationCode] }
            };

            var operation = new PlayerMovementOperation(serverPeer.Protocol, message);

            //IF INCORRECT
            if (!operation.IsValid)
            {
                Log.ErrorFormat(operation.GetErrorMessage());
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage(),
                    Parameters   = para
                }, new SendParameters());
                return(true);
            }
            //WHEN CORRECT
            var instance       = Util.GetCPlayerInstance(Server, message);
            var playerMovement = ComplexServerCommon.SerializeUtil.Deserialize <PlayerMovement>(operation.PlayerMovement);

            //implement movement logic

            return(true);
        }
Exemplo n.º 3
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary <byte, object>()
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, MessageSubCode.PullQueue },
            };

            var instance = Util.GetCPlayerInstance(Server, message);
            var fight    = instance.CurrentFight;
            var success  = _fightManager.LeaveQueue(instance);

            if (success)
            {
                instance.SendPacket(new PulledQueuesPacket(_fightManager));
                if (fight != null)
                {
                    var fightParticipants = new FightQueueParticipantsPacket(fight);
                    foreach (var player in fight.getPlayers.Values)
                    {
                        player.SendPacket(new PulledQueuesPacket(_fightManager));
                        player.SendPacket(fightParticipants);
                    }
                }
            }
            else
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode = (int)ErrorCode.OperationInvalid, DebugMessage = "Cannot leave this queue", Parameters = para
                }, new SendParameters());
            }
            return(true);
        }
Exemplo n.º 4
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            OperationResponse operationResponse;

            if (serverPeer.ServerId.HasValue)
            {
                operationResponse = new OperationResponse(message.Code)
                {
                    ReturnCode = -1, DebugMessage = "Already Registered"
                };
            }
            else
            {
                var registerRequest = new RegisterSubServer(serverPeer.Protocol, message);
                if (!registerRequest.IsValid)
                {
                    string msg = registerRequest.GetErrorMessage();
                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("Invalid Register Request: {0}", msg);
                    }

                    operationResponse = new OperationResponse(message.Code)
                    {
                        DebugMessage = msg, ReturnCode = (short)ErrorCode.OperationInvalid
                    };
                }
                else
                {
                    var registerData = SerializeUtil.Deserialize <RegisterSubServerData>(registerRequest.RegisterSubServerOperation);
                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("Received register request: Address={0}, UdpPort={2}, TcpPort={1}, Type={3}",
                                        registerData.GameServerAddress, registerData.TcpPort, registerData.UdpPort, registerData.ServerType);
                    }
                    if (registerData.UdpPort.HasValue)
                    {
                        serverPeer.UdpAddress = registerData.GameServerAddress + ":" + registerData.UdpPort;
                    }
                    if (registerData.TcpPort.HasValue)
                    {
                        serverPeer.TcpAddress = registerData.GameServerAddress + ":" + registerData.TcpPort;
                    }
                    serverPeer.ServerId   = registerData.ServerId;
                    serverPeer.ServerType = registerData.ServerType;

                    serverPeer.ApplicationName = registerData.ApplicationName;
                    Server.ConnectionCollection <PhotonConnectionCollection>().OnConnect(serverPeer);
                    operationResponse = new OperationResponse(message.Code);
                }
            }
            serverPeer.SendOperationResponse(operationResponse, new SendParameters());
//			string FilePath = Path.Combine(Server.BinaryPath, "esquel.dar");
//			List<string> sqlsetup = File.ReadLines(FilePath).ToList();
//			Log.DebugFormat("{0}\n{1}\n{2}\n{3}", sqlsetup[0],sqlsetup[1],sqlsetup[1],sqlsetup[1]);
            return(true);
        }
Exemplo n.º 5
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            if (!message.Parameters.ContainsKey((byte)ClientParameterCode.Object))
            {
                DebugUtils.Logp(DebugUtils.Level.ERROR, CLASSNAME, "OnHandleMessage", "No StatAllocationData object passed. Exiting handler.");
                return(true);
            }

            var para = new Dictionary <byte, object>
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, message.Parameters[(byte)ClientParameterCode.SubOperationCode] }
            };

            var instance = Util.GetCPlayerInstance(Server, message);

            var statAllocData = SerializeUtil.Deserialize <StatAllocationData>(message.Parameters[(byte)ClientParameterCode.Object]);

            if (statAllocData.ResetPoints)
            {
                resetAllAllocatedStatPoints(instance);
            }
            else
            {
                foreach (var stat in statAllocData.Allocations)
                {
                    ((StatHolder)instance.Stats).SetStatByID(stat.Key, stat.Value);
                    instance.GetCharData <GeneralStats>().TotalAllocatedStats += stat.Value;
                    instance.Stats.AddToStat <StatPoints>(-stat.Value);
                }
            }

            var debugMessage = statAllocData.ResetPoints ? "Stats successfully reset!" : "Stats successfully added!";

            para.Add((byte)ClientParameterCode.Object, SerializeUtil.Serialize(instance.Stats.GetMainStatsForEnemy()));
            para.Add((byte)ClientParameterCode.StatsToAllocate, instance.Stats.GetStat <StatPoints>());

            serverPeer.SendOperationResponse(new OperationResponse(message.Code)
            {
                ReturnCode   = (int)ErrorCode.OK,
                DebugMessage = debugMessage,
                Parameters   = para
            }, new SendParameters());
            return(true);
        }
Exemplo n.º 6
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var instance = Util.GetCPlayerInstance(Server, message);
            var itemId   = Convert.ToInt32(message.Parameters[(byte)ClientParameterCode.ObjectId]);

            var item = instance.Items.UseItem(itemId) as Item;

            if (item.Effect == null)
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code, new Dictionary <byte, object> {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = "Item cannot be used"
                }, new SendParameters());

                return(true);
            }

            if (item != null)
            {
                switch (item.Effect.Type)
                {
                case EffectType.STATONLY:
                    instance.SendPacket(new UserInfoUpdatePacket(instance));
                    break;

                case EffectType.ONHIT:
                    break;

                case EffectType.MISC:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            return(true);
        }
        protected bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            OperationResponse operationResponse;

            if (serverPeer.Registered)
            {
                operationResponse = new OperationResponse(message.Code)
                {
                    ReturnCode   = (short)ErrorCode.InternalServerError,
                    DebugMessage = "Already registered"
                };
            }
            else
            {
                var registerRequest = new RegisterSubServer(serverPeer.protocol, message);

                if (!registerRequest.IsValid)
                {
                    string msg = registerRequest.GetErrorMessage();

                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("Invalid register request {0}", msg);
                    }

                    operationResponse = new OperationResponse(message.Code)
                    {
                        DebugMessage = msg, ReturnCode = (short)ErrorCode.OperationInvalid
                    };
                }
                else
                {
                    XmlSerializer mySerializer = new XmlSerializer(typeof(RegisterSubServerData));
                    StringReader  inStream     = new StringReader(registerRequest.RegisterSubServerOperation);
                    var           registerData = (RegisterSubServerData)mySerializer.Deserialize(inStream);

                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("Received register request: Address={0}, UdpPort={1}, TcpPort={2}, Type={3}",
                                        registerData.GameServerAddress, registerData.UdpPort, registerData.TcpPort, registerData.ServerType);
                    }

                    var serverData = serverPeer.ServerData <ServerData>();

                    if (serverData == null)
                    {
                        Log.DebugFormat("ServerData is NULL");
                    }

                    if (registerData.UdpPort.HasValue)
                    {
                        serverData.UdpAddress = registerData.GameServerAddress + ":" + registerData.UdpPort;
                    }

                    if (registerData.TcpPort.HasValue)
                    {
                        serverData.TcpAddress = registerData.GameServerAddress + ":" + registerData.TcpPort;
                    }

                    serverData.ServerId = registerData.ServerId;

                    serverData.ServerType = registerData.ServerType;

                    serverPeer.ServerType = _serverType.GetServerType(registerData.ServerType);

                    serverData.ApplicationName = registerData.ServerName;

                    Log.DebugFormat("ServerData: id={0} AppName={1} Type={2} | TCP: {3} UDP: {4}",
                                    serverData.ServerId, serverData.ApplicationName, serverData.ServerType,
                                    serverData.TcpAddress, serverData.UdpAddress);

                    operationResponse = new OperationResponse(message.Code, new Dictionary <byte, object>()
                    {
                        { _serverConfiguration.SubCodeParameterCode, 0 }
                    });

                    serverPeer.Registered = true;
                }
            }

            serverPeer.SendOperationResponse(operationResponse, new SendParameters());

            return(true);
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            Log.DebugFormat("On handle message called in handleserverregistration");
            OperationResponse operationResponse;
            if (serverPeer.ServerId.HasValue)
            {
                Log.DebugFormat("REGISTRATION EXISTS");
                operationResponse = new OperationResponse(message.Code)
                {
                    ReturnCode = -1,
                    DebugMessage = "Already registered."
                };
            }
            else
            {
                var registerRequest = new RegisterSubServer(serverPeer.Protocol, message);
                if (!registerRequest.IsValid)
                {
                    Log.DebugFormat("REGISTRATION NOT VALID");
                    string msg = registerRequest.GetErrorMessage();
                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("invalid register request {0}", msg);
                    }

                    operationResponse = new OperationResponse(message.Code)
                    {
                        DebugMessage = msg,
                        ReturnCode = (short) ErrorCode.OperationInvalid
                    };
                }
                else
                {
                    Log.DebugFormat("REGISTRATION VALID");

                    XmlSerializer mySerializer = new XmlSerializer(typeof(RegisterSubServerData));
                    StringReader inStream = new StringReader(registerRequest.RegisterSubServerOperation);
                    var registerData = (RegisterSubServerData)mySerializer.Deserialize(inStream);

                    if (Log.IsDebugEnabled)
                    {

                        Log.DebugFormat("Received register request: Address={0}, udptport={2}, tcport={1}, Type={3}",
                            registerData.GameServerAddress, registerData.TcpPort, registerData.UdpPort, registerData.ServerType);
                    }
                    if (registerData.UdpPort.HasValue)
                    {
                        serverPeer.UdpAddress = registerData.GameServerAddress + ":" + registerData.UdpPort;
                    }
                    if (registerData.TcpPort.HasValue)
                    {
                        serverPeer.TcpAddress = registerData.GameServerAddress + ":" + registerData.UdpPort;
                    }

                    serverPeer.ServerId = registerData.ServerId;
                    serverPeer.ServerType = registerData.ServerType;
                    serverPeer.ApplicationName = registerData.ApplicationName;
                    Server.ConnectionCollection<PhotonConnectionCollection>().OnConnect(serverPeer);
                    operationResponse = new OperationResponse(message.Code);
                }
            }
            serverPeer.SendOperationResponse(operationResponse, new SendParameters());
            return true;
        }
Exemplo n.º 9
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary <byte, object>()
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, MessageSubCode.Register },
            };

            var operation = new RegisterSecurely(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode = (int)ErrorCode.OperationInvalid, DebugMessage = operation.GetErrorMessage()
                }, new SendParameters());
                return(true);
            }


            if (operation.UserName == "" || operation.Email == "" || operation.Password == "")
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = "All fields are required!"
                }, new SendParameters());
                return(true);
            }

            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.Debug("About too look for user account");
                        var userList = session.QueryOver <User>().Where(u => u.UserName == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("Found account name already in use");
                            transaction.Commit();
                            serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                            {
                                ReturnCode   = (int)ErrorCode.UserNameInUse,
                                DebugMessage = "Account name already in use, please use another"
                            }, new SendParameters());
                            return(true);
                        }

                        string salt = Guid.NewGuid().ToString().Replace("-", "");
                        //Log.DebugFormat("Created salt {0}", salt);
                        User newUser = new User()
                        {
                            Email    = operation.Email,
                            UserName = operation.UserName,
                            Password =
                                BitConverter.ToString(SHA1CryptoServiceProvider.Create().ComputeHash(Encoding.UTF8.GetBytes(salt + operation.Password))).Replace("-", ""),
                            Salt      = salt,
                            Algorithm = "sha1",
                            Created   = DateTime.Now,
                            Updated   = DateTime.Now
                        };
                        session.Save(newUser);
                        Log.Debug("Saved new user " + operation.UserName);
                        transaction.Commit();
                    }
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.DebugFormat("Looking up newly created user");
                        var userList = session.QueryOver <User>().Where(u => u.UserName == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("Creating Profile");
                            UserProfile profile = new UserProfile()
                            {
                                CharacterSlots = 3, UserId = userList[0]
                            };
                            session.Save(profile);
                            Log.DebugFormat("Saved profile");
                            transaction.Commit();
                            serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                            {
                                ReturnCode = (byte)ClientReturnCode.UserCreated
                            }, new SendParameters());
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error("Error Occured", e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                {
                    ReturnCode   = (int)ErrorCode.UserNameInUse,
                    DebugMessage = e.ToString()
                },
                                                 new SendParameters());
            }
            return(true);
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            Log.DebugFormat("on handle in login server create character handler hit");
            var para = new Dictionary<byte, object>
            {
                {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]},
                {
                    (byte) ClientParameterCode.SubOperationCode,
                    message.Parameters[(byte) ClientParameterCode.SubOperationCode]
                }
            };
            var operation = new CreateCharacter(serverPeer.Protocol, message);
            if (!operation.IsValid)
            {
                Log.DebugFormat("operation invalid");
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                    {
                        ReturnCode = (int) ErrorCode.OperationInvalid,
                        DebugMessage = operation.GetErrorMessage(),
                        Parameters = para
                    }, new SendParameters());
                return true;
            }

            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        var user =
                            session.QueryOver<User>().Where(u => u.Id == operation.UserId).List().FirstOrDefault();
                        var profile =
                            session.QueryOver<UserProfile>().Where(up => up.UserId == user).List().FirstOrDefault();
                        var characters = session.QueryOver<ComplexCharacter>().Where(cc => cc.UserId == user).List();
                        if (profile != null && profile.CharacterSlots <= characters.Count)
                        {
                            Log.DebugFormat("profile invalid or no slots");
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                                {
                                    ReturnCode = (int) ErrorCode.InvalidCharacter,
                                    DebugMessage = "No free character slots",
                                    Parameters = para
                                }, new SendParameters());
                        }
                        else
                        {
                            var mySerializer = new XmlSerializer(typeof (CharacterCreateDetails));
                            var reader = new StringReader(operation.CharacterCreateDetails);
                            var createCharacter = (CharacterCreateDetails) mySerializer.Deserialize(reader);
                            var character =
                                session.QueryOver<ComplexCharacter>()
                                    .Where(cc => cc.Name == createCharacter.CharacterName).List().FirstOrDefault();
                            if (character != null)
                            {
                                Log.DebugFormat("null character");
                                transaction.Commit();
                                serverPeer.SendOperationResponse(
                                    new OperationResponse(message.Code)
                                    {
                                        ReturnCode = (int) ErrorCode.InvalidCharacter,
                                        DebugMessage = "Character name taken",
                                        Parameters = para
                                    }, new SendParameters());
                            }
                            else
                            {
                                Log.DebugFormat("creating character");
                                var newChar = new ComplexCharacter
                                {
                                    UserId = user,
                                    Name = createCharacter.CharacterName,
                                    Class = createCharacter.CharacterClass,
                                    Sex = createCharacter.Sex,
                                    Level = 1
                                };

                                session.Save(newChar);
                                transaction.Commit();
                                serverPeer.SendOperationResponse(
                                    new OperationResponse(message.Code)
                                    {
                                        ReturnCode = (int) ErrorCode.Ok,
                                        Parameters = para
                                    }, new SendParameters());
                            }
                        }
                    }
                }
                return true;
            }
            catch (Exception e)
            {
                Log.DebugFormat("invalid character");
                Log.Error(e);
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                    {
                        ReturnCode = (int) ErrorCode.InvalidCharacter,
                        DebugMessage = e.ToString(),
                        Parameters = para
                    }, new SendParameters());
            }
            return true;
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var operation = new ListCharacters(serverPeer.Protocol, message);
            if (!operation.IsValid)
            {
                Log.DebugFormat("operation is invalid");
                Log.DebugFormat("Invalid Operation - {0}", operation.GetErrorMessage());
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                    {
                        ReturnCode = (int) ErrorCode.OperationInvalid,
                        DebugMessage = operation.GetErrorMessage()
                    }, new SendParameters());
                return true;
            }
            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        var user =
                            session.QueryOver<User>().Where(u => u.Id == operation.UserId).List().FirstOrDefault();
                        if (user != null)
                        {
                            var profile =
                                session.QueryOver<UserProfile>().Where(up => up.UserId == user).List().FirstOrDefault();
                            if (profile != null)
                            {
                                var para = new Dictionary<byte, object>
                                {
                                    {(byte) ClientParameterCode.CharacterSlots, profile.CharacterSlots},
                                    {
                                        (byte) ClientParameterCode.PeerId,
                                        message.Parameters[(byte) ClientParameterCode.PeerId]
                                    },
                                    {
                                        (byte) ClientParameterCode.SubOperationCode,
                                        message.Parameters[(byte) ClientParameterCode.SubOperationCode]
                                    }
                                };
                                Log.DebugFormat("user id from operation is {0}", operation.UserId);
                                var characters =
                                    session.QueryOver<ComplexCharacter>().Where(cc => cc.UserId == user).List();
                                XmlSerializer characterSerializer = new XmlSerializer(typeof(CharacterListItem));

                                Hashtable characterList = new Hashtable();
                                Log.DebugFormat("characterlist count = {0}", characterList.Count);
                                foreach (var complexCharacter in characters)
                                {
                                    StringWriter outStream = new StringWriter();
                                    characterSerializer.Serialize(outStream, complexCharacter.BuilderCharacterListItem());
                                    characterList.Add(complexCharacter.Id, outStream.ToString());
                                }

                                para.Add((byte)ClientParameterCode.CharacterList, characterList);

                                transaction.Commit();

                                Log.DebugFormat("sending op response");
                                serverPeer.SendOperationResponse(
                                    new OperationResponse(message.Code, para) {ReturnCode = (byte) ErrorCode.Ok},
                                    new SendParameters());

            //                                serverPeer.SendOperationResponse(
                                //                                  new OperationResponse((byte) ClientOperationCode.Login) {Parameters = para},
                                //                                new SendParameters());
                            }
                            else
                            {
                                serverPeer.SendOperationResponse(
                                    new OperationResponse(message.Code)
                                    {
                                        ReturnCode = (int) ErrorCode.OperationInvalid,
                                        DebugMessage = "Profile not found"
                                    }, new SendParameters());
                            }
                        }
                        else
                        {
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                                {
                                    ReturnCode = (int) ErrorCode.OperationInvalid,
                                    DebugMessage = "User not found"
                                }, new SendParameters());
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e.Message);
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                    {
                        ReturnCode = (int) ErrorCode.OperationInvalid,
                        DebugMessage = e.ToString()
                    }, new SendParameters());
            }
            return true;
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            Log.DebugFormat("Login message being handled message code {0}", message.Code);
            var operation = new LoginSecurely(serverPeer.Protocol, message);
            if (!operation.IsValid)
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                    new Dictionary<byte, object>
                    {
                        {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]}
                    })
                {
                    ReturnCode = (int) ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage()
                }, new SendParameters());
                return true;
            }

            if (operation.UserName == "" | operation.Password == "")
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                    new Dictionary<byte, object>
                    {
                        {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]}
                    })
                {
                    ReturnCode = (int) ErrorCode.IncorrectUserNameOrPassword,
                    DebugMessage = "User name or password is incorrect"
                }, new SendParameters());
                return true;
            }
            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.DebugFormat("about to look for user account {0}", operation.UserName);
                        var userList = session.QueryOver<User>().Where(u => u.Username == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("found user {0} in database", operation.UserName);
                            var user = userList[0];
                            var hash = BitConverter.ToString(SHA1.Create().ComputeHash(
                                Encoding.UTF8.GetBytes(user.Salt + operation.Password)))
                                .Replace("-", "");
                            Log.DebugFormat("original pass {0}", hash.Trim());
                            Log.DebugFormat("login pass {0}", user.Password.Trim());

                            if (String.Equals(hash.Trim(), user.Password.Trim(), StringComparison.OrdinalIgnoreCase))
                            {
                                LoginServer server = Server as LoginServer;
                                if (server != null)
                                {
                                    bool founduser = false;
                                    foreach (var subServerClientPeer in server.ConnectionCollection<SubServerConnectionCollection>().Clients)
                                    {
                                        if (subServerClientPeer.Value.ClientData<CharacterData>().UserId == user.Id)
                                        {
                                            founduser = true;
                                        }
                                    }
                                    if (founduser)
                                    {
                                        Log.DebugFormat("user is already logged in");
                                        var para = new Dictionary<byte, object>
                                        {
                                            {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]},
                                            {(byte) ClientParameterCode.SubOperationCode, message.Parameters[(byte) ClientParameterCode.SubOperationCode]}
                                        };
                                        serverPeer.SendOperationResponse(
                                            new OperationResponse((byte) ClientOperationCode.Login)
                                            {
                                                Parameters = para,
                                                ReturnCode = (short) ErrorCode.UserCurrentlyLoggedIn,
                                                DebugMessage = "User is currently logged in."
                                            }, new SendParameters());
                                    }
                                    else
                                    {
                                        Log.Debug("Login handler successfully found character to log in.");

                                        server.ConnectionCollection<SubServerConnectionCollection>().Clients.Add(new Guid((Byte[]) message.Parameters[(byte) ClientParameterCode.PeerId]), _clientFactory());
                                        server.ConnectionCollection<SubServerConnectionCollection>().Clients[new Guid((Byte[])message.Parameters[(byte)ClientParameterCode.PeerId])].ClientData<CharacterData>().UserId = user.Id;
                                        var para = new Dictionary<byte, object>
                                        {
                                            {
                                                (byte) ClientParameterCode.PeerId,
                                                message.Parameters[(byte) ClientParameterCode.PeerId]
                                            },
                                            {
                                                (byte) ClientParameterCode.SubOperationCode,
                                                message.Parameters[(byte) ClientParameterCode.SubOperationCode]
                                            },
                                            {(byte) ClientParameterCode.UserId, user.Id}
                                        };
                                        serverPeer.SendOperationResponse(
                                            new OperationResponse((byte) ClientOperationCode.Login) {Parameters = para},
                                            new SendParameters());
                                    }
                                }
                                return true;
                            }
                            Log.Debug("password does not match.");

                            serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                new Dictionary<byte, object>
                                {
                                    {
                                        (byte) ClientParameterCode.PeerId,
                                        message.Parameters[(byte) ClientParameterCode.PeerId]
                                    }
                                })
                            {
                                ReturnCode = (int) ErrorCode.IncorrectUserNameOrPassword,
                                DebugMessage = "User name or password is incorrect"
                            }, new SendParameters());
                            return true;
                        }
                        Log.DebugFormat("Account name does not exist {0}", operation.UserName);
                        transaction.Commit();
                        serverPeer.SendOperationResponse(
                            new OperationResponse(message.Code)
                            {
                                ReturnCode = (int) ErrorCode.IncorrectUserNameOrPassword,
                                DebugMessage = "User name or password is incorrect."
                            }, new SendParameters());
                        return true;
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error("Error Occured", e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                    new Dictionary<byte, object>
                    {
                        {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]}
                    })
                {
                    ReturnCode = (int) ErrorCode.IncorrectUserNameOrPassword,
                    //remove debug msg later
                    DebugMessage = e.ToString()
                }, new SendParameters());
            }
            return true;
        }
Exemplo n.º 13
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary <byte, object>
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, message.Parameters[(byte)ClientParameterCode.SubOperationCode] }
            };

            var operation = new CreateCharacter(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                Log.Error(operation.GetErrorMessage());
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage(),
                    Parameters   = para
                }, new SendParameters());
                return(true);
            }

            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        var user       = session.QueryOver <User>().Where(u => u.Id == operation.UserId).List().FirstOrDefault();
                        var profile    = session.QueryOver <UserProfile>().Where(up => up.UserId == user).List().FirstOrDefault();
                        var characters = session.QueryOver <ComplexCharacter>().Where(cc => cc.UserId == user).List();

                        if (profile != null && profile.CharacterSlots <= characters.Count)
                        {
                            serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                            {
                                ReturnCode = (int)ErrorCode.InvalidCharacter, DebugMessage = "No free character slots", Parameters = para
                            }, new SendParameters());
                        }
                        else
                        {
                            var createCharacter = SerializeUtil.Deserialize <CharacterCreateDetails>(operation.CharacterCreateDetails);
                            Server.Log.DebugFormat("NEW CHAR: NAME: {0} / SEX: {1} / CLASS: {2}", createCharacter.CharacterName, createCharacter.Sex, createCharacter.CharacterClass);
                            var character = session.QueryOver <ComplexCharacter>().Where(cc => cc.Name == createCharacter.CharacterName).List().FirstOrDefault();
                            if (character != null)
                            {
                                transaction.Commit();
                                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                                {
                                    ReturnCode = (int)ErrorCode.InvalidCharacter, DebugMessage = "Character name taken", Parameters = para
                                }, new SendParameters());
                            }
                            else
                            {
                                var newChar = new ComplexCharacter()
                                {
                                    UserId = user,
                                    Name   = createCharacter.CharacterName,
                                    Class  = createCharacter.CharacterClass,
                                    Sex    = createCharacter.Sex,
                                    Level  = 0,
                                };
                                session.Save(newChar);
                                transaction.Commit();
                                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                                {
                                    ReturnCode = (int)ErrorCode.OK, DebugMessage = "Character successfuly created", Parameters = para
                                }, new SendParameters());
                            }
                        }
                    }
                }
                return(true);
            }

            catch (Exception e)
            {
                Log.Error(e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode = (int)ErrorCode.InvalidCharacter, DebugMessage = e.ToString(), Parameters = para
                }, new SendParameters());
            }
            return(true);
        }
Exemplo n.º 14
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary <byte, object>
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, message.Parameters[(byte)ClientParameterCode.SubOperationCode] },
            };

            var operation = new LoginSecurely(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code, new Dictionary <byte, object> {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage()
                }, new SendParameters());

                return(true);
            }

            if (operation.UserName == "" || operation.Password == "")
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                {
                    ReturnCode   = (int)ErrorCode.UserNamePasswordInvalid,
                    DebugMessage = "Username or password is incorrect"
                }, new SendParameters());
                return(true);
            }

            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.Debug("About to look for user account " + operation.UserName);
                        var userList = session.QueryOver <User>().Where(u => u.UserName == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            User user = userList[0];
                            var  hash = BitConverter.ToString(SHA1CryptoServiceProvider.Create()
                                                              .ComputeHash(Encoding.UTF8.GetBytes(user.Salt + operation.Password)))
                                        .Replace("-", "");
                            if (String.Equals(hash.Trim(), user.Password.Trim(), StringComparison.OrdinalIgnoreCase))
                            {
                                LoginServer server = Server as LoginServer;
                                if (server != null)
                                {
                                    //check if user is already logged in
                                    bool founduser = false;
                                    foreach (var subServerClientPeer in server.ConnectionCollection <SubServerConnectionCollection>().Clients)
                                    {
                                        if (subServerClientPeer.Value.ClientData <CharacterData>().UserId == user.Id)
                                        {
                                            founduser = true;
                                        }
                                    }

                                    if (founduser)
                                    {
                                        serverPeer.SendOperationResponse(new OperationResponse((byte)ClientOperationCode.Login)
                                        {
                                            Parameters = para, ReturnCode = (short)ErrorCode.UserCurrentlyLoggedIn, DebugMessage = "User is currently logged in"
                                        }, new SendParameters());
                                    }
                                    else                                     //if not logged in - allow log in and add to Client dictionaries
                                    {
                                        server.ConnectionCollection <SubServerConnectionCollection>().Clients.Add(new Guid((Byte[])message.Parameters[(byte)ClientParameterCode.PeerId]), _clientFactory(new Guid((Byte[])message.Parameters[(byte)ClientParameterCode.PeerId])));
                                        server.ConnectionCollection <SubServerConnectionCollection>().Clients[new Guid((Byte[])message.Parameters[(byte)ClientParameterCode.PeerId])].ClientData <CharacterData>().UserId = user.Id;
                                        Log.Debug("Login Handler sucessfully found character to log in.");

                                        para.Add((byte)ClientParameterCode.UserId, user.Id);

                                        serverPeer.SendOperationResponse(new OperationResponse((byte)ClientOperationCode.Login)
                                        {
                                            Parameters = para
                                        }, new SendParameters());
                                    }
                                }
                                return(true);
                            }
                            else
                            {
                                serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                                {
                                    ReturnCode   = (int)ErrorCode.UserNamePasswordInvalid,
                                    DebugMessage = "Username or password is incorrect"
                                }, new SendParameters());
                                //Log.DebugFormat("server: {0}", serverPeer.ApplicationName);
                                return(true);
                            }
                        }
                        else
                        {
                            Log.DebugFormat("Account name does not exist {0}", operation.UserName);
                            transaction.Commit();                             //closing transaction
                            serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                            {
                                ReturnCode   = (int)ErrorCode.UserNamePasswordInvalid,
                                DebugMessage = "Username or password is incorrect"
                            }, new SendParameters());

                            return(true);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error("Error Occured", e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code, para)
                {
                    ReturnCode   = (int)ErrorCode.UserNameInUse,
                    DebugMessage = e.ToString()
                }, new SendParameters());
            }
            return(true);
        }
Exemplo n.º 15
0
        protected bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            OperationResponse operationResponse;

            // we are already registered, tell the subserver it tried to reiogster more than once
            if (serverPeer.Registered)
            {
                operationResponse = new OperationResponse(message.Code)
                {
                    ReturnCode = (short)ErrorCode.InternalServerError, DebugMessage = "Already Registered"
                };
            }
            else
            {
                var registerRequest = new RegisterSubServer(serverPeer.Protocol, message);

                // Register sub server operation is bad, something is missing, etc....
                if (!registerRequest.IsValid)
                {
                    string msg = registerRequest.GetErrorMessage();
                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("Invalid Register request {0}", msg);
                    }

                    operationResponse = new OperationResponse(message.code)
                    {
                        DebugMessage = msg, ReturnCode = (short)ErrorCode.OperationInvalid
                    };
                }
                else
                {
                    // valid message, not registered process the registration.
                    XmlSerializer mySerializer = new XmlSerializer(typeof(RegisterSubServerData));
                    StringReader  inStream     = new StringReader(registerRequest.RegisterSubServerOperation);
                    var           registerData = (RegisterSubServerData)mySerializer.Deserialize((inStream));

                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("Received register request: Address ={0}, Udpport={1}, Tcpport={2}, Type={3}",
                                        registerData.GameServerAddress, registerData.UdpPort, registerData.TcpPort,
                                        registerData.ServerType);
                    }

                    var serverData = serverPeer.ServerData <ServerData>();
                    if (serverData == null)
                    {
                        // Autofac Doesnt have a reference to serverData so it doesnt exist in the server Iserverdata list
                        Log.DebugFormat("ServerData is null...");
                    }

                    if (registerData.UdpPort.HasValue)
                    {
                        serverData.UdpAddress = registerData.GameServerAddress + ":" + registerData.UdpPort;
                    }

                    if (registerData.TcpPort.HasValue)
                    {
                        serverData.TcpAddress = registerData.GameServerAddress + ":" + registerData.TcpPort;
                    }

                    // setting server ID
                    serverData.ServerId = registerData.ServerId;
                    // setting server type
                    serverData.ServerType = registerData.ServerType;
                    // looking up the server type for the server peer
                    serverPeer.ServerType = _serverType.GetServerType(registerData.ServerType);
                    // setting application name
                    serverData.ApplicationName = registerData.ServerName;

                    operationResponse = new OperationResponse(message.Code);

                    serverPeer.Registered = true;
                }
            }

            serverPeer.SendOperationResponse(operationResponse, new SendParameters());
            return(true);
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var operation = new RegisterSecurely(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                                                       new Dictionary <byte, object>
                {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage()
                }, new SendParameters());
                return(true);
            }

            if (operation.UserName == "" | operation.Email == "" | operation.Password == "")
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                                                       new Dictionary <byte, object>
                {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = "All Fields are Required"
                }, new SendParameters());
                return(true);
            }
            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.DebugFormat("about to look for user account {0}", operation.UserName);
                        var userList = session.QueryOver <User>().Where(u => u.Username == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("Found account name already in use.");
                            transaction.Commit();
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                            {
                                ReturnCode   = (int)ErrorCode.UserNameInUse,
                                DebugMessage = "Account name already in use please use another."
                            }, new SendParameters());
                            return(true);
                        }

                        var salt = Guid.NewGuid().ToString().Replace("-", "");
                        Log.DebugFormat("Created salt {0}", salt);
                        var newUser = new User
                        {
                            Email    = operation.Email,
                            Username = operation.UserName,
                            //TODO may need to change back to SHA1
                            Password =
                                BitConverter.ToString(SHA1.Create().ComputeHash(
                                                          Encoding.UTF8.GetBytes(salt + operation.Password))).Replace("-", ""),
                            Salt      = salt,
                            Algorithm = "sha1",
                            Created   = DateTime.Now,
                            Updated   = DateTime.Now
                        };

                        Log.DebugFormat("built user opbject");
                        session.Save(newUser);
                        Log.DebugFormat("Saved new user");
                        transaction.Commit();
                    }
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.DebugFormat("looking up newly creaded user");
                        var userList = session.QueryOver <User>().Where(u => u.Username == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("creating profile");
                            UserProfile profile = new UserProfile()
                            {
                                CharacterSlots = 1, UserId = userList[0]
                            };
                            session.Save(profile);
                            Log.DebugFormat("saved profile");
                            transaction.Commit();
                        }
                    }

                    serverPeer.SendOperationResponse(
                        new OperationResponse(message.Code)
                    {
                        ReturnCode = (byte)ClientReturnCode.UserCreated
                    },
                        new SendParameters());
                }
            }
            catch (Exception e)
            {
                Log.Error("Error Occured", e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                                                       new Dictionary <byte, object>
                {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode = (int)ErrorCode.UserNameInUse,
                    //remove debug msg later
                    DebugMessage = e.ToString()
                }, new SendParameters());
            }
            return(true);
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary<byte, object>
            {
                {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]},
                {
                    (byte) ClientParameterCode.SubOperationCode,
                    message.Parameters[(byte) ClientParameterCode.SubOperationCode]
                }
            };

            var operation = new SelectCharacter(serverPeer.Protocol, message);
            if (!operation.IsValid)
            {
                Log.Error(operation.GetErrorMessage());
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                    {
                        ReturnCode = (int) ErrorCode.OperationInvalid,
                        DebugMessage = operation.GetErrorMessage(),
                        Parameters = para
                    }, new SendParameters());
                return true;
            }
            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        var user =
                            session.QueryOver<User>().Where(ua => ua.Id == operation.UserId).List().FirstOrDefault();
                        if (user != null)
                        {
                            Log.DebugFormat("Found user {0}", user.Username);

                        }
                        var character =
                            session.QueryOver<ComplexCharacter>()
                                .Where(cc => cc.UserId == user)
                                .And(cc => cc.Id == operation.CharacterId)
                                .List()
                                .FirstOrDefault();
                        transaction.Commit();

                        if (character == null)
                        {
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                                {
                                    ReturnCode = (int) ErrorCode.InvalidCharacter,
                                    DebugMessage = "Invalid Character",
                                    Parameters = para
                                }, new SendParameters());
                        }
                        else
                        {
                            Log.DebugFormat("Found character {0}", character.Name);
                            para.Add((byte) ClientParameterCode.CharacterId, character.Id);
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                                {
                                    ReturnCode = (byte) ErrorCode.Ok,
                                    Parameters = para
                                },
                                new SendParameters());
                        }
                    }
                }
                return true;
            }
            catch (Exception e)
            {
                Log.Error(e);
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                    {
                        ReturnCode = (int) ErrorCode.InvalidCharacter,
                        DebugMessage = e.ToString(),
                        Parameters = para
                    }, new SendParameters());
            }
            return true;
        }
Exemplo n.º 18
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var operation = new ListCharacters(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                Log.DebugFormat("Invalid Operation - {0}", operation.GetErrorMessage());
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage()
                },
                    new SendParameters());
                return(true);
            }

            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        var user = session.QueryOver <User>().Where(u => u.Id == operation.UserId).List().FirstOrDefault();
                        if (user != null)
                        {
                            var profile = session.QueryOver <UserProfile>().Where(up => up.UserId == user).List().FirstOrDefault();
                            if (profile != null)
                            {
                                var para = new Dictionary <byte, object>
                                {
                                    { (byte)ClientParameterCode.CharacterSlots, profile.CharacterSlots },
                                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                                    { (byte)ClientParameterCode.SubOperationCode, message.Parameters[(byte)ClientParameterCode.SubOperationCode] }
                                };
                                var characters = session.QueryOver <ComplexCharacter>().Where(cc => cc.UserId == user).List();

                                Hashtable characterList = new Hashtable();
                                foreach (var complexCharacter in characters)
                                {
                                    characterList.Add(complexCharacter.Id, SerializeUtil.Serialize(complexCharacter.BuilderCharacterListItem()));
                                }

                                para.Add((byte)ClientParameterCode.CharacterList, characterList);

                                transaction.Commit();
                                serverPeer.SendOperationResponse(new OperationResponse((byte)ClientOperationCode.Login)
                                {
                                    Parameters = para
                                }, new SendParameters());
                            }
                            else
                            {
                                serverPeer.SendOperationResponse(
                                    new OperationResponse(message.Code)
                                {
                                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                                    DebugMessage = "Profile not found"
                                },
                                    new SendParameters());
                            }
                        }
                        else
                        {
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                            {
                                ReturnCode   = (int)ErrorCode.OperationInvalid,
                                DebugMessage = "User not found"
                            },
                                new SendParameters());
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e.Message);
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = e.ToString()
                },
                    new SendParameters());
            }
            return(true);
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var operation = new RegisterSecurely(serverPeer.Protocol, message);
            if (!operation.IsValid)
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                    new Dictionary<byte, object>
                    {
                        {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]}
                    })
                {
                    ReturnCode = (int) ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage()
                }, new SendParameters());
                return true;
            }

            if (operation.UserName == "" | operation.Email == "" | operation.Password == "")
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                   new Dictionary<byte, object>
                   {
                        {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]}
                   })
                {
                    ReturnCode = (int)ErrorCode.OperationInvalid,
                    DebugMessage = "All Fields are Required"
                }, new SendParameters());
                return true;
            }
            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.DebugFormat("about to look for user account {0}", operation.UserName);
                        var userList = session.QueryOver<User>().Where(u => u.Username == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("Found account name already in use.");
                            transaction.Commit();
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                                {
                                    ReturnCode = (int) ErrorCode.UserNameInUse,
                                    DebugMessage = "Account name already in use please use another."
                                }, new SendParameters());
                            return true;
                        }

                        var salt = Guid.NewGuid().ToString().Replace("-", "");
                        Log.DebugFormat("Created salt {0}", salt);
                        var newUser = new User
                        {
                            Email = operation.Email,
                            Username = operation.UserName,
                            //TODO may need to change back to SHA1
                            Password =
                                BitConverter.ToString(SHA1.Create().ComputeHash(
                                    Encoding.UTF8.GetBytes(salt + operation.Password))).Replace("-", ""),
                            Salt = salt,
                            Algorithm = "sha1",
                            Created = DateTime.Now,
                            Updated = DateTime.Now
                        };

                        Log.DebugFormat("built user opbject");
                        session.Save(newUser);
                        Log.DebugFormat("Saved new user");
                        transaction.Commit();
                    }
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.DebugFormat("looking up newly creaded user");
                        var userList = session.QueryOver<User>().Where(u => u.Username == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("creating profile");
                            UserProfile profile = new UserProfile() { CharacterSlots = 1, UserId = userList[0]};
                            session.Save(profile);
                            Log.DebugFormat("saved profile");
                            transaction.Commit();
                        }
                    }

                    serverPeer.SendOperationResponse(
                        new OperationResponse(message.Code) {ReturnCode = (byte) ClientReturnCode.UserCreated},
                        new SendParameters());
                }
            }
            catch (Exception e)
            {
                Log.Error("Error Occured", e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                    new Dictionary<byte, object>
                    {
                        {(byte) ClientParameterCode.PeerId, message.Parameters[(byte) ClientParameterCode.PeerId]}
                    })
                {
                    ReturnCode = (int) ErrorCode.UserNameInUse,
                    //remove debug msg later
                    DebugMessage = e.ToString()
                }, new SendParameters());
            }
            return true;
        }
Exemplo n.º 20
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            Log.DebugFormat("on handle in login server create character handler hit");
            var para = new Dictionary <byte, object>
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                {
                    (byte)ClientParameterCode.SubOperationCode,
                    message.Parameters[(byte)ClientParameterCode.SubOperationCode]
                }
            };
            var operation = new CreateCharacter(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                Log.DebugFormat("operation invalid");
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage(),
                    Parameters   = para
                }, new SendParameters());
                return(true);
            }

            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        var user =
                            session.QueryOver <User>().Where(u => u.Id == operation.UserId).List().FirstOrDefault();
                        var profile =
                            session.QueryOver <UserProfile>().Where(up => up.UserId == user).List().FirstOrDefault();
                        var characters = session.QueryOver <ComplexCharacter>().Where(cc => cc.UserId == user).List();
                        if (profile != null && profile.CharacterSlots <= characters.Count)
                        {
                            Log.DebugFormat("profile invalid or no slots");
                            serverPeer.SendOperationResponse(
                                new OperationResponse(message.Code)
                            {
                                ReturnCode   = (int)ErrorCode.InvalidCharacter,
                                DebugMessage = "No free character slots",
                                Parameters   = para
                            }, new SendParameters());
                        }
                        else
                        {
                            var mySerializer    = new XmlSerializer(typeof(CharacterCreateDetails));
                            var reader          = new StringReader(operation.CharacterCreateDetails);
                            var createCharacter = (CharacterCreateDetails)mySerializer.Deserialize(reader);
                            var character       =
                                session.QueryOver <ComplexCharacter>()
                                .Where(cc => cc.Name == createCharacter.CharacterName).List().FirstOrDefault();
                            if (character != null)
                            {
                                Log.DebugFormat("null character");
                                transaction.Commit();
                                serverPeer.SendOperationResponse(
                                    new OperationResponse(message.Code)
                                {
                                    ReturnCode   = (int)ErrorCode.InvalidCharacter,
                                    DebugMessage = "Character name taken",
                                    Parameters   = para
                                }, new SendParameters());
                            }
                            else
                            {
                                Log.DebugFormat("creating character");
                                var newChar = new ComplexCharacter
                                {
                                    UserId = user,
                                    Name   = createCharacter.CharacterName,
                                    Class  = createCharacter.CharacterClass,
                                    Sex    = createCharacter.Sex,
                                    Level  = 1
                                };

                                session.Save(newChar);
                                transaction.Commit();
                                serverPeer.SendOperationResponse(
                                    new OperationResponse(message.Code)
                                {
                                    ReturnCode = (int)ErrorCode.Ok,
                                    Parameters = para
                                }, new SendParameters());
                            }
                        }
                    }
                }
                return(true);
            }
            catch (Exception e)
            {
                Log.DebugFormat("invalid character");
                Log.Error(e);
                serverPeer.SendOperationResponse(
                    new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.InvalidCharacter,
                    DebugMessage = e.ToString(),
                    Parameters   = para
                }, new SendParameters());
            }
            return(true);
        }
Exemplo n.º 21
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            var para = new Dictionary <byte, object>
            {
                { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                { (byte)ClientParameterCode.SubOperationCode, message.Parameters[(byte)ClientParameterCode.SubOperationCode] }
            };
            var operation = new SelectCharacter(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                Log.Error(operation.GetErrorMessage());
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage(),
                    Parameters   = para
                }, new SendParameters());
                return(true);
            }

            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        var user = session.QueryOver <User>().Where(u => u.Id == operation.UserId).List().FirstOrDefault();
                        if (user != null)
                        {
                            Log.DebugFormat("Found user {0}", user.UserName);
                        }
                        var character = session.QueryOver <ComplexCharacter>().Where(cc => cc.UserId == user).And(cc => cc.Id == operation.CharacterId).List().FirstOrDefault();
                        transaction.Commit();

                        if (character == null)
                        {
                            serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                            {
                                ReturnCode = (int)ErrorCode.InvalidCharacter, DebugMessage = "Invalid character.", Parameters = para
                            }, new SendParameters());
                            return(true);
                        }
                        else
                        {
                            Log.DebugFormat("Found character {0}", character.Name);
                            para.Add((byte)ClientParameterCode.CharacterId, character.Id);
                            serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                            {
                                ReturnCode = (byte)ErrorCode.OK,
                                Parameters = para
                            }, new SendParameters());
                        }
                    }
                }
                return(true);
            }
            catch (Exception e)
            {
                Log.Error(e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code)
                {
                    ReturnCode = (int)ErrorCode.InvalidCharacter, DebugMessage = e.ToString(), Parameters = para
                }, new SendParameters());
            }
            return(true);
        }
Exemplo n.º 22
0
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            Log.DebugFormat("On handle message called in handleserverregistration");
            OperationResponse operationResponse;

            if (serverPeer.ServerId.HasValue)
            {
                Log.DebugFormat("REGISTRATION EXISTS");
                operationResponse = new OperationResponse(message.Code)
                {
                    ReturnCode   = -1,
                    DebugMessage = "Already registered."
                };
            }
            else
            {
                var registerRequest = new RegisterSubServer(serverPeer.Protocol, message);
                if (!registerRequest.IsValid)
                {
                    Log.DebugFormat("REGISTRATION NOT VALID");
                    string msg = registerRequest.GetErrorMessage();
                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("invalid register request {0}", msg);
                    }

                    operationResponse = new OperationResponse(message.Code)
                    {
                        DebugMessage = msg,
                        ReturnCode   = (short)ErrorCode.OperationInvalid
                    };
                }
                else
                {
                    Log.DebugFormat("REGISTRATION VALID");

                    XmlSerializer mySerializer = new XmlSerializer(typeof(RegisterSubServerData));
                    StringReader  inStream     = new StringReader(registerRequest.RegisterSubServerOperation);
                    var           registerData = (RegisterSubServerData)mySerializer.Deserialize(inStream);

                    if (Log.IsDebugEnabled)
                    {
                        Log.DebugFormat("Received register request: Address={0}, udptport={2}, tcport={1}, Type={3}",
                                        registerData.GameServerAddress, registerData.TcpPort, registerData.UdpPort, registerData.ServerType);
                    }
                    if (registerData.UdpPort.HasValue)
                    {
                        serverPeer.UdpAddress = registerData.GameServerAddress + ":" + registerData.UdpPort;
                    }
                    if (registerData.TcpPort.HasValue)
                    {
                        serverPeer.TcpAddress = registerData.GameServerAddress + ":" + registerData.UdpPort;
                    }

                    serverPeer.ServerId        = registerData.ServerId;
                    serverPeer.ServerType      = registerData.ServerType;
                    serverPeer.ApplicationName = registerData.ApplicationName;
                    Server.ConnectionCollection <PhotonConnectionCollection>().OnConnect(serverPeer);
                    operationResponse = new OperationResponse(message.Code);
                }
            }
            serverPeer.SendOperationResponse(operationResponse, new SendParameters());
            return(true);
        }
        protected override bool OnHandleMessage(IMessage message, PhotonServerPeer serverPeer)
        {
            Log.DebugFormat("Login message being handled message code {0}", message.Code);
            var operation = new LoginSecurely(serverPeer.Protocol, message);

            if (!operation.IsValid)
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                                                       new Dictionary <byte, object>
                {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode   = (int)ErrorCode.OperationInvalid,
                    DebugMessage = operation.GetErrorMessage()
                }, new SendParameters());
                return(true);
            }

            if (operation.UserName == "" | operation.Password == "")
            {
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                                                       new Dictionary <byte, object>
                {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode   = (int)ErrorCode.IncorrectUserNameOrPassword,
                    DebugMessage = "User name or password is incorrect"
                }, new SendParameters());
                return(true);
            }
            try
            {
                using (var session = NHibernateHelper.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        Log.DebugFormat("about to look for user account {0}", operation.UserName);
                        var userList = session.QueryOver <User>().Where(u => u.Username == operation.UserName).List();
                        if (userList.Count > 0)
                        {
                            Log.DebugFormat("found user {0} in database", operation.UserName);
                            var user = userList[0];
                            var hash = BitConverter.ToString(SHA1.Create().ComputeHash(
                                                                 Encoding.UTF8.GetBytes(user.Salt + operation.Password)))
                                       .Replace("-", "");
                            Log.DebugFormat("original pass {0}", hash.Trim());
                            Log.DebugFormat("login pass {0}", user.Password.Trim());

                            if (String.Equals(hash.Trim(), user.Password.Trim(), StringComparison.OrdinalIgnoreCase))
                            {
                                LoginServer server = Server as LoginServer;
                                if (server != null)
                                {
                                    bool founduser = false;
                                    foreach (var subServerClientPeer in server.ConnectionCollection <SubServerConnectionCollection>().Clients)
                                    {
                                        if (subServerClientPeer.Value.ClientData <CharacterData>().UserId == user.Id)
                                        {
                                            founduser = true;
                                        }
                                    }
                                    if (founduser)
                                    {
                                        Log.DebugFormat("user is already logged in");
                                        var para = new Dictionary <byte, object>
                                        {
                                            { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] },
                                            { (byte)ClientParameterCode.SubOperationCode, message.Parameters[(byte)ClientParameterCode.SubOperationCode] }
                                        };
                                        serverPeer.SendOperationResponse(
                                            new OperationResponse((byte)ClientOperationCode.Login)
                                        {
                                            Parameters   = para,
                                            ReturnCode   = (short)ErrorCode.UserCurrentlyLoggedIn,
                                            DebugMessage = "User is currently logged in."
                                        }, new SendParameters());
                                    }
                                    else
                                    {
                                        Log.Debug("Login handler successfully found character to log in.");

                                        server.ConnectionCollection <SubServerConnectionCollection>().Clients.Add(new Guid((Byte[])message.Parameters[(byte)ClientParameterCode.PeerId]), _clientFactory());
                                        server.ConnectionCollection <SubServerConnectionCollection>().Clients[new Guid((Byte[])message.Parameters[(byte)ClientParameterCode.PeerId])].ClientData <CharacterData>().UserId = user.Id;
                                        var para = new Dictionary <byte, object>
                                        {
                                            {
                                                (byte)ClientParameterCode.PeerId,
                                                message.Parameters[(byte)ClientParameterCode.PeerId]
                                            },
                                            {
                                                (byte)ClientParameterCode.SubOperationCode,
                                                message.Parameters[(byte)ClientParameterCode.SubOperationCode]
                                            },
                                            { (byte)ClientParameterCode.UserId, user.Id }
                                        };
                                        serverPeer.SendOperationResponse(
                                            new OperationResponse((byte)ClientOperationCode.Login)
                                        {
                                            Parameters = para
                                        },
                                            new SendParameters());
                                    }
                                }
                                return(true);
                            }
                            Log.Debug("password does not match.");

                            serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                                                                   new Dictionary <byte, object>
                            {
                                {
                                    (byte)ClientParameterCode.PeerId,
                                    message.Parameters[(byte)ClientParameterCode.PeerId]
                                }
                            })
                            {
                                ReturnCode   = (int)ErrorCode.IncorrectUserNameOrPassword,
                                DebugMessage = "User name or password is incorrect"
                            }, new SendParameters());
                            return(true);
                        }
                        Log.DebugFormat("Account name does not exist {0}", operation.UserName);
                        transaction.Commit();
                        serverPeer.SendOperationResponse(
                            new OperationResponse(message.Code)
                        {
                            ReturnCode   = (int)ErrorCode.IncorrectUserNameOrPassword,
                            DebugMessage = "User name or password is incorrect."
                        }, new SendParameters());
                        return(true);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error("Error Occured", e);
                serverPeer.SendOperationResponse(new OperationResponse(message.Code,
                                                                       new Dictionary <byte, object>
                {
                    { (byte)ClientParameterCode.PeerId, message.Parameters[(byte)ClientParameterCode.PeerId] }
                })
                {
                    ReturnCode = (int)ErrorCode.IncorrectUserNameOrPassword,
                    //remove debug msg later
                    DebugMessage = e.ToString()
                }, new SendParameters());
            }
            return(true);
        }