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

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


onepunch

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Попередня ревізія
onepunch [2020/04/09 14:11]
onepunch [2023/03/27 12:45] (поточний)
nightfly
Рядок 1: Рядок 1:
 +====== One-Punch Scripts ======
  
 +{{ :saitama.png?direct&|}}
 +
 +Дозволяють вам <del>трішки побути Сайтамою</del> зберігати свої шматочки коду, для відлагодження в консолі розробника чи подальшого виклику їх з [[remoteapi|RemoteAPI]] за для розширення функціоналу вашого біллінгу, чи використання їх у ролі звітів "Майстра звітів". Загалом, це все разом являє собою неймовірно гнучку та зручну систему розширення бізнес-логіки ваших рішень.
 +
 +Доволі очевидно, що керувати ними ви можете з "Консолі розробника". А саме в "PHP консолі". Так, при створенні та редагуванні скриптів усі поля є обов'язковими. Поле alias має бути унікальним і містити тільки латиницю чи цифри. Ім'я ви пишете тільки для себе, щоб розуміти, що це за шматок коду.
 +За допомогою One-Punch скриптів можна робити практично все, що могли б робити за допомогою якого-небудь модуля. Наприклад, ресет якогось користувача що 5 хвилин.
 +
 +{{:onepunch1.png?500|}}
 +
 +Власне так ми викликатимемо це за допомогою нашого crontab
 +
 +<code bash>
 +*/5 * * * *     /bin/ubapi "onepunch&param=test1"
 +</code>
 +
 +А які більш практичні кейси ви можете реалізувати One-Punch скриптами? Та які завгодно, для реалізації потрібної вам бізнес логіки. Наприклад, на їх базі ви можете зробити своє власне REST API.
 +
 +{{:onepunch2.png?500|}}
 +
 +і отримувати дані про потрібні вам поля користувача, з ваших зовнішніх програм за допомогою відповідного URL. Для мобілки наприклад так:
 +<code>
 +?module=remoteapi&key=ВАШ_СЕРІЙНИК&action=onepunch&param=getuserfield&login=sometestuser&field=mobile
 +</code>
 +
 +===== Корисні приклади =====
 +
 +==== Щоденний звіт що до діяльності ====
 +
 +А чи можна робити щось ще зрозуміліше? Ну так. Ось вам наприклад щоденна нотифікація у [[ubillingtelegram|Телеграм]] про штуки, які відбулись протягом доби.
 +<code php>
 +$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);
 +}
 +</code>
 +
 +Та відповідно щоденний виклик:
 +
 +<code bash>
 +59 19 * * *   /bin/ubapi "onepunch&param=bigbro"
 +</code>
 +
 +==== Щорічне нарахування АП згідно якогось тегу ====
 +
 +<code php>
 +   // 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');
 +                }
 +            }
 +        }
 +    }
 +</code>
 +
 +Ну і виклик цього може виглядати як щомісячне 
 +
 +<code bash>
 +50 1 1 * *      /bin/ubapi "onepunch&param=yearcharge"
 +</code>
 +
 +
 +==== Примусове зняття повної АП зі всіх абонентів ====
 +<code php>
 +    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'));
 +    }
 +</code>
 +
 +
 +==== Кредит всім абонентам з якимись умовами ====
 +
 +<code php>
 +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);
 +}
 +</code>
 +
 +==== Примусове зняття АП поденних тарифів за скількись днів ====
 +
 +<code php>
 +    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);
 +            }
 +        }
 +    }
 +</code>