Mockingbird

If that mockingbird don't sing and that ring don't shine I'mma break that birdies neck
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

dotMSN2.0的通知系统

Posted on 2005-05-13 12:31  andyloo  阅读(2302)  评论(4)    收藏  举报
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using XihSolutions.DotMSN;
using XihSolutions.DotMSN.Core;
using XihSolutions.DotMSN.DataTransfer;
using Log;
using INI;
using System.IO;
using System.Threading;

namespace Notification
{
    
/// <summary>
    
/// Class1 的摘要说明。
    
/// </summary>

    public class MSN:MarshalByRefObject 
    
{
        
private    XihSolutions.DotMSN.Messenger messenger = new Messenger();
        
private Conversation conversation;
        
private int status=0;
        
        
public MSN()
        
{
            messenger.NameserverProcessor.ConnectionEstablished 
+= new EventHandler(NameserverProcessor_ConnectionEstablished);
            messenger.Nameserver.SignedIn 
+= new EventHandler(Nameserver_SignedIn);
            messenger.Nameserver.SignedOff 
+= new SignedOffEventHandler(Nameserver_SignedOff);
            messenger.NameserverProcessor.ConnectingException 
+= new ProcessorExceptionEventHandler(NameserverProcessor_ConnectingException);            
            messenger.Nameserver.ExceptionOccurred 
+= new HandlerExceptionEventHandler(Nameserver_ExceptionOccurred);                    
            messenger.Nameserver.AuthenticationError 
+= new HandlerExceptionEventHandler(Nameserver_AuthenticationError);
            messenger.Nameserver.ServerErrorReceived 
+= new ErrorReceivedEventHandler(Nameserver_ServerErrorReceived);
            messenger.ConversationCreated 
+= new ConversationCreatedEventHandler(messenger_ConversationCreated);            
            messenger.TransferInvitationReceived 
+= new MSNSLPInvitationReceivedEventHandler(messenger_TransferInvitationReceived);
            messenger.Credentials.ClientID 
= "msmsgs@msnmsgr.com";
            messenger.Credentials.ClientCode 
= "Q1P7W2E4J9R8U3S5";
        }

        
public void Connect()
        
{ //读配置文件
            IniStructure dbini
=new IniStructure();
            
string loc=Path.GetFullPath(AppDomain.CurrentDomain.SetupInformation.ApplicationBase);
            dbini
= IniStructure.ReadIni(loc+"RNS_Service.ini");
            
string account=dbini.GetValue("MSN","Account");            
            
string password=dbini.GetValue("MSN","Password");    
            messenger.Credentials.Account 
= account;
            messenger.Credentials.Password 
= password;
            
if(messenger.Connected)
            
{
                messenger.Disconnect();
            }

            messenger.Connect(); 
        }


        
public void Disconnect()
        
{
            messenger.Disconnect(); 
        }


        
public bool Notify(string account,string msg)
        
{
            
try
            
{
                TextMessage message 
= new TextMessage(msg);
                
switch(status)
                
{
                    
case 1:
                        conversation.Invite(account);
                        
for(int i=0;i<10;i++)
                        
{
                            
if (status==2)
                            
{
                                
if(conversation.SwitchboardProcessor.Connected == false)
                                
{
                                    conversation.Messenger.Nameserver.RequestSwitchboard(conversation.Switchboard, 
this);
                                }

                                conversation.Switchboard.SendTextMessage(message);
                                FLogger.Log(
"发送",LogLevel.HIGH);
                                
break;
                            }

                            
else
                            
{
                                Thread.Sleep(
1000);
                            }

                            
                        }

                        FLogger.Log(
"连接用户超时,发送不成功!",LogLevel.HIGH);
                        
return false;
                    
case 2:
                        
if(conversation.SwitchboardProcessor.Connected == false)
                        
{
                            conversation.Messenger.Nameserver.RequestSwitchboard(conversation.Switchboard, 
this);
                        }

                        
                        conversation.Switchboard.SendTextMessage(message);
                        FLogger.Log(
"发送",LogLevel.HIGH);
                        
break;
                    
case 0:
                        FLogger.Log(
"服务器未准备好,发送不成功!",LogLevel.HIGH);
                        
return false;
                }
            
                
return true;
            }

            
catch(Exception ee)
            
{
                FLogger.Log(
"发送不成功!"+ee.Message,LogLevel.HIGH);
                
return false;
            }

        }


        
        
private void NameserverProcessor_ConnectionEstablished(object sender, EventArgs e)
        
{
            FLogger.Log(
"Connected to server",LogLevel.HIGH);
            
        }


        
private void Nameserver_SignedIn(object sender, EventArgs e)
        
{
            messenger.Owner.Status 
= PresenceStatus.Online;    
            conversation
=messenger.CreateConversation();
            conversation.Switchboard.TextMessageReceived 
+= new TextMessageReceivedEventHandler(Switchboard_TextMessageReceived);
            conversation.Switchboard.SessionClosed 
+= new SBChangedEventHandler(Switchboard_SessionClosed);
            conversation.Switchboard.ContactJoined 
+= new ContactChangedEventHandler(Switchboard_ContactJoined);
            conversation.Switchboard.ContactLeft   
+= new ContactChangedEventHandler(Switchboard_ContactLeft);            
            FLogger.Log(
"Signed into the messenger network as " + messenger.Owner.Name ,LogLevel.HIGH);
        }


        
private void Nameserver_SignedOff(object sender, SignedOffEventArgs e)
        
{
            FLogger.Log(
"Signed off from the messenger network",LogLevel.HIGH);
        }


        
private void Nameserver_ExceptionOccurred(object sender, ExceptionEventArgs e)
        
{
            
// ignore the unauthorized exception, since we're handling that error in another method.
            if(e.Exception is UnauthorizedException)
                
return;

            FLogger.Log(
"Nameserver exception:"+e.Exception.ToString(),LogLevel.HIGH);
        }


        
private void NameserverProcessor_ConnectingException(object sender, ExceptionEventArgs e)
        
{
            FLogger.Log(
"Connecting failed"+e.ToString(),LogLevel.HIGH);
        }


        
private void Nameserver_AuthenticationError(object sender, ExceptionEventArgs e)
        
{

            FLogger.Log(
"Authentication failed",LogLevel.HIGH);
        }


        
        
private void Nameserver_ServerErrorReceived(object sender, MSNErrorEventArgs e)
        
{
            
// when the MSN server sends an error code we want to be notified.
            FLogger.Log("Server error received:"+e.MSNError.ToString(),LogLevel.HIGH);
        }



        
private void messenger_ConversationCreated(object sender, ConversationCreatedEventArgs e)
        
{
            status
=1;
        }


        
private void messenger_TransferInvitationReceived(object sender, MSNSLPInvitationEventArgs e)
        
{            
        }



        
private void Switchboard_TextMessageReceived(object sender, TextMessageEventArgs e)
        
{    
            Notify(e.Sender.Mail,
"这是系统通知,请勿回复!");
            FLogger.Log(e.Sender.Name
+" said:"+e.Message.Text,LogLevel.HIGH);
        }


        
private void Switchboard_SessionClosed(object sender, EventArgs e)
        
{
            status
=1;
        }


        
private void Switchboard_ContactJoined(object sender, ContactEventArgs e)
        
{
            status
=2;
        }


        
private void Switchboard_ContactLeft(object sender, ContactEventArgs e)
        
{
            status
=1;
        }


        
public string Status
        
{
            
get 
            
{
                
switch (status)
                
{
                    
case 1:
                        
return "READY"; //已连接 
                    
case 2:
                        
return "READY"; //远程联系人已进入会话
                    
case 0:
                        
return "NOT_READY";//未连接
                    
default:
                        
return "NOT_READY";
                }

            }

        }

    }

}

和dotMSN自带的例子的区别就是设置了状态,防止在不适当的时候做不适当的事导致出错。
dotMSN的例子就打了个时间差,没有对当前状态的判断。