discord-mudlet-map 0.8.0 → 0.9.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.
package/dist/index.d.ts CHANGED
@@ -3,5 +3,6 @@ export * as LocationResolvers from "./location-resolvers.js";
3
3
  export * as MapProviders from "./map-providers.js";
4
4
  export * as SearchFunctions from "./search-functions.js";
5
5
  export { prepareMap } from "./prepare-map.js";
6
+ export { renderLocation, type LocationReply } from "./message-create.js";
6
7
  export type { MapConfig, MapConfigEntry, MapProvider, LocationExtractor, MessageCreator, RendererOptions, } from "./types.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzE,YAAY,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -3,4 +3,5 @@ export * as LocationResolvers from "./location-resolvers.js";
3
3
  export * as MapProviders from "./map-providers.js";
4
4
  export * as SearchFunctions from "./search-functions.js";
5
5
  export { prepareMap } from "./prepare-map.js";
6
+ export { renderLocation } from "./message-create.js";
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAsB,MAAM,qBAAqB,CAAC"}
@@ -1,4 +1,22 @@
1
1
  import type { Message } from "discord.js";
2
- import type { MapConfig } from "./types.js";
2
+ import type { MapConfigEntry, MapConfig } from "./types.js";
3
+ /** What a location turns into: a reply to send, or `null` when there is nothing to send. */
4
+ export type LocationReply = string | {
5
+ content: string;
6
+ files?: {
7
+ attachment: Buffer;
8
+ name: string;
9
+ }[];
10
+ } | null;
11
+ /**
12
+ * Renders one room of one configured map into a reply, independent of how it
13
+ * was asked for — a message matched by `locationExtractor`, or a slash command
14
+ * that already holds the room id.
15
+ *
16
+ * A plain string is an explanation (map not ready, unknown room); an object is
17
+ * the reply proper. `null` means the entry cannot answer at all (no reader yet,
18
+ * or the export came back empty), and the caller stays silent as before.
19
+ */
20
+ export declare function renderLocation(key: string, entry: MapConfigEntry, roomId: number): LocationReply;
3
21
  export default function mapCommand(config: MapConfig): (message: Message) => Promise<void>;
4
22
  //# sourceMappingURL=message-create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-create.d.ts","sourceRoot":"","sources":["../src/message-create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,YAAY,CAAC;AAKlE,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAAM,EAAE,SAAS,IACpC,SAAS,OAAO,mBAoF/B"}
