@futdevpro/nts-dynamo 1.14.24 → 1.14.26

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 (132) hide show
  1. package/build/_modules/ai/_services/ai-provider.service-base.d.ts +1 -1
  2. package/build/_modules/ai/_services/ai-provider.service-base.d.ts.map +1 -1
  3. package/build/_modules/ai/_services/oai-to-ai-adapter.service.d.ts +39 -0
  4. package/build/_modules/ai/_services/oai-to-ai-adapter.service.d.ts.map +1 -0
  5. package/build/_modules/ai/_services/oai-to-ai-adapter.service.js +218 -0
  6. package/build/_modules/ai/_services/oai-to-ai-adapter.service.js.map +1 -0
  7. package/build/_modules/assistant/_services/ass-io.control-service.d.ts +4 -3
  8. package/build/_modules/assistant/_services/ass-io.control-service.d.ts.map +1 -1
  9. package/build/_modules/assistant/_services/ass-io.control-service.js +6 -6
  10. package/build/_modules/assistant/_services/ass-io.control-service.js.map +1 -1
  11. package/build/_modules/assistant/_services/ass-main.control-service.d.ts +2 -2
  12. package/build/_modules/assistant/_services/ass-main.control-service.d.ts.map +1 -1
  13. package/build/_modules/assistant/_services/ass.service-base.d.ts +6 -4
  14. package/build/_modules/assistant/_services/ass.service-base.d.ts.map +1 -1
  15. package/build/_modules/assistant/_services/ass.service-base.js +6 -4
  16. package/build/_modules/assistant/_services/ass.service-base.js.map +1 -1
  17. package/build/_modules/bot/_collections/bot-operations.util.d.ts +13 -13
  18. package/build/_modules/bot/_collections/bot-operations.util.d.ts.map +1 -1
  19. package/build/_modules/bot/_collections/bot-operations.util.js.map +1 -1
  20. package/build/_modules/bot/_enums/bot-message-provider.enum.d.ts +8 -0
  21. package/build/_modules/bot/_enums/bot-message-provider.enum.d.ts.map +1 -0
  22. package/build/_modules/bot/_enums/bot-message-provider.enum.js +12 -0
  23. package/build/_modules/bot/_enums/bot-message-provider.enum.js.map +1 -0
  24. package/build/_modules/bot/_models/bot-global-settings.interface.d.ts +7 -0
  25. package/build/_modules/bot/_models/bot-global-settings.interface.d.ts.map +1 -1
  26. package/build/_modules/bot/_models/bot-message-provider.interface.d.ts +68 -0
  27. package/build/_modules/bot/_models/bot-message-provider.interface.d.ts.map +1 -0
  28. package/build/_modules/bot/_models/bot-message-provider.interface.js +3 -0
  29. package/build/_modules/bot/_models/bot-message-provider.interface.js.map +1 -0
  30. package/build/_modules/bot/_models/bot-message-wrapper.interface.d.ts +21 -0
  31. package/build/_modules/bot/_models/bot-message-wrapper.interface.d.ts.map +1 -0
  32. package/build/_modules/bot/_models/bot-message-wrapper.interface.js +3 -0
  33. package/build/_modules/bot/_models/bot-message-wrapper.interface.js.map +1 -0
  34. package/build/_modules/bot/_modules/discord-bot/_collections/dib-operations.util.d.ts +2 -2
  35. package/build/_modules/bot/_modules/discord-bot/_collections/dib-operations.util.d.ts.map +1 -1
  36. package/build/_modules/bot/_modules/discord-bot/_collections/dib.util.d.ts +2 -2
  37. package/build/_modules/bot/_modules/discord-bot/_collections/dib.util.d.ts.map +1 -1
  38. package/build/_modules/bot/_modules/discord-bot/_collections/dib.util.js.map +1 -1
  39. package/build/_modules/bot/_modules/discord-bot/_services/dib-message-provider.service.d.ts +56 -0
  40. package/build/_modules/bot/_modules/discord-bot/_services/dib-message-provider.service.d.ts.map +1 -0
  41. package/build/_modules/bot/_modules/discord-bot/_services/dib-message-provider.service.js +379 -0
  42. package/build/_modules/bot/_modules/discord-bot/_services/dib-message-provider.service.js.map +1 -0
  43. package/build/_modules/bot/_modules/discord-bot/index.d.ts +1 -1
  44. package/build/_modules/bot/_modules/discord-bot/index.d.ts.map +1 -1
  45. package/build/_modules/bot/_modules/discord-bot/index.js +1 -1
  46. package/build/_modules/bot/_modules/discord-bot/index.js.map +1 -1
  47. package/build/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.d.ts +3 -3
  48. package/build/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.d.ts.map +1 -1
  49. package/build/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.js.map +1 -1
  50. package/build/_modules/bot/_modules/dynamo-bot/_collections/dyb.util.d.ts +2 -2
  51. package/build/_modules/bot/_modules/dynamo-bot/_collections/dyb.util.d.ts.map +1 -1
  52. package/build/_modules/bot/_modules/dynamo-bot/_collections/dyb.util.js.map +1 -1
  53. package/build/_modules/bot/_modules/dynamo-bot/_services/dyb-message-provider.service.d.ts +55 -0
  54. package/build/_modules/bot/_modules/dynamo-bot/_services/dyb-message-provider.service.d.ts.map +1 -0
  55. package/build/_modules/bot/_modules/dynamo-bot/_services/dyb-message-provider.service.js +313 -0
  56. package/build/_modules/bot/_modules/dynamo-bot/_services/dyb-message-provider.service.js.map +1 -0
  57. package/build/_modules/bot/_modules/dynamo-bot/index.d.ts +1 -1
  58. package/build/_modules/bot/_modules/dynamo-bot/index.d.ts.map +1 -1
  59. package/build/_modules/bot/_modules/dynamo-bot/index.js +1 -1
  60. package/build/_modules/bot/_modules/dynamo-bot/index.js.map +1 -1
  61. package/build/_modules/bot/_modules/slack-bot/_collections/slb-operations.util.d.ts +2 -2
  62. package/build/_modules/bot/_modules/slack-bot/_collections/slb-operations.util.d.ts.map +1 -1
  63. package/build/_modules/bot/_modules/slack-bot/_services/slb-message-provider.service.d.ts +41 -0
  64. package/build/_modules/bot/_modules/slack-bot/_services/slb-message-provider.service.d.ts.map +1 -0
  65. package/build/_modules/bot/_modules/slack-bot/_services/slb-message-provider.service.js +119 -0
  66. package/build/_modules/bot/_modules/slack-bot/_services/slb-message-provider.service.js.map +1 -0
  67. package/build/_modules/bot/_modules/slack-bot/index.d.ts +1 -1
  68. package/build/_modules/bot/_modules/slack-bot/index.d.ts.map +1 -1
  69. package/build/_modules/bot/_modules/slack-bot/index.js +1 -1
  70. package/build/_modules/bot/_modules/slack-bot/index.js.map +1 -1
  71. package/build/_modules/bot/_modules/teams-bot/_collections/teb-operations.util.d.ts +2 -2
  72. package/build/_modules/bot/_modules/teams-bot/_collections/teb-operations.util.d.ts.map +1 -1
  73. package/build/_modules/bot/_modules/teams-bot/_services/teb-message-provider.service.d.ts +41 -0
  74. package/build/_modules/bot/_modules/teams-bot/_services/teb-message-provider.service.d.ts.map +1 -0
  75. package/build/_modules/bot/_modules/teams-bot/_services/teb-message-provider.service.js +119 -0
  76. package/build/_modules/bot/_modules/teams-bot/_services/teb-message-provider.service.js.map +1 -0
  77. package/build/_modules/bot/_modules/teams-bot/index.d.ts +1 -1
  78. package/build/_modules/bot/_modules/teams-bot/index.d.ts.map +1 -1
  79. package/build/_modules/bot/_modules/teams-bot/index.js +1 -1
  80. package/build/_modules/bot/_modules/teams-bot/index.js.map +1 -1
  81. package/build/_modules/bot/_services/bot-commands.control-service.d.ts +4 -3
  82. package/build/_modules/bot/_services/bot-commands.control-service.d.ts.map +1 -1
  83. package/build/_modules/bot/_services/bot-commands.control-service.js +3 -2
  84. package/build/_modules/bot/_services/bot-commands.control-service.js.map +1 -1
  85. package/build/_modules/bot/_services/bot-io.control-service.d.ts +7 -6
  86. package/build/_modules/bot/_services/bot-io.control-service.d.ts.map +1 -1
  87. package/build/_modules/bot/_services/bot-io.control-service.js +38 -17
  88. package/build/_modules/bot/_services/bot-io.control-service.js.map +1 -1
  89. package/build/_modules/bot/_services/bot-main.control-service.d.ts +15 -2
  90. package/build/_modules/bot/_services/bot-main.control-service.d.ts.map +1 -1
  91. package/build/_modules/bot/_services/bot-main.control-service.js +105 -1
  92. package/build/_modules/bot/_services/bot-main.control-service.js.map +1 -1
  93. package/build/_modules/bot/_services/bot-provider-factory.service.d.ts +3 -2
  94. package/build/_modules/bot/_services/bot-provider-factory.service.d.ts.map +1 -1
  95. package/build/_modules/bot/_services/bot-provider-factory.service.js +34 -18
  96. package/build/_modules/bot/_services/bot-provider-factory.service.js.map +1 -1
  97. package/build/_modules/bot/_services/bot-routines.control-service.d.ts +2 -2
  98. package/build/_modules/bot/_services/bot-routines.control-service.d.ts.map +1 -1
  99. package/build/_modules/bot/index.d.ts +3 -2
  100. package/build/_modules/bot/index.d.ts.map +1 -1
  101. package/build/_modules/bot/index.js +3 -2
  102. package/build/_modules/bot/index.js.map +1 -1
  103. package/package.json +1 -1
  104. package/src/_modules/ai/_services/ai-provider.service-base.ts +1 -1
  105. package/src/_modules/assistant/_services/ass-io.control-service.ts +14 -9
  106. package/src/_modules/assistant/_services/ass-main.control-service.ts +3 -3
  107. package/src/_modules/assistant/_services/ass.service-base.ts +13 -5
  108. package/src/_modules/bot/_collections/bot-operations.util.ts +14 -14
  109. package/src/_modules/bot/_enums/{bot-provider.enum.ts → bot-message-provider.enum.ts} +1 -1
  110. package/src/_modules/bot/_models/bot-global-settings.interface.ts +9 -0
  111. package/src/_modules/bot/_models/{bot-provider.interface.ts → bot-message-provider.interface.ts} +10 -7
  112. package/src/_modules/bot/_models/bot-message-wrapper.interface.ts +31 -0
  113. package/src/_modules/bot/_modules/discord-bot/_collections/dib-operations.util.ts +2 -2
  114. package/src/_modules/bot/_modules/discord-bot/_collections/dib.util.ts +2 -2
  115. package/src/_modules/bot/_modules/discord-bot/_services/{dib-provider.service.ts → dib-message-provider.service.ts} +20 -7
  116. package/src/_modules/bot/_modules/discord-bot/index.ts +1 -1
  117. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb-operations.util.ts +3 -3
  118. package/src/_modules/bot/_modules/dynamo-bot/_collections/dyb.util.ts +2 -2
  119. package/src/_modules/bot/_modules/dynamo-bot/_services/{dyb-provider.service.ts → dyb-message-provider.service.ts} +12 -8
  120. package/src/_modules/bot/_modules/dynamo-bot/index.ts +1 -1
  121. package/src/_modules/bot/_modules/slack-bot/_collections/slb-operations.util.ts +2 -2
  122. package/src/_modules/bot/_modules/slack-bot/_services/{slb-provider.service.ts → slb-message-provider.service.ts} +11 -7
  123. package/src/_modules/bot/_modules/slack-bot/index.ts +1 -1
  124. package/src/_modules/bot/_modules/teams-bot/_collections/teb-operations.util.ts +2 -2
  125. package/src/_modules/bot/_modules/teams-bot/_services/{teb-provider.service.ts → teb-message-provider.service.ts} +11 -7
  126. package/src/_modules/bot/_modules/teams-bot/index.ts +1 -1
  127. package/src/_modules/bot/_services/bot-commands.control-service.ts +8 -6
  128. package/src/_modules/bot/_services/bot-io.control-service.ts +49 -23
  129. package/src/_modules/bot/_services/bot-main.control-service.ts +130 -5
  130. package/src/_modules/bot/_services/bot-provider-factory.service.ts +42 -20
  131. package/src/_modules/bot/_services/bot-routines.control-service.ts +3 -3
  132. package/src/_modules/bot/index.ts +3 -2
