bulletspace / app.py
ChandimaPrabath's picture
Update app.py
2f5f4e9 verified
raw
history blame
4.85 kB
import os
import threading
import requests
from flask import Flask, request, jsonify
from llm import generate_llm
from sd import generate_sd
GREEN_API_URL = os.getenv("GREEN_API_URL")
GREEN_API_MEDIA_URL = os.getenv("GREEN_API_MEDIA_URL", "https://api.green-api.com")
GREEN_API_TOKEN = os.getenv("GREEN_API_TOKEN")
GREEN_API_ID_INSTANCE = os.getenv("GREEN_API_ID_INSTANCE")
WEBHOOK_AUTH_TOKEN = os.getenv("WEBHOOK_AUTH_TOKEN")
PORT = 7860
if not all([GREEN_API_URL, GREEN_API_TOKEN, GREEN_API_ID_INSTANCE, WEBHOOK_AUTH_TOKEN]):
raise ValueError("Environment variables are not set properly")
app = Flask(__name__)
def send_message(message_id, to_number, message, retries=3):
"""
Send a text message using Green API with retry logic.
"""
if to_number.endswith('@g.us'):
chat_id = to_number
else:
chat_id = to_number
url = f"{GREEN_API_URL}/waInstance{GREEN_API_ID_INSTANCE}/sendMessage/{GREEN_API_TOKEN}"
payload = {
"chatId": chat_id,
"message": message,
"quotedMessageId": message_id,
}
for attempt in range(retries):
try:
response = requests.post(url, json=payload)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
if attempt < retries - 1:
continue
return {"error": str(e)}
def send_image(message_id, to_number, image_path, retries=3):
"""
Send an image using Green API with retry logic.
"""
if to_number.endswith('@g.us'):
chat_id = to_number
else:
chat_id = to_number
url = f"{GREEN_API_MEDIA_URL}/waInstance{GREEN_API_ID_INSTANCE}/sendFileByUpload/{GREEN_API_TOKEN}"
payload = {'chatId': chat_id, 'caption': 'Here you go!', 'quotedMessageId': message_id}
files = [('file', ('image.jpg', open(image_path, 'rb'), 'image/jpeg'))]
for attempt in range(retries):
try:
response = requests.post(url, data=payload, files=files)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
if attempt < retries - 1:
continue
return {"error": str(e)}
def response_text(message_id, chat_id, prompt):
"""
Generate a response using the LLM and send it to the user.
"""
try:
msg = generate_llm(prompt)
send_message(message_id, chat_id, msg)
except Exception as e:
send_message(message_id, chat_id, "There was an error processing your request.")
def handle_image_generation(message_id, chat_id, prompt):
"""
Generate an image from the provided prompt and send it to the user.
"""
try:
image_data, image_path = generate_sd(prompt)
if image_data:
send_image(message_id, chat_id, image_path)
else:
send_message(message_id, chat_id, "Failed to generate image. Please try again later.")
except Exception as e:
send_message(message_id, chat_id, "There was an error generating the image. Please try again later.")
@app.route('/', methods=['GET'])
def index():
"""
Basic endpoint to check if the script is running.
"""
return "Server is running!"
@app.route('/whatsapp', methods=['POST'])
def whatsapp_webhook():
"""
Handle incoming WhatsApp messages.
"""
data = request.get_json()
auth_header = request.headers.get('Authorization', '').strip()
if auth_header != f"Bearer {WEBHOOK_AUTH_TOKEN}":
return jsonify({"error": "Unauthorized"}), 403
if data.get('typeWebhook') != 'incomingMessageReceived':
return jsonify(success=True)
try:
chat_id = data['senderData']['chatId']
message_id = data['idMessage']
message_data = data.get('messageData', {})
if 'textMessageData' in message_data:
body = message_data['textMessageData']['textMessage'].strip()
elif 'extendedTextMessageData' in message_data:
body = message_data['extendedTextMessageData']['text'].strip()
else:
return jsonify(success=True)
except KeyError as e:
return jsonify({"error": f"Missing key in data: {e}"}), 200
if body.lower().startswith('/imagine'):
prompt = body.replace('/imagine', '').strip()
if not prompt:
send_message(message_id, chat_id, "Please provide a prompt after /imagine.")
else:
send_message(message_id, chat_id, "Generating...")
threading.Thread(target=handle_image_generation, args=(message_id, chat_id, prompt)).start()
else:
threading.Thread(target=response_text, args=(message_id, chat_id, body)).start()
return jsonify(success=True)
if __name__ == '__main__':
app.run(debug=True, port=PORT, host="0.0.0.0")