avbot 结构解释

Posted on April 28, 2013

avbot 由 4 大部分构成 libavbot libavlog botctl avbotrpc

   +----------+            +----------+        +----------+
   | libavlog |            | libavbot | ---+---| libwebqq |
   +----------+\         / +----------+    |   +----------+
                 main.cpp                  |   
   +----------+/         \ +----------+    |   +----------+
   |  botctl  |           \| avbotrpc |    +---| libxmpp  |  
   +----------+            +----------+    |   +----------+
                                           |
                                           |   +----------+
                                           +---+  libirc  |
                                           |   +----------+
                                           |
                                           |   +------------------+
                                           +---+  libmailexchange |
                                               +------------------+

中间由 main.cpp 作为胶水粘合。


libavlog 的任务是生成日志文件,botctl 的用处是实现 .qqbot 控制指令。 avbotrcp 用于实现 JSON-RPC

libavbot 则是核心功能。


libavbot 由 libwebqq libirc libxmpp libmailexchange 4个子协议组成。

libmailexchange 同时又分 libsmtp libpop3 和 libInternetMailForamt 3个小模块。


衔接 libavlog botctl avbotrpc 和 libavbot 的东西就是 class avbot 的一个成员 on_message.

在 main.cpp 里,包含了 mybot.on_message.connect(XXX) 调用,将 avbot 和 其他3 个模块衔接起来。

  // 记录到日志.
  mybot.on_message.connect(boost::bind(avbot_log, _1, boost::ref(mybot)));
  // 开启 bot 控制.
  mybot.on_message.connect(boost::bind(my_on_bot_command, _1, boost::ref(mybot)));

以及

static void avbot_rpc_server(boost::shared_ptr<boost::asio::ip::tcp::socket> m_socket, avbot & mybot)
{
	detail::avbot_rpc_server(m_socket, mybot.on_message);
}

on_message 是一个 boost::signals , 每当 QQ/IRC/XMPP/pop3 收到消息的时候就发起这个信号。libavlog 解析这个信号,然后将消息写入日志。avbotrpc 解析这个信号,然后返回给调用者。botctl 解析这个信号,提取其中的消息,识别其中的命令,然后写入日志文件。

libavbot 则实现了消息转发和群组功能。libavbot 并不藉由自己全部实现协议,而是交给了 libwebqq libirc libmailexchange 和 libxmpp 4 个协议库去实现协议。

libwebqq 从 pidgin-lwqq 项目借用了大量的代码,然后将其从 C 语言改写为安全的 Boost 形式。使用了 avhttp 这个 avplayer 社区发起的 HTTP 库进行Web访问。

libirc 由 “猫” 贡献,非常的简单。

libxmpp 是 gloox 的一层包装。将 gloox 包装为融入 Boost.Asio 中。而无需另外的线程跑其EventLoop。libxmpp 使用了一些Hack技巧将 gloox 改造为了 可以使用 Boost.Asio.

libmailexchange 包含了 libInternetMailForamt 库用于解析复杂的 Internet Mail Foramt, 以及两个小库用户执行 POP3 接收和 SMTP 发送。

Comments