GridManager.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. const http = require('http')
  2. ,util = require('util')
  3. ,crypto = require('crypto')
  4. ,Grid = require('./Grid.js').Grid;
  5. const RCILIST = 'http://rcijeux.fr/drupal_game/20minutes/menu/js/jeux_mfleches.js?date=1495635261516'
  6. ,RCIGETGRID = 'http://rcijeux.fr/drupal_game/20minutes/grids/%s.mfj'
  7. ,DEBUG_QUERY = true
  8. ,CACHE_EXPIRACY = 86400000; // 1 day
  9. const GRID_CACHE = {
  10. data: {},
  11. expireAt: 0
  12. }
  13. ,GRID_DATA = {}; // TODO expiracy
  14. function extractVar(data) {
  15. var first = data.indexOf('{')
  16. ,last = data.indexOf('}');
  17. if (first == -1 || last == -1 || last < first)
  18. return null;
  19. try {
  20. var dataObj;
  21. eval("dataObj="+data.substr(first, last));
  22. return dataObj;
  23. } catch (e) {
  24. return null;
  25. }
  26. return null; // unreachable
  27. }
  28. function getVar(url, cb) {
  29. http.get(url, (res) => {
  30. let chunks = null;
  31. res.on('data', (chunk) => {
  32. if (chunks)
  33. chunks = Buffer.concat([chunks, chunk], chunks.length +chunk.length);
  34. else
  35. chunks = Buffer.from(chunk);
  36. });
  37. res.once('end', () => {
  38. cb(extractVar(chunks.toString("utf8")));
  39. });
  40. });
  41. }
  42. module.exports.listGrids = function(cb) {
  43. if (DEBUG_QUERY) {
  44. console.warn("[gridManager] debug skip list grids");
  45. cb({"240517":{ level: '1' }});
  46. } else {
  47. const now = Date.now();
  48. if (GRID_CACHE.expireAt < now) {
  49. console.log("[gridManager] list grids");
  50. getVar(RCILIST, (grids) => {
  51. if (grids) {
  52. let gridObjects = {};
  53. for (let gridId in grids) {
  54. gridObjects[gridId] = {
  55. "level": grids[gridId][1]
  56. };
  57. }
  58. GRID_CACHE.data = gridObjects;
  59. GRID_CACHE.expireAt = now +CACHE_EXPIRACY;
  60. cb(gridObjects);
  61. } else {
  62. cb(null);
  63. }
  64. });
  65. } else {
  66. cb(GRID_CACHE.data);
  67. }
  68. }
  69. };
  70. module.exports.createGrid = function(gridPublicId, gridId, cb) {
  71. console.log("[gridManager] get grid " +gridId);
  72. getVar(util.format(RCIGETGRID, gridId), (data) => {
  73. if (data) {
  74. var grid = GRID_DATA[gridPublicId] = new Grid(gridPublicId, data);
  75. cb(grid);
  76. } else {
  77. cb(null);
  78. }
  79. });
  80. };
  81. module.exports.get = function(gridPublicId) {
  82. return GRID_DATA[gridPublicId] || null;
  83. };
  84. module.exports.hash = function(toHash) {
  85. var md5sum = crypto.createHash('sha1');
  86. md5sum.update(toHash);
  87. return md5sum.digest('base64');
  88. };