海贼精神  
骂别人不革命,便是革命者,则自己不做事,而骂别人的事做得不好,自然便是更做事者。 若与此辈理论,可以被牵连到白费唇舌,一事无成,也就是白活一世,于己于人,都无益处。 我现在得了妙法,是谣言不辩,诬蔑不洗,只管自己做事。 ——鲁迅1934年6月21日信

 



本文为此系列的第二篇, 是平时的总结. 如果刚刚接触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!而且已经有了自己的好友和管理办法~ 咱们已经可以像路飞一样去寻找自己的同伴了! 这个世界如此美妙.

 


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

 

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


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



posted on 2007-08-13 08:58  阿鸟  阅读(4246)  评论(26编辑  收藏  举报