@lotus-tree/fg-notation 1.0.0 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +67 -0
  2. package/babel.config.js +6 -0
  3. package/dev/img/basic/1.png +0 -0
  4. package/dev/img/basic/12369.png +0 -0
  5. package/dev/img/basic/1237.png +0 -0
  6. package/dev/img/basic/1632143.png +0 -0
  7. package/dev/img/basic/2.png +0 -0
  8. package/dev/img/basic/21.png +0 -0
  9. package/dev/img/basic/214.png +0 -0
  10. package/dev/img/basic/21478.png +0 -0
  11. package/dev/img/basic/23.png +0 -0
  12. package/dev/img/basic/236.png +0 -0
  13. package/dev/img/basic/23698.png +0 -0
  14. package/dev/img/basic/28.png +0 -0
  15. package/dev/img/basic/3.png +0 -0
  16. package/dev/img/basic/32147.png +0 -0
  17. package/dev/img/basic/3219.png +0 -0
  18. package/dev/img/basic/341236.png +0 -0
  19. package/dev/img/basic/346.png +0 -0
  20. package/dev/img/basic/360.png +0 -0
  21. package/dev/img/basic/4.png +0 -0
  22. package/dev/img/basic/41236.png +0 -0
  23. package/dev/img/basic/421.png +0 -0
  24. package/dev/img/basic/46.png +0 -0
  25. package/dev/img/basic/4618346.png +0 -0
  26. package/dev/img/basic/47896.png +0 -0
  27. package/dev/img/basic/5.png +0 -0
  28. package/dev/img/basic/6.png +0 -0
  29. package/dev/img/basic/623.png +0 -0
  30. package/dev/img/basic/63214.png +0 -0
  31. package/dev/img/basic/64.png +0 -0
  32. package/dev/img/basic/6428.png +0 -0
  33. package/dev/img/basic/69874.png +0 -0
  34. package/dev/img/basic/7.png +0 -0
  35. package/dev/img/basic/7891.png +0 -0
  36. package/dev/img/basic/8.png +0 -0
  37. package/dev/img/basic/81237.png +0 -0
  38. package/dev/img/basic/82.png +0 -0
  39. package/dev/img/basic/87412.png +0 -0
  40. package/dev/img/basic/89632.png +0 -0
  41. package/dev/img/basic/9.png +0 -0
  42. package/dev/img/basic/[1].png +0 -0
  43. package/dev/img/basic/[2].png +0 -0
  44. package/dev/img/basic/[2]8.png +0 -0
  45. package/dev/img/basic/[3].png +0 -0
  46. package/dev/img/basic/[4].png +0 -0
  47. package/dev/img/basic/[6].png +0 -0
  48. package/dev/img/basic/[7].png +0 -0
  49. package/dev/img/basic/[8].png +0 -0
  50. package/dev/img/basic/[9].png +0 -0
  51. package/dev/img/basic/air.png +0 -0
  52. package/dev/img/basic/doubleforward.png +0 -0
  53. package/dev/img/credits.txt +4 -0
  54. package/dev/img/games/bb/a.png +0 -0
  55. package/dev/img/games/bb/b.png +0 -0
  56. package/dev/img/games/bb/c.png +0 -0
  57. package/dev/img/games/bb/d.png +0 -0
  58. package/dev/img/games/dbz/a1.png +0 -0
  59. package/dev/img/games/dbz/a2.png +0 -0
  60. package/dev/img/games/dbz/h.png +0 -0
  61. package/dev/img/games/dbz/l.png +0 -0
  62. package/dev/img/games/dbz/m.png +0 -0
  63. package/dev/img/games/dbz/s.png +0 -0
  64. package/dev/img/games/dnf/a.png +0 -0
  65. package/dev/img/games/dnf/as.png +0 -0
  66. package/dev/img/games/dnf/b.png +0 -0
  67. package/dev/img/games/dnf/g.png +0 -0
  68. package/dev/img/games/dnf/ms.png +0 -0
  69. package/dev/img/games/dnf/s.png +0 -0
  70. package/dev/img/games/gbf/g.png +0 -0
  71. package/dev/img/games/gbf/h.png +0 -0
  72. package/dev/img/games/gbf/l.png +0 -0
  73. package/dev/img/games/gbf/m.png +0 -0
  74. package/dev/img/games/gbf/s.png +0 -0
  75. package/dev/img/games/gg/d.png +0 -0
  76. package/dev/img/games/gg/hs.png +0 -0
  77. package/dev/img/games/gg/k.png +0 -0
  78. package/dev/img/games/gg/p.png +0 -0
  79. package/dev/img/games/gg/rc.png +0 -0
  80. package/dev/img/games/gg/s.png +0 -0
  81. package/dev/img/games/kof/a.png +0 -0
  82. package/dev/img/games/kof/b.png +0 -0
  83. package/dev/img/games/kof/c.png +0 -0
  84. package/dev/img/games/kof/d.png +0 -0
  85. package/dev/img/games/kof/max.png +0 -0
  86. package/dev/img/games/mk/1.png +0 -0
  87. package/dev/img/games/mk/2.png +0 -0
  88. package/dev/img/games/mk/3.png +0 -0
  89. package/dev/img/games/mk/4.png +0 -0
  90. package/dev/img/games/sc/[a].png +0 -0
  91. package/dev/img/games/sc/[b].png +0 -0
  92. package/dev/img/games/sc/[g].png +0 -0
  93. package/dev/img/games/sc/[k].png +0 -0
  94. package/dev/img/games/sc/a.png +0 -0
  95. package/dev/img/games/sc/b.png +0 -0
  96. package/dev/img/games/sc/g.png +0 -0
  97. package/dev/img/games/sc/k.png +0 -0
  98. package/dev/img/games/sf/hk.png +0 -0
  99. package/dev/img/games/sf/hp.png +0 -0
  100. package/dev/img/games/sf/j..png +0 -0
  101. package/dev/img/games/sf/lk.png +0 -0
  102. package/dev/img/games/sf/lp.png +0 -0
  103. package/dev/img/games/sf/max.png +0 -0
  104. package/dev/img/games/sf/mk.png +0 -0
  105. package/dev/img/games/sf/mp.png +0 -0
  106. package/dev/img/games/sf/tap.png +0 -0
  107. package/dev/img/games/sg/hk.png +0 -0
  108. package/dev/img/games/sg/hp.png +0 -0
  109. package/dev/img/games/sg/k.png +0 -0
  110. package/dev/img/games/sg/lk.png +0 -0
  111. package/dev/img/games/sg/lp.png +0 -0
  112. package/dev/img/games/sg/mk.png +0 -0
  113. package/dev/img/games/sg/mp.png +0 -0
  114. package/dev/img/games/sg/p.png +0 -0
  115. package/dev/img/games/tfh/a.png +0 -0
  116. package/dev/img/games/tfh/b.png +0 -0
  117. package/dev/img/games/tfh/c.png +0 -0
  118. package/dev/img/games/tfh/d.png +0 -0
  119. package/dev/img/games/tkn/1.png +0 -0
  120. package/dev/img/games/tkn/12.png +0 -0
  121. package/dev/img/games/tkn/1234.png +0 -0
  122. package/dev/img/games/tkn/13.png +0 -0
  123. package/dev/img/games/tkn/14.png +0 -0
  124. package/dev/img/games/tkn/2.png +0 -0
  125. package/dev/img/games/tkn/23.png +0 -0
  126. package/dev/img/games/tkn/24.png +0 -0
  127. package/dev/img/games/tkn/3.png +0 -0
  128. package/dev/img/games/tkn/34.png +0 -0
  129. package/dev/img/games/tkn/4.png +0 -0
  130. package/dev/img/games/tkn/b.png +0 -0
  131. package/dev/img/games/tkn/d-b.png +0 -0
  132. package/dev/img/games/tkn/d-f.png +0 -0
  133. package/dev/img/games/tkn/d.png +0 -0
  134. package/dev/img/games/tkn/f.png +0 -0
  135. package/dev/img/games/tkn/o.png +0 -0
  136. package/dev/img/games/tkn/u-b.png +0 -0
  137. package/dev/img/games/tkn/u-f.png +0 -0
  138. package/dev/img/games/tkn/u.png +0 -0
  139. package/dev/img/preview.png +0 -0
  140. package/dev/index.js +491 -0
  141. package/lib/img/games/gg/rc.png +0 -0
  142. package/lib/index.js +129 -20
  143. package/package.json +25 -10
  144. package/src/img/games/gg/rc.png +0 -0
  145. package/src/index.js +53 -8
