2025-01-19 22:03:57 +02:00

94 lines
3.2 KiB
JavaScript

const { TelegramClient, utils, Api } = require("telegram");
module.exports = function (RED) {
function IterMessages(config) {
RED.nodes.createNode(this, config);
this.config = RED.nodes.getNode(config.config);
var node = this;
this.on("input", async function (msg) {
/** @type {TelegramClient} */
const client = msg.payload?.client
? msg.payload.client
: this.config.client;
const chatId = msg.payload?.chatId ? msg.payload.chatId : config.chatId;
let peerId = chatId === "me" ? chatId : utils.parseID(chatId);
// We receive parameters from the input message or from the node configuration
const limit = msg.payload?.limit || config.limit;
const offsetDate = msg.payload?.offsetDate || config.offsetDate;
const offsetId = msg.payload?.offsetId || config.offsetId;
const maxId = msg.payload?.maxId || config.maxId;
const minId = msg.payload?.minId || config.minId;
const addOffset = msg.payload?.addOffset || config.addOffset;
const search = msg.payload?.search || config.search;
const filter = msg.payload?.filter || config.filter;
const fromUser = msg.payload?.fromUser || config.fromUser;
const waitTime = msg.payload?.waitTime || config.waitTime;
const ids = msg.payload?.ids || config.ids;
const reverse = msg.payload?.reverse || config.reverse;
const replyTo = msg.payload?.replyTo || config.replyTo;
const scheduled = msg.payload?.scheduled || config.scheduled;
try {
const params = {
limit: limit !== "" ? parseInt(limit) : undefined,
offsetDate: offsetDate !== "" ? offsetDate : undefined,
offsetId: offsetId !== "" ? parseInt(offsetId) : undefined,
maxId: maxId,
minId: minId,
addOffset: addOffset,
search: search !== "" ? search : undefined,
filter: filter,
// fromUser: fromUser,
waitTime: waitTime,
ids: ids,
reverse: reverse,
replyTo: replyTo,
scheduled: scheduled,
};
if (offsetDate) {
params.offsetDate = new Date(offsetDate).getTime() / 1000;
}
if (chatId[0] === "@") {
peerId = await client.getEntity(chatId);
}
const messages = {};
const filters = msg.payload?.filters || config.filters || [];
// Processing selected filters
if (filters.length > 0) {
params.filter = [];
filters.forEach((filter) => {
params.filter.push(Api[filter]);
});
}
try {
for await (const message of client.iterMessages(peerId, params)) {
messages[message.id] = message;
console.log(message.id, message.text);
}
} catch (error) {
const entity = await client.getInputEntity(peerId);
for await (const message of client.iterMessages(entity, params)) {
messages[message.id] = message;
console.log(message.id, message.text);
}
}
node.send({
payload: { messages },
});
} catch (err) {
node.error("Error iter messages: " + err.message);
}
});
}
RED.nodes.registerType("iter-messages", IterMessages);
};