From 28de4f60cb7ea9fc7e389c398934f6c0a6779d0a Mon Sep 17 00:00:00 2001 From: davek-ai Date: Thu, 12 Jun 2025 22:07:52 -0700 Subject: [PATCH 1/2] update x_creds handler_config --- config.py | 1 + services/runner/tasks/tweet_task.py | 54 +++++++++++++++++++++-------- services/webhooks/dao/handler.py | 19 +++++++++- 3 files changed, 59 insertions(+), 15 deletions(-) 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..23f343a 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,33 @@ 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 +145,22 @@ 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..2a2636f 100644 --- a/services/webhooks/dao/handler.py +++ b/services/webhooks/dao/handler.py @@ -4,7 +4,8 @@ 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 +54,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 +117,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, From 0942531cdb6fed85ac8c36cb985068c1f4b77d81 Mon Sep 17 00:00:00 2001 From: human058382928 <162091348+human058382928@users.noreply.github.com> Date: Thu, 12 Jun 2025 22:38:55 -0700 Subject: [PATCH 2/2] format --- services/runner/tasks/tweet_task.py | 36 ++++++++++++++++------------- services/webhooks/dao/handler.py | 10 ++++++-- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/services/runner/tasks/tweet_task.py b/services/runner/tasks/tweet_task.py index 23f343a..cf3bd28 100644 --- a/services/runner/tasks/tweet_task.py +++ b/services/runner/tasks/tweet_task.py @@ -114,14 +114,16 @@ async def _initialize_twitter_service(self, dao_id: UUID) -> bool: return False # 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, - ]): + 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 @@ -150,14 +152,16 @@ async def _validate_config(self, context: JobContext) -> bool: 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, - ]): + 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 diff --git a/services/webhooks/dao/handler.py b/services/webhooks/dao/handler.py index 2a2636f..cfb0e58 100644 --- a/services/webhooks/dao/handler.py +++ b/services/webhooks/dao/handler.py @@ -4,7 +4,13 @@ from uuid import UUID from backend.factory import backend -from backend.models import ContractStatus, DAOCreate, ExtensionCreate, TokenCreate, XCredsCreate +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 @@ -63,7 +69,7 @@ async def handle(self, parsed_data: DAOWebhookPayload) -> Dict[str, Any]: 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 + username=config.twitter.default_username, ) x_creds = self.db.create_x_creds(new_cred)