@lotus-tree/fg-notation 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
package/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # Lotus Tree - FG Notation
2
+
3
+ Discord bot that converts fighting game inputs into easy to read images.
4
+
5
+ ## Commands
6
+ \>help: Lists all available commands
7
+
8
+ \>help command: Shows description and usage of an specific command
9
+
10
+ \>fgi: Converts fighting game inputs into an image
11
+
12
+ \>fgsave: Saves a series inputs as a reusable command
13
+
14
+ \>fgcaption: Saves a series inputs as a reusable command
15
+
16
+ \>fgglossary: Searches for a term on [Infil's Fighting Game Glossary](https://glossary.infil.net)
17
+
18
+ ## Examples
19
+ https://user-images.githubusercontent.com/19596334/149458438-775d2da6-0573-46f3-b7dd-0030adaad124.mp4
20
+
21
+ https://user-images.githubusercontent.com/19596334/149458504-baf906a3-87da-4d92-9b56-e0de5fd858c1.mp4
22
+
23
+ https://user-images.githubusercontent.com/19596334/149458508-1dcf89fb-a83e-44bb-a6a0-9549771c6082.mp4
24
+
25
+ ## Available games
26
+ | Game | Name |
27
+ |---------------------|------|
28
+ | Blazblue | bb |
29
+ | Dragonball Fighterz | dbz |
30
+ | DNF Duel | dnf |
31
+ | Granblue Versus | gbf |
32
+ | Guilty Gear | gg |
33
+ | King of Fighters | kof |
34
+ | Mortal Kombat | mk |
35
+ | Soul Calibur | sc |
36
+ | Street Fighter | sf |
37
+ | Skullgirlz | sg |
38
+ | Them Fighting Herds | tfh |
39
+ | Tekken | tkn |
40
+
41
+ ## Add to your server
42
+ Use [this link](https://discord.com/oauth2/authorize?client_id=928539052834177024&scope=bot&permissions=34816) to add this bot to your Discord server
43
+
44
+ ## Self-host (with Lotus-Tree)
45
+ Follow instructions on how to add to a Louts-Tree bot on [this link](https://github.com/jorgev259/Lotus-Tree)
46
+
47
+ ## Credits
48
+
49
+ [Infil's Fighting Game Glossary](https://glossary.infil.net): for the rich and awesome glossary
50
+ [MagicianStuff's Fighthing Game notations emotes](https://twitter.com/MagicianStuff/status/1477931054484893697)
51
+
52
+ ## Changelog
53
+
54
+ # 1.1.0
55
+
56
+ 1. Added fgglosary command
57
+ 1. Fixed wrong default command
58
+ 1. Drifted tonight carried by the waves
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ presets: ['@babel/preset-env'],
3
+ plugins: [
4
+ ['@babel/plugin-transform-runtime', { regenerator: true }]
5
+ ]
6
+ }
Binary file
Binary file
Binary file
package/lib/index.js CHANGED
@@ -1,382 +1,488 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports["default"] = void 0;
9
-
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
-
16
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
-
18
- var _sharp = _interopRequireDefault(require("sharp"));
19
-
20
- var _path = _interopRequireDefault(require("path"));
21
-
22
- var _glob = _interopRequireDefault(require("glob"));
23
-
24
- var _sequelize = require("sequelize");
25
-
26
- var imgPath = _path["default"].join(__dirname, 'img');
27
-
28
- var basicInputs = new Map();
29
- var gameInputs = new Map();
30
-
31
- _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
32
- nodir: true
33
- }).forEach(function (p) {
34
- var input = p.split('/').pop().replace('.png', '');
35
- basicInputs.set(input, p);
36
- });
37
-
38
- basicInputs.set('>>', _path["default"].join(imgPath, 'basic/doubleforward.png'));
39
-
40
- _glob["default"].sync(_path["default"].join(imgPath, 'games/**'), {
41
- nodir: true
42
- }).forEach(function (p) {
43
- var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
44
- dir = _path$parse.dir,
45
- name = _path$parse.name;
46
-
47
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map());
48
- gameInputs.get(dir).set(name, p);
49
- });
50
-
51
- function solveInput(inputs, input) {
52
- if (inputs.has(input)) return [input];
53
-
54
- for (var i = 0; i < input.length; i++) {
55
- var s1 = input.slice(0, 0 - i);
56
- if (inputs.has(s1)) return [s1].concat((0, _toConsumableArray2["default"])(solveInput(inputs, input.slice(0 - i))));
57
- }
58
-
59
- throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
60
- }
61
-
62
- function sendInput(_x, _x2, _x3, _x4) {
63
- return _sendInput.apply(this, arguments);
64
- }
65
-
66
- function _sendInput() {
67
- _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(inputs, result, message, caption) {
68
- var canvas;
69
- return _regenerator["default"].wrap(function _callee5$(_context5) {
70
- while (1) {
71
- switch (_context5.prev = _context5.next) {
72
- case 0:
73
- _context5.next = 2;
74
- return (0, _sharp["default"])({
75
- create: {
76
- width: 152 * result.length,
77
- height: 152,
78
- channels: 4,
79
- background: 'transparent'
80
- }
81
- }).composite(result.map(function (it, index) {
82
- return {
83
- input: inputs.get(it),
84
- left: index * 152,
85
- top: 0,
86
- width: 152,
87
- height: 152
88
- };
89
- })).png().toBuffer();
90
-
91
- case 2:
92
- canvas = _context5.sent;
93
- return _context5.abrupt("return", message.reply({
94
- content: caption,
95
- files: [canvas]
96
- }));
97
-
98
- case 4:
99
- case "end":
100
- return _context5.stop();
101
- }
102
- }
103
- }, _callee5);
104
- }));
105
- return _sendInput.apply(this, arguments);
106
- }
107
-
108
- var builtin = {
109
- 37: {
110
- game: 'sf',
111
- 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'
113
- }
114
- };
115
- var _default = {
116
- name: 'fg-notation',
117
- intents: ['GUILD_MESSAGES'],
118
- partials: ['MESSAGE'],
119
- preload: function preload(sequelize) {
120
- sequelize.define('fginput', {
121
- guild: {
122
- type: _sequelize.DataTypes.STRING,
123
- primaryKey: true
124
- },
125
- name: {
126
- type: _sequelize.DataTypes.STRING,
127
- primaryKey: true
128
- },
129
- createdBy: _sequelize.DataTypes.STRING,
130
- game: _sequelize.DataTypes.STRING,
131
- caption: _sequelize.DataTypes.STRING,
132
- input: _sequelize.DataTypes.STRING
133
- });
134
- },
135
- events: {
136
- messageCreate: function messageCreate(global, message) {
137
- return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
138
- var client, config, sequelize, guildId, prefix, name, row, inputs;
139
- return _regenerator["default"].wrap(function _callee$(_context) {
140
- while (1) {
141
- switch (_context.prev = _context.next) {
142
- case 0:
143
- client = global.client, config = global.config, sequelize = global.sequelize;
144
-
145
- if (!(message.author.id === client.user.id || !message.member)) {
146
- _context.next = 3;
147
- break;
148
- }
149
-
150
- return _context.abrupt("return");
151
-
152
- case 3:
153
- guildId = message.guildId;
154
- prefix = config[guildId].prefix;
155
-
156
- if (!message.content.startsWith(prefix)) {
157
- _context.next = 14;
158
- break;
159
- }
160
-
161
- name = message.content.split(' ').pop().replace(prefix, '');
162
- _context.t0 = builtin[name];
163
-
164
- if (_context.t0) {
165
- _context.next = 12;
166
- break;
167
- }
168
-
169
- _context.next = 11;
170
- return sequelize.models.fginput.findOne({
171
- where: {
172
- guild: message.guild.id,
173
- name: name
174
- }
175
- });
176
-
177
- case 11:
178
- _context.t0 = _context.sent;
179
-
180
- case 12:
181
- row = _context.t0;
182
-
183
- if (row) {
184
- inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(row.game))));
185
- sendInput(inputs, row.input.split(' '), message, row.caption);
186
- }
187
-
188
- case 14:
189
- case "end":
190
- return _context.stop();
191
- }
192
- }
193
- }, _callee);
194
- }))();
195
- }
196
- },
197
- commands: {
198
- fgi: {
199
- usage: 'fgi [game] [inputs]',
200
- desc: 'Converts a list of inputs into an image',
201
- example: 'fgi sf 236P 214K',
202
- execute: function () {
203
- var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
204
- var param, message, _param, game, i1, inputs, result;
205
-
206
- return _regenerator["default"].wrap(function _callee2$(_context2) {
207
- while (1) {
208
- switch (_context2.prev = _context2.next) {
209
- case 0:
210
- param = _ref.param;
211
- message = _ref2.message;
212
- _param = (0, _slicedToArray2["default"])(param, 3), game = _param[1], i1 = _param[2];
213
-
214
- if (!(!game || !i1)) {
215
- _context2.next = 5;
216
- break;
217
- }
218
-
219
- return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
220
-
221
- case 5:
222
- if (gameInputs.has(game)) {
223
- _context2.next = 7;
224
- break;
225
- }
226
-
227
- return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
228
-
229
- case 7:
230
- inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
231
- result = param.slice(2).map(function (i) {
232
- return solveInput(inputs, i.toLowerCase());
233
- }).flat();
234
- sendInput(inputs, result, message);
235
-
236
- case 10:
237
- case "end":
238
- return _context2.stop();
239
- }
240
- }
241
- }, _callee2);
242
- }));
243
-
244
- function execute(_x5, _x6) {
245
- return _execute.apply(this, arguments);
246
- }
247
-
248
- return execute;
249
- }()
250
- },
251
- fgsave: {
252
- usage: 'fgsave [game] [name] [inputs]',
253
- desc: 'Saves a list of inputs into a command',
254
- example: 'fgi sf testName 236P 214K',
255
- execute: function () {
256
- var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
257
- var param, sequelize, message, _param2, game, name, i1, inputs, input;
258
-
259
- return _regenerator["default"].wrap(function _callee3$(_context3) {
260
- while (1) {
261
- switch (_context3.prev = _context3.next) {
262
- case 0:
263
- param = _ref3.param, sequelize = _ref3.sequelize;
264
- message = _ref4.message;
265
- _param2 = (0, _slicedToArray2["default"])(param, 4), game = _param2[1], name = _param2[2], i1 = _param2[3];
266
-
267
- if (!(!game || !name || !i1)) {
268
- _context3.next = 5;
269
- break;
270
- }
271
-
272
- return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
273
-
274
- case 5:
275
- if (gameInputs.has(game)) {
276
- _context3.next = 7;
277
- break;
278
- }
279
-
280
- return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
281
-
282
- case 7:
283
- inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
284
- input = param.slice(3).map(function (i) {
285
- return solveInput(inputs, i.toLowerCase());
286
- }).flat().join(' ');
287
- _context3.next = 11;
288
- return sequelize.models.fginput.create({
289
- guild: message.guild.id,
290
- name: name,
291
- createdBy: message.author.id,
292
- game: game,
293
- input: input
294
- });
295
-
296
- case 11:
297
- message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
298
-
299
- case 12:
300
- case "end":
301
- return _context3.stop();
302
- }
303
- }
304
- }, _callee3);
305
- }));
306
-
307
- function execute(_x7, _x8) {
308
- return _execute2.apply(this, arguments);
309
- }
310
-
311
- return execute;
312
- }()
313
- },
314
- fgcaption: {
315
- usage: 'fgcaption [name] [caption]',
316
- desc: 'Adds a caption to a saved input command',
317
- example: 'fgcaption testName This is a caption',
318
- execute: function () {
319
- var _execute3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(_ref5, _ref6) {
320
- var param, sequelize, message, _param3, name, i1, row;
321
-
322
- return _regenerator["default"].wrap(function _callee4$(_context4) {
323
- while (1) {
324
- switch (_context4.prev = _context4.next) {
325
- case 0:
326
- param = _ref5.param, sequelize = _ref5.sequelize;
327
- message = _ref6.message;
328
- _param3 = (0, _slicedToArray2["default"])(param, 3), name = _param3[1], i1 = _param3[2];
329
-
330
- if (!(!name || !i1)) {
331
- _context4.next = 5;
332
- break;
333
- }
334
-
335
- return _context4.abrupt("return", message.reply('Missing arguments. Example: >fgi testName This is a caption'));
336
-
337
- case 5:
338
- _context4.next = 7;
339
- return sequelize.models.fginput.findOne({
340
- where: {
341
- guild: message.guild.id,
342
- name: name
343
- }
344
- });
345
-
346
- case 7:
347
- row = _context4.sent;
348
-
349
- if (row) {
350
- _context4.next = 10;
351
- break;
352
- }
353
-
354
- return _context4.abrupt("return", message.reply("\"".concat(name, "\" is not a saved input list")));
355
-
356
- case 10:
357
- row.caption = param.slice(2).join(' ');
358
- _context4.next = 13;
359
- return row.save();
360
-
361
- case 13:
362
- message.channel.send("Saved caption for input list \"".concat(name, "\""));
363
-
364
- case 14:
365
- case "end":
366
- return _context4.stop();
367
- }
368
- }
369
- }, _callee4);
370
- }));
371
-
372
- function execute(_x9, _x10) {
373
- return _execute3.apply(this, arguments);
374
- }
375
-
376
- return execute;
377
- }()
378
- }
379
- }
380
- };
381
- exports["default"] = _default;
382
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJpbWdQYXRoIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJiYXNpY0lucHV0cyIsIk1hcCIsImdhbWVJbnB1dHMiLCJnbG9iIiwic3luYyIsIm5vZGlyIiwiZm9yRWFjaCIsInAiLCJpbnB1dCIsInNwbGl0IiwicG9wIiwicmVwbGFjZSIsInNldCIsInBhcnNlIiwicmVsYXRpdmUiLCJkaXIiLCJuYW1lIiwiaGFzIiwiZ2V0Iiwic29sdmVJbnB1dCIsImlucHV0cyIsImkiLCJsZW5ndGgiLCJzMSIsInNsaWNlIiwiRXJyb3IiLCJzZW5kSW5wdXQiLCJyZXN1bHQiLCJtZXNzYWdlIiwiY2FwdGlvbiIsImNyZWF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwiY2hhbm5lbHMiLCJiYWNrZ3JvdW5kIiwiY29tcG9zaXRlIiwibWFwIiwiaXQiLCJpbmRleCIsImxlZnQiLCJ0b3AiLCJwbmciLCJ0b0J1ZmZlciIsImNhbnZhcyIsInJlcGx5IiwiY29udGVudCIsImZpbGVzIiwiYnVpbHRpbiIsImdhbWUiLCJpbnRlbnRzIiwicGFydGlhbHMiLCJwcmVsb2FkIiwic2VxdWVsaXplIiwiZGVmaW5lIiwiZ3VpbGQiLCJ0eXBlIiwiRGF0YVR5cGVzIiwiU1RSSU5HIiwicHJpbWFyeUtleSIsImNyZWF0ZWRCeSIsImV2ZW50cyIsIm1lc3NhZ2VDcmVhdGUiLCJnbG9iYWwiLCJjbGllbnQiLCJjb25maWciLCJhdXRob3IiLCJpZCIsInVzZXIiLCJtZW1iZXIiLCJndWlsZElkIiwicHJlZml4Iiwic3RhcnRzV2l0aCIsIm1vZGVscyIsImZnaW5wdXQiLCJmaW5kT25lIiwid2hlcmUiLCJyb3ciLCJjb21tYW5kcyIsImZnaSIsInVzYWdlIiwiZGVzYyIsImV4YW1wbGUiLCJleGVjdXRlIiwicGFyYW0iLCJpMSIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJ0b0xvd2VyQ2FzZSIsImZsYXQiLCJmZ3NhdmUiLCJjaGFubmVsIiwic2Vu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QUVyQixzQkFBQUEsS0FBSyxFQUFFMUIsT0FBTyxDQUFDMEIsS0FBUixDQUFjWSxFQUF2QjtBQUEyQmxELHNCQUFBQSxJQUFJLEVBQUpBO0FBQTNCO0FBRDBDLG1CQUFqQyxDQUpYOztBQUFBO0FBSUQ0RCxrQkFBQUEsR0FKQzs7QUFBQSxzQkFRRkEsR0FSRTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvREFRVWhELE9BQU8sQ0FBQ2dCLEtBQVIsYUFBa0I1QixJQUFsQixrQ0FSVjs7QUFBQTtBQVNQNEQsa0JBQUFBLEdBQUcsQ0FBQy9DLE9BQUosR0FBY3NELEtBQUssQ0FBQzNELEtBQU4sQ0FBWSxDQUFaLEVBQWUxQixJQUFmLENBQW9CLEdBQXBCLENBQWQ7QUFUTztBQUFBLHlCQVVEOEUsR0FBRyxDQUFDa0IsSUFBSixFQVZDOztBQUFBO0FBWVBsRSxrQkFBQUEsT0FBTyxDQUFDK0QsT0FBUixDQUFnQkMsSUFBaEIsMENBQXNENUUsSUFBdEQ7O0FBWk87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBRjs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUpFO0FBakNIO0FBOUNHLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InXHJcbmltcG9ydCB7IERhdGFUeXBlcyB9IGZyb20gJ3NlcXVlbGl6ZSdcclxuXHJcbmNvbnN0IGltZ1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaW1nJylcclxuY29uc3QgYmFzaWNJbnB1dHMgPSBuZXcgTWFwKClcclxuY29uc3QgZ2FtZUlucHV0cyA9IG5ldyBNYXAoKVxyXG5cclxuZ2xvYi5zeW5jKHBhdGguam9pbihpbWdQYXRoLCAnYmFzaWMvKionKSwgeyBub2RpcjogdHJ1ZSB9KVxyXG4gIC5mb3JFYWNoKHAgPT4ge1xyXG4gICAgY29uc3QgaW5wdXQgPSBwLnNwbGl0KCcvJykucG9wKCkucmVwbGFjZSgnLnBuZycsICcnKVxyXG4gICAgYmFzaWNJbnB1dHMuc2V0KGlucHV0LCBwKVxyXG4gIH0pXHJcblxyXG5iYXNpY0lucHV0cy5zZXQoJz4+JywgcGF0aC5qb2luKGltZ1BhdGgsICdiYXNpYy9kb3VibGVmb3J3YXJkLnBuZycpKVxyXG5cclxuZ2xvYi5zeW5jKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMvKionKSwgeyBub2RpcjogdHJ1ZSB9KVxyXG4gIC5mb3JFYWNoKHAgPT4ge1xyXG4gICAgY29uc3QgeyBkaXIsIG5hbWUgfSA9IHBhdGgucGFyc2UocGF0aC5yZWxhdGl2ZShwYXRoLmpvaW4oaW1nUGF0aCwgJ2dhbWVzJyksIHApKVxyXG5cclxuICAgIGlmICghZ2FtZUlucHV0cy5oYXMoZGlyKSkgZ2FtZUlucHV0cy5zZXQoZGlyLCBuZXcgTWFwKCkpXHJcbiAgICBnYW1lSW5wdXRzLmdldChkaXIpLnNldChuYW1lLCBwKVxyXG4gIH0pXHJcblxyXG5mdW5jdGlvbiBzb2x2ZUlucHV0IChpbnB1dHMsIGlucHV0KSB7XHJcbiAgaWYgKGlucHV0cy5oYXMoaW5wdXQpKSByZXR1cm4gW2lucHV0XVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBzMSA9IGlucHV0LnNsaWNlKDAsIDAgLSBpKVxyXG4gICAgaWYgKGlucHV0cy5oYXMoczEpKSByZXR1cm4gW3MxLCAuLi5zb2x2ZUlucHV0KGlucHV0cywgaW5wdXQuc2xpY2UoMCAtIGkpKV1cclxuICB9XHJcblxyXG4gIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgXCIke2lucHV0fVwiIGFzIGEgcmVjb2duaXphYmxlIGlucHV0YClcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2VuZElucHV0IChpbnB1dHMsIHJlc3VsdCwgbWVzc2FnZSwgY2FwdGlvbikge1xyXG4gIGNvbnN0IGNhbnZhcyA9IGF3YWl0IHNoYXJwKHsgY3JlYXRlOiB7IHdpZHRoOiAxNTIgKiByZXN1bHQubGVuZ3RoLCBoZWlnaHQ6IDE1MiwgY2hhbm5lbHM6IDQsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcgfSB9KVxyXG4gICAgLmNvbXBvc2l0ZShyZXN1bHQubWFwKChpdCwgaW5kZXgpID0+XHJcbiAgICAgICh7IGlucHV0OiBpbnB1dHMuZ2V0KGl0KSwgbGVmdDogaW5kZXggKiAxNTIsIHRvcDogMCwgd2lkdGg6IDE1MiwgaGVpZ2h0OiAxNTIgfSlcclxuICAgICkpXHJcbiAgICAucG5nKClcclxuICAgIC50b0J1ZmZlcigpXHJcblxyXG4gIHJldHVybiBtZXNzYWdlLnJlcGx5KHsgY29udGVudDogY2FwdGlvbiwgZmlsZXM6IFtjYW52YXNdIH0pXHJcbn1cclxuXHJcbmNvbnN0IGJ1aWx0aW4gPSB7XHJcbiAgMzc6IHtcclxuICAgIGdhbWU6ICdzZicsXHJcbiAgICBjYXB0aW9uOiAnKioqTEVUUyBHTyBKVVNUSU4hKioqJyxcclxuICAgIGlucHV0OiAnNiA2IDYgNiA2IDYgNiA+PiA2IDYgNiA2IDYgNiA2ID4+IDggNiBqLiBoayA+PiAyIG1rID4+IDYyMyBocCA+PiAyMzYgMjM2IGxrJ1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIG5hbWU6ICdmZy1ub3RhdGlvbicsXHJcbiAgaW50ZW50czogWydHVUlMRF9NRVNTQUdFUyddLFxyXG4gIHBhcnRpYWxzOiBbJ01FU1NBR0UnXSxcclxuXHJcbiAgcHJlbG9hZDogc2VxdWVsaXplID0+IHtcclxuICAgIHNlcXVlbGl6ZS5kZWZpbmUoJ2ZnaW5wdXQnLCB7XHJcbiAgICAgIGd1aWxkOiB7XHJcbiAgICAgICAgdHlwZTogRGF0YVR5cGVzLlNUUklORyxcclxuICAgICAgICBwcmltYXJ5S2V5OiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG5hbWU6IHtcclxuICAgICAgICB0eXBlOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICAgIHByaW1hcnlLZXk6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY3JlYXRlZEJ5OiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBnYW1lOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBjYXB0aW9uOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBpbnB1dDogRGF0YVR5cGVzLlNUUklOR1xyXG4gICAgfSlcclxuICB9LFxyXG5cclxuICBldmVudHM6IHtcclxuICAgIGFzeW5jIG1lc3NhZ2VDcmVhdGUgKGdsb2JhbCwgbWVzc2FnZSkge1xyXG4gICAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnLCBzZXF1ZWxpemUgfSA9IGdsb2JhbFxyXG4gICAgICBpZiAobWVzc2FnZS5hdXRob3IuaWQgPT09IGNsaWVudC51c2VyLmlkIHx8ICFtZXNzYWdlLm1lbWJlcikgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBndWlsZElkID0gbWVzc2FnZS5ndWlsZElkXHJcbiAgICAgIGNvbnN0IHsgcHJlZml4IH0gPSBjb25maWdbZ3VpbGRJZF1cclxuXHJcbiAgICAgIGlmIChtZXNzYWdlLmNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IG1lc3NhZ2UuY29udGVudC5zcGxpdCgnICcpLnBvcCgpLnJlcGxhY2UocHJlZml4LCAnJylcclxuICAgICAgICBjb25zdCByb3cgPSBidWlsdGluW25hbWVdIHx8IChcclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5maW5kT25lKHtcclxuICAgICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChyb3cuZ2FtZSldKVxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcm93LmlucHV0LnNwbGl0KCcgJyksIG1lc3NhZ2UsIHJvdy5jYXB0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIGNvbW1hbmRzOiB7XHJcbiAgICBmZ2k6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2kgW2dhbWVdIFtpbnB1dHNdJyxcclxuICAgICAgZGVzYzogJ0NvbnZlcnRzIGEgbGlzdCBvZiBpbnB1dHMgaW50byBhbiBpbWFnZScsXHJcbiAgICAgIGV4YW1wbGU6ICdmZ2kgc2YgMjM2UCAyMTRLJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0gfSwgeyBtZXNzYWdlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBbLCBnYW1lLCBpMV0gPSBwYXJhbVxyXG4gICAgICAgIGlmICghZ2FtZSB8fCAhaTEpIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIGFyZ3VtZW50cy4gRXhhbXBsZTogPmZnaSBzZiAyMzZQIDIxNEsnKVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0cy5oYXMoZ2FtZSkpIHJldHVybiBtZXNzYWdlLnJlcGx5KGBcIiR7Z2FtZX1cIiBpcyBub3QgYSB2YWxpZCBnYW1lLiBBdmFpbGFibGUgZ2FtZXM6ICR7QXJyYXkuZnJvbShnYW1lSW5wdXRzLmtleXMoKSkuam9pbignICcpfWApXHJcblxyXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChnYW1lKV0pXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyYW0uc2xpY2UoMikubWFwKGkgPT4gc29sdmVJbnB1dChpbnB1dHMsIGkudG9Mb3dlckNhc2UoKSkpLmZsYXQoKVxyXG5cclxuICAgICAgICBzZW5kSW5wdXQoaW5wdXRzLCByZXN1bHQsIG1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ3NhdmU6IHtcclxuICAgICAgdXNhZ2U6ICdmZ3NhdmUgW2dhbWVdIFtuYW1lXSBbaW5wdXRzXScsXHJcbiAgICAgIGRlc2M6ICdTYXZlcyBhIGxpc3Qgb2YgaW5wdXRzIGludG8gYSBjb21tYW5kJyxcclxuICAgICAgZXhhbXBsZTogJ2ZnaSBzZiB0ZXN0TmFtZSAyMzZQIDIxNEsnLFxyXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXJhbSwgc2VxdWVsaXplIH0sIHsgbWVzc2FnZSB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgWywgZ2FtZSwgbmFtZSwgaTFdID0gcGFyYW1cclxuICAgICAgICBpZiAoIWdhbWUgfHwgIW5hbWUgfHwgIWkxKSByZXR1cm4gbWVzc2FnZS5yZXBseSgnTWlzc2luZyBhcmd1bWVudHMuIEV4YW1wbGU6ID5mZ2kgc2YgdGVzdE5hbWUgMjM2UCAyMTRLJylcclxuICAgICAgICBpZiAoIWdhbWVJbnB1dHMuaGFzKGdhbWUpKSByZXR1cm4gbWVzc2FnZS5yZXBseShgXCIke2dhbWV9XCIgaXMgbm90IGEgdmFsaWQgZ2FtZS4gQXZhaWxhYmxlIGdhbWVzOiAke0FycmF5LmZyb20oZ2FtZUlucHV0cy5rZXlzKCkpLmpvaW4oJyAnKX1gKVxyXG5cclxuICAgICAgICBjb25zdCBpbnB1dHMgPSBuZXcgTWFwKFsuLi5iYXNpY0lucHV0cywgLi4uZ2FtZUlucHV0cy5nZXQoZ2FtZSldKVxyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gcGFyYW0uc2xpY2UoMykubWFwKGkgPT4gc29sdmVJbnB1dChpbnB1dHMsIGkudG9Mb3dlckNhc2UoKSkpLmZsYXQoKS5qb2luKCcgJylcclxuXHJcbiAgICAgICAgYXdhaXQgc2VxdWVsaXplLm1vZGVscy5mZ2lucHV0LmNyZWF0ZSh7IGd1aWxkOiBtZXNzYWdlLmd1aWxkLmlkLCBuYW1lLCBjcmVhdGVkQnk6IG1lc3NhZ2UuYXV0aG9yLmlkLCBnYW1lLCBpbnB1dCB9KVxyXG5cclxuICAgICAgICBtZXNzYWdlLmNoYW5uZWwuc2VuZChgU2F2ZWQgY29tbWFuZCBcIiR7aW5wdXR9XCIgYXMgXCIke25hbWV9XCJgKVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZmdjYXB0aW9uOiB7XHJcbiAgICAgIHVzYWdlOiAnZmdjYXB0aW9uIFtuYW1lXSBbY2FwdGlvbl0nLFxyXG4gICAgICBkZXNjOiAnQWRkcyBhIGNhcHRpb24gdG8gYSBzYXZlZCBpbnB1dCBjb21tYW5kJyxcclxuICAgICAgZXhhbXBsZTogJ2ZnY2FwdGlvbiB0ZXN0TmFtZSBUaGlzIGlzIGEgY2FwdGlvbicsXHJcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhcmFtLCBzZXF1ZWxpemUgfSwgeyBtZXNzYWdlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBbLCBuYW1lLCBpMV0gPSBwYXJhbVxyXG4gICAgICAgIGlmICghbmFtZSB8fCAhaTEpIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIGFyZ3VtZW50cy4gRXhhbXBsZTogPmZnaSB0ZXN0TmFtZSBUaGlzIGlzIGEgY2FwdGlvbicpXHJcblxyXG4gICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5maW5kT25lKHtcclxuICAgICAgICAgIHdoZXJlOiB7IGd1aWxkOiBtZXNzYWdlLmd1aWxkLmlkLCBuYW1lIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBpZiAoIXJvdykgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFwiJHtuYW1lfVwiIGlzIG5vdCBhIHNhdmVkIGlucHV0IGxpc3RgKVxyXG4gICAgICAgIHJvdy5jYXB0aW9uID0gcGFyYW0uc2xpY2UoMikuam9pbignICcpXHJcbiAgICAgICAgYXdhaXQgcm93LnNhdmUoKVxyXG5cclxuICAgICAgICBtZXNzYWdlLmNoYW5uZWwuc2VuZChgU2F2ZWQgY2FwdGlvbiBmb3IgaW5wdXQgbGlzdCBcIiR7bmFtZX1cImApXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
+
16
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
+
18
+ var _sharp = _interopRequireDefault(require("sharp"));
19
+
20
+ var _path = _interopRequireDefault(require("path"));
21
+
22
+ var _glob = _interopRequireDefault(require("glob"));
23
+
24
+ var _sequelize = require("sequelize");
25
+
26
+ var _requestPromise = _interopRequireDefault(require("request-promise"));
27
+
28
+ var imgPath = _path["default"].join(__dirname, 'img');
29
+
30
+ var basicInputs = new Map();
31
+ var gameInputs = new Map();
32
+ var glossary = {};
33
+ var terms = [];
34
+ getGlossary();
35
+ setInterval(getGlossary, 5 * 60 * 1000);
36
+
37
+ function getGlossary() {
38
+ return _getGlossary.apply(this, arguments);
39
+ }
40
+
41
+ function _getGlossary() {
42
+ _getGlossary = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
43
+ var result, tempG, tempT;
44
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
45
+ while (1) {
46
+ switch (_context6.prev = _context6.next) {
47
+ case 0:
48
+ _context6.t0 = JSON;
49
+ _context6.next = 3;
50
+ return (0, _requestPromise["default"])('https://glossary.infil.net/json/glossary.json');
51
+
52
+ case 3:
53
+ _context6.t1 = _context6.sent;
54
+ result = _context6.t0.parse.call(_context6.t0, _context6.t1);
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 10:
66
+ case "end":
67
+ return _context6.stop();
68
+ }
69
+ }
70
+ }, _callee6);
71
+ }));
72
+ return _getGlossary.apply(this, arguments);
73
+ }
74
+
75
+ _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
76
+ nodir: true
77
+ }).forEach(function (p) {
78
+ var input = p.split('/').pop().replace('.png', '');
79
+ basicInputs.set(input, p);
80
+ });
81
+
82
+ basicInputs.set('>>', _path["default"].join(imgPath, 'basic/doubleforward.png'));
83
+
84
+ _glob["default"].sync(_path["default"].join(imgPath, 'games/**'), {
85
+ nodir: true
86
+ }).forEach(function (p) {
87
+ var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
88
+ dir = _path$parse.dir,
89
+ name = _path$parse.name;
90
+
91
+ if (!gameInputs.has(dir)) gameInputs.set(dir, new Map());
92
+ gameInputs.get(dir).set(name, p);
93
+ });
94
+
95
+ function solveInput(inputs, input) {
96
+ if (inputs.has(input)) return [input];
97
+
98
+ for (var i = 0; i < input.length; i++) {
99
+ var s1 = input.slice(0, 0 - i);
100
+ if (inputs.has(s1)) return [s1].concat((0, _toConsumableArray2["default"])(solveInput(inputs, input.slice(0 - i))));
101
+ }
102
+
103
+ throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
104
+ }
105
+
106
+ function sendInput(_x, _x2, _x3, _x4) {
107
+ return _sendInput.apply(this, arguments);
108
+ }
109
+
110
+ function _sendInput() {
111
+ _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
112
+ var canvas;
113
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
114
+ while (1) {
115
+ switch (_context7.prev = _context7.next) {
116
+ case 0:
117
+ _context7.next = 2;
118
+ return (0, _sharp["default"])({
119
+ create: {
120
+ width: 152 * result.length,
121
+ height: 152,
122
+ channels: 4,
123
+ background: 'transparent'
124
+ }
125
+ }).composite(result.map(function (it, index) {
126
+ return {
127
+ input: inputs.get(it),
128
+ left: index * 152,
129
+ top: 0,
130
+ width: 152,
131
+ height: 152
132
+ };
133
+ })).png().toBuffer();
134
+
135
+ case 2:
136
+ canvas = _context7.sent;
137
+ return _context7.abrupt("return", message.reply({
138
+ content: caption,
139
+ files: [canvas]
140
+ }));
141
+
142
+ case 4:
143
+ case "end":
144
+ return _context7.stop();
145
+ }
146
+ }
147
+ }, _callee7);
148
+ }));
149
+ return _sendInput.apply(this, arguments);
150
+ }
151
+
152
+ var builtin = {
153
+ 37: {
154
+ game: 'sf',
155
+ caption: '***LETS GO JUSTIN!***',
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'
157
+ }
158
+ };
159
+ var _default = {
160
+ name: 'fg-notation',
161
+ intents: ['GUILD_MESSAGES'],
162
+ partials: ['MESSAGE'],
163
+ preload: function preload(sequelize) {
164
+ sequelize.define('fginput', {
165
+ guild: {
166
+ type: _sequelize.DataTypes.STRING,
167
+ primaryKey: true
168
+ },
169
+ name: {
170
+ type: _sequelize.DataTypes.STRING,
171
+ primaryKey: true
172
+ },
173
+ createdBy: _sequelize.DataTypes.STRING,
174
+ game: _sequelize.DataTypes.STRING,
175
+ caption: _sequelize.DataTypes.STRING,
176
+ input: _sequelize.DataTypes.STRING
177
+ });
178
+ },
179
+ events: {
180
+ messageCreate: function messageCreate(global, message) {
181
+ return (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
182
+ var client, config, sequelize, guildId, prefix, name, row, inputs;
183
+ return _regenerator["default"].wrap(function _callee$(_context) {
184
+ while (1) {
185
+ switch (_context.prev = _context.next) {
186
+ case 0:
187
+ client = global.client, config = global.config, sequelize = global.sequelize;
188
+
189
+ if (!(message.author.id === client.user.id || !message.member)) {
190
+ _context.next = 3;
191
+ break;
192
+ }
193
+
194
+ return _context.abrupt("return");
195
+
196
+ case 3:
197
+ guildId = message.guildId;
198
+ prefix = config[guildId].prefix;
199
+
200
+ if (!message.content.startsWith(prefix)) {
201
+ _context.next = 14;
202
+ break;
203
+ }
204
+
205
+ name = message.content.split(' ').pop().replace(prefix, '');
206
+ _context.t0 = builtin[name];
207
+
208
+ if (_context.t0) {
209
+ _context.next = 12;
210
+ break;
211
+ }
212
+
213
+ _context.next = 11;
214
+ return sequelize.models.fginput.findOne({
215
+ where: {
216
+ guild: message.guild.id,
217
+ name: name
218
+ }
219
+ });
220
+
221
+ case 11:
222
+ _context.t0 = _context.sent;
223
+
224
+ case 12:
225
+ row = _context.t0;
226
+
227
+ if (row) {
228
+ inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(row.game))));
229
+ sendInput(inputs, row.input.split(' '), message, row.caption);
230
+ }
231
+
232
+ case 14:
233
+ case "end":
234
+ return _context.stop();
235
+ }
236
+ }
237
+ }, _callee);
238
+ }))();
239
+ }
240
+ },
241
+ commands: {
242
+ fgi: {
243
+ usage: 'fgi [game] [inputs]',
244
+ desc: 'Converts a list of inputs into an image',
245
+ example: 'fgi sf 236P 214K',
246
+ execute: function () {
247
+ var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
248
+ var param, message, _param, game, i1, inputs, result;
249
+
250
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
251
+ while (1) {
252
+ switch (_context2.prev = _context2.next) {
253
+ case 0:
254
+ param = _ref.param;
255
+ message = _ref2.message;
256
+ _param = (0, _slicedToArray2["default"])(param, 3), game = _param[1], i1 = _param[2];
257
+
258
+ if (!(!game || !i1)) {
259
+ _context2.next = 5;
260
+ break;
261
+ }
262
+
263
+ return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
264
+
265
+ case 5:
266
+ if (gameInputs.has(game)) {
267
+ _context2.next = 7;
268
+ break;
269
+ }
270
+
271
+ return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
272
+
273
+ case 7:
274
+ inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
275
+ result = param.slice(2).map(function (i) {
276
+ return solveInput(inputs, i.toLowerCase());
277
+ }).flat();
278
+ sendInput(inputs, result, message);
279
+
280
+ case 10:
281
+ case "end":
282
+ return _context2.stop();
283
+ }
284
+ }
285
+ }, _callee2);
286
+ }));
287
+
288
+ function execute(_x5, _x6) {
289
+ return _execute.apply(this, arguments);
290
+ }
291
+
292
+ return execute;
293
+ }()
294
+ },
295
+ fgsave: {
296
+ usage: 'fgsave [game] [name] [inputs]',
297
+ desc: 'Saves a list of inputs into a command',
298
+ example: 'fgi sf testName 236P 214K',
299
+ execute: function () {
300
+ var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
301
+ var param, sequelize, message, _param2, game, name, i1, inputs, input;
302
+
303
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
304
+ while (1) {
305
+ switch (_context3.prev = _context3.next) {
306
+ case 0:
307
+ param = _ref3.param, sequelize = _ref3.sequelize;
308
+ message = _ref4.message;
309
+ _param2 = (0, _slicedToArray2["default"])(param, 4), game = _param2[1], name = _param2[2], i1 = _param2[3];
310
+
311
+ if (!(!game || !name || !i1)) {
312
+ _context3.next = 5;
313
+ break;
314
+ }
315
+
316
+ return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
317
+
318
+ case 5:
319
+ if (gameInputs.has(game)) {
320
+ _context3.next = 7;
321
+ break;
322
+ }
323
+
324
+ return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
325
+
326
+ case 7:
327
+ inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
328
+ input = param.slice(3).map(function (i) {
329
+ return solveInput(inputs, i.toLowerCase());
330
+ }).flat().join(' ');
331
+ _context3.next = 11;
332
+ return sequelize.models.fginput.create({
333
+ guild: message.guild.id,
334
+ name: name,
335
+ createdBy: message.author.id,
336
+ game: game,
337
+ input: input
338
+ });
339
+
340
+ case 11:
341
+ message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
342
+
343
+ case 12:
344
+ case "end":
345
+ return _context3.stop();
346
+ }
347
+ }
348
+ }, _callee3);
349
+ }));
350
+
351
+ function execute(_x7, _x8) {
352
+ return _execute2.apply(this, arguments);
353
+ }
354
+
355
+ return execute;
356
+ }()
357
+ },
358
+ fgcaption: {
359
+ usage: 'fgcaption [name] [caption]',
360
+ desc: 'Adds a caption to a saved input command',
361
+ example: 'fgcaption testName This is a caption',
362
+ execute: function () {
363
+ var _execute3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(_ref5, _ref6) {
364
+ var param, sequelize, message, _param3, name, i1, row;
365
+
366
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
367
+ while (1) {
368
+ switch (_context4.prev = _context4.next) {
369
+ case 0:
370
+ param = _ref5.param, sequelize = _ref5.sequelize;
371
+ message = _ref6.message;
372
+ _param3 = (0, _slicedToArray2["default"])(param, 3), name = _param3[1], i1 = _param3[2];
373
+
374
+ if (!(!name || !i1)) {
375
+ _context4.next = 5;
376
+ break;
377
+ }
378
+
379
+ return _context4.abrupt("return", message.reply('Missing arguments. Example: >fgi testName This is a caption'));
380
+
381
+ case 5:
382
+ _context4.next = 7;
383
+ return sequelize.models.fginput.findOne({
384
+ where: {
385
+ guild: message.guild.id,
386
+ name: name
387
+ }
388
+ });
389
+
390
+ case 7:
391
+ row = _context4.sent;
392
+
393
+ if (row) {
394
+ _context4.next = 10;
395
+ break;
396
+ }
397
+
398
+ return _context4.abrupt("return", message.reply("\"".concat(name, "\" is not a saved input list")));
399
+
400
+ case 10:
401
+ row.caption = param.slice(2).join(' ');
402
+ _context4.next = 13;
403
+ return row.save();
404
+
405
+ case 13:
406
+ message.channel.send("Saved caption for input list \"".concat(name, "\""));
407
+
408
+ case 14:
409
+ case "end":
410
+ return _context4.stop();
411
+ }
412
+ }
413
+ }, _callee4);
414
+ }));
415
+
416
+ function execute(_x9, _x10) {
417
+ return _execute3.apply(this, arguments);
418
+ }
419
+
420
+ return execute;
421
+ }()
422
+ },
423
+ fgglossary: {
424
+ usage: 'fgglossary [search term]',
425
+ desc: 'Searches for a term on Infil\'s Glossary',
426
+ example: 'fgglossary mexican uppercut',
427
+ execute: function () {
428
+ var _execute4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(_ref7, _ref8) {
429
+ var param, sequelize, message, params, search, result, url;
430
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
431
+ while (1) {
432
+ switch (_context5.prev = _context5.next) {
433
+ case 0:
434
+ param = _ref7.param, sequelize = _ref7.sequelize;
435
+ message = _ref8.message;
436
+ params = param.slice(1);
437
+
438
+ if (!(params.length === 0)) {
439
+ _context5.next = 5;
440
+ break;
441
+ }
442
+
443
+ return _context5.abrupt("return", message.reply('Missing search term. Example: >fgglossary mexican uppercut'));
444
+
445
+ case 5:
446
+ search = params.join(' ').toLowerCase();
447
+ result = terms.filter(function (i) {
448
+ return i.includes(search);
449
+ });
450
+ url = "https://glossary.infil.net/?t=".concat(params.join('%20').toLowerCase());
451
+
452
+ if (!(result.length === 0)) {
453
+ _context5.next = 10;
454
+ break;
455
+ }
456
+
457
+ return _context5.abrupt("return", message.reply("Term \"".concat(search, "\" not found")));
458
+
459
+ case 10:
460
+ if (!(result.length === 1)) {
461
+ _context5.next = 12;
462
+ break;
463
+ }
464
+
465
+ return _context5.abrupt("return", message.reply("```".concat(glossary[result[0]].def, "```Source: <").concat(url, ">")));
466
+
467
+ case 12:
468
+ message.reply(url);
469
+
470
+ case 13:
471
+ case "end":
472
+ return _context5.stop();
473
+ }
474
+ }
475
+ }, _callee5);
476
+ }));
477
+
478
+ function execute(_x11, _x12) {
479
+ return _execute4.apply(this, arguments);
480
+ }
481
+
482
+ return execute;
483
+ }()
484
+ }
485
+ }
486
+ };
487
+ exports["default"] = _default;
488
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJpbWdQYXRoIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJiYXNpY0lucHV0cyIsIk1hcCIsImdhbWVJbnB1dHMiLCJnbG9zc2FyeSIsInRlcm1zIiwiZ2V0R2xvc3NhcnkiLCJzZXRJbnRlcnZhbCIsIkpTT04iLCJyZXN1bHQiLCJwYXJzZSIsInRlbXBHIiwidGVtcFQiLCJmb3JFYWNoIiwiaSIsInRlcm0iLCJ0b0xvd2VyQ2FzZSIsInB1c2giLCJnbG9iIiwic3luYyIsIm5vZGlyIiwicCIsImlucHV0Iiwic3BsaXQiLCJwb3AiLCJyZXBsYWNlIiwic2V0IiwicmVsYXRpdmUiLCJkaXIiLCJuYW1lIiwiaGFzIiwiZ2V0Iiwic29sdmVJbnB1dCIsImlucHV0cyIsImxlbmd0aCIsInMxIiwic2xpY2UiLCJFcnJvciIsInNlbmRJbnB1dCIsIm1lc3NhZ2UiLCJjYXB0aW9uIiwiY3JlYXRlIiwid2lkdGgiLCJoZWlnaHQiLCJjaGFubmVscyIsImJhY2tncm91bmQiLCJjb21wb3NpdGUiLCJtYXAiLCJpdCIsImluZGV4IiwibGVmdCIsInRvcCIsInBuZyIsInRvQnVmZmVyIiwiY2FudmFzIiwicmVwbHkiLCJjb250ZW50IiwiZmlsZXMiLCJidWlsdGluIiwiZ2FtZSIsImludGVudHMiLCJwYXJ0aWFscyIsInByZWxvYWQiLCJzZXF1ZWxpemUiLCJkZWZpbmUiLCJndWlsZCIsInR5cGUiLCJEYXRhVHlwZXMiLCJTVFJJTkciLCJwcmltYXJ5S2V5IiwiY3JlYXRlZEJ5IiwiZXZlbnRzIiwibWVzc2FnZUNyZWF0ZSIsImdsb2JhbCIsImNsaWVudCIsImNvbmZpZyIsImF1dGhvciIsImlkIiwidXNlciIsIm1lbWJlciIsImd1aWxkSWQiLCJwcmVmaXgiLCJzdGFydHNXaXRoIiwibW9kZWxzIiwiZmdpbnB1dCIsImZpbmRPbmUiLCJ3aGVyZSIsInJvdyIsImNvbW1hbmRzIiwiZmdpIiwidXNhZ2UiLCJkZXNjIiwiZXhhbXBsZSIsImV4ZWN1dGUiLCJwYXJhbSIsImkxIiwiQXJyYXkiLCJmcm9tIiwia2V5cyIsImZsYXQiLCJmZ3NhdmUiLCJjaGFubmVsIiwic2VuZCIsImZnY2FwdGlvbiIsInNhdmUiLCJmZ2dsb3NzYXJ5IiwicGFyYW1zIiwic2VhcmNoIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJ1cmwiLCJkZWYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsSUFBTUEsT0FBTyxHQUFHQyxpQkFBS0MsSUFBTCxDQUFVQyxTQUFWLEVBQXFCLEtBQXJCLENBQWhCOztBQUNBLElBQU1DLFdBQVcsR0FBRyxJQUFJQyxHQUFKLEVBQXBCO0FBQ0EsSUFBTUMsVUFBVSxHQUFHLElBQUlELEdBQUosRUFBbkI7QUFFQSxJQUFJRSxRQUFRLEdBQUcsRUFBZjtBQUNBLElBQUlDLEtBQUssR0FBRyxFQUFaO0FBRUFDLFdBQVc7QUFDWEMsV0FBVyxDQUFDRCxXQUFELEVBQWMsSUFBSSxFQUFKLEdBQVMsSUFBdkIsQ0FBWDs7U0FFZUEsVzs7Ozs7K0ZBQWY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsMkJBQ2lCRSxJQURqQjtBQUFBO0FBQUEsbUJBQ2tDLGdDQUFHLCtDQUFILENBRGxDOztBQUFBO0FBQUE7QUFDUUMsWUFBQUEsTUFEUixnQkFDc0JDLEtBRHRCO0FBRVFDLFlBQUFBLEtBRlIsR0FFZ0IsRUFGaEI7QUFHUUMsWUFBQUEsS0FIUixHQUdnQixFQUhoQjtBQUtFSCxZQUFBQSxNQUFNLENBQUNJLE9BQVAsQ0FBZSxVQUFBQyxDQUFDLEVBQUk7QUFDbEIsa0JBQU1DLElBQUksR0FBR0QsQ0FBQyxDQUFDQyxJQUFGLENBQU9DLFdBQVAsRUFBYjtBQUNBTCxjQUFBQSxLQUFLLENBQUNJLElBQUQsQ0FBTCxHQUFjRCxDQUFkO0FBQ0FGLGNBQUFBLEtBQUssQ0FBQ0ssSUFBTixDQUFXRixJQUFYO0FBQ0QsYUFKRDtBQU1BWCxZQUFBQSxRQUFRLEdB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QUtRSixLQUFLLENBQUN1RyxNQUFOLENBQWEsVUFBQTlGLENBQUM7QUFBQSwyQkFBSUEsQ0FBQyxDQUFDK0YsUUFBRixDQUFXRixNQUFYLENBQUo7QUFBQSxtQkFBZCxDQUxSO0FBTURHLGtCQUFBQSxHQU5DLDJDQU1zQ0osTUFBTSxDQUFDM0csSUFBUCxDQUFZLEtBQVosRUFBbUJpQixXQUFuQixFQU50Qzs7QUFBQSx3QkFRSFAsTUFBTSxDQUFDeUIsTUFBUCxLQUFrQixDQVJmO0FBQUE7QUFBQTtBQUFBOztBQUFBLG9EQVF5QkssT0FBTyxDQUFDZ0IsS0FBUixrQkFBdUJvRCxNQUF2QixrQkFSekI7O0FBQUE7QUFBQSx3QkFTSGxHLE1BQU0sQ0FBQ3lCLE1BQVAsS0FBa0IsQ0FUZjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvREFTeUJLLE9BQU8sQ0FBQ2dCLEtBQVIsY0FBdUJuRCxRQUFRLENBQUNLLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FBUixDQUFvQnNHLEdBQTNDLHlCQUFnRUQsR0FBaEUsT0FUekI7O0FBQUE7QUFXUHZFLGtCQUFBQSxPQUFPLENBQUNnQixLQUFSLENBQWN1RCxHQUFkOztBQVhPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFKRztBQXBESjtBQTlDRyxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNoYXJwIGZyb20gJ3NoYXJwJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZ2xvYiBmcm9tICdnbG9iJ1xyXG5pbXBvcnQgeyBEYXRhVHlwZXMgfSBmcm9tICdzZXF1ZWxpemUnXHJcbmltcG9ydCBycCBmcm9tICdyZXF1ZXN0LXByb21pc2UnXHJcblxyXG5jb25zdCBpbWdQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2ltZycpXHJcbmNvbnN0IGJhc2ljSW5wdXRzID0gbmV3IE1hcCgpXHJcbmNvbnN0IGdhbWVJbnB1dHMgPSBuZXcgTWFwKClcclxuXHJcbmxldCBnbG9zc2FyeSA9IHt9XHJcbmxldCB0ZXJtcyA9IFtdXHJcblxyXG5nZXRHbG9zc2FyeSgpXHJcbnNldEludGVydmFsKGdldEdsb3NzYXJ5LCA1ICogNjAgKiAxMDAwKVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0R2xvc3NhcnkgKCkge1xyXG4gIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoYXdhaXQgcnAoJ2h0dHBzOi8vZ2xvc3NhcnkuaW5maWwubmV0L2pzb24vZ2xvc3NhcnkuanNvbicpKVxyXG4gIGNvbnN0IHRlbXBHID0ge31cclxuICBjb25zdCB0ZW1wVCA9IFtdXHJcblxyXG4gIHJlc3VsdC5mb3JFYWNoKGkgPT4ge1xyXG4gICAgY29uc3QgdGVybSA9IGkudGVybS50b0xvd2VyQ2FzZSgpXHJcbiAgICB0ZW1wR1t0ZXJtXSA9IGlcclxuICAgIHRlbXBULnB1c2godGVybSlcclxuICB9KVxyXG5cclxuICBnbG9zc2FyeSA9IHRlbXBHXHJcbiAgdGVybXMgPSB0ZW1wVFxyXG59XHJcblxyXG5nbG9iLnN5bmMocGF0aC5qb2luKGltZ1BhdGgsICdiYXNpYy8qKicpLCB7IG5vZGlyOiB0cnVlIH0pXHJcbiAgLmZvckVhY2gocCA9PiB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHAuc3BsaXQoJy8nKS5wb3AoKS5yZXBsYWNlKCcucG5nJywgJycpXHJcbiAgICBiYXNpY0lucHV0cy5zZXQoaW5wdXQsIHApXHJcbiAgfSlcclxuXHJcbmJhc2ljSW5wdXRzLnNldCgnPj4nLCBwYXRoLmpvaW4oaW1nUGF0aCwgJ2Jhc2ljL2RvdWJsZWZvcndhcmQucG5nJykpXHJcblxyXG5nbG9iLnN5bmMocGF0aC5qb2luKGltZ1BhdGgsICdnYW1lcy8qKicpLCB7IG5vZGlyOiB0cnVlIH0pXHJcbiAgLmZvckVhY2gocCA9PiB7XHJcbiAgICBjb25zdCB7IGRpciwgbmFtZSB9ID0gcGF0aC5wYXJzZShwYXRoLnJlbGF0aXZlKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMnKSwgcCkpXHJcblxyXG4gICAgaWYgKCFnYW1lSW5wdXRzLmhhcyhkaXIpKSBnYW1lSW5wdXRzLnNldChkaXIsIG5ldyBNYXAoKSlcclxuICAgIGdhbWVJbnB1dHMuZ2V0KGRpcikuc2V0KG5hbWUsIHApXHJcbiAgfSlcclxuXHJcbmZ1bmN0aW9uIHNvbHZlSW5wdXQgKGlucHV0cywgaW5wdXQpIHtcclxuICBpZiAoaW5wdXRzLmhhcyhpbnB1dCkpIHJldHVybiBbaW5wdXRdXHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IHMxID0gaW5wdXQuc2xpY2UoMCwgMCAtIGkpXHJcbiAgICBpZiAoaW5wdXRzLmhhcyhzMSkpIHJldHVybiBbczEsIC4uLnNvbHZlSW5wdXQoaW5wdXRzLCBpbnB1dC5zbGljZSgwIC0gaSkpXVxyXG4gIH1cclxuXHJcbiAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBcIiR7aW5wdXR9XCIgYXMgYSByZWNvZ25pemFibGUgaW5wdXRgKVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBzZW5kSW5wdXQgKGlucHV0cywgcmVzdWx0LCBtZXNzYWdlLCBjYXB0aW9uKSB7XHJcbiAgY29uc3QgY2FudmFzID0gYXdhaXQgc2hhcnAoeyBjcmVhdGU6IHsgd2lkdGg6IDE1MiAqIHJlc3VsdC5sZW5ndGgsIGhlaWdodDogMTUyLCBjaGFubmVsczogNCwgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyB9IH0pXHJcbiAgICAuY29tcG9zaXRlKHJlc3VsdC5tYXAoKGl0LCBpbmRleCkgPT5cclxuICAgICAgKHsgaW5wdXQ6IGlucHV0cy5nZXQoaXQpLCBsZWZ0OiBpbmRleCAqIDE1MiwgdG9wOiAwLCB3aWR0aDogMTUyLCBoZWlnaHQ6IDE1MiB9KVxyXG4gICAgKSlcclxuICAgIC5wbmcoKVxyXG4gICAgLnRvQnVmZmVyKClcclxuXHJcbiAgcmV0dXJuIG1lc3NhZ2UucmVwbHkoeyBjb250ZW50OiBjYXB0aW9uLCBmaWxlczogW2NhbnZhc10gfSlcclxufVxyXG5cclxuY29uc3QgYnVpbHRpbiA9IHtcclxuICAzNzoge1xyXG4gICAgZ2FtZTogJ3NmJyxcclxuICAgIGNhcHRpb246ICcqKipMRVRTIEdPIEpVU1RJTiEqKionLFxyXG4gICAgaW5wdXQ6ICc2IDYgNiA2IDYgNiA2ID4+IDYgNiA2IDYgNiA2IDYgPj4gOCA2IGouIGhrID4+IDIgbWsgPj4gNjIzIG1wID4+IDIzNiAyMzYgbGsnXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgbmFtZTogJ2ZnLW5vdGF0aW9uJyxcclxuICBpbnRlbnRzOiBbJ0dVSUxEX01FU1NBR0VTJ10sXHJcbiAgcGFydGlhbHM6IFsnTUVTU0FHRSddLFxyXG5cclxuICBwcmVsb2FkOiBzZXF1ZWxpemUgPT4ge1xyXG4gICAgc2VxdWVsaXplLmRlZmluZSgnZmdpbnB1dCcsIHtcclxuICAgICAgZ3VpbGQ6IHtcclxuICAgICAgICB0eXBlOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICAgIHByaW1hcnlLZXk6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgbmFtZToge1xyXG4gICAgICAgIHR5cGU6IERhdGFUeXBlcy5TVFJJTkcsXHJcbiAgICAgICAgcHJpbWFyeUtleTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjcmVhdGVkQnk6IERhdGFUeXBlcy5TVFJJTkcsXHJcbiAgICAgIGdhbWU6IERhdGFUeXBlcy5TVFJJTkcsXHJcbiAgICAgIGNhcHRpb246IERhdGFUeXBlcy5TVFJJTkcsXHJcbiAgICAgIGlucHV0OiBEYXRhVHlwZXMuU1RSSU5HXHJcbiAgICB9KVxyXG4gIH0sXHJcblxyXG4gIGV2ZW50czoge1xyXG4gICAgYXN5bmMgbWVzc2FnZUNyZWF0ZSAoZ2xvYmFsLCBtZXNzYWdlKSB7XHJcbiAgICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcsIHNlcXVlbGl6ZSB9ID0gZ2xvYmFsXHJcbiAgICAgIGlmIChtZXNzYWdlLmF1dGhvci5pZCA9PT0gY2xpZW50LnVzZXIuaWQgfHwgIW1lc3NhZ2UubWVtYmVyKSByZXR1cm5cclxuXHJcbiAgICAgIGNvbnN0IGd1aWxkSWQgPSBtZXNzYWdlLmd1aWxkSWRcclxuICAgICAgY29uc3QgeyBwcmVmaXggfSA9IGNvbmZpZ1tndWlsZElkXVxyXG5cclxuICAgICAgaWYgKG1lc3NhZ2UuY29udGVudC5zdGFydHNXaXRoKHByZWZpeCkpIHtcclxuICAgICAgICBjb25zdCBuYW1lID0gbWVzc2FnZS5jb250ZW50LnNwbGl0KCcgJykucG9wKCkucmVwbGFjZShwcmVmaXgsICcnKVxyXG4gICAgICAgIGNvbnN0IHJvdyA9IGJ1aWx0aW5bbmFtZV0gfHwgKFxyXG4gICAgICAgICAgYXdhaXQgc2VxdWVsaXplLm1vZGVscy5mZ2lucHV0LmZpbmRPbmUoe1xyXG4gICAgICAgICAgICB3aGVyZTogeyBndWlsZDogbWVzc2FnZS5ndWlsZC5pZCwgbmFtZSB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgY29uc3QgaW5wdXRzID0gbmV3IE1hcChbLi4uYmFzaWNJbnB1dHMsIC4uLmdhbWVJbnB1dHMuZ2V0KHJvdy5nYW1lKV0pXHJcbiAgICAgICAgICBzZW5kSW5wdXQoaW5wdXRzLCByb3cuaW5wdXQuc3BsaXQoJyAnKSwgbWVzc2FnZSwgcm93LmNhcHRpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgY29tbWFuZHM6IHtcclxuICAgIGZnaToge1xyXG4gICAgICB1c2FnZTogJ2ZnaSBbZ2FtZV0gW2lucHV0c10nLFxyXG4gICAgICBkZXNjOiAnQ29udmVydHMgYSBsaXN0IG9mIGlucHV0cyBpbnRvIGFuIGltYWdlJyxcclxuICAgICAgZXhhbXBsZTogJ2ZnaSBzZiAyMzZQIDIxNEsnLFxyXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXJhbSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IFssIGdhbWUsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFnYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHNmIDIzNlAgMjE0SycpXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXRzLmhhcyhnYW1lKSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFwiJHtnYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGdhbWUuIEF2YWlsYWJsZSBnYW1lczogJHtBcnJheS5mcm9tKGdhbWVJbnB1dHMua2V5cygpKS5qb2luKCcgJyl9YClcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXRzID0gbmV3IE1hcChbLi4uYmFzaWNJbnB1dHMsIC4uLmdhbWVJbnB1dHMuZ2V0KGdhbWUpXSlcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJhbS5zbGljZSgyKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpXHJcblxyXG4gICAgICAgIHNlbmRJbnB1dChpbnB1dHMsIHJlc3VsdCwgbWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZnc2F2ZToge1xyXG4gICAgICB1c2FnZTogJ2Znc2F2ZSBbZ2FtZV0gW25hbWVdIFtpbnB1dHNdJyxcclxuICAgICAgZGVzYzogJ1NhdmVzIGEgbGlzdCBvZiBpbnB1dHMgaW50byBhIGNvbW1hbmQnLFxyXG4gICAgICBleGFtcGxlOiAnZmdpIHNmIHRlc3ROYW1lIDIzNlAgMjE0SycsXHJcbiAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhcmFtLCBzZXF1ZWxpemUgfSwgeyBtZXNzYWdlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBbLCBnYW1lLCBuYW1lLCBpMV0gPSBwYXJhbVxyXG4gICAgICAgIGlmICghZ2FtZSB8fCAhbmFtZSB8fCAhaTEpIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIGFyZ3VtZW50cy4gRXhhbXBsZTogPmZnaSBzZiB0ZXN0TmFtZSAyMzZQIDIxNEsnKVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0cy5oYXMoZ2FtZSkpIHJldHVybiBtZXNzYWdlLnJlcGx5KGBcIiR7Z2FtZX1cIiBpcyBub3QgYSB2YWxpZCBnYW1lLiBBdmFpbGFibGUgZ2FtZXM6ICR7QXJyYXkuZnJvbShnYW1lSW5wdXRzLmtleXMoKSkuam9pbignICcpfWApXHJcblxyXG4gICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChnYW1lKV0pXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBwYXJhbS5zbGljZSgzKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpLmpvaW4oJyAnKVxyXG5cclxuICAgICAgICBhd2FpdCBzZXF1ZWxpemUubW9kZWxzLmZnaW5wdXQuY3JlYXRlKHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUsIGNyZWF0ZWRCeTogbWVzc2FnZS5hdXRob3IuaWQsIGdhbWUsIGlucHV0IH0pXHJcblxyXG4gICAgICAgIG1lc3NhZ2UuY2hhbm5lbC5zZW5kKGBTYXZlZCBjb21tYW5kIFwiJHtpbnB1dH1cIiBhcyBcIiR7bmFtZX1cImApXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ2NhcHRpb246IHtcclxuICAgICAgdXNhZ2U6ICdmZ2NhcHRpb24gW25hbWVdIFtjYXB0aW9uXScsXHJcbiAgICAgIGRlc2M6ICdBZGRzIGEgY2FwdGlvbiB0byBhIHNhdmVkIGlucHV0IGNvbW1hbmQnLFxyXG4gICAgICBleGFtcGxlOiAnZmdjYXB0aW9uIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IFssIG5hbWUsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJylcclxuXHJcbiAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgc2VxdWVsaXplLm1vZGVscy5mZ2lucHV0LmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGlmICghcm93KSByZXR1cm4gbWVzc2FnZS5yZXBseShgXCIke25hbWV9XCIgaXMgbm90IGEgc2F2ZWQgaW5wdXQgbGlzdGApXHJcbiAgICAgICAgcm93LmNhcHRpb24gPSBwYXJhbS5zbGljZSgyKS5qb2luKCcgJylcclxuICAgICAgICBhd2FpdCByb3cuc2F2ZSgpXHJcblxyXG4gICAgICAgIG1lc3NhZ2UuY2hhbm5lbC5zZW5kKGBTYXZlZCBjYXB0aW9uIGZvciBpbnB1dCBsaXN0IFwiJHtuYW1lfVwiYClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZnZ2xvc3Nhcnk6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2dsb3NzYXJ5IFtzZWFyY2ggdGVybV0nLFxyXG4gICAgICBkZXNjOiAnU2VhcmNoZXMgZm9yIGEgdGVybSBvbiBJbmZpbFxcJ3MgR2xvc3NhcnknLFxyXG4gICAgICBleGFtcGxlOiAnZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtLnNsaWNlKDEpXHJcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIHNlYXJjaCB0ZXJtLiBFeGFtcGxlOiA+ZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JylcclxuXHJcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gcGFyYW1zLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVybXMuZmlsdGVyKGkgPT4gaS5pbmNsdWRlcyhzZWFyY2gpKVxyXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dsb3NzYXJ5LmluZmlsLm5ldC8/dD0ke3BhcmFtcy5qb2luKCclMjAnKS50b0xvd2VyQ2FzZSgpfWBcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KGBUZXJtIFwiJHtzZWFyY2h9XCIgbm90IGZvdW5kYClcclxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFxcYFxcYFxcYCR7Z2xvc3NhcnlbcmVzdWx0WzBdXS5kZWZ9XFxgXFxgXFxgU291cmNlOiA8JHt1cmx9PmApXHJcblxyXG4gICAgICAgIG1lc3NhZ2UucmVwbHkodXJsKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
package/package.json CHANGED
@@ -1,10 +1,22 @@
1
- {
2
- "name": "@lotus-tree/fg-notation",
3
- "version": "1.0.1",
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.0",
4
+ "main": "lib/index.js",
5
+ "module": "src/index.js",
6
+ "scripts": {
7
+ "build": "babel --delete-dir-on-start --copy-files --source-maps inline --root-mode upward src --out-dir lib",
8
+ "dev": "yarn build --watch"
9
+ },
10
+ "dependencies": {
11
+ "glob": "^7.2.0",
12
+ "request-promise": "^4.2.6",
13
+ "sharp": "^0.29.3"
14
+ },
15
+ "devDependencies": {
16
+ "@babel/cli": "^7.16.7",
17
+ "@babel/core": "^7.16.7",
18
+ "@babel/node": "^7.16.7",
19
+ "@babel/plugin-transform-runtime": "^7.16.7",
20
+ "@babel/preset-env": "^7.16.7"
21
+ }
22
+ }
package/src/index.js CHANGED
@@ -2,11 +2,33 @@ import sharp from 'sharp'
2
2
  import path from 'path'