package/lib/index.js CHANGED
@@ -11,10 +11,10 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
11
11
 
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
 
14
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
-
16
14
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
15
 
16
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
+
18
18
  var _sharp = _interopRequireDefault(require("sharp"));
19
19
 
20
20
  var _path = _interopRequireDefault(require("path"));
@@ -23,10 +23,54 @@ var _glob = _interopRequireDefault(require("glob"));
23
23
 
24
24
  var _sequelize = require("sequelize");
25
25
 
26
+ var _bent = _interopRequireDefault(require("bent"));
27
+
28
+ var getJSON = (0, _bent["default"])('json');
29
+
26
30
  var imgPath = _path["default"].join(__dirname, 'img');
27
31
 
28
32
  var basicInputs = new Map();
29
33
  var gameInputs = new Map();
34
+ var glossary = {};
35
+ var terms = [];
36
+ getGlossary();
37
+ setInterval(getGlossary, 5 * 60 * 1000);
38
+
39
+ function getGlossary() {
40
+ return _getGlossary.apply(this, arguments);
41
+ }
42
+
43
+ function _getGlossary() {
44
+ _getGlossary = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
45
+ var result, tempG, tempT;
46
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
47
+ while (1) {
48
+ switch (_context6.prev = _context6.next) {
49
+ case 0:
50
+ _context6.next = 2;
51
+ return getJSON('https://glossary.infil.net/json/glossary.json');
52
+
53
+ case 2:
54
+ result = _context6.sent;
55
+ tempG = {};
56
+ tempT = [];
57
+ result.forEach(function (i) {
58
+ var term = i.term.toLowerCase();
59
+ tempG[term] = i;
60
+ tempT.push(term);
61
+ });
62
+ glossary = tempG;
63
+ terms = tempT;
64
+
65
+ case 8:
66
+ case "end":
67
+ return _context6.stop();
68
+ }
69
+ }
70
+ }, _callee6);
71
+ }));
72
+ return _getGlossary.apply(this, arguments);
73
+ }
30
74
 
