Initial commit

This commit is contained in:
Profitroll 2022-09-14 13:53:30 +02:00
parent 3431e3818f
commit a2a595e6a0
10 changed files with 348 additions and 0 deletions

View File

@ -0,0 +1,5 @@
{
"en": ["Adjustments have been made to the Discord RPC system", "Created a temporary fix for Python 3.10 and Discord RPC"],
"uk": ["Внесені коректировки в систему роботи Discord RPC", "Зроблений тимчасовий фікс проблем Python 3.10 та Discord RPC"],
"ru": ["Внесены корректировки в систему работы Discord RPC", "Создан временный фикс проблем Python 3.10 и Discord RPC"]
}

View File

@ -0,0 +1,4 @@
{
"dev": 2.7,
"stable": 2.6
}

15
config.json Normal file
View File

@ -0,0 +1,15 @@
{
"address": "127.0.0.1",
"port": 8080,
"url": "https://api.end-play.xyz",
"data_location": "data/",
"autozoom_location": "AutoZoom/api/",
"telegram_bot_token": "12345678:asdfghjklzxcvbnm",
"messages": {
"key_expired": "API key expired",
"key_invalid": "Invalid API key",
"key_valid": "Valid API key",
"bad_request": "Bad request",
"ip_blacklisted": "Your IP is blacklisted. Make sure you are using correct API address."
}
}

314
daemon.py Normal file
View File

