コード例 #1
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} servers <filter> - See https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol", Colors.OLIVE);

                return;
            }

            if (command.Message.IndexOf('\\') == -1)
            {
                CommandHandler.ReplyToCommand(command, "That doesn't look like a filter.");

                return;
            }

            var request = new CGameServers_GetServerList_Request
            {
                filter = command.Message,
                limit  = 5000,
            };

            JobManager.AddJob(
                () => GameServers.SendMessage(api => api.GetServerList(request)),
                new JobManager.IRCRequest
            {
                Type    = JobManager.IRCRequestType.TYPE_GAMESERVERS,
                Command = command
            }
                );
        }
コード例 #2
0
        public static void OnServiceMethod(SteamUnifiedMessages.ServiceMethodResponse callback, JobManager.IRCRequest request)
        {
            var response = callback.GetDeserializedResponse <CGameServers_GetServerList_Response>();
            var servers  = response.servers;

            if (!servers.Any())
            {
                CommandHandler.ReplyToCommand(request.Command, "No servers.");

                return;
            }

            if (servers.Count == 1)
            {
                var server = servers.First();

                CommandHandler.ReplyToCommand(request.Command, "{0} - {1} - {2}/{3} - Map: {4} - AppID: {5} - Version: {6} - Dir: {7} - Tags: {8} - Name: {9}",
                                              server.addr, new SteamID(server.steamid).Render(true), server.players, server.max_players, server.map, server.appid, server.version, server.gamedir, server.gametype, server.name
                                              );

                return;
            }

            var serv = servers.Take(5).Select(x => string.Format("{0} ({1})", x.addr, x.players));

            CommandHandler.ReplyToCommand(request.Command, "{0}{1}", string.Join(", ", serv), servers.Count > 5 ? string.Format(", and {0}{1} more", servers.Count == 5000 ? ">" : "", servers.Count - 5) : "");
        }
コード例 #3
0
        public override async void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} ugc <ugcid>", Colors.OLIVE);

                return;
            }

            ulong ugcId;

            if (!ulong.TryParse(command.Message, out ugcId))
            {
                CommandHandler.ReplyToCommand(command, "Invalid UGC ID");

                return;
            }

            var callback = await Cloud.RequestUGCDetails(ugcId);

            if (callback.Result != EResult.OK)
            {
                CommandHandler.ReplyToCommand(command, "Unable to request UGC info: {0}{1}", Colors.RED, callback.Result);

                return;
            }

            CommandHandler.ReplyToCommand(command, "Creator: {0}{1}{2}, App: {3}{4}{5}, File: {6}{7}{8}, Size: {9}{10}{11} -{12} {13}",
                                          Colors.BLUE, callback.Creator.Render(true), Colors.NORMAL,
                                          Colors.BLUE, callback.AppID, Colors.NORMAL,
                                          Colors.BLUE, callback.FileName, Colors.NORMAL,
                                          Colors.BLUE, GetByteSizeString(callback.FileSize), Colors.NORMAL,
                                          Colors.DARKBLUE, callback.URL
                                          );
        }
コード例 #4
0
ファイル: UGC.cs プロジェクト: Autositz/SteamDatabaseBackend
        private void OnUGCInfo(SteamCloud.UGCDetailsCallback callback)
        {
            JobAction job;

            if (!JobManager.TryRemoveJob(callback.JobID, out job) || !job.IsCommand)
            {
                return;
            }

            var request = job.CommandRequest;

            if (callback.Result != EResult.OK)
            {
                CommandHandler.ReplyToCommand(request.Command, "Unable to request UGC info: {0}", callback.Result);

                return;
            }

            CommandHandler.ReplyToCommand(request.Command, "Creator: {0}{1}{2}, App: {3}{4}{5}, File: {6}{7}{8}, Size: {9}{10}{11} -{12} {13}",
                                          Colors.BLUE, callback.Creator.Render(true), Colors.NORMAL,
                                          Colors.BLUE, callback.AppID, Colors.NORMAL,
                                          Colors.BLUE, callback.FileName, Colors.NORMAL,
                                          Colors.BLUE, GetByteSizeString(callback.FileSize), Colors.NORMAL,
                                          Colors.DARKBLUE, callback.URL
                                          );
        }
