├── lib
├── helper
│ ├── bot.json
│ ├── antilink.json
│ ├── welcome.json
│ ├── antisticker.json
│ ├── stickerspam.json
│ ├── badword.json
│ ├── limit.json
│ ├── msgBadword.json
│ └── settings.json
├── database
│ ├── bacot.json
│ ├── banned.json
│ ├── limit.json
│ ├── premium.json
│ ├── katakasar.json
│ └── user.json
├── font
│ ├── Indie-Flower.ttf
│ └── ObelixProBIt-cyr.ttf
├── index.js
├── shortener.js
├── translate.js
├── remove-bg.js
├── kataKotor.js
├── info.txt
├── stickertext.js
├── update.txt
├── meme.js
├── downloader.js
└── scraper.js
├── util
├── stat.json
├── index.js
├── color.js
├── getBase64.js
├── imageProcessing.js
├── msgFilter.js
├── options.js
└── fetcher.js
├── .github
└── imagemagic.png
├── media
└── images
│ ├── buku
│ ├── sebelumkiri.jpg
│ ├── setelahkiri.jpg
│ ├── sebelumkanan.jpg
│ └── setelahkanan.jpg
│ └── folio
│ ├── sebelumkanan.jpg
│ ├── sebelumkiri.jpg
│ ├── setelahkanan.jpg
│ └── setelahkiri.jpg
├── .gitignore
├── package.json
├── README.md
├── index.js
└── msg
└── text
└── menu.js
/lib/helper/bot.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/database/bacot.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/database/banned.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/database/limit.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/database/premium.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/helper/antilink.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/helper/welcome.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/helper/antisticker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/helper/stickerspam.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/lib/helper/badword.json:
--------------------------------------------------------------------------------
1 | ["6285236189413-1601885520@g.us"]
--------------------------------------------------------------------------------
/lib/database/katakasar.json:
--------------------------------------------------------------------------------
1 | ["asu","bajingan","jembot","silit"]
--------------------------------------------------------------------------------
/lib/helper/limit.json:
--------------------------------------------------------------------------------
1 | [{"id":"6285236189413@c.us","limit":20}]
--------------------------------------------------------------------------------
/lib/helper/msgBadword.json:
--------------------------------------------------------------------------------
1 | [{"id":"6283150626842@c.us","msg":3}]
--------------------------------------------------------------------------------
/lib/database/user.json:
--------------------------------------------------------------------------------
1 | [{"id":"6285236189413@c.us","nama":"mg","umur":"17"}]
--------------------------------------------------------------------------------
/util/stat.json:
--------------------------------------------------------------------------------
1 | {
2 | "sent": {
3 |
4 | },
5 | "receive": {
6 |
7 | }
8 | }
--------------------------------------------------------------------------------
/.github/imagemagic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/.github/imagemagic.png
--------------------------------------------------------------------------------
/lib/font/Indie-Flower.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/lib/font/Indie-Flower.ttf
--------------------------------------------------------------------------------
/lib/helper/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "owner": "6285236189413@c.us",
3 | "banChats": false,
4 | "limitCount": 50
5 | }
--------------------------------------------------------------------------------
/lib/font/ObelixProBIt-cyr.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/lib/font/ObelixProBIt-cyr.ttf
--------------------------------------------------------------------------------
/media/images/buku/sebelumkiri.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/sebelumkiri.jpg
--------------------------------------------------------------------------------
/media/images/buku/setelahkiri.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/setelahkiri.jpg
--------------------------------------------------------------------------------
/media/images/buku/sebelumkanan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/sebelumkanan.jpg
--------------------------------------------------------------------------------
/media/images/buku/setelahkanan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/setelahkanan.jpg
--------------------------------------------------------------------------------
/media/images/folio/sebelumkanan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/sebelumkanan.jpg
--------------------------------------------------------------------------------
/media/images/folio/sebelumkiri.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/sebelumkiri.jpg
--------------------------------------------------------------------------------
/media/images/folio/setelahkanan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/setelahkanan.jpg
--------------------------------------------------------------------------------
/media/images/folio/setelahkiri.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/setelahkiri.jpg
--------------------------------------------------------------------------------
/util/index.js:
--------------------------------------------------------------------------------
1 | exports.msgFilter = require('./msgFilter')
2 | exports.fetcher = require('./fetcher')
3 | exports.color = require('./color')
4 | exports.getBase64 = require('./getBase64')
5 | exports.options = require('./options')
6 |
--------------------------------------------------------------------------------
/util/color.js:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk')
2 | /**
3 | * Get text with color
4 | * @param {String} text
5 | * @param {String} color
6 | * @return {String} Return text with color
7 | */
8 | module.exports = color = (text, color) => !color ? chalk.green(text) : chalk.keyword(color)(text)
9 |
--------------------------------------------------------------------------------
/lib/index.js:
--------------------------------------------------------------------------------
1 | exports.downloader = require('./downloader')
2 | exports.meme = require('./meme')
3 | exports.removebg = require('./remove-bg')
4 | exports.urlShortener = require('./shortener')
5 | exports.translate = require('./translate')
6 | exports.stext = require('./stickertext')
7 | exports.cariKasar = require('./kataKotor')
8 | exports.scraper = require('./scraper')
9 |
--------------------------------------------------------------------------------
/lib/shortener.js:
--------------------------------------------------------------------------------
1 | const fetch = require('node-fetch')
2 | module.exports = shortener = (url) => new Promise((resolve, reject) => {
3 | console.log('Creating short url...')
4 | fetch(`https://tinyurl.com/api-create.php?url=${url}`)
5 | .then(response => response.text())
6 | .then(json => {
7 | resolve(json)
8 | })
9 | .catch((err) => {
10 | reject(err)
11 | })
12 | })
13 |
--------------------------------------------------------------------------------
/lib/translate.js:
--------------------------------------------------------------------------------
1 | const { default: translate } = require('google-translate-open-api')
2 |
3 | /**
4 | * Translate Text
5 | * @param {String} text
6 | * @param {String} lang
7 | */
8 |
9 | module.exports = doing = (text, lang) => new Promise((resolve, reject) => {
10 | console.log(`Translate text to ${lang}...`)
11 | translate(text, { tld: 'cn', to: lang })
12 | .then((text) => resolve(text.data[0]))
13 | .catch((err) => reject(err))
14 | })
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Directory
2 | node_modules
3 | .node-persist
4 |
5 | # Dot files
6 | .node-persist
7 |
8 | # Log files
9 | *.log
10 |
11 | # Session files
12 | *.data.json
13 |
14 | # Workspace files
15 | *.code-workspace
16 |
17 | # Lock files
18 | package-lock.json
19 | *.lock
20 |
21 | # Other files
22 | lib/database/welcome.json
23 | lib/database/group.json
24 | lib/database/hastag.json
25 | lib/filmdl.js
26 | lib/functions.js
27 | lib/welcome.js
28 | lib/joox.js
29 | lib/shopee.js
30 | lib/yt.js
31 | util/reqconfig.js
32 |
--------------------------------------------------------------------------------
/util/getBase64.js:
--------------------------------------------------------------------------------
1 | const fetch = require('node-fetch')
2 | /**
3 | * Get base64 from url
4 | * @param {String} url
5 | */
6 | module.exports = getBase64 = (url) => new Promise((resolve, reject) => {
7 | fetch(url, { headers: { 'User-Agent': 'okhttp/4.5.0' } })
8 | .then((response) => response.buffer())
9 | .then((result) => resolve(`data:${result.headers.get('content-type')};base64,` + result.toString('base64')))
10 | .catch((err) => {
11 | console.error(err)
12 | reject(err)
13 | })
14 | })
15 |
--------------------------------------------------------------------------------
/lib/remove-bg.js:
--------------------------------------------------------------------------------
1 | const { RemoveBgResult, removeBackgroundFromImageBase64 } = require('remove.bg')
2 | /**
3 | * Remove Image Background
4 | *
5 | * @param {String} base64img
6 | */
7 |
8 | var apikey = 'Get api-key at remove.bg'
9 |
10 | const removebg = async (base64img) => new Promise(async (resolve, reject) => {
11 | await removeBackgroundFromImageBase64({
12 | base64img,
13 | apiKey: apikey,
14 | size: 'auto',
15 | type: 'auto',
16 | }).then((result) => {
17 | const hasil = result.base64img
18 | resolve(hasil)
19 | }).catch((err) => {
20 | reject(err)
21 | });
22 | })
23 |
24 | module.exports = removebg;
25 |
26 |
--------------------------------------------------------------------------------
/lib/kataKotor.js:
--------------------------------------------------------------------------------
1 | const sastrawi = require('sastrawijs');
2 | const fs = require('fs')
3 | let kataKasar = JSON.parse(fs.readFileSync('./lib/database/katakasar.json'))
4 | var sorted = [];
5 | for (var i = 0; i < kataKasar.length; i++) {
6 | sorted.push(kataKasar[i].toLowerCase());
7 | }
8 | sorted.sort();
9 |
10 | const inArray = (needle, haystack) => {
11 | let length = haystack.length;
12 | for(let i = 0; i < length; i++) {
13 | if(haystack[i] == needle) return true;
14 | }
15 | return false;
16 | }
17 |
18 | module.exports = cariKasar = (kata) => new Promise((resolve, reject) => {
19 | let sentence = kata;
20 | let stemmer = new sastrawi.Stemmer();
21 | let tokenizer = new sastrawi.Tokenizer();
22 | let words = tokenizer.tokenize(sentence);
23 | for (word of words) {
24 | if(inArray(stemmer.stem(word), sorted)){
25 | resolve(true)
26 | }
27 | }
28 | resolve(false)
29 | })
--------------------------------------------------------------------------------
/util/imageProcessing.js:
--------------------------------------------------------------------------------
1 | const sharp = require('sharp')
2 | const { fromBuffer } = require('file-type')
3 |
4 | /**
5 | * Resize image to buffer or base64
6 | * @param {Buffer} bufferdata
7 | * @param {Boolean} encode
8 | * @param {String} mimType
9 | */
10 | // eslint-disable-next-line no-async-promise-executor
11 | module.exports = resizeImage = (buff, encode) => new Promise(async (resolve, reject) => {
12 | console.log('Resizeing image...')
13 | const { mime } = await fromBuffer(buff)
14 | sharp(buff, { failOnError: false })
15 | .resize(512, 512)
16 | .toBuffer()
17 | .then(resizedImageBuffer => {
18 | if (!encode) return resolve(resizedImageBuffer)
19 | console.log('Create base64 from resizedImageBuffer...')
20 | const resizedImageData = resizedImageBuffer.toString('base64')
21 | const resizedBase64 = `data:${mime};base64,${resizedImageData}`
22 | resolve(resizedBase64)
23 | })
24 | .catch(error => reject(error))
25 | })
--------------------------------------------------------------------------------
/lib/info.txt:
--------------------------------------------------------------------------------
1 | _*ɪɴꜰᴏʀᴍᴀꜱɪ ᴍɢ-ʙᴏᴛ*_
2 | ꜱᴛᴀᴛᴜꜱ ʙᴏᴛ : *%state*
3 |
4 | Tolong di BACA dan PAHAMI Penjelasan penggunaan sebelum menggunakan BoT >.<
5 |
6 | Penjelasan :
7 | ◉ Semua perintah/command tidak perlu menggunakan tanda *[* dan *]*
8 | ◉ *Yang di maksud dengan reply/quote pesan, simple nya aja [geser pesan ke kanan]*
9 | ◉ Untuk fitur cuaca, agar lebih akurat dan lokasi tidak salah, kamu bisa share lokasi mu, kemudian reply dengan caption #cuaca
10 | ◉ Untuk #memestiker jangan sekali-kali *menggunakan emoticon*, karena sistem tidak dapat memproses
11 | => Kalau ingin text atas/bawah kosong, gunakan tanda - Contoh = #memestiker - | text bawah
12 | ◉ #emo => emoji *tidak boleh lebih dari 1 emoji*, karena sistem hanya dapat memproses SATU emoji saja
13 | => Contoh = #emo 😁
14 | ◉ Fitur #tts (Text To Speech) dan #tr (Translate) bisa juga digunakan dengan cara reply/quote pesan yang akan di Translate ataupun TTS
15 | ◉ Fitur #profile, yang di maksud NO WA adalah nomor wa dengan country code.
16 | => Contoh = #profile 6285236189411
17 |
18 | Telegram Channel: t.me/info_mg
19 | Group WA Mg-BoT : minta ke admin #min minta link grup
--------------------------------------------------------------------------------
/lib/stickertext.js:
--------------------------------------------------------------------------------
1 |
2 | const path = require('path')
3 | const { registerFont, createCanvas } = require("canvas");
4 | const canvasTxt = require("canvas-txt").default;
5 | var text2png = require('text2png');
6 |
7 | const stext = async (text) => new Promise(async (resolve, reject) => {
8 | function fontFile(name) {
9 | return path.join(__dirname, '/font/', name)
10 | }
11 | registerFont(fontFile('ObelixProBIt-cyr.ttf'), { family: 'pg' })
12 | //await client.reply(from, '_Sek yo... gek gawe stiker_', id)
13 | const canvas = createCanvas(500, 500);
14 | const ctx = canvas.getContext("2d");
15 | // alpha bg
16 | ctx.fillStyle = "rgba(0,0,0,0)";
17 | ctx.fillRect(0, 0, canvas.width, canvas.height);
18 |
19 | const txt = text
20 | ctx.fillStyle = "white";
21 | ctx.strokeStyle = "black"
22 | canvasTxt.font = 'pg'
23 | canvasTxt.align = 'center'
24 | canvasTxt.lineHeight = null
25 | canvasTxt.justify = false
26 | canvasTxt.fontSize = 80;
27 | canvasTxt.drawText(ctx, txt, 70, 50, 400, 400)
28 | const mediaData = canvas.toDataURL()
29 | resolve(mediaData)
30 | const err = 'Error'
31 | reject(err)
32 | })
33 |
34 | module.exports = stext;
--------------------------------------------------------------------------------
/lib/update.txt:
--------------------------------------------------------------------------------
1 | _*ᴜᴘᴅᴀᴛᴇ ᴍɢ-ʙᴏᴛ*_
2 | Status Bot : *%state*
3 |
4 | 17 - 11 - 2020
5 | [+] Joox downloader
6 | [+] Template menu baru agar tidak membosankan
7 | [+] dan beberapa fitur baru, cek sendiri di #menu
8 |
9 | 18 - 11 - 2020
10 | [+] Filter *Anti Badword*
11 | => Member grup yang mengirim pesan mengandung badword [kata kasar] lebih dari 10x akan di kick otomatis oleh bot
12 | => Fitur ini dapat di aktifkan atau nonaktifkan
13 | => #filter on / off
14 | [+] Filter *Anti Link group*
15 | => Member grup yang mengirim pesan mengandung link chat group akan di kick otomatis oleh bot TANPA PERINGATAN!
16 | => Fitur ini dapat di aktifkan atau nonaktifkan
17 | => #antilink on / off
18 | [+] Filter *Anti Spam Sticker*
19 | => Member grup yang spam sticker sebanyak 10x di group akan di kick otomatis oleh bot TANPA PERINGATAN!
20 | => Fitur ini dapat di aktifkan atau nonaktifkan
21 | => #antisticker on / off
22 | [+] Setiap admin group berwenang untuk mereset data member yang telah spam sticker atau badword
23 | => #resetbadword [NO WA / @member] === (RESET DATA MEMBER YANG SPAM BADWORD)
24 | => #resetsticker [NO WA / @member] === (RESET DATA MEMBER YANG SPAM STICKER)
25 |
26 | [Bagi yang ingin registrasi ulang, karena data salah, silahkan donasi seikhlasnya. kirim #donasi untuk melihat info donasi]
27 |
28 | Bila menemukan bugs/bot error, lapor ke admin bot.
29 | cara lapor mudah, kirim aja #bug [deskripsi bug]
30 |
31 | Telegram Channel: t.me/info_mg
32 | Group WA Mg-BoT : minta ke admin #min minta link grup
--------------------------------------------------------------------------------
/util/msgFilter.js:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk')
2 | const moment = require('moment-timezone')
3 | const updateJson = require('update-json-file')
4 | moment.tz.setDefault('Asia/Jakarta').locale('id')
5 | /**
6 | * Get text with color
7 | * @param {String} text
8 | * @param {String} color
9 | * @return {String} Return text with color
10 | */
11 | const color = (text, color) => {
12 | return !color ? chalk.green(text) : chalk.keyword(color)(text)
13 | }
14 |
15 | /**
16 | * Get Time duration
17 | * @param {Date} timestamp
18 | * @param {Date} now
19 | */
20 | const processTime = (timestamp, now) => {
21 | // timestamp => timestamp when message was received
22 | return moment.duration(now - moment(timestamp * 1000)).asSeconds()
23 | }
24 | /**
25 | * is it url?
26 | * @param {String} url
27 | */
28 | const isUrl = (url) => {
29 | return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/gi))
30 | }
31 |
32 | // Message Filter / Message Cooldowns
33 | const usedCommandRecently = new Set()
34 |
35 | /**
36 | * Check is number filtered
37 | * @param {String} from
38 | */
39 | const isFiltered = (from) => {
40 | return !!usedCommandRecently.has(from)
41 | }
42 |
43 | /**
44 | * Add number to filter
45 | * @param {String} from
46 | */
47 | const addFilter = (from) => {
48 | usedCommandRecently.add(from)
49 | setTimeout(() => {
50 | return usedCommandRecently.delete(from)
51 | }, 5000) // 5sec is delay before processing next command
52 | }
53 |
54 | // Message type Log
55 | const messageLog = (fromMe, type) => updateJson('utils/stat.json', (data) => {
56 | (fromMe) ? (data.sent[type]) ? data.sent[type] += 1 : data.sent[type] = 1 : (data.receive[type]) ? data.receive[type] += 1 : data.receive[type] = 1
57 | return data
58 | })
59 |
60 | module.exports = {
61 | msgFilter: {
62 | isFiltered,
63 | addFilter
64 | },
65 | processTime,
66 | isUrl,
67 | color,
68 | messageLog
69 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mg-bot-v2",
3 | "version": "2.0.0",
4 | "description": "Whatsapp Bot - sticker creator",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "author": "masgimenz",
11 | "repository": {
12 | "type": "git",
13 | "url": "https://github.com/Gimenz/Mg-v2-WhatsApp-BOT.git"
14 | },
15 | "license": "MIT",
16 | "dependencies": {
17 | "@justalk/pornhub-api": "^3.3.0",
18 | "@open-wa/wa-automate": "^3.0.16",
19 | "base64-string": "^1.1.2",
20 | "brainly-scraper": "^1.0.2",
21 | "canvas": "^2.6.1",
22 | "canvas-txt": "^3.0.0",
23 | "chalk": "^4.1.0",
24 | "dotenv": "^8.2.0",
25 | "file-type": "^16.0.1",
26 | "fs": "0.0.1-security",
27 | "fs-extra": "^9.0.1",
28 | "g-i-s": "^2.1.6",
29 | "genius-lyrics-scrape": "^1.2.0",
30 | "google-it": "^1.5.4",
31 | "google-translate-open-api": "^1.3.7",
32 | "gtts": "^0.2.1",
33 | "html-to-text": "^6.0.0",
34 | "merge-options": "^3.0.3",
35 | "moment-timezone": "^0.5.32",
36 | "mysql": "^2.18.1",
37 | "node-cron": "^2.0.3",
38 | "node-fetch": "^2.6.1",
39 | "npm-check-updates": "^10.2.1",
40 | "pornhub.js": "^0.2.4",
41 | "pornnhub": "^1.0.0",
42 | "remove.bg": "^1.3.0",
43 | "sastrawijs": "^1.0.3",
44 | "sharp": "^0.26.3",
45 | "soundcloud-downloader": "^0.2.0",
46 | "superagent": "^6.1.0",
47 | "text2png": "^2.3.0",
48 | "update-json-file": "^1.1.1",
49 | "util": "^0.12.3",
50 | "xml2js": "^0.4.23",
51 | "yt-search": "^2.5.0"
52 | },
53 | "devDependencies": {
54 | "babel-eslint": "^10.1.0",
55 | "eslint": "^7.13.0",
56 | "eslint-config-standard": "^16.0.2",
57 | "eslint-plugin-import": "^2.22.1",
58 | "eslint-plugin-node": "^11.1.0",
59 | "eslint-plugin-promise": "^4.2.1",
60 | "eslint-plugin-standard": "^4.1.0",
61 | "nodemon": "^2.0.6"
62 | },
63 | "directories": {
64 | "lib": "lib"
65 | },
66 | "keywords": [
67 | "whatsapp",
68 | "bot"
69 | ]
70 | }
71 |
--------------------------------------------------------------------------------
/util/options.js:
--------------------------------------------------------------------------------
1 | //const fs = require('fs')
2 | /**
3 | * Get Client Options
4 | * @param {Function} start function
5 | * @param {Boolean} headless
6 | */
7 |
8 | module.exports = options = (headless, start) => {
9 | // const chromePath = {
10 | // win32: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', // Windows 32 bit
11 | // win64: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', // Windows 64 bit
12 | // linuxChrome: '/usr/bin/google-chrome-stable', // Linux - Chrome
13 | // linuxChromium: '/usr/bin/chromium-browser', // Linux - Chromium
14 | // darwin: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' // MacOS
15 | // }
16 |
17 | // if (fs.existsSync(chromePath.win32)) {
18 | // execPath = chromePath.win32
19 | // } else if (fs.existsSync(chromePath.win64)) {
20 | // execPath = chromePath.win64
21 | // } else if (fs.existsSync(chromePath.linuxChrome)) {
22 | // execPath = chromePath.linuxChrome
23 | // } else if (fs.existsSync(chromePath.linuxChromium)) {
24 | // execPath = chromePath.linuxChromium
25 | // } else if (process.platform === 'darwin') {
26 | // execPath = chromePath.darwin
27 | // } else {
28 | // console.error(new Error('Google Chrome Is Not Installed'))
29 | // process.exit(1)
30 | // }
31 |
32 | const options = {
33 | headless: headless,
34 | qrRefreshS: 20,
35 | qrTimeout: 0,
36 | authTimeout: 0,
37 | autoRefresh: true,
38 | restartOnCrash: start,
39 | cacheEnabled: false,
40 | // executablePath: execPath,
41 | useChrome: true,
42 | killProcessOnBrowserClose: true,
43 | throwErrorOnTosBlock: false,
44 | chromiumArgs: [
45 | '--no-sandbox',
46 | '--disable-setuid-sandbox',
47 | '--aggressive-cache-discard',
48 | '--disable-cache',
49 | '--disable-application-cache',
50 | '--disable-offline-load-stale-cache',
51 | '--disk-cache-size=0'
52 | ]
53 | }
54 |
55 | return options
56 | }
--------------------------------------------------------------------------------
/lib/meme.js:
--------------------------------------------------------------------------------
1 | const { fetchJson, fetchBase64 } = require('../util/fetcher')
2 |
3 | /**
4 | * Get meme from random subreddit
5 | *
6 | * @param {String} subreddit
7 | * @return {Promise} Return meme from dankmemes, wholesomeanimemes, wholesomememes, AdviceAnimals, MemeEconomy, memes, terriblefacebookmemes, teenagers, historymemes
8 | */
9 | const random = (subreddit) => new Promise((resolve, reject) => {
10 | const subreddits = ['dankmemes', 'wholesomeanimemes', 'wholesomememes', 'AdviceAnimals', 'MemeEconomy', 'memes', 'terriblefacebookmemes', 'teenagers', 'historymemes']
11 | const randSub = subreddits[Math.random() * subreddits.length | 0]
12 | console.log('looking for memes on ' + randSub)
13 | fetchJson('https://meme-api.herokuapp.com/gimme/' + randSub)
14 | .then((result) => resolve(result))
15 | .catch((err) => {
16 | console.error(err)
17 | reject(err)
18 | })
19 | })
20 |
21 | /**
22 | * create custom meme
23 | * @param {String} imageUrl
24 | * @param {String} topText
25 | * @param {String} bottomText
26 | */
27 | const custom = async (imageUrl, top, bottom) => new Promise((resolve, reject) => {
28 | topText = top.trim().replace(/\s/g, '_').replace(/\?/g, '~q').replace(/\%/g, '~p').replace(/\#/g, '~h').replace(/\//g, '~s')
29 | bottomText = bottom.trim().replace(/\s/g, '_').replace(/\?/g, '~q').replace(/\%/g, '~p').replace(/\#/g, '~h').replace(/\//g, '~s')
30 | fetchBase64(`https://api.memegen.link/images/custom/${topText}/${bottomText}.png?background=${imageUrl}`, 'image/png')
31 | .then((result) => resolve(result))
32 | .catch((err) => {
33 | console.error(err)
34 | reject(err)
35 | })
36 | })
37 |
38 | const stalk = (username) => new Promise((resolve, reject) => {
39 | fetchJson(`https://test.mumetndase.my.id/stalkv2?username=${username}`)
40 | .then((result) => {
41 | const res = result.result
42 | resolve(res)
43 | })
44 | .catch((err) => {
45 | console.error(err)
46 | reject(err)
47 | })
48 | })
49 |
50 | module.exports = {
51 | random,
52 | custom,
53 | stalk
54 | }
--------------------------------------------------------------------------------
/lib/downloader.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable prefer-promise-reject-errors */
2 | const axios = require('axios')
3 | var vhtear = 'GET apikey at https://api.vhtear.com/'
4 |
5 | /**
6 | * Get pornhub videos download url
7 | * Premium content
8 | *
9 | * @param {string} keyword
10 | */
11 | const porn = async (keyword) => new Promise(async (resolve, reject) => {
12 | // Hidden content
13 | })
14 |
15 | /**
16 | * Get instagram stories
17 | * Premium content
18 | *
19 | * @param {string} username
20 | * @param {string} jumlah
21 | */
22 | const igs = async (username, jumlah) => new Promise(async (resolve, reject) => {
23 | // Premium content
24 | })
25 |
26 |
27 | const tik = async (url) => new Promise(async (resolve, reject) => {
28 | const api = 'https://api.vhtear.com/tiktokdl?link='+url+'&apikey='+vhtear
29 | axios.get(api).then(async(res) => {
30 | const st = res.data.result
31 | if(st === undefined){
32 | resolve(`Link tidak valid, atau mungkin akun private`)
33 | }else{
34 | resolve(st)
35 | }
36 | }).catch(err => {
37 | console.log(err)
38 | resolve(`Server error, atau akun private`)
39 | })
40 | })
41 |
42 |
43 | /**
44 | * Get instagram metadata
45 | *
46 | * @param {string} url
47 | */
48 | const ig = async (url) => new Promise(async (resolve, reject) => {
49 | const api = 'https://test.mumetndase.my.id/igdl?url='+url
50 | axios.get(api).then(async(res) => {
51 | const st = res.data.result
52 | if(st.status === false){
53 | resolve(`Asupan tidak ditemukan!! Coba lagi`)
54 | }else{
55 | resolve(st)
56 | }
57 | }).catch(err => {
58 | console.log(err)
59 | resolve(`Server error, try again!`)
60 | })
61 | })
62 |
63 |
64 | /**
65 | * Get Twitter Metadata
66 | *
67 | * @param {String} url
68 | */
69 | const tweet = (url) => new Promise((resolve, reject) => {
70 | const api = 'https://test.mumetndase.my.id/twitter?url='+url
71 | axios.get(api).then((res) => {
72 | const st = res.data.result
73 | if(typeof st.status === false){
74 | resolve(`Errooooorrrrrrrrrrrrrr!`)
75 | }else{
76 | resolve(st)
77 | }
78 | }).catch(err => {
79 | console.log(err)
80 | resolve(`Server error, try again!`)
81 | })
82 | })
83 |
84 | module.exports = { tweet, tik, porn, igs, ig }
85 |
--------------------------------------------------------------------------------
/util/fetcher.js:
--------------------------------------------------------------------------------
1 | const fetch = require('node-fetch')
2 | const FormData = require('form-data')
3 | const fs = require('fs')
4 | const { fromBuffer } = require('file-type')
5 | const resizeImage = require('./imageProcessing')
6 |
7 | /**
8 | *Fetch Json from Url
9 | *
10 | *@param {String} url
11 | *@param {Object} options
12 | */
13 | const fetchJson = (url, options) =>
14 | new Promise((resolve, reject) =>
15 | fetch(url, options)
16 | .then(response => response.json())
17 | .then(json => resolve(json))
18 | .catch(err => {
19 | console.error(err)
20 | reject(err)
21 | })
22 | )
23 |
24 | /**
25 | * Fetch Text from Url
26 | *
27 | * @param {String} url
28 | * @param {Object} options
29 | */
30 | const fetchText = (url, options) => {
31 | return new Promise((resolve, reject) => {
32 | return fetch(url, options)
33 | .then(response => response.text())
34 | .then(text => resolve(text))
35 | .catch(err => {
36 | console.error(err)
37 | reject(err)
38 | })
39 | })
40 | }
41 |
42 | /**
43 | * Fetch base64 from url
44 | * @param {String} url
45 | */
46 |
47 | const fetchBase64 = (url, mimetype) => {
48 | return new Promise((resolve, reject) => {
49 | console.log('Get base64 from:', url)
50 | return fetch(url)
51 | .then((res) => {
52 | const _mimetype = mimetype || res.headers.get('content-type')
53 | res.buffer()
54 | .then((result) => resolve(`data:${_mimetype};base64,` + result.toString('base64')))
55 | })
56 | .catch((err) => {
57 | console.error(err)
58 | reject(err)
59 | })
60 | })
61 | }
62 |
63 | /**
64 | * Upload Image to Telegra.ph
65 | *
66 | * @param {String} base64 image buffer
67 | * @param {Boolean} resize
68 | */
69 |
70 | const uploadImages = (buffData, type) => {
71 | // eslint-disable-next-line no-async-promise-executor
72 | return new Promise(async (resolve, reject) => {
73 | const { ext } = await fromBuffer(buffData)
74 | const filePath = 'util/tmp.' + ext
75 | const _buffData = type ? await resizeImage(buffData, true) : buffData
76 | fs.writeFile(filePath, _buffData, { encoding: 'base64' }, (err) => {
77 | if (err) return reject(err)
78 | console.log('Uploading image to telegra.ph server...')
79 | const fileData = fs.readFileSync(filePath)
80 | const form = new FormData()
81 | form.append('file', fileData, 'tmp.' + ext)
82 | fetch('https://telegra.ph/upload', {
83 | method: 'POST',
84 | body: form
85 | })
86 | .then(res => res.json())
87 | .then(res => {
88 | if (res.error) return reject(res.error)
89 | resolve('https://telegra.ph' + res[0].src)
90 | })
91 | .then(() => fs.unlinkSync(filePath))
92 | .catch(err => reject(err))
93 | })
94 | })
95 | }
96 |
97 | module.exports = {
98 | fetchJson,
99 | fetchText,
100 | fetchBase64,
101 | uploadImages
102 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
mg WhatsApp-BOT
2 | Just Simple WhatsApp BOT
3 | SCRIPT TIDAK DIJUAL. DAN REPO INI TIDAK DILANJUTKAN! SAYA SUDAH PENSIUN NGEBOT!!! MAKASIH SEMUA :)
4 |
5 | ### Install
6 | Clone this project
7 | ```bash
8 | > git clone https://github.com/Gimenz/Mg-v2-WhatsApp-BOT.git
9 | > cd Mg-v2-WhatsApp-BOT
10 | ```
11 |
12 | Install the dependencies:
13 | ```bash
14 | > npm install
15 | ```
16 |
17 | ## Information
18 | - Bot Work on 06.00 AM - 12.00 AM Local Indonesian Time Asia/Jakarta
19 | - Set bot owner number on lib/helper/settings.json **(Important)**
20 | - Set limitCount on lib/helper/settings.json **(Optional)**
21 | - Set accuweather, simsimi, farzain apikey on lib/scraper.js **(Important)**
22 | - Set remove.bg apikey on lib/remove.bg.js **(Important)**
23 | - And some features require premium apikey from [VHTEAR](https://api.vhtear.com/)
24 | - Add badword list on lib/katakasar.json **(Important)**
25 |
26 |
27 | #### For Bot Nulis Support **(Important)**
28 | - [ImageMagick](https://bit.ly/3faAi8l)
29 | - Checklist like this
30 |
31 |
32 |
33 |
34 | #### For GIF Sticker Support **(Important)**
35 | - [FFMPEG](https://ffmpeg.org/download.html)
36 | - [TUTORIAL](https://video.stackexchange.com/questions/20495/how-do-i-set-up-and-use-ffmpeg-in-windows)
37 |
38 | Usage
39 | ```bash
40 | > npm start
41 | > SCAN QR
42 | ```
43 |
44 | ## Features
45 | #### Chat Utility
46 | | Feature |Yes|
47 | | ------------- | ------------- |
48 | | User Registration |✅|
49 | | Age Limit |✅|
50 | | Group Chat Link Detector|✅|
51 | | Sticker Spam Detector |✅|
52 | | Anti Badword |✅|
53 | | Command Limit |✅|
54 | | Ban User |✅|
55 |
56 | #### Downloader
57 | | Feature |Yes|
58 | | ------------- | ------------- |
59 | | Instagram (Multiple Post) |✅|
60 | | Instagram Profile Picture |✅|
61 | | YouTube Song |✅|
62 | | YouTube to mp3|✅|
63 | | YouTube Video |✅|
64 | | Twitter Video |✅|
65 | | Joox Music |✅|
66 | | Facebook Videos |✅|
67 | | SoundCloud Music |✅|
68 | | Google Image |✅|
69 | #### Sticker
70 | | Feature |Yes|
71 | | ------------- | ------------- |
72 | | Sticker from Image |✅|
73 | | Sticker from Video/GIF |✅|
74 | | Sticker from URL |✅|
75 | | Sticker from Emoji|✅|
76 | | Sticker from Giphy |✅|
77 | | Sticker from Text |✅|
78 | | Memesticker |✅|
79 | #### Islamic
80 | | Feature |Yes|
81 | | ------------- | ------------- |
82 | | Quran |✅|
83 | | Jadwal Sholat |✅|
84 | | Tafsir |✅|
85 | #### Group Manager
86 | | Feature |Yes|
87 | | ------------- | ------------- |
88 | | Anti Badword |✅|
89 | | Anti Group Link |✅|
90 | | Anti Sticker Spam |✅|
91 | | Add Member|✅|
92 | | Kick Member |✅|
93 | | Promote Member |✅|
94 | | Demote Member |✅|
95 | | Set On/Off Bot |✅|
96 | | Set Group Picture |✅|
97 | | Lock Group |✅|
98 | | Unlock Group |✅|
99 | | Group Info |✅|
100 | #### Utility
101 | | Feature |Yes|
102 | | ------------- | ------------- |
103 | | Nulis |✅|
104 | | Indonesia Covid |✅|
105 | | BMKG Gempa |✅|
106 | | Google Translate|✅|
107 | | Google Voice |✅|
108 | | Weather Info |✅|
109 | | Google Search |✅|
110 | | KBBI Search |✅|
111 | | WikiPedia Search |✅|
112 | | Shopee Search |✅|
113 | #### Premium Features
114 | | Feature |Yes|
115 | | ------------- | ------------- |
116 | | Instagram Stories |✅|
117 | | Unlimited Quota CMD |✅|
118 | | Sticker No Background |✅|
119 | | Simsimi Chat |✅|
120 | | Gift Quota CMD |✅|
121 | | Brainly Search |✅|
122 | | Add Badword |✅|
123 | #### Just For Fun
124 | | Feature |Yes|
125 | | ------------- | ------------- |
126 | | Random Tag Group Members |✅|
127 | | WhatsApp Stalk |✅|
128 | | Instagram Stalk |✅|
129 | | Puisi 1,2,3|✅|
130 | | Read Mojok.co Article |✅|
131 | | Random Cerpen |✅|
132 | | Random Bacot |✅|
133 | | Specific Bacot |✅|
134 | | Add Bacot |✅|
135 | | Self WhatsApp Info |✅|
136 | | Penyegar Timeline |✅|
137 |
138 | - And many hidden features
139 | ## Contact
140 | - [WhatsApp](https://wa.me/6285236189413)
141 | - [Instagram](https://www.instagram.com/gimenz.id)
142 | - [MG-BOT Whatsapp Group](https://chat.whatsapp.com/GEr9NMYc53z2NIvSVpN62o)
143 |
144 | ## Donation
145 | - [SAWERIA](https://saweria.co/masgimenz)
146 | - [Trakteer](https://trakteer.id/gimenz)
147 | - [OVO/GOPAY/DANA/Pulsa](085236189413)
148 |
149 | ## Big Thanks to
150 | - [WA-Automate](https://github.com/open-wa/wa-automate-nodejs)
151 | - [YogaSakti](https://github.com/YogaSakti/imageToSticker)
152 | - [ItzNgga](https://github.com/ItzNgga/wa-bot.js)
153 | - [MhankBarBar](https://github.com/MhankBarBar/whatsapp-bot)
154 | - [Dandy Raka](https://github.com/dandyraka/NoBadWord)
155 |
156 | ## License
157 | - [MIT](/LICENSE)
158 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const { create, Client } = require('@open-wa/wa-automate')
2 | const { color, messageLog } = require('./util')
3 | const msgHandler = require('./msg')
4 | const cron = require('node-cron')
5 | const fs = require('fs')
6 | let settings = JSON.parse(fs.readFileSync('./lib/helper/settings.json'))
7 |
8 | const start = (client = new Client()) => {
9 | console.log('[DEV]', color('masgimenz', 'yellow'))
10 | console.log('[CLIENT] CLIENT Started!')
11 |
12 | // Message log for analytic
13 | client.onAnyMessage((fn) => messageLog(fn.fromMe, fn.type))
14 |
15 | // Force it to keep the current session
16 | client.onStateChanged((state) => {
17 | console.log('[Client State]', state)
18 | if (state === 'CONFLICT' || state === 'DISCONNECTED') client.forceRefocus()
19 | })
20 |
21 | // listening on message
22 | client.onMessage((message) => {
23 | // Cut message Cache if cache more than 3K
24 | client.getAmountOfLoadedMessages().then((msg) => (msg >= 3000) && client.cutMsgCache())
25 | // Message Handler
26 | msgHandler(client, message)
27 | })
28 | // listen group invitation
29 | client.onAddedToGroup((chat) => {
30 | //let totalMem = chat.groupMetadata.participants.length
31 | /*if (totalMem < 25) {
32 | client.sendText(chat.id, `Maaf, untuk menambahkan bot ini, grup harus melebihi 25 member`).then(() => client.leaveGroup(chat.id))
33 | client.deleteChat(chat.id)
34 | } else {
35 |
36 | }*/
37 | client.sendText(chat.groupMetadata.id, `Halo warga grup *${chat.contact.name}* terimakasih sudah menginvite bot ini, sebelum menggunakan bot baca rules dulu ya\nkirim #rules untuk membaca rules penggunaan bot`)
38 | })
39 | // listen paricipant event on group (wellcome message)
40 | /*client.onGlobalParicipantsChanged((async (event) => {
41 | try {
42 | const idgrup = await client.getChatById(event.chat)
43 | const { name, formattedTitle } = idgrup
44 | const datagrup = (name || formattedTitle)
45 | if (event.action === 'add') {
46 | client.sendText(event.chat, `Halo, Selamat datang di grup *${datagrup}* \n\Silahkan memperkenalkan diri dan baca deskripsi grup`)
47 | } else {
48 | if (event.action === 'remove')
49 | client.sendText(event.chat, 'yah keluar, pasti baperan')
50 | }
51 | } catch (err) {
52 | console.log(err)
53 | }
54 | }))*/
55 | // listening on Incoming Call
56 | client.onIncomingCall((call) => {
57 | client.sendText(call.peerJid, 'Maaf, bot tidak bisa menerima panggilan. Bot otomatis memblokir apabila menerima panggilan')
58 | .then(() => client.contactBlock(call.peerJid))
59 | })
60 | .catch ((err) => {
61 | console.error(err)
62 | })
63 | }
64 | const options = {
65 | sessionId: 'Imperial',
66 | headless: true,
67 | qrTimeout: 0,
68 | authTimeout: 0,
69 | restartOnCrash: start,
70 | cacheEnabled: false,
71 | useChrome: true,
72 | killProcessOnBrowserClose: true,
73 | throwErrorOnTosBlock: false,
74 | chromiumArgs: [
75 | '--no-sandbox',
76 | '--disable-setuid-sandbox',
77 | '--aggressive-cache-discard',
78 | '--disable-cache',
79 | '--disable-application-cache',
80 | '--disable-offline-load-stale-cache',
81 | '--disk-cache-size=0'
82 | ]
83 | }
84 |
85 | create(options)
86 | .then((client) => {
87 | start(client)
88 | // Auto on / off BOT & CMD Limiter => Thanks to ItzNgga - XyZ BOT
89 | cron.schedule("0 0 0 * * *", function(){
90 | settings.banChats = true
91 | fs.writeFileSync('./lib/helper/settings.json',JSON.stringify(settings,null,2))
92 | client.sendText('Bot Owner Number@c.us', 'Waktunya istirahat :)')
93 | }, {
94 | scheduled: true,
95 | timezone: "Asia/Jakarta"
96 | });
97 |
98 | cron.schedule("0 0 6 * * *", function(){
99 | settings.banChats = false
100 | fs.writeFileSync('./lib/helper/settings.json',JSON.stringify(settings,null,2))
101 | client.sendText('Bot Owner Number@c.us', 'Waktunya Bekerja :)')
102 | }, {
103 | scheduled: true,
104 | timezone: "Asia/Jakarta"
105 | });
106 |
107 | cron.schedule("0 59 23 * * *", function(){
108 | let obj = [];
109 | fs.writeFileSync('./lib/helper/limit.json', JSON.stringify(obj));
110 | console.log('[INFO] Limit restarted!');
111 | }, {
112 | scheduled: true,
113 | timezone: "Asia/Jakarta"
114 | });
115 | // Auto on / off BOT & CMD Limiter => Thanks to ItzNgga - XyZ BOT
116 | })
117 | .catch((err) => new Error(err))
--------------------------------------------------------------------------------
/msg/text/menu.js:
--------------------------------------------------------------------------------
1 | exports.textAbout = () => {
2 | return `
3 | *About*
4 | Bot developed by *masgimenz.com*.
5 | Instagram = https://www.instagram.com/gimenz.id
6 | Telegram Channel = t.me/infomg`
7 | }
8 |
9 | exports.textDonasi = (pushname) => {
10 | return `
11 | Hai ${pushname} , support saya dalam pengembangan bot ini yuk.
12 | Silahkan donasi berapapun asalkan kamu ikhlas
13 | pembuat bot juga tidak mendapatkan keuntungan sepeserpun dari bot ini.
14 |
15 | ☕️ *Donasi* ☕️
16 | *PULSA / DANA / GOPAY / OVO*
17 | Semua Di sini :
18 | [085236189413]
19 |
20 | Mau jadi user premium / join grup?
21 | Kirim foto/ss bukti donasi #min [no wa kamu]`
22 | }
23 |
24 | exports.textMenu = (pushname, tgl, moment) => {
25 | return `
26 | Hi, ${pushname} :) harap *BACA* *#rules* dan *#info* sebelum menggunakan bot
27 |
28 | 🎀 *ᴍɢ ʙᴏᴛ ᴍᴇɴᴜ* 🎀
29 |
30 | 📌 Semua perintah digunakan *tanpa tanda* [ *dan* ]
31 |
32 | selalu cek limit kamu!!
33 | ◉ *#limit*
34 | ◉ *#tumbas* _[IKLAN BOT]_
35 |
36 | 💎 *ꜰɪᴛᴜʀ ᴘʀᴇᴍɪᴜᴍ* 💎
37 | ◉ *#igs* [username] [urutan]
38 | ◉ *#sticker nobg* [send image]
39 | ◉ *#simi* [text]
40 | ◉ *#gift* [NO WA] [Jumlah]
41 | ◉ *#brainly* [pertanyaan] *{ᴇʀʀᴏʀ}*
42 | ◉ *#addbadword* [kata kasar]
43 | ◉ *[Unlimited Quota bot]*
44 |
45 | ⚙️ *ᴜᴛɪʟɪᴛᴀꜱ* ⚙️
46 | ◉ *#nulis*
47 | ◉ *#covid*
48 | ◉ *#gempa*
49 | ◉ *#tr* [kode bahasa] [text]
50 | ◉ *#cuaca* [wilayah] / share loc
51 | ◉ *#kbbi* [kata]
52 | ◉ *#google* [query]
53 | ◉ *#wiki* [query]
54 | ◉ *#shopee* [query]
55 |
56 | 🕌 *ɪꜱʟᴀᴍɪᴄ* 🕌
57 | ◉ *#listsurah*
58 | ◉ *#infosurah* [nama surah]
59 | ◉ *#surah* [nama surah] [ayat]
60 | ◉ *#tafsir* [nama surah] [ayat]
61 | ◉ *#sholat* [wilayah]
62 |
63 | 🎮 *ꜰᴜɴ ᴢᴏɴᴇ* 🎮
64 | ◉ *#gdrive* [link]
65 | ◉ *#lk21* [judul] *{ᴇʀʀᴏʀ}*
66 | ◉ *#film* [link]
67 | ◉ *#ptl* [cans/gans]
68 | ◉ *#tts* [kode bahasa] [text]
69 | ◉ *#me*
70 | ◉ *#profile* [NO WA]
71 | ◉ *#cerpen*
72 | ◉ *#puisi1*
73 | ◉ *#puisi2*
74 | ◉ *#puisi3*
75 | ◉ *#mojok*
76 | ◉ *#addbacot* [bacotanmu]
77 | ◉ *#bacot*
78 | ◉ *#bacot* [nomor]
79 | ◉ *#mock* [kalimat]
80 | ◉ *#stalk* [username]
81 |
82 | 🖼 *ꜱᴛɪᴄᴋᴇʀ ᴢᴏɴᴇ* 🖼
83 | ◉ *#sticker* [send image]
84 | ◉ *#sticker toimg* [reply sticker]
85 | ◉ *#sticker* [url]
86 | ◉ *#emo* [emoji]
87 | ◉ *#memestiker* [teks atas] | [teks bawah]
88 | ◉ *#stext* [teks]
89 | ◉ *#gif* [send video/gif]
90 | ◉ *#giphy* [link]
91 |
92 | 🎧 *ᴍᴜꜱɪᴄ ᴢᴏɴᴇ* 🎧
93 | ◉ *#play* [judul lagu - artis]
94 | ◉ *#ytmp3* [link]
95 | ◉ *#yt* [link]
96 | ◉ *#ytvid* [query]
97 | ◉ *#ytfind* [query]
98 | ◉ *#joox* [judul lagu - artis]
99 | ◉ *#scplay* [judul lagu - artis]
100 | ◉ *#scfind* [judul lagu - artis]
101 | ◉ *#scdl* [link]
102 | ◉ *#findlyrics* [judul lagu - artis]
103 | ◉ *#getlirik* [link]
104 | ◉ *#lirik* [judul lagu - artis]
105 | ◉ *#lirik2* [judul lagu - artis]
106 |
107 | 📂 *ᴅᴏᴡɴʟᴏᴀᴅᴇʀ* 📂
108 | ◉ *#tiktok* [link]
109 | ◉ *#tw / #twitter* [link]
110 | ◉ *#fb* [link]
111 | ◉ *#ig* [link]
112 | ◉ *#igdp* [username]
113 | ◉ *#igp* (Private post download)
114 | ◉ *#igs* [username]
115 | ◉ *#goimg* [query.jumlah]
116 |
117 | 🔰 *ɢʀᴏᴜᴘ ᴄᴏᴍᴍᴀɴᴅ* 🔰
118 | ◉ *#ava* [reply pesan member]
119 | ◉ *#groupinfo*
120 | ◉ *#menuadmin*
121 | ◉ *#profile* [@member / NO WA]
122 | ◉ *#all* [pesan]
123 | ◉ *#reader* [reply pesan bot]
124 | ◉ *#tag* [pesan]
125 | ◉ *#getpic*
126 | ◉ *#listbadword*
127 | ◉ *#santet* [@member | alasan]
128 |
129 | 👑 *ᴀᴅᴍɪɴ ɢʀᴏᴜᴘ ᴛᴏᴏʟꜱ* 👑
130 | ◉ *#on / #off*
131 | ◉ *#filter* [on / off]
132 | ◉ *#antilink* [on / off]
133 | ◉ *#antisticker* [on / off]
134 | ◉ *#resetsticker* [NO WA / @member]
135 | ◉ *#resetbadword* [NO WA / @member]
136 | ◉ *#add* [NO WA]
137 | ◉ *#kick* [@member]
138 | ◉ *#promote* [@member]
139 | ◉ *#demote* [@member]
140 | ◉ *#setdp* [send image]
141 | ◉ *#getlink*
142 | ◉ *#resetlink*
143 | ◉ *#grouplock*
144 | ◉ *#groupunlock*
145 |
146 | 📢 *ᴍɢ ʙᴏᴛ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ* 📢
147 | ◉ *#about*
148 | ◉ *#cekprem*
149 | ◉ *#donasi*
150 | ◉ *#getbot*
151 | ◉ *#min* [Pesan]
152 | ◉ *#req* [fitur]
153 | ◉ *#bug* [deskripsi bug]
154 | ◉ *#ping*
155 | ◉ *#update*
156 | ◉ *#stat*
157 | ◉ *#info*
158 | ₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋
159 | ⏰ *ᴡᴀᴋᴛᴜ ꜱᴇʀᴠᴇʀ ʙᴏᴛ* : ${moment} WIB
160 | 🗓️ *ᴛᴀɴɢɢᴀʟ* : ${tgl}
161 | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻
162 |
163 | 🛠 _*Menemukan bug? bot error? laporkan ke admin bot, kirim #bug [DESKRIPSI BUG]*_
164 | 🛠 _*Mau Request fitur? kirim #req [DESKRIPSI FITUR]*_
165 | 🛠 _*Mau Chat admin bot? kirim #min [PESAN KAMU]*_
166 |
167 | _ᴄᴏᴅᴇᴅ ᴡɪᴛʜ ❤ ꜰʀᴏᴍ ᴍᴀɢᴇʟᴀɴɢ_`
168 | }
169 |
170 | exports.textNulis = () => {
171 | return `
172 | *▸ Menu Bot Nulis*
173 | a. *#nuliskiri teks* = nulis di buku tulis lembar kiri
174 | b. *#nuliskanan teks* = nulis di buku tulis lembar kanan
175 | c. *#foliokiri teks* = nulis di kertas folio lembar kiri
176 | d. *#foliokanan teks* = nulis di kertas folio lembar kanan`
177 | }
178 |
179 | exports.textAdmin = () => {
180 | return `
181 | 👑 *ᴀᴅᴍɪɴ ɢʀᴏᴜᴘ ᴛᴏᴏʟꜱ* 👑
182 | ◉ *#on / #off*
183 | ◉ *#filter* [on / off]
184 | ◉ *#add* [NO WA]
185 | ◉ *#kick* [@member]
186 | ◉ *#promote* [@member]
187 | ◉ *#demote* [@member]
188 | ◉ *#setdp* [send image]
189 | ◉ *#getlink*
190 | ◉ *#resetlink*
191 | ◉ *#grouplock*
192 | ◉ *#groupunlock*`
193 | }
194 |
195 | exports.textPrem = () => {
196 | return `
197 | *Fitur Premium*
198 |
199 | a. Stiker No Background
200 | b. Join grup
201 | c. Brainly
202 | d. SimSimi chat
203 | e. Unlimited Quota bot
204 | f. Gift quota bot
205 | d. Ig stories download`
206 | }
207 |
208 | exports.textRules = () => {
209 | return `
210 | Rules Penggunaan *MG-Bot*
211 | - Dilarang Download Lagu/Video/File diatas 10 Menit
212 | - Dilarang Call/Telpon Bot karena akan terblokir otomatis oleh bot
213 | - Dilarang spam bot kalau bot tidak merespon
214 |
215 | [i] Apa itu limit quota?
216 | => Setiap pengguna bot akan diberi quota sebanyak 50
217 | => Cek limit dengan mengirimkan #limit
218 | => Jika quota telah habis, maka tidak dapat menggunakan bot
219 | => Limit quota bot akan di reset setiap pukul 00.00 WIB
220 | => Unlimited Quota bot untuk member premium
221 | => Untuk melihat status bot dan waktu bot, kirim #ping
222 |
223 | 1. Kami tidak bertanggung jawab jika terjadi sesuatu akibat penggunaan bot ini
224 | 2. Privasi data pengguna tetap kami jaga
225 | 3. Data chat yang anda kirimkan ke bot akan dihapus setiap 2 hari
226 | 4. Lapor jika terjadi masalah atau bot tidak bekerja caranya kirim #min penjelasan bug/error
227 | 5. Sebelum menggunakan bot, Tolong BACA #INFO dan pahami penjelasan penggunaan bot
228 |
229 | Apabila tidak mematuhi Syarat & Ketentuan maka akan dibanned
230 |
231 | Jika sewaktu - waktu bot mati karena banned oleh pihak WhatsApp, silahkan join channel telegram untuk mengetahui informasi update tentang bot ini
232 | Link Channel = t.me/infomg
233 | Group WA = https://chat.whatsapp.com/Gr3RSBZz48J9rYGOsAON3N`
234 | }
235 |
236 | exports.textLang = () => {
237 | return `
238 | *Daftar kode bahasa*
239 |
240 | af: Afrikaans sq: Albanian
241 | am: Amharic ar: Arabic
242 | hy: Armenian az: Azerbaijani
243 | eu: Basque be: Belarusian
244 | bn: Bengali bs: Bosnian
245 | bg: Bulgarian ca: Catalan
246 | ceb: Cebuano ny: Chichewa
247 | co: Corsican hr: Croatian
248 | cs: Czech da: Danish
249 | nl: Dutch en: English
250 | eo: Esperanto et: Estonian
251 | tl: Filipino fi: Finnish
252 | fr: French fy: Frisian
253 | gl: Galician ka: Georgian
254 | de: German el: Greek
255 | gu: Gujarati ht: Haitian Creole
256 | ha: Hausa haw: Hawaiian
257 | iw: Hebrew hi: Hindi
258 | hmn: Hmong hu: Hungarian
259 | is: Icelandic ig: Igbo
260 | id: Indonesian ga: Irish
261 | it: Italian ja: Japanese
262 | jw: Javanese kn: Kannada
263 | kk: Kazakh km: Khmer
264 | ko: Korean ku: Kurdish
265 | ky: Kyrgyz lo: Lao
266 | la: Latin lv: Latvian
267 | lt: Lithuanian lb: Luxembourgish
268 | mk: Macedonian mg: Malagasy
269 | ms: Malay ml: Malayalam
270 | mt: Maltese mi: Maori
271 | mr: Marathi mn: Mongolian
272 | my: Myanmar ne: Nepali
273 | no: Norwegian ps: Pashto
274 | fa: Persian pl: Polish
275 | pt: Portuguese ma: Punjabi
276 | ro: Romanian ru: Russian
277 | sm: Samoan gd: Scots Gaelic
278 | sr: Serbian st: Sesotho
279 | sn: Shona sd: Sindhi
280 | si: Sinhala sk: Slovak
281 | sl: Slovenian so: Somali
282 | es: Spanish su: Sundanese
283 | sw: Swahili sv: Swedish
284 | tg: Tajik ta: Tamil
285 | te: Telugu th: Thai
286 | tr: Turkish uk: Ukrainian
287 | ur: Urdu uz: Uzbek
288 | vi: Vietnamese cy: Welsh
289 | xh: Xhosa yi: Yiddish
290 | yo: Yoruba zu: Zulu`
291 | }
--------------------------------------------------------------------------------
/lib/scraper.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const request = require('request')
3 | const htmlToText = require('html-to-text');
4 | const moment = require('moment-timezone');
5 | const { parseString } = require('xml2js');
6 | moment.tz.setDefault('Asia/Jakarta').locale('id')
7 | var masgi = 'https://test.mumetndase.my.id'
8 | var baseuri = 'https://dataservice.accuweather.com'
9 | var getkey = '/locations/v1/search?apikey='
10 | var getloc = '/locations/v1/cities/geoposition/search?apikey='
11 | var getdata = '/currentconditions/v1/'
12 | var lang = '&language=id-id&details=true&offset=25'
13 | var accuweatherkey = 'get apikey here https://developer.accuweather.com/user/register'
14 |
15 | // get javanesse pasaran
16 | const tanggal = () => new Promise(resolve => {
17 | var pasaran = new Array('Legi', 'Pahing', 'Pon', 'Wage', 'Kliwon');
18 | var hari = moment().format('dddd');
19 | var tgal = moment().format('DD MMMM YYYY')
20 | var d2 = moment('2014-01-27');
21 | var d1 = moment();
22 | var selisih = Math.floor(Math.abs(d1 - d2) / 86400000);
23 | var pasar = pasaran[selisih % 5];
24 | const tgl = `${hari} ${pasar}, ${tgal}`
25 | resolve(tgl)
26 | })
27 |
28 | const lirik1 = async (judul) => new Promise(async (resolve, reject) => {
29 | const baseuri = 'http://scrap.terhambar.com'
30 | axios.get(baseuri + '/lirik?word=' + judul, {
31 | headers: {
32 | 'Content-Type': 'application/json'
33 | }
34 | }).then(res => {
35 | const hasil = res.data.result.lirik
36 | const status = res.data.status
37 | if (status == false) {
38 | resolve('ga ada')
39 | } else {
40 | resolve(hasil)
41 | }
42 | }).catch(err => {
43 | reject(err)
44 | })
45 | })
46 |
47 | const lirik2 = async (judul) => new Promise(async (resolve, reject) => {
48 | axios.get(uri + '/lirik?q=' + judul, {
49 | headers: {
50 | 'Content-Type': 'application/json'
51 | }
52 | }).then(res => {
53 | const mentah = res.data.result.result[0]
54 | if (mentah == undefined) {
55 | resolve('ga ada')
56 | } else {
57 | const hasil = mentah.url
58 | request.get(masgi + '/getlirik?url=' + hasil, {json: true}, (err, resp, body) => {
59 | const resul = body.result
60 | resolve(resul)
61 | })
62 | }
63 | }).catch(err => {
64 | reject(err)
65 | })
66 | })
67 |
68 | const finder = async (judul) => new Promise(async (resolve, reject) => {
69 | const baseurl = 'https://api.haipbis.xyz/findlyric?q='
70 | axios.get(baseurl + judul, {
71 | headers: {
72 | 'Content-Type': 'application/json'
73 | }
74 | }).then(async(res) => {
75 | const data = res.data.slice(0, 6)
76 | if (data == undefined) {
77 | resolve('ga ada')
78 | } else {
79 | let hasil = `🔎 *hasil pencarian lirik '${judul}'* 🔍\nCara get lirik, copy link lalu kirimkan #lirik link\n`
80 | hasil += ``;
81 | Object.keys(data).forEach(function (i) {
82 | hasil += `\n● Judul : ${data[i].title}\n● Artis : ${data[i].artist}\n● Link : ${data[i].link.replace('/add', '')}\n`;
83 | });
84 | hasil += '\n♪ *mg_BOT* ♪';
85 | resolve(hasil)
86 | }
87 | }).catch(err => {
88 | reject(err)
89 | })
90 | })
91 |
92 | const getlirik = async (url) => new Promise(async (resolve, reject) => {
93 | const baseurl = 'https://api.haipbis.xyz/getlyric?url='
94 | axios.get(baseurl + url, {
95 | headers: {
96 | 'Content-Type': 'application/json'
97 | }
98 | }).then(res => {
99 | const body = res.data
100 | if (body == 'You may want to head back to the homepage.If you think something is broken, report a problem.') {
101 | resolve('ga ada')
102 | } else {
103 | const hasil = body.lyric.replace('🇮🇹 Made with love & passion in Italy.\n 🌎 Enjoyed everywhere', 'Error, lirik tidak ditemukan')
104 | resolve(hasil)
105 | }
106 | }).catch(() => {
107 | reject(err)
108 | })
109 | })
110 |
111 | const cuaca = async (kota) => new Promise(async (resolve, reject) => {
112 | axios.get(masgi + '/cuaca?kota=' + kota, {
113 | headers: {
114 | 'Content-Type':'application/json'}
115 | })
116 | .then(res => {
117 | const eror = res.data.status
118 | const body = res.data.result
119 | if (eror == false) {
120 | resolve('Kota tidak ada dalam database')
121 | } else {
122 | const p = `🌤Prakiraan Cuaca🌦\nWilayah *_${body.kota}_*\n${body.hari}\n\n*Cuaca :* _${body.cuaca}_\n*Deskripsi :* _${body.deskripsi}_\n*Suhu Terasa :* _${body.suhu}_\n*Tekanan Udara :* _${body.tekanan}_\n*Kelembaban :* _${body.kelembapan}_\n*Kecepatan Angin :* _${body.angin}_`
123 | resolve(p)
124 | }
125 | })
126 | .catch(err => {
127 | reject(err)
128 | })
129 | })
130 |
131 | const sholat = async (kota) => new Promise(async (resolve, reject) => {
132 | axios.get(masgi + '/sholat?kota=' + kota, {
133 | headers: {
134 | 'Content-Type':'application/json'}
135 | })
136 | .then(res => {
137 | const eror = res.data.status
138 | const body = res.data
139 | if (eror == false) {
140 | resolve('Kota tidak ada dalam database')
141 | } else {
142 | const mentah = (body.data[0])
143 | const waktu = (body.data[0].tanggal)
144 | const wilayah = ('*Jadwal Sholat*\n' + `Wilayah *_${kota}_ dan sekitarnya*\n${waktu}\n\n`)
145 | const imsak = ('● *Imsak :* ' + `${mentah.imsak}\n`)
146 | const subuh = ('● *Subuh :* ' + `${mentah.subuh}\n`)
147 | const terbit = ('● *Terbit :* ' + `${mentah.terbit}\n`)
148 | const dzuhur = ('● *Dzuhur :* ' + `${mentah.dzuhur}\n`)
149 | const ashar = ('● *Ashar :* ' + `${mentah.ashar}\n`)
150 | const maghrib = ('● *Maghrib :* ' + `${mentah.maghrib}\n`)
151 | const isya = ('● *Isya :* ' + `${mentah.isya}\n`)
152 | const text = (wilayah + imsak + subuh + terbit + dzuhur + ashar + maghrib + isya + '\n\n_*ᴍɢ ʙᴏᴛ ᴊᴀᴅᴡᴀʟ ꜱʜᴏʟᴀᴛ*_')
153 | resolve(text)
154 | }
155 | })
156 | .catch(err => {
157 | reject(err)
158 | })
159 | })
160 |
161 | const kbbi = async (kata) => new Promise(async (resolve, reject) => {
162 | const baseuri = 'https://rest.farzain.com/api/kbbi.php?id='
163 | const apikey = '???'
164 | axios.get(baseuri + kata + '&apikey=' + apikey, {
165 | headers: {
166 | 'Content-Type':'application/json'}
167 | })
168 | .then(res => {
169 | const body = res.data
170 | if (body === "
") {
171 | resolve('ga ada')
172 | } else {
173 | const hasil = htmlToText.fromString(body, {
174 | wordwrap: 500
175 | });
176 | resolve(hasil)
177 | }
178 | })
179 | .catch(err => {
180 | reject(err)
181 | })
182 | })
183 |
184 | const wiki = async (kata) => new Promise(async (resolve, reject) => {
185 | const baseuri = 'https://api-mumetndase.herokuapp.com/api/wiki?q='
186 | axios.get(baseuri + kata, {
187 | headers: {
188 | 'Content-Type':'application/json'}
189 | })
190 | .then(res => {
191 | const body = res.data.result
192 | const status = res.data.status
193 | if (status === false) {
194 | resolve('ga ada')
195 | } else {
196 | resolve(body)
197 | }
198 | })
199 | .catch(err => {
200 | reject(err)
201 | })
202 | })
203 |
204 | const mojok = () => new Promise(async (resolve, reject) => {
205 | axios.get(masgi + '/mojok', {
206 | headers: {
207 | 'Content-Type':'application/json'}
208 | })
209 | .then(res => {
210 | const eror = res.data.status
211 | const data = res.data.data
212 | const caption = `*Link :* ${data.url}\n*Judul :* ${data.judul}\n*Post date :* ${data.date}\n*Kategori :* ${data.category}\n\n${data.article}`
213 | if (eror == false) {
214 | resolve('Error')
215 | } else {
216 | resolve(caption)
217 | }
218 | })
219 | .catch(err => {
220 | reject(err)
221 | })
222 | })
223 |
224 | const puisi1 = () => new Promise(async (resolve, reject) => {
225 | axios.get(masgi + '/puisi1', {
226 | headers: {
227 | 'Content-Type':'application/json'}
228 | })
229 | .then(res => {
230 | const eror = res.data.status
231 | const data = res.data.data
232 | if (eror == false) {
233 | resolve('Error')
234 | } else {
235 | resolve(data)
236 | }
237 | })
238 | .catch(err => {
239 | reject(err)
240 | })
241 | })
242 |
243 | const puisi2 = () => new Promise(async (resolve, reject) => {
244 | axios.get(masgi + '/puisi2', {
245 | headers: {
246 | 'Content-Type':'application/json'}
247 | })
248 | .then(res => {
249 | const eror = res.data.status
250 | const data = res.data.data
251 | if (eror == false) {
252 | resolve('Error')
253 | } else {
254 | resolve(data)
255 | }
256 | })
257 | .catch(err => {
258 | reject(err)
259 | })
260 | })
261 |
262 | const puisi3 = () => new Promise(async (resolve, reject) => {
263 | axios.get(masgi + '/puisi3', {
264 | headers: {
265 | 'Content-Type':'application/json'}
266 | })
267 | .then(res => {
268 | const eror = res.data.status
269 | const data = res.data.data
270 | if (eror == false) {
271 | resolve('Error')
272 | } else {
273 | resolve(data)
274 | }
275 | })
276 | .catch(err => {
277 | reject(err)
278 | })
279 | })
280 |
281 | const covid = () => new Promise(async (resolve, reject) => {
282 | const covid = 'https://coronavirus-19-api.herokuapp.com/countries/Indonesia'
283 | axios.get(covid, {
284 | headers: {
285 | 'Content-Type':'application/json'}
286 | })
287 | .then(res => {
288 | const body = res.data
289 | const judul = ('*Update Data Covid-19 Indonesia*')
290 | const positif = ('\n\n😷 *Positif :* ' + body.cases)
291 | const todaypositif = ('\n😷 *Hari ini :* ' + body.todayCases)
292 | const meninggal = ('\n☠ *Meninggal :* ' + body.deaths)
293 | const todaymeninggal = ('\n☠ *Hari ini :* ' + body.todayDeaths)
294 | const sembuh = ('\n☺ *Sembuh :* ' + body.recovered)
295 | const kata = ('\n\nTetap jaga kesehatan dan ikuti protokol kesehatan\n_#STAYATHOME-PAKAIMASKER_')
296 | const hasil = judul + positif + todaypositif + meninggal + todaymeninggal + sembuh + kata
297 | resolve(hasil)
298 | })
299 | .catch(err => {
300 | reject(err)
301 | })
302 | })
303 |
304 | const accuweather = async (kota) => new Promise(async (resolve, reject) => {
305 | // GET KEY LOKASI BY TEXT
306 | const lokasi = kota
307 | axios.get(baseuri + getkey + accuweatherkey + '&q=' + lokasi + lang, {
308 | headers: {
309 | 'Contet-Type': 'application/json'
310 | }
311 | }).then(res => {
312 | const mentah = res.data[0]
313 | if (mentah === undefined) {
314 | resolve('Wilayahmu tidak ada dalam database')
315 | } else {
316 | const locKey = mentah.Key
317 | //console.log(locKey)
318 | const daerah = mentah.LocalizedName
319 | const prov = mentah.AdministrativeArea.LocalizedName
320 | //GET CUACA BY KEY
321 | axios.get(baseuri + getdata + locKey + '?apikey=' + apiKey + '&language=id-id&details=true', {headers:{'Content-Type':'application/json'}})
322 | .then(res => {
323 | const datamentah = res.data[0]
324 | const waktu = moment(datamentah.EpochTime * 1000).format('HH:mm')
325 | const tgl = moment(datamentah.EpochTime * 1000).format('dddd, DD MMMM YYYY')
326 | const info = datamentah.WeatherText
327 | const temp = datamentah.RealFeelTemperature.Metric.Value + ' ℃'
328 | const lembab = datamentah.RelativeHumidity + ' %'
329 | const angin = datamentah.Wind.Speed.Metric.Value + ' ' + datamentah.Wind.Speed.Metric.Unit
330 | const angink = datamentah.WindGust.Speed.Metric.Value + ' ' + datamentah.WindGust.Speed.Metric.Unit
331 | const pandang = datamentah.Visibility.Metric.Value + ' ' + datamentah.Visibility.Metric.Unit
332 | const tekanan = datamentah.Pressure.Metric.Value + ' ' + datamentah.Pressure.Metric.Unit
333 | const awan = datamentah.CloudCover + ' %'
334 | const data = `Kondisi cuaca _*${daerah}, ${prov}*_\n𝐉𝐚𝐦 : ${waktu}\n𝐓𝐚𝐧𝐠𝐠𝐚𝐥 : ${tgl}\n₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋\n● Deskripsi : ${info}\n● Temperatur : ${temp}\n● Kelembapan : ${lembab}\n● Angin : ${angin}\n● Angin Kencang : ${angink}\n● Jarak Pandang : ${pandang}\n● Tekanan Udara : ${tekanan}\n● Tutupan Awan : ${awan}\n⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻\n_*ᴍɢ ʙᴏᴛ ᴡᴇᴀᴛʜᴇʀ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ*_`
335 | //console.log(data)
336 | resolve(data)
337 | }).catch(err => {
338 | //console.log(err)
339 | reject('Wilayahmu tidak ada dalam database' + err)
340 | })
341 | }
342 | }).catch(err => {
343 | reject(err)
344 | console.log(err)
345 | })
346 | })
347 |
348 |
349 | const accuweatherloc = async (latitude, longitude) => new Promise(async (resolve, reject) => {
350 | // GET KEY LOKASI BY LONG LAT
351 | const lat = latitude
352 | const long = longitude
353 | axios.get(baseuri + getloc + accuweatherkey + '&q=' + lat + '%2C' + long + '&language=id-id&details=true', {
354 | headers: {
355 | 'Contet-Type': 'application/json'
356 | }
357 | }).then(res => {
358 | //console.log(res)
359 | const mentah = res.data
360 | if (mentah === undefined) {
361 | resolve('Wilayahmu tidak ada dalam database')
362 | } else {
363 | const locKey = mentah.Key
364 | //console.log(locKey)
365 | const daerah = mentah.LocalizedName
366 | const prov = mentah.AdministrativeArea.LocalizedName
367 | //GET CUACA BY KEY
368 | axios.get(baseuri + getdata + locKey + '?apikey=' + apiKey + '&language=id-id&details=true', {headers:{'Content-Type':'application/json'}})
369 | .then(res => {
370 | const datamentah = res.data[0]
371 | const waktu = moment(datamentah.EpochTime * 1000).format('HH:mm')
372 | const tgl = moment(datamentah.EpochTime * 1000).format('dddd, DD MMMM YYYY')
373 | const info = datamentah.WeatherText
374 | const temp = datamentah.RealFeelTemperature.Metric.Value + ' ℃'
375 | const lembab = datamentah.RelativeHumidity + ' %'
376 | const angin = datamentah.Wind.Speed.Metric.Value + ' ' + datamentah.Wind.Speed.Metric.Unit
377 | const angink = datamentah.WindGust.Speed.Metric.Value + ' ' + datamentah.WindGust.Speed.Metric.Unit
378 | const pandang = datamentah.Visibility.Metric.Value + ' ' + datamentah.Visibility.Metric.Unit
379 | const tekanan = datamentah.Pressure.Metric.Value + ' ' + datamentah.Pressure.Metric.Unit
380 | const awan = datamentah.CloudCover + ' %'
381 | const data = `Kondisi cuaca _*${daerah}, ${prov}*_\n𝐉𝐚𝐦 : ${waktu}\n𝐓𝐚𝐧𝐠𝐠𝐚𝐥 : ${tgl}\n₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋\n● Deskripsi : ${info}\n● Temperatur : ${temp}\n● Kelembapan : ${lembab}\n● Angin : ${angin}\n● Angin Kencang : ${angink}\n● Jarak Pandang : ${pandang}\n● Tekanan Udara : ${tekanan}\n● Tutupan Awan : ${awan}\n⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻\n_*ᴍɢ ʙᴏᴛ ᴡᴇᴀᴛʜᴇʀ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ*_`
382 | //console.log(data)
383 | resolve(data)
384 | }).catch(err => {
385 | //console.log(err)
386 | reject(err)
387 | })
388 | }
389 | }).catch(err => {
390 | reject(err)
391 | console.log(err)
392 | })
393 | })
394 |
395 | const simi = async (tanya) => new Promise(async (resolve, reject) => {
396 | var apiKey = 'get apikey here https://workshop.simsimi.com/en/login'
397 | const takon = tanya
398 | const headers = {
399 | "Content-Type": "application/json",
400 | "x-api-key": apiKey,
401 | };
402 | const options = {
403 | utext: takon,
404 | lang: "id",
405 | country: ["ID"],
406 | atext_bad_prob_max: 0.5,
407 | }
408 | await axios.post("https://wsapi.simsimi.com/190410/talk",options,{headers: headers,})
409 | .then(re => {
410 | resolve(re.data.atext);
411 | })
412 | .catch(error => {
413 | //console.log(error)
414 | resolve(`Simsimi Error`);
415 | });
416 | })
417 |
418 | const gempa = () => new Promise(async (resolve, reject) => {
419 | const uri = 'https://data.bmkg.go.id/autogempa.xml'
420 | axios.get(uri,).then(res => {
421 | parseString(res.data, function (err, result) {
422 | result = result.Infogempa.gempa[0];
423 | let hasils = `_*Informasi Gempa BMKG*_
424 | ₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋
425 | ● Tanggal : ${result.Tanggal}
426 | ● Jam : ${result.Jam}
427 | ● Magnitudo : ${result.Magnitude}
428 | ● Kedalaman : ${result.Kedalaman}
429 | ● Lintang : ${result.Lintang}
430 | ● Bujur : ${result.Bujur}
431 | ● Lokasi 1 : ${result.Wilayah1}
432 | ● Lokasi 2 : ${result.Wilayah2}
433 | ● Lokasi 3 : ${result.Wilayah3}
434 | ● Lokasi 4 : ${result.Wilayah4}
435 | ● Lokasi 5 : ${result.Wilayah5}
436 | ● Potensi : ${result.Potensi}
437 | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻
438 | _*ᴍɢ ʙᴏᴛ ʙᴍᴋɢ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ*_`
439 | resolve(hasils)
440 | })
441 | })
442 | })
443 |
444 | module.exports = {
445 | lirik1,
446 | lirik2,
447 | finder,
448 | getlirik,
449 | cuaca,
450 | sholat,
451 | kbbi,
452 | wiki,
453 | tanggal,
454 | mojok,
455 | puisi1,
456 | puisi2,
457 | puisi3,
458 | covid,
459 | accuweather,
460 | accuweatherloc,
461 | simi,
462 | gempa,
463 | };
464 |
--------------------------------------------------------------------------------