转自:http://www.cnblogs.com/Bird/archive/2007/08/13/853136.html
本文为此系列的第二篇, 是平时的总结. 如果刚刚接触MSN Robot, 可以先参阅第一篇慢慢了解 :)
本篇主题是关于MSN Robot的好友篇.
前记:
刀刀说: 一个人的时候, 是不孤单的, 真正孤单的时候, 是想另一个人的时候.
本文讨论关于MSN好友的添加和删除和相关MSN好友的事件在程序里的实现.
e... 好像还是有人不明白, 本文讨论的是: MSN好友的添加和删除和相关MSN好友的事件在程序里的实现.
呼... 这下就行了吧..... 大图 :) 真帅
行了, 讨论技术的时候不要儿女情长, 佛语说: 女友如手足, 技术如衣服, 哪能为了手足影响衣服呐. Come on! 今天咱们一起来继续昨天的讨论吧.
今天咱们先聊聊好友吧, 因为好友的挂牵才是咱们更深入的去讨论message消息的动力
J
对吗?
昨天咱们已经拿到了所有好友的列表
J
是佷开心的事.
Come on! 直接咱们先来看看好友的添加和删除吧! J
来吧! 加入好友:
一种办法:
//
用在手动添加好友的时候, 自动会添加入
AllowedList
和ForwardList列表
//
别怀疑, 我是中国帅哥.
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
MSNLists
的AllowedList和ForwardList列表是什么呢?
为什么每次要删除和添加两次呢?
呵呵, 咱们先来看看表层的后边, 关于好友的常用事件
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));
}
大家一定发现了, 咱们所有的Add和Removed活动都有一个MSNLists参数存在
J
对于它还留下了悬疑, 其实佷简单
J
海贼王里边有三大势力, 政府军, 龙的反叛军, 还有路飞和四皇的大海贼, MSN的列表也分四种情况:
AllowedList, ReverseList, ForwardList
和BlockedList.
四个列表各有奥妙:
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永远都是离线呢?
恩, 是这样, 因为在A
llowedList
列表是不可见对方状态的.. 对方没有在咱们的好友列表里, 对方也没有允许咱们进入他的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, 为什么我把好友从AllowedList和ForwardList列表删除掉了好友列表里这个baby还是在呢? 再来看看咱们第一天的代码:
UpdateContactlist
函数中的:
foreach
(
Contact
contact
in
messenger.ContactList.All)
哈哈
J
是不是看到了问题?
ContactList.All -_-#...
这不是连
ReverseList
和BlockedList都有包含了吗? 哇, 原来这样, 稍作修改:
foreach
(
Contact
contact
in
messenger.ContactList.
AllowedList
)
只列出来可以看到咱们状态的用户
J
就更符合咱们Robot的需要了.
在这里咱们还得小心一处哟, 就是不管删除或者试图添加ReverseList列表, 都会造成服务器把咱们踢下线 -_-#... 而且还不给通知
…
.
叭嗒一下就给踢了
L
55555
…
..
咱们再来看看程序背后发生了什么吧 J
>>> 为客户端套接字发送
<<<
为客户端套接字接收
添加和删除好友:
//
咱们说
:
我忒想加进来一个好友了
,
他叫
zhangyv1234@hotmail.co.jp,
加入到我的
ForwardList
列表里
,
昵称叫阿鸟
,
对了
,
记得帮我扔组
1
里去呀
~Yeah~
//
服务器说
,
行呀
,
没问题
,
您请好吧
~~~~
这时候要等待对方的反应
,
是否允许咱们加入到自己列表里
<<< 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
<<< 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
!而且已经有了自己的好友和管理办法
~
咱们已经可以像路飞一样去寻找自己的同伴了
!
这个世界如此美妙
.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
世代继承的意志,时代的变迁,人的梦,这些都是挡不住的。
只要人们继续追求自由的解答,这一切都将永不停止!
只要人们继续追求自由的解答,这一切都将永不停止!
世界吗 ? 是啊!回答是应该选择追求自由的世界。
在这个辽阔的世界面前,可笑的梦想将成为你们前进的方向。
提起勇气吧,在信念的旗帜带领下!