Files
ranking/src/services/telegram.service.ts
2026-02-01 09:10:31 +09:00

246 lines
5.4 KiB
TypeScript

import TelegramBot from "node-telegram-bot-api";
import fs from "fs";
process.env.NTBA_FIX_350 = "1";
export interface TelegramUser {
site: string;
chatId: number;
name: string;
phone: string;
realtorId: string;
brokerPhone?: string;
}
export const telegramUsers: TelegramUser[] = [
{
site: "선방",
chatId: 6824763190,
name: "이성원",
phone: "010-8098-0254",
realtorId: "namyeong00",
},
{
site: "ALL",
chatId: 6843597951,
name: "강승원",
phone: "010-5947-0000",
realtorId: "namyeong00",
},
{
site: "부동산써브",
chatId: 6876605367,
name: "지주완",
phone: "010-2716-0987",
realtorId: "namyeong00",
},
{
site: "부동산뱅크",
chatId: 6876605367,
name: "지주완",
phone: "010-2716-0987",
realtorId: "namyeong00",
},
{
site: "부동산써브",
chatId: 5313195485,
name: "지주완",
phone: "010-6377-2069",
realtorId: "namyeong00",
},
{
site: "부동산써브",
chatId: 6864925398,
name: "박희영",
phone: "010-5387-4521",
realtorId: "namyeong00",
},
{
site: "부동산포스",
chatId: 8155003662,
name: "국성혜",
phone: "010-8305-1291",
realtorId: "namyeong00",
brokerPhone: "010-8305-1291",
},
{
site: "부동산포스",
chatId: 8329969238,
name: "이경희",
phone: "010-6346-0996",
realtorId: "namyeong00",
brokerPhone: "010-5947-0996",
},
// {
// site: "산업부동산",
// chatId: 8358690326,
// name: "정명진",
// phone: "010-4199-9650",
// realtorId: "namyeong00",
// },
{
site: "산업부동산",
chatId: 8295512245,
name: "???",
phone: "010-7322-9633",
realtorId: "namyeong00",
},
// {
// site: "ALL",
// chatId: 6843597951,
// name: "강승원",
// phone: "010-5947-0000",
// realtorId: "jdre0125",
// },
];
export const testUsers: TelegramUser[] = [
{
site: "ALL",
chatId: 141033632,
name: "김제연",
phone: "010-8873-8711",
realtorId: "namyeong00",
},
];
export class TelegramService {
private bot: TelegramBot;
private token: string;
constructor(token: string, enablePolling: boolean = false) {
this.token = token;
this.bot = new TelegramBot(token, {
polling: enablePolling,
filepath: false,
});
if (enablePolling) {
this.setupListeners();
}
}
/**
* 봇 리스너 설정
*/
private setupListeners() {
// 모든 메시지 처리
this.bot.on("message", (msg) => {
const chatId = msg.chat.id;
console.log(`Message received from chatId: ${chatId}`);
this.sendMessage(chatId, "Received your message");
});
}
/**
* 메시지 전송
*/
async sendMessage(chatId: number, message: string): Promise<void> {
try {
await this.bot.sendMessage(chatId, message);
console.log(`✅ 메시지 전송 성공 - chatId: ${chatId}`);
} catch (error) {
console.error(`❌ 메시지 전송 실패 - chatId: ${chatId}`, error);
throw error;
}
}
/**
* 문서 전송
*/
async sendDocument(
chatId: number,
fileName: string,
caption?: string
): Promise<void> {
try {
const buffer = Buffer.from(await Bun.file(fileName).arrayBuffer());
await this.bot.sendDocument(
chatId,
buffer,
{ caption: caption || "" },
{
filename: fileName.split("/").pop(),
contentType: "application/octet-stream",
}
);
console.log(`✅ 문서 전송 성공 - chatId: ${chatId}, file: ${fileName}`);
} catch (error) {
console.error(
`❌ 문서 전송 실패 - chatId: ${chatId}, file: ${fileName}`,
error
);
throw error;
}
}
/**
* 사진 전송
*/
async sendPhoto(
chatId: number,
photo: string | Buffer,
caption?: string
): Promise<void> {
try {
await this.bot.sendPhoto(chatId, photo, {
caption: caption || "",
});
console.log(`✅ 사진 전송 성공 - chatId: ${chatId}`);
} catch (error) {
console.error(`❌ 사진 전송 실패 - chatId: ${chatId}`, error);
throw error;
}
}
/**
* 여러 사용자에게 메시지 전송
*/
async broadcastMessage(
users: TelegramUser[],
message: string
): Promise<void> {
const promises = users.map((user) =>
this.sendMessage(user.chatId, message).catch((error) => {
console.error(
`${user.name}(${user.chatId})에게 메시지 전송 실패:`,
error
);
})
);
await Promise.allSettled(promises);
console.log(`${users.length}명에게 메시지 브로드캐스트 완료`);
}
/**
* realtorId로 사용자 필터링
*/
getUsersByRealtorId(
users: TelegramUser[],
realtorId: string
): TelegramUser[] {
return users.filter((user) => user.realtorId === realtorId);
}
/**
* site로 사용자 필터링
*/
getUsersBySite(users: TelegramUser[], site: string): TelegramUser[] {
return users.filter((user) => user.site === site || user.site === "ALL");
}
/**
* 봇 중지
*/
stopPolling(): void {
this.bot.stopPolling();
console.log("✅ 텔레그램 봇 폴링 중지");
}
}
// 기본 토큰으로 싱글톤 인스턴스 생성
const DEFAULT_TOKEN = "233460568:AAHWgRQo5IgcWR0uXdsiMEzNnsmIqjOgk24";
export const telegramService = new TelegramService(DEFAULT_TOKEN, false);