示例#1
0
        protected override void OnRun(CommandDetails details)
        {
            TimeSpan timeDiff = DateTime.Now - lastRehash;

            if (timeDiff <= TimeSpan.FromSeconds(5))
            {
                IRC.Instance.Send(details.Channel, "{0}: Cannot rehash yet", details.Sender.Nickname);
                return;
            }

            lastRehash = DateTime.Now;

            try
            {
                Settings.Load();
            }
            catch (Exception ex)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to load settings. Error has been logged", details.Sender.Nickname);
                Log.WriteError("RehashCommand", "Unable to rehash settings: {0}", ex.Message);
                return;
            }

            if (!Settings.Validate())
            {
                IRC.Instance.Send(details.Channel, "{0}: Settings did not validate. Error has been logged", details.Sender.Nickname);
                return;
            }

            IRC.Instance.Send(details.Channel, "{0}: Rehashed", details.Sender.Nickname);

            // rejoin any channels we may have edited
            IRC.Instance.Join(Settings.Current.IRCChannels.Select(chan => chan.Channel).ToArray());
        }
示例#2
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: UGC ID argument required", details.Sender.Nickname);
                return;
            }

            ulong ugcId;

            if (!ulong.TryParse(details.Args[0], out ugcId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid UGC ID", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request UGC info: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            var jobId = Steam.Instance.Cloud.RequestUGCDetails(ugcId);

            AddRequest(details, new Request {
                JobID = jobId, UGC = ugcId
            });
        }
示例#3
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: SteamID argument required", details.Sender.Nickname);
                return;
            }

            var     inputId = details.Args[0];
            SteamID steamId;

            if (!SteamUtils.TryDeduceSteamID(inputId, out steamId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to deduce SteamID from given input", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, details.Sender.Nickname + ": Unable to request steam level: not connected to Steam!");
                return;
            }

            JobID job = Steam.Instance.Levels.RequestLevels(new SteamID[] { steamId });

            AddRequest(details, new Request {
                Job = job, SteamID = steamId
            });
        }
示例#4
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: AppID argument required", details.Sender.Nickname);
                return;
            }

            uint appId;

            if (!uint.TryParse(details.Args[0], out appId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid AppID", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, details.Sender.Nickname + ": Unable to request app name: not connected to Steam!");
                return;
            }

            // send off a product request as well so we get something to cache for later
            Steam.Instance.Apps.PICSGetProductInfo(appId, null, false, false);

            var jobId = Steam.Instance.Apps.GetAppInfo(appId);

            AddRequest(details, new Request {
                JobID = jobId, AppID = appId
            });
        }
示例#5
0
        protected override void OnRun(CommandDetails details)
        {
            if (!Settings.Current.IsWebEnabled)
            {
                IRC.Instance.Send(details.Channel, "{0}: Web support is disabled", details.Sender.Nickname);
                return;
            }

            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: AppID argument required", details.Sender.Nickname);
                return;
            }

            uint appId;

            if (!uint.TryParse(details.Args[0], out appId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid AppID", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, details.Sender.Nickname + ": Unable to request app name: not connected to Steam!");
                return;
            }

            var jobId = Steam.Instance.Apps.PICSGetProductInfo(appId, null, false, false);

            AddRequest(details, new Request {
                JobID = jobId, AppID = appId
            });
        }
示例#6
0
        protected override void OnRun(CommandDetails details)
        {
            var commands = IRC.Instance.CommandManager.RegisteredCommands;

            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: Available commands: {1}", details.Sender.Nickname, string.Join(", ", commands.Select(c => c.Triggers.First())));
                return;
            }

            var cmd = details.Args[0];

            var foundCommands = commands
                                .Where(c => c.Triggers.Any(t => t.IndexOf(cmd, StringComparison.OrdinalIgnoreCase) != -1))
                                .ToList();

            if (foundCommands.Count == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to find command with text '{1}'", details.Sender.Nickname, cmd);
            }
            else if (foundCommands.Count == 1)
            {
                IRC.Instance.Send(details.Channel, "{0}: {1}", details.Sender.Nickname, foundCommands[0].HelpText);
            }
            else
            {
                IRC.Instance.Send(details.Channel, "{0}: Found multiple commands: {1}", details.Sender.Nickname, string.Join(", ", foundCommands.Select(c => c.Triggers.First())));
            }
        }
示例#7
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length < 2)
            {
                IRC.Instance.Send(details.Channel, "{0}: Usage !findacc <query> <type>", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request account info: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            string accOrEmail = details.Args[0];
            string typeStr    = details.Args[1];

            SteamAccount.ERequestAccountData type;
            if (!Enum.TryParse(typeStr, out type))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid type, should be one of: {1}",
                                  details.Sender.Nickname, string.Join(", ", Enum.GetNames(typeof(SteamAccount.ERequestAccountData))));
                return;
            }

            var jobId = Steam.Instance.Account.RequestAccountData(accOrEmail, type);

            AddRequest(details, new Request {
                JobID = jobId
            });
        }
