@lotus-tree/fg-notation 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. package/README.md +29 -19
  2. package/dev/img/basic/+.png +0 -0
  3. package/dev/img/basic/1.png +0 -0
  4. package/dev/img/basic/12369.png +0 -0
  5. package/dev/img/basic/1237.png +0 -0
  6. package/dev/img/basic/1632143.png +0 -0
  7. package/dev/img/basic/2.png +0 -0
  8. package/dev/img/basic/21.png +0 -0
  9. package/dev/img/basic/214.png +0 -0
  10. package/dev/img/basic/21478.png +0 -0
  11. package/dev/img/basic/23.png +0 -0
  12. package/dev/img/basic/236.png +0 -0
  13. package/dev/img/basic/23698.png +0 -0
  14. package/dev/img/basic/28.png +0 -0
  15. package/dev/img/basic/3.png +0 -0
  16. package/dev/img/basic/32147.png +0 -0
  17. package/dev/img/basic/3219.png +0 -0
  18. package/dev/img/basic/341236.png +0 -0
  19. package/dev/img/basic/346.png +0 -0
  20. package/dev/img/basic/360.png +0 -0
  21. package/dev/img/basic/4.png +0 -0
  22. package/dev/img/basic/41236.png +0 -0
  23. package/dev/img/basic/421.png +0 -0
  24. package/dev/img/basic/46.png +0 -0
  25. package/dev/img/basic/4618346.png +0 -0
  26. package/dev/img/basic/47896.png +0 -0
  27. package/dev/img/basic/5.png +0 -0
  28. package/dev/img/basic/6.png +0 -0
  29. package/dev/img/basic/623.png +0 -0
  30. package/dev/img/basic/63214.png +0 -0
  31. package/dev/img/basic/64.png +0 -0
  32. package/dev/img/basic/6428.png +0 -0
  33. package/dev/img/basic/69874.png +0 -0
  34. package/dev/img/basic/7.png +0 -0
  35. package/dev/img/basic/7891.png +0 -0
  36. package/dev/img/basic/8.png +0 -0
  37. package/dev/img/basic/81237.png +0 -0
  38. package/dev/img/basic/82.png +0 -0
  39. package/dev/img/basic/87412.png +0 -0
  40. package/dev/img/basic/89632.png +0 -0
  41. package/dev/img/basic/9.png +0 -0
  42. package/dev/img/basic/[1].png +0 -0
  43. package/dev/img/basic/[2].png +0 -0
  44. package/dev/img/basic/[2]8.png +0 -0
  45. package/dev/img/basic/[3].png +0 -0
  46. package/dev/img/basic/[4].png +0 -0
  47. package/dev/img/basic/[6].png +0 -0
  48. package/dev/img/basic/[7].png +0 -0
  49. package/dev/img/basic/[8].png +0 -0
  50. package/dev/img/basic/[9].png +0 -0
  51. package/dev/img/basic/air.png +0 -0
  52. package/dev/img/basic/doubleforward.png +0 -0
  53. package/dev/img/credits.txt +4 -0
  54. package/dev/img/games/bb/a.png +0 -0
  55. package/dev/img/games/bb/b.png +0 -0
  56. package/dev/img/games/bb/c.png +0 -0
  57. package/dev/img/games/bb/d.png +0 -0
  58. package/dev/img/games/bbtag/a.png +0 -0
  59. package/dev/img/games/bbtag/b.png +0 -0
  60. package/dev/img/games/bbtag/c.png +0 -0
  61. package/dev/img/games/bbtag/d.png +0 -0
  62. package/dev/img/games/bbtag/p.png +0 -0
  63. package/dev/img/games/dbz/a1.png +0 -0
  64. package/dev/img/games/dbz/a2.png +0 -0
  65. package/dev/img/games/dbz/h.png +0 -0
  66. package/dev/img/games/dbz/l.png +0 -0
  67. package/dev/img/games/dbz/m.png +0 -0
  68. package/dev/img/games/dbz/s.png +0 -0
  69. package/dev/img/games/dnf/a.png +0 -0
  70. package/dev/img/games/dnf/as.png +0 -0
  71. package/dev/img/games/dnf/b.png +0 -0
  72. package/dev/img/games/dnf/g.png +0 -0
  73. package/dev/img/games/dnf/ms.png +0 -0
  74. package/dev/img/games/dnf/s.png +0 -0
  75. package/dev/img/games/gbf/g.png +0 -0
  76. package/dev/img/games/gbf/h.png +0 -0
  77. package/dev/img/games/gbf/l.png +0 -0
  78. package/dev/img/games/gbf/m.png +0 -0
  79. package/dev/img/games/gbf/s.png +0 -0
  80. package/dev/img/games/gg/d.png +0 -0
  81. package/dev/img/games/gg/hs.png +0 -0
  82. package/dev/img/games/gg/k.png +0 -0
  83. package/dev/img/games/gg/p.png +0 -0
  84. package/dev/img/games/gg/rc.png +0 -0
  85. package/dev/img/games/gg/s.png +0 -0
  86. package/dev/img/games/kof/a.png +0 -0
  87. package/dev/img/games/kof/b.png +0 -0
  88. package/dev/img/games/kof/c.png +0 -0
  89. package/dev/img/games/kof/d.png +0 -0
  90. package/dev/img/games/kof/max.png +0 -0
  91. package/dev/img/games/mk/1.png +0 -0
  92. package/dev/img/games/mk/2.png +0 -0
  93. package/dev/img/games/mk/3.png +0 -0
  94. package/dev/img/games/mk/4.png +0 -0
  95. package/dev/img/games/sc/[a].png +0 -0
  96. package/dev/img/games/sc/[b].png +0 -0
  97. package/dev/img/games/sc/[g].png +0 -0
  98. package/dev/img/games/sc/[k].png +0 -0
  99. package/dev/img/games/sc/a.png +0 -0
  100. package/dev/img/games/sc/b.png +0 -0
  101. package/dev/img/games/sc/g.png +0 -0
  102. package/dev/img/games/sc/k.png +0 -0
  103. package/dev/img/games/sf/hk.png +0 -0
  104. package/dev/img/games/sf/hp.png +0 -0
  105. package/dev/img/games/sf/j..png +0 -0
  106. package/dev/img/games/sf/lk.png +0 -0
  107. package/dev/img/games/sf/lp.png +0 -0
  108. package/dev/img/games/sf/max.png +0 -0
  109. package/dev/img/games/sf/mk.png +0 -0
  110. package/dev/img/games/sf/mp.png +0 -0
  111. package/dev/img/games/sf/tap.png +0 -0
  112. package/dev/img/games/sg/hk.png +0 -0
  113. package/dev/img/games/sg/hp.png +0 -0
  114. package/dev/img/games/sg/k.png +0 -0
  115. package/dev/img/games/sg/lk.png +0 -0
  116. package/dev/img/games/sg/lp.png +0 -0
  117. package/dev/img/games/sg/mk.png +0 -0
  118. package/dev/img/games/sg/mp.png +0 -0
  119. package/dev/img/games/sg/p.png +0 -0
  120. package/dev/img/games/tfh/a.png +0 -0
  121. package/dev/img/games/tfh/b.png +0 -0
  122. package/dev/img/games/tfh/c.png +0 -0
  123. package/dev/img/games/tfh/d.png +0 -0
  124. package/dev/img/games/tkn/1.png +0 -0
  125. package/dev/img/games/tkn/12.png +0 -0
  126. package/dev/img/games/tkn/1234.png +0 -0
  127. package/dev/img/games/tkn/13.png +0 -0
  128. package/dev/img/games/tkn/14.png +0 -0
  129. package/dev/img/games/tkn/2.png +0 -0
  130. package/dev/img/games/tkn/23.png +0 -0
  131. package/dev/img/games/tkn/24.png +0 -0
  132. package/dev/img/games/tkn/3.png +0 -0
  133. package/dev/img/games/tkn/34.png +0 -0
  134. package/dev/img/games/tkn/4.png +0 -0
  135. package/dev/img/games/tkn/b.png +0 -0
  136. package/dev/img/games/tkn/d-b.png +0 -0
  137. package/dev/img/games/tkn/d-f.png +0 -0
  138. package/dev/img/games/tkn/d.png +0 -0
  139. package/dev/img/games/tkn/f.png +0 -0
  140. package/dev/img/games/tkn/o.png +0 -0
  141. package/dev/img/games/tkn/u-b.png +0 -0
  142. package/dev/img/games/tkn/u-f.png +0 -0
  143. package/dev/img/games/tkn/u.png +0 -0
  144. package/dev/img/preview.png +0 -0
  145. package/dev/index.js +563 -0
  146. package/dev/info.json +33 -0
  147. package/lib/img/basic/+.png +0 -0
  148. package/lib/img/games/bbtag/a.png +0 -0
  149. package/lib/img/games/bbtag/b.png +0 -0
  150. package/lib/img/games/bbtag/c.png +0 -0
  151. package/lib/img/games/bbtag/d.png +0 -0
  152. package/lib/img/games/bbtag/p.png +0 -0
  153. package/lib/img/games/gg/rc.png +0 -0
  154. package/lib/index.js +562 -488
  155. package/lib/info.json +33 -0
  156. package/package.json +9 -4
  157. package/src/img/basic/+.png +0 -0
  158. package/src/img/games/bbtag/a.png +0 -0
  159. package/src/img/games/bbtag/b.png +0 -0
  160. package/src/img/games/bbtag/c.png +0 -0
  161. package/src/img/games/bbtag/d.png +0 -0
  162. package/src/img/games/bbtag/p.png +0 -0
  163. package/src/img/games/gg/rc.png +0 -0
  164. package/src/index.js +87 -33
  165. package/src/info.json +33 -0
  166. package/examples/ex1.GIF +0 -0
  167. package/examples/fg1.GIF +0 -0
  168. package/examples/fg2.GIF +0 -0
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,17 +1,22 @@
1
1
  {
2
2
  "name": "@lotus-tree/fg-notation",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "main": "lib/index.js",
5
5
  "module": "src/index.js",
6
6
  "scripts": {
7
- "build": "babel --delete-dir-on-start --copy-files --source-maps inline --root-mode upward src --out-dir lib",
8
- "dev": "yarn build --watch"
7
+ "run-babel": "babel --delete-dir-on-start --copy-files src",
8
+ "build": "yarn run run-babel --out-dir lib",
9
+ "dev": "yarn run run-babel --watch --source-maps inline --out-dir dev",
10
+ "prepublishOnly": "yarn build"
9
11
  },
10
12
  "dependencies": {
13
+ "bent": "^7.3.12",
11
14
  "glob": "^7.2.0",
12
- "request-promise": "^4.2.6",
13
15
  "sharp": "^0.29.3"
14
16
  },
17
+ "peerDependencies": {
18
+ "@lotus-tree/command-handler": "^2.1.0"
19
+ },
15
20
  "devDependencies": {
16
21
  "@babel/cli": "^7.16.7",
17
22
  "@babel/core": "^7.16.7",
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/src/index.js CHANGED
@@ -2,8 +2,11 @@ import sharp from 'sharp'
2
2
  import path from 'path'
3
3
  import glob from 'glob'
4
4
  import { DataTypes } from 'sequelize'
5
- import rp from 'request-promise'
5
+ import bent from 'bent'
6
6
 
7
+ import { sizes, aliases, builtin } from './info.json'
8
+
9
+ const getJSON = bent('json')
7
10
  const imgPath = path.join(__dirname, 'img')
8
11
  const basicInputs = new Map()
9
12
  const gameInputs = new Map()
@@ -15,7 +18,7 @@ getGlossary()
15
18
  setInterval(getGlossary, 5 * 60 * 1000)
16
19
 
17
20
  async function getGlossary () {
18
- const result = JSON.parse(await rp('https://glossary.infil.net/json/glossary.json'))
21
+ const result = await getJSON('https://glossary.infil.net/json/glossary.json')
19
22
  const tempG = {}
20
23
  const tempT = []
21
24
 
@@ -33,50 +36,89 @@ glob.sync(path.join(imgPath, 'basic/**'), { nodir: true })
33
36
  .forEach(p => {
34
37
  const input = p.split('/').pop().replace('.png', '')
35
38
  basicInputs.set(input, p)
36
- })
37
39
 
38
- basicInputs.set('>>', path.join(imgPath, 'basic/doubleforward.png'))
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
+ })
39
48
 
40
- glob.sync(path.join(imgPath, 'games/**'), { nodir: true })
49
+ glob.sync(path.join(imgPath, 'games/*'))
41
50
  .forEach(p => {
42
- const { dir, name } = path.parse(path.relative(path.join(imgPath, 'games'), p))
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]
43
61
 
44
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map())
45
- gameInputs.get(dir).set(name, p)
62
+ if (alias) {
63
+ for (const [a, s] of Object.entries(alias)) {
64
+ gameInputs.get(base).set(a, s)
65
+ }
66
+ }
46
67
  })