@@ -7,15 +7,16 @@ import { DyNTS_global_settings } from '../../../_collections/global-settings.con
7
7
  import { DyNTS_Bot_Message } from '../_models/bot-message.interface'
8
8
  import { DyNTS_Bot_Channel } from '../_models/bot-channel.interface'
9
9
  import { DyNTS_Bot_User } from '../_models/bot-user.interface'
10
- import { DyNTS_Bot_Provider } from '../_models/bot-provider.interface'
10
+ import { DyNTS_Bot_MessageProvider } from '../_models/bot-message-provider.interface'
11
11
  import { DyNTS_Bot_Global_Settings } from '../_models/bot-global-settings.interface'
12
+ import { DyNTS_Bot_MessageWrapper } from '../_models/bot-message-wrapper.interface'
12
13
  import { DyNTS_Msg_Integration_ControlService } from '../../messaging/_services/msg-integration.control-service'
13
14
 
14
15
  export abstract class DyNTS_Bot_IO_ControlService<
15
16
  T_PlatformChannel extends DyNTS_Bot_Channel<any> = DyNTS_Bot_Channel<any>,
16
17
  T_PlatformMessage extends DyNTS_Bot_Message<any> = DyNTS_Bot_Message<any>,
17
18
  T_PlatformUser extends DyNTS_Bot_User<any> = DyNTS_Bot_User<any>,
