{"id":30069112,"url":"https://github.com/itsreimau/gktw","last_synced_at":"2025-08-08T11:02:44.190Z","repository":{"id":308839942,"uuid":"1030645537","full_name":"itsreimau/gktw","owner":"itsreimau","description":"Useless Baileys Wrapper","archived":false,"fork":false,"pushed_at":"2025-08-08T07:14:38.000Z","size":105,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-08T08:26:54.342Z","etag":null,"topics":["baileys","baileys-md","bot","md","whatsapp","whatsapp-api","whatsapp-bot","whatsapp-web"],"latest_commit_sha":null,"homepage":"https://github.com/itsreimau/gaxtawu","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/itsreimau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-02T03:04:56.000Z","updated_at":"2025-08-08T07:14:42.000Z","dependencies_parsed_at":"2025-08-08T08:38:24.718Z","dependency_job_id":null,"html_url":"https://github.com/itsreimau/gktw","commit_stats":null,"previous_names":["itsreimau/gktw"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/itsreimau/gktw","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itsreimau%2Fgktw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itsreimau%2Fgktw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itsreimau%2Fgktw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itsreimau%2Fgktw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/itsreimau","download_url":"https://codeload.github.com/itsreimau/gktw/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/itsreimau%2Fgktw/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269410216,"owners_count":24412155,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-08T02:00:09.200Z","response_time":72,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["baileys","baileys-md","bot","md","whatsapp","whatsapp-api","whatsapp-bot","whatsapp-web"],"created_at":"2025-08-08T11:01:45.115Z","updated_at":"2025-08-08T11:02:44.181Z","avatar_url":"https://github.com/itsreimau.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# \u003cdiv align=\"center\"\u003e@itsreimau/gktw - Useless Baileys Wrapper\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://www.ultraimagehub.com/wallpapers/tr:flp-false,gx-0.6,gy-0.5,q-75,rh-3264,rw-5824,th-1080,tw-1920/1237967402915074098.jpeg\" alt=\"Banner\" /\u003e\n\u003c/div\u003e\n\n## 📖 Table of Contents\n\n- [Important Note](#-important-note)\n- [Installation](#-installation)\n- [Key Features](#-key-features)\n- [Quick Start](#-quick-start)\n  - [Basic Example](#-basic-example)\n  - [Using Events](#-using-events)\n- [Client Configuration](#-client-configuration)\n- [Custom Authentication](#-custom-authentication)\n- [Events Reference](#-events-reference)\n- [Command System](#-command-system)\n  - [Command Options](#-command-options)\n  - [Command Handler](#-command-handler)\n- [Middleware System](#-middleware-system)\n- [Cooldown System](#-cooldown-system)\n- [Message Sending](#-message-sending)\n- [Text Formatting](#-text-formatting)\n- [Media Handling](#-media-handling)\n- [Message Editing](#-message-editing)\n- [Message Deletion](#-message-deletion)\n- [Poll Messages](#-poll-messages)\n- [Builders](#-builders)\n  - [Contact Builder](#-contact-builder)\n- [Collectors](#-collectors)\n  - [Message Collector](#-message-collector)\n  - [Awaited Messages](#-awaited-messages)\n- [Mentions](#-mentions)\n  - [Manual Mentions](#-manual-mentions)\n  - [Auto Mentions](#-auto-mentions)\n  - [Get Mentions](#-get-mentions)\n- [Group Management](#-group-management)\n- [Miscellaneous Utilities](#-miscellaneous-utilities)\n- [Acknowledgements](#-acknowledgements)\n\n## ⚠️ Important Note\n\nThis is a custom fork of [@mengkodingan/ckptw](https://npmjs.com/package/@mengkodingan/ckptw) **only for [gaxtawu](https://github.com/itsreimau/gaxtawu)**.\n\n🚫 **Not recommended for other projects** – consider these alternatives instead:\n- [@aidulcandra/simple-wa-bot](https://www.npmjs.com/package/@aidulcandra/simple-wa-bot)\n- [@neoxr/wb](https://www.npmjs.com/package/@neoxr/wb)\n- [wachan](https://www.npmjs.com/package/wachan)\n- [zaileys](https://www.npmjs.com/package/zaileys)\n\n🔧 Original functions remain (see [original docs](https://npmjs.com/package/@mengkodingan/ckptw)).\n\n## 📥 Installation\n\n```bash\nnpm install github:itsreimau/gktw\n```\n\n## ✨ Key Features\n\n- **✨ Effortless** - Simple and intuitive API\n- **🔧 Fixed @lid \u0026 @jid** - Resolved WhatsApp group @lid and @jid issues\n- **🧱 Builder** - Build complex messages easily\n- **🛒 Built-in Collector, Cooldown, Command Handle** - Essential utilities included\n- **🚀 Middleware System** - Intercept and process messages\n- **💽 Custom Auth Adapter** - Flexible session storage options\n- **📦 Group Metadata Caching** - Prevents API overlimit with efficient caching\n- **🔌 CommonJS Only** - Optimized for CJS environments\n- **🎉 And more!** - Extensive WhatsApp feature support\n\n## 🚀 Quick Start\n\n### ▸ Basic Example\n\n```js\nconst { Client, Events, MessageType } = require(\"@itsreimau/gktw\");\n\nconst bot = new Client({\n    prefix: \"!\",\n    printQRInTerminal: true,\n    readIncomingMsg: true\n});\n\nbot.ev.once(Events.ClientReady, (m) =\u003e {\n    console.log(`Bot ready as ${m.user.id}`);\n});\n\nbot.command(\"ping\", async (ctx) =\u003e await ctx.reply(\"Pong!\"));\nbot.command(\"hi\", async (ctx) =\u003e await ctx.reply(\"Hello! String replies work too!\"));\n\nbot.hears(\"test\", async (ctx) =\u003e await ctx.reply(\"Testing?\"));\nbot.hears(MessageType.stickerMessage, async (ctx) =\u003e await ctx.reply(\"Cool sticker!\"));\nbot.hears([\"help\", \"menu\"], async (ctx) =\u003e await ctx.reply(\"Array matching works!\"));\nbot.hears(/(using\\s?)?regex/, async (ctx) =\u003e await ctx.reply(\"Regex matching works!\"));\n\nbot.launch();\n```\n\n### ▸ Using Events\n\n```js\nconst { Client, Events } = require(\"@itsreimau/gktw\");\n\nconst bot = new Client({\n    prefix: \"!\",\n    printQRInTerminal: true,\n    readIncomingMsg: true\n});\n\nbot.ev.once(Events.ClientReady, (m) =\u003e {\n    console.log(`Bot ready as ${m.user.id}`);\n});\n\nbot.ev.on(Events.MessagesUpsert, async (m, ctx) =\u003e {\n    if (m.key.fromMe) return;\n    if (m.content === \"Does this impact the lore?\") {\n        await ctx.reply(\"Yes Rei, it does.\");\n    }\n});\n\nbot.launch();\n```\n\n## ⚙️ Client Configuration\n\n```js\nClientOptions {\n    prefix: Array\u003cstring\u003e | string | RegExp; // Bot prefix(es)\n    readIncomingMsg?: boolean; // Mark incoming messages as read (default: false)\n    authDir?: string; // Path to auth directory (default: \"./state\")\n    printQRInTerminal?: boolean; // Display QR in terminal (default: false)\n    qrTimeout?: number; // QR regeneration timeout in ms (default: 60000)\n    markOnlineOnConnect?: boolean; // Mark online on connect (default: true)\n    phoneNumber?: string; // Bot phone number with country code (e.g. '62xxx')\n    usePairingCode?: boolean; // Use pairing code instead of QR (default: false)\n    customPairingCode?: string; // Custom pairing code\n    selfReply?: boolean; // Allow bot to respond to itself (default: false)\n    WAVersion?: [number, number, number]; // Custom WhatsApp version\n    autoMention?: boolean; // Auto-convert @mentions (default: false)\n    authAdapter?: Promise\u003cany\u003e; // Custom auth adapter\n    browser?: WABrowserDescription; // Browser configuration\n}\n```\n\n## 🔐 Custom Authentication\n\nUse alternative auth storage adapters:\n\n```js\nconst { useMySQLAuthState } = require(\"mysql-baileys\");\n\nconst bot = new Client({\n    authAdapter: useMySQLAuthState({\n        session: \"botwangsap\",\n        password: \"admin#123\",\n        database: \"baileys\"\n    })\n    // ... Other options\n});\n```\n\n## 📡 Events Reference\n\nAvailable events for handling various WhatsApp activities:\n\n```js\nconst { Events } = require(\"@itsreimau/gktw\");\n\n// Example event usage\nbot.ev.on(Events.MessagesUpsert, (m, ctx) =\u003e {\n    console.log(\"New message:\", m);\n});\n```\n\n**Available Events:**\n\n- `ClientReady`: Bot initialization complete\n- `MessagesUpsert`: New message received\n- `QR`: QR code generated\n- `GroupsJoin`: Bot joined a group\n- `UserJoin`: User joined a group\n- `UserLeave`: User left a group\n- `Poll`: Poll created\n- `PollVote`: Poll vote received\n- `Reactions`: Message reaction\n- `Call`: Incoming/outgoing call\n- `ConnectionUpdate`: Connection status change\n\n## 🛠️ Command System\n\n### ▸ Command Options\n\nCommands can be defined in two ways:\n\n1. Simple string command:\n\n```js\nbot.command(\"ping\", async (ctx) =\u003e await ctx.reply(\"Pong!\"));\n```\n\n2. Full command object:\n\n```js\nbot.command({\n    name: \"ping\",\n    aliases: [\"p\"], // Optional aliases\n    code: async (ctx) =\u003e await ctx.reply(\"Pong!\")\n});\n```\n\n### ▸ Command Handler\n\nFor better organization, commands can be split into separate files:\n\n#### ▸ Main File Setup\n\n```js\nconst { CommandHandler } = require(\"@itsreimau/gktw\");\nconst path = require(\"path\");\n\nconst cmd = new CommandHandler(bot, path.resolve(__dirname, \"commands\"));\ncmd.load(true); // Set to false to suppress loading logs\n```\n\n#### ▸ Command File Structure\n\n```js\n// commands/ping.js\nmodule.exports = {\n    name: \"ping\",\n    code: async (ctx) =\u003e {\n        await ctx.reply(\"Pong!\");\n    }\n};\n\n// commands/greeting.js (hears type example)\nmodule.exports = {\n    name: \"greeting\",\n    type: \"hears\", // Can be \"command\" or \"hears\"\n    code: async (ctx) =\u003e {\n        await ctx.reply(\"Hello there!\");\n    }\n};\n```\n\n## 🔄 Middleware System\n\nMiddleware allows pre-processing of messages before command execution:\n\n```js\nbot.use(async (ctx, next) =\u003e {\n    console.log(`Received message: ${ctx.msg.content}`);\n\n    // Example: Block messages from specific users\n    if (ctx.sender.id === \"1234@s.whatsapp.net\") return await ctx.reply(\"You are blocked!\");\n\n    await next(); // Continue processing\n});\n```\n\n**Key Notes:**\n\n- Middlewares execute in registration order\n- Call `next()` to continue processing\n- Return early to block command execution\n\n## ⏳ Cooldown System\n\nPrevent command spamming with cooldowns:\n\n```js\nconst { Cooldown } = require(\"@itsreimau/gktw\");\n\nbot.command(\"ping\", async (ctx) =\u003e {\n    const cd = new Cooldown(ctx, 8000); // 8 second cooldown\n\n    if (cd.onCooldown) return await ctx.reply(`Please wait ${cd.timeleft}ms before using this again`);\n\n    await ctx.reply(\"Pong!\");\n\n    // Optional cooldown end handler\n    cd.on(\"end\", () =\u003e {\n        console.log(\"Cooldown expired\");\n    });\n});\n```\n\n**Cooldown Properties:**\n\n- `onCooldown`: Boolean indicating if active\n- `timeleft`: Remaining time in milliseconds\n\n## 💬 Message Sending\n\nVarious message types can be sent:\n\n```js\n// Text message\nawait ctx.reply(\"Hello world!\");\n\n// Image with caption\nawait ctx.reply({ image: { url: \"https://example.com/image.jpg\" }, caption: \"Check this out!\" });\n\n// Audio message\nawait ctx.reply({ audio: { url: \"./sound.mp3\" }, mimetype: \"audio/mp4\", ptt: true /* Send as voice note */ });\n\n// Video message\nconst fs = require(\"fs\");\nawait ctx.reply({ video: fs.readFileSync(\"./video.mp4\"), caption: \"Watch this!\", gifPlayback: false });\n\n// Sticker\nawait ctx.reply({ sticker: { url: \"./sticker.webp\" } });\n```\n\nFor buttons and interactive messages, refer to [Baileys documentation](https://www.npmjs.com/package/@yupra/baileys).\n\n## 🎨 Text Formatting\n\nFormat messages with WhatsApp's text styles:\n\n```js\nconst { Formatter } = require(\"@itsreimau/gktw\");\n\nawait ctx.reply(Formatter.bold(\"Does this impact the lore?\"));\n```\n\nSupported formatting functions:\n\n- `Formatter.bold(text)`\n- `Formatter.italic(text)`\n- `Formatter.strikethrough(text)`\n- `Formatter.quote(text)`\n- `Formatter.inlineCode(text)`\n- `Formatter.monospace(text)`\n- `Formatter.smallCaps(text)`\n\n## 🖼️ Media Handling\n\nDownload and process media attachments:\n\n```js\nconst { MessageType } = require(\"@itsreimau/gktw\");\nconst fs = require(\"fs\");\n\nbot.ev.on(Events.MessagesUpsert, async (m, ctx) =\u003e {\n    if (ctx.getMessageType() === MessageType.imageMessage) {\n        const buffer = await ctx.msg.media.toBuffer();\n        fs.writeFileSync(\"image.jpeg\", buffer);\n        await ctx.reply(\"Image saved!\");\n    }\n});\n```\n\n**Media Access Methods:**\n\n```js\n// Current message\nawait ctx.msg.media.toBuffer();\nawait ctx.msg.media.toStream();\n\n// Quoted message\nawait ctx.quoted?.media.toBuffer();\nawait ctx.quoted?.media.toStream();\n```\n\n## ✏️ Message Editing\n\nEdit sent messages:\n\n```js\nconst sentMsg = await ctx.reply(\"Does this impact the lore?\");\nawait ctx.editMessage(sentMsg.key, \"Yes Rei, it does.\");\n```\n\n## 🗑️ Message Deletion\n\nDelete messages:\n\n```js\nconst sentMsg = await ctx.reply(\"Third Impact!\");\nawait ctx.deleteMessage(sentMsg.key);\n```\n\n## 📊 Poll Messages\n\nCreate polls:\n\n```js\nawait ctx.sendPoll(ctx.id, { name: \"Does this impact the lore?\", values: [\"Yes Rei, it does.\", \"No!\"], singleSelect: true /* Allow only one selection */ });\n```\n\n## 🧱 Builders\n\n### ▸ Contact Builder\n\nCreate and send contact cards:\n\n```js\nconst { VCardBuilder } = require(\"@itsreimau/gktw\");\n\nconst vcard = new VCardBuilder()\n    .setFullName(\"Ayanami Rei\")\n    .setOrg(\"NERV\")\n    .setNumber(\"1234\")\n    .build();\n\nawait ctx.reply({ contacts: { displayName: \"Rei\", contacts: [{ vcard }] } });\n```\n\n## 📥 Collectors\n\nCollect messages with flexible filtering:\n\n### ▸ Message Collector\n\n```js\nconst col = ctx.MessageCollector({\n    time: 10000, // 10 second timeout\n    max: 5, // Max 5 messages\n    filter: (m) =\u003e m.sender === ctx.sender.id, // Only collect from sender\n    hears: [\"1234@s.whatsapp.net\", \"4321@g.us\"] // You can also collect from other chats\n});\n\nawait ctx.reply(\"Say something... (10s timeout)\");\n\ncol.on(\"collect\", async (m) =\u003e {\n    await ctx.reply(`Collected: ${m.content}`);\n});\n\ncol.on(\"end\", async (_, reason) =\u003e {\n    await ctx.reply(`Collection ended: ${reason}`);\n});\n```\n\n### ▸ Awaited Messages\n\nSimplified message collection:\n\n```js\nctx.awaitMessages({ time: 10000 })\n    .then(async (messages) =\u003e await ctx.reply(`Got ${messages.length} messages`))\n    .catch(async () =\u003e await ctx.reply(\"Timed out\"));\n```\n\n## 📍 Mentions\n\n### ▸ Manual Mentions\n\n```js\nawait ctx.reply({ text: \"Get in the EVA, @1234!\", mentions: [\"1234@s.whatsapp.net\"] /* Full JID required */ });\n```\n\n### ▸ Auto Mentions\n\nEnable in client config:\n\n```js\nconst bot = new Client({\n    autoMention: true // Enable automatic mention conversion\n});\n\n// Now @mentions will work automatically\nawait ctx.reply(\"Get in the EVA, @1234!\"); // No need for mentions array\n```\n\n### ▸ Get Mentions\n\nExtract mentioned users from message:\n\n```js\nawait ctx.getMentioned(); /* Returns array of JIDs like [\"1234@s.whatsapp.net\"]\n```\n\n## 👥 Group Management\n\nComprehensive group control:\n\n```js\n// Create group\nawait ctx.groups.create(\"NERV\", [\"1234@s.whatsapp.net\"]);\n\n// Group utilities\nconst group = await ctx.group(); // Current group\nconst group = await ctx.group(\"1234@g.us\"); // Specify JID\n\n// Common operations\nawait group.members();\nawait group.inviteCode();\nawait group.revokeInviteCode();\nawait group.joinApproval(\"on\"); // Available: on, off\nawait group.leave();\nawait group.membersCanAddMemberMode(\"on\"); // Available: on, off\nawait group.metadata();\nawait group.getMetadata(\"subject\"); // Available: subject, desc, owner, etc.\nawait group.name();\nawait group.description();\nawait group.owner();\nawait group.isAdmin(\"1234@s.whatsapp.net\");\nawait group.isOwner(\"1234@s.whatsapp.net\");\nawait group.isSenderAdmin();\nawait group.isOwnerAdmin();\nawait group.isBotAdmin();\nawait group.toggleEphemeral(69);\nawait group.updateDescription(\"Does this impact the lore?\");\nawait group.updateSubject(\"NERV\");\nawait group.membersUpdate([\"1234@s.whatsapp.net\"], \"remove\"); // Available: remove, add, promote, demote\nawait group.kick([\"1234@s.whatsapp.net\"]);\nawait group.add([\"1234@s.whatsapp.net\"]);\nawait group.promote([\"1234@s.whatsapp.net\"]);\nawait group.demote([\"1234@s.whatsapp.net\"]);\nawait group.pendingMembers();\nawait group.pendingMembersUpdate([\"1234@s.whatsapp.net\"], \"reject\"); // Available: reject, approve\nawait group.approvePendingMembers([\"1234@s.whatsapp.net\"]);\nawait group.rejectPendingMembers([\"1234@s.whatsapp.net\"]);\nawait group.updateSetting(\"announcement\"); // Available: announcement, not_announcement, locked, unlocked\nawait group.open();\nawait group.close();\nawait group.lock();\nawait group.unlock();\n```\n\n## 🔧 Miscellaneous Utilities\n\n```js\nconst { Browsers, fetchLatestWaWebVersion, getContentType, generateWAMessageFromContent, proto } = require(\"@itsreimau/gktw\"); // Maybe if you need some Baileys functionality\n\n// Message reactions \u0026 pin\nawait ctx.react(ctx.id, \"👍\");\nawait ctx.pin(ctx.id, \"86400\");\n\n// Get message details\nctx.args;\nctx.sender;\nctx.quoted;\nctx.me;\n\n// Presence updates\nctx.simulateTyping();\nctx.simulateRecording();\n\n// Profile management\nbot.bio(\"GOD'S IN HIS HEAVEN, ALL'S RIGHT WITH THE WORLD\");\nawait bot.fetchBio(\"1234@s.whatsapp.net\");\n\n// Block management\nawait ctx.block(\"1234@s.whatsapp.net\");\nawait ctx.unblock(\"1234@s.whatsapp.net\");\n\n// Utility methods\nctx.isGroup();\nctx.getDevice(\"1234@s.whatsapp.net\");\nctx.getPushname(\"1234@s.whatsapp.net\");\n\n// Accessing Baileys objects\nbot.core;\nctx.core;\n```\n\n## 🙏 Acknowledgements\n\nSpecial thanks to:\n\n- [Jastin Linggar Tama](https://github.com/JastinXyz) for original ckptw\n- [NaufalYP1](https://github.com/NaufalYuPra) for Baileys modification\n- [WhiskeySockets](https://github.com/WhiskeySockets) for Baileys maintenance\n- All contributors and users","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitsreimau%2Fgktw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fitsreimau%2Fgktw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fitsreimau%2Fgktw/lists"}