示例#8
0
        protected override void OnRun( CommandDetails details )
        {
            TimeSpan timeDiff = DateTime.Now - lastRehash;

            if ( timeDiff <= TimeSpan.FromSeconds( 5 ) )
            {
                IRC.Instance.Send( details.Channel, "{0}: Cannot rehash yet", details.Sender.Nickname );
                return;
            }

            lastRehash = DateTime.Now;

            try
            {
                Settings.Load();
            }
            catch ( Exception ex )
            {
                IRC.Instance.Send( details.Channel, "{0}: Unable to load settings. Error has been logged", details.Sender.Nickname );
                Log.WriteError( "RehashCommand", "Unable to rehash settings: {0}", ex.Message );
                return;
            }

            if ( !Settings.Validate() )
            {
                IRC.Instance.Send( details.Channel, "{0}: Settings did not validate. Error has been logged", details.Sender.Nickname );
                return;
            }

            IRC.Instance.Send( details.Channel, "{0}: Rehashed", details.Sender.Nickname );

            // rejoin any channels we may have edited
            IRC.Instance.Join( Settings.Current.IRCChannels.Select( chan => chan.Channel ).ToArray() );
        }
示例#9
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: SteamID argument required", details.Sender.Nickname);
                return;
            }

            var     inputId = details.Args[0];
            SteamID steamId;

            if (!SteamUtils.TryDeduceSteamID(inputId, out steamId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to deduce SteamID from given input", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request profile info: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            if (steamId.IsIndividualAccount)
            {
                var jobId = Steam.Instance.Friends.RequestProfileInfo(steamId);
                AddRequest(details, new Request {
                    JobID = jobId, SteamID = steamId
                });
            }
            else
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request profile info: Not an individual account!", details.Sender.Nickname);
            }
        }
示例#10
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: SteamID argument required", details.Sender.Nickname);
                return;
            }

            var     inputId = details.Args[0];
            SteamID steamId;

            if (!SteamUtils.TryDeduceSteamID(inputId, out steamId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to deduce SteamID from given input", details.Sender.Nickname);
                return;
            }

            IRC.Instance.Send(details.Channel, "{0}: {1}", details.Sender.Nickname, SteamUtils.ExpandSteamID(steamId));

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, details.Sender.Nickname + ": Unable to request persona info: not connected to Steam!");
                return;
            }

            if (steamId.IsIndividualAccount || steamId.IsClanAccount)
            {
                AddRequest(details, new Request {
                    SteamID = steamId
                });
                Steam.Instance.Friends.RequestFriendInfo(steamId, ( EClientPersonaStateFlag )short.MaxValue);
            }
        }
示例#11
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: filter argument required", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request server count: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            var query = new SteamMasterServer.QueryDetails
            {
                Region = ERegionCode.World,
            };

            query.Filter = string.Join(" ", details.Args);

            var jobId = Steam.Instance.MasterServer.ServerQuery(query);

            AddRequest(details, new Request {
                JobID = jobId
            });
        }
示例#12
0
        protected override void OnRun( CommandDetails details )
        {
            var commands = IRC.Instance.CommandManager.RegisteredCommands;

            if ( details.Args.Length == 0 )
            {
                IRC.Instance.Send( details.Channel, "{0}: Available commands: {1}", details.Sender.Nickname, string.Join( ", ", commands.Select( c => c.Triggers.First() ) ) );
                return;
            }

            var cmd = details.Args[ 0 ];

            var foundCommands = commands
                .Where( c => c.Triggers.Any( t => t.IndexOf( cmd, StringComparison.OrdinalIgnoreCase ) != -1 ) )
                .ToList();

            if ( foundCommands.Count == 0 )
            {
                IRC.Instance.Send( details.Channel, "{0}: Unable to find command with text '{1}'", details.Sender.Nickname, cmd );
            }
            else if ( foundCommands.Count == 1 )
            {
                IRC.Instance.Send( details.Channel, "{0}: {1}", details.Sender.Nickname, foundCommands[ 0 ].HelpText );
            }
            else
            {
                IRC.Instance.Send( details.Channel, "{0}: Found multiple commands: {1}", details.Sender.Nickname, string.Join( ", ", foundCommands.Select( c => c.Triggers.First() ) ) );
            }
        }