18
- T_PlatformProvider extends DyNTS_Bot_Provider<T_PlatformChannel, T_PlatformMessage, T_PlatformUser> = DyNTS_Bot_Provider<T_PlatformChannel, T_PlatformMessage, T_PlatformUser>
19
+ T_PlatformProvider extends DyNTS_Bot_MessageProvider<T_PlatformChannel, T_PlatformMessage, T_PlatformUser> = DyNTS_Bot_MessageProvider<T_PlatformChannel, T_PlatformMessage, T_PlatformUser>
19
20
  > extends DyNTS_SingletonService {
20
21
 
21
22
  protected abstract getMainBotControlService(): DyNTS_Bot_Main_ControlService<T_PlatformChannel, T_PlatformMessage, T_PlatformUser, T_PlatformProvider>;
@@ -64,27 +65,41 @@ export abstract class DyNTS_Bot_IO_ControlService<
64
65
  }
65
66
  }
66
67
 
67
- async handleNewMessage(message: T_PlatformMessage, issuer: string): Promise<void> {
68
+ async handleNewMessage(wrapperOrMessage: DyNTS_Bot_MessageWrapper<T_PlatformMessage> | T_PlatformMessage, issuer: string): Promise<void> {
69
+ // Declare variables outside try-catch for error handling
70
+ let wrapper: DyNTS_Bot_MessageWrapper<T_PlatformMessage>;
71
+ let message: T_PlatformMessage;
72
+
68
73
  try {
74
+ // Support both wrapped messages (multi-provider) and unwrapped (backward compatibility)
75
+ const isWrapper = 'message' in wrapperOrMessage && 'providerId' in wrapperOrMessage;
76
+ wrapper = isWrapper ? wrapperOrMessage as DyNTS_Bot_MessageWrapper<T_PlatformMessage> : {
77
+ message: wrapperOrMessage as T_PlatformMessage,
78
+ providerId: 'default',
79
+ providerType: this.provider.getProviderName() as any,
80
+ provider: this.provider
81
+ };
82
+
83
+ message = wrapper.message;
69
84
  const botSettings = DyNTS_global_settings.bot_settings as DyNTS_Bot_Global_Settings;
70
85
 
71
86
  if (botSettings?.debugLevel >= 1) {
72
- DyFM_Log.H_log(`incoming message (${message.authorDisplayName}):\n${message.content}`)
87
+ DyFM_Log.H_log(`incoming message (${message.authorDisplayName}) [${wrapper.providerId}]:\n${message.content}`)
73
88
  }
74
89
 
75
- const isForYou = await this.getMessageIsForBotToHandle(message, issuer);
90
+ const isForYou = await this.getMessageIsForBotToHandle(message, wrapper, issuer);
76
91
 
77
92
  if (!isForYou) {
78
93
  return;
79
94
  }
80
95
 
81
- const isHandledAsCommand = await this.handleIfCommand(message, issuer);
96
+ const isHandledAsCommand = await this.handleIfCommand(message, wrapper, issuer);
82
97
 
83
98
  if (isHandledAsCommand) {
84
99
  return;
85
100
  }
86
101
 
87
- await this.handleMessage(message, issuer);
102
+ await this.handleMessage(message, wrapper, issuer);
88
103
 
89
104
  // Sync message to messaging system if enabled
90
105
  try {
@@ -94,7 +109,7 @@ export abstract class DyNTS_Bot_IO_ControlService<
94
109
  // Find or create conversation for this channel
95
110
  const conversation = await messagingIntegration.findOrCreateBotConversation(
96
111
  message.channelId,
97
- this.provider.getProviderName(),
112
+ wrapper.providerType,
98
113
  issuer
99
114
  );
100
115
 
@@ -115,14 +130,20 @@ export abstract class DyNTS_Bot_IO_ControlService<
115
130
  const botSettings = DyNTS_global_settings.bot_settings as DyNTS_Bot_Global_Settings;
116
131
 
117
132
  if (!this.dontSendErrorReply && botSettings?.debugLevel >= 1) {
118
- await this.provider.replyToMessage(
119
- message.id,
120
- message.channelId,
121
- `[SYSTEM|ERROR|${DyNTS_global_settings.systemShortCodeName}|DyNTS-Bot-IO-H0] Error occurred while handling the message:\n` +
122
- DyFM_Error.getAnyMessage(error)
123
- ).catch(error => {
124
- DyFM_Error.logSimple('❌❌ Error sending message to report channel:', error);
125
- });
133
+ // Use wrapper if available, fallback to default provider
134
+ const errorProvider = wrapper?.provider || this.provider;
135
+ const errorMessage = wrapper?.message || message;
136
+
137
+ if (errorProvider && errorMessage) {
138
+ await errorProvider.replyToMessage(
139
+ errorMessage.id,
140
+ errorMessage.channelId,
141
+ `[SYSTEM|ERROR|${DyNTS_global_settings.systemShortCodeName}|DyNTS-Bot-IO-H0] Error occurred while handling the message:\n` +
142
+ DyFM_Error.getAnyMessage(error)
143
+ ).catch(err => {
144
+ DyFM_Error.logSimple('❌❌ Error sending message to report channel:', err);
145
+ });
146
+ }
126
147
  }
127
148
 
128
149
  throw new DyFM_Error({
@@ -132,17 +153,19 @@ export abstract class DyNTS_Bot_IO_ControlService<
132
153
  }
133
154
  }
134
155
 
135
- abstract handleMessage(message: T_PlatformMessage, issuer: string): Promise<T_PlatformMessage>;
156
+ abstract handleMessage(message: T_PlatformMessage, wrapper: DyNTS_Bot_MessageWrapper<T_PlatformMessage>, issuer: string): Promise<T_PlatformMessage>;
136
157
 
137
158
  async getMessageIsForBotToHandle(
138
159
  message: T_PlatformMessage,
160
+ wrapper: DyNTS_Bot_MessageWrapper<T_PlatformMessage>,
139
161
  issuer: string,
140
162
  dontRemovePing?: boolean
141
163
  ): Promise<boolean> {
142
164
  try {
143
165
  const botSettings = DyNTS_global_settings.bot_settings as DyNTS_Bot_Global_Settings;
144
166
 
145
- if (!this.provider || !this.mainBot_CS || !this.botClientId) {
167
+ const provider = wrapper.provider || this.provider;
168
+ if (!provider || !this.mainBot_CS || !this.botClientId) {
146
169
  DyFM_Log.H_error(
147
170
  '🚫❌ Bot not initialized yet. END wont respond to message:', message.content,
148
171
  new Error('Bot not initialized yet').stack
@@ -184,7 +207,8 @@ export abstract class DyNTS_Bot_IO_ControlService<
184
207
  }
185
208
 
186
209
  if (!isOwnMessage && isPinged) {
187
- this.provider.replyToMessage(
210
+ const provider = wrapper.provider || this.provider;
211
+ provider.replyToMessage(
188
212
  message.id,
189
213
  message.channelId,
190
214
  `[SYSTEM|REFUSE|CHANNEL] I'm sorry, but I'm not allowed to answer you in this channel!`
@@ -221,7 +245,8 @@ export abstract class DyNTS_Bot_IO_ControlService<
221
245
  ) {
222
246
  if (isPinged && botSettings?.debugLevel >= 2) {
223
247
  DyFM_Log.warn('🚫🤖❌ not for me; this message is from a bot')
224
- this.provider.replyToMessage(
248
+ const provider = wrapper.provider || this.provider;
249
+ provider.replyToMessage(
225
250
  message.id,
226
251
  message.channelId,
227
252
  '[SYSTEM|REFUSE|BOT] You should not ping me!'
@@ -247,7 +272,8 @@ export abstract class DyNTS_Bot_IO_ControlService<
247
272
  if (!isAllowedUser) {
248
273
  if (botSettings?.debugLevel >= 2) {
249
274
  DyFM_Log.warn('🚫❌ not allowed user. END', message.authorName, message.authorDisplayName)
250
- this.provider.replyToMessage(
275
+ const provider = wrapper.provider || this.provider;
276
+ provider.replyToMessage(
251
277
  message.id,
252
278
  message.channelId,
253
279
  `[SYSTEM|REFUSE|USER] I'm sorry, but I'm not allowed to answer you!`
@@ -274,12 +300,12 @@ export abstract class DyNTS_Bot_IO_ControlService<
274
300
  }
275
301
  }
276
302
 
277
- async handleIfCommand(message: T_PlatformMessage, issuer: string): Promise<boolean> {
303
+ async handleIfCommand(message: T_PlatformMessage, wrapper: DyNTS_Bot_MessageWrapper<T_PlatformMessage>, issuer: string): Promise<boolean> {
278
304
  try {
279
305
  const isCommand = await this.isCommand(message, issuer);
280
306
 
281
307
  if (isCommand) {
282
- await this.commands_CS.handleCommand(message, issuer);
308
+ await this.commands_CS.handleCommand(message, wrapper, issuer);
283
309
  }
284
310
 
285
311
  return Boolean(isCommand);
@@ -1,14 +1,16 @@
1
1
  import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
2
2
  import { DyFM_Async, DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
3
3
  import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
4
- import { DyNTS_Bot_Provider } from '../_models/bot-provider.interface';
4
+ import { DyNTS_Bot_MessageProvider, DyNTS_Bot_MessageProvider_Config } from '../_models/bot-message-provider.interface';
5
5
  import { DyNTS_Bot_Message } from '../_models/bot-message.interface';
6
6
  import { DyNTS_Bot_Channel } from '../_models/bot-channel.interface';
7
7
  import { DyNTS_Bot_User } from '../_models/bot-user.interface';
8
- import { DyNTS_Bot_Global_Settings } from '../_models/bot-global-settings.interface';
8
+ import { DyNTS_Bot_Global_Settings, DyNTS_Bot_Settings } from '../_models/bot-global-settings.interface';
9
9
  import { DyNTS_GlobalService } from '../../../_services/core/global.service';
10
10
  import { DyNTS_Bot_IO_ControlService } from './bot-io.control-service';
11
11
  import { DyNTS_Bot_Routines_ControlService } from './bot-routines.control-service';
12
+ import { DyNTS_Bot_MessageWrapper } from '../_models/bot-message-wrapper.interface';
13
+ import { DyNTS_Bot_Provider_Factory } from './bot-provider-factory.service';
12
14
 
13
15
  /**
14
16
  * This is the main control service for the Bot.
@@ -25,11 +27,11 @@ export abstract class DyNTS_Bot_Main_ControlService<
25
27
  T_PlatformChannel extends DyNTS_Bot_Channel<any> = DyNTS_Bot_Channel<any>,
26
28
  T_PlatformMessage extends DyNTS_Bot_Message<any> = DyNTS_Bot_Message<any>,
27
29
  T_PlatformUser extends DyNTS_Bot_User<any> = DyNTS_Bot_User<any>,
28
- T_PlatformProvider extends DyNTS_Bot_Provider<
30
+ T_PlatformProvider extends DyNTS_Bot_MessageProvider<
29
31
  T_PlatformChannel,
30
32
  T_PlatformMessage,
31
33
  T_PlatformUser
32
- > = DyNTS_Bot_Provider<
34
+ > = DyNTS_Bot_MessageProvider<
33
35
  T_PlatformChannel,
34
36
  T_PlatformMessage,
35
37
  T_PlatformUser
@@ -37,11 +39,20 @@ export abstract class DyNTS_Bot_Main_ControlService<
37
39
  > extends DyNTS_SingletonService {
38
40
 
39
41
  protected _provider: T_PlatformProvider;
42
+ protected _providers: Map<string, T_PlatformProvider> = new Map();
40
43
 
41
44
  get provider(): T_PlatformProvider {
42
45
  return this._provider;
43
46
  }
44
47
 
48
+ get providers(): Map<string, T_PlatformProvider> {
49
+ return this._providers;
50
+ }
51
+
52
+ getProviderById(providerId: string): T_PlatformProvider | undefined {
53
+ return this._providers.get(providerId);
54
+ }
55
+
45
56
  get botClientId(): string {
46
57
  return this.provider?.getBotId() ?? DyNTS_global_settings?.bot_settings?.discord?.clientId;
47
58
  }
@@ -112,11 +123,39 @@ export abstract class DyNTS_Bot_Main_ControlService<
112
123
  }
113
124
  }
114
125
 
126
+ /**
127
+ * Check if the bot is configured for multiple providers
128
+ */
129
+ protected isMultiProviderMode(): boolean {
130
+ const settings = DyNTS_global_settings.bot_settings as any;
131
+ return Array.isArray(settings?.providers) && settings.providers.length > 0;
132
+ }
133
+
134
+ /**
135
+ * Get all provider configurations (supports both single and multi-provider mode)
136
+ */
137
+ protected getProviderConfigs(): DyNTS_Bot_MessageProvider_Config[] {
138
+ const settings = DyNTS_global_settings.bot_settings as any;
139
+
140
+ if (this.isMultiProviderMode()) {
141
+ return settings.providers;
142
+ } else {
143
+ // Single provider mode - wrap existing config
144
+ const config = settings as DyNTS_Bot_MessageProvider_Config;
145
+ if (!config.providerId) {
146
+ config.providerId = config.messageProvider || 'default';
147
+ }
148
+ return [config];
149
+ }
150
+ }
151
+
115
152
  async setup(issuer: string): Promise<void> {
116
153
  try {
117
154
  await DyFM_Async.delay(100);
118
155
 
119
- if (!DyNTS_global_settings.bot_settings?.provider) {
156
+ const configs = this.getProviderConfigs();
157
+
158
+ if (configs.length === 0) {
120
159
  throw new Error(
121
160
  `No bot provider configured!` +
122
161
  `\nPlease set the provider in DyNTS_global_settings.bot_settings.provider` +
@@ -124,6 +163,13 @@ export abstract class DyNTS_Bot_Main_ControlService<
124
163
  );
125
164
  }
126
165
 
166
+ // If multi-provider mode, initialize all providers
167
+ if (this.isMultiProviderMode()) {
168
+ await this.setupMultipleProviders(configs, issuer);
169
+ return;
170
+ }
171
+
172
+ // Single provider mode (backward compatible)
127
173
  if (!this.provider) {
128
174
  throw new Error(
129
175
  `No bot provider instance found!` +
@@ -228,6 +274,85 @@ export abstract class DyNTS_Bot_Main_ControlService<
228
274
  }
229
275
  }
230
276
 
277
+ private async setupMultipleProviders(
278
+ configs: DyNTS_Bot_MessageProvider_Config[],
279
+ issuer: string
280
+ ): Promise<void> {
281
+ const providers = DyNTS_Bot_Provider_Factory.createProviders(configs);
282
+ this._providers = providers as Map<string, T_PlatformProvider>;
283
+
284
+ const setupPromises = Array.from(providers.entries()).map(([providerId, provider]) => {
285
+ return new Promise<void>((resolve, reject) => {
286
+ provider.onError((error) => {
287
+ if (DyNTS_global_settings.bot_settings?.debugLevel >= 1) {
288
+ DyFM_Error.logSimple(`Bot provider error [${providerId}]:`, error);
289
+ }
290
+ DyNTS_GlobalService.globalErrorHandler(error);
291
+ reject(error);
292
+ });
293
+
294
+ provider.onReady(async () => {
295
+ if (DyNTS_global_settings.bot_settings?.debugLevel >= 1) {
296
+ DyFM_Log.success(`Bot logged in as ${provider.getBotDisplayName()} [${providerId}]`);
297
+ }
298
+ resolve();
299
+ });
300
+
301
+ provider.onMessage((message, messageIssuer, msgProviderId) => {
302
+ try {
303
+ const wrapper: DyNTS_Bot_MessageWrapper<T_PlatformMessage> = {
304
+ message: message as T_PlatformMessage,
305
+ providerId: msgProviderId || provider.getProviderId() || providerId,
306
+ providerType: provider.getProviderName() as any,
307
+ provider: provider as any
308
+ };
309
+
310
+ this.botIO_CS.handleNewMessage(wrapper, messageIssuer)
311
+ } catch (error) {
312
+ DyFM_Error.logSimple('Error handling new message:', error);
313
+ }
314
+ });
315
+
316
+ const config = configs.find(c => c.providerId === providerId);
317
+ if (!config) {
318
+ reject(new Error(`No config found for provider ${providerId}`));
319
+ return;
320
+ }
321
+
322
+ provider.initialize(config).then(() => {
323
+ const token = this.getTokenForProviderConfig(config);
324
+ return provider.login(token);
325
+ }).catch((error) => {
326
+ reject(error);
327
+ });
328
+ });
329
+ });
330
+
331
+ await Promise.all(setupPromises);
332
+
333
+ // Set default provider (first one) for backward compatibility
334
+ if (this._provider) {
335
+ this._provider = providers.values().next().value;
336
+ }
337
+
338
+ await this.start(issuer);
339
+
340
+ DyFM_Log.success('All bot providers setup complete');
341
+ }
342
+
343
+ private getTokenForProviderConfig(config: DyNTS_Bot_MessageProvider_Config): string {
344
+ switch (config.messageProvider) {
345
+ case 'discord':
346
+ return config.discord?.token;
347
+ case 'slack':
348
+ return config.slack?.token;
349
+ case 'teams':
350
+ return config.teams?.appPassword;
351
+ default:
352
+ throw new Error(`Unsupported provider: ${config.messageProvider}`);
353
+ }
354
+ }
355
+
231
356
  async start(issuer: string): Promise<void> {
232
357
  try {
233
358
  this.botIO_CS = this.getBotIOControlService();
@@ -1,34 +1,56 @@
1
- import { DyNTS_Bot_Provider, DyNTS_Bot_Provider_Config } from '../_models/bot-provider.interface';
2
- import { DyNTS_Bot_Provider_Type } from '../_enums/bot-provider.enum';
3
- import { DyNTS_DiB_Provider } from '../_modules/discord-bot/_services/dib-provider.service';
4
- import { DyNTS_SlB_Provider } from '../_modules/slack-bot/_services/slb-provider.service';
5
- import { DyNTS_TeB_Provider } from '../_modules/teams-bot/_services/teb-provider.service';
6
- import { DyNTS_DyB_Provider } from '../_modules/dynamo-bot/_services/dyb-provider.service';
1
+ import { DyNTS_Bot_MessageProvider, DyNTS_Bot_MessageProvider_Config } from '../_models/bot-message-provider.interface';
2
+ import { DyNTS_Bot_MessageProvider_Type } from '../_enums/bot-message-provider.enum';
3
+ import { DyNTS_DiB_MessageProvider } from '../_modules/discord-bot/_services/dib-message-provider.service';
4
+ import { DyNTS_SlB_MessageProvider } from '../_modules/slack-bot/_services/slb-message-provider.service';
5
+ import { DyNTS_TeB_MessageProvider } from '../_modules/teams-bot/_services/teb-message-provider.service';
6
+ import { DyNTS_DyB_MessageProvider } from '../_modules/dynamo-bot/_services/dyb-message-provider.service';
7
7
 
8
8
  export class DyNTS_Bot_Provider_Factory {
9
9
 
10
- static createProvider(config: DyNTS_Bot_Provider_Config): DyNTS_Bot_Provider {
11
- switch (config.provider) {
12
- case DyNTS_Bot_Provider_Type.discord:
13
- return new DyNTS_DiB_Provider();
10
+ static createProvider(config: DyNTS_Bot_MessageProvider_Config): DyNTS_Bot_MessageProvider {
11
+ switch (config.messageProvider) {
12
+ case DyNTS_Bot_MessageProvider_Type.discord:
13
+ return new DyNTS_DiB_MessageProvider();
14
14
 
15
- case DyNTS_Bot_Provider_Type.slack:
16
- return new DyNTS_SlB_Provider();
15
+ case DyNTS_Bot_MessageProvider_Type.slack:
16
+ return new DyNTS_SlB_MessageProvider();
17
17
 
18
- case DyNTS_Bot_Provider_Type.teams:
19
- return new DyNTS_TeB_Provider();
18
+ case DyNTS_Bot_MessageProvider_Type.teams:
19
+ return new DyNTS_TeB_MessageProvider();
20
20
 
21
- case DyNTS_Bot_Provider_Type.dynamo:
22
- return new DyNTS_DyB_Provider();
21
+ case DyNTS_Bot_MessageProvider_Type.dynamo:
22
+ return new DyNTS_DyB_MessageProvider();
23
23
 
24
- case DyNTS_Bot_Provider_Type.custom:
25
- if (!config.providerInstance) {
24
+ case DyNTS_Bot_MessageProvider_Type.custom:
25
+ if (!config.messageProviderInstance) {
26
26
  throw new Error('Custom provider instance is required when provider type is "custom"');
27
27
  }
28
- return config.providerInstance;
28
+ return config.messageProviderInstance;
29
29
 
30
30
  default:
31
- throw new Error(`Unsupported provider type: ${config.provider}`);
31
+ throw new Error(`Unsupported provider type: ${config.messageProvider}`);
32
32
  }
33
33
  }
34
+
35
+ static createProviders(configs: DyNTS_Bot_MessageProvider_Config[]): Map<string, DyNTS_Bot_MessageProvider> {
36
+ const providers = new Map<string, DyNTS_Bot_MessageProvider>();
37
+ const providerIds = new Set<string>();
38
+
39
+ for (const config of configs) {
40
+ if (!config.providerId) {
41
+ throw new Error('providerId is required when using multiple providers');
42
+ }
43
+
44
+ if (providerIds.has(config.providerId)) {
45
+ throw new Error(`Duplicate providerId detected: ${config.providerId}`);
46
+ }
47
+
48
+ providerIds.add(config.providerId);
49
+
50
+ const provider = this.createProvider(config);
51
+ providers.set(config.providerId, provider);
52
+ }
53
+
54
+ return providers;
55
+ }
34
56
  }
@@ -8,17 +8,17 @@ import { DyNTS_global_settings } from '../../../_collections/global-settings.con
8
8
  import { DyNTS_Bot_Channel } from '../_models/bot-channel.interface';
9
9
  import { DyNTS_Bot_Message } from '../_models/bot-message.interface';
10
10
  import { DyNTS_Bot_User } from '../_models/bot-user.interface';
11
- import { DyNTS_Bot_Provider } from '../_models/bot-provider.interface';
11
+ import { DyNTS_Bot_MessageProvider } from '../_models/bot-message-provider.interface';
12
12
 
13
13
  export abstract class DyNTS_Bot_Routines_ControlService<
14
14
  T_PlatformChannel extends DyNTS_Bot_Channel<any> = DyNTS_Bot_Channel<any>,
15
15
  T_PlatformMessage extends DyNTS_Bot_Message<any> = DyNTS_Bot_Message<any>,
16
16
  T_PlatformUser extends DyNTS_Bot_User<any> = DyNTS_Bot_User<any>,
17
- T_PlatformProvider extends DyNTS_Bot_Provider<
17
+ T_PlatformProvider extends DyNTS_Bot_MessageProvider<
18
18
  T_PlatformChannel,
19
19
  T_PlatformMessage,
20
20
  T_PlatformUser
21
- > = DyNTS_Bot_Provider<
21
+ > = DyNTS_Bot_MessageProvider<
22
22
  T_PlatformChannel,
23
23
  T_PlatformMessage,
24
24
  T_PlatformUser
@@ -6,13 +6,14 @@
6
6
  //
7
7
 
8
8
  // ENUMS
9
- export * from './_enums/bot-provider.enum';
9
+ export * from './_enums/bot-message-provider.enum';
10
10
 
11
11
  // MODELS
12
12
  export * from './_models/bot-message.interface';
13
+ export * from './_models/bot-message-wrapper.interface';
13
14
  export * from './_models/bot-channel.interface';
14
15
  export * from './_models/bot-user.interface';
15
- export * from './_models/bot-provider.interface';
16
+ export * from './_models/bot-message-provider.interface';
16
17
  export * from './_models/bot-command.interface';
17
18
  export * from './_models/bot-global-settings.interface';
18
19
  export * from './_models/bot-last-message-date.interface';