@furlow/builtins 0.1.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.
Files changed (46) hide show
  1. package/dist/afk/index.d.ts +21 -0
  2. package/dist/afk/index.js +195 -0
  3. package/dist/afk/index.js.map +1 -0
  4. package/dist/auto-responder/index.d.ts +21 -0
  5. package/dist/auto-responder/index.js +356 -0
  6. package/dist/auto-responder/index.js.map +1 -0
  7. package/dist/giveaways/index.d.ts +25 -0
  8. package/dist/giveaways/index.js +416 -0
  9. package/dist/giveaways/index.js.map +1 -0
  10. package/dist/index.d.ts +15 -0
  11. package/dist/index.js +5402 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/leveling/index.d.ts +46 -0
  14. package/dist/leveling/index.js +521 -0
  15. package/dist/leveling/index.js.map +1 -0
  16. package/dist/logging/index.d.ts +52 -0
  17. package/dist/logging/index.js +519 -0
  18. package/dist/logging/index.js.map +1 -0
  19. package/dist/moderation/index.d.ts +83 -0
  20. package/dist/moderation/index.js +221 -0
  21. package/dist/moderation/index.js.map +1 -0
  22. package/dist/music/index.d.ts +33 -0
  23. package/dist/music/index.js +414 -0
  24. package/dist/music/index.js.map +1 -0
  25. package/dist/polls/index.d.ts +21 -0
  26. package/dist/polls/index.js +395 -0
  27. package/dist/polls/index.js.map +1 -0
  28. package/dist/reaction-roles/index.d.ts +19 -0
  29. package/dist/reaction-roles/index.js +551 -0
  30. package/dist/reaction-roles/index.js.map +1 -0
  31. package/dist/reminders/index.d.ts +23 -0
  32. package/dist/reminders/index.js +224 -0
  33. package/dist/reminders/index.js.map +1 -0
  34. package/dist/starboard/index.d.ts +35 -0
  35. package/dist/starboard/index.js +401 -0
  36. package/dist/starboard/index.js.map +1 -0
  37. package/dist/tickets/index.d.ts +43 -0
  38. package/dist/tickets/index.js +614 -0
  39. package/dist/tickets/index.js.map +1 -0
  40. package/dist/utilities/index.d.ts +15 -0
  41. package/dist/utilities/index.js +299 -0
  42. package/dist/utilities/index.js.map +1 -0
  43. package/dist/welcome/index.d.ts +48 -0
  44. package/dist/welcome/index.js +302 -0
  45. package/dist/welcome/index.js.map +1 -0
  46. package/package.json +109 -0
