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?
|
qqBotId Int?
|
||||||
qqBot QqBot? @relation(fields: [qqBotId], references: [id], onDelete: Cascade)
|
qqBot QqBot? @relation(fields: [qqBotId], references: [id], onDelete: Cascade)
|
||||||
reportUrl String?
|
reportUrl String?
|
||||||
|
flags Int @default(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
model QqBot {
|
model QqBot {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import {
|
||||||
} from 'icqq';
|
} from 'icqq';
|
||||||
import Instance from '../models/Instance';
|
import Instance from '../models/Instance';
|
||||||
import { getLogger, Logger } from 'log4js';
|
import { getLogger, Logger } from 'log4js';
|
||||||
|
import { editFlags } from '../utils/flagControl';
|
||||||
|
|
||||||
export default class ConfigController {
|
export default class ConfigController {
|
||||||
private readonly configService: ConfigService;
|
private readonly configService: ConfigService;
|
||||||
|
@ -48,6 +49,15 @@ export default class ConfigController {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (message.isPrivate) {
|
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') {
|
if (this.instance.workMode === 'personal') {
|
||||||
switch (messageSplit[0]) {
|
switch (messageSplit[0]) {
|
||||||
case '/addfriend':
|
case '/addfriend':
|
||||||
|
|
|
@ -46,7 +46,7 @@ export default class ForwardController {
|
||||||
const target = event.message_type === 'private' ? event.friend : event.group;
|
const target = event.message_type === 'private' ? event.friend : event.group;
|
||||||
const pair = this.instance.forwardPairs.find(target);
|
const pair = this.instance.forwardPairs.find(target);
|
||||||
if (!pair) return;
|
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({
|
let existed = event.message_type === 'private' && await db.message.findFirst({
|
||||||
where: {
|
where: {
|
||||||
|
@ -102,7 +102,7 @@ export default class ForwardController {
|
||||||
if (message.senderId?.eq(this.instance.botMe.id)) return true;
|
if (message.senderId?.eq(this.instance.botMe.id)) return true;
|
||||||
const pair = this.instance.forwardPairs.find(message.chat);
|
const pair = this.instance.forwardPairs.find(message.chat);
|
||||||
if (!pair) return false;
|
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);
|
const qqMessagesSent = await this.forwardService.forwardFromTelegram(message, pair);
|
||||||
if (qqMessagesSent) {
|
if (qqMessagesSent) {
|
||||||
// 更新数据库
|
// 更新数据库
|
||||||
|
@ -140,7 +140,7 @@ export default class ForwardController {
|
||||||
private onQqGroupMemberIncrease = async (event: MemberIncreaseEvent) => {
|
private onQqGroupMemberIncrease = async (event: MemberIncreaseEvent) => {
|
||||||
try {
|
try {
|
||||||
const pair = this.instance.forwardPairs.find(event.group);
|
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);
|
const avatar = await getAvatar(event.user_id);
|
||||||
await pair.tg.sendMessage({
|
await pair.tg.sendMessage({
|
||||||
file: new CustomFile('avatar.png', avatar.length, '', avatar),
|
file: new CustomFile('avatar.png', avatar.length, '', avatar),
|
||||||
|
@ -156,7 +156,7 @@ export default class ForwardController {
|
||||||
private onTelegramParticipant = async (event: Api.UpdateChannelParticipant) => {
|
private onTelegramParticipant = async (event: Api.UpdateChannelParticipant) => {
|
||||||
try {
|
try {
|
||||||
const pair = this.instance.forwardPairs.find(event.channelId);
|
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 (
|
if (
|
||||||
!(event.newParticipant instanceof Api.ChannelParticipantAdmin) &&
|
!(event.newParticipant instanceof Api.ChannelParticipantAdmin) &&
|
||||||
!(event.newParticipant instanceof Api.ChannelParticipantCreator) &&
|
!(event.newParticipant instanceof Api.ChannelParticipantCreator) &&
|
||||||
|
@ -174,7 +174,7 @@ export default class ForwardController {
|
||||||
private onQqPoke = async (event: FriendPokeEvent | GroupPokeEvent) => {
|
private onQqPoke = async (event: FriendPokeEvent | GroupPokeEvent) => {
|
||||||
const target = event.notice_type === 'friend' ? event.friend : event.group;
|
const target = event.notice_type === 'friend' ? event.friend : event.group;
|
||||||
const pair = this.instance.forwardPairs.find(target);
|
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;
|
let operatorName: string, targetName: string;
|
||||||
if (target instanceof Friend) {
|
if (target instanceof Friend) {
|
||||||
if (event.operator_id === target.user_id) {
|
if (event.operator_id === target.user_id) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { Api } from 'telegram';
|
||||||
import { Group } from 'icqq';
|
import { Group } from 'icqq';
|
||||||
import RecoverMessageHelper from '../helpers/RecoverMessageHelper';
|
import RecoverMessageHelper from '../helpers/RecoverMessageHelper';
|
||||||
import flags from '../constants/flags';
|
import flags from '../constants/flags';
|
||||||
|
import { editFlags } from '../utils/flagControl';
|
||||||
|
|
||||||
export default class InChatCommandsController {
|
export default class InChatCommandsController {
|
||||||
private readonly service: InChatCommandsService;
|
private readonly service: InChatCommandsService;
|
||||||
|
@ -74,7 +75,7 @@ export default class InChatCommandsController {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
await message.reply({
|
await message.reply({
|
||||||
message: await this.service.editFlags(messageParts, pair),
|
message: await editFlags(messageParts, pair),
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
case '/refresh':
|
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 _userSessionId = 0;
|
||||||
private _qq: QqBot;
|
private _qq: QqBot;
|
||||||
private _reportUrl: string;
|
private _reportUrl: string;
|
||||||
|
private _flags: number;
|
||||||
|
|
||||||
private readonly log: Logger;
|
private readonly log: Logger;
|
||||||
|
|
||||||
|
@ -84,6 +85,7 @@ export default class Instance {
|
||||||
this._isSetup = dbEntry.isSetup;
|
this._isSetup = dbEntry.isSetup;
|
||||||
this._workMode = dbEntry.workMode;
|
this._workMode = dbEntry.workMode;
|
||||||
this._reportUrl = dbEntry.reportUrl;
|
this._reportUrl = dbEntry.reportUrl;
|
||||||
|
this._flags = dbEntry.flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async init(botToken?: string) {
|
private async init(botToken?: string) {
|
||||||
|
@ -255,6 +257,10 @@ export default class Instance {
|
||||||
return this._reportUrl;
|
return this._reportUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get flags() {
|
||||||
|
return this._flags;
|
||||||
|
}
|
||||||
|
|
||||||
set owner(owner: number) {
|
set owner(owner: number) {
|
||||||
this._owner = owner;
|
this._owner = owner;
|
||||||
db.instance.update({
|
db.instance.update({
|
||||||
|
@ -309,10 +315,20 @@ export default class Instance {
|
||||||
}
|
}
|
||||||
|
|
||||||
set reportUrl(reportUrl: string) {
|
set reportUrl(reportUrl: string) {
|
||||||
|
this._reportUrl = reportUrl;
|
||||||
db.instance.update({
|
db.instance.update({
|
||||||
data: { reportUrl },
|
data: { reportUrl },
|
||||||
where: { id: this.id },
|
where: { id: this.id },
|
||||||
})
|
})
|
||||||
.then(() => this.log.trace(reportUrl));
|
.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 (!message) return;
|
||||||
if (pair.flags & flags.NO_DELETE_MESSAGE) {
|
if ((pair.flags | this.instance.flags) & flags.NO_DELETE_MESSAGE) {
|
||||||
await pair.tg.editMessages({
|
await pair.tg.editMessages({
|
||||||
message: message.tgMsgId,
|
message: message.tgMsgId,
|
||||||
text: `<del>${message.tgMessageText}</del>\n<i>此消息已删除</i>`,
|
text: `<del>${message.tgMessageText}</del>\n<i>此消息已删除</i>`,
|
||||||
|
|
|
@ -11,8 +11,6 @@ import db from '../models/db';
|
||||||
import { Friend, Group } from 'icqq';
|
import { Friend, Group } from 'icqq';
|
||||||
import { format } from 'date-and-time';
|
import { format } from 'date-and-time';
|
||||||
import ZincSearch from 'zincsearch-node';
|
import ZincSearch from 'zincsearch-node';
|
||||||
import flags from '../constants/flags';
|
|
||||||
import inChatCommandsHelper from '../helpers/inChatCommandsHelper';
|
|
||||||
|
|
||||||
export default class InChatCommandsService {
|
export default class InChatCommandsService {
|
||||||
private readonly log: Logger;
|
private readonly log: Logger;
|
||||||
|
@ -147,35 +145,4 @@ export default class InChatCommandsService {
|
||||||
});
|
});
|
||||||
return rpy.join('\n');
|
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