コード例 #5
0
        public static void Reload(CommandArguments command)
        {
            Reload();

            command.ReplyAsNotice = true;
            CommandHandler.ReplyToCommand(command, "Reloaded {0} token overrides", SecretTokens.Count);
        }
コード例 #6
0
        public static void ReloadImportant(CommandArguments command)
        {
            ReloadImportant();

            command.ReplyAsNotice = true;
            CommandHandler.ReplyToCommand(command, "Reloaded {0} important apps and {1} packages", ImportantApps.Count, ImportantSubs.Count);
        }
コード例 #7
0
        private void OnServiceMethod(SteamUnifiedMessages.ServiceMethodResponse callback)
        {
            JobAction job;

            if (!JobManager.TryRemoveJob(callback.JobID, out job) || !job.IsCommand)
            {
                return;
            }

            var request = job.CommandRequest;

            if (callback.Result != EResult.OK)
            {
                CommandHandler.ReplyToCommand(request.Command, "Unable to make service request: {0}", callback.Result);

                return;
            }

            // .chat about grate
            switch (request.Type)
            {
            case JobManager.IRCRequestType.TYPE_GAMESERVERS:
                ServersCommand.OnServiceMethod(callback, request);
                return;

            case JobManager.IRCRequestType.TYPE_PUBFILE:
            case JobManager.IRCRequestType.TYPE_PUBFILE_SILENT:
                PubFileCommand.OnServiceMethod(callback, request);
                return;
            }

            CommandHandler.ReplyToCommand(request.Command, "Unknown request type, I don't know what to do.");
        }
コード例 #8
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} gid <globalid>", Colors.OLIVE);

                return;
            }

            ulong uGid;

            if (!ulong.TryParse(command.Message, out uGid))
            {
                CommandHandler.ReplyToCommand(command, "Invalid GlobalID.");

                return;
            }

            GlobalID gid = uGid;

            CommandHandler.ReplyToCommand(command, "{0} (SeqCount: {1}{2}{3}, StartTime: {4}{5}{6}, ProcessID: {7}{8}{9}, BoxID: {10}{11}{12})",
                                          (ulong)gid,
                                          Colors.LIGHTGRAY, gid.SequentialCount, Colors.NORMAL,
                                          Colors.LIGHTGRAY, gid.StartTime, Colors.NORMAL,
                                          Colors.LIGHTGRAY, gid.ProcessID, Colors.NORMAL,
                                          Colors.LIGHTGRAY, gid.BoxID, Colors.NORMAL
                                          );
        }
コード例 #9
0
ファイル: UGC.cs プロジェクト: Autositz/SteamDatabaseBackend
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} ugc <ugcid>", Colors.OLIVE);

                return;
            }

            ulong ugcId;

            if (!ulong.TryParse(command.Message, out ugcId))
            {
                CommandHandler.ReplyToCommand(command, "Invalid UGC ID");

                return;
            }

            JobManager.AddJob(
                () => Cloud.RequestUGCDetails(ugcId),
                new JobManager.IRCRequest
            {
                Command = command
            }
                );
        }
コード例 #10
0
        public override void OnCommand(CommandArguments command)
        {
            BlogPost post;

            using (var db = Database.GetConnection())
            {
                if (command.Message.Length > 0)
                {
                    post = db.Query <BlogPost>("SELECT `ID`, `Slug`, `Title` FROM `Blog` WHERE `IsHidden` = 0 AND (`Slug` = @Slug OR `ID` = @Slug) LIMIT 1", new { Slug = command.Message }).SingleOrDefault();
                }
                else
                {
                    post = db.Query <BlogPost>("SELECT `ID`, `Slug`, `Title` FROM `Blog` WHERE `IsHidden` = 0 ORDER BY `Time` DESC LIMIT 1").SingleOrDefault();
                }
            }

            if (post.ID == 0)
            {
                CommandHandler.ReplyToCommand(command, "No blog post found.");

                return;
            }

            CommandHandler.ReplyToCommand(
                command,

                command.Message.Length > 0 ?
                "Blog post:{0} {1}{2} -{3} {4}" :
                "Latest blog post:{0} {1}{2} -{3} {4}",

                Colors.BLUE, post.Title, Colors.NORMAL,
                Colors.DARKBLUE, SteamDB.GetBlogURL(post.Slug.Length > 0 ? post.Slug : post.ID.ToString())
                );
        }
