import { DyFM_AnyError, DyFM_Object } from '@futdevpro/fsm-dynamo'; import { DyFM_Msg_Provider_Type } from '@futdevpro/fsm-dynamo/messaging'; import { DyNTS_Bot_ChannelWrapper } from '../_models/bot-channel-wrapper.interface'; import { DyNTS_Bot_LastMessageDate } from '../_models/bot-last-message-date.interface'; import { DyNTS_Bot_LastMentionDate } from '../_models/bot-last-mention-date.interface'; import { DyNTS_Bot_Global_Settings } from '../_models/bot-global-settings.interface'; import { DyNTS_SingletonService } from '../../../_services/base/singleton.service'; import { DyNTS_Bot_MessageWrapper } from '../_models/bot-message-wrapper.interface'; import { DyNTS_Bot_UserWrapper } from '../_models/bot-user-wrapper.interface'; //export interface DyNTS_Bot_MessagingProvider_Config< // T_MessagingProviderConfig = any //> extends DyNTS_Bot_Global_Settings { // /** Unique identifier for this provider instance (required when using multiple providers) */ // /* messagingProviderId?: string; */ // /* messagingProvider: DyFM_Msg_Provider_Type | string; */ // /* messagingProviderInstance?: DyNTS_Bot_MessagingProvider; */ // config: T_MessagingProviderConfig; /* MessagingProvider_DiscordConfig | MessagingProvider_SlackConfig | MessagingProvider_TeamsConfig | MessagingProvider_DynamoConfig; */ //} export interface DyNTS_Bot_MessagingProvider_Config { reportChannelName: string; } export interface Slack_MessagingProviderConfig extends DyNTS_Bot_MessagingProvider_Config { token: string; workspace: string; } export interface Teams_MessagingProviderConfig extends DyNTS_Bot_MessagingProvider_Config { appId: string; appPassword: string; tenantId: string; } export interface Dynamo_MessagingProviderConfig extends DyNTS_Bot_MessagingProvider_Config { defaultConversationId?: string; // Optional default conversation botUserId?: string; // Bot user ID in messaging system botDisplayName?: string; // Bot display name } export abstract class DyNTS_Bot_MessagingProvider_ServiceBase< T_MessagingPlatformChannel extends any = any, T_MessagingPlatformMessage extends any = any, T_MessagingPlatformUser extends any = any, T_MessagingProviderConfig extends DyNTS_Bot_MessagingProvider_Config = DyNTS_Bot_MessagingProvider_Config, T_MessagingPlatformRole extends any = any, > extends DyNTS_SingletonService { abstract readonly name: string; /** used as id as well */ abstract readonly type: DyFM_Msg_Provider_Type | string; abstract get botId(): string; abstract get botDisplayName(): string; /* abstract get providerId(): string; */ /* abstract isReady(): boolean; */ /* get id(): DyFM_Msg_Provider_Type | string { return this.type; } */ abstract readonly config: T_MessagingProviderConfig; /* protected _channelsByNames: { [key: string]: DyNTS_Bot_ChannelWrapper; } = {}; protected _rolesByNames: { [key: string]: any[]; } = {}; */ protected readonly channelCache: Map = new Map(); protected readonly roleCache: Map = new Map(); /* constructor( setConfig?: T_MessagingProviderConfig ) { super(); if (setConfig) { this.config = setConfig; } } */ // Initialization //abstract preInitialize(): Promise; //abstract initialize(): Promise; abstract setup(issuer: string): Promise; abstract start(issuer: string): Promise; //abstract login(): Promise; //abstract getToken(): string; // Channel operations abstract getChannelByName(name: string): Promise>; abstract getChannelById(id: string): Promise>; abstract sendMessageToChannelByName(channelName: string, message: string, issuer: string): Promise>; abstract getMessagesFromChannelByChannelName(channelName: string, limit?: number): Promise[]>; abstract getLastMessageInChannel(channelName: string): Promise>; abstract clearChannel(channelWrapper: DyNTS_Bot_ChannelWrapper): Promise; // Message operations abstract sendMessageToChannel(channelWrapper: DyNTS_Bot_ChannelWrapper, content: string, issuer: string): Promise>; abstract replyToMessage(messageWrapper: DyNTS_Bot_MessageWrapper, content: string): Promise>; abstract sendTyping(channelWrapper: DyNTS_Bot_ChannelWrapper): Promise; abstract sendTypingForMessage(messageWrapper: DyNTS_Bot_MessageWrapper): Promise; abstract fetchMessages(channelWrapper: DyNTS_Bot_ChannelWrapper, limit: number): Promise[]>; abstract fetchMessagesById(id: string, limit: number): Promise[]>; abstract fetchMessagesForMessage(messageWrapper: DyNTS_Bot_MessageWrapper, limit: number): Promise[]>; abstract fetchAllMessagesWithPaging(channelWrapper: DyNTS_Bot_ChannelWrapper, maxFetch?: number): Promise[]>; abstract deleteMessage(messageWrapper: DyNTS_Bot_MessageWrapper): Promise; abstract updateMessage(message: T_MessagingPlatformMessage, issuer: string): Promise; // User operations abstract getUserByName(username: string): Promise>; abstract getUserMention(userId: string): string; abstract readMembersInChannel(channelName: string): Promise[]>; abstract readMemberNamesInChannel(channelName: string): Promise; // Advanced message queries abstract getLastMessageSentBy(channelName: string, username: string): Promise>; abstract getLastMentionOf(channelName: string, username: string): Promise>; abstract readLastMessageDatesByMembers(channelName: string, memberNames: string[]): Promise; abstract readLastMessageWithMemberNamePingInIt(channelName: string, users: DyNTS_Bot_UserWrapper[]): Promise; // Platform-specific features (optional, may return null/undefined for unsupported platforms) abstract getRoleByName?(roleName: string): any; abstract getRolePingByName?(roleName: string): Promise; abstract getRolePingsByName?(roleNames: string[]): Promise; // Event binding //abstract onMessage( // message: T_MessagingPlatformMessage, // /* handler: (message: DyNTS_Bot_MessageWrapper, issuer: string, providerId?: string) => void */ //): Promise>; /* void; */ abstract create_onMessageEventListener( handler: (message: DyNTS_Bot_MessageWrapper, issuer: string) => Promise ): Promise; //abstract create_onReadyEventListener(handler: () => void): void; abstract create_onErrorEventListener(handler: (error: DyFM_AnyError) => void): void; abstract sendReport(message: string): Promise>; abstract sendReportIn(message: string): Promise>; abstract wrapMessage(message: T_MessagingPlatformMessage): Promise>; abstract wrapChannel(channel: T_MessagingPlatformChannel): Promise>; abstract wrapUser(user: T_MessagingPlatformUser): Promise>; /* abstract channelIsTextBased(channel: T_MessagingPlatformChannel): boolean; abstract channelIsVoiceBased(channel: T_MessagingPlatformChannel): boolean; abstract channelIsDM(channel: T_MessagingPlatformChannel): boolean; */ // Metadata //abstract getBotId(): string; //abstract getBotDisplayName(): string; ////abstract getProviderName(): string; //abstract getProviderId(): string; //abstract isReady(): boolean; }