示例#13
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: Published File ID argument required", details.Sender.Nickname);
                return;
            }

            ulong pubFileId;

            if (!ulong.TryParse(details.Args[0], out pubFileId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid Published File ID", details.Sender.Nickname);
                return;
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request published file info: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            var jobId = ugcHandler.RequestUGC(pubFileId, OnUGC);

            AddRequest(details, new Request {
                JobID = jobId, PubFileID = pubFileId
            });
        }
示例#14
0
        protected override void OnRun(CommandDetails details)
        {
            TimeSpan timeToMainEvent = MainEvent - DateTime.UtcNow;

            IRC.Instance.Send(details.Channel, "{0}: TI7 Main Event: {1}",
                              details.Sender.Nickname, GetTime(timeToMainEvent)
                              );
        }
示例#15
0
        protected override void OnRun( CommandDetails details )
        {
            var rand = new Random();

            string quote = Settings.Current.BrunoQuotes[ rand.Next( Settings.Current.BrunoQuotes.Count ) ];

            IRC.Instance.Send( details.Channel, "\"{0}\" - Bruno", quote );
        }
示例#16
0
        protected override void OnRun(CommandDetails details)
        {
            var rand = new Random();

            string quote = Settings.Current.BrunoQuotes[rand.Next(Settings.Current.BrunoQuotes.Count)];

            IRC.Instance.Send(details.Channel, "\"{0}\" - Bruno", quote);
        }
示例#17
0
        protected override void OnRun( CommandDetails details )
        {
            TimeSpan timeToWildCard = WildCard - DateTime.UtcNow;
            TimeSpan timeToGroupStages = GroupStages - DateTime.UtcNow;
            TimeSpan timeToMainEvent = MainEvent - DateTime.UtcNow;

            IRC.Instance.Send( details.Channel, "{0}: TI3 Wild Card: {1} | Group Stages: {2} | Main Event: {3}",
                details.Sender.Nickname, GetTime( timeToWildCard ), GetTime( timeToGroupStages ), GetTime( timeToMainEvent ) );
        }
示例#18
0
        protected override void OnRun( CommandDetails details )
        {
            TimeSpan timeToRegionalQuals = RegionalQualifiers - DateTime.UtcNow;
            TimeSpan timeToPlayoffs = Playoffs - DateTime.UtcNow;
            TimeSpan timeToMainEvent = MainEvent - DateTime.UtcNow;

            IRC.Instance.Send( details.Channel, "{0}: TI4 Regional Qualifiers: {1} | Playoffs: {2} | Main Event: {3}",
                details.Sender.Nickname, GetTime( timeToRegionalQuals ), GetTime( timeToPlayoffs ), GetTime( timeToMainEvent ) );
        }
示例#19
0
        protected override void OnRun(CommandDetails details)
        {
            TimeSpan timeToRegionalQuals = RegionalQualifiers - DateTime.UtcNow;
            TimeSpan timeToPlayoffs      = Playoffs - DateTime.UtcNow;
            TimeSpan timeToMainEvent     = MainEvent - DateTime.UtcNow;

            IRC.Instance.Send(details.Channel, "{0}: TI4 Regional Qualifiers: {1} | Playoffs: {2} | Main Event: {3}",
                              details.Sender.Nickname, GetTime(timeToRegionalQuals), GetTime(timeToPlayoffs), GetTime(timeToMainEvent));
        }
示例#20
0
        protected override void OnRun(CommandDetails details)
        {
            TimeSpan timeToWildCard    = WildCard - DateTime.UtcNow;
            TimeSpan timeToGroupStages = GroupStages - DateTime.UtcNow;
            TimeSpan timeToMainEvent   = MainEvent - DateTime.UtcNow;

            IRC.Instance.Send(details.Channel, "{0}: TI3 Wild Card: {1} | Group Stages: {2} | Main Event: {3}",
                              details.Sender.Nickname, GetTime(timeToWildCard), GetTime(timeToGroupStages), GetTime(timeToMainEvent));
        }
示例#21
0
        void RunForEnum <TEnum>(string inputValue, CommandDetails details)
            where TEnum : struct
        {
            string enumName = typeof(TEnum)
                              .GetDottedTypeName()
                              .Replace("SteamKit2.", ""); // chop off the root namespace

            TEnum enumValue;

            if (Enum.TryParse <TEnum>(inputValue, out enumValue))
            {
                IRC.Instance.Send(details.Channel, "{0}: {1} ({2:D}) = {3}", details.Sender.Nickname, enumName, enumValue, ExpandEnumFlags(enumValue));
            }
            else
            {
                bool includeDeprecated = false;
                if (details.Args.Length > 2 && details.Args[2].Equals("deprecated", StringComparison.InvariantCultureIgnoreCase))
                {
                    includeDeprecated = true;
                }

                var enumValues = Enum.GetValues(typeof(TEnum)).Cast <TEnum>();
                if (!includeDeprecated)
                {
                    enumValues = enumValues.Except(enumValues.Where(x => typeof(TEnum).GetMember(x.ToString())[0].GetCustomAttributes(typeof(ObsoleteAttribute), inherit: false).Any()));
                }

                if (!string.IsNullOrEmpty(inputValue))
                {
                    enumValues = enumValues.Where(x => x.ToString().IndexOf(inputValue, StringComparison.InvariantCultureIgnoreCase) >= 0);
                }

                int  matchingCount = enumValues.Count();
                bool truncated     = false;

                if (matchingCount == 0)
                {
                    IRC.Instance.Send(details.Channel, "{0}: No matches found.", details.Sender.Nickname);
                    return;
                }
                else if (matchingCount > 10)
                {
                    truncated  = true;
                    enumValues = enumValues.Take(10);
                }

                var formatted = string.Join(", ", enumValues.Select(@enum => string.Format("{0} ({1})", @enum.ToString(), Enum.Format(typeof(TEnum), @enum, "D"))));

                if (truncated)
                {
                    formatted = string.Format("{0}, and {1} more...", formatted, matchingCount - 10);
                }

                IRC.Instance.Send(details.Channel, "{0}: {1} = {2}", details.Sender.Nickname, enumName, formatted);
            }
        }
示例#22
0
        protected override void OnRun(CommandDetails details)
        {
            using (var webClient = new WebClient())
            {
                var req = new Request();
                AddRequest(details, req);

                webClient.DownloadStringCompleted += OnDownloadStringCompleted;
                webClient.DownloadStringAsync(new Uri(TICKER), req);
            }
        }
示例#23
0
        protected override void OnRun(CommandDetails details)
        {
            using (var webClient = new WebClient())
            {
                var req = new Request();
                AddRequest(details, req);

                var uri = new Uri("http://comeonandsl.am/data/slams.js");

                webClient.DownloadStringCompleted += OnDownloadCompleted;
                webClient.DownloadStringAsync(uri, req);
            }
        }
示例#24
0
        protected override void OnRun(CommandDetails details)
        {
            using (var webClient = new RedirectWebClient())
            {
                var req = new Request();
                AddRequest(details, req);

                var uri = new Uri("http://fenne.cc/");

                webClient.RedirectDownloadStringCompleted += OnDownloadCompleted;
                webClient.DownloadStringAsync(uri, req);
            }
        }
示例#25
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: GameID argument required", details.Sender.Nickname);
                return;
            }

            ulong gameId;

            if (!ulong.TryParse(details.Args[0], out gameId))
            {
                // lets search by name if we're not a gameid

                string appName = string.Join(" ", details.Args);

                uint appId;
                if (!Steam.Instance.AppInfo.FindApp(appName, out appId, gamesOnly: true))
                {
                    IRC.Instance.Send(details.Channel, "{0}: Invalid GameID or unknown app name", details.Sender.Nickname);
                    return;
                }

                gameId = appId;
            }

            GameID realGameID = gameId;

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request player counts for {1}: not connected to Steam!", details.Sender.Nickname, GetAppName(realGameID.AppID));
                return;
            }

            if (realGameID.AppID == 0)
            {
                // send this request as a package info request
                Steam.Instance.Apps.PICSGetProductInfo(null, realGameID.AppID, false, false);
            }
            else
            {
                // send off a product request as well so we get something to cache for later
                Steam.Instance.Apps.PICSGetProductInfo(realGameID.AppID, null, false, false);
            }

            var jobId = Steam.Instance.UserStats.GetNumberOfCurrentPlayers(gameId);

            AddRequest(details, new Request {
                JobID = jobId, GameID = gameId
            });
        }
