@lotus-tree/fg-notation 1.1.4 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
}
|