mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-28 13:32:23 +00:00
Refactor Telegram MCP tools to utilize 'big-integer' library for consistent large integer handling
- Replaced instances of BigInt with the 'big-integer' library across multiple Telegram tools, ensuring uniformity in handling large integers. - Updated type casting for input entities and user IDs to improve type safety and maintainability. - Enhanced overall code clarity by standardizing import statements and ensuring consistent use of type casting practices. These changes strengthen the reliability and consistency of the Telegram MCP tools, facilitating better integration with the Telegram API.
This commit is contained in:
@@ -3,6 +3,7 @@ import type { TelegramMCPContext } from '../types';
|
||||
import { ErrorCategory, logAndFormatError } from '../../errorHandler';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
import { optString } from '../args';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
@@ -38,7 +39,7 @@ export async function addContact(
|
||||
new Api.contacts.ImportContacts({
|
||||
contacts: [
|
||||
new Api.InputPhoneContact({
|
||||
clientId: BigInt(0),
|
||||
clientId: bigInt(0),
|
||||
phone,
|
||||
firstName,
|
||||
lastName,
|
||||
|
||||
@@ -28,7 +28,7 @@ export async function blockUser(
|
||||
await mtprotoService.withFloodWaitHandling(async () => {
|
||||
const inputUser = await client.getInputEntity(userId);
|
||||
await client.invoke(
|
||||
new Api.contacts.Block({ id: inputUser as Api.TypeInputPeer }),
|
||||
new Api.contacts.Block({ id: inputUser as unknown as Api.TypeInputPeer }),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import { validateId } from '../../validation';
|
||||
import { getChatById } from '../telegramApi';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: "create_poll",
|
||||
@@ -45,7 +46,7 @@ export async function createPoll(
|
||||
peer: inputPeer,
|
||||
media: new Api.InputMediaPoll({
|
||||
poll: new Api.Poll({
|
||||
id: BigInt(0),
|
||||
id: bigInt(0),
|
||||
question: new Api.TextWithEntities({ text: question, entities: [] }),
|
||||
answers: options.map((opt, i) =>
|
||||
new Api.PollAnswer({
|
||||
@@ -56,7 +57,7 @@ export async function createPoll(
|
||||
}),
|
||||
}),
|
||||
message: '',
|
||||
randomId: BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)),
|
||||
randomId: bigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)),
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -29,7 +29,7 @@ export async function deleteContact(
|
||||
const inputUser = await client.getInputEntity(userId);
|
||||
await client.invoke(
|
||||
new Api.contacts.DeleteContacts({
|
||||
id: [inputUser as Api.TypeInputUser],
|
||||
id: [inputUser as unknown as Api.TypeInputUser],
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types";
|
||||
import { ErrorCategory, logAndFormatError } from '../../errorHandler';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: "delete_profile_photo",
|
||||
@@ -22,7 +23,7 @@ export async function deleteProfilePhoto(
|
||||
new Api.photos.GetUserPhotos({
|
||||
userId: new Api.InputUserSelf(),
|
||||
offset: 0,
|
||||
maxId: BigInt(0),
|
||||
maxId: bigInt(0),
|
||||
limit: 1,
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types";
|
||||
import { ErrorCategory, logAndFormatError } from "../../errorHandler";
|
||||
import { mtprotoService } from "../../../../services/mtprotoService";
|
||||
import { Api } from "telegram";
|
||||
import bigInt from "big-integer";
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: "export_contacts",
|
||||
@@ -18,7 +19,7 @@ export async function exportContacts(
|
||||
const client = mtprotoService.getClient();
|
||||
|
||||
const result = await mtprotoService.withFloodWaitHandling(async () => {
|
||||
return client.invoke(new Api.contacts.GetContacts({ hash: BigInt(0) }));
|
||||
return client.invoke(new Api.contacts.GetContacts({ hash: bigInt(0) }));
|
||||
});
|
||||
|
||||
if (
|
||||
|
||||
@@ -28,7 +28,7 @@ export async function getBotInfo(
|
||||
const result = await mtprotoService.withFloodWaitHandling(async () => {
|
||||
const inputUser = await client.getInputEntity(botId);
|
||||
return client.invoke(
|
||||
new Api.users.GetFullUser({ id: inputUser as Api.TypeInputUser }),
|
||||
new Api.users.GetFullUser({ id: inputUser as unknown as Api.TypeInputUser }),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { TelegramMCPContext } from '../types';
|
||||
import { ErrorCategory, logAndFormatError } from '../../errorHandler';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: 'get_contact_ids',
|
||||
@@ -18,7 +19,7 @@ export async function getContactIds(
|
||||
const client = mtprotoService.getClient();
|
||||
|
||||
const result = await mtprotoService.withFloodWaitHandling(async () => {
|
||||
return client.invoke(new Api.contacts.GetContactIDs({ hash: BigInt(0) }));
|
||||
return client.invoke(new Api.contacts.GetContactIDs({ hash: bigInt(0) }));
|
||||
});
|
||||
|
||||
if (!result || !Array.isArray(result) || result.length === 0) {
|
||||
|
||||
@@ -1,20 +1,62 @@
|
||||
import type { MCPTool, MCPToolResult } from "../../types";
|
||||
import type { TelegramMCPContext } from "../types";
|
||||
import { notImplemented } from "./notImplemented";
|
||||
import { ErrorCategory, logAndFormatError } from '../../errorHandler';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import { optNumber } from '../args';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: "get_gif_search",
|
||||
description: "Search GIFs",
|
||||
inputSchema: {
|
||||
type: "object",
|
||||
properties: { query: { type: "string", description: "Search query" } },
|
||||
properties: {
|
||||
query: { type: "string", description: "Search query" },
|
||||
limit: { type: 'number', description: 'Max results', default: 10 },
|
||||
},
|
||||
required: ["query"],
|
||||
},
|
||||
};
|
||||
|
||||
export async function getGifSearch(
|
||||
_args: Record<string, unknown>,
|
||||
args: Record<string, unknown>,
|
||||
_context: TelegramMCPContext,
|
||||
): Promise<MCPToolResult> {
|
||||
return notImplemented("get_gif_search");
|
||||
try {
|
||||
const query = typeof args.query === 'string' ? args.query : '';
|
||||
if (!query) return { content: [{ type: 'text', text: 'query is required' }], isError: true };
|
||||
const limit = optNumber(args, 'limit', 10);
|
||||
|
||||
const client = mtprotoService.getClient();
|
||||
|
||||
const result = await mtprotoService.withFloodWaitHandling(async () => {
|
||||
const bot = await client.getInputEntity('gif');
|
||||
return client.invoke(
|
||||
new Api.messages.GetInlineBotResults({
|
||||
bot: bot as unknown as Api.TypeInputUser,
|
||||
peer: new Api.InputPeerSelf(),
|
||||
query,
|
||||
offset: '',
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
const results = (result as any)?.results;
|
||||
if (!results || !Array.isArray(results) || results.length === 0) {
|
||||
return { content: [{ type: 'text', text: 'No GIFs found for: ' + query }] };
|
||||
}
|
||||
|
||||
const lines = results.slice(0, limit).map((r: any, i: number) => {
|
||||
const title = r.title ?? r.description ?? 'GIF ' + (i + 1);
|
||||
return (i + 1) + '. ' + title;
|
||||
});
|
||||
|
||||
return { content: [{ type: 'text', text: lines.length + ' GIFs found:\n' + lines.join('\n') }] };
|
||||
} catch (error) {
|
||||
return logAndFormatError(
|
||||
'get_gif_search',
|
||||
error instanceof Error ? error : new Error(String(error)),
|
||||
ErrorCategory.MEDIA,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import { getChatById, getMessages, formatMessage } from '../telegramApi';
|
||||
import { validateId } from '../../validation';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: 'get_pinned_messages',
|
||||
@@ -47,7 +48,7 @@ export async function getPinnedMessages(
|
||||
limit: 50,
|
||||
maxId: 0,
|
||||
minId: 0,
|
||||
hash: BigInt(0),
|
||||
hash: bigInt(0),
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import { validateId } from '../../validation';
|
||||
import { getChatById } from '../telegramApi';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
import { optNumber } from '../args';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
@@ -44,8 +45,8 @@ export async function getRecentActions(
|
||||
new Api.channels.GetAdminLog({
|
||||
channel: inputChannel as Api.TypeInputChannel,
|
||||
q: '',
|
||||
maxId: BigInt(0),
|
||||
minId: BigInt(0),
|
||||
maxId: bigInt(0),
|
||||
minId: bigInt(0),
|
||||
limit,
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types";
|
||||
import { ErrorCategory, logAndFormatError } from '../../errorHandler';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: "get_sticker_sets",
|
||||
@@ -18,7 +19,7 @@ export async function getStickerSets(
|
||||
const client = mtprotoService.getClient();
|
||||
|
||||
const result = await mtprotoService.withFloodWaitHandling(async () => {
|
||||
return client.invoke(new Api.messages.GetAllStickers({ hash: BigInt(0) }));
|
||||
return client.invoke(new Api.messages.GetAllStickers({ hash: bigInt(0) }));
|
||||
});
|
||||
|
||||
const sets = (result as any)?.sets;
|
||||
|
||||
@@ -4,6 +4,7 @@ import { ErrorCategory, logAndFormatError } from '../../errorHandler';
|
||||
import { validateId } from '../../validation';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
import { optNumber } from '../args';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
@@ -32,9 +33,9 @@ export async function getUserPhotos(
|
||||
const inputUser = await client.getInputEntity(userId);
|
||||
return client.invoke(
|
||||
new Api.photos.GetUserPhotos({
|
||||
userId: inputUser as Api.TypeInputUser,
|
||||
userId: inputUser as unknown as Api.TypeInputUser,
|
||||
offset: 0,
|
||||
maxId: BigInt(0),
|
||||
maxId: bigInt(0),
|
||||
limit,
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -28,7 +28,7 @@ export async function getUserStatus(
|
||||
const result = await mtprotoService.withFloodWaitHandling(async () => {
|
||||
const inputUser = await client.getInputEntity(userId);
|
||||
return client.invoke(
|
||||
new Api.users.GetUsers({ id: [inputUser as Api.TypeInputUser] }),
|
||||
new Api.users.GetUsers({ id: [inputUser as unknown as Api.TypeInputUser] }),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types";
|
||||
import { ErrorCategory, logAndFormatError } from "../../errorHandler";
|
||||
import { mtprotoService } from "../../../../services/mtprotoService";
|
||||
import { Api } from "telegram";
|
||||
import bigInt from "big-integer";
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: "import_contacts",
|
||||
@@ -49,7 +50,7 @@ export async function importContacts(
|
||||
const inputContacts = contactsArg.map(
|
||||
(c: any, i: number) =>
|
||||
new Api.InputPhoneContact({
|
||||
clientId: BigInt(i),
|
||||
clientId: bigInt(i),
|
||||
phone: String(c.phone ?? ""),
|
||||
firstName: String(c.first_name ?? ""),
|
||||
lastName: String(c.last_name ?? ""),
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { TelegramMCPContext } from '../types';
|
||||
import { ErrorCategory, logAndFormatError } from '../../errorHandler';
|
||||
import { mtprotoService } from '../../../../services/mtprotoService';
|
||||
import { Api } from 'telegram';
|
||||
import bigInt from 'big-integer';
|
||||
|
||||
export const tool: MCPTool = {
|
||||
name: 'list_contacts',
|
||||
@@ -18,7 +19,7 @@ export async function listContacts(
|
||||
const client = mtprotoService.getClient();
|
||||
|
||||
const result = await mtprotoService.withFloodWaitHandling(async () => {
|
||||
return client.invoke(new Api.contacts.GetContacts({ hash: BigInt(0) }));
|
||||
return client.invoke(new Api.contacts.GetContacts({ hash: bigInt(0) }));
|
||||
});
|
||||
|
||||
if (!result || !('users' in result) || !Array.isArray(result.users)) {
|
||||
|
||||
@@ -28,7 +28,7 @@ export async function unblockUser(
|
||||
await mtprotoService.withFloodWaitHandling(async () => {
|
||||
const inputUser = await client.getInputEntity(userId);
|
||||
await client.invoke(
|
||||
new Api.contacts.Unblock({ id: inputUser as Api.TypeInputPeer }),
|
||||
new Api.contacts.Unblock({ id: inputUser as unknown as Api.TypeInputPeer }),
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user