{"id":14987187,"url":"https://github.com/laxeder/rompot","last_synced_at":"2025-04-07T11:04:06.054Z","repository":{"id":63813697,"uuid":"570882235","full_name":"laxeder/rompot","owner":"laxeder","description":"Biblioteca para desenvolvimento de bot multi-plataforma.","archived":false,"fork":false,"pushed_at":"2024-10-15T22:04:43.000Z","size":1635,"stargazers_count":39,"open_issues_count":1,"forks_count":16,"subscribers_count":4,"default_branch":"main","last_synced_at":"2024-10-21T01:33:36.507Z","etag":null,"topics":["telegram","telegram-api","telegram-bot","whatsapp","whatsapp-api","whatsapp-bot"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/laxeder.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}},"created_at":"2022-11-26T12:45:02.000Z","updated_at":"2024-10-15T22:04:47.000Z","dependencies_parsed_at":"2023-10-13T13:30:39.428Z","dependency_job_id":"b49d3d01-1bbc-4f96-8d1e-064e1968113a","html_url":"https://github.com/laxeder/rompot","commit_stats":{"total_commits":840,"total_committers":7,"mean_commits":120.0,"dds":0.06190476190476191,"last_synced_commit":"900a3d9b77831bd60641ef4fa72d6f2ec4417bb4"},"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laxeder%2Frompot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laxeder%2Frompot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laxeder%2Frompot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laxeder%2Frompot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/laxeder","download_url":"https://codeload.github.com/laxeder/rompot/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247640461,"owners_count":20971557,"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","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":["telegram","telegram-api","telegram-bot","whatsapp","whatsapp-api","whatsapp-bot"],"created_at":"2024-09-24T14:14:13.531Z","updated_at":"2025-04-07T11:04:06.035Z","avatar_url":"https://github.com/laxeder.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rompot\n\nUma biblioteca para desenvolvimento de ChatBot multi-plataforma em JavaScript/TypeScript\n\n## 🛠 Recursos\n\n- [x] Simples uso\n- [x] Criação de comandos\n- [x] Resposta rápida\n- [x] Tratamento de solicitações\n- [x] Tratamento de conexão\n- [x] Alta personalização\n- [x] Suporte a Cluster (Beta)\n\n| Plataformas            | Whatsapp | Telegram (Beta) |\n| ----------------------- | -------- | --------------- |\n| Recebimento de mensagem | ✅       | ✅              |\n| Envio de texto          | ✅       | ✅              |\n| Envio de mídia          | ✅       | ✅              |\n| Envio de stickers       | ✅       | ✅              |\n| Envio de lista          | ❌       | ❌              |\n| Envio de botão          | ❌       | ❌              |\n| Envio de enquete        | ✅       | ✅              |\n| Criação de chats        | ✅       | 🔧              |\n| Histórico de mensagens  | ✅       | ❌              |\n\n### 🔧 Instalação\n\nInstalando pacote\n\n```sh\nnpm i rompot\n```\n\nImportando pacote\n\n```ts\n// TypeScript\nimport Client, { WhatsAppBot, TelegramBot } from \"rompot\";\n\n// Javascript\nconst { Client, WhatsAppBot, TelegramBot } = require(\"rompot\");\n```\n\n## WhatsApp\n\nApós iniciar o bot um QR Code será emprimido no terminal, escane-o com seu WhatsApp para gerar uma nova conexão entre seu número e o Client. Essa conexão será guardada em `./path-to-auth`, para gerar uma nova delete-o ou se conecte com um novo caminho de sessão.\n\n```ts\nconst client = new Client(new WhatsAppBot());\nclient.connect(\"./path-to-auth\");\n\nclient.on(\"qr\", (qr) =\u003e {\n  console.log(\"Scan QR:\", qr);\n});\n```\n\n## Parear código\n\nNecessita passar um método de autenticação personalizado incluindo o número do bot a ser conectado.\n\n```ts\nimport Client, { WhatsAppBot, MultiFileAuthState } from \"rompot\";\n\nconst client = new Client(new WhatsAppBot());\n\nclient.on(\"code\", (code) =\u003e {\n  console.info(\"Código de pareamento gerado:\", code);\n});\n\nconst botPhoneNumber = \"5511991234567\";\n\nconst auth = new MultiFileAuthState(\"./path-to-auth\", botPhoneNumber));\n\nawait client.connect(auth);\n```\n\n## Telegram (Beta)\n\nAltere o valor `BOT_TOKEN` para o token do seu bot para se conectar a ele, acaso não tenha consulte a documentação do [Telegram](https://core.telegram.org/bots/api) para gerar um.\n\n```ts\nconst client = new Client(new TelegramBot());\nclient.connect(\"BOT_TOKEN\");\n\nclient.on(\"open\", () =\u003e {\n  console.log(\"Bot conectado!\");\n});\n```\n\n## Configurações\n\n```ts\ntype ConnectionConfig = {\n  /** Desativa execução do comando automático */\n  disableAutoCommand: boolean;\n  /** Desativa os comandos para mensagem antiga */\n  disableAutoCommandForOldMessage: boolean;\n  /** Desativa a execução do comando automático para mensagens não oficiais */\n  disableAutoCommandForUnofficialMessage: boolean;\n  /** Desativa a digitação automatica */\n  disableAutoTyping: boolean;\n  /** Desativa a leitura automatica de uma mensagem */\n  disableAutoRead: boolean;\n  /** Máximo de reconexões possíveis */\n  maxReconnectTimes: number;\n  /** Tempo de aguarde para se reconectar */\n  reconnectTimeout: number;\n  /** Máximo de tentativas de solitação acaso a primeira falhe */\n  maxRequests: number;\n  /** Tempo necessário de aguardo para próxima tentativa de solicitação */\n  requestsDelay: number;\n  /** Tempo máximo de espera */\n  maxTimeout: number;\n};\n\nclient.config = config;\n```\n\n## ⚙️ Criando comandos\n\n```ts\nimport { CMDKey, Command, Message } from \"rompot\";\n\n// Cria um comando com o nome hello\n// Ao ser executado envia a mensagem \"Hello World!\"\nclass HelloCommand extends Command {\n  public onRead() {\n    this.keys = [CMDKey(\"hello\")];\n  }\n\n  public async onExec(message: Message) {\n    await message.reply(`Hello World!`);\n  }\n}\n\n// Listando comandos\nconst commands = [new HelloCommand(), new DateCommand()];\n\nclient.setCommands(commands);\n```\n\n## Eventos\n\n### Conexão\n\n```ts\nclient.on(\"open\", (open) =\u003e {\n  console.log(\"Cliente conectado!\");\n});\n\nclient.on(\"close\", (update) =\u003e {\n  console.info(`Cliente desconectou! Motivo: ${update.reason}`);\n});\n\nclient.on(\"stop\", (update) =\u003e {\n  if (update.isLogout) {\n    console.info(`Cliente desligado!`);\n  } else {\n    console.info(`Cliente parado!`);\n  }\n});\n\nclient.on(\"connecting\", (conn) =\u003e {\n  console.log(\"Conectando cliente...\");\n});\n\nclient.on(\"reconnecting\", (conn) =\u003e {\n  console.log(\"Reconectando cliente...\");\n});\n```\n\n### Mensagem\n\n```ts\nclient.on(\"message\", (message) =\u003e {\n  console.log(`Mensagem recebida de \"${message.user.name}\"`);\n\n  if (message.text == \"Oi\") {\n    message.reply(\"Olá\");\n  }\n});\n```\n\n### Usuários\n\n```ts\nclient.on(\"user\", async (update) =\u003e {\n  if (update.action == \"join\") {\n    await client.send(new Message(update.chat, `@${update.fromUser.id} entrou no grupo.`));\n  }\n\n  if (update.action == \"leave\") {\n    await client.send(new Message(update.chat, `@${update.fromUser.id} saiu do grupo...`));\n  }\n\n  if (update.action == \"add\") {\n    await client.send(new Message(update.chat, `Membro @${update.fromUser.id} adicionou o @${update.user.id} ao grupo!`));\n  }\n\n  if (update.action == \"remove\") {\n    client.send(new Message(update.chat, `Membro @${update.fromUser.id} removeu o @${update.user.id} do grupo.`));\n  }\n\n  if (update.action == \"promote\") {\n    client.send(new Message(update.chat, `Membro @${update.fromUser.id} promoveu o @${update.user.id} para admin!`));\n  }\n\n  if (update.action == \"demote\") {\n    await client.send(new Message(update.chat, `Membro @${update.fromUser.id} removeu o admin do @${update.user.id}.`));\n  }\n});\n```\n\n### Erro interno\n\n```ts\nclient.on(\"error\", (err) =\u003e {\n  console.error(`Um erro ocorreu: ${err}`);\n});\n```\n\n## Mensagem\n\n```ts\nimport { Message } from \"rompot\";\n\n// Chat\nconst chat = new Chat(\"id12345\");\n\n// Criar mensagem\nconst msg = new Message(chat, \"texto\");\n\n// Enviar mensagem\nconst saveMsg = await client.send(msg);\n\n// Edita uma mensagem enviada\nawait client.editMessage(saveMsg, \"novo texto\");\n\n// Mencionar usuário\nmsg.mentions.push(\"userId\");\n\n// Marcar mensagem\nmsg.mention = message;\n\n// Responder mensagem\nmsg.reply(message);\n\n// Visualiza uma mensagem recebida\nmsg.read();\n\n// Reage a mensagem\nmsg.addReaction(\"❤\");\n\n// Remove a reação de uma mensagem\nmsg.removeReaction();\n```\n\n## Mensagem de mídia\n\n```ts\nimport { ImageMessage, VideoMessage, AudioMessage, FileMessage, StickerMessage } from \"rompot\";\n\n// Criar mensagem de audio\nconst audioMessage = new AudioMessage(chat, Buffer.from(\"\"));\n\n// Criar mensagem com imagem\nconst imageMessage = new ImageMessage(chat, \"texto\", Buffer.from(\"\"));\n\n// Criar mensagem com video\nconst videoMessage = new VideoMessage(chat, \"texto\", Buffer.from(\"\"));\n\n// Criar mensagem de arquivo\nconst fileMessage = new FileMessage(chat, \"texto\", Buffer.from(\"\"));\n\n// Criar mensagem de sticker\nconst stickerMessage = new StickerMessage(chat, Buffer.from(\"\"));\n```\n\n## Outros tipos de mensagem\n\n```ts\nimport { LocationMessage, ContactMessage, ButtonMessage, ListMessage, PollMessage } from \"rompot\";\n\n// Criar mensagem de localiação\n// Latitude, Longitude\nconst locationMessage = new LocationMessage(chat, 24.121231, 55.1121221);\n\n// Obter dados do endereço da localização\nconst address = await locationMessage.getAddress();\n\n// Criar mensagem com contatos\nconst contactMessage = new ContactMessage(chat, \"nome\", \"userId\");\n\n// Criando botões\nconst btnMessage = new ButtonMessage(chat, \"texto\", \"rodapé\");\nbtnMessage.addCall(\"Call\", \"1234567890\");\nbtnMessage.addUrl(\"Link\", \"https://example.com\");\nbtnMessage.addReply(\"Texto\", \"button-id-123\");\n\n// Criar lista\nconst listMessage = new ListMessage(chat, \"texto\", \"botão\", \"titulo\", \"rodapé\");\nconst index1 = listMessage.addCategory(\"Categoria 1\");\nconst index2 = listMessage.addCategory(\"Categoria 2\");\n\nlistMessage.addItem(index1, \"Item 1\");\nlistMessage.addItem(index1, \"Item 2\");\n\nlistMessage.addItem(index2, \"Abc 1\");\nlistMessage.addItem(index2, \"Abc 2\");\n\n// Criar enquete\nconst pollMessage = new PollMessage(chat, \"Hello World!\");\n\npollMessage.addOption(\"Hello\", \"id-hello-123\");\npollMessage.addOption(\"Hey\", \"id-hey-123\");\npollMessage.addOption(\"Hi\", \"id-hi-123\");\n```\n\n## Mensagem personalizada\n\n```ts\nimport { CustomMessage } from \"rompot\";\n\n// Ex: conteúdo para baileys\nconst content = { text: \"texto\" }; \n\n// O conteúdo inserido será enviado diretamente para a plataforma\nconst customMessage = new CustomMessage(chat, content);\n\n// Adicionando opções adicionais\n// Essas alterações serão tratadas pelo processamento da plataforma\n\n//? Na baileys utiliza o relayMessage invés de sendMessage\ncustomMessage.extra = { isRelay: true }; \n```\n\n## Lendo resposas de ButtonMessage, ListMessage e PollMessage\n\n```ts\nimport { Command, Message, CMDKey, CMDRunType, isPollMessage } from \"rompot\";\n\nclass ButtonCommand extends Command {\n  public onRead() {\n    this.keys = [CMDKey(\"cmd-button\")];\n  }\n\n  // Recebe uma resposta ao comando\n  public async onReply(message: Message) {\n    await message.reply(`Button Clicked!`);\n  }\n}\n\nclient.addCommand(new ButtonCommand());\n\nclient.on(\"message\", async (message: Message) =\u003e {\n  if (isPollMessage(message)) {\n    // Não responde caso a votação da enquete for removida\n    if (message.action == \"remove\") return;\n  }\n\n  // Verifica o ID passado na mensagem como opção\n  if (message.selected == \"button-id-123\") {\n    const cmd = client.getCommand(\"cmd-button\");\n\n    // Manda a resposta ao comando\n    if (cmd) client.runCommand(cmd, message, CMDRunType.Reply);\n  }\n}):\n```\n\n## Bot\n\n- Definir foto de perfil\n\n```ts\nclient.setBotProfile(Buffer.from(\"\"));\n```\n\n- Obter foto de perfil do bot\n\n```ts\nclient.getBotProfile();\n```\n\n- Definir nome do bot\n\n```ts\nclient.setBotName(\"Name\");\n```\n\n- Definir descrição do bot\n\n```ts\nclient.setBotDescription(\"Description\");\n```\n\n- Obter descrição do bot\n\n```ts\nclient.getBotDescription();\n```\n\n## Grupo\n\nVocê pode obter o chat em `message.chat` ou `client.getChat(\"id\")`, o ID pode ser encontrado em `message.chat.id`\n\n- Criar grupo\n\n```ts\nclient.createChat(\"name\");\n```\n\n- Sair de um grupo\n\n```ts\nclient.leaveChat(chat);\n```\n\n- Definir imagem do grupo\n\n```ts\nclient.setChatProfile(chat, Buffer.from(\"\"));\n```\n\n- Obter imagem do grupo\n\n```ts\nclient.getChatProfile(chat);\n```\n\n- Definir nome do grupo\n\n```ts\nclient.setChatName(chat, \"Name chat\");\n```\n\n- Obter nome do grupo\n\n```ts\nclient.getChatName(chat);\n```\n\n- Definir a descrição do grupo\n\n```ts\nclient.setChatDescription(chat, \"Chat description\");\n```\n\n- Obter descrição do grupo\n\n```ts\nclient.getChatDescription(chat);\n```\n\n- Adicionar membro\n  - Você pode encontrar o user em `message.user`, o ID pode se encontrado em `message.user.id`\n\n```ts\nclient.addUserInChat(chat, user);\n```\n\n- Remover membro\n\n```ts\nclient.removeUserInChat(chat, user);\n```\n\n- Promover membro\n\n```ts\nclient.promoteUserInChat(chat, user);\n```\n\n- Despromover membro\n\n```ts\nclient.demoteUserInChat(chat, user);\n```\n\n- Rejeitar chamada\n  - Você pode receber a chamada pelo evento `new-call` ou `call`, porém o evento `call` também recebe atualização de chamadas invez de somente o pedido dela.\n```ts\nclient.rejectCall(call);\n```\n\n## 📄 Licença\n\nEste projeto está sob a licença MIT - veja o arquivo [LICENSE](https://github.com/Laxeder/rompot/blob/main/LICENSE) para mais detalhes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaxeder%2Frompot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaxeder%2Frompot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaxeder%2Frompot/lists"}