/// <summary>
        /// Get the player info from game's databse
        /// </summary>
        static private async Task <NameOutfitFactionRecord> FetchPlayerInfo(JsonString id)
        {
            JsonObject json;
            int        retry = 0;

            // try to resolve player info from database at most 3 times before returning unresolved record
            do
            {
                string uri = $@"http://census.daybreakgames.com/s:{PS2APIConstants.ServiceId}/get/ps2/character_name/?character_id={id.InnerString}&c:join=character^inject_at:character^show:faction_id(outfit_member_extended^inject_at:outfit^show:alias%27name)";
                json = await PS2APIUtils.RestAPIRequestClient(uri);
            } while (json == null && ++retry < 3);

            NameOutfitFactionRecord record = new NameOutfitFactionRecord();

            if ((record.Name = (json?["character_name_list"]?[0]?["name"]?["first"] as JsonString)?.InnerString) == null)
            {
                record.Name = $"<Character:{id.InnerString}>";
            }
            if ((record.Faction = (json?["character_name_list"]?[0]?["character"]?["faction_id"] as JsonString)?.InnerString) == null)
            {
                record.Faction = $"<CharacterFaction:{id.InnerString}>";
            }
            // no outfit is possible value
            record.Outfit = (json?["character_name_list"]?[0]?["character"]?["outfit"]?["alias"] as JsonString)?.InnerString;
            record.Id     = id;

            return(record);
        }
Ejemplo n.º 2
0
        public OutfitMembersTracker(string alias, string logfile)
        {
            OutfitAlias = new JsonString(alias);

            token = tokenSource.Token;

            // get information about outfit members
            string outfitQuerry = $@"https://census.daybreakgames.com/s:{PS2APIConstants.ServiceId}/get/ps2/outfit?alias_lower={alias.ToLower()}&c:show=outfit_id,name&c:join=type:outfit_member^on:outfit_id^list:1^inject_at:members^show:character_id%27rank%27rank_ordinal(character^show:name^inject_at:character(characters_online_status^inject_at:onlineStatus^hide:character_id))";

            Console.WriteLine("Outfit data request sent");
            var outfitTask = PS2APIUtils.RestAPIRequestClient(outfitQuerry);

            int onlineCount = 0;

            JsonObject response = outfitTask.GetAwaiter().GetResult();

            if (response == null)
            {
                throw new Exception("Outfit data request failed");
            }
            Console.WriteLine("Outfit data response received");

            try
            {
                JsonArray found = (JsonArray)response["outfit_list"];
                if (found == null)
                {
                    throw new JsonInvalidAccessException("Outfit list wrong format?\n" + response.ToString());
                }

                if (found.Length > 0)
                {
                    var outfit = found[0];
                    OutfitId   = (JsonString)outfit["outfit_id"];
                    OutfitName = (JsonString)outfit["name"];
                    JsonArray members = (JsonArray)outfit["members"];

                    for (int i = 0; i < members.Length; i++)
                    {
                        var id = (JsonString)members?[i]?["character_id"];
                        if (id == null || id.InnerString == "0")
                        {
                            continue;
                        }
                        var name   = (JsonString)members?[i]?["character"]?["name"]?["first"];
                        var rank   = (JsonString)members?[i]?["rank"];
                        var online = (JsonString)members?[i]?["character"]?["onlineStatus"]?["online_status"];

                        Members.Add(new Member()
                        {
                            Name = name, Rank = rank, Id = id
                        });

                        if (online != null && online.InnerString != "0")
                        {
                            onlineCount++;
                        }
                    }
                }
                else
                {
                    throw new Exception($"Outfit with tag '{alias}' not found!");
                }
            }
            catch (InvalidCastException)
            {
                throw new JsonInvalidAccessException("Could not extract outfit info");
            }

            Console.WriteLine($"Outfit ID: {OutfitId}");
            Console.WriteLine($"Outfit Name: {OutfitName}");
            Console.WriteLine($"Total members registered: {Members.Count}");
            Console.WriteLine($"Online members: {onlineCount}");
        }