コード例 #11
0
        private static void OnPersonaState(SteamFriends.PersonaStateCallback callback)
        {
            JobAction job;

            if (!JobManager.TryRemoveJob(new JobID(callback.FriendID), out job) || !job.IsCommand)
            {
                return;
            }

            var command = job.CommandRequest.Command;

            if (callback.FriendID.IsClanAccount)
            {
                var clantag = string.IsNullOrEmpty(callback.ClanTag) ? string.Empty : string.Format(" {0}(Clan tag: {1}{2}{3})",
                                                                                                    Colors.NORMAL, Colors.LIGHTGRAY, callback.ClanTag, Colors.NORMAL);

                CommandHandler.ReplyToCommand(command, "{0}{1}{2} -{3} https://steamcommunity.com/gid/{4}/{5}",
                                              Colors.BLUE, callback.Name, Colors.NORMAL,
                                              Colors.DARKBLUE, callback.FriendID.ConvertToUInt64(), clantag
                                              );
            }
            else if (callback.FriendID.IsIndividualAccount)
            {
                CommandHandler.ReplyToCommand(command, "{0}{1}{2} -{3} https://steamcommunity.com/profiles/{4}/ {5}(Last login: {6}, Last logoff: {7})",
                                              Colors.BLUE, callback.Name, Colors.NORMAL,
                                              Colors.DARKBLUE, callback.FriendID.ConvertToUInt64(),
                                              Colors.DARKGRAY, callback.LastLogOn, callback.LastLogOff
                                              );
            }
            else
            {
                CommandHandler.ReplyToCommand(command, callback.Name);
            }
        }
コード例 #12
0
        private static void OnNumberOfPlayers(SteamUserStats.NumberOfPlayersCallback callback)
        {
            JobAction job;

            if (!JobManager.TryRemoveJob(callback.JobID, out job) || !job.IsCommand)
            {
                return;
            }

            var request = job.CommandRequest;

            if (callback.Result != EResult.OK)
            {
                CommandHandler.ReplyToCommand(request.Command, "Unable to request player count: {0}{1}", Colors.RED, callback.Result);
            }
            else if (request.Target == 0)
            {
                CommandHandler.ReplyToCommand(
                    request.Command,
                    "{0}{1:N0}{2} people praising lord Gaben right now, influence:{3} {4}",
                    Colors.OLIVE, callback.NumPlayers, Colors.NORMAL,
                    Colors.DARKBLUE, SteamDB.GetAppURL(753, "graphs")
                    );
            }
            else
            {
                CommandHandler.ReplyToCommand(
                    request.Command,
                    "People playing {0}{1}{2} right now: {3}{4:N0}{5} -{6} {7}",
                    Colors.BLUE, Steam.GetAppName(request.Target), Colors.NORMAL,
                    Colors.OLIVE, callback.NumPlayers, Colors.NORMAL,
                    Colors.DARKBLUE, SteamDB.GetAppURL(request.Target, "graphs")
                    );
            }
        }
コード例 #13
0
        public void ReloadImportant(CommandHandler.CommandArguments command = null)
        {
            using (MySqlDataReader Reader = DbWorker.ExecuteReader("SELECT `AppID` FROM `ImportantApps` WHERE `Announce` = 1"))
            {
                ImportantApps.Clear();

                while (Reader.Read())
                {
                    ImportantApps.Add(Reader.GetUInt32("AppID"));
                }
            }

            using (MySqlDataReader Reader = DbWorker.ExecuteReader("SELECT `SubID` FROM `ImportantSubs`"))
            {
                ImportantSubs.Clear();

                while (Reader.Read())
                {
                    ImportantSubs.Add(Reader.GetUInt32("SubID"));
                }
            }

            if (command == null)
            {
                Log.WriteInfo("IRC Proxy", "Loaded {0} important apps and {1} packages", ImportantApps.Count, ImportantSubs.Count);
            }
            else
            {
                CommandHandler.ReplyToCommand(command, "{0}{1}{2}: Reloaded {3} important apps and {4} packages", Colors.OLIVE, command.Nickname, Colors.NORMAL, ImportantApps.Count, ImportantSubs.Count);
            }
        }
