@mtkruto/node 0.0.826 → 0.0.828

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,12 @@ import * as functions from "../tl/3_functions.js";
4
4
  import { ClientAbstract } from "./client_abstract.js";
5
5
  import { Storage } from "../storage/storage.js";
6
6
  import { DC, TransportProvider } from "../transport/transport_provider.js";
7
+ import { MessageEntity } from "../types/0_message_entity.js";
7
8
  export declare const restartAuth: unique symbol;
9
+ export declare enum ParseMode {
10
+ None = "none",
11
+ HTML = "html"
12
+ }
8
13
  export interface AuthorizeUserParams<S = string> {
9
14
  phone: S | (() => MaybePromise<S>);
10
15
  code: S | (() => MaybePromise<S>);
@@ -12,6 +17,10 @@ export interface AuthorizeUserParams<S = string> {
12
17
  }
13
18
  export type UpdatesHandler = null | ((client: Client, update: types.Updates) => MaybePromise<void>);
14
19
  export interface ClientParams {
20
+ /**
21
+ * Default parse mode. Defauls to `ParseMode.None`.
22
+ */
23
+ parseMode?: ParseMode;
15
24
  /**
16
25
  * The transport provider to use. Defaults to `defaultTransportProvider`.
17
26
  */
@@ -51,6 +60,7 @@ export declare class Client extends ClientAbstract {
51
60
  private promises;
52
61
  private toAcknowledge;
53
62
  updatesHandler: UpdatesHandler;
63
+ readonly parseMode: ParseMode;
54
64
  readonly appVersion: string;
55
65
  readonly deviceModel: string;
56
66
  readonly langCode: string;
@@ -117,4 +127,14 @@ export declare class Client extends ClientAbstract {
117
127
  private processUsers;
118
128
  private processUpdates;
119
129
  getInputPeer(id: string | number): Promise<types.InputPeerChat | types.InputPeerUser | types.InputPeerChannel>;
130
+ sendMessage(chatId: number | string, text: string, params?: {
131
+ parseMode?: ParseMode;
132
+ entities?: MessageEntity[];
133
+ disableWebPagePreview?: boolean;
134
+ disableNotification?: boolean;
135
+ protectContent?: boolean;
136
+ replyToMessageId?: number;
137
+ messageThreadId?: number;
138
+ sendAs?: number | string;
139
+ }): Promise<types.TypeUpdates>;
120
140
  }
@@ -1,6 +1,7 @@
1
1
  import { gunzip } from "../deps.js";
2
2
  import { ackThreshold, DEFAULT_APP_VERSION, DEFAULT_DEVICE_MODEL, DEFAULT_INITIAL_DC, DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, DEFAULT_SYSTEM_LANG_CODE, DEFAULT_SYSTEM_VERSION, LAYER, MAX_CHANNEL_ID, MAX_CHAT_ID, USERNAME_TTL, ZERO_CHANNEL_ID } from "../constants.js";
3
- import { bigIntFromBuffer, getRandomBigInt } from "../utilities/0_bigint.js";
3
+ import { bigIntFromBuffer, getRandomBigInt, getRandomId } from "../utilities/0_bigint.js";
4
+ import { parseHtml } from "../utilities/0_html.js";
4
5
  import { decryptMessage, encryptMessage, getMessageId } from "../utilities/1_message.js";
5
6
  import { checkPassword } from "../utilities/1_password.js";
6
7
  import { as } from "../tl/1_tl_object.js";
@@ -14,7 +15,13 @@ import { ClientAbstract } from "./client_abstract.js";
14
15
  import { ClientPlain } from "./client_plain.js";
15
16
  import { StorageMemory } from "../storage/storage_memory.js";
16
17
  import { sha1 } from "../utilities/0_hash.js";
18
+ import { messageEntityToTlObject } from "../types/0_message_entity.js";
17
19
  export const restartAuth = Symbol();
20
+ export var ParseMode;
21
+ (function (ParseMode) {
22
+ ParseMode["None"] = "none";
23
+ ParseMode["HTML"] = "html";
24
+ })(ParseMode || (ParseMode = {}));
18
25
  export class Client extends ClientAbstract {
19
26
  /**
20
27
  * Constructs the client.
@@ -80,6 +87,12 @@ export class Client extends ClientAbstract {
80
87
  writable: true,
81
88
  value: null
82
89
  });
90
+ Object.defineProperty(this, "parseMode", {
91
+ enumerable: true,
92
+ configurable: true,
93
+ writable: true,
94
+ value: void 0
95
+ });
83
96
  Object.defineProperty(this, "appVersion", {
84
97
  enumerable: true,
85
98
  configurable: true,
@@ -122,6 +135,7 @@ export class Client extends ClientAbstract {
122
135
  writable: true,
123
136
  value: false
124
137
  });
138
+ this.parseMode = params?.parseMode ?? ParseMode.None;
125
139
  this.appVersion = params?.appVersion ?? DEFAULT_APP_VERSION;
126
140
  this.deviceModel = params?.deviceModel ?? DEFAULT_DEVICE_MODEL;
127
141
  this.langCode = params?.langCode ?? DEFAULT_LANG_CODE;
@@ -584,4 +598,41 @@ export class Client extends ClientAbstract {
584
598
  throw new Error("ID format unknown or not implemented");
585
599
  }
586
600
  }
601
+ async sendMessage(chatId, text, params) {
602
+ const entities_ = params?.entities ?? [];
603
+ const parseMode = params?.parseMode ?? this.parseMode;
604
+ switch (parseMode) {
605
+ case ParseMode.None:
606
+ break;
607
+ case ParseMode.HTML: {
608
+ const [newText, entitiesToPush] = parseHtml(text);
609
+ text = newText;
610
+ for (const entity of entitiesToPush) {
611
+ entities_.push(entity);
612
+ }
613
+ }
614
+ }
615
+ const peer = await this.getInputPeer(chatId);
616
+ const randomId = getRandomId();
617
+ const message = text;
618
+ const noWebpage = params?.disableWebPagePreview ? true : undefined;
619
+ const silent = params?.disableNotification ? true : undefined;
620
+ const noforwards = params?.protectContent ? true : undefined;
621
+ const replyToMsgId = params?.replyToMessageId;
622
+ const topMsgId = params?.messageThreadId;
623
+ const sendAs = params?.sendAs ? await this.getInputPeer(params.sendAs) : undefined;
624
+ const entities = entities_?.length > 0 ? entities_.map((v) => messageEntityToTlObject(v)) : undefined;
625
+ return await this.invoke(new functions.MessagesSendMessage({
626
+ peer,
627
+ randomId,
628
+ message,
629
+ noWebpage,
630
+ silent,
631
+ noforwards,
632
+ replyToMsgId,
633
+ topMsgId,
634
+ sendAs,
635
+ entities,
636
+ }));
637
+ }
587
638
  }
@@ -0,0 +1,90 @@
1
+ import * as types from "../tl/2_types.js";
2
+ export declare enum MessageEntityType {
3
+ Mention = "mention",
4
+ Hashtag = "hashtag",
5
+ BotCommand = "bot_command",
6
+ URL = "url",
7
+ Email = "email",
8
+ Bold = "bold",
9
+ Italic = "italic",
10
+ Code = "code",
11
+ Pre = "pre",
12
+ TextURL = "text_url",
13
+ MentionName = "mention_name",
14
+ Cashtag = "cashtag",
15
+ Phone = "phone",
16
+ Underline = "underline",
17
+ Strike = "strike",
18
+ Blockquote = "blockquote",
19
+ BankCard = "bank_card",
20
+ Spoiler = "spoiler",
21
+ CustomEmoji = "custom_emoji"
22
+ }
23
+ export interface MessageEntityBase {
24
+ offset: number;
25
+ length: number;
26
+ }
27
+ export interface MessageEntityMention extends MessageEntityBase {
28
+ type: MessageEntityType.Mention;
29
+ }
30
+ export interface MessageEntityHashtag extends MessageEntityBase {
31
+ type: MessageEntityType.Hashtag;
32
+ }
33
+ export interface MessageEntityBotCommand extends MessageEntityBase {
34
+ type: MessageEntityType.BotCommand;
35
+ }
36
+ export interface MessageEntityURL extends MessageEntityBase {
37
+ type: MessageEntityType.URL;
38
+ }
39
+ export interface MessageEntityEmailAddress extends MessageEntityBase {
40
+ type: MessageEntityType.Email;
41
+ }
42
+ export interface MessageEntityBold extends MessageEntityBase {
43
+ type: MessageEntityType.Bold;
44
+ }
45
+ export interface MessageEntityItalic extends MessageEntityBase {
46
+ type: MessageEntityType.Italic;
47
+ }
48
+ export interface MessageEntityPre extends MessageEntityBase {
49
+ type: MessageEntityType.Pre;
50
+ language: string;
51
+ }
52
+ export interface MessageEntityCode extends MessageEntityBase {
53
+ type: MessageEntityType.Code;
54
+ }
55
+ export interface MessageEntityTextURL extends MessageEntityBase {
56
+ type: MessageEntityType.TextURL;
57
+ url: string;
58
+ }
59
+ export interface MessageEntityMentionName extends MessageEntityBase {
60
+ type: MessageEntityType.MentionName;
61
+ userId: number;
62
+ }
63
+ export interface MessageEntityCashtag extends MessageEntityBase {
64
+ type: MessageEntityType.Cashtag;
65
+ }
66
+ export interface MessageEntityPhone extends MessageEntityBase {
67
+ type: MessageEntityType.Phone;
68
+ }
69
+ export interface MessageEntityUnderline extends MessageEntityBase {
70
+ type: MessageEntityType.Underline;
71
+ }
72
+ export interface MessageEntityStrike extends MessageEntityBase {
73
+ type: MessageEntityType.Strike;
74
+ }
75
+ export interface MessageEntityBlockquote extends MessageEntityBase {
76
+ type: MessageEntityType.Blockquote;
77
+ }
78
+ export interface MessageEntityBankCard extends MessageEntityBase {
79
+ type: MessageEntityType.BankCard;
80
+ }
81
+ export interface MessageEntitySpoiler extends MessageEntityBase {
82
+ type: MessageEntityType.Spoiler;
83
+ }
84
+ export interface MessageEntityCustomEmoji extends MessageEntityBase {
85
+ type: MessageEntityType.CustomEmoji;
86
+ documentId: bigint;
87
+ }
88
+ export type MessageEntity = MessageEntityMention | MessageEntityHashtag | MessageEntityBotCommand | MessageEntityURL | MessageEntityEmailAddress | MessageEntityBold | MessageEntityItalic | MessageEntityCode | MessageEntityPre | MessageEntityTextURL | MessageEntityMentionName | MessageEntityCashtag | MessageEntityPhone | MessageEntityUnderline | MessageEntityStrike | MessageEntityBlockquote | MessageEntityBankCard | MessageEntitySpoiler | MessageEntityCustomEmoji;
89
+ export declare function constructMessageEntity(obj: types.TypeMessageEntity): MessageEntity | null;
90
+ export declare function messageEntityToTlObject(entity: MessageEntity): types.MessageEntityMention | types.MessageEntityHashtag | types.MessageEntityBotCommand | types.MessageEntityURL | types.MessageEntityEmail | types.MessageEntityBold | types.MessageEntityItalic | types.MessageEntityCode | types.MessageEntityPre | types.MessageEntityTextURL | types.MessageEntityMentionName | types.MessageEntityPhone | types.MessageEntityCashtag | types.MessageEntityUnderline | types.MessageEntityStrike | types.MessageEntityBlockquote | types.MessageEntityBankCard | types.MessageEntitySpoiler | types.MessageEntityCustomEmoji;
@@ -0,0 +1,128 @@
1
+ import * as types from "../tl/2_types.js";
2
+ export var MessageEntityType;
3
+ (function (MessageEntityType) {
4
+ MessageEntityType["Mention"] = "mention";
5
+ MessageEntityType["Hashtag"] = "hashtag";
6
+ MessageEntityType["BotCommand"] = "bot_command";
7
+ MessageEntityType["URL"] = "url";
8
+ MessageEntityType["Email"] = "email";
9
+ MessageEntityType["Bold"] = "bold";
10
+ MessageEntityType["Italic"] = "italic";
11
+ MessageEntityType["Code"] = "code";
12
+ MessageEntityType["Pre"] = "pre";
13
+ MessageEntityType["TextURL"] = "text_url";
14
+ MessageEntityType["MentionName"] = "mention_name";
15
+ MessageEntityType["Cashtag"] = "cashtag";
16
+ MessageEntityType["Phone"] = "phone";
17
+ MessageEntityType["Underline"] = "underline";
18
+ MessageEntityType["Strike"] = "strike";
19
+ MessageEntityType["Blockquote"] = "blockquote";
20
+ MessageEntityType["BankCard"] = "bank_card";
21
+ MessageEntityType["Spoiler"] = "spoiler";
22
+ MessageEntityType["CustomEmoji"] = "custom_emoji";
23
+ })(MessageEntityType || (MessageEntityType = {}));
24
+ export function constructMessageEntity(obj) {
25
+ if (obj instanceof types.MessageEntityMention) {
26
+ return { type: MessageEntityType.Mention, offset: obj.offset, length: obj.length };
27
+ }
28
+ else if (obj instanceof types.MessageEntityHashtag) {
29
+ return { type: MessageEntityType.Hashtag, offset: obj.offset, length: obj.length };
30
+ }
31
+ else if (obj instanceof types.MessageEntityBotCommand) {
32
+ return { type: MessageEntityType.BotCommand, offset: obj.offset, length: obj.length };
33
+ }
34
+ else if (obj instanceof types.MessageEntityURL) {
35
+ return { type: MessageEntityType.URL, offset: obj.offset, length: obj.length };
36
+ }
37
+ else if (obj instanceof types.MessageEntityEmail) {
38
+ return { type: MessageEntityType.Email, offset: obj.offset, length: obj.length };
39
+ }
40
+ else if (obj instanceof types.MessageEntityBold) {
41
+ return { type: MessageEntityType.Bold, offset: obj.offset, length: obj.length };
42
+ }
43
+ else if (obj instanceof types.MessageEntityItalic) {
44
+ return { type: MessageEntityType.Italic, offset: obj.offset, length: obj.length };
45
+ }
46
+ else if (obj instanceof types.MessageEntityCode) {
47
+ return { type: MessageEntityType.Code, offset: obj.offset, length: obj.length };
48
+ }
49
+ else if (obj instanceof types.MessageEntityPre) {
50
+ return { type: MessageEntityType.Pre, offset: obj.offset, length: obj.length, language: obj.language };
51
+ }
52
+ else if (obj instanceof types.MessageEntityTextURL) {
53
+ return { type: MessageEntityType.TextURL, offset: obj.offset, length: obj.length, url: obj.url };
54
+ }
55
+ else if (obj instanceof types.MessageEntityMentionName) {
56
+ return { type: MessageEntityType.MentionName, offset: obj.offset, length: obj.length, userId: Number(obj.userId) };
57
+ }
58
+ else if (obj instanceof types.MessageEntityCashtag) {
59
+ return { type: MessageEntityType.Cashtag, offset: obj.offset, length: obj.length };
60
+ }
61
+ else if (obj instanceof types.MessageEntityPhone) {
62
+ return { type: MessageEntityType.Phone, offset: obj.offset, length: obj.length };
63
+ }
64
+ else if (obj instanceof types.MessageEntityUnderline) {
65
+ return { type: MessageEntityType.Underline, offset: obj.offset, length: obj.length };
66
+ }
67
+ else if (obj instanceof types.MessageEntityStrike) {
68
+ return { type: MessageEntityType.Strike, offset: obj.offset, length: obj.length };
69
+ }
70
+ else if (obj instanceof types.MessageEntityBlockquote) {
71
+ return { type: MessageEntityType.Blockquote, offset: obj.offset, length: obj.length };
72
+ }
73
+ else if (obj instanceof types.MessageEntityBankCard) {
74
+ return { type: MessageEntityType.BankCard, offset: obj.offset, length: obj.length };
75
+ }
76
+ else if (obj instanceof types.MessageEntitySpoiler) {
77
+ return { type: MessageEntityType.Spoiler, offset: obj.offset, length: obj.length };
78
+ }
79
+ else if (obj instanceof types.MessageEntityCustomEmoji) {
80
+ return { type: MessageEntityType.CustomEmoji, offset: obj.offset, length: obj.length, documentId: obj.documentId };
81
+ }
82
+ else {
83
+ return null;
84
+ }
85
+ }
86
+ export function messageEntityToTlObject(entity) {
87
+ const { offset, length } = entity;
88
+ switch (entity.type) {
89
+ case MessageEntityType.Mention:
90
+ return new types.MessageEntityMention({ offset, length });
91
+ case MessageEntityType.Hashtag:
92
+ return new types.MessageEntityHashtag({ offset, length });
93
+ case MessageEntityType.BotCommand:
94
+ return new types.MessageEntityBotCommand({ offset, length });
95
+ case MessageEntityType.URL:
96
+ return new types.MessageEntityURL({ offset, length });
97
+ case MessageEntityType.Email:
98
+ return new types.MessageEntityEmail({ offset, length });
99
+ case MessageEntityType.Bold:
100
+ return new types.MessageEntityBold({ offset, length });
101
+ case MessageEntityType.Italic:
102
+ return new types.MessageEntityItalic({ offset, length });
103
+ case MessageEntityType.Code:
104
+ return new types.MessageEntityCode({ offset, length });
105
+ case MessageEntityType.Pre:
106
+ return new types.MessageEntityPre({ offset, length, language: entity.language });
107
+ case MessageEntityType.TextURL:
108
+ return new types.MessageEntityTextURL({ offset, length, url: entity.url });
109
+ case MessageEntityType.MentionName:
110
+ return new types.MessageEntityMentionName({ offset, length, userId: BigInt(entity.userId) });
111
+ case MessageEntityType.Cashtag:
112
+ return new types.MessageEntityCashtag({ offset, length });
113
+ case MessageEntityType.Phone:
114
+ return new types.MessageEntityPhone({ offset, length });
115
+ case MessageEntityType.Underline:
116
+ return new types.MessageEntityUnderline({ offset, length });
117
+ case MessageEntityType.Strike:
118
+ return new types.MessageEntityStrike({ offset, length });
119
+ case MessageEntityType.Blockquote:
120
+ return new types.MessageEntityBlockquote({ offset, length });
121
+ case MessageEntityType.BankCard:
122
+ return new types.MessageEntityBankCard({ offset, length });
123
+ case MessageEntityType.Spoiler:
124
+ return new types.MessageEntitySpoiler({ offset, length });
125
+ case MessageEntityType.CustomEmoji:
126
+ return new types.MessageEntityCustomEmoji({ offset, length, documentId: entity.documentId });
127
+ }
128
+ }
@@ -0,0 +1,2 @@
1
+ import { MessageEntity } from "../types/0_message_entity.js";
2
+ export declare function parseHtml(html: string): readonly [string, MessageEntity[]];
@@ -0,0 +1,74 @@
1
+ import { Parser } from "../deps.js";
2
+ import { MessageEntityType } from "../types/0_message_entity.js";
3
+ export function parseHtml(html) {
4
+ let text = "";
5
+ const entities = new Array();
6
+ const queue = new Array();
7
+ const parser = new Parser({
8
+ onopentag(name, attribs) {
9
+ switch (name) {
10
+ case "b":
11
+ case "strong":
12
+ queue.push({ type: MessageEntityType.Bold, offset: text.length, length: 0 });
13
+ break;
14
+ case "em":
15
+ case "i":
16
+ queue.push({ type: MessageEntityType.Italic, offset: text.length, length: 0 });
17
+ break;
18
+ case "code":
19
+ queue.push({ type: MessageEntityType.Code, offset: text.length, length: 0 });
20
+ break;
21
+ case "pre": {
22
+ const language = attribs.language ?? "";
23
+ queue.push({ type: MessageEntityType.Pre, offset: text.length, length: 0, language });
24
+ break;
25
+ }
26
+ case "a": {
27
+ const url = attribs.href;
28
+ if (!url) {
29
+ throw new Error("Missing attribute href");
30
+ }
31
+ queue.push({ type: MessageEntityType.TextURL, offset: text.length, length: 0, url });
32
+ break;
33
+ }
34
+ case "ins":
35
+ case "u":
36
+ queue.push({ type: MessageEntityType.Underline, offset: text.length, length: 0 });
37
+ break;
38
+ case "del":
39
+ case "strike":
40
+ queue.push({ type: MessageEntityType.Strike, offset: text.length, length: 0 });
41
+ break;
42
+ case "span":
43
+ if (attribs.class != "tg-spoiler") {
44
+ throw new Error("The class attribute must be tg-spoiler");
45
+ }
46
+ // falls through
47
+ case "tg-spoiler":
48
+ queue.push({ type: MessageEntityType.Spoiler, offset: text.length, length: 0 });
49
+ break;
50
+ case "tg-emoji":
51
+ if (!attribs["emoji-id"]) {
52
+ throw new Error("Missing attribute emoji-id");
53
+ }
54
+ queue.push({ type: MessageEntityType.Spoiler, offset: text.length, length: 0 });
55
+ }
56
+ },
57
+ ontext(data) {
58
+ text += data;
59
+ const lastItem = queue[queue.length - 1];
60
+ if (lastItem) {
61
+ lastItem.length += data.length;
62
+ }
63
+ },
64
+ onclosetag() {
65
+ const lastItem = queue.pop();
66
+ if (lastItem) {
67
+ entities.push(lastItem);
68
+ }
69
+ },
70
+ });
71
+ parser.write(html);
72
+ parser.end();
73
+ return [text, entities];
74
+ }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "module": "./esm/mod.js",
3
3
  "main": "./script/mod.js",
4
4
  "name": "@mtkruto/node",
5
- "version": "0.0.826",
5
+ "version": "0.0.828",
6
6
  "description": "MTKruto for Node.js",
7
7
  "author": "Roj <rojvv@icloud.com>",
8
8
  "license": "LGPL-3.0-or-later",
@@ -4,7 +4,12 @@ import * as functions from "../tl/3_functions.js";
4
4
  import { ClientAbstract } from "./client_abstract.js";
5
5
  import { Storage } from "../storage/storage.js";
6
6
  import { DC, TransportProvider } from "../transport/transport_provider.js";
7
+ import { MessageEntity } from "../types/0_message_entity.js";
7
8
  export declare const restartAuth: unique symbol;
9
+ export declare enum ParseMode {
10
+ None = "none",
11
+ HTML = "html"
12
+ }
8
13
  export interface AuthorizeUserParams<S = string> {
9
14
  phone: S | (() => MaybePromise<S>);
10
15
  code: S | (() => MaybePromise<S>);
@@ -12,6 +17,10 @@ export interface AuthorizeUserParams<S = string> {
12
17
  }
13
18
  export type UpdatesHandler = null | ((client: Client, update: types.Updates) => MaybePromise<void>);
14
19
  export interface ClientParams {
20
+ /**
21
+ * Default parse mode. Defauls to `ParseMode.None`.
22
+ */
23
+ parseMode?: ParseMode;
15
24
  /**
16
25
  * The transport provider to use. Defaults to `defaultTransportProvider`.
17
26
  */
@@ -51,6 +60,7 @@ export declare class Client extends ClientAbstract {
51
60
  private promises;
52
61
  private toAcknowledge;
53
62
  updatesHandler: UpdatesHandler;
63
+ readonly parseMode: ParseMode;
54
64
  readonly appVersion: string;
55
65
  readonly deviceModel: string;
56
66
  readonly langCode: string;
@@ -117,4 +127,14 @@ export declare class Client extends ClientAbstract {
117
127
  private processUsers;
118
128
  private processUpdates;
119
129
  getInputPeer(id: string | number): Promise<types.InputPeerChat | types.InputPeerUser | types.InputPeerChannel>;
130
+ sendMessage(chatId: number | string, text: string, params?: {
131
+ parseMode?: ParseMode;
132
+ entities?: MessageEntity[];
133
+ disableWebPagePreview?: boolean;
134
+ disableNotification?: boolean;
135
+ protectContent?: boolean;
136
+ replyToMessageId?: number;
137
+ messageThreadId?: number;
138
+ sendAs?: number | string;
139
+ }): Promise<types.TypeUpdates>;
120
140
  }
@@ -23,10 +23,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.Client = exports.restartAuth = void 0;
26
+ exports.Client = exports.ParseMode = exports.restartAuth = void 0;
27
27
  const deps_js_1 = require("../deps.js");
28
28
  const constants_js_1 = require("../constants.js");
29
29
  const _0_bigint_js_1 = require("../utilities/0_bigint.js");
30
+ const _0_html_js_1 = require("../utilities/0_html.js");
30
31
  const _1_message_js_1 = require("../utilities/1_message.js");
31
32
  const _1_password_js_1 = require("../utilities/1_password.js");
32
33
  const _1_tl_object_js_1 = require("../tl/1_tl_object.js");
@@ -40,7 +41,13 @@ const client_abstract_js_1 = require("./client_abstract.js");
40
41
  const client_plain_js_1 = require("./client_plain.js");
41
42
  const storage_memory_js_1 = require("../storage/storage_memory.js");
42
43
  const _0_hash_js_1 = require("../utilities/0_hash.js");
44
+ const _0_message_entity_js_1 = require("../types/0_message_entity.js");
43
45
  exports.restartAuth = Symbol();
46
+ var ParseMode;
47
+ (function (ParseMode) {
48
+ ParseMode["None"] = "none";
49
+ ParseMode["HTML"] = "html";
50
+ })(ParseMode = exports.ParseMode || (exports.ParseMode = {}));
44
51
  class Client extends client_abstract_js_1.ClientAbstract {
45
52
  /**
46
53
  * Constructs the client.
@@ -106,6 +113,12 @@ class Client extends client_abstract_js_1.ClientAbstract {
106
113
  writable: true,
107
114
  value: null
108
115
  });
116
+ Object.defineProperty(this, "parseMode", {
117
+ enumerable: true,
118
+ configurable: true,
119
+ writable: true,
120
+ value: void 0
121
+ });
109
122
  Object.defineProperty(this, "appVersion", {
110
123
  enumerable: true,
111
124
  configurable: true,
@@ -148,6 +161,7 @@ class Client extends client_abstract_js_1.ClientAbstract {
148
161
  writable: true,
149
162
  value: false
150
163
  });
164
+ this.parseMode = params?.parseMode ?? ParseMode.None;
151
165
  this.appVersion = params?.appVersion ?? constants_js_1.DEFAULT_APP_VERSION;
152
166
  this.deviceModel = params?.deviceModel ?? constants_js_1.DEFAULT_DEVICE_MODEL;
153
167
  this.langCode = params?.langCode ?? constants_js_1.DEFAULT_LANG_CODE;
@@ -610,5 +624,42 @@ class Client extends client_abstract_js_1.ClientAbstract {
610
624
  throw new Error("ID format unknown or not implemented");
611
625
  }
612
626
  }
627
+ async sendMessage(chatId, text, params) {
628
+ const entities_ = params?.entities ?? [];
629
+ const parseMode = params?.parseMode ?? this.parseMode;
630
+ switch (parseMode) {
631
+ case ParseMode.None:
632
+ break;
633
+ case ParseMode.HTML: {
634
+ const [newText, entitiesToPush] = (0, _0_html_js_1.parseHtml)(text);
635
+ text = newText;
636
+ for (const entity of entitiesToPush) {
637
+ entities_.push(entity);
638
+ }
639
+ }
640
+ }
641
+ const peer = await this.getInputPeer(chatId);
642
+ const randomId = (0, _0_bigint_js_1.getRandomId)();
643
+ const message = text;
644
+ const noWebpage = params?.disableWebPagePreview ? true : undefined;
645
+ const silent = params?.disableNotification ? true : undefined;
646
+ const noforwards = params?.protectContent ? true : undefined;
647
+ const replyToMsgId = params?.replyToMessageId;
648
+ const topMsgId = params?.messageThreadId;
649
+ const sendAs = params?.sendAs ? await this.getInputPeer(params.sendAs) : undefined;
650
+ const entities = entities_?.length > 0 ? entities_.map((v) => (0, _0_message_entity_js_1.messageEntityToTlObject)(v)) : undefined;
651
+ return await this.invoke(new functions.MessagesSendMessage({
652
+ peer,
653
+ randomId,
654
+ message,
655
+ noWebpage,
656
+ silent,
657
+ noforwards,
658
+ replyToMsgId,
659
+ topMsgId,
660
+ sendAs,
661
+ entities,
662
+ }));
663
+ }
613
664
  }
614
665
  exports.Client = Client;
@@ -0,0 +1,90 @@
1
+ import * as types from "../tl/2_types.js";
2
+ export declare enum MessageEntityType {
3
+ Mention = "mention",
4
+ Hashtag = "hashtag",
5
+ BotCommand = "bot_command",
6
+ URL = "url",
7
+ Email = "email",
8
+ Bold = "bold",
9
+ Italic = "italic",
10
+ Code = "code",
11
+ Pre = "pre",
12
+ TextURL = "text_url",
13
+ MentionName = "mention_name",
14
+ Cashtag = "cashtag",
15
+ Phone = "phone",
16
+ Underline = "underline",
17
+ Strike = "strike",
18
+ Blockquote = "blockquote",
19
+ BankCard = "bank_card",
20
+ Spoiler = "spoiler",
21
+ CustomEmoji = "custom_emoji"
22
+ }
23
+ export interface MessageEntityBase {
24
+ offset: number;
25
+ length: number;
26
+ }
27
+ export interface MessageEntityMention extends MessageEntityBase {
28
+ type: MessageEntityType.Mention;
29
+ }
30
+ export interface MessageEntityHashtag extends MessageEntityBase {
31
+ type: MessageEntityType.Hashtag;
32
+ }
33
+ export interface MessageEntityBotCommand extends MessageEntityBase {
34
+ type: MessageEntityType.BotCommand;
35
+ }
36
+ export interface MessageEntityURL extends MessageEntityBase {
37
+ type: MessageEntityType.URL;
38
+ }
39
+ export interface MessageEntityEmailAddress extends MessageEntityBase {
40
+ type: MessageEntityType.Email;
41
+ }
42
+ export interface MessageEntityBold extends MessageEntityBase {
43
+ type: MessageEntityType.Bold;
44
+ }
45
+ export interface MessageEntityItalic extends MessageEntityBase {
46
+ type: MessageEntityType.Italic;
47
+ }
48
+ export interface MessageEntityPre extends MessageEntityBase {
49
+ type: MessageEntityType.Pre;
50
+ language: string;
51
+ }
52
+ export interface MessageEntityCode extends MessageEntityBase {
53
+ type: MessageEntityType.Code;
54
+ }
55
+ export interface MessageEntityTextURL extends MessageEntityBase {
56
+ type: MessageEntityType.TextURL;
57
+ url: string;
58
+ }
59
+ export interface MessageEntityMentionName extends MessageEntityBase {
60
+ type: MessageEntityType.MentionName;
61
+ userId: number;
62
+ }
63
+ export interface MessageEntityCashtag extends MessageEntityBase {
64
+ type: MessageEntityType.Cashtag;
65
+ }
66
+ export interface MessageEntityPhone extends MessageEntityBase {
67
+ type: MessageEntityType.Phone;
68
+ }
69
+ export interface MessageEntityUnderline extends MessageEntityBase {
70
+ type: MessageEntityType.Underline;
71
+ }
72
+ export interface MessageEntityStrike extends MessageEntityBase {
73
+ type: MessageEntityType.Strike;
74
+ }
75
+ export interface MessageEntityBlockquote extends MessageEntityBase {
76
+ type: MessageEntityType.Blockquote;
77
+ }
78
+ export interface MessageEntityBankCard extends MessageEntityBase {
79
+ type: MessageEntityType.BankCard;
80
+ }
81
+ export interface MessageEntitySpoiler extends MessageEntityBase {
82
+ type: MessageEntityType.Spoiler;
83
+ }
84
+ export interface MessageEntityCustomEmoji extends MessageEntityBase {
85
+ type: MessageEntityType.CustomEmoji;
86
+ documentId: bigint;
87
+ }
88
+ export type MessageEntity = MessageEntityMention | MessageEntityHashtag | MessageEntityBotCommand | MessageEntityURL | MessageEntityEmailAddress | MessageEntityBold | MessageEntityItalic | MessageEntityCode | MessageEntityPre | MessageEntityTextURL | MessageEntityMentionName | MessageEntityCashtag | MessageEntityPhone | MessageEntityUnderline | MessageEntityStrike | MessageEntityBlockquote | MessageEntityBankCard | MessageEntitySpoiler | MessageEntityCustomEmoji;
89
+ export declare function constructMessageEntity(obj: types.TypeMessageEntity): MessageEntity | null;
90
+ export declare function messageEntityToTlObject(entity: MessageEntity): types.MessageEntityMention | types.MessageEntityHashtag | types.MessageEntityBotCommand | types.MessageEntityURL | types.MessageEntityEmail | types.MessageEntityBold | types.MessageEntityItalic | types.MessageEntityCode | types.MessageEntityPre | types.MessageEntityTextURL | types.MessageEntityMentionName | types.MessageEntityPhone | types.MessageEntityCashtag | types.MessageEntityUnderline | types.MessageEntityStrike | types.MessageEntityBlockquote | types.MessageEntityBankCard | types.MessageEntitySpoiler | types.MessageEntityCustomEmoji;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.messageEntityToTlObject = exports.constructMessageEntity = exports.MessageEntityType = void 0;
27
+ const types = __importStar(require("../tl/2_types.js"));
28
+ var MessageEntityType;
29
+ (function (MessageEntityType) {
30
+ MessageEntityType["Mention"] = "mention";
31
+ MessageEntityType["Hashtag"] = "hashtag";
32
+ MessageEntityType["BotCommand"] = "bot_command";
33
+ MessageEntityType["URL"] = "url";
34
+ MessageEntityType["Email"] = "email";
35
+ MessageEntityType["Bold"] = "bold";
36
+ MessageEntityType["Italic"] = "italic";
37
+ MessageEntityType["Code"] = "code";
38
+ MessageEntityType["Pre"] = "pre";
39
+ MessageEntityType["TextURL"] = "text_url";
40
+ MessageEntityType["MentionName"] = "mention_name";
41
+ MessageEntityType["Cashtag"] = "cashtag";
42
+ MessageEntityType["Phone"] = "phone";
43
+ MessageEntityType["Underline"] = "underline";
44
+ MessageEntityType["Strike"] = "strike";
45
+ MessageEntityType["Blockquote"] = "blockquote";
46
+ MessageEntityType["BankCard"] = "bank_card";
47
+ MessageEntityType["Spoiler"] = "spoiler";
48
+ MessageEntityType["CustomEmoji"] = "custom_emoji";
49
+ })(MessageEntityType = exports.MessageEntityType || (exports.MessageEntityType = {}));
50
+ function constructMessageEntity(obj) {
51
+ if (obj instanceof types.MessageEntityMention) {
52
+ return { type: MessageEntityType.Mention, offset: obj.offset, length: obj.length };
53
+ }
54
+ else if (obj instanceof types.MessageEntityHashtag) {
55
+ return { type: MessageEntityType.Hashtag, offset: obj.offset, length: obj.length };
56
+ }
57
+ else if (obj instanceof types.MessageEntityBotCommand) {
58
+ return { type: MessageEntityType.BotCommand, offset: obj.offset, length: obj.length };
59
+ }
60
+ else if (obj instanceof types.MessageEntityURL) {
61
+ return { type: MessageEntityType.URL, offset: obj.offset, length: obj.length };
62
+ }
63
+ else if (obj instanceof types.MessageEntityEmail) {
64
+ return { type: MessageEntityType.Email, offset: obj.offset, length: obj.length };
65
+ }
66
+ else if (obj instanceof types.MessageEntityBold) {
67
+ return { type: MessageEntityType.Bold, offset: obj.offset, length: obj.length };
68
+ }
69
+ else if (obj instanceof types.MessageEntityItalic) {
70
+ return { type: MessageEntityType.Italic, offset: obj.offset, length: obj.length };
71
+ }
72
+ else if (obj instanceof types.MessageEntityCode) {
73
+ return { type: MessageEntityType.Code, offset: obj.offset, length: obj.length };
74
+ }
75
+ else if (obj instanceof types.MessageEntityPre) {
76
+ return { type: MessageEntityType.Pre, offset: obj.offset, length: obj.length, language: obj.language };
77
+ }
78
+ else if (obj instanceof types.MessageEntityTextURL) {
79
+ return { type: MessageEntityType.TextURL, offset: obj.offset, length: obj.length, url: obj.url };
80
+ }
81
+ else if (obj instanceof types.MessageEntityMentionName) {
82
+ return { type: MessageEntityType.MentionName, offset: obj.offset, length: obj.length, userId: Number(obj.userId) };
83
+ }
84
+ else if (obj instanceof types.MessageEntityCashtag) {
85
+ return { type: MessageEntityType.Cashtag, offset: obj.offset, length: obj.length };
86
+ }
87
+ else if (obj instanceof types.MessageEntityPhone) {
88
+ return { type: MessageEntityType.Phone, offset: obj.offset, length: obj.length };
89
+ }
90
+ else if (obj instanceof types.MessageEntityUnderline) {
91
+ return { type: MessageEntityType.Underline, offset: obj.offset, length: obj.length };
92
+ }
93
+ else if (obj instanceof types.MessageEntityStrike) {
94
+ return { type: MessageEntityType.Strike, offset: obj.offset, length: obj.length };
95
+ }
96
+ else if (obj instanceof types.MessageEntityBlockquote) {
97
+ return { type: MessageEntityType.Blockquote, offset: obj.offset, length: obj.length };
98
+ }
99
+ else if (obj instanceof types.MessageEntityBankCard) {
100
+ return { type: MessageEntityType.BankCard, offset: obj.offset, length: obj.length };
101
+ }
102
+ else if (obj instanceof types.MessageEntitySpoiler) {
103
+ return { type: MessageEntityType.Spoiler, offset: obj.offset, length: obj.length };
104
+ }
105
+ else if (obj instanceof types.MessageEntityCustomEmoji) {
106
+ return { type: MessageEntityType.CustomEmoji, offset: obj.offset, length: obj.length, documentId: obj.documentId };
107
+ }
108
+ else {
109
+ return null;
110
+ }
111
+ }
112
+ exports.constructMessageEntity = constructMessageEntity;
113
+ function messageEntityToTlObject(entity) {
114
+ const { offset, length } = entity;
115
+ switch (entity.type) {
116
+ case MessageEntityType.Mention:
117
+ return new types.MessageEntityMention({ offset, length });
118
+ case MessageEntityType.Hashtag:
119
+ return new types.MessageEntityHashtag({ offset, length });
120
+ case MessageEntityType.BotCommand:
121
+ return new types.MessageEntityBotCommand({ offset, length });
122
+ case MessageEntityType.URL:
123
+ return new types.MessageEntityURL({ offset, length });
124
+ case MessageEntityType.Email:
125
+ return new types.MessageEntityEmail({ offset, length });
126
+ case MessageEntityType.Bold:
127
+ return new types.MessageEntityBold({ offset, length });
128
+ case MessageEntityType.Italic:
129
+ return new types.MessageEntityItalic({ offset, length });
130
+ case MessageEntityType.Code:
131
+ return new types.MessageEntityCode({ offset, length });
132
+ case MessageEntityType.Pre:
133
+ return new types.MessageEntityPre({ offset, length, language: entity.language });
134
+ case MessageEntityType.TextURL:
135
+ return new types.MessageEntityTextURL({ offset, length, url: entity.url });
136
+ case MessageEntityType.MentionName:
137
+ return new types.MessageEntityMentionName({ offset, length, userId: BigInt(entity.userId) });
138
+ case MessageEntityType.Cashtag:
139
+ return new types.MessageEntityCashtag({ offset, length });
140
+ case MessageEntityType.Phone:
141
+ return new types.MessageEntityPhone({ offset, length });
142
+ case MessageEntityType.Underline:
143
+ return new types.MessageEntityUnderline({ offset, length });
144
+ case MessageEntityType.Strike:
145
+ return new types.MessageEntityStrike({ offset, length });
146
+ case MessageEntityType.Blockquote:
147
+ return new types.MessageEntityBlockquote({ offset, length });
148
+ case MessageEntityType.BankCard:
149
+ return new types.MessageEntityBankCard({ offset, length });
150
+ case MessageEntityType.Spoiler:
151
+ return new types.MessageEntitySpoiler({ offset, length });
152
+ case MessageEntityType.CustomEmoji:
153
+ return new types.MessageEntityCustomEmoji({ offset, length, documentId: entity.documentId });
154
+ }
155
+ }
156
+ exports.messageEntityToTlObject = messageEntityToTlObject;
@@ -0,0 +1,2 @@
1
+ import { MessageEntity } from "../types/0_message_entity.js";
2
+ export declare function parseHtml(html: string): readonly [string, MessageEntity[]];
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseHtml = void 0;
4
+ const deps_js_1 = require("../deps.js");
5
+ const _0_message_entity_js_1 = require("../types/0_message_entity.js");
6
+ function parseHtml(html) {
7
+ let text = "";
8
+ const entities = new Array();
9
+ const queue = new Array();
10
+ const parser = new deps_js_1.Parser({
11
+ onopentag(name, attribs) {
12
+ switch (name) {
13
+ case "b":
14
+ case "strong":
15
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Bold, offset: text.length, length: 0 });
16
+ break;
17
+ case "em":
18
+ case "i":
19
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Italic, offset: text.length, length: 0 });
20
+ break;
21
+ case "code":
22
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Code, offset: text.length, length: 0 });
23
+ break;
24
+ case "pre": {
25
+ const language = attribs.language ?? "";
26
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Pre, offset: text.length, length: 0, language });
27
+ break;
28
+ }
29
+ case "a": {
30
+ const url = attribs.href;
31
+ if (!url) {
32
+ throw new Error("Missing attribute href");
33
+ }
34
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.TextURL, offset: text.length, length: 0, url });
35
+ break;
36
+ }
37
+ case "ins":
38
+ case "u":
39
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Underline, offset: text.length, length: 0 });
40
+ break;
41
+ case "del":
42
+ case "strike":
43
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Strike, offset: text.length, length: 0 });
44
+ break;
45
+ case "span":
46
+ if (attribs.class != "tg-spoiler") {
47
+ throw new Error("The class attribute must be tg-spoiler");
48
+ }
49
+ // falls through
50
+ case "tg-spoiler":
51
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Spoiler, offset: text.length, length: 0 });
52
+ break;
53
+ case "tg-emoji":
54
+ if (!attribs["emoji-id"]) {
55
+ throw new Error("Missing attribute emoji-id");
56
+ }
57
+ queue.push({ type: _0_message_entity_js_1.MessageEntityType.Spoiler, offset: text.length, length: 0 });
58
+ }
59
+ },
60
+ ontext(data) {
61
+ text += data;
62
+ const lastItem = queue[queue.length - 1];
63
+ if (lastItem) {
64
+ lastItem.length += data.length;
65
+ }
66
+ },
67
+ onclosetag() {
68
+ const lastItem = queue.pop();
69
+ if (lastItem) {
70
+ entities.push(lastItem);
71
+ }
72
+ },
73
+ });
74
+ parser.write(html);
75
+ parser.end();
76
+ return [text, entities];
77
+ }
78
+ exports.parseHtml = parseHtml;