@lotus-tree/fg-notation 1.1.0 → 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.
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