Source of file api.ptv.php
Size: 41,526 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.ptv.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131 | <?php /** * ProstoTV Ubilling abstraction layer * * https://docs.api.prosto.tv/ */ class PTV { /** * Contains sytem alter.config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains login preloaded from config * * @var string */ protected $login = ''; /** * Contains password preloaded from config * * @var string */ protected $password = ''; /** * ProstoTV low-level API abstraction layer * * @var object */ protected $api = ''; /** * Contains all available system users data as login=>userdata * * @var array */ protected $allUserData = array(); /** * Contains all subscribers data as login=>subscriberData * * @var array */ protected $allSubscribers = array(); /** * Contains all tariffs data as serviceid=>tariffData * * @var string */ protected $allTariffs = array(); /** * Subscribers database abstraction layer * * @var object */ protected $subscribersDb = ''; /** * Tariffs database abstraction layer * * @var object */ protected $tariffsDb = ''; /** * System message helper object placeholder * * @var object */ protected $messages = ''; /** * Predefined routes, options etc. */ const OPTION_LOGIN = 'PTV_LOGIN'; const OPTION_PASSWORD = 'PTV_PASSWORD'; const TABLE_SUBSCRIBERS = 'ptv_subscribers'; const TABLE_TARIFFS = 'ptv_tariffs'; const UNDEF = 'undefined_'; const NEW_WINDOW = 'TARGET="_BLANK"'; const URL_ME = '?module=prostotv'; const URL_USERPROFILE = '?module=userprofile&username='; const ROUTE_SUBLIST = 'subscribers'; const ROUTE_SUBAJ = 'ajaxlist'; const ROUTE_SUBVIEW = 'showsubscriber'; const ROUTE_TARIFFS = 'tariffs'; const ROUTE_BUNDLES = 'bundles'; const ROUTE_PLCREATE = 'createplaylist'; const ROUTE_PLDEL = 'deleteplaylist'; const ROUTE_SUBID = 'subscriberid'; const ROUTE_DEVCREATE = 'createdevice'; const ROUTE_DEVDEL = 'deletedevice'; const ROUTE_SUBLOOKUP = 'username'; const ROUTE_TARDEL = 'deletetariff'; const PROUTE_SUBREG = 'registersubscriber'; const PROUTE_CREATETARIFFID = 'newtariffserviceid'; const PROUTE_CREATETARIFFMAIN = 'newtariffmainflag'; const PROUTE_CREATETARIFFNAME = 'newtariffname'; const PROUTE_CREATETARIFFCHANS = 'newtariffchans'; const PROUTE_CREATETARIFFFEE = 'newtarifffee'; const PROUTE_TARIFFEDITSUBID = 'changetariffsubscriberid'; const PROUTE_SETMAINTARIFFID = 'changemaintariffserviceid'; const PROUTE_SETADDTARIFFID = 'changeaddionaltariffs'; /** * I keep my eyes low, looking for my rival * Eyes Low * Playing with the rifle * White dope * Feeling homicidal * Ride slow * Fucking up your spinal */ public function __construct() { $this->initMessages(); $this->loadConfig(); $this->setOptions(); $this->initApi(); $this->loadUserData(); $this->initSubscribersDb(); $this->initTariffsDb(); $this->loadSubscribers(); $this->loadTariffs(); } /** * Preloads required configs into protected props * * @global object $ubillingConfig * * @return void */ protected function loadConfig() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); } /** * Sets required properties via config options * * @return void */ protected function setOptions() { $this->login = $this->altCfg[self::OPTION_LOGIN]; $this->password = $this->altCfg[self::OPTION_PASSWORD]; } /** * Inits system message helper * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Inits low-level API for further usage * * @return void */ protected function initApi() { require_once ('api/libs/api.prostotv.php'); $this->api = new UTG\ProstoTV($this->login, $this->password); } /** * Inits subscribers database abstraction layer * * @return void */ protected function initSubscribersDb() { $this->subscribersDb = new NyanORM(self::TABLE_SUBSCRIBERS); } /** * Inits tariffs database abstraction layer * * @return void */ protected function initTariffsDb() { $this->tariffsDb = new NyanORM(self::TABLE_TARIFFS); } /** * Loads available subscribers from database * * @return void */ protected function loadSubscribers() { $this->allSubscribers = $this->subscribersDb->getAll('login'); } /** * Loads available tariffs from database * * @return void */ protected function loadTariffs() { $this->allTariffs = $this->tariffsDb->getAll('serviceid'); } /** * Loads available system users data * * @return void */ protected function loadUserData() { $this->allUserData = zb_UserGetAllData(); } /** * Registers a new user * * @param string $userLogin * * @return array/bool on error */ public function userRegister($userLogin) { $result = false; $userLogin = ubRouting::filters($userLogin, 'mres'); //user exists if (isset($this->allUserData[$userLogin])) { //not registered yet if (!isset($this->allSubscribers[$userLogin])) { $userData = $this->allUserData[$userLogin]; $newPassword = $userData['Password']; $userRealName = $userData['realname']; $userRealNameParts = explode(' ', $userRealName); if (sizeof($userRealNameParts == 3)) { $firstName = @$userRealNameParts[1]; $middleName = @$userRealNameParts[2]; $lastName = @$userRealNameParts[0]; } else { $firstName = self::UNDEF . $userLogin; $middleName = self::UNDEF . $userLogin; $lastName = self::UNDEF . $userLogin; } $requestParams = array( 'first_name' => $firstName, 'middle_name' => $middleName, 'last_name' => $lastName, 'note' => $userLogin, 'password' => $newPassword ); $result = $this->api->post('/objects', $requestParams); //log subscriber $newId = $result['id']; $this->subscribersDb->data('date', curdatetime()); $this->subscribersDb->data('subscriberid', $newId); $this->subscribersDb->data('login', $userLogin); $this->subscribersDb->data('active', '1'); $this->subscribersDb->create(); log_register('PTV SUB REGISTER (' . $userLogin . ') AS [' . $newId . ']'); } else { log_register('PTV SUB REGISTER (' . $userLogin . ') DUPLICATE FAIL'); } } else { log_register('PTV SUB REGISTER (' . $userLogin . ') NOTEXIST FAIL'); } return($result); } /** * Returns subscriber remote data * * @param string $userLogin * * @return array/bool */ public function getUserData($userLogin) { $result = false; if (isset($this->allSubscribers[$userLogin])) { $subscriberId = $this->allSubscribers[$userLogin]['subscriberid']; $reply = $this->api->get('/objects/' . $subscriberId); if ($reply) { $result = $reply; } } return($result); } /** * Checks is some subscriberId associated with registered user? * * @param int $subscriberId * * @return bool */ public function isValidSubscriber($subscriberId) { $subscriberId = ubRouting::filters($subscriberId, 'int'); $result = false; if (!empty($this->allSubscribers)) { foreach ($this->allSubscribers as $io => $each) { if ($each['subscriberid'] == $subscriberId) { $result = true; } } } return($result); } /** * Returns array of all existing user playlists * * @param int $subscriberId * * @return array/bool */ public function getPlaylistsAll($subscriberId) { $result = false; if ($this->isValidSubscriber($subscriberId)) { $reply = $this->api->get('objects/' . $subscriberId . '/playlists'); if (isset($reply['playlists'])) { $result = $reply['playlists']; } } return($result); } /** * Returns existing subscriber user login by its ID * * @param int $subscriberId * * @return string/bool */ public function getSubscriberLogin($subscriberId) { $result = false; if (!empty($this->allSubscribers)) { foreach ($this->allSubscribers as $io => $each) { if ($each['subscriberid'] == $subscriberId) { $result = $each['login']; } } } return($result); } /** * Returns subscripber ID by some of the users login * * @param string $userLogin * * @return int/bool */ public function getSubscriberId($userLogin) { $result = false; if (isset($this->allSubscribers[$userLogin])) { $result = $this->allSubscribers[$userLogin]['subscriberid']; } return($result); } /** * Creates new playlist for some subscriber * * @param int $subscriberId * * @return array/bool */ public function createPlayList($subscriberId) { $result = false; if ($this->isValidSubscriber($subscriberId)) { $userLogin = $this->getSubscriberLogin($subscriberId); $result = $this->api->post('objects/' . $subscriberId . '/playlists'); log_register('PTV PLAYLIST CREATE SUB (' . $userLogin . ') AS [' . $subscriberId . ']'); } return($result); } /** * Creates some device for subscriber * * @param int $subscriberId * * @return array/bool */ public function createDevice($subscriberId) { $result = false; if ($this->isValidSubscriber($subscriberId)) { $userLogin = $this->getSubscriberLogin($subscriberId); $result = $this->api->post('objects/' . $subscriberId . '/devices'); log_register('PTV DEVICE CREATE SUB (' . $userLogin . ') AS [' . $subscriberId . ']'); } return($result); } /** * Deletes some device for subscriber * * @param int $subscriberId * * @return array/bool */ public function deleteDevice($subscriberId, $deviceId) { $result = false; if ($this->isValidSubscriber($subscriberId)) { $userLogin = $this->getSubscriberLogin($subscriberId); $result = $this->api->delete('objects/' . $subscriberId . '/devices/' . $deviceId); log_register('PTV DEVICE DELETE SUB (' . $userLogin . ') AS [' . $subscriberId . ']'); } return($result); } /** * Deletes some subscriber`s playlist * * @param int $subscriberId * @param string $playListId * * @return void */ public function deletePlaylist($subscriberId, $playListId) { if ($this->isValidSubscriber($subscriberId)) { $userLogin = $this->getSubscriberLogin($subscriberId); $this->api->delete('/objects/' . $subscriberId . '/playlists/' . $playListId); log_register('PTV PLAYLIST DELETE SUB (' . $userLogin . ') AS [' . $subscriberId . ']'); } } /** * Renders available subscribers JSON list * * @return void */ public function renderSubsribersAjReply() { $json = new wf_JqDtHelper(); if (!empty($this->allSubscribers)) { foreach ($this->allSubscribers as $userLogin => $eachSub) { if (isset($this->allUserData[$userLogin])) { $data[] = $eachSub['subscriberid']; $data[] = $eachSub['date']; $userAddress = @$this->allUserData[$userLogin]['fulladress']; $userRealName = @$this->allUserData[$userLogin]['realname']; $profileLink = wf_Link(self::URL_USERPROFILE . $userLogin, web_profile_icon()); $subViewUrl = self::URL_ME . '&' . self::ROUTE_SUBVIEW . '=' . $userLogin; $actLinks = wf_Link($subViewUrl, web_edit_icon()); $data[] = $profileLink . ' ' . $userAddress; $data[] = $userRealName; $data[] = $actLinks; $json->addRow($data); unset($data); } } } $json->getJson(); } /** * Renders existing subscribers list container * * @return string */ public function renderSubscribersList() { $result = ''; $columns = array('ID', 'Date', 'Address', 'Real Name', 'Actions'); $opts = '"order": [[ 1, "desc" ]]'; $result .= wf_JqDtLoader($columns, self::URL_ME . '&' . self::ROUTE_SUBAJ . '=true', false, __('Subscriptions'), 50, $opts); return($result); } /** * Renders subscriber services * * @param array $subData * * @return string */ protected function renderServices($subData) { $result = ''; if (!empty($subData['services'])) { foreach ($subData['services'] as $io => $each) { $tariffLabel = ''; if (isset($this->allTariffs[$each['id']])) { $tariffLabel = $this->allTariffs[$each['id']]['name']; } else { $tariffLabel = $each['id']; } $result .= $tariffLabel . ' '; } } else { $result .= __('No tariff'); } return($result); } /** * Renders basic subscriber profile * * @param string $userLogin * * @return string */ public function renderSubscriber($userLogin) { $result = ''; if (isset($this->allUserData[$userLogin])) { if (isset($this->allSubscribers[$userLogin])) { $subscriberId = $this->allSubscribers[$userLogin]['subscriberid']; $subData = $this->getUserData($userLogin); $userData = $this->allUserData[$userLogin]; $subProfileUrl = self::URL_ME . '&' . self::ROUTE_SUBVIEW . '=' . $userLogin; if ($subData != false) { $cells = wf_TableCell(__('Address'), '', 'row2'); $cells .= wf_TableCell(wf_Link(self::URL_USERPROFILE . $userLogin, web_profile_icon() . ' ' . $userData['fulladress'])); $rows = wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('ID'), '30%', 'row2'); $cells .= wf_TableCell($subData['id']); $rows .= wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('Cash'), '', 'row2'); $cells .= wf_TableCell($userData['Cash']); $rows .= wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('Credit'), '', 'row2'); $cells .= wf_TableCell($userData['Credit']); $rows .= wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('IP'), '', 'row2'); $cells .= wf_TableCell($userData['ip']); $rows .= wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('Status'), '', 'row2'); $actLed = ($this->allSubscribers[$userLogin]['active']) ? wf_img_sized('skins/icon_active.gif', '', 10) : wf_img_sized('skins/icon_inactive.gif', '', 10); $cells .= wf_TableCell($actLed . ' ' . __($subData['status'])); $rows .= wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('Profile') . ' ' . __('EBS'), '', 'row2'); $cells .= wf_TableCell(wf_Link($subData['ebs_url'], wf_img('skins/arrow_right_green.png') . ' ' . __('Show'), false, '', self::NEW_WINDOW)); $rows .= wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('Date'), '', 'row2'); $cells .= wf_TableCell($subData['date_create']); $rows .= wf_TableRow($cells, 'row3'); $cells = wf_TableCell(__('Tariffs'), '', 'row2'); $cells .= wf_TableCell($this->renderServices($subData)); $rows .= wf_TableRow($cells, 'row3'); $result .= wf_TableBody($rows, '100%', 0, ''); //append playlists $result .= $this->renderPlaylists($subData); //append devices $result .= $this->renderDevices($subData); //some user controls here $result .= wf_delimiter(0); $result .= $this->renderSubscriberControls($subscriberId, $subData); } else { $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . __('Empty reply received'), 'error'); } } else { $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': EX_SUBSCRIBER_NOT_EXISTS', 'error'); } } else { $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . __('User not exists'), 'error'); } return($result); } /** * Renders devices of some subscriber * * @param array $subData * * @return string */ protected function renderDevices($subData) { $result = ''; if (!empty($subData['devices'])) { $subscriberId = $subData['id']; $userLogin = $this->getSubscriberLogin($subscriberId); $subProfileUrl = self::URL_ME . '&' . self::ROUTE_SUBVIEW . '=' . $userLogin; $cells = wf_TableCell(__('ID')); $cells .= wf_TableCell(__('Created')); $cells .= wf_TableCell(__('Updated')); $cells .= wf_TableCell(__('Login')); $cells .= wf_TableCell(__('Password')); $cells .= wf_TableCell(__('Device')); $cells .= wf_TableCell(__('IP')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($subData['devices'] as $io => $eachDevice) { $cells = wf_TableCell($eachDevice['id']); $cells .= wf_TableCell($eachDevice['created']); $cells .= wf_TableCell($eachDevice['updated']); $cells .= wf_TableCell($eachDevice['login']); $cells .= wf_TableCell($eachDevice['password']); $cells .= wf_TableCell($eachDevice['device']); $cells .= wf_TableCell($eachDevice['ip']); $devDelUrl = self::URL_ME . '&' . self::ROUTE_DEVDEL . '=' . $eachDevice['id'] . '&' . self::ROUTE_SUBID . '=' . $subscriberId; $devDelControls = wf_ConfirmDialog($devDelUrl, web_delete_icon() . ' ' . __('Delete'), $this->messages->getDeleteAlert(), '', $subProfileUrl); $cells .= wf_TableCell($devDelControls); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_tag('b') . __('Devices') . wf_tag('b', true) . wf_delimiter(0); $result .= wf_TableBody($rows, '100%', 0, ''); } else { $result .= $this->messages->getStyledMessage(__('This user have no any devices'), 'warning'); } return($result); } /** * Renders playlists of some subscriber * * @param array $subData * * @return string */ protected function renderPlaylists($subData) { $result = ''; if (!empty($subData['playlists'])) { $subscriberId = $subData['id']; $userLogin = $this->getSubscriberLogin($subscriberId); $subProfileUrl = self::URL_ME . '&' . self::ROUTE_SUBVIEW . '=' . $userLogin; $cells = wf_TableCell(__('ID')); $cells .= wf_TableCell(__('Created')); $cells .= wf_TableCell(__('Updated')); $cells .= wf_TableCell(__('Genres')); $cells .= wf_TableCell(__('TV guide')); $cells .= wf_TableCell(__('IP')); $cells .= wf_TableCell(__('URL')); $cells .= wf_TableCell(__('Device')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($subData['playlists'] as $io => $eachPlaylist) { $cells = wf_TableCell($eachPlaylist['id']); $cells .= wf_TableCell($eachPlaylist['created']); $cells .= wf_TableCell($eachPlaylist['updated']); $cells .= wf_TableCell(web_bool_led($eachPlaylist['genres'])); $cells .= wf_TableCell(web_bool_led($eachPlaylist['tv_guide'])); $cells .= wf_TableCell($eachPlaylist['ip']); $urlControls = wf_Link($eachPlaylist['url'], $eachPlaylist['url'], false, '', self::NEW_WINDOW); $cells .= wf_TableCell($urlControls); $cells .= wf_TableCell($eachPlaylist['device_id']); $plDeleteUrl = self::URL_ME . '&' . self::ROUTE_PLDEL . '=' . $eachPlaylist['id'] . '&' . self::ROUTE_SUBID . '=' . $subscriberId; $plDelControls = wf_ConfirmDialog($plDeleteUrl, web_delete_icon() . ' ' . __('Delete'), $this->messages->getDeleteAlert(), '', $subProfileUrl); $cells .= wf_TableCell($plDelControls); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_tag('b') . __('Playlists') . wf_tag('b', true) . wf_delimiter(0); $result .= wf_TableBody($rows, '100%', 0, ''); } else { $result .= $this->messages->getStyledMessage(__('This user have no any playlists'), 'warning'); } return($result); } /** * Renders users tariff change form * * @param int $subscriberId * * @return string */ protected function renderUserTariffEditForm($subscriberId) { $result = ''; if (!empty($this->allTariffs)) { $mainTariffsArr = array(); $additionalTariffsArr = array(); $userLogin = $this->getSubscriberLogin($subscriberId); $currentMainTariff = $this->allSubscribers[$userLogin]['maintariff']; foreach ($this->allTariffs as $io => $each) { if ($each['main']) { $mainTariffsArr[$each['serviceid']] = $each['name']; } else { $additionalTariffsArr[$each['serviceid']] = $each['name']; } } if (!empty($mainTariffsArr)) { $inputs = wf_HiddenInput(self::PROUTE_TARIFFEDITSUBID, $subscriberId); $inputs .= wf_Selector(self::PROUTE_SETMAINTARIFFID, $mainTariffsArr, __('Primary') . ' ' . __('Tariff'), $currentMainTariff, true); $inputs .= wf_Submit(__('Save')); $result .= wf_Form('', 'POST', $inputs, 'glamour'); } } else { $result .= $this->messages->getStyledMessage(__('Tariffs') . ': ' . __('Not exists'), 'error'); } return($result); } /** * Sets primary tariff for some subscriber * * @param int $subscriberId * @param int $tariffId * * @return void */ public function setMainTariff($subscriberId, $tariffId) { $tariffId = ubRouting::filters($tariffId, 'int'); $subscriberId = ubRouting::filters($subscriberId, 'int'); if ($this->isValidSubscriber($subscriberId)) { $userLogin = $this->getSubscriberLogin($subscriberId); $currentTariff = $this->allSubscribers[$userLogin]['maintariff']; //deleting old service if required if ($currentTariff) { if ($currentTariff != $tariffId) { $this->api->delete('/objects/' . $subscriberId . '/services/' . $currentTariff); log_register('PTV SUB (' . $userLogin . ') UNSET TARIFF [' . $currentTariff . '] AS [' . $subscriberId . ']'); } } if ($currentTariff != $tariffId) { //database update $this->subscribersDb->data('maintariff', $tariffId); $this->subscribersDb->data('active', 1); $this->subscribersDb->where('subscriberid', '=', $subscriberId); $this->subscribersDb->save(); //push to service API $this->api->post('/objects/' . $subscriberId . '/services', array('id' => $tariffId, 'auto_renewal' => 1)); //put log record log_register('PTV SUB (' . $userLogin . ') SET TARIFF [' . $tariffId . '] AS [' . $subscriberId . ']'); } } } /** * Returns some subscriber controls * * @param int $subscriberId * @param array $subData * * @return string */ protected function renderSubscriberControls($subscriberId, $subData = array()) { $result = ''; if ($this->isValidSubscriber($subscriberId)) { $userLogin = $this->getSubscriberLogin($subscriberId); $plCreateUrl = self::URL_ME . '&' . self::ROUTE_PLCREATE . '=' . $subscriberId; $subProfileUrl = self::URL_ME . '&' . self::ROUTE_SUBVIEW . '=' . $userLogin; $plCreateLabel = web_icon_create() . ' ' . __('Just create new playlist'); $result .= wf_ConfirmDialog($plCreateUrl, $plCreateLabel, __('Just create new playlist') . '? ' . $this->messages->getEditAlert(), 'ubButton', $subProfileUrl) . ' '; $devCreateUrl = self::URL_ME . '&' . self::ROUTE_DEVCREATE . '=' . $subscriberId; $devCreateLabel = wf_img('skins/switch_models.png') . ' ' . __('Create new device'); $result .= wf_ConfirmDialog($devCreateUrl, $devCreateLabel, __('Create new device') . '? ' . $this->messages->getEditAlert(), 'ubButton', $subProfileUrl) . ' '; $result .= wf_modalAuto(wf_img('skins/icon_tariff.gif') . ' ' . __('Edit tariff'), __('Tariff'), $this->renderUserTariffEditForm($subscriberId), 'ubButton'); if (!empty($subData)) { $userScheme = wf_tag('pre') . print_r($subData, true) . wf_tag('pre', true); $result .= wf_modal(wf_img('skins/brain.png') . ' ' . __('User inside'), __('User inside'), $userScheme, 'ubButton', '800', '600'); } } return($result); } /** * Renders basic user registration form * * @return string */ protected function renderUserRegisterForm() { $result = ''; $inputs = wf_TextInput(self::PROUTE_SUBREG, __('Login'), '', false, 20); $inputs .= wf_Submit(__('Register')); $result .= wf_Form("", 'POST', $inputs, 'glamour'); return($result); } /** * Renders primary module controls * * @return string */ public function renderPanel() { $result = ''; $result .= wf_modalAuto(web_icon_create() . ' ' . __('Users registration'), __('Users registration'), $this->renderUserRegisterForm(), 'ubButton'); $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_SUBLIST . '=true', wf_img('skins/ukv/users.png') . ' ' . __('Subscriptions'), false, 'ubButton') . ' '; $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_TARIFFS . '=true', wf_img('skins/ukv/dollar.png') . ' ' . __('Tariffs'), false, 'ubButton') . ' '; return($result); } /** * Renders bundles (server side tariffs) available at service * * @return string */ public function renderBundles() { $result = ''; $raw = $this->api->get('/search/bundles'); if ($raw) { if (isset($raw['bundles'])) { $cells = wf_TableCell(__('Service ID')); $cells .= wf_TableCell(__('Name') . ' ' . __('UA')); $cells .= wf_TableCell(__('Name') . ' ' . __('RU')); $cells .= wf_TableCell(__('Primary')); $cells .= wf_TableCell(__('Channels')); $cells .= wf_TableCell(__('Price')); $rows = wf_TableRow($cells, 'row1'); foreach ($raw['bundles'] as $io => $each) { $cells = wf_TableCell($each['service_id']); $cells .= wf_TableCell($each['name_uk']); $cells .= wf_TableCell($each['name_ru']); $cells .= wf_TableCell(web_bool_led($each['main'])); $cells .= wf_TableCell($each['channels_count']); $cells .= wf_TableCell($each['cost']); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_TableBody($rows, '100%', 0, 'sortable'); } } else { $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . __('Tariffs offered') . ' ' . __('Not exists'), 'error'); } return($result); } /** * Renders new tariff creation form * * @return string */ protected function renderTariffCreateForm() { $result = ''; $sup = wf_tag('sup') . '*' . wf_tag('sup', true); $inputs = wf_TextInput(self::PROUTE_CREATETARIFFID, __('Service ID') . $sup, '', true, 5, 'digits'); $inputs .= wf_TextInput(self::PROUTE_CREATETARIFFNAME, __('Tariff name') . $sup, '', true, 20); $inputs .= wf_CheckInput(self::PROUTE_CREATETARIFFMAIN, __('Primary'), true, true); $inputs .= wf_TextInput(self::PROUTE_CREATETARIFFCHANS, __('Description'), '', true, 20); $inputs .= wf_TextInput(self::PROUTE_CREATETARIFFFEE, __('Fee') . $sup, '', true, 4, 'finance'); $inputs .= wf_delimiter(0); $inputs .= wf_Submit(__('Create')); $result .= wf_Form('', 'POST', $inputs, 'glamour'); return($result); } /** * Creates new tariff in database * * @return void/string on error */ public function createTariff() { $result = ''; if (ubRouting::checkPost(array(self::PROUTE_CREATETARIFFNAME, self::PROUTE_CREATETARIFFID))) { $tariffId = ubRouting::post(self::PROUTE_CREATETARIFFID, 'int'); $tariffName = ubRouting::post(self::PROUTE_CREATETARIFFNAME, 'mres'); $tariffMain = (ubRouting::checkPost(self::PROUTE_CREATETARIFFMAIN)) ? 1 : 0; $tariffChans = ubRouting::post(self::PROUTE_CREATETARIFFCHANS, 'mres'); $tariffFee = ubRouting::post(self::PROUTE_CREATETARIFFFEE); if ($tariffId) { if (!isset($this->allTariffs[$tariffId])) { if ($tariffName) { if (zb_checkMoney($tariffFee)) { $this->tariffsDb->data('serviceid', $tariffId); $this->tariffsDb->data('main', $tariffMain); $this->tariffsDb->data('name', $tariffName); $this->tariffsDb->data('chans', $tariffChans); $this->tariffsDb->data('fee', $tariffFee); $this->tariffsDb->create(); log_register('PTV TARIFF CREATE `' . $tariffName . '` AS [' . $tariffId . '] FEE `' . $tariffFee . '`'); } else { $result .= __('Wrong format of money sum'); } } else { $result .= __('Wrong tariff name'); } } else { $result .= __('Duplicate element ID'); log_register('PTV TARIFF CREATE `' . $tariffName . '` AS [' . $tariffId . '] DUPLICATE FAIL'); } } else { $result .= __('Wrong tariff id'); } } return($result); } /** * Deletes existing tariff from database * * @param int $tariffId * * @return void/string on error */ public function deleteTariff($tariffId) { $result = ''; $tariffId = ubRouting::filters($tariffId, 'int'); if (isset($this->allTariffs[$tariffId])) { if ($this->isTariffProtected($tariffId)) { $result = __('Tariff is used by some users'); } else { $tariffData = $this->allTariffs[$tariffId]; $tariffName = $tariffData['name']; $tariffFee = $tariffData['fee']; $this->tariffsDb->where('serviceid', '=', $tariffId); $this->tariffsDb->delete(); log_register('PTV TARIFF DELETE `' . $tariffName . '` AS [' . $tariffId . '] FEE `' . $tariffFee . '`'); } } else { $result .= __('Tariff not exists'); } return($result); } /** * Checks is some tariff protected of usage by some user * * @param int $tariffId * * @return bool */ protected function isTariffProtected($tariffId) { $result = false; if (!empty($this->allSubscribers)) { foreach ($this->allSubscribers as $io => $each) { if ($each['maintariff'] == $tariffId) { $result = true; } if (ispos($each['addtariffs'], $tariffId)) { $result = true; } } } return($result); } /** * Renders list of tariffs available for users * * @return string */ public function renderTariffs() { $result = ''; $result .= wf_modalAuto(web_add_icon() . ' ' . __('Create new tariff'), __('Create new tariff'), $this->renderTariffCreateForm(), 'ubButton'); $result .= wf_Link(self::URL_ME . '&' . self::ROUTE_BUNDLES . '=true', wf_img('skins/tariffinfo.gif') . ' ' . __('Available tariffs'), false, 'ubButton'); $result .= wf_delimiter(); if (!empty($this->allTariffs)) { $cells = wf_TableCell(__('Service ID')); $cells .= wf_TableCell(__('Name')); $cells .= wf_TableCell(__('Primary')); $cells .= wf_TableCell(__('Description')); $cells .= wf_TableCell(__('Fee')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($this->allTariffs as $io => $each) { $cells = wf_TableCell($each['serviceid']); $cells .= wf_TableCell($each['name']); $cells .= wf_TableCell(web_bool_led($each['main'])); $cells .= wf_TableCell($each['chans']); $cells .= wf_TableCell($each['fee']); $tariffsCancelUrl = self::URL_ME . '&' . self::ROUTE_TARIFFS . '=true'; $tariffsDeleteUrl = self::URL_ME . '&' . self::ROUTE_TARDEL . '=' . $each['serviceid']; $tariffControls = wf_ConfirmDialog($tariffsDeleteUrl, web_delete_icon() . ' ' . __('Delete'), $this->messages->getDeleteAlert(), '', $tariffsCancelUrl); $cells .= wf_TableCell($tariffControls); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result .= $this->messages->getStyledMessage(__('Nothing to show'), 'warning'); } return($result); } /** * Charges some tariff fee from user account * * @param string $userLogin * @param int $tariffId * * @return void */ public function chargeUserFee($userLogin, $tariffId) { if (isset($this->allUserData[$userLogin])) { if (isset($this->allTariffs[$tariffId])) { $subscriberId = $this->getSubscriberId($userLogin); $tariffFee = $this->allTariffs[$tariffId]['fee']; zb_CashAdd($userLogin, '-' . $tariffFee, 'add', 1, 'PROSTOTV:' . $tariffId); log_register('PTV CHARGE TARIFF [' . $tariffId . '] FEE `' . $tariffFee . '` FOR (' . $userLogin . ') AS [' . $subscriberId . ']'); } else { log_register('PTV CHARGE FAIL NOTARIFF [' . $tariffId . '] FOR (' . $userLogin . ') AS [' . $subscriberId . ']'); } } else { log_register('PTV CHARGE FAIL NOUSER (' . $userLogin . ')'); } } /** * Performs fee processing of all registered subscribers * * @return void */ public function feeProcessing() { if (!empty($this->allSubscribers)) { foreach ($this->allSubscribers as $io => $eachSub) { $userLogin = $eachSub['login']; $subscriberId = $eachSub['subscriberid']; $userFee = 0; if (isset($this->allUserData[$userLogin])) { $userCash = $this->allUserData[$userLogin]['Cash']; //user subscription is active now if ($eachSub['active']) { $this->chargeUserFee($eachSub['login'], $eachSub['maintariff']); } } else { log_register('PTV CHARGE (' . $userLogin . ') AS [' . $eachSub . '] FAIL MISS'); } } } } /** * Renders JSON reply for some userstats frontend requests * * @param array $reply * * @return void */ protected function jsonRenderReply($reply) { $reply = json_encode($reply); die($reply); } /** * Renders user subscription data for some login * * @param string $userLogin * * @return void */ public function usReplyUserData($userLogin) { $reply = array(); if (isset($this->allSubscribers[$userLogin])) { $reply = $this->allSubscribers[$userLogin]; } $this->jsonRenderReply($reply); } /** * Renders subscriber full data * * @param string $userLogin * * @return void */ public function usReplyUserFullData($userLogin) { $reply = array(); $reply = $this->getUserData($userLogin); $this->jsonRenderReply($reply); } /** * Renders available tariffs list * * @return void */ public function usReplyTariffs() { $reply = array(); if (!empty($this->allTariffs)) { //TODO: support of additional tariffs foreach ($this->allTariffs as $io => $each) { if ($each['main']) { $reply[$io] = $each; } } } $this->jsonRenderReply($reply); } /** * Just deactivates service fro user account * * @param int $subscriberId * @param int $tariffId * * @return void */ public function usUnsubscribe($subscriberId, $tariffId) { $reply = array(); $userLogin = $this->getSubscriberLogin($subscriberId); $this->api->delete('/objects/' . $subscriberId . '/services/' . $tariffId); $this->subscribersDb->data('active', '0'); $this->subscribersDb->data('maintariff', '0'); $this->subscribersDb->where('subscriberid', '=', $subscriberId); $this->subscribersDb->save(); log_register('PTV SUB (' . $userLogin . ') UNSET TARIFF [' . $tariffId . '] AS [' . $subscriberId . ']'); $this->jsonRenderReply($reply); } /** * Subscribes user to some service * * @param string $subscriberId * @param int $tariffId * * @return void */ public function usSubscribe($userLogin, $tariffId) { if (isset($this->allTariffs[$tariffId])) { //may be thats new user? $subscriberId = $this->getSubscriberId($userLogin); if (!$this->isValidSubscriber($subscriberId)) { $this->userRegister($userLogin); //update subscriberId $this->loadSubscribers(); $subscriberId = $this->getSubscriberId($userLogin); } //just switch tariff if ($this->isValidSubscriber($subscriberId)) { $this->setMainTariff($subscriberId, $tariffId); } //charge tariff fee after $this->chargeUserFee($userLogin, $tariffId); } } } |