File size: 2,483 Bytes
31a302b
595f0ee
20f4cd1
fa5c81c
 
534b6e8
3c2a81d
fa5c81c
 
 
 
3c2a81d
 
 
 
 
fa5c81c
3c2a81d
20f4cd1
3c2a81d
b2ebd1d
595f0ee
cfea4a6
 
 
88abbff
fa5c81c
88abbff
 
fa5c81c
 
31a302b
fa5c81c
 
 
 
 
 
 
 
88abbff
 
cfea4a6
 
 
 
fa5c81c
2e7f4cb
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
74
75
from flask import Flask, request, Response, copy_current_request_context, jsonify
import threading
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: "+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."+ ip}), 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:
        ongoing_requests.remove(ip)
        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)