FS [include] QRCode

vawylon

Участник
Автор темы
7
62

qrcode.inc

img_1609600445__poster.png

Здраствуйте дорогие форумчане! В моей голове уже давно лежит идея инклуйда который позволит рисовать QR код в игре с помощью текстдравов, но была одна проблема.
Проблема заключалась в том, что в qrcode даже в самом малом содержится около 300 пикселей, что никак не входит в лимиты сампа и так просто не получится по пиксельно его нарисовать.
Мне пришлось сжать QRcode путём парсинга пикселей с лево на право и записать их как строку, ещё хитрость в том, что я посчитывал сколько пикселей в одной линии, а когда рисовал qr код я растягивал тексдрав на ширину пикселей. В общем я сложил всё в голове и принял решение всё выйдет.

У QR кодов огромный потенциал в сфере SAMP. Данный иклуйд разрушает стену межу игроком и окном браузера. Как мы знаем в MTA есть возможность показать окно браузера, но в samp - нет.
Я считаю данный инклуйд частично разрушит стену и позволит разработчикам открыть двери в разработки систем. Вот как я оцениваю потенциал:
Упрощение процедуры заполнения формы сборов средств;
Редирект на страницу оплаты или полный отказ формы доната на сайте;
Система безопасности ( вход по типу http://web.wathsapp.com/ );
Показывать QR код с ссылкой на ресурс;
И многое другое!

Данный инклуйд работает с поддержкой PHP. PHP генерирует и сжжимает QR код без PHP никуда.
В PHP присутствует библиотека для генерации QR кода ссылка на GITHUB
qrcode.inc использует
sscanf2 - github.com

mysql - github.com

Загружаем структуру базы данных:
в папке MySQL содержится структура базы данных. Установите её.


Установка и настройка php:
1. Распакуйте содержимое архива.
2. Откройте файл из "../php/qr/settings.php";
3. Настроить mysql.
Код:
$MYSQL_SERVER = ''; // ip сервера MySQL
$MYSQL_USER = ''; // пользователь MySQL
$MYSQL_PASS =''; // пароль MySQL
$MYSQL_BD = 'qrcode'; // база данных ( по дефолту оставить так )
4. Загрузить папку "qr" из директории php на сервер с поддержкой PHP;

Установка и настройка qrcode.inc
1. Содержжимое папки pawn перенесите в папку с сервером.
2. Подключите qrcode.inc
Код:
#include <qrcode.inc>
3. укажите ссылку на файл "q.php" и "g.php"
Код:
#define QRCODE_HOST     "site.ru/qrcode/q.php" // site.ru - ваш сайт
#define QRCODE_LINK     "http:site.ru/qrcode/g.php"
// "http:" или "https:" но ставить обяательно в зависимости есть ли у вас SSL сертификат
4. Подключитесь к безе данных MySQL
Код:
public OnGameModeInit()
{
    if(QRCodeInit("host", "user", "password", "bd (по дефолту (qrcode)"))
    {
        printf("{QRCODE} = Ошибка подключения");
    }
    return 1;
}

Функции
Код:
stock QRCodeInit(SQL_HOST[], SQL_USER[], SQL_PASS[], SQL_DB[]):
/*
    SQL_HOST[] - ip сервера MySQL;
    SQL_USER[] - пользователь MySQL;
    SQL_PASS[] - пароль MySQL;
    SQL_DB[] - база данных (по стандарту "qrcode").
    Подключается к базе данных
    возвращает 1 при успешном подключении, 0 при неудачном.
*/


stock QrCodeIsSet(qrhandle[]):
/*
    qrhandle[] - Идентификатор QR кода.
    Проверяет - Существует ли QR код.
    Возвращает true - если найден QR код
    Возвращает false - база данных не подключена или QR кода не найден.
*/


stock QRCodeSet(type, qrhandle[], textqr[]):
/*
    type - тип QR кода;
    QR_CODE_TYPE_TEXT - текст;
    QR_CODE_TYPE_URL - ссылка.
    Создаёт QR код.
    Суммарное количество символов в строке QRCODE_LINK и в строке qrhandle должно быть меньше 50 символов (MAX_TEXT_QRCODE).
    Вернёт true - при успешном выполнении;
    Вернёт false - при неудачном.

    Если есть в "q.php" ошибки выведет в консоль:
    {QRCODE} ERROR: 'Q';                        [ не указан текст QR кода ]
    {QRCODE} ERROR 'T';                        [ не указан тип QR кода ]
    {QRCODE} ERROR 'H';                        [ не указан идентификатор ]
    {QRCODE} ERROR 'U';                        [ не указан QRCODE_LINK ]
    {QRCODE} has not created QRCODE. long QRCODE;             [сгенерирован слишком большой QR код ]
    {QRCODE} bad query request MySQL;                [ ошибка запроса ]
    {QRCODE} has not mysql connected.                [ файл не подключился к базе данных ]
*/


LoadQRCode(qrhandle[], qrcode[], sizeqrcode = sizeof(qrcode)):
/*
    Загрузит QR код в массив.
    qrhandle[] - идентификатор;
    qrcode[] - сюда запишет данные.

    Вернёт 1 - при удачном выполнении;
    Вернёт 0 - при неудачном. ;
    Вернёт 2 (PARSE_ERROR_MAX_SIZE) - если пикселей будет больше 256 ( не получится отобразить ограничение по лимитом sa-mp );
    Вернёт 3 (PARSE_ERROR_BAD_ARRAY) - не валидная строка данных QR кода.
*/


stock GetTypeForHandle(qrhandle[]):
/*
    qrhandle[] индентификатор к которому присвоен QR код
    Вернёт 0 если не найден QR код
    Вернёт тип QR кода если найден
*/


stock ParseString(stringqr[], qrcode[]):
/*
    Конвертирует строку "7|0|0|3|5|2|1|" в массив QR код
    Вернёт 1 при удачном выполнении;
    Вернёт 0 при неудачном. ;
    Вернёт 2 (PARSE_ERROR_MAX_SIZE) если пикселей будет больше 256 ( не получится отобразить ограничение по лимитом sa-mp );
    Вернёт 3 (PARSE_ERROR_BAD_ARRAY) не валидная строка данных QR кода.
*/


stock CreatePlayerTextDrawsQrCode(playerid, qrcode[], sizeqr, Float:x, Float: y, Float: size):
/*
    Создаёт и показывает игроку QR код.
    qrcode[] -  массив QR код;
    Float:x - позиция (0.0) верх;
    Float: y - позиция (0.0 лево;
    Float: size - размер текстдрава 0.0 - 1.0 если больше 1.0 некорректно отобразится.
*/

stock DestroyPlayerTextDrawsQrCode(playerid):
/*
    уничтожает QR код.
    playerid - id игрока;
    Вернёт true в любом случаи;
*/

Простой пример использования:
Код:
new qrcodes[1248];  // массив в котором будем хранить qr код
CMD:show(playerid, p[])
{
    new handle[64], text[128], type;
    if(sscanf(p, "p<,>s[64]s[128]d", handle, text, type))
    {
        return SendClientMessage(playerid, 0xFF4444FF, "/show [handle], [text], [type]");
    }
    if(QrCodeIsSet(handle) == 0)    // если QR код не существует
    {
        if(QRCodeSet(type, handle, text) == 0)  // создаём QR код
        {
            SendClientMessage(playerid, 0xFF4444FF, "Текст слишком большой!"); // если текст огромный, то выводим
            return 1;
        }
        format(text, sizeof(text), "QRCode {FF0000}%s{44FF44} создан, введите повторно команду", handle);
        SendClientMessage(playerid, 0x44FF44FF, text);
        return 1;
    }
    else // если QR код существует
    {
        if(LoadQRCode(handle, qrcodes)) // загружаем QR код в массив qrcodes
        {
            CreatePlayerTextDrawsQrCode(playerid, qrcodes, 120.0, 120.0, 0.0); // показываем QR код
            SendClientMessage(playerid, 0xFFCC00FF, "Наведите камеру смартфона на QR код!");
            return 1;
        }
        return SendClientMessage(playerid, 0xFF4444FF, "Ошибка загрузки QR кода!");
    }
}


Пример FS будет в директории.

Данный инклуйд пока находится в сыром варианте! Ещё много чего я хочу в нём оптимизировать.
Я надеюсь вы по полной оцените мою работу поскольку я считаю данный инклуйд действительно имеет огромный потенциал и жду ваших комментарий и самое главное советы по оптимизации.
Обязательно сообщите мне если вы нашли какие либо опечатки или ошибки в тексте!
Скачать: ЯндексДиск
https://yadi.sk/d/xGXebNB0TSc0IA


Я предлагаю услуги скриптинга:
Исправлении багов;
Написании каких либо скриптов;
Рисовании тексдравов;
всё что связано в pawn!
По всем вопросам писать в телеграмм @vawylon


Автор я: pawlo/vawylon
 

madrasso

Потрачен
883
323
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можно сделать капчу через QRCod'ы xD
 

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
Можно сделать капчу через QRCod'ы xD
Ну, во-первых, смартфоны есть далеко не у всех, есть и те, кто до сих пор пользуется старым добрым кнопочным телефоном, да и всякое бывает: камера не работает, нет подключения к интернету на телефоне. Во-вторых, чаще всего в капчах решает скорость ввода, здесь же будет решать скорость работы телефона, что ещё хуже. В-третьих, из-за особенностей сборки, а как мы знаем, TextDraw - произведение искусства и стабильной работы, этот QR-код просто будет съезжать и перестанет быть читаемым для телефонов, хотя думаю, что он итак достаточно плохо читается. Всё же не лучшая система для SAMP'a.

А вообще необходимость веб-сервера - это несомненный минус этой системы.
 
  • Нравится
Реакции: Vintik

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,860
1,851
а что если qrcode рисовать как то через окно имгуи, и проблема с заменками шрифтов отпадет, но хз, как через имгуи, если нельзя так, то посчитайте мой коммент бредом
 

MrCreepTon

Неизвестный
Всефорумный модератор
2,118
4,674
а что если qrcode рисовать как то через окно имгуи, и проблема с заменками шрифтов отпадет, но хз, как через имгуи, если нельзя так, то посчитайте мой коммент бредом
Здесь фишка в том, что тебе не нужно ничего докачивать в виде скриптов сервера : зашёл на сервер и уже можешь пользоваться QR
 

Romelo

dev.
Проверенный
540
622
а NFC когда в сампе будет, крутая штука кстати
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,860
1,851
а NFC когда в сампе будет, крутая штука кстати
ага, apple Pay, samsung pay, google pay, чтобы не запускать хостинги с сайтами оплатами, челик решил купить, хоп, приложил, сразу подписка активировалась, и продавцу ебаться не надо
 
  • Нравится
Реакции: Romelo

Gondact

Новичок
25
2
ну чето типо этого можно попробовать сделать если такое есть на ардуино
Ардуино не умеет работать с банковскими картами. Он конечно может прочитать ID Карты с помощю RFID Reader`a, но с этим ID ты нечего не сделаешь.
И еще ид по которому проходит оплата меняется каждое N время