feat: 可以绑定群组了

This commit is contained in:
凌莞 2022-02-21 14:30:02 +08:00
parent 2ad2d41cad
commit 2b499c846e
No known key found for this signature in database
GPG Key ID: 05F8479BA63A8E92
6 changed files with 39 additions and 11 deletions

View File

@ -28,6 +28,7 @@ export class Telegram {
process.env.TG_API_HASH, process.env.TG_API_HASH,
{ {
connectionRetries: 5, connectionRetries: 5,
langCode: 'zh',
proxy: process.env.PROXY_IP ? { proxy: process.env.PROXY_IP ? {
socksType: 5, socksType: 5,
ip: process.env.PROXY_IP, ip: process.env.PROXY_IP,
@ -114,7 +115,7 @@ export class Telegram {
export class TelegramChat { export class TelegramChat {
constructor(public readonly parent: Telegram, constructor(public readonly parent: Telegram,
private readonly client: TelegramClient, private readonly client: TelegramClient,
private readonly entity: Entity, public readonly entity: Entity,
private readonly waitForInputHelper: WaitForMessageHelper) { private readonly waitForInputHelper: WaitForMessageHelper) {
} }

View File

@ -51,7 +51,7 @@ export default function createOicq(params: CreateOicqParams) {
const client = createClient(params.uin, { const client = createClient(params.uin, {
platform: params.platform, platform: params.platform,
data_dir: '../data' data_dir: './data'
}) })
.on('system.login.device', loginDeviceHandler) .on('system.login.device', loginDeviceHandler)
.on('system.login.slider', loginSliderHandler) .on('system.login.slider', loginSliderHandler)

View File

@ -1,3 +1,4 @@
export default { export default {
qq: /^[1-9]\d{4,10}$/, qq: /^[1-9]\d{4,10}$/,
roomId: /^-?[1-9]\d{4,10}$/,
}; };

View File

@ -22,12 +22,21 @@ export default class ConfigController {
} }
const messageSplit = message.message.split(' '); const messageSplit = message.message.split(' ');
if (message.isGroup) { if (message.isGroup) {
if (messageSplit.length === 2 && messageSplit[0].startsWith('/start') && regExps.roomId.test(messageSplit[1])) {
await this.configService.createLinkGroup(Number(messageSplit[1]), Number(message.chat.id));
return true;
}
else
return false;
} }
else if (message.isPrivate) { else if (message.isPrivate) {
switch (messageSplit[0]) { switch (messageSplit[0]) {
case '/add': case '/add':
if (messageSplit[1] && regExps.qq.test(messageSplit[1])) { // 加的参数永远是正的群号
if (messageSplit.length === 3 && regExps.qq.test(messageSplit[1]) && !isNaN(Number(messageSplit[2]))) {
await this.configService.createLinkGroup(-Number(messageSplit[1]), Number(messageSplit[2]));
}
else if (messageSplit[1] && regExps.qq.test(messageSplit[1])) {
await this.configService.addExact(Number(messageSplit[1])); await this.configService.addExact(Number(messageSplit[1]));
} }
else { else {

View File

@ -6,6 +6,8 @@ import { getLogger } from 'log4js';
import axios from 'axios'; import axios from 'axios';
import { getAvatarUrl } from '../utils/urls'; import { getAvatarUrl } from '../utils/urls';
import { CustomFile } from 'telegram/client/uploads'; import { CustomFile } from 'telegram/client/uploads';
import db from '../providers/db';
import { Api } from 'telegram';
export default class ConfigService { export default class ConfigService {
private owner: TelegramChat; private owner: TelegramChat;
@ -17,8 +19,8 @@ export default class ConfigService {
tgBot.getChat(config.owner).then(e => this.owner = e); tgBot.getChat(config.owner).then(e => this.owner = e);
} }
private getAssociateLink(gin: number) { private getAssociateLink(roomId: number) {
return `https://t.me/${this.tgBot.me.username}?startgroup=${gin}`; return `https://t.me/${this.tgBot.me.username}?startgroup=${roomId}`;
} }
// 开始添加转发群组流程 // 开始添加转发群组流程
@ -27,7 +29,7 @@ export default class ConfigService {
await this.owner.createPaginatedInlineSelector('选择 QQ 群组\n然后选择在 TG 中的群组', await this.owner.createPaginatedInlineSelector('选择 QQ 群组\n然后选择在 TG 中的群组',
qGroups.map(e => [Button.url( qGroups.map(e => [Button.url(
`${e.group_name} (${e.group_id})`, `${e.group_name} (${e.group_id})`,
this.getAssociateLink(e.group_id), this.getAssociateLink(-e.group_id),
)])); )]));
} }
@ -48,7 +50,23 @@ export default class ConfigService {
await this.owner.sendMessage({ await this.owner.sendMessage({
message, message,
file: avatar ? new CustomFile('avatar.png', avatar.length, '', avatar) : undefined, file: avatar ? new CustomFile('avatar.png', avatar.length, '', avatar) : undefined,
buttons: Button.url('关联 Telegram 群组', this.getAssociateLink(group.group_id)), buttons: Button.url('关联 Telegram 群组', this.getAssociateLink(-group.group_id)),
}); });
} }
public async createLinkGroup(qqRoomId: number, tgChatId: number) {
let message: string;
try {
const qGroup = this.oicq.gl.get(-qqRoomId);
const tgChat = (await this.tgBot.getChat(tgChatId)).entity as Api.Chat;
message = `QQ群${qGroup.group_name} (<code>${qGroup.group_id}</code>)已与 Telegram 群 ${tgChat.title} (<code>${tgChatId})关联</code>`;
await db.forwardPair.create({
data: { qqRoomId, tgChatId },
});
}
catch (e) {
message = `错误:<code>${e}</code>`;
}
await this.owner.sendMessage({ message });
}
} }

View File

@ -9,16 +9,15 @@ export default async function createPaginatedInlineSelector(chat: TelegramChat,
let currentPage = 0; let currentPage = 0;
const totalPages = Math.ceil(choices.length / PAGE_SIZE); const totalPages = Math.ceil(choices.length / PAGE_SIZE);
let sentMessage: Api.Message; let sentMessage: Api.Message;
const buttonPageUp = Button.inline(' 上一页', chat.parent.registerCallback(() => { const buttonPageUp = Button.inline('⬅︎ 上一页', chat.parent.registerCallback(() => {
currentPage = Math.max(0, currentPage - 1); currentPage = Math.max(0, currentPage - 1);
sentMessage.edit({ sentMessage.edit({
text: message + `\n\n第 ${currentPage + 1} 页,共 ${totalPages}`, text: message + `\n\n第 ${currentPage + 1} 页,共 ${totalPages}`,
buttons: getButtons(), buttons: getButtons(),
}); });
})); }));
const buttonPageDown = Button.inline('下一页 ', chat.parent.registerCallback(() => { const buttonPageDown = Button.inline('下一页 ➡︎', chat.parent.registerCallback(() => {
currentPage = Math.min(totalPages - 1, currentPage + 1); currentPage = Math.min(totalPages - 1, currentPage + 1);
console.log(currentPage);
sentMessage.edit({ sentMessage.edit({
text: message + `\n\n第 ${currentPage + 1} 页,共 ${totalPages}`, text: message + `\n\n第 ${currentPage + 1} 页,共 ${totalPages}`,
buttons: getButtons(), buttons: getButtons(),