Skip to content

Commit

Permalink
feat: [WIP] 自动活动任务
Browse files Browse the repository at this point in the history
  • Loading branch information
TomyJan committed Jul 29, 2023
1 parent fc78b4c commit 8da1eec
Show file tree
Hide file tree
Showing 7 changed files with 215 additions and 7 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## [0.1.4-dev](https://github.com/TomyJan/Yunzai-Kuro-Plugin/compare/v0.1.3-rel...v0.1.4-dev) (2023-07-29)


## [0.1.3-rel](https://github.com/TomyJan/Yunzai-Kuro-Plugin/compare/v0.1.2-rel...v0.1.3-rel) (2023-07-29)


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

### 活动相关

- [ ] 一键活动任务 `#库街区一键活动`

### 查询相关

- [x] 库街区角色墙信息 `#战双卡片`
Expand Down
30 changes: 30 additions & 0 deletions apps/bbsActivityTask.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import bbsActivity from '../model/bbsActivityTask.js'
import plugin from '../../../lib/plugins/plugin.js'

export class bbsActivityTask extends plugin {
constructor() {
super({
/** 功能名称 */
name: '库街区活动任务',
/** 功能描述 */
dsc: '库街区活动任务',
/** https://oicqjs.github.io/oicq/#events */
event: 'message',
/** 优先级,数字越小等级越高 */
priority: 1000,
rule: [
{
reg: '^#?(库街区|库洛|战双)一键活动(任务)?$',
fnc: 'bbsActivityTask',
},
],
})
}

async bbsActivityTask(e) {
let bbsAct = new bbsActivity(e)
await bbsAct.bbsActivityTask(e.user_id)
return true
}

}
111 changes: 111 additions & 0 deletions model/bbsActivityTask.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import { getToken } from './kuroBBSTokenHandler.js'
import { getRandomInt, sleepAsync } from './utils.js'
import kuroApi from './kuroApi.js'

export default class bbsActivityTask {
constructor(e) {
this.e = e
}

async bbsActivityTask(uin) {
const tokenData = await getToken(uin)
console.log(tokenData)

if (tokenData && Object.keys(tokenData).length > 0) {
const accNum = Object.keys(tokenData).length
await this.e.reply(
`QQ ${uin} 绑定了 ${accNum} 个 token\n开始活动任务, 稍等一会儿哟...`
)
let startTime = Date.now()
let msg = ''
for (const kuro_uid in tokenData) {
if (tokenData.hasOwnProperty(kuro_uid)) {
msg += await doBbsActivityTask(this.e.user_id, kuro_uid)
msg += `\n`
} else {
msg += `账号 ${kuro_uid}: \ntoken 格式错误\n\n`
}
await sleepAsync(getRandomInt(1000, 3000))
}
msg += `共用时 ${Math.floor((Date.now() - startTime) / 1000)}s\n`

await this.e.reply(msg.trimEnd())
return true
} else {
this.e.reply(
`QQ ${uin} 暂未绑定 token, 请发送 #库洛验证码登录 绑定 token `
)
return false
}
}
}

