1212 MODEL_AVAILABLE = True
1313except ImportError :
1414 MODEL_AVAILABLE = False
15+ predict_image = None
1516 print ("Warning: ML model not available" )
1617
1718try :
1819 from app .data .disease_info import return_info , cart
1920 DATA_AVAILABLE = True
2021except ImportError :
2122 DATA_AVAILABLE = False
23+ return_info = None
24+ cart = None
2225 print ("Warning: Disease info data not available" )
2326
2427
@@ -30,31 +33,56 @@ def __init__(self, app):
3033 self .app = app
3134 self .user_languages : Dict [str , str ] = {}
3235 self .translator = Translator ()
36+ self .wa = None
37+ self .is_initialized = False
38+ self .settings = get_settings ()
3339
34- # Get settings
35- settings = get_settings ()
40+ # Don't initialize WhatsApp immediately - do it lazily
41+ logging .info ("WhatsApp bot service created (lazy initialization)" )
42+
43+ def _ensure_whatsapp_initialized (self ) -> bool :
44+ """Ensure WhatsApp client is initialized. Returns True if successful."""
45+ if self .is_initialized and self .wa is not None :
46+ return True
47+
48+ # Check if WhatsApp configuration is complete
49+ if not self .settings .has_whatsapp_config ():
50+ logging .warning ("WhatsApp configuration incomplete. Service will be disabled." )
51+ return False
3652
3753 try :
3854 self .wa = WhatsApp (
39- phone_id = settings .PHONE_NUMBER_ID ,
40- token = settings .ACCESS_TOKEN_LTM ,
55+ phone_id = self . settings .PHONE_NUMBER_ID ,
56+ token = self . settings .ACCESS_TOKEN_LTM ,
4157 server = self .app ,
42- callback_url = settings .CALLBACK_URL ,
43- verify_token = settings .VERIFY_TOKEN ,
44- app_id = settings .APP_ID ,
45- app_secret = settings .APP_SECRET ,
58+ callback_url = self . settings .CALLBACK_URL ,
59+ verify_token = self . settings .VERIFY_TOKEN ,
60+ app_id = self . settings .APP_ID ,
61+ app_secret = self . settings .APP_SECRET ,
4662 )
63+ self ._register_handlers ()
64+ self .is_initialized = True
4765 logging .info ("WhatsApp client initialized successfully." )
66+ return True
4867 except Exception as e :
4968 logging .error (f"Failed to initialize WhatsApp client: { e } " )
50- raise
51-
52- self ._register_handlers ()
69+ logging .warning ("WhatsApp service will be disabled." )
70+ return False
5371
5472 def _register_handlers (self ) -> None :
5573 """Register message handlers."""
56- self .wa .on_message (filters .matches ("Hello" , "Hi" , ignore_case = True ))(self .handle_menu )
57- self .wa .on_message (filters .image )(self .handle_analyze )
74+ if self .wa is None :
75+ return
76+ try :
77+ self .wa .on_message (filters .matches ("Hello" , "Hi" , ignore_case = True ))(self .handle_menu )
78+ self .wa .on_message (filters .image )(self .handle_analyze )
79+ logging .info ("WhatsApp handlers registered successfully." )
80+ except Exception as e :
81+ logging .error (f"Failed to register WhatsApp handlers: { e } " )
82+
83+ def initialize_whatsapp (self ) -> bool :
84+ """Public method to initialize WhatsApp service."""
85+ return self ._ensure_whatsapp_initialized ()
5886
5987 async def translate_text (self , text : str , dest : str ) -> str :
6088 """Translate text to the specified language."""
@@ -93,6 +121,10 @@ async def prompt_language(self, msg: types.Message) -> str:
93121
94122 async def handle_menu (self , _ , msg : types .Message ) -> None :
95123 """Handle greeting messages and language selection."""
124+ if not self ._ensure_whatsapp_initialized ():
125+ logging .error ("WhatsApp service not available" )
126+ return
127+
96128 language = await self .prompt_language (msg )
97129 self .user_languages [str (msg .from_user )] = language
98130
@@ -104,6 +136,11 @@ async def handle_menu(self, _, msg: types.Message) -> None:
104136 async def handle_analyze (self , _ , msg : types .Message ) -> None :
105137 """Handle image analysis requests."""
106138 try :
139+ # Check if ML model is available
140+ if not MODEL_AVAILABLE :
141+ await msg .reply ("Sorry, the disease detection service is currently unavailable." )
142+ return
143+
107144 # Get or prompt for user language
108145 if str (msg .from_user ) in self .user_languages :
109146 language = self .user_languages [str (msg .from_user )]
@@ -120,27 +157,34 @@ async def handle_analyze(self, _, msg: types.Message) -> None:
120157 await msg .reply (text = process_warn )
121158
122159 # Predict disease
123- image_disease = predict_image (original_img )
124- product = cart (image_disease )
125-
126- # Send response
127- if product is not None :
128- translated_info = await self .translate_text (
129- return_info (image_disease ), language
130- )
131- translated_product = await self .translate_text (product [0 ], language )
160+ if MODEL_AVAILABLE and predict_image is not None :
161+ image_disease = predict_image (original_img )
132162
133- await msg .reply (
134- text = translated_info ,
135- buttons = types .ButtonUrl (
136- title = translated_product [:20 ], url = product [1 ]
137- ),
138- )
163+ if DATA_AVAILABLE and cart is not None and return_info is not None :
164+ product = cart (image_disease )
165+
166+ # Send response
167+ if product is not None :
168+ translated_info = await self .translate_text (
169+ return_info (image_disease ), language
170+ )
171+ translated_product = await self .translate_text (product [0 ], language )
172+
173+ await msg .reply (
174+ text = translated_info ,
175+ buttons = types .ButtonUrl (
176+ title = translated_product [:20 ], url = product [1 ]
177+ ),
178+ )
179+ else :
180+ translated_info = await self .translate_text (
181+ return_info (image_disease ), language
182+ )
183+ await msg .reply (text = translated_info )
184+ else :
185+ await msg .reply (f"Detected disease: { image_disease } " )
139186 else :
140- translated_info = await self .translate_text (
141- return_info (image_disease ), language
142- )
143- await msg .reply (text = translated_info )
187+ await msg .reply ("Disease detection service is currently unavailable." )
144188
145189 except Exception as e :
146190 logging .error (f"Error in analyze function: { e } " )
0 commit comments