import { CommentProcessor } from "../rdrama/services/CommentProcessor"; import { CommentParser } from "../rdrama/services/CommentParser"; import { CommentPoster } from "../rdrama/services/CommentPoster"; import { MessageService } from "../utils/MessageService"; class WorkflowOrchestrator { constructor( private commentProcessor: CommentProcessor, private commentParser: CommentParser, private commentPoster: CommentPoster, private messageService: MessageService, //private redditNotifier: RedditNotifier // Handles notifications to Reddit users ) { } /** * Executes the defined workflow for processing comments. */ async executeWorkflow() { try { // Fetch comments from the source const comments = await this.commentProcessor.processComments(); console.log(`Fetched ${comments.length} comments`); // Extract and deduplicate usernames from comments const allUsernames = comments.flatMap(comment => this.commentParser.extractUsernames(comment)); const uniqueUsernames = [...new Set(allUsernames)]; console.log(`Extracted ${uniqueUsernames.length} unique usernames`); for (const comment of comments) { const redditUsers = this.commentParser.extractUsernames(comment) if (redditUsers.length === 0) continue console.log('found:', redditUsers) const placeholders = { author_name: comment.author_name, }; const commentResponse = this.messageService.getRandomRdramaMessage(placeholders) const postedComment = await this.commentPoster.postComment(`c_${comment.id}`, `##### TEST MESSAGE NO REDDITOR PINGED (YET...)\n${commentResponse}`) //const postedComment = await this.commentPoster.postComment(`c_${comment.id}`, ${commentResponse}`) //TODO make this live console.log(`Sent Comment to`, JSON.stringify(postedComment, null, 4)) //FOR now, only reply to one user and we would check against DB with a random interval, we should only message between 2-3 people daily? } //// Query user information based on usernames //const userInfo = await this.databaseService.queryUsersInfo(uniqueUsernames); //console.log(`Queried information for ${userInfo.length} users`); // //// Filter users who should be notified //const usersToNotify = userInfo.filter(user => this.shouldNotifyUser(user)); //console.log(`Identified ${usersToNotify.length} users to notify`); // //// Notify users //for (const user of usersToNotify) { // await this.redditNotifier.notifyUser(user); // console.log(`Notified user: ${user.username}`); //} console.log('Workflow executed successfully.'); } catch (error) { console.error('An error occurred during workflow execution:', error); } } /** * Determines whether a user should be notified based on certain criteria. * * @param user - The user information object. * @returns A boolean indicating whether the user should be notified. */ //private shouldNotifyUser(user: UserInfo): boolean { // // Placeholder for the actual logic to determine if a user should be notified. // // This could involve checking the last notification time against the current time, // // user preferences, or other criteria defined in the business logic. // // // Example logic (to be replaced with actual implementation): // const lastNotifiedTime = new Date(user.lastNotified); // Assuming 'lastNotified' is a Date or string. // const notificationThreshold = 24 * 60 * 60 * 1000; // 24 hours in milliseconds. // return (Date.now() - lastNotifiedTime.getTime()) > notificationThreshold; //} } export default WorkflowOrchestrator;