예제 #1
0
파일: IrcWhoCmd.cs 프로젝트: syncore/SST
        /// <summary>
        /// Executes the specified command.
        /// </summary>
        /// <param name="c">The cmd args.</param>
        /// <returns>
        /// <c>true</c> if the command was successfully executed, otherwise returns <c>false</c>.
        /// </returns>
        public bool Exec(Cmd c)
        {
            var sb = new StringBuilder();

            foreach (var player in _sst.ServerInfo.CurrentPlayers)
            {
                if (player.Value.Team == Team.Blue)
                {
                    sb.Append(string.Format("\u000311{0}\u00030, ", player.Key));
                }
                if (player.Value.Team == Team.Red)
                {
                    sb.Append(string.Format("\u000304{0}\u00030, ", player.Key));
                }
                if (player.Value.Team == Team.Spec)
                {
                    sb.Append(string.Format("\u000314{0}\u00030, ", player.Key));
                }
                if (player.Value.Team == Team.None)
                {
                    sb.Append(string.Format("\u00030{0}\u00030, ", player.Key));
                }
            }

            _irc.SendIrcMessage(_irc.IrcSettings.ircChannel, string.Format("\u0003[\u0002{0}\u0002 players currently on server] {1}",
                                                                           _sst.ServerInfo.CurrentPlayers.Count, sb.ToString().TrimEnd(',', ' ')));

            return(true);
        }
예제 #2
0
파일: IrcUsersCmd.cs 프로젝트: syncore/SST
        /// <summary>
        /// Executes the specified command.
        /// </summary>
        /// <param name="c">The cmd args.</param>
        /// <returns>
        /// <c>true</c> if the command was successfully executed, otherwise returns <c>false</c>.
        /// </returns>
        public bool Exec(Cmd c)
        {
            if (_sst.ServerInfo.CurrentPlayers.Count == 0)
            {
                _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                    "My server has no players at this time.");
            }
            else
            {
                var sb = new StringBuilder();
                foreach (var player in _sst.ServerInfo.CurrentPlayers)
                {
                    sb.Append(string.Format("\u0003\u0002{0}\u0002 ({1}), ",
                                            player.Key, _usersDb.GetUserLevel(player.Key)));
                }

                _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                    string.Format("\u0003My server's current players have the following access levels: {0}",
                                                  sb.ToString().TrimEnd(',', ' ')));
            }

            return(true);
        }
예제 #3
0
        /// <summary>
        /// Executes the specified command asynchronously.
        /// </summary>
        /// <param name="c">The cmd args.</param>
        /// <returns>
        /// <c>true</c> if the command was successfully executed, otherwise returns <c>false</c>.
        /// </returns>
        public async Task <bool> ExecAsync(Cmd c)
        {
            var serverDetails = await GetServerDetails(_sst.ServerInfo.CurrentServerId);

            if (serverDetails == null)
            {
                _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                    "\u0003\u0002[ERROR]\u0002 Unable to retrieve server information.");

                Log.Write(string.Format(
                              "Could not retrieve server information when trying to process QL server status requested by IRC user {0}.",
                              c.FromUser), _logClassType, _logPrefix);

                return(false);
            }
            var gametype = (QlGameTypes)serverDetails.game_type;

            _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                Helpers.IsQuakeLiveTeamGame(gametype)
                    ? FormatTeamGameStatusMessage(serverDetails)
                    : FormatNonTeamGameStatusMessage(serverDetails));

            return(true);
        }
