discord-mudlet-map 0.0.1 → 0.0.5
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/CHANGELOG.md +10 -2
- package/README.md +28 -22
- package/events/messageCreate.js +67 -58
- package/exports.js +4 -4
- package/maps/bot-configurator.js +20 -20
- package/maps/location-resolvers.js +12 -12
- package/maps/map-providers.js +42 -42
- package/maps/prepare-map.js +44 -44
- package/package.json +33 -33
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
# Discord Mudlet Map
|
|
2
|
-
|
|
3
|
-
This little library helps with Discord bot configuration to provide small Mudlet map fragment images with given location.
|
|
4
|
-
|
|
5
|
-
## Example
|
|
6
|
-
|
|
7
|
-
```js
|
|
8
|
-
const BOT_TOKEN = "your_token"
|
|
9
|
-
|
|
10
|
-
const Discord = require("discord.js");
|
|
11
|
-
const client = new Discord.Client({ intents: [Discord.Intents.FLAGS.GUILD_MESSAGES] });
|
|
12
|
-
|
|
13
|
-
const { configure, MapProviders, LocationResolvers } = require("discord-mudlet-map")
|
|
14
|
-
|
|
15
|
-
let config = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
# Discord Mudlet Map
|
|
2
|
+
|
|
3
|
+
This little library helps with Discord bot configuration to provide small Mudlet map fragment images with given location.
|
|
4
|
+
|
|
5
|
+
## Example
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
const BOT_TOKEN = "your_token"
|
|
9
|
+
|
|
10
|
+
const Discord = require("discord.js");
|
|
11
|
+
const client = new Discord.Client({ intents: [Discord.Intents.FLAGS.GUILD_MESSAGES, Discord.Intents.FLAGS.GUILDS] });
|
|
12
|
+
|
|
13
|
+
const { configure, MapProviders, LocationResolvers } = require("discord-mudlet-map")
|
|
14
|
+
|
|
15
|
+
let config = {
|
|
16
|
+
Achaea: {
|
|
17
|
+
locationExtractor: LocationResolvers.plainRegexp("!achaea (\\d+)"),
|
|
18
|
+
provider: MapProviders.retryingDownloader("https://raw.githubusercontent.com/IRE-Mudlet-Mapping/AchaeaCrowdmap/gh-pages/Map/map", { retries: 5, delay : 10000 }) },
|
|
19
|
+
renderFragment: true, // renders just area around location, should improve generation times for bigger areas
|
|
20
|
+
settings: {
|
|
21
|
+
isRound: true
|
|
22
|
+
} // Reffer to: https://github.com/Delwing/js-mudlet-map-renderer#settings-and-their-default-values
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
configure(client, config);
|
|
26
|
+
|
|
27
|
+
client.login(BOT_TOKEN);
|
|
28
|
+
```
|
package/events/messageCreate.js
CHANGED
|
@@ -1,58 +1,67 @@
|
|
|
1
|
-
const { Message, Client } = require("discord.js");
|
|
2
|
-
const MapResolver = require("../maps/prepare-map");
|
|
3
|
-
const { Renderer } = require("mudlet-map-renderer");
|
|
4
|
-
const sharp = require("sharp");
|
|
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
|
-
}
|
|
1
|
+
const { Message, Client } = require("discord.js");
|
|
2
|
+
const MapResolver = require("../maps/prepare-map");
|
|
3
|
+
const { Renderer } = require("mudlet-map-renderer");
|
|
4
|
+
const sharp = require("sharp");
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param {Client} client
|
|
9
|
+
* @param {Message} message
|
|
10
|
+
*/
|
|
11
|
+
module.exports = (config) => {
|
|
12
|
+
Object.keys(config).map(async (key) => {
|
|
13
|
+
MapResolver.prepareMap(key, config[key].provider)
|
|
14
|
+
.then((reader) => {
|
|
15
|
+
config[key].reader = reader;
|
|
16
|
+
console.log(`${key} map ready!`);
|
|
17
|
+
})
|
|
18
|
+
.catch((err) => console.log(err));
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
return async (message) => {
|
|
22
|
+
Object.keys(config).forEach((key) => {
|
|
23
|
+
let element = config[key];
|
|
24
|
+
let roomId = element.locationExtractor(message.content);
|
|
25
|
+
if (roomId) {
|
|
26
|
+
let reader = element.reader;
|
|
27
|
+
if (!reader) {
|
|
28
|
+
message.channel.send(`${key} - map not ready`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let area = reader.getAreaByRoomId(roomId);
|
|
32
|
+
if (element.renderFragment) {
|
|
33
|
+
area = area.limit(roomId, 15)
|
|
34
|
+
console.log(element.settings)
|
|
35
|
+
if (element.settings == undefined) {
|
|
36
|
+
element.settings = {}
|
|
37
|
+
}
|
|
38
|
+
console.log(element.settings)
|
|
39
|
+
if (element.settings.areaName == undefined) {
|
|
40
|
+
element.settings.areaName = false;
|
|
41
|
+
}
|
|
42
|
+
console.log(element.settings)
|
|
43
|
+
}
|
|
44
|
+
if (!area) {
|
|
45
|
+
message.channel.send(`${key} - no location ID`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
async function render() {
|
|
49
|
+
let renderer = new Renderer(null, reader, area, reader.getColors(), element.settings);
|
|
50
|
+
renderer.renderPosition(roomId);
|
|
51
|
+
sharp(Buffer.from(renderer.exportSvg(roomId, 10)))
|
|
52
|
+
.png()
|
|
53
|
+
.toBuffer()
|
|
54
|
+
.then((buffer) => {
|
|
55
|
+
message.channel.send({content: `${key} - ${area.areaName}`, files:[
|
|
56
|
+
{ attachment: buffer, name: `${key} - ${roomId}.png` }
|
|
57
|
+
]})
|
|
58
|
+
})
|
|
59
|
+
.catch(function (err) {
|
|
60
|
+
console.log(err);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
render();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
};
|
package/exports.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
configure : require('./maps/bot-configurator'),
|
|
3
|
-
LocationResolvers : require('./maps/location-resolvers'),
|
|
4
|
-
MapProviders : require('./maps/map-providers')
|
|
1
|
+
module.exports = {
|
|
2
|
+
configure : require('./maps/bot-configurator'),
|
|
3
|
+
LocationResolvers : require('./maps/location-resolvers'),
|
|
4
|
+
MapProviders : require('./maps/map-providers')
|
|
5
5
|
}
|
package/maps/bot-configurator.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
const { Client, version } = require("discord.js");
|
|
2
|
-
const mapCommand = require("../events/messageCreate");
|
|
3
|
-
|
|
4
|
-
const major = parseInt(version.substring(0, version.indexOf(".")));
|
|
5
|
-
const eventName = major >= 13 ? "messageCreate" : "message";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
* @param {Client} client
|
|
10
|
-
*/
|
|
11
|
-
module.exports = (client, config) => {
|
|
12
|
-
client.on(
|
|
13
|
-
eventName,
|
|
14
|
-
mapCommand(config)
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
client.on('ready', () => {
|
|
18
|
-
console.log("Bot enhanced with Mudlet maps ready.")
|
|
19
|
-
})
|
|
20
|
-
};
|
|
1
|
+
const { Client, version } = require("discord.js");
|
|
2
|
+
const mapCommand = require("../events/messageCreate");
|
|
3
|
+
|
|
4
|
+
const major = parseInt(version.substring(0, version.indexOf(".")));
|
|
5
|
+
const eventName = major >= 13 ? "messageCreate" : "message";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param {Client} client
|
|
10
|
+
*/
|
|
11
|
+
module.exports = (client, config) => {
|
|
12
|
+
client.on(
|
|
13
|
+
eventName,
|
|
14
|
+
mapCommand(config)
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
client.on('ready', () => {
|
|
18
|
+
console.log("Bot enhanced with Mudlet maps ready.")
|
|
19
|
+
})
|
|
20
|
+
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
let plainRegexp = (regexp) => (message) => {
|
|
2
|
-
let matches = message.match(regexp)
|
|
3
|
-
if (matches) {
|
|
4
|
-
return matches[1];
|
|
5
|
-
} else {
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
module.exports = {
|
|
11
|
-
plainRegexp: plainRegexp,
|
|
12
|
-
};
|
|
1
|
+
let plainRegexp = (regexp) => (message) => {
|
|
2
|
+
let matches = message.match(regexp)
|
|
3
|
+
if (matches) {
|
|
4
|
+
return matches[1];
|
|
5
|
+
} else {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
plainRegexp: plainRegexp,
|
|
12
|
+
};
|
package/maps/map-providers.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
const http = require("http");
|
|
2
|
-
const https = require("https");
|
|
3
|
-
|
|
4
|
-
let downloader = (url) => (writeStream) => {
|
|
5
|
-
return new Promise((resolve, reject) => {
|
|
6
|
-
let protocol = url.startsWith("https") ? https : http;
|
|
7
|
-
protocol.get(url, function (response) {
|
|
8
|
-
if (response.statusCode < 400) {
|
|
9
|
-
response.pipe(writeStream);
|
|
10
|
-
response.on("end", () => resolve());
|
|
11
|
-
response.on("error", (err) => reject(err));
|
|
12
|
-
} else {
|
|
13
|
-
reject(new Error(`Can't download map: ${response.statusCode} ${response.statusMessage}`));
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
let retryingDownloader = (url, retryOptions) => (writeStream) => {
|
|
20
|
-
let defaultOptions = {
|
|
21
|
-
retries: 3,
|
|
22
|
-
delay: 1000,
|
|
23
|
-
};
|
|
24
|
-
let options = { ...defaultOptions, ...retryOptions };
|
|
25
|
-
return downloader(url)(writeStream).catch((err) => {
|
|
26
|
-
if (options.retries > 0) {
|
|
27
|
-
return new Promise((resolve, reject) =>
|
|
28
|
-
setTimeout(() => {
|
|
29
|
-
options.retries--;
|
|
30
|
-
console.log(
|
|
31
|
-
resolve(retryingDownloader(url, options)(writeStream));
|
|
32
|
-
}, options.delay)
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
throw err;
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
module.exports = {
|
|
40
|
-
downloader: downloader,
|
|
41
|
-
retryingDownloader: retryingDownloader,
|
|
42
|
-
};
|
|
1
|
+
const http = require("http");
|
|
2
|
+
const https = require("https");
|
|
3
|
+
|
|
4
|
+
let downloader = (url) => (writeStream) => {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
let protocol = url.startsWith("https") ? https : http;
|
|
7
|
+
protocol.get(url, function (response) {
|
|
8
|
+
if (response.statusCode < 400) {
|
|
9
|
+
response.pipe(writeStream);
|
|
10
|
+
response.on("end", () => resolve());
|
|
11
|
+
response.on("error", (err) => reject(err));
|
|
12
|
+
} else {
|
|
13
|
+
reject(new Error(`Can't download map: ${response.statusCode} ${response.statusMessage}`));
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
let retryingDownloader = (url, retryOptions) => (writeStream) => {
|
|
20
|
+
let defaultOptions = {
|
|
21
|
+
retries: 3,
|
|
22
|
+
delay: 1000,
|
|
23
|
+
};
|
|
24
|
+
let options = { ...defaultOptions, ...retryOptions };
|
|
25
|
+
return downloader(url)(writeStream).catch((err) => {
|
|
26
|
+
if (options.retries > 0) {
|
|
27
|
+
return new Promise((resolve, reject) =>
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
options.retries--;
|
|
30
|
+
console.log(`Retrying download from ${url}`)
|
|
31
|
+
resolve(retryingDownloader(url, options)(writeStream));
|
|
32
|
+
}, options.delay)
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
throw err;
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
module.exports = {
|
|
40
|
+
downloader: downloader,
|
|
41
|
+
retryingDownloader: retryingDownloader,
|
|
42
|
+
};
|
package/maps/prepare-map.js
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
const fs = require("fs");
|
|
2
|
-
|
|
3
|
-
const { MudletMapReader } = require("mudlet-map-binary-reader");
|
|
4
|
-
const { MapReader } = require("mudlet-map-renderer");
|
|
5
|
-
|
|
6
|
-
const downloadDir = "downloads";
|
|
7
|
-
|
|
8
|
-
function ensureDirectoryExists(key) {
|
|
9
|
-
return new Promise((resolve, reject) => {
|
|
10
|
-
fs.access(key, (err) => {
|
|
11
|
-
if (err) {
|
|
12
|
-
fs.mkdir(key, { recursive: true }, (err) => {
|
|
13
|
-
if (!err) {
|
|
14
|
-
resolve();
|
|
15
|
-
} else {
|
|
16
|
-
reject(err);
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
} else {
|
|
20
|
-
resolve();
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async function prepareMap(key, provider) {
|
|
27
|
-
return ensureDirectoryExists(`./${downloadDir}/${key}`)
|
|
28
|
-
.then(() => provider(fs.createWriteStream(`./${downloadDir}/${key}/map.dat`)))
|
|
29
|
-
.then(
|
|
30
|
-
() =>
|
|
31
|
-
new Promise((resolve, reject) => {
|
|
32
|
-
let map = MudletMapReader.read(`./${downloadDir}/${key}/map.dat`);
|
|
33
|
-
MudletMapReader.export(map, `./${downloadDir}/${key}/`);
|
|
34
|
-
let mapData = JSON.parse(fs.readFileSync(`./${downloadDir}/${key}/mapExport.json`));
|
|
35
|
-
let mapColors = JSON.parse(fs.readFileSync(`./${downloadDir}/${key}/colors.json`));
|
|
36
|
-
let reader = new MapReader(mapData, mapColors);
|
|
37
|
-
resolve(reader);
|
|
38
|
-
})
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
module.exports = {
|
|
43
|
-
prepareMap: prepareMap,
|
|
44
|
-
};
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
|
|
3
|
+
const { MudletMapReader } = require("mudlet-map-binary-reader");
|
|
4
|
+
const { MapReader } = require("mudlet-map-renderer");
|
|
5
|
+
|
|
6
|
+
const downloadDir = "downloads";
|
|
7
|
+
|
|
8
|
+
function ensureDirectoryExists(key) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
fs.access(key, (err) => {
|
|
11
|
+
if (err) {
|
|
12
|
+
fs.mkdir(key, { recursive: true }, (err) => {
|
|
13
|
+
if (!err) {
|
|
14
|
+
resolve();
|
|
15
|
+
} else {
|
|
16
|
+
reject(err);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
} else {
|
|
20
|
+
resolve();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function prepareMap(key, provider) {
|
|
27
|
+
return ensureDirectoryExists(`./${downloadDir}/${key}`)
|
|
28
|
+
.then(() => provider(fs.createWriteStream(`./${downloadDir}/${key}/map.dat`)))
|
|
29
|
+
.then(
|
|
30
|
+
() =>
|
|
31
|
+
new Promise((resolve, reject) => {
|
|
32
|
+
let map = MudletMapReader.read(`./${downloadDir}/${key}/map.dat`);
|
|
33
|
+
MudletMapReader.export(map, `./${downloadDir}/${key}/`);
|
|
34
|
+
let mapData = JSON.parse(fs.readFileSync(`./${downloadDir}/${key}/mapExport.json`));
|
|
35
|
+
let mapColors = JSON.parse(fs.readFileSync(`./${downloadDir}/${key}/colors.json`));
|
|
36
|
+
let reader = new MapReader(mapData, mapColors);
|
|
37
|
+
resolve(reader);
|
|
38
|
+
})
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
prepareMap: prepareMap,
|
|
44
|
+
};
|
package/package.json
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "discord-mudlet-map",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"main": "index.js",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"keywords": [
|
|
7
|
-
"mudlet",
|
|
8
|
-
"map",
|
|
9
|
-
"mud",
|
|
10
|
-
"discord"
|
|
11
|
-
],
|
|
12
|
-
"author": "Delwing",
|
|
13
|
-
"repository": {
|
|
14
|
-
"url": "git+https://github.com/Delwing/discord-mudlet-map.git"
|
|
15
|
-
},
|
|
16
|
-
"bugs": {
|
|
17
|
-
"url": "https://github.com/Delwing/discord-mudlet-map/issues"
|
|
18
|
-
},
|
|
19
|
-
"homepage": "https://github.com/Delwing/discord-mudlet-map#readme",
|
|
20
|
-
"dependencies": {
|
|
21
|
-
"mudlet-map-binary-reader": "^0.0.
|
|
22
|
-
"mudlet-map-renderer": "^0.0.
|
|
23
|
-
"sharp": "^0.29.1"
|
|
24
|
-
},
|
|
25
|
-
"peerDependencies": {
|
|
26
|
-
"discord.js": ">12"
|
|
27
|
-
},
|
|
28
|
-
"exports": "./exports.js",
|
|
29
|
-
"devDependencies": {
|
|
30
|
-
"discord.js": "^13.2.0",
|
|
31
|
-
"dotenv": "^10.0.0"
|
|
32
|
-
}
|
|
33
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "discord-mudlet-map",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"mudlet",
|
|
8
|
+
"map",
|
|
9
|
+
"mud",
|
|
10
|
+
"discord"
|
|
11
|
+
],
|
|
12
|
+
"author": "Delwing",
|
|
13
|
+
"repository": {
|
|
14
|
+
"url": "git+https://github.com/Delwing/discord-mudlet-map.git"
|
|
15
|
+
},
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/Delwing/discord-mudlet-map/issues"
|
|
18
|
+
},
|
|
19
|
+
"homepage": "https://github.com/Delwing/discord-mudlet-map#readme",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"mudlet-map-binary-reader": "^0.0.4",
|
|
22
|
+
"mudlet-map-renderer": "^0.0.5",
|
|
23
|
+
"sharp": "^0.29.1"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"discord.js": ">12"
|
|
27
|
+
},
|
|
28
|
+
"exports": "./exports.js",
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"discord.js": "^13.2.0",
|
|
31
|
+
"dotenv": "^10.0.0"
|
|
32
|
+
}
|
|
33
|
+
}
|