Source of file api.senddog.php
Size: 16,285 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.senddog.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499 | <?php /** * SMS/Telegram/Email messages sending implementation */ class SendDog { /** * Contains system alter config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains senddog config * * @var array */ protected $settings = array(); /** * System message helper object placeholder * * @var object */ protected $messages = ''; /** * System SMS queue object placeholder * * @var object */ protected $smsQueue = ''; /** * Placeholder for UbillingConfig object * * @var null */ protected $ubConfig = null; /** * Contains array of SMS services that will be loaded as serviceId=>serviceParams * * @var array */ protected $servicesEnabled = array(); /** * Active services objects array * * @var array */ protected $activeServices = array(); /** * contains default interface module URL */ const URL_ME = '?module=senddog'; /** * Path to running dog flag */ const PID_PATH = 'exports/senddogrunning.pid'; /** * Classic-SendDog SMS services libs path */ const SERVICES_LIB_PATH = 'api/vendor/senddog_classic_services/'; public function __construct() { global $ubillingConfig; $this->ubConfig = $ubillingConfig; $this->loadAltCfg(); $this->setOptions(); $this->loadBaseConfig(); $this->preloadSmsServicesLibs(); $this->initSmsQueue(); $this->initMessages(); $this->loadServicesConfigs(); $this->loadTelegramConfig(); } /** * Loads system alter config into protected property for further usage * * @return void */ protected function loadAltCfg() { $this->altCfg = $this->ubConfig->getAlter(); } /** * Loads required options and * * @return void */ protected function setOptions() { $servicesConfigPath = CONFIG_PATH . 'senddog.d/'; $allServicesConf = rcms_scandir($servicesConfigPath, '*.ini'); if (!empty($allServicesConf)) { foreach ($allServicesConf as $io => $eachConfig) { $serviceConfig = rcms_parse_ini_file($servicesConfigPath . $eachConfig, true); if (!empty($serviceConfig)) { $this->servicesEnabled += $serviceConfig; } } } if (isset($this->altCfg['SENDDOG_SMS_SERVICES_ENABLED'])) { if (!empty($this->altCfg['SENDDOG_SMS_SERVICES_ENABLED'])) { $servicesEnabledOnly = explode(',', $this->altCfg['SENDDOG_SMS_SERVICES_ENABLED']); if (!empty($servicesEnabledOnly)) { $servicesEnabledOnly = array_flip($servicesEnabledOnly); foreach ($this->servicesEnabled as $serviceId => $serviceParams) { if (!isset($servicesEnabledOnly[$serviceId])) { unset($this->servicesEnabled[$serviceId]); } } } } } } /** * Preloads all enabled SMS services libs and creates separate instances of each * * @return void */ protected function preloadSmsServicesLibs() { if (!empty($this->servicesEnabled)) { foreach ($this->servicesEnabled as $serviceId => $serviceParams) { require_once (self::SERVICES_LIB_PATH . $serviceId . '.php'); $serviceClassName = $serviceId; $this->activeServices[$serviceId] = new $serviceClassName($this->settings); } } } /** * Loads enabled SMS services data * * @return void */ protected function loadServicesConfigs() { if (!empty($this->servicesEnabled)) { foreach ($this->servicesEnabled as $serviceId => $serviceParams) { if (isset($serviceParams['CONFIG'])) { if (!empty($serviceParams['CONFIG'])) { $loadConfigMethodName = $serviceParams['CONFIG']; $this->activeServices[$serviceId]->$loadConfigMethodName(); } } } } } /** * Inits system SMS queue object * * @return void */ protected function initSmsQueue() { $this->smsQueue = new UbillingSMS(); } /** * Inits message helper object for further usage * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Loads basic send dog settings * * @return void */ protected function loadBaseConfig() { $defaultSMSservice = zb_StorageGet('SENDDOG_SMS_SERVICE'); if (empty($defaultSMSservice)) { $defaultSMSservice = 'tsms'; zb_StorageSet('SENDDOG_SMS_SERVICE', $defaultSMSservice); } $this->settings['SMS_SERVICE'] = $defaultSMSservice; } /** * Returns base module URL * * @return string */ public function getBaseUrl() { return (self::URL_ME); } /** * Dirty input data filtering * * @param $string - string to filter * * @return string */ protected function safeEscapeString($string) { @$result = preg_replace("#[~@\?\%\/\;=\*\>\<\"\']#Uis", '', $string); return ($result); } /** * Loads telegram config * * @return void */ protected function loadTelegramConfig() { $telegramBotToken = zb_StorageGet('SENDDOG_TELEGRAM_BOTTOKEN'); if (empty($telegramBotToken)) { $telegramBotToken = 'input_token_here'; zb_StorageSet('SENDDOG_TELEGRAM_BOTTOKEN', $telegramBotToken); } $this->settings['TELEGRAM_BOTTOKEN'] = $telegramBotToken; } /** * Renders current telegram bot contacts * * @return string */ public function renderTelegramContacts() { $result = ''; $allEmployeeChatIds = array(); $telegram = new UbillingTelegram(); $telegram->setToken($this->settings['TELEGRAM_BOTTOKEN']); $rawContacts = $telegram->getBotContacts(); $allEmployeeData = ts_GetAllEmployeeData(); if (!empty($allEmployeeData)) { foreach ($allEmployeeData as $io => $each) { if (!empty($each['telegram'])) { if (!empty($each['admlogin'])) { $empNameLabel = $each['name'] . ' (' . $each['admlogin'] . ')'; } else { $empNameLabel = $each['name']; } $allEmployeeChatIds[$each['telegram']] = $empNameLabel; } } } $result .= wf_BackLink(self::URL_ME, '', true); if (!empty($rawContacts)) { $cells = wf_TableCell(''); $cells .= wf_TableCell(__('Chat ID')); $cells .= wf_TableCell(__('Type')); $cells .= wf_TableCell(__('Worker')); $cells .= wf_TableCell(__('Username')); $cells .= wf_TableCell(__('Name')); $cells .= wf_TableCell(__('Message')); $rows = wf_TableRow($cells, 'row1'); foreach ($rawContacts as $io => $each) { $cells = wf_TableCell($this->newContact($each['lastmessage'])); $cells .= wf_TableCell($each['chatid']); $chatType=__($each['type']); $cells .= wf_TableCell($chatType); $employeeName = (isset($allEmployeeChatIds[$each['chatid']])) ? $allEmployeeChatIds[$each['chatid']] : ''; $cells .= wf_TableCell($employeeName); $userNameLabel = (!empty($each['name'])) ? wf_Link('https://t.me/'.$each['name'], $each['name']) : ''; $cells .= wf_TableCell($userNameLabel); $cells .= wf_TableCell($each['first_name'] . ' ' . $each['last_name']); $cells .= wf_TableCell($each['lastmessage']); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result .= $this->messages->getStyledMessage(__('Nothing found'), 'warning'); } return ($result); } /** * Returns new contact marker * * @param string $message * * @return string */ protected function newContact($message) { $result = ''; $markers = array('go', 'start', 'хуй' , 'huy'); //default new contact markers array if (!empty($markers)) { foreach ($markers as $io => $eachMarker) { if (ispos($message, $eachMarker)) { $result = wf_img_sized('skins/icon_telegram_small.png', '', '10'); } } } return($result); } /** * Returns set of inputs, required for SMS-Fly service configuration * * @return string */ protected function renderTelegramConfigInputs() { $inputs = wf_tag('h2') . __('Telegram') . ' ' . wf_Link(self::URL_ME . '&showmisc=telegramcontacts', wf_img_sized('skins/icon_search_small.gif', __('Telegram bot contacts'), '10', '10'), true) . wf_tag('h2', true); $inputs .= wf_TextInput('edittelegrambottoken', __('Telegram bot token'), $this->settings['TELEGRAM_BOTTOKEN'], true, 55); return ($inputs); } /** * Renders SendDog config interface * * @return string */ public function renderConfigForm() { $result = ''; $inputs = ''; if (!empty($this->servicesEnabled)) { foreach ($this->servicesEnabled as $serviceId => $serviceParams) { if (isset($serviceParams['INTERFACE'])) { if (!empty($serviceParams['INTERFACE'])) { $configInterfaceMethodName = $serviceParams['INTERFACE']; $inputs .= $this->activeServices[$serviceId]->$configInterfaceMethodName(); } } } } $inputs .= $this->renderTelegramConfigInputs(); $inputs .= wf_Submit(__('Save')); $result .= wf_Form('', 'POST', $inputs, 'glamour'); return ($result); } /** * Saves config in database * * @return void */ public function saveConfig() { if (!empty($this->servicesEnabled)) { foreach ($this->servicesEnabled as $serviceId => $serviceParams) { if (isset($serviceParams['SAVE'])) { if (!empty($serviceParams['SAVE'])) { $saveSettingsMethodName = $serviceParams['SAVE']; $this->activeServices[$serviceId]->$saveSettingsMethodName(); } } } } //telegram bot token configuration if (ubRouting::post('edittelegrambottoken') != $this->settings['TELEGRAM_BOTTOKEN']) { zb_StorageSet('SENDDOG_TELEGRAM_BOTTOKEN', ubRouting::post('edittelegrambottoken')); log_register('SENDDOG CONFIG SET TELEGRAMBOTTOKEN'); } //default sms service if (ubRouting::post('defaultsmsservice') != $this->settings['SMS_SERVICE']) { zb_StorageSet('SENDDOG_SMS_SERVICE', ubRouting::post('defaultsmsservice')); log_register('SENDDOG CONFIG SET SMSSERVICE `' . ubRouting::post('defaultsmsservice') . '`'); } } /** * Loads and sends all email messages from system queue * * @return int */ public function emailProcessing() { $email = new UbillingMail(); $messagesCount = $email->getQueueCount(); if ($messagesCount > 0) { $allMessagesData = $email->getQueueData(); if (!empty($allMessagesData)) { foreach ($allMessagesData as $io => $eachmessage) { $email->directPushEmail($eachmessage['email'], $eachmessage['subj'], $eachmessage['message']); $email->deleteEmail($eachmessage['filename']); } } } return ($messagesCount); } /** * Loads and sends all stored SMS from system queue * * @return int */ public function smsProcessing() { $smsCount = $this->smsQueue->getQueueCount(); if ($smsCount > 0) { $smsServiceId = $this->settings['SMS_SERVICE']; if (isset($this->servicesEnabled[$smsServiceId])) { $messagePushMethodName = $this->servicesEnabled[$smsServiceId]['PUSH']; $this->activeServices[$smsServiceId]->$messagePushMethodName(); } } return ($smsCount); } /** * Goes through sms_history table and checks statuses for messages * * @return void */ public function smsHistoryProcessing() { $defaultServiceId = $this->settings['SMS_SERVICE']; if (isset($this->servicesEnabled[$defaultServiceId])) { if (isset($this->servicesEnabled[$defaultServiceId]['HISTORY'])) { if (!empty($this->servicesEnabled[$defaultServiceId]['HISTORY'])) { $historyMethodName = $this->servicesEnabled[$defaultServiceId]['HISTORY']; $this->activeServices[$defaultServiceId]->$historyMethodName(); } } } } /** * Loads and sends all stored Telegram messages from system queue * * @return int */ public function telegramProcessing() { $telegram = new UbillingTelegram($this->settings['TELEGRAM_BOTTOKEN']); $messagesCount = $telegram->getQueueCount(); if ($messagesCount > 0) { $allMessagesData = $telegram->getQueueData(); if (!empty($allMessagesData)) { foreach ($allMessagesData as $io => $eachmessage) { $telegram->directPushMessage($eachmessage['chatid'], $eachmessage['message']); $telegram->deleteMessage($eachmessage['filename']); } } } return ($messagesCount); } /** * Cuts international codes like "+38", "+7" from phone number * This function might be supplemented with new country codes and refactored * * @param $PhoneNumber * * @return bool|mixed|string */ public static function cutInternationalsFromPhoneNum($PhoneNumber) { // if we have users phones in DB like "0991234567" and some function/module // appended "+38" or "+7" to the beginning of it and if we need to remove that prefix // for MYSQL "LIKE" to search properly $PhoneNumber = str_replace(array('+7', '+38', '+'), '', $PhoneNumber); // sometimes phone number may be stored without leading "+" // and we still need to remove international codes $Prefix = '38'; if (substr($PhoneNumber, 0, strlen($Prefix)) == $Prefix) { $PhoneNumber = substr($PhoneNumber, strlen($Prefix)); } $Prefix = '7'; if (substr($PhoneNumber, 0, strlen($Prefix)) == $Prefix) { $PhoneNumber = substr($PhoneNumber, strlen($Prefix)); } return $PhoneNumber; } /** * Renders service balance or another misc info by its serviceId * * @param string $serviceId * * @return void */ public function renderBalanceInfo($serviceId) { if (isset($this->servicesEnabled[$serviceId])) { if (isset($this->servicesEnabled[$serviceId]['BALANCE'])) { if (!empty($this->servicesEnabled[$serviceId]['BALANCE'])) { $balanceMethodName = $this->servicesEnabled[$serviceId]['BALANCE']; $serviceName = (isset($this->servicesEnabled[$serviceId]['NAME'])) ? $this->servicesEnabled[$serviceId]['NAME'] : $serviceId; show_window(__($serviceName) . ' ' . __('Balance'), $this->activeServices[$serviceId]->$balanceMethodName()); } } } } } |