mirror of
https://github.com/Jerryplusy/crystelf-plugin.git
synced 2025-10-14 05:39:18 +00:00
fix:修复重复注册问题
This commit is contained in:
parent
a72273d21a
commit
34ac5c631e
134
apps/auth.js
134
apps/auth.js
@ -4,6 +4,7 @@ import tools from '../components/tool.js';
|
|||||||
import Group from '../lib/yunzai/group.js';
|
import Group from '../lib/yunzai/group.js';
|
||||||
import Message from '../lib/yunzai/message.js';
|
import Message from '../lib/yunzai/message.js';
|
||||||
|
|
||||||
|
let pending = new Map();
|
||||||
export class CarbonAuth extends plugin {
|
export class CarbonAuth extends plugin {
|
||||||
constructor() {
|
constructor() {
|
||||||
super({
|
super({
|
||||||
@ -16,19 +17,59 @@ export class CarbonAuth extends plugin {
|
|||||||
{ reg: '^#重新验证([\\s\\S]*)?$', fnc: 'cmdRevalidate' },
|
{ reg: '^#重新验证([\\s\\S]*)?$', fnc: 'cmdRevalidate' },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
this.pending = new Map();
|
}
|
||||||
|
|
||||||
//答案监听
|
async cmdBypass(e) {
|
||||||
Bot.on?.('message.group', async (e) => {
|
if (!(e.sender && (e.sender.role === 'owner' || e.sender.role === 'admin' || e.isMaster))) {
|
||||||
|
return e.reply('只有群主或管理员可以使用此命令..', true);
|
||||||
|
}
|
||||||
|
const atElem = (e.message || []).find((m) => m.type === 'at');
|
||||||
|
if (!atElem || !atElem.qq) return e.reply('你想绕过谁?', true);
|
||||||
|
const targetId = Number(atElem.qq);
|
||||||
|
const groupId = e.group_id;
|
||||||
|
const key = `${groupId}_${targetId}`;
|
||||||
|
if (pending.has(key)) pending.delete(key);
|
||||||
|
const redisKey = `Yz:pendingWelcome:${groupId}:${targetId}`;
|
||||||
|
const cached = await redis.get(redisKey);
|
||||||
|
if (cached) {
|
||||||
|
try {
|
||||||
|
const msgList = JSON.parse(cached);
|
||||||
|
await e.reply(msgList);
|
||||||
|
} finally {
|
||||||
|
await redis.del(redisKey);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return await e.reply([segment.at(targetId), '欢迎加入本群~'], true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async cmdRevalidate(e) {
|
||||||
|
if (!(e.sender && (e.sender.role === 'owner' || e.sender.role === 'admin' || e.isMaster))) {
|
||||||
|
return e.reply('只有群主或管理员可以使用此命令..', true);
|
||||||
|
}
|
||||||
|
let atElem = (e.message || []).find((m) => m.type === 'at');
|
||||||
|
if (!atElem || !atElem.qq) return e.reply('你要验证谁?', true);
|
||||||
|
const targetId = Number(atElem.qq);
|
||||||
|
const member = await e.group.pickMember(targetId).getInfo();
|
||||||
|
if (member.role === 'owner' || member.role === 'admin') {
|
||||||
|
return e.reply('这对吗', true);
|
||||||
|
}
|
||||||
|
const key = `${e.group_id}_${targetId}`;
|
||||||
|
if (pending.get(key)) return e.reply('这孩子已经在验证了..', true);
|
||||||
|
await auth(e, e.group_id, targetId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//答案监听
|
||||||
|
Bot.on?.('message.group', async (e) => {
|
||||||
const key = `${e.group_id}_${e.user_id}`;
|
const key = `${e.group_id}_${e.user_id}`;
|
||||||
//logger.info(key);
|
//logger.info(key);
|
||||||
const session = this.pending.get(key);
|
const session = pending.get(key);
|
||||||
if (!session) return;
|
if (!session) return;
|
||||||
session.tries++;
|
session.tries++;
|
||||||
const { type, answer, tries, cfg } = session;
|
const { type, answer, tries, cfg } = session;
|
||||||
|
|
||||||
const pass = async () => {
|
const pass = async () => {
|
||||||
this.pending.delete(key);
|
pending.delete(key);
|
||||||
const redisKey = `Yz:pendingWelcome:${e.group_id}:${e.user_id}`;
|
const redisKey = `Yz:pendingWelcome:${e.group_id}:${e.user_id}`;
|
||||||
const cached = await redis.get(redisKey);
|
const cached = await redis.get(redisKey);
|
||||||
if (cached) {
|
if (cached) {
|
||||||
@ -52,7 +93,7 @@ export class CarbonAuth extends plugin {
|
|||||||
const num = parseInt(msgStr, 10);
|
const num = parseInt(msgStr, 10);
|
||||||
if (!isNaN(num) && num === answer) return pass();
|
if (!isNaN(num) && num === answer) return pass();
|
||||||
if (tries >= cfg.frequency) {
|
if (tries >= cfg.frequency) {
|
||||||
this.pending.delete(key);
|
pending.delete(key);
|
||||||
if (cfg.recall) await Message.deleteMsg(e, e.message_id);
|
if (cfg.recall) await Message.deleteMsg(e, e.message_id);
|
||||||
e.reply([segment.at(e.user_id), '验证失败,你错太多次辣!'], true);
|
e.reply([segment.at(e.user_id), '验证失败,你错太多次辣!'], true);
|
||||||
return await Group.groupKick(e, e.user_id, e.group_id, false);
|
return await Group.groupKick(e, e.user_id, e.group_id, false);
|
||||||
@ -88,7 +129,7 @@ export class CarbonAuth extends plugin {
|
|||||||
if (correct) return pass();
|
if (correct) return pass();
|
||||||
if (tries >= cfg.frequency) {
|
if (tries >= cfg.frequency) {
|
||||||
if (cfg.recall) await Message.deleteMsg(e, e.message_id);
|
if (cfg.recall) await Message.deleteMsg(e, e.message_id);
|
||||||
this.pending.delete(key);
|
pending.delete(key);
|
||||||
e.reply([segment.at(e.user_id), '验证失败,你错太多次辣!'], true);
|
e.reply([segment.at(e.user_id), '验证失败,你错太多次辣!'], true);
|
||||||
return await Group.groupKick(e, e.user_id, e.group_id, false);
|
return await Group.groupKick(e, e.user_id, e.group_id, false);
|
||||||
}
|
}
|
||||||
@ -98,42 +139,40 @@ export class CarbonAuth extends plugin {
|
|||||||
true
|
true
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//主动退群
|
//主动退群
|
||||||
Bot.on?.('notice.group.decrease', async (e) => {
|
Bot.on?.('notice.group.decrease', async (e) => {
|
||||||
const key = `${e.group_id}_${e.user_id}`;
|
const key = `${e.group_id}_${e.user_id}`;
|
||||||
if (this.pending.has(key)) {
|
if (pending.has(key)) {
|
||||||
this.pending.delete(key);
|
pending.delete(key);
|
||||||
logger.mark(`[crystelf-plugin] 用户 ${e.user_id} 主动退群,验证流程结束..`);
|
logger.mark(`[crystelf-plugin] 用户 ${e.user_id} 主动退群,验证流程结束..`);
|
||||||
e.reply('害,怎么跑路了');
|
e.reply('害,怎么跑路了');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//加群事件
|
//加群事件
|
||||||
Bot.on?.('notice.group.increase', async (e) => {
|
Bot.on?.('notice.group.increase', async (e) => {
|
||||||
if (e.isMaster) return true;
|
if (e.isMaster) return true;
|
||||||
const key = `${e.group_id}_${e.user_id}`;
|
const key = `${e.group_id}_${e.user_id}`;
|
||||||
if (this.pending.get(key)) return true;
|
if (pending.get(key)) return true;
|
||||||
logger.info(`[crystelf-plugin] 群[${e.group_id}]开始对用户[${e.user_id}]的加群验证`);
|
logger.info(`[crystelf-plugin] 群[${e.group_id}]开始对用户[${e.user_id}]的加群验证`);
|
||||||
await this.auth(e, e.group_id, e.user_id);
|
await auth(e, e.group_id, e.user_id);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证
|
* 验证
|
||||||
* @param e 事件
|
* @param e 事件
|
||||||
* @param group_id 群号
|
* @param group_id 群号
|
||||||
* @param user_id 带验证用户id
|
* @param user_id 带验证用户id
|
||||||
* @returns {Promise<*>}
|
* @returns {Promise<*>}
|
||||||
*/
|
*/
|
||||||
async auth(e, group_id, user_id) {
|
async function auth(e, group_id, user_id) {
|
||||||
const cfg = await configControl.get('auth');
|
const cfg = await configControl.get('auth');
|
||||||
if (!cfg) return;
|
if (!cfg) return;
|
||||||
const groupCfg = cfg.groups[group_id] || cfg.default;
|
const groupCfg = cfg.groups[group_id] || cfg.default;
|
||||||
if (!groupCfg.enable) return;
|
if (!groupCfg.enable) return;
|
||||||
const key = `${group_id}_${user_id}`;
|
const key = `${group_id}_${user_id}`;
|
||||||
this.pending.set(key, 1); //初始化
|
|
||||||
if (groupCfg.carbon.enable) {
|
if (groupCfg.carbon.enable) {
|
||||||
try {
|
try {
|
||||||
const res = await axios.post(`${cfg.url}/captcha/chiralCarbon/getChiralCarbonCaptcha`, {
|
const res = await axios.post(`${cfg.url}/captcha/chiralCarbon/getChiralCarbonCaptcha`, {
|
||||||
@ -143,7 +182,7 @@ export class CarbonAuth extends plugin {
|
|||||||
if (!res.data?.data?.data) return e.reply('获取验证图失败,请稍后重试..');
|
if (!res.data?.data?.data) return e.reply('获取验证图失败,请稍后重试..');
|
||||||
const { base64, regions } = res.data.data.data;
|
const { base64, regions } = res.data.data.data;
|
||||||
const regionCount = regions.length;
|
const regionCount = regions.length;
|
||||||
this.pending.set(key, { type: 'carbon', answer: regions, tries: 0, cfg: groupCfg });
|
pending.set(key, { type: 'carbon', answer: regions, tries: 0, cfg: groupCfg });
|
||||||
e.reply([
|
e.reply([
|
||||||
segment.at(user_id),
|
segment.at(user_id),
|
||||||
segment.image(base64),
|
segment.image(base64),
|
||||||
@ -158,14 +197,14 @@ export class CarbonAuth extends plugin {
|
|||||||
const b = Math.floor(Math.random() * 100);
|
const b = Math.floor(Math.random() * 100);
|
||||||
const op = Math.random() > 0.5 ? '+' : '-';
|
const op = Math.random() > 0.5 ? '+' : '-';
|
||||||
const ans = op === '+' ? a + b : a - b;
|
const ans = op === '+' ? a + b : a - b;
|
||||||
this.pending.set(key, { type: 'math', answer: ans, tries: 0, cfg: groupCfg });
|
pending.set(key, { type: 'math', answer: ans, tries: 0, cfg: groupCfg });
|
||||||
e.reply([segment.at(user_id), `请在${groupCfg.timeout}秒内发送${a} ${op} ${b}的计算结果..`]);
|
e.reply([segment.at(user_id), `请在${groupCfg.timeout}秒内发送${a} ${op} ${b}的计算结果..`]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (groupCfg.timeout > 60) {
|
if (groupCfg.timeout > 60) {
|
||||||
setTimeout(
|
setTimeout(
|
||||||
async () => {
|
async () => {
|
||||||
if (this.pending.has(key)) {
|
if (pending.has(key)) {
|
||||||
await e.reply([segment.at(user_id), `小朋友,你还有1分钟的时间完成验证噢~`]);
|
await e.reply([segment.at(user_id), `小朋友,你还有1分钟的时间完成验证噢~`]);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -174,51 +213,10 @@ export class CarbonAuth extends plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
if (this.pending.has(key)) {
|
if (pending.has(key)) {
|
||||||
this.pending.delete(key);
|
pending.delete(key);
|
||||||
await e.reply([segment.at(user_id), `小朋友,验证超时啦!请重新申请入群~`]);
|
await e.reply([segment.at(user_id), `小朋友,验证超时啦!请重新申请入群~`]);
|
||||||
await Group.groupKick(e, e.user_id, e.group_id, false);
|
await Group.groupKick(e, e.user_id, e.group_id, false);
|
||||||
}
|
}
|
||||||
}, groupCfg.timeout * 1000);
|
}, groupCfg.timeout * 1000);
|
||||||
}
|
|
||||||
|
|
||||||
async cmdBypass(e) {
|
|
||||||
if (!(e.sender && (e.sender.role === 'owner' || e.sender.role === 'admin' || e.isMaster))) {
|
|
||||||
return e.reply('只有群主或管理员可以使用此命令..', true);
|
|
||||||
}
|
|
||||||
const atElem = (e.message || []).find((m) => m.type === 'at');
|
|
||||||
if (!atElem || !atElem.qq) return e.reply('你想绕过谁?', true);
|
|
||||||
const targetId = Number(atElem.qq);
|
|
||||||
const groupId = e.group_id;
|
|
||||||
const key = `${groupId}_${targetId}`;
|
|
||||||
if (this.pending.has(key)) this.pending.delete(key);
|
|
||||||
const redisKey = `Yz:pendingWelcome:${groupId}:${targetId}`;
|
|
||||||
const cached = await redis.get(redisKey);
|
|
||||||
if (cached) {
|
|
||||||
try {
|
|
||||||
const msgList = JSON.parse(cached);
|
|
||||||
await e.reply(msgList);
|
|
||||||
} finally {
|
|
||||||
await redis.del(redisKey);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return await e.reply([segment.at(targetId), '欢迎加入本群~'], true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async cmdRevalidate(e) {
|
|
||||||
if (!(e.sender && (e.sender.role === 'owner' || e.sender.role === 'admin' || e.isMaster))) {
|
|
||||||
return e.reply('只有群主或管理员可以使用此命令..', true);
|
|
||||||
}
|
|
||||||
let atElem = (e.message || []).find((m) => m.type === 'at');
|
|
||||||
if (!atElem || !atElem.qq) return e.reply('你要验证谁?', true);
|
|
||||||
const targetId = Number(atElem.qq);
|
|
||||||
const member = await e.group.pickMember(targetId).getInfo();
|
|
||||||
if (member.role === 'owner' || member.role === 'admin') {
|
|
||||||
return e.reply('这对吗', true);
|
|
||||||
}
|
|
||||||
const key = `${e.group_id}_${targetId}`;
|
|
||||||
if (this.pending.get(key)) return e.reply('这孩子已经在验证了..', true);
|
|
||||||
await this.auth(e, e.group_id, targetId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user