discord-mudlet-map 0.1.1 → 0.1.3

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 CHANGED
@@ -1,22 +1,34 @@
1
- # 0.1.1
2
- - fix dependency
3
-
4
- # 0.1.0
5
- - add location search functions
6
- - fix no room handling
7
-
8
- # 0.0.7
9
- - fix map downloader - should prevent attempts to read map before stream finishes writes, thus failing to read map
10
- - move configuration loop into bot-configurator.js
11
- # 0.0.6
12
- - remove debug messages
13
- # 0.0.5
14
- - Use limitting function for generating area image
15
- # 0.0.4
16
- - Update dependencies
17
- # 0.0.3
18
- - Add way of customizing map rendering settings
19
- # 0.0.2
20
- - Fix README example
21
- # 0.0.1
1
+ # 0.2.0
2
+ - add message creator configuration
3
+
4
+ # 0.1.2
5
+ - fix hash search
6
+
7
+ # 0.1.1
8
+ - fix dependency
9
+
10
+ # 0.1.0
11
+ - add location search functions
12
+ - fix no room handling
13
+
14
+ # 0.0.7
15
+ - fix map downloader - should prevent attempts to read map before stream finishes writes, thus failing to read map
16
+ - move configuration loop into bot-configurator.js
17
+
18
+ # 0.0.6
19
+ - remove debug messages
20
+
21
+ # 0.0.5
22
+ - Use limitting function for generating area image
23
+
24
+ # 0.0.4
25
+ - Update dependencies
26
+
27
+ # 0.0.3
28
+ - Add way of customizing map rendering settings
29
+
30
+ # 0.0.2
31
+ - Fix README example
32
+
33
+ # 0.0.1
22
34
  - Initial release
