discord-mudlet-map
Version:
This little library helps with Discord bot configuration to provide small Mudlet map fragment images with given location.
67 lines (64 loc) • 2.09 kB
JavaScript
const { Message } = require("discord.js");
const { Renderer } = require("mudlet-map-renderer");
const sharp = require("sharp");
const defaultMessageCreator = function (key, area, room) {
return `${key} - ${area.areaName}`;
};
module.exports = (config) => {
/**
*
* @param {Message} message
*/
return async (message) => {
Object.keys(config).forEach((key) => {
let element = config[key];
element.renderArea = element.renderArea ?? false;
let reader = element.reader;
let roomId = element.locationExtractor(message.content, reader);
if (roomId) {
if (!reader) {
message.channel.send(`${key} - map not ready`);
return;
}
let area = reader.getAreaByRoomId(roomId);
let room = reader.getRoomById(roomId);
if (!area || !room) {
message.channel.send(`${key} - no location ID`);
return;
}
if (!element.renderArea) {
area = area.limit(roomId, 15);
if (element.settings == undefined) {
element.settings = {};
}
if (element.settings.areaName == undefined) {
element.settings.areaName = false;
}
}
async function render() {
let renderer = new Renderer(
null,
reader,
area,
reader.getColors(),
element.settings
);
renderer.renderPosition(roomId);
sharp(Buffer.from(element.renderArea ? renderer.exportSvg() : renderer.exportSvg(roomId, 10)))
.png()
.toBuffer()
.then((buffer) => {
message.channel.send({
content: (element.messageCreator || defaultMessageCreator)(key, area, room),
files: [{ attachment: buffer, name: `${key} - ${roomId}.png` }],
});
})
.catch(function (err) {
console.log(err);
});
}
render();
}
});
};
};