wa_strapi
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 rivejä
8.0 KiB

  1. const qrcode = require("qrcode-terminal");
  2. const fs = require("fs");
  3. const refreshMessage = require("../util/refreshMessage");
  4. // const path = require("path");
  5. const { Client, Chat, Message } = require("whatsapp-web.js");
  6. // const SESSION_FOLDER = path.join(__dirname, "../data/");
  7. // const SESSION_FILE_PATH = path.join(__dirname, "../data/session.json");
  8. // const sessions = require("../api/session_data");
  9. const { parseMultipartData, sanitizeEntity } = require("strapi-utils");
  10. var client;
  11. //Login Session when there is Session File
  12. function callbacks(client, callback, type = "create") {
  13. // console.log("starting", type);
  14. let sessionData;
  15. client.on("auth_failure", (session) => {
  16. // console.log("auth_failure");
  17. return callback({
  18. STATUS: 0,
  19. TYPE: "AUTH_FAILURE",
  20. DATA: "SESSION HAS BEEN ENDED , PLEASE CREATE A NEW ONE !",
  21. });
  22. });
  23. client.on("disconnected", async function (session) {
  24. console.log("disconnected from ", type, session);
  25. if (session == "UNPAIRED" || session == "CONFLICT") {
  26. try {
  27. if (type == "load" && client && client.info) {
  28. // console.log(getID);
  29. getID = await strapi
  30. .query("session-data")
  31. .findOne({ phonenumber: client.info.wid.user });
  32. // console.log(getID);
  33. if (getID) {
  34. let id = getID["id"];
  35. await strapi.api["session-data"].services[
  36. "session-data"
  37. ].delete({ id });
  38. }
  39. await client.destroy();
  40. }
  41. } catch (e) {}
  42. }
  43. });
  44. client.on("ready", async () => {
  45. // console.log("ready");
  46. var clientInfo = client.info;
  47. clientInfo["sessionData"] = sessionData;
  48. if (type == "create") await client.destroy();
  49. return callback({
  50. STATUS: 1,
  51. TYPE: "READY",
  52. DATA: type == "create" ? clientInfo : client,
  53. });
  54. });
  55. client.on("message", async (msg) => {
  56. var phoneNumber = msg.from;
  57. // console.log(phoneNumber);
  58. var chat = await strapi.api["chats"].services["chats"].findOne({
  59. phoneNumber: phoneNumber.split("@")[0],
  60. });
  61. await refreshMessage(msg, chat);
  62. });
  63. // client.on("message_create", async (msg) => {
  64. // });
  65. client.on("qr", (qr) => {
  66. return callback({ STATUS: 1, TYPE: "QR_AUTH", DATA: qr });
  67. });
  68. client.on("change_state", (state) => {
  69. // console.log(`state => ${state}`);
  70. });
  71. client.on("authenticated", (session) => {
  72. console.log("authenticated");
  73. try {
  74. sessionData = session;
  75. // fs.writeFileSync(SESSION_FILE_PATH, JSON.stringify(session));
  76. } catch (e) {
  77. return callback({
  78. STATUS: 0,
  79. TYPE: "AUTHENTICATED_ERROR",
  80. DATA: e.message,
  81. });
  82. }
  83. });
  84. }
  85. var loadClient = async function (clientSessionData, callback) {
  86. try {
  87. // if(!client){
  88. // console.log(client.info);
  89. // return callback({"STATUS" : 1 , "TYPE" : "READY" , "DATA" : client.info})
  90. // }
  91. // let sessionPath = path.join(SESSION_FOLDER, `${phoneNumber}.json`);
  92. // if (fs.existsSync(sessionPath)) {
  93. // sessionData = require(sessionPath);
  94. client = new Client({
  95. puppeteer: {
  96. args: ["--no-sandbox", "--disable-setuid-sandbox"],
  97. },
  98. session: clientSessionData,
  99. restartOnAuthFail: true,
  100. });
  101. callbacks(client, callback, "load");
  102. // console.log("initialize");
  103. client.initialize();
  104. } catch (e) {
  105. // console.log(e);
  106. return callback({
  107. STATUS: 0,
  108. TYPE: "ERROR",
  109. DATA: e.message,
  110. });
  111. }
  112. };
  113. function asyncLoadClient(i) {
  114. return new Promise((resolve, reject) => {
  115. try {
  116. loadClient(i["session_data"], async (data) => {
  117. return resolve(data);
  118. });
  119. } catch (e) {
  120. return reject(e.message);
  121. }
  122. });
  123. }
  124. var createNewClient = async function (callback) {
  125. try {
  126. client = new Client({
  127. puppeteer: {
  128. args: ["--no-sandbox", "--disable-setuid-sandbox"],
  129. },
  130. });
  131. callbacks(client, callback);
  132. console.log("initialize");
  133. client.initialize();
  134. //var clientInfo = await getClientInfo();
  135. //return clientInfo;
  136. } catch (e) {
  137. return callback({ STATUS: 0, TYPE: "READY", DATA: e.message });
  138. }
  139. };
  140. var sendMessage = async function (client, phone_number, textMessage) {
  141. try {
  142. if (!client.info) {
  143. throw { message: "Client Is Not Ready !" };
  144. }
  145. // var phoneNumber = reformatMobilePhone(phone_number);
  146. // var state = await client.isRegisteredUser(phoneNumber);
  147. // console.log(state);
  148. var sending = await client.sendMessage(phone_number, textMessage);
  149. return { STATUS: 1, DATA: sending };
  150. } catch (e) {
  151. console.log(e);
  152. return { STATUS: 0, DATA: e.message };
  153. }
  154. };
  155. var getMessagebyId = async function (client, chatId, param = {}) {
  156. try {
  157. if (!client.info) {
  158. throw { message: "Client Is Not Ready !" };
  159. }
  160. var chat = await client.getChatById(chatId._serialized);
  161. var messageList = await chat.fetchMessages(param);
  162. // console.log(messageList);
  163. return { STATUS: 1, DATA: messageList };
  164. } catch (e) {
  165. // console.log(e);
  166. return { STATUS: 0, DATA: e.message };
  167. }
  168. };
  169. var getAllChats = async function (client) {
  170. try {
  171. if (!client || !client.info) {
  172. throw { message: "Client Is Not Ready !" };
  173. }
  174. let chatList = await client.getChats();
  175. return { STATUS: 1, DATA: chatList };
  176. } catch (e) {
  177. return { STATUS: 0, DATA: e.message };
  178. }
  179. };
  180. var getClientInfo = function () {
  181. try {
  182. var a;
  183. while (!a) {
  184. a = client.info;
  185. }
  186. return { STATUS: 1, DATA: a };
  187. } catch (e) {
  188. return { STATUS: 0, DATA: e.message };
  189. }
  190. };
  191. var getClientState = async function () {
  192. try {
  193. if (!client.info) {
  194. throw { message: "Client Is Not Ready !" };
  195. }
  196. let state = await client.getState();
  197. return { STATUS: 1, DATA: state };
  198. } catch (e) {
  199. return { STATUS: 0, DATA: e.message };
  200. }
  201. };
  202. var destroySession = async function (phoneNumber) {
  203. try {
  204. if (client && client.info) {
  205. await client.logout();
  206. await client.destroy();
  207. clearFileSession(phoneNumber);
  208. return { STATUS: 1, DATA: "Session cleared" };
  209. } else throw { message: "Client Is Not Ready !" };
  210. } catch (e) {
  211. return { STATUS: 0, DATA: e.message };
  212. }
  213. };
  214. function reformatMobilePhone(phoneNumber) {
  215. var newPhoneNumber;
  216. if (phoneNumber[0].toString() == "0") {
  217. newPhoneNumber = "62" + phoneNumber.substring(1) + "@c.us";
  218. } else if (phoneNumber[0] == "+") {
  219. newPhoneNumber = phoneNumber.substring(1) + "@c.us";
  220. } else {
  221. newPhoneNumber = phoneNumber + "@c.us";
  222. }
  223. return newPhoneNumber;
  224. }
  225. function clearFileSession(phoneNumber) {
  226. try {
  227. let sessionPath = path.join(SESSION_FOLDER, `${phoneNumber}.json`);
  228. if (fs.existsSync(sessionPath)) {
  229. console.log(`clearing session ${phoneNumber}`);
  230. fs.unlinkSync(sessionPath);
  231. }
  232. } catch (e) {
  233. throw e;
  234. }
  235. }
  236. module.exports = {
  237. sendMessage: sendMessage,
  238. createNewClient: createNewClient,
  239. loadClient: loadClient,
  240. getClientInfo: getClientInfo,
  241. destroySession: destroySession,
  242. getClientState: getClientState,
  243. getClientState: getClientState,
  244. getMessagebyId: getMessagebyId,
  245. getAllChats: getAllChats,
  246. asyncLoadClient: asyncLoadClient,
  247. };