⚗️ add 私聊禁言,解禁,踢,全体解禁功能

This commit is contained in:
yeyang
2023-02-02 16:40:58 +08:00
parent 2b5ef4f4e7
commit cf10dc8bcc
8 changed files with 165 additions and 94 deletions

View File

@@ -31,7 +31,7 @@ lodash.forIn(picapis, (values, key) => {
const apiReg = new RegExp(`(${picApiKeys.join('|')}|^jktj$|^接口统计$)`)
export class example extends plugin {
export class Fun extends plugin {
constructor () {
super({
name: '椰奶娱乐',

View File

@@ -18,28 +18,28 @@ const noactivereg = new RegExp(`^#(查看|清理|确认清理|获取)(${Numreg})
const Autisticreg = new RegExp(`^#?我要(自闭|禅定)(${Numreg})?个?(${TimeUnitReg})?$`, 'i')
// 获取定时任务
const redisTask = await ga.getRedisMuteTask() || false
export class Basics extends plugin {
export class GroupAdmin extends plugin {
constructor () {
super({
name: '椰奶基础群管',
name: '椰奶群管',
event: 'message.group',
priority: 500,
rule: [
{
reg: '^#禁言.*$',
fnc: 'Taboo'
reg: `^#禁言\\s?((\\d+)\\s)?(${Numreg})?(${TimeUnitReg})?$`,
fnc: 'muteMember'
},
{
reg: '^#解禁(\\d+)?$',
fnc: 'Relieve'
fnc: 'noMuteMember'
},
{
reg: '^#全体(禁言|解禁)$',
fnc: 'TabooAll'
fnc: 'muteAll'
},
{
reg: '^#踢(\\d+)?$',
fnc: 'Kick'
fnc: 'kickMember'
},
{
reg: '^#(设置|取消)管理(\\d+)?$',
@@ -155,76 +155,31 @@ export class Basics extends plugin {
}
/** 禁言 */
async Taboo (e) {
async muteMember (e) {
// 判断权限
if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR)
// 判断是否有管理
if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true)
let qq = e.message.find(item => item.type == 'at')?.qq
let TabooTime = 5
let Company = 300
// 判断有无@
if (!qq) {
let regRet = e.msg.match(new RegExp(`#禁言\\s?(\\d+)\\s(${Numreg})?(${TimeUnitReg})?`))
if (!regRet) return e.reply('❎ 请检查指令格式是否正确')
// 处理消息
if (!regRet[1]) return e.reply('❎ 未取得QQ号请检查指令格式')
qq = regRet[1]
// 获取数字
TabooTime = common.translateChinaNum(regRet[2] || 5)
// 获取单位
Company = common.Time_unit[lodash.toUpper(regRet[3]) || '分']
} else {
TabooTime = common.translateChinaNum(e.msg.match(new RegExp(Numreg)) || 5)
Company = common.Time_unit[lodash.toUpper(e.msg.match(new RegExp(TimeUnitReg))) || '分']
}
if (!(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号')
// 判断是否为主人
if (Config.masterQQ?.includes(Number(qq))) {
e.reply('居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ')
return e.group.muteMember(e.user_id, 300)
}
let Memberinfo = e.group.pickMember(Number(qq)).info
// 判断是否有这个人
if (!Memberinfo) return e.reply('❎ 这个群没有这个人哦~', true)
// 特殊处理
if (Memberinfo.role === 'owner') {
e.reply('调戏群主拖出去枪毙5分钟(。>︿<)_θ', true)
return e.group.muteMember(e.user_id, 300)
}
if (Memberinfo.role === 'admin') {
if (!e.group.is_owner) return e.reply('人家又不是群主这种事做不到的辣!', true)
if (!e.isMaster && !e.member.is_owner) return e.reply('这个淫系管理员辣只有主淫和群主才可以干ta', true)
}
console.log(qq, TabooTime * Company)
await e.group.muteMember(qq, TabooTime * Company)
e.reply(`已把「${Memberinfo.card || Memberinfo.nickname}」扔进了小黑屋( ・_・)ノ⌒●~*`, true)
return true
let regRet = e.msg.match(new RegExp(`#禁言\\s?((\\d+)\\s)?(${Numreg})?(${TimeUnitReg})?`))
console.log(regRet)
let res = await ga.muteMember(e.group_id, qq ?? regRet[2], e.user_id, regRet[3], regRet[4])
e.reply(res)
}
/** 解禁 */
async Relieve (e) {
async noMuteMember (e) {
// 判断权限
if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR)
// 判断是否有管理
if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true)
let qq = e.message.find(item => item.type == 'at')?.qq
if (!qq) qq = e.msg.replace(/#|解禁/g, '').trim()
if (!qq || !(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号')
let Member = e.group.pickMember(Number(qq))
// 判断是否有这个人
if (!Member.info) return e.reply('❎ 这个群没有这个人哦~')
await e.group.muteMember(qq, 0)
e.reply(`已把「${Member.card || Member.nickname}」从小黑屋揪了出来(。>∀<。)`, true)
let regRet = e.msg.match(/#解禁(\\d+)/)
let res = await ga.muteMember(e.group_id, qq ?? regRet[1], e.user_id, 0)
e.reply(res)
}
/** 全体禁言 */
async TabooAll (e) {
async muteAll (e) {
// 判断权限
if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR)
// 判断是否有管理
@@ -237,7 +192,7 @@ export class Basics extends plugin {
}
// 踢群员
async Kick (e) {
async kickMember (e) {
// 判断权限
if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR)
// 判断是否有管理
@@ -245,22 +200,8 @@ export class Basics extends plugin {
let qq = e.message.find(item => item.type == 'at')?.qq
if (!qq) qq = e.msg.replace(/#|踢/g, '').trim()
if (!qq || !(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号')
// 判断是否为主人
if (Config.masterQQ?.includes(Number(qq))) {
return e.reply('居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ')
}
let Memberinfo = e.group.pickMember(Number(qq)).info
// 判断是否有这个人
if (!Memberinfo) return e.reply('❎ 这个群没有这个人哦~', true)
if (Memberinfo.role === 'owner') return e.reply('调戏群主拖出去枪毙5分钟(。>︿<)_θ', true)
if (Memberinfo.role === 'admin') {
if (!e.group.is_owner) return e.reply('人家又不是群主这种事做不到的辣!', true)
if (!e.isMaster && !e.member.is_owner) return e.reply('这个淫系管理员辣只有主淫和群主才可以干ta', true)
}
let res = await e.group.kickMember(Number(qq))
res ? e.reply('已把这个坏淫踢掉惹!!!', true) : e.reply('额...踢出失败哩,可能这个淫比较腻害>_<', true)
let res = await ga.kickMember(e.group_id, qq, e.user_id)
e.reply(res)
}
// 我要自闭

63
apps/privateGroupAdmin.js Normal file
View File

@@ -0,0 +1,63 @@
import plugin from '../../../lib/plugins/plugin.js'
import { GroupAdmin as ga, common } from '../model/index.js'
// 正则
const Numreg = '[一壹二两三四五六七八九十百千万亿\\d]+'
const TimeUnitReg = Object.keys(common.Time_unit).join('|')
const muteMemberReg = new RegExp(`^#禁言\\s?(\\d+)\\s(\\d+)\\s(${Numreg})?(${TimeUnitReg})?$`)
export class PrivateGroupAdmin extends plugin {
constructor () {
super({
name: '椰奶私聊群管',
event: 'message',
priority: 2000,
rule: [
{
reg: muteMemberReg,
fnc: 'muteMember'
},
{
reg: '^#解禁\\s?(\\d+)\\s(\\d+)$',
fnc: 'nomuteMember'
},
{
reg: '^#全体(禁言|解禁)(\\d+)$',
fnc: 'muteAll'
},
{
reg: '^#踢\\s?(\\d+)\\s(\\d+)$',
fnc: 'kickMember'
}
]
})
}
async muteMember (e) {
if (!e.isMaster) return false
let regRet = e.msg.match(muteMemberReg)
let res = await ga.muteMember(regRet[1], regRet[2], e.user_id, regRet[3], regRet[4])
e.reply(res)
}
async noMuteMember (e) {
if (!e.isMaster) return false
let regRet = e.msg.match(/^#解禁\s?(\d+)\s(\d+)$/)
let res = await ga.muteMember(regRet[1], regRet[2], e.user_id, 0)
e.reply(res)
}
async muteAll (e) {
if (!e.isMaster) return false
let regRet = e.msg.match(/全体(禁言|解禁)(\d+)/)
let group = Bot.pickGroup(Number(regRet[2]))
group.muteAll(regRet[1] == '禁言')
e.reply(`✅ 已将群「${group.name}(${group.group_id})」${regRet[1] == '禁言' ? '开启' : '解除'}全体禁言`)
}
async kickMember (e) {
if (!e.isMaster) return false
let regRet = e.msg.match(/#踢\s?(\d+)\s(\d+)$/)
let res = await ga.kickMember(regRet[1], regRet[2], e.user_id)
e.reply(res)
}
}

View File

@@ -42,6 +42,11 @@ for (let i in files) {
logger.error(ret[i].reason)
continue
}
apps[name] = ret[i].value[Object.keys(ret[i].value)[0]]
let value = ret[i].value
for (let f in value) {
apps[f] = value[f]
}
// apps[name] = ret[i].value[Object.keys(ret[i].value)[0]]
}
export { apps }

View File

@@ -59,7 +59,7 @@ export default new (class {
return [
`共找到${total}个关于「${keyword}${type.alias[0]}的作品`,
`当前为第${pg}页,共${pages}`,
...await Promise.all(docs.map(async (item) => {
...await Promise.allSettled(docs.map(async (item) => {
let { title, tags, categories, author, description = '未知', likesCount, thumb, _id, finished } = item
return [
`id${_id}\n`,
@@ -94,7 +94,7 @@ export default new (class {
return [
`id: ${_id} ${title}`,
`${total}张,当前为第${pg}页,共${pages}页,当前为第${order}`,
...await Promise.all(docs.map(async item => await Pixiv.proxyFetchImg((this.imgproxy ?? `${item.media.fileServer}/static/`) + item.media.path)))
...await Promise.allSettled(docs.map(async item => await Pixiv.proxyFetchImg((this.imgproxy ?? `${item.media.fileServer}/static/`) + item.media.path)))
]
}
@@ -111,7 +111,7 @@ export default new (class {
res = res.data.categories.filter(item => !item.isWeb)
await redis.set(key, JSON.stringify(res), { EX: 43200 })
}
return await Promise.all(res.map(async item => {
return await Promise.allSettled(res.map(async item => {
let { title, thumb, description = '未知' } = item
let { fileServer, path } = thumb
fileServer = /static/.test(fileServer) ? fileServer : fileServer + '/static/'

View File

@@ -1,9 +1,13 @@
import { common } from './index.js'
import lodash from 'lodash'
import moment from 'moment'
import { segment } from 'oicq'
import loader from '../../../lib/plugins/loader.js'
class Group_admin {
import { Config } from '../components/index.js'
import { common } from './index.js'
// 无管理文案
const ROLE_ERROR = '做不到,怎么想我都做不到吧ヽ(≧Д≦)'
export default new class {
constructor () {
this.MuteTaskKey = 'yenai:MuteTasks'
}
@@ -310,6 +314,65 @@ class Group_admin {
]
})
}
}
export default new Group_admin()
/**
* @description: 禁言某人
* @param {Number} groupId 群号
* @param {Number} userId 被禁言人QQ
* @param {Number} executor 执行人QQ
* @param {Number} time 时间倍数 0为解禁
* @param {String} unit 时间单位
* @return {String} 回复消息
*/
async muteMember (groupId, userId, executor, time = 5, unit = '分') {
unit = common.Time_unit[unit.toUpperCase()] ?? (/^\d+$/.test(unit) ? unit : 60)
let group = null
try { group = Bot.pickGroup(Number(groupId), true) } catch (err) { return err.message }
// 判断是否有管理
if (!group.is_admin && !group.is_owner) return ROLE_ERROR
if (!(/\d{5,}/.test(userId))) return '❎ 请输入正确的QQ号'
// 判断是否为主人
if (Config.masterQQ?.includes(Number(userId)) && time != 0) return '居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ'
let Memberinfo = group.pickMember(Number(userId)).info
// 判断是否有这个人
if (!Memberinfo) return '❎ 这个群没有这个人哦~'
// 特殊处理
if (Memberinfo.role === 'owner') return '调戏群主拖出去枪毙5分钟(。>︿<)_θ'
let user = group.pickMember(Number(executor))
let isMaster = Config.masterQQ?.includes(executor)
if (Memberinfo.role === 'admin') {
if (!group.is_owner) return '人家又不是群主这种事做不到的辣!'
if (!isMaster && !user.member.is_owner) return '这个淫系管理员辣只有主淫和群主才可以干ta'
}
await group.muteMember(userId, time * unit)
return time == 0 ? `✅ 已把「${Memberinfo.card || Memberinfo.nickname}」从小黑屋揪了出来(。>∀<。)` : `已把「${Memberinfo.card || Memberinfo.nickname}」扔进了小黑屋( ・_・)ノ⌒●~*`
}
async kickMember (groupId, userId, executor) {
let group = null
try { group = Bot.pickGroup(Number(groupId), true) } catch (err) { return err.message }
if (!userId || !(/^\d+$/.test(userId))) return '❎ 请输入正确的QQ号'
if (!groupId || !(/^\d+$/.test(groupId))) return '❎ 请输入正确的群号'
// 判断是否为主人
if (Config.masterQQ?.includes(Number(userId))) return '居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ'
let Memberinfo = group?.pickMember(Number(userId)).info
// 判断是否有这个人
if (!Memberinfo) return '❎ 这个群没有这个人哦~'
if (Memberinfo.role === 'owner') return '调戏群主拖出去枪毙5分钟(。>︿<)_θ'
let isMaster = Config.masterQQ?.includes(executor)
let user = group.pickMember(Number(executor))
if (Memberinfo.role === 'admin') {
if (!group.is_owner) return '人家又不是群主这种事做不到的辣!'
if (!isMaster && !user.is_owner) return '这个淫系管理员辣只有主淫和群主才可以干ta'
}
let res = await group.kickMember(Number(userId))
return res ? '已把这个坏淫踢掉惹!!!' : '额...踢出失败哩,可能这个淫比较腻害>_<'
}
}()

View File

@@ -147,8 +147,7 @@ export default new class Pixiv {
}
return { error: linkmsg }
}
console.log(this.headers)
let img = await Promise.all(url.map(async item => await this.proxyFetchImg(item, { headers: this.headers })))
let img = await Promise.allSettled(url.map(async item => await this.proxyFetchImg(item, { headers: this.headers })))
return { msg, img }
}
@@ -194,7 +193,7 @@ export default new class Pixiv {
if (res.error) return { error: res.error.message }
if (lodash.isEmpty(res.illusts)) return { error: '暂无数据,请等待榜单更新哦(。-ω-)zzz' }
let illusts = await Promise.all(res.illusts.map(async (item, index) => {
let illusts = await Promise.allSettled(res.illusts.map(async (item, index) => {
let list = this.format(item)
let { id, title, user, tags, total_bookmarks, image_urls } = list
return [
@@ -405,7 +404,7 @@ export default new class Pixiv {
if (user.error) return { error: user.error.message }
if (lodash.isEmpty(user.user_previews)) return { error: '呜呜呜人家没有找到这个淫d(ŐдŐ๑)' }
let msg = await Promise.all(user.user_previews.slice(0, 10).map(async (item, index) => {
let msg = await Promise.allSettled(user.user_previews.slice(0, 10).map(async (item, index) => {
let { id, name, profile_image_urls } = item.user
profile_image_urls = profile_image_urls.medium.replace('i.pximg.net', this.proxy)
let ret = [
@@ -518,7 +517,7 @@ export default new class Pixiv {
agent,
headers
}).then(res => res.arrayBuffer())
.catch((err) => logger.warn(`图片加载失败${err.message}`))
.catch((err) => logger.warn(`图片加载失败 reason: ${err.message}`))
if (!buffer) return segment.image('/plugins/yenai-plugin/resources/img/imgerror.png')
let buff = Buffer.from(buffer)
logger.debug(`Success: imgSize => ${(buff.length / 1024).toFixed(2) + 'kb'}`)

View File

@@ -54,7 +54,7 @@ export default new class setu {
return { error: '没有找到相关的tag' }
}
// 消息
let msg = await Promise.all(result.data.map(async item => {
let msg = await Promise.allSettled(result.data.map(async item => {
let { pid, title, tags, author, r18, urls, url } = item
return [
`${this.sendMsgs}\n`,