• 是呀, 没有好友的MSN是孤独的 DotMSN2.0 Robot(二) [原鸟]


     



    本文为此系列的第二篇, 是平时的总结. 如果刚刚接触MSN Robot, 可以先参阅第一篇慢慢了解 :)
    本篇主题是关于MSN Robot的好友篇.


     

    前记:

    刀刀说: 一个人的时候, 是不孤单的, 真正孤单的时候, 是想另一个人的时候.

    本文讨论关于MSN好友的添加和删除和相关MSN好友的事件在程序里的实现.








    e... 好像还是有人不明白, 本文讨论的是: MSN好友的添加和删除和相关MSN好友的事件在程序里的实现.
    呼... 这下就行了吧..... 大图 :) 真帅





     

    行了, 讨论技术的时候不要儿女情长, 佛语说: 女友如手足, 技术如衣服, 哪能为了手足影响衣服呐. Come on! 今天咱们一起来继续昨天的讨论吧.

     

     

    今天咱们先聊聊好友吧, 因为好友的挂牵才是咱们更深入的去讨论message消息的动力 J 对吗?

     

     

    昨天咱们已经拿到了所有好友的列表 J 是佷开心的事.
     


    Come on! 直接咱们先来看看好友的添加和删除吧!
    J


     

    来吧! 加入好友:

     

    一种办法:

    //用在手动添加好友的时候, 自动会添加入AllowedListForwardList列表

    //别怀疑, 我是中国帅哥.

    messenger.Nameserver.AddNewContact("zhangyv1234@hotmail.co.jp");

     

    另一种办法:

    //用在被动添加好友的时候

    messenger.Nameserver.AddContactToList(e.Contact, MSNLists.AllowedList);

    messenger.Nameserver.AddContactToList(e.Contact, MSNLists.ForwardList);

     

    去吧! 删除好友:

    messenger.Nameserver.RemoveContactFromList(contact,MSNLists.AllowedList);

    messenger.Nameserver.RemoveContactFromList(contact,MSNLists.ForwardList);


     

    别怀疑, 早晨的阳光就是这么简单, 手碰茶杯如是说 J


     

    这时候留下一点悬疑 J

    MSNListsAllowedListForwardList列表是什么呢?

    为什么每次要删除和添加两次呢?

     

    呵呵, 咱们先来看看表层的后边, 关于好友的常用事件J

     

    //好友上线通知事件

    messenger.Nameserver.ContactOnline += new ContactChangedEventHandler(Nameserver_ContactOnline);

     

    //好友下线通知事件

    messenger.Nameserver.ContactOffline += new ContactChangedEventHandler(Nameserver_ContactOffline);

     

    //有人添加咱们进入好友的通知事件

    messenger.Nameserver.ReverseAdded += new ContactChangedEventHandler(Nameserver_ReverseAdded);

     

    //被人TTT出好友的通知事件 L

    messenger.Nameserver.ReverseRemoved += new ContactChangedEventHandler(Nameserver_ReverseRemoved);

     

    //咱们添加好友触发的事件

    messenger.Nameserver.ContactAdded += new ListMutatedAddedEventHandler(Nameserver_ContactAdded);

     

    //咱们删除好友触发的事件

    messenger.Nameserver. ContactRemoved += new

    ListMutatedAddedEventHandler(Nameserver_ContactRemoved);

     

    功能无限, 可以自主选购 J

     

    //有人添加咱们进入好友时候触发

    void Nameserver_ReverseAdded(object sender, ContactEventArgs e)

    {

    //在这里AddContactToList之后会自动调用ContactAdded事件

       messenger.Nameserver.AddContactToList(e.Contact, MSNLists.AllowedList);

     

       //同步ContactList

       messenger.Nameserver.SynchronizeContactList();

     

    richTextBox3.AppendText(e.Contact.Name + "  add to List" + DateTime.Now.ToShortTimeString() + "\r\n");

    }

     

    //咱们添加好友时候被触发

    void Nameserver_ContactAdded(object sender, ListMutateEventArgs e)

    {

    Invoke(new UpdateContactlistDelegate(UpdateContactlist));

    }

     

    //被人TTT出好友时候触发

    void Nameserver_ReverseRemoved(object sender, ContactEventArgs e)

    {

    foreach (ListViewItem temp in ContactListView.Items)

    {

    Contact contact = (Contact)temp.Tag;

    if (contact == e.Contact)

    {

    //在这里RemoveContactFromList之后会自动调用ContactRemoved事件

    messenger.Nameserver.RemoveContactFromList(e.Contact, MSNLists.AllowedList);

    }

    }

    }

     

    //咱们删除好友时候被触发

    void Nameserver_ContactRemoved(object sender, ListMutateEventArgs e)

    {

    Invoke(new UpdateContactlistDelegate(UpdateContactlist));

    }

     

     

    //好友下线时候触发

    void Nameserver_ContactOffline(object sender, ContactEventArgs e)

    {

    Invoke(new UpdateContactlistDelegate(UpdateContactlist));

    }

    //好友上线时候触发

    void Nameserver_ContactOnline(object sender, ContactEventArgs e)

    {

    Invoke(new UpdateContactlistDelegate(UpdateContactlist));

    }

     

     

    大家一定发现了, 咱们所有的AddRemoved活动都有一个MSNLists参数存在 J 对于它还留下了悬疑, 其实佷简单 J 海贼王里边有三大势力, 政府军, 龙的反叛军, 还有路飞和四皇的大海贼, MSN的列表也分四种情况: AllowedList, ReverseList, ForwardListBlockedList.

     

    四个列表各有奥妙:

    AllowedList列表中是允许看到你状态的其它人

    ReverseList列表是你在其它人的列表中的其他人 -_-#.. 有点拗口

    ForwardList 列表是在你可见列表中的人, 就是传统意义上咱们MSN上边显示的好友 J 上限是150

    BlockedList 列表是黑名单列表 J

     

    咱们再来看添加的语句哟 J

    messenger.Nameserver.AddContactToList(e.Contact, MSNLists.AllowedList);

    messenger.Nameserver.AddContactToList(e.Contact, MSNLists.ForwardList);

    所以这里的意思就是, 添加这个baby到可以看到我状态的列表哟~~~再添加这个baby到我的好友列表哟~~ J

     

    但是咱们MSNRobot因为要服务很多人, 不能有ForwardList列表150人上限的限制, 所以添加的时候只需要对方可以看到咱们的状态发来消息就可以了, 所以这样加入:

    messenger.Nameserver.AddContactToList(e.Contact, MSNLists.AllowedList);

     

    也许你会发现, ! 为什么我把对方加入了我的AllowedList,但是为什么我在程序里接收到他的status永远都是离线呢?

    , 是这样, 因为在AllowedList列表是不可见对方状态的.. 对方没有在咱们的好友列表里, 对方也没有允许咱们进入他的AllowedList, 所以我们见到他们的信息也许是永恒的offline.. 虽然这时候message没有阻碍, 但我还是不能忍受见不到online的消息发送, 所以注掉了. 有时候会想咱们为了更好的解决问题 也许真的要放弃一些的.

    (如果你有关于此问题好的解决办法, 请与我联系 MSN:zhangyv1234@hotmail.co.jp)

     

    5555.. 听说海贼王更新了.. 到处跑着找, 还是466 L 好想看新的.. 55555~~~~~~

     

     

    在删除的时候也是一样的哟:

    messenger.Nameserver.RemoveContactFromList(e.Contact, MSNLists.AllowedList);

    当一个Contact加入到AllowList之后就可以把它从这里删掉. 不过要小心, 在用户不存在在AllowedList的时候调用这个命令会抛出的, 咱们应该加上一个简单的判断:

    if (contact.OnAllowedList)

    messenger.Nameserver.RemoveContactFromList(contact, MSNLists.AllowedList);

    if (contact.OnForwardList)

    messenger.Nameserver.RemoveContactFromList(contact, MSNLists.ForwardList);

     

     

    最后也许你会发现, yi, 为什么我把好友从AllowedListForwardList列表删除掉了好友列表里这个baby还是在呢? 再来看看咱们第一天的代码:

     

    UpdateContactlist函数中的:

    foreach (Contact contact in messenger.ContactList.All)

     

    哈哈 J 是不是看到了问题? ContactList.All -_-#... 这不是连ReverseListBlockedList都有包含了吗? , 原来这样, 稍作修改:

    foreach (Contact contact in messenger.ContactList.AllowedList)

     

    只列出来可以看到咱们状态的用户 J 就更符合咱们Robot的需要了.

     

    在这里咱们还得小心一处哟, 就是不管删除或者试图添加ReverseList列表, 都会造成服务器把咱们踢下线 -_-#... 而且还不给通知. 叭嗒一下就给踢了 L 55555..

     

     




    咱们再来看看程序背后发生了什么吧
    J


    >>>
    为客户端套接字发送

    <<< 为客户端套接字接收

     

     

     

    添加和删除好友:

     

    >>> ADD 23 FL zhangyv1234@hotmail.co.jp 阿鸟 1\r\n

    // 咱们说: 我忒想加进来一个好友了, 他叫zhangyv1234@hotmail.co.jp, 加入到我的ForwardList列表里, 昵称叫阿鸟, 对了, 记得帮我扔组1里去呀~Yeah~

    <<< ADD 23 FL 1201 zhangyv1234@hotmail.co.jp 阿鸟1\r\n

    // 服务器说, 行呀, 没问题, 您请好吧~~~~ 这时候要等待对方的反应,  是否允许咱们加入到自己列表里
    <<< BPR 1201 zhangyv1234@hotmail.co.jp PHH\r\n
    <<< BPR 1201 zhangyv1234@hotmail.co.jp PHW\r\n
    <<< BPR 1201 zhangyv1234@hotmail.co.jp PHM\r\n
    <<< BPR 1201 zhangyv1234@hotmail.co.jp MOB N\r\n

    // 如果通过则发来这些消息

     

    关于这个列表是个电话列表….. 为什么我也不知道 L 协议就返回来一套这很帅的列表……

    .PHH — 家庭电话

    .PHW — 工作单位电话

    .PHM — 移动电话

    .MOB — 大概是其他人可以通过MSN Mobile联系我的方式?

     

     

    删除的时候比较简单 J

    >>> REM 31 FL zhangyv1234@hotmail.co.jp\r\n

    //我要把这个二蛋从ForwardList删除掉!

    <<< REM 31 FL 1202 zhangyv1234@hotmail.co.jp\r\n

    //行呀, kiss. >_<

     

     

    被别人添加和删除

    如果别人在ForwardList中添加删除你, 服务器就会给你发来一个ADD或者REM命令

    这里的列表信息就是传说中永恒的ReverseList

    <<< ADD 0 RL 3049 example@passport.com My%20Name\r\n

    // 被人添加进去自己的ReverseList了哟~~~

    <<< REM 0 RL 3050 example@passport.com\r\n

    // 被人从自己的ReverseList TTTT了哟~~~

     

     

    好友的当前状态

    好友的状态分成两块哟, 因为咱们在Connect的时候应该拿到一个初始列表状态, 这样才能知道以后用户是不是上线下线左跑右闪, 恩恩, 有理有理( 阿鸟咬着指头做沉思状, 因为经理在看过来 -_-#.. )

     

    Connect的时候取得好友列表:

    传说中关于这个命令有点二.. 因为没有办法知道对于CHG命令什么时候执行结束.. ILN什么时候发送完毕 -_-#....所以如果需要得到结束的时候, 就在获得CHG响应之后ping服务器吧.. (发送PNG\r\n), 可以假定在服务器发送完毕ILN后才回应的QNG\r\n

    >>> CHG 12 NLN 6\r\n

    <<< CHG 12 NLN 6\r\n

    >>> PNG\r\n

    //之后收到的就是好友列表

    <<< ILN 12 AWY example@passport.com Mike 0\r\n

    <<< ILN 12 NLN name_123@hotmail.com Name_123 536870948\r\n

    <<< ILN 12 BSY myname@msn.com My%20Name 268435492\r\n

    <<< QNG\r\n

     

    经理喊吃饭了 J  等会儿再写. 啦啦啦~~~ 真幸福~~~~

     

    最后是好友status变化的通知

    如果一个好友离线或者隐身, 服务器将会发送回来一个FLN命令, 具体是哪个对咱们来说比较不重要. J

    <<< FLN example@passport.com\r\n

    // example@passport.com离线或者隐身

     

    也许好友的状态会改变成busy, leave, or make love, 咱们就会得到一点小小的通知:

    <<< NLN NLN example@passport.com Mike 12\r\n

    <<< NLN AWY example@passport.com Mike 0\r\n

    <<< NLN AWY example@passport.com Mike%20Changed%20His%20Name 36\r\n

    关于状态缩略:

    NLN可用      BSY忙碌           IDL 发呆 BRB马上回来

    AWY离开          PHN 打电话        LUN 外出就餐

     

     

    OK! This Good! 咱们不光连接上了MSN!而且已经有了自己的好友和管理办法~ 咱们已经可以像路飞一样去寻找自己的同伴了! 这个世界如此美妙.

     


    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  

     

    世代继承的意志,时代的变迁,人的梦,这些都是挡不住的。
    只要人们继续追求自由的解答,这一切都将永不停止!


    世界吗?是啊!回答是应该选择追求自由的世界。
    在这个辽阔的世界面前,可笑的梦想将成为你们前进的方向。
    提起勇气吧,在信念的旗帜带领下!



  • 相关阅读:
    正则表达式
    vim
    linux 6 安装 zabbix.3服务
    内核链表学习记录
    rpc-protobuff-实现
    Qedis实现
    try-catch 异常捕获学习
    协程的学习和使用
    惊群的学习研究 这人的博客还有其他干货
    互斥锁与自旋锁的区别测试代码
  • 原文地址:https://www.cnblogs.com/Bird/p/853136.html
Copyright © 2020-2023  润新知