====== 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'));
}