47
68
 
48
69
  function solveInput (inputs, input) {
49
- if (inputs.has(input)) return [input]
70
+ if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input)
50
71
 
51
72
  for (let i = 0; i < input.length; i++) {
52
73
  const s1 = input.slice(0, 0 - i)
53
- if (inputs.has(s1)) return [s1, ...solveInput(inputs, input.slice(0 - i))]
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
+ }
54
81
  }
55
82
 
56
83
  throw new Error(`Cannot find "${input}" as a recognizable input`)
57
84
  }
58
85
 
59
86
  async function sendInput (inputs, result, message, caption) {
60
- const canvas = await sharp({ create: { width: 152 * result.length, height: 152, channels: 4, background: 'transparent' } })
61
- .composite(result.map((it, index) =>
62
- ({ input: inputs.get(it), left: index * 152, top: 0, width: 152, height: 152 })
63
- ))
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' } })
64
98
  .png()
65
- .toBuffer()
99
+ .composite(images)
100
+
101
+ canvas = await canvas.toBuffer()
102
+
103
+ if (result.length < 12) canvas = await sharp(canvas).resize({ height: 55 }).png().toBuffer()
66
104
 
67
105
  return message.reply({ content: caption, files: [canvas] })
68
106
  }
69
107
 
70
- const builtin = {
71
- 37: {
72
- game: 'sf',
73
- caption: '***LETS GO JUSTIN!***',
74
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
75
- }
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]'
76
114
  }