@@ -0,0 +1,15 @@
1
+ import { FurlowSpec, CommandDefinition } from '@furlow/schema';
2
+
3
+ /**
4
+ * Utilities builtin module
5
+ * Common utility commands: serverinfo, userinfo, avatar, etc.
6
+ */
7
+
8
+ interface UtilitiesConfig {
9
+ /** Commands to enable/disable */
10
+ enabledCommands?: string[];
11
+ }
12
+ declare const utilitiesCommands: CommandDefinition[];
13
+ declare function getUtilitiesSpec(config?: UtilitiesConfig): Partial<FurlowSpec>;
14
+
15
+ export { type UtilitiesConfig, getUtilitiesSpec, utilitiesCommands };
@@ -0,0 +1,299 @@
1
+ // src/utilities/index.ts
2
+ var utilitiesCommands = [
3
+ {
4
+ name: "serverinfo",
5
+ description: "View server information",
6
+ actions: [
7
+ {
8
+ action: "set",
9
+ key: "boostLevel",
10
+ value: '${["None", "Level 1", "Level 2", "Level 3"][guild.premiumTier]}'
11
+ },
12
+ {
13
+ action: "set",
14
+ key: "verificationLevel",
15
+ value: '${["None", "Low", "Medium", "High", "Highest"][guild.verificationLevel]}'
16
+ },
17
+ {
18
+ action: "reply",
19
+ embed: {
20
+ title: "${guild.name}",
21
+ thumbnail: "${guild.iconURL({ size: 256 })}",
22
+ color: "#5865f2",
23
+ fields: [
24
+ { name: "Owner", value: "<@${guild.ownerId}>", inline: true },
25
+ { name: "Created", value: '${timestamp(guild.createdAt, "R")}', inline: true },
26
+ { name: "Members", value: "${guild.memberCount}", inline: true },
27
+ { name: "Channels", value: "${guild.channels.cache.size}", inline: true },
28
+ { name: "Roles", value: "${guild.roles.cache.size}", inline: true },
29
+ { name: "Emojis", value: "${guild.emojis.cache.size}", inline: true },
30
+ { name: "Boost Level", value: "${boostLevel}", inline: true },
31
+ { name: "Boosts", value: "${guild.premiumSubscriptionCount || 0}", inline: true },
32
+ { name: "Verification", value: "${verificationLevel}", inline: true }
33
+ ],
34
+ footer: { text: "ID: ${guild.id}" }
35
+ }
36
+ }
37
+ ]
38
+ },
39
+ {
40
+ name: "userinfo",
41
+ description: "View user information",
42
+ options: [
43
+ { name: "user", description: "User to view", type: "user", required: false }
44
+ ],
45
+ actions: [
46
+ {
47
+ action: "set",
48
+ key: "targetUser",
49
+ value: "${args.user || user}"
50
+ },
51
+ {
52
+ action: "set",
53
+ key: "targetMember",
54
+ value: "${guild.members.cache.get(targetUser.id)}"
55
+ },
56
+ {
57
+ action: "set",
58
+ key: "roles",
59
+ value: '${targetMember?.roles?.cache?.filter(r => r.id !== guild.id)?.sort((a, b) => b.position - a.position)?.map(r => r.toString())?.slice(0, 10)?.join(", ") || "None"}'
60
+ },
61
+ {
62
+ action: "reply",
63
+ embed: {
64
+ title: "${targetUser.tag}",
65
+ thumbnail: "${targetUser.avatarURL({ size: 256 })}",
66
+ color: '${targetMember?.displayHexColor || "#5865f2"}',
67
+ fields: [
68
+ { name: "Username", value: "${targetUser.username}", inline: true },
69
+ { name: "Nickname", value: '${targetMember?.nickname || "None"}', inline: true },
70
+ { name: "Bot", value: '${targetUser.bot ? "Yes" : "No"}', inline: true },
71
+ { name: "Created", value: '${timestamp(targetUser.createdAt, "R")}', inline: true },
72
+ { name: "Joined", value: '${targetMember?.joinedAt ? timestamp(targetMember.joinedAt, "R") : "N/A"}', inline: true },
73
+ { name: "Highest Role", value: '${targetMember?.roles?.highest?.toString() || "None"}', inline: true },
74
+ { name: "Roles (${targetMember?.roles?.cache?.size - 1 || 0})", value: "${roles}", inline: false }
75
+ ],
76
+ footer: { text: "ID: ${targetUser.id}" }
77
+ }
78
+ }
79
+ ]
80
+ },
81
+ {
82
+ name: "avatar",
83
+ description: "View user avatar",
84
+ options: [
85
+ { name: "user", description: "User to view", type: "user", required: false }
86
+ ],
87
+ actions: [
88
+ {
89
+ action: "set",
90
+ key: "targetUser",
91
+ value: "${args.user || user}"
92
+ },
93
+ {
94
+ action: "reply",
95
+ embed: {
96
+ title: "${targetUser.tag}'s Avatar",
97
+ image: "${targetUser.avatarURL({ size: 1024 }) || targetUser.defaultAvatarURL}",
98
+ color: "#5865f2",
99
+ description: '[PNG](${targetUser.avatarURL({ format: "png", size: 1024 })}) | [JPG](${targetUser.avatarURL({ format: "jpg", size: 1024 })}) | [WEBP](${targetUser.avatarURL({ format: "webp", size: 1024 })})'
100
+ }
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ name: "banner",
106
+ description: "View user banner",
107
+ options: [
108
+ { name: "user", description: "User to view", type: "user", required: false }
109
+ ],
110
+ actions: [
111
+ {
112
+ action: "set",
113
+ key: "targetUser",
114
+ value: "${args.user || user}"
115
+ },
116
+ {
117
+ action: "flow_if",
118
+ condition: "${!targetUser.bannerURL()}",
119
+ then: [
120
+ { action: "reply", content: "This user has no banner!", ephemeral: true },
121
+ { action: "abort" }
122
+ ]
123
+ },
124
+ {
125
+ action: "reply",
126
+ embed: {
127
+ title: "${targetUser.tag}'s Banner",
128
+ image: "${targetUser.bannerURL({ size: 1024 })}",
129
+ color: "#5865f2"
130
+ }
131
+ }
132
+ ]
133
+ },
134
+ {
135
+ name: "roleinfo",
136
+ description: "View role information",
137
+ options: [
138
+ { name: "role", description: "Role to view", type: "role", required: true }
139
+ ],
140
+ actions: [
141
+ {
142
+ action: "reply",
143
+ embed: {
144
+ title: "${args.role.name}",
145
+ color: "${args.role.hexColor}",
146
+ fields: [
147
+ { name: "Color", value: "${args.role.hexColor}", inline: true },
148
+ { name: "Position", value: "${args.role.position}", inline: true },
149
+ { name: "Members", value: "${args.role.members.size}", inline: true },
150
+ { name: "Hoisted", value: '${args.role.hoist ? "Yes" : "No"}', inline: true },
151
+ { name: "Mentionable", value: '${args.role.mentionable ? "Yes" : "No"}', inline: true },
152
+ { name: "Managed", value: '${args.role.managed ? "Yes" : "No"}', inline: true },
153
+ { name: "Created", value: '${timestamp(args.role.createdAt, "R")}', inline: true }
154
+ ],
155
+ footer: { text: "ID: ${args.role.id}" }
156
+ }
157
+ }
158
+ ]
159
+ },
160
+ {
161
+ name: "channelinfo",
162
+ description: "View channel information",
163
+ options: [
164
+ { name: "channel", description: "Channel to view", type: "channel", required: false }
165
+ ],
166
+ actions: [
167
+ {
168
+ action: "set",
169
+ key: "targetChannel",
170
+ value: "${args.channel || channel}"
171
+ },
172
+ {
173
+ action: "reply",
174
+ embed: {
175
+ title: "#${targetChannel.name}",
176
+ color: "#5865f2",
177
+ fields: [
178
+ { name: "Type", value: "${targetChannel.type}", inline: true },
179
+ { name: "Category", value: '${targetChannel.parent?.name || "None"}', inline: true },
180
+ { name: "Position", value: "${targetChannel.position}", inline: true },
181
+ { name: "NSFW", value: '${targetChannel.nsfw ? "Yes" : "No"}', inline: true },
182
+ { name: "Created", value: '${timestamp(targetChannel.createdAt, "R")}', inline: true },
183
+ { name: "Topic", value: '${targetChannel.topic || "None"}', inline: false }
184
+ ],
185
+ footer: { text: "ID: ${targetChannel.id}" }
186
+ }
187
+ }
188
+ ]
189
+ },
190
+ {
191
+ name: "ping",
192
+ description: "Check bot latency",
193
+ actions: [
194
+ {
195
+ action: "reply",
196
+ content: "Pong! Latency: ${client.ws.ping}ms"
197
+ }
198
+ ]
199
+ },
200
+ {
201
+ name: "invite",
202
+ description: "Get bot invite link",
203
+ actions: [
204
+ {
205
+ action: "reply",
206
+ embed: {
207
+ title: "Invite ${client.user.username}",
208
+ description: "[Click here to invite](https://discord.com/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands)",
209
+ color: "#5865f2"
210
+ },
211
+ ephemeral: true
212
+ }
213
+ ]
214
+ },
215
+ {
216
+ name: "membercount",
217
+ description: "View member count",
218
+ actions: [
219
+ {
220
+ action: "set",
221
+ key: "humans",
222
+ value: "${guild.members.cache.filter(m => !m.user.bot).size}"
223
+ },
224
+ {
225
+ action: "set",
226
+ key: "bots",
227
+ value: "${guild.members.cache.filter(m => m.user.bot).size}"
228
+ },
229
+ {
230
+ action: "reply",
231
+ embed: {
232
+ title: "Member Count",
233
+ color: "#5865f2",
234
+ fields: [
235
+ { name: "Total", value: "${guild.memberCount}", inline: true },
236
+ { name: "Humans", value: "${humans}", inline: true },
237
+ { name: "Bots", value: "${bots}", inline: true }
238
+ ]
239
+ }
240
+ }
241
+ ]
242
+ },
243
+ {
244
+ name: "emojis",
245
+ description: "List server emojis",
246
+ actions: [
247
+ {
248
+ action: "set",
249
+ key: "staticEmojis",
250
+ value: '${guild.emojis.cache.filter(e => !e.animated).map(e => e.toString()).slice(0, 50).join(" ")}'
251
+ },
252
+ {
253
+ action: "set",
254
+ key: "animatedEmojis",
255
+ value: '${guild.emojis.cache.filter(e => e.animated).map(e => e.toString()).slice(0, 50).join(" ")}'
256
+ },
257
+ {
258
+ action: "reply",
259
+ embed: {
260
+ title: "${guild.name} Emojis",
261
+ color: "#5865f2",
262
+ fields: [
263
+ { name: "Static (${guild.emojis.cache.filter(e => !e.animated).size})", value: '${staticEmojis || "None"}' },
264
+ { name: "Animated (${guild.emojis.cache.filter(e => e.animated).size})", value: '${animatedEmojis || "None"}' }
265
+ ]
266
+ }
267
+ }
268
+ ]
269
+ },
270
+ {
271
+ name: "roles",
272
+ description: "List server roles",
273
+ actions: [
274
+ {
275
+ action: "set",
276
+ key: "roleList",
277
+ value: '${guild.roles.cache.filter(r => r.id !== guild.id).sort((a, b) => b.position - a.position).map(r => r.toString()).slice(0, 40).join(", ")}'
278
+ },
279
+ {
280
+ action: "reply",
281
+ embed: {
282
+ title: "${guild.name} Roles (${guild.roles.cache.size - 1})",
283
+ description: "${roleList}",
284
+ color: "#5865f2"
285
+ }
286
+ }
287
+ ]
288
+ }
289
+ ];
290
+ function getUtilitiesSpec(config = {}) {
291
+ return {
292
+ commands: utilitiesCommands
293
+ };
294
+ }
295
+ export {
296
+ getUtilitiesSpec,
297
+ utilitiesCommands
298
+ };
299
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/index.ts"],"sourcesContent":["/**\n * Utilities builtin module\n * Common utility commands: serverinfo, userinfo, avatar, etc.\n */\n\nimport type { FurlowSpec, CommandDefinition } from '@furlow/schema';\n\nexport interface UtilitiesConfig {\n /** Commands to enable/disable */\n enabledCommands?: string[];\n}\n\nexport const utilitiesCommands: CommandDefinition[] = [\n {\n name: 'serverinfo',\n description: 'View server information',\n actions: [\n {\n action: 'set',\n key: 'boostLevel',\n value: '${[\"None\", \"Level 1\", \"Level 2\", \"Level 3\"][guild.premiumTier]}',\n },\n {\n action: 'set',\n key: 'verificationLevel',\n value: '${[\"None\", \"Low\", \"Medium\", \"High\", \"Highest\"][guild.verificationLevel]}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name}',\n thumbnail: '${guild.iconURL({ size: 256 })}',\n color: '#5865f2',\n fields: [\n { name: 'Owner', value: '<@${guild.ownerId}>', inline: true },\n { name: 'Created', value: '${timestamp(guild.createdAt, \"R\")}', inline: true },\n { name: 'Members', value: '${guild.memberCount}', inline: true },\n { name: 'Channels', value: '${guild.channels.cache.size}', inline: true },\n { name: 'Roles', value: '${guild.roles.cache.size}', inline: true },\n { name: 'Emojis', value: '${guild.emojis.cache.size}', inline: true },\n { name: 'Boost Level', value: '${boostLevel}', inline: true },\n { name: 'Boosts', value: '${guild.premiumSubscriptionCount || 0}', inline: true },\n { name: 'Verification', value: '${verificationLevel}', inline: true },\n ],\n footer: { text: 'ID: ${guild.id}' },\n },\n },\n ],\n },\n {\n name: 'userinfo',\n description: 'View user information',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'set',\n key: 'targetMember',\n value: '${guild.members.cache.get(targetUser.id)}',\n },\n {\n action: 'set',\n key: 'roles',\n value: '${targetMember?.roles?.cache?.filter(r => r.id !== guild.id)?.sort((a, b) => b.position - a.position)?.map(r => r.toString())?.slice(0, 10)?.join(\", \") || \"None\"}',\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}',\n thumbnail: '${targetUser.avatarURL({ size: 256 })}',\n color: '${targetMember?.displayHexColor || \"#5865f2\"}',\n fields: [\n { name: 'Username', value: '${targetUser.username}', inline: true },\n { name: 'Nickname', value: '${targetMember?.nickname || \"None\"}', inline: true },\n { name: 'Bot', value: '${targetUser.bot ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(targetUser.createdAt, \"R\")}', inline: true },\n { name: 'Joined', value: '${targetMember?.joinedAt ? timestamp(targetMember.joinedAt, \"R\") : \"N/A\"}', inline: true },\n { name: 'Highest Role', value: '${targetMember?.roles?.highest?.toString() || \"None\"}', inline: true },\n { name: 'Roles (${targetMember?.roles?.cache?.size - 1 || 0})', value: '${roles}', inline: false },\n ],\n footer: { text: 'ID: ${targetUser.id}' },\n },\n },\n ],\n },\n {\n name: 'avatar',\n description: 'View user avatar',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}\\'s Avatar',\n image: '${targetUser.avatarURL({ size: 1024 }) || targetUser.defaultAvatarURL}',\n color: '#5865f2',\n description: '[PNG](${targetUser.avatarURL({ format: \"png\", size: 1024 })}) | [JPG](${targetUser.avatarURL({ format: \"jpg\", size: 1024 })}) | [WEBP](${targetUser.avatarURL({ format: \"webp\", size: 1024 })})',\n },\n },\n ],\n },\n {\n name: 'banner',\n description: 'View user banner',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'flow_if',\n condition: '${!targetUser.bannerURL()}',\n then: [\n { action: 'reply', content: 'This user has no banner!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}\\'s Banner',\n image: '${targetUser.bannerURL({ size: 1024 })}',\n color: '#5865f2',\n },\n },\n ],\n },\n {\n name: 'roleinfo',\n description: 'View role information',\n options: [\n { name: 'role', description: 'Role to view', type: 'role', required: true },\n ],\n actions: [\n {\n action: 'reply',\n embed: {\n title: '${args.role.name}',\n color: '${args.role.hexColor}',\n fields: [\n { name: 'Color', value: '${args.role.hexColor}', inline: true },\n { name: 'Position', value: '${args.role.position}', inline: true },\n { name: 'Members', value: '${args.role.members.size}', inline: true },\n { name: 'Hoisted', value: '${args.role.hoist ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Mentionable', value: '${args.role.mentionable ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Managed', value: '${args.role.managed ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(args.role.createdAt, \"R\")}', inline: true },\n ],\n footer: { text: 'ID: ${args.role.id}' },\n },\n },\n ],\n },\n {\n name: 'channelinfo',\n description: 'View channel information',\n options: [\n { name: 'channel', description: 'Channel to view', type: 'channel', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetChannel',\n value: '${args.channel || channel}',\n },\n {\n action: 'reply',\n embed: {\n title: '#${targetChannel.name}',\n color: '#5865f2',\n fields: [\n { name: 'Type', value: '${targetChannel.type}', inline: true },\n { name: 'Category', value: '${targetChannel.parent?.name || \"None\"}', inline: true },\n { name: 'Position', value: '${targetChannel.position}', inline: true },\n { name: 'NSFW', value: '${targetChannel.nsfw ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(targetChannel.createdAt, \"R\")}', inline: true },\n { name: 'Topic', value: '${targetChannel.topic || \"None\"}', inline: false },\n ],\n footer: { text: 'ID: ${targetChannel.id}' },\n },\n },\n ],\n },\n {\n name: 'ping',\n description: 'Check bot latency',\n actions: [\n {\n action: 'reply',\n content: 'Pong! Latency: ${client.ws.ping}ms',\n },\n ],\n },\n {\n name: 'invite',\n description: 'Get bot invite link',\n actions: [\n {\n action: 'reply',\n embed: {\n title: 'Invite ${client.user.username}',\n description: '[Click here to invite](https://discord.com/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands)',\n color: '#5865f2',\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'membercount',\n description: 'View member count',\n actions: [\n {\n action: 'set',\n key: 'humans',\n value: '${guild.members.cache.filter(m => !m.user.bot).size}',\n },\n {\n action: 'set',\n key: 'bots',\n value: '${guild.members.cache.filter(m => m.user.bot).size}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Member Count',\n color: '#5865f2',\n fields: [\n { name: 'Total', value: '${guild.memberCount}', inline: true },\n { name: 'Humans', value: '${humans}', inline: true },\n { name: 'Bots', value: '${bots}', inline: true },\n ],\n },\n },\n ],\n },\n {\n name: 'emojis',\n description: 'List server emojis',\n actions: [\n {\n action: 'set',\n key: 'staticEmojis',\n value: '${guild.emojis.cache.filter(e => !e.animated).map(e => e.toString()).slice(0, 50).join(\" \")}',\n },\n {\n action: 'set',\n key: 'animatedEmojis',\n value: '${guild.emojis.cache.filter(e => e.animated).map(e => e.toString()).slice(0, 50).join(\" \")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Emojis',\n color: '#5865f2',\n fields: [\n { name: 'Static (${guild.emojis.cache.filter(e => !e.animated).size})', value: '${staticEmojis || \"None\"}' },\n { name: 'Animated (${guild.emojis.cache.filter(e => e.animated).size})', value: '${animatedEmojis || \"None\"}' },\n ],\n },\n },\n ],\n },\n {\n name: 'roles',\n description: 'List server roles',\n actions: [\n {\n action: 'set',\n key: 'roleList',\n value: '${guild.roles.cache.filter(r => r.id !== guild.id).sort((a, b) => b.position - a.position).map(r => r.toString()).slice(0, 40).join(\", \")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Roles (${guild.roles.cache.size - 1})',\n description: '${roleList}',\n color: '#5865f2',\n },\n },\n ],\n },\n];\n\nexport function getUtilitiesSpec(config: UtilitiesConfig = {}): Partial<FurlowSpec> {\n return {\n commands: utilitiesCommands,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,48 @@
1
+ import { FurlowSpec, CanvasGenerator, CommandDefinition, EventHandler } from '@furlow/schema';
2
+
3
+ /**
4
+ * Welcome builtin module
5
+ * Handles member join/leave messages, auto-role assignment, and welcome images
6
+ */
7
+
8
+ interface WelcomeConfig {
9
+ /** Channel to send welcome messages */
10
+ channel?: string;
11
+ /** Welcome message template */
12
+ message?: string;
13
+ /** Embed for welcome messages */
14
+ embed?: {
15
+ title?: string;
16
+ description?: string;
17
+ color?: string;
18
+ thumbnail?: string;
19
+ image?: string;
20
+ footer?: string;
21
+ };
22
+ /** Use welcome image */
23
+ useImage?: boolean;
24
+ /** Welcome image generator name */
25
+ imageGenerator?: string;
26
+ /** Roles to assign on join */
27
+ autoRoles?: string[];
28
+ /** Leave channel (defaults to welcome channel) */
29
+ leaveChannel?: string;
30
+ /** Leave message template */
31
+ leaveMessage?: string;
32
+ /** Leave embed */
33
+ leaveEmbed?: {
34
+ title?: string;
35
+ description?: string;
36
+ color?: string;
37
+ };
38
+ /** DM new members */
39
+ dmNewMembers?: boolean;
40
+ /** DM message */
41
+ dmMessage?: string;
42
+ }
43
+ declare const welcomeEventHandlers: EventHandler[];
44
+ declare const welcomeCommands: CommandDefinition[];
45
+ declare const welcomeCanvasGenerators: Record<string, CanvasGenerator>;
46
+ declare function getWelcomeSpec(config?: WelcomeConfig): Partial<FurlowSpec>;
47
+
48
+ export { type WelcomeConfig, getWelcomeSpec, welcomeCanvasGenerators, welcomeCommands, welcomeEventHandlers };