示例#26
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Trigger != "!enum")
            {
                // if the user didn't use !enum, then it was one of the shortcut commands
                // so we'll rerun the trigger with the enum as the first argument

                string   enumName = details.Trigger.Substring(1);
                string[] oldArgs  = details.Args;

                details.Trigger = "!enum";
                details.Args    = new string[oldArgs.Length + 1];

                // new args = enumName + old args
                details.Args[0] = enumName;
                Array.Copy(oldArgs, 0, details.Args, 1, oldArgs.Length);

                OnRun(details);
                return;
            }

            if (details.Args.Length < 1)
            {
                IRC.Instance.Send(details.Channel, "{0}: enum name argument required", details.Sender.Nickname);
                return;
            }

            string enumType  = details.Args[0];
            string inputEnum = details.Args.Length > 1 ? details.Args[1] : null;

            var matchingEnumType = typeof(CMClient).Assembly.GetTypes()
                                   .Where(x => x.IsEnum)
                                   .Where(x => x.Namespace.StartsWith("SteamKit2"))
                                   // some inner namespaces have enums that have matching names, but we (most likely) want to match against the root enums
                                   // so we order by having the root enums first
                                   .OrderByDescending(x => x.Namespace == "SteamKit2")
                                   // we want to match against name matches, or partial fullname matches
                                   .Where(x => x.Name.Equals(enumType, StringComparison.InvariantCultureIgnoreCase) || x.GetDottedTypeName().IndexOf(enumType, StringComparison.OrdinalIgnoreCase) != -1)
                                   .FirstOrDefault();

            if (matchingEnumType == null)
            {
                IRC.Instance.Send(details.Channel, "{0}: No such enum type.", details.Sender.Nickname);
                return;
            }

            GetType().GetMethod("RunForEnum", BindingFlags.Instance | BindingFlags.NonPublic)
            .MakeGenericMethod(matchingEnumType)
            .Invoke(this, new object[] { inputEnum, details });
        }
