drgame-cc 1.0.41 → 1.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/drres/prefab/ExitWin.prefab +764 -764
- package/drres/prefab/HelperWin.prefab +128 -4
- package/drres/prefab/HelperWin.prefab.meta +9 -0
- package/drscript/PlatformAdapter.ts +1 -5
- package/drscript/ad-sdk/README.md +344 -344
- package/drscript/ad-sdk/ad-sdk.d.ts +59 -59
- package/drscript/ad-sdk/ad-sdk.js +322 -322
- package/drscript/ad-sdk/adapters/xiaomi-adapter.d.ts +29 -29
- package/drscript/ad-sdk/adapters/xiaomi-adapter.js +449 -449
- package/drscript/ad-sdk/event-emitter.d.ts +12 -12
- package/drscript/ad-sdk/event-emitter.js +65 -65
- package/drscript/ad-sdk/leaderboard/leaderboard.d.ts +23 -23
- package/drscript/ad-sdk/leaderboard/leaderboard.js +193 -193
- package/drscript/ad-sdk/package.json +46 -46
- package/drscript/ad-sdk/reporters/reporter.d.ts +40 -40
- package/drscript/ad-sdk/reporters/reporter.js +217 -217
- package/drscript/ad-sdk/types/enums.d.ts +64 -64
- package/drscript/ad-sdk/types/enums.js +111 -111
- package/drscript/ad-sdk/types/index.d.ts +6 -6
- package/drscript/ad-sdk/types/index.js +15 -15
- package/drscript/ad-sdk/types/interfaces.d.ts +333 -333
- package/drscript/interface/ILobbyBridge.ts +5 -5
- package/package.json +1 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 聚合广告 SDK - 事件发射器类型声明
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { AdEvent, IAdEventData, IEventHandler } from './types';
|
|
6
|
-
|
|
7
|
-
export declare class EventEmitter {
|
|
8
|
-
on(event: AdEvent, handler: IEventHandler): void;
|
|
9
|
-
off(event: AdEvent, handler?: IEventHandler): void;
|
|
10
|
-
emit(event: AdEvent, data: IAdEventData): void;
|
|
11
|
-
removeAllListeners(): void;
|
|
12
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 聚合广告 SDK - 事件发射器类型声明
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { AdEvent, IAdEventData, IEventHandler } from './types';
|
|
6
|
+
|
|
7
|
+
export declare class EventEmitter {
|
|
8
|
+
on(event: AdEvent, handler: IEventHandler): void;
|
|
9
|
+
off(event: AdEvent, handler?: IEventHandler): void;
|
|
10
|
+
emit(event: AdEvent, data: IAdEventData): void;
|
|
11
|
+
removeAllListeners(): void;
|
|
12
|
+
}
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 聚合广告 SDK - 简易事件发射器
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
const { AdEvent } = require('./types/enums');
|
|
6
|
-
|
|
7
|
-
class EventEmitter {
|
|
8
|
-
constructor() {
|
|
9
|
-
/** @type {Map<string, Set<Function>>} */
|
|
10
|
-
this._handlers = new Map();
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* 监听事件
|
|
15
|
-
* @param {string} event - 事件名(AdEvent 枚举值)
|
|
16
|
-
* @param {Function} handler - 事件处理函数
|
|
17
|
-
*/
|
|
18
|
-
on(event, handler) {
|
|
19
|
-
if (!this._handlers.has(event)) {
|
|
20
|
-
this._handlers.set(event, new Set());
|
|
21
|
-
}
|
|
22
|
-
this._handlers.get(event).add(handler);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* 取消监听
|
|
27
|
-
* @param {string} event - 事件名
|
|
28
|
-
* @param {Function} [handler] - 不传则移除该事件所有监听
|
|
29
|
-
*/
|
|
30
|
-
off(event, handler) {
|
|
31
|
-
if (!handler) {
|
|
32
|
-
this._handlers.delete(event);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
const set = this._handlers.get(event);
|
|
36
|
-
if (set) {
|
|
37
|
-
set.delete(handler);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* 触发事件
|
|
43
|
-
* @param {string} event - 事件名
|
|
44
|
-
* @param {*} data - 事件数据
|
|
45
|
-
*/
|
|
46
|
-
emit(event, data) {
|
|
47
|
-
const set = this._handlers.get(event);
|
|
48
|
-
if (set) {
|
|
49
|
-
set.forEach((handler) => {
|
|
50
|
-
try {
|
|
51
|
-
handler(data);
|
|
52
|
-
} catch (e) {
|
|
53
|
-
console.error('[AdSdk] Event handler error on "' + event + '":', e);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** 移除所有监听 */
|
|
60
|
-
removeAllListeners() {
|
|
61
|
-
this._handlers.clear();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
module.exports = { EventEmitter };
|
|
1
|
+
/**
|
|
2
|
+
* 聚合广告 SDK - 简易事件发射器
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const { AdEvent } = require('./types/enums');
|
|
6
|
+
|
|
7
|
+
class EventEmitter {
|
|
8
|
+
constructor() {
|
|
9
|
+
/** @type {Map<string, Set<Function>>} */
|
|
10
|
+
this._handlers = new Map();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 监听事件
|
|
15
|
+
* @param {string} event - 事件名(AdEvent 枚举值)
|
|
16
|
+
* @param {Function} handler - 事件处理函数
|
|
17
|
+
*/
|
|
18
|
+
on(event, handler) {
|
|
19
|
+
if (!this._handlers.has(event)) {
|
|
20
|
+
this._handlers.set(event, new Set());
|
|
21
|
+
}
|
|
22
|
+
this._handlers.get(event).add(handler);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 取消监听
|
|
27
|
+
* @param {string} event - 事件名
|
|
28
|
+
* @param {Function} [handler] - 不传则移除该事件所有监听
|
|
29
|
+
*/
|
|
30
|
+
off(event, handler) {
|
|
31
|
+
if (!handler) {
|
|
32
|
+
this._handlers.delete(event);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const set = this._handlers.get(event);
|
|
36
|
+
if (set) {
|
|
37
|
+
set.delete(handler);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 触发事件
|
|
43
|
+
* @param {string} event - 事件名
|
|
44
|
+
* @param {*} data - 事件数据
|
|
45
|
+
*/
|
|
46
|
+
emit(event, data) {
|
|
47
|
+
const set = this._handlers.get(event);
|
|
48
|
+
if (set) {
|
|
49
|
+
set.forEach((handler) => {
|
|
50
|
+
try {
|
|
51
|
+
handler(data);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
console.error('[AdSdk] Event handler error on "' + event + '":', e);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** 移除所有监听 */
|
|
60
|
+
removeAllListeners() {
|
|
61
|
+
this._handlers.clear();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = { EventEmitter };
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 排行榜模块 - 类型声明
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { ILeaderboardConfig, IAddPointParams, IRankResult } from '../types/interfaces';
|
|
6
|
-
|
|
7
|
-
/** 排行榜模块(单例) */
|
|
8
|
-
export declare const Leaderboard: {
|
|
9
|
-
/** 初始化排行榜模块 */
|
|
10
|
-
init(config: ILeaderboardConfig): void;
|
|
11
|
-
|
|
12
|
-
/** 获取积分排行榜 */
|
|
13
|
-
getRank(): Promise<IRankResult>;
|
|
14
|
-
|
|
15
|
-
/** 添加积分 */
|
|
16
|
-
addPoint(params: IAddPointParams): Promise<any>;
|
|
17
|
-
|
|
18
|
-
/** 更新用户ID(登录后调用) */
|
|
19
|
-
setUserId(user_id: string): void;
|
|
20
|
-
|
|
21
|
-
/** 获取当前项目编码 */
|
|
22
|
-
getProject(): string;
|
|
23
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* 排行榜模块 - 类型声明
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { ILeaderboardConfig, IAddPointParams, IRankResult } from '../types/interfaces';
|
|
6
|
+
|
|
7
|
+
/** 排行榜模块(单例) */
|
|
8
|
+
export declare const Leaderboard: {
|
|
9
|
+
/** 初始化排行榜模块 */
|
|
10
|
+
init(config: ILeaderboardConfig): void;
|
|
11
|
+
|
|
12
|
+
/** 获取积分排行榜 */
|
|
13
|
+
getRank(): Promise<IRankResult>;
|
|
14
|
+
|
|
15
|
+
/** 添加积分 */
|
|
16
|
+
addPoint(params: IAddPointParams): Promise<any>;
|
|
17
|
+
|
|
18
|
+
/** 更新用户ID(登录后调用) */
|
|
19
|
+
setUserId(user_id: string): void;
|
|
20
|
+
|
|
21
|
+
/** 获取当前项目编码 */
|
|
22
|
+
getProject(): string;
|
|
23
|
+
};
|
|
@@ -1,193 +1,193 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 排行榜模块 - 积分排行与添加积分
|
|
3
|
-
*
|
|
4
|
-
* 使用方式:
|
|
5
|
-
* Leaderboard.init(config) — 初始化(设置项目编码、服务地址)
|
|
6
|
-
* Leaderboard.getRank() — 获取积分排行榜
|
|
7
|
-
* Leaderboard.addPoint(params) — 添加积分
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
// ────────────────────────────────────────
|
|
11
|
-
// 排行榜实现
|
|
12
|
-
// ────────────────────────────────────────
|
|
13
|
-
|
|
14
|
-
var Leaderboard = {
|
|
15
|
-
/** 是否已初始化 */
|
|
16
|
-
_initialized: false,
|
|
17
|
-
|
|
18
|
-
/** 配置 */
|
|
19
|
-
_config: {
|
|
20
|
-
/** 排行榜服务地址 */
|
|
21
|
-
rank_url: 'https://hyp-test.huyingpai.com/API_ACHIEVEMENT/api/user/point/rank',
|
|
22
|
-
/** 添加积分服务地址 */
|
|
23
|
-
add_url: 'https://hyp-test.huyingpai.com/API_ACHIEVEMENT/api/user/point/add',
|
|
24
|
-
/** 项目编码 */
|
|
25
|
-
project: '',
|
|
26
|
-
/** 用户ID */
|
|
27
|
-
user_id: '',
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* 初始化排行榜模块
|
|
32
|
-
* @param {import('../types/interfaces').ILeaderboardConfig} config
|
|
33
|
-
*/
|
|
34
|
-
init: function (config) {
|
|
35
|
-
config = config || {};
|
|
36
|
-
|
|
37
|
-
if (config.rank_url) {
|
|
38
|
-
this._config.rank_url = config.rank_url;
|
|
39
|
-
}
|
|
40
|
-
if (config.add_url) {
|
|
41
|
-
this._config.add_url = config.add_url;
|
|
42
|
-
}
|
|
43
|
-
this._config.project = config.project || '';
|
|
44
|
-
this._config.user_id = config.user_id || '';
|
|
45
|
-
|
|
46
|
-
this._initialized = true;
|
|
47
|
-
console.log('[Leaderboard] Initialized, project:', this._config.project);
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* 获取积分排行榜
|
|
52
|
-
* @returns {Promise<import('../types/interfaces').IRankResult>}
|
|
53
|
-
*/
|
|
54
|
-
getRank: function () {
|
|
55
|
-
if (!this._initialized) {
|
|
56
|
-
console.warn('[Leaderboard] Not initialized. Call Leaderboard.init() first.');
|
|
57
|
-
return Promise.reject({ code: -1, message: 'Leaderboard not initialized' });
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
var self = this;
|
|
61
|
-
var data = {
|
|
62
|
-
project: self._config.project,
|
|
63
|
-
timestamp: Date.now(),
|
|
64
|
-
time: self._formatTime(new Date()),
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
return self._post(self._config.rank_url, data);
|
|
68
|
-
},
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* 添加积分
|
|
72
|
-
* @param {import('../types/interfaces').IAddPointParams} params
|
|
73
|
-
* @returns {Promise<any>}
|
|
74
|
-
*/
|
|
75
|
-
addPoint: function (params) {
|
|
76
|
-
if (!this._initialized) {
|
|
77
|
-
console.warn('[Leaderboard] Not initialized. Call Leaderboard.init() first.');
|
|
78
|
-
return Promise.reject({ code: -1, message: 'Leaderboard not initialized' });
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
var self = this;
|
|
82
|
-
var data = {
|
|
83
|
-
project: self._config.project,
|
|
84
|
-
userId: params.user_id || self._config.user_id,
|
|
85
|
-
point: params.point || 0,
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
// jsonData 为可选扩展数据
|
|
89
|
-
if (params.jsonData) {
|
|
90
|
-
data.jsonData = params.jsonData;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
data.timestamp = Date.now();
|
|
94
|
-
data.time = self._formatTime(new Date());
|
|
95
|
-
|
|
96
|
-
return self._post(self._config.add_url, data);
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* 更新用户ID(登录后调用)
|
|
101
|
-
* @param {string} user_id
|
|
102
|
-
*/
|
|
103
|
-
setUserId: function (user_id) {
|
|
104
|
-
this._config.user_id = user_id;
|
|
105
|
-
},
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* 获取当前项目编码
|
|
109
|
-
* @returns {string}
|
|
110
|
-
*/
|
|
111
|
-
getProject: function () {
|
|
112
|
-
return this._config.project;
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
// ────────────────────────────────────────
|
|
116
|
-
// 内部方法
|
|
117
|
-
// ────────────────────────────────────────
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* 发送 POST 请求(Promise 封装)
|
|
121
|
-
* @param {string} url
|
|
122
|
-
* @param {Object} data
|
|
123
|
-
* @returns {Promise<any>}
|
|
124
|
-
*/
|
|
125
|
-
_post: function (url, data) {
|
|
126
|
-
return new Promise(function (resolve, reject) {
|
|
127
|
-
var dataStr = JSON.stringify(data);
|
|
128
|
-
console.log('[Leaderboard] POST:', url, dataStr);
|
|
129
|
-
|
|
130
|
-
var xmlhttp;
|
|
131
|
-
if (typeof XMLHttpRequest !== 'undefined') {
|
|
132
|
-
xmlhttp = new XMLHttpRequest();
|
|
133
|
-
} else if (typeof ActiveXObject !== 'undefined') {
|
|
134
|
-
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
|
|
135
|
-
} else {
|
|
136
|
-
reject({ code: -1, message: 'No HTTP client available' });
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
xmlhttp.onreadystatechange = function () {
|
|
141
|
-
if (xmlhttp.readyState !== 4) return;
|
|
142
|
-
|
|
143
|
-
var rsp = xmlhttp.responseText || xmlhttp.responseXML;
|
|
144
|
-
var parseError = false;
|
|
145
|
-
|
|
146
|
-
if (typeof rsp === 'string') {
|
|
147
|
-
try {
|
|
148
|
-
rsp = JSON.parse(rsp);
|
|
149
|
-
} catch (e) {
|
|
150
|
-
parseError = true;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (parseError || xmlhttp.status !== 200) {
|
|
155
|
-
var errMsg = parseError ? 'JSON parse error' : ('HTTP ' + xmlhttp.status);
|
|
156
|
-
console.error('[Leaderboard] Request failed:', errMsg);
|
|
157
|
-
reject({ code: xmlhttp.status || -1, message: errMsg });
|
|
158
|
-
} else {
|
|
159
|
-
console.log('[Leaderboard] Response:', rsp);
|
|
160
|
-
resolve(rsp);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
xmlhttp.open('POST', url, true);
|
|
165
|
-
xmlhttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
|
|
166
|
-
xmlhttp.send(dataStr);
|
|
167
|
-
});
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* 时间格式化:yyyy-MM-dd HH:mm:ss
|
|
172
|
-
* @param {Date} date
|
|
173
|
-
* @returns {string}
|
|
174
|
-
*/
|
|
175
|
-
_formatTime: function (date) {
|
|
176
|
-
var y = date.getFullYear();
|
|
177
|
-
var m = date.getMonth() + 1;
|
|
178
|
-
m = m < 10 ? '0' + m : m;
|
|
179
|
-
var d = date.getDate();
|
|
180
|
-
d = d < 10 ? '0' + d : d;
|
|
181
|
-
var h = date.getHours();
|
|
182
|
-
h = h < 10 ? '0' + h : h;
|
|
183
|
-
var min = date.getMinutes();
|
|
184
|
-
min = min < 10 ? '0' + min : min;
|
|
185
|
-
var sec = date.getSeconds();
|
|
186
|
-
sec = sec < 10 ? '0' + sec : sec;
|
|
187
|
-
return y + '-' + m + '-' + d + ' ' + h + ':' + min + ':' + sec;
|
|
188
|
-
},
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
module.exports = {
|
|
192
|
-
Leaderboard: Leaderboard,
|
|
193
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* 排行榜模块 - 积分排行与添加积分
|
|
3
|
+
*
|
|
4
|
+
* 使用方式:
|
|
5
|
+
* Leaderboard.init(config) — 初始化(设置项目编码、服务地址)
|
|
6
|
+
* Leaderboard.getRank() — 获取积分排行榜
|
|
7
|
+
* Leaderboard.addPoint(params) — 添加积分
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// ────────────────────────────────────────
|
|
11
|
+
// 排行榜实现
|
|
12
|
+
// ────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
var Leaderboard = {
|
|
15
|
+
/** 是否已初始化 */
|
|
16
|
+
_initialized: false,
|
|
17
|
+
|
|
18
|
+
/** 配置 */
|
|
19
|
+
_config: {
|
|
20
|
+
/** 排行榜服务地址 */
|
|
21
|
+
rank_url: 'https://hyp-test.huyingpai.com/API_ACHIEVEMENT/api/user/point/rank',
|
|
22
|
+
/** 添加积分服务地址 */
|
|
23
|
+
add_url: 'https://hyp-test.huyingpai.com/API_ACHIEVEMENT/api/user/point/add',
|
|
24
|
+
/** 项目编码 */
|
|
25
|
+
project: '',
|
|
26
|
+
/** 用户ID */
|
|
27
|
+
user_id: '',
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 初始化排行榜模块
|
|
32
|
+
* @param {import('../types/interfaces').ILeaderboardConfig} config
|
|
33
|
+
*/
|
|
34
|
+
init: function (config) {
|
|
35
|
+
config = config || {};
|
|
36
|
+
|
|
37
|
+
if (config.rank_url) {
|
|
38
|
+
this._config.rank_url = config.rank_url;
|
|
39
|
+
}
|
|
40
|
+
if (config.add_url) {
|
|
41
|
+
this._config.add_url = config.add_url;
|
|
42
|
+
}
|
|
43
|
+
this._config.project = config.project || '';
|
|
44
|
+
this._config.user_id = config.user_id || '';
|
|
45
|
+
|
|
46
|
+
this._initialized = true;
|
|
47
|
+
console.log('[Leaderboard] Initialized, project:', this._config.project);
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 获取积分排行榜
|
|
52
|
+
* @returns {Promise<import('../types/interfaces').IRankResult>}
|
|
53
|
+
*/
|
|
54
|
+
getRank: function () {
|
|
55
|
+
if (!this._initialized) {
|
|
56
|
+
console.warn('[Leaderboard] Not initialized. Call Leaderboard.init() first.');
|
|
57
|
+
return Promise.reject({ code: -1, message: 'Leaderboard not initialized' });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
var self = this;
|
|
61
|
+
var data = {
|
|
62
|
+
project: self._config.project,
|
|
63
|
+
timestamp: Date.now(),
|
|
64
|
+
time: self._formatTime(new Date()),
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return self._post(self._config.rank_url, data);
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 添加积分
|
|
72
|
+
* @param {import('../types/interfaces').IAddPointParams} params
|
|
73
|
+
* @returns {Promise<any>}
|
|
74
|
+
*/
|
|
75
|
+
addPoint: function (params) {
|
|
76
|
+
if (!this._initialized) {
|
|
77
|
+
console.warn('[Leaderboard] Not initialized. Call Leaderboard.init() first.');
|
|
78
|
+
return Promise.reject({ code: -1, message: 'Leaderboard not initialized' });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
var self = this;
|
|
82
|
+
var data = {
|
|
83
|
+
project: self._config.project,
|
|
84
|
+
userId: params.user_id || self._config.user_id,
|
|
85
|
+
point: params.point || 0,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// jsonData 为可选扩展数据
|
|
89
|
+
if (params.jsonData) {
|
|
90
|
+
data.jsonData = params.jsonData;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
data.timestamp = Date.now();
|
|
94
|
+
data.time = self._formatTime(new Date());
|
|
95
|
+
|
|
96
|
+
return self._post(self._config.add_url, data);
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* 更新用户ID(登录后调用)
|
|
101
|
+
* @param {string} user_id
|
|
102
|
+
*/
|
|
103
|
+
setUserId: function (user_id) {
|
|
104
|
+
this._config.user_id = user_id;
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 获取当前项目编码
|
|
109
|
+
* @returns {string}
|
|
110
|
+
*/
|
|
111
|
+
getProject: function () {
|
|
112
|
+
return this._config.project;
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
// ────────────────────────────────────────
|
|
116
|
+
// 内部方法
|
|
117
|
+
// ────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 发送 POST 请求(Promise 封装)
|
|
121
|
+
* @param {string} url
|
|
122
|
+
* @param {Object} data
|
|
123
|
+
* @returns {Promise<any>}
|
|
124
|
+
*/
|
|
125
|
+
_post: function (url, data) {
|
|
126
|
+
return new Promise(function (resolve, reject) {
|
|
127
|
+
var dataStr = JSON.stringify(data);
|
|
128
|
+
console.log('[Leaderboard] POST:', url, dataStr);
|
|
129
|
+
|
|
130
|
+
var xmlhttp;
|
|
131
|
+
if (typeof XMLHttpRequest !== 'undefined') {
|
|
132
|
+
xmlhttp = new XMLHttpRequest();
|
|
133
|
+
} else if (typeof ActiveXObject !== 'undefined') {
|
|
134
|
+
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
|
|
135
|
+
} else {
|
|
136
|
+
reject({ code: -1, message: 'No HTTP client available' });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
xmlhttp.onreadystatechange = function () {
|
|
141
|
+
if (xmlhttp.readyState !== 4) return;
|
|
142
|
+
|
|
143
|
+
var rsp = xmlhttp.responseText || xmlhttp.responseXML;
|
|
144
|
+
var parseError = false;
|
|
145
|
+
|
|
146
|
+
if (typeof rsp === 'string') {
|
|
147
|
+
try {
|
|
148
|
+
rsp = JSON.parse(rsp);
|
|
149
|
+
} catch (e) {
|
|
150
|
+
parseError = true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (parseError || xmlhttp.status !== 200) {
|
|
155
|
+
var errMsg = parseError ? 'JSON parse error' : ('HTTP ' + xmlhttp.status);
|
|
156
|
+
console.error('[Leaderboard] Request failed:', errMsg);
|
|
157
|
+
reject({ code: xmlhttp.status || -1, message: errMsg });
|
|
158
|
+
} else {
|
|
159
|
+
console.log('[Leaderboard] Response:', rsp);
|
|
160
|
+
resolve(rsp);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
xmlhttp.open('POST', url, true);
|
|
165
|
+
xmlhttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
|
|
166
|
+
xmlhttp.send(dataStr);
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* 时间格式化:yyyy-MM-dd HH:mm:ss
|
|
172
|
+
* @param {Date} date
|
|
173
|
+
* @returns {string}
|
|
174
|
+
*/
|
|
175
|
+
_formatTime: function (date) {
|
|
176
|
+
var y = date.getFullYear();
|
|
177
|
+
var m = date.getMonth() + 1;
|
|
178
|
+
m = m < 10 ? '0' + m : m;
|
|
179
|
+
var d = date.getDate();
|
|
180
|
+
d = d < 10 ? '0' + d : d;
|
|
181
|
+
var h = date.getHours();
|
|
182
|
+
h = h < 10 ? '0' + h : h;
|
|
183
|
+
var min = date.getMinutes();
|
|
184
|
+
min = min < 10 ? '0' + min : min;
|
|
185
|
+
var sec = date.getSeconds();
|
|
186
|
+
sec = sec < 10 ? '0' + sec : sec;
|
|
187
|
+
return y + '-' + m + '-' + d + ' ' + h + ':' + min + ':' + sec;
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
module.exports = {
|
|
192
|
+
Leaderboard: Leaderboard,
|
|
193
|
+
};
|