diff --git a/apps/bika.js b/apps/bika.js index 3c3ac7a..b0590bb 100644 --- a/apps/bika.js +++ b/apps/bika.js @@ -6,10 +6,10 @@ const SWITCH_ERROR = '主人没有开放这个功能哦(*/ω\*)' // 汉字数字匹配正则 const numReg = '[一壹二两三四五六七八九十百千万亿\\d]+' - +const Prefix = '(bika|哔咔)' // 命令正则 -const searchReg = new RegExp(`^#?(bika|哔咔)搜索(.*?)(第(${numReg})页)?$`) -const comicPageReg = new RegExp(`^#?(bika|哔咔)id(.*?)(第(${numReg})页)?$`) +const searchReg = new RegExp(`^#?${Prefix}(类别|作者)?搜索(.*?)(第(${numReg})页)?$`) +const comicPageReg = new RegExp(`^#?${Prefix}id(.*?)(第(${numReg})页)?$`) export class newBika extends plugin { constructor () { super({ @@ -24,6 +24,14 @@ export class newBika extends plugin { { reg: comicPageReg, fnc: 'comicPage' + }, + { + reg: `#?${Prefix}类别列表`, + fnc: 'categories' + }, + { + reg: `#?${Prefix}(详情|细节)(.*)`, + fnc: 'comicDetail' } ] @@ -35,8 +43,8 @@ export class newBika extends plugin { if (!this.handlePermission()) return e.reply(SWITCH_ERROR) e.reply(Pixiv.startMsg) let regRet = e.msg.match(searchReg) - let page = common.translateChinaNum(regRet[4]) - let msg = await Bika.search(regRet[2], page) + let page = common.translateChinaNum(regRet[5]) + let msg = await Bika.search(regRet[3], page, regRet[2]) if (msg.error) return e.reply(msg.error) common.getRecallsendMsg(e, msg) } @@ -52,6 +60,23 @@ export class newBika extends plugin { common.getRecallsendMsg(e, msg) } + /** 类别列表 */ + async categories (e) { + if (!this.handlePermission()) return e.reply(SWITCH_ERROR) + e.reply(Pixiv.startMsg) + let msg = await Bika.categories() + common.getRecallsendMsg(e, msg) + } + + /** 漫画细节 */ + async comicDetail (e) { + if (!this.handlePermission()) return e.reply(SWITCH_ERROR) + e.reply(Pixiv.startMsg) + let id = e.msg.match(new RegExp(`#?${Prefix}(详情|细节)(.*)`))[3] + let msg = await Bika.comicDetail(id) + common.getRecallsendMsg(e, msg, { oneMsg: true }) + } + /** 权限判定 */ handlePermission () { let { sesepro } = Config.getGroup(this.e.group_id) diff --git a/model/Bika.js b/model/Bika.js index 4c89ec2..3e5e0be 100644 --- a/model/Bika.js +++ b/model/Bika.js @@ -19,21 +19,40 @@ export default new (class { * @description: 搜索关键词 * @param {String} keyword 关键词 * @param {Number} page 页数 - * @return {*} + * @param {'dd'|'da'|'ld'|'vd'} sort dd : 最新发布 da : 最早发布 ld : 最多喜欢 vd : 最多浏览 + * @param {'search'|'category'|'类别'} type search为高级搜索acategory为类别搜索 + * @return {Array} */ - async search (keyword, page = 1) { - let res = await fetch(`${this.domain}/advanced_search?keyword=${keyword}&page=${page}&sort=ld`, this.hearder) + async search (keyword, page = 1, type = 'search', sort = 'ld') { + let types = [ + { + alias: ['高级搜索', 'search'], + url: `${this.domain}/advanced_search?keyword=${keyword}&page=${page}&sort=${sort}`, + default: true + }, + { + alias: ['类别', 'category'], + url: `${this.domain}/category_list?category=${keyword}&page=${page}&sort=${sort}` + }, + { + alias: ['作者', 'author'], + url: `${this.domain}/author_list?author=${keyword}&page=${page}&sort=${sort}` + } + ] + type = types.find(item => item.alias.includes(type)) + console.log(type) + let res = await fetch(type.url, this.hearder) .then((res) => res.json()) .catch((err) => console.log(err)) if (!res) return { error: API_ERROR } let { docs, total, page: pg, pages } = res.data.comics - if (total == 0) return { error: '未找到作品,换个关键词试试吧' } + if (total == 0) return { error: `未找到作品,换个${type.alias[1]}试试吧` } return [ - `共找到${total}个关于${keyword}的作品`, + `共找到${total}个关于「${keyword}」${type.alias[1]}的作品`, `当前为第${pg}页,共${pages}页`, ...docs.map((item) => { - let { title, tags, categories, author, description, likesCount, thumb, _id } = item + let { title, tags, categories, author, description = '未知', likesCount, thumb, _id, finished } = item return [ `id:${_id}\n`, `标题:${title}\n`, @@ -41,7 +60,8 @@ export default new (class { `描述:${lodash.truncate(description)}\n`, `分类:${categories.join(',')}\n`, `喜欢:${likesCount}\n`, - `tag:${lodash.truncate(tags.join(','))}\n`, + `完结:${finished}\n`, + tags ? `tag:${lodash.truncate(tags.join(','))}\n` : '', segment.image(this.imgproxy + thumb.path) ] }) @@ -66,7 +86,58 @@ export default new (class { return [ `id: ${_id}, ${title}`, `共${total}张,当前为第${pg}页,共${pages}页`, - docs.map(item => segment.image(this.imgproxy + item.media.path)) + ...docs.map(item => segment.image(this.imgproxy + item.media.path)) + ] + } + + /** 类别列表 */ + async categories () { + let key = 'yenai:bika:categories' + let res = JSON.parse(await redis.get(key)) + if (!res) { + res = await fetch(`${this.domain}/categories`, this.hearder) + .then((res) => res.json()) + .catch((err) => console.log(err)) + if (!res) return { error: API_ERROR } + if (res.error) return { error: res.message } + res = res.data.categories.filter(item => !item.isWeb) + await redis.set(key, JSON.stringify(res), { EX: 43200 }) + } + return res.map(item => { + let { title, thumb, description = '未知' } = item + let { fileServer, path } = thumb + return [ + `category: ${title}\n`, + `描述:${description}\n`, + segment.image((/storage(-b|1).picacomic.com/.test(fileServer) ? this.imgproxy : fileServer) + path) + ] + }) + } + + async comicDetail (id) { + let res = await fetch(`${this.domain}/comic_detail?id=${id}`, this.hearder) + .then((res) => res.json()) + .catch((err) => console.log(err)) + if (!res) return { error: API_ERROR } + if (res.error) return { error: res.message } + let { + _id, title, description, author, chineseTeam, categories, tags, pagesCount, epsCount, finished, totalLikes, totalViews, totalComments, thumb + } = res.data.comic + return [ + `id: ${_id}\n`, + `title:${title}\n`, + `描述:${lodash.truncate(description)}\n`, + `作者:${author}\n`, + `汉化:${chineseTeam}\n`, + `页数:${pagesCount}\n`, + `话数:${epsCount}\n`, + `完结:${finished}\n`, + `喜欢:${totalLikes}\n`, + `浏览量:${totalViews}\n`, + `评论量:${totalComments}\n`, + `分类:${categories.join(',')}\n`, + `tag:${tags.join(',')}`, + segment.image(this.imgproxy + thumb.path) ] } })() diff --git a/model/Pixiv.js b/model/Pixiv.js index 9e16069..ac29d4d 100644 --- a/model/Pixiv.js +++ b/model/Pixiv.js @@ -147,7 +147,7 @@ export default new class Pixiv { if (page > pageAll) { return { error: '哪有那么多图片给你辣(•̀へ •́ ╮ )' } } - if (!date) date = moment().subtract(moment().hour() >= 12 ? 1 : 2, 'days').format('YYYY-MM-DD') + if (!date) date = moment().subtract(moment().utcOffset(9).hour() >= 12 ? 1 : 2, 'days').format('YYYY-MM-DD') let parame = `mode=${type}&page=${page}&date=${date}` // 请求api diff --git a/model/common.js b/model/common.js index 65cbaeb..ccc33c8 100644 --- a/model/common.js +++ b/model/common.js @@ -71,19 +71,19 @@ export default new class newCommon { * @param {Boolean} data.isBot 转发信息是否以bot信息发送 * @param {String} data.fkmsg 风控消息不传则默认消息 * @param {Boolean} data.isxml 是否处理卡片 + * @param {Boolean} data.oneMsg 是否只有一条消息 * @return {Object} 消息是否发送成功的对象 */ - async getforwardMsg (e, message, { recallMsg = 0, isBot = true, fkmsg = '', isxml = false } = {}) { + async getforwardMsg (e, message, { recallMsg = 0, isBot = true, fkmsg = '', isxml = false, oneMsg = false } = {}) { let forwardMsg = [] - for (let i of message) { - forwardMsg.push( - { - message: i, - nickname: isBot ? Bot.nickname : e.sender.card || e.sender.nickname, - user_id: isBot ? Bot.uin : e.sender.user_id - } - ) - } + let add = (msg) => forwardMsg.push( + { + message: msg, + nickname: isBot ? Bot.nickname : e.sender.card || e.sender.nickname, + user_id: isBot ? Bot.uin : e.sender.user_id + } + ) + oneMsg ? add(message) : message.forEach(item => add(item)) // 发送 if (e.isGroup) { forwardMsg = await e.group.makeForwardMsg(forwardMsg) @@ -124,15 +124,16 @@ export default new class newCommon { * @param {*} e oicq * @param {Array} msg 发送的消息 * @param {String} fkmsg 风控消息 + * @param {Object} data 其他参数 * @return {Object} 消息是否发送成功的对象 */ - async getRecallsendMsg (e, msg, fkmsg = '') { + async getRecallsendMsg (e, msg, data = {}) { let recalltime = setu.getRecallTime(e.group_id) return await this.getforwardMsg(e, msg, { recallMsg: recalltime, isBot: false, - fkmsg, - isxml: true + isxml: true, + ...data }) }