File size: 2,410 Bytes
74af97c
20f4cd1
fa5c81c
 
534b6e8
3c2a81d
fa5c81c
 
 
 
3c2a81d
 
 
 
 
fa5c81c
3c2a81d
20f4cd1
3c2a81d
b2ebd1d
534b6e8
cfea4a6
 
 
88abbff
fa5c81c
88abbff
 
fa5c81c
 
 
 
 
 
 
 
 
 
 
88abbff
 
cfea4a6
 
 
 
fa5c81c
 
cfea4a6
 
3c2a81d
fa5c81c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3c2a81d
fac94c9
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
from flask import Flask, request, Response, copy_current_request_context
import requests
import asyncio
import os
import json

request_count = {}
ongoing_requests = {}
bypass = os.getenv("BYPASS")
MAX_REQUESTS_PER_MINUTE = 7
app = Flask("DiscordRocks Instant Chat Proxy")

DISCORD_ROCKS_HOST = 'chat.discord.rocks'
CHAT_UI_HOST = 'cutycat2000x-instantchat.static.hf.space'

@app.route('/', methods=['GET', 'POST'])
@app.route("/<path:path>", methods=['GET', 'POST'])
def handle_request(path=""):
    chat_ui_url = f'https://{DISCORD_ROCKS_HOST}/{path}'
    ip =  request.remote_addr
    print(ip)
    method = request.method
    data = request.data
    params = request.args
    headers = None
    didReply = False
    if method == 'POST':
        headers = {'Content-Type': 'application/json'}
        if 'reply' in path:
            if request_count.get(ip, 0) >= MAX_REQUESTS_PER_MINUTE:
                return jsonify({"error": "Too Many Requests. Please try again later."}), 429
            if ip in ongoing_requests:
                return jsonify({"error": "Concurrent requests not allowed."}), 429
            ongoing_requests[ip] = True
            request_count[ip] = request_count.get(ip, 0) + 1
            didReply = True
            json_data = request.get_json()
            json_data['bypass'] = bypass
            data = json.dumps(json_data)
    
    response = requests.request(method, chat_ui_url, params=params, data=data, headers=headers)
    
    proxied_response = Response(response.content)
    proxied_response.status_code = response.status_code
    proxied_response.headers["Content-Type"] = "text/html"
    if didReply:
        decrement_request_count_task(ip)
    
    return proxied_response

def decrement_request_count_task(ip):
    @copy_current_request_context
    def decrement_count():
        try:
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            loop.run_until_complete(decrement_request_count(ip))
        except Exception as e:
            print(e)

    threading.Thread(target=decrement_count).start()

async def decrement_request_count(ip):
    try:
        await asyncio.sleep(60)  # Ensure this runs asynchronously
        request_count[ip] = request_count.get(ip, 0) - 1
        print(request_count[ip])
    except Exception as es:
        print(es)

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