예제 #1
0
        private void Callbacks_PlayerChat(object sender, Communication.EventArguments.Callbacks.PlayerChatEventArgs e)
        {
            RunCatchLog(() =>
            {
                ServerCommand command = ServerCommand.Parse(e.Text);

                if (!command.Is(Command.Donate) || command.PartsWithoutMainCommand.Count == 0)
                {
                    return;
                }

                int coppers;

                if (!int.TryParse(command.PartsWithoutMainCommand[0], NumberStyles.None, CultureInfo.InvariantCulture, out coppers) || coppers <= 0)
                {
                    return;
                }

                if (coppers < Settings.MinDonationValue)
                {
                    SendFormattedMessageToLogin(e.Login, Settings.DonationToSmallMessage, "Coppers", Settings.MinDonationValue.ToString(CultureInfo.InvariantCulture));
                    return;
                }

                PlayerSettings playerSettings = GetPlayerSettings(e.Login);

                bool isUnitedAccount = playerSettings.IsUnitedAccount;

                if (!playerSettings.DetailMode.HasDetailedPlayerInfo())
                {
                    DetailedPlayerInfo playerInfo = GetDetailedPlayerInfo(e.Login);

                    if (playerInfo != null)
                    {
                        isUnitedAccount = playerInfo.IsUnitedAccount;
                    }
                }

                if (!isUnitedAccount)
                {
                    SendFormattedMessageToLogin(e.Login, Settings.PlayerHasNoUnitedAccountMessage);
                    return;
                }

                GenericResponse <int> billResponse = Context.RPCClient.Methods.SendBill(e.Login, coppers, Settings.DonationHint, Settings.DonationTargetLogin);

                if (billResponse.Erroneous)
                {
                    Logger.Warn(string.Format("Error while calling method SendBill: {0}({1})", billResponse.Fault.FaultMessage, billResponse.Fault.FaultCode));
                    SendFormattedMessageToLogin(e.Login, Settings.DonationErrorMessage, "ErrorMessage", billResponse.Fault.FaultMessage);
                    return;
                }

                BillDictionary[billResponse.Value] = new DonationInfo {
                    Login = e.Login, Coppers = coppers
                };
            }, "Error in Callbacks_PlayerChat Method.", true);
        }
예제 #2
0
        public void UpdateFromPlayerInfo(DetailedPlayerInfo playerInfo)
        {
            UpdateFromPlayerInfo((PlayerInfoBase)playerInfo);
            IsReferee    = playerInfo.IsReferee;
            IPAddress    = Regex.Replace(playerInfo.IPAddress, @":\d+", string.Empty, RegexOptions.Compiled);
            OnlineRights = playerInfo.OnlineRights;
            Language     = playerInfo.Language;

            PlayerRanking worldRanking = playerInfo.LadderStats.PlayerRankings.Find(ranking => ranking.Path == "World");

            if (worldRanking != null)
            {
                LadderRanking = worldRanking.Ranking;
            }

            DetailMode |= PlayerSettingsDetailMode.DetailedPlayerInfo;
        }
예제 #3
0
        private void Callbacks_PlayerConnect(object sender, PlayerConnectEventArgs e)
        {
            RunCatchLog(() =>
            {
                DetailedPlayerInfo detailedPlayerInfo = GetDetailedPlayerInfo(e.Login);

                if (detailedPlayerInfo == null)
                {
                    e.Handled = true;
                    Context.RPCClient.Methods.Kick(e.Login, "TMSPS couldn't determine your player information, try reconnecting!");
                    return;
                }

                NicknameResolverFactory.Instance.Set(e.Login, detailedPlayerInfo.NickName);

                if (detailedPlayerInfo.NickName.IsNullOrTimmedEmpty())
                {
                    Context.RPCClient.Methods.Kick(e.Login, "Please provide a nickname!");
                    e.Handled = true;
                    return;
                }

                if (Settings.EnableJoinMessage)
                {
                    string nation           = "Unknown";
                    List <string> pathParts = new List <string>(detailedPlayerInfo.Path.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries));

                    if (pathParts.Count > 1)
                    {
                        nation = string.Join(" > ", pathParts.ToArray(), 1, pathParts.Count - 1);
                    }

                    int ladderRank = -1;

                    PlayerRanking worldRanking = detailedPlayerInfo.LadderStats.PlayerRankings.Find(ranking => ranking.Path == "World");

                    if (worldRanking != null)
                    {
                        ladderRank = worldRanking.Ranking;
                    }

                    SendFormattedMessage(Settings.JoinMessage, "Nickname", StripTMColorsAndFormatting(detailedPlayerInfo.NickName), "Nation", nation, "Ladder", ladderRank.ToString(Context.Culture));
                }
            }, "Error in Callbacks_PlayerConnect Method.", true);
        }
