@deffa5556/bail 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +3005 -0
  3. package/WAProto/index.d.ts +15871 -0
  4. package/WAProto/index.js +115447 -0
  5. package/deffa/config.js +12 -0
  6. package/deffa/plugins/README.md +24 -0
  7. package/deffa/plugins/ai/deepseekr1.js +27 -0
  8. package/deffa/plugins/ai/gita.js +16 -0
  9. package/deffa/plugins/ai/glm47flash.js +27 -0
  10. package/deffa/plugins/ai/gptoss120b.js +27 -0
  11. package/deffa/plugins/ai/qwq32b.js +27 -0
  12. package/deffa/plugins/berita/antara.js +18 -0
  13. package/deffa/plugins/berita/cnbcindonesia.js +18 -0
  14. package/deffa/plugins/berita/cnn.js +18 -0
  15. package/deffa/plugins/berita/kompas.js +18 -0
  16. package/deffa/plugins/berita/liputan6.js +18 -0
  17. package/deffa/plugins/berita/merdeka.js +18 -0
  18. package/deffa/plugins/berita/sindonews.js +18 -0
  19. package/deffa/plugins/berita/tribunnews.js +18 -0
  20. package/deffa/plugins/downloader/douyin.js +19 -0
  21. package/deffa/plugins/downloader/facebook.js +19 -0
  22. package/deffa/plugins/downloader/github.js +25 -0
  23. package/deffa/plugins/downloader/lahelu.js +19 -0
  24. package/deffa/plugins/downloader/snackvideo.js +19 -0
  25. package/deffa/plugins/downloader/soundcloud.js +19 -0
  26. package/deffa/plugins/downloader/tiktok.js +19 -0
  27. package/deffa/plugins/downloader/tiktokhd.js +19 -0
  28. package/deffa/plugins/downloader/twitter.js +19 -0
  29. package/deffa/plugins/downloader/ummy.js +26 -0
  30. package/deffa/plugins/index.cjs +26 -0
  31. package/deffa/plugins/index.js +232 -0
  32. package/deffa/plugins/info/bmkg.js +25 -0
  33. package/deffa/plugins/info/cuaca.js +23 -0
  34. package/deffa/plugins/info/jadwaltv.js +21 -0
  35. package/deffa/plugins/maker/brat.js +45 -0
  36. package/deffa/plugins/maker/bratvid.js +52 -0
  37. package/deffa/plugins/search/8font.js +18 -0
  38. package/deffa/plugins/search/applemusic.js +18 -0
  39. package/deffa/plugins/search/bimg.js +19 -0
  40. package/deffa/plugins/search/brave.js +24 -0
  41. package/deffa/plugins/search/duckduckgo.js +18 -0
  42. package/deffa/plugins/search/lahelu.js +18 -0
  43. package/deffa/plugins/search/mangatoon.js +18 -0
  44. package/deffa/plugins/search/mcpedl.js +18 -0
  45. package/deffa/plugins/search/myinstants.js +18 -0
  46. package/deffa/plugins/search/otakotaku.js +18 -0
  47. package/deffa/plugins/search/pinterest.js +19 -0
  48. package/deffa/plugins/search/resep.js +18 -0
  49. package/deffa/plugins/search/seegore.js +19 -0
  50. package/deffa/plugins/search/soundcloud.js +18 -0
  51. package/deffa/plugins/search/youtube.js +18 -0
  52. package/deffa/plugins/stalk/github.js +28 -0
  53. package/deffa/plugins/stalk/pinterest.js +27 -0
  54. package/deffa/plugins/stalk/threads.js +24 -0
  55. package/deffa/plugins/stalk/tiktok.js +27 -0
  56. package/deffa/plugins/stalk/twitter.js +27 -0
  57. package/deffa/plugins/stalk/youtube.js +27 -0
  58. package/engine-requirements.js +45 -0
  59. package/lib/Defaults/index.d.ts +145 -0
  60. package/lib/Defaults/index.d.ts.map +1 -0
  61. package/lib/Defaults/index.js +152 -0
  62. package/lib/Defaults/index.js.map +1 -0
  63. package/lib/Discord/Client.cjs +274 -0
  64. package/lib/Discord/Client.d.ts +98 -0
  65. package/lib/Discord/Client.js +274 -0
  66. package/lib/Discord/Constants.cjs +1842 -0
  67. package/lib/Discord/Constants.d.ts +1514 -0
  68. package/lib/Discord/Constants.js +1842 -0
  69. package/lib/Discord/connect-dc.js +5 -0
  70. package/lib/Discord/esm-bridge.mjs +128 -0
  71. package/lib/Discord/gateway/Dispatcher.cjs +86 -0
  72. package/lib/Discord/gateway/Dispatcher.d.ts +17 -0
  73. package/lib/Discord/gateway/Dispatcher.js +86 -0
  74. package/lib/Discord/gateway/Shard.cjs +723 -0
  75. package/lib/Discord/gateway/Shard.d.ts +87 -0
  76. package/lib/Discord/gateway/Shard.js +723 -0
  77. package/lib/Discord/gateway/ShardManager.cjs +350 -0
  78. package/lib/Discord/gateway/ShardManager.d.ts +31 -0
  79. package/lib/Discord/gateway/ShardManager.js +350 -0
  80. package/lib/Discord/gateway/compression/base.cjs +14 -0
  81. package/lib/Discord/gateway/compression/base.d.ts +6 -0
  82. package/lib/Discord/gateway/compression/base.js +14 -0
  83. package/lib/Discord/gateway/compression/config.cjs +47 -0
  84. package/lib/Discord/gateway/compression/config.d.ts +17 -0
  85. package/lib/Discord/gateway/compression/config.js +47 -0
  86. package/lib/Discord/gateway/compression/pako.cjs +45 -0
  87. package/lib/Discord/gateway/compression/pako.d.ts +16 -0
  88. package/lib/Discord/gateway/compression/pako.js +45 -0
  89. package/lib/Discord/gateway/compression/zlib-native.cjs +50 -0
  90. package/lib/Discord/gateway/compression/zlib-native.d.ts +10 -0
  91. package/lib/Discord/gateway/compression/zlib-native.js +50 -0
  92. package/lib/Discord/gateway/compression/zlib-sync.cjs +32 -0
  93. package/lib/Discord/gateway/compression/zlib-sync.d.ts +8 -0
  94. package/lib/Discord/gateway/compression/zlib-sync.js +32 -0
  95. package/lib/Discord/gateway/compression/zstd-napi.cjs +74 -0
  96. package/lib/Discord/gateway/compression/zstd-napi.d.ts +9 -0
  97. package/lib/Discord/gateway/compression/zstd-napi.js +74 -0
  98. package/lib/Discord/gateway/compression/zstd-native.cjs +48 -0
  99. package/lib/Discord/gateway/compression/zstd-native.d.ts +9 -0
  100. package/lib/Discord/gateway/compression/zstd-native.js +48 -0
  101. package/lib/Discord/gateway/events.cjs +956 -0
  102. package/lib/Discord/gateway/events.d.ts +75 -0
  103. package/lib/Discord/gateway/events.js +956 -0
  104. package/lib/Discord/index.cjs +228 -0
  105. package/lib/Discord/index.d.ts +98 -0
  106. package/lib/Discord/index.js +228 -0
  107. package/lib/Discord/rest/Bucket.cjs +77 -0
  108. package/lib/Discord/rest/Bucket.d.ts +32 -0
  109. package/lib/Discord/rest/Bucket.js +77 -0
  110. package/lib/Discord/rest/DiscordHTTPError.cjs +66 -0
  111. package/lib/Discord/rest/DiscordHTTPError.d.ts +15 -0
  112. package/lib/Discord/rest/DiscordHTTPError.js +66 -0
  113. package/lib/Discord/rest/DiscordRESTError.cjs +88 -0
  114. package/lib/Discord/rest/DiscordRESTError.d.ts +18 -0
  115. package/lib/Discord/rest/DiscordRESTError.js +88 -0
  116. package/lib/Discord/rest/OAuthHelper.cjs +220 -0
  117. package/lib/Discord/rest/OAuthHelper.d.ts +61 -0
  118. package/lib/Discord/rest/OAuthHelper.js +220 -0
  119. package/lib/Discord/rest/RESTManager.cjs +119 -0
  120. package/lib/Discord/rest/RESTManager.d.ts +42 -0
  121. package/lib/Discord/rest/RESTManager.js +119 -0
  122. package/lib/Discord/rest/RequestHandler.cjs +323 -0
  123. package/lib/Discord/rest/RequestHandler.d.ts +27 -0
  124. package/lib/Discord/rest/RequestHandler.js +323 -0
  125. package/lib/Discord/rest/SequentialBucket.cjs +74 -0
  126. package/lib/Discord/rest/SequentialBucket.d.ts +24 -0
  127. package/lib/Discord/rest/SequentialBucket.js +74 -0
  128. package/lib/Discord/routes/Applications.cjs +618 -0
  129. package/lib/Discord/routes/Applications.d.ts +230 -0
  130. package/lib/Discord/routes/Applications.js +618 -0
  131. package/lib/Discord/routes/Channels.cjs +1191 -0
  132. package/lib/Discord/routes/Channels.d.ts +428 -0
  133. package/lib/Discord/routes/Channels.js +1192 -0
  134. package/lib/Discord/routes/Guilds.cjs +1785 -0
  135. package/lib/Discord/routes/Guilds.d.ts +644 -0
  136. package/lib/Discord/routes/Guilds.js +1785 -0
  137. package/lib/Discord/routes/Interactions.cjs +205 -0
  138. package/lib/Discord/routes/Interactions.d.ts +74 -0
  139. package/lib/Discord/routes/Interactions.js +205 -0
  140. package/lib/Discord/routes/Lobbies.cjs +190 -0
  141. package/lib/Discord/routes/Lobbies.d.ts +70 -0
  142. package/lib/Discord/routes/Lobbies.js +190 -0
  143. package/lib/Discord/routes/Miscellaneous.cjs +113 -0
  144. package/lib/Discord/routes/Miscellaneous.d.ts +36 -0
  145. package/lib/Discord/routes/Miscellaneous.js +113 -0
  146. package/lib/Discord/routes/OAuth.cjs +343 -0
  147. package/lib/Discord/routes/OAuth.d.ts +107 -0
  148. package/lib/Discord/routes/OAuth.js +343 -0
  149. package/lib/Discord/routes/Users.cjs +100 -0
  150. package/lib/Discord/routes/Users.d.ts +32 -0
  151. package/lib/Discord/routes/Users.js +100 -0
  152. package/lib/Discord/routes/Webhooks.cjs +301 -0
  153. package/lib/Discord/routes/Webhooks.d.ts +126 -0
  154. package/lib/Discord/routes/Webhooks.js +301 -0
  155. package/lib/Discord/structures/AnnouncementChannel.cjs +46 -0
  156. package/lib/Discord/structures/AnnouncementChannel.d.ts +34 -0
  157. package/lib/Discord/structures/AnnouncementChannel.js +46 -0
  158. package/lib/Discord/structures/AnnouncementThreadChannel.cjs +28 -0
  159. package/lib/Discord/structures/AnnouncementThreadChannel.d.ts +17 -0
  160. package/lib/Discord/structures/AnnouncementThreadChannel.js +28 -0
  161. package/lib/Discord/structures/Application.cjs +477 -0
  162. package/lib/Discord/structures/Application.d.ts +166 -0
  163. package/lib/Discord/structures/Application.js +477 -0
  164. package/lib/Discord/structures/ApplicationCommand.cjs +146 -0
  165. package/lib/Discord/structures/ApplicationCommand.d.ts +75 -0
  166. package/lib/Discord/structures/ApplicationCommand.js +146 -0
  167. package/lib/Discord/structures/Attachment.cjs +78 -0
  168. package/lib/Discord/structures/Attachment.d.ts +43 -0
  169. package/lib/Discord/structures/Attachment.js +78 -0
  170. package/lib/Discord/structures/AuditLogEntry.cjs +54 -0
  171. package/lib/Discord/structures/AuditLogEntry.d.ts +25 -0
  172. package/lib/Discord/structures/AuditLogEntry.js +54 -0
  173. package/lib/Discord/structures/AutoModerationRule.cjs +140 -0
  174. package/lib/Discord/structures/AutoModerationRule.d.ts +48 -0
  175. package/lib/Discord/structures/AutoModerationRule.js +140 -0
  176. package/lib/Discord/structures/AutocompleteInteraction.cjs +120 -0
  177. package/lib/Discord/structures/AutocompleteInteraction.d.ts +61 -0
  178. package/lib/Discord/structures/AutocompleteInteraction.js +120 -0
  179. package/lib/Discord/structures/Base.cjs +58 -0
  180. package/lib/Discord/structures/Base.d.ts +19 -0
  181. package/lib/Discord/structures/Base.js +58 -0
  182. package/lib/Discord/structures/BaseEntitlement.cjs +49 -0
  183. package/lib/Discord/structures/BaseEntitlement.d.ts +20 -0
  184. package/lib/Discord/structures/BaseEntitlement.js +49 -0
  185. package/lib/Discord/structures/CategoryChannel.cjs +106 -0
  186. package/lib/Discord/structures/CategoryChannel.d.ts +40 -0
  187. package/lib/Discord/structures/CategoryChannel.js +106 -0
  188. package/lib/Discord/structures/Channel.cjs +92 -0
  189. package/lib/Discord/structures/Channel.d.ts +19 -0
  190. package/lib/Discord/structures/Channel.js +92 -0
  191. package/lib/Discord/structures/ClientApplication.cjs +273 -0
  192. package/lib/Discord/structures/ClientApplication.d.ts +189 -0
  193. package/lib/Discord/structures/ClientApplication.js +273 -0
  194. package/lib/Discord/structures/CommandInteraction.cjs +324 -0
  195. package/lib/Discord/structures/CommandInteraction.d.ts +166 -0
  196. package/lib/Discord/structures/CommandInteraction.js +324 -0
  197. package/lib/Discord/structures/ComponentInteraction.cjs +338 -0
  198. package/lib/Discord/structures/ComponentInteraction.d.ts +180 -0
  199. package/lib/Discord/structures/ComponentInteraction.js +338 -0
  200. package/lib/Discord/structures/Entitlement.cjs +27 -0
  201. package/lib/Discord/structures/Entitlement.d.ts +11 -0
  202. package/lib/Discord/structures/Entitlement.js +27 -0
  203. package/lib/Discord/structures/ExtendedUser.cjs +58 -0
  204. package/lib/Discord/structures/ExtendedUser.d.ts +25 -0
  205. package/lib/Discord/structures/ExtendedUser.js +58 -0
  206. package/lib/Discord/structures/ForumChannel.cjs +20 -0
  207. package/lib/Discord/structures/ForumChannel.d.ts +11 -0
  208. package/lib/Discord/structures/ForumChannel.js +20 -0
  209. package/lib/Discord/structures/GroupChannel.cjs +172 -0
  210. package/lib/Discord/structures/GroupChannel.d.ts +60 -0
  211. package/lib/Discord/structures/GroupChannel.js +172 -0
  212. package/lib/Discord/structures/Guild.cjs +1415 -0
  213. package/lib/Discord/structures/Guild.d.ts +687 -0
  214. package/lib/Discord/structures/Guild.js +1415 -0
  215. package/lib/Discord/structures/GuildChannel.cjs +90 -0
  216. package/lib/Discord/structures/GuildChannel.d.ts +36 -0
  217. package/lib/Discord/structures/GuildChannel.js +90 -0
  218. package/lib/Discord/structures/GuildPreview.cjs +153 -0
  219. package/lib/Discord/structures/GuildPreview.d.ts +49 -0
  220. package/lib/Discord/structures/GuildPreview.js +153 -0
  221. package/lib/Discord/structures/GuildScheduledEvent.cjs +188 -0
  222. package/lib/Discord/structures/GuildScheduledEvent.d.ts +59 -0
  223. package/lib/Discord/structures/GuildScheduledEvent.js +188 -0
  224. package/lib/Discord/structures/GuildTemplate.cjs +118 -0
  225. package/lib/Discord/structures/GuildTemplate.d.ts +48 -0
  226. package/lib/Discord/structures/GuildTemplate.js +118 -0
  227. package/lib/Discord/structures/Integration.cjs +157 -0
  228. package/lib/Discord/structures/Integration.d.ts +53 -0
  229. package/lib/Discord/structures/Integration.js +157 -0
  230. package/lib/Discord/structures/Interaction.cjs +91 -0
  231. package/lib/Discord/structures/Interaction.d.ts +39 -0
  232. package/lib/Discord/structures/Interaction.js +91 -0
  233. package/lib/Discord/structures/InteractionResolvedChannel.cjs +46 -0
  234. package/lib/Discord/structures/InteractionResolvedChannel.d.ts +27 -0
  235. package/lib/Discord/structures/InteractionResolvedChannel.js +46 -0
  236. package/lib/Discord/structures/Invite.cjs +240 -0
  237. package/lib/Discord/structures/Invite.d.ts +132 -0
  238. package/lib/Discord/structures/Invite.js +240 -0
  239. package/lib/Discord/structures/InviteGuild.cjs +130 -0
  240. package/lib/Discord/structures/InviteGuild.d.ts +54 -0
  241. package/lib/Discord/structures/InviteGuild.js +130 -0
  242. package/lib/Discord/structures/InviteRole.cjs +110 -0
  243. package/lib/Discord/structures/InviteRole.d.ts +53 -0
  244. package/lib/Discord/structures/InviteRole.js +110 -0
  245. package/lib/Discord/structures/Lobby.cjs +88 -0
  246. package/lib/Discord/structures/Lobby.d.ts +54 -0
  247. package/lib/Discord/structures/Lobby.js +88 -0
  248. package/lib/Discord/structures/LobbyMember.cjs +33 -0
  249. package/lib/Discord/structures/LobbyMember.d.ts +15 -0
  250. package/lib/Discord/structures/LobbyMember.js +33 -0
  251. package/lib/Discord/structures/MediaChannel.cjs +20 -0
  252. package/lib/Discord/structures/MediaChannel.d.ts +11 -0
  253. package/lib/Discord/structures/MediaChannel.js +20 -0
  254. package/lib/Discord/structures/Member.cjs +325 -0
  255. package/lib/Discord/structures/Member.d.ts +140 -0
  256. package/lib/Discord/structures/Member.js +325 -0
  257. package/lib/Discord/structures/Message.cjs +627 -0
  258. package/lib/Discord/structures/Message.d.ts +223 -0
  259. package/lib/Discord/structures/Message.js +627 -0
  260. package/lib/Discord/structures/ModalSubmitInteraction.cjs +295 -0
  261. package/lib/Discord/structures/ModalSubmitInteraction.d.ts +138 -0
  262. package/lib/Discord/structures/ModalSubmitInteraction.js +295 -0
  263. package/lib/Discord/structures/OAuthApplication.cjs +244 -0
  264. package/lib/Discord/structures/OAuthApplication.d.ts +77 -0
  265. package/lib/Discord/structures/OAuthApplication.js +244 -0
  266. package/lib/Discord/structures/OAuthGuild.cjs +107 -0
  267. package/lib/Discord/structures/OAuthGuild.d.ts +43 -0
  268. package/lib/Discord/structures/OAuthGuild.js +107 -0
  269. package/lib/Discord/structures/PartialApplication.cjs +101 -0
  270. package/lib/Discord/structures/PartialApplication.d.ts +29 -0
  271. package/lib/Discord/structures/PartialApplication.js +101 -0
  272. package/lib/Discord/structures/Permission.cjs +66 -0
  273. package/lib/Discord/structures/Permission.d.ts +21 -0
  274. package/lib/Discord/structures/Permission.js +66 -0
  275. package/lib/Discord/structures/PermissionOverwrite.cjs +50 -0
  276. package/lib/Discord/structures/PermissionOverwrite.d.ts +25 -0
  277. package/lib/Discord/structures/PermissionOverwrite.js +50 -0
  278. package/lib/Discord/structures/PingInteraction.cjs +27 -0
  279. package/lib/Discord/structures/PingInteraction.d.ts +15 -0
  280. package/lib/Discord/structures/PingInteraction.js +27 -0
  281. package/lib/Discord/structures/Poll.cjs +77 -0
  282. package/lib/Discord/structures/Poll.d.ts +27 -0
  283. package/lib/Discord/structures/Poll.js +77 -0
  284. package/lib/Discord/structures/PrimaryGuild.cjs +92 -0
  285. package/lib/Discord/structures/PrimaryGuild.d.ts +23 -0
  286. package/lib/Discord/structures/PrimaryGuild.js +92 -0
  287. package/lib/Discord/structures/PrivateChannel.cjs +139 -0
  288. package/lib/Discord/structures/PrivateChannel.d.ts +102 -0
  289. package/lib/Discord/structures/PrivateChannel.js +139 -0
  290. package/lib/Discord/structures/PrivateThreadChannel.cjs +28 -0
  291. package/lib/Discord/structures/PrivateThreadChannel.d.ts +17 -0
  292. package/lib/Discord/structures/PrivateThreadChannel.js +28 -0
  293. package/lib/Discord/structures/PublicThreadChannel.cjs +38 -0
  294. package/lib/Discord/structures/PublicThreadChannel.d.ts +20 -0
  295. package/lib/Discord/structures/PublicThreadChannel.js +38 -0
  296. package/lib/Discord/structures/Role.cjs +156 -0
  297. package/lib/Discord/structures/Role.d.ts +56 -0
  298. package/lib/Discord/structures/Role.js +156 -0
  299. package/lib/Discord/structures/SKU.cjs +70 -0
  300. package/lib/Discord/structures/SKU.d.ts +33 -0
  301. package/lib/Discord/structures/SKU.js +70 -0
  302. package/lib/Discord/structures/Soundboard.cjs +74 -0
  303. package/lib/Discord/structures/Soundboard.d.ts +42 -0
  304. package/lib/Discord/structures/Soundboard.js +74 -0
  305. package/lib/Discord/structures/StageChannel.cjs +45 -0
  306. package/lib/Discord/structures/StageChannel.d.ts +31 -0
  307. package/lib/Discord/structures/StageChannel.js +45 -0
  308. package/lib/Discord/structures/StageInstance.cjs +95 -0
  309. package/lib/Discord/structures/StageInstance.d.ts +35 -0
  310. package/lib/Discord/structures/StageInstance.js +95 -0
  311. package/lib/Discord/structures/Subscription.cjs +39 -0
  312. package/lib/Discord/structures/Subscription.d.ts +25 -0
  313. package/lib/Discord/structures/Subscription.js +39 -0
  314. package/lib/Discord/structures/Team.cjs +86 -0
  315. package/lib/Discord/structures/Team.d.ts +28 -0
  316. package/lib/Discord/structures/Team.js +86 -0
  317. package/lib/Discord/structures/TestEntitlement.cjs +22 -0
  318. package/lib/Discord/structures/TestEntitlement.d.ts +10 -0
  319. package/lib/Discord/structures/TestEntitlement.js +22 -0
  320. package/lib/Discord/structures/TextChannel.cjs +48 -0
  321. package/lib/Discord/structures/TextChannel.d.ts +34 -0
  322. package/lib/Discord/structures/TextChannel.js +48 -0
  323. package/lib/Discord/structures/TextableChannel.cjs +281 -0
  324. package/lib/Discord/structures/TextableChannel.d.ts +167 -0
  325. package/lib/Discord/structures/TextableChannel.js +281 -0
  326. package/lib/Discord/structures/TextableVoiceChannel.cjs +79 -0
  327. package/lib/Discord/structures/TextableVoiceChannel.d.ts +34 -0
  328. package/lib/Discord/structures/TextableVoiceChannel.js +79 -0
  329. package/lib/Discord/structures/ThreadChannel.cjs +300 -0
  330. package/lib/Discord/structures/ThreadChannel.d.ts +170 -0
  331. package/lib/Discord/structures/ThreadChannel.js +300 -0
  332. package/lib/Discord/structures/ThreadOnlyChannel.cjs +231 -0
  333. package/lib/Discord/structures/ThreadOnlyChannel.d.ts +95 -0
  334. package/lib/Discord/structures/ThreadOnlyChannel.js +231 -0
  335. package/lib/Discord/structures/ThreadableChannel.cjs +59 -0
  336. package/lib/Discord/structures/ThreadableChannel.d.ts +35 -0
  337. package/lib/Discord/structures/ThreadableChannel.js +59 -0
  338. package/lib/Discord/structures/UnavailableGuild.cjs +22 -0
  339. package/lib/Discord/structures/UnavailableGuild.d.ts +10 -0
  340. package/lib/Discord/structures/UnavailableGuild.js +22 -0
  341. package/lib/Discord/structures/User.cjs +240 -0
  342. package/lib/Discord/structures/User.d.ts +90 -0
  343. package/lib/Discord/structures/User.js +240 -0
  344. package/lib/Discord/structures/VoiceChannel.cjs +36 -0
  345. package/lib/Discord/structures/VoiceChannel.d.ts +19 -0
  346. package/lib/Discord/structures/VoiceChannel.js +36 -0
  347. package/lib/Discord/structures/VoiceState.cjs +141 -0
  348. package/lib/Discord/structures/VoiceState.d.ts +49 -0
  349. package/lib/Discord/structures/VoiceState.js +141 -0
  350. package/lib/Discord/structures/Webhook.cjs +240 -0
  351. package/lib/Discord/structures/Webhook.d.ts +126 -0
  352. package/lib/Discord/structures/Webhook.js +240 -0
  353. package/lib/Discord/types/applications.d.ts +695 -0
  354. package/lib/Discord/types/audit-log.d.ts +116 -0
  355. package/lib/Discord/types/auto-moderation.d.ts +99 -0
  356. package/lib/Discord/types/channels.d.ts +1570 -0
  357. package/lib/Discord/types/client.d.ts +250 -0
  358. package/lib/Discord/types/events.d.ts +224 -0
  359. package/lib/Discord/types/gateway-raw.d.ts +585 -0
  360. package/lib/Discord/types/gateway.d.ts +401 -0
  361. package/lib/Discord/types/guild-template.d.ts +25 -0
  362. package/lib/Discord/types/guilds.d.ts +987 -0
  363. package/lib/Discord/types/index.d.ts +24 -0
  364. package/lib/Discord/types/interactions.d.ts +524 -0
  365. package/lib/Discord/types/invites.d.ts +117 -0
  366. package/lib/Discord/types/json.d.ts +833 -0
  367. package/lib/Discord/types/lobbies.d.ts +31 -0
  368. package/lib/Discord/types/misc.d.ts +25 -0
  369. package/lib/Discord/types/namespaced.d.ts +22 -0
  370. package/lib/Discord/types/oauth.d.ts +206 -0
  371. package/lib/Discord/types/request-handler.d.ts +54 -0
  372. package/lib/Discord/types/scheduled-events.d.ts +87 -0
  373. package/lib/Discord/types/shared.d.ts +24 -0
  374. package/lib/Discord/types/users.d.ts +104 -0
  375. package/lib/Discord/types/voice.d.ts +45 -0
  376. package/lib/Discord/types/webhooks.d.ts +75 -0
  377. package/lib/Discord/util/Collection.cjs +77 -0
  378. package/lib/Discord/util/Collection.d.ts +47 -0
  379. package/lib/Discord/util/Collection.js +77 -0
  380. package/lib/Discord/util/Errors.cjs +84 -0
  381. package/lib/Discord/util/Errors.d.ts +43 -0
  382. package/lib/Discord/util/Errors.js +84 -0
  383. package/lib/Discord/util/QueryBuilder.cjs +20 -0
  384. package/lib/Discord/util/QueryBuilder.d.ts +4 -0
  385. package/lib/Discord/util/QueryBuilder.js +20 -0
  386. package/lib/Discord/util/Routes.cjs +293 -0
  387. package/lib/Discord/util/Routes.d.ts +145 -0
  388. package/lib/Discord/util/Routes.js +293 -0
  389. package/lib/Discord/util/SimpleCollection.cjs +82 -0
  390. package/lib/Discord/util/SimpleCollection.d.ts +12 -0
  391. package/lib/Discord/util/SimpleCollection.js +82 -0
  392. package/lib/Discord/util/Time.cjs +93 -0
  393. package/lib/Discord/util/Time.d.ts +39 -0
  394. package/lib/Discord/util/Time.js +93 -0
  395. package/lib/Discord/util/TypedCollection.cjs +81 -0
  396. package/lib/Discord/util/TypedCollection.d.ts +24 -0
  397. package/lib/Discord/util/TypedCollection.js +81 -0
  398. package/lib/Discord/util/TypedEmitter.cjs +20 -0
  399. package/lib/Discord/util/TypedEmitter.d.ts +18 -0
  400. package/lib/Discord/util/TypedEmitter.js +20 -0
  401. package/lib/Discord/util/Util.cjs +906 -0
  402. package/lib/Discord/util/Util.d.ts +66 -0
  403. package/lib/Discord/util/Util.js +906 -0
  404. package/lib/Discord/util/interactions/InteractionOptionsWrapper.cjs +211 -0
  405. package/lib/Discord/util/interactions/InteractionOptionsWrapper.d.ts +170 -0
  406. package/lib/Discord/util/interactions/InteractionOptionsWrapper.js +211 -0
  407. package/lib/Discord/util/interactions/MessageInteractionResponse.cjs +29 -0
  408. package/lib/Discord/util/interactions/MessageInteractionResponse.d.ts +27 -0
  409. package/lib/Discord/util/interactions/MessageInteractionResponse.js +29 -0
  410. package/lib/Discord/util/interactions/ModalSubmitInteractionComponentsWrapper.cjs +101 -0
  411. package/lib/Discord/util/interactions/ModalSubmitInteractionComponentsWrapper.d.ts +157 -0
  412. package/lib/Discord/util/interactions/ModalSubmitInteractionComponentsWrapper.js +101 -0
  413. package/lib/Discord/util/interactions/SelectMenuValuesWrapper.cjs +81 -0
  414. package/lib/Discord/util/interactions/SelectMenuValuesWrapper.d.ts +59 -0
  415. package/lib/Discord/util/interactions/SelectMenuValuesWrapper.js +81 -0
  416. package/lib/Discord/util/interactions/shared.cjs +20 -0
  417. package/lib/Discord/util/interactions/shared.d.ts +7 -0
  418. package/lib/Discord/util/interactions/shared.js +20 -0
  419. package/lib/Discord/util/warning.cjs +34 -0
  420. package/lib/Discord/util/warning.d.ts +6 -0
  421. package/lib/Discord/util/warning.js +34 -0
  422. package/lib/Signal/Group/ciphertext-message.d.ts +10 -0
  423. package/lib/Signal/Group/ciphertext-message.d.ts.map +1 -0
  424. package/lib/Signal/Group/ciphertext-message.js +12 -0
  425. package/lib/Signal/Group/ciphertext-message.js.map +1 -0
  426. package/lib/Signal/Group/group-session-builder.d.ts +8 -0
  427. package/lib/Signal/Group/group-session-builder.d.ts.map +1 -0
  428. package/lib/Signal/Group/group-session-builder.js +30 -0
  429. package/lib/Signal/Group/group-session-builder.js.map +1 -0
  430. package/lib/Signal/Group/group_cipher.d.ts +11 -0
  431. package/lib/Signal/Group/group_cipher.d.ts.map +1 -0
  432. package/lib/Signal/Group/group_cipher.js +82 -0
  433. package/lib/Signal/Group/group_cipher.js.map +1 -0
  434. package/lib/Signal/Group/index.d.ts +12 -0
  435. package/lib/Signal/Group/index.d.ts.map +1 -0
  436. package/lib/Signal/Group/index.js +12 -0
  437. package/lib/Signal/Group/index.js.map +1 -0
  438. package/lib/Signal/Group/keyhelper.d.ts +7 -0
  439. package/lib/Signal/Group/keyhelper.d.ts.map +1 -0
  440. package/lib/Signal/Group/keyhelper.js +18 -0
  441. package/lib/Signal/Group/keyhelper.js.map +1 -0
  442. package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
  443. package/lib/Signal/Group/sender-chain-key.d.ts.map +1 -0
  444. package/lib/Signal/Group/sender-chain-key.js +26 -0
  445. package/lib/Signal/Group/sender-chain-key.js.map +1 -0
  446. package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
  447. package/lib/Signal/Group/sender-key-distribution-message.d.ts.map +1 -0
  448. package/lib/Signal/Group/sender-key-distribution-message.js +63 -0
  449. package/lib/Signal/Group/sender-key-distribution-message.js.map +1 -0
  450. package/lib/Signal/Group/sender-key-message.d.ts +19 -0
  451. package/lib/Signal/Group/sender-key-message.d.ts.map +1 -0
  452. package/lib/Signal/Group/sender-key-message.js +66 -0
  453. package/lib/Signal/Group/sender-key-message.js.map +1 -0
  454. package/lib/Signal/Group/sender-key-name.d.ts +12 -0
  455. package/lib/Signal/Group/sender-key-name.d.ts.map +1 -0
  456. package/lib/Signal/Group/sender-key-name.js +48 -0
  457. package/lib/Signal/Group/sender-key-name.js.map +1 -0
  458. package/lib/Signal/Group/sender-key-record.d.ts +13 -0
  459. package/lib/Signal/Group/sender-key-record.d.ts.map +1 -0
  460. package/lib/Signal/Group/sender-key-record.js +41 -0
  461. package/lib/Signal/Group/sender-key-record.js.map +1 -0
  462. package/lib/Signal/Group/sender-key-state.d.ts +17 -0
  463. package/lib/Signal/Group/sender-key-state.d.ts.map +1 -0
  464. package/lib/Signal/Group/sender-key-state.js +84 -0
  465. package/lib/Signal/Group/sender-key-state.js.map +1 -0
  466. package/lib/Signal/Group/sender-message-key.d.ts +12 -0
  467. package/lib/Signal/Group/sender-message-key.d.ts.map +1 -0
  468. package/lib/Signal/Group/sender-message-key.js +26 -0
  469. package/lib/Signal/Group/sender-message-key.js.map +1 -0
  470. package/lib/Signal/libsignal.d.ts +55 -0
  471. package/lib/Signal/libsignal.d.ts.map +1 -0
  472. package/lib/Signal/libsignal.js +431 -0
  473. package/lib/Signal/libsignal.js.map +1 -0
  474. package/lib/Signal/lid-mapping.d.ts +21 -0
  475. package/lib/Signal/lid-mapping.d.ts.map +1 -0
  476. package/lib/Signal/lid-mapping.js +277 -0
  477. package/lib/Signal/lid-mapping.js.map +1 -0
  478. package/lib/Socket/Client/index.d.ts +3 -0
  479. package/lib/Socket/Client/index.d.ts.map +1 -0
  480. package/lib/Socket/Client/index.js +3 -0
  481. package/lib/Socket/Client/index.js.map +1 -0
  482. package/lib/Socket/Client/types.d.ts +6 -0
  483. package/lib/Socket/Client/types.d.ts.map +1 -0
  484. package/lib/Socket/Client/types.js +11 -0
  485. package/lib/Socket/Client/types.js.map +1 -0
  486. package/lib/Socket/Client/websocket.d.ts +13 -0
  487. package/lib/Socket/Client/websocket.d.ts.map +1 -0
  488. package/lib/Socket/Client/websocket.js +54 -0
  489. package/lib/Socket/Client/websocket.js.map +1 -0
  490. package/lib/Socket/business.d.ts +395 -0
  491. package/lib/Socket/business.d.ts.map +1 -0
  492. package/lib/Socket/business.js +380 -0
  493. package/lib/Socket/business.js.map +1 -0
  494. package/lib/Socket/chats.d.ts +137 -0
  495. package/lib/Socket/chats.d.ts.map +1 -0
  496. package/lib/Socket/chats.js +1214 -0
  497. package/lib/Socket/chats.js.map +1 -0
  498. package/lib/Socket/communities.d.ts +562 -0
  499. package/lib/Socket/communities.d.ts.map +1 -0
  500. package/lib/Socket/communities.js +432 -0
  501. package/lib/Socket/communities.js.map +1 -0
  502. package/lib/Socket/groups.d.ts +286 -0
  503. package/lib/Socket/groups.d.ts.map +1 -0
  504. package/lib/Socket/groups.js +348 -0
  505. package/lib/Socket/groups.js.map +1 -0
  506. package/lib/Socket/index.d.ts +530 -0
  507. package/lib/Socket/index.d.ts.map +1 -0
  508. package/lib/Socket/index.js +12 -0
  509. package/lib/Socket/index.js.map +1 -0
  510. package/lib/Socket/messages-recv.d.ts +334 -0
  511. package/lib/Socket/messages-recv.d.ts.map +1 -0
  512. package/lib/Socket/messages-recv.js +1765 -0
  513. package/lib/Socket/messages-recv.js.map +1 -0
  514. package/lib/Socket/messages-send.d.ts +330 -0
  515. package/lib/Socket/messages-send.d.ts.map +1 -0
  516. package/lib/Socket/messages-send.js +1368 -0
  517. package/lib/Socket/messages-send.js.map +1 -0
  518. package/lib/Socket/mex.d.ts +2 -0
  519. package/lib/Socket/mex.d.ts.map +1 -0
  520. package/lib/Socket/mex.js +42 -0
  521. package/lib/Socket/mex.js.map +1 -0
  522. package/lib/Socket/newsletter.d.ts +283 -0
  523. package/lib/Socket/newsletter.d.ts.map +1 -0
  524. package/lib/Socket/newsletter.js +226 -0
  525. package/lib/Socket/newsletter.js.map +1 -0
  526. package/lib/Socket/socket.d.ts +61 -0
  527. package/lib/Socket/socket.d.ts.map +1 -0
  528. package/lib/Socket/socket.js +972 -0
  529. package/lib/Socket/socket.js.map +1 -0
  530. package/lib/Store/index.d.ts +4 -0
  531. package/lib/Store/index.d.ts.map +1 -0
  532. package/lib/Store/index.js +4 -0
  533. package/lib/Store/index.js.map +1 -0
  534. package/lib/Store/make-in-memory-store.d.ts +63 -0
  535. package/lib/Store/make-in-memory-store.d.ts.map +1 -0
  536. package/lib/Store/make-in-memory-store.js +471 -0
  537. package/lib/Store/make-in-memory-store.js.map +1 -0
  538. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  539. package/lib/Store/make-ordered-dictionary.d.ts.map +1 -0
  540. package/lib/Store/make-ordered-dictionary.js +79 -0
  541. package/lib/Store/make-ordered-dictionary.js.map +1 -0
  542. package/lib/Store/object-repository.d.ts +11 -0
  543. package/lib/Store/object-repository.d.ts.map +1 -0
  544. package/lib/Store/object-repository.js +24 -0
  545. package/lib/Store/object-repository.js.map +1 -0
  546. package/lib/Telegram/button.js +147 -0
  547. package/lib/Telegram/cli.mjs +105 -0
  548. package/lib/Telegram/composer.js +582 -0
  549. package/lib/Telegram/context.js +855 -0
  550. package/lib/Telegram/core/helpers/args.js +57 -0
  551. package/lib/Telegram/core/helpers/check.js +55 -0
  552. package/lib/Telegram/core/helpers/compact.js +16 -0
  553. package/lib/Telegram/core/helpers/deunionize.js +12 -0
  554. package/lib/Telegram/core/helpers/formatting.js +91 -0
  555. package/lib/Telegram/core/helpers/util.js +50 -0
  556. package/lib/Telegram/core/network/client.js +330 -0
  557. package/lib/Telegram/core/network/error.js +21 -0
  558. package/lib/Telegram/core/network/multipart-stream.js +71 -0
  559. package/lib/Telegram/core/network/polling.js +87 -0
  560. package/lib/Telegram/core/network/webhook.js +54 -0
  561. package/lib/Telegram/core/types/typegram.js +27 -0
  562. package/lib/Telegram/deffa-telegraf.js +256 -0
  563. package/lib/Telegram/esm-bridge.mjs +21 -0
  564. package/lib/Telegram/filters.js +69 -0
  565. package/lib/Telegram/format.js +58 -0
  566. package/lib/Telegram/future.js +140 -0
  567. package/lib/Telegram/index.js +59 -0
  568. package/lib/Telegram/input.js +61 -0
  569. package/lib/Telegram/markup.js +121 -0
  570. package/lib/Telegram/middleware.js +2 -0
  571. package/lib/Telegram/package.json +3 -0
  572. package/lib/Telegram/reactions.js +84 -0
  573. package/lib/Telegram/router.js +46 -0
  574. package/lib/Telegram/scenes/base.js +39 -0
  575. package/lib/Telegram/scenes/context.js +104 -0
  576. package/lib/Telegram/scenes/index.js +21 -0
  577. package/lib/Telegram/scenes/stage.js +49 -0
  578. package/lib/Telegram/scenes/wizard/context.js +31 -0
  579. package/lib/Telegram/scenes/wizard/index.js +45 -0
  580. package/lib/Telegram/scenes.js +17 -0
  581. package/lib/Telegram/session.js +166 -0
  582. package/lib/Telegram/telegram-types.js +6 -0
  583. package/lib/Telegram/telegram.js +945 -0
  584. package/lib/Telegram/types.js +2 -0
  585. package/lib/Telegram/utils.js +5 -0
  586. package/lib/Types/Auth.d.ts +2 -0
  587. package/lib/Types/Auth.d.ts.map +1 -0
  588. package/lib/Types/Auth.js +2 -0
  589. package/lib/Types/Auth.js.map +1 -0
  590. package/lib/Types/Bussines.d.ts +2 -0
  591. package/lib/Types/Bussines.d.ts.map +1 -0
  592. package/lib/Types/Bussines.js +2 -0
  593. package/lib/Types/Bussines.js.map +1 -0
  594. package/lib/Types/Call.d.ts +2 -0
  595. package/lib/Types/Call.d.ts.map +1 -0
  596. package/lib/Types/Call.js +2 -0
  597. package/lib/Types/Call.js.map +1 -0
  598. package/lib/Types/Chat.d.ts +2 -0
  599. package/lib/Types/Chat.d.ts.map +1 -0
  600. package/lib/Types/Chat.js +8 -0
  601. package/lib/Types/Chat.js.map +1 -0
  602. package/lib/Types/Contact.d.ts +2 -0
  603. package/lib/Types/Contact.d.ts.map +1 -0
  604. package/lib/Types/Contact.js +2 -0
  605. package/lib/Types/Contact.js.map +1 -0
  606. package/lib/Types/Events.d.ts +2 -0
  607. package/lib/Types/Events.d.ts.map +1 -0
  608. package/lib/Types/Events.js +2 -0
  609. package/lib/Types/Events.js.map +1 -0
  610. package/lib/Types/GroupMetadata.d.ts +2 -0
  611. package/lib/Types/GroupMetadata.d.ts.map +1 -0
  612. package/lib/Types/GroupMetadata.js +2 -0
  613. package/lib/Types/GroupMetadata.js.map +1 -0
  614. package/lib/Types/Label.d.ts +3 -0
  615. package/lib/Types/Label.d.ts.map +1 -0
  616. package/lib/Types/Label.js +25 -0
  617. package/lib/Types/Label.js.map +1 -0
  618. package/lib/Types/LabelAssociation.d.ts +3 -0
  619. package/lib/Types/LabelAssociation.d.ts.map +1 -0
  620. package/lib/Types/LabelAssociation.js +7 -0
  621. package/lib/Types/LabelAssociation.js.map +1 -0
  622. package/lib/Types/Message.d.ts +12 -0
  623. package/lib/Types/Message.d.ts.map +1 -0
  624. package/lib/Types/Message.js +18 -0
  625. package/lib/Types/Message.js.map +1 -0
  626. package/lib/Types/Mex.d.ts +3 -0
  627. package/lib/Types/Mex.d.ts.map +1 -0
  628. package/lib/Types/Mex.js +39 -0
  629. package/lib/Types/Mex.js.map +1 -0
  630. package/lib/Types/Product.d.ts +2 -0
  631. package/lib/Types/Product.d.ts.map +1 -0
  632. package/lib/Types/Product.js +2 -0
  633. package/lib/Types/Product.js.map +1 -0
  634. package/lib/Types/RichType.d.ts +3 -0
  635. package/lib/Types/RichType.d.ts.map +1 -0
  636. package/lib/Types/RichType.js +23 -0
  637. package/lib/Types/RichType.js.map +1 -0
  638. package/lib/Types/Signal.d.ts +2 -0
  639. package/lib/Types/Signal.d.ts.map +1 -0
  640. package/lib/Types/Signal.js +2 -0
  641. package/lib/Types/Signal.js.map +1 -0
  642. package/lib/Types/Socket.d.ts +2 -0
  643. package/lib/Types/Socket.d.ts.map +1 -0
  644. package/lib/Types/Socket.js +2 -0
  645. package/lib/Types/Socket.js.map +1 -0
  646. package/lib/Types/State.d.ts +6 -0
  647. package/lib/Types/State.d.ts.map +1 -0
  648. package/lib/Types/State.js +56 -0
  649. package/lib/Types/State.js.map +1 -0
  650. package/lib/Types/USync.d.ts +2 -0
  651. package/lib/Types/USync.d.ts.map +1 -0
  652. package/lib/Types/USync.js +2 -0
  653. package/lib/Types/USync.js.map +1 -0
  654. package/lib/Types/index.d.ts +14 -0
  655. package/lib/Types/index.d.ts.map +1 -0
  656. package/lib/Types/index.js +26 -0
  657. package/lib/Types/index.js.map +1 -0
  658. package/lib/Utils/auth-utils.d.ts +58 -0
  659. package/lib/Utils/auth-utils.d.ts.map +1 -0
  660. package/lib/Utils/auth-utils.js +302 -0
  661. package/lib/Utils/auth-utils.js.map +1 -0
  662. package/lib/Utils/browser-utils.d.ts +9 -0
  663. package/lib/Utils/browser-utils.d.ts.map +1 -0
  664. package/lib/Utils/browser-utils.js +36 -0
  665. package/lib/Utils/browser-utils.js.map +1 -0
  666. package/lib/Utils/business.d.ts +50 -0
  667. package/lib/Utils/business.d.ts.map +1 -0
  668. package/lib/Utils/business.js +231 -0
  669. package/lib/Utils/business.js.map +1 -0
  670. package/lib/Utils/chat-utils.d.ts +409 -0
  671. package/lib/Utils/chat-utils.d.ts.map +1 -0
  672. package/lib/Utils/chat-utils.js +872 -0
  673. package/lib/Utils/chat-utils.js.map +1 -0
  674. package/lib/Utils/companion-reg-client-utils.d.ts +5 -0
  675. package/lib/Utils/companion-reg-client-utils.d.ts.map +1 -0
  676. package/lib/Utils/companion-reg-client-utils.js +46 -0
  677. package/lib/Utils/companion-reg-client-utils.js.map +1 -0
  678. package/lib/Utils/crypto.d.ts +40 -0
  679. package/lib/Utils/crypto.d.ts.map +1 -0
  680. package/lib/Utils/crypto.js +119 -0
  681. package/lib/Utils/crypto.js.map +1 -0
  682. package/lib/Utils/decode-wa-message.d.ts +84 -0
  683. package/lib/Utils/decode-wa-message.d.ts.map +1 -0
  684. package/lib/Utils/decode-wa-message.js +325 -0
  685. package/lib/Utils/decode-wa-message.js.map +1 -0
  686. package/lib/Utils/event-buffer.d.ts +13 -0
  687. package/lib/Utils/event-buffer.d.ts.map +1 -0
  688. package/lib/Utils/event-buffer.js +622 -0
  689. package/lib/Utils/event-buffer.js.map +1 -0
  690. package/lib/Utils/generics.d.ts +64 -0
  691. package/lib/Utils/generics.d.ts.map +1 -0
  692. package/lib/Utils/generics.js +395 -0
  693. package/lib/Utils/generics.js.map +1 -0
  694. package/lib/Utils/history.d.ts +76 -0
  695. package/lib/Utils/history.d.ts.map +1 -0
  696. package/lib/Utils/history.js +134 -0
  697. package/lib/Utils/history.js.map +1 -0
  698. package/lib/Utils/identity-change-handler.d.ts +14 -0
  699. package/lib/Utils/identity-change-handler.d.ts.map +1 -0
  700. package/lib/Utils/identity-change-handler.js +50 -0
  701. package/lib/Utils/identity-change-handler.js.map +1 -0
  702. package/lib/Utils/index.d.ts +25 -0
  703. package/lib/Utils/index.d.ts.map +1 -0
  704. package/lib/Utils/index.js +27 -0
  705. package/lib/Utils/index.js.map +1 -0
  706. package/lib/Utils/link-preview.d.ts +13 -0
  707. package/lib/Utils/link-preview.d.ts.map +1 -0
  708. package/lib/Utils/link-preview.js +85 -0
  709. package/lib/Utils/link-preview.js.map +1 -0
  710. package/lib/Utils/logger.d.ts +3 -0
  711. package/lib/Utils/logger.d.ts.map +1 -0
  712. package/lib/Utils/logger.js +3 -0
  713. package/lib/Utils/logger.js.map +1 -0
  714. package/lib/Utils/lt-hash.d.ts +7 -0
  715. package/lib/Utils/lt-hash.d.ts.map +1 -0
  716. package/lib/Utils/lt-hash.js +8 -0
  717. package/lib/Utils/lt-hash.js.map +1 -0
  718. package/lib/Utils/make-mutex.d.ts +7 -0
  719. package/lib/Utils/make-mutex.d.ts.map +1 -0
  720. package/lib/Utils/make-mutex.js +33 -0
  721. package/lib/Utils/make-mutex.js.map +1 -0
  722. package/lib/Utils/message-retry-manager.d.ts +80 -0
  723. package/lib/Utils/message-retry-manager.d.ts.map +1 -0
  724. package/lib/Utils/message-retry-manager.js +265 -0
  725. package/lib/Utils/message-retry-manager.js.map +1 -0
  726. package/lib/Utils/messages-media.d.ts +137 -0
  727. package/lib/Utils/messages-media.d.ts.map +1 -0
  728. package/lib/Utils/messages-media.js +843 -0
  729. package/lib/Utils/messages-media.js.map +1 -0
  730. package/lib/Utils/messages.d.ts +46 -0
  731. package/lib/Utils/messages.d.ts.map +1 -0
  732. package/lib/Utils/messages.js +1879 -0
  733. package/lib/Utils/messages.js.map +1 -0
  734. package/lib/Utils/noise-handler.d.ts +21 -0
  735. package/lib/Utils/noise-handler.d.ts.map +1 -0
  736. package/lib/Utils/noise-handler.js +201 -0
  737. package/lib/Utils/noise-handler.js.map +1 -0
  738. package/lib/Utils/offline-node-processor.d.ts +10 -0
  739. package/lib/Utils/offline-node-processor.d.ts.map +1 -0
  740. package/lib/Utils/offline-node-processor.js +40 -0
  741. package/lib/Utils/offline-node-processor.js.map +1 -0
  742. package/lib/Utils/pre-key-manager.d.ts +26 -0
  743. package/lib/Utils/pre-key-manager.d.ts.map +1 -0
  744. package/lib/Utils/pre-key-manager.js +106 -0
  745. package/lib/Utils/pre-key-manager.js.map +1 -0
  746. package/lib/Utils/process-message.d.ts +84 -0
  747. package/lib/Utils/process-message.d.ts.map +1 -0
  748. package/lib/Utils/process-message.js +745 -0
  749. package/lib/Utils/process-message.js.map +1 -0
  750. package/lib/Utils/reporting-utils.d.ts +13 -0
  751. package/lib/Utils/reporting-utils.d.ts.map +1 -0
  752. package/lib/Utils/reporting-utils.js +258 -0
  753. package/lib/Utils/reporting-utils.js.map +1 -0
  754. package/lib/Utils/rich-message-utils.d.ts +49 -0
  755. package/lib/Utils/rich-message-utils.d.ts.map +1 -0
  756. package/lib/Utils/rich-message-utils.js +425 -0
  757. package/lib/Utils/rich-message-utils.js.map +1 -0
  758. package/lib/Utils/session-guard.js +148 -0
  759. package/lib/Utils/signal.d.ts +83 -0
  760. package/lib/Utils/signal.d.ts.map +1 -0
  761. package/lib/Utils/signal.js +201 -0
  762. package/lib/Utils/signal.js.map +1 -0
  763. package/lib/Utils/stanza-ack.d.ts +17 -0
  764. package/lib/Utils/stanza-ack.d.ts.map +1 -0
  765. package/lib/Utils/stanza-ack.js +38 -0
  766. package/lib/Utils/stanza-ack.js.map +1 -0
  767. package/lib/Utils/sync-action-utils.d.ts +3 -0
  768. package/lib/Utils/sync-action-utils.d.ts.map +1 -0
  769. package/lib/Utils/sync-action-utils.js +49 -0
  770. package/lib/Utils/sync-action-utils.js.map +1 -0
  771. package/lib/Utils/tc-token-utils.d.ts +30 -0
  772. package/lib/Utils/tc-token-utils.d.ts.map +1 -0
  773. package/lib/Utils/tc-token-utils.js +163 -0
  774. package/lib/Utils/tc-token-utils.js.map +1 -0
  775. package/lib/Utils/text-sticker.js +149 -0
  776. package/lib/Utils/use-multi-file-auth-state.d.ts +11 -0
  777. package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -0
  778. package/lib/Utils/use-multi-file-auth-state.js +121 -0
  779. package/lib/Utils/use-multi-file-auth-state.js.map +1 -0
  780. package/lib/Utils/use-single-file-auth-state.d.ts +11 -0
  781. package/lib/Utils/use-single-file-auth-state.d.ts.map +1 -0
  782. package/lib/Utils/use-single-file-auth-state.js +109 -0
  783. package/lib/Utils/use-single-file-auth-state.js.map +1 -0
  784. package/lib/Utils/use-sqlite-auth-state.d.ts +11 -0
  785. package/lib/Utils/use-sqlite-auth-state.d.ts.map +1 -0
  786. package/lib/Utils/use-sqlite-auth-state.js +109 -0
  787. package/lib/Utils/use-sqlite-auth-state.js.map +1 -0
  788. package/lib/Utils/validate-connection.d.ts +44 -0
  789. package/lib/Utils/validate-connection.d.ts.map +1 -0
  790. package/lib/Utils/validate-connection.js +203 -0
  791. package/lib/Utils/validate-connection.js.map +1 -0
  792. package/lib/WABinary/constants.d.ts +62 -0
  793. package/lib/WABinary/constants.d.ts.map +1 -0
  794. package/lib/WABinary/constants.js +1467 -0
  795. package/lib/WABinary/constants.js.map +1 -0
  796. package/lib/WABinary/decode.d.ts +10 -0
  797. package/lib/WABinary/decode.d.ts.map +1 -0
  798. package/lib/WABinary/decode.js +262 -0
  799. package/lib/WABinary/decode.js.map +1 -0
  800. package/lib/WABinary/encode.d.ts +3 -0
  801. package/lib/WABinary/encode.d.ts.map +1 -0
  802. package/lib/WABinary/encode.js +220 -0
  803. package/lib/WABinary/encode.js.map +1 -0
  804. package/lib/WABinary/generic-utils.d.ts +77 -0
  805. package/lib/WABinary/generic-utils.d.ts.map +1 -0
  806. package/lib/WABinary/generic-utils.js +226 -0
  807. package/lib/WABinary/generic-utils.js.map +1 -0
  808. package/lib/WABinary/index.d.ts +6 -0
  809. package/lib/WABinary/index.d.ts.map +1 -0
  810. package/lib/WABinary/index.js +6 -0
  811. package/lib/WABinary/index.js.map +1 -0
  812. package/lib/WABinary/jid-utils.d.ts +29 -0
  813. package/lib/WABinary/jid-utils.d.ts.map +1 -0
  814. package/lib/WABinary/jid-utils.js +96 -0
  815. package/lib/WABinary/jid-utils.js.map +1 -0
  816. package/lib/WABinary/types.d.ts +2 -0
  817. package/lib/WABinary/types.d.ts.map +1 -0
  818. package/lib/WABinary/types.js +2 -0
  819. package/lib/WABinary/types.js.map +1 -0
  820. package/lib/WAM/BinaryInfo.d.ts +8 -0
  821. package/lib/WAM/BinaryInfo.d.ts.map +1 -0
  822. package/lib/WAM/BinaryInfo.js +10 -0
  823. package/lib/WAM/BinaryInfo.js.map +1 -0
  824. package/lib/WAM/constants.d.ts +34927 -0
  825. package/lib/WAM/constants.d.ts.map +1 -0
  826. package/lib/WAM/constants.js +22853 -0
  827. package/lib/WAM/constants.js.map +1 -0
  828. package/lib/WAM/encode.d.ts +2 -0
  829. package/lib/WAM/encode.d.ts.map +1 -0
  830. package/lib/WAM/encode.js +150 -0
  831. package/lib/WAM/encode.js.map +1 -0
  832. package/lib/WAM/index.d.ts +4 -0
  833. package/lib/WAM/index.d.ts.map +1 -0
  834. package/lib/WAM/index.js +4 -0
  835. package/lib/WAM/index.js.map +1 -0
  836. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +37 -0
  837. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts.map +1 -0
  838. package/lib/WAUSync/Protocols/USyncContactProtocol.js +52 -0
  839. package/lib/WAUSync/Protocols/USyncContactProtocol.js.map +1 -0
  840. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +23 -0
  841. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts.map +1 -0
  842. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +54 -0
  843. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js.map +1 -0
  844. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +13 -0
  845. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts.map +1 -0
  846. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
  847. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js.map +1 -0
  848. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +13 -0
  849. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts.map +1 -0
  850. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +38 -0
  851. package/lib/WAUSync/Protocols/USyncStatusProtocol.js.map +1 -0
  852. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  853. package/lib/WAUSync/Protocols/USyncUsernameProtocol.d.ts.map +1 -0
  854. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +25 -0
  855. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js.map +1 -0
  856. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +39 -0
  857. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts.map +1 -0
  858. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +51 -0
  859. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js.map +1 -0
  860. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +15 -0
  861. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts.map +1 -0
  862. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
  863. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js.map +1 -0
  864. package/lib/WAUSync/Protocols/index.d.ts +6 -0
  865. package/lib/WAUSync/Protocols/index.d.ts.map +1 -0
  866. package/lib/WAUSync/Protocols/index.js +6 -0
  867. package/lib/WAUSync/Protocols/index.js.map +1 -0
  868. package/lib/WAUSync/USyncQuery.d.ts +21 -0
  869. package/lib/WAUSync/USyncQuery.d.ts.map +1 -0
  870. package/lib/WAUSync/USyncQuery.js +98 -0
  871. package/lib/WAUSync/USyncQuery.js.map +1 -0
  872. package/lib/WAUSync/USyncUser.d.ts +17 -0
  873. package/lib/WAUSync/USyncUser.d.ts.map +1 -0
  874. package/lib/WAUSync/USyncUser.js +31 -0
  875. package/lib/WAUSync/USyncUser.js.map +1 -0
  876. package/lib/WAUSync/index.d.ts +4 -0
  877. package/lib/WAUSync/index.d.ts.map +1 -0
  878. package/lib/WAUSync/index.js +4 -0
  879. package/lib/WAUSync/index.js.map +1 -0
  880. package/lib/index.d.ts +201 -0
  881. package/lib/index.d.ts.map +1 -0
  882. package/lib/index.js +314 -0
  883. package/lib/index.js.map +1 -0
  884. package/lib/plugins/loader.cjs +26 -0
  885. package/lib/plugins/loader.js +94 -0
  886. package/package.json +148 -0
