feat: 支持 instance 级 flag

This commit is contained in:
Clansty 2024-01-13 16:51:44 +08:00
parent 71684c95b6
commit 5a87cd2c47
No known key found for this signature in database
GPG Key ID: 3A6BE8BAF2EDE134
9 changed files with 80 additions and 54 deletions

View File

@ -45,6 +45,7 @@ model Instance {
qqBotId Int?
qqBot QqBot? @relation(fields: [qqBotId], references: [id], onDelete: Cascade)
reportUrl String?
flags Int @default(0)
}
model QqBot {

View File

@ -12,6 +12,7 @@ import {
} from 'icqq';
import Instance from '../models/Instance';
import { getLogger, Logger } from 'log4js';
import { editFlags } from '../utils/flagControl';
export default class ConfigController {
private readonly configService: ConfigService;
@ -48,6 +49,15 @@ export default class ConfigController {
return false;
}
else if (message.isPrivate) {
switch (messageSplit[0]) {
case '/flag':
case '/flags':
messageSplit.shift();
await message.reply({
message: await editFlags(messageSplit, this.instance),
});
return true;
}
if (this.instance.workMode === 'personal') {
switch (messageSplit[0]) {
case '/addfriend':

View File

@ -46,7 +46,7 @@ export default class ForwardController {
const target = event.message_type === 'private' ? event.friend : event.group;
const pair = this.instance.forwardPairs.find(target);
if (!pair) return;
if (pair.flags & flags.DISABLE_Q2TG) return;
if ((pair.flags | this.instance.flags) & flags.DISABLE_Q2TG) return;
// 如果是多张图片的话,是一整条消息,只过一次,所以不受这个判断影响
let existed = event.message_type === 'private' && await db.message.findFirst({
where: {
@ -102,7 +102,7 @@ export default class ForwardController {
if (message.senderId?.eq(this.instance.botMe.id)) return true;
const pair = this.instance.forwardPairs.find(message.chat);
if (!pair) return false;
if (pair.flags & flags.DISABLE_TG2Q) return;
if ((pair.flags | this.instance.flags) & flags.DISABLE_TG2Q) return;
const qqMessagesSent = await this.forwardService.forwardFromTelegram(message, pair);
if (qqMessagesSent) {
// 更新数据库
@ -140,7 +140,7 @@ export default class ForwardController {
private onQqGroupMemberIncrease = async (event: MemberIncreaseEvent) => {
try {
const pair = this.instance.forwardPairs.find(event.group);
if (pair?.flags & flags.DISABLE_JOIN_NOTICE) return false;
if ((pair?.flags | this.instance.flags) & flags.DISABLE_JOIN_NOTICE) return false;
const avatar = await getAvatar(event.user_id);
await pair.tg.sendMessage({
file: new CustomFile('avatar.png', avatar.length, '', avatar),
@ -156,7 +156,7 @@ export default class ForwardController {
private onTelegramParticipant = async (event: Api.UpdateChannelParticipant) => {
try {
const pair = this.instance.forwardPairs.find(event.channelId);
if (pair?.flags & flags.DISABLE_JOIN_NOTICE) return false;
if ((pair?.flags | this.instance.flags) & flags.DISABLE_JOIN_NOTICE) return false;
if (
!(event.newParticipant instanceof Api.ChannelParticipantAdmin) &&
!(event.newParticipant instanceof Api.ChannelParticipantCreator) &&
@ -174,7 +174,7 @@ export default class ForwardController {
private onQqPoke = async (event: FriendPokeEvent | GroupPokeEvent) => {
const target = event.notice_type === 'friend' ? event.friend : event.group;
const pair = this.instance.forwardPairs.find(target);
if (pair?.flags & flags.DISABLE_POKE) return;
if ((pair?.flags | this.instance.flags) & flags.DISABLE_POKE) return;
let operatorName: string, targetName: string;
if (target instanceof Friend) {
if (event.operator_id === target.user_id) {

View File

@ -7,6 +7,7 @@ import { Api } from 'telegram';
import { Group } from 'icqq';
import RecoverMessageHelper from '../helpers/RecoverMessageHelper';
import flags from '../constants/flags';
import { editFlags } from '../utils/flagControl';
export default class InChatCommandsController {
private readonly service: InChatCommandsService;
@ -74,7 +75,7 @@ export default class InChatCommandsController {
return true;
}
await message.reply({
message: await this.service.editFlags(messageParts, pair),
message: await editFlags(messageParts, pair),
});
return true;
case '/refresh':

View File

@ -1,14 +0,0 @@
import flags from '../constants/flags';
export default {
displayFlag(flag: number) {
const enabled = [];
for (const name in flags) {
const value = flags[name] as any as number;
if (flag & value) {
enabled.push(name);
}
}
return ['0b' + flag.toString(2), ...enabled].join('\n');
},
};

View File

@ -32,6 +32,7 @@ export default class Instance {
private _userSessionId = 0;
private _qq: QqBot;
private _reportUrl: string;
private _flags: number;
private readonly log: Logger;
@ -84,6 +85,7 @@ export default class Instance {
this._isSetup = dbEntry.isSetup;
this._workMode = dbEntry.workMode;
this._reportUrl = dbEntry.reportUrl;
this._flags = dbEntry.flags;
}
private async init(botToken?: string) {
@ -255,6 +257,10 @@ export default class Instance {
return this._reportUrl;
}
get flags() {
return this._flags;
}
set owner(owner: number) {
this._owner = owner;
db.instance.update({
@ -309,10 +315,20 @@ export default class Instance {
}
set reportUrl(reportUrl: string) {
this._reportUrl = reportUrl;
db.instance.update({
data: { reportUrl },
where: { id: this.id },
})
.then(() => this.log.trace(reportUrl));
}
set flags(value) {
this._flags = value;
db.instance.update({
data: { flags: value },
where: { id: this.id },
})
.then(() => this.log.trace(value));
}
}

View File

@ -145,7 +145,7 @@ export default class DeleteMessageService {
},
});
if (!message) return;
if (pair.flags & flags.NO_DELETE_MESSAGE) {
if ((pair.flags | this.instance.flags) & flags.NO_DELETE_MESSAGE) {
await pair.tg.editMessages({
message: message.tgMsgId,
text: `<del>${message.tgMessageText}</del>\n<i>此消息已删除</i>`,

View File

@ -11,8 +11,6 @@ import db from '../models/db';
import { Friend, Group } from 'icqq';
import { format } from 'date-and-time';
import ZincSearch from 'zincsearch-node';
import flags from '../constants/flags';
import inChatCommandsHelper from '../helpers/inChatCommandsHelper';
export default class InChatCommandsService {
private readonly log: Logger;
@ -147,35 +145,4 @@ export default class InChatCommandsService {
});
return rpy.join('\n');
}
public async editFlags(params: string[], pair: Pair) {
if (!params.length) {
return inChatCommandsHelper.displayFlag(pair.flags);
}
if (params.length !== 2) return '参数格式错误';
let operand = Number(params[1]);
if (isNaN(operand)) {
operand = flags[params[1].toUpperCase()];
}
if (isNaN(operand)) return 'flag 格式错误';
switch (params[0]) {
case 'add':
case 'set':
pair.flags |= operand;
break;
case 'rm':
case 'remove':
case 'del':
case 'delete':
pair.flags &= ~operand;
break;
case 'put':
pair.flags = operand;
break;
}
return inChatCommandsHelper.displayFlag(pair.flags);
}
}

45
src/utils/flagControl.ts Normal file
View File

@ -0,0 +1,45 @@
import flags from '../constants/flags';
import { Pair } from '../models/Pair';
import Instance from '../models/Instance';
const displayFlag = (flag: number) => {
const enabled = [];
for (const name in flags) {
const value = flags[name] as any as number;
if (flag & value) {
enabled.push(name);
}
}
return ['0b' + flag.toString(2), ...enabled].join('\n');
};
export const editFlags = async (params: string[], target: Pair | Instance) => {
if (!params.length) {
return displayFlag(target.flags);
}
if (params.length !== 2) return '参数格式错误';
let operand = Number(params[1]);
if (isNaN(operand)) {
operand = flags[params[1].toUpperCase()];
}
if (isNaN(operand)) return 'flag 格式错误';
switch (params[0]) {
case 'add':
case 'set':
target.flags |= operand;
break;
case 'rm':
case 'remove':
case 'del':
case 'delete':
target.flags &= ~operand;
break;
case 'put':
target.flags = operand;
break;
}
return displayFlag(target.flags);
};