Skip to content

Commit ac011b6

Browse files
committed
Add Bible and Say commands
1 parent 8fb60d0 commit ac011b6

8 files changed

Lines changed: 125 additions & 7 deletions

File tree

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ node_modules
22
dist
33
.wwebjs_auth
44
.wwebjs_cache
5+
.temp
56
*.log
67
*.env

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ node_modules
22
dist
33
.wwebjs_auth
44
.wwebjs_cache
5+
.temp
56
*.log
67
*.env

package-lock.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"dependencies": {
2626
"axios": "^1.10.0",
2727
"dotenv": "^17.2.0",
28+
"google-tts-api": "^2.0.2",
2829
"npmlog": "^7.0.1",
2930
"qrcode-terminal": "^0.12.0",
3031
"whatsapp-web.js": "^1.31.0"

src/commands/bible.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { Message } from "whatsapp-web.js";
2+
import axios from "axios";
3+
import log from "npmlog";
4+
5+
export const command = "bible";
6+
export const role = "user";
7+
8+
export default async function (msg: Message) {
9+
const query = msg.body.replace(/^bible\s+/i, "").trim();
10+
11+
if (!["--random", "--today", "--verse"].includes(query)) {
12+
await msg.reply(
13+
"Invalid argument. Please use one of the following:\n- bible --random\n- bible --today\n- bible --verse job 4L9"
14+
);
15+
return;
16+
}
17+
18+
let parameter: string;
19+
if (query === "--random") {
20+
parameter = "random";
21+
} else if (query === "--today") {
22+
parameter = "votd";
23+
} else {
24+
parameter = query.replace("--verse ", "").trim();
25+
}
26+
27+
try {
28+
const response = await axios.get(`https://labs.bible.org/api/`, {
29+
params: {
30+
passage: parameter,
31+
type: "json",
32+
},
33+
headers: {
34+
"User-Agent": "Mozilla/5.0",
35+
},
36+
});
37+
const data = response.data;
38+
39+
if (!Array.isArray(data) || data.length === 0) {
40+
await msg.reply("No verse found for your query.");
41+
return;
42+
}
43+
44+
const v = data[0];
45+
const verses = `${v.bookname} ${v.chapter}:${v.verse} - ${v.text.trim()}`;
46+
47+
await msg.reply(verses);
48+
} catch (error) {
49+
log.error("Command", "Error fetching bible:", error);
50+
await msg.reply("Failed to fetch bible.");
51+
}
52+
}

src/commands/run.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Message } from "whatsapp-web.js";
22
import log from "npmlog";
33
import { exec } from "child_process";
44
import util from "util";
5+
import fs from "fs/promises";
56

67
export const command = "run";
78
export const role = "admin";
@@ -26,27 +27,29 @@ export default async function (msg: Message) {
2627
let command: string;
2728
let tempFile: string;
2829

30+
const tempDir = "./.temp";
31+
await fs.mkdir(tempDir, { recursive: true });
32+
2933
if (lang === "python") {
30-
tempFile = `/tmp/run.py`;
34+
tempFile = `${tempDir}/run.py`;
3135
command = `python3 "${tempFile}"`;
3236
} else if (lang === "java") {
33-
tempFile = `/tmp/run.java`;
37+
tempFile = `${tempDir}/run.java`;
3438
command = `javac "${tempFile}" && java -cp /tmp Code`;
3539
} else if (lang === "c") {
36-
tempFile = `/tmp/run.c`;
40+
tempFile = `${tempDir}/run.c`;
3741
command = `gcc "${tempFile}" -o /tmp/code && /tmp/code`;
3842
} else if (lang === "js") {
39-
tempFile = `/tmp/code.js`;
43+
tempFile = `${tempDir}/code.js`;
4044
command = `node "${tempFile}"`;
4145
} else if (lang === "php") {
42-
tempFile = `/tmp/run.php`;
46+
tempFile = `${tempDir}/run.php`;
4347
command = `php "${tempFile}"`;
4448
} else {
4549
await msg.reply("Unsupported language.");
4650
return;
4751
}
4852

49-
const fs = await import("fs/promises");
5053
await fs.writeFile(tempFile, code);
5154

5255
const execPromise = util.promisify(exec);

src/commands/say.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Message, MessageMedia } from "whatsapp-web.js";
2+
import log from "npmlog";
3+
import * as GoogleTTS from "google-tts-api";
4+
import fs from "fs";
5+
import { client } from "../index";
6+
7+
export const command = "say";
8+
export const role = "user";
9+
10+
export default async function (msg: Message) {
11+
try {
12+
const query = msg.body.replace(/^say\s+/i, "").trim();
13+
if (!query) {
14+
await msg.reply("Please provide something to say.");
15+
return;
16+
}
17+
18+
const url = GoogleTTS.getAudioUrl(query, {
19+
lang: "en",
20+
slow: false,
21+
host: "https://translate.google.com",
22+
});
23+
24+
const response = await fetch(url);
25+
const buffer = Buffer.from(await response.arrayBuffer());
26+
const tempDir = "./.temp";
27+
const tempPath = `${tempDir}/${Date.now()}.mp3`;
28+
29+
// Ensure the temp directory exists
30+
await fs.promises.mkdir(tempDir, { recursive: true });
31+
32+
await fs.promises.writeFile(tempPath, buffer);
33+
const media = MessageMedia.fromFilePath(tempPath);
34+
await client.sendMessage(msg.from, media, { sendAudioAsVoice: true });
35+
await fs.promises.unlink(tempPath);
36+
37+
} catch (error) {
38+
log.error("Command", "Error occurred while processing the request:", error);
39+
await msg.reply("An error occurred while processing your request.");
40+
}
41+
}

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,4 @@ const messageEvent = (msg: Message) => {
111111
handler.exec(msg);
112112
};
113113

114-
export { commands };
114+
export { client, commands };

0 commit comments

Comments
 (0)