Files
2026-03-30 09:39:59 +08:00

236 lines
6.5 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { error, js, log, sys } from 'cc';
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
function encode(text: string, key: string) {
key = key || chars;
let encrypted = '';
for (let i = 0; i < text.length; i++) {
const charCode = text.charCodeAt(i) ^ key.charCodeAt(i % key.length);
encrypted += String.fromCharCode(charCode);
}
return encrypted;
}
function decode(encryptedText: string, key: string) {
key = key || chars;
let decrypted = '';
for (let i = 0; i < encryptedText.length; i++) {
const charCode = encryptedText.charCodeAt(i) ^ key.charCodeAt(i % key.length);
decrypted += String.fromCharCode(charCode);
}
return decrypted;
}
const weekOfYear = function (curDate?: Date) {
/*
date1是当前日期
date2是当年第一天
d是当前日期是今年第多少天
用d + 当前年的第一天的周差距的和在除以7就是本年第几周
*/
curDate = curDate || new Date();
let a = curDate.getFullYear();
let b = curDate.getMonth() + 1;
let c = curDate.getDate();
let date1 = new Date(a, b - 1, c), date2 = new Date(a, 0, 1),
d = Math.round((date1.valueOf() - date2.valueOf()) / 86400000);
return Math.ceil(
(d + ((date2.getDay() + 1) - 1)) / 7
);
};
const getWeekUpdateTime = function () {
const date = new Date();
const year = date.getFullYear();
const week = weekOfYear(date);
return year + '' + week;
};
const getDayUpdateTime = function (curDate?: Date) {
curDate = curDate || new Date();
return curDate.toLocaleDateString();
};
export class Storage {
static setting: {
/**
* 加密密钥
* - 如果需要加密内容,请设置密钥的值
*/
secretKey: string
} = {
secretKey: ''
};
private _cache = {};
/**
* 返回值为false代表调用失败
*/
set(key: string, value: unknown) {
if (typeof key === 'string' && typeof value !== 'undefined') {
try {
const data = JSON.stringify(value);
if (Storage.setting.secretKey) {
sys.localStorage.setItem(key, encode(data, Storage.setting.secretKey));
} else {
sys.localStorage.setItem(key, data);
}
// 设置缓存
this._cache[key] = data;
return true;
} catch (err) { log(err); }
} else {
error('storage set error');
}
return false;
}
/**
* 返回值为undefined代表调用失败
*/
get(key: string) {
// 先读取缓存
if (typeof this._cache[key] !== 'undefined') {
return JSON.parse(this._cache[key]);
}
let result = null;
try {
let data = sys.localStorage.getItem(key);
if (data && typeof data === 'string') {
if (Storage.setting.secretKey) data = decode(data, Storage.setting.secretKey);
// 设置缓存
this._cache[key] = data;
result = JSON.parse(data);
} else if (data !== '' && data !== null) {
result = undefined;
}
} catch (e) {
result = undefined;
}
return result;
}
/**
* 返回值为false代表调用失败
*/
add(key: string, value: number = 1) {
let result = this.get(key);
if (result !== undefined) {
result = result || 0;
result += value;
if (this.set(key, result)) {
return result;
}
}
return false;
}
/**
* 返回值为false代表调用失败
*/
remove(key: string) {
try {
sys.localStorage.removeItem(key);
delete this._cache[key];
return true;
} catch (err) {
return false;
}
}
/**
* 返回值为false代表调用失败
*/
clear() {
try {
sys.localStorage.clear();
js.clear(this._cache);
return true;
} catch (err) {
return false;
}
}
/**
* 设置本周数据 [返回值为false代表调用失败]
* @param {Function} cb 当已存在本周的数据时会根据cb的返回决定是否存储true代表存储
*/
setWeek(key: string, value: unknown, cb?: (oldValue: unknown, newValue: unknown) => boolean) {
const updateTime = getWeekUpdateTime();
if (cb) {
const data = this.getWeek(key);
if (data !== undefined) {
if (data === null || cb(data, value)) {
return this.set(key, {
data: value,
updateTime: updateTime
});
}
}
} else {
return this.set(key, {
data: value,
updateTime: updateTime
});
}
return false;
}
/**
* 获取本周数据 [返回值为undefined代表调用失败]
*/
getWeek(key: string) {
const data = this.get(key);
if (data && data.updateTime == getWeekUpdateTime()) {
return data.data;
}
return data && null;
}
/**
* 设置本天数据 [返回值为false代表调用失败]
* @param {Function} cb 当已存在本天的数据时会根据cb的返回决定是否存储true代表存储
*/
setDay(key: string, value: unknown, cb?: (oldValue: unknown, newValue: unknown) => boolean) {
const updateTime = getDayUpdateTime();
if (cb) {
const data = this.getDay(key);
if (data !== undefined) {
if (data === null || cb(data, value)) {
return this.set(key, {
data: value,
updateTime: updateTime
});
}
}
} else {
return this.set(key, {
data: value,
updateTime: updateTime
});
}
return false;
}
/**
* 获取本天数据 [返回值为undefined代表调用失败]
* @param {*} key
*/
getDay(key: string) {
const data = this.get(key);
if (data && data.updateTime == getDayUpdateTime()) {
return data.data;
}
return data && null;
}
}
export default new Storage();