@helyx/module-reactionroles 1.0.15 → 1.0.17

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +37 -53
  3. package/dist/builder-interactions.d.ts +11 -0
  4. package/dist/builder-interactions.js +293 -0
  5. package/dist/builder-presentation.d.ts +30 -0
  6. package/dist/builder-presentation.js +343 -0
  7. package/dist/builder.d.ts +3 -0
  8. package/dist/builder.js +22 -16
  9. package/dist/cleanup-repository.d.ts +24 -0
  10. package/dist/cleanup-repository.js +118 -0
  11. package/dist/constants.d.ts +3 -0
  12. package/dist/constants.js +4 -1
  13. package/dist/health.d.ts +16 -0
  14. package/dist/health.js +85 -0
  15. package/dist/index.js +66 -1147
  16. package/dist/logging.d.ts +33 -0
  17. package/dist/logging.js +40 -0
  18. package/dist/managed-resource.d.ts +2 -0
  19. package/dist/managed-resource.js +72 -0
  20. package/dist/member-interactions.d.ts +27 -0
  21. package/dist/member-interactions.js +360 -0
  22. package/dist/module-lifecycle.d.ts +3 -0
  23. package/dist/module-lifecycle.js +48 -0
  24. package/dist/panel-cache.d.ts +30 -0
  25. package/dist/panel-cache.js +197 -0
  26. package/dist/panel-create.d.ts +10 -0
  27. package/dist/panel-create.js +80 -0
  28. package/dist/panel-lifecycle.d.ts +47 -0
  29. package/dist/panel-lifecycle.js +272 -0
  30. package/dist/panel-managed.d.ts +14 -0
  31. package/dist/panel-managed.js +27 -0
  32. package/dist/panel-service.d.ts +13 -36
  33. package/dist/panel-service.js +48 -722
  34. package/dist/panel-support.d.ts +35 -0
  35. package/dist/panel-support.js +291 -0
  36. package/dist/permissions.d.ts +2 -0
  37. package/dist/permissions.js +8 -0
  38. package/dist/privacy.d.ts +5 -0
  39. package/dist/privacy.js +12 -0
  40. package/dist/record-mapping.d.ts +28 -0
  41. package/dist/record-mapping.js +161 -0
  42. package/dist/record-schema.d.ts +203 -0
  43. package/dist/record-schema.js +137 -0
  44. package/dist/records.d.ts +9 -201
  45. package/dist/records.js +32 -383
  46. package/dist/runtime-state.d.ts +9 -0
  47. package/dist/runtime-state.js +30 -0
  48. package/manifest.json +1 -1
  49. package/package.json +2 -2
