fix
This commit is contained in:
1 parent
485c11de5f
commit
08cdf44b67
16 files changed
+240
-23
No files matched your search
@@ -3,6 +3,8 @@
|
||||
namespace app\modules\tgbot\controllers;
|
||||
|
||||
use app\modules\tgbot\models\Tgbot;
|
||||
use kernel\app_modules\tag\service\TagService;
|
||||
use kernel\modules\post\models\Post;
|
||||
|
||||
class TgBotRestController extends \kernel\app_modules\tgbot\controllers\TgBotRestController
|
||||
{
|
||||
@@ -12,9 +14,15 @@ class TgBotRestController extends \kernel\app_modules\tgbot\controllers\TgBotRes
|
||||
$dialog = Tgbot::where("dialog_id", $id)->first();
|
||||
if ($dialog){
|
||||
$this->renderApi([
|
||||
'html' => '<a class="btn btn-primary" href="/miniapp/scan">Сканировать</a>',
|
||||
'html' => '<a class="btn btn-primary" href="/miniapp/scanner">Сканировать</a>',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function actionGetNews(): void
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,7 +3,9 @@
|
||||
namespace app\modules\tgbot\controllers;
|
||||
|
||||
use app\modules\tgbot\models\Tgbot;
|
||||
use app\modules\tgbot\services\TgBotService;
|
||||
use Cassandra\Decimal;
|
||||
use kernel\app_modules\card\models\Card;
|
||||
use kernel\app_modules\tag\service\TagService;
|
||||
use kernel\Controller;
|
||||
use kernel\helpers\Debug;
|
||||
@@ -40,4 +42,16 @@ class TgMainController extends Controller
|
||||
$this->cgView->render("news.php", ['news' => $news]);
|
||||
}
|
||||
|
||||
public function actionScanner(): void
|
||||
{
|
||||
$this->cgView->render("scanner.php");
|
||||
}
|
||||
|
||||
public function actionCardAction(int $cardId): void
|
||||
{
|
||||
$card = Card::where("id", $cardId)->first();
|
||||
|
||||
$this->cgView->render("card_action.php", ['card' => $card]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace app\modules\tgbot\middlewares;
|
||||
|
||||
use app\modules\tgbot\models\Tgbot;
|
||||
use app\modules\tgbot\services\TgBotService;
|
||||
use kernel\Middleware;
|
||||
|
||||
class TgBotAuthMiddleware extends Middleware
|
||||
{
|
||||
|
||||
function handler(): void
|
||||
{
|
||||
if(isset($_COOKIE['dialog_id']))
|
||||
{
|
||||
$model = Tgbot::where("dialog_id", $_COOKIE['dialog_id'])->first();
|
||||
if ($model){
|
||||
TgBotService::$currentDialog = $model;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
exit();
|
||||
}
|
||||
}
|
||||
@@ -5,9 +5,14 @@ use kernel\CgRouteCollector;
|
||||
|
||||
include KERNEL_APP_MODULES_DIR . "/tgbot/routs/tgbot.php";
|
||||
|
||||
App::$collector->filter("tg_bot_auth", [\app\modules\tgbot\middlewares\TgBotAuthMiddleware::class, "handler"]);
|
||||
|
||||
App::$collector->group(["prefix" => "miniapp"], function (CGRouteCollector $router) {
|
||||
App::$collector->get('/', [\app\modules\tgbot\controllers\TgMainController::class, 'actionMain']);
|
||||
App::$collector->get('/news', [\app\modules\tgbot\controllers\TgMainController::class, 'actionNews']);
|
||||
App::$collector->get('/promo', [\app\modules\tgbot\controllers\TgMainController::class, 'actionPromo']);
|
||||
App::$collector->group(["before" => "tg_bot_auth"], function (CGRouteCollector $router){
|
||||
App::$collector->get('/news', [\app\modules\tgbot\controllers\TgMainController::class, 'actionNews']);
|
||||
App::$collector->get('/promo', [\app\modules\tgbot\controllers\TgMainController::class, 'actionPromo']);
|
||||
App::$collector->get('/scanner', [\app\modules\tgbot\controllers\TgMainController::class, 'actionScanner']);
|
||||
App::$collector->get('/card_action/{cardId}', [\app\modules\tgbot\controllers\TgMainController::class, 'actionCardAction']);
|
||||
});
|
||||
});
|
||||
@@ -12,4 +12,6 @@ use kernel\services\ModuleService;
|
||||
class TgBotService extends \kernel\app_modules\tgbot\services\TgBotService
|
||||
{
|
||||
|
||||
public static null|Tgbot $currentDialog = null;
|
||||
|
||||
}
|
||||
@@ -22,6 +22,7 @@
|
||||
<link rel="stylesheet" href="<?= $resources ?>/css/style.css">
|
||||
<link rel="stylesheet" href="<?= $resources ?>/css/tgApp.css">
|
||||
<script src="https://telegram.org/js/telegram-web-app.js"></script>
|
||||
<script src="https://unpkg.com/html5-qrcode" type="text/javascript"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
/**
|
||||
* @var \kernel\app_modules\card\models\Card $card
|
||||
*/
|
||||
|
||||
|
||||
use kernel\helpers\Html;
|
||||
|
||||
?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12 m-1">
|
||||
<?php
|
||||
echo Html::img(src: "data:image/png;base64, " . \kernel\app_modules\card\services\CardFileService::createCardPNG($card, true));
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12 m-1">
|
||||
<a class="btn btn-primary" href="/miniapp/add_purchase">Добавить покупку</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,30 @@
|
||||
<div id="tg_app">
|
||||
|
||||
</div>
|
||||
<div id="scanner_box"></div>
|
||||
<script>
|
||||
function domReady(fn) {
|
||||
if (
|
||||
document.readyState === "complete" ||
|
||||
document.readyState === "interactive"
|
||||
) {
|
||||
setTimeout(fn, 1000);
|
||||
} else {
|
||||
document.addEventListener("DOMContentLoaded", fn);
|
||||
}
|
||||
}
|
||||
|
||||
domReady(function () {
|
||||
|
||||
// If found you qr code
|
||||
function onScanSuccess(decodeText, decodeResult) {
|
||||
window.location.href = "/miniapp/card_action/" + decodeText;
|
||||
}
|
||||
|
||||
let htmlscanner = new Html5QrcodeScanner(
|
||||
"scanner_box",
|
||||
{fps: 10, qrbox: {width: 250, height: 250}},
|
||||
);
|
||||
htmlscanner.render(onScanSuccess);
|
||||
});
|
||||
</script>
|
||||
@@ -52,7 +52,7 @@ class CardFileService
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function createCardPNG(Card $card): false|string
|
||||
public static function createCardPNG(Card $card, bool $returnBase64 = false): false|string
|
||||
{
|
||||
if ($card->cardTemplate) {
|
||||
$formatter = BankFormatter::create();
|
||||
@@ -65,7 +65,9 @@ class CardFileService
|
||||
$uploadDir = "/resources/cards/";
|
||||
$uploadDirUri = $uploadDir . mb_substr($newFileName, 0, 2) . '/' . mb_substr($newFileName, 2, 2) . '/';
|
||||
$oldMask = umask(0);
|
||||
mkdir(ROOT_DIR . $uploadDirUri, 0775, true);
|
||||
if (!file_exists(ROOT_DIR . $uploadDirUri)){
|
||||
mkdir(ROOT_DIR . $uploadDirUri, 0775, true);
|
||||
}
|
||||
umask($oldMask);
|
||||
$uploadFileDir = ROOT_DIR . $uploadDirUri;
|
||||
|
||||
@@ -108,9 +110,14 @@ class CardFileService
|
||||
$cardSettings['qr_box_height'] ?? 135,
|
||||
100
|
||||
);
|
||||
$img->save($uploadFileDir . $newFileName);
|
||||
if ($returnBase64){
|
||||
return $img->getBase64();
|
||||
}
|
||||
else {
|
||||
$img->save($uploadFileDir . $newFileName);
|
||||
|
||||
return $uploadDirUri . $newFileName;
|
||||
return $uploadDirUri . $newFileName;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -39,7 +39,7 @@ $table->rows([
|
||||
$table->create();
|
||||
$table->render();
|
||||
|
||||
echo \kernel\helpers\Html::img(\kernel\app_modules\card\services\CardFileService::createCardPNG($card));
|
||||
echo \kernel\helpers\Html::img("data:image/png;base64, " . \kernel\app_modules\card\services\CardFileService::createCardPNG($card, true));
|
||||
|
||||
//$writer = new PngWriter();
|
||||
//
|
||||
|
||||
@@ -40,6 +40,17 @@ class ImageGD
|
||||
imagedestroy($this->img);
|
||||
}
|
||||
|
||||
public function getBase64(): string
|
||||
{
|
||||
ob_start ();
|
||||
imagepng($this->img);
|
||||
$image_data = ob_get_contents ();
|
||||
ob_end_clean ();
|
||||
|
||||
imagedestroy($this->img);
|
||||
return base64_encode ($image_data);
|
||||
}
|
||||
|
||||
public function makeCornersForImage($radius, $background): void
|
||||
{
|
||||
// включаем режим сопряжения цветов
|
||||
|
||||
+26
-9
@@ -1,18 +1,35 @@
|
||||
|
||||
import {Cookie} from "./tg_app/Cookie.js";
|
||||
import {TgApp} from "./tg_app/TgApp.js";
|
||||
import Router from "./tg_app/Router.js";
|
||||
import {SimpleRouter} from "./tg_app/SimpleRouter.js";
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
let tg = window.Telegram.WebApp;
|
||||
let tgApp = new TgApp("tg_app", tg.initDataUnsafe.user.id);
|
||||
|
||||
const router = new Router({
|
||||
mode: 'hash',
|
||||
root: '/miniapp'
|
||||
});
|
||||
// const router = new Router({
|
||||
// mode: 'hash',
|
||||
// root: '/miniapp'
|
||||
// });
|
||||
|
||||
router
|
||||
.add('', () => {
|
||||
const cookie = new Cookie();
|
||||
const routes = {
|
||||
'/miniapp': () => {
|
||||
cookie.setCookie("dialog_id", tg.initDataUnsafe.user.id, 3)
|
||||
tgApp.actionMain();
|
||||
});
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
// Инициализация роутера
|
||||
const router = new SimpleRouter(routes);
|
||||
|
||||
// const router
|
||||
// .add('/', () => {
|
||||
// cookie.setCookie("dialog_id", tg.initDataUnsafe.user.id, 3)
|
||||
// tgApp.actionMain();
|
||||
// })
|
||||
// .add('/scanner', () => {
|
||||
// tgApp.createScanner();
|
||||
// });
|
||||
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
class Cookie {
|
||||
setCookie(name,value,days) {
|
||||
var expires = "";
|
||||
if (days) {
|
||||
var date = new Date();
|
||||
date.setTime(date.getTime() + (days*24*60*60*1000));
|
||||
expires = "; expires=" + date.toUTCString();
|
||||
}
|
||||
document.cookie = name + "=" + (value || "") + expires + "; path=/";
|
||||
}
|
||||
getCookie(name) {
|
||||
var nameEQ = name + "=";
|
||||
var ca = document.cookie.split(';');
|
||||
for(var i=0;i < ca.length;i++) {
|
||||
var c = ca[i];
|
||||
while (c.charAt(0)===' ') c = c.substring(1,c.length);
|
||||
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
eraseCookie(name) {
|
||||
document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
|
||||
}
|
||||
}
|
||||
|
||||
export {Cookie}
|
||||
@@ -0,0 +1,33 @@
|
||||
class SimpleRouter {
|
||||
constructor(routes) {
|
||||
this.routes = routes;
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
// window.addEventListener('popstate', () => this.route());
|
||||
// document.addEventListener('DOMContentLoaded', () => this.route());
|
||||
// document.addEventListener('click', (e) => {
|
||||
// if (e.target.tagName === 'A') {
|
||||
// e.preventDefault();
|
||||
// this.navigate(e.target.href);
|
||||
// }
|
||||
// });
|
||||
this.route();
|
||||
}
|
||||
|
||||
navigate(path) {
|
||||
window.history.pushState({}, '', path);
|
||||
this.route();
|
||||
}
|
||||
|
||||
route() {
|
||||
const path = window.location.pathname;
|
||||
const route = this.routes[path] || this.routes['/404'];
|
||||
if (route) {
|
||||
route();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {SimpleRouter}
|
||||
@@ -6,10 +6,9 @@ class TgApp {
|
||||
this.userId = userId;
|
||||
this.btnBox = this.createBox("btnBox");
|
||||
this.container.appendChild(this.btnBox);
|
||||
console.log(userId)
|
||||
}
|
||||
|
||||
actionMain(){
|
||||
actionMain() {
|
||||
this.createCardBox();
|
||||
|
||||
// this.createDefaultBox();
|
||||
@@ -56,7 +55,7 @@ class TgApp {
|
||||
})
|
||||
}
|
||||
|
||||
getScanBtn(){
|
||||
getScanBtn() {
|
||||
fetch(config.config.apiUrl + `api/tg-bot/get-scan-btn/${this.userId}`, {
|
||||
method: 'GET', // Здесь так же могут быть GET, PUT, DELETE
|
||||
headers: {
|
||||
@@ -71,15 +70,27 @@ class TgApp {
|
||||
})
|
||||
}
|
||||
|
||||
createBox(id){
|
||||
createBox(id) {
|
||||
let box = document.createElement("div");
|
||||
box.setAttribute("id", id);
|
||||
|
||||
return box;
|
||||
}
|
||||
|
||||
getAction(action){
|
||||
if (action === "actionMain"){
|
||||
// createScanner() {
|
||||
// let html5QrcodeScanner = new Html5QrcodeScanner(
|
||||
// "scanner_box",
|
||||
// {fps: 10, qrbox: {width: 250, height: 250}},
|
||||
// /* verbose= */ false);
|
||||
// html5QrcodeScanner.render(this.onScanSuccess);
|
||||
// }
|
||||
|
||||
onScanSuccess(decodedText, decodedResult) {
|
||||
console.log(`Code matched = ${decodedText}`, decodedResult);
|
||||
}
|
||||
|
||||
getAction(action) {
|
||||
if (action === "actionMain") {
|
||||
return this.actionMain;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
var __Html5QrcodeLibrary__;(()=>{var t={449:function(t,e,r){!function(t){"use strict";function e(t){return null==t}var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};var i,o=function(t){function e(e){var r,n,i,o=this.constructor,s=t.call(this,e)||this;return Object.defineProperty(s,"name",{value:o.name,enumerable:!1}),r=s,n=o.prototype,(i=Object.setPrototypeOf)?i(r,n):r.__proto__=n,function(t,e){void 0===e&&(e=t.constructor);var r=Error.captureStackTrace;r&&r(t,e)}(s),s}return function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}(e,t),e}(Error);class s extends o{constructor(t=undefined){super(t),this.message=t}getKind(){return this.constructor.kind}}s.kind="Exception";class a extends s{}a.kind="ArgumentException";class c extends s{}c.kind="IllegalArgumentException";class l{constructor(t){if(this.binarizer=t,null===t)throw new c("Binarizer must be non-null.")}getWidth(){return this.binarizer.getWidth()}getHeight(){return this.binarizer.getHeight()}getBlackRow(t,e){return this.binarizer.getBlackRow(t,e)}getBlackMatrix(){return null!==this.matrix&&void 0!==this.matrix||(this.matrix=this.binarizer.getBlackMatrix()),this.matrix}isCropSupported(){return this.binarizer.getLuminanceSource().isCropSupported()}crop(t,e,r,n){const i=this.binarizer.getLuminanceSource().crop(t,e,r,n);return new l(this.binarizer.createBinarizer(i))}isRotateSupported(){return this.binarizer.getLuminanceSource().isRotateSupported()}rotateCounterClockwise(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise();return new l(this.binarizer.createBinarizer(t))}rotateCounterClockwise45(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise45();return new l(this.binarizer.createBinarizer(t))}toString(){try{return this.getBlackMatrix().toString()}catch(t){return""}}}class h extends s{static getChecksumInstance(){return new h}}h.kind="ChecksumException";class u{constructor(t){this.source=t}getLuminanceSource(){return this.source}getWidth(){return this.source.getWidth()}getHeight(){return this.source.getHeight()}}class d{static arraycopy(t,e,r,n,i){for(;i--;)r[n++]=t[e++]}static currentTimeMillis(){return Date.now()}}class f extends s{}f.kind="IndexOutOfBoundsException";class g extends f{constructor(t=undefined,e=undefined){super(e),this.index=t,this.message=e}}g.kind="ArrayIndexOutOfBoundsException";class w{static fill(t,e){for(let r=0,n=t.length;r<n;r++)t[r]=e}static fillWithin(t,e,r,n){w.rangeCheck(t.length,e,r);for(let i=e;i<r;i++)t[i]=n}static rangeCheck(t,e,r){if(e>r)throw new c("fromIndex("+e+") > toIndex("+r+")");if(e<0)throw new g(e);if(r>t)throw new g(r)}static asList(...t){return t}static create(t,e,r){return Array.from({length:t}).map((t=>Array.from({length:e}).fill(r)))}static createInt32Array(t,e,r){return Array.from({length:t}).map((t=>Int32Array.from({length:e}).fill(r)))}static equals(t,e){if(!t)return!1;if(!e)return!1;if(!t.length)return!1;if(!e.length)return!1;if(t.length!==e.length)return!1;for(let r=0,n=t.length;r<n;r++)if(t[r]!==e[r])return!1;return!0}static hashCode(t){if(null===t)return 0;let e=1;for(const r of t)e=31*e+r;return e}static fillUint8Array(t,e){for(let r=0;r!==t.length;r++)t[r]=e}static copyOf(t,e){return t.slice(0,e)}static copyOfUint8Array(t,e){if(t.length<=e){const r=new Uint8Array(e);return r.set(t),r}return t.slice(0,e)}static copyOfRange(t,e,r){const n=r-e,i=new Int32Array(n);return d.arraycopy(t,e,i,0,n),i}static binarySearch(t,e,r){void 0===r&&(r=w.numberComparator);let n=0,i=t.length-1;for(;n<=i;){const o=i+n>>1,s=r(e,t[o]);if(s>0)n=o+1;else{if(!(s<0))return o;i=o-1}}return-n-1}static numberComparator(t,e){return t-e}}class m{static numberOfTrailingZeros(t){let e;if(0===t)return 32;let r=31;return e=t<<16,0!==e&&(r-=16,t=e),e=t<<8,0!==e&&(r-=8,t=e),e=t<<4,0!==e&&(r-=4,t=e),e=t<<2,0!==e&&(r-=2,t=e),r-(t<<1>>>31)}static numberOfLeadingZeros(t){if(0===t)return 32;let e=1;return t>>>16==0&&(e+=16,t<<=16),t>>>24==0&&(e+=8,t<<=8),t>>>28==0&&(e+=4,t<<=4),t>>>30==0&&(e+=2,t<<=2),e-=t>>>31,e}static toHexString(t){return t.toString(16)}static toBinaryString(t){return String(parseInt(String(t),2))}static bitCount(t){return t=(t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135,63&(t+=t>>>8)+(t>>>16)}static truncDivision(t,e){return Math.trunc(t/e)}static parseInt(t,e=undefined){return parseInt(t,e)}}m.MIN_VALUE_32_BITS=-2147483648,m.MAX_VALUE=Number.MAX_SAFE_INTEGER;class p{constructor(t,e){void 0===t?(this.size=0,this.bits=new Int32Array(1)):(this.size=t,this.bits=null==e?p.makeArray(t):e)}getSize(){return this.size}getSizeInBytes(){return Math.floor((this.size+7)/8)}ensureCapacity(t){if(t>32*this.bits.length){const e=p.makeArray(t);d.arraycopy(this.bits,0,e,0,this.bits.length),this.bits=e}}get(t){return 0!=(this.bits[Math.floor(t/32)]&1<<(31&t))}set(t){this.bits[Math.floor(t/32)]|=1<<(31&t)}fLine truncated
|
||||
|
||||
export {Html5QrcodeScanner};
|
||||
Reference in new issue
Block a user