private static void RetrieveAllModInfoAsync(Action <bool, BasicModInfoDatabase> onCompletion)
        {
            Action <Exception, string> onError = (e, jsonStr) => {
                if (e == null)
                {
                    LogHelpers.Alert((jsonStr.Trunc(64) ?? "") + " - Invalid exception?");
                }
                else if (e is JsonReaderException)
                {
                    LogHelpers.Alert("Bad JSON: " + jsonStr.Trunc(256));
                }
                else if (e is WebException || e is NullReferenceException)
                {
                    LogHelpers.Alert(("'" + jsonStr.Trunc(64) + "'" ?? "...") + " - " + e.Message);
                }
                else
                {
                    LogHelpers.Alert(("'" + jsonStr.Trunc(64) + "'" ?? "...") + " - " + e.ToString());
                }
            };

            Action <bool, string> onWrappedCompletion = (success, jsonStr) => {
                BasicModInfoDatabase modInfoDb;

                if (success)
                {
                    try {
                        success = GetModInfo.HandleModInfoReceipt(jsonStr, out modInfoDb);
                    } catch (Exception e) {
                        modInfoDb = new BasicModInfoDatabase();
                        onError(e, jsonStr);
                    }
                }
                else
                {
                    modInfoDb = new BasicModInfoDatabase();
                }

                onCompletion(success, modInfoDb);
            };

            WebConnectionHelpers.MakeGetRequestAsync(GetModInfo.ModInfoUrl, e => onError(e, ""), onWrappedCompletion);
        }
Ejemplo n.º 2
0
 public ModInfoListLoadHookArguments()
 {
     this.Found   = false;
     this.ModInfo = new BasicModInfoDatabase();
 }
        private static bool HandleModInfoReceipt(string jsonStr, out BasicModInfoDatabase modInfoDb)
        {
            modInfoDb = new BasicModInfoDatabase();

            JObject respJson = JObject.Parse(jsonStr);

            if (respJson.Count == 0)
            {
                return(false);
            }

            IEnumerable <JToken> modList;
            string modlistCompressed = (string)respJson["modlist_compressed"];

            // From tModLoader's code:
            if (modlistCompressed != null)
            {
                byte[] data      = Convert.FromBase64String(modlistCompressed);
                var    memStream = new MemoryStream(data);

                using (var zip = new GZipStream(memStream, CompressionMode.Decompress)) {
                    using (var reader = new StreamReader(zip)) {
                        modList = JArray.Parse(reader.ReadToEnd());
                    }
                }
            }
            else
            {
                // Fallback if needed.
                modList = (JArray)respJson["modlist"];
            }

            /*JToken modListToken = respJson.SelectToken( "modlist_compressed" );
             * if( modListToken == null ) {
             *      throw new NullReferenceException( "No modlist" );
             * }
             *
             * JToken[] modList = modListToken.ToArray();*/

            foreach (JToken modEntry in modList)
            {
                JToken modNameToken        = modEntry.SelectToken("name");
                JToken modDisplaynameToken = modEntry.SelectToken("displayname");
                JToken modAuthorToken      = modEntry.SelectToken("author");
                JToken modVersRawToken     = modEntry.SelectToken("version");
                //JToken modDescRawToken = modEntry.SelectToken( "hasdescription" );
                //JToken modHomepageRawToken = modEntry.SelectToken( "homepage" );

                if (modNameToken == null || modVersRawToken == null || modDisplaynameToken == null || modAuthorToken == null
                    /*|| hasDescRawToken == null || modHomepageRawToken == null*/)
                {
                    continue;
                }

                string modName        = modNameToken.ToObject <string>();
                string modDisplayName = modDisplaynameToken.ToObject <string>();
                string modVersRaw     = modVersRawToken.ToObject <string>();
                //string modDesc = modDescRawToken?.ToObject<string>() ?? null;
                //string modHomepage = modHomepageRawToken.ToObject<string>();

                Version modVers = Version.Parse(modVersRaw.Substring(1));
                IEnumerable <string> modAuthors = modAuthorToken.ToObject <string>()
                                                  .Split(',')
                                                  .SafeSelect(a => a.Trim());

                modInfoDb[modName] = new BasicModInfo(modDisplayName, modAuthors, modVers, null, null);                      //modDesc, modHomepage
            }

            return(true);
        }