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

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


onepunch

Розбіжності

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

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

Порівняння попередніх версій Попередня ревізія
Попередня ревізія
Остання ревізія По сторонах наступні версії
onepunch [2020/04/09 14:11]
onepunch [2023/01/12 15:41]
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>
onepunch.txt · Востаннє змінено: 2023/03/27 12:45 повз nightfly