@@ -0,0 +1,203 @@
1
+ import type { CanonicalEmoji, PanelButtonStyle, PanelDraft } from "./builder.js";
2
+ export declare const reactionRoleRecords: {
3
+ readonly panels: {
4
+ readonly table: "reactionroles_panels";
5
+ readonly fields: {
6
+ readonly panel_id: {
7
+ readonly type: "string";
8
+ };
9
+ readonly guild_id: {
10
+ readonly type: "string";
11
+ };
12
+ readonly channel_id: {
13
+ readonly type: "string";
14
+ };
15
+ readonly message_id: {
16
+ readonly type: "string";
17
+ readonly optional: true;
18
+ };
19
+ readonly title: {
20
+ readonly type: "string";
21
+ };
22
+ readonly message_body: {
23
+ readonly type: "string";
24
+ };
25
+ readonly message_style: {
26
+ readonly type: "string";
27
+ };
28
+ readonly control_type: {
29
+ readonly type: "string";
30
+ };
31
+ readonly selection_mode: {
32
+ readonly type: "string";
33
+ };
34
+ readonly persistent_reactions: {
35
+ readonly type: "boolean";
36
+ };
37
+ readonly embed_colour: {
38
+ readonly type: "number";
39
+ readonly optional: true;
40
+ };
41
+ readonly dropdown_placeholder: {
42
+ readonly type: "string";
43
+ readonly optional: true;
44
+ };
45
+ readonly status: {
46
+ readonly type: "string";
47
+ };
48
+ readonly revision: {
49
+ readonly type: "number";
50
+ };
51
+ readonly created_by_user_id: {
52
+ readonly type: "string";
53
+ readonly optional: true;
54
+ };
55
+ readonly updated_by_user_id: {
56
+ readonly type: "string";
57
+ readonly optional: true;
58
+ };
59
+ readonly created_at: {
60
+ readonly type: "date";
61
+ };
62
+ readonly updated_at: {
63
+ readonly type: "date";
64
+ };
65
+ };
66
+ readonly uniqueKeys: readonly [readonly ["panel_id"], readonly ["guild_id", "message_id"]];
67
+ readonly readableFields: readonly ["panel_id", "guild_id", "channel_id", "message_id", "title", "message_body", "message_style", "control_type", "selection_mode", "persistent_reactions", "embed_colour", "dropdown_placeholder", "status", "revision", "created_by_user_id", "updated_by_user_id", "created_at", "updated_at"];
68
+ readonly writableFields: readonly ["channel_id", "message_id", "title", "message_body", "message_style", "control_type", "selection_mode", "persistent_reactions", "embed_colour", "dropdown_placeholder", "status", "revision", "updated_by_user_id", "updated_at"];
69
+ readonly orderKeys: readonly [readonly ["updated_at", "panel_id"]];
70
+ readonly groupableFields: readonly ["status"];
71
+ };
72
+ readonly entries: {
73
+ readonly table: "reactionroles_entries";
74
+ readonly fields: {
75
+ readonly entry_id: {
76
+ readonly type: "string";
77
+ };
78
+ readonly panel_id: {
79
+ readonly type: "string";
80
+ };
81
+ readonly position: {
82
+ readonly type: "number";
83
+ };
84
+ readonly role_id: {
85
+ readonly type: "string";
86
+ };
87
+ readonly nameplate: {
88
+ readonly type: "string";
89
+ };
90
+ readonly emoji_kind: {
91
+ readonly type: "string";
92
+ readonly optional: true;
93
+ };
94
+ readonly emoji_name: {
95
+ readonly type: "string";
96
+ readonly optional: true;
97
+ };
98
+ readonly emoji_id: {
99
+ readonly type: "string";
100
+ readonly optional: true;
101
+ };
102
+ readonly emoji_animated: {
103
+ readonly type: "boolean";
104
+ readonly optional: true;
105
+ };
106
+ readonly button_style: {
107
+ readonly type: "string";
108
+ readonly optional: true;
109
+ };
110
+ readonly created_at: {
111
+ readonly type: "date";
112
+ };
113
+ readonly updated_at: {
114
+ readonly type: "date";
115
+ };
116
+ };
117
+ readonly uniqueKeys: readonly [readonly ["entry_id"], readonly ["panel_id", "position"], readonly ["panel_id", "role_id"]];
118
+ readonly readableFields: readonly ["entry_id", "panel_id", "position", "role_id", "nameplate", "emoji_kind", "emoji_name", "emoji_id", "emoji_animated", "button_style", "created_at", "updated_at"];
119
+ readonly orderKeys: readonly [readonly ["position", "entry_id"]];
120
+ };
121
+ readonly message_cleanup: {
122
+ readonly table: "reactionroles_message_cleanup";
123
+ readonly fields: {
124
+ readonly cleanup_id: {
125
+ readonly type: "string";
126
+ };
127
+ readonly guild_id: {
128
+ readonly type: "string";
129
+ };
130
+ readonly panel_id: {
131
+ readonly type: "string";
132
+ };
133
+ readonly channel_id: {
134
+ readonly type: "string";
135
+ };
136
+ readonly message_id: {
137
+ readonly type: "string";
138
+ };
139
+ readonly reason: {
140
+ readonly type: "string";
141
+ };
142
+ readonly attempts: {
143
+ readonly type: "number";
144
+ };
145
+ readonly next_attempt_at: {
146
+ readonly type: "date";
147
+ };
148
+ readonly created_at: {
149
+ readonly type: "date";
150
+ };
151
+ readonly completed_at: {
152
+ readonly type: "date";
153
+ readonly optional: true;
154
+ };
155
+ };
156
+ readonly uniqueKeys: readonly [readonly ["cleanup_id"], readonly ["guild_id", "channel_id", "message_id", "reason"]];
157
+ readonly readableFields: readonly ["cleanup_id", "guild_id", "panel_id", "channel_id", "message_id", "reason", "attempts", "next_attempt_at", "created_at", "completed_at"];
158
+ readonly writableFields: readonly ["attempts", "next_attempt_at", "completed_at"];
159
+ readonly orderKeys: readonly [readonly ["next_attempt_at", "cleanup_id"]];
160
+ };
161
+ };
162
+ export type PanelStatus = "pending" | "active" | "disabled" | "message_missing" | "needs_attention" | "cleanup_pending" | "deleting";
163
+ export interface StoredPanel extends PanelDraft {
164
+ panelId: string;
165
+ guildId: string;
166
+ messageId: string | null;
167
+ status: PanelStatus;
168
+ revision: number;
169
+ createdByUserId: string | null;
170
+ updatedByUserId: string | null;
171
+ createdAt: Date;
172
+ updatedAt: Date;
173
+ }
174
+ export interface StoredPanelEntry {
175
+ entryId: string;
176
+ panelId: string;
177
+ position: number;
178
+ roleId: string;
179
+ nameplate: string;
180
+ emoji: CanonicalEmoji | null;
181
+ buttonStyle: PanelButtonStyle | null;
182
+ createdAt: Date;
183
+ updatedAt: Date;
184
+ }
185
+ export declare const panelSelect: readonly ["panel_id", "guild_id", "channel_id", "message_id", "title", "message_body", "message_style", "control_type", "selection_mode", "persistent_reactions", "embed_colour", "dropdown_placeholder", "status", "revision", "created_by_user_id", "updated_by_user_id", "created_at", "updated_at"];
186
+ export declare const entrySelect: readonly ["entry_id", "panel_id", "position", "role_id", "nameplate", "emoji_kind", "emoji_name", "emoji_id", "emoji_animated", "button_style", "created_at", "updated_at"];
187
+ export declare const cleanupSelect: readonly ["cleanup_id", "guild_id", "panel_id", "channel_id", "message_id", "reason", "attempts", "next_attempt_at", "created_at", "completed_at"];
188
+ export interface PendingMessageCleanup {
189
+ cleanupId: string;
190
+ guildId: string;
191
+ panelId: string;
192
+ channelId: string;
193
+ messageId: string;
194
+ reason: "replacement" | "rollback" | "delete";
195
+ attempts: number;
196
+ nextAttemptAt: Date;
197
+ }
198
+ export interface PanelReference {
199
+ panelId: string;
200
+ title: string;
201
+ status: PanelStatus;
202
+ updatedAt: Date;
203
+ }
@@ -0,0 +1,137 @@
1
+ export const reactionRoleRecords = {
2
+ panels: {
3
+ table: "reactionroles_panels",
4
+ fields: {
5
+ panel_id: { type: "string" },
6
+ guild_id: { type: "string" },
7
+ channel_id: { type: "string" },
8
+ message_id: { type: "string", optional: true },
9
+ title: { type: "string" },
10
+ message_body: { type: "string" },
11
+ message_style: { type: "string" },
12
+ control_type: { type: "string" },
13
+ selection_mode: { type: "string" },
14
+ persistent_reactions: { type: "boolean" },
15
+ embed_colour: { type: "number", optional: true },
16
+ dropdown_placeholder: { type: "string", optional: true },
17
+ status: { type: "string" },
18
+ revision: { type: "number" },
19
+ created_by_user_id: { type: "string", optional: true },
20
+ updated_by_user_id: { type: "string", optional: true },
21
+ created_at: { type: "date" },
22
+ updated_at: { type: "date" },
23
+ },
24
+ uniqueKeys: [["panel_id"], ["guild_id", "message_id"]],
25
+ readableFields: [
26
+ "panel_id",
27
+ "guild_id",
28
+ "channel_id",
29
+ "message_id",
30
+ "title",
31
+ "message_body",
32
+ "message_style",
33
+ "control_type",
34
+ "selection_mode",
35
+ "persistent_reactions",
36
+ "embed_colour",
37
+ "dropdown_placeholder",
38
+ "status",
39
+ "revision",
40
+ "created_by_user_id",
41
+ "updated_by_user_id",
42
+ "created_at",
43
+ "updated_at",
44
+ ],
45
+ writableFields: [
46
+ "channel_id",
47
+ "message_id",
48
+ "title",
49
+ "message_body",
50
+ "message_style",
51
+ "control_type",
52
+ "selection_mode",
53
+ "persistent_reactions",
54
+ "embed_colour",
55
+ "dropdown_placeholder",
56
+ "status",
57
+ "revision",
58
+ "updated_by_user_id",
59
+ "updated_at",
60
+ ],
61
+ orderKeys: [["updated_at", "panel_id"]],
62
+ groupableFields: ["status"],
63
+ },
64
+ entries: {
65
+ table: "reactionroles_entries",
66
+ fields: {
67
+ entry_id: { type: "string" },
68
+ panel_id: { type: "string" },
69
+ position: { type: "number" },
70
+ role_id: { type: "string" },
71
+ nameplate: { type: "string" },
72
+ emoji_kind: { type: "string", optional: true },
73
+ emoji_name: { type: "string", optional: true },
74
+ emoji_id: { type: "string", optional: true },
75
+ emoji_animated: { type: "boolean", optional: true },
76
+ button_style: { type: "string", optional: true },
77
+ created_at: { type: "date" },
78
+ updated_at: { type: "date" },
79
+ },
80
+ uniqueKeys: [
81
+ ["entry_id"],
82
+ ["panel_id", "position"],
83
+ ["panel_id", "role_id"],
84
+ ],
85
+ readableFields: [
86
+ "entry_id",
87
+ "panel_id",
88
+ "position",
89
+ "role_id",
90
+ "nameplate",
91
+ "emoji_kind",
92
+ "emoji_name",
93
+ "emoji_id",
94
+ "emoji_animated",
95
+ "button_style",
96
+ "created_at",
97
+ "updated_at",
98
+ ],
99
+ orderKeys: [["position", "entry_id"]],
100
+ },
101
+ message_cleanup: {
102
+ table: "reactionroles_message_cleanup",
103
+ fields: {
104
+ cleanup_id: { type: "string" },
105
+ guild_id: { type: "string" },
106
+ panel_id: { type: "string" },
107
+ channel_id: { type: "string" },
108
+ message_id: { type: "string" },
109
+ reason: { type: "string" },
110
+ attempts: { type: "number" },
111
+ next_attempt_at: { type: "date" },
112
+ created_at: { type: "date" },
113
+ completed_at: { type: "date", optional: true },
114
+ },
115
+ uniqueKeys: [
116
+ ["cleanup_id"],
117
+ ["guild_id", "channel_id", "message_id", "reason"],
118
+ ],
119
+ readableFields: [
120
+ "cleanup_id",
121
+ "guild_id",
122
+ "panel_id",
123
+ "channel_id",
124
+ "message_id",
125
+ "reason",
126
+ "attempts",
127
+ "next_attempt_at",
128
+ "created_at",
129
+ "completed_at",
130
+ ],
131
+ writableFields: ["attempts", "next_attempt_at", "completed_at"],
132
+ orderKeys: [["next_attempt_at", "cleanup_id"]],
133
+ },
134
+ };
135
+ export const panelSelect = reactionRoleRecords.panels.readableFields;
136
+ export const entrySelect = reactionRoleRecords.entries.readableFields;
137
+ export const cleanupSelect = reactionRoleRecords.message_cleanup.readableFields;
package/dist/records.d.ts CHANGED
@@ -1,204 +1,8 @@
1
1
  import type { ModuleRecordService, ModuleRecordWriteValue } from "@helyx/sdk";