示例#27
0
        protected override void OnRun(CommandDetails details)
        {
            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request tf2 war stats: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            var request = new ClientGCMsgProtobuf <CGCMsgGC_SpyVsEngyWar_RequestGlobalStats>((uint)ETFGCMsg.k_EMsgGC_SpyVsEngyWar_RequestGlobalStats);

            Steam.Instance.GameCoordinator.Send(request, 440);

            AddRequest(details, new Request());
        }
示例#28
0
        protected override void OnRun(CommandDetails details)
        {
            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request dota matchmaking stats: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            var request = new ClientGCMsgProtobuf <CMsgDOTAMatchmakingStatsRequest>((uint)EDOTAGCMsg.k_EMsgGCMatchmakingStatsRequest);

            Steam.Instance.GameCoordinator.Send(request, APPID);

            // the GC doesn't consider this a job, so we have no source jobid
            AddRequest(details, new Request());
        }
示例#29
0
        protected async override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: AppID argument required", details.Sender.Nickname);
                return;
            }

            uint appId;

            if (!uint.TryParse(details.Args[0], out appId))
            {
                // lets search by name if we're not a gameid

                string appName = string.Join(" ", details.Args);

                if (!Steam.Instance.AppInfo.FindApp(appName, out appId, gamesOnly: true))
                {
                    IRC.Instance.Send(details.Channel, "{0}: Invalid GameID or unknown app name", details.Sender.Nickname);
                    return;
                }
            }

            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request player counts for {1}: not connected to Steam!", details.Sender.Nickname, GetAppName(appId));
                return;
            }

            if (appId == 0)
            {
                // send this request as a package info request
                var _ = Steam.Instance.Apps.PICSGetProductInfo(null, appId, false, false);
            }
            else
            {
                // send off a product request as well so we get something to cache for later
                var _ = Steam.Instance.Apps.PICSGetProductInfo(appId, null, false, false);
            }

            var result = await playerCountHandler.RequestPlayerCountWeb(appId);

            // var result = await playerCountHandler.RequestPlayerCount( appId );

            OnNumPlayers(result, new Request {
                AppID = appId, Channel = details.Channel, Requester = details.Sender
            });
        }
示例#30
0
        protected override void OnRun(CommandDetails details)
        {
            var pony = details.Args
                       .FirstOrDefault() ?? "";

            using (var webClient = new WebClient())
            {
                var req = new Request();
                AddRequest(details, req);

                var uri = new Uri(string.Format("https://areweponyyet.com/?chatty=1&pony={0}", Uri.EscapeDataString(pony)));

                webClient.DownloadStringCompleted += OnDownloadCompleted;
                webClient.DownloadStringAsync(uri, req);
            }
        }
示例#31
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: GameID argument required", details.Sender.Nickname);
                return;
            }

            ulong gameId;

            if (!ulong.TryParse(details.Args[0], out gameId))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid GameID", details.Sender.Nickname);
                return;
            }

            IRC.Instance.Send(details.Channel, "{0}: {1}", details.Sender.Nickname, SteamUtils.ExpandGameID(gameId));
        }
示例#32
0
        protected override void OnRun( CommandDetails details )
        {
            if ( details.Args.Length == 0 )
            {
                IRC.Instance.Send( details.Channel, "{0}: EResult argument required", details.Sender.Nickname );
                return;
            }

            string inputEResult = details.Args[ 0 ];
            int eResult;

            if ( !int.TryParse( inputEResult, out eResult ) )
            {
                IRC.Instance.Send( details.Channel, "{0}: Invalid EResult value", details.Sender.Nickname );
                return;
            }

            IRC.Instance.Send( details.Channel, "{0}: {1}", details.Sender.Nickname, ( EResult )eResult );
        }