コード例 #14
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} app <appid or partial game name>", Colors.OLIVE);

                return;
            }

            var count = PICSProductInfo.ProcessedApps.Count;

            if (count > 100)
            {
                CommandHandler.ReplyToCommand(command, "There are currently {0} apps awaiting to be processed, try again later.", count);

                return;
            }

            uint appID;

            if (!uint.TryParse(command.Message, out appID))
            {
                string name = command.Message;

                if (!Utils.ConvertUserInputToSQLSearch(ref name))
                {
                    CommandHandler.ReplyToCommand(command, "Your request is invalid or too short.");

                    return;
                }

                using (var db = Database.GetConnection())
                {
                    appID = db.ExecuteScalar <uint>("SELECT `AppID` FROM `Apps` WHERE `Apps`.`StoreName` LIKE @Name OR `Apps`.`Name` LIKE @Name OR `Apps`.`LastKnownName` LIKE @Name ORDER BY `LastUpdated` DESC LIMIT 1", new { Name = name });
                }

                if (appID == 0)
                {
                    CommandHandler.ReplyToCommand(command, "Nothing was found matching your request.");

                    return;
                }
            }

            var apps = new List <uint>();

            apps.Add(appID);

            JobManager.AddJob(
                () => Steam.Instance.Apps.PICSGetAccessTokens(apps, Enumerable.Empty <uint>()),
                new JobManager.IRCRequest
            {
                Target  = appID,
                Type    = JobManager.IRCRequestType.TYPE_APP,
                Command = command
            }
                );
        }
コード例 #15
0
        void RunForEnum <TEnum>(string inputValue, CommandArguments command, bool includeDeprecated)
            where TEnum : struct
        {
            string enumName = GetDottedTypeName(typeof(TEnum));
            TEnum  enumValue;

            if (Enum.TryParse(inputValue, out enumValue))
            {
                CommandHandler.ReplyToCommand(command, "{0}{1}{2} ({3}) ={4} {5}", Colors.LIGHTGRAY, enumName, Colors.NORMAL, Enum.Format(typeof(TEnum), enumValue, "D"), Colors.BLUE, ExpandEnumFlagsToString(enumValue));

                return;
            }

            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), false).Any()));
            }

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

            var count = enumValues.Count();

            if (count == 0)
            {
                CommandHandler.ReplyToCommand(command, "No matches found.");

                return;
            }

            if (count > 10)
            {
                if (!string.IsNullOrEmpty(inputValue))
                {
                    CommandHandler.ReplyToCommand(command, "More than 10 results found.");

                    return;
                }

                enumValues = enumValues.Take(10);
            }

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

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

            CommandHandler.ReplyToCommand(command, "{0}{1}{2}: {3}", Colors.LIGHTGRAY, enumName, Colors.NORMAL, formatted);
        }
コード例 #16
0
        private static void PrintBinary(CommandArguments command, KeyValue kv, string key)
        {
            if (kv[key].Children.Count == 0)
            {
                return;
            }

            kv = kv[key];

            CommandHandler.ReplyToCommand(command, "{0}{1} {2}({3} MB)", CDN, kv["file"].AsString(), Colors.DARKGRAY, (kv["size"].AsLong() / 1048576.0).ToString("0.###"));
        }
コード例 #17
0
        public static void CancelChatJobsIfAny()
        {
            var jobs = Jobs.Where(job => job.Value.IsCommand).ToList();

            JobAction dummy;

            foreach (var job in jobs)
            {
                CommandHandler.ReplyToCommand(job.Value.CommandRequest.Command, true, "Your request failed.");

                Jobs.TryRemove(job.Key, out dummy);
            }
        }
コード例 #18
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length > 0)
            {
                return;
            }

            // TODO: Correctly include commands for admins if an admin uses the command
            var commands = Commands
                           .Where(cmd => !cmd.IsAdminCommand && cmd != this)
                           .Select(cmd => cmd.Trigger);

            CommandHandler.ReplyToCommand(command, true, "Available commands: {0}{1}", Colors.OLIVE, string.Join(string.Format("{0}, {1}", Colors.NORMAL, Colors.OLIVE), commands));
        }
