@lotus-tree/fg-notation 1.1.4 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +15 -14
- package/dev/img/basic/+.png +0 -0
- package/dev/img/games/bbtag/a.png +0 -0
- package/dev/img/games/bbtag/b.png +0 -0
- package/dev/img/games/bbtag/c.png +0 -0
- package/dev/img/games/bbtag/d.png +0 -0
- package/dev/img/games/bbtag/p.png +0 -0
- package/dev/index.js +129 -57
- package/dev/info.json +33 -0
- package/lib/img/basic/+.png +0 -0
- package/lib/img/games/bbtag/a.png +0 -0
- package/lib/img/games/bbtag/b.png +0 -0
- package/lib/img/games/bbtag/c.png +0 -0
- package/lib/img/games/bbtag/d.png +0 -0
- package/lib/img/games/bbtag/p.png +0 -0
- package/lib/index.js +127 -56
- package/lib/info.json +33 -0
- package/package.json +5 -3
- package/src/img/basic/+.png +0 -0
- package/src/img/games/bbtag/a.png +0 -0
- package/src/img/games/bbtag/b.png +0 -0
- package/src/img/games/bbtag/c.png +0 -0
- package/src/img/games/bbtag/d.png +0 -0
- package/src/img/games/bbtag/p.png +0 -0
- package/src/index.js +79 -30
- package/src/info.json +33 -0
package/README.md
CHANGED
@@ -23,20 +23,21 @@ https://user-images.githubusercontent.com/19596334/149458504-baf906a3-87da-4d92-
|
|
23
23
|
https://user-images.githubusercontent.com/19596334/149458508-1dcf89fb-a83e-44bb-a6a0-9549771c6082.mp4
|
24
24
|
|
25
25
|
## Available games
|
26
|
-
| Game
|
27
|
-
|
28
|
-
| Blazblue
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
26
|
+
| Game | Name |
|
27
|
+
|----------------------------|-------|
|
28
|
+
| Blazblue | bb |
|
29
|
+
| Blazblue: Cross Tag Battle | bbtag |
|
30
|
+
| Dragonball Fighterz | dbz |
|
31
|
+
| DNF Duel | dnf |
|
32
|
+
| Granblue Versus | gbf |
|
33
|
+
| Guilty Gear | gg |
|
34
|
+
| King of Fighters | kof |
|
35
|
+
| Mortal Kombat | mk |
|
36
|
+
| Soul Calibur | sc |
|
37
|
+
| Street Fighter | sf |
|
38
|
+
| Skullgirlz | sg |
|
39
|
+
| Them Fighting Herds | tfh |
|
40
|
+
| Tekken | tkn |
|
40
41
|
|
41
42
|
## Add to your server
|
42
43
|
Use [this link](https://discord.com/oauth2/authorize?client_id=928539052834177024&scope=bot&permissions=34816) to add this bot to your Discord server
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
package/dev/index.js
CHANGED
@@ -9,10 +9,10 @@ exports["default"] = void 0;
|
|
9
9
|
|
10
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
11
11
|
|
12
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
13
|
-
|
14
12
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
15
13
|
|
14
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
15
|
+
|
16
16
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
17
17
|
|
18
18
|
var _sharp = _interopRequireDefault(require("sharp"));
|
@@ -25,6 +25,8 @@ var _sequelize = require("sequelize");
|
|
25
25
|
|
26
26
|
var _bent = _interopRequireDefault(require("bent"));
|
27
27
|
|
28
|
+
var _info = require("./info.json");
|
29
|
+
|
28
30
|
var getJSON = (0, _bent["default"])('json');
|
29
31
|
|
30
32
|
var imgPath = _path["default"].join(__dirname, 'img');
|
@@ -77,27 +79,55 @@ _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
|
|
77
79
|
}).forEach(function (p) {
|
78
80
|
var input = p.split('/').pop().replace('.png', '');
|
79
81
|
basicInputs.set(input, p);
|
80
|
-
|
82
|
+
var alias = _info.aliases.inputs.basic[input];
|
81
83
|
|
82
|
-
|
84
|
+
if (alias) {
|
85
|
+
alias.forEach(function (i) {
|
86
|
+
basicInputs.set(i, p);
|
87
|
+
if (_info.sizes[input]) _info.sizes[i] = _info.sizes[input];
|
88
|
+
});
|
89
|
+
}
|
90
|
+
});
|
83
91
|
|
84
|
-
_glob["default"].sync(_path["default"].join(imgPath, 'games
|
85
|
-
nodir: true
|
86
|
-
}).forEach(function (p) {
|
92
|
+
_glob["default"].sync(_path["default"].join(imgPath, 'games/*')).forEach(function (p) {
|
87
93
|
var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
|
88
|
-
|
89
|
-
|
94
|
+
base = _path$parse.base;
|
95
|
+
|
96
|
+
gameInputs.set(base, new Map());
|
90
97
|
|
91
|
-
|
92
|
-
|
98
|
+
_glob["default"].sync(_path["default"].join(imgPath, 'games', base, '**'), {
|
99
|
+
nodir: true
|
100
|
+
}).forEach(function (input) {
|
101
|
+
var _path$parse2 = _path["default"].parse(input),
|
102
|
+
name = _path$parse2.name;
|
103
|
+
|
104
|
+
gameInputs.get(base).set(name, input);
|
105
|
+
});
|
106
|
+
|
107
|
+
var alias = _info.aliases.inputs.games[base];
|
108
|
+
|
109
|
+
if (alias) {
|
110
|
+
for (var _i = 0, _Object$entries = Object.entries(alias); _i < _Object$entries.length; _i++) {
|
111
|
+
var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
|
112
|
+
a = _Object$entries$_i[0],
|
113
|
+
s = _Object$entries$_i[1];
|
114
|
+
|
115
|
+
gameInputs.get(base).set(a, s);
|
116
|
+
}
|
117
|
+
}
|
93
118
|
});
|
94
119
|
|
95
120
|
function solveInput(inputs, input) {
|
96
|
-
if (inputs.has(input)) return [input];
|
121
|
+
if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input);
|
97
122
|
|
98
123
|
for (var i = 0; i < input.length; i++) {
|
99
124
|
var s1 = input.slice(0, 0 - i);
|
100
|
-
|
125
|
+
|
126
|
+
if (inputs.has(s1)) {
|
127
|
+
var result = inputs.get(s1);
|
128
|
+
var remaining = solveInput(inputs, input.slice(0 - i));
|
129
|
+
return isString(result) ? [s1].concat((0, _toConsumableArray2["default"])(remaining)) : [].concat((0, _toConsumableArray2["default"])(result), (0, _toConsumableArray2["default"])(remaining));
|
130
|
+
}
|
101
131
|
}
|
102
132
|
|
103
133
|
throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
|
@@ -109,37 +139,61 @@ function sendInput(_x, _x2, _x3, _x4) {
|
|
109
139
|
|
110
140
|
function _sendInput() {
|
111
141
|
_sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
|
112
|
-
var canvas;
|
142
|
+
var width, images, left, canvas;
|
113
143
|
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
114
144
|
while (1) {
|
115
145
|
switch (_context7.prev = _context7.next) {
|
116
146
|
case 0:
|
117
|
-
|
118
|
-
|
147
|
+
width = result.map(function (it) {
|
148
|
+
return _info.sizes[it] || 152;
|
149
|
+
}).reduce(function (a, b) {
|
150
|
+
return a + b;
|
151
|
+
}, 0);
|
152
|
+
images = [];
|
153
|
+
left = 0;
|
154
|
+
result.forEach(function (it, index) {
|
155
|
+
var size = _info.sizes[it] || 152;
|
156
|
+
images.push({
|
157
|
+
input: inputs.get(it),
|
158
|
+
left: left,
|
159
|
+
top: Math.floor((152 - size) / 2)
|
160
|
+
});
|
161
|
+
left += size;
|
162
|
+
});
|
163
|
+
canvas = (0, _sharp["default"])({
|
119
164
|
create: {
|
120
|
-
width:
|
165
|
+
width: width,
|
121
166
|
height: 152,
|
122
167
|
channels: 4,
|
123
168
|
background: 'transparent'
|
124
169
|
}
|
125
|
-
}).
|
126
|
-
|
127
|
-
|
128
|
-
left: index * 152,
|
129
|
-
top: 0,
|
130
|
-
width: 152,
|
131
|
-
height: 152
|
132
|
-
};
|
133
|
-
})).png().toBuffer();
|
170
|
+
}).png().composite(images);
|
171
|
+
_context7.next = 7;
|
172
|
+
return canvas.toBuffer();
|
134
173
|
|
135
|
-
case
|
174
|
+
case 7:
|
136
175
|
canvas = _context7.sent;
|
176
|
+
|
177
|
+
if (!(result.length < 12)) {
|
178
|
+
_context7.next = 12;
|
179
|
+
break;
|
180
|
+
}
|
181
|
+
|
182
|
+
_context7.next = 11;
|
183
|
+
return (0, _sharp["default"])(canvas).resize({
|
184
|
+
height: 55
|
185
|
+
}).png().toBuffer();
|
186
|
+
|
187
|
+
case 11:
|
188
|
+
canvas = _context7.sent;
|
189
|
+
|
190
|
+
case 12:
|
137
191
|
return _context7.abrupt("return", message.reply({
|
138
192
|
content: caption,
|
139
193
|
files: [canvas]
|
140
194
|
}));
|
141
195
|
|
142
|
-
case
|
196
|
+
case 13:
|
143
197
|
case "end":
|
144
198
|
return _context7.stop();
|
145
199
|
}
|
@@ -149,13 +203,14 @@ function _sendInput() {
|
|
149
203
|
return _sendInput.apply(this, arguments);
|
150
204
|
}
|
151
205
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
}
|
206
|
+
function checkGame(game) {
|
207
|
+
return gameInputs.has(game) ? game : _info.aliases.games[game];
|
208
|
+
}
|
209
|
+
|
210
|
+
function isString(x) {
|
211
|
+
return Object.prototype.toString.call(x) === '[object String]';
|
212
|
+
}
|
213
|
+
|
159
214
|
var _default = {
|
160
215
|
name: 'fg-notation',
|
161
216
|
about: {
|
@@ -207,7 +262,7 @@ var _default = {
|
|
207
262
|
}
|
208
263
|
|
209
264
|
name = message.content.split(' ').pop().replace(prefix, '');
|
210
|
-
_context.t0 = builtin[name];
|
265
|
+
_context.t0 = _info.builtin[name];
|
211
266
|
|
212
267
|
if (_context.t0) {
|
213
268
|
_context.next = 12;
|
@@ -249,7 +304,7 @@ var _default = {
|
|
249
304
|
example: 'fgi sf 236P 214K',
|
250
305
|
execute: function () {
|
251
306
|
var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
|
252
|
-
var param, message, _param,
|
307
|
+
var param, message, _param, gameInput, i1, game, inputs, result;
|
253
308
|
|
254
309
|
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
255
310
|
while (1) {
|
@@ -257,9 +312,9 @@ var _default = {
|
|
257
312
|
case 0:
|
258
313
|
param = _ref.param;
|
259
314
|
message = _ref2.message;
|
260
|
-
_param = (0, _slicedToArray2["default"])(param, 3),
|
315
|
+
_param = (0, _slicedToArray2["default"])(param, 3), gameInput = _param[1], i1 = _param[2];
|
261
316
|
|
262
|
-
if (!(!
|
317
|
+
if (!(!gameInput || !i1)) {
|
263
318
|
_context2.next = 5;
|
264
319
|
break;
|
265
320
|
}
|
@@ -267,21 +322,27 @@ var _default = {
|
|
267
322
|
return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
|
268
323
|
|
269
324
|
case 5:
|
325
|
+
game = checkGame(gameInput);
|
326
|
+
|
270
327
|
if (gameInputs.has(game)) {
|
271
|
-
_context2.next =
|
328
|
+
_context2.next = 8;
|
272
329
|
break;
|
273
330
|
}
|
274
331
|
|
275
332
|
return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
|
276
333
|
|
277
|
-
case
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
334
|
+
case 8:
|
335
|
+
try {
|
336
|
+
inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
|
337
|
+
result = param.slice(2).map(function (i) {
|
338
|
+
return solveInput(inputs, i.toLowerCase());
|
339
|
+
}).flat();
|
340
|
+
sendInput(inputs, result, message);
|
341
|
+
} catch (err) {
|
342
|
+
message.reply(err.message);
|
343
|
+
}
|
283
344
|
|
284
|
-
case
|
345
|
+
case 9:
|
285
346
|
case "end":
|
286
347
|
return _context2.stop();
|
287
348
|
}
|
@@ -302,7 +363,7 @@ var _default = {
|
|
302
363
|
example: 'fgi sf testName 236P 214K',
|
303
364
|
execute: function () {
|
304
365
|
var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
|
305
|
-
var param, sequelize, message, _param2,
|
366
|
+
var param, sequelize, message, _param2, gameInput, name, i1, game, inputs, input;
|
306
367
|
|
307
368
|
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
308
369
|
while (1) {
|
@@ -310,9 +371,9 @@ var _default = {
|
|
310
371
|
case 0:
|
311
372
|
param = _ref3.param, sequelize = _ref3.sequelize;
|
312
373
|
message = _ref4.message;
|
313
|
-
_param2 = (0, _slicedToArray2["default"])(param, 4),
|
374
|
+
_param2 = (0, _slicedToArray2["default"])(param, 4), gameInput = _param2[1], name = _param2[2], i1 = _param2[3];
|
314
375
|
|
315
|
-
if (!(!
|
376
|
+
if (!(!gameInput || !name || !i1)) {
|
316
377
|
_context3.next = 5;
|
317
378
|
break;
|
318
379
|
}
|
@@ -320,19 +381,22 @@ var _default = {
|
|
320
381
|
return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
|
321
382
|
|
322
383
|
case 5:
|
384
|
+
game = checkGame(gameInput);
|
385
|
+
|
323
386
|
if (gameInputs.has(game)) {
|
324
|
-
_context3.next =
|
387
|
+
_context3.next = 8;
|
325
388
|
break;
|
326
389
|
}
|
327
390
|
|
328
391
|
return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
|
329
392
|
|
330
|
-
case
|
393
|
+
case 8:
|
394
|
+
_context3.prev = 8;
|
331
395
|
inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
|
332
396
|
input = param.slice(3).map(function (i) {
|
333
397
|
return solveInput(inputs, i.toLowerCase());
|
334
398
|
}).flat().join(' ');
|
335
|
-
_context3.next =
|
399
|
+
_context3.next = 13;
|
336
400
|
return sequelize.models.fginput.create({
|
337
401
|
guild: message.guild.id,
|
338
402
|
name: name,
|
@@ -341,15 +405,22 @@ var _default = {
|
|
341
405
|
input: input
|
342
406
|
});
|
343
407
|
|
344
|
-
case
|
408
|
+
case 13:
|
345
409
|
message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
|
410
|
+
_context3.next = 19;
|
411
|
+
break;
|
346
412
|
|
347
|
-
case
|
413
|
+
case 16:
|
414
|
+
_context3.prev = 16;
|
415
|
+
_context3.t0 = _context3["catch"](8);
|
416
|
+
message.reply(_context3.t0.message);
|
417
|
+
|
418
|
+
case 19:
|
348
419
|
case "end":
|
349
420
|
return _context3.stop();
|
350
421
|
}
|
351
422
|
}
|
352
|
-
}, _callee3);
|
423
|
+
}, _callee3, null, [[8, 16]]);
|
353
424
|
}));
|
354
425
|
|
355
426
|
function execute(_x7, _x8) {
|
@@ -488,4 +559,5 @@ var _default = {
|
|
488
559
|
}
|
489
560
|
}
|
490
561
|
};
|
491
|
-
exports["default"] = _default;
|
562
|
+
exports["default"] = _default;
|
563
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJnZXRKU09OIiwiaW1nUGF0aCIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiYmFzaWNJbnB1dHMiLCJNYXAiLCJnYW1lSW5wdXRzIiwiZ2xvc3NhcnkiLCJ0ZXJtcyIsImdldEdsb3NzYXJ5Iiwic2V0SW50ZXJ2YWwiLCJyZXN1bHQiLCJ0ZW1wRyIsInRlbXBUIiwiZm9yRWFjaCIsImkiLCJ0ZXJtIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwiZ2xvYiIsInN5bmMiLCJub2RpciIsInAiLCJpbnB1dCIsInNwbGl0IiwicG9wIiwicmVwbGFjZSIsInNldCIsImFsaWFzIiwiYWxpYXNlcyIsImlucHV0cyIsImJhc2ljIiwic2l6ZXMiLCJwYXJzZSIsInJlbGF0aXZlIiwiYmFzZSIsIm5hbWUiLCJnZXQiLCJnYW1lcyIsIk9iamVjdCIsImVudHJpZXMiLCJhIiwicyIsInNvbHZlSW5wdXQiLCJoYXMiLCJpc1N0cmluZyIsImxlbmd0aCIsInMxIiwic2xpY2UiLCJyZW1haW5pbmciLCJFcnJvciIsInNlbmRJbnB1dCIsIm1lc3NhZ2UiLCJjYXB0aW9uIiwid2lkdGgiLCJtYXAiLCJpdCIsInJlZHVjZSIsImIiLCJpbWFnZXMiLCJsZWZ0IiwiaW5kZXgiLCJzaXplIiwidG9wIiwiTWF0aCIsImZsb29yIiwiY2FudmFzIiwiY3JlYXRlIiwiaGVpZ2h0IiwiY2hhbm5lbHMiLCJiYWNrZ3JvdW5kIiwicG5nIiwiY29tcG9zaXRlIiwidG9CdWZmZXIiLCJyZXNpemUiLCJyZXBseSIsImNvbnRlbnQiLCJmaWxlcyIsImNoZWNrR2FtZSIsImdhbWUiLCJ4IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiYWJvdXQiLCJ2YWx1ZSIsImludGVudHMiLCJwYXJ0aWFscyIsInByZWxvYWQiLCJzZXF1ZWxpemUiLCJkZWZpbmUiLCJndWlsZCIsInR5cGUiLCJEYXRhVHlwZXMiLCJTVFJJTkciLCJwcmltYXJ5S2V5IiwiY3JlYXRlZEJ5IiwiZXZlbnRzIiwibWVzc2FnZUNyZWF0ZSIsImdsb2JhbCIsImNsaWVudCIsImNvbmZpZyIsImF1dGhvciIsImlkIiwidXNlciIsIm1lbWJlciIsImd1aWxkSWQiLCJwcmVmaXgiLCJzdGFydHNXaXRoIiwiYnVpbHRpbiIsIm1vZGVscyIsImZnaW5wdXQiLCJmaW5kT25lIiwid2hlcmUiLCJyb3ciLCJjb21tYW5kcyIsImZnaSIsInVzYWdlIiwiZGVzYyIsImV4YW1wbGUiLCJleGVjdXRlIiwicGFyYW0iLCJnYW1lSW5wdXQiLCJpMSIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJmbGF0IiwiZXJyIiwiZmdzYXZlIiwiY2hhbm5lbCIsInNlbmQiLCJmZ2NhcHRpb24iLCJzYXZlIiwiZmdnbG9zc2FyeSIsInBhcmFtcyIsInNlYXJjaCIsImZpbHRlciIsImluY2x1ZGVzIiwidXJsIiwiZGVmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBLElBQU1BLE9BQU8sR0FBRyxzQkFBSyxNQUFMLENBQWhCOztBQUNBLElBQU1DLE9BQU8sR0FBR0MsaUJBQUtDLElBQUwsQ0FBVUMsU0FBVixFQUFxQixLQUFyQixDQUFoQjs7QUFDQSxJQUFNQyxXQUFXLEdBQUcsSUFBSUMsR0FBSixFQUFwQjtBQUNBLElBQU1DLFVBQVUsR0FBRyxJQUFJRCxHQUFKLEVBQW5CO0FBRUEsSUFBSUUsUUFBUSxHQUFHLEVBQWY7QUFDQSxJQUFJQyxLQUFLLEdBQUcsRUFBWjtBQUVBQyxXQUFXO0FBQ1hDLFdBQVcsQ0FBQ0QsV0FBRCxFQUFjLElBQUksRUFBSixHQUFTLElBQXZCLENBQVg7O1NBRWVBLFc7Ozs7OytGQUFmO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQ3VCVixPQUFPLENBQUMsK0NBQUQsQ0FEOUI7O0FBQUE7QUFDUVksWUFBQUEsTUFEUjtBQUVRQyxZQUFBQSxLQUZSLEdBRWdCLEVBRmhCO0FBR1FD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QUFGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBSkc7QUFoRUo7QUFsREcsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaGFycCBmcm9tICdzaGFycCdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGdsb2IgZnJvbSAnZ2xvYidcclxuaW1wb3J0IHsgRGF0YVR5cGVzIH0gZnJvbSAnc2VxdWVsaXplJ1xyXG5pbXBvcnQgYmVudCBmcm9tICdiZW50J1xyXG5cclxuaW1wb3J0IHsgc2l6ZXMsIGFsaWFzZXMsIGJ1aWx0aW4gfSBmcm9tICcuL2luZm8uanNvbidcclxuXHJcbmNvbnN0IGdldEpTT04gPSBiZW50KCdqc29uJylcclxuY29uc3QgaW1nUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdpbWcnKVxyXG5jb25zdCBiYXNpY0lucHV0cyA9IG5ldyBNYXAoKVxyXG5jb25zdCBnYW1lSW5wdXRzID0gbmV3IE1hcCgpXHJcblxyXG5sZXQgZ2xvc3NhcnkgPSB7fVxyXG5sZXQgdGVybXMgPSBbXVxyXG5cclxuZ2V0R2xvc3NhcnkoKVxyXG5zZXRJbnRlcnZhbChnZXRHbG9zc2FyeSwgNSAqIDYwICogMTAwMClcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldEdsb3NzYXJ5ICgpIHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRKU09OKCdodHRwczovL2dsb3NzYXJ5LmluZmlsLm5ldC9qc29uL2dsb3NzYXJ5Lmpzb24nKVxyXG4gIGNvbnN0IHRlbXBHID0ge31cclxuICBjb25zdCB0ZW1wVCA9IFtdXHJcblxyXG4gIHJlc3VsdC5mb3JFYWNoKGkgPT4ge1xyXG4gICAgY29uc3QgdGVybSA9IGkudGVybS50b0xvd2VyQ2FzZSgpXHJcbiAgICB0ZW1wR1t0ZXJtXSA9IGlcclxuICAgIHRlbXBULnB1c2godGVybSlcclxuICB9KVxyXG5cclxuICBnbG9zc2FyeSA9IHRlbXBHXHJcbiAgdGVybXMgPSB0ZW1wVFxyXG59XHJcblxyXG5nbG9iLnN5bmMocGF0aC5qb2luKGltZ1BhdGgsICdiYXNpYy8qKicpLCB7IG5vZGlyOiB0cnVlIH0pXHJcbiAgLmZvckVhY2gocCA9PiB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHAuc3BsaXQoJy8nKS5wb3AoKS5yZXBsYWNlKCcucG5nJywgJycpXHJcbiAgICBiYXNpY0lucHV0cy5zZXQoaW5wdXQsIHApXHJcblxyXG4gICAgY29uc3QgYWxpYXMgPSBhbGlhc2VzLmlucHV0cy5iYXNpY1tpbnB1dF1cclxuICAgIGlmIChhbGlhcykge1xyXG4gICAgICBhbGlhcy5mb3JFYWNoKGkgPT4ge1xyXG4gICAgICAgIGJhc2ljSW5wdXRzLnNldChpLCBwKVxyXG4gICAgICAgIGlmIChzaXplc1tpbnB1dF0pIHNpemVzW2ldID0gc2l6ZXNbaW5wdXRdXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbmdsb2Iuc3luYyhwYXRoLmpvaW4oaW1nUGF0aCwgJ2dhbWVzLyonKSlcclxuICAuZm9yRWFjaChwID0+IHtcclxuICAgIGNvbnN0IHsgYmFzZSB9ID0gcGF0aC5wYXJzZShwYXRoLnJlbGF0aXZlKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMnKSwgcCkpXHJcbiAgICBnYW1lSW5wdXRzLnNldChiYXNlLCBuZXcgTWFwKCkpXHJcblxyXG4gICAgZ2xvYi5zeW5jKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMnLCBiYXNlLCAnKionKSwgeyBub2RpcjogdHJ1ZSB9KVxyXG4gICAgICAuZm9yRWFjaChpbnB1dCA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBwYXRoLnBhcnNlKGlucHV0KVxyXG4gICAgICAgIGdhbWVJbnB1dHMuZ2V0KGJhc2UpLnNldChuYW1lLCBpbnB1dClcclxuICAgICAgfSlcclxuXHJcbiAgICBjb25zdCBhbGlhcyA9IGFsaWFzZXMuaW5wdXRzLmdhbWVzW2Jhc2VdXHJcblxyXG4gICAgaWYgKGFsaWFzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgW2EsIHNdIG9mIE9iamVjdC5lbnRyaWVzKGFsaWFzKSkge1xyXG4gICAgICAgIGdhbWVJbnB1dHMuZ2V0KGJhc2UpLnNldChhLCBzKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbmZ1bmN0aW9uIHNvbHZlSW5wdXQgKGlucHV0cywgaW5wdXQpIHtcclxuICBpZiAoaW5wdXRzLmhhcyhpbnB1dCkpIHJldHVybiBpc1N0cmluZyhpbnB1dHMuZ2V0KGlucHV0KSkgPyBbaW5wdXRdIDogaW5wdXRzLmdldChpbnB1dClcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgczEgPSBpbnB1dC5zbGljZSgwLCAwIC0gaSlcclxuXHJcbiAgICBpZiAoaW5wdXRzLmhhcyhzMSkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gaW5wdXRzLmdldChzMSlcclxuICAgICAgY29uc3QgcmVtYWluaW5nID0gc29sdmVJbnB1dChpbnB1dHMsIGlucHV0LnNsaWNlKDAgLSBpKSlcclxuXHJcbiAgICAgIHJldHVybiBpc1N0cmluZyhyZXN1bHQpID8gW3MxLCAuLi5yZW1haW5pbmddIDogWy4uLnJlc3VsdCwgLi4ucmVtYWluaW5nXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBcIiR7aW5wdXR9XCIgYXMgYSByZWNvZ25pemFibGUgaW5wdXRgKVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBzZW5kSW5wdXQgKGlucHV0cywgcmVzdWx0LCBtZXNzYWdlLCBjYXB0aW9uKSB7XHJcbiAgY29uc3Qgd2lkdGggPSByZXN1bHQubWFwKGl0ID0+IHNpemVzW2l0XSB8fCAxNTIpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApXHJcbiAgY29uc3QgaW1hZ2VzID0gW11cclxuICBsZXQgbGVmdCA9IDBcclxuXHJcbiAgcmVzdWx0LmZvckVhY2goKGl0LCBpbmRleCkgPT4ge1xyXG4gICAgY29uc3Qgc2l6ZSA9IHNpemVzW2l0XSB8fCAxNTJcclxuICAgIGltYWdlcy5wdXNoKHsgaW5wdXQ6IGlucHV0cy5nZXQoaXQpLCBsZWZ0LCB0b3A6IE1hdGguZmxvb3IoKDE1MiAtIHNpemUpIC8gMikgfSlcclxuICAgIGxlZnQgKz0gc2l6ZVxyXG4gIH0pXHJcblxyXG4gIGxldCBjYW52YXMgPSBzaGFycCh7IGNyZWF0ZTogeyB3aWR0aCwgaGVpZ2h0OiAxNTIsIGNoYW5uZWxzOiA0LCBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnIH0gfSlcclxuICAgIC5wbmcoKVxyXG4gICAgLmNvbXBvc2l0ZShpbWFnZXMpXHJcblxyXG4gIGNhbnZhcyA9IGF3YWl0IGNhbnZhcy50b0J1ZmZlcigpXHJcblxyXG4gIGlmIChyZXN1bHQubGVuZ3RoIDwgMTIpIGNhbnZhcyA9IGF3YWl0IHNoYXJwKGNhbnZhcykucmVzaXplKHsgaGVpZ2h0OiA1NSB9KS5wbmcoKS50b0J1ZmZlcigpXHJcblxyXG4gIHJldHVybiBtZXNzYWdlLnJlcGx5KHsgY29udGVudDogY2FwdGlvbiwgZmlsZXM6IFtjYW52YXNdIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrR2FtZSAoZ2FtZSkge1xyXG4gIHJldHVybiBnYW1lSW5wdXRzLmhhcyhnYW1lKSA/IGdhbWUgOiBhbGlhc2VzLmdhbWVzW2dhbWVdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3RyaW5nICh4KSB7XHJcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIG5hbWU6ICdmZy1ub3RhdGlvbicsXHJcbiAgYWJvdXQ6IHtcclxuICAgIG5hbWU6ICdGRyBOb3RhdGlvbicsXHJcbiAgICB2YWx1ZTogJ1tJbnN0cnVjdGlvbnMgYW5kIHNvdXJjZSBjb2RlXShodHRwczovL2xvdHVzLmNoaXRvd2FybG9jay5jb20vZmdub3RhdGlvbilcXG5bSW5maWxcXCdzIEZpZ2h0aW5nIEdhbWUgR2xvc3NhcnldKGh0dHBzOi8vZ2xvc3NhcnkuaW5maWwubmV0KVxcbltNYWdpY2lhblN0dWZmXFwncyBGaWdodGhpbmcgR2FtZSBub3RhdGlvbnMgZW1vdGVzXShodHRwczovL3R3aXR0ZXIuY29tL01hZ2ljaWFuU3R1ZmYvc3RhdHVzLzE0Nzc5MzEwNTQ0ODQ4OTM2OTcpJ1xyXG4gIH0sXHJcbiAgaW50ZW50czogWydHVUlMRF9NRVNTQUdFUyddLFxyXG4gIHBhcnRpYWxzOiBbJ01FU1NBR0UnXSxcclxuXHJcbiAgcHJlbG9hZDogc2VxdWVsaXplID0+IHtcclxuICAgIHNlcXVlbGl6ZS5kZWZpbmUoJ2ZnaW5wdXQnLCB7XHJcbiAgICAgIGd1aWxkOiB7XHJcbiAgICAgICAgdHlwZTogRGF0YVR5cGVzLlNUUklORyxcclxuICAgICAgICBwcmltYXJ5S2V5OiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG5hbWU6IHtcclxuICAgICAgICB0eXBlOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICAgIHByaW1hcnlLZXk6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY3JlYXRlZEJ5OiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBnYW1lOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBjYXB0aW9uOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBpbnB1dDogRGF0YVR5cGVzLlNUUklOR1xyXG4gICAgfSlcclxuICB9LFxyXG5cclxuICBldmVudHM6IHtcclxuICAgIGFzeW5jIG1lc3NhZ2VDcmVhdGUgKGdsb2JhbCwgbWVzc2FnZSkge1xyXG4gICAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnLCBzZXF1ZWxpemUgfSA9IGdsb2JhbFxyXG4gICAgICBpZiAobWVzc2FnZS5hdXRob3IuaWQgPT09IGNsaWVudC51c2VyLmlkIHx8ICFtZXNzYWdlLm1lbWJlcikgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBndWlsZElkID0gbWVzc2FnZS5ndWlsZElkXHJcbiAgICAgIGNvbnN0IHsgcHJlZml4IH0gPSBjb25maWdbZ3VpbGRJZF1cclxuXHJcbiAgICAgIGlmIChtZXNzYWdlLmNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IG1lc3NhZ2UuY29udGVudC5zcGxpdCgnICcpLnBvcCgpLnJlcGxhY2UocHJlZml4LCAnJylcclxuICAgICAgICBjb25zdCByb3cgPSBidWlsdGluW25hbWVdIHx8IChcclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5maW5kT25lKHtcclxuICAgICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChyb3cuZ2FtZSldKVxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcm93LmlucHV0LnNwbGl0KCcgJyksIG1lc3NhZ2UsIHJvdy5jYXB0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIGNvbW1hbmRzOiB7XHJcbiAgICBmZ2k6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2kgW2dhbWVdIFtpbnB1dHNdJyxcclxuICAgICAgZGVzYzogJ0NvbnZlcnRzIGEgbGlzdCBvZiBpbnB1dHMgaW50byBhbiBpbWFnZScsXHJcbiAgICAgIGV4YW1wbGU6ICdmZ2kgc2YgMjM2UCAyMTRLJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0gfSwgeyBtZXNzYWdlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBbLCBnYW1lSW5wdXQsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXQgfHwgIWkxKSByZXR1cm4gbWVzc2FnZS5yZXBseSgnTWlzc2luZyBhcmd1bWVudHMuIEV4YW1wbGU6ID5mZ2kgc2YgMjM2UCAyMTRLJylcclxuXHJcbiAgICAgICAgY29uc3QgZ2FtZSA9IGNoZWNrR2FtZShnYW1lSW5wdXQpXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXRzLmhhcyhnYW1lKSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFwiJHtnYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGdhbWUuIEF2YWlsYWJsZSBnYW1lczogJHtBcnJheS5mcm9tKGdhbWVJbnB1dHMua2V5cygpKS5qb2luKCcgJyl9YClcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChnYW1lKV0pXHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJhbS5zbGljZSgyKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpXHJcblxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcmVzdWx0LCBtZXNzYWdlKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgbWVzc2FnZS5yZXBseShlcnIubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ3NhdmU6IHtcclxuICAgICAgdXNhZ2U6ICdmZ3NhdmUgW2dhbWVdIFtuYW1lXSBbaW5wdXRzXScsXHJcbiAgICAgIGRlc2M6ICdTYXZlcyBhIGxpc3Qgb2YgaW5wdXRzIGludG8gYSBjb21tYW5kJyxcclxuICAgICAgZXhhbXBsZTogJ2ZnaSBzZiB0ZXN0TmFtZSAyMzZQIDIxNEsnLFxyXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXJhbSwgc2VxdWVsaXplIH0sIHsgbWVzc2FnZSB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgWywgZ2FtZUlucHV0LCBuYW1lLCBpMV0gPSBwYXJhbVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0IHx8ICFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHNmIHRlc3ROYW1lIDIzNlAgMjE0SycpXHJcblxyXG4gICAgICAgIGNvbnN0IGdhbWUgPSBjaGVja0dhbWUoZ2FtZUlucHV0KVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0cy5oYXMoZ2FtZSkpIHJldHVybiBtZXNzYWdlLnJlcGx5KGBcIiR7Z2FtZX1cIiBpcyBub3QgYSB2YWxpZCBnYW1lLiBBdmFpbGFibGUgZ2FtZXM6ICR7QXJyYXkuZnJvbShnYW1lSW5wdXRzLmtleXMoKSkuam9pbignICcpfWApXHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBpbnB1dHMgPSBuZXcgTWFwKFsuLi5iYXNpY0lucHV0cywgLi4uZ2FtZUlucHV0cy5nZXQoZ2FtZSldKVxyXG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBwYXJhbS5zbGljZSgzKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpLmpvaW4oJyAnKVxyXG5cclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5jcmVhdGUoeyBndWlsZDogbWVzc2FnZS5ndWlsZC5pZCwgbmFtZSwgY3JlYXRlZEJ5OiBtZXNzYWdlLmF1dGhvci5pZCwgZ2FtZSwgaW5wdXQgfSlcclxuXHJcbiAgICAgICAgICBtZXNzYWdlLmNoYW5uZWwuc2VuZChgU2F2ZWQgY29tbWFuZCBcIiR7aW5wdXR9XCIgYXMgXCIke25hbWV9XCJgKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgbWVzc2FnZS5yZXBseShlcnIubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ2NhcHRpb246IHtcclxuICAgICAgdXNhZ2U6ICdmZ2NhcHRpb24gW25hbWVdIFtjYXB0aW9uXScsXHJcbiAgICAgIGRlc2M6ICdBZGRzIGEgY2FwdGlvbiB0byBhIHNhdmVkIGlucHV0IGNvbW1hbmQnLFxyXG4gICAgICBleGFtcGxlOiAnZmdjYXB0aW9uIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IFssIG5hbWUsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJylcclxuXHJcbiAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgc2VxdWVsaXplLm1vZGVscy5mZ2lucHV0LmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGlmICghcm93KSByZXR1cm4gbWVzc2FnZS5yZXBseShgXCIke25hbWV9XCIgaXMgbm90IGEgc2F2ZWQgaW5wdXQgbGlzdGApXHJcbiAgICAgICAgcm93LmNhcHRpb24gPSBwYXJhbS5zbGljZSgyKS5qb2luKCcgJylcclxuICAgICAgICBhd2FpdCByb3cuc2F2ZSgpXHJcblxyXG4gICAgICAgIG1lc3NhZ2UuY2hhbm5lbC5zZW5kKGBTYXZlZCBjYXB0aW9uIGZvciBpbnB1dCBsaXN0IFwiJHtuYW1lfVwiYClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZnZ2xvc3Nhcnk6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2dsb3NzYXJ5IFtzZWFyY2ggdGVybV0nLFxyXG4gICAgICBkZXNjOiAnU2VhcmNoZXMgZm9yIGEgdGVybSBvbiBJbmZpbFxcJ3MgR2xvc3NhcnknLFxyXG4gICAgICBleGFtcGxlOiAnZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtLnNsaWNlKDEpXHJcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIHNlYXJjaCB0ZXJtLiBFeGFtcGxlOiA+ZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JylcclxuXHJcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gcGFyYW1zLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVybXMuZmlsdGVyKGkgPT4gaS5pbmNsdWRlcyhzZWFyY2gpKVxyXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dsb3NzYXJ5LmluZmlsLm5ldC8/dD0ke3BhcmFtcy5qb2luKCclMjAnKS50b0xvd2VyQ2FzZSgpfWBcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KGBUZXJtIFwiJHtzZWFyY2h9XCIgbm90IGZvdW5kYClcclxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFxcYFxcYFxcYCR7Z2xvc3NhcnlbcmVzdWx0WzBdXS5kZWZ9XFxgXFxgXFxgU291cmNlOiA8JHt1cmx9PmApXHJcblxyXG4gICAgICAgIG1lc3NhZ2UucmVwbHkoYE11bHRpcGxlIHRlcm1zIGZvdW5kOiAke3VybH1gKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
package/dev/info.json
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
{
|
2
|
+
"sizes": { "+": 55 },
|
3
|
+
|
4
|
+
"builtin": {
|
5
|
+
"37": {
|
6
|
+
"game": "sf",
|
7
|
+
"caption": "***LETS GO JUSTIN!***",
|
8
|
+
"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"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
|
12
|
+
"aliases": {
|
13
|
+
"games": {
|
14
|
+
"bbt": "bbtag",
|
15
|
+
"db": "dbz"
|
16
|
+
},
|
17
|
+
|
18
|
+
"inputs": {
|
19
|
+
"basic": {
|
20
|
+
"doubleforward": [">>"]
|
21
|
+
},
|
22
|
+
|
23
|
+
"games": {
|
24
|
+
"bbtag": {
|
25
|
+
"throw": ["b","+","c"],
|
26
|
+
"crb": ["d","+","p"],
|
27
|
+
"airdash": ["a","+","b"],
|
28
|
+
"reversal": ["a","+","d"]
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
package/lib/index.js
CHANGED
@@ -9,10 +9,10 @@ exports["default"] = void 0;
|
|
9
9
|
|
10
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
11
11
|
|
12
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
13
|
-
|
14
12
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
15
13
|
|
14
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
15
|
+
|
16
16
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
17
17
|
|
18
18
|
var _sharp = _interopRequireDefault(require("sharp"));
|
@@ -25,6 +25,8 @@ var _sequelize = require("sequelize");
|
|
25
25
|
|
26
26
|
var _bent = _interopRequireDefault(require("bent"));
|
27
27
|
|
28
|
+
var _info = require("./info.json");
|
29
|
+
|
28
30
|
var getJSON = (0, _bent["default"])('json');
|
29
31
|
|
30
32
|
var imgPath = _path["default"].join(__dirname, 'img');
|
@@ -77,27 +79,55 @@ _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
|
|
77
79
|
}).forEach(function (p) {
|
78
80
|
var input = p.split('/').pop().replace('.png', '');
|
79
81
|
basicInputs.set(input, p);
|
80
|
-
|
82
|
+
var alias = _info.aliases.inputs.basic[input];
|
81
83
|
|
82
|
-
|
84
|
+
if (alias) {
|
85
|
+
alias.forEach(function (i) {
|
86
|
+
basicInputs.set(i, p);
|
87
|
+
if (_info.sizes[input]) _info.sizes[i] = _info.sizes[input];
|
88
|
+
});
|
89
|
+
}
|
90
|
+
});
|
83
91
|
|
84
|
-
_glob["default"].sync(_path["default"].join(imgPath, 'games
|
85
|
-
nodir: true
|
86
|
-
}).forEach(function (p) {
|
92
|
+
_glob["default"].sync(_path["default"].join(imgPath, 'games/*')).forEach(function (p) {
|
87
93
|
var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
|
88
|
-
|
89
|
-
|
94
|
+
base = _path$parse.base;
|
95
|
+
|
96
|
+
gameInputs.set(base, new Map());
|
90
97
|
|
91
|
-
|
92
|
-
|
98
|
+
_glob["default"].sync(_path["default"].join(imgPath, 'games', base, '**'), {
|
99
|
+
nodir: true
|
100
|
+
}).forEach(function (input) {
|
101
|
+
var _path$parse2 = _path["default"].parse(input),
|
102
|
+
name = _path$parse2.name;
|
103
|
+
|
104
|
+
gameInputs.get(base).set(name, input);
|
105
|
+
});
|
106
|
+
|
107
|
+
var alias = _info.aliases.inputs.games[base];
|
108
|
+
|
109
|
+
if (alias) {
|
110
|
+
for (var _i = 0, _Object$entries = Object.entries(alias); _i < _Object$entries.length; _i++) {
|
111
|
+
var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
|
112
|
+
a = _Object$entries$_i[0],
|
113
|
+
s = _Object$entries$_i[1];
|
114
|
+
|
115
|
+
gameInputs.get(base).set(a, s);
|
116
|
+
}
|
117
|
+
}
|
93
118
|
});
|
94
119
|
|
95
120
|
function solveInput(inputs, input) {
|
96
|
-
if (inputs.has(input)) return [input];
|
121
|
+
if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input);
|
97
122
|
|
98
123
|
for (var i = 0; i < input.length; i++) {
|
99
124
|
var s1 = input.slice(0, 0 - i);
|
100
|
-
|
125
|
+
|
126
|
+
if (inputs.has(s1)) {
|
127
|
+
var result = inputs.get(s1);
|
128
|
+
var remaining = solveInput(inputs, input.slice(0 - i));
|
129
|
+
return isString(result) ? [s1].concat((0, _toConsumableArray2["default"])(remaining)) : [].concat((0, _toConsumableArray2["default"])(result), (0, _toConsumableArray2["default"])(remaining));
|
130
|
+
}
|
101
131
|
}
|
102
132
|
|
103
133
|
throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
|
@@ -109,37 +139,61 @@ function sendInput(_x, _x2, _x3, _x4) {
|
|
109
139
|
|
110
140
|
function _sendInput() {
|
111
141
|
_sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
|
112
|
-
var canvas;
|
142
|
+
var width, images, left, canvas;
|
113
143
|
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
114
144
|
while (1) {
|
115
145
|
switch (_context7.prev = _context7.next) {
|
116
146
|
case 0:
|
117
|
-
|
118
|
-
|
147
|
+
width = result.map(function (it) {
|
148
|
+
return _info.sizes[it] || 152;
|
149
|
+
}).reduce(function (a, b) {
|
150
|
+
return a + b;
|
151
|
+
}, 0);
|
152
|
+
images = [];
|
153
|
+
left = 0;
|
154
|
+
result.forEach(function (it, index) {
|
155
|
+
var size = _info.sizes[it] || 152;
|
156
|
+
images.push({
|
157
|
+
input: inputs.get(it),
|
158
|
+
left: left,
|
159
|
+
top: Math.floor((152 - size) / 2)
|
160
|
+
});
|
161
|
+
left += size;
|
162
|
+
});
|
163
|
+
canvas = (0, _sharp["default"])({
|
119
164
|
create: {
|
120
|
-
width:
|
165
|
+
width: width,
|
121
166
|
height: 152,
|
122
167
|
channels: 4,
|
123
168
|
background: 'transparent'
|
124
169
|
}
|
125
|
-
}).
|
126
|
-
|
127
|
-
|
128
|
-
left: index * 152,
|
129
|
-
top: 0,
|
130
|
-
width: 152,
|
131
|
-
height: 152
|
132
|
-
};
|
133
|
-
})).png().toBuffer();
|
170
|
+
}).png().composite(images);
|
171
|
+
_context7.next = 7;
|
172
|
+
return canvas.toBuffer();
|
134
173
|
|
135
|
-
case
|
174
|
+
case 7:
|
136
175
|
canvas = _context7.sent;
|
176
|
+
|
177
|
+
if (!(result.length < 12)) {
|
178
|
+
_context7.next = 12;
|
179
|
+
break;
|
180
|
+
}
|
181
|
+
|
182
|
+
_context7.next = 11;
|
183
|
+
return (0, _sharp["default"])(canvas).resize({
|
184
|
+
height: 55
|
185
|
+
}).png().toBuffer();
|
186
|
+
|
187
|
+
case 11:
|
188
|
+
canvas = _context7.sent;
|
189
|
+
|
190
|
+
case 12:
|
137
191
|
return _context7.abrupt("return", message.reply({
|
138
192
|
content: caption,
|
139
193
|
files: [canvas]
|
140
194
|
}));
|
141
195
|
|
142
|
-
case
|
196
|
+
case 13:
|
143
197
|
case "end":
|
144
198
|
return _context7.stop();
|
145
199
|
}
|
@@ -149,13 +203,14 @@ function _sendInput() {
|
|
149
203
|
return _sendInput.apply(this, arguments);
|
150
204
|
}
|
151
205
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
}
|
206
|
+
function checkGame(game) {
|
207
|
+
return gameInputs.has(game) ? game : _info.aliases.games[game];
|
208
|
+
}
|
209
|
+
|
210
|
+
function isString(x) {
|
211
|
+
return Object.prototype.toString.call(x) === '[object String]';
|
212
|
+
}
|
213
|
+
|
159
214
|
var _default = {
|
160
215
|
name: 'fg-notation',
|
161
216
|
about: {
|
@@ -207,7 +262,7 @@ var _default = {
|
|
207
262
|
}
|
208
263
|
|
209
264
|
name = message.content.split(' ').pop().replace(prefix, '');
|
210
|
-
_context.t0 = builtin[name];
|
265
|
+
_context.t0 = _info.builtin[name];
|
211
266
|
|
212
267
|
if (_context.t0) {
|
213
268
|
_context.next = 12;
|
@@ -249,7 +304,7 @@ var _default = {
|
|
249
304
|
example: 'fgi sf 236P 214K',
|
250
305
|
execute: function () {
|
251
306
|
var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
|
252
|
-
var param, message, _param,
|
307
|
+
var param, message, _param, gameInput, i1, game, inputs, result;
|
253
308
|
|
254
309
|
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
255
310
|
while (1) {
|
@@ -257,9 +312,9 @@ var _default = {
|
|
257
312
|
case 0:
|
258
313
|
param = _ref.param;
|
259
314
|
message = _ref2.message;
|
260
|
-
_param = (0, _slicedToArray2["default"])(param, 3),
|
315
|
+
_param = (0, _slicedToArray2["default"])(param, 3), gameInput = _param[1], i1 = _param[2];
|
261
316
|
|
262
|
-
if (!(!
|
317
|
+
if (!(!gameInput || !i1)) {
|
263
318
|
_context2.next = 5;
|
264
319
|
break;
|
265
320
|
}
|
@@ -267,21 +322,27 @@ var _default = {
|
|
267
322
|
return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
|
268
323
|
|
269
324
|
case 5:
|
325
|
+
game = checkGame(gameInput);
|
326
|
+
|
270
327
|
if (gameInputs.has(game)) {
|
271
|
-
_context2.next =
|
328
|
+
_context2.next = 8;
|
272
329
|
break;
|
273
330
|
}
|
274
331
|
|
275
332
|
return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
|
276
333
|
|
277
|
-
case
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
334
|
+
case 8:
|
335
|
+
try {
|
336
|
+
inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
|
337
|
+
result = param.slice(2).map(function (i) {
|
338
|
+
return solveInput(inputs, i.toLowerCase());
|
339
|
+
}).flat();
|
340
|
+
sendInput(inputs, result, message);
|
341
|
+
} catch (err) {
|
342
|
+
message.reply(err.message);
|
343
|
+
}
|
283
344
|
|
284
|
-
case
|
345
|
+
case 9:
|
285
346
|
case "end":
|
286
347
|
return _context2.stop();
|
287
348
|
}
|
@@ -302,7 +363,7 @@ var _default = {
|
|
302
363
|
example: 'fgi sf testName 236P 214K',
|
303
364
|
execute: function () {
|
304
365
|
var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
|
305
|
-
var param, sequelize, message, _param2,
|
366
|
+
var param, sequelize, message, _param2, gameInput, name, i1, game, inputs, input;
|
306
367
|
|
307
368
|
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
308
369
|
while (1) {
|
@@ -310,9 +371,9 @@ var _default = {
|
|
310
371
|
case 0:
|
311
372
|
param = _ref3.param, sequelize = _ref3.sequelize;
|
312
373
|
message = _ref4.message;
|
313
|
-
_param2 = (0, _slicedToArray2["default"])(param, 4),
|
374
|
+
_param2 = (0, _slicedToArray2["default"])(param, 4), gameInput = _param2[1], name = _param2[2], i1 = _param2[3];
|
314
375
|
|
315
|
-
if (!(!
|
376
|
+
if (!(!gameInput || !name || !i1)) {
|
316
377
|
_context3.next = 5;
|
317
378
|
break;
|
318
379
|
}
|
@@ -320,19 +381,22 @@ var _default = {
|
|
320
381
|
return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
|
321
382
|
|
322
383
|
case 5:
|
384
|
+
game = checkGame(gameInput);
|
385
|
+
|
323
386
|
if (gameInputs.has(game)) {
|
324
|
-
_context3.next =
|
387
|
+
_context3.next = 8;
|
325
388
|
break;
|
326
389
|
}
|
327
390
|
|
328
391
|
return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
|
329
392
|
|
330
|
-
case
|
393
|
+
case 8:
|
394
|
+
_context3.prev = 8;
|
331
395
|
inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
|
332
396
|
input = param.slice(3).map(function (i) {
|
333
397
|
return solveInput(inputs, i.toLowerCase());
|
334
398
|
}).flat().join(' ');
|
335
|
-
_context3.next =
|
399
|
+
_context3.next = 13;
|
336
400
|
return sequelize.models.fginput.create({
|
337
401
|
guild: message.guild.id,
|
338
402
|
name: name,
|
@@ -341,15 +405,22 @@ var _default = {
|
|
341
405
|
input: input
|
342
406
|
});
|
343
407
|
|
344
|
-
case
|
408
|
+
case 13:
|
345
409
|
message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
|
410
|
+
_context3.next = 19;
|
411
|
+
break;
|
346
412
|
|
347
|
-
case
|
413
|
+
case 16:
|
414
|
+
_context3.prev = 16;
|
415
|
+
_context3.t0 = _context3["catch"](8);
|
416
|
+
message.reply(_context3.t0.message);
|
417
|
+
|
418
|
+
case 19:
|
348
419
|
case "end":
|
349
420
|
return _context3.stop();
|
350
421
|
}
|
351
422
|
}
|
352
|
-
}, _callee3);
|
423
|
+
}, _callee3, null, [[8, 16]]);
|
353
424
|
}));
|
354
425
|
|
355
426
|
function execute(_x7, _x8) {
|
package/lib/info.json
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
{
|
2
|
+
"sizes": { "+": 55 },
|
3
|
+
|
4
|
+
"builtin": {
|
5
|
+
"37": {
|
6
|
+
"game": "sf",
|
7
|
+
"caption": "***LETS GO JUSTIN!***",
|
8
|
+
"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"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
|
12
|
+
"aliases": {
|
13
|
+
"games": {
|
14
|
+
"bbt": "bbtag",
|
15
|
+
"db": "dbz"
|
16
|
+
},
|
17
|
+
|
18
|
+
"inputs": {
|
19
|
+
"basic": {
|
20
|
+
"doubleforward": [">>"]
|
21
|
+
},
|
22
|
+
|
23
|
+
"games": {
|
24
|
+
"bbtag": {
|
25
|
+
"throw": ["b","+","c"],
|
26
|
+
"crb": ["d","+","p"],
|
27
|
+
"airdash": ["a","+","b"],
|
28
|
+
"reversal": ["a","+","d"]
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
package/package.json
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
{
|
2
2
|
"name": "@lotus-tree/fg-notation",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.2.0",
|
4
4
|
"main": "lib/index.js",
|
5
5
|
"module": "src/index.js",
|
6
6
|
"scripts": {
|
7
7
|
"run-babel": "babel --delete-dir-on-start --copy-files src",
|
8
8
|
"build": "yarn run run-babel --out-dir lib",
|
9
|
-
"dev": "yarn run run-babel --watch --out-dir dev",
|
9
|
+
"dev": "yarn run run-babel --watch --source-maps inline --out-dir dev",
|
10
10
|
"prepublishOnly": "yarn build"
|
11
11
|
},
|
12
12
|
"dependencies": {
|
13
|
-
"@lotus-tree/command-handler": "^2.1.0",
|
14
13
|
"bent": "^7.3.12",
|
15
14
|
"glob": "^7.2.0",
|
16
15
|
"sharp": "^0.29.3"
|
17
16
|
},
|
17
|
+
"peerDependencies": {
|
18
|
+
"@lotus-tree/command-handler": "^2.1.0"
|
19
|
+
},
|
18
20
|
"devDependencies": {
|
19
21
|
"@babel/cli": "^7.16.7",
|
20
22
|
"@babel/core": "^7.16.7",
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
package/src/index.js
CHANGED
@@ -4,6 +4,8 @@ import glob from 'glob'
|
|
4
4
|
import { DataTypes } from 'sequelize'
|
5
5
|
import bent from 'bent'
|
6
6
|
|
7
|
+
import { sizes, aliases, builtin } from './info.json'
|
8
|
+
|
7
9
|
const getJSON = bent('json')
|
8
10
|
const imgPath = path.join(__dirname, 'img')
|
9
11
|
const basicInputs = new Map()
|
@@ -34,46 +36,81 @@ glob.sync(path.join(imgPath, 'basic/**'), { nodir: true })
|
|
34
36
|
.forEach(p => {
|
35
37
|
const input = p.split('/').pop().replace('.png', '')
|
36
38
|
basicInputs.set(input, p)
|
37
|
-
})
|
38
39
|
|
39
|
-
|
40
|
+
const alias = aliases.inputs.basic[input]
|
41
|
+
if (alias) {
|
42
|
+
alias.forEach(i => {
|
43
|
+
basicInputs.set(i, p)
|
44
|
+
if (sizes[input]) sizes[i] = sizes[input]
|
45
|
+
})
|
46
|
+
}
|
47
|
+
})
|
40
48
|
|
41
|
-
glob.sync(path.join(imgPath, 'games
|
49
|
+
glob.sync(path.join(imgPath, 'games/*'))
|
42
50
|
.forEach(p => {
|
43
|
-
const {
|
51
|
+
const { base } = path.parse(path.relative(path.join(imgPath, 'games'), p))
|
52
|
+
gameInputs.set(base, new Map())
|
53
|
+
|
54
|
+
glob.sync(path.join(imgPath, 'games', base, '**'), { nodir: true })
|
55
|
+
.forEach(input => {
|
56
|
+
const { name } = path.parse(input)
|
57
|
+
gameInputs.get(base).set(name, input)
|
58
|
+
})
|
59
|
+
|
60
|
+
const alias = aliases.inputs.games[base]
|
44
61
|
|
45
|
-
if (
|
46
|
-
|
62
|
+
if (alias) {
|
63
|
+
for (const [a, s] of Object.entries(alias)) {
|
64
|
+
gameInputs.get(base).set(a, s)
|
65
|
+
}
|
66
|
+
}
|
47
67
|
})
|
48
68
|
|
49
69
|
function solveInput (inputs, input) {
|
50
|
-
if (inputs.has(input)) return [input]
|
70
|
+
if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input)
|
51
71
|
|
52
72
|
for (let i = 0; i < input.length; i++) {
|
53
73
|
const s1 = input.slice(0, 0 - i)
|
54
|
-
|
74
|
+
|
75
|
+
if (inputs.has(s1)) {
|
76
|
+
const result = inputs.get(s1)
|
77
|
+
const remaining = solveInput(inputs, input.slice(0 - i))
|
78
|
+
|
79
|
+
return isString(result) ? [s1, ...remaining] : [...result, ...remaining]
|
80
|
+
}
|
55
81
|
}
|
56
82
|
|
57
83
|
throw new Error(`Cannot find "${input}" as a recognizable input`)
|
58
84
|
}
|
59
85
|
|
60
86
|
async function sendInput (inputs, result, message, caption) {
|
61
|
-
const
|
62
|
-
|
63
|
-
|
64
|
-
|
87
|
+
const width = result.map(it => sizes[it] || 152).reduce((a, b) => a + b, 0)
|
88
|
+
const images = []
|
89
|
+
let left = 0
|
90
|
+
|
91
|
+
result.forEach((it, index) => {
|
92
|
+
const size = sizes[it] || 152
|
93
|
+
images.push({ input: inputs.get(it), left, top: Math.floor((152 - size) / 2) })
|
94
|
+
left += size
|
95
|
+
})
|
96
|
+
|
97
|
+
let canvas = sharp({ create: { width, height: 152, channels: 4, background: 'transparent' } })
|
65
98
|
.png()
|
66
|
-
.
|
99
|
+
.composite(images)
|
100
|
+
|
101
|
+
canvas = await canvas.toBuffer()
|
102
|
+
|
103
|
+
if (result.length < 12) canvas = await sharp(canvas).resize({ height: 55 }).png().toBuffer()
|
67
104
|
|
68
105
|
return message.reply({ content: caption, files: [canvas] })
|
69
106
|
}
|
70
107
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
108
|
+
function checkGame (game) {
|
109
|
+
return gameInputs.has(game) ? game : aliases.games[game]
|
110
|
+
}
|
111
|
+
|
112
|
+
function isString (x) {
|
113
|
+
return Object.prototype.toString.call(x) === '[object String]'
|
77
114
|
}
|
78
115
|
|
79
116
|
export default {
|
@@ -132,14 +169,20 @@ export default {
|
|
132
169
|
desc: 'Converts a list of inputs into an image',
|
133
170
|
example: 'fgi sf 236P 214K',
|
134
171
|
execute: async ({ param }, { message }) => {
|
135
|
-
const [,
|
136
|
-
if (!
|
172
|
+
const [, gameInput, i1] = param
|
173
|
+
if (!gameInput || !i1) return message.reply('Missing arguments. Example: >fgi sf 236P 214K')
|
174
|
+
|
175
|
+
const game = checkGame(gameInput)
|
137
176
|
if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
|
138
177
|
|
139
|
-
|
140
|
-
|
178
|
+
try {
|
179
|
+
const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
|
180
|
+
const result = param.slice(2).map(i => solveInput(inputs, i.toLowerCase())).flat()
|
141
181
|
|
142
|
-
|
182
|
+
sendInput(inputs, result, message)
|
183
|
+
} catch (err) {
|
184
|
+
message.reply(err.message)
|
185
|
+
}
|
143
186
|
}
|
144
187
|
},
|
145
188
|
fgsave: {
|
@@ -147,16 +190,22 @@ export default {
|
|
147
190
|
desc: 'Saves a list of inputs into a command',
|
148
191
|
example: 'fgi sf testName 236P 214K',
|
149
192
|
execute: async ({ param, sequelize }, { message }) => {
|
150
|
-
const [,
|
151
|
-
if (!
|
193
|
+
const [, gameInput, name, i1] = param
|
194
|
+
if (!gameInput || !name || !i1) return message.reply('Missing arguments. Example: >fgi sf testName 236P 214K')
|
195
|
+
|
196
|
+
const game = checkGame(gameInput)
|
152
197
|
if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
|
153
198
|
|
154
|
-
|
155
|
-
|
199
|
+
try {
|
200
|
+
const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
|
201
|
+
const input = param.slice(3).map(i => solveInput(inputs, i.toLowerCase())).flat().join(' ')
|
156
202
|
|
157
|
-
|
203
|
+
await sequelize.models.fginput.create({ guild: message.guild.id, name, createdBy: message.author.id, game, input })
|
158
204
|
|
159
|
-
|
205
|
+
message.channel.send(`Saved command "${input}" as "${name}"`)
|
206
|
+
} catch (err) {
|
207
|
+
message.reply(err.message)
|
208
|
+
}
|
160
209
|
}
|
161
210
|
},
|
162
211
|
fgcaption: {
|
package/src/info.json
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
{
|
2
|
+
"sizes": { "+": 55 },
|
3
|
+
|
4
|
+
"builtin": {
|
5
|
+
"37": {
|
6
|
+
"game": "sf",
|
7
|
+
"caption": "***LETS GO JUSTIN!***",
|
8
|
+
"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"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
|
12
|
+
"aliases": {
|
13
|
+
"games": {
|
14
|
+
"bbt": "bbtag",
|
15
|
+
"db": "dbz"
|
16
|
+
},
|
17
|
+
|
18
|
+
"inputs": {
|
19
|
+
"basic": {
|
20
|
+
"doubleforward": [">>"]
|
21
|
+
},
|
22
|
+
|
23
|
+
"games": {
|
24
|
+
"bbtag": {
|
25
|
+
"throw": ["b","+","c"],
|
26
|
+
"crb": ["d","+","p"],
|
27
|
+
"airdash": ["a","+","b"],
|
28
|
+
"reversal": ["a","+","d"]
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|