示例#33
0
        protected override void OnRun(CommandDetails details)
        {
            bool isAMBug = string.Equals(details.Trigger, "!bug", StringComparison.OrdinalIgnoreCase);

            if (isAMBug)
            {
                if (IRC.Instance.IsUserOnChannel(details.Channel, "yakbot"))
                {
                    return; // glory to the yak
                }
            }

            if (details.Args.Length < 1)
            {
                IRC.Instance.Send(details.Channel, "{0}: {1}", details.Sender.Nickname, HelpText);
                return;
            }

            string bugOrAlias = string.Join(" ", details.Args);

            bugOrAlias = HttpUtility.UrlEncode(bugOrAlias);

            using (var webClient = new WebClient())
            {
                var req = new Request();
                AddRequest(details, req);

                webClient.DownloadStringCompleted += OnDownloadCompleted;

                req.Url = "https://bugzilla.mozilla.org/show_bug.cgi?id={0}";

                if (isAMBug)
                {
                    req.Url = "https://bugs.alliedmods.net/show_bug.cgi?id={0}";
                }

                req.Url = string.Format(req.Url, bugOrAlias);

                webClient.DownloadStringAsync(new Uri(req.Url), req);
            }
        }
示例#34
0
        protected override void OnRun( CommandDetails details )
        {
            if ( details.Args.Length == 0 )
            {
                IRC.Instance.Send( details.Channel, "{0}: SteamID argument required", details.Sender.Nickname );
                return;
            }

            var inputGid = details.Args[ 0 ];

            ulong ulGid;
            if ( !ulong.TryParse( inputGid, out ulGid ) )
            {
                IRC.Instance.Send( details.Channel, "{0}: Invalid GID", details.Sender.Nickname );
                return;
            }

            GlobalID gid = ulGid;

            IRC.Instance.Send( details.Channel, "{0}: {1}", details.Sender.Nickname, SteamUtils.ExpandGID( gid ) );
        }
示例#35
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: GID argument required", details.Sender.Nickname);
                return;
            }

            var inputGid = details.Args[0];

            ulong ulGid;

            if (!ulong.TryParse(inputGid, out ulGid))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid GID", details.Sender.Nickname);
                return;
            }

            GlobalID gid = ulGid;

            IRC.Instance.Send(details.Channel, "{0}: {1}", details.Sender.Nickname, SteamUtils.ExpandGID(gid));
        }
示例#36
0
        protected override void OnRun(CommandDetails details)
        {
            if (!Steam.Instance.Connected)
            {
                IRC.Instance.Send(details.Channel, "{0}: Unable to request dota custom game player information: not connected to Steam!", details.Sender.Nickname);
                return;
            }

            if (details.Args.Length == 0)
            {
                IRC.Instance.Send(details.Channel, "{0}: Game ID argument required", details.Sender.Nickname);
                return;
            }

            ulong gameId;

            if (!ulong.TryParse(details.Args[0], out gameId))
            {
                string pubFileName = string.Join(" ", details.Args);

                if (!ugcHandler.FindUGC(pubFileName, out gameId, appId: APPID))
                {
                    IRC.Instance.Send(details.Channel, "{0}: Invalid Game ID or unknown UGC name", details.Sender.Nickname);
                    return;
                }
            }

            var request = new ClientGCMsgProtobuf <CMsgClientToGCCustomGamePlayerCountRequest>((uint)EDOTAGCMsg.k_EMsgClientToGCCustomGamePlayerCountRequest);

            request.Body.custom_game_id = gameId;
            request.SourceJobID         = Steam.Instance.Client.GetNextJobID();

            Steam.Instance.GameCoordinator.Send(request, APPID);

            AddRequest(details, new Request {
                Job = request.SourceJobID
            });
        }
示例#37
0
        protected override void OnRun( CommandDetails details )
        {
            TimeSpan timeToQualifiers = Qualifiers - DateTime.UtcNow;
            TimeSpan timeToMainEvent = MainEvent - DateTime.UtcNow;

            IRC.Instance.Send( details.Channel, "{0}: TI5 Qualifiers: {1} | Main Event: {2}",
                details.Sender.Nickname, GetTime( timeToQualifiers ), GetTime( timeToMainEvent )
            );
        }
示例#38
0
 protected abstract void OnRun( CommandDetails details );
示例#39
0
 internal void DoRun( CommandDetails details )
 {
     OnRun( details );
 }
