File size: 4,076 Bytes
305d870
 
5a8c7cd
2f62045
 
305d870
 
 
5a8c7cd
305d870
 
2f62045
 
5a8c7cd
 
 
 
2f62045
5a8c7cd
2f62045
5a8c7cd
 
 
 
 
2f62045
5a8c7cd
 
 
 
 
 
 
2f62045
 
5a8c7cd
 
2f62045
 
 
 
 
5a8c7cd
 
 
 
 
 
2f62045
 
 
 
 
 
 
 
 
5a8c7cd
305d870
 
2f62045
 
 
305d870
2f62045
5a8c7cd
2f62045
 
 
 
 
5a8c7cd
2f62045
 
305d870
2f62045
 
305d870
5a8c7cd
2f62045
5a8c7cd
2f62045
305d870
2f62045
 
 
305d870
 
2f62045
 
 
 
305d870
 
 
 
 
 
 
2f62045
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305d870
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import requests
from flask import Flask, request, jsonify
from datetime import datetime
import base64
import json

app = Flask(__name__)

# PythonAnywhere API endpoint
PYTHONANYWHERE_URL = "https://omarnuwara.pythonanywhere.com/get-response"

# GitHub API and file information
GITHUB_TOKEN = "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"  # Store this in .env in production
REPO_OWNER = "omarnuwrar"
REPO_NAME = "api"
FILE_PATH = "user.json"


def fetch_user_data():
    """Fetch user data from GitHub repo."""
    url = f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/contents/{FILE_PATH}"
    headers = {
        "Authorization": f"token {GITHUB_TOKEN}",
        "Accept": "application/vnd.github.v3+json",
    }

    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        content = response.json()
        file_content = content["content"]
        file_decoded = base64.b64decode(file_content).decode("utf-8")
        return json.loads(file_decoded)
    else:
        print(f"Failed to fetch file: {response.status_code}")
        print(response.json())
        return None


def is_token_valid(token):
    """
    Check if the provided token is valid and unexpired.
    """
    user_data = fetch_user_data()
    if not user_data:
        return False, "Unable to fetch user data."

    for user in user_data:
        if user["token"] == token:
            # Parse token expiration time
            expiration_time = datetime.fromisoformat(user["token_expiration_time"])
            if datetime.now() <= expiration_time:
                return True, None

            return False, "Your token has expired. Please subscribe to continue."

    return False, "Invalid token. Please log in or create an account."


@app.route('/chat', methods=['POST'])
def chat():
    """
    Chat endpoint. Requires a valid token.
    """
    try:
        # Ensure the request contains JSON
        if not request.is_json:
            return jsonify({"error": "Invalid request format. JSON expected."}), 400

        # Extract message and token from the request body
        user_input = request.json.get("message", "")
        user_token = request.json.get("token", "")

        if not user_input:
            return jsonify({"error": "No message provided."}), 400

        if not user_token:
            return jsonify({"error": "No token provided."}), 400

        # Validate the token
        is_valid, error_message = is_token_valid(user_token)
        if not is_valid:
            return jsonify({"error": error_message}), 403

        # Forward the request to PythonAnywhere
        data = {"message": user_input}
        response = requests.post(PYTHONANYWHERE_URL, json=data)

        if response.status_code == 200:
            response_json = response.json()
            ai_response = response_json.get("response", "No 'response' key found in the JSON.")
            ai_response = ai_response.encode('latin1').decode('utf-8', 'ignore')
            return jsonify({"response": ai_response})
        else:
            return jsonify({
                "error": "Error from PythonAnywhere",
                "details": response.text
            }), response.status_code

    except Exception as e:
        return jsonify({"error": "An error occurred", "details": str(e)}), 500


@app.route('/get-payload', methods=['GET'])
def get_payload():
    """
    Get payload from the request body. Requires a valid token.
    """
    try:
        # Extract token from query parameters
        user_token = request.args.get("token", "")

        if not user_token:
            return jsonify({"error": "No token provided."}), 400

        # Validate the token
        is_valid, error_message = is_token_valid(user_token)
        if not is_valid:
            return jsonify({"error": error_message}), 403

        return jsonify({"payload": "This is a demo payload response."})
    
    except Exception as e:
        return jsonify({"error": "An error occurred", "details": str(e)}), 500


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7860)