コード例 #19
0
        public override async void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} servers <filter> - See https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol", Colors.OLIVE);

                return;
            }

            if (command.Message.IndexOf('\\') == -1)
            {
                CommandHandler.ReplyToCommand(command, "That doesn't look like a filter.");

                return;
            }

            var request = new CGameServers_GetServerList_Request
            {
                filter = command.Message,
                limit  = 5000,
            };

            var callback = await GameServers.SendMessage(api => api.GetServerList(request));

            var response = callback.GetDeserializedResponse <CGameServers_GetServerList_Response>();
            var servers  = response.servers;

            if (!servers.Any())
            {
                CommandHandler.ReplyToCommand(command, "No servers.");

                return;
            }

            if (servers.Count == 1)
            {
                var server = servers.First();

                CommandHandler.ReplyToCommand(command, "{0} - {1} - {2}/{3} - Map: {4} - AppID: {5} - Version: {6} - Dir: {7} - Tags: {8} - Name: {9}",
                                              server.addr, new SteamID(server.steamid).Render(true), server.players, server.max_players, server.map, server.appid, server.version, server.gamedir, server.gametype, server.name
                                              );

                return;
            }

            var serv = servers.Take(5).Select(x => string.Format("{0} ({1})", x.addr, x.players));

            CommandHandler.ReplyToCommand(command, "{0}{1}", string.Join(", ", serv), servers.Count > 5 ? string.Format(", and {0}{1} more", servers.Count == 5000 ? ">" : "", servers.Count - 5) : "");
        }
コード例 #20
0
        private static void RemoveStaleJobs()
        {
            var jobs = Jobs.Where(job => job.Value.IsCommand && DateTime.Now >= job.Value.CommandRequest.ExpireTime).ToList();

            JobAction dummy;

            foreach (var job in jobs)
            {
                Log.WriteDebug("Job Manager", "Timed out job: {0} ({1} jobs left)", job.Key, Jobs.Count);

                CommandHandler.ReplyToCommand(job.Value.CommandRequest.Command, true, "Your request timed out.");

                Jobs.TryRemove(job.Key, out dummy);
            }
        }
コード例 #21
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} bins <{1}> [stable (returns publicbeta by default)]", Colors.OLIVE, string.Join("/", Systems));

                return;
            }

            var    args = command.Message.Split(' ');
            string os   = args[0];

            if (!Systems.Contains(os))
            {
                CommandHandler.ReplyToCommand(command, "Invalid OS. Valid ones are: {0}", string.Join(", ", Systems));

                return;
            }

            using (var webClient = new WebClient())
            {
                webClient.DownloadDataCompleted += delegate(object sender, DownloadDataCompletedEventArgs e)
                {
                    var kv = new KeyValue();

                    using (var ms = new MemoryStream(e.Result))
                    {
                        try
                        {
                            kv.ReadAsText(ms);
                        }
                        catch
                        {
                            CommandHandler.ReplyToCommand(command, "Something went horribly wrong and keyvalue parser died.");

                            return;
                        }
                    }

                    PrintBinary(command, kv, string.Concat("bins_", os));
                    PrintBinary(command, kv, string.Concat("bins_client_", os));
                };

                var isStable = args.Length > 1 && args[1].Equals("stable");

                webClient.DownloadDataAsync(new Uri(string.Format("{0}steam_client_{1}{2}?_={3}", CDN, isStable ? "" : "publicbeta_", os, DateTime.UtcNow.Ticks)));
            }
        }
コード例 #22
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} players <appid or partial game name>", Colors.OLIVE);
                CommandHandler.ReplyToCommand(command, true, "Use {0}^{1} and {2}${3} just like in regex to narrow down your match, e.g:{4} !players Portal$", Colors.BLUE, Colors.NORMAL, Colors.BLUE, Colors.NORMAL, Colors.OLIVE);

                return;
            }

            uint appID;

            if (!uint.TryParse(command.Message, out appID))
            {
                string name = command.Message;

                if (!Utils.ConvertUserInputToSQLSearch(ref name))
                {
                    CommandHandler.ReplyToCommand(command, "Your request is invalid or too short.");

                    return;
                }

                using (var db = Database.GetConnection())
                {
                    appID = db.ExecuteScalar <uint>("SELECT `AppID` FROM `Apps` LEFT JOIN `AppsTypes` ON `Apps`.`AppType` = `AppsTypes`.`AppType` WHERE (`AppsTypes`.`Name` IN ('game', 'application') AND (`Apps`.`StoreName` LIKE @Name OR `Apps`.`Name` LIKE @Name)) OR (`AppsTypes`.`Name` = 'unknown' AND `Apps`.`LastKnownName` LIKE @Name) ORDER BY `LastUpdated` DESC LIMIT 1", new { Name = name });
                }

                if (appID == 0)
                {
                    CommandHandler.ReplyToCommand(command, "Nothing was found matching your request.");

                    return;
                }
            }

            JobManager.AddJob(
                () => Steam.Instance.UserStats.GetNumberOfCurrentPlayers(appID),
                new JobManager.IRCRequest
            {
                Target  = appID,
                Command = command
            }
                );
        }
