-
Notifications
You must be signed in to change notification settings - Fork 4
/
index.js
160 lines (142 loc) · 5.76 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
const { Canvas } = require('canvas')
const fs = require('fs-extra')
const path = require('path')
const modifier = new (require('./util/Modifier'))()
const canvasMan = new (require('./util/CanvasManager'))()
const cManager = new (require('./util/CacheManager'))()
const { Emblem, Guild } = require('./util/TypeDefs')
const coords = require('./util/coords')
module.exports = {
/**
* A helper class for retrieving images that are used to build a WoW guild
* emblem.
*
* @class
*/
Retriever: require('./util/Retriever'),
/**
* A helper class for modifying the base images used to build a WoW guild
* emblem. Also useful for cleaning JSON objects from the Battle.net API to
* remove the unnecessary properties such as iconColorId, borderColorId, etc.
*
* @class
*/
Modifier: require('./util/Modifier'),
/**
* Generates an emblem image using the data in the given emblem object and
* faction id. The faction id is required in order to know which background
* image to use as they're based on the guild faction. The emblem object is
* usually retrieved from the Battle.net API guild endpoints.
*
* If you want to generate an emblem using the entire guild object, you can
* use the getImageFromGuild(guild) method.
*
* The resulting emblem is returned as a Buffer through a Promise.
*
* @param {Emblem} emblem
* @param {number} factionId 0 = Alliance; 1 = Horde
*
* @returns {Promise<Canvas>}
*/
getEmblemBuffer: async function (emblem, factionId) {
const canvas = await this.getEmblemCanvas(emblem, factionId)
return canvas.toBuffer()
},
/**
* Generates an emblem image using the data in the given emblem object and
* faction id. The faction id is required in order to know which background
* image to use as they're based on the guild faction. The emblem object is
* usually retrieved from the Battle.net API guild endpoints.
*
* If you want to generate an emblem using the entire guild object, you can
* use the getImageFromGuild(guild) method.
*
* The resulting emblem is returned as a Buffer through a Promise.
*
* @param {Emblem} emblem
* @param {number} factionId
*
* @returns {Promise<Canvas>}
*/
getEmblemCanvas: async function (emblem, factionId) {
const cacheFilename = cManager.generateFileName(emblem, factionId)
if (await cManager.isImageCached(cacheFilename)) {
let imagePath = path.join(__dirname, 'cache', cacheFilename)
return canvasMan.getImageCanvas(imagePath)
} else {
const cleanObj = await modifier.cleanEmblemObject(emblem)
const baseImages = await canvasMan.getBaseImages({
icon: cleanObj.icon,
border: cleanObj.border,
background: factionId
})
const coloredImgs = await modifier.updateBaseImageColors(baseImages, cleanObj)
const canvas = new Canvas(250, 250)
const ctx = canvas.getContext('2d')
// Draw faction based background image first
ctx.drawImage(coloredImgs.background, coords.background.x, coords.background.y, coloredImgs.background.width, coloredImgs.background.height)
// Draw colored flag backdrop
ctx.drawImage(coloredImgs.flag, coords.flag.x, coords.flag.y, coloredImgs.flag.width, coloredImgs.flag.height)
// Draw the hooks over the flag
ctx.drawImage(coloredImgs.hooks, coords.hooks.x, coords.hooks.y, coloredImgs.hooks.width, coloredImgs.hooks.height)
// Draw the border surrounding the flag
ctx.drawImage(coloredImgs.border, coords.border.x, coords.border.y, coloredImgs.border.width, coloredImgs.border.height)
// Draw the icon in the center of the flag
ctx.drawImage(coloredImgs.icon, coords.icon.x, coords.icon.y, coloredImgs.icon.width, coloredImgs.icon.height)
// Cache the image for when it
cManager.storeImage(cacheFilename, canvas.toBuffer())
return canvas
}
},
/**
* Generates an emblem image using the data in the given guild object.
*
* The resulting emblem is returned as a Buffer through a Promise.
*
* @param {Guild} guild
*/
getEmblemBufferFromGuild: async function (guild) {
const cleanObj = await modifier.cleanGuildObject(guild)
return this.getEmblemBuffer(cleanObj, cleanObj.faction)
},
/**
* Generates an emblem image using the guild object.
*
* The resulting emblem is returned as a Canvas through a Promise.
* @param {Guild} guild
*
* @returns {Promise<Canvas>}
*/
getEmblemCanvasFromGuild: async function (guild) {
const cleanObj = await modifier.cleanGuildObject(guild)
return this.getEmblemCanvas(cleanObj, cleanObj.faction)
},
/**
* Converts the given emblem object into an image and stores it to disk using
* the given filename and options. The provided filename should contain the
* full path to the location you wish to store the image. The accepted options
* are the same options you would pass to fs.writeFile() using the default fs
* module.
*
* The file is saved using the outputFile method that is part of the fs-extra
* module. This means that if the parent directory of the path doesn't exist,
* it will be created.
*
* As of version 1.1.0, this method only accepts emblem objects, not the
* entire guild object with extra information.
*
* @param {Emblem} emblem
* @param {number} factionId
* @param {string} filename
* @param {object} options
*
* @returns {Promise<void>}
*
* @see https://github.com/jprichardson/node-fs-extra/blob/master/docs/outputFile.md
* @see https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback
*/
saveEmblemToFile: async function (emblem, factionId, filename, options) {
const imageBuffer = await this.getEmblemBuffer(emblem, factionId)
return fs.outputFile(filename, imageBuffer, options)
}
}