77
115
 
78
116
  export default {
79
117
  name: 'fg-notation',
118
+ about: {
119
+ name: 'FG Notation',
120
+ value: '[Instructions and source code](https://lotus.chitowarlock.com/fgnotation)\n[Infil\'s Fighting Game Glossary](https://glossary.infil.net)\n[MagicianStuff\'s Fighthing Game notations emotes](https://twitter.com/MagicianStuff/status/1477931054484893697)'
121
+ },
80
122
  intents: ['GUILD_MESSAGES'],
81
123
  partials: ['MESSAGE'],
82
124
 
@@ -127,14 +169,20 @@ export default {
127
169
  desc: 'Converts a list of inputs into an image',
128
170
  example: 'fgi sf 236P 214K',
129
171
  execute: async ({ param }, { message }) => {
130
- const [, game, i1] = param
131
- if (!game || !i1) return message.reply('Missing arguments. Example: >fgi sf 236P 214K')
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)
132
176
  if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
133
177
 
134
- const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
135
- const result = param.slice(2).map(i => solveInput(inputs, i.toLowerCase())).flat()
178
+ try {
179
+ const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
180
+ const result = param.slice(2).map(i => solveInput(inputs, i.toLowerCase())).flat()
136
181
 
137
- sendInput(inputs, result, message)
182
+ sendInput(inputs, result, message)
183
+ } catch (err) {
184
+ message.reply(err.message)
185
+ }
138
186
  }
139
187
  },