コード例 #23
0
        public override async void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} bins <{1}> [stable (returns publicbeta by default)]", Colors.OLIVE, string.Join("/", Systems));

                return;
            }

            var    args = command.Message.Split(' ');
            string os   = args[0];

            if (os == "windows")
            {
                os = "win32";
            }
            else if (os == "linux")
            {
                os = "ubuntu12";
            }

            if (!Systems.Contains(os))
            {
                CommandHandler.ReplyToCommand(command, "Invalid OS. Valid ones are: {0}", string.Join(", ", Systems));

                return;
            }

            using (var webClient = new WebClient())
            {
                var    isStable = args.Length > 1 && args[1].Equals("stable");
                string data     = await webClient.DownloadStringTaskAsync(new Uri(string.Format("{0}steam_client_{1}{2}?_={3}", CDN, isStable ? "" : "publicbeta_", os, DateTime.UtcNow.Ticks)));

                var kv = KeyValue.LoadFromString(data);

                if (kv == null)
                {
                    throw new Exception("Failed to parse downloaded client manifest.");
                }

                PrintBinary(command, kv, string.Concat("bins_", os));
                PrintBinary(command, kv, string.Concat("bins_client_", os));
            }
        }
コード例 #24
0
        public override async void OnCommand(CommandArguments command)
        {
            uint subID;

            if (command.Message.Length == 0 || !uint.TryParse(command.Message, out subID))
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} sub <subid>", Colors.OLIVE);

                return;
            }

            var count = PICSProductInfo.ProcessedSubs.Count;

            if (count > 100)
            {
                CommandHandler.ReplyToCommand(command, "There are currently {0} packages awaiting to be processed, try again later.", count);

                return;
            }

            var job = await Steam.Instance.Apps.PICSGetProductInfo(null, subID, false, false);

            var callback = job.Results.First(x => !x.ResponsePending);

            if (!callback.Packages.ContainsKey(subID))
            {
                CommandHandler.ReplyToCommand(command, "Unknown SubID: {0}{1}{2}", Colors.BLUE, subID, LicenseList.OwnedSubs.ContainsKey(subID) ? SteamDB.StringCheckmark : string.Empty);

                return;
            }

            var info = callback.Packages[subID];

            info.KeyValues.SaveToFile(Path.Combine(Application.Path, "sub", string.Format("{0}.vdf", info.ID)), false);

            CommandHandler.ReplyToCommand(command, "{0}{1}{2} -{3} {4}{5} - Dump:{6} {7}{8}{9}{10}",
                                          Colors.BLUE, Steam.GetPackageName(info.ID), Colors.NORMAL,
                                          Colors.DARKBLUE, SteamDB.GetPackageURL(info.ID), Colors.NORMAL,
                                          Colors.DARKBLUE, SteamDB.GetRawPackageURL(info.ID), Colors.NORMAL,
                                          info.MissingToken ? SteamDB.StringNeedToken : string.Empty,
                                          LicenseList.OwnedSubs.ContainsKey(info.ID) ? SteamDB.StringCheckmark : string.Empty
                                          );
        }
