halbot 1989.6.29 → 1989.6.30

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "halbot",
3
3
  "description": "Just another ChatGPT/Bing Telegram bob.",
4
- "version": "1989.6.29",
4
+ "version": "1989.6.30",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/Leask/halbot",
7
7
  "type": "module",
@@ -33,6 +33,6 @@
33
33
  "@google-cloud/text-to-speech": "^4.2.1",
34
34
  "@waylaidwanderer/chatgpt-api": "^1.32.10",
35
35
  "telegraf": "^4.12.2",
36
- "utilitas": "^1992.4.38"
36
+ "utilitas": "^1992.4.39"
37
37
  }
38
38
  }
package/skills/ai.mjs CHANGED
@@ -3,75 +3,65 @@ import { utilitas } from 'utilitas';
3
3
  const onProgress = { onProgress: true };
4
4
  const [YOU, BOT, LN2] = ['😸 You:', '🤖️ ', '\n\n'];
5
5
  const [joinL1, joinL2] = [a => a.join('${LN2}---${LN2}'), a => a.join(LN2)];
6
+ const enrich = name => name === 'Bing' ? `${name} (Sydney)` : name;
6
7
 
7
- const action = async (bot) => {
8
- bot.use(async (ctx, next) => {
9
- if (ctx.end || !ctx.text) { return await next(); }
10
- const [multiAi, msgs, tts, pms, extra]
11
- = [ctx.session.ai.size > 1, {}, {}, [], {}];
12
- let [lastMsg, lastSent] = ['', 0];
13
- const packMsg = (options) => {
14
- const packed = [...ctx.stt ? joinL2([YOU, ctx.stt]) : []];
15
- const source = options?.tts ? tts : msgs;
16
- for (let name of ctx.session.ai.size ? ctx.session.ai : [ctx.firstAi]) {
17
- const defaultAi = name === ctx.firstAi;
18
- packed.push(joinL2([
19
- ...multiAi || !defaultAi || ctx.stt ? [`${BOT}${name}:`] : [],
20
- options?.onProgress ? (
21
- source[name] ? `${source[name].trim()} |` : '...'
22
- ) : (source[name] || ''),
23
- ]));
24
- }
25
- return joinL1(packed);
26
- };
27
- const ok = async (options) => {
28
- const [curTime, curMsg] = [Date.now(), packMsg(options)];
29
- if (options?.onProgress && (
30
- curTime - lastSent < ctx.limit || lastMsg === curMsg
31
- )) { return; }
32
- [lastSent, lastMsg] = [curTime, curMsg];
33
- return await ctx.ok(curMsg, { ...options || {}, ...extra });
34
- };
35
- await ok(onProgress);
8
+ const action = async (ctx, next) => {
9
+ if (ctx.end || !ctx.text) { return await next(); }
10
+ const [multiAi, msgs, tts, pms, extra]
11
+ = [ctx.session.ai.size > 1, {}, {}, [], {}];
12
+ let [lastMsg, lastSent] = ['', 0];
13
+ const packMsg = (options) => {
14
+ const packed = [...ctx.stt ? joinL2([YOU, ctx.stt]) : []];
15
+ const source = options?.tts ? tts : msgs;
36
16
  for (let name of ctx.session.ai.size ? ctx.session.ai : [ctx.firstAi]) {
37
- if (utilitas.insensitiveCompare('/clear', ctx.text)) {
38
- bot.ai[name].clear(ctx.chatId);
39
- ctx.text = bot.hello;
40
- }
41
- pms.push((async () => {
42
- try {
43
- const resp = await bot.ai[name].send(
44
- ctx.text, { session: ctx.chatId },
45
- tkn => {
46
- msgs[name] = `${(msgs[name] || '')}${tkn}`;
47
- ok(onProgress);
48
- }
49
- );
50
- msgs[name] = ctx.session.raw ? resp.response : resp.responseRendered;
51
- tts[name] = resp.spokenText;
52
- if (resp.suggestedResponses) {
53
- extra.reply_markup = {
54
- inline_keyboard: resp.suggestedResponses.map(
55
- text => [{
56
- text, callback_data: JSON.stringify({ text: `/bing ${text}` })
57
- }]
58
- )
59
- };
60
- // button debug
61
- // console.log(JSON.stringify(extra.reply_markup, null, 2));
62
- }
63
- } catch (err) {
64
- msgs[name] = `[ERROR] ${err?.message || err}`;
65
- tts[name] = msgs[name];
66
- utilitas.log(err);
67
- }
68
- })());
17
+ const defaultAi = name === ctx.firstAi;
18
+ packed.push(joinL2([
19
+ ...multiAi || !defaultAi || ctx.stt ? [`${BOT}${enrich(name)}:`] : [],
20
+ options?.onProgress ? (
21
+ source[name] ? `${source[name].trim()} |` : '...'
22
+ ) : (source[name] || ''),
23
+ ]));
69
24
  }
70
- await Promise.all(pms);
71
- await ok();
72
- ctx.tts = packMsg({ tts: true });
73
- await next();
74
- });
25
+ return joinL1(packed);
26
+ };
27
+ const ok = async (options) => {
28
+ const [curTime, curMsg] = [Date.now(), packMsg(options)];
29
+ if (options?.onProgress && (
30
+ curTime - lastSent < ctx.limit || lastMsg === curMsg
31
+ )) { return; }
32
+ [lastSent, lastMsg] = [curTime, curMsg];
33
+ return await ctx.ok(curMsg, { ...options || {}, ...extra });
34
+ };
35
+ await ok(onProgress);
36
+ for (let name of ctx.session.ai.size ? ctx.session.ai : [ctx.firstAi]) {
37
+ if (utilitas.insensitiveCompare('/clear', ctx.text)) {
38
+ ctx._.ai[name].clear(ctx.chatId);
39
+ ctx.text = ctx._.hello;
40
+ }
41
+ pms.push((async () => {
42
+ try {
43
+ const resp = await ctx._.ai[name].send(
44
+ ctx.text, { session: ctx.chatId }, tkn => {
45
+ msgs[name] = `${(msgs[name] || '')}${tkn}`;
46
+ ok(onProgress);
47
+ }
48
+ );
49
+ msgs[name] = ctx.session.raw ? resp.response : resp.responseRendered;
50
+ tts[name] = resp.spokenText;
51
+ extra.textButtons = resp?.suggestedResponses?.map?.(text => ({
52
+ text, data: `/bing ${text}`
53
+ }));
54
+ } catch (err) {
55
+ msgs[name] = `[ERROR] ${err?.message || err}`;
56
+ tts[name] = msgs[name];
57
+ utilitas.log(err);
58
+ }
59
+ })());
60
+ }
61
+ await Promise.all(pms);
62
+ await ok();
63
+ ctx.tts = packMsg({ tts: true });
64
+ await next();
75
65
  };
76
66
 
77
67
  export const { run, priority, func } = {
package/skills/cmd.mjs CHANGED
@@ -2,28 +2,26 @@ import { utilitas } from 'utilitas';
2
2
 
3
3
  const matchReg = /^\/([^\ ]*)(.*)$/ig;
4
4
 
5
- const action = async (bot) => {
6
- bot.use(async (ctx, next) => {
7
- if (ctx.end || !ctx.text) { return await next(); }
8
- ctx.session.ai || (ctx.session.ai = new Set());
9
- const curAi = new Set();
10
- ctx.cmd = ctx.text.split('\n')?.[0]?.replace(matchReg, '$1');
11
- let catched;
12
- switch (ctx.cmd) {
13
- case 'raw': ctx.session.raw = true; catched = true; break;
14
- case 'render': ctx.session.raw = false; catched = true; break;
5
+ const action = async (ctx, next) => {
6
+ if (ctx.end || !ctx.text) { return await next(); }
7
+ ctx.session.ai || (ctx.session.ai = new Set());
8
+ const curAi = new Set();
9
+ ctx.cmd = ctx.text.split('\n')?.[0]?.replace(matchReg, '$1');
10
+ let catched;
11
+ switch (ctx.cmd) {
12
+ case 'raw': ctx.session.raw = true; catched = true; break;
13
+ case 'render': ctx.session.raw = false; catched = true; break;
14
+ }
15
+ for (let name in ctx._.ai) {
16
+ ctx.firstAi || (ctx.firstAi = name);
17
+ if (utilitas.insensitiveCompare(ctx.cmd, name) || ctx.cmd === '*') {
18
+ curAi.add(name);
19
+ catched = true;
15
20
  }
16
- for (let name in bot.ai) {
17
- ctx.firstAi || (ctx.firstAi = name);
18
- if (utilitas.insensitiveCompare(ctx.cmd, name) || ctx.cmd === '*') {
19
- curAi.add(name);
20
- catched = true;
21
- }
22
- }
23
- curAi.size && (ctx.session.ai = curAi);
24
- catched && (ctx.text = ctx.text.replace(matchReg, '$2').trim() || bot.hello);
25
- await next();
26
- });
21
+ }
22
+ curAi.size && (ctx.session.ai = curAi);
23
+ catched && (ctx.text = ctx.text.replace(matchReg, '$2').trim() || ctx._.hello);
24
+ await next();
27
25
  };
28
26
 
29
27
  export const { run, priority, func } = {
@@ -5,31 +5,29 @@ const getPolishPrompt = () => // https://github.com/yetone/bob-plugin-openai-pol
5
5
  'Revise the following text to make them more clear, concise, and coherent.'
6
6
  + ' Please note that you need to list the changes and briefly explain why: ';
7
7
 
8
- const action = async (bot) => {
9
- bot.use(async (ctx, next) => {
10
- if (ctx.end || !ctx.text) { return await next(); }
11
- switch (ctx.cmd) {
12
- case '2en':
13
- ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('English'));
14
- break;
15
- case '2zh':
16
- ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('Traditional Chinese'));
17
- break;
18
- case '2zht':
19
- ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('Traditional Chinese'));
20
- break;
21
- case '2zhs':
22
- ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('Simplified Chinese'));
23
- break;
24
- case '2fr':
25
- ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('French'));
26
- break;
27
- case 'p':
28
- ctx.text = ctx.text.replace(`/${ctx.cmd}`, getPolishPrompt());
29
- break;
30
- }
31
- await next();
32
- });
8
+ const action = async (ctx, next) => {
9
+ if (ctx.end || !ctx.text) { return await next(); }
10
+ switch (ctx.cmd) {
11
+ case '2en':
12
+ ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('English'));
13
+ break;
14
+ case '2zh':
15
+ ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('Traditional Chinese'));
16
+ break;
17
+ case '2zht':
18
+ ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('Traditional Chinese'));
19
+ break;
20
+ case '2zhs':
21
+ ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('Simplified Chinese'));
22
+ break;
23
+ case '2fr':
24
+ ctx.text = ctx.text.replace(`/${ctx.cmd}`, getTranslatePrompt('French'));
25
+ break;
26
+ case 'p':
27
+ ctx.text = ctx.text.replace(`/${ctx.cmd}`, getPolishPrompt());
28
+ break;
29
+ }
30
+ await next();
33
31
  };
34
32
 
35
33
  export const { run, priority, func } = {