GyverLibs / FastBot2

Очень быстрая и лёгкая библиотека Telegram бота для Arduino, ESP8266, ESP32
MIT License
34 stars 2 forks source link

Add modern callbacks for class binded functions #11

Closed LittleBuster closed 3 weeks ago

LittleBuster commented 3 weeks ago

При первоначальной проверке не взлетело, потому что vscode по какой-то неизвестной причине отказывался пересобирать библиотеку бота и сыпал ошибками. Проверил на другом остройстве с чистой IDE установил все либы заново - все нормально компилируется и дает удобный интерфейс для бинда коллбэков также как это реализовано в библиотеках вебсерверов итд

#include <Arduino.h>
#include <FastBot2.h>

void outClassTgCallback(fb::Update &u)
{
}

class MyBot
{
private:
    FastBot2    *_bot;

    void inClassUpdateCb(fb::Update &u)
    {
    }
public:
    MyBot(FastBot2 *bot): _bot(bot) { }

    void begin()
    {
        _bot->attachUpdate(std::bind(&MyBot::inClassUpdateCb, this, std::placeholders::_1));
        _bot->attachUpdate(outClassTgCallback);
    }

    void loop()
    {
        _bot->tick();
    }
};

auto tgBot = new FastBot2();
auto myBot = new MyBot(tgBot);

void setup() {
    myBot->begin();
}

void loop() {
    myBot->loop();
}
GyverLibs commented 3 weeks ago

да кстати, странно что у меня тут такие коллбэки, должны были быть как везде универсальные. Ну и бинд кстати более красиво заменяется лямбдой с capture this, как это обычно с вебсерверами и пишут

GyverLibs commented 3 weeks ago
class MyBot {
    FastBot2 bot;

   public:
    void begin() {
        bot.attachUpdate([this](fb::Update& u) {
            // ...
        });
    }
};

или ещё лучше так

class MyBot : public FastBot2 {
   public:
    using FastBot2::FastBot2;

    void begin() {
        attachUpdate([this](fb::Update& u) {
            // ...
        });
    }
};