本文为此系列的第二篇, 是平时的总结. 如果刚刚接触MSN Robot, 可以先参阅第一篇慢慢了解 :)
本篇主题是关于MSN Robot的好友篇.
前记:
刀刀说: 一个人的时候, 是不孤单的, 真正孤单的时候, 是想另一个人的时候.
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永远都是离线呢?
恩, 是这样, 因为在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, 为什么我把好友从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
>>> 为客户端套接字发送
<<< 为客户端套接字接收
添加和删除好友:
>>> 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!而且已经有了自己的好友和管理办法~ 咱们已经可以像路飞一样去寻找自己的同伴了! 这个世界如此美妙.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
世代继承的意志,时代的变迁,人的梦,这些都是挡不住的。
只要人们继续追求自由的解答,这一切都将永不停止!
世界吗?是啊!回答是应该选择追求自由的世界。
在这个辽阔的世界面前,可笑的梦想将成为你们前进的方向。
提起勇气吧,在信念的旗帜带领下!