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

459 lines
12 KiB
HTML

<script type="text/javascript">
RED.nodes.registerType("iter-messages", {
category: "telegram",
color: "#32a3e0",
defaults: {
name: { value: "" },
config: { type: "config", required: true },
chatId: { value: "", required: false },
limit: { value: "", required: false },
offsetDate: { value: "", required: false },
offsetId: { value: "", required: false },
maxId: { value: "", required: false },
minId: { value: "", required: false },
addOffset: { value: "", required: false },
search: { value: "", required: false },
filter: { value: "", required: false },
fromUser: { value: "", required: false },
waitTime: { value: "", required: false },
ids: { value: "", required: false },
reverse: { value: "", required: false },
replyTo: { value: "", required: false },
scheduled: { value: "", required: false },
},
inputs: 1,
outputs: 1,
paletteLabel: "Iterate Messages",
label: function () {
return this.name || "Iterate Messages";
},
oneditprepare: function () {
const node = this;
$("#node-input-ids").val(node.ids.join(","));
},
oneditsave: function () {
const node = this;
ids = $("#node-input-ids").val();
if (ids) {
node.ids = ids.split(",").map((id) => parseInt(id));
}
},
});
</script>
<script type="text/html" data-template-name="iter-messages">
<div class="form-row">
<label for="node-input-name"> <i class="fa fa-tag"></i> Name </label>
<input
type="text"
id="node-input-name"
placeholder="Name"
style="width: 60%"
ng-model="name"
/>
</div>
<div class="form-row">
<label for="node-input-config"> <i class="fa fa-tag"></i> Config </label>
<input
type="text"
id="node-input-config"
placeholder="Config"
style="width: 60%"
ng-model="config"
/>
</div>
<div class="form-row">
<label for="node-input-chatId"> <i class="fa fa-tag"></i> Chat ID </label>
<input
type="text"
id="node-input-chatId"
placeholder="Chat ID"
style="width: 60%"
ng-model="chatId"
/>
</div>
<div class="form-row">
<label for="node-input-limit"> <i class="fa fa-tag"></i> Limit </label>
<input
type="number"
id="node-input-limit"
placeholder="Limit"
style="width: 60%"
ng-model="limit"
/>
</div>
<div class="form-row">
<label for="node-input-offsetDate">
<i class="fa fa-tag"></i> Offset Date
</label>
<input
type="datetime-local"
id="node-input-offsetDate"
placeholder="Offset Date"
style="width: 60%"
ng-model="offsetDate"
/>
</div>
<div class="form-row">
<label for="node-input-offsetId">
<i class="fa fa-tag"></i> Offset ID
</label>
<input
type="number"
id="node-input-offsetId"
placeholder="Offset ID"
style="width: 60%"
ng-model="offsetId"
/>
</div>
<div class="form-row">
<label for="node-input-maxId"> <i class="fa fa-tag"></i> Max ID </label>
<input
type="number"
id="node-input-maxId"
placeholder="Max ID"
style="width: 60%"
ng-model="maxId"
/>
</div>
<div class="form-row">
<label for="node-input-minId"> <i class="fa fa-tag"></i> Min ID </label>
<input
type="number"
id="node-input-minId"
placeholder="Min ID"
style="width: 60%"
ng-model="minId"
/>
</div>
<div class="form-row">
<label for="node-input-addOffset">
<i class="fa fa-tag"></i> Add Offset
</label>
<input
type="number"
id="node-input-addOffset"
placeholder="Add Offset"
style="width: 60%"
ng-model="addOffset"
/>
</div>
<div class="form-row">
<label for="node-input-search"> <i class="fa fa-tag"></i> Search </label>
<input
type="text"
id="node-input-search"
placeholder="Search"
style="width: 60%"
ng-model="search"
/>
</div>
<div class="form-row">
<label for="node-input-filter"> <i class="fa fa-tag"></i> Filter </label>
<input
type="checkbox"
name="filter"
value="InputMessagesFilterEmpty"
/>Empty<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterPhotos"
/>Photos<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterVideo"
/>Video<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterPhotoVideo"
/>Photo and Video<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterDocument"
/>Document<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterUrl"
/>URL<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterGif"
/>GIF<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterVoice"
/>Voice<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterMusic"
/>Music<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterChatPhotos"
/>Chat Photos<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterPhoneCalls"
/>Phone Calls<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterRoundVoice"
/>Round Voice<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterRoundVideo"
/>Round Video<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterMyMentions"
/>My Mentions<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterGeo"
/>Geo<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterContacts"
/>Contacts<br />
<input
type="checkbox"
name="filter"
value="InputMessagesFilterPinned"
/>Pinned<br />
</div>
<div class="form-row">
<label for="node-input-fromUser">
<i class="fa fa-tag"></i> From User
</label>
<input
type="text"
id="node-input-fromUser"
placeholder="From User"
style="width: 60%"
ng-model="fromUser"
/>
</div>
<div class="form-row">
<label for="node-input-waitTime">
<i class="fa fa-tag"></i> Wait Time
</label>
<input
type="number"
id="node-input-waitTime"
placeholder="Wait Time"
style="width: 60%"
ng-model="waitTime"
/>
</div>
<div class="form-row">
<label for="node-input-ids"> <i class="fa fa-tag"></i> IDs </label>
<input
type="text"
id="node-input-ids"
placeholder="123,1245"
style="width: 60%"
ng-model="ids"
/>
</div>
<div class="form-row">
<label for="node-input-reverse"> <i class="fa fa-tag"></i> Reverse </label>
<input type="checkbox" id="node-input-reverse" ng-model="reverse" />
</div>
<div class="form-row">
<label for="node-input-replyTo"> <i class="fa fa-tag"></i> Reply To </label>
<input
type="number"
id="node-input-replyTo"
placeholder="Reply To"
style="width: 60%"
ng-model="replyTo"
/>
</div>
<div class="form-row">
<label for="node-input-scheduled">
<i class="fa fa-tag"></i> Scheduled
</label>
<input type="checkbox" id="node-input-scheduled" ng-model="scheduled" />
</div>
</script>
<script type="text/html" data-help-name="iter-messages">
<p>
The <b>iter-messages</b> node retrieves messages from a specified chat or
user using the Telegram API. It supports a wide range of filtering and
pagination options, allowing for efficient message iteration.
</p>
<h3>Inputs</h3>
<dl class="message-properties">
<dt>
payload.client
<span class="property-type">object</span>
</dt>
<dd>An optional Telegram client instance if not configured globally.</dd>
<dt>
payload.chatId
<span class="property-type">string</span>
</dt>
<dd>
The ID or username of the chat or user to retrieve messages from. Use "me"
for personal messages.
</dd>
<dt>
payload.limit
<span class="property-type">number</span>
</dt>
<dd>Maximum number of messages to retrieve.</dd>
<dt>
payload.offsetDate
<span class="property-type">string | number</span>
</dt>
<dd>
Fetch messages starting from this date. Accepts a UNIX timestamp or a date
string.
</dd>
<dt>
payload.offsetId
<span class="property-type">number</span>
</dt>
<dd>Fetch messages starting from this message ID.</dd>
<dt>
payload.maxId
<span class="property-type">number</span>
</dt>
<dd>Fetch messages with IDs less than or equal to this value.</dd>
<dt>
payload.minId
<span class="property-type">number</span>
</dt>
<dd>Fetch messages with IDs greater than or equal to this value.</dd>
<dt>
payload.addOffset
<span class="property-type">number</span>
</dt>
<dd>An additional offset to apply when retrieving messages.</dd>
<dt>
payload.search
<span class="property-type">string</span>
</dt>
<dd>Filters messages containing the specified search term.</dd>
<dt>
payload.filter
<span class="property-type">object</span>
</dt>
<dd>
Applies a specific message filter (e.g., photos, videos, documents).
</dd>
<dt>
payload.filters
<span class="property-type">array</span>
</dt>
<dd>
Applies multiple message filters using Telegram API filter classes (e.g.,
<code>Api.InputMessagesFilterPhotos</code>).
</dd>
<dt>
payload.reverse
<span class="property-type">boolean</span>
</dt>
<dd>
Retrieves messages in reverse order if set to <code>true</code>. Default
is <code>false</code>.
</dd>
<dt>
payload.replyTo
<span class="property-type">number</span>
</dt>
<dd>Fetches messages replying to the specified message ID.</dd>
<dt>
payload.scheduled
<span class="property-type">boolean</span>
</dt>
<dd>Includes scheduled messages if set to <code>true</code>.</dd>
</dl>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>
payload.messages
<span class="property-type">object</span>
</dt>
<dd>
An object containing messages, where keys are message IDs and values are
message details.
</dd>
</dl>
<h3>Details</h3>
<p>
The <b>iter-messages</b> node provides a flexible way to retrieve messages
from a Telegram chat or user. It allows advanced configurations such as
filtering messages by type, searching for specific terms, and paginating
results using offsets and IDs.
</p>
<p>
The node also handles cases where a chat username needs to be resolved into
an entity or peer ID. It supports using multiple filters in conjunction,
enabling precise control over the messages to process.
</p>
<h3>Example</h3>
<pre>
{
"payload": {
"chatId": "@examplechannel",
"limit": 50,
"search": "announcement",
"filters": ["InputMessagesFilterPhotos"]
}
}
</pre
>
<p>
This input retrieves up to 50 messages containing the term "announcement"
and filters them to include only photos from the specified channel.
</p>
<h3>Error Handling</h3>
<p>
If an error occurs during message retrieval (e.g., invalid chat ID or API
errors), the node logs an error message and does not return a payload.
</p>
<h3>Configuration</h3>
<p>
The node can use a globally configured Telegram client or a client instance
provided in the message payload. Ensure the client has access to the
specified chat or user.
</p>
</script>