新拓展:存档本地化
This commit is contained in:
parent
55563c8a2b
commit
edb9d5037f
76
extensions/localSave.js
Normal file
76
extensions/localSave.js
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/**
|
||||||
|
* 离线游戏使用本地存储扩展。
|
||||||
|
* 开启本拓展后,将会把所有存档存至 _saves 目录下。
|
||||||
|
* 需配合样板V2.8.2+使用
|
||||||
|
*/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
// 将这一行改成 false 可以禁用本拓展
|
||||||
|
var __enabled = true;
|
||||||
|
|
||||||
|
if (window.jsinterface || !window.fs || !__enabled) return;
|
||||||
|
|
||||||
|
function rewrite() {
|
||||||
|
core.utils._setLocalForage_set = function (name, str, callback) {
|
||||||
|
var data = LZString.compressToBase64(str);
|
||||||
|
core.saves.cache[name] = data;
|
||||||
|
fs.writeFile('_saves/' + name, data, 'utf-8', callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
core.utils._getLocalForage_get = function (name, callback) {
|
||||||
|
fs.readFile('_saves/' + name, 'utf-8', function (err, data) {
|
||||||
|
if (err) return callback(err);
|
||||||
|
callback(null, data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
core.utils.decompress = function (data) {
|
||||||
|
try {
|
||||||
|
return JSON.parse(LZString.decompressFromBase64(data))
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
core.utils._removeLocalForage_remove = function (name, callback) {
|
||||||
|
fs.deleteFile('_saves/' + name, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
core.utils.clearLocalForage = function (name, callback) {
|
||||||
|
// Nothing to do
|
||||||
|
}
|
||||||
|
|
||||||
|
core.utils.iterateLocalForage = function (iter, callback) {
|
||||||
|
fs.readdir('_saves', function (err, data) {
|
||||||
|
if (err) callback(err);
|
||||||
|
else {
|
||||||
|
data.forEach(function (one) {
|
||||||
|
iter(null, one, null);
|
||||||
|
});
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
core.utils.keysLocalForage = function (callback) {
|
||||||
|
fs.readdir('_saves', callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
core.utils.lengthLocalForage = function (callback) {
|
||||||
|
fs.readdir('_saves', function (err, data) {
|
||||||
|
if (err) callback(err);
|
||||||
|
else callback(null, data.length);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.mkdir('_saves', function (err) {
|
||||||
|
if (err) return;
|
||||||
|
rewrite();
|
||||||
|
core.control.getSaveIndexes(function (indexes) { core.saves.ids = indexes; });
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
@ -125,7 +125,8 @@ function core() {
|
|||||||
"now": 0,
|
"now": 0,
|
||||||
},
|
},
|
||||||
"favorite": [],
|
"favorite": [],
|
||||||
"favoriteName": {}
|
"favoriteName": {},
|
||||||
|
"cache": {}
|
||||||
}
|
}
|
||||||
this.initStatus = {
|
this.initStatus = {
|
||||||
'played': false,
|
'played': false,
|
||||||
|
|||||||
@ -214,18 +214,7 @@ utils.prototype.setLocalStorage = function (key, value) {
|
|||||||
var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function (chr) {
|
var str = JSON.stringify(value).replace(/[\u007F-\uFFFF]/g, function (chr) {
|
||||||
return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4)
|
return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4)
|
||||||
});
|
});
|
||||||
var compressed = lzw_encode(str);
|
localStorage.setItem(core.firstData.name + "_" + key, str);
|
||||||
|
|
||||||
// test if we can save to localStorage
|
|
||||||
localStorage.setItem("__tmp__", compressed);
|
|
||||||
if (lzw_decode(localStorage.getItem("__tmp__")) == str) {
|
|
||||||
localStorage.setItem(core.firstData.name + "_" + key, compressed);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// We cannot compress the data
|
|
||||||
localStorage.setItem(core.firstData.name + "_" + key, str);
|
|
||||||
}
|
|
||||||
localStorage.removeItem("__tmp__");
|
|
||||||
|
|
||||||
if (key == 'autoSave') core.saves.ids[0] = true;
|
if (key == 'autoSave') core.saves.ids[0] = true;
|
||||||
else if (/^save\d+$/.test(key)) core.saves.ids[parseInt(key.substring(4))] = true;
|
else if (/^save\d+$/.test(key)) core.saves.ids[parseInt(key.substring(4))] = true;
|
||||||
@ -240,8 +229,11 @@ utils.prototype.setLocalStorage = function (key, value) {
|
|||||||
|
|
||||||
////// 获得本地存储 //////
|
////// 获得本地存储 //////
|
||||||
utils.prototype.getLocalStorage = function (key, defaultValue) {
|
utils.prototype.getLocalStorage = function (key, defaultValue) {
|
||||||
var res = this.decompress(localStorage.getItem(core.firstData.name + "_" + key));
|
try {
|
||||||
return res == null ? defaultValue : res;
|
return JSON.parse(localStorage.getItem(core.firstData.name + "_" + key));
|
||||||
|
} catch (e) {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 移除本地存储 //////
|
////// 移除本地存储 //////
|
||||||
@ -271,13 +263,18 @@ utils.prototype.setLocalForage = function (key, value, successCallback, errorCal
|
|||||||
if (successCallback) successCallback();
|
if (successCallback) successCallback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this._setLocalForage_set(name, str, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.prototype._setLocalForage_set = function (name, str, callback) {
|
||||||
if (window.jsinterface && window.jsinterface.setLocalForage) {
|
if (window.jsinterface && window.jsinterface.setLocalForage) {
|
||||||
var id = setTimeout(null);
|
var id = setTimeout(null);
|
||||||
core['__callback' + id] = callback;
|
core['__callback' + id] = callback;
|
||||||
|
core.saves.cache[name] = str;
|
||||||
window.jsinterface.setLocalForage(id, name, str);
|
window.jsinterface.setLocalForage(id, name, str);
|
||||||
} else {
|
} else {
|
||||||
var compressed = str.length > 100000 ? LZString.compress(str) : lzw_encode(str);
|
var compressed = str.length > 100000 ? LZString.compress(str) : lzw_encode(str);
|
||||||
|
core.saves.cache[name] = compressed;
|
||||||
localforage.setItem(name, compressed, callback);
|
localforage.setItem(name, compressed, callback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -289,6 +286,7 @@ utils.prototype.getLocalForage = function (key, defaultValue, successCallback, e
|
|||||||
if (errorCallback) errorCallback(err);
|
if (errorCallback) errorCallback(err);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
core.saves.cache[name] = value;
|
||||||
if (!successCallback) return;
|
if (!successCallback) return;
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
var res = core.utils.decompress(value);
|
var res = core.utils.decompress(value);
|
||||||
@ -298,7 +296,13 @@ utils.prototype.getLocalForage = function (key, defaultValue, successCallback, e
|
|||||||
successCallback(defaultValue);
|
successCallback(defaultValue);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
if (core.saves.cache[name] != null) {
|
||||||
|
return callback(null, core.saves.cache[name]);
|
||||||
|
}
|
||||||
|
this._getLocalForage_get(name, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.prototype._getLocalForage_get = function (name, callback) {
|
||||||
if (window.jsinterface && window.jsinterface.getLocalForage) {
|
if (window.jsinterface && window.jsinterface.getLocalForage) {
|
||||||
var id = setTimeout(null);
|
var id = setTimeout(null);
|
||||||
core['__callback' + id] = callback;
|
core['__callback' + id] = callback;
|
||||||
@ -320,7 +324,11 @@ utils.prototype.removeLocalForage = function (key, successCallback, errorCallbac
|
|||||||
if (successCallback) successCallback();
|
if (successCallback) successCallback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete core.saves.cache[name];
|
||||||
|
this._removeLocalForage_remove(name, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.prototype._removeLocalForage_remove = function (name, callback) {
|
||||||
if (window.jsinterface && window.jsinterface.removeLocalForage) {
|
if (window.jsinterface && window.jsinterface.removeLocalForage) {
|
||||||
var id = setTimeout(null);
|
var id = setTimeout(null);
|
||||||
core['__callback' + id] = callback;
|
core['__callback' + id] = callback;
|
||||||
@ -331,6 +339,7 @@ utils.prototype.removeLocalForage = function (key, successCallback, errorCallbac
|
|||||||
}
|
}
|
||||||
|
|
||||||
utils.prototype.clearLocalForage = function (callback) {
|
utils.prototype.clearLocalForage = function (callback) {
|
||||||
|
core.saves.cache = {};
|
||||||
if (window.jsinterface && window.jsinterface.clearLocalForage) {
|
if (window.jsinterface && window.jsinterface.clearLocalForage) {
|
||||||
var id = setTimeout(null);
|
var id = setTimeout(null);
|
||||||
core['__callback' + id] = callback;
|
core['__callback' + id] = callback;
|
||||||
|
|||||||
11
server.py
11
server.py
@ -47,11 +47,12 @@ def get_mimetype(path):
|
|||||||
|
|
||||||
def get_file(path):
|
def get_file(path):
|
||||||
if not os.path.isfile(path):
|
if not os.path.isfile(path):
|
||||||
|
if path.startswith('_saves/'):
|
||||||
|
return ''
|
||||||
abort(404)
|
abort(404)
|
||||||
return None
|
return None
|
||||||
if not is_sub(path):
|
if not is_sub(path):
|
||||||
abort(403)
|
abort(403)
|
||||||
return None
|
|
||||||
with open(path, 'rb') as f:
|
with open(path, 'rb') as f:
|
||||||
content = f.read() # str in py2 and bytes in py3
|
content = f.read() # str in py2 and bytes in py3
|
||||||
return content
|
return content
|
||||||
@ -82,6 +83,10 @@ def all_animates():
|
|||||||
else: content.append('')
|
else: content.append('')
|
||||||
return '@@@~~~###~~~@@@'.join(content)
|
return '@@@~~~###~~~@@@'.join(content)
|
||||||
|
|
||||||
|
@app.route('/favicon.ico', methods=['GET'])
|
||||||
|
def favicon():
|
||||||
|
return ''
|
||||||
|
|
||||||
@app.route('/<path:path>', methods=['GET'])
|
@app.route('/<path:path>', methods=['GET'])
|
||||||
def static_file(path):
|
def static_file(path):
|
||||||
if os.path.isdir(path):
|
if os.path.isdir(path):
|
||||||
@ -206,6 +211,10 @@ def deleteFile():
|
|||||||
shutil.rmtree(name)
|
shutil.rmtree(name)
|
||||||
return 'Success'
|
return 'Success'
|
||||||
|
|
||||||
|
@app.route('/games/upload.php', methods=['POST'])
|
||||||
|
def upload():
|
||||||
|
return ''
|
||||||
|
|
||||||
def port_used(port):
|
def port_used(port):
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
result = True
|
result = True
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user