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

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


Сайдбар

Розділи

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

FAQ



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

onepunch

Це стара версія документу!


One-Punch Scripts

Позволяют вам немного побыть Сайтамой сохранять свои заготовки кода, для отладки в консоли разработчика или последующего вызова из RemoteAPI.

Вполне себе очевидно, что управлять ими вы можете в “Консоли разработчика” а именно в “PHP консоли”. Также вы можете при желании импортировать ваши старые шаблоны кода, если они у вас были. Важно: после импорта шаблоны кода удаляются из базы. Да, при создании и редактировании скриптов все поля являются обязательными. Поле alias должно быть уникальным и содержать только латиницу и цифры. Имя вы пишете только для себя, чтобы понимать что это за кусок кода.

При помощи One-Punch скриптов вы можете делать практически все, что могли бы делать при помощи любого модуля. Например ресет какого-то юзера раз в 5 минут :)

Собственно вот так мы это вызываем при помощи crontab -e

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

А какие практические кейсы вы можете реализовать? Да какие угдно, для реализации нужной вам бизнес-логки. Например на их базе вы можете сделать свое собственное 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'));
    }
onepunch.1669909848.txt.gz · Востаннє змінено: 2022/12/01 17:50 повз nightfly