QQ机器人程序,Joymsg,欢迎大家扩展
2008-06-12 14:48 Loning 阅读(4247) 评论(30) 编辑 收藏 举报 自从在园子看到LumaQQ的源码后,就一直有要写个简单机器人程序的冲动.这些天终于有时间,写了这个简单的程序.
我喜欢看图片:)
为了程序的可扩展性,我把数据源与消息处理分开来写了.现阶段只实现了1个数据源即LumaQQDataSource,以及2个消息处理程序.以上您看到的就是我实现的翻译处理程序以及RSS请求处理程序.
接口如下:
1
public interface IDataSource
2
{
3
/// <summary>
4
/// 发送消息
5
/// </summary>
6
/// <param name="requester">接受者</param>
7
/// <param name="message">消息内容</param>
8
void SendMessage(object requester, string message);
9
/// <summary>
10
/// 数据源开始工作
11
/// </summary>
12
void Work();
13
/// <summary>
14
/// 数据源停止工作
15
/// </summary>
16
void Stop();
17
/// <summary>
18
/// 消息接收时该事件被触发
19
/// </summary>
20
event EventHandler<MessageEventArgs> MessageReceived;
21
/// <summary>
22
/// 用户状态改变时该事件被触发
23
/// </summary>
24
event EventHandler<FriendStatusChangedEventArgs> FriendStatusChanged;
25
}
26![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
27
namespace Loning.Joymsg.Interface
28
{
29
public interface IDataSource
30
{
31
/// <summary>
32
/// 发送消息
33
/// </summary>
34
/// <param name="requester">接受者</param>
35
/// <param name="message">消息内容</param>
36
void SendMessage(object requester, string message);
37
/// <summary>
38
/// 数据源开始工作
39
/// </summary>
40
void Work();
41
/// <summary>
42
/// 数据源停止工作
43
/// </summary>
44
void Stop();
45
/// <summary>
46
/// 消息接收时该事件被触发
47
/// </summary>
48
event EventHandler<MessageEventArgs> MessageReceived;
49
/// <summary>
50
/// 用户状态改变时该事件被触发
51
/// </summary>
52
event EventHandler<FriendStatusChangedEventArgs> FriendStatusChanged;
53
}
54
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
42
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
54
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
在IDataSource中定义了两个事件,
FriendStatusChanged是好友状态改变时引发的事件,如上线,离开,下线.
MessageReceived是收到请求信息时触发的事件.
这两个事件触发后分别由 ProcessorManager 调用IProcessor的两个Processor.
在 ProcessorManager 中引用这个定义接口的项目,负责相关插件的加载以及数据源与处理程序之前的信息交换工作.
ProcessorManager 肯定是要多线程的,但是我认为不需要对线程有太多的控制,因此只是用委托实现多线程(其实Thread我看着好晕的).
ProcessorManager 由于需要配置数据源插件以及处理程序插件的信息,因此定义了一个ConfigurationSection,其实配置还是蛮简单的.
下面是配置文件的ProcessorManager 部分
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ProcessorManager 使用了Unity 1.1,由于IProcessor加载通常需要很长的时间,(我在写RssProcessor的时候发现了这个问题),因此IProcessor是个单件.具体的加载方式请看我附上的源码.
使用方法很简单,即
[处理器名][空格|:][处理器自定义的命令]
如rss cnblogs,fy 我爱博客园
在QQ群中定义了前缀要加robot,这个限定是在LumaQQDataSource中实现的.如果您有兴趣请看一下相关代码:)调用就是robot rss cnblogs了.
我为了偷懒在Test项目中直接引用了那些插件项目,其实只要把插件的DLL复制到程序输出的目录下就可以工作的.
如果您有兴趣,您可以实现一下Processor,请单纯的引用Loning.Joymsg.Interface这个项目.然后您想跟其他人分享的话就发到园子好了T_T.可以实现的东西好多,CMDSHELL,Telenet,给QQ输段代码让QQ返回个值...看各位想像力啦.当然了,别人实现了MSNDataSource后您会发现您的处理程序可以良好的工作.
源码下载:(其实弄个svn不错,再说啦....)
http://www.kingcms.net/userfiles/loning.joymsg.rar
PS:测试的时候需要修改Test项目的配置文件,有个luma:qq,luma:password吧,把这个改成您qq的帐号密码:)
写在最后:感谢啊不,没有他写的LumaQQ.NET偶是不会有写这个机器人程序的想法的.感谢蓝精灵,他修改了LumaQQ.net的代码使群支持长消息发送.感谢TerryLee,Inrie(洪晓军),了解了Unity,实在是很好玩的东西:)其实要感谢园子里每个人啦,给我那么多文章看,让我感受到纯技术社区的魅力...
我没怎么看过系统的知识了,一般只是凭着兴趣在课余时间看看书罢了.即将要上大学了,因为希望接受很系统的东西,所以报了软件工程.可貌似这个专业要分需要很低,感觉保送亏了...T_T...不过计算机科学与技术,人貌似实在很多.大学也不是很牛的大学了...所以,希望各位给一些软件设计方面的意见,可以先拿这个程序挑问题啦.谢谢各位.第一次发首页...