Користувальницькькі налаштування

Налаштування сайту


Сайдбар

Розділи

Загальний опис
Історія змін
Рекомендації до оновлення
Плани на майбутнє
Відомі проблеми
Онлайн демо
Відео
Допомога проекту
Люди
Трохи про безпеку

FAQ



Редагувати сайдбар

onepunch

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);
            }
        }
    }
onepunch.txt · Востаннє змінено: 2023/03/27 12:45 повз nightfly