예제 #4
0
        public ServerInfo(ConfigSettingsConfigurationSection configSection, string serverPackMask, Version version, string trackDirectory, DetailedPlayerInfo serverPlayerInfo)
        {
            if (configSection == null)
            {
                throw new ArgumentNullException("configSection");
            }

            if (serverPackMask == null)
            {
                throw new ArgumentNullException("serverPackMask");
            }

            if (version == null)
            {
                throw new ArgumentNullException("version");
            }

            if (trackDirectory == null)
            {
                throw new ArgumentNullException("trackDirectory");
            }

            if (serverPlayerInfo == null)
            {
                throw new ArgumentNullException("serverPlayerInfo");
            }

            ServerAddress       = configSection.ServerAddress;
            ServerXMLRpcPort    = configSection.ServerXMLRPCPort;
            SuperAdminPassword  = configSection.SuperAdminPassword;
            ServerNation        = configSection.ServerNation;
            ServerLogin         = configSection.ServerLogin;
            ServerLoginPassword = configSection.ServerLoginPassword;
            ServerPackMask      = serverPackMask;
            Version             = version.Clone();
            TrackDirectory      = trackDirectory;
            PlayerInfo          = serverPlayerInfo;
        }
예제 #5
0
        private void Callbacks_PlayerConnect(object sender, PlayerConnectEventArgs e)
        {
            if (e.Handled)
            {
                Logger.Debug(string.Format("Callbacks_PlayerConnect method skipped for login: {0}. Eventargs stated: Already handled", e.Login));
                return;
            }

            RunCatchLog(() =>
            {
                PlayerSettings playerSettings = GetPlayerSettings(e.Login);

                if (playerSettings == null)
                {
                    Logger.Debug(string.Format("Could not get PlayerSettings for login: {0}", e.Login));
                    return;
                }

                int ladderRanking;

                if (!playerSettings.DetailMode.HasDetailedPlayerInfo())
                {
                    DetailedPlayerInfo detailedPlayerInfo = GetDetailedPlayerInfo(e.Login);

                    if (detailedPlayerInfo == null)
                    {
                        Logger.Debug(string.Format("Could not get DetailedPlayerInfo for login: {0}", e.Login));
                        return;
                    }

                    PlayerRanking worldRanking = detailedPlayerInfo.LadderStats.PlayerRankings.Find(ranking => ranking.Path == "World");

                    if (worldRanking == null)
                    {
                        Logger.Debug(string.Format("Could not find World-Ranking for login: {0}", e.Login));
                        return;
                    }

                    ladderRanking = worldRanking.Ranking;
                }
                else
                {
                    ladderRanking = playerSettings.LadderRanking;
                }


                if (ladderRanking != -1)
                {
                    return;
                }

                GenericResponse <bool> kickResponse = Context.RPCClient.Methods.Kick(e.Login, Settings.PersonalKickMessage);

                if (kickResponse.Erroneous)
                {
                    Logger.Debug(string.Format("Could not kick login: {0}. Reason: {1}({2})", e.Login, kickResponse.Fault.FaultMessage, kickResponse.Fault.FaultCode));
                    return;
                }

                SendFormattedMessage(Settings.PublicKickMessage, "Nickname", StripTMColorsAndFormatting(playerSettings.NickName));
                e.Handled = true;
            }, "Error in Callbacks_PlayerConnect Method.", true);
        }