Skip to content

Commit

Permalink
get and set cookies
Browse files Browse the repository at this point in the history
  • Loading branch information
elliotBraem committed Jan 20, 2025
1 parent 792ad16 commit d6b409c
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 36 deletions.
108 changes: 77 additions & 31 deletions backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
startSpinner,
succeedSpinner,
} from "./utils/logger";
import { TwitterCookie } from "types/twitter";

const PORT = Number(process.env.PORT) || 3000;
const FRONTEND_DIST_PATH =
Expand All @@ -31,6 +32,10 @@ const ALLOWED_ORIGINS = [
];

export async function main() {
let twitterService: TwitterService | null = null;
let submissionService: SubmissionService | null = null;
let distributionService: DistributionService | null = null;

try {
// Load environment variables and config
startSpinner("env", "Loading environment variables and config...");
Expand All @@ -39,33 +44,39 @@ export async function main() {
await configService.loadConfig();
succeedSpinner("env", "Environment variables and config loaded");

// Initialize Twitter service
startSpinner("twitter-init", "Initializing Twitter service...");
const twitterService = new TwitterService({
username: process.env.TWITTER_USERNAME!,
password: process.env.TWITTER_PASSWORD!,
email: process.env.TWITTER_EMAIL!,
twoFactorSecret: process.env.TWITTER_2FA_SECRET,
});
await twitterService.initialize();
succeedSpinner("twitter-init", "Twitter service initialized");

// Initialize distribution service
startSpinner("distribution-init", "Initializing distribution service...");
const distributionService = new DistributionService();
distributionService = new DistributionService();
const config = configService.getConfig();
await distributionService.initialize(config.plugins);
succeedSpinner("distribution-init", "distribution service initialized");

// Initialize submission service
startSpinner("submission-init", "Initializing submission service...");
const submissionService = new SubmissionService(
twitterService,
distributionService,
config,
);
await submissionService.initialize();
succeedSpinner("submission-init", "Submission service initialized");
// Try to initialize Twitter service, but continue if it fails
try {
startSpinner("twitter-init", "Initializing Twitter service...");
twitterService = new TwitterService({
username: process.env.TWITTER_USERNAME!,
password: process.env.TWITTER_PASSWORD!,
email: process.env.TWITTER_EMAIL!,
twoFactorSecret: process.env.TWITTER_2FA_SECRET,
});
await twitterService.initialize();
succeedSpinner("twitter-init", "Twitter service initialized");

// Only initialize submission service if Twitter is available
startSpinner("submission-init", "Initializing submission service...");
submissionService = new SubmissionService(
twitterService,
distributionService,
config,
);
await submissionService.initialize();
succeedSpinner("submission-init", "Submission service initialized");
} catch (error) {
failSpinner("twitter-init", "Failed to initialize Twitter service");
logger.warn("Twitter service initialization failed:", error);
logger.info("Continuing without Twitter integration");
}

// Initialize server
startSpinner("server", "Starting server...");
Expand Down Expand Up @@ -95,12 +106,18 @@ export async function main() {
.get("/health", () => new Response("OK", { status: 200 }))
// API Routes
.get("/api/last-tweet-id", () => {
if (!twitterService) {
throw new Error("Twitter service not available");
}
const lastTweetId = twitterService.getLastCheckedTweetId();
return { lastTweetId };
})
.post(
"/api/last-tweet-id",
async ({ body }: { body: { tweetId: string } }) => {
if (!twitterService) {
throw new Error("Twitter service not available");
}
if (
!body?.tweetId ||
typeof body.tweetId !== "string" ||
Expand Down Expand Up @@ -160,7 +177,27 @@ export async function main() {
const config = configService.getConfig();
return config;
})
.post("/api/twitter/cookies", async ({ body }: { body: TwitterCookie[] }) => {
if (!twitterService) {
throw new Error("Twitter service not available");
}
if (!Array.isArray(body)) {
throw new Error("Expected array of cookies");
}
await twitterService.setCookies(body);
return { success: true };
})
.get("/api/twitter/cookies", () => {
if (!twitterService) {
throw new Error("Twitter service not available");
}
const cookies = twitterService.getCookies();
return cookies || [];
})
.post("/api/twitter/clear-cookies", async () => {
if (!twitterService) {
throw new Error("Twitter service not available");
}
try {
await twitterService.clearCookies();
return {
Expand All @@ -187,6 +224,9 @@ export async function main() {
.get(
"/plugin/rss/:feedId",
({ params: { feedId } }: { params: { feedId: string } }) => {
if (!distributionService) {
throw new Error("Distribution service not available");
}
const rssPlugin = distributionService.getPlugin("rss");
if (!rssPlugin || !(rssPlugin instanceof RssPlugin)) {
throw new Error("RSS plugin not found or invalid");
Expand Down Expand Up @@ -225,6 +265,9 @@ export async function main() {

// Process each submission through stream output
let processed = 0;
if (!distributionService) {
throw new Error("Distribution service not available");
}
for (const submission of submissions) {
try {
await distributionService.processStreamOutput(
Expand Down Expand Up @@ -264,11 +307,12 @@ export async function main() {
process.on("SIGINT", async () => {
startSpinner("shutdown", "Shutting down gracefully...");
try {
await Promise.all([
twitterService.stop(),
submissionService.stop(),
distributionService.shutdown(),
]);
const shutdownPromises = [];
if (twitterService) shutdownPromises.push(twitterService.stop());
if (submissionService) shutdownPromises.push(submissionService.stop());
if (distributionService) shutdownPromises.push(distributionService.shutdown());

await Promise.all(shutdownPromises);
succeedSpinner("shutdown", "Shutdown complete");
process.exit(0);
} catch (error) {
Expand All @@ -278,12 +322,14 @@ export async function main() {
}
});

logger.info("🚀 Bot is running and ready for events");
logger.info("🚀 Server is running and ready");

// Start checking for mentions
startSpinner("submission-monitor", "Starting submission monitoring...");
await submissionService.startMentionsCheck();
succeedSpinner("submission-monitor", "Submission monitoring started");
// Start checking for mentions only if Twitter service is available
if (submissionService) {
startSpinner("submission-monitor", "Starting submission monitoring...");
await submissionService.startMentionsCheck();
succeedSpinner("submission-monitor", "Submission monitoring started");
}
} catch (error) {
// Handle any initialization errors
[
Expand Down
36 changes: 31 additions & 5 deletions backend/src/services/twitter/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,16 @@ export class TwitterService {

private async loadCachedCookies(): Promise<boolean> {
try {
const cachedCookies = db.getTwitterCookies(this.twitterUsername);
const cachedCookies = this.getCookies();
if (!cachedCookies) {
return false;
}

// Convert cached cookies to the format expected by the client
const cookieStrings = cachedCookies.map(
(cookie) =>
`${cookie.name}=${cookie.value}; Domain=${cookie.domain}; Path=${cookie.path}; ${
cookie.secure ? "Secure" : ""
}; ${cookie.httpOnly ? "HttpOnly" : ""}; SameSite=${
cookie.sameSite || "Lax"
`${cookie.name}=${cookie.value}; Domain=${cookie.domain}; Path=${cookie.path}; ${cookie.secure ? "Secure" : ""
}; ${cookie.httpOnly ? "HttpOnly" : ""}; SameSite=${cookie.sameSite || "Lax"
}`,
);
await this.client.setCookies(cookieStrings);
Expand Down Expand Up @@ -79,6 +77,34 @@ export class TwitterService {
}
}

async setCookies(cookies: TwitterCookie[]) {
try {
logger.info("Setting Twitter cookies...");
// Convert cookies to the format expected by the client
const cookieStrings = cookies.map(
(cookie) =>
`${cookie.name}=${cookie.value}; Domain=${cookie.domain}; Path=${cookie.path}; ${cookie.secure ? "Secure" : ""
}; ${cookie.httpOnly ? "HttpOnly" : ""}; SameSite=${cookie.sameSite || "Lax"
}`,
);
await this.client.setCookies(cookieStrings);
// Store cookies in database
db.setTwitterCookies(this.config.username, cookies);
// Verify the cookies work
if (!(await this.client.isLoggedIn())) {
throw new Error("Failed to verify cookies after setting");
}
return true;
} catch (error) {
logger.error("Failed to set Twitter cookies:", error);
throw error;
}
}

getCookies() {
return db.getTwitterCookies(this.twitterUsername);
}

async initialize() {
try {
// First try to use cached cookies
Expand Down

0 comments on commit d6b409c

Please sign in to comment.