Зміст

One-Punch Scripts

Дозволяють вам трішки побути Сайтамою зберігати свої шматочки коду, для відлагодження в консолі розробника чи подальшого виклику їх з RemoteAPI за для розширення функціоналу вашого біллінгу, чи використання їх у ролі звітів “Майстра звітів”. Загалом, це все разом являє собою неймовірно гнучку та зручну систему розширення бізнес-логіки ваших рішень.

Доволі очевидно, що керувати ними ви можете з “Консолі розробника”. А саме в “PHP консолі”. Так, при створенні та редагуванні скриптів усі поля є обов'язковими. Поле alias має бути унікальним і містити тільки латиницю чи цифри. Ім'я ви пишете тільки для себе, щоб розуміти, що це за шматок коду. За допомогою One-Punch скриптів можна робити практично все, що могли б робити за допомогою якого-небудь модуля. Наприклад, ресет якогось користувача що 5 хвилин.

Власне так ми викликатимемо це за допомогою нашого crontab

*/5 * * * *     /bin/ubapi "onepunch&param=test1"

А які більш практичні кейси ви можете реалізувати One-Punch скриптами? Та які завгодно, для реалізації потрібної вам бізнес логіки. Наприклад, на їх базі ви можете зробити своє власне REST API.

і отримувати дані про потрібні вам поля користувача, з ваших зовнішніх програм за допомогою відповідного URL. Для мобілки наприклад так:

?module=remoteapi&key=ВАШ_СЕРІЙНИК&action=onepunch&param=getuserfield&login=sometestuser&field=mobile

Корисні приклади

Щоденний звіт що до діяльності

А чи можна робити щось ще зрозуміліше? Ну так. Ось вам наприклад щоденна нотифікація у Телеграм про штуки, які відбулись протягом доби.

$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&param=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&param=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);
            }
        }
    }