添加bika相关功能

This commit is contained in:
yeyang
2023-01-30 16:15:57 +08:00
parent ed20f82925
commit 6bba959534
4 changed files with 124 additions and 27 deletions

View File

@@ -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)

View File

@@ -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)
]
}
})()

View File

@@ -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

View File

@@ -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
})
}