2
- import type { CanonicalEmoji, PanelButtonStyle, PanelControlType, PanelDraft, PanelMessageStyle, PanelSelectionMode } from "./builder.js";
3
- export declare const reactionRoleRecords: {
4
- readonly panels: {
5
- readonly table: "reactionroles_panels";
6
- readonly fields: {
7
- readonly panel_id: {
8
- readonly type: "string";
9
- };
10
- readonly guild_id: {
11
- readonly type: "string";
12
- };
13
- readonly channel_id: {
14
- readonly type: "string";
15
- };
16
- readonly message_id: {
17
- readonly type: "string";
18
- readonly optional: true;
19
- };
20
- readonly title: {
21
- readonly type: "string";
22
- };
23
- readonly message_body: {
24
- readonly type: "string";
25
- };
26
- readonly message_style: {
27
- readonly type: "string";
28
- };
29
- readonly control_type: {
30
- readonly type: "string";
31
- };
32
- readonly selection_mode: {
33
- readonly type: "string";
34
- };
35
- readonly persistent_reactions: {
36
- readonly type: "boolean";
37
- };
38
- readonly embed_colour: {
39
- readonly type: "number";
40
- readonly optional: true;
41
- };
42
- readonly dropdown_placeholder: {
43
- readonly type: "string";
44
- readonly optional: true;
45
- };
46
- readonly status: {
47
- readonly type: "string";
48
- };
49
- readonly revision: {
50
- readonly type: "number";
51
- };
52
- readonly created_by_user_id: {
53
- readonly type: "string";
54
- readonly optional: true;
55
- };
56
- readonly updated_by_user_id: {
57
- readonly type: "string";
58
- readonly optional: true;
59
- };
60
- readonly created_at: {
61
- readonly type: "date";
62
- };
63
- readonly updated_at: {
64
- readonly type: "date";
65
- };
66
- };
67
- readonly uniqueKeys: readonly [readonly ["panel_id"], readonly ["guild_id", "message_id"]];
68
- readonly readableFields: readonly ["panel_id", "guild_id", "channel_id", "message_id", "title", "message_body", "message_style", "control_type", "selection_mode", "persistent_reactions", "embed_colour", "dropdown_placeholder", "status", "revision", "created_by_user_id", "updated_by_user_id", "created_at", "updated_at"];
69
- readonly writableFields: readonly ["channel_id", "message_id", "title", "message_body", "message_style", "control_type", "selection_mode", "persistent_reactions", "embed_colour", "dropdown_placeholder", "status", "revision", "updated_by_user_id", "updated_at"];
70
- readonly orderKeys: readonly [readonly ["updated_at", "panel_id"]];
71
- readonly groupableFields: readonly ["status"];
72
- };
73
- readonly entries: {
74
- readonly table: "reactionroles_entries";
75
- readonly fields: {
76
- readonly entry_id: {
77
- readonly type: "string";
78
- };
79
- readonly panel_id: {
80
- readonly type: "string";
81
- };
82
- readonly position: {
83
- readonly type: "number";
84
- };
85
- readonly role_id: {
86
- readonly type: "string";
87
- };
88
- readonly nameplate: {
89
- readonly type: "string";
90
- };
91
- readonly emoji_kind: {
92
- readonly type: "string";
93
- readonly optional: true;
94
- };
95
- readonly emoji_name: {
96
- readonly type: "string";
97
- readonly optional: true;
98
- };
99
- readonly emoji_id: {
100
- readonly type: "string";
101
- readonly optional: true;
102
- };
103
- readonly emoji_animated: {
104
- readonly type: "boolean";
105
- readonly optional: true;
106
- };
107
- readonly button_style: {
108
- readonly type: "string";
109
- readonly optional: true;
110
- };
111
- readonly created_at: {
112
- readonly type: "date";
113
- };
114
- readonly updated_at: {
115
- readonly type: "date";
116
- };
117
- };
118
- readonly uniqueKeys: readonly [readonly ["entry_id"], readonly ["panel_id", "position"], readonly ["panel_id", "role_id"]];
119
- readonly readableFields: readonly ["entry_id", "panel_id", "position", "role_id", "nameplate", "emoji_kind", "emoji_name", "emoji_id", "emoji_animated", "button_style", "created_at", "updated_at"];
120
- readonly orderKeys: readonly [readonly ["position", "entry_id"]];
121
- };
122
- readonly message_cleanup: {
123
- readonly table: "reactionroles_message_cleanup";
124
- readonly fields: {
125
- readonly cleanup_id: {
126
- readonly type: "string";
127
- };
128
- readonly guild_id: {
129
- readonly type: "string";
130
- };
131
- readonly panel_id: {
132
- readonly type: "string";
133
- };
134
- readonly channel_id: {
135
- readonly type: "string";
136
- };
137
- readonly message_id: {
138
- readonly type: "string";
139
- };
140
- readonly reason: {
141
- readonly type: "string";
142
- };
143
- readonly attempts: {
144
- readonly type: "number";
145
- };
146
- readonly next_attempt_at: {
147
- readonly type: "date";
148
- };
149
- readonly created_at: {
150
- readonly type: "date";
151
- };
152
- readonly completed_at: {
153
- readonly type: "date";
154
- readonly optional: true;
155
- };
156
- };
157
- readonly uniqueKeys: readonly [readonly ["cleanup_id"], readonly ["guild_id", "channel_id", "message_id", "reason"]];
158
- readonly readableFields: readonly ["cleanup_id", "guild_id", "panel_id", "channel_id", "message_id", "reason", "attempts", "next_attempt_at", "created_at", "completed_at"];
159
- readonly writableFields: readonly ["attempts", "next_attempt_at", "completed_at"];
160
- readonly orderKeys: readonly [readonly ["next_attempt_at", "cleanup_id"]];
161
- };
162
- };
163
- export type PanelStatus = "pending" | "active" | "disabled" | "message_missing" | "needs_attention" | "cleanup_pending" | "deleting";
164
- export interface StoredPanel extends PanelDraft {
165
- panelId: string;
166
- guildId: string;
167
- messageId: string | null;
168
- status: PanelStatus;
169
- revision: number;
170
- createdByUserId: string | null;
171
- updatedByUserId: string | null;
172
- createdAt: Date;
173
- updatedAt: Date;
174
- }
175
- export interface StoredPanelEntry {
176
- entryId: string;
177
- panelId: string;
178
- position: number;
179
- roleId: string;
180
- nameplate: string;
181
- emoji: CanonicalEmoji | null;
182
- buttonStyle: PanelButtonStyle | null;
183
- createdAt: Date;
184
- updatedAt: Date;
185
- }
186
- export interface PendingMessageCleanup {
187
- cleanupId: string;
188
- guildId: string;
189
- panelId: string;
190
- channelId: string;
191
- messageId: string;
192
- reason: "replacement" | "rollback" | "delete";
193
- attempts: number;
194
- nextAttemptAt: Date;
195
- }
196
- export interface PanelReference {
197
- panelId: string;
198
- title: string;
199
- status: PanelStatus;
200
- updatedAt: Date;
201
- }
2
+ import type { CanonicalEmoji, PanelButtonStyle, PanelDraft } from "./builder.js";
3
+ import type { PanelReference, PanelStatus, PendingMessageCleanup, StoredPanel } from "./record-schema.js";
4
+ export { reactionRoleRecords, type PanelReference, type PanelStatus, type PendingMessageCleanup, type StoredPanel, type StoredPanelEntry, } from "./record-schema.js";
5
+ export type { PanelControlType, PanelMessageStyle, PanelSelectionMode, } from "./builder.js";
202
6
  export declare class ReactionRolePanelRepository {
203
7
  #private;
204
8
  private readonly records;
@@ -281,8 +85,12 @@ export declare class ReactionRolePanelRepository {
281
85
  now?: Date;
282
86
  }): Promise<boolean>;
283
87
  listPendingCleanup(limit?: number): Promise<readonly PendingMessageCleanup[]>;
88
+ listPendingCleanupPage(limit?: number, cursor?: readonly ModuleRecordWriteValue[]): Promise<{
89
+ items: readonly PendingMessageCleanup[];
90
+ nextCursor: readonly ModuleRecordWriteValue[] | null;
91
+ }>;
92
+ findPendingCleanup(cleanupId: string): Promise<PendingMessageCleanup | null>;
284
93
  claimCleanup(cleanup: PendingMessageCleanup, now?: Date): Promise<PendingMessageCleanup | null>;
285
94
  completeCleanup(cleanup: PendingMessageCleanup, now?: Date): Promise<boolean>;
286
95
  pendingCleanupCount(panelId: string): Promise<number>;
287
96
  }
288
- export type { PanelControlType, PanelMessageStyle, PanelSelectionMode };