Постараюсь поделиться своей библиотекой для работы API VK.

Причины создания

Однажды я задался мыслью узнать, что нужно для того, чтобы создать чат-бота используя С++. Первое, что я сделал - начал искать готовые решения, и нашёл эту библиотеку. Она, если честно, совсем мне не понравилась, как и большинству моих знакомых. К её главным недостаткам можно отнести неоднородный дизайн и недостаточно полно описанный модуль работы с сетью. В общем, я решил создать свой "аналог".

Что касается вопроса из заголовка - не знаю :), хотелось дать возможность пишущим на С++ разработчикам поработать с ВК не меняя своих привычек.

Краткий обзор

Библиотека разделена на 2 части: первая - так называемый runtime-модуль, который содержит в себе

  • код для работы с сетью;

  • инструменты для базовых операций над строками;

  • некоторые настройки для логгера;

  • обработчики системных сигналов (обдумывается их полное удаление, ровно как и удаление трассировки стека).

Вторая часть - VK-модуль, содержит

  • код для работы со вложениями, клавиатурой, событиями, long poll и механизмом OAuth;

  • удобный интерфейс для конструирования запросов к VK API.

Цели

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

  • Приемлимая производительность. Библиотека достаточно хорошо работает в многопоточных системах, полностью скрывая детали реализации асинхронного выполнения от пользователя.

Простой пример

Минимальный бот, слушающий события будет выглядеть так:

#include "cpp_vk_lib/runtime/setup_logger.hpp"
#include "cpp_vk_lib/runtime/signal_handlers.hpp"
#include "cpp_vk_lib/vk/long_poll/long_poll.hpp"
#include "cpp_vk_lib/vk/config/config.hpp"
#include "cpp_vk_lib/vk/events/message_new.hpp"
#include "cpp_vk_lib/vk/methods/basic.hpp"

#include <iostream>

int main(int argc, char* argv[])
{
    if (argc != 2) {																																																																																				
        std::cerr << "Usage: ./long_poll <config.json>" << std::endl;
        return 1;
    }

    vk::config::load(argv[1]);
    runtime::setup_signal_handlers();
    runtime::setup_logger(spdlog::level::level_enum::trace);

    asio::io_context io_context;
    vk::long_poll api(io_context);

    api.on_event(vk::event::type::message_new, [](const vk::event::common& event) {
        vk::event::message_new message = event.get_message_new();
        vk::method::messages::send(message.peer_id(), "response");
    });
    api.run();
}

В заключение

Репозиторий. В данный момент ведутся некоторые работы по переработке сетевого модуля. В дальнейшем планируется реализовать long poll для пользователя, также есть желание немного доработать документацию.

В общем, надеюсь кого-то я смог заинтересовать.

Комментарии (2)


  1. robertd
    04.01.2022 10:43
    +4

    Она, если честно, совсем мне не понравилась, как и большинству моих
    знакомых. К её главным недостаткам можно отнести неоднородный дизайн и
    недостаточно полно описанный модуль работы с сетью.

    Было бы полезно в деталях разобрать, чем изначальная, сравнительно лаконичная библиотека, так уж плоха, кроме NIH, по сравнению с вашей. И, отдельно, почему вы решили с нуля писать, а не слать патчи, чтобы получить фидбек по стилю, идеям и если очень повезет, развернутый ответ почему сделано именно так. Думаю, когда бы вы писали подобное, желание переписывать с нуля пропало бы. Так или иначе, это, судя по всему, какая-то учебная работа, ловите новогодний плюс и инвайт


    1. epoll-reactor Автор
      05.01.2022 16:34

      Благодарю за инвайт. Начнём с того, что я не говорил, что уже существующая библиотека плоха и не подходит никому. Она не понравилась мне потому что она вынуждает реализовывать элементарный функционал связанный с сетью вручную. Учитывая контекст её потенциального использования -- создание ботов, где часто нужна возможность загружать/скачивать файлы. Имеющийся код работы с сетью работает медленно в одном потоке и фатально медленно в нескольких за счёт отсутствия кеширования, создания и удаления CURL* при каждом запросе. Также эта библиотека вынуждает очень много работать с JSON непосредственно. Нет удобного способа работать с Long Poll. Поддерживаются не все типы вложений, к тому же интерфейс работы с ними достаточно неудобен.

      Каков смысл пытаться договориться с автором насчёт тех или иных решений, если на мой субъективный вкус библиотека, решающая примерно ту же задачу должна выглядеть совершенно по-другому? Более того, у неё другие требования к переносимости.

      P.S проект не учебный, используется по назначению.