build-in-public-bot
Version:
AI-powered CLI bot for automating build-in-public tweets with code screenshots
104 lines • 5.26 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.codeCommand = codeCommand;
const logger_1 = require("../utils/logger");
const config_1 = require("../services/config");
const ai_1 = require("../services/ai");
const screenshot_1 = require("../services/screenshot");
const storage_1 = require("../services/storage");
const twitter_1 = require("../services/twitter");
const prompts_1 = require("../utils/prompts");
const chalk_1 = __importDefault(require("chalk"));
async function codeCommand(file, caption, options) {
const configService = config_1.ConfigService.getInstance();
const aiService = ai_1.AIService.getInstance();
const screenshotService = screenshot_1.ScreenshotService.getInstance();
const storageService = storage_1.StorageService.getInstance();
const twitterService = twitter_1.TwitterService.getInstance();
try {
const config = await configService.load();
logger_1.logger.startSpinner('Reading code file...');
const { code, language } = await screenshotService.readCodeFile(file, options.lines);
logger_1.logger.stopSpinner(true, 'Code file read successfully!');
console.log('\n' + chalk_1.default.bold('Code Preview:'));
console.log(chalk_1.default.gray('─'.repeat(50)));
const preview = code.split('\n').slice(0, 10).join('\n');
console.log(preview);
if (code.split('\n').length > 10) {
console.log(chalk_1.default.gray('... (truncated)'));
}
console.log(chalk_1.default.gray('─'.repeat(50)));
console.log(chalk_1.default.gray(`Language: ${language}`));
console.log(chalk_1.default.gray(`Lines: ${code.split('\n').length}\n`));
let tweetText = caption;
if (!tweetText) {
const generateCaption = await (0, prompts_1.confirm)('No caption provided. Would you like AI to generate one?', true);
if (generateCaption) {
logger_1.logger.startSpinner('Generating caption with AI...');
const codeContext = `I'm sharing a ${language} code snippet that shows: ${code.substring(0, 200)}...`;
tweetText = await aiService.generateTweet({ message: codeContext, includeScreenshot: false }, config);
logger_1.logger.stopSpinner(true, 'Caption generated!');
}
else {
tweetText = await (0, prompts_1.prompt)('Enter caption for the code screenshot');
}
}
console.log('\n' + chalk_1.default.bold('Tweet Preview:'));
console.log(chalk_1.default.cyan('─'.repeat(50)));
console.log(tweetText);
console.log(chalk_1.default.gray('\n[Code screenshot will be attached]'));
console.log(chalk_1.default.cyan('─'.repeat(50)));
console.log(chalk_1.default.gray(`Character count: ${tweetText.length}/280\n`));
let shouldPost = options.confirm;
if (shouldPost) {
shouldPost = await (0, prompts_1.confirm)('Do you want to post this tweet?', true);
}
if (shouldPost) {
logger_1.logger.startSpinner('Generating code screenshot...');
const screenshotBuffer = await screenshotService.generateCodeScreenshot(code, language, config.screenshots);
const screenshotPath = await screenshotService.saveScreenshot(screenshotBuffer);
logger_1.logger.stopSpinner(true, 'Screenshot generated!');
try {
logger_1.logger.startSpinner('Posting tweet with screenshot...');
const result = await twitterService.post(tweetText, screenshotBuffer);
logger_1.logger.stopSpinner(true, 'Posted to Twitter!');
const tweet = {
id: result.id,
text: tweetText,
createdAt: new Date(),
url: result.url,
mediaUrls: [screenshotPath]
};
await storageService.saveTweet(tweet);
logger_1.logger.success('Tweet with code screenshot posted successfully! 🚀');
if (result.url) {
logger_1.logger.info(`View your tweet: ${result.url}`);
}
}
catch (error) {
logger_1.logger.stopSpinner(false, 'Failed to post to Twitter');
const draft = {
id: `draft-${Date.now()}`,
text: tweetText,
createdAt: new Date(),
includeScreenshot: true,
screenshotPath: screenshotPath
};
await storageService.saveDraft(draft);
logger_1.logger.error(`Twitter posting failed: ${error.message}`);
logger_1.logger.info('Tweet saved as draft with screenshot.');
}
}
else {
logger_1.logger.info('Tweet cancelled.');
}
}
catch (error) {
logger_1.logger.stopSpinner(false, 'Failed to create code screenshot');
throw error;
}
}
//# sourceMappingURL=code.js.map
;