AllJokes.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. const jsl = require("svjsl");
  2. const parseJokes = require("../parseJokes");
  3. const languages = require("../languages");
  4. const settings = require("../../settings");
  5. jsl.unused(parseJokes); // only used for typedefs
  6. // expected format:
  7. /*
  8. {
  9. "en": {
  10. info: {
  11. formatVersion: 2
  12. },
  13. jokes: [
  14. {
  15. (joke)
  16. },
  17. ...
  18. ]
  19. },
  20. ...
  21. }
  22. */
  23. /**
  24. * @typedef {Object} CountPerLangObj
  25. * @prop {Number} [en]
  26. * @prop {Number} [de]
  27. */
  28. /**
  29. * @typedef {Object} SafeJokesPerLangObj
  30. * @prop {String} lang lang code
  31. * @prop {Number} count amount of safe jokes
  32. */
  33. class AllJokes
  34. {
  35. /**
  36. * Constructs a new AllJokes object. This object contains all methods to get certain jokes
  37. * @param {Object} jokeArray
  38. */
  39. constructor(jokeArray)
  40. {
  41. this.jokes = {};
  42. let jokeCount = 0;
  43. let formatVersions = [];
  44. let jokeCountPerLang = {};
  45. this._safeJokes = [];
  46. //#SECTION check validity, get joke count and get format versions
  47. Object.keys(jokeArray).forEach(key => {
  48. let lValid = languages.isValidLang(key);
  49. if(lValid !== true)
  50. throw new Error(`Invalid language code in construction of an AllJokes object. Expected valid two character language code - got "${key}": ${lValid}`);
  51. let currentLangSafeJokesCount = 0;
  52. if(!jokeCountPerLang[key])
  53. jokeCountPerLang[key] = 0;
  54. jokeCount += jokeArray[key].jokes.length;
  55. jokeCountPerLang[key] += jokeArray[key].jokes.length;
  56. let fv = jokeArray[key].info.formatVersion;
  57. // iterates over each joke of the current language
  58. jokeArray[key].jokes.forEach((j, i) => {
  59. if(j.safe === true)
  60. currentLangSafeJokesCount++;
  61. jokeArray[key].jokes[i].lang = key;
  62. });
  63. if(fv != settings.jokes.jokesFormatVersion)
  64. throw new Error(`Error: Jokes file with language ${key} has the wrong format version. Expected ${settings.jokes.jokesFormatVersion} but got ${fv}`);
  65. formatVersions.push(fv);
  66. this._safeJokes.push({
  67. lang: key,
  68. count: currentLangSafeJokesCount
  69. });
  70. });
  71. formatVersions.push(settings.jokes.jokesFormatVersion);
  72. if(!jsl.allEqual(formatVersions))
  73. throw new Error(`Error: One or more of the jokes-xy.json files contain(s) a wrong formatVersion parameter`);
  74. if(typeof jokeArray != "object" || Array.isArray(jokeArray))
  75. throw new Error(`Error while constructing a new AllJokes object: parameter "jokeArray" is invalid`);
  76. this.jokes = jokeArray;
  77. this._jokeCount = jokeCount;
  78. this._jokeCountPerLang = jokeCountPerLang;
  79. this._formatVersions = formatVersions;
  80. return this;
  81. }
  82. /**
  83. * Returns an array of all jokes of the specified language
  84. * @param {String} [langCode="en"] Two character language code
  85. * @returns {Array<parseJokes.SingleJoke|parseJokes.TwopartJoke>}
  86. */
  87. getJokeArray(langCode)
  88. {
  89. if(languages.isValidLang(langCode) !== true)
  90. langCode = settings.languages.defaultLanguage;
  91. return (typeof this.jokes[langCode] == "object" ? this.jokes[langCode].jokes : []);
  92. }
  93. /**
  94. * Returns the joke format version
  95. * @param {String} [langCode="en"] Two character language code
  96. * @returns {Number|undefined} Returns a number if the format version was set, returns undefined, if not
  97. */
  98. getFormatVersion(langCode)
  99. {
  100. if(languages.isValidLang(langCode) !== true)
  101. langCode = settings.languages.defaultLanguage;
  102. if(typeof this.jokes[langCode] != "object")
  103. return undefined;
  104. return this.jokes[langCode].info ? this.jokes[langCode].info.formatVersion : undefined;
  105. }
  106. /**
  107. * Returns the (human readable / 1-indexed) count of jokes
  108. * @returns {Number}
  109. */
  110. getJokeCount()
  111. {
  112. return this._jokeCount;
  113. }
  114. /**
  115. * Returns an object containing joke counts for every lang code
  116. * @returns {CountPerLangObj}
  117. */
  118. getJokeCountPerLang()
  119. {
  120. return this._jokeCountPerLang;
  121. }
  122. /**
  123. * Returns an object containing the count of safe jokes per language
  124. * @returns {SafeJokesPerLangObj[]}
  125. */
  126. getSafeJokes()
  127. {
  128. return this._safeJokes;
  129. }
  130. }
  131. module.exports = AllJokes;