예제 #4
0
        /// <summary>
        /// Executes the specified command asynchronously.
        /// </summary>
        /// <param name="c">The cmd args.</param>
        /// <returns>
        /// <c>true</c> if the command was successfully executed, otherwise returns <c>false</c>.
        /// </returns>
        public async Task <bool> ExecAsync(Cmd c)
        {
            if (!Helpers.KeyExists(c.Args[1], _cmdList))
            {
                _irc.SendIrcNotice(c.FromUser, "\u0002[ERROR]\u0002 That is not valid command.");

                Log.Write(string.Format("{0} attempted to use IRC to QL interface but specified non-existent SST command ({1}) Ignoring.",
                                        c.FromUser, c.Args[1]), _logClassType, _logPrefix);

                return(false);
            }
            if (!_cmdList[c.Args[1]].IsIrcAccessAllowed)
            {
                _irc.SendIrcNotice(c.FromUser, "\u0002[ERROR]\u0002 That command can only be accessed from in-game.");

                Log.Write(string.Format(
                              "{0} attempted to use IRC to QL interface but specified SST command ({1}) that can only be issued from in-game Ignoring.",
                              c.FromUser, c.Args[1]), _logClassType, _logPrefix);

                return(false);
            }
            // See if the c passed here meets the actual IBotCommand's MinArgs
            if ((c.Args.Length) < _cmdList[c.Args[1]].IrcMinArgs)
            {
                _irc.SendIrcNotice(c.FromUser,
                                   ReplaceQlColorsWithIrcColors(_cmdList[c.Args[1]].GetArgLengthErrorMessage(c)));

                Log.Write(string.Format(
                              "{0} attempted to use IRC to QL interface but specified too few parameters for SST command ({1}) Ignoring.",
                              c.FromUser, c.Args[1]), _logClassType, _logPrefix);

                return(false);
            }

            var success = await _cmdList[c.Args[1]].ExecAsync(c);

            if (success)
            {
                // Some commands send multiple lines; IRC messages cannot contain \r, \n, etc.
                if (_cmdList[c.Args[1]].StatusMessage.Contains(Environment.NewLine))
                {
                    SendSplitMessage(c, _cmdList[c.Args[1]].StatusMessage.Split(new[] { Environment.NewLine },
                                                                                StringSplitOptions.RemoveEmptyEntries), true);
                }
                else
                {
                    _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                        ReplaceQlColorsWithIrcColors(_cmdList[c.Args[1]].StatusMessage));
                }

                Log.Write(string.Format("Successfully executed {0}'s {1} command using IRC to QL interface",
                                        c.FromUser, c.Args[1]), _logClassType, _logPrefix);
            }
            else
            {
                if (_cmdList[c.Args[1]].StatusMessage.Contains(Environment.NewLine))
                {
                    SendSplitMessage(c, _cmdList[c.Args[1]].StatusMessage.Split(new[] { Environment.NewLine },
                                                                                StringSplitOptions.RemoveEmptyEntries), false);
                }
                else
                {
                    _irc.SendIrcNotice(c.FromUser,
                                       ReplaceQlColorsWithIrcColors(_cmdList[c.Args[1]].StatusMessage));
                }

                Log.Write(string.Format("Unsuccessfully execution of {0}'s {1} command using IRC to QL interface",
                                        c.FromUser, c.Args[1]), _logClassType, _logPrefix);
            }

            return(true);
        }
예제 #5
0
        /// <summary>
        /// Executes the specified command asynchronously.
        /// </summary>
        /// <param name="c">The cmd args.</param>
        public async Task <bool> ExecAsync(Cmd c)
        {
            if (!c.Args[1].Equals("start") &&
                !c.Args[1].Equals("stop") && !c.Args[1].Equals("reset") &&
                !c.Args[1].Equals("status"))
            {
                DisplayArgLengthError(c);
                return(false);
            }
            var qlw = new QlWindowUtils();

            if (!qlw.QuakeLiveConsoleWindowExists())
            {
                _irc.SendIrcNotice(c.FromUser,
                                   "[ERROR] A running instance of Quake Live could not be found.");

                Log.Write(string.Format(
                              "{0} attempted to use {1} command but a running instance of Quake Live could not be found. Ignoring.",
                              c.FromUser, c.CmdName), _logClassType, _logPrefix);

                return(false);
            }
            if (c.Args[1].Equals("start"))
            {
                if (_sst.IsMonitoringServer)
                {
                    _irc.SendIrcNotice(c.FromUser,
                                       "[ERROR] Your QL server is already being monitored.");

                    Log.Write(string.Format(
                                  "{0} attempted to start server monitoring but server is already being monitored. Ignoring.",
                                  c.FromUser), _logClassType, _logPrefix);

                    return(false);
                }
                _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                    "\u0002[SUCCESS]\u0002 Attempting to start QL server monitoring.");
                await _sst.BeginMonitoring();

                // Give it time to complete initilization, then show status.
                await Task.Delay(11000);

                ShowMonitorStatus();
            }
            else if (c.Args[1].Equals("stop"))
            {
                if (!_sst.IsMonitoringServer)
                {
                    _irc.SendIrcNotice(c.FromUser,
                                       "[ERROR] No QL server is currently being monitored.");

                    Log.Write(string.Format(
                                  "{0} attempted to stop server monitoring but server is not currently being monitored. Ignoring.",
                                  c.FromUser), _logClassType, _logPrefix);

                    return(false);
                }

                _sst.StopMonitoring();
                _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                    "\u0002[SUCCESS]\u0002 Stopped monitoring your QL server.");
            }
            else if (c.Args[1].Equals("reset"))
            {
                if (_sst.IsMonitoringServer)
                {
                    Log.Write(string.Format(
                                  "{0} reset server monitoring for actively monitored server; now stopping server monitoring.",
                                  c.FromUser), _logClassType, _logPrefix);

                    _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                        "\u0002[SUCCESS]\u0002 Your QL server was being monitored; now stopping this monitoring.");

                    _sst.StopMonitoring();
                }
                else
                {
                    Log.Write(string.Format(
                                  "{0} reset server monitoring for non-actively monitored server; now starting server monitoring.",
                                  c.FromUser), _logClassType, _logPrefix);

                    _irc.SendIrcMessage(_irc.IrcSettings.ircChannel,
                                        "\u0002[SUCCESS]\u0002 Your QL server was not being monitored; now starting monitoring.");

                    await _sst.BeginMonitoring();
                }
            }
            else if (c.Args[1].Equals("status"))
            {
                ShowMonitorStatus();
            }

            return(true);
        }