コード例 #25
0
        private void OnDisconnected(SteamClient.DisconnectedCallback callback)
        {
            if (!IsRunning)
            {
                Timer.Stop();

                Log.WriteInfo("Steam", "Disconnected from Steam");

                return;
            }

            if (Timer.Enabled)
            {
                IRC.SendMain("Disconnected from Steam. See{0} http://steamstat.us", Colors.DARK_BLUE);
            }

            Timer.Stop();

            GameCoordinator.UpdateStatus(0, EResult.NoConnection.ToString());

            if (SteamProxy.Instance.IRCRequests.Count > 0)
            {
                foreach (var request in SteamProxy.Instance.IRCRequests)
                {
                    CommandHandler.ReplyToCommand(request.Command, "{0}{1}{2}: Your request failed.", Colors.OLIVE, request.Command.Nickname, Colors.NORMAL);
                }

                SteamProxy.Instance.IRCRequests.Clear();
            }

            const uint RETRY_DELAY = 15;

            Log.WriteInfo("Steam", "Disconnected from Steam. Retrying in {0} seconds...", RETRY_DELAY);

            IRC.SendEmoteAnnounce("disconnected from Steam. Retrying in {0} seconds...", RETRY_DELAY);

            Thread.Sleep(TimeSpan.FromSeconds(RETRY_DELAY));

            Client.Connect();
        }
コード例 #26
0
        public void OnNumberOfPlayers(SteamUserStats.NumberOfPlayersCallback callback, JobID jobID)
        {
            var request = IRCRequests.Find(r => r.JobID == jobID);

            if (request == null)
            {
                return;
            }

            IRCRequests.Remove(request);

            if (callback.Result != EResult.OK)
            {
                CommandHandler.ReplyToCommand(request.Command, "{0}{1}{2}: Unable to request player count: {3}", Colors.OLIVE, request.Command.Nickname, Colors.NORMAL, callback.Result);
            }
            else if (request.Target == 0)
            {
                CommandHandler.ReplyToCommand(request.Command, "{0}{1}{2}: {3}{4:N0}{5} people praising lord Gaben right now, influence:{6} {7}", Colors.OLIVE, request.Command.Nickname, Colors.NORMAL, Colors.OLIVE, callback.NumPlayers, Colors.NORMAL, Colors.DARK_BLUE, SteamDB.GetGraphURL(0));
            }
            else
            {
                string graphUrl = string.Empty;
                string name     = GetAppName(request.Target);

                using (MySqlDataReader Reader = DbWorker.ExecuteReader("SELECT `AppID` FROM `ImportantApps` WHERE (`Graph` = 1 OR `MaxPlayers` > 0) AND `AppID` = @AppID", new MySqlParameter("AppID", request.Target)))
                {
                    if (Reader.Read())
                    {
                        graphUrl = string.Format("{0} -{1} {2}", Colors.NORMAL, Colors.DARK_BLUE, SteamDB.GetGraphURL(request.Target));
                    }
                }

                CommandHandler.ReplyToCommand(request.Command, "{0}{1}{2}: People playing {3}{4}{5} right now: {6}{7:N0}{8} -{9} {10}{11}",
                                              Colors.OLIVE, request.Command.Nickname, Colors.NORMAL,
                                              Colors.OLIVE, name, Colors.NORMAL,
                                              Colors.GREEN, callback.NumPlayers, Colors.NORMAL,
                                              Colors.DARK_BLUE, SteamDB.GetAppURL(request.Target), graphUrl);
            }
        }
コード例 #27
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} pubfile <pubfileid>", Colors.OLIVE);

                return;
            }

            ulong pubFileId;

            if (!ulong.TryParse(command.Message, out pubFileId))
            {
                CommandHandler.ReplyToCommand(command, "Invalid Published File ID");

                return;
            }

            var pubFileRequest = new CPublishedFile_GetDetails_Request
            {
                includeadditionalpreviews = true,
                includetags   = true,
                includekvtags = true,
                includevotes  = true,
                //includeforsaledata = true, // TODO: Needs updated steamkit
            };

            pubFileRequest.publishedfileids.Add(pubFileId);

            JobManager.AddJob(
                () => PublishedFiles.SendMessage(api => api.GetDetails(pubFileRequest)),
                new JobManager.IRCRequest
            {
                Type    = JobManager.IRCRequestType.TYPE_PUBFILE,
                Command = command
            }
                );
        }
