zoukankan      html  css  js  c++  java
  • QQ机器人程序,Joymsg,欢迎大家扩展

        自从在园子看到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
    27namespace 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}


    在IDataSource中定义了两个事件,
        FriendStatusChanged是好友状态改变时引发的事件,如上线,离开,下线.
        MessageReceived是收到请求信息时触发的事件.
    这两个事件触发后分别由 ProcessorManager  调用IProcessor的两个Processor.

    在 ProcessorManager 中引用这个定义接口的项目,负责相关插件的加载以及数据源与处理程序之前的信息交换工作.

        ProcessorManager 肯定是要多线程的,但是我认为不需要对线程有太多的控制,因此只是用委托实现多线程(其实Thread我看着好晕的).
        ProcessorManager 由于需要配置数据源插件以及处理程序插件的信息,因此定义了一个ConfigurationSection,其实配置还是蛮简单的.
    下面是配置文件的ProcessorManager 部分

      <Joymsg processMessage="收到消息\r\n{0}\r\n处理中,请稍候">
        
    <DataSources>
          
    <add name="lumaQQ" type="Loning.Joymsg.LumaQQDataSource.LumaQQDataSource, Loning.Joymsg.LumaQQDataSource, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        
    </DataSources>
        
    <Processors>
          
    <add name="default" type="Loning.Joymsg.DefaultProcessor.DefaultProcessor, Loning.Joymsg.DefaultProcessor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          
    <add name="online" type="Loning.Joymsg.DefaultProcessor.DefaultProcessor, Loning.Joymsg.DefaultProcessor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          
    <add name="fy" type="Loning.Joymsg.TranslationProcessor.TranslationProcessor, Loning.Joymsg.TranslationProcessor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          
    <add name="rss" type="Loning.Joymsg.RssProcessor.RssProcessor, Loning.Joymsg.RssProcessor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        
    </Processors>
      
    </Joymsg>
    注意插件的type是要fullname的,因为直接调用的Type.GetType()方法.

        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...不过计算机科学与技术,人貌似实在很多.大学也不是很牛的大学了...所以,希望各位给一些软件设计方面的意见,可以先拿这个程序挑问题啦.谢谢各位.第一次发首页...
  • 相关阅读:
    bzoj4152 [AMPPZ2014]The Captain
    bzoj2429 [HAOI2006]聪明的猴子
    bzoj1196 [HNOI2006]公路修建问题
    bzoj1083 [SCOI2005]繁忙的都市
    bzoj1050 [HAOI2006]旅行comf
    bzoj1088 [SCOI2005]扫雷Mine
    bzoj1085 [SCOI2005]骑士精神
    bzoj3437 小P的牧场
    bzoj1296 [SCOI2009]粉刷匠
    A1046 Shortest Distance (20)(20 分)
  • 原文地址:https://www.cnblogs.com/loning/p/1218381.html
Copyright © 2011-2022 走看看