rubika 1.0.4 → 1.0.6
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.
- package/package.json +1 -1
- package/src/methods/chat/index.ts +4 -1
- package/src/methods/index.ts +14 -0
- package/src/types/utils.ts +29 -4
- package/src/utils/parser.ts +158 -112
- package/src/utils.ts +3 -2
package/package.json
CHANGED
package/src/methods/index.ts
CHANGED
|
@@ -170,6 +170,20 @@ export default class Methods {
|
|
|
170
170
|
return Chat.getChat.apply(this, args);
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
async banChatMember(
|
|
174
|
+
this: Bot,
|
|
175
|
+
...args: Parameters<typeof Chat.banChatMember>
|
|
176
|
+
): Promise<any> {
|
|
177
|
+
return Chat.banChatMember.apply(this, args);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async unbanChatMember(
|
|
181
|
+
this: Bot,
|
|
182
|
+
...args: Parameters<typeof Chat.unbanChatMember>
|
|
183
|
+
): Promise<any> {
|
|
184
|
+
return Chat.unbanChatMember.apply(this, args);
|
|
185
|
+
}
|
|
186
|
+
|
|
173
187
|
// utilities
|
|
174
188
|
async start(
|
|
175
189
|
this: Bot,
|
package/src/types/utils.ts
CHANGED
|
@@ -1,9 +1,34 @@
|
|
|
1
|
-
export type
|
|
2
|
-
|
|
1
|
+
export type MarkdownType =
|
|
2
|
+
| "Quote"
|
|
3
|
+
| "Pre"
|
|
4
|
+
| "Bold"
|
|
5
|
+
| "Mono"
|
|
6
|
+
| "Italic"
|
|
7
|
+
| "Underline"
|
|
8
|
+
| "Strike"
|
|
9
|
+
| "Spoiler"
|
|
10
|
+
| "Link"
|
|
11
|
+
| "MentionText";
|
|
12
|
+
|
|
13
|
+
export interface MetaDataPart {
|
|
14
|
+
type: MarkdownType;
|
|
3
15
|
from_index: number;
|
|
4
16
|
length: number;
|
|
5
17
|
language?: string;
|
|
18
|
+
link_url?: string;
|
|
19
|
+
link?: {
|
|
20
|
+
type: string;
|
|
21
|
+
hyperlink_data?: { url: string };
|
|
22
|
+
};
|
|
6
23
|
mention_text_object_guid?: string;
|
|
24
|
+
mention_text_user_id?: string;
|
|
7
25
|
mention_text_object_type?: string;
|
|
8
|
-
|
|
9
|
-
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
export interface MetadataResult {
|
|
30
|
+
text: string;
|
|
31
|
+
metadata?: {
|
|
32
|
+
meta_data_parts: MetaDataPart[];
|
|
33
|
+
};
|
|
34
|
+
}
|
package/src/utils/parser.ts
CHANGED
|
@@ -1,127 +1,173 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
metadata?: { meta_data_parts: MarkdownEntity[] };
|
|
20
|
-
} {
|
|
21
|
-
let entities: MarkdownEntity[] = [];
|
|
22
|
-
let match: RegExpMatchArray | null;
|
|
23
|
-
let remainingText = text;
|
|
24
|
-
let parsedTextParts: string[] = [];
|
|
25
|
-
let offset = 0;
|
|
1
|
+
import { MarkdownType, MetaDataPart, MetadataResult } from "../types/utils";
|
|
2
|
+
|
|
3
|
+
const MENTION_PREFIX_TYPES: Record<string, string> = {
|
|
4
|
+
u: "User",
|
|
5
|
+
g: "Group",
|
|
6
|
+
c: "Channel",
|
|
7
|
+
b: "Bot",
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
function buildUtf16PrefixLengths(text: string): number[] {
|
|
11
|
+
const prefixLengths: number[] = [0];
|
|
12
|
+
let total = 0;
|
|
13
|
+
for (const char of text) {
|
|
14
|
+
total += char.codePointAt(0)! > 0xffff ? 2 : 1;
|
|
15
|
+
prefixLengths.push(total);
|
|
16
|
+
}
|
|
17
|
+
return prefixLengths;
|
|
18
|
+
}
|
|
26
19
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
20
|
+
const MARKDOWN_RE =
|
|
21
|
+
/(?:^(?:> ?[^\n]*\n?)+)|```([\s\S]*?)```|\*\*([^\n*]+?)\*\*|`([^\n`]+?)`|__([^\n_]+?)__|--([^\n-]+?)--|~~([^\n~]+?)~~|\|\|([^\n|]+?)\|\||\[([^\]]+?)\]\((\S+)\)/gms;
|
|
22
|
+
|
|
23
|
+
const MARKDOWN_TYPE_SEQUENCE: [string, [MarkdownType, number | null]][] = [
|
|
24
|
+
[">", ["Quote", null]],
|
|
25
|
+
["```", ["Pre", 1]],
|
|
26
|
+
["**", ["Bold", 2]],
|
|
27
|
+
["`", ["Mono", 3]],
|
|
28
|
+
["__", ["Italic", 4]],
|
|
29
|
+
["--", ["Underline", 5]],
|
|
30
|
+
["~~", ["Strike", 6]],
|
|
31
|
+
["||", ["Spoiler", 7]],
|
|
32
|
+
["[", ["Link", 8]],
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
export default class Markdown {
|
|
36
|
+
static toMetadata(text: string): MetadataResult {
|
|
37
|
+
const metaDataParts: MetaDataPart[] = [];
|
|
38
|
+
let currentText = text;
|
|
39
|
+
let offset = 0;
|
|
40
|
+
let charOffset = 0;
|
|
41
|
+
const utf16Prefix = buildUtf16PrefixLengths(text);
|
|
42
|
+
|
|
43
|
+
let match: RegExpExecArray | null;
|
|
44
|
+
const globalRegex = new RegExp(MARKDOWN_RE, "gms");
|
|
45
|
+
|
|
46
|
+
while ((match = globalRegex.exec(text)) !== null) {
|
|
47
|
+
const group = match[0];
|
|
48
|
+
const start = match.index;
|
|
49
|
+
const end = start + group.length;
|
|
50
|
+
const adjustedStart = utf16Prefix[start] - offset;
|
|
51
|
+
const adjustedCharStart = start - charOffset;
|
|
52
|
+
|
|
53
|
+
for (const [prefix, [mdType, groupIdx]] of MARKDOWN_TYPE_SEQUENCE) {
|
|
54
|
+
if (group.startsWith(prefix)) {
|
|
55
|
+
let content = "";
|
|
56
|
+
let contentLength = 0;
|
|
57
|
+
let charContentLength = 0;
|
|
58
|
+
|
|
59
|
+
if (mdType === "Quote") {
|
|
60
|
+
const quoteLines = group.split("\n");
|
|
61
|
+
const contentLines = quoteLines.map((line) => {
|
|
62
|
+
if (line.startsWith("> ")) return line.slice(2);
|
|
63
|
+
if (line.startsWith(">")) return line.slice(1);
|
|
64
|
+
return line;
|
|
65
|
+
});
|
|
66
|
+
content = contentLines.join("\n");
|
|
67
|
+
charContentLength = content.length;
|
|
68
|
+
contentLength = Markdown.getUtf16Length(content);
|
|
69
|
+
|
|
70
|
+
const innerMeta = this.toMetadata(content);
|
|
71
|
+
content = innerMeta.text;
|
|
72
|
+
contentLength = Markdown.getUtf16Length(content);
|
|
73
|
+
charContentLength = content.length;
|
|
74
|
+
|
|
75
|
+
if (innerMeta.metadata) {
|
|
76
|
+
for (const part of innerMeta.metadata.meta_data_parts) {
|
|
77
|
+
part.from_index += adjustedStart;
|
|
78
|
+
metaDataParts.push(part);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
if (groupIdx !== null && match[groupIdx] !== undefined) {
|
|
83
|
+
content = match[groupIdx] || "";
|
|
84
|
+
const groupStart = match.index + group.indexOf(content);
|
|
85
|
+
const groupEnd = groupStart + content.length;
|
|
86
|
+
contentLength = utf16Prefix[groupEnd] - utf16Prefix[groupStart];
|
|
87
|
+
charContentLength = content.length;
|
|
88
|
+
|
|
89
|
+
if (mdType !== "Pre" && mdType !== "Link") {
|
|
90
|
+
const innerMeta = this.toMetadata(content);
|
|
91
|
+
content = innerMeta.text;
|
|
92
|
+
contentLength = Markdown.getUtf16Length(content);
|
|
93
|
+
charContentLength = content.length;
|
|
94
|
+
|
|
95
|
+
if (innerMeta.metadata) {
|
|
96
|
+
for (const part of innerMeta.metadata.meta_data_parts) {
|
|
97
|
+
part.from_index += adjustedStart;
|
|
98
|
+
metaDataParts.push(part);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
content = "";
|
|
104
|
+
contentLength = 0;
|
|
105
|
+
charContentLength = 0;
|
|
106
|
+
}
|
|
78
107
|
}
|
|
79
108
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
length: label.length,
|
|
109
|
+
const metaDataPart: MetaDataPart = {
|
|
110
|
+
type: mdType,
|
|
111
|
+
from_index: adjustedStart,
|
|
112
|
+
length: contentLength,
|
|
85
113
|
};
|
|
86
114
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
115
|
+
// تنظیمات بر اساس نوع
|
|
116
|
+
if (mdType === "Pre") {
|
|
117
|
+
const lines = content.split("\n", 2);
|
|
118
|
+
const language =
|
|
119
|
+
lines.length > 1 && lines[0].trim() ? lines[0].trim() : "";
|
|
120
|
+
metaDataPart.language = language;
|
|
121
|
+
if (language) {
|
|
122
|
+
content = lines.slice(1).join("\n");
|
|
123
|
+
contentLength = Markdown.getUtf16Length(content);
|
|
124
|
+
charContentLength = content.length;
|
|
125
|
+
}
|
|
126
|
+
} else if (mdType === "Link") {
|
|
127
|
+
const url = match[9];
|
|
128
|
+
const mentionType = MENTION_PREFIX_TYPES[url?.[0]] || "hyperlink";
|
|
129
|
+
|
|
130
|
+
if (mentionType === "hyperlink") {
|
|
131
|
+
metaDataPart.link_url = url;
|
|
132
|
+
metaDataPart.link = {
|
|
133
|
+
type: mentionType,
|
|
134
|
+
hyperlink_data: { url },
|
|
135
|
+
};
|
|
136
|
+
} else {
|
|
137
|
+
metaDataPart.type = "MentionText";
|
|
138
|
+
metaDataPart.mention_text_object_guid = url;
|
|
139
|
+
metaDataPart.mention_text_user_id = url;
|
|
140
|
+
metaDataPart.mention_text_object_type = mentionType;
|
|
141
|
+
}
|
|
92
142
|
}
|
|
93
143
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
144
|
+
metaDataParts.push(metaDataPart);
|
|
145
|
+
currentText =
|
|
146
|
+
currentText.slice(0, adjustedCharStart) +
|
|
147
|
+
content +
|
|
148
|
+
currentText.slice(end - charOffset);
|
|
97
149
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
150
|
+
const markupLength = utf16Prefix[end] - utf16Prefix[start];
|
|
151
|
+
const charMarkupLength = end - start;
|
|
152
|
+
offset += markupLength - contentLength;
|
|
153
|
+
charOffset += charMarkupLength - charContentLength;
|
|
102
154
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
resultText = text;
|
|
107
|
-
entities.splice(0, entities.length);
|
|
108
|
-
}
|
|
109
|
-
if (!entities.length) {
|
|
110
|
-
resultText = resultText.trim();
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
111
158
|
}
|
|
112
159
|
|
|
113
|
-
|
|
114
|
-
text:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
160
|
+
return {
|
|
161
|
+
text: currentText.trim(),
|
|
162
|
+
...(metaDataParts.length > 0 && {
|
|
163
|
+
metadata: { meta_data_parts: metaDataParts },
|
|
164
|
+
}),
|
|
118
165
|
};
|
|
166
|
+
}
|
|
119
167
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
168
|
+
static getUtf16Length(str: string): number {
|
|
169
|
+
return str.split("").reduce((len, char) => {
|
|
170
|
+
return len + (char.codePointAt(0)! > 0xffff ? 2 : 1);
|
|
171
|
+
}, 0);
|
|
124
172
|
}
|
|
125
173
|
}
|
|
126
|
-
|
|
127
|
-
export default Markdown;
|
package/src/utils.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
class Utils {
|
|
2
|
-
static
|
|
2
|
+
static Mono = (text: string): string => "`" + text.trim() + "`";
|
|
3
|
+
static Pre = (text: string): string => "```" + text.trim() + "```";
|
|
3
4
|
static Bold = (text: string): string => `**${text.trim()}**`;
|
|
4
5
|
static Italic = (text: string): string => `__${text.trim()}__`;
|
|
5
6
|
static Spoiler = (text: string): string => `||${text.trim()}||`;
|
|
6
7
|
static Strike = (text: string): string => `~~${text.trim()}~~`;
|
|
7
8
|
static Underline = (text: string): string => `--${text.trim()}--`;
|
|
8
|
-
static Quote = (text: string): string =>
|
|
9
|
+
static Quote = (text: string): string => `>${text.trim()}>`;
|
|
9
10
|
static HyperLink = (text: string, link: string): string =>
|
|
10
11
|
`[${text.trim()}](${link.trim()})`;
|
|
11
12
|
}
|