MandaGram MandaGram

Примеры на C++, Rust, Zig и D

7 мин чтения 4 раздела

Пример на C++

Плагин перехватывает отправку сообщений и форматирует текст:

examples/cpp/plugin.cpp
#include "mandagram_plugin.hpp"
#include <string>
#include <algorithm>

static bool OnSendMessage(int64_t chat_id, char** text_ptr) {
    if (!text_ptr || !*text_ptr) return true;
    std::string s(*text_ptr);
    // Преобразуем команду .shout в верхний регистр
    if (s.rfind(".shout ", 0) == 0) {
        s = s.substr(7);
        for (auto& c : s) c = toupper(c);
        *text_ptr = strdup(s.c_str());
    }
    return true;
}

MANDAGRAM_EXPORT bool mandagram_plugin_init(const PluginApi* api) {
    api->register_message_send_hook(OnSendMessage);
    return true;
}

Пример на Rust

Использование cdylib в Cargo.toml:

examples/rust/src/lib.rs
use std::ffi::{CStr, c_char};

#[no_mangle]
pub extern "C" fn mandagram_plugin_init(api: *const PluginApi) -> bool {
    unsafe {
        if let Some(log) = (*api).log_info {
            log(b"Rust plugin initialized!".as_ptr() as *const c_char);
        }
    }
    true
}

Пример на Zig

examples/zig/plugin.zig
const std = @import("std");

export fn mandagram_plugin_init(api: *const PluginApi) bool {
    api.log_info("Zig plugin active on MandaGram Desktop!");
    return true;
}

Пример на D (betterC)

Компиляция без рантайма языка (D runtime) даёт ультралегковесный .dll размером всего несколько килобайт:

examples/d/plugin.d
import core.stdc.stdio;

extern(C) export bool mandagram_plugin_init(const PluginApi* api) {
    api.log_info("D -betterC plugin hooked successfully");
    return true;
}