/**
* 执行单个库洛账号的活动任务, 可以不经构造调用
* @param {number} uin QQ
* @param {number} kuro_uid 库洛 ID
* @returns {string} 可以直接发送的签到结果
*/
export async function doBbsActivityTask(uin, kuro_uid) {
let kuroapi = new kuroApi(uin)
let doBbsActivityTaskRet = ''
// getBindRoleInfo, 没绑定直接返回
let rsp_getBindRoleInfo = await kuroapi.getBindRoleInfo(kuro_uid)
logger.mark('rsp_getBindRoleInfo ' + JSON.stringify(rsp_getBindRoleInfo))
if (rsp_getBindRoleInfo == `token 失效`) return `账号 ${kuro_uid}: \ntoken 失效\n`
if (typeof rsp_getBindRoleInfo == 'string') return `账号 ${kuro_uid}: \n发生错误: ${rsp_getBindRoleInfo}\n`
if(!rsp_getBindRoleInfo.data.haveBind) return `账号 ${kuro_uid}: \n未绑定游戏账号, 请先前往库街区手动绑定\n` // TODO: 暂时没抓绑定账号的 API, 或许会去实现这个
doBbsActivityTaskRet += `账号 ${kuro_uid}: \n绑定角色: ${rsp_getBindRoleInfo.data.serverName} - ${rsp_getBindRoleInfo.data.roleName}(${rsp_getBindRoleInfo.data.roleId})\n`

// getList 取活动列表, 成功了根据任务的 status 执行完成和领取
let rsp_getActivityTaskList = await kuroapi.getActivityTaskList(kuro_uid)
logger.mark('rsp_getActivityTaskList ' + JSON.stringify(rsp_getActivityTaskList))
if(typeof rsp_getActivityTaskList == 'string') {
doBbsActivityTaskRet += `获取任务列表失败: ${rsp_getActivityTaskList}\n`
return doBbsActivityTaskRet
}
for(let taskIndex in rsp_getActivityTaskList.data.taskList) {
let curTask = rsp_getActivityTaskList.data.taskList[taskIndex]
doBbsActivityTaskRet += curTask.taskName + ': '

let rsp_completeActivityTask = ''
if([2, 3, 4].includes(curTask.type)) {
// 不可以自动做的任务类型
// TODO: 3 和 4 的自动完成
if(curTask.status == 0) {
doBbsActivityTaskRet += `未完成且不可自动完成\n`
continue
}

} else if(curTask.status == 0) {
// 可以自动做, 且还未完成的任务
rsp_completeActivityTask = await kuroapi.completeActivityTask(kuro_uid, {taskId: curTask.taskId})
if(typeof rsp_completeActivityTask == 'string') {
doBbsActivityTaskRet += `完成失败: ${rsp_completeActivityTask}\n`
continue
}
doBbsActivityTaskRet += `完成成功, `
}

// 如果任务待领取, 或者刚刚完成了
if(curTask.status == 1 || typeof rsp_completeActivityTask !== 'string'){
let rsp_receiveActivityTask = await kuroapi.receiveActivityTask(kuro_uid, {taskId: curTask.taskId})
if(typeof rsp_receiveActivityTask == 'string') {
doBbsActivityTaskRet += `领取失败: ${rsp_receiveActivityTask}\n`
continue
}
doBbsActivityTaskRet += `领取成功\n`
}

// 任务领取过了
if(curTask.status == 2) doBbsActivityTaskRet += `已领取\n`
}

// 取任务列表
// 里程碑, 满足就领不满足就返回
//
//
//
return doBbsActivityTaskRet

}
40 changes: 40 additions & 0 deletions model/kuroApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -233,4 +233,44 @@ export default class kuroApi {
async getTotalGold(kuroUid) {
return this.getData('getTotalGold', kuroUid, {})
}

/**
* 取活动绑定游戏角色信息
* @param {string} kuroUid 库洛 ID
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
*/
async getBindRoleInfo(kuroUid) {
return this.getData('getBindRoleInfo', kuroUid, {})
}

/**
* 取活动任务详情
* @param {string} kuroUid 库洛 ID
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
*/
async getActivityTaskList(kuroUid) {
return this.getData('getActivityTaskList', kuroUid, {})
}

/**
* 完成活动任务, 暂时写死游戏 id
* @param {string} kuroUid 库洛 ID
* @param {object} data 传入 data.taskId 任务 id
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
*/
async completeActivityTask(kuroUid, data) {
data.gameId = 2
return this.getData('completeActivityTask', kuroUid, data)
}

/**
* 领取活动任务奖励, 暂时写死游戏 id
* @param {string} kuroUid 库洛 ID
* @param {object} data 传入 data.taskId 任务 id
* @returns {JSON|string} code=200 时接口返回的原始 json 或者报错信息
*/
async receiveActivityTask(kuroUid, data) {
data.gameId = 2
return this.getData('receiveActivityTask', kuroUid, data)
}
}
32 changes: 26 additions & 6 deletions model/kuroApiHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ export default class kuroApiHandler {
body: body,
method: method,
}
//logger.info(url)
//logger.info(headers)
//logger.info(body)
//logger.info(method)
logger.info('url: ' + url)
logger.info('header: ' + JSON.stringify(headers))
logger.info('body: ' + body)
logger.info('method: ' + method)

let response = {}
try {
Expand All @@ -45,7 +45,7 @@ export default class kuroApiHandler {
}

let rsp = await response.json()
//logger.info(rsp)
logger.info('rsp: ' + JSON.stringify(rsp))
return rsp
}
/**
Expand Down Expand Up @@ -133,6 +133,26 @@ export default class kuroApiHandler {
url: `${this.kuroApiUrl}/encourage/gold/getTotalGold`,
body: ``,
},
getBindRoleInfo: {
// 取活动绑定游戏角色信息
url: `${this.kuroApiUrl}/activity/gamer/role/getBindRoleInfo`,
body: `userId=${kuroUid}`,
},
getActivityTaskList: {
// 取活动任务详情
url: `${this.kuroApiUrl}/activity/task/getList`,
body: `userId=${kuroUid}`,
},
completeActivityTask: {
// 完成活动任务
url: `${this.kuroApiUrl}/activity/task/complete`,
body: `userId=${kuroUid}&taskId=${data.taskId}&gameId=${data.gameId}`,
},
receiveActivityTask: {
// 领取活动任务奖励
url: `${this.kuroApiUrl}/activity/task/receive`,
body: `userId=${kuroUid}&taskId=${data.taskId}&gameId=${data.gameId}`,
}
}
if (!ApiMap[ApiName]) return false
let {
Expand All @@ -156,7 +176,7 @@ export default class kuroApiHandler {
* @returns {object} 返回参数
*/
getHeaders(ApiName, token) {
if (['initSignIn', 'gameSignIn'].includes(ApiName)) {
if (['initSignIn', 'gameSignIn', 'getBindRoleInfo', 'getActivityTaskList', 'completeActivityTask', 'receiveActivityTask'].includes(ApiName)) {
// 这些 API 请求头是浏览器的
let headers = {
pragma: 'no-cache',
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "Yunzai-Kuro-Plugin",
"version": "0.1.3-rel",
"version": "0.1.4-dev",
"author": "TomyJan",
"description": "Yunzai-Bot plugin for kuro games.",
"type": "module",
Expand Down

0 comments on commit 8da1eec

Please sign in to comment.