示例#40
0
        protected override void OnRun( CommandDetails details )
        {
            if ( !Settings.Current.IsAdmin( details.Sender ) )
                return;

            if ( details.Args.Length < 2 )
            {
                IRC.Instance.Send( details.Channel, "{0}: {1}", details.Sender.Nickname, HelpText );
                return;
            }

            string mode = details.Args[ 0 ];
            string option = details.Args[ 1 ];
            string value = string.Join( " ", details.Args.Skip( 2 ) );

            string[] scalarModes = { "get", "set" };
            string[] listModes = { "add", "remove", "Clear" };

            if ( scalarModes.Contains( mode, StringComparer.OrdinalIgnoreCase ) )
            {
                // scalar operation

                if ( mode.Equals( "get", StringComparison.OrdinalIgnoreCase ) )
                {
                    try
                    {
                        string configValue = GetConfigValue( option );
                        IRC.Instance.Send( details.Channel, "{0}: {1}: {2}", details.Sender.Nickname, option, configValue );
                    }
                    catch ( InvalidOperationException ex )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Unable to get value: {1}", details.Sender.Nickname, ex.Message );
                    }
                }
                else // set
                {
                    if ( details.Args.Length < 3 )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Missing required value for config field", details.Sender.Nickname );
                        return;
                    }

                    try
                    {
                        SetScalarConfigValue( option, value  );
                        IRC.Instance.Send( details.Channel, "{0}: Set!", details.Sender.Nickname );
                    }
                    catch ( InvalidOperationException ex )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Unable to set value: {1}", details.Sender.Nickname, ex.Message );
                    }
                }
            }
            else if ( listModes.Contains( mode, StringComparer.OrdinalIgnoreCase ) )
            {
                // list operation

                if ( mode.Equals( "add", StringComparison.OrdinalIgnoreCase ) )
                {
                    if ( details.Args.Length < 3 )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Missing required value for config field", details.Sender.Nickname );
                        return;
                    }

                    try
                    {
                        AddListConfigValue( option, value );
                        IRC.Instance.Send( details.Channel, "{0}: Added!", details.Sender.Nickname );
                    }
                    catch ( InvalidOperationException ex )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Unable to add list value: {1}", details.Sender.Nickname, ex.Message );
                    }
                }
                else if ( mode.Equals( "remove", StringComparison.OrdinalIgnoreCase ) )
                {
                    if ( details.Args.Length < 3 )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Missing required value for config field", details.Sender.Nickname );
                        return;
                    }

                    try
                    {
                        RemoveListConfigValue( option, value );
                        IRC.Instance.Send( details.Channel, "{0}: Removed!", details.Sender.Nickname );
                    }
                    catch ( InvalidOperationException ex )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Unable to remove list value: {1}", details.Sender.Nickname, ex.Message );
                    }
                }
                else // clear
                {
                    try
                    {
                        ClearListConfigValue( option );
                        IRC.Instance.Send( details.Channel, "{0}: Cleared!", details.Sender.Nickname );
                    }
                    catch ( InvalidOperationException ex )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Unable to clear config: {1}", details.Sender.Nickname, ex.Message );
                    }
                }
            }
            else
            {
                IRC.Instance.Send( details.Channel, "{0}: Invalid mode, should be one of: set, set, add, remove, clear", details.Sender.Nickname );
                return;
            }

            if ( !Settings.Validate() )
            {
                IRC.Instance.Send( details.Channel, "{0}: Settings did not validate. Error has been logged", details.Sender.Nickname );
                return;
            }

            try
            {
                Settings.Save();
            }
            catch ( Exception ex )
            {
                IRC.Instance.Send( details.Channel, "{0}: Unable to save settings. Error has been logged.", details.Sender.Nickname );
                Log.WriteError( "ConfigCommand", "Unable to save settings: {0}", ex.Message );
                return;
            }
        }
