/** * Send message to WhatsApp, then add statuses to DB * * @param Message $message */ public function sendMessage(Message $message, Sender $sender) { $messageDAO = new MessageDAO(); if ('' == $sender->getPassword()) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, 'Sender not registered - go sender and use confirm SMS function'); return; } $statuses = $messageDAO->getStatuses($message); $sentOk = array(); foreach ($statuses as $status) { if (empty($status['target'])) { continue; } switch ($status['status']) { case Message::MESSAGE_STATUS_SENT: case Message::MESSAGE_STATUS_RECEIVED_BY_SERVER: case Message::MESSAGE_STATUS_RECEIVED_BY_PHONE: $sentOk[$status['target']] = 1; $messageDAO->setMessageTargetStatus($message, $status['target'], $status['status']); break; } } echo "Already sent to: " . implode(",", array_keys($sentOk)) . "\n"; $groupDao = new GroupDAO(); $syncedNumbers = $groupDao->getNumbers($message->getGroupId(), true); try { $w = $this->getWhatsProt($sender); if (empty($w)) { return; } $targets = explode(',', $message->getTarget()); $targets = array_combine($targets, $targets); $statuses = $messageDAO->getStatuses($message); foreach ($statuses as $status) { if ($status['status'] == Message::MESSAGE_STATUS_RECEIVED_BY_SERVER) { unset($targets[$status['target']]); } } $filteredTargets = array(); $notSynced = array(); $allTargets = array(); foreach ($targets as $target) { if ($target == $sender->getUsername()) { continue; } if (empty($syncedNumbers[$target])) { $notSynced[$target] = $target; continue; } if (!empty($sentOk[$target])) { continue; } $allTargets[] = $target; if (count($filteredTargets) <= 48) { $filteredTargets[] = $target; } } echo "Filtered: " . implode(",", $filteredTargets) . "\n"; echo "Not synced: " . implode(",", array_keys($notSynced)) . "\n"; if (empty($filteredTargets)) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, "No synced numbers. Sync Group."); } $targets = $filteredTargets; foreach ($allTargets as $target) { $messageDAO->setMessageTargetStatus($message, $target, 0); } $customFields = $messageDAO->getCustomFields($message); $this->currentMessage = $message; $this->currentTargets = $targets; switch ($message->getKind()) { case Message::KIND_TEXT_MSG: $data = $message->getData(); if (false && strpos($data, '$field') === false) { $w->cleanDebug(); $this->lastSentMessageId = 0; sleep(strlen($data) / 4); $w->sendBroadcastMessage($targets, $data); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); break; } } else { foreach ($filteredTargets as $target) { $sendRetVal = null; $data = $message->getData(); if (!empty($customFields[$target])) { for ($i = 1; $i < 6; $i++) { $data = str_replace('$field' . $i, $customFields[$target]['field' . $i], $data); } } $w->cleanDebug(); $this->lastSentMessageId = 0; $w->sendMessageComposing($target); sleep(strlen($data) / 4); $w->sendMessage($target, $data); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); continue; } } } break; case Message::KIND_PHOTO_MSG: if (false) { $w->cleanDebug(); $this->lastSentMessageId = 0; sleep(8); $w->sendBroadcastImage($targets, WEBDIR . '/uploads/' . $message->getData(), false); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); break; } } else { foreach ($filteredTargets as $target) { $sendRetVal = null; $w->cleanDebug(); $this->lastSentMessageId = 0; sleep(4); $w->sendMessageImage($target, WEBDIR . '/uploads/' . $message->getData(), false); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); continue; } } } break; case Message::KIND_AUDIO_MSG: if (false) { $w->cleanDebug(); $this->lastSentMessageId = 0; sleep(8); $w->sendBroadcastAudio($targets, WEBDIR . '/uploads/' . $message->getData(), false); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); break; } } else { foreach ($filteredTargets as $target) { $sendRetVal = null; $w->cleanDebug(); $this->lastSentMessageId = 0; sleep(4); $w->sendMessageAudio($target, WEBDIR . '/uploads/' . $message->getData(), false); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); continue; } } } break; case Message::KIND_VIDEO_MSG: if (false) { $w->cleanDebug(); $this->lastSentMessageId = 0; sleep(8); $w->sendBroadcastVideo($targets, WEBDIR . '/uploads/' . $message->getData(), false); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); break; } } else { foreach ($filteredTargets as $target) { $sendRetVal = null; $w->cleanDebug(); $this->lastSentMessageId = 0; sleep(4); $w->sendMessageVideo($target, WEBDIR . '/uploads/' . $message->getData(), false); $whatsapp_id = $this->lastSentMessageId; $debugMsgReceiver = $w->getDebugBuf(); $this->printDebug($w->getDebugBuf()); if (!$whatsapp_id) { $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $debugMsgReceiver); continue; } } } break; } $messageDAO->setMessageTargetStatus($message, $status['target'], Message::MESSAGE_STATUS_SENT); } catch (\Exception $ex) { $this->printDebug($w->getDebugBuf()); $messageDAO->addStatus($message, Message::MESSAGE_STATUS_ERROR, $ex->getMessage()); } $this->currentTargets = null; $this->currentMessage = null; }
/** * Saves sender to DB * * @param Sender $item * @throws \Exception * @return Sender */ public function save(Sender $item) { if (empty($item)) { throw new \Exception('Empty item'); } if (!$item->getIdentity()) { $item->setIdentity(''); } if (!$item->getPassword()) { $item->setPassword(''); } $db = DBConnection::getInstance(); if ($item->getId() == 0) { $query = $db->prepare("INSERT INTO senders\n\t\t\t\t\t(username, identity, nickname, password, user_id, challenge_data, flags)\n\t\t\t\t\tVALUES \n\t\t\t\t\t(:username, :identity, :nickname, :password, :user_id, :challenge_data, :flags)"); $query->bindParam('username', $item->getUsername()); $query->bindParam('nickname', $item->getNickname()); $query->bindParam('identity', $item->getIdentity()); $query->bindParam('password', $item->getPassword()); $query->bindParam('user_id', $item->getUserId()); $query->bindParam('challenge_data', $item->getChallengeData()); $query->bindParam('flags', $item->getFlags()); $query->execute(); $item->setId($db->lastInsertId()); } else { $sql = ' UPDATE senders SET '; if ($item->getIdentity() !== null) { $sql .= ' identity = :identity, '; } if ($item->getPassword() !== null) { $sql .= ' password = :password, '; } $sql .= ' nickname = :nickname, '; $sql .= ' username = :username, '; $sql .= ' challenge_data = :challenge_data, '; $sql .= ' flags = :flags, '; $sql .= ' user_id = :user_id '; $sql .= ' WHERE id = :id '; $query = $db->prepare($sql); $query->bindParam('id', $item->getId(), \PDO::PARAM_INT); $query->bindParam('username', $item->getUsername()); $query->bindParam('identity', $item->getIdentity()); $query->bindParam('nickname', $item->getNickname()); $query->bindParam('password', $item->getPassword()); $query->bindParam('user_id', $item->getUserId()); $query->bindParam('challenge_data', $item->getChallengeData()); $query->bindParam('flags', $item->getFlags()); $query->execute(); } return $item; }