3
3
  import glob from 'glob'
4
4
  import { DataTypes } from 'sequelize'
5
+ import rp from 'request-promise'
5
6
 
6
7
  const imgPath = path.join(__dirname, 'img')
7
8
  const basicInputs = new Map()
8
9
  const gameInputs = new Map()
9
10
 
11
+ let glossary = {}
12
+ let terms = []
13
+
14
+ getGlossary()
15
+ setInterval(getGlossary, 5 * 60 * 1000)
16
+
17
+ async function getGlossary () {
18
+ const result = JSON.parse(await rp('https://glossary.infil.net/json/glossary.json'))
19
+ const tempG = {}
20
+ const tempT = []
21
+
22
+ result.forEach(i => {
23
+ const term = i.term.toLowerCase()
24
+ tempG[term] = i
25
+ tempT.push(term)
26
+ })
27
+
28
+ glossary = tempG
29
+ terms = tempT
30
+ }
31
+
10
32
  glob.sync(path.join(imgPath, 'basic/**'), { nodir: true })
11
33
  .forEach(p => {
12
34
  const input = p.split('/').pop().replace('.png', '')
@@ -49,7 +71,7 @@ const builtin = {
49
71
  37: {
50
72
  game: 'sf',
51
73
  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'
74
+ 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
75
  }
54
76
  }
55
77
 
@@ -150,6 +172,24 @@ export default {
150
172
 
151
173
  message.channel.send(`Saved caption for input list "${name}"`)
152
174
  }
175
+ },
176
+ fgglossary: {
177
+ usage: 'fgglossary [search term]',
178
+ desc: 'Searches for a term on Infil\'s Glossary',
179
+ example: 'fgglossary mexican uppercut',
180
+ execute: async ({ param, sequelize }, { message }) => {
181
+ const params = param.slice(1)
182
+ if (params.length === 0) return message.reply('Missing search term. Example: >fgglossary mexican uppercut')
183
+
184
+ const search = params.join(' ').toLowerCase()
185
+ const result = terms.filter(i => i.includes(search))
186
+ const url = `https://glossary.infil.net/?t=${params.join('%20').toLowerCase()}`
187
+
188
+ if (result.length === 0) return message.reply(`Term "${search}" not found`)
189
+ if (result.length === 1) return message.reply(`\`\`\`${glossary[result[0]].def}\`\`\`Source: <${url}>`)
190
+
191
+ message.reply(url)
192
+ }
153
193
  }
154
194
  }
155
195
  }