mirror of https://github.com/Nofated095/Q2TG.git
feat: 支持 instance 级 flag
This commit is contained in:
parent
71684c95b6
commit
5a87cd2c47
|
@ -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 {
|
||||
|
|
|
@ -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':
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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':
|
||||
|
|
|
@ -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');
|
||||
},
|
||||
};
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>`,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
Loading…
Reference in New Issue