140
188
  fgsave: {
@@ -142,16 +190,22 @@ export default {
142
190
  desc: 'Saves a list of inputs into a command',
143
191
  example: 'fgi sf testName 236P 214K',
144
192
  execute: async ({ param, sequelize }, { message }) => {
145
- const [, game, name, i1] = param
146
- if (!game || !name || !i1) return message.reply('Missing arguments. Example: >fgi sf testName 236P 214K')
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)
147
197
  if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
148
198
 
149
- const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
150
- const input = param.slice(3).map(i => solveInput(inputs, i.toLowerCase())).flat().join(' ')
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(' ')
151
202
 
152
- await sequelize.models.fginput.create({ guild: message.guild.id, name, createdBy: message.author.id, game, input })
203
+ await sequelize.models.fginput.create({ guild: message.guild.id, name, createdBy: message.author.id, game, input })
153
204
 
154
- message.channel.send(`Saved command "${input}" as "${name}"`)
205
+ message.channel.send(`Saved command "${input}" as "${name}"`)
206
+ } catch (err) {
207
+ message.reply(err.message)
208
+ }
155
209
  }
156
210
  },
157
211
  fgcaption: {
@@ -188,7 +242,7 @@ export default {
188
242
  if (result.length === 0) return message.reply(`Term "${search}" not found`)
189
243
  if (result.length === 1) return message.reply(`\`\`\`${glossary[result[0]].def}\`\`\`Source: <${url}>`)
190
244
 
191
- message.reply(url)
245
+ message.reply(`Multiple terms found: ${url}`)
192
246
  }
193
247
  }
194
248
  }
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
+ }
package/examples/ex1.GIF DELETED
Binary file
package/examples/fg1.GIF DELETED
Binary file
package/examples/fg2.GIF DELETED
Binary file