diff --git a/config.py b/config.py index be74098..febe867 100644 --- a/config.py +++ b/config.py @@ -34,6 +34,7 @@ class TwitterConfig: client_secret: str = os.getenv("AIBTC_TWITTER_CLIENT_SECRET", "") access_token: str = os.getenv("AIBTC_TWITTER_ACCESS_TOKEN", "") access_secret: str = os.getenv("AIBTC_TWITTER_ACCESS_SECRET", "") + username: str = os.getenv("AIBTC_TWITTER_USERNAME", "") automated_user_id: str = os.getenv("AIBTC_TWITTER_AUTOMATED_USER_ID", "") whitelisted_authors: List[str] = field( default_factory=lambda: os.getenv("AIBTC_TWITTER_WHITELISTED", "").split(",") diff --git a/services/runner/tasks/tweet_task.py b/services/runner/tasks/tweet_task.py index 1b29b6f..cf3bd28 100644 --- a/services/runner/tasks/tweet_task.py +++ b/services/runner/tasks/tweet_task.py @@ -8,7 +8,6 @@ QueueMessageBase, QueueMessageFilter, QueueMessageType, - XCredsFilter, ) import re from io import BytesIO @@ -17,6 +16,7 @@ import requests import tweepy +from config import config from lib.logger import configure_logger from lib.twitter import TwitterService from lib.utils import extract_image_urls @@ -106,22 +106,35 @@ def _post_tweet_with_media( return None async def _initialize_twitter_service(self, dao_id: UUID) -> bool: - """Initialize Twitter service with credentials for the given DAO.""" + """Initialize Twitter service with credentials from config.""" try: - # Get Twitter credentials for the DAO - creds = backend.list_x_creds(filters=XCredsFilter(dao_id=dao_id)) - if not creds: - logger.error(f"No Twitter credentials found for DAO {dao_id}") + # Check if Twitter is enabled in config + if not config.twitter.enabled: + logger.error("Twitter service is disabled in configuration") return False - # Initialize Twitter service with the credentials + # Validate that required Twitter credentials are configured + if not all( + [ + config.twitter.consumer_key, + config.twitter.consumer_secret, + config.twitter.client_id, + config.twitter.client_secret, + config.twitter.access_token, + config.twitter.access_secret, + ] + ): + logger.error("Missing required Twitter credentials in configuration") + return False + + # Initialize Twitter service with credentials from config self.twitter_service = TwitterService( - consumer_key=creds[0].consumer_key, - consumer_secret=creds[0].consumer_secret, - client_id=creds[0].client_id, - client_secret=creds[0].client_secret, - access_token=creds[0].access_token, - access_secret=creds[0].access_secret, + consumer_key=config.twitter.consumer_key, + consumer_secret=config.twitter.consumer_secret, + client_id=config.twitter.client_id, + client_secret=config.twitter.client_secret, + access_token=config.twitter.access_token, + access_secret=config.twitter.access_secret, ) await self.twitter_service._ainitialize() logger.debug(f"Initialized Twitter service for DAO {dao_id}") @@ -134,7 +147,24 @@ async def _initialize_twitter_service(self, dao_id: UUID) -> bool: async def _validate_config(self, context: JobContext) -> bool: """Validate task configuration.""" try: - # No specific config validation needed as credentials are per-DAO + # Validate Twitter configuration + if not config.twitter.enabled: + logger.debug("Twitter service is disabled") + return False + + if not all( + [ + config.twitter.consumer_key, + config.twitter.consumer_secret, + config.twitter.client_id, + config.twitter.client_secret, + config.twitter.access_token, + config.twitter.access_secret, + ] + ): + logger.error("Missing required Twitter credentials in configuration") + return False + return True except Exception as e: logger.error(f"Error validating tweet task config: {str(e)}", exc_info=True) diff --git a/services/webhooks/dao/handler.py b/services/webhooks/dao/handler.py index af37203..cfb0e58 100644 --- a/services/webhooks/dao/handler.py +++ b/services/webhooks/dao/handler.py @@ -4,7 +4,14 @@ from uuid import UUID from backend.factory import backend -from backend.models import ContractStatus, DAOCreate, ExtensionCreate, TokenCreate +from backend.models import ( + ContractStatus, + DAOCreate, + ExtensionCreate, + TokenCreate, + XCredsCreate, +) +from config import config from lib.logger import configure_logger from services.webhooks.base import WebhookHandler from services.webhooks.dao.models import ( @@ -53,6 +60,21 @@ async def handle(self, parsed_data: DAOWebhookPayload) -> Dict[str, Any]: dao = self.db.create_dao(dao_create) self.logger.info(f"Created DAO with ID: {dao.id}") + # Create X credentials for the DAO + new_cred = XCredsCreate( + dao_id=dao.id, + consumer_key=config.twitter.default_consumer_key, + consumer_secret=config.twitter.default_consumer_secret, + client_id=config.twitter.default_client_id, + client_secret=config.twitter.default_client_secret, + access_token=config.twitter.default_access_token, + access_secret=config.twitter.default_access_secret, + username=config.twitter.default_username, + ) + + x_creds = self.db.create_x_creds(new_cred) + self.logger.info(f"Created X credentials with ID: {x_creds.id}") + # Find the main DAO token contract dao_token_contract = None for contract in parsed_data.contracts: @@ -101,6 +123,7 @@ async def handle(self, parsed_data: DAOWebhookPayload) -> Dict[str, Any]: self.logger.info( f"Created extension with ID: {extension.id} for type: {contract.type.value} and subtype: {contract.subtype}" ) + # Prepare response response = DAOWebhookResponse( dao_id=dao.id,