irc聊天(lobby.cpp、dialogs/chat.cpp)

之前想给rose增加个聊天模块,采用irc协议,lobby.cpp和chat.cpp就用于实现这个这个功能。这是好多年前的事了,现在即使要做聊天,估计不会用irc,但之前界面或许可以给将来用,也就是一直让放着。

一旦启动irc模块,会在后台向“chat.freenode.net:6667”收发消息,在发行基于rose的app时,要关闭这个模块。

 

一、如何关闭irc聊天模块

将tlobby::enable_chat_值改为false。如何改见下面的“tlobby构造函数”。

系统时间片会调用lobby->pump(),后者一旦发现enable_chat_是false,就会啥也不干,立即返回,等于关闭了聊天模块。

 

二、聊天模块一些说明

2.1 tlobby构造函数

tlobby::tlobby(tchat_sock* _chat)
	: chat(_chat)
	, handlers_()
	, log_handlers_()
	, logs_()
	, enable_chat_(true)

如果想关闭聊天模块,把enable_chat_置为false。

{
	socks_.push_back(chat);

	chat->set_host("chat.freenode.net", 6667); // 6665
	std::string nick = group.leader().name();
	if (nick.empty()) {
		nick = "ancientcc";

如果配置中存的nick是空,那用“ancientcc”,irc要求一个非空昵称登录服务器。如果是商业代码,应该去掉这个if块。改为在外面调用set_nick2,像lobby->set_nick2("myaccount"),从而实现下面这逻辑。

  1. tlobby::tlobby调用一个nick是空的set_nick2,等于啥也没做。
  2. 外面调用lobby->set_nick2("myaccount"),让用“myaccount”昵称登录。
	}
	set_nick2(nick);
}

set_host()用于设置要连接哪个irc服务器。或许吧,要是一直连不上的话,可以换下端口号。

set_nick2()用于设置要登录irc服务器的昵称。

 

2.2 日志文件

聊天日志存储在用户目录下的data/history.log,示例:<launncher>/data/data/history.log。内中格式是私有的,不是protobuf。

图1 日志文件(history.log)格式

对history.log,有一个要求是针对某个聊天对象的记录要存储在一块,即中间不能穿插他人记录。launcher中的center也有个聊天,那里存储用的格式是protobuf。在center,聊天对像只有机器人,也就不存在穿插问题。

 

三、dialogs/chat.cpp

chat.cpp用于实现一个聊天界面。

gui2::tchat_slot slot;
gui2::tchat2 dlg(slot, "chat_module");
dlg.show();

以上是弹出聊天界面代码。tchat2支持横、竖屏,内中用了一个“_chat”的双朝向模板控件。以修改竖屏为例说下如何修改模板控件中内容。

  1. 运行rose studio,打开<apps-res>/data/gui/default/window/chat.cfg。
  2. 拆散id是“chat_module”的控件。弹出的“横屏、竖屏”中选择竖屏。
  3. 修改内容。
  4. 保存。回到id是“chat_module”的控件,“合成模板控件”,出来的“横屏、竖屏”中选择竖屏,确认没问题,单击“修改”。

修改是就地修改,_chat模块控件对应的脚本文件是<apps-res>/data/gui/default/tpl_widget/_chat.cfg。

若要修改横屏内容,只要在“拆散、合成”时都换为选择横屏。

在横屏时,tchat2实现的消息输入框和常见的聊天软件差不多,针对移动设备,会在底部出来软键盘,然后输入框改布局在软键盘上面。由于同时存在输入框、软键盘这两个高度,这时留给上面显示消息列表的就没多少了。对launcher中的center,它没用tchat2,一个主要原因就是tchat2在横屏时有这个显示消息太少问题,而且,launcher可能是只会运行在横屏,不会是竖屏。

全部评论: 0

    写评论: