Skip to content

Commit 8da1eec

Browse files
committed
feat: [WIP] 自动活动任务
1 parent fc78b4c commit 8da1eec

File tree

7 files changed

+215
-7
lines changed

7 files changed

+215
-7
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## [0.1.4-dev](https://github.com/TomyJan/Yunzai-Kuro-Plugin/compare/v0.1.3-rel...v0.1.4-dev) (2023-07-29)
2+
3+
14
## [0.1.3-rel](https://github.com/TomyJan/Yunzai-Kuro-Plugin/compare/v0.1.2-rel...v0.1.3-rel) (2023-07-29)
25

36

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ git -C ./plugins/Yunzai-Kuro-Plugin/ pull
6969
- [x] 库街区库洛币任务 `#库街区每日`
7070
- [x] 库街区社区任务定时任务 每天 00:02 自动开始签到并向用户私聊推送签到结果
7171

72+
### 活动相关
73+
74+
- [ ] 一键活动任务 `#库街区一键活动`
75+
7276
### 查询相关
7377

7478
- [x] 库街区角色墙信息 `#战双卡片`

apps/bbsActivityTask.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import bbsActivity from '../model/bbsActivityTask.js'
2+
import plugin from '../../../lib/plugins/plugin.js'
3+
4+
export class bbsActivityTask extends plugin {
5+
constructor() {
6+
super({
7+
/** 功能名称 */
8+
name: '库街区活动任务',
9+
/** 功能描述 */
10+
dsc: '库街区活动任务',
11+
/** https://oicqjs.github.io/oicq/#events */
12+
event: 'message',
13+
/** 优先级,数字越小等级越高 */
14+
priority: 1000,
15+
rule: [
16+
{
17+
reg: '^#?(库街区|库洛|战双)一键活动(任务)?$',
18+
fnc: 'bbsActivityTask',
19+
},
20+
],
21+
})
22+
}
23+
24+
async bbsActivityTask(e) {
25+
let bbsAct = new bbsActivity(e)
26+
await bbsAct.bbsActivityTask(e.user_id)
27+
return true
28+
}
29+
30+
}

model/bbsActivityTask.js

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import { getToken } from './kuroBBSTokenHandler.js'
2+
import { getRandomInt, sleepAsync } from './utils.js'
3+
import kuroApi from './kuroApi.js'
4+
5+
export default class bbsActivityTask {
6+
constructor(e) {
7+
this.e = e
8+
}
9+
10+
async bbsActivityTask(uin) {
11+
const tokenData = await getToken(uin)
12+
console.log(tokenData)
13+
14+
if (tokenData && Object.keys(tokenData).length > 0) {
15+
const accNum = Object.keys(tokenData).length
16+
await this.e.reply(
17+
`QQ ${uin} 绑定了 ${accNum} 个 token\n开始活动任务, 稍等一会儿哟...`
18+
)
19+
let startTime = Date.now()
20+
let msg = ''
21+
for (const kuro_uid in tokenData) {
22+
if (tokenData.hasOwnProperty(kuro_uid)) {
23+
msg += await doBbsActivityTask(this.e.user_id, kuro_uid)
24+
msg += `\n`
25+
} else {
26+
msg += `账号 ${kuro_uid}: \ntoken 格式错误\n\n`
27+
}
28+
await sleepAsync(getRandomInt(1000, 3000))
29+
}
30+
msg += `共用时 ${Math.floor((Date.now() - startTime) / 1000)}s\n`
31+
32+
await this.e.reply(msg.trimEnd())
33+
return true
34+
} else {
35+
this.e.reply(
36+
`QQ ${uin} 暂未绑定 token, 请发送 #库洛验证码登录 绑定 token `
37+
)
38+
return false
39+
}
40+
}
41+
}
42+
43+
/**
44+
* 执行单个库洛账号的活动任务, 可以不经构造调用
45+
* @param {number} uin QQ
46+
* @param {number} kuro_uid 库洛 ID
47+
* @returns {string} 可以直接发送的签到结果
48+
*/
49+
export async function doBbsActivityTask(uin, kuro_uid) {
50+
let kuroapi = new kuroApi(uin)
51+
let doBbsActivityTaskRet = ''
52+
// getBindRoleInfo, 没绑定直接返回
53+
let rsp_getBindRoleInfo = await kuroapi.getBindRoleInfo(kuro_uid)
54+
logger.mark('rsp_getBindRoleInfo ' + JSON.stringify(rsp_getBindRoleInfo))
55+
if (rsp_getBindRoleInfo == `token 失效`) return `账号 ${kuro_uid}: \ntoken 失效\n`
56+
if (typeof rsp_getBindRoleInfo == 'string') return `账号 ${kuro_uid}: \n发生错误: ${rsp_getBindRoleInfo}\n`
57+
if(!rsp_getBindRoleInfo.data.haveBind) return `账号 ${kuro_uid}: \n未绑定游戏账号, 请先前往库街区手动绑定\n` // TODO: 暂时没抓绑定账号的 API, 或许会去实现这个
58+
doBbsActivityTaskRet += `账号 ${kuro_uid}: \n绑定角色: ${rsp_getBindRoleInfo.data.serverName} - ${rsp_getBindRoleInfo.data.roleName}(${rsp_getBindRoleInfo.data.roleId})\n`
59+
60+
// getList 取活动列表, 成功了根据任务的 status 执行完成和领取
61+
let rsp_getActivityTaskList = await kuroapi.getActivityTaskList(kuro_uid)
62+
logger.mark('rsp_getActivityTaskList ' + JSON.stringify(rsp_getActivityTaskList))
63+
if(typeof rsp_getActivityTaskList == 'string') {
64+
doBbsActivityTaskRet += `获取任务列表失败: ${rsp_getActivityTaskList}\n`
65+
return doBbsActivityTaskRet
66+
}
67+
for(let taskIndex in rsp_getActivityTaskList.data.taskList) {
68+
let curTask = rsp_getActivityTaskList.data.taskList[taskIndex]
69+
doBbsActivityTaskRet += curTask.taskName + ': '
70+
71+
let rsp_completeActivityTask = ''
72+
if([2, 3, 4].includes(curTask.type)) {
73+
// 不可以自动做的任务类型
74+
// TODO: 3 和 4 的自动完成
75+
if(curTask.status == 0) {
76+
doBbsActivityTaskRet += `未完成且不可自动完成\n`
77+
continue
78+
}
79+
80+
} else if(curTask.status == 0) {
81+
// 可以自动做, 且还未完成的任务
82+
rsp_completeActivityTask = await kuroapi.completeActivityTask(kuro_uid, {taskId: curTask.taskId})
83+
if(typeof rsp_completeActivityTask == 'string') {
84+
doBbsActivityTaskRet += `完成失败: ${rsp_completeActivityTask}\n`
85+
continue
86+
}
87+
doBbsActivityTaskRet += `完成成功, `
88+
}
89+
90+
// 如果任务待领取, 或者刚刚完成了
91+
if(curTask.status == 1 || typeof rsp_completeActivityTask !== 'string'){
92+
let rsp_receiveActivityTask = await kuroapi.receiveActivityTask(kuro_uid, {taskId: curTask.taskId})
93+
if(typeof rsp_receiveActivityTask == 'string') {
94+
doBbsActivityTaskRet += `领取失败: ${rsp_receiveActivityTask}\n`
95+
continue
96+
}
97+
doBbsActivityTaskRet += `领取成功\n`
98+
}
99+
100+
// 任务领取过了
101+
if(curTask.status == 2) doBbsActivityTaskRet += `已领取\n`
102+
}
103+
104+
// 取任务列表
105+
// 里程碑, 满足就领不满足就返回
106+
//
107+
//
108+
//
109+
return doBbsActivityTaskRet
110+
111+
}

model/kuroApi.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,44 @@ export default class kuroApi {
233233
async getTotalGold(kuroUid) {
234234
return this.getData('getTotalGold', kuroUid, {})
235235
}
236+
237+
/**
238+
* 取活动绑定游戏角色信息
239+
* @param {string} kuroUid 库洛 ID
240+
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
241+
*/
242+
async getBindRoleInfo(kuroUid) {
243+
return this.getData('getBindRoleInfo', kuroUid, {})
244+
}
245+
246+
/**
247+
* 取活动任务详情
248+
* @param {string} kuroUid 库洛 ID
249+
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
250+
*/
251+
async getActivityTaskList(kuroUid) {
252+
return this.getData('getActivityTaskList', kuroUid, {})
253+
}
254+
255+
/**
256+
* 完成活动任务, 暂时写死游戏 id
257+
* @param {string} kuroUid 库洛 ID
258+
* @param {object} data 传入 data.taskId 任务 id
259+
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
260+
*/
261+
async completeActivityTask(kuroUid, data) {
262+
data.gameId = 2
263+
return this.getData('completeActivityTask', kuroUid, data)
264+
}
265+
266+
/**
267+
* 领取活动任务奖励, 暂时写死游戏 id
268+
* @param {string} kuroUid 库洛 ID
269+
* @param {object} data 传入 data.taskId 任务 id
270+
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
271+
*/
272+
async receiveActivityTask(kuroUid, data) {
273+
data.gameId = 2
274+
return this.getData('receiveActivityTask', kuroUid, data)
275+
}
236276
}

model/kuroApiHandler.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ export default class kuroApiHandler {
2525
body: body,
2626
method: method,
2727
}
28-
//logger.info(url)
29-
//logger.info(headers)
30-
//logger.info(body)
31-
//logger.info(method)
28+
logger.info('url: ' + url)
29+
logger.info('header: ' + JSON.stringify(headers))
30+
logger.info('body: ' + body)
31+
logger.info('method: ' + method)
3232

3333
let response = {}
3434
try {
@@ -45,7 +45,7 @@ export default class kuroApiHandler {
4545
}
4646

4747
let rsp = await response.json()
48-
//logger.info(rsp)
48+
logger.info('rsp: ' + JSON.stringify(rsp))
4949
return rsp
5050
}
5151
/**
@@ -133,6 +133,26 @@ export default class kuroApiHandler {
133133
url: `${this.kuroApiUrl}/encourage/gold/getTotalGold`,
134134
body: ``,
135135
},
136+
getBindRoleInfo: {
137+
// 取活动绑定游戏角色信息
138+
url: `${this.kuroApiUrl}/activity/gamer/role/getBindRoleInfo`,
139+
body: `userId=${kuroUid}`,
140+
},
141+
getActivityTaskList: {
142+
// 取活动任务详情
143+
url: `${this.kuroApiUrl}/activity/task/getList`,
144+
body: `userId=${kuroUid}`,
145+
},
146+
completeActivityTask: {
147+
// 完成活动任务
148+
url: `${this.kuroApiUrl}/activity/task/complete`,
149+
body: `userId=${kuroUid}&taskId=${data.taskId}&gameId=${data.gameId}`,
150+
},
151+
receiveActivityTask: {
152+
// 领取活动任务奖励
153+
url: `${this.kuroApiUrl}/activity/task/receive`,
154+
body: `userId=${kuroUid}&taskId=${data.taskId}&gameId=${data.gameId}`,
155+
}
136156
}
137157
if (!ApiMap[ApiName]) return false
138158
let {
@@ -156,7 +176,7 @@ export default class kuroApiHandler {
156176
* @returns {object} 返回参数
157177
*/
158178
getHeaders(ApiName, token) {
159-
if (['initSignIn', 'gameSignIn'].includes(ApiName)) {
179+
if (['initSignIn', 'gameSignIn', 'getBindRoleInfo', 'getActivityTaskList', 'completeActivityTask', 'receiveActivityTask'].includes(ApiName)) {
160180
// 这些 API 请求头是浏览器的
161181
let headers = {
162182
pragma: 'no-cache',

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "Yunzai-Kuro-Plugin",
3-
"version": "0.1.3-rel",
3+
"version": "0.1.4-dev",
44
"author": "TomyJan",
55
"description": "Yunzai-Bot plugin for kuro games.",
66
"type": "module",

0 commit comments

Comments
 (0)