1
+ {"version":3,"file":"message-create.d.ts","sourceRoot":"","sources":["../src/message-create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAwB,MAAM,YAAY,CAAC;AAKlF,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GACrB,MAAM,GACN;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GACnE,IAAI,CAAC;AAET;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,MAAM,GACb,aAAa,CA0Cf;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAAM,EAAE,SAAS,IACpC,SAAS,OAAO,mBAoB/B"}
@@ -1,5 +1,55 @@
1
1
  import { PngBytesExporter } from "mudlet-map-renderer";
2
2
  const defaultMessageCreator = (key, area) => `${key} - ${area.areaName}`;
3
+ /**
4
+ * Renders one room of one configured map into a reply, independent of how it
5
+ * was asked for — a message matched by `locationExtractor`, or a slash command
6
+ * that already holds the room id.
7
+ *
8
+ * A plain string is an explanation (map not ready, unknown room); an object is
9
+ * the reply proper. `null` means the entry cannot answer at all (no reader yet,
10
+ * or the export came back empty), and the caller stays silent as before.
11
+ */
12
+ export function renderLocation(key, entry, roomId) {
13
+ const reader = entry.reader;
14
+ if (!reader)
15
+ return null;
16
+ const renderArea = entry.renderArea ?? false;
17
+ const textOnly = !entry.provider && !entry.mapRenderer;
18
+ if (!entry.mapRenderer && !textOnly)
19
+ return `${key} - map not ready`;
20
+ let room;
21
+ let area;
22
+ try {
23
+ room = reader.getRoom(roomId);
24
+ area = reader.getArea(room.area);
25
+ }
26
+ catch {
27
+ return `${key} - no location ID`;
28
+ }
29
+ if (!room || !area)
30
+ return `${key} - no location ID`;
31
+ const areaInfo = { areaName: area.getAreaName(), areaId: area.getAreaId() };
32
+ const content = (entry.messageCreator ?? defaultMessageCreator)(key, areaInfo, room);
33
+ if (textOnly)
34
+ return { content };
35
+ const renderer = entry.mapRenderer;
36
+ renderer.drawArea(room.area, room.z);
37
+ renderer.setPosition(roomId, true);
38
+ const bytes = renderer.export(new PngBytesExporter({
39
+ width: 1200,
40
+ height: 1200,
41
+ roomId: renderArea ? undefined : roomId,
42
+ padding: renderArea ? 3 : 10,
43
+ }));
44
+ if (!bytes) {
45
+ console.log(`${key} - PNG export returned empty buffer`);
46
+ return null;
47
+ }
48
+ return {
49
+ content,
50
+ files: [{ attachment: Buffer.from(bytes), name: `${key} - ${roomId}.png` }],
51
+ };
52
+ }
3
53
  export default function mapCommand(config) {
4
54
  return async (message) => {
5
55
  const channel = message.channel;
@@ -7,70 +57,16 @@ export default function mapCommand(config) {
7
57
  return;
8
58
  for (const key of Object.keys(config)) {
9
59
  const element = config[key];
10
- element.renderArea = element.renderArea ?? false;
11
60
  const reader = element.reader;
12
61
  if (!reader)
13
62
  continue;
14
63
  const extracted = element.locationExtractor(message.content, reader);
15
64
  if (!extracted)
16
65
  continue;
17
- const textOnly = !element.provider && !element.mapRenderer;
18
- if (!element.mapRenderer && !textOnly) {
19
- await channel.send(`${key} - map not ready`);
20
- continue;
21
- }
22
- const roomId = Number(extracted);
23
- let room;
24
- let area;
25
- try {
26
- room = reader.getRoom(roomId);
27
- area = reader.getArea(room.area);
28
- }
29
- catch {
30
- await channel.send(`${key} - no location ID`);
31
- continue;
32
- }
33
- if (!room || !area) {
34
- await channel.send(`${key} - no location ID`);
35
- continue;
36
- }
37
- const areaInfo = {
38
- areaName: area.getAreaName(),
39
- areaId: area.getAreaId(),
40
- };
41
- const content = (element.messageCreator ?? defaultMessageCreator)(key, areaInfo, room);
42
- if (textOnly) {
43
- try {
44
- await channel.send({ content });
45
- }
46
- catch (err) {
47
- console.log(err);
48
- }
49
- continue;
50
- }
51
66
  try {
52
- const renderer = element.mapRenderer;
53
- renderer.drawArea(room.area, room.z);
54
- renderer.setPosition(roomId, true);
55
- const bytes = renderer.export(new PngBytesExporter({
56
- width: 1200,
57
- height: 1200,
58
- roomId: element.renderArea ? undefined : roomId,
59
- padding: element.renderArea ? 3 : 10
60
- }));
61
- if (!bytes) {
62
- console.log(`${key} - PNG export returned empty buffer`);
63
- continue;
64
- }
65
- await channel.send({
66
- content,
67
- files: [
68
- {
69
- attachment: Buffer.from(bytes),
70
- name: `${key} - ${roomId}.png`,
71
- },
72
- ],
73
- });
67
+ const reply = renderLocation(key, element, Number(extracted));
68
+ if (reply !== null)
69
+ await channel.send(reply);
74
70
  }
75
71
  catch (err) {
76
72
  console.log(err);
@@ -1 +1 @@
1
- {"version":3,"file":"message-create.js","sourceRoot":"","sources":["../src/message-create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-create.js","sourceRoot":"","sources":["../src/message-create.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discord-mudlet-map",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",