====== One-Punch Scripts ====== {{ :saitama.png?direct&|}} Дозволяють вам трішки побути Сайтамою зберігати свої шматочки коду, для відлагодження в консолі розробника чи подальшого виклику їх з [[remoteapi|RemoteAPI]] за для розширення функціоналу вашого біллінгу, чи використання їх у ролі звітів "Майстра звітів". Загалом, це все разом являє собою неймовірно гнучку та зручну систему розширення бізнес-логіки ваших рішень. Доволі очевидно, що керувати ними ви можете з "Консолі розробника". А саме в "PHP консолі". Так, при створенні та редагуванні скриптів усі поля є обов'язковими. Поле alias має бути унікальним і містити тільки латиницю чи цифри. Ім'я ви пишете тільки для себе, щоб розуміти, що це за шматок коду. За допомогою One-Punch скриптів можна робити практично все, що могли б робити за допомогою якого-небудь модуля. Наприклад, ресет якогось користувача що 5 хвилин. {{:onepunch1.png?500|}} Власне так ми викликатимемо це за допомогою нашого crontab */5 * * * * /bin/ubapi "onepunch¶m=test1" А які більш практичні кейси ви можете реалізувати One-Punch скриптами? Та які завгодно, для реалізації потрібної вам бізнес логіки. Наприклад, на їх базі ви можете зробити своє власне REST API. {{:onepunch2.png?500|}} і отримувати дані про потрібні вам поля користувача, з ваших зовнішніх програм за допомогою відповідного URL. Для мобілки наприклад так: ?module=remoteapi&key=ВАШ_СЕРІЙНИК&action=onepunch¶m=getuserfield&login=sometestuser&field=mobile ===== Корисні приклади ===== ==== Щоденний звіт що до діяльності ==== А чи можна робити щось ще зрозуміліше? Ну так. Ось вам наприклад щоденна нотифікація у [[ubillingtelegram|Телеграм]] про штуки, які відбулись протягом доби. $telegramChatIds = array('11111111', '22222222'); $message = ''; $telegram = new UbillingTelegram(); $allUserData = zb_UserGetAllData(); //user signups $userreg = new nya_userreg(); $userreg->where('date', 'LIKE', curdate() . '%'); $regsCount = $userreg->getFieldsCount(); $message .= 'Користувачів зареєстровано сьогодні: ' . $regsCount . '\r\n '; //active user stats if (!empty($allUserData)) { $activeUsers = 0; foreach ($allUserData as $io => $userData) { if (bb_userIsActive($userData) == 1) { $activeUsers++; } } $message .= 'Всього активних користувачів на даний момент: ' . $activeUsers . '\r\n '; } //payments stats $payments = new nya_payments(); $payments->where('date', 'LIKE', curdate() . '%'); $payments->where('summ', '>', '0'); $paymentsCount = $payments->getFieldsCount('id', false); $paymentsSum = $payments->getFieldsSum('summ'); $message .= 'Сьогодні отримано ' . $paymentsCount . ' платежів на суму ' . $paymentsSum .' грн.'. '\r\n'; $payments->where('date', 'LIKE', curdate() . '%'); $payments->where('summ', '>', '0'); $payments->where('cashtypeid','=','1'); $paymentsCount = $payments->getFieldsCount('id', false); $paymentsSum = $payments->getFieldsSum('summ'); $message .= 'З них готівкою ' . $paymentsCount . ' платежів на суму ' . $paymentsSum .' грн.'. '\r\n'; //payments corrections $paycorr = new nya_paymentscorr(); $paycorr->where('date', 'LIKE', curdate() . '%'); $allCorr = $paycorr->getAll(); if (!empty($allCorr)) { $message .= '==========' . '\r\n '; $message .= 'Корегування балансу: ' . '\r\n '; foreach ($allCorr as $io => $each) { if (!ispos($each['note'], 'DDT')) { $message .= '- ' . $allUserData[$each['login']]['fulladress'] . ', ' . $each['summ'] . ' грн. (було ' . $each['balance'] . ' стало ' . ($each['balance'] + $each['summ']) . ') ' . $each['admin'] . ' ' . $each['note'] . ' ' . '\r\n '; } } } if (!empty($message)) { foreach ($telegramChatIds as $eachChatId) { $telegram->sendMessage($eachChatId, $message, false, 'BIGBRO'); //deb($message); } } function bb_userIsActive($userData) { $result = ''; if (($userData['Cash'] >= '-' . $userData['Credit']) AND ( $userData['AlwaysOnline'] == 1) AND ( $userData['Passive'] == 0) AND ( $userData['Down'] == 0)) { $result = 1; } if (($userData['Cash'] < '-' . $userData['Credit']) AND ( $userData['AlwaysOnline'] == 1) AND ( $userData['Passive'] == 0) AND ( $userData['Down'] == 0)) { $result = 0; } if (($userData['Cash'] < '-' . $userData['Credit']) AND ( $userData['AlwaysOnline'] == 1) AND ( $userData['Passive'] == 0) AND ( $userData['Down'] == 1)) { $result = 0; } if ($userData['Passive'] == 1) { $result = -1; } return ($result); } Та відповідно щоденний виклик: 59 19 * * * /bin/ubapi "onepunch¶m=bigbro" ==== Щорічне нарахування АП згідно якогось тегу ==== // Config section $serviceTagId = 42; //service tag ID $servicePrice = 480; //per-year price $chargeMethod = 'add'; //charge operation type $paymentTypeId = 1; //payment type ID //end of config $allUserData = zb_UserGetAllStargazerDataAssoc(); $currentMonth = date("m"); $fee = '-' . $servicePrice; $tagsDb = new nya_tags(); $weblogsDb = new nya_weblogs(); $tagsDb->where('tagid', '=', $serviceTagId); $allUsersWithService = $tagsDb->getAll('login'); $weblogsDb->selectable(array('date', 'event')); $eventFilter = 'TAGADD%TAGID [' . $serviceTagId . ']'; $weblogsDb->where('event', 'LIKE', $eventFilter); $weblogsRaw = $weblogsDb->getAll(); $allServiceSetupDates = array(); //service setup dates as login=>month if (!empty($weblogsRaw)) { //preprocessing raw logs foreach ($weblogsRaw as $io => $each) { if (preg_match('!\((.*?)\)!si', $each['event'], $tmpMatch)) { $extractedLogin = $tmpMatch[1]; if (!empty($extractedLogin)) { if (isset($allUsersWithService[$extractedLogin]) AND isset($allUserData[$extractedLogin])) { //user exists and have required service set $setupTimeStamp = strtotime($each['date']); $setupMonth = date("m", $setupTimeStamp); $allServiceSetupDates[$extractedLogin] = $setupMonth; } } } } } //processing fee if (!empty($allUsersWithService)) { foreach ($allUsersWithService as $eachUserLogin => $eachServiceData) { if (isset($allServiceSetupDates[$eachUserLogin])) { if ($allServiceSetupDates[$eachUserLogin] == $currentMonth) { //now is required to charge fee zb_CashAdd($eachUserLogin, $fee, $chargeMethod, $paymentTypeId, 'EXTFEE'); } } } } Ну і виклик цього може виглядати як щомісячне 50 1 1 * * /bin/ubapi "onepunch¶m=yearcharge" ==== Примусове зняття повної АП зі всіх абонентів ==== set_time_limit(0); $tariffPrices = zb_TariffGetPricesAll(); $users = new nya_users(); $users->where('Passive', '=', 0); $all = $users->getAll(); $i = 0; if (!empty($all)) { foreach ($all as $io => $each) { $userTariff = $each['Tariff']; if (isset($tariffPrices[$userTariff])) { $userFee = $tariffPrices[$userTariff]; if ($userFee > 0) { $feeCharge = '-' . $userFee; // use following method to avoid payments log recording // $billing->addcash($each['login'], $feeCharge); // charging some cash as payment correction zb_CashAdd($each['login'], $feeCharge, 'correct', 1, 'FEE'); log_register('CHANGE FixStargazerFee (' . $each['login'] . ') ON ' . $feeCharge); } } else { show_warning(__('Skipping') . ' ' . $each['login']); } $i++; } show_info(__('users processed') . ': ' . $i); } else { show_error(__('No') . ' ' . __('Users')); } ==== Кредит всім абонентам з якимись умовами ==== set_time_limit (0); $credit = 9000; $creditexpire='2023-01-06'; $cashlimit=5; $users = new nya_users(); $users->where('Down','=','0'); $users->where('Passive','=','0'); $users->where('Credit','<','10'); $users->where('Cash','<',$cashlimit); $allUsers = $users->getAll('login'); foreach ($allUsers as $io => $userData){ $billing->setcredit($userData['login'], $credit); log_register('CHANGE FixCredit ('.$userData['login'].') ON '.$credit); $billing->setcreditexpire($userData['login'],$creditexpire); log_register('CHANGE CreditExpire ('.$userData['login'].') ON '.$creditexpire); } ==== Примусове зняття АП поденних тарифів за скількись днів ==== set_time_limit(0); $chargeDays = 5; $tariffsDb = new NyanORM('tariffs'); $tariffsDb->where('period', '=', 'day'); $allDailyTariffs = $tariffsDb->getAll('name'); $allUsers = zb_UserGetAllData(); if (!empty($allUsers) AND ! empty($allDailyTariffs)) { foreach ($allUsers as $io => $eachUser) { if (isset($allDailyTariffs[$eachUser['Tariff']]) AND $eachUser['Passive'] == 0) { $tariffFee = $allDailyTariffs[$eachUser['Tariff']]['Fee']; $chargeFix = '-' . $tariffFee * $chargeDays; zb_CashAdd($eachUser['login'], $chargeFix, 'correct', 1, 'FEE'); log_register('CHANGE FixStargazerFee (' . $eachUser['login'] . ') ON ' . $chargeFix); show_warning('Fixing fee for (' . $eachUser['login'] . ') Tariff ' . $eachUser['Tariff'] . ' ON ' . $tariffFee . '*' . $chargeDays . '=' . $chargeFix); } } } ==== Ресет всіх користувачів на якомусь тарифі ==== set_time_limit(0); $tariffFilter = 'Turbo'; $usersDb = new nya_users(); $usersDb->where('Tariff', '=', $tariffFilter); $allUsers = $usersDb->getAll(); if (!empty($allUsers)) { foreach ($allUsers as $io => $each) { $billing->resetuser($each['login']); show_info(__('Reset user') . ' (' . $each['login'] . ')'); } } else { show_warning(__('Nothing to show')); }