// This Source Code Form is subject to the terms of the Mozilla Public // License, version 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #include "plugin.hh" #include "strophe.hh" #define WEECHAT_XMPP_PLUGIN_NAME "xmpp" #define WEECHAT_XMPP_PLUGIN_VERSION "0.2.0" namespace c { extern "C" { #include "plugin.h" #include "config.h" #include "account.h" #include "connection.h" #include "command.h" #include "input.h" #include "buffer.h" #include "completion.h" struct t_weechat_plugin *weechat_xmpp_plugin() { return (struct t_weechat_plugin*)&*weechat::globals::plugin; }; const char *weechat_xmpp_plugin_name() { return WEECHAT_XMPP_PLUGIN_NAME; }; const char *weechat_xmpp_plugin_version() { return WEECHAT_XMPP_PLUGIN_VERSION; }; } } namespace weechat { plugin::plugin() // try not to think about it too hard : plugin(nullptr) { } plugin::plugin(struct t_weechat_plugin* plugin) : std::reference_wrapper(*plugin) { } bool plugin::init(std::vector) { if (!c::config__init()) { weechat::printf(nullptr, "%s: Error during config init", this->name()); return false; } c::config__read(); c::connection__init(); c::command__init(); c::completion__init(); this->m_process_timer = weechat::hook_timer(plugin::timer_interval_sec * 1000, 0, 0, &c::account__timer_cb); if (!weechat::bar_search("typing")) { weechat::bar_new("typing", "off", "400", "window", "${typing}", "bottom", "horizontal", "vertical", "1", "1", "default", "default", "default", "default", "off", "xmpp_typing"); } this->m_typing_bar_item = weechat::bar_item_new("xmpp_typing", (char* (*)(const void*, void*, t_gui_bar_item*, t_gui_window*, t_gui_buffer*, t_hashtable*))( &c::buffer__typing_bar_cb)); weechat::hook_signal("input_text_changed", &c::input__text_changed_cb); return true; } bool plugin::end() { this->m_typing_bar_item.reset(); this->m_process_timer.reset(); c::config__write(); c::account__disconnect_all(); c::account__free_all(); xmpp::shutdown(); return true; } std::string_view plugin::name() const { return plugin_get_name(*this); } weechat::plugin globals::plugin; hook::hook(struct t_hook* hook) : std::reference_wrapper(*hook) { } hook::~hook() { weechat::unhook(*this); } gui_bar_item::gui_bar_item(struct t_gui_bar_item* item) : std::reference_wrapper(*item) { } gui_bar_item::~gui_bar_item() { weechat::bar_item_remove(*this); } } extern "C" { WEECHAT_PLUGIN_NAME(WEECHAT_XMPP_PLUGIN_NAME); WEECHAT_PLUGIN_DESCRIPTION(N_("XMPP client protocol")); WEECHAT_PLUGIN_AUTHOR("bqv "); WEECHAT_PLUGIN_VERSION(WEECHAT_XMPP_PLUGIN_VERSION); WEECHAT_PLUGIN_LICENSE("MPL2"); WEECHAT_PLUGIN_PRIORITY(5500); weechat::rc weechat_plugin_init(struct t_weechat_plugin *plugin, int argc, char *argv[]) { weechat::globals::plugin = (struct weechat::t_weechat_plugin*)plugin; std::vector args(argv, argv+argc); return weechat::globals::plugin.init(args) ? WEECHAT_RC_OK : WEECHAT_RC_ERROR; } weechat::rc weechat_plugin_end(struct t_weechat_plugin *) { return weechat::globals::plugin.end() ? WEECHAT_RC_OK : WEECHAT_RC_ERROR; } }