JSON API to save bandwidth and prevent double encoding

This commit is contained in:
Kaan Soral
2026-01-01 13:10:41 +03:00
parent 3ad882a962
commit a0847bd63c
6 changed files with 66 additions and 20 deletions
+47 -4
View File
@@ -1689,8 +1689,9 @@ def delete_map_api(**args):
jhtml(self,[{"type":"success","message":"Done!"},selection_info(self,user,domain)])
def test_api(**args):
self,user,server,domain=gdmuld(args,"self","user","server","domain")
self,user,server,domain,a=gdmuld(args,"self","user","server","domain","a")
logging.info("test")
logging.info(a)
jfunc(self,"alert",["lol"])
jhtmls(self,"test")
@@ -1718,15 +1719,15 @@ def server_api(name="",extra="",extra2=""):
domain=gdi(self)
server=get_server(self,domain)
args,method=gdmul(self,"arguments","method")
if security_threat(self,domain): return "security_threat"
if security_threat(self,domain): return jhtml(self,{"failed":1,"reason":"security_threat"})
user=get_user(self,domain,api_override=(server and method and method!="start_character")) # only "start_character" has an auth check, the rest doesn't re-check user auths #IMPORTANT! [09/08/20]
method="%s_api"%method
if args: args=json.loads(args)
if not args: args={}
logging.info("\n\nAPI Method Called: %s Arguments: %s\n"%(method,simplify_args_for_logging(args)))
if not user and method not in ["log_error_api","signup_or_login_api","load_article_api","get_server_api","test_api","create_server_api","stop_server_api","update_server_api","reload_server_api","set_friends_api","not_friends_api","password_reminder_api","server_event_api","reset_password_api","ban_user_api","send_mail_api","log_chat_api","take_item_from_mail_api","broadcast_api"]:
if self.values.get("server_auth"): jhtml(self,{"failed":1,"reason":"nouser"}); return "nouser"
jhtml(self,[{"type":"func","func":"add_log","args":["Not logged in."]}]); return "notloggedin"
if self.values.get("server_auth"): return jhtml(self,{"failed":1,"reason":"nouser"})
return jhtml(self,[{"type":"func","func":"add_log","args":["Not logged in."]}])
function=globals().get(method)
args["domain"]=domain
args["user"]=user
@@ -1740,3 +1741,45 @@ def server_api(name="",extra="",extra2=""):
safe_commit(user); safe_commit(server); domain_routine(domain)
return request.response
@app.route('/json_api', methods=['POST'])
@app.route('/json_api/<name>', methods=['POST'])
@app.route('/json_api/<name>/<extra>', methods=['POST'])
@app.route('/json_api/<name>/<extra>/<extra2>', methods=['POST'])
@ndb.toplevel
def json_server_api(name="",extra="",extra2=""):
json_data = json.loads(request.data.decode('utf-8'))
args=json_data["args"]
method=json_data["method"]
self=request # [26/01/24] easier for now
domain=gdi(self)
server=None
if json_data.get("server_auth"):
#logging.info("here")
id,auth=json_data.get("server_auth").split("-")
s=get_by_iid("server|%s"%id)
if s and gf(s,"auth")==auth:
server=s
#logging.info(server)
if security_threat(self,domain): return jhtml(self,{"failed":1,"reason":"security_threat"})
user=get_user(self,domain,api_override=(server and method and method!="start_character"),auth=json_data.get("auth"))
# only "start_character" has an auth check, the rest doesn't re-check user auths #IMPORTANT! [09/08/20]
method="%s_api"%method
if not args: args={}
logging.info("\n\nAPI Method Called: %s Arguments: %s\n"%(method,simplify_args_for_logging(args)))
if not user and method not in ["log_error_api","signup_or_login_api","load_article_api","get_server_api","test_api","create_server_api","stop_server_api","update_server_api","reload_server_api","set_friends_api","not_friends_api","password_reminder_api","server_event_api","reset_password_api","ban_user_api","send_mail_api","log_chat_api","take_item_from_mail_api","broadcast_api"]:
if json_data.get("server_auth"): return jhtml(self,{"failed":1,"reason":"nouser"})
return jhtml(self,[{"type":"func","func":"add_log","args":["Not logged in."]}])
function=globals().get(method)
args["domain"]=domain
args["user"]=user
args["server"]=server
args["self"]=self
if user and not server and gf(user,"blocked_until",really_old)>datetime.now() and method not in ["logout_api_X"]: return jhtml(self,[{"type":"func","func":"add_log","args":["Blocked"]}])
if function: function(**args)
else:
if args.get("dataType")=="json": jhtml(self,[{"type":"ui_log","message":"Invalid method"}])
else: logging.error("no function")
safe_commit(user); safe_commit(server); domain_routine(domain)
return request.response
+5 -3
View File
@@ -114,13 +114,15 @@ if is_production:
#maps["desertland"]["key"]="jayson_desertland_copy"
pass
game_version=831
game_version=833
SALES=4+5+388+5101+125/20 #donation+manual+macos+steam+sales
update_notes=[
"Happy Holidays!",
"Last Update [21st of December]",
"Last Update [1st of January]",
"New Item: Orb of Temporal Forces",
]
"New JSON API to save bandwidth (Internal)",
"(Slight change something might break)"
]
ip_to_subdomain={ #IMPORTANT: SPECIAL PAGE RULES ARE NEEDED: https://dash.cloudflare.com/b6f5a13bded5fdd273e4a1cd3777162d/adventure.land/page-rules - uss1 / eus1 was best
"35.187.255.184":"asia1",
"35.246.244.105":"eu1",
+2 -2
View File
@@ -299,7 +299,7 @@ def disable_email(email,logging=None):
user.put()
logging.info("Disabled emails for %s"%user)
def get_user(request=None,domain=None,email=None,phrase_check=False,api_override=None):
def get_user(request=None,domain=None,email=None,phrase_check=False,api_override=None,auth=None):
if email:
try:
email=purify_email(email)
@@ -312,7 +312,7 @@ def get_user(request=None,domain=None,email=None,phrase_check=False,api_override
except:
logTrace()
elif request:
auth=get_cookie(request,"auth") or request.values.get("auth")
auth=get_cookie(request,"auth") or request.values.get("auth") or auth
if auth:
id,auth=auth.replace('"',"").split("-")
get_user_data(id,_async=True) #trigger the get
+4 -3
View File
@@ -5424,12 +5424,13 @@ function d_text(message,x,y,args)
function api_call(method,args,r_args)
{
if(!args) args={}; if(!r_args) r_args={};
var api_path="/api/"+method,disable=r_args.disable;
var api_path="/json_api/"+method,disable=r_args.disable;
if(args.ui_loader) { r_args.r_id=randomStr(10); delete args.ui_loader; }
if(args.callback) { r_args.callback=args.callback; delete args.callback; }
if(disable) disable.addClass("disable");
if(window.is_electron) args.epl=electron_data.platform;
data={ 'method':method, 'arguments':JSON.stringify(args) };
// data={ 'method':method, 'arguments':JSON.stringify(args) };
data={ 'method':method, 'args':args };
function on_success(r_args,disable) {
return function(ct) {
if(r_args.r_id) hide_loader(r_args.r_id);
@@ -5453,7 +5454,7 @@ function api_call(method,args,r_args)
}
}
if(r_args.r_id) show_loader(r_args.r_id);
call_args={type:'POST',dataType:"json",url:window.location.origin+api_path,data:data,success:on_success(r_args,disable),error:on_error(r_args,disable)}
call_args={type:'POST',dataType:"json",contentType: "application/json; charset=utf-8", url:window.location.origin+api_path,data:JSON.stringify(data),success:on_success(r_args,disable),error:on_error(r_args,disable)}
$.ajax(call_args);
if(r_args.promise)
{
+7 -7
View File
@@ -3196,7 +3196,7 @@ function xy_upush_logic(element) {
}
function appengine_call(method, args, on_success, on_error) {
var api_path = "/api/" + method,
var api_path = "/json_api/" + method,
suffix = "";
if (
mode.prevent_external &&
@@ -3231,16 +3231,16 @@ function appengine_call(method, args, on_success, on_error) {
suffix = args.suffix;
delete args.suffix;
}
var arguments = JSON.stringify(args);
// var arguments = JSON.stringify(args);
var data = {
method: method,
arguments: arguments,
args: args,
server_auth: server_id + "-" + server_auth,
auth: args.auth,
};
if (suffix.includes("unmount")) console.log(arguments.length);
// if (suffix.includes("unmount")) console.log(arguments.length);
try {
request.post({ url: base_url + api_path, form: data }, function (err, response, body) {
request.post({ url: base_url + api_path, json: data }, function (err, response, body) {
try {
if (err || !response || response.statusCode != 200) {
// node.request sends an undefined response when there is an issue ...
@@ -3279,9 +3279,9 @@ function appengine_call(method, args, on_success, on_error) {
on_error("" + err + " " + (response && response.statusCode));
}
} else {
ct = JSON.parse(body);
if (typeof body === "string") body = JSON.parse(body);
if (on_success) {
on_success.apply(this, [ct]);
on_success.apply(this, [body]);
}
}
} catch (e) {
+1 -1
View File
@@ -1,4 +1,4 @@
runtime: python313
runtime: python312
app_engine_apis: true
builtins:
- deferred: on