31
75
  _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
32
76
  nodir: true
@@ -64,13 +108,13 @@ function sendInput(_x, _x2, _x3, _x4) {
64
108
  }
65
109
 
66
110
  function _sendInput() {
67
- _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(inputs, result, message, caption) {
111
+ _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
68
112
  var canvas;
69
- return _regenerator["default"].wrap(function _callee5$(_context5) {
113
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
70
114
  while (1) {
71
- switch (_context5.prev = _context5.next) {
115
+ switch (_context7.prev = _context7.next) {
72
116
  case 0:
73
- _context5.next = 2;
117
+ _context7.next = 2;
74
118
  return (0, _sharp["default"])({
75
119
  create: {
76
120
  width: 152 * result.length,
@@ -89,18 +133,18 @@ function _sendInput() {
89
133
  })).png().toBuffer();
90
134
 
91
135
  case 2:
92
- canvas = _context5.sent;
93
- return _context5.abrupt("return", message.reply({
136
+ canvas = _context7.sent;
137
+ return _context7.abrupt("return", message.reply({
94
138
  content: caption,
95
139
  files: [canvas]
96
140
  }));
97
141
 
98
142
  case 4:
99
143
  case "end":
100
- return _context5.stop();
144
+ return _context7.stop();
101
145
  }
102
146
  }
103
- }, _callee5);
147
+ }, _callee7);
104
148
  }));
105
149
  return _sendInput.apply(this, arguments);
106
150
  }
@@ -109,11 +153,15 @@ var builtin = {
109
153
  37: {
110
154
  game: 'sf',
111
155
  caption: '***LETS GO JUSTIN!***',
112
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 hp >> 236 236 lk'
156
+ input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
113
157
  }
114
158
  };
115
159
  var _default = {
116
160
  name: 'fg-notation',
161
+ about: {
162
+ name: 'FG Notation',
163
+ value: '[Instructions and source code](https://lotus.chitowarlock.com/fgnotation)\n[Infil\'s Fighting Game Glossary](https://glossary.infil.net)\n[MagicianStuff\'s Fighthing Game notations emotes](https://twitter.com/MagicianStuff/status/1477931054484893697)'
164
+ },
117
165
  intents: ['GUILD_MESSAGES'],
118
166
  partials: ['MESSAGE'],
119
167
  preload: function preload(sequelize) {
@@ -197,8 +245,8 @@ var _default = {
197
245
  commands: {
198
246
  fgi: {
199
247
  usage: 'fgi [game] [inputs]',
200
- desc: 'This command displays information about a command',
201
- example: 'help perms',
248
+ desc: 'Converts a list of inputs into an image',
249
+ example: 'fgi sf 236P 214K',
202
250
  execute: function () {
203
251
  var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
204
252
  var param, message, _param, game, i1, inputs, result;
@@ -250,8 +298,8 @@ var _default = {
250
298
  },
251
299
  fgsave: {
252
300
  usage: 'fgsave [game] [name] [inputs]',
253
- desc: 'This command displays information about a command',
254
- example: 'help perms',
301
+ desc: 'Saves a list of inputs into a command',
302
+ example: 'fgi sf testName 236P 214K',
255
303
  execute: function () {
256
304
  var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
257
305
  var param, sequelize, message, _param2, game, name, i1, inputs, input;
@@ -312,9 +360,9 @@ var _default = {
312
360
  }()
313
361
  },
314
362
  fgcaption: {
315
- usage: 'fgsave [name] [caption]',
316
- desc: 'This command displays information about a command',
317
- example: 'help perms',
363
+ usage: 'fgcaption [name] [caption]',
364
+ desc: 'Adds a caption to a saved input command',
365
+ example: 'fgcaption testName This is a caption',
318
366
  execute: function () {
319
367
  var _execute3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(_ref5, _ref6) {
320
368
  var param, sequelize, message, _param3, name, i1, row;
@@ -373,10 +421,71 @@ var _default = {
373
421
  return _execute3.apply(this, arguments);
374
422
  }
375
423
 
424
+ return execute;
425
+ }()
426
+ },
427
+ fgglossary: {
428
+ usage: 'fgglossary [search term]',
429
+ desc: 'Searches for a term on Infil\'s Glossary',
430
+ example: 'fgglossary mexican uppercut',
431
+ execute: function () {
432
+ var _execute4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_ref7, _ref8) {
433
+ var param, sequelize, message, params, search, result, url;
434
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
435
+ while (1) {
436
+ switch (_context5.prev = _context5.next) {
437
+ case 0:
438
+ param = _ref7.param, sequelize = _ref7.sequelize;
439
+ message = _ref8.message;
440
+ params = param.slice(1);
441
+
442
+ if (!(params.length === 0)) {
443
+ _context5.next = 5;
444
+ break;
445
+ }
446
+
447
+ return _context5.abrupt("return", message.reply('Missing search term. Example: >fgglossary mexican uppercut'));
448
+
449
+ case 5:
450
+ search = params.join(' ').toLowerCase();
451
+ result = terms.filter(function (i) {
452
+ return i.includes(search);
453
+ });
454
+ url = "https://glossary.infil.net/?t=".concat(params.join('%20').toLowerCase());
455
+
456
+ if (!(result.length === 0)) {
457
+ _context5.next = 10;
458
+ break;
459
+ }
460
+
461
+ return _context5.abrupt("return", message.reply("Term \"".concat(search, "\" not found")));
462
+
463
+ case 10:
464
+ if (!(result.length === 1)) {
465
+ _context5.next = 12;
466
+ break;
467
+ }
468
+
469
+ return _context5.abrupt("return", message.reply("```".concat(glossary[result[0]].def, "```Source: <").concat(url, ">")));
470
+
471
+ case 12:
472
+ message.reply("Multiple terms found: ".concat(url));
473
+
474
+ case 13:
475
+ case "end":
476
+ return _context5.stop();
477
+ }
478
+ }
479
+ }, _callee5);
480
+ }));
481
+
482
+ function execute(_x11, _x12) {
483
+ return _execute4.apply(this, arguments);
484
+ }
485
+
376
486
  return execute;
377
487
  }()
378
488
  }
379
489
  }
380
490
  };
381
- exports["default"] = _default;
382
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJpbWdQYXRoIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJiYXNpY0lucHV0cyIsIk1hcCIsImdhbWVJbnB1dHMiLCJnbG9iIiwic3luYyIsIm5vZGlyIiwiZm9yRWFjaCIsInAiLCJpbnB1dCIsInNwbGl0IiwicG9wIiwicmVwbGFjZSIsInNldCIsInBhcnNlIiwicmVsYXRpdmUiLCJkaXIiLCJuYW1lIiwiaGFzIiwiZ2V0Iiwic29sdmVJbnB1dCIsImlucHV0cyIsImkiLCJsZW5ndGgiLCJzMSIsInNsaWNlIiwiRXJyb3IiLCJzZW5kSW5wdXQiLCJyZXN1bHQiLCJtZXNzYWdlIiwiY2FwdGlvbiIsImNyZWF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwiY2hhbm5lbHMiLCJiYWNrZ3JvdW5kIiwiY29tcG9zaXRlIiwibWFwIiwiaXQiLCJpbmRleCIsImxlZnQiLCJ0b3AiLCJwbmciLCJ0b0J1ZmZlciIsImNhbnZhcyIsInJlcGx5IiwiY29udGVudCIsImZpbGVzIiwiYnVpbHRpbiIsImdhbWUiLCJpbnRlbnRzIiwicGFydGlhbHMiLCJwcmVsb2FkIiwic2VxdWVsaXplIiwiZGVmaW5lIiwiZ3VpbGQiLCJ0eXBlIiwiRGF0YVR5cGVzIiwiU1RSSU5HIiwicHJpbWFyeUtleSIsImNyZWF0ZWRCeSIsImV2ZW50cyIsIm1lc3NhZ2VDcmVhdGUiLCJnbG9iYWwiLCJjbGllbnQiLCJjb25maWciLCJhdXRob3IiLCJpZCIsInVzZXIiLCJtZW1iZXIiLCJndWlsZElkIiwicHJlZml4Iiwic3RhcnRzV2l0aCIsIm1vZGVscyIsImZnaW5wdXQiLCJmaW5kT25lIiwid2hlcmUiLCJyb3ciLCJjb21tYW5kcyIsImZnaSIsInVzYWdlIiwiZGVzYyIsImV4YW1wbGUiLCJleGVjdXRlIiwicGFyYW0iLCJpMSIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJ0b0xvd2VyQ2FzZSIsImZsYXQiLCJmZ3NhdmUiLCJjaGFubmVsIiwic2Vu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QixzQkFBQUEsS0FBSyxFQUFFMUIsT0FBTyxDQUFDMEIsS0FBUixDQUFjWSxFQUF2QjtBQUEyQmxELHNCQUFBQSxJQUFJLEVBQUpBO0FBQTNCO0FBRDBDLG1CQUFqQyxDQUpYOztBQUFBO0FBSUQ0RCxrQkFBQUEsR0FKQzs7QUFBQSxzQkFRRkEsR0FSRTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvREFRVWhELE9BQU8sQ0FBQ2dCLEtBQVIsYUFBa0I1QixJQUFsQixrQ0FSVjs7QUFBQTtBQVNQNEQsa0JBQUFBLEdBQUcsQ0FBQy9DLE9BQUosR0FBY3NELEtBQUssQ0FBQzNELEtBQU4sQ0FBWSxDQUFaLEVBQWUxQixJQUFmLENBQW9CLEdBQXBCLENBQWQ7QUFUTztBQUFBLHlCQVVEOEUsR0FBRyxDQUFDa0IsSUFBSixFQVZDOztBQUFBO0FBWVBsRSxrQkFBQUEsT0FBTyxDQUFDK0QsT0FBUixDQUFnQkMsSUFBaEIsMENBQXNENUUsSUFBdEQ7O0FBWk87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUpFO0FBakNIO0FBOUNHLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InXHJcbmltcG9ydCB7IERhdGFUeXBlcyB9IGZyb20gJ3NlcXVlbGl6ZSdcclxuXHJcbmNvbnN0IGltZ1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaW1nJylcclxuY29uc3QgYmFzaWNJbnB1dHMgPSBuZXcgTWFwKClcclxuY29uc3QgZ2FtZUlucHV0cyA9IG5ldyBNYXAoKVxyXG5cclxuZ2xvYi5zeW5jKHBhdGguam9pbihpbWdQYXRoLCAnYmFzaWMvKionKSwgeyBub2RpcjogdHJ1ZSB9KVxyXG4gIC5mb3JFYWNoKHAgPT4ge1xyXG4gICAgY29uc3QgaW5wdXQgPSBwLnNwbGl0KCcvJykucG9wKCkucmVwbGFjZSgnLnBuZycsICcnKVxyXG4gICAgYmFzaWNJbnB1dHMuc2V0KGlucHV0LCBwKVxyXG4gIH0pXHJcblxyXG5iYXNpY0lucHV0cy5zZXQoJz4+JywgcGF0aC5qb2luKGltZ1BhdGgsICdiYXNpYy9kb3VibGVmb3J3YXJkLnBuZycpKVxyXG5cclxuZ2xvYi5zeW5jKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMvKionKSwgeyBub2RpcjogdHJ1ZSB9KVxyXG4gIC5mb3JFYWNoKHAgPT4ge1xyXG4gICAgY29uc3QgeyBkaXIsIG5hbWUgfSA9IHBhdGgucGFyc2UocGF0aC5yZWxhdGl2ZShwYXRoLmpvaW4oaW1nUGF0aCwgJ2dhbWVzJyksIHApKVxyXG5cclxuICAgIGlmICghZ2FtZUlucHV0cy5oYXMoZGlyKSkgZ2FtZUlucHV0cy5zZXQoZGlyLCBuZXcgTWFwKCkpXHJcbiAgICBnYW1lSW5wdXRzLmdldChkaXIpLnNldChuYW1lLCBwKVxyXG4gIH0pXHJcblxyXG5mdW5jdGlvbiBzb2x2ZUlucHV0IChpbnB1dHMsIGlucHV0KSB7XHJcbiAgaWYgKGlucHV0cy5oYXMoaW5wdXQpKSByZXR1cm4gW2lucHV0XVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBzMSA9IGlucHV0LnNsaWNlKDAsIDAgLSBpKVxyXG4gICAgaWYgKGlucHV0cy5oYXMoczEpKSByZXR1cm4gW3MxLCAuLi5zb2x2ZUlucHV0KGlucHV0cywgaW5wdXQuc2xpY2UoMCAtIGkpKV1cclxuICB9XHJcblxyXG4gIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgXCIke2lucHV0fVwiIGFzIGEgcmVjb2duaXphYmxlIGlucHV0YClcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2VuZElucHV0IChpbnB1dHMsIHJlc3VsdCwgbWVzc2FnZSwgY2FwdGlvbikge1xyXG4gIGNvbnN0IGNhbnZhcyA9IGF3YWl0IHNoYXJwKHsgY3JlYXRlOiB7IHdpZHRoOiAxNTIgKiByZXN1bHQubGVuZ3RoLCBoZWlnaHQ6IDE1MiwgY2hhbm5lbHM6IDQsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcgfSB9KVxyXG4gICAgLmNvbXBvc2l0ZShyZXN1bHQubWFwKChpdCwgaW5kZXgpID0+XHJcbiAgICAgICh7IGlucHV0OiBpbnB1dHMuZ2V0KGl0KSwgbGVmdDogaW5kZXggKiAxNTIsIHRvcDogMCwgd2lkdGg6IDE1MiwgaGVpZ2h0OiAxNTIgfSlcclxuICAgICkpXHJcbiAgICAucG5nKClcclxuICAgIC50b0J1ZmZlcigpXHJcblxyXG4gIHJldHVybiBtZXNzYWdlLnJlcGx5KHsgY29udGVudDogY2FwdGlvbiwgZmlsZXM6IFtjYW52YXNdIH0pXHJcbn1cclxuXHJcbmNvbnN0IGJ1aWx0aW4gPSB7XHJcbiAgMzc6IHtcclxuICAgIGdhbWU6ICdzZicsXHJcbiAgICBjYXB0aW9uOiAnKioqTEVUUyBHTyBKVVNUSU4hKioqJyxcclxuICAgIGlucHV0OiAnNiA2IDYgNiA2IDYgNiA+PiA2IDYgNiA2IDYgNiA2ID4+IDggNiBqLiBoayA+PiAyIG1rID4+IDYyMyBocCA+PiAyMzYgMjM2IGxrJ1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIG5hbWU6ICdmZy1ub3RhdGlvbicsXHJcbiAgaW50ZW50czogWydHVUlMRF9NRVNTQUdFUyddLFxyXG4gIHBhcnRpYWxzOiBbJ01FU1NBR0UnXSxcclxuXHJcbiAgcHJlbG9hZDogc2VxdWVsaXplID0+IHtcclxuICAgIHNlcXVlbGl6ZS5kZWZpbmUoJ2ZnaW5wdXQnLCB7XHJcbiAgICAgIGd1aWxkOiB7XHJcbiAgICAgICAgdHlwZTogRGF0YVR5cGVzLlNUUklORyxcclxuICAgICAgICBwcmltYXJ5S2V5OiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG5hbWU6IHtcclxuICAgICAgICB0eXBlOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICAgIHByaW1hcnlLZXk6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY3JlYXRlZEJ5OiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBnYW1lOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBjYXB0aW9uOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBpbnB1dDogRGF0YVR5cGVzLlNUUklOR1xyXG4gICAgfSlcclxuICB9LFxyXG5cclxuICBldmVudHM6IHtcclxuICAgIGFzeW5jIG1lc3NhZ2VDcmVhdGUgKGdsb2JhbCwgbWVzc2FnZSkge1xyXG4gICAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnLCBzZXF1ZWxpemUgfSA9IGdsb2JhbFxyXG4gICAgICBpZiAobWVzc2FnZS5hdXRob3IuaWQgPT09IGNsaWVudC51c2VyLmlkIHx8ICFtZXNzYWdlLm1lbWJlcikgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBndWlsZElkID0gbWVzc2FnZS5ndWlsZElkXHJcbiAgICAgIGNvbnN0IHsgcHJlZml4IH0gPSBjb25maWdbZ3VpbGRJZF1cclxuXHJcbiAgICAgIGlmIChtZXNzYWdlLmNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IG1lc3NhZ2UuY29udGVudC5zcGxpdCgnICcpLnBvcCgpLnJlcGxhY2UocHJlZml4LCAnJylcclxuICAgICAgICBjb25zdCByb3cgPSBidWlsdGluW25hbWVdIHx8IChcclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5maW5kT25lKHtcclxuICAgICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChyb3cuZ2FtZSldKVxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcm93LmlucHV0LnNwbGl0KCcgJyksIG1lc3NhZ2UsIHJvdy5jYXB0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIGNvbW1hbmRzOiB7XHJcbiAgICBmZ2k6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2kgW2dhbWVdIFtpbnB1dHNdJyxcclxuICAgICAgZGVzYzogJ1RoaXMgY29tbWFuZCBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbW1hbmQnLFxyXG4gICAgICBleGFtcGxlOiAnaGVscCBwZXJtcycsXHJcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhcmFtIH0sIHsgbWVzc2FnZSB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgWywgZ2FtZSwgaTFdID0gcGFyYW1cclxuICAgICAgICBpZiAoIWdhbWUgfHwgIWkxKSByZXR1cm4gbWVzc2FnZS5yZXBseSgnTWlzc2luZyBhcmd1bWVudHMuIEV4YW1wbGU6ID5mZ2kgc2YgMjM2UCAyMTRLJylcclxuICAgICAgICBpZiAoIWdhbWVJbnB1dHMuaGFzKGdhbWUpKSByZXR1cm4gbWVzc2FnZS5yZXBseShgXCIke2dhbWV9XCIgaXMgbm90IGEgdmFsaWQgZ2FtZS4gQXZhaWxhYmxlIGdhbWVzOiAke0FycmF5LmZyb20oZ2FtZUlucHV0cy5rZXlzKCkpLmpvaW4oJyAnKX1gKVxyXG5cclxuICAgICAgICBjb25zdCBpbnB1dHMgPSBuZXcgTWFwKFsuLi5iYXNpY0lucHV0cywgLi4uZ2FtZUlucHV0cy5nZXQoZ2FtZSldKVxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcmFtLnNsaWNlKDIpLm1hcChpID0+IHNvbHZlSW5wdXQoaW5wdXRzLCBpLnRvTG93ZXJDYXNlKCkpKS5mbGF0KClcclxuXHJcbiAgICAgICAgc2VuZElucHV0KGlucHV0cywgcmVzdWx0LCBtZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZmdzYXZlOiB7XHJcbiAgICAgIHVzYWdlOiAnZmdzYXZlIFtnYW1lXSBbbmFtZV0gW2lucHV0c10nLFxyXG4gICAgICBkZXNjOiAnVGhpcyBjb21tYW5kIGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IGEgY29tbWFuZCcsXHJcbiAgICAgIGV4YW1wbGU6ICdoZWxwIHBlcm1zJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IFssIGdhbWUsIG5hbWUsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFnYW1lIHx8ICFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHNmIHRlc3ROYW1lIDIzNlAgMjE0SycpXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXRzLmhhcyhnYW1lKSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFwiJHtnYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGdhbWUuIEF2YWlsYWJsZSBnYW1lczogJHtBcnJheS5mcm9tKGdhbWVJbnB1dHMua2V5cygpKS5qb2luKCcgJyl9YClcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXRzID0gbmV3IE1hcChbLi4uYmFzaWNJbnB1dHMsIC4uLmdhbWVJbnB1dHMuZ2V0KGdhbWUpXSlcclxuICAgICAgICBjb25zdCBpbnB1dCA9IHBhcmFtLnNsaWNlKDMpLm1hcChpID0+IHNvbHZlSW5wdXQoaW5wdXRzLCBpLnRvTG93ZXJDYXNlKCkpKS5mbGF0KCkuam9pbignICcpXHJcblxyXG4gICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5jcmVhdGUoeyBndWlsZDogbWVzc2FnZS5ndWlsZC5pZCwgbmFtZSwgY3JlYXRlZEJ5OiBtZXNzYWdlLmF1dGhvci5pZCwgZ2FtZSwgaW5wdXQgfSlcclxuXHJcbiAgICAgICAgbWVzc2FnZS5jaGFubmVsLnNlbmQoYFNhdmVkIGNvbW1hbmQgXCIke2lucHV0fVwiIGFzIFwiJHtuYW1lfVwiYClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZnY2FwdGlvbjoge1xyXG4gICAgICB1c2FnZTogJ2Znc2F2ZSBbbmFtZV0gW2NhcHRpb25dJyxcclxuICAgICAgZGVzYzogJ1RoaXMgY29tbWFuZCBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbW1hbmQnLFxyXG4gICAgICBleGFtcGxlOiAnaGVscCBwZXJtcycsXHJcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhcmFtLCBzZXF1ZWxpemUgfSwgeyBtZXNzYWdlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBbLCBuYW1lLCBpMV0gPSBwYXJhbVxyXG4gICAgICAgIGlmICghbmFtZSB8fCAhaTEpIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIGFyZ3VtZW50cy4gRXhhbXBsZTogPmZnaSB0ZXN0TmFtZSBUaGlzIGlzIGEgY2FwdGlvbicpXHJcblxyXG4gICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5maW5kT25lKHtcclxuICAgICAgICAgIHdoZXJlOiB7IGd1aWxkOiBtZXNzYWdlLmd1aWxkLmlkLCBuYW1lIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBpZiAoIXJvdykgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFwiJHtuYW1lfVwiIGlzIG5vdCBhIHNhdmVkIGlucHV0IGxpc3RgKVxyXG4gICAgICAgIHJvdy5jYXB0aW9uID0gcGFyYW0uc2xpY2UoMikuam9pbignICcpXHJcbiAgICAgICAgYXdhaXQgcm93LnNhdmUoKVxyXG5cclxuICAgICAgICBtZXNzYWdlLmNoYW5uZWwuc2VuZChgU2F2ZWQgY2FwdGlvbiBmb3IgaW5wdXQgbGlzdCBcIiR7bmFtZX1cImApXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
491
+ exports["default"] = _default;
package/package.json CHANGED
@@ -1,10 +1,25 @@
1
- {
2
- "name": "@lotus-tree/fg-notation",
3
- "version": "1.0.0",
4
- "main": "lib/index.js",
5
- "module": "src/index.js",
6
- "dependencies": {
7
- "glob": "^7.2.0",
8
- "sharp": "^0.29.3"
9
- }
10
- }
1
+ {
2
+ "name": "@lotus-tree/fg-notation",
3
+ "version": "1.1.3",
4
+ "main": "lib/index.js",
5
+ "module": "src/index.js",
6
+ "scripts": {
7
+ "run-babel": "babel --delete-dir-on-start --copy-files src",
8
+ "build": "yarn run run-babel --out-dir lib",
9
+ "dev": "yarn run run-babel --watch --out-dir dev",
10
+ "prepublishOnly": "yarn build"
11
+ },
12
+ "dependencies": {
13
+ "@lotus-tree/command-handler": "^2.0.0",
14
+ "bent": "^7.3.12",
15
+ "glob": "^7.2.0",
16
+ "sharp": "^0.29.3"
17
+ },
18
+ "devDependencies": {
19
+ "@babel/cli": "^7.16.7",
20
+ "@babel/core": "^7.16.7",
21
+ "@babel/node": "^7.16.7",
22
+ "@babel/plugin-transform-runtime": "^7.16.7",
23
+ "@babel/preset-env": "^7.16.7"
24
+ }
25
+ }
Binary file
package/src/index.js CHANGED
@@ -2,11 +2,34 @@ import sharp from 'sharp'
2
2
  import path from 'path'
3
3
  import glob from 'glob'
4
4
  import { DataTypes } from 'sequelize'
5
+ import bent from 'bent'
5
6
 
7
+ const getJSON = bent('json')
6
8
  const imgPath = path.join(__dirname, 'img')
7
9
  const basicInputs = new Map()
8
10
  const gameInputs = new Map()
9
11
 
12
+ let glossary = {}
13
+ let terms = []
14
+
15
+ getGlossary()
16
+ setInterval(getGlossary, 5 * 60 * 1000)
17
+
18
+ async function getGlossary () {
19
+ const result = await getJSON('https://glossary.infil.net/json/glossary.json')
20
+ const tempG = {}
21
+ const tempT = []
22
+
23
+ result.forEach(i => {
24
+ const term = i.term.toLowerCase()
25
+ tempG[term] = i
26
+ tempT.push(term)
27
+ })
28
+
29
+ glossary = tempG
30
+ terms = tempT
31
+ }
32
+
10
33
  glob.sync(path.join(imgPath, 'basic/**'), { nodir: true })
11
34
  .forEach(p => {
12
35
  const input = p.split('/').pop().replace('.png', '')
@@ -49,12 +72,16 @@ const builtin = {
49
72
  37: {
50
73
  game: 'sf',
51
74
  caption: '***LETS GO JUSTIN!***',
52
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 hp >> 236 236 lk'
75
+ input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
53
76
  }
54
77
  }
55
78
 
56
79
  export default {
57
80
  name: 'fg-notation',
81
+ about: {
82
+ name: 'FG Notation',
83
+ value: '[Instructions and source code](https://lotus.chitowarlock.com/fgnotation)\n[Infil\'s Fighting Game Glossary](https://glossary.infil.net)\n[MagicianStuff\'s Fighthing Game notations emotes](https://twitter.com/MagicianStuff/status/1477931054484893697)'
84
+ },
58
85
  intents: ['GUILD_MESSAGES'],
59
86
  partials: ['MESSAGE'],
60
87
 
@@ -102,8 +129,8 @@ export default {
102
129
  commands: {
103
130
  fgi: {
104
131
  usage: 'fgi [game] [inputs]',
105
- desc: 'This command displays information about a command',
106
- example: 'help perms',
132
+ desc: 'Converts a list of inputs into an image',
133
+ example: 'fgi sf 236P 214K',
107
134
  execute: async ({ param }, { message }) => {
108
135
  const [, game, i1] = param
109
136
  if (!game || !i1) return message.reply('Missing arguments. Example: >fgi sf 236P 214K')
@@ -117,8 +144,8 @@ export default {
117
144
  },
118
145
  fgsave: {
119
146
  usage: 'fgsave [game] [name] [inputs]',
120
- desc: 'This command displays information about a command',
121
- example: 'help perms',
147
+ desc: 'Saves a list of inputs into a command',
148
+ example: 'fgi sf testName 236P 214K',
122
149
  execute: async ({ param, sequelize }, { message }) => {
123
150
  const [, game, name, i1] = param
124
151
  if (!game || !name || !i1) return message.reply('Missing arguments. Example: >fgi sf testName 236P 214K')
@@ -133,9 +160,9 @@ export default {
133
160
  }
134
161
  },
135
162
  fgcaption: {
136
- usage: 'fgsave [name] [caption]',
137
- desc: 'This command displays information about a command',
138
- example: 'help perms',
163
+ usage: 'fgcaption [name] [caption]',
164
+ desc: 'Adds a caption to a saved input command',
165
+ example: 'fgcaption testName This is a caption',
139
166
  execute: async ({ param, sequelize }, { message }) => {
140
167
  const [, name, i1] = param
141
168
  if (!name || !i1) return message.reply('Missing arguments. Example: >fgi testName This is a caption')
@@ -150,6 +177,24 @@ export default {
150
177
 
151
178
  message.channel.send(`Saved caption for input list "${name}"`)
152
179
  }
180
+ },
181
+ fgglossary: {
182
+ usage: 'fgglossary [search term]',
183
+ desc: 'Searches for a term on Infil\'s Glossary',
184
+ example: 'fgglossary mexican uppercut',
185
+ execute: async ({ param, sequelize }, { message }) => {
186
+ const params = param.slice(1)
187
+ if (params.length === 0) return message.reply('Missing search term. Example: >fgglossary mexican uppercut')
188
+
189
+ const search = params.join(' ').toLowerCase()
190
+ const result = terms.filter(i => i.includes(search))
191
+ const url = `https://glossary.infil.net/?t=${params.join('%20').toLowerCase()}`
192
+
193
+ if (result.length === 0) return message.reply(`Term "${search}" not found`)
194
+ if (result.length === 1) return message.reply(`\`\`\`${glossary[result[0]].def}\`\`\`Source: <${url}>`)
195
+
196
+ message.reply(`Multiple terms found: ${url}`)
197
+ }
153
198
  }
154
199
  }
155
200
  }