package/README.md ADDED
@@ -0,0 +1,3005 @@
1
+ <div align="center">
2
+
3
+ # deffa-baileys
4
+
5
+ <img src="https://capsule-render.vercel.app/api?type=waving&color=0:0a0a12,50:2b1a2e,100:0a0a12&height=220&section=header&text=DEFFA%20BAILEYS&fontSize=62&fontColor=e8b76a&fontAlign=50&fontAlignY=38&desc=WhatsApp%20%C2%B7%20Telegram%20%C2%B7%20Discord%20%E2%80%94%20Unified%20Engine&descAlign=50&descAlignY=62&descSize=18&animation=fadeIn" width="100%"/>
6
+
7
+ <br>
8
+
9
+
10
+ <img src="https://i.ibb.co/xq4NzXq0/deffa28760176.png" width="100%" style="border-radius:14px;box-shadow:0 8px 30px rgba(0,0,0,0.55);" />
11
+
12
+ <br><br>
13
+
14
+ <picture>
15
+ <img alt="deffa-baileys" src="https://readme-typing-svg.demolab.com/?font=Georgia&size=30&duration=3200&pause=900&color=E8B76A&center=true&vCenter=true&width=820&height=55&lines=deffa-baileys;Satu+Library%2C+Tiga+Platform;WhatsApp+%C2%B7+Telegram+%C2%B7+Discord;Dibangun+untuk+yang+Serius+Membangun" />
16
+ </picture>
17
+
18
+ <br><br>
19
+
20
+ <sub>✦ &nbsp;ECMASCRIPT MODULES &nbsp;·&nbsp; NODE.JS 20+ &nbsp;·&nbsp; MIT LICENSE &nbsp;·&nbsp; MAINTAINED BY DEFFA &nbsp;✦</sub>
21
+
22
+ <br><br>
23
+
24
+ [![npm version](https://img.shields.io/npm/v/deffa-baileys?style=for-the-badge&label=NPM&labelColor=0a0a12&color=7d3d6b)](https://www.npmjs.com/package/deffa-baileys)
25
+ [![npm downloads](https://img.shields.io/npm/dt/deffa-baileys?style=for-the-badge&label=DOWNLOADS&labelColor=0a0a12&color=7d3d6b)](https://www.npmjs.com/package/deffa-baileys)
26
+ [![node version](https://img.shields.io/badge/NODE-%E2%89%A518.0.0-0a0a12?style=for-the-badge&labelColor=0a0a12&color=c77b4f)](https://nodejs.org)
27
+ [![license](https://img.shields.io/badge/LICENSE-MIT-0a0a12?style=for-the-badge&labelColor=0a0a12&color=c77b4f)](#)
28
+ [![module type](https://img.shields.io/badge/MODULE-ESM-0a0a12?style=for-the-badge&labelColor=0a0a12&color=e8b76a)](#)
29
+ [![platforms](https://img.shields.io/badge/PLATFORMS-WA%20%7C%20TG%20%7C%20DC-0a0a12?style=for-the-badge&labelColor=0a0a12&color=e8b76a)](#)
30
+
31
+ </div>
32
+
33
+ <br>
34
+
35
+ > [!IMPORTANT]
36
+ > **Deffa Baileys** adalah library WhatsApp Web API yang kuat, stabil, dan ditingkatkan jauh dari basis aslinya — kini menyatu dengan engine Telegram Bot (`DeffaTelegraf`) **dan** Discord Client (`DeffaDiscord`) dalam satu package. Mendukung penuh protokol WhatsApp 2026 — *View-Once Text*, *View-Once Voice Note*, *Community Events*, *Group Message History*, *Channel Polling*, dan lainnya — dilengkapi plugin Brat/Bratvid bawaan serta fungsi eksklusif `testMessage` untuk menguji seluruh jenis pesan dalam satu panggilan. Dibangun khusus untuk Node.js dengan format ECMAScript Modules (ESM).
37
+
38
+ <br>
39
+
40
+ <div align="right">
41
+
42
+ <sub>◈ &nbsp;PETA NAVIGASI &nbsp;◈</sub>
43
+
44
+ </div>
45
+
46
+ <table width="100%">
47
+ <tr>
48
+ <td width="33%" valign="top" align="center">
49
+
50
+ ### ⟡ WhatsApp
51
+
52
+ Engine inti, *enhanced* dari Baileys dengan dukungan protokol 2026 penuh — pesan interaktif, media, event komunitas, hingga sistem keamanan session.
53
+
54
+ `makeWASocket` · `useMultiFileAuthState` · `makeInMemoryStore`
55
+
56
+ </td>
57
+ <td width="33%" valign="top" align="center">
58
+
59
+ ### ⟡ Telegram
60
+
61
+ `DeffaTelegraf` — engine bot Telegram lengkap dari long-polling dasar hingga Bot API 10.1: managed bots, guest mode, rich messages.
62
+
63
+ `DeffaTelegraf` · Scenes & Wizard · Inline Keyboard
64
+
65
+ </td>
66
+ <td width="34%" valign="top" align="center">
67
+
68
+ ### ⟡ Discord
69
+
70
+ `DeffaDiscord` — client Discord dari nol, mendukung slash command, sharding, modals UI 2026, dan per-guild bot profile.
71
+
72
+ `DeffaDiscord` · Slash Commands · ShardManager
73
+
74
+ </td>
75
+ </tr>
76
+ </table>
77
+
78
+ <br>
79
+
80
+ <div align="center">
81
+
82
+ ### ⟡ Mengapa deffa-baileys
83
+
84
+ </div>
85
+
86
+ | | |
87
+ |:---:|:---|
88
+ | **◆** | Satu dependency untuk **tiga platform messaging** sekaligus — tidak perlu lagi merangkai tiga library berbeda dengan API yang tidak konsisten |
89
+ | **◆** | Dukungan penuh **protokol WhatsApp 2026** — fitur-fitur terbaru yang belum tersedia di kebanyakan fork Baileys lain |
90
+ | **◆** | `testMessage` bawaan — **uji 16 jenis pesan** dalam satu panggilan fungsi, tanpa setup tambahan |
91
+ | **◆** | `sessionGuard` — kunci session ke IP server pertama, **proteksi nyata dari pencurian session** |
92
+ | **◆** | Plugin Brat/Bratvid **bawaan**, tidak perlu API key eksternal tambahan |
93
+ | **◆** | Tiga jenis Auth State (`multiFile`, `singleFile`, `sqlite`) — fleksibel untuk **semua skala deployment** |
94
+
95
+ <br>
96
+
97
+ <div align="center">
98
+
99
+ <hr>
100
+
101
+ ### ✦ Daftar Isi
102
+
103
+ </div>
104
+
105
+ <table width="100%"><tr><td>
106
+
107
+
108
+ <code>01</code> &nbsp;<a href="#01-installation"><strong>Installation</strong></a><br>
109
+
110
+ <code>02</code> &nbsp;<a href="#02-quick-start"><strong>Quick Start</strong></a><br>
111
+
112
+ <code>03</code> &nbsp;<a href="#03-auth-state"><strong>Auth State</strong></a><br>
113
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-31-multi-file-auth-state">3.1 · Multi File Auth State</a><br>
114
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-32-single-file-auth-state">3.2 · Single File Auth State</a><br>
115
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-33-sqlite-auth-state">3.3 · SQLite Auth State</a><br>
116
+ <br>
117
+
118
+ <code>04</code> &nbsp;<a href="#04-makeinmemorystore"><strong>makeInMemoryStore</strong></a><br>
119
+
120
+ <details>
121
+ <summary><code>05</code> &nbsp;<a href="#05-sending-messages"><strong>Sending Messages</strong></a> &nbsp;<sub>(38 topik)</sub></summary>
122
+ <br>
123
+
124
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-51-text-biasa">5.1 · Text Biasa</a><br>
125
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-52-text-dengan-mention-user">5.2 · Text dengan Mention User</a><br>
126
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-53-mention-all">5.3 · Mention All</a><br>
127
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-54-reply-quote-message">5.4 · Reply / Quote Message</a><br>
128
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-55-reaction">5.5 · Reaction</a><br>
129
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-56-image">5.6 · Image</a><br>
130
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-57-video">5.7 · Video</a><br>
131
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-58-audio">5.8 · Audio</a><br>
132
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-59-document">5.9 · Document</a><br>
133
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-510-sticker">5.10 · Sticker</a><br>
134
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-511-sticker-pack">5.11 · Sticker Pack</a><br>
135
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-512-contact-vcard">5.12 · Contact / vCard</a><br>
136
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-513-location">5.13 · Location</a><br>
137
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-514-live-location">5.14 · Live Location</a><br>
138
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-515-poll">5.15 · Poll</a><br>
139
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-516-album">5.16 · Album</a><br>
140
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-517-interactive-buttons-native-flow">5.17 · Interactive — Buttons (Native Flow)</a><br>
141
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-518-interactive-list">5.18 · Interactive — List</a><br>
142
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-519-interactive-image-header">5.19 · Interactive — Image Header</a><br>
143
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-520-interactive-sebagai-template">5.20 · Interactive sebagai Template</a><br>
144
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-521-hydrated-template-button">5.21 · Hydrated Template Button</a><br>
145
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-522-view-once">5.22 · View Once</a><br>
146
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-523-ephemeral">5.23 · Ephemeral</a><br>
147
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-524-spoiler">5.24 · Spoiler</a><br>
148
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-525-group-status">5.25 · Group Status</a><br>
149
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-526-external-ad-reply">5.26 · External Ad Reply</a><br>
150
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-527-forward-pesan">5.27 · Forward Pesan</a><br>
151
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-528-pin-pesan">5.28 · Pin Pesan</a><br>
152
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-529-raw-message">5.29 · Raw Message</a><br>
153
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-530-group-invite-link">5.30 · Group Invite Link</a><br>
154
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-531-event-dengan-reminder-fitur-wa-januari-2026">5.31 · Event dengan Reminder (fitur WA Januari 2026)</a><br>
155
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-532-text-sticker-fitur-wa-januari-2026">5.32 · Text Sticker (fitur WA Januari 2026)</a><br>
156
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-533-view-once-text-teks-sekali-lihat-wa-2026">5.33 · View-Once Text — Teks Sekali Lihat (WA 2026)</a><br>
157
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-534-view-once-voice-note-audio-sekali-dengar-wa-2026">5.34 · View-Once Voice Note — Audio Sekali Dengar (WA 2026)</a><br>
158
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-535-community-event-rsvp-virtual-meeting-call-wa-2026">5.35 · Community Event — RSVP & Virtual Meeting Call (WA 2026)</a><br>
159
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-536-group-message-history-share-wa-2026">5.36 · Group Message History Share (WA 2026)</a><br>
160
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-537-channel-poll-polling-di-saluranchannel-wa-2026">5.37 · Channel Poll — Polling di Saluran/Channel (WA 2026)</a><br>
161
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-538-channel-voice-note-wa-2026">5.38 · Channel Voice Note (WA 2026)</a><br>
162
+
163
+ </details>
164
+ <br>
165
+
166
+ <code>06</code> &nbsp;<a href="#06-rich-response-messages"><strong>Rich Response Messages</strong></a><br>
167
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-61-text-rich">6.1 · Text Rich</a><br>
168
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-62-code-block">6.2 · Code Block</a><br>
169
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-63-table">6.3 · Table</a><br>
170
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-64-inline-image">6.4 · Inline Image</a><br>
171
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-65-inline-link-citation">6.5 · Inline Link / Citation</a><br>
172
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-66-rich-response-kombinasi">6.6 · Rich Response Kombinasi</a><br>
173
+ <br>
174
+
175
+ <code>07</code> &nbsp;<a href="#07-group-management"><strong>Group Management</strong></a><br>
176
+
177
+ <code>08</code> &nbsp;<a href="#08-newsletter-channel"><strong>Newsletter / Channel</strong></a><br>
178
+
179
+ <code>09</code> &nbsp;<a href="#09-privacy-profile"><strong>Privacy & Profile</strong></a><br>
180
+
181
+ <code>10</code> &nbsp;<a href="#10-handling-events"><strong>Handling Events</strong></a><br>
182
+
183
+ <code>11</code> &nbsp;<a href="#11-deffa-plugins-brat-bratvid"><strong>Deffa Plugins : Brat & Bratvid</strong></a><br>
184
+
185
+ <code>12</code> &nbsp;<a href="#12-read-messages-presence"><strong>Read Messages & Presence</strong></a><br>
186
+
187
+ <code>13</code> &nbsp;<a href="#13-delete-edit-pesan"><strong>Delete / Edit Pesan</strong></a><br>
188
+
189
+ <code>14</code> &nbsp;<a href="#14-message-options-tambahan"><strong>Message Options Tambahan</strong></a><br>
190
+
191
+ <code>15</code> &nbsp;<a href="#15-browser-fingerprint-kiwi-uc-browser-dll"><strong>Browser Fingerprint (Kiwi, UC Browser, dll)</strong></a><br>
192
+
193
+ <details>
194
+ <summary><code>16</code> &nbsp;<a href="#16-telegram-bot-deffatelegraf"><strong>Telegram Bot (DeffaTelegraf)</strong></a> &nbsp;<sub>(17 topik)</sub></summary>
195
+ <br>
196
+
197
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-161-setup-dasar-long-polling">16.1 · Setup Dasar & Long Polling</a><br>
198
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-162-setup-via-webhook">16.2 · Setup via Webhook</a><br>
199
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-163-inline-keyboard-reply-keyboard">16.3 · Inline Keyboard & Reply Keyboard</a><br>
200
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-164-session-scenes-wizard">16.4 · Session, Scenes & Wizard</a><br>
201
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-165-memanggil-deffa-plugins-bratbratvid-dari-bot-telegram">16.5 · Memanggil Deffa Plugins (Brat/Bratvid) dari Bot Telegram</a><br>
202
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-166-cek-koneksi-bot-dengan-connecttelegram">16.6 · Cek Koneksi Bot dengan `connectTelegram`</a><br>
203
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-167-bot-api-9394-sendmessagedraft-profile-photo-bot-button-style-icon">16.7 · Bot API 9.3–9.4 – sendMessageDraft, Profile Photo Bot, Button Style & Icon</a><br>
204
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-168-bot-api-95-member-tags-date-time-entity">16.8 · Bot API 9.5 – Member Tags, Date-Time Entity</a><br>
205
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-169-bot-api-96-managed-bots">16.9 · Bot API 9.6 – Managed Bots</a><br>
206
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1610-bot-api-100-guest-mode">16.10 · Bot API 10.0 – Guest Mode</a><br>
207
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1611-bot-api-100-bot-to-bot-communication">16.11 · Bot API 10.0 – Bot-to-Bot Communication</a><br>
208
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1612-bot-api-100-delete-reactions">16.12 · Bot API 10.0 – Delete Reactions</a><br>
209
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1613-bot-api-100-live-photo">16.13 · Bot API 10.0 – Live Photo</a><br>
210
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1614-bot-api-100-managed-bot-access-settings">16.14 · Bot API 10.0 – Managed Bot Access Settings</a><br>
211
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1615-bot-api-100-get-user-personal-chat-messages">16.15 · Bot API 10.0 – Get User Personal Chat Messages</a><br>
212
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1616-bot-api-101-join-request-queries">16.16 · Bot API 10.1 – Join Request Queries</a><br>
213
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-1617-bot-api-101-rich-messages">16.17 · Bot API 10.1 – Rich Messages</a><br>
214
+
215
+ </details>
216
+ <br>
217
+
218
+ <code>17</code> &nbsp;<a href="#17-discord-bot-deffadiscord"><strong>Discord Bot (DeffaDiscord)</strong></a><br>
219
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-171-setup-dasar-login-bot">17.1 · Setup Dasar & Login Bot</a><br>
220
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-172-menangani-event-pesan">17.2 · Menangani Event & Pesan</a><br>
221
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-173-slash-commands-application-commands">17.3 · Slash Commands (Application Commands)</a><br>
222
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-174-embed-file-upload">17.4 · Embed & File Upload</a><br>
223
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-175-sharding-dengan-shardmanager">17.5 · Sharding dengan ShardManager</a><br>
224
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-176-cek-koneksi-bot-dengan-connectdiscord">17.6 · Cek Koneksi Bot dengan `connectDiscord`</a><br>
225
+ <br>
226
+
227
+ <code>18</code> &nbsp;<a href="#18-testmessage-tes-semua-jenis-pesan"><strong>testMessage : Tes Semua Jenis Pesan</strong></a><br>
228
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-cara-import-penggunaan">Cara import & penggunaan</a><br>
229
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-signature-lengkap">Signature lengkap</a><br>
230
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-yang-diuji-16-jenis-pesan">Yang diuji (16 jenis pesan)</a><br>
231
+ <br>
232
+
233
+ <details>
234
+ <summary><code>19</code> &nbsp;<a href="#19-sessionguard-proteksi-session-dari-pencurian"><strong>sessionGuard : Proteksi Session dari Pencurian</strong></a> &nbsp;<sub>(7 topik)</sub></summary>
235
+ <br>
236
+
237
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-cara-import">Cara Import</a><br>
238
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-penggunaan-dasar">Penggunaan Dasar</a><br>
239
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-opsi-lengkap">Opsi Lengkap</a><br>
240
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-cara-kerja">Cara Kerja</a><br>
241
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-cek-status-guard">Cek Status Guard</a><br>
242
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-reset-guard-pindah-server">Reset Guard (Pindah Server)</a><br>
243
+ &nbsp;&nbsp;&nbsp;&nbsp;◦ <a href="#-contoh-output-log">Contoh Output Log</a><br>
244
+
245
+ </details>
246
+ <br>
247
+
248
+
249
+ </td></tr></table>
250
+
251
+
252
+ <br>
253
+
254
+ <br>
255
+
256
+ <div align="right"><sub>§ SECTION 01</sub></div>
257
+
258
+ ## 01 — Installation
259
+
260
+ <hr>
261
+
262
+
263
+ Anda dapat menginstal package ini menggunakan manajer paket Node.js favorit Anda. Package ini membutuhkan Node.js versi 20 ke atas.
264
+ ```bash
265
+ npm install deffa-baileys
266
+
267
+ ```
268
+ ```bash
269
+ yarn add deffa-baileys
270
+
271
+ ```
272
+ ```bash
273
+ pnpm add deffa-baileys
274
+
275
+ ```
276
+ Untuk memaksimalkan semua fitur yang ada, terutama fitur manipulasi media, integrasi database, dan sistem preview, Anda disarankan untuk menginstal peer dependencies opsional berikut ini secara bersamaan.
277
+ ```bash
278
+ npm install sharp jimp @napi-rs/image audio-decode better-sqlite3 link-preview-js
279
+
280
+ ```
281
+
282
+
283
+ <br>
284
+
285
+ <div align="right"><sub>§ SECTION 02</sub></div>
286
+
287
+ ## 02 — Quick Start
288
+
289
+ <hr>
290
+
291
+
292
+ Berikut adalah contoh lengkap cara melakukan inisialisasi koneksi ke WhatsApp. Kode ini menangani pembuatan socket, integrasi kredensial login, dan logika rekoneksi otomatis. Terdapat dua metode login: menggunakan Pairing Code atau QR Code.
293
+ ```js
294
+ import pino from 'pino'
295
+ import { makeWASocket, useMultiFileAuthState, DisconnectReason, fetchLatestBaileysVersion, Browsers } from 'deffa-baileys'
296
+
297
+ async function connectToWhatsApp() {
298
+ const logger = pino({ level: 'silent' })
299
+
300
+ const { state, saveCreds } = await useMultiFileAuthState('./session-auth')
301
+ const { version, isLatest } = await fetchLatestBaileysVersion()
302
+
303
+ const usePairingCode = true
304
+ const phoneNumber = '6281234567890'
305
+
306
+ const sock = makeWASocket({
307
+ version: version,
308
+ logger: logger,
309
+ printQRInTerminal: !usePairingCode,
310
+ auth: state,
311
+ browser: Browsers.ubuntu('Chrome'), // bisa juga Browsers.kiwi(), Browsers.ucBrowser(), dll — lihat Bab 15
312
+ markOnlineOnConnect: true,
313
+ generateHighQualityLinkPreview: true,
314
+ syncFullHistory: false
315
+ })
316
+
317
+ if (usePairingCode && !sock.authState.creds.registered) {
318
+ const code = await sock.requestPairingCode(phoneNumber)
319
+ console.log(`Pairing Code Anda: ${code}`)
320
+ }
321
+
322
+ sock.ev.on('creds.update', saveCreds)
323
+
324
+ sock.ev.on('connection.update', (update) => {
325
+ const { connection, lastDisconnect } = update
326
+
327
+ if (connection === 'close') {
328
+ const shouldReconnect = lastDisconnect.error?.output?.statusCode !== DisconnectReason.loggedOut
329
+
330
+ if (shouldReconnect) {
331
+ connectToWhatsApp()
332
+ } else {
333
+ console.log('Koneksi terputus dan sesi telah dihapus.')
334
+ }
335
+ } else if (connection === 'open') {
336
+ console.log('Koneksi berhasil dibuka dan WhatsApp siap digunakan.')
337
+ }
338
+ })
339
+
340
+ return sock
341
+ }
342
+
343
+ connectToWhatsApp()
344
+
345
+ ```
346
+
347
+
348
+ <br>
349
+
350
+ <div align="right"><sub>§ SECTION 03</sub></div>
351
+
352
+ ## 03 — Auth State
353
+
354
+ <hr>
355
+
356
+
357
+ deffa-baileys menyediakan tiga jenis mekanisme penyimpanan status autentikasi yang dapat Anda pilih sesuai dengan infrastruktur aplikasi Anda.
358
+
359
+ #### ◈ 3.1 · Multi File Auth State
360
+
361
+ Menyimpan data kredensial dan keys dalam sebuah direktori yang berisi banyak file JSON. Sangat stabil dan direkomendasikan untuk penggunaan standar.
362
+ ```js
363
+ import { useMultiFileAuthState } from 'deffa-baileys'
364
+
365
+ async function setupAuth() {
366
+ const { state, saveCreds } = await useMultiFileAuthState('./auth_info_baileys')
367
+ return { state, saveCreds }
368
+ }
369
+
370
+ ```
371
+
372
+ #### ◈ 3.2 · Single File Auth State
373
+
374
+ Menyimpan seluruh data kredensial ke dalam satu file JSON tunggal. Mudah dipindahkan namun bisa menjadi sangat besar seiring waktu.
375
+ ```js
376
+ import { useSingleFileAuthState } from 'deffa-baileys'
377
+
378
+ async function setupAuth() {
379
+ const { state, saveCreds } = await useSingleFileAuthState('./creds.json')
380
+ return { state, saveCreds }
381
+ }
382
+
383
+ ```
384
+
385
+ #### ◈ 3.3 · SQLite Auth State
386
+
387
+ Menyimpan data autentikasi ke dalam database SQLite. Sangat cepat, hemat memori, dan sangat disarankan untuk produksi berskala besar.
388
+ ```js
389
+ import { useSqliteAuthState } from 'deffa-baileys'
390
+
391
+ async function setupAuth() {
392
+ // Membutuhkan peer dependency: npm install better-sqlite3
393
+ const { state, saveCreds } = await useSqliteAuthState({ dbPath: './auth_database.db' })
394
+ return { state, saveCreds }
395
+ }
396
+
397
+ ```
398
+
399
+
400
+ <br>
401
+
402
+ <div align="right"><sub>§ SECTION 04</sub></div>
403
+
404
+ ## 04 — makeInMemoryStore
405
+
406
+ <hr>
407
+
408
+
409
+ makeInMemoryStore adalah sistem penyimpanan data sesi dalam memori yang ditingkatkan. Menyediakan caching cerdas untuk pesan, kontak, dan metadata grup.
410
+ Konfigurasi dan implementasi lengkap:
411
+ ```js
412
+ import { makeInMemoryStore } from 'deffa-baileys'
413
+ import pino from 'pino'
414
+
415
+ const logger = pino({ level: 'silent' })
416
+
417
+ const store = makeInMemoryStore({
418
+ logger: logger,
419
+ maxMessages: Infinity,
420
+ presenceTTL: 300000
421
+ })
422
+
423
+ function setupStore(sock) {
424
+ store.bind(sock.ev)
425
+
426
+ store.on('onMessage', (message) => {
427
+ console.log(message)
428
+ })
429
+
430
+ store.on('onPresence', (presence) => {
431
+ console.log(presence)
432
+ })
433
+
434
+ store.on('onChat', (chat) => {
435
+ console.log(chat)
436
+ })
437
+
438
+ setInterval(() => {
439
+ store.writeToFile('./store_backup.json')
440
+ }, 10000)
441
+ }
442
+
443
+ async function useStoreFeatures(sock, jid, messageId) {
444
+ const stats = store.getStats()
445
+
446
+ const searchResults = await store.searchMessages('halo dunia', jid)
447
+
448
+ const allMessages = await store.loadAllMessages(jid)
449
+
450
+ const lastMessages = await store.loadLastMessages(jid, 20)
451
+
452
+ const allGroupMetadata = await store.fetchAllGroupMetadata(sock)
453
+
454
+ const isRead = store.isMessageRead(jid, messageId)
455
+
456
+ store.readFromFile('./store_backup.json')
457
+
458
+ store.clear()
459
+ }
460
+
461
+ ```
462
+
463
+
464
+ <br>
465
+
466
+ <div align="right"><sub>§ SECTION 05</sub></div>
467
+
468
+ ## 05 — Sending Messages
469
+
470
+ <hr>
471
+
472
+
473
+ Seksi ini memuat seluruh metode dan struktur pengiriman pesan menggunakan library ini.
474
+
475
+ #### ◈ 5.1 · Text Biasa
476
+
477
+ ```js
478
+ async function sendText(sock, jid) {
479
+ await sock.sendMessage(jid, {
480
+ text: 'Halo, ini adalah pesan teks biasa.'
481
+ })
482
+ }
483
+
484
+ ```
485
+
486
+ #### ◈ 5.2 · Text dengan Mention User
487
+
488
+ ```js
489
+ async function sendMention(sock, jid) {
490
+ await sock.sendMessage(jid, {
491
+ text: 'Halo @6281234567890, selamat datang di grup!',
492
+ mentions: ['6281234567890@s.whatsapp.net']
493
+ })
494
+ }
495
+
496
+ ```
497
+
498
+ #### ◈ 5.3 · Mention All
499
+
500
+ ```js
501
+ async function sendMentionAll(sock, jid) {
502
+ const meta = await sock.groupMetadata(jid)
503
+ await sock.sendMessage(jid, {
504
+ text: 'Pengumuman untuk seluruh anggota grup!',
505
+ mentionAll: true,
506
+ groupMetadata: meta
507
+ })
508
+ }
509
+
510
+ ```
511
+
512
+ #### ◈ 5.4 · Reply / Quote Message
513
+
514
+ ```js
515
+ async function sendReply(sock, jid, quotedMessage) {
516
+ await sock.sendMessage(jid, {
517
+ text: 'Ini adalah balasan dari pesan sebelumnya.',
518
+ quote: quotedMessage
519
+ })
520
+ }
521
+
522
+ ```
523
+
524
+ #### ◈ 5.5 · Reaction
525
+
526
+ ```js
527
+ async function sendReaction(sock, jid, messageKey) {
528
+ await sock.sendMessage(jid, {
529
+ react: {
530
+ text: '🔥',
531
+ key: messageKey
532
+ }
533
+ })
534
+ }
535
+
536
+ ```
537
+
538
+ #### ◈ 5.6 · Image
539
+
540
+ ```js
541
+ import fs from 'fs'
542
+
543
+ async function sendImages(sock, jid) {
544
+ await sock.sendMessage(jid, {
545
+ image: { url: 'https://domain.com/gambar-bagus.jpg' },
546
+ caption: 'Ini adalah gambar yang dikirim dari URL'
547
+ })
548
+
549
+ const bufferImage = fs.readFileSync('./lokal_foto.jpg')
550
+ await sock.sendMessage(jid, {
551
+ image: bufferImage,
552
+ caption: 'Ini adalah gambar yang dikirim dari buffer lokal'
553
+ })
554
+ }
555
+
556
+ ```
557
+
558
+ #### ◈ 5.7 · Video
559
+
560
+ ```js
561
+ async function sendVideo(sock, jid) {
562
+ await sock.sendMessage(jid, {
563
+ video: { url: 'https://domain.com/video-keren.mp4' },
564
+ caption: 'Deskripsi untuk video ini',
565
+ gifPlayback: false
566
+ })
567
+ }
568
+
569
+ ```
570
+
571
+ #### ◈ 5.8 · Audio
572
+
573
+ ```js
574
+ async function sendAudio(sock, jid) {
575
+ await sock.sendMessage(jid, {
576
+ audio: { url: 'https://domain.com/voice-note.ogg' },
577
+ mimetype: 'audio/ogg; codecs=opus',
578
+ ptt: true
579
+ })
580
+
581
+ await sock.sendMessage(jid, {
582
+ audio: { url: 'https://domain.com/musik.mp3' },
583
+ mimetype: 'audio/mp4'
584
+ })
585
+ }
586
+
587
+ ```
588
+
589
+ #### ◈ 5.9 · Document
590
+
591
+ ```js
592
+ async function sendDocument(sock, jid) {
593
+ await sock.sendMessage(jid, {
594
+ document: { url: 'https://domain.com/laporan-tahunan.pdf' },
595
+ mimetype: 'application/pdf',
596
+ fileName: 'laporan-tahunan-2026.pdf',
597
+ caption: 'Berikut adalah file dokumen yang diminta'
598
+ })
599
+ }
600
+
601
+ ```
602
+
603
+ #### ◈ 5.10 · Sticker
604
+
605
+ ```js
606
+ import fs from 'fs'
607
+
608
+ async function sendSticker(sock, jid) {
609
+ const stickerBuffer = fs.readFileSync('./animasi_sticker.webp')
610
+ await sock.sendMessage(jid, {
611
+ sticker: stickerBuffer
612
+ })
613
+ }
614
+
615
+ ```
616
+
617
+ #### ◈ 5.11 · Sticker Pack
618
+
619
+ ```js
620
+ import fs from 'fs'
621
+
622
+ async function sendStickerPack(sock, jid) {
623
+ const localSticker = fs.readFileSync('./sticker_dua.webp')
624
+ await sock.sendMessage(jid, {
625
+ stickerPack: {
626
+ name: 'Koleksi Sticker Eksklusif',
627
+ publisher: 'Deffa',
628
+ cover: { url: 'https://domain.com/cover-pack.png' },
629
+ stickers: [
630
+ { data: { url: 'https://domain.com/sticker_satu.webp' }, emojis: ['😂', '🤣'] },
631
+ { data: localSticker, emojis: ['🔥', '✨'] }
632
+ ]
633
+ }
634
+ })
635
+ }
636
+
637
+ ```
638
+
639
+ #### ◈ 5.12 · Contact / vCard
640
+
641
+ ```js
642
+ async function sendContact(sock, jid) {
643
+ const vcardString = 'BEGIN:VCARD\nVERSION:3.0\nFN:Deffa\nTEL;type=CELL;waid=6281234567890:+62 812 3456 7890\nEND:VCARD'
644
+
645
+ await sock.sendMessage(jid, {
646
+ contacts: {
647
+ displayName: 'Deffa Contact',
648
+ contacts: [{
649
+ vcard: vcardString
650
+ }]
651
+ }
652
+ })
653
+ }
654
+
655
+ ```
656
+
657
+ #### ◈ 5.13 · Location
658
+
659
+ ```js
660
+ async function sendLocation(sock, jid) {
661
+ await sock.sendMessage(jid, {
662
+ location: {
663
+ degreesLatitude: -6.2087634,
664
+ degreesLongitude: 106.845599,
665
+ name: 'Monumen Nasional',
666
+ address: 'Gambir, Jakarta Pusat, DKI Jakarta, Indonesia'
667
+ }
668
+ })
669
+ }
670
+
671
+ ```
672
+
673
+ #### ◈ 5.14 · Live Location
674
+
675
+ ```js
676
+ import { generateWAMessageFromContent } from 'deffa-baileys'
677
+
678
+ async function sendLiveLocation(sock, jid) {
679
+ const messageContent = {
680
+ locationMessage: {
681
+ degreesLatitude: -6.2087634,
682
+ degreesLongitude: 106.845599,
683
+ name: 'Lokasi Terkini',
684
+ address: 'Berbagi Lokasi Langsung',
685
+ liveLocation: {
686
+ degreesLatitude: -6.2087634,
687
+ degreesLongitude: 106.845599,
688
+ accuracyInMeters: 10,
689
+ speedInMps: 0,
690
+ degreesClockwiseFromMagneticNorth: 0,
691
+ caption: 'Saya sedang membagikan lokasi langsung',
692
+ sequenceNumber: 1,
693
+ timeOffset: 3600
694
+ },
695
+ contextInfo: {
696
+ forwardingScore: 1,
697
+ isForwarded: false
698
+ }
699
+ }
700
+ }
701
+
702
+ const generatedMessage = await generateWAMessageFromContent(
703
+ jid,
704
+ messageContent,
705
+ { userJid: sock.user.id }
706
+ )
707
+
708
+ await sock.relayMessage(jid, generatedMessage.message, {
709
+ messageId: generatedMessage.key.id
710
+ })
711
+ }
712
+
713
+ ```
714
+
715
+ #### ◈ 5.15 · Poll
716
+
717
+ ```js
718
+ async function sendPoll(sock, jid) {
719
+ await sock.sendMessage(jid, {
720
+ poll: {
721
+ name: 'Apa bahasa pemrograman favorit Anda untuk backend?',
722
+ values: ['Node.js', 'Python', 'Go', 'Rust'],
723
+ selectableCount: 1
724
+ }
725
+ })
726
+ }
727
+
728
+ ```
729
+
730
+ #### ◈ 5.16 · Album
731
+
732
+ ```js
733
+ import fs from 'fs'
734
+
735
+ async function sendAlbum(sock, jid) {
736
+ const localImage = fs.readFileSync('./foto_galeri.jpg')
737
+
738
+ await sock.sendMessage(jid, {
739
+ album: [
740
+ { image: { url: 'https://domain.com/foto_satu.jpg' }, caption: 'Dokumentasi Bagian 1' },
741
+ { image: localImage, caption: 'Dokumentasi Bagian 2' },
742
+ { video: { url: 'https://domain.com/video_dokumentasi.mp4' }, caption: 'Video Rekaman' }
743
+ ]
744
+ })
745
+ }
746
+
747
+ ```
748
+
749
+ #### ◈ 5.17 · Interactive — Buttons (Native Flow)
750
+
751
+ ```js
752
+ import { generateWAMessageFromContent } from 'deffa-baileys'
753
+
754
+ async function sendInteractiveButtons(sock, jid) {
755
+ const messageContent = {
756
+ viewOnceMessage: {
757
+ message: {
758
+ interactiveMessage: {
759
+ header: {
760
+ hasMediaAttachment: false
761
+ },
762
+ body: {
763
+ text: 'Silakan pilih salah satu opsi di bawah ini untuk melanjutkan:'
764
+ },
765
+ footer: {
766
+ text: 'deffa-baileys'
767
+ },
768
+ nativeFlowMessage: {
769
+ buttons: [
770
+ {
771
+ name: 'quick_reply',
772
+ buttonParamsJson: JSON.stringify({
773
+ display_text: '✅ Konfirmasi Pesanan',
774
+ id: 'btn_confirm_order'
775
+ })
776
+ },
777
+ {
778
+ name: 'cta_url',
779
+ buttonParamsJson: JSON.stringify({
780
+ display_text: '🌐 Kunjungi Website Resmi',
781
+ url: 'https://example.com',
782
+ merchant_url: 'https://example.com'
783
+ })
784
+ },
785
+ {
786
+ name: 'cta_copy',
787
+ buttonParamsJson: JSON.stringify({
788
+ display_text: '📋 Salin Kode Promo',
789
+ copy_code: 'DEFFA2026PROMO'
790
+ })
791
+ },
792
+ {
793
+ name: 'cta_call',
794
+ buttonParamsJson: JSON.stringify({
795
+ display_text: '📞 Hubungi Customer Service',
796
+ phone_number: '+6281234567890'
797
+ })
798
+ }
799
+ ],
800
+ messageVersion: 1
801
+ }
802
+ }
803
+ }
804
+ }
805
+ }
806
+
807
+ const generatedMessage = await generateWAMessageFromContent(
808
+ jid,
809
+ messageContent,
810
+ { userJid: sock.user.id }
811
+ )
812
+
813
+ await sock.relayMessage(jid, generatedMessage.message, {
814
+ messageId: generatedMessage.key.id
815
+ })
816
+ }
817
+
818
+ ```
819
+
820
+ #### ◈ 5.18 · Interactive — List
821
+
822
+ ```js
823
+ import { generateWAMessageFromContent } from 'deffa-baileys'
824
+
825
+ async function sendInteractiveList(sock, jid) {
826
+ const messageContent = {
827
+ viewOnceMessage: {
828
+ message: {
829
+ interactiveMessage: {
830
+ body: {
831
+ text: 'Berikut adalah katalog produk kami. Silakan pilih kategori yang Anda inginkan:'
832
+ },
833
+ footer: {
834
+ text: 'deffa-baileys'
835
+ },
836
+ nativeFlowMessage: {
837
+ buttons: [
838
+ {
839
+ name: 'single_select',
840
+ buttonParamsJson: JSON.stringify({
841
+ title: '📋 Buka Katalog Menu',
842
+ sections: [
843
+ {
844
+ title: '🍔 Makanan Utama',
845
+ rows: [
846
+ {
847
+ id: 'menu_nasi_goreng',
848
+ title: 'Nasi Goreng Spesial',
849
+ description: 'Rp 25.000 - Ekstra Telur'
850
+ },
851
+ {
852
+ id: 'menu_mie_goreng',
853
+ title: 'Mie Goreng Seafood',
854
+ description: 'Rp 30.000 - Udang & Cumi'
855
+ }
856
+ ]
857
+ },
858
+ {
859
+ title: '🥤 Minuman Segar',
860
+ rows: [
861
+ {
862
+ id: 'menu_es_teh',
863
+ title: 'Es Teh Manis',
864
+ description: 'Rp 5.000 - Gula Asli'
865
+ },
866
+ {
867
+ id: 'menu_jus_jeruk',
868
+ title: 'Jus Jeruk Peras',
869
+ description: 'Rp 12.000 - Jeruk Murni'
870
+ }
871
+ ]
872
+ }
873
+ ]
874
+ })
875
+ }
876
+ ],
877
+ messageVersion: 1
878
+ }
879
+ }
880
+ }
881
+ }
882
+ }
883
+
884
+ const generatedMessage = await generateWAMessageFromContent(
885
+ jid,
886
+ messageContent,
887
+ { userJid: sock.user.id }
888
+ )
889
+
890
+ await sock.relayMessage(jid, generatedMessage.message, {
891
+ messageId: generatedMessage.key.id
892
+ })
893
+ }
894
+
895
+ ```
896
+
897
+ #### ◈ 5.19 · Interactive — Image Header
898
+
899
+ ```js
900
+ async function sendInteractiveImageHeader(sock, jid) {
901
+ const imagePreparation = await sock.prepareMessage(jid, {
902
+ image: { url: 'https://domain.com/banner-promo.jpg' }
903
+ })
904
+
905
+ await sock.sendMessage(jid, {
906
+ interactive: {
907
+ type: 'native_flow',
908
+ header: {
909
+ hasMediaAttachment: true,
910
+ imageMessage: imagePreparation.message.imageMessage
911
+ },
912
+ body: { text: 'Dapatkan diskon 50% untuk pembelian pertama Anda hari ini!' },
913
+ footer: { text: 'deffa-baileys' },
914
+ nativeFlowMessage: {
915
+ buttons: [
916
+ {
917
+ name: 'quick_reply',
918
+ buttonParamsJson: JSON.stringify({
919
+ display_text: '🛒 Klaim Diskon & Beli Sekarang',
920
+ id: 'claim_discount_buy'
921
+ })
922
+ }
923
+ ]
924
+ }
925
+ }
926
+ })
927
+ }
928
+
929
+ ```
930
+
931
+ #### ◈ 5.20 · Interactive sebagai Template
932
+
933
+
934
+ > [!IMPORTANT]
935
+ > Opsi `interactiveAsTemplate` membungkus pesan jadi `templateMessage`, format legacy yang **tidak tampil di akun WhatsApp personal** (lihat catatan di 5.21). Hanya gunakan ini jika tujuan target adalah WhatsApp Business Cloud API resmi dengan template approved. Untuk bot/personal account biasa, kirim langsung tanpa flag `interactiveAsTemplate` (lihat 5.17).
936
+
937
+ ```js
938
+ async function sendInteractiveAsTemplate(sock, jid) {
939
+ await sock.sendMessage(jid, {
940
+ interactive: {
941
+ type: 'native_flow',
942
+ body: { text: 'Pesan interaktif ini dikirim menggunakan format bungkus template.' },
943
+ footer: { text: 'deffa-baileys' },
944
+ nativeFlowMessage: {
945
+ buttons: [
946
+ {
947
+ name: 'quick_reply',
948
+ buttonParamsJson: JSON.stringify({
949
+ display_text: 'Tampilkan Detail',
950
+ id: 'show_details'
951
+ })
952
+ }
953
+ ]
954
+ }
955
+ },
956
+ interactiveAsTemplate: true
957
+ })
958
+ }
959
+
960
+ ```
961
+
962
+ #### ◈ 5.21 · Hydrated Template Button
963
+
964
+
965
+ > [!WARNING]
966
+ > **PENTING — `templateMessage`/`buttonsMessage` (legacy) SUDAH TIDAK WORK di akun WhatsApp personal.** Berdasarkan dokumentasi resmi WhatsApp (developers.facebook.com), button & template format lama ini hanya didukung lewat **WhatsApp Business Cloud API** dengan template yang sudah di-approve Meta — bukan lewat koneksi personal/MD seperti Baileys. Mengirim `templateMessage` mentah dari akun biasa akan terkirim tapi **buttonnya tidak muncul / pesan tidak tampil** di sisi penerima (silent fail). Gunakan **5.17 Native Flow** sebagai gantinya — itu yang dipakai WA app resmi sekarang untuk personal account.
967
+
968
+ Helper `templateButtons` di bawah ini tetap disediakan untuk kompatibilitas kode lama, tapi secara internal **otomatis di-convert** memakai struktur yang sama dengan native flow agar tetap bisa tampil:
969
+
970
+ ```js
971
+ import { generateWAMessageFromContent, proto } from 'deffa-baileys'
972
+
973
+ // ✅ CARA YANG BENAR-BENAR WORK — pakai nativeFlow (lihat juga 5.17)
974
+ async function sendWorkingButtons(sock, jid) {
975
+ await sock.sendMessage(jid, {
976
+ text: 'Pilih salah satu opsi di bawah ini:',
977
+ footer: 'deffa-baileys',
978
+ nativeFlow: {
979
+ buttons: [
980
+ { url: 'https://example.com', text: '🌐 Buka Situs Web' },
981
+ { call: '+6281234567890', text: '📞 Hubungi Kami' },
982
+ { id: 'btn_agree_terms', text: '✅ Setuju' }
983
+ ]
984
+ }
985
+ })
986
+ }
987
+
988
+ // ⚠️ Legacy hydratedTemplate — disediakan untuk backward-compat, TIDAK direkomendasikan untuk fitur baru
989
+ async function sendHydratedTemplate(sock, jid) {
990
+ await sock.sendMessage(jid, {
991
+ templateButtons: [
992
+ { url: 'https://example.com', text: '🌐 Buka Situs Web' },
993
+ { call: '+6281234567890', text: '📞 Hubungi Kami' },
994
+ { id: 'btn_agree_terms', text: '✅ Setuju' }
995
+ ],
996
+ text: 'Ini adalah teks konten utama untuk pesan jenis hydrated template.',
997
+ footer: 'Informasi Footer Tambahan'
998
+ })
999
+ }
1000
+
1001
+ ```
1002
+
1003
+ #### ◈ 5.22 · View Once
1004
+
1005
+ ```js
1006
+ async function sendViewOnce(sock, jid) {
1007
+ await sock.sendMessage(jid, {
1008
+ image: { url: 'https://domain.com/rahasia.jpg' },
1009
+ caption: 'Dokumen ini hanya dapat dilihat satu kali.',
1010
+ viewOnce: true
1011
+ })
1012
+
1013
+ await sock.sendMessage(jid, {
1014
+ video: { url: 'https://domain.com/video-rahasia.mp4' },
1015
+ viewOnceV2: true
1016
+ })
1017
+ }
1018
+
1019
+ ```
1020
+
1021
+ #### ◈ 5.23 · Ephemeral
1022
+
1023
+ ```js
1024
+ async function sendEphemeral(sock, jid) {
1025
+ await sock.sendMessage(jid, {
1026
+ text: 'Pesan ini bersifat rahasia dan akan terhapus otomatis secara permanen dalam waktu 24 jam.',
1027
+ ephemeral: true
1028
+ }, {
1029
+ ephemeralExpiration: 86400
1030
+ })
1031
+ }
1032
+
1033
+ ```
1034
+
1035
+ #### ◈ 5.24 · Spoiler
1036
+
1037
+ ```js
1038
+ async function sendSpoiler(sock, jid) {
1039
+ await sock.sendMessage(jid, {
1040
+ image: { url: 'https://domain.com/kejutan.jpg' },
1041
+ caption: 'Ini adalah gambar kejutan yang disembunyikan di balik spoiler!',
1042
+ spoiler: true
1043
+ })
1044
+ }
1045
+
1046
+ ```
1047
+
1048
+ #### ◈ 5.25 · Group Status
1049
+
1050
+ ```js
1051
+ async function sendGroupStatus(sock, jid) {
1052
+ await sock.sendMessage(jid, {
1053
+ text: 'Pengumuman penting telah ditambahkan ke status grup.',
1054
+ groupStatus: true
1055
+ })
1056
+ }
1057
+
1058
+ ```
1059
+
1060
+ #### ◈ 5.26 · External Ad Reply
1061
+
1062
+
1063
+ > [!IMPORTANT]
1064
+ > **Catatan penting:** `externalAdReply` di shorthand `sock.sendMessage()` butuh field `url` (string, dipakai untuk `mediaUrl`/`sourceUrl`/`thumbnailUrl` sekaligus) dan `thumbnail` (Buffer JPEG, bukan `thumbnailUrl` string) — bukan `thumbnailUrl`/`sourceUrl` terpisah. Tanpa `thumbnail` (Buffer), preview card sering tidak muncul karena WA app butuh gambar sudah ter-embed, tidak bisa fetch dari URL eksternal saat render. Sertakan juga `forwardingScore` + `isForwarded: true` — pola ini paling konsisten membuat card-nya muncul.
1065
+ >
1066
+ > [!WARNING]
1067
+ > **Limitasi yang tidak bisa diperbaiki dari sisi kode:** `externalAdReply` murni metadata dekorasi di `contextInfo`, bukan tipe pesan sendiri — apakah card-nya dirender atau tidak itu **keputusan WhatsApp app di sisi penerima**, tergantung platform (Android/iOS) dan versi app. Ini dikonfirmasi sebagai known issue di banyak fork Baileys (lihat issue [#51](https://github.com/WhiskeySockets/Baileys/issues/51) dan [#75](https://github.com/WhiskeySockets/Baileys/issues/75) di repo WhiskeySockets/Baileys). Gejala umum: pengirim/linked-device sendiri melihat card lengkap (karena disinkron via WA Web/Desktop yang versinya lebih baru), tapi penerima dengan WA app versi/platform berbeda **hanya melihat teks biasa tanpa card**. Tidak ada konfigurasi proto yang menjamin tampil 100% di semua device — anggap fitur ini sebagai *progressive enhancement*, bukan sesuatu yang reliable untuk dipakai sebagai fitur utama bot.
1068
+
1069
+ ```js
1070
+ import fs from 'fs'
1071
+
1072
+ async function sendExternalAdReply(sock, jid) {
1073
+ await sock.sendMessage(jid, {
1074
+ text: 'Silakan periksa tautan referensi berikut ini untuk informasi lebih lanjut!',
1075
+ contextInfo: {
1076
+ forwardingScore: 100,
1077
+ isForwarded: true
1078
+ },
1079
+ externalAdReply: {
1080
+ title: 'Artikel Referensi Lengkap',
1081
+ body: 'Membahas teknologi terbaru dan perkembangannya di masa depan',
1082
+ thumbnail: fs.readFileSync('./thumbnail-artikel.jpg'), // wajib Buffer, bukan URL
1083
+ url: 'https://example.com/artikel-lengkap', // dipakai untuk mediaUrl & sourceUrl
1084
+ mediaType: 1, // 1 = tanpa media spesifik, 2 = image, 3 = video
1085
+ renderLargerThumbnail: true,
1086
+ showAdAttribution: true // default sudah true di lib, eksplisit di sini untuk kejelasan
1087
+ }
1088
+ })
1089
+ }
1090
+
1091
+ // Alternatif: raw style sesuai proto asli, kalau butuh kontrol penuh tanpa shorthand
1092
+ async function sendExternalAdReplyRaw(sock, jid) {
1093
+ await sock.sendMessage(jid, {
1094
+ text: 'Versi raw, langsung isi contextInfo.externalAdReply.',
1095
+ contextInfo: {
1096
+ forwardingScore: 100,
1097
+ isForwarded: true,
1098
+ externalAdReply: {
1099
+ title: 'Artikel Referensi Lengkap',
1100
+ body: 'Membahas teknologi terbaru',
1101
+ thumbnail: fs.readFileSync('./thumbnail-artikel.jpg'),
1102
+ thumbnailUrl: 'https://example.com/thumbnail-artikel.jpg',
1103
+ sourceUrl: 'https://example.com/artikel-lengkap',
1104
+ mediaType: 1,
1105
+ showAdAttribution: true
1106
+ }
1107
+ }
1108
+ })
1109
+ }
1110
+
1111
+ ```
1112
+
1113
+ #### ◈ 5.27 · Forward Pesan
1114
+
1115
+ ```js
1116
+ async function sendForwardMessage(sock, jid, messageToForward) {
1117
+ await sock.sendMessage(jid, {
1118
+ forward: messageToForward
1119
+ })
1120
+ }
1121
+
1122
+ ```
1123
+
1124
+ #### ◈ 5.28 · Pin Pesan
1125
+
1126
+ ```js
1127
+ async function pinMessageInChat(sock, jid, messageKey) {
1128
+ await sock.sendMessage(jid, {
1129
+ pin: {
1130
+ messageKey: messageKey,
1131
+ type: 1
1132
+ }
1133
+ })
1134
+ }
1135
+
1136
+ ```
1137
+
1138
+ #### ◈ 5.29 · Raw Message
1139
+
1140
+ ```js
1141
+ async function sendRawProtoMessage(sock, jid) {
1142
+ await sock.sendMessage(jid, {
1143
+ text: 'Pengujian pengiriman struktur raw protocol buffer langsung.',
1144
+ raw: true
1145
+ })
1146
+ }
1147
+
1148
+ ```
1149
+
1150
+ #### ◈ 5.30 · Group Invite Link
1151
+
1152
+ ```js
1153
+ async function sendGroupInvite(sock, jid) {
1154
+ const currentTime = Math.round(new Date().getTime() / 1000)
1155
+ const expirationTime = currentTime + 86400
1156
+
1157
+ await sock.sendMessage(jid, {
1158
+ groupInviteMessage: {
1159
+ inviteCode: 'AbCdEfGhIjKlMnOp',
1160
+ inviteExpiration: expirationTime,
1161
+ groupJid: '1234567890-0987654321@g.us',
1162
+ groupName: 'Komunitas Pengembang Nusantara',
1163
+ caption: 'Mari bergabung dengan grup diskusi kami untuk bertukar wawasan dan pengalaman!'
1164
+ }
1165
+ })
1166
+ }
1167
+
1168
+ ```
1169
+
1170
+ #### ◈ 5.31 · Event dengan Reminder (fitur WA Januari 2026)
1171
+
1172
+ WhatsApp resmi menambahkan "Event Reminders" pada update grup chat 7 Januari 2026 — pembuat event kini bisa menyetel pengingat otomatis untuk semua undangan sebelum acara dimulai. Cukup tambahkan `reminderOffsetSec` (dalam detik) ke object `event` yang sudah ada di deffa-baileys.
1173
+ ```js
1174
+ async function sendEventWithReminder(sock, jid) {
1175
+ await sock.sendMessage(jid, {
1176
+ event: {
1177
+ name: 'Nonton Bareng Final Liga',
1178
+ description: 'Kumpul bareng nonton final di basecamp ya, jangan telat!',
1179
+ startDate: new Date('2026-08-01T20:00:00+07:00'),
1180
+ endDate: new Date('2026-08-01T23:00:00+07:00'),
1181
+ location: {
1182
+ degreesLatitude: -7.983908,
1183
+ degreesLongitude: 112.621391,
1184
+ name: 'Basecamp Komunitas, Jl. Mawar No. 5'
1185
+ },
1186
+ extraGuestsAllowed: true,
1187
+ reminderOffsetSec: 3600
1188
+ }
1189
+ })
1190
+ }
1191
+
1192
+ ```
1193
+ > [!NOTE]
1194
+ > Catatan: jika `reminderOffsetSec` diisi, deffa-baileys otomatis menyetel `hasReminder: true` pada `eventMessage`. Tanpa parameter ini, event tetap terkirim normal tanpa pengingat — perilaku ini sepenuhnya backward-compatible dengan kode event lama Anda.
1195
+
1196
+ #### ◈ 5.32 · Text Sticker (fitur WA Januari 2026)
1197
+
1198
+ WhatsApp juga merilis "Text Stickers" pada update yang sama — mengubah kata apa pun menjadi stiker hanya dengan mengetik di Sticker Search. Karena fitur aslinya murni rendering sisi klien (tanpa endpoint protokol khusus), deffa-baileys menyediakan generator `renderTextSticker()` bawaan yang merender teks menjadi stiker WebP secara lokal (memakai `canvas` + `sharp`/`@napi-rs/image`, tanpa API pihak ketiga) lalu langsung bisa dikirim seperti stiker biasa.
1199
+ ```js
1200
+ import { renderTextSticker } from 'deffa-baileys'
1201
+
1202
+ async function sendTextSticker(sock, jid) {
1203
+ const stickerBuffer = await renderTextSticker('MANTAP', {
1204
+ backgroundColor: '#FFD60A',
1205
+ textColor: '#1A1A1A',
1206
+ fontWeight: 'bold'
1207
+ })
1208
+
1209
+ await sock.sendMessage(jid, {
1210
+ sticker: stickerBuffer
1211
+ })
1212
+ }
1213
+
1214
+ ```
1215
+ > [!NOTE]
1216
+ > Beda dengan plugin `attp`/`ttp` (Bab 11) yang memanggil API eksternal untuk efek teks bergerak/glow, `renderTextSticker` murni lokal — tidak butuh koneksi internet maupun API key, cocok untuk stiker teks polos yang cepat dan privat.
1217
+
1218
+ ---
1219
+
1220
+
1221
+ #### ◈ 5.33 · View-Once Text — Teks Sekali Lihat (WA 2026)
1222
+
1223
+
1224
+ Pertengahan 2026, WhatsApp merilis kemampuan mengirim **teks murni** sebagai view-once: pesan hanya bisa dibaca satu kali, setelah itu otomatis dihapus. Penerima tidak bisa menyalin, meneruskan, atau merekam layarnya. Di Baileys, ini bekerja dengan membungkus `extendedTextMessage` ke dalam `viewOnceMessageV2` via `generateWAMessageFromContent`.
1225
+
1226
+ ```js
1227
+ import { generateWAMessageFromContent, proto } from 'deffa-baileys'
1228
+
1229
+ async function sendViewOnceText(sock, jid) {
1230
+ // Cara 1 — shorthand flag (dicoba dulu, support tergantung versi WA penerima)
1231
+ await sock.sendMessage(jid, {
1232
+ text: 'Pesan rahasia ini hanya bisa dibaca satu kali. 🔒',
1233
+ viewOnce: true,
1234
+ })
1235
+
1236
+ // Cara 2 — raw proto wrap (lebih kompatibel dengan WA build terbaru)
1237
+ const innerMsg = generateWAMessageFromContent(jid, {
1238
+ extendedTextMessage: {
1239
+ text: 'Isi pesan rahasia yang hanya bisa dilihat sekali.',
1240
+ },
1241
+ }, {})
1242
+
1243
+ const viewOnceMsg = generateWAMessageFromContent(jid, {
1244
+ viewOnceMessageV2: {
1245
+ message: innerMsg.message,
1246
+ },
1247
+ }, { userJid: sock.user.id })
1248
+
1249
+ await sock.relayMessage(jid, viewOnceMsg.message, { messageId: viewOnceMsg.key.id })
1250
+ }
1251
+ ```
1252
+
1253
+ > [!NOTE]
1254
+ > **Catatan:** Pastikan WA penerima sudah versi yang mendukung view-once teks (2025.8+). Pada versi lebih lama pesan akan tampil sebagai teks biasa.
1255
+
1256
+ ---
1257
+
1258
+
1259
+ #### ◈ 5.34 · View-Once Voice Note — Audio Sekali Dengar (WA 2026)
1260
+
1261
+
1262
+ Voice note (PTT) kini resmi bisa dikirim sebagai view-once: audio hanya bisa diputar satu kali lalu hilang. Cocok untuk kirim kode OTP audio atau pesan suara rahasia.
1263
+
1264
+ ```js
1265
+ async function sendViewOnceVoice(sock, jid) {
1266
+ // View-Once Voice Note (PTT sekali dengar)
1267
+ await sock.sendMessage(jid, {
1268
+ audio: { url: './voice-rahasia.ogg' },
1269
+ mimetype: 'audio/ogg; codecs=opus',
1270
+ ptt: true, // wajib true agar muncul sebagai voice note
1271
+ viewOnce: true, // sekali dengar, lalu terhapus otomatis
1272
+ })
1273
+
1274
+ // Dengan waveform custom (opsional, memperindah tampilan)
1275
+ await sock.sendMessage(jid, {
1276
+ audio: { url: './voice-rahasia.ogg' },
1277
+ mimetype: 'audio/ogg; codecs=opus',
1278
+ ptt: true,
1279
+ viewOnce: true,
1280
+ waveform: [0, 15, 42, 80, 110, 95, 70, 50, 30, 10], // array amplitudo 0-100
1281
+ })
1282
+ }
1283
+ ```
1284
+
1285
+ > [!NOTE]
1286
+ > **Catatan:** `ptt: true` wajib ada — tanpa itu audio dikirim sebagai musik biasa dan flag `viewOnce` tidak akan aktif dengan benar.
1287
+
1288
+ ---
1289
+
1290
+
1291
+ #### ◈ 5.35 · Community Event — RSVP & Virtual Meeting Call (WA 2026)
1292
+
1293
+
1294
+ WhatsApp 2026 memperluas fitur event di **Community** dengan dukungan RSVP tracking dan link virtual meeting langsung di dalam pesan event. Berbeda dari 5.31 (event grup biasa dengan reminder), fitur ini spesifik untuk:
1295
+
1296
+ | Kapabilitas | Penjelasan |
1297
+ |:---|:---|
1298
+ | **Virtual call** | Audio/video link tertanam langsung di pesan event |
1299
+ | **RSVP** | Bot mendeteksi siapa yang menerima/menolak via `messages.upsert` bertipe `eventResponseMessage` |
1300
+ | **extraGuestsAllowed** | Anggota grup bisa mengajak tamu di luar grup ke event |
1301
+
1302
+
1303
+ ```js
1304
+ // Kirim event virtual meeting di community/grup
1305
+ async function sendVirtualMeetingEvent(sock, groupJid) {
1306
+ await sock.sendMessage(groupJid, {
1307
+ event: {
1308
+ isCancelled: false,
1309
+ name: 'Deffa Dev — Sprint Review Q4',
1310
+ description: 'Review sprint bulanan + demo fitur baru. Join via WA Call.',
1311
+ location: {
1312
+ // Untuk virtual meeting: isi name dengan link meeting, lat/long bisa 0
1313
+ degreesLatitude: 0,
1314
+ degreesLongitude: 0,
1315
+ name: 'Google Meet — meet.google.com/abc-defg-hij',
1316
+ },
1317
+ call: 'video', // 'audio' = voice call, 'video' = video call -- butuh options.getCallLink saat dipanggil dari generateWAMessageFromContent agar joinLink terisi
1318
+ startDate: new Date('2026-10-10T15:00:00+07:00'), // wajib objek Date, bukan unix timestamp
1319
+ endDate: new Date('2026-10-10T16:30:00+07:00'),
1320
+ extraGuestsAllowed: false, // false = hanya member grup yang bisa join
1321
+ },
1322
+ })
1323
+ }
1324
+
1325
+ // Handle respons RSVP dari peserta
1326
+ sock.ev.on('messages.upsert', ({ messages }) => {
1327
+ for (const msg of messages) {
1328
+ const rsvp = msg.message?.eventResponseMessage
1329
+ if (!rsvp) continue
1330
+
1331
+ // rsvp.response: 1 = GOING, 2 = NOT GOING
1332
+ const status = rsvp.response === 1 ? 'HADIR ✅' : 'TIDAK HADIR ❌'
1333
+ const eventId = rsvp.eventCreationMessageKey?.id
1334
+ const voter = msg.key.participant || msg.key.remoteJid
1335
+
1336
+ console.log(`RSVP dari ${voter}: ${status} (event ID: ${eventId})`)
1337
+ }
1338
+ })
1339
+ ```
1340
+
1341
+ > [!NOTE]
1342
+ > **Perbedaan dari 5.31:** Section 5.31 fokus pada event grup biasa dengan `reminderOffsetSec` (pengingat waktu). Section ini fokus pada **virtual meeting** + **RSVP response handling** — dua kemampuan berbeda yang hadir bersamaan di WA 2026.
1343
+
1344
+ ---
1345
+
1346
+
1347
+ #### ◈ 5.36 · Group Message History Share (WA 2026)
1348
+
1349
+
1350
+ WhatsApp merilis fitur ini Februari 2026: saat member baru ditambahkan, admin/member bisa membagikan 25–100 pesan terakhir ke member tersebut lewat prompt di UI client resmi. Fitur ini murni **client-side** (ditangani oleh aplikasi WA, bukan dikirim sebagai pesan protokol terpisah) dan field internalnya (`GroupHistoryBundleInfo`) ditandai `deprecated` di proto WA sendiri — sehingga **belum ada endpoint resmi** untuk men-trigger ini lewat Baileys/deffa-baileys.
1351
+
1352
+ Yang **sudah bisa** dilakukan lewat lib ini sekarang:
1353
+ ```js
1354
+ // Cek setting grup yang berkaitan (member add mode, announce, dst)
1355
+ async function checkGroupSettings(sock, groupJid) {
1356
+ const meta = await sock.groupMetadata(groupJid)
1357
+ console.log('Group metadata:', {
1358
+ name: meta.subject,
1359
+ memberAddMode: meta.memberAddMode, // 'all_member_add' | 'admin_add'
1360
+ announce: meta.announce, // true = hanya admin bisa kirim pesan
1361
+ participants: meta.participants.length,
1362
+ })
1363
+ return meta
1364
+ }
1365
+
1366
+ // Alternatif manual: forward N pesan terakhir ke member baru via DM/bot logic sendiri
1367
+ async function shareRecentMessagesManually(sock, groupJid, newMemberJid, messages) {
1368
+ for (const msg of messages.slice(-25)) { // ambil 25 pesan terakhir
1369
+ await sock.relayMessage(newMemberJid, msg.message, { messageId: msg.key.id })
1370
+ }
1371
+ }
1372
+ ```
1373
+
1374
+ > [!NOTE]
1375
+ > **Catatan:** Belum ada method native (`groupToggleMessageHistory` dkk **tidak exist**) karena WA belum membuka protokol publik untuk fitur ini. Jangan gunakan nama method yang belum ada di lib — cek dulu dengan `console.log(Object.keys(sock))` untuk daftar method yang benar-benar tersedia.
1376
+
1377
+ ---
1378
+
1379
+
1380
+ #### ◈ 5.37 · Channel Poll — Polling di Saluran/Channel (WA 2026)
1381
+
1382
+
1383
+ WhatsApp Channels kini mendukung pembuatan polling — fitur interaksi satu arah berskala besar langsung di saluran. Gunakan `toAnnouncementGroup: true` agar poll terkirim ke channel/saluran (newsletter JID).
1384
+
1385
+ ```js
1386
+ async function sendChannelPoll(sock, channelJid) {
1387
+ // Kirim poll ke Channel / Saluran WhatsApp
1388
+ // channelJid format: 'xxxxxxxxxxxxxxxxxx@newsletter'
1389
+ await sock.sendMessage(channelJid, {
1390
+ poll: {
1391
+ name: 'Bahasa pemrograman favorit kamu?',
1392
+ values: ['JavaScript', 'Python', 'Go', 'Rust', 'TypeScript'],
1393
+ selectableCount: 1, // 1 = single choice, >1 = multi choice
1394
+ toAnnouncementGroup: true, // WAJIB true untuk Channel/saluran
1395
+ },
1396
+ })
1397
+ }
1398
+
1399
+ // Poll biasa di grup (bukan channel)
1400
+ async function sendGroupPoll(sock, groupJid) {
1401
+ await sock.sendMessage(groupJid, {
1402
+ poll: {
1403
+ name: 'Kapan kita meet offline?',
1404
+ values: ['Minggu ini', 'Minggu depan', 'Bulan depan', 'Belum bisa'],
1405
+ selectableCount: 1,
1406
+ toAnnouncementGroup: false,
1407
+ },
1408
+ })
1409
+ }
1410
+
1411
+ // Handling respons poll di event handler
1412
+ sock.ev.on('messages.upsert', ({ messages }) => {
1413
+ for (const msg of messages) {
1414
+ if (msg.message?.pollUpdateMessage) {
1415
+ const update = msg.message.pollUpdateMessage
1416
+ console.log('Vote masuk:', {
1417
+ voter: msg.key.participant,
1418
+ pollMsgId: update.pollCreationMessageKey?.id,
1419
+ selectedOpt: update.vote?.selectedOptions,
1420
+ })
1421
+ }
1422
+ }
1423
+ })
1424
+ ```
1425
+
1426
+ ---
1427
+
1428
+
1429
+ #### ◈ 5.38 · Channel Voice Note (WA 2026)
1430
+
1431
+
1432
+ WhatsApp Channels kini mendukung pengiriman voice note — memungkinkan kreator saluran berinteraksi lebih personal dengan subscriber via audio langsung di channel.
1433
+
1434
+ ```js
1435
+ async function sendChannelVoiceNote(sock, channelJid) {
1436
+ // channelJid format: 'xxxxxxxxxxxxxxxxxx@newsletter'
1437
+ await sock.sendMessage(channelJid, {
1438
+ audio: { url: './pengumuman.ogg' },
1439
+ mimetype: 'audio/ogg; codecs=opus',
1440
+ ptt: true, // wajib true agar tampil sebagai voice note di channel
1441
+ })
1442
+
1443
+ // Dengan caption/deskripsi (support tergantung WA build)
1444
+ await sock.sendMessage(channelJid, {
1445
+ audio: { url: './rekaman-siaran.mp3' },
1446
+ mimetype: 'audio/mp4',
1447
+ ptt: false, // false = audio biasa (musik/rekaman), bukan PTT
1448
+ caption: 'Rekaman siaran terbaru — dengarkan sekarang! 🎙️',
1449
+ })
1450
+ }
1451
+ ```
1452
+
1453
+ > [!NOTE]
1454
+ > **Catatan:** Newsletter JID bisa didapat dari `sock.newsletterSubscribers(channelJid)`, `sock.newsletterFetchMessages(...)`, atau dari metadata channel yang sudah kamu follow saat event `messaging-history.set`.
1455
+
1456
+ ---
1457
+
1458
+
1459
+ <br>
1460
+
1461
+ <div align="right"><sub>§ SECTION 06</sub></div>
1462
+
1463
+ ## 06 — Rich Response Messages
1464
+
1465
+ <hr>
1466
+
1467
+
1468
+ Fitur ini secara eksklusif memungkinkan Anda mengirim struktur data yang lebih kompleks menyerupai antarmuka dari bot AI resmi WhatsApp.
1469
+
1470
+ #### ◈ 6.1 · Text Rich
1471
+
1472
+ ```js
1473
+ import { prepareRichResponseMessage } from 'deffa-baileys'
1474
+
1475
+ async function sendRichText(sock, jid) {
1476
+ const messageData = prepareRichResponseMessage({
1477
+ contentText: 'Ini adalah paragraf teks biasa yang dirender dalam kontainer rich response yang memiliki margin dan padding khusus.'
1478
+ })
1479
+
1480
+ await sock.sendMessage(jid, messageData)
1481
+ }
1482
+
1483
+ ```
1484
+
1485
+ #### ◈ 6.2 · Code Block
1486
+
1487
+ ```js
1488
+ import { prepareRichResponseMessage } from 'deffa-baileys'
1489
+
1490
+ async function sendRichCode(sock, jid) {
1491
+ const kodeProgram = 'const status = "success";\nconsole.log(`Operasi selesai dengan status: ${status}`);'
1492
+
1493
+ const messageData = prepareRichResponseMessage({
1494
+ headerText: 'Berikut adalah implementasi kode dalam JavaScript:',
1495
+ code: kodeProgram,
1496
+ language: 'javascript'
1497
+ })
1498
+
1499
+ await sock.sendMessage(jid, messageData)
1500
+ }
1501
+
1502
+ ```
1503
+
1504
+ #### ◈ 6.3 · Table
1505
+
1506
+ ```js
1507
+ import { prepareRichResponseMessage } from 'deffa-baileys'
1508
+
1509
+ async function sendRichTable(sock, jid) {
1510
+ const tabelData = [
1511
+ ['Nama Menu', 'Harga', 'Ketersediaan'],
1512
+ ['Nasi Goreng Spesial', 'Rp 25.000', '✅ Tersedia'],
1513
+ ['Mie Goreng Seafood', 'Rp 30.000', '✅ Tersedia'],
1514
+ ['Es Teh Manis', 'Rp 5.000', '✅ Tersedia'],
1515
+ ['Ayam Bakar Madu', 'Rp 35.000', '❌ Habis']
1516
+ ]
1517
+
1518
+ const messageData = prepareRichResponseMessage({
1519
+ headerText: 'Daftar Harga Lengkap:',
1520
+ title: 'Katalog Menu Restoran',
1521
+ table: tabelData,
1522
+ noHeading: false
1523
+ })
1524
+
1525
+ await sock.sendMessage(jid, messageData)
1526
+ }
1527
+
1528
+ ```
1529
+
1530
+ #### ◈ 6.4 · Inline Image
1531
+
1532
+ ```js
1533
+ import { prepareRichResponseMessage } from 'deffa-baileys'
1534
+
1535
+ async function sendRichInlineImage(sock, jid) {
1536
+ const messageData = prepareRichResponseMessage({
1537
+ contentText: 'Gambar di bawah ini disisipkan langsung di dalam kotak pesan:',
1538
+ inlineImage: 'https://domain.com/gambar-inline.jpg',
1539
+ imageText: 'Ilustrasi pemandangan alam',
1540
+ tapLinkUrl: 'https://example.com/galeri'
1541
+ })
1542
+
1543
+ await sock.sendMessage(jid, messageData)
1544
+ }
1545
+
1546
+ ```
1547
+
1548
+ #### ◈ 6.5 · Inline Link / Citation
1549
+
1550
+ ```js
1551
+ import { prepareRichResponseMessage } from 'deffa-baileys'
1552
+
1553
+ async function sendRichCitation(sock, jid) {
1554
+ const messageData = prepareRichResponseMessage({
1555
+ links: [{
1556
+ text: 'Silakan merujuk ke dokumentasi resmi untuk rincian lebih lanjut',
1557
+ title: 'Dokumentasi API',
1558
+ url: 'https://example.com/docs',
1559
+ displayName: 'Portal Edukasi',
1560
+ sources: [{
1561
+ displayName: 'Portal Edukasi',
1562
+ subtitle: 'Situs Referensi',
1563
+ url: 'https://example.com/docs'
1564
+ }]
1565
+ }]
1566
+ })
1567
+
1568
+ await sock.sendMessage(jid, messageData)
1569
+ }
1570
+
1571
+ ```
1572
+
1573
+ #### ◈ 6.6 · Rich Response Kombinasi
1574
+
1575
+ ```js
1576
+ import { prepareRichResponseMessage } from 'deffa-baileys'
1577
+
1578
+ async function sendComplexRichResponse(sock, jid) {
1579
+ const tabelKombinasi = [
1580
+ { isHeading: true, items: ['Kolom Identitas', 'Kolom Status'] },
1581
+ { isHeading: false, items: ['Server Utama', 'Online'] },
1582
+ { isHeading: false, items: ['Server Cadangan', 'Maintenance'] }
1583
+ ]
1584
+
1585
+ const messageData = prepareRichResponseMessage({
1586
+ richResponse: [
1587
+ { text: 'Sistem telah menyelesaikan analisis keseluruhan. Berikut adalah laporan terperinci:' },
1588
+ { code: [{ codeContent: 'function checkStatus() { return true; }', highlightType: 0 }], language: 'javascript' },
1589
+ { text: 'Kode di atas memvalidasi integritas data. Status server saat ini adalah:' },
1590
+ { table: tabelKombinasi, title: 'Status Infrastruktur Jaringan' },
1591
+ { inlineImage: 'https://domain.com/grafik-server.png', imageText: 'Grafik Beban Server' }
1592
+ ]
1593
+ })
1594
+
1595
+ await sock.sendMessage(jid, messageData)
1596
+ }
1597
+
1598
+ ```
1599
+
1600
+
1601
+ <br>
1602
+
1603
+ <div align="right"><sub>§ SECTION 07</sub></div>
1604
+
1605
+ ## 07 — Group Management
1606
+
1607
+ <hr>
1608
+
1609
+
1610
+ API yang ekstensif untuk memanipulasi dan mengelola data serta operasional grup secara menyeluruh.
1611
+ ```js
1612
+ async function manageGroup(sock, jid) {
1613
+ const daftarAnggotaAwal = ['6281234567890@s.whatsapp.net', '6289876543210@s.whatsapp.net']
1614
+ const grupBaru = await sock.groupCreate('Grup Diskusi Internal', daftarAnggotaAwal)
1615
+ const idGrup = grupBaru.id
1616
+
1617
+ const metadataGrup = await sock.groupMetadata(idGrup)
1618
+
1619
+ const targetUser = ['628111222333@s.whatsapp.net']
1620
+ await sock.groupParticipantsUpdate(idGrup, targetUser, 'add')
1621
+ await sock.groupParticipantsUpdate(idGrup, targetUser, 'promote')
1622
+ await sock.groupParticipantsUpdate(idGrup, targetUser, 'demote')
1623
+ await sock.groupParticipantsUpdate(idGrup, targetUser, 'remove')
1624
+
1625
+ await sock.groupUpdateSubject(idGrup, 'Grup Diskusi Internal v2')
1626
+ await sock.groupUpdateDescription(idGrup, 'Ini adalah deskripsi grup yang baru saja diperbarui melalui sistem bot otomatis.')
1627
+ await sock.updateProfilePicture(idGrup, { url: 'https://domain.com/ikon-grup.png' })
1628
+
1629
+ const kodeUndangan = await sock.groupInviteCode(idGrup)
1630
+ await sock.groupRevokeInvite(idGrup)
1631
+ const infoUndangan = await sock.groupGetInviteInfo(kodeUndangan)
1632
+ await sock.groupAcceptInvite(kodeUndangan)
1633
+
1634
+ await sock.groupSettingUpdate(idGrup, 'announcement')
1635
+ await sock.groupSettingUpdate(idGrup, 'not_announcement')
1636
+ await sock.groupSettingUpdate(idGrup, 'locked')
1637
+ await sock.groupSettingUpdate(idGrup, 'unlocked')
1638
+
1639
+ await sock.groupToggleEphemeral(idGrup, 86400)
1640
+ await sock.groupJoinApprovalMode(idGrup, 'on')
1641
+ await sock.groupMemberAddMode(idGrup, 'admin_add')
1642
+
1643
+ await sock.groupLeave(idGrup)
1644
+
1645
+ const daftarGrupAktif = await sock.groupFetchAllParticipating()
1646
+ }
1647
+
1648
+ ```
1649
+
1650
+
1651
+ <br>
1652
+
1653
+ <div align="right"><sub>§ SECTION 08</sub></div>
1654
+
1655
+ ## 08 — Newsletter / Channel
1656
+
1657
+ <hr>
1658
+
1659
+
1660
+ Fungsionalitas penuh untuk memoderasi saluran informasi siaran satu arah (Channel WhatsApp).
1661
+ ```js
1662
+ async function manageNewsletter(sock) {
1663
+ const metadataChannelBaru = await sock.newsletterCreate('Saluran Berita Utama', 'Pusat informasi dan pembaruan sistem secara langsung dan cepat.')
1664
+ const idChannel = metadataChannelBaru.id
1665
+
1666
+ await sock.newsletterFollow(idChannel)
1667
+ await sock.newsletterUnfollow(idChannel)
1668
+
1669
+ await sock.newsletterMute(idChannel)
1670
+ await sock.newsletterUnmute(idChannel)
1671
+
1672
+ await sock.newsletterUpdateName(idChannel, 'Berita Utama Revisi')
1673
+ await sock.newsletterUpdateDescription(idChannel, 'Pembaruan deskripsi untuk memperjelas tujuan dari saluran komunikasi ini.')
1674
+ await sock.newsletterUpdatePicture(idChannel, { url: 'https://domain.com/logo-channel.jpg' })
1675
+ await sock.newsletterRemovePicture(idChannel)
1676
+
1677
+ const kodeInviteChannel = 'KODE_INVITE_YANG_VALID'
1678
+ const detailMetadataChannel = await sock.newsletterMetadata('invite', kodeInviteChannel)
1679
+
1680
+ const idPesanServer = '1234567890'
1681
+ await sock.newsletterReactMessage(idChannel, idPesanServer, '🔥')
1682
+
1683
+ const daftarSaluranDiikuti = await sock.newsletterSubscribed()
1684
+
1685
+ const batasPesan = 10
1686
+ const daftarPesanChannel = await sock.newsletterFetchMessages('invite', kodeInviteChannel, batasPesan, null, null)
1687
+
1688
+ await sock.newsletterDelete(idChannel)
1689
+ }
1690
+
1691
+ ```
1692
+
1693
+
1694
+ <br>
1695
+
1696
+ <div align="right"><sub>§ SECTION 09</sub></div>
1697
+
1698
+ ## 09 — Privacy & Profile
1699
+
1700
+ <hr>
1701
+
1702
+
1703
+ Pengaturan terkait profil pribadi pengguna dan konfigurasi privasi keamanan akun.
1704
+ ```js
1705
+ async function updateProfileAndPrivacy(sock) {
1706
+ const targetJid = '6281234567890@s.whatsapp.net'
1707
+
1708
+ await sock.updateProfileName('Deffa Bot System')
1709
+ await sock.updateProfileStatus('Sistem berjalan dengan optimal dan sedang memonitor antrean tugas.')
1710
+ await sock.updateProfilePicture(targetJid, { url: 'https://domain.com/foto-profil-baru.jpg' })
1711
+ await sock.removeProfilePicture(targetJid)
1712
+
1713
+ const tautanFotoProfil = await sock.profilePictureUrl(targetJid, 'image')
1714
+ const informasiBio = await sock.fetchStatus(targetJid)
1715
+
1716
+ await sock.updateLastSeenPrivacy('all')
1717
+ await sock.updateOnlinePrivacy('all')
1718
+ await sock.updateProfilePicturePrivacy('all')
1719
+ await sock.updateStatusPrivacy('all')
1720
+ await sock.updateReadReceiptsPrivacy('all')
1721
+ await sock.updateGroupsAddPrivacy('all')
1722
+ await sock.updateCallPrivacy('all')
1723
+ await sock.updateMessagesPrivacy('all')
1724
+ await sock.updateDefaultDisappearingMode(86400)
1725
+
1726
+ await sock.updateBlockStatus(targetJid, 'block')
1727
+ await sock.updateBlockStatus(targetJid, 'unblock')
1728
+ const daftarBlokir = await sock.fetchBlocklist()
1729
+
1730
+ const nomorTelepon = '6281234567890'
1731
+ const hasilPengecekanWA = await sock.onWhatsApp(nomorTelepon)
1732
+
1733
+ await sock.sendPresenceUpdate('composing', targetJid)
1734
+ await sock.sendPresenceUpdate('recording', targetJid)
1735
+ await sock.sendPresenceUpdate('paused', targetJid)
1736
+ await sock.presenceSubscribe(targetJid)
1737
+ }
1738
+
1739
+ ```
1740
+
1741
+
1742
+ <br>
1743
+
1744
+ <div align="right"><sub>§ SECTION 10</sub></div>
1745
+
1746
+ ## 10 — Handling Events
1747
+
1748
+ <hr>
1749
+
1750
+
1751
+ Cara komprehensif untuk mendaftarkan pendengar acara ke seluruh aktivitas yang terjadi di jaringan.
1752
+ ```js
1753
+ function setupEventHandlers(sock, saveCreds) {
1754
+ sock.ev.on('connection.update', (updatePayload) => {
1755
+ const koneksi = updatePayload.connection
1756
+ const pemutusanTerakhir = updatePayload.lastDisconnect
1757
+ const kodeQr = updatePayload.qr
1758
+ const loginBaru = updatePayload.isNewLogin
1759
+ })
1760
+
1761
+ sock.ev.on('messages.upsert', (dataUpsert) => {
1762
+ const daftarPesan = dataUpsert.messages
1763
+ const tipeData = dataUpsert.type
1764
+
1765
+ for (const dataPesan of daftarPesan) {
1766
+ const pengirimJid = dataPesan.key.remoteJid
1767
+ const dikirimOlehSaya = dataPesan.key.fromMe
1768
+ const apakahGrup = pengirimJid.endsWith('@g.us')
1769
+
1770
+ const teksPesan = dataPesan.message?.conversation
1771
+ || dataPesan.message?.extendedTextMessage?.text
1772
+ || dataPesan.message?.imageMessage?.caption
1773
+ || ''
1774
+
1775
+ console.log({ pengirimJid, dikirimOlehSaya, apakahGrup, teksPesan })
1776
+ }
1777
+ })
1778
+
1779
+ sock.ev.on('messages.update', (dataPembaruanPesan) => {
1780
+ })
1781
+
1782
+ sock.ev.on('messages.reaction', (dataReaksi) => {
1783
+ })
1784
+
1785
+ sock.ev.on('message-receipt.update', (dataTandaTerima) => {
1786
+ })
1787
+
1788
+ sock.ev.on('presence.update', (dataKehadiran) => {
1789
+ const identitasUser = dataKehadiran.id
1790
+ const statusKehadiran = dataKehadiran.presences
1791
+ })
1792
+
1793
+ sock.ev.on('chats.update', (dataPembaruanChat) => {
1794
+ })
1795
+
1796
+ sock.ev.on('chats.upsert', (dataChatBaru) => {
1797
+ })
1798
+
1799
+ sock.ev.on('chats.delete', (dataPenghapusanChat) => {
1800
+ })
1801
+
1802
+ sock.ev.on('contacts.upsert', (dataKontakBaru) => {
1803
+ })
1804
+
1805
+ sock.ev.on('contacts.update', (dataPembaruanKontak) => {
1806
+ })
1807
+
1808
+ sock.ev.on('groups.update', (dataPembaruanGrup) => {
1809
+ })
1810
+
1811
+ sock.ev.on('group-participants.update', (dataAksiPesertaGrup) => {
1812
+ const idGrup = dataAksiPesertaGrup.id
1813
+ const daftarPeserta = dataAksiPesertaGrup.participants
1814
+ const jenisTindakan = dataAksiPesertaGrup.action
1815
+ })
1816
+
1817
+ sock.ev.on('call', (dataPanggilanMasuk) => {
1818
+ for (const panggilan of dataPanggilanMasuk) {
1819
+ const idPanggilan = panggilan.id
1820
+ const pemanggil = panggilan.from
1821
+
1822
+ sock.rejectCall(idPanggilan, pemanggil)
1823
+ }
1824
+ })
1825
+
1826
+ sock.ev.on('labels.edit', (dataLabelDiedit) => {
1827
+ })
1828
+
1829
+ sock.ev.on('labels.association', (dataAsosiasiLabel) => {
1830
+ const tipeAsosiasi = dataAsosiasiLabel.type
1831
+ const detailAsosiasi = dataAsosiasiLabel.association
1832
+ })
1833
+
1834
+ sock.ev.on('creds.update', saveCreds)
1835
+ }
1836
+
1837
+ ```
1838
+
1839
+
1840
+ <br>
1841
+
1842
+ <div align="right"><sub>§ SECTION 11</sub></div>
1843
+
1844
+ ## 11 — Deffa Plugins : Brat & Bratvid
1845
+
1846
+ <hr>
1847
+
1848
+
1849
+ deffa-baileys menyertakan **30+ plugin bawaan** siap pakai mencakup AI, berita, downloader, search, stalk, info, dan maker. Plugin dapat diimport langsung atau diakses via objek `plugins`. Output tiap plugin mengikuti format `{ ok, type, result }` — langsung bisa dipakai di `sendMessage`.
1850
+
1851
+ | Key | Method | Endpoint | Output | Parameter |
1852
+ |:---|:---:|:---|:---:|:---|
1853
+ | `brat` | `GET` | `/api/maker/brat` | Sticker · img | `text` `string` |
1854
+ | `bratvid` | `GET` | `/api/maker/bratvid` | Sticker · vid | `text` `string` |
1855
+
1856
+ ```js
1857
+ import { plugins, listPlugins } from 'deffa-baileys'
1858
+
1859
+ // Cek plugin yang tersedia
1860
+ console.log(listPlugins()) // ['ai', 'deepseek', 'qwq', 'glm', 'gpt', 'gita', 'cnbc', 'cnn', ..., 'brat', 'bratvid'] (30+ plugins)
1861
+
1862
+ // Kirim Brat image sebagai stiker
1863
+ async function kirimBrat(sock, jid) {
1864
+ const hasil = await plugins.brat({ text: 'gabut nih' })
1865
+ if (!hasil.ok) return console.error(hasil.message)
1866
+
1867
+ // hasil.type === 'sticker' — kirim langsung sebagai stiker
1868
+ await sock.sendMessage(jid, {
1869
+ sticker: { url: hasil.result },
1870
+ })
1871
+ }
1872
+
1873
+ // Kirim Bratvid (video) sebagai stiker animasi
1874
+ async function kirimBratvid(sock, jid) {
1875
+ const hasil = await plugins.bratvid({ text: 'literally me every monday' })
1876
+ if (!hasil.ok) return console.error(hasil.message)
1877
+
1878
+ await sock.sendMessage(jid, {
1879
+ sticker: { url: hasil.result },
1880
+ isAnimated: true, // opsional — indikator untuk stiker bergerak
1881
+ })
1882
+ }
1883
+
1884
+ // Contoh di dalam handler pesan bot
1885
+ sock.ev.on('messages.upsert', async ({ messages }) => {
1886
+ for (const msg of messages) {
1887
+ const text = msg.message?.conversation || msg.message?.extendedTextMessage?.text || ''
1888
+ const jid = msg.key.remoteJid
1889
+ const isBot = msg.key.fromMe
1890
+
1891
+ if (isBot || !text) continue
1892
+
1893
+ if (text.startsWith('.brat ')) {
1894
+ const input = text.slice(6).trim()
1895
+ const res = await plugins.brat({ text: input })
1896
+ if (res.ok) {
1897
+ await sock.sendMessage(jid, { sticker: { url: res.result } }, { quoted: msg })
1898
+ }
1899
+ }
1900
+
1901
+ if (text.startsWith('.bratvid ')) {
1902
+ const input = text.slice(9).trim()
1903
+ const res = await plugins.bratvid({ text: input })
1904
+ if (res.ok) {
1905
+ await sock.sendMessage(jid, { sticker: { url: res.result } }, { quoted: msg })
1906
+ }
1907
+ }
1908
+ }
1909
+ })
1910
+ ```
1911
+
1912
+ > [!NOTE]
1913
+ > Plugin Brat & Bratvid selalu mengembalikan `{ ok: boolean, type: 'sticker', result: string }` di mana `result` adalah URL gambar/video yang bisa langsung dipakai di `sendMessage`. Tidak ada API key tambahan yang diperlukan — sudah ter-bundle di dalam library.
1914
+
1915
+
1916
+ <br>
1917
+
1918
+ <div align="right"><sub>§ SECTION 12</sub></div>
1919
+
1920
+ ## 12 — Read Messages & Presence
1921
+
1922
+ <hr>
1923
+
1924
+
1925
+ Kendali mutlak atas indikator pesan dibaca dan pelaporan presensi sesi secara waktu nyata.
1926
+ ```js
1927
+ async function markMessagesAsRead(sock, kunciPesanTunggal, arrayKunciPesan) {
1928
+ await sock.readMessages([kunciPesanTunggal])
1929
+
1930
+ const kunciPesanSatu = arrayKunciPesan[0]
1931
+ const kunciPesanDua = arrayKunciPesan[1]
1932
+ const kunciPesanTiga = arrayKunciPesan[2]
1933
+
1934
+ await sock.readMessages([kunciPesanSatu, kunciPesanDua, kunciPesanTiga])
1935
+ }
1936
+
1937
+ ```
1938
+
1939
+
1940
+ <br>
1941
+
1942
+ <div align="right"><sub>§ SECTION 13</sub></div>
1943
+
1944
+ ## 13 — Delete / Edit Pesan
1945
+
1946
+ <hr>
1947
+
1948
+
1949
+ Mekanisme pasca-pengiriman yang memungkinkan Anda menarik kembali atau merevisi pesan yang telah telanjur terkirim ke server tujuan.
1950
+ ```js
1951
+ async function modifySentMessages(sock, jid, kunciPesanTerkirim) {
1952
+ await sock.sendMessage(jid, {
1953
+ delete: kunciPesanTerkirim
1954
+ })
1955
+
1956
+ await sock.sendMessage(jid, {
1957
+ edit: kunciPesanTerkirim,
1958
+ text: 'Ini adalah teks yang telah direvisi dan menggantikan konten pesan sebelumnya yang salah.'
1959
+ })
1960
+ }
1961
+
1962
+ ```
1963
+
1964
+
1965
+ <br>
1966
+
1967
+ <div align="right"><sub>§ SECTION 14</sub></div>
1968
+
1969
+ ## 14 — Message Options Tambahan
1970
+
1971
+ <hr>
1972
+
1973
+
1974
+ Modifikasi perilaku tambahan untuk pesan agar sesuai dengan spesifikasi kasus penggunaan tingkat lanjut.
1975
+ ```js
1976
+ import { prepareDisappearingMessageSettingContent } from 'deffa-baileys'
1977
+
1978
+ async function applyAdvancedMessageOptions(sock, jid, dataPesanKutipan) {
1979
+ const durasiMenghilangDariPenyimpanan = sock.store?.chats.get(jid)?.ephemeralExpiration
1980
+
1981
+ await sock.sendMessage(jid, {
1982
+ text: 'Pesan ini dikirim dengan konfigurasi menghilang mengikuti pengaturan chat lokal.'
1983
+ }, {
1984
+ ephemeralExpiration: durasiMenghilangDariPenyimpanan
1985
+ })
1986
+
1987
+ const pengaturanWaktuSatuHari = 86400
1988
+ const konfigurasiTimerBawaan = prepareDisappearingMessageSettingContent(pengaturanWaktuSatuHari)
1989
+ await sock.sendMessage(jid, konfigurasiTimerBawaan)
1990
+
1991
+ await sock.sendMessage(jid, {
1992
+ text: 'Balasan ini mencakup elemen antarmuka tombol interaktif yang diikatkan ke pesan historis.',
1993
+ interactive: {
1994
+ type: 'native_flow',
1995
+ body: { text: 'Klik tombol di bawah ini' },
1996
+ nativeFlowMessage: {
1997
+ buttons: [
1998
+ { name: 'quick_reply', buttonParamsJson: JSON.stringify({ display_text: 'Tombol Aksi', id: 'aksi' }) }
1999
+ ]
2000
+ }
2001
+ },
2002
+ quote: dataPesanKutipan
2003
+ })
2004
+ }
2005
+
2006
+ ```
2007
+
2008
+
2009
+ <br>
2010
+
2011
+ <div align="right"><sub>§ SECTION 15</sub></div>
2012
+
2013
+ ## 15 — Browser Fingerprint (Kiwi, UC Browser, dll)
2014
+
2015
+ <hr>
2016
+
2017
+
2018
+ Saat membuka koneksi dengan `makeWASocket`, properti `browser` menentukan perangkat & browser apa yang "terlihat" oleh WhatsApp sebagai linked device Anda. deffa-baileys menyediakan helper `Browsers` berisi preset fingerprint siap pakai — termasuk Kiwi Browser dan UC Browser — supaya Anda tidak perlu menulis array `[OS, Browser, Version]` secara manual.
2019
+ ```js
2020
+ import { Browsers } from 'deffa-baileys'
2021
+
2022
+ Browsers.ubuntu('Chrome') // ['Ubuntu', 'Chrome', '22.04.4']
2023
+ Browsers.macOS('Safari') // ['Mac OS', 'Safari', '14.4.1']
2024
+ Browsers.windows('Edge') // ['Windows', 'Edge', '10.0.22631']
2025
+ Browsers.android('Chrome') // ['Android', 'Chrome', '14.0']
2026
+ Browsers.baileys('Custom') // ['Baileys', 'Custom', '6.5.0']
2027
+ Browsers.kiwi() // ['Android', 'Chrome', '130.0.6723.58'] — fingerprint Kiwi Browser
2028
+ Browsers.ucBrowser() // ['Android', 'Chrome', '16.4.0.1'] — fingerprint UC Browser
2029
+ Browsers.brave() // ['Windows', 'Chrome', '130.0.0.0']
2030
+ Browsers.vivaldi() // ['Windows', 'Chrome', '6.9.3447.48']
2031
+ Browsers.arc() // ['Mac OS', 'Chrome', '1.60.0']
2032
+ Browsers.appropriate('Chrome') // otomatis menyesuaikan OS tempat proses Node.js Anda berjalan
2033
+
2034
+ ```
2035
+ Gunakan langsung di opsi koneksi:
2036
+ ```js
2037
+ import { makeWASocket, Browsers } from 'deffa-baileys'
2038
+
2039
+ const sock = makeWASocket({
2040
+ auth: state,
2041
+ browser: Browsers.kiwi(), // linked device akan tampil sebagai "Kiwi Browser" di WhatsApp
2042
+ })
2043
+
2044
+ ```
2045
+ > [!NOTE]
2046
+ > Catatan: fingerprint browser ini hanya memengaruhi bagaimana sesi tampil di daftar "Linked Devices" pada WhatsApp pengguna, dan tidak mengubah perilaku jaringan atau protokol koneksi itu sendiri.
2047
+
2048
+
2049
+ <br>
2050
+
2051
+ <div align="right"><sub>§ SECTION 16</sub></div>
2052
+
2053
+ ## 16 — Telegram Bot (DeffaTelegraf)
2054
+
2055
+ <hr>
2056
+
2057
+
2058
+ Selain WhatsApp, deffa-baileys juga membungkus engine Telegraf secara penuh dengan nama `DeffaTelegraf`. Artinya Anda bisa membangun bot Telegram lengkap — command, inline keyboard, scenes/wizard, session, hingga webhook — tanpa perlu menginstal package `telegraf` terpisah.
2059
+
2060
+ #### ◈ 16.1 · Setup Dasar & Long Polling
2061
+
2062
+ ```js
2063
+ import { DeffaTelegraf } from 'deffa-baileys'
2064
+
2065
+ const bot = new DeffaTelegraf(process.env.TELEGRAM_BOT_TOKEN)
2066
+
2067
+ bot.start((ctx) => ctx.reply('Halo! Bot Deffa siap digunakan 🚀'))
2068
+ bot.help((ctx) => ctx.reply('Kirim /menu untuk melihat daftar fitur.'))
2069
+
2070
+ bot.command('ping', (ctx) => ctx.reply('Pong!'))
2071
+
2072
+ bot.on('text', (ctx) => {
2073
+ ctx.reply(`Kamu mengirim: ${ctx.message.text}`)
2074
+ })
2075
+
2076
+ bot.catch((err, ctx) => {
2077
+ console.error(`Error untuk ${ctx.updateType}`, err)
2078
+ })
2079
+
2080
+ bot.launch()
2081
+ console.log('Bot Telegram berjalan dengan mode long polling...')
2082
+
2083
+ process.once('SIGINT', () => bot.stop('SIGINT'))
2084
+ process.once('SIGTERM', () => bot.stop('SIGTERM'))
2085
+
2086
+ ```
2087
+
2088
+ #### ◈ 16.2 · Setup via Webhook
2089
+
2090
+ Cocok untuk deployment di platform serverless seperti Vercel atau VPS dengan domain HTTPS aktif.
2091
+ ```js
2092
+ import { DeffaTelegraf } from 'deffa-baileys'
2093
+
2094
+ const bot = new DeffaTelegraf(process.env.TELEGRAM_BOT_TOKEN)
2095
+
2096
+ bot.command('start', (ctx) => ctx.reply('Bot aktif via webhook!'))
2097
+
2098
+ await bot.launch({
2099
+ webhook: {
2100
+ domain: 'https://domain-anda.com',
2101
+ port: process.env.PORT || 3000,
2102
+ path: '/telegram-webhook'
2103
+ }
2104
+ })
2105
+
2106
+ ```
2107
+
2108
+ #### ◈ 16.3 · Inline Keyboard & Reply Keyboard
2109
+
2110
+ ```js
2111
+ import { DeffaTelegraf, TelegramMarkup as Markup } from 'deffa-baileys'
2112
+
2113
+ const bot = new DeffaTelegraf(process.env.TELEGRAM_BOT_TOKEN)
2114
+
2115
+ bot.command('menu', (ctx) => {
2116
+ ctx.reply('Pilih salah satu fitur:', Markup.inlineKeyboard([
2117
+ [Markup.button.callback('🤖 AI Chat', 'menu_ai'), Markup.button.callback('⬇️ Downloader', 'menu_dl')],
2118
+ [Markup.button.url('📂 GitHub', 'https://github.com/deffacntip/deffa-baileys')]
2119
+ ]))
2120
+ })
2121
+
2122
+ bot.action('menu_ai', (ctx) => {
2123
+ ctx.answerCbQuery()
2124
+ ctx.editMessageText('Silakan ketik pertanyaan untuk AI.')
2125
+ })
2126
+
2127
+ bot.action('menu_dl', (ctx) => {
2128
+ ctx.answerCbQuery()
2129
+ ctx.editMessageText('Kirim link TikTok/Instagram/YouTube yang ingin diunduh.')
2130
+ })
2131
+
2132
+ ```
2133
+
2134
+ #### ◈ 16.4 · Session, Scenes & Wizard
2135
+
2136
+ Untuk membangun percakapan bertahap (misalnya alur registrasi atau form multi-langkah), gunakan `telegramSession` bersama `TelegramScenes`.
2137
+ ```js
2138
+ import { DeffaTelegraf, telegramSession, TelegramScenes } from 'deffa-baileys'
2139
+
2140
+ const registerScene = new TelegramScenes.WizardScene(
2141
+ 'register-wizard',
2142
+ (ctx) => {
2143
+ ctx.reply('Siapa nama Anda?')
2144
+ return ctx.wizard.next()
2145
+ },
2146
+ (ctx) => {
2147
+ ctx.wizard.state.nama = ctx.message.text
2148
+ ctx.reply('Berapa umur Anda?')
2149
+ return ctx.wizard.next()
2150
+ },
2151
+ (ctx) => {
2152
+ ctx.reply(`Terdaftar sebagai ${ctx.wizard.state.nama}, umur ${ctx.message.text} tahun.`)
2153
+ return ctx.scene.leave()
2154
+ }
2155
+ )
2156
+
2157
+ const stage = new TelegramScenes.Stage([registerScene])
2158
+ const bot = new DeffaTelegraf(process.env.TELEGRAM_BOT_TOKEN)
2159
+
2160
+ bot.use(telegramSession())
2161
+ bot.use(stage.middleware())
2162
+
2163
+ bot.command('daftar', (ctx) => ctx.scene.enter('register-wizard'))
2164
+
2165
+ bot.launch()
2166
+
2167
+ ```
2168
+
2169
+ #### ◈ 16.5 · Memanggil Deffa Plugins (Brat/Bratvid) dari Bot Telegram
2170
+
2171
+ Karena `plugins` adalah objek universal yang sama dipakai di sisi WhatsApp, Anda bisa memanggil fungsi AI/downloader/tools yang identik di dalam bot Telegram.
2172
+ ```js
2173
+ import { DeffaTelegraf, plugins } from 'deffa-baileys'
2174
+
2175
+ const bot = new DeffaTelegraf(process.env.TELEGRAM_BOT_TOKEN)
2176
+
2177
+ bot.command('ai', async (ctx) => {
2178
+ const pertanyaan = ctx.message.text.split(' ').slice(1).join(' ')
2179
+ if (!pertanyaan) return ctx.reply('Gunakan format: /ai <pertanyaan>')
2180
+
2181
+ const respon = await plugins.gpt({ q: pertanyaan })
2182
+ ctx.reply(respon?.result?.message || respon?.message || 'Gagal mendapatkan respon AI.')
2183
+ })
2184
+
2185
+ bot.command('tiktok', async (ctx) => {
2186
+ const url = ctx.message.text.split(' ')[1]
2187
+ if (!url) return ctx.reply('Gunakan format: /tiktok <url>')
2188
+
2189
+ const hasil = await plugins.tiktok({ url })
2190
+ if (hasil?.ok === false) return ctx.reply(hasil.message)
2191
+ ctx.reply('Video berhasil diproses.')
2192
+ })
2193
+
2194
+ bot.launch()
2195
+
2196
+ ```
2197
+
2198
+ #### ◈ 16.6 · Cek Koneksi Bot dengan `connectTelegram`
2199
+
2200
+ Helper bawaan untuk memvalidasi token bot secara cepat tanpa harus memulai polling/webhook penuh — cocok dipakai saat startup aplikasi untuk logging status.
2201
+ ```js
2202
+ import { connectTelegram } from 'deffa-baileys'
2203
+
2204
+ const botInfo = await connectTelegram(process.env.TELEGRAM_BOT_TOKEN)
2205
+ if (botInfo) {
2206
+ console.log(`Terhubung sebagai @${botInfo.username}`)
2207
+ }
2208
+
2209
+ ```
2210
+
2211
+
2212
+ #### ◈ 16.7 · Bot API 9.3–9.4 – sendMessageDraft, Profile Photo Bot, Button Style & Icon
2213
+
2214
+
2215
+ **sendMessageDraft** — Pre-isi input box user dengan draft pesan. User bisa edit dan kirim sendiri.
2216
+
2217
+ ```js
2218
+ bot.on('message', async (ctx) => {
2219
+ await ctx.sendMessageDraft('Halo, nama saya adalah...')
2220
+ })
2221
+
2222
+ // Atau via telegram instance
2223
+ await bot.telegram.sendMessageDraft(chatId, 'Draft pesan ini')
2224
+ ```
2225
+
2226
+ **setMyProfilePhoto / removeMyProfilePhoto** — Bot bisa ganti/hapus foto profilnya sendiri.
2227
+
2228
+ ```js
2229
+ await bot.telegram.setMyProfilePhoto({ source: './avatar.jpg' })
2230
+ await bot.telegram.removeMyProfilePhoto()
2231
+ ```
2232
+
2233
+ **Button Style & Custom Emoji Icon (Bot API 9.4)** — Tombol inline/reply keyboard bisa punya warna (`primary`=biru, `success`=hijau, `danger`=merah) dan emoji icon custom.
2234
+
2235
+ ```js
2236
+ import { DeffaTelegraf, TelegramMarkup as Markup } from 'deffa-baileys'
2237
+
2238
+ // Helper Button dari Markup
2239
+ const Button = Markup.button
2240
+
2241
+ bot.on('message', async (ctx) => {
2242
+ await ctx.reply('Pilih aksi:', Markup.inlineKeyboard([
2243
+ // Tombol biasa dengan style warna
2244
+ [Button.styledCallback('✅ Setuju', 'approve', 'success')],
2245
+ [Button.styledCallback('❌ Tolak', 'reject', 'danger')],
2246
+ [Button.styledCallback('ℹ️ Info', 'info', 'primary')],
2247
+
2248
+ // Tombol dengan custom emoji icon (butuh Telegram Premium owner)
2249
+ [Button.iconCallback('Lihat Detail', 'detail', '5373141891321699086')],
2250
+
2251
+ // Tombol style + icon sekaligus
2252
+ [Button.styledIconCallback('Konfirmasi', 'confirm', 'success', '5368324170671202286')],
2253
+ ]))
2254
+ })
2255
+ ```
2256
+
2257
+
2258
+ #### ◈ 16.8 · Bot API 9.5 – Member Tags, Date-Time Entity
2259
+
2260
+
2261
+ **setChatMemberTag** — Set tag custom untuk member grup (butuh hak `can_manage_tags`).
2262
+
2263
+ ```js
2264
+ // Beri tag ke member
2265
+ bot.command('tag', async (ctx) => {
2266
+ const userId = ctx.message.reply_to_message?.from?.id
2267
+ if (!userId) return ctx.reply('Reply ke pesan seseorang dulu')
2268
+ await ctx.setChatMemberTag(userId, 'VIP')
2269
+ await ctx.reply('Tag VIP berhasil dipasang!')
2270
+ })
2271
+
2272
+ // Hapus tag (kirim string kosong)
2273
+ await ctx.telegram.setChatMemberTag(chatId, userId, '')
2274
+ ```
2275
+
2276
+ **getUserProfileAudios** — Ambil daftar audio profil user.
2277
+
2278
+ ```js
2279
+ const audios = await bot.telegram.getUserProfileAudios(userId, { limit: 5 })
2280
+ ```
2281
+
2282
+
2283
+ #### ◈ 16.9 · Bot API 9.6 – Managed Bots
2284
+
2285
+ Bot kini bisa membuat, mengonfigurasi, dan mengelola bot lain secara programatik tanpa perlu ke @BotFather.
2286
+
2287
+ ```js
2288
+ // Dapatkan token bot yang dikelola
2289
+ const result = await bot.telegram.getManagedBotToken(botUserId)
2290
+
2291
+ // Ganti token bot yang dikelola
2292
+ await bot.telegram.replaceManagedBotToken(botUserId)
2293
+
2294
+ // Simpan prepared keyboard button untuk dipakai di Mini Apps
2295
+ await bot.telegram.savePreparedKeyboardButton(button, userId)
2296
+ ```
2297
+
2298
+
2299
+ #### ◈ 16.10 · Bot API 10.0 – Guest Mode
2300
+
2301
+ Bot bisa menerima pesan dan membalas di chat yang **bukan** anggotanya — tanpa perlu join grup.
2302
+
2303
+ ```js
2304
+ // Tangkap guest message
2305
+ bot.on('guest_message', async (ctx) => {
2306
+ // ctx.guestMessage — update berisi pesan tamu
2307
+ await ctx.answerGuestQuery(
2308
+ { type: 'text', text: 'Halo dari bot! 👋' }
2309
+ )
2310
+ })
2311
+ ```
2312
+
2313
+
2314
+ #### ◈ 16.11 · Bot API 10.0 – Bot-to-Bot Communication
2315
+
2316
+ Bot bisa kirim pesan ke bot lain via @username (keduanya harus opt-in via @BotFather).
2317
+
2318
+ ```js
2319
+ // Aktifkan dulu di @BotFather: Bot-to-Bot Communication Mode
2320
+ await bot.telegram.sendMessage('@other_bot_username', 'Halo bot lain!')
2321
+ ```
2322
+
2323
+
2324
+ #### ◈ 16.12 · Bot API 10.0 – Delete Reactions
2325
+
2326
+ ```js
2327
+ // Hapus satu reaction spesifik pada pesan
2328
+ bot.on('message', async (ctx) => {
2329
+ await ctx.deleteMessageReaction({ type: 'emoji', emoji: '👍' })
2330
+ })
2331
+
2332
+ // Hapus semua reaction sekaligus
2333
+ bot.on('message', async (ctx) => {
2334
+ await ctx.deleteAllMessageReactions()
2335
+ })
2336
+
2337
+ // Atau langsung via telegram instance
2338
+ await bot.telegram.deleteMessageReaction(chatId, messageId, { type: 'emoji', emoji: '🔥' })
2339
+ await bot.telegram.deleteAllMessageReactions(chatId, messageId)
2340
+ ```
2341
+
2342
+
2343
+ #### ◈ 16.13 · Bot API 10.0 – Live Photo
2344
+
2345
+ Bot bisa mengirim foto dengan video pendek (seperti iPhone Live Photos).
2346
+
2347
+ ```js
2348
+ // Kirim live photo
2349
+ bot.on('message', async (ctx) => {
2350
+ await ctx.sendLivePhoto({ source: './photo.heic' }, { caption: 'Live photo!' })
2351
+ })
2352
+
2353
+ // Atau via telegram instance
2354
+ await bot.telegram.sendLivePhoto(chatId, { source: './photo.heic' }, { caption: 'Keren!' })
2355
+ ```
2356
+
2357
+
2358
+ #### ◈ 16.14 · Bot API 10.0 – Managed Bot Access Settings
2359
+
2360
+ ```js
2361
+ // Cek siapa yang bisa kirim pesan ke managed bot
2362
+ const settings = await bot.telegram.getManagedBotAccessSettings(botUserId)
2363
+ console.log(settings)
2364
+
2365
+ // Set whitelist akses
2366
+ await bot.telegram.setManagedBotAccessSettings(botUserId, {
2367
+ is_public: false,
2368
+ allowed_user_ids: [123456, 789012],
2369
+ })
2370
+ ```
2371
+
2372
+
2373
+ #### ◈ 16.15 · Bot API 10.0 – Get User Personal Chat Messages
2374
+
2375
+ ```js
2376
+ // Ambil pesan dari personal chat user (yang di-pin di profil mereka)
2377
+ const messages = await bot.telegram.getUserPersonalChatMessages(userId, {
2378
+ offset: 0,
2379
+ limit: 10,
2380
+ })
2381
+ ```
2382
+
2383
+
2384
+ #### ◈ 16.16 · Bot API 10.1 – Join Request Queries
2385
+
2386
+ Bot bisa merespons join request secara interaktif, termasuk membuka Mini App.
2387
+
2388
+ ```js
2389
+ // Jawab join request query langsung
2390
+ bot.on('chat_join_request', async (ctx) => {
2391
+ await ctx.answerChatJoinRequestQuery({ action: 'approve' })
2392
+ })
2393
+
2394
+ // Buka Web App saat user minta join
2395
+ bot.on('chat_join_request', async (ctx) => {
2396
+ await ctx.sendChatJoinRequestWebApp('https://myapp.example.com/verify')
2397
+ })
2398
+ ```
2399
+
2400
+
2401
+ #### ◈ 16.17 · Bot API 10.1 – Rich Messages
2402
+
2403
+ Fitur paling besar: bot bisa mengirim pesan super terstruktur — heading, tabel, list, blockquote, slideshow, math, dan lain-lain. Cocok untuk bot AI yang perlu format output kaya.
2404
+
2405
+ ```js
2406
+ // Kirim rich message lengkap
2407
+ bot.on('message', async (ctx) => {
2408
+ await ctx.sendRichMessage({
2409
+ blocks: [
2410
+ { type: 'section_heading', text: { type: 'plain', plain_text: '📊 Laporan Harian' } },
2411
+ { type: 'divider' },
2412
+ { type: 'paragraph', text: { type: 'rich_text', elements: [
2413
+ { type: 'bold', elements: [{ type: 'text', text: 'Status: ' }] },
2414
+ { type: 'text', text: 'Semua sistem berjalan normal.' }
2415
+ ]}},
2416
+ { type: 'list', style: 'bullet', items: [
2417
+ { label: { type: 'plain', plain_text: 'Server UP' } },
2418
+ { label: { type: 'plain', plain_text: 'DB OK' } },
2419
+ { label: { type: 'plain', plain_text: 'Cache OK' } },
2420
+ ]}
2421
+ ]
2422
+ })
2423
+ })
2424
+
2425
+ // Streaming AI reply secara real-time (sendRichMessageDraft)
2426
+ bot.on('message', async (ctx) => {
2427
+ let draft = await ctx.sendRichMessageDraft({
2428
+ blocks: [{ type: 'paragraph', text: { type: 'plain', plain_text: 'Memproses...' } }]
2429
+ })
2430
+
2431
+ // Update bertahap saat AI menghasilkan teks
2432
+ for (const chunk of aiStream) {
2433
+ await bot.telegram.sendRichMessageDraft(ctx.chat.id, {
2434
+ message_id: draft.message_id,
2435
+ blocks: [{ type: 'paragraph', text: { type: 'plain', plain_text: chunk } }]
2436
+ })
2437
+ }
2438
+ })
2439
+ ```
2440
+
2441
+ ---
2442
+
2443
+
2444
+ <br>
2445
+
2446
+ <div align="right"><sub>§ SECTION 17</sub></div>
2447
+
2448
+ ## 17 — Discord Bot (DeffaDiscord)
2449
+
2450
+ <hr>
2451
+
2452
+
2453
+ Selain WhatsApp dan Telegram, deffa-baileys kini juga membungkus **Oceanic.js** secara penuh dengan nama `DeffaDiscord`. Artinya Anda bisa membangun bot Discord lengkap — menangani pesan, slash commands, embeds, file upload, hingga sharding — tanpa perlu menginstal package `oceanic.js` terpisah.
2454
+
2455
+
2456
+ #### ◈ 17.1 · Setup Dasar & Login Bot
2457
+
2458
+ ```js
2459
+ import { DeffaDiscord } from 'deffa-baileys'
2460
+
2461
+ const client = new DeffaDiscord({
2462
+ auth: `Bot ${process.env.DISCORD_BOT_TOKEN}`,
2463
+ gateway: {
2464
+ intents: ['GUILDS', 'GUILD_MESSAGES', 'MESSAGE_CONTENT']
2465
+ }
2466
+ })
2467
+
2468
+ client.on('ready', () => {
2469
+ console.log(`Bot Discord siap sebagai ${client.user.tag}`)
2470
+ })
2471
+
2472
+ client.connect()
2473
+ ```
2474
+
2475
+ > [!NOTE]
2476
+ > **Catatan:** `MESSAGE_CONTENT` adalah *privileged intent*. Aktifkan di [Discord Developer Portal](https://discord.com/developers/applications) → Bot → Privileged Gateway Intents.
2477
+
2478
+
2479
+ #### ◈ 17.2 · Menangani Event & Pesan
2480
+
2481
+ ```js
2482
+ import { DeffaDiscord } from 'deffa-baileys'
2483
+
2484
+ const client = new DeffaDiscord({
2485
+ auth: `Bot ${process.env.DISCORD_BOT_TOKEN}`,
2486
+ gateway: {
2487
+ intents: ['GUILDS', 'GUILD_MESSAGES', 'MESSAGE_CONTENT']
2488
+ }
2489
+ })
2490
+
2491
+ client.on('ready', () => {
2492
+ console.log(`Online sebagai ${client.user.tag} (ID: ${client.user.id})`)
2493
+ })
2494
+
2495
+ client.on('messageCreate', async (msg) => {
2496
+ // Abaikan pesan dari bot lain
2497
+ if (msg.author.bot) return
2498
+
2499
+ const text = msg.content.trim()
2500
+
2501
+ if (text === '!ping') {
2502
+ await msg.channel.createMessage({ content: 'Pong! 🏓' })
2503
+ }
2504
+
2505
+ if (text === '!info') {
2506
+ await msg.channel.createMessage({
2507
+ content: `Kamu ada di guild: **${msg.channel.guild.name}**`
2508
+ })
2509
+ }
2510
+
2511
+ if (text.startsWith('!echo ')) {
2512
+ const kata = text.slice(6)
2513
+ await msg.channel.createMessage({ content: kata })
2514
+ }
2515
+ })
2516
+
2517
+ client.on('error', (err) => {
2518
+ console.error('Discord error:', err)
2519
+ })
2520
+
2521
+ client.connect()
2522
+ ```
2523
+
2524
+
2525
+ #### ◈ 17.3 · Slash Commands (Application Commands)
2526
+
2527
+ Oceanic mendukung pendaftaran dan penanganan Application Commands (Slash Commands) secara native.
2528
+ ```js
2529
+ import { DeffaDiscord } from 'deffa-baileys'
2530
+
2531
+ const client = new DeffaDiscord({
2532
+ auth: `Bot ${process.env.DISCORD_BOT_TOKEN}`,
2533
+ gateway: { intents: ['GUILDS'] }
2534
+ })
2535
+
2536
+ client.on('ready', async () => {
2537
+ console.log(`Online sebagai ${client.user.tag}`)
2538
+
2539
+ // Daftarkan slash command secara global
2540
+ await client.application.bulkEditGlobalCommands([
2541
+ { name: 'ping', description: 'Cek latensi bot' },
2542
+ { name: 'info', description: 'Tampilkan info server' },
2543
+ {
2544
+ name: 'say',
2545
+ description: 'Bot mengulang pesan Anda',
2546
+ options: [{
2547
+ type: 3, // STRING
2548
+ name: 'pesan',
2549
+ description: 'Pesan yang akan diulang',
2550
+ required: true
2551
+ }]
2552
+ }
2553
+ ])
2554
+
2555
+ console.log('Slash commands berhasil didaftarkan!')
2556
+ })
2557
+
2558
+ client.on('interactionCreate', async (interaction) => {
2559
+ if (!interaction.isCommandInteraction()) return
2560
+
2561
+ if (interaction.data.name === 'ping') {
2562
+ await interaction.createMessage({
2563
+ content: `🏓 Pong! Latensi: **${client.shards.get(0)?.latency ?? '?'}ms**`
2564
+ })
2565
+ }
2566
+
2567
+ if (interaction.data.name === 'info') {
2568
+ const guild = interaction.guild
2569
+ await interaction.createMessage({
2570
+ content: `📊 Guild: **${guild?.name}** | Member: **${guild?.memberCount}**`
2571
+ })
2572
+ }
2573
+
2574
+ if (interaction.data.name === 'say') {
2575
+ const pesan = interaction.data.options.getString('pesan', true)
2576
+ await interaction.createMessage({ content: pesan })
2577
+ }
2578
+ })
2579
+
2580
+ client.connect()
2581
+ ```
2582
+
2583
+
2584
+ #### ◈ 17.4 · Embed & File Upload
2585
+
2586
+ ```js
2587
+ import { DeffaDiscord } from 'deffa-baileys'
2588
+ import { readFileSync } from 'fs'
2589
+
2590
+ const client = new DeffaDiscord({
2591
+ auth: `Bot ${process.env.DISCORD_BOT_TOKEN}`,
2592
+ gateway: { intents: ['GUILDS', 'GUILD_MESSAGES', 'MESSAGE_CONTENT'] }
2593
+ })
2594
+
2595
+ client.on('messageCreate', async (msg) => {
2596
+ if (msg.author.bot) return
2597
+
2598
+ // Kirim Embed
2599
+ if (msg.content === '!embed') {
2600
+ await msg.channel.createMessage({
2601
+ embeds: [{
2602
+ title: '🚀 Deffa Discord Bot',
2603
+ description: 'Bot Discord bertenaga **deffa-baileys** + Oceanic.js',
2604
+ color: 0x5865F2,
2605
+ fields: [
2606
+ { name: '📦 Library', value: 'deffa-baileys', inline: true },
2607
+ { name: '⚡ Engine', value: 'Oceanic.js', inline: true },
2608
+ { name: '🔖 Node', value: 'v20+', inline: true }
2609
+ ],
2610
+ footer: { text: 'Made with ⚡ by Deffa' },
2611
+ timestamp: new Date().toISOString()
2612
+ }]
2613
+ })
2614
+ }
2615
+
2616
+ // Upload file/gambar
2617
+ if (msg.content === '!upload') {
2618
+ const fileBuffer = readFileSync('./gambar.png')
2619
+ await msg.channel.createMessage({
2620
+ content: 'Ini file dari bot:',
2621
+ files: [{ name: 'gambar.png', contents: fileBuffer }]
2622
+ })
2623
+ }
2624
+
2625
+ // Embed + file sekaligus
2626
+ if (msg.content === '!report') {
2627
+ const reportBuffer = readFileSync('./report.pdf')
2628
+ await msg.channel.createMessage({
2629
+ embeds: [{
2630
+ title: '📄 Laporan Bulanan',
2631
+ description: 'File PDF terlampir di bawah.',
2632
+ color: 0x57F287
2633
+ }],
2634
+ files: [{ name: 'laporan-juni-2026.pdf', contents: reportBuffer }]
2635
+ })
2636
+ }
2637
+ })
2638
+
2639
+ client.connect()
2640
+ ```
2641
+
2642
+
2643
+ #### ◈ 17.5 · Sharding dengan ShardManager
2644
+
2645
+ Untuk bot berskala besar (1000+ guild), gunakan `ShardManager` bawaan Oceanic untuk mendistribusikan koneksi gateway.
2646
+ ```js
2647
+ import { DeffaDiscord } from 'deffa-baileys'
2648
+
2649
+ const client = new DeffaDiscord({
2650
+ auth: `Bot ${process.env.DISCORD_BOT_TOKEN}`,
2651
+ gateway: {
2652
+ intents: ['GUILDS', 'GUILD_MESSAGES', 'MESSAGE_CONTENT'],
2653
+ maxShards: 'auto' // Oceanic auto-hitung jumlah shard optimal
2654
+ }
2655
+ })
2656
+
2657
+ client.on('ready', () => {
2658
+ console.log(`${client.user.tag} online dengan ${client.shards.size} shard`)
2659
+ })
2660
+
2661
+ client.on('shardReady', (shardID) => {
2662
+ console.log(`Shard #${shardID} siap`)
2663
+ })
2664
+
2665
+ client.on('shardDisconnect', (err, shardID) => {
2666
+ console.warn(`Shard #${shardID} disconnect:`, err?.message)
2667
+ })
2668
+
2669
+ client.on('messageCreate', async (msg) => {
2670
+ if (msg.author.bot) return
2671
+ if (msg.content === '!shards') {
2672
+ const info = [...client.shards.values()]
2673
+ .map(s => `Shard #${s.id}: ${s.status} (${s.latency}ms)`)
2674
+ .join('\n')
2675
+ await msg.channel.createMessage({ content: `\`\`\`\n${info}\n\`\`\`` })
2676
+ }
2677
+ })
2678
+
2679
+ client.connect()
2680
+ ```
2681
+
2682
+
2683
+ #### ◈ 17.6 · Cek Koneksi Bot dengan `connectDiscord`
2684
+
2685
+ Helper bawaan untuk memvalidasi token bot Discord secara cepat tanpa harus memulai koneksi gateway penuh — cocok dipakai saat startup aplikasi untuk logging status atau health-check deployment.
2686
+ ```js
2687
+ import { connectDiscord } from 'deffa-baileys'
2688
+
2689
+ const botInfo = await connectDiscord(process.env.DISCORD_BOT_TOKEN)
2690
+ if (botInfo) {
2691
+ console.log(`✔ Discord terhubung sebagai ${botInfo.tag} (ID: ${botInfo.id})`)
2692
+ } else {
2693
+ console.log('✘ Token Discord tidak valid atau koneksi gagal.')
2694
+ }
2695
+ ```
2696
+
2697
+ Anda juga bisa mengecek ketersediaan token di environment sebelum mencoba konek:
2698
+ ```js
2699
+ import { isDiscordAvailable, connectDiscord } from 'deffa-baileys'
2700
+
2701
+ if (isDiscordAvailable()) {
2702
+ const info = await connectDiscord(process.env.DISCORD_BOT_TOKEN)
2703
+ if (info) console.log(`[ ✦ ] DC: ${info.tag} (${info.id})`)
2704
+ } else {
2705
+ console.log('[ ✦ ] DC: DISCORD_BOT_TOKEN belum di-set, skip.')
2706
+ }
2707
+ ```
2708
+
2709
+ ```markdown
2710
+ ### 17.7 [NEW 2026] Granular Access Control (Invite API)
2711
+ Discord API (`POST /channels/{channel.id}/invites`) telah diperluas untuk mendukung *Granular Access Control* level arsitektur. Hal ini menihilkan kebutuhan terhadap event listener `guildMemberAdd` yang memiliki tendensi *delay* latensi saat bot membaca rotasi pengguna yang masuk.
2712
+
2713
+ * **`target_users_file`**: Parameter *array* untuk membatasi eksekusi *link* undangan secara spesifik. *Link* undangan otomatis tertolak apabila *request* masuk berasal dari entitas pengguna yang tidak terdaftar di dalam parameter ini.
2714
+ * **`role_ids`**: Parameter *array* (contoh: `"role_ids": ["ROLE_ID_1"]`) yang memerintahkan *backend* server Discord untuk menyematkan *role* kepada pengguna secara instan tepat pada hitungan milidetik setelah *request* bergabung melalui *link* tersebut divalidasi.
2715
+
2716
+ ### 17.8 [NEW 2026] Modals UI Components (Select Menus, Label, TextDisplay)
2717
+ Interaction Response dengan tipe `9` (Modal Submit) menerima pembaruan form sehingga tidak lagi membatasi *developer* hanya pada input tipe teks (Text Input).
2718
+
2719
+ * **Penerapan Komponen**: Di dalam objek *Action Rows*, kamu dapat merender langsung tipe `3` (*String Select*, *User Select*, *Role Select*, atau *Channel Select*).
2720
+ * **Penerapan Statis**: Untuk teks dengan panduan panjang tanpa harus menggunakan *readonly text field*, komponen `Label` dan `TextDisplay` dapat disematkan di parameter `components` tepat di atas struktur form. Pengumpulan *value* tetap berjalan seperti biasa dan ditangkap melalui *Interaction Create* event.
2721
+
2722
+ ### 17.9 [NEW 2026] Server-Specific Bot Profiles (Per-Guild Profiles)
2723
+ Infrastruktur *Per-Guild Profiles* memungkinkan klien Deffa Discord untuk merender aset visual secara dinamis bergantung pada spesifikasi server tempat *request* dilontarkan. Ini memisahkan identitas bot global dengan identitas lokal.
2724
+
2725
+ * **Integrasi Endpoint**: Melalui *request* ke `PATCH /guilds/{guild.id}/members/@me`.
2726
+ * **Format *Payload***: Konstruksi JSON mengizinkan penyuntikan string *base64 encoded* di atribut `"avatar"`, modifikasi `"nick"` untuk menimpa panggilan lokal, serta metadata bio spesifik untuk profil server lokal. Skema ini mengizinkan token aplikasi bot tunggal mereplikasi ribuan konfigurasi visual independen.
2727
+
2728
+ ### 17.10 [NEW 2026] Threshold Intents (10k Users) & Moderation Metadata
2729
+ Infrastruktur *Privileged Gateway Intents* diatur ulang untuk sinkronisasi metadata secara lintas *platform* (terutama melalui Social SDK 1.8+).
2730
+
2731
+ * **Moderation Metadata**: Deffa Discord kini dapat mengatur transfer struktur *key-value* khusus kepada *server backend* eksternal. Informasi hukuman, limitasi akses, dan metadata pembatasan akun disinkronkan secara *real-time* menghindari latensi eskalasi konflik di Discord.
2732
+ * **Peninjauan Ambang Batas Pengguna**: Kalkulasi kepemilikan *Privileged Intents* (`MESSAGE_CONTENT`, `GUILD_MEMBERS`, dll) tidak lagi dihitung berdasarkan agregasi server. Discord mengunci ambang batas pada jangkauan kumulatif 10.000 pengguna individu. Seluruh *platform* aplikasi diwajibkan untuk memvalidasi alur izin *intent* tersebut secara manual per putaran verifikasi tahunan di dalam dasbor Developer Portal.
2733
+ ```
2734
+ ---
2735
+
2736
+
2737
+ <br>
2738
+
2739
+ <div align="right"><sub>§ SECTION 18</sub></div>
2740
+
2741
+ ## 18 — testMessage : Tes Semua Jenis Pesan
2742
+
2743
+ <hr>
2744
+
2745
+
2746
+ `testMessage` adalah fungsi utilitas eksklusif deffa-baileys untuk **menguji pengiriman semua jenis pesan Baileys** secara cepat — bisa dipakai di grup maupun private chat, tanpa perlu set target/total kirim. Cukup reply atau panggil di handler bot mana pun.
2747
+
2748
+
2749
+ #### ◈ Cara import & penggunaan
2750
+
2751
+
2752
+ ```js
2753
+ import { testMessage } from 'deffa-baileys'
2754
+
2755
+ // Di handler pesan:
2756
+ sock.ev.on('messages.upsert', async ({ messages }) => {
2757
+ for (const msg of messages) {
2758
+ const text = msg.message?.conversation || msg.message?.extendedTextMessage?.text || ''
2759
+ const jid = msg.key.remoteJid
2760
+
2761
+ if (text === '.testmsg' || text === '.test') {
2762
+ // Jalankan test — akan kirim 16 jenis pesan secara berurutan
2763
+ await testMessage(sock, jid)
2764
+ }
2765
+
2766
+ // Dengan quoted (reply ke pesan tertentu, termasuk tes reaction + edit)
2767
+ if (text === '.testquoted') {
2768
+ await testMessage(sock, jid, { quoted: msg })
2769
+ }
2770
+ }
2771
+ })
2772
+ ```
2773
+
2774
+
2775
+ #### ◈ Signature lengkap
2776
+
2777
+
2778
+ ```js
2779
+ /**
2780
+ * @param {WASocket} sock - instance dari makeWASocket()
2781
+ * @param {string} jid - target JID: grup (@g.us) atau private (@s.whatsapp.net)
2782
+ * @param {object} [opts]
2783
+ * @param {object} [opts.quoted] - pesan yang di-quote (untuk tes reaction, edit, dll)
2784
+ * @param {number} [opts.delay] - jeda antar pesan dalam ms (default: 500)
2785
+ */
2786
+ await testMessage(sock, jid, { quoted: msg, delay: 700 })
2787
+ ```
2788
+
2789
+
2790
+ #### ◈ Yang diuji (16 jenis pesan)
2791
+
2792
+
2793
+ | # | Jenis Pesan | Keterangan |
2794
+ |:---:|:---|:---|
2795
+ | `01` | Text biasa | Plain text message |
2796
+ | `02` | Text + Mention | Mention member — group: semua, private: self |
2797
+ | `03` | Image | Gambar dari URL + caption |
2798
+ | `04` | Video | Video dari URL + caption |
2799
+ | `05` | Audio | Audio musik, bukan PTT |
2800
+ | `06` | PTT Voice Note | Voice note dengan codec opus |
2801
+ | `07` | Document | File PDF dengan filename |
2802
+ | `08` | Sticker | Stiker dari URL gambar |
2803
+ | `09` | Location | Koordinat lokasi |
2804
+ | `10` | Contact / vCard | Kartu kontak WA |
2805
+ | `11` | Reaction | Emoji reaction, jika `quoted` disediakan |
2806
+ | `12` | Edit Message | Kirim pesan → tunggu → edit isinya |
2807
+ | `13` | Delete Message | Kirim pesan → tunggu → hapus |
2808
+ | `14` | Forward Simulation | Simulasi forward tanpa pesan asli |
2809
+ | `15` | Buttons (Legacy) | Tombol interaktif legacy |
2810
+ | `16` | List Message | Pesan daftar pilihan (list) |
2811
+
2812
+ > [!NOTE]
2813
+ > Semua tes berjalan **async berurutan** dengan jeda antar pesan. Bekerja di grup maupun private chat tanpa konfigurasi tambahan.
2814
+
2815
+ ---
2816
+
2817
+
2818
+ <br>
2819
+
2820
+ <div align="right"><sub>§ SECTION 19</sub></div>
2821
+
2822
+ ## 19 — sessionGuard : Proteksi Session dari Pencurian
2823
+
2824
+ <hr>
2825
+
2826
+
2827
+ `sessionGuard` adalah fitur keamanan opsional yang **mengunci session WhatsApp ke IP server pertama kali bot dijalankan**. Jika session dicuri dan dicoba dijalankan di server lain, bot akan otomatis diblokir dan dihentikan paksa.
2828
+
2829
+ > [!NOTE]
2830
+ > **Tidak dipanggil = tidak ada proteksi** (default behaviour tetap normal)
2831
+
2832
+
2833
+ #### ◈ Cara Import
2834
+
2835
+
2836
+ ```js
2837
+ import { sessionGuard, isGuardActive, resetGuard } from 'deffa-baileys'
2838
+ ```
2839
+
2840
+
2841
+ #### ◈ Penggunaan Dasar
2842
+
2843
+
2844
+ Panggil `sessionGuard()` **sebelum** `makeWASocket`:
2845
+
2846
+ ```js
2847
+ import { makeWASocket, useMultiFileAuthState } from 'deffa-baileys'
2848
+ import { sessionGuard } from 'deffa-baileys'
2849
+
2850
+ const { state, saveCreds } = await useMultiFileAuthState('./auth_state')
2851
+
2852
+ // Aktifkan guard — wajib dipanggil sebelum makeWASocket
2853
+ await sessionGuard()
2854
+
2855
+ const sock = makeWASocket({ auth: state })
2856
+ sock.ev.on('creds.update', saveCreds)
2857
+ ```
2858
+
2859
+
2860
+ #### ◈ Opsi Lengkap
2861
+
2862
+
2863
+ ```js
2864
+ await sessionGuard({
2865
+ sessionFile: './auth_state/creds.json', // path ke file session (default: './auth_state.json')
2866
+ silent: false, // true = sembunyikan log guard (default: false)
2867
+ onBlock: async ({ currentIP, guardPath }) => {
2868
+ // Callback dipanggil saat session diblokir karena IP beda
2869
+ console.log('Session diblokir! IP saat ini:', currentIP)
2870
+ // Bisa kirim notif ke owner di sini
2871
+ }
2872
+ })
2873
+ ```
2874
+
2875
+ | Opsi | Type | Default | Keterangan |
2876
+ |:---|:---:|:---|:---|
2877
+ | `sessionFile` | `string` | `'./auth_state.json'` | Path ke file session WA |
2878
+ | `silent` | `boolean` | `false` | Sembunyikan log info guard |
2879
+ | `onBlock` | `function` | `null` | Callback dipanggil sebelum `process.exit(1)` saat IP mismatch |
2880
+
2881
+
2882
+ #### ◈ Cara Kerja
2883
+
2884
+
2885
+ 1. **Pertama kali dijalankan** → Guard ambil IP publik server, hash dengan SHA-256, simpan ke file `.deffa_guard` di folder yang sama dengan session.
2886
+ 2. **Jalankan berikutnya** → Guard bandingkan IP server sekarang dengan hash yang tersimpan.
2887
+ 3. **IP cocok** → Bot lanjut normal ✅
2888
+ 4. **IP beda** → Bot cetak pesan error dan `process.exit(1)` ❌
2889
+
2890
+ > [!NOTE]
2891
+ > IP disimpan dalam bentuk **hash SHA-256**, bukan plaintext — aman meski file `.deffa_guard` bocor.
2892
+
2893
+
2894
+ #### ◈ Cek Status Guard
2895
+
2896
+
2897
+ ```js
2898
+ import { isGuardActive } from 'deffa-baileys'
2899
+
2900
+ if (isGuardActive()) {
2901
+ console.log('Session guard aktif')
2902
+ }
2903
+ ```
2904
+
2905
+
2906
+ #### ◈ Reset Guard (Pindah Server)
2907
+
2908
+
2909
+ Jika lo pindah server secara sah, hapus guard lama dulu sebelum jalankan bot:
2910
+
2911
+ ```js
2912
+ import { resetGuard } from 'deffa-baileys'
2913
+
2914
+ await resetGuard('./auth_state/creds.json')
2915
+ // Output: [ ✦ ] DEFFA GUARD: Guard direset, silakan jalankan ulang bot.
2916
+ ```
2917
+
2918
+ Atau hapus manual file `.deffa_guard` dari folder session lo, lalu jalankan bot kembali.
2919
+
2920
+
2921
+ #### ◈ Contoh Output Log
2922
+
2923
+
2924
+ **Pertama kali (registrasi):**
2925
+ ```
2926
+ [ ✦ ] DEFFA GUARD: Mengaktifkan proteksi session...
2927
+ [ ✦ ] DEFFA GUARD: IP Server: 103.xx.xx.xx
2928
+ [ ✦ ] DEFFA GUARD: Session terdaftar di server ini ✓
2929
+ ```
2930
+
2931
+ **Jalankan normal (IP cocok):**
2932
+ ```
2933
+ [ ✦ ] DEFFA GUARD: Mengaktifkan proteksi session...
2934
+ [ ✦ ] DEFFA GUARD: IP Server: 103.xx.xx.xx
2935
+ [ ✦ ] DEFFA GUARD: IP cocok, session aman ✓
2936
+ ```
2937
+
2938
+ **Session dicuri (IP beda):**
2939
+ ```
2940
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2941
+ ┃ [ ! ] DEFFA GUARD — SESSION BLOCK
2942
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
2943
+ Session ini tidak bisa digunakan
2944
+ di server ini karena IP berbeda.
2945
+
2946
+ Session hanya bisa berjalan di
2947
+ server tempat session dibuat.
2948
+
2949
+ Jika ini server kamu sendiri,
2950
+ hapus file: .deffa_guard
2951
+ lalu jalankan ulang bot.
2952
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2953
+ ```
2954
+
2955
+ > [!NOTE]
2956
+ > **Catatan:** Fitur ini tidak 100% foolproof jika server menggunakan IP dinamis (berubah setiap restart). Untuk VPS dengan IP statis, perlindungan ini sangat efektif.
2957
+
2958
+ ---
2959
+
2960
+ <br>
2961
+
2962
+ <img src="https://capsule-render.vercel.app/api?type=waving&color=0:0a0a12,50:2b1a2e,100:0a0a12&height=130&section=footer" width="100%"/>
2963
+
2964
+ <div align="center">
2965
+
2966
+ <hr>
2967
+
2968
+ ### ✦ Credits &amp; License
2969
+
2970
+ </div>
2971
+
2972
+ Deffa Baileys dibangun di atas pondasi [Baileys](https://github.com/WhiskeySockets/Baileys) oleh Rajeh Taher/WhiskeySockets, dan diperluas oleh **Deffa** dengan integrasi Telegram Bot, plugin Brat/Bratvid bawaan, dukungan protokol WhatsApp 2026, serta berbagai peningkatan stabilitas.
2973
+
2974
+ <table width="100%">
2975
+ <tr>
2976
+ <td align="center" width="50%">
2977
+
2978
+ **Lisensi**
2979
+
2980
+ Dirilis di bawah lisensi `MIT`
2981
+ Bebas dipakai, dimodifikasi, didistribusikan ulang
2982
+
2983
+ </td>
2984
+ <td align="center" width="50%">
2985
+
2986
+ **Copyright**
2987
+
2988
+ © 2025 Rajeh Taher / WhiskeySockets
2989
+ © 2026 **Deffa**
2990
+
2991
+ </td>
2992
+ </tr>
2993
+ </table>
2994
+
2995
+ <br>
2996
+
2997
+ <div align="center">
2998
+
2999
+ <sub>✦ &nbsp;Dibuat dengan presisi oleh **Deffa** &nbsp;✦</sub>
3000
+
3001
+ <br><br>
3002
+
3003
+ <a href="#deffa-baileys"><img src="https://img.shields.io/badge/↑_KEMBALI_KE_ATAS-0a0a12?style=for-the-badge&labelColor=0a0a12&color=e8b76a" /></a>
3004
+
3005
+ </div>