feat: replace browser login with imported Reddit sessions

This commit is contained in:
jjbrunton committed 2026-08-08 16:48:59 +01:00
1 parent 2b0545afcf
commit c483c7b8be
76 files changed
+2048 -2828

No files matched your search

+18 -18
View File
@@ -1,8 +1,8 @@
import type { Page } from 'playwright';
import type { Logger } from '../utils/logger.js';
import type { MessagesRepository, SuccessfulMessagesRepository, SentMessageRecord } from '../database/repositories.js';
import type { MessagesRepository, SuccessfulMessagesRepository, SentMessageRecord, ConversationOutcomesRepository } from '../database/repositories.js';
import type { PostsRepository } from '../database/repositories.js';
import type { AccountAuthGate } from './account-auth-context.js';
import { classifyConversationOutcome } from './conversation-outcome.js';
export interface ResponseCheckResult {
messageId: number;
@@ -18,15 +18,11 @@ export class ResponseCheckerService {
private successfulMessagesRepo: SuccessfulMessagesRepository,
private postsRepo: PostsRepository,
private logger: Logger,
private accountAuth?: AccountAuthGate,
private outcomesRepo?: ConversationOutcomesRepository,
) { }
async checkForResponses(): Promise<ResponseCheckResult[]> {
const results: ResponseCheckResult[] = [];
if (!this.accountAuth?.isFullyAuthenticated()) {
this.logger.debug('Response check skipped until full account authentication');
return results;
}
// Get messages that haven't been checked recently (at least 1 hour old, recheck every 6 hours)
const minAgeMs = 60 * 60 * 1000; // 1 hour
@@ -64,17 +60,21 @@ export class ResponseCheckerService {
// Get the original post info
const post = message.postId ? this.postsRepo.getById(message.postId) : undefined;
// Store as successful message for learning
this.successfulMessagesRepo.insert({
sentMessageId: message.id,
originalMessage: message.message,
imageAnalysis: post?.imageAnalysis || null,
postTitle: post?.title || null,
responseSnippet: result.responseSnippet || null,
subreddit: post?.subreddit || null,
});
this.logger.info(`Got response from u/${message.recipient}! Stored for learning.`);
const outcome = classifyConversationOutcome(result.responseSnippet ?? '');
this.outcomesRepo?.record(message.id, outcome, result.responseSnippet ?? null);
if (outcome === 'engaged') {
this.successfulMessagesRepo.insert({
sentMessageId: message.id,
originalMessage: message.message,
imageAnalysis: post?.imageAnalysis || null,
postTitle: post?.title || null,
responseSnippet: result.responseSnippet || null,
subreddit: post?.subreddit || null,
});
this.logger.info(`Engaged response from u/${message.recipient}; stored for learning.`);
} else {
this.logger.info(`Response from u/${message.recipient} classified as ${outcome}; excluded from learning examples.`);
}
} else {
// Just mark as checked
this.messagesRepo.markChecked(message.id);