From d52dfe75a28e8874d6b2bf8c76c843c0f2af1ab9 Mon Sep 17 00:00:00 2001 From: Ekaropolus Date: Tue, 22 Jul 2025 21:24:12 -0600 Subject: [PATCH] Again refactor --- pxy_meta_pages/services.py | 168 +++++++++++++++++++++---------------- 1 file changed, 95 insertions(+), 73 deletions(-) diff --git a/pxy_meta_pages/services.py b/pxy_meta_pages/services.py index c10923f..da0d32e 100644 --- a/pxy_meta_pages/services.py +++ b/pxy_meta_pages/services.py @@ -65,90 +65,112 @@ class FacebookService: return None def post_comment_on_share(self, page_id, post_id, message, sender_id=None): - """ - Posts a comment on a shared post using the Facebook API. - Fetches post details (description, parent_id) to improve the comment. - If parent_id exists, posts the same comment on the original post. - """ - # Retrieve the Page Access Token dynamically - page_access_token = self._get_page_access_token(page_id) - if not page_access_token: - logger.error(f"Unable to retrieve access token for page ID: {page_id}") - return None + """ + Posts a comment on a shared post and then on the original post. + """ + # 1) Fetch token + page_access_token = self._get_page_access_token(page_id) + if not page_access_token: + logger.error(f"Unable to retrieve access token for page ID: {page_id}") + return None - # Fetch post details (description, parent_id) - post_details = self._get_post_details(post_id, page_access_token) - if not post_details: - logger.error(f"Failed to retrieve post details for post ID: {post_id}") - return None + # 2) Fetch details + post_details = self._get_post_details(post_id, page_access_token) + if not post_details: + logger.error(f"Failed to retrieve post details for post ID: {post_id}") + return None - description = post_details.get("parent_message", None) - parent_id = post_details.get("parent_id", None) - author_page_id = post_details.get("parent_from_id", None) + description = post_details.get("parent_message") + parent_id = post_details.get("parent_id") + author_page_id = post_details.get("parent_from_id") + # 3) Load assistant + try: + page_assistant = FacebookPageAssistant.objects.get(page_id=page_id) + openai_assistant_model = page_assistant.assistant + except ObjectDoesNotExist: + logger.error(f"No assistant configured for page ID: {page_id}") + return None - # Fetch the appropriate OpenAI assistant for the page - try: - page_assistant = FacebookPageAssistant.objects.get(page_id=page_id) - openai_assistant_model = page_assistant.assistant - logger.info(f"Using assistant '{openai_assistant_model.name}' for page '{page_assistant.page_name}'") - except ObjectDoesNotExist: - logger.error(f"No assistant configured for page ID: {page_id}") - return None + # 4) Build prompt & get AI response + prompt = self._build_prompt(message, description) + openai_svc = OpenAIService(name=openai_assistant_model.name) + bot_response = openai_svc.handle_message(prompt) - # Generate a meaningful comment based on available data - if not message or message.strip() == "": - if description: - prompt = ( - f"Dr. Dr. Ekaropolus previously said: '{description}'. " - "Based on this, write an insightful response in the most appropriate language that engages people in scientific discussion." - ) - else: - prompt = "Say something truly inspiring about science, a fact or idea that will amaze people." + # 5) Post on shared post + shared = self._post_facebook_comment( + post_id, + bot_response, + page_access_token, + sender_id=author_page_id + ) + if shared: + self._store_interaction( + page_id, + user_message=description or "Shared post comment", + bot_response=bot_response, + platform="Facebook" + ) - else: - if description: - prompt = ( - f"Dr. Dr. Ekaropolus previously said: '{message}', " - f"and the shared post describes: '{description}'. " - "Combine these thoughts into an engaging, fun, and insightful response in the most appropriate language." - ) - else: - prompt = f"Dr. Dr. Ekaropolus said: '{message}'. Expand on this with an insightful scientific thought." - - openai_service = OpenAIService(name=openai_assistant_model.name) - bot_response = openai_service.handle_message(prompt) - - sender_id = author_page_id - # Post a comment on the shared post - shared_comment_response = self._post_facebook_comment(post_id, bot_response, page_access_token, sender_id) - - # If the comment on the shared post was successful, store in Neo4j - if shared_comment_response: - self.neo4j_db.store_interaction( - user_id=f"fb_bot_{page_id}", - bot_id=f"fb_bot_{page_id}", - user_message=description if description else "Shared post comment", + # 6) Post on original post + if parent_id and shared: + orig = self._post_facebook_comment(parent_id, bot_response, page_access_token) + if orig: + self._store_interaction( + page_id, + user_message=description or "Original post comment", bot_response=bot_response, - platform="Facebook" + platform="Facebook (Original Post)" ) - # If parent_id exists and the first comment was successful, post the same comment on the original post - if parent_id and shared_comment_response: - logger.info(f"Also commenting on the original post: {parent_id}") - original_comment_response = self._post_facebook_comment(parent_id, bot_response, page_access_token) + return shared - # If the comment on the original post was successful, store in Neo4j - if original_comment_response: - self.neo4j_db.store_interaction( - user_id=f"fb_bot_{page_id}", - bot_id=f"fb_bot_{page_id}", - user_message=description if description else "Original post comment", - bot_response=bot_response, - platform="Facebook (Original Post)" - ) + # ─── Helper: prompt builder ──────────────────────────────────────────── + + def _build_prompt(self, message: str, description: str) -> str: + """ + Generate the same prompt logic you had inline. + """ + if not message or message.strip() == "": + if description: + return ( + f"Dr. Dr. Ekaropolus previously said: '{description}'. " + "Based on this, write an insightful response in the most appropriate language that engages people in scientific discussion." + ) + else: + return "Say something truly inspiring about science, a fact or idea that will amaze people." + else: + if description: + return ( + f"Dr. Dr. Ekaropolus previously said: '{message}', " + f"and the shared post describes: '{description}'. " + "Combine these thoughts into an engaging, fun, and insightful response in the most appropriate language." + ) + else: + return f"Dr. Dr. Ekaropolus said: '{message}'. Expand on this with an insightful scientific thought." + + + def _store_interaction( + self, + page_id: str, + user_message: str, + bot_response: str, + platform: str + ) -> None: + """ + Encapsulates the repeated Neo4j store_interaction calls. + """ + try: + self.neo4j_db.store_interaction( + user_id = f"fb_bot_{page_id}", + bot_id = f"fb_bot_{page_id}", + user_message = user_message, + bot_response = bot_response, + platform = platform + ) + except Exception as e: + logger.error(f"Error logging interaction for page {page_id}: {e}") - return shared_comment_response def get_system_user_id(self):