コード例 #28
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Equals("list", StringComparison.CurrentCultureIgnoreCase))
            {
                CommandHandler.ReplyToCommand(command, string.Join(", ", SteamKitEnums.Select(@enum => @enum.Name)));

                return;
            }

            var args = command.Message.Split(' ');

            if (args.Length < 1)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} enum <enumname> [value or substring [deprecated]]", Colors.OLIVE);

                return;
            }

            var enumType = args[0].Replace("SteamKit2.", "");

            var matchingEnumType = SteamKitEnums
                                   .FirstOrDefault(x => x.Name.Equals(enumType, StringComparison.InvariantCultureIgnoreCase) || GetDottedTypeName(x).IndexOf(enumType, StringComparison.OrdinalIgnoreCase) != -1);

            if (matchingEnumType == null)
            {
                CommandHandler.ReplyToCommand(command, "No such enum type.");

                return;
            }

            bool includeDeprecated = args.Length > 2 && args[2].Equals("deprecated", StringComparison.InvariantCultureIgnoreCase);

            GetType().GetMethod("RunForEnum", BindingFlags.Instance | BindingFlags.NonPublic)
            .MakeGenericMethod(matchingEnumType)
            .Invoke(this, new object[] { args.Length > 1 ? args[1] : string.Empty, command, includeDeprecated });
        }
コード例 #29
0
        public void OnChatMessage(SteamFriends.ChatMsgCallback callback)
        {
            if (callback.ChatMsgType != EChatEntryType.ChatMsg || callback.Message[0] != '!' || callback.Message.Contains('\n'))
            {
                return;
            }

            var i            = callback.Message.IndexOf(' ');
            var inputCommand = i == -1 ? callback.Message : callback.Message.Substring(0, i);

            Action <CommandHandler.CommandArguments> callbackFunction;

            if (CommandHandler.Commands.TryGetValue(inputCommand, out callbackFunction))
            {
                var input = i == -1 ? string.Empty : callback.Message.Substring(i).Trim();

                var command = new CommandHandler.CommandArguments
                {
                    SenderID   = callback.ChatterID,
                    ChatRoomID = callback.ChatRoomID,
                    Nickname   = Steam.Instance.Friends.GetFriendPersonaName(callback.ChatterID),
                    Message    = input
                };

                if (SteamDB.IsBusy())
                {
                    CommandHandler.ReplyToCommand(command, "{0}{1}{2}: The bot is currently busy.", Colors.OLIVE, command.Nickname, Colors.NORMAL);

                    return;
                }

                Log.WriteInfo("Steam", "Handling command {0} for user {1} in chatroom {2}", inputCommand, callback.ChatterID, callback.ChatRoomID);

                callbackFunction(command);
            }
        }
コード例 #30
0
        public override void OnCommand(CommandArguments command)
        {
            if (command.Message.Length == 0)
            {
                CommandHandler.ReplyToCommand(command, "Usage:{0} steamid <steamid> [individual/group/gamegroup]", Colors.OLIVE);

                return;
            }

            var args    = command.Message.Split(' ');
            var urlType = EVanityURLType.Default;

            if (args.Length > 1)
            {
                switch (args[1])
                {
                case "individual":
                    urlType = EVanityURLType.Individual;
                    break;

                case "group":
                    urlType = EVanityURLType.Group;
                    break;

                case "game":
                case "gamegroup":
                    urlType = EVanityURLType.OfficialGameGroup;
                    break;

                default:
                    CommandHandler.ReplyToCommand(command, "Invalid vanity url type.");
                    return;
                }
            }

            SteamID steamID;

            if (urlType != EVanityURLType.Default || !TrySetSteamID(args[0], out steamID))
            {
                if (urlType == EVanityURLType.Default)
                {
                    urlType = EVanityURLType.Individual;
                }

                var eResult = ResolveVanityURL(args[0], urlType, out steamID);

                if (eResult != EResult.OK)
                {
                    CommandHandler.ReplyToCommand(command, "Failed to resolve vanity url: {0}{1}", Colors.RED, eResult.ToString());

                    return;
                }
            }

            CommandHandler.ReplyToCommand(command, ExpandSteamID(steamID));

            if (!steamID.IsValid || (!steamID.IsIndividualAccount && !steamID.IsClanAccount))
            {
                return;
            }

            JobAction job;

            if (JobManager.TryRemoveJob(new JobID(steamID), out job) && job.IsCommand)
            {
                CommandHandler.ReplyToCommand(job.CommandRequest.Command, true, "Your !steamid request was lost in space.");
            }

            JobManager.AddJob(
                () => FakePersonaStateJob(steamID),
                new JobManager.IRCRequest
            {
                Command = command
            }
                );
        }