示例#41
0
        protected override void OnRun(CommandDetails details)
        {
            if (details.Args.Length < 4)
            {
                IRC.Instance.Send(details.Channel, "{0}: Usage: !makesid <universe> <type> <instance> <id>", details.Sender.Nickname);
                return;
            }

            string univ     = details.Args[0];
            string type     = details.Args[1];
            string instance = details.Args[2];
            string id       = details.Args[3];

            EUniverse eUniv;

            if (!Enum.TryParse(univ, true, out eUniv))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid universe, should be one of: {1}",
                                  details.Sender.Nickname, string.Join(", ", Enum.GetNames(typeof(EUniverse)))
                                  );

                return;
            }

            EAccountType eType;

            if (!Enum.TryParse(type, true, out eType))
            {
                IRC.Instance.Send(details.Channel, "{0}: Invalid account type, should be one of: {1}",
                                  details.Sender.Nickname, string.Join(", ", Enum.GetNames(typeof(EAccountType)))
                                  );

                return;
            }

            uint uiInstance = 0;

            switch (instance.ToLower())
            {
            case "desktop":
                uiInstance = SteamID.DesktopInstance;
                break;

            case "console":
                uiInstance = SteamID.ConsoleInstance;
                break;

            case "web":
                uiInstance = SteamID.WebInstance;
                break;

            case "all":
                uiInstance = SteamID.AllInstances;
                break;

            default:
                SteamID.ChatInstanceFlags instanceFlags;
                if (Enum.TryParse(instance, true, out instanceFlags))
                {
                    uiInstance = ( uint )instanceFlags;
                    break;
                }

                if (!uint.TryParse(instance, out uiInstance))
                {
                    IRC.Instance.Send(details.Channel, "{0}: Invalid instance! (desktop, console, web, all, clan, lobby, mmslobby, #)", details.Sender.Nickname);
                    return;
                }
                break;
            }

            uint accountId;

            if (!uint.TryParse(id, out accountId))
            {
                SteamID steamId;
                if (!SteamUtils.TryDeduceSteamID(id, out steamId))
                {
                    IRC.Instance.Send(details.Channel, "{0}: Invalid (or undeducible) account id!", details.Sender.Nickname);
                    return;
                }

                accountId = steamId.AccountID;
            }

            SteamID steamID = new SteamID(accountId, uiInstance, eUniv, eType);

            var sidCommand = IRC.Instance.CommandManager.RegisteredCommands
                             .SingleOrDefault(c => c is SIDCommand);

            if (sidCommand != null)
            {
                // loading up on the dirty hacks
                details.Args = new string[] { steamID.ConvertToUInt64().ToString() };
                sidCommand.DoRun(details);
            }
            else
            {
                IRC.Instance.Send(details.Channel, "{0}: An internal error has occurred", details.Sender.Nickname);
                Log.WriteError("MakeSIDCommand", "Unable to find SIDCommand!");
            }
        }
示例#42
0
        protected override void OnRun( CommandDetails details )
        {
            if ( details.Args.Length < 4 )
            {
                IRC.Instance.Send( details.Channel, "{0}: Usage: !makesid <universe> <type> <instance> <id>", details.Sender.Nickname );
                return;
            }

            string univ = details.Args[ 0 ];
            string type = details.Args[ 1 ];
            string instance = details.Args[ 2 ];
            string id = details.Args[ 3 ];

            EUniverse eUniv;
            if ( !Enum.TryParse( univ, true, out eUniv ) )
            {
                IRC.Instance.Send( details.Channel, "{0}: Invalid universe, should be one of: {1}",
                    details.Sender.Nickname, string.Join( ", ", Enum.GetNames( typeof( EUniverse ) ) )
                );

                return;
            }

            EAccountType eType;
            if ( !Enum.TryParse( type, true, out eType ) )
            {
                IRC.Instance.Send( details.Channel, "{0}: Invalid account type, should be one of: {1}",
                    details.Sender.Nickname, string.Join( ", ", Enum.GetNames( typeof( EAccountType ) ) )
                );

                return;
            }

            uint uiInstance = 0;
            switch ( instance.ToLower() )
            {
                case "desktop":
                    uiInstance = SteamID.DesktopInstance;
                    break;

                case "console":
                    uiInstance = SteamID.ConsoleInstance;
                    break;

                case "web":
                    uiInstance = SteamID.WebInstance;
                    break;

                case "all":
                    uiInstance = SteamID.AllInstances;
                    break;

                default:
                    SteamID.ChatInstanceFlags instanceFlags;
                    if ( Enum.TryParse( instance, true, out instanceFlags ) )
                    {
                        uiInstance = ( uint )instanceFlags;
                        break;
                    }

                    if ( !uint.TryParse( instance, out uiInstance ) )
                    {
                        IRC.Instance.Send( details.Channel, "{0}: Invalid instance! (desktop, console, web, all, clan, lobby, mmslobby, #)", details.Sender.Nickname );
                        return;
                    }
                    break;
            }

            uint accountId;
            if ( !uint.TryParse( id, out accountId ) )
            {
                SteamID steamId;
                if ( !SteamUtils.TryDeduceSteamID( id, out steamId ) )
                {
                    IRC.Instance.Send( details.Channel, "{0}: Invalid (or undeducible) account id!", details.Sender.Nickname );
                    return;
                }

                accountId = steamId.AccountID;
            }

            SteamID steamID = new SteamID( accountId, uiInstance, eUniv, eType );

            var sidCommand = IRC.Instance.CommandManager.RegisteredCommands
                .SingleOrDefault( c => c is SIDCommand );

            if ( sidCommand != null )
            {
                // loading up on the dirty hacks
                details.Args = new string[] { steamID.ConvertToUInt64().ToString() };
                sidCommand.DoRun( details );
            }
            else
            {
                IRC.Instance.Send( details.Channel, "{0}: An internal error has occurred", details.Sender.Nickname );
                Log.WriteError( "MakeSIDCommand", "Unable to find SIDCommand!" );
            }
        }