@ -0,0 +1,314 @@
# -*- coding: utf-8 -*-
from datetime import datetime
from http.server import HTTPServer, BaseHTTPRequestHandler
import ujson
import os
import random
import shutil
import requests
import string
import traceback
from urllib.parse import parse_qs, urlsplit
def jsonLoad(path):
data = open(path, "r", encoding='utf-8')
out = ujson.load(data)
data.close()
return out
def jsonSave(path, value):
file = open(path, "w", encoding='utf-8')
file.write(ujson.dumps(value, indent=4))
file.close()
def apiKeyInvalid(obj):
obj.send_response(401)
obj.send_header('Content-type', 'application/json; charset=utf-8')
obj.end_headers()
obj.wfile.write(b'{"code":401, "message": "Invalid API key"}')
return
def apiKeyExpired(obj):
obj.send_response(403)
obj.send_header('Content-type', 'application/json; charset=utf-8')
obj.end_headers()
obj.wfile.write(b'{"code":403, "message": "API key expired"}')
return
def badRequest(obj):
obj.send_response(400)
obj.send_header('Content-type', 'application/json; charset=utf-8')
obj.end_headers()
obj.wfile.write(b'{"code":400, "message": "Bad request"}')
return
def okRequest(obj):
obj.send_response(200)
obj.send_header('Content-type', 'application/json; charset=utf-8')
obj.end_headers()
obj.wfile.write(b'{"code":200, "message": "ok"}')
return
def blacklistedRequest(obj):
obj.send_response(403)
obj.send_header('Content-type', 'application/json; charset=utf-8')
obj.end_headers()
obj.wfile.write(b'{"code":403, "message": "Your IP is blacklisted. Make sure you are using correct API address."}')
obj.close_connection
return
def azGenKey(ipaddr):
az_requests = jsonLoad(config["data_location"]+"az_requests.json")
today_day = datetime.now().strftime("%d.%m.%Y")
if ipaddr in az_requests:
if today_day in az_requests[ipaddr]:
if az_requests[ipaddr][today_day] > 4:
return False
else:
az_requests[ipaddr][today_day] = 0
else:
az_requests[ipaddr] = {}
az_requests[ipaddr][today_day] = 0
api_keys = jsonLoad(config["data_location"]+"api_keys.json")
key = ''.join(random.sample(string.ascii_letters + string.digits, 20))
api_keys["autozoom"].append(key)
az_requests[ipaddr][today_day] += 1
jsonSave(config["data_location"]+"api_keys.json", api_keys)
jsonSave(config["data_location"]+"az_requests.json", az_requests)
return key
conffile = open("config.json", "r")
config = ujson.load(conffile)
conffile.close()
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
global config
blacklist = jsonLoad(config["data_location"]+"blacklist.json")
for addr in blacklist:
if addr == str(self.headers["X-Real-IP"]):
blacklistedRequest(self)
keys = jsonLoad(config["data_location"]+"api_keys.json")
expired = jsonLoad(config["data_location"]+"expired_keys.json")
try:
fullpath = config["url"]+self.path
reqpath = urlsplit(fullpath).path
requery = parse_qs(urlsplit(fullpath).query)
if reqpath == "/favicon.ico":
with open("favicon.ico", 'rb') as f:
self.send_response(200)
self.send_header(
"Content-Type", 'application/octet-stream')
self.send_header(
"Content-Disposition", 'attachment; filename="{}"'.format(os.path.basename("favicon.ico")))
fs = os.fstat(f.fileno())
self.send_header("Content-Length", str(fs.st_size))
self.end_headers()
shutil.copyfileobj(f, self.wfile)
f.close()
elif (reqpath == "/azVersion"):
if requery["apikey"][0] == "publickey":
file = open(config["autozoom_location"]+"version.json", "r")
versions = ujson.load(file)
file.close()
output = versions["stable"]
if "branch" in reqpath:
if requery["branch"][0] == "dev":
output = versions["dev"]
self.send_response(200)
self.send_header('Content-type', 'application/json; charset=utf-8')
self.end_headers()
self.wfile.write(bytes(ujson.dumps({"version": output}), encoding='utf-8'))
elif requery["apikey"][0] in expired:
apiKeyExpired(self)
else:
apiKeyInvalid(self)
elif (reqpath == "/azChangelog"):
if requery["apikey"][0] == "publickey":
file = open(f'{config["autozoom_location"]}changelogs/{requery["version"][0]}.json', "r")
output = ujson.load(file)[requery["locale"][0]]
file.close()
self.send_response(200)
self.send_header('Content-type', 'application/json; charset=utf-8')
self.end_headers()
self.wfile.write(bytes(ujson.dumps({"changelog": output}, ensure_ascii=False), encoding='utf-8'))
elif requery["apikey"][0] in expired:
apiKeyExpired(self)
else:
apiKeyInvalid(self)
elif (reqpath == "/azRequestKey"):
if requery["apikey"][0] == "publickey":
generated_key = azGenKey(str(self.headers["X-Real-IP"]))
if not generated_key:
self.send_response(403)
self.send_header('Content-type', 'application/json; charset=utf-8')
self.end_headers()
self.wfile.write(b'{"code":403, "message": "Too many new key requests for today. Try again later."}')
else:
self.send_response(200)
self.send_header('Content-type', 'application/json; charset=utf-8')
self.end_headers()
self.wfile.write(bytes('{"code":200, "message": "ok", "apikey": "' + generated_key + '"}', encoding='utf-8'))
elif requery["apikey"][0] in expired:
apiKeyExpired(self)
else:
apiKeyInvalid(self)
elif (reqpath == "/update"):
if requery["app"][0] == "autozoom":
if requery["apikey"][0] == "publickey":
filepath = config["autozoom_location"]+"AutoZoomLatest.zip"
with open(filepath, 'rb') as f:
self.send_response(200)
self.send_header("Content-Type", 'application/octet-stream')
self.send_header("Content-Disposition", 'attachment; filename="{}"'.format(os.path.basename(filepath)))
fs = os.fstat(f.fileno())
self.send_header("Content-Length", str(fs.st_size))
self.end_headers()
shutil.copyfileobj(f, self.wfile)
f.close()
else:
apiKeyInvalid(self)
else:
badRequest(self)
else:
badRequest(self)
except Exception as exp:
badRequest(self)
traceback.print_exc()
def do_POST(self):
global config
blacklist = jsonLoad(config["data_location"]+"blacklist.json")
for addr in blacklist:
if addr == str(self.headers["X-Real-IP"]):
blacklistedRequest(self)
content_length = int(self.headers['Content-Length'])
body = self.rfile.read(content_length).decode("utf-8")
keys = jsonLoad(config["data_location"]+"api_keys.json")
expired = jsonLoad(config["data_location"]+"expired_keys.json")
try:
fullpath = config["url"]+self.path
reqpath = urlsplit(fullpath).path
requery = parse_qs(urlsplit(fullpath).query)
data = body
if (reqpath == "/azSendMessage"):
if requery["apikey"][0] in keys["autozoom"]:
keys_storage = jsonLoad(config["data_location"]+"keys_storage.json")
if requery["apikey"][0] in keys_storage:
try:
if "message" in reqpath:
try:
output = requests.post(
url=f'https://api.telegram.org/bot{config["telegram_bot_token"]}/sendMessage?chat_id={keys_storage[requery["apikey"][0]]}&text={requery["message"][0]}'
)
except:
output = requests.post(
url=f'https://api.telegram.org/bot{config["telegram_bot_token"]}/sendMessage',
data={'chat_id': keys_storage[requery["apikey"][0]], 'text': ujson.loads(data)["message"]}
)
else:
output = requests.post(
url=f'https://api.telegram.org/bot{config["telegram_bot_token"]}/sendMessage',
data={'chat_id': keys_storage[requery["apikey"][0]], 'text': ujson.loads(data)["message"]}
)
if output.status_code == requests.codes.ok:
okRequest(self)
else:
badRequest(self)
except:
traceback.print_exc()
badRequest(self)
else:
self.send_response(400)
self.send_header('Content-type', 'application/json; charset=utf-8')
self.end_headers()
self.wfile.write(b'{"code":400, "message": "Bad request. This key might not be linked to Telegram user."}')
elif requery["apikey"][0] in expired:
apiKeyExpired(self)
else:
apiKeyInvalid(self)
else:
badRequest(self)
except Exception as exp:
badRequest(self)
traceback.print_exc()
httpd = HTTPServer((config["address"], config["port"]), SimpleHTTPRequestHandler)
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass

3
data/api_keys.json Normal file
View File

@ -0,0 +1,3 @@
{
"autozoom": []
}

1
data/az_requests.json Normal file
View File

@ -0,0 +1 @@
{}

1
data/blacklist.json Normal file
View File

@ -0,0 +1 @@
[]

1
data/expired_keys.json Normal file
View File

@ -0,0 +1 @@
[]

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

4
requirements.txt Normal file
View File

@ -0,0 +1,4 @@
ujson
requests
shutil
urllib