package/README.md CHANGED
@@ -1,28 +1,29 @@
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, Discord.Intents.FLAGS.MESSAGE_CONTENT] });
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
- ```
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, Discord.Intents.FLAGS.MESSAGE_CONTENT] });
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
+ messageCreator: (key, area, room) => `${key} - ${area.areaName} (${room.id})`,
20
+ renderFragment: true, // renders just area around location, should improve generation times for bigger areas
21
+ settings: {
22
+ isRound: true
23
+ } // Reffer to: https://github.com/Delwing/js-mudlet-map-renderer#settings-and-their-default-values
24
+ };
25
+
26
+ configure(client, config);
27
+
28
+ client.login(BOT_TOKEN);
29
+ ```
@@ -1,54 +1,65 @@
1
- const { Message, Client } = require("discord.js");
2
- const { Renderer } = require("mudlet-map-renderer");
3
- const sharp = require("sharp");
4
-
5
- /**
6
- *
7
- * @param {Client} client
8
- * @param {Message} message
9
- */
10
- module.exports = (config) => {
11
- return async (message) => {
12
- Object.keys(config).forEach((key) => {
13
- let element = config[key];
14
- let reader = element.reader;
15
- let roomId = element.locationExtractor(message.content, reader);
16
- if (roomId) {
17
- if (!reader) {
18
- message.channel.send(`${key} - map not ready`);
19
- return;
20
- }
21
- let area = reader.getAreaByRoomId(roomId);
22
- if (!area) {
23
- message.channel.send(`${key} - no location ID`);
24
- return;
25
- }
26
- if (element.renderFragment) {
27
- area = area.limit(roomId, 15)
28
- if (element.settings == undefined) {
29
- element.settings = {}
30
- }
31
- if (element.settings.areaName == undefined) {
32
- element.settings.areaName = false;
33
- }
34
- }
35
- async function render() {
36
- let renderer = new Renderer(null, reader, area, reader.getColors(), element.settings);
37
- renderer.renderPosition(roomId);
38
- sharp(Buffer.from(renderer.exportSvg(roomId, 10)))
39
- .png()
40
- .toBuffer()
41
- .then((buffer) => {
42
- message.channel.send({content: `${key} - ${area.areaName}`, files:[
43
- { attachment: buffer, name: `${key} - ${roomId}.png` }
44
- ]})
45
- })
46
- .catch(function (err) {
47
- console.log(err);
48
- });
49
- }
50
- render();
51
- }
52
- });
53
- };
54
- };
1
+ const { Message } = require("discord.js");
2
+ const { Renderer } = require("mudlet-map-renderer");
3
+ const sharp = require("sharp");
4
+
5
+ const defaultMessageCreator = function (key, area, room) {
6
+ return `${key} - ${area.areaName}`;
7
+ };
8
+
9
+ module.exports = (config) => {
10
+ /**
11
+ *
12
+ * @param {Message} message
13
+ */
14
+ return async (message) => {
15
+ Object.keys(config).forEach((key) => {
16
+ let element = config[key];
17
+ let reader = element.reader;
18
+ let roomId = element.locationExtractor(message.content, reader);
19
+ if (roomId) {
20
+ if (!reader) {
21
+ message.channel.send(`${key} - map not ready`);
22
+ return;
23
+ }
24
+ let area = reader.getAreaByRoomId(roomId);
25
+ let room = reader.getRoomById(roomId);
26
+ if (!area || !room) {
27
+ message.channel.send(`${key} - no location ID`);
28
+ return;
29
+ }
30
+ if (element.renderFragment) {
31
+ area = area.limit(roomId, 15);
32
+ if (element.settings == undefined) {
33
+ element.settings = {};
34
+ }
35
+ if (element.settings.areaName == undefined) {
36
+ element.settings.areaName = false;
37
+ }
38
+ }
39
+ async function render() {
40
+ let renderer = new Renderer(
41
+ null,
42
+ reader,
43
+ area,
44
+ reader.getColors(),
45
+ element.settings
46
+ );
47
+ renderer.renderPosition(roomId);
48
+ sharp(Buffer.from(renderer.exportSvg(roomId, 10)))
49
+ .png()
50
+ .toBuffer()
51
+ .then((buffer) => {
52
+ message.channel.send({
53
+ content: (element.messageCreator || defaultMessageCreator)(key, area, room),
54
+ files: [{ attachment: buffer, name: `${key} - ${roomId}.png` }],
55
+ });
56
+ })
57
+ .catch(function (err) {
58
+ console.log(err);
59
+ });
60
+ }
61
+ render();
62
+ }
63
+ });
64
+ };
65
+ };
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
- module.exports = {
2
- configure : require('./maps/bot-configurator'),
3
- LocationResolvers : require('./maps/location-resolvers'),
4
- MapProviders : require('./maps/map-providers'),
5
- SearchFunctions: require('./maps/search-functions')
1
+ module.exports = {
2
+ configure : require('./maps/bot-configurator'),
3
+ LocationResolvers : require('./maps/location-resolvers'),
4
+ MapProviders : require('./maps/map-providers'),
5
+ SearchFunctions: require('./maps/search-functions')
6
6
  }
@@ -1,31 +1,31 @@
1
- const { Client, version } = require("discord.js");
2
- const mapCommand = require("../events/messageCreate");
3
- const MapResolver = require("../maps/prepare-map");
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
- const configurator = () => {
13
- Object.keys(config).map(async (key) => {
14
- MapResolver.prepareMap(key, config[key].provider)
15
- .then((reader) => {
16
- config[key].reader = reader;
17
- console.log(`${key} map ready!`);
18
- })
19
- .catch((err) => console.log(err));
20
- });
21
- };
22
- configurator();
23
-
24
- client.on(eventName, mapCommand(config));
25
-
26
- client.on("ready", () => {
27
- console.log("Bot enhanced with Mudlet maps ready.");
28
- });
29
-
30
- return configurator
31
- };
1
+ const { Client, version } = require("discord.js");
2
+ const mapCommand = require("../events/messageCreate");
3
+ const MapResolver = require("../maps/prepare-map");
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
+ const configurator = () => {
13
+ Object.keys(config).map(async (key) => {
14
+ MapResolver.prepareMap(key, config[key].provider)
15
+ .then((reader) => {
16
+ config[key].reader = reader;
17
+ console.log(`${key} map ready!`);
18
+ })
19
+ .catch((err) => console.log(err));
20
+ });
21
+ };
22
+ configurator();
23
+
24
+ client.on(eventName, mapCommand(config));
25
+
26
+ client.on("ready", () => {
27
+ console.log("Bot enhanced with Mudlet maps ready.");
28
+ });
29
+
30
+ return configurator
31
+ };
@@ -1,15 +1,15 @@
1
- let plainRegexp = (regexp, searchFunction) => (message, reader) => {
2
- if (!searchFunction) {
3
- searchFunction = (arg) => arg[1]
4
- }
5
- let matches = message.match(regexp)
6
- if (matches) {
7
- return searchFunction(matches, reader);
8
- } else {
9
- return false;
10
- }
11
- };
12
-
13
- module.exports = {
14
- plainRegexp: plainRegexp,
1
+ let plainRegexp = (regexp, searchFunction) => (message, reader) => {
2
+ if (!searchFunction) {
3
+ searchFunction = (arg) => arg[1]
4
+ }
5
+ let matches = message.match(regexp)
6
+ if (matches) {
7
+ return searchFunction(matches, reader);
8
+ } else {
9
+ return false;
10
+ }
11
+ };
12
+
13
+ module.exports = {
14
+ plainRegexp: plainRegexp,
15
15
  };
@@ -1,45 +1,45 @@
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
- writeStream.on("finish", () => {
11
- writeStream.close()
12
- resolve()
13
- })
14
- response.on("error", (err) => reject(err));
15
- } else {
16
- reject(new Error(`Can't download map: ${response.statusCode} ${response.statusMessage}`));
17
- }
18
- });
19
- });
20
- };
21
-
22
- let retryingDownloader = (url, retryOptions) => (writeStream) => {
23
- let defaultOptions = {
24
- retries: 3,
25
- delay: 1000,
26
- };
27
- let options = { ...defaultOptions, ...retryOptions };
28
- return downloader(url)(writeStream).catch((err) => {
29
- if (options.retries > 0) {
30
- return new Promise((resolve, reject) =>
31
- setTimeout(() => {
32
- options.retries--;
33
- console.log(`Retrying download from ${url}`)
34
- resolve(retryingDownloader(url, options)(writeStream));
35
- }, options.delay)
36
- );
37
- }
38
- throw err;
39
- });
40
- };
41
-
42
- module.exports = {
43
- downloader: downloader,
44
- retryingDownloader: retryingDownloader,
45
- };
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
+ writeStream.on("finish", () => {
11
+ writeStream.close()
12
+ resolve()
13
+ })
14
+ response.on("error", (err) => reject(err));
15
+ } else {
16
+ reject(new Error(`Can't download map: ${response.statusCode} ${response.statusMessage}`));
17
+ }
18
+ });
19
+ });
20
+ };
21
+
22
+ let retryingDownloader = (url, retryOptions) => (writeStream) => {
23
+ let defaultOptions = {
24
+ retries: 3,
25
+ delay: 1000,
26
+ };
27
+ let options = { ...defaultOptions, ...retryOptions };
28
+ return downloader(url)(writeStream).catch((err) => {
29
+ if (options.retries > 0) {
30
+ return new Promise((resolve, reject) =>
31
+ setTimeout(() => {
32
+ options.retries--;
33
+ console.log(`Retrying download from ${url}`)
34
+ resolve(retryingDownloader(url, options)(writeStream));
35
+ }, options.delay)
36
+ );
37
+ }
38
+ throw err;
39
+ });
40
+ };
41
+
42
+ module.exports = {
43
+ downloader: downloader,
44
+ retryingDownloader: retryingDownloader,
45
+ };
@@ -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
+ };
@@ -1,19 +1,19 @@
1
- let hashCache;
2
-
3
- let hashOrIdSearch = (matches, reader) => {
4
- if (!isNaN(parseInt(matches[1]))) {
5
- return matches[1];
6
- } else {
7
- if (!hashCache) {
8
- hashCache = {};
9
- Object.entries(reader.roomIndex).forEach((room, index) => {
10
- hashCache[room[1].hash] = index;
11
- })
12
- }
13
- return hashCache[matches[1]] ?? -1;
14
- }
15
- };
16
-
17
- module.exports = {
18
- hashOrIdSearch
1
+ let hashCache;
2
+
3
+ let hashOrIdSearch = (matches, reader) => {
4
+ if (!isNaN(parseInt(matches[1]))) {
5
+ return matches[1];
6
+ } else {
7
+ if (!hashCache) {
8
+ hashCache = {};
9
+ Object.entries(reader.roomIndex).forEach((room, index) => {
10
+ hashCache[room[1].hash] = room[1].id;
11
+ })
12
+ }
13
+ return hashCache[matches[1]] ?? -1;
14
+ }
15
+ };
16
+
17
+ module.exports = {
18
+ hashOrIdSearch
19
19
  };
package/package.json CHANGED
@@ -1,32 +1,32 @@
1
- {
2
- "name": "discord-mudlet-map",
3
- "version": "0.1.1",
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.5.2",
22
- "mudlet-map-renderer": "^0.0.19",
23
- "sharp": "^0.30.5"
24
- },
25
- "peerDependencies": {
26
- "discord.js": ">12"
27
- },
28
- "devDependencies": {
29
- "discord.js": "^13.6.0",
30
- "dotenv": "^16.0.0"
31
- }
32
- }
1
+ {
2
+ "name": "discord-mudlet-map",
3
+ "version": "0.1.3",
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.5.2",
22
+ "mudlet-map-renderer": "^0.0.25",
23
+ "sharp": "^0.30.5"
24
+ },
25
+ "peerDependencies": {
26
+ "discord.js": ">12"
27
+ },
28
+ "devDependencies": {
29
+ "discord.js": "^13.6.0",
30
+ "dotenv": "^16.0.0"
31
+ }
32
+ }