Changeset 399 for TwitterIrcGateway

Show
Ignore:
Timestamp:
05/31/08 12:55:39 (3 months ago)
Author:
tomoyo
Message:

IM branchをtrunkにマージ。

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • TwitterIrcGateway/trunk/TwitterIrcGateway.sln

    r379 r399  
    77EndProject 
    88Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwitterIrcGatewayCore", "TwitterIrcGatewayCore\TwitterIrcGatewayCore.csproj", "{8A256703-BDC7-4E96-8AC3-89A56A2AFB86}" 
     9        ProjectSection(ProjectDependencies) = postProject 
     10                {DC39021C-FA24-4E34-AB4A-3260BB5314AF} = {DC39021C-FA24-4E34-AB4A-3260BB5314AF} 
     11        EndProjectSection 
     12EndProject 
     13Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "agsXMPP2008", "TwitterIrcGatewayCore\agsXMPP\agsXMPP2008.csproj", "{DC39021C-FA24-4E34-AB4A-3260BB5314AF}" 
    914EndProject 
    1015Global 
     
    2631                {8A256703-BDC7-4E96-8AC3-89A56A2AFB86}.Release|Any CPU.ActiveCfg = Release|Any CPU 
    2732                {8A256703-BDC7-4E96-8AC3-89A56A2AFB86}.Release|Any CPU.Build.0 = Release|Any CPU 
     33                {DC39021C-FA24-4E34-AB4A-3260BB5314AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 
     34                {DC39021C-FA24-4E34-AB4A-3260BB5314AF}.Debug|Any CPU.Build.0 = Debug|Any CPU 
     35                {DC39021C-FA24-4E34-AB4A-3260BB5314AF}.Release|Any CPU.ActiveCfg = Release|Any CPU 
     36                {DC39021C-FA24-4E34-AB4A-3260BB5314AF}.Release|Any CPU.Build.0 = Release|Any CPU 
    2837        EndGlobalSection 
    2938        GlobalSection(SolutionProperties) = preSolution 
  • TwitterIrcGateway/trunk/TwitterIrcGateway/App.config

    r369 r399  
    6262                <value>False</value> 
    6363            </setting> 
     64            <setting name="POSTFetchMode" serializeAs="String"> 
     65                <value>False</value> 
     66            </setting> 
    6467        </Misuzilla.Applications.TwitterIrcGateway.Settings> 
    6568    </userSettings> 
  • TwitterIrcGateway/trunk/TwitterIrcGateway/Program.cs

    r369 r399  
    6262            _server.ClientMessageWait = _settings.ClientMessageWait; 
    6363            _server.BroadcastUpdateMessageIsNotice = _settings.BroadcastUpdateMessageIsNotice; 
    64             _server.SessionStartedRecieved += new EventHandler<SessionStartedEventArgs>(_server_SessionStartedRecieved); 
     64            _server.POSTFetchMode = _settings.POSTFetchMode; 
     65            _server.SessionStartedReceived += new EventHandler<SessionStartedEventArgs>(_server_SessionStartedReceived); 
    6566            try 
    6667            { 
     
    9697        } 
    9798 
    98         void _server_SessionStartedRecieved(object sender, SessionStartedEventArgs e) 
     99        void _server_SessionStartedReceived(object sender, SessionStartedEventArgs e) 
    99100        { 
    100101            _notifyIcon.ShowBalloonTip(1000 * 10, Name, String.Format("���[�U {0} ���T�[�o�ɐڑ����܂����B", e.UserName), ToolTipIcon.Info); 
  • TwitterIrcGateway/trunk/TwitterIrcGateway/Settings.Designer.cs

    r369 r399  
    239239            } 
    240240        } 
     241         
     242        [global::System.Configuration.UserScopedSettingAttribute()] 
     243        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
     244        [global::System.Configuration.DefaultSettingValueAttribute("False")] 
     245        public bool POSTFetchMode { 
     246            get { 
     247                return ((bool)(this["POSTFetchMode"])); 
     248            } 
     249            set { 
     250                this["POSTFetchMode"] = value; 
     251            } 
     252        } 
    241253    } 
    242254} 
  • TwitterIrcGateway/trunk/TwitterIrcGateway/Settings.settings

    r369 r399  
    5757      <Value Profile="(Default)">False</Value> 
    5858    </Setting> 
     59    <Setting Name="POSTFetchMode" Type="System.Boolean" Scope="User"> 
     60      <Value Profile="(Default)">False</Value> 
     61    </Setting> 
    5962  </Settings> 
    6063</SettingsFile> 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCLI/Program.cs

    r377 r399  
    1919            IPAddress bindAddress = IPAddress.Loopback; 
    2020            Encoding encoding = Encoding.GetEncoding("ISO-2022-JP"); 
    21             IWebProxy proxy = WebProxy.GetDefaultProxy()
     21            IWebProxy proxy = WebRequest.DefaultWebProxy
    2222 
    2323            CommandLineOptions options; 
     
    7272            _server.ClientMessageWait = options.ClientMessageWait; 
    7373            _server.BroadcastUpdateMessageIsNotice = options.BroadcastUpdateMessageIsNotice; 
    74             _server.SessionStartedRecieved += new EventHandler<SessionStartedEventArgs>(_server_SessionStartedRecieved); 
     74            _server.POSTFetchMode = options.PostFetchMode; 
     75            _server.SessionStartedReceived += new EventHandler<SessionStartedEventArgs>(_server_SessionStartedReceived); 
    7576            _server.Proxy = proxy; 
    7677 
     
    9293            Console.WriteLine("[Configuration] BroadcastUpdate: {0}", _server.BroadcastUpdate); 
    9394            Console.WriteLine("[Configuration] ClientMessageWait: {0}", _server.ClientMessageWait); 
    94             Console.WriteLine("[Configuration] BroadcatUpdateMessageIsNotice: {0}", _server.BroadcastUpdateMessageIsNotice); 
     95            Console.WriteLine("[Configuration] BroadcastUpdateMessageIsNotice: {0}", _server.BroadcastUpdateMessageIsNotice); 
    9596            Console.WriteLine("[Configuration] Proxy: {0}", options.Proxy); 
     97            Console.WriteLine("[Configuration] PostFetchMode: {0}", options.PostFetchMode); 
    9698 
    9799            _server.Start(bindAddress, options.Port); 
     
    108110        } 
    109111 
    110         static void _server_SessionStartedRecieved(object sender, SessionStartedEventArgs e) 
     112        static void _server_SessionStartedReceived(object sender, SessionStartedEventArgs e) 
    111113        { 
    112114            //Console.WriteLine("[Connect] User: {0}", e.UserName); 
     
    157159 
    158160        [DefaultValue(false)] 
    159         [Description("enable cookie-login mode")] 
     161        [Description("enable cookie-login mode (Obsolete / not working)")] 
    160162        public Boolean CookieLoginMode { get; set; } 
    161163 
     
    191193        [Description("HTTP proxy server URL (http://host:port)")] 
    192194        public String Proxy { get; set; } 
     195 
     196        [DefaultValue(false)] 
     197        [Description("fetch data by POST method")] 
     198        public Boolean PostFetchMode { get; set; } 
    193199    } 
    194200} 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore

    • Property svn:externals set to
      agsXMPP http://svn.ag-software.de/ags/trunk/agsxmpp/
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore/EventArgs.cs

    r31 r399  
    88namespace Misuzilla.Applications.TwitterIrcGateway 
    99{ 
    10     public class MessageRecievedEventArgs : EventArgs 
     10    public class MessageReceivedEventArgs : EventArgs 
    1111    { 
    1212        public IRCMessage Message; 
    1313        public TcpClient Client; 
    1414        public StreamWriter Writer; 
    15         public MessageRecievedEventArgs(IRCMessage msg, StreamWriter sw, TcpClient tcpClient) 
     15        public MessageReceivedEventArgs(IRCMessage msg, StreamWriter sw, TcpClient tcpClient) 
    1616        { 
    1717            Writer = sw; 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore/Filter.cs

    r347 r399  
    66using System.Diagnostics; 
    77using Misuzilla.Net.Irc; 
     8using System.IO; 
     9using System.Xml; 
    810 
    911namespace Misuzilla.Applications.TwitterIrcGateway.Filter 
     
    7678 
    7779            return true; 
     80        } 
     81 
     82        /// <summary> 
     83        ///  
     84        /// </summary> 
     85        /// <param name="path"></param> 
     86        /// <returns></returns> 
     87        public static Filters Load(String path) 
     88        { 
     89            if (File.Exists(path)) 
     90            { 
     91                Trace.WriteLine(String.Format("Load Filters: {0}", path)); 
     92                try 
     93                { 
     94                    using (FileStream fs = new FileStream(path, FileMode.Open)) 
     95                    { 
     96                        try 
     97                        { 
     98                            Filters filters = Filters.Serializer.Deserialize(fs) as Filters; 
     99                            if (filters != null) 
     100                            { 
     101                                foreach (FilterItem item in filters.Items) 
     102                                { 
     103                                    Trace.WriteLine(String.Format(" - Filter:{0}", item.ToString())); 
     104                                } 
     105                                return filters; 
     106                            } 
     107                        } 
     108                        catch (XmlException xe) { Trace.WriteLine(xe.Message); } 
     109                        catch (InvalidOperationException ioe) { Trace.WriteLine(ioe.Message); } 
     110                    } 
     111                } 
     112                catch (IOException ie) 
     113                { 
     114                    Trace.WriteLine(ie.Message); 
     115                    throw; 
     116                } 
     117            } 
     118            return new Filters(); 
    78119        } 
    79120    } 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore/Group.cs

    r373 r399  
    77using System.Xml; 
    88using Misuzilla.Net.Irc; 
     9using System.Diagnostics; 
    910 
    1011namespace Misuzilla.Applications.TwitterIrcGateway 
     
    5960 
    6061            return retGroups; 
     62        } 
     63 
     64        /// <summary> 
     65        ///  
     66        /// </summary> 
     67        /// <param name="path"></param> 
     68        /// <returns></returns> 
     69        public static Groups Load(String path) 
     70        { 
     71            // group �ǂݎ� 
     72            if (File.Exists(path)) 
     73            { 
     74                Trace.WriteLine(String.Format("Load Group: {0}", path)); 
     75                try 
     76                { 
     77                    using (FileStream fs = new FileStream(path, FileMode.Open)) 
     78                    { 
     79                        try 
     80                        { 
     81                            Groups groups = Groups.Deserialize(fs); 
     82                            if (groups != null) 
     83                                return groups; 
     84                        } 
     85                        catch (XmlException xe) { Trace.WriteLine(xe.Message); } 
     86                        catch (InvalidOperationException ioe) { Trace.WriteLine(ioe.Message); } 
     87                    } 
     88                } 
     89                catch (IOException ie) 
     90                { 
     91                    Trace.WriteLine(ie.Message); 
     92                    throw; 
     93                } 
     94            } 
     95            return new Groups(); 
     96        } 
     97 
     98        /// <summary> 
     99        ///  
     100        /// </summary> 
     101        /// <param name="path"></param> 
     102        public void Save(String path) 
     103        { 
     104            Trace.WriteLine(String.Format("Save Group: {0}", path)); 
     105            try 
     106            { 
     107                String dir = Path.GetDirectoryName(path); 
     108                Directory.CreateDirectory(dir); 
     109                using (FileStream fs = new FileStream(path, FileMode.Create)) 
     110                { 
     111                    try 
     112                    { 
     113                        this.Serialize(fs); 
     114                    } 
     115                    catch (XmlException xe) { Trace.WriteLine(xe.Message); } 
     116                    catch (InvalidOperationException ioe) { Trace.WriteLine(ioe.Message); } 
     117                } 
     118            } 
     119            catch (IOException ie) 
     120            { 
     121                Trace.WriteLine(ie.Message); 
     122                throw; 
     123            } 
    61124        } 
    62125    } 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore/IRCClient/ChannelMode.cs

    r373 r399  
    6767                            continue; 
    6868                        } 
     69 
     70                        // �p�����[�^���������Ȃ̂ɂȂ��ꍇ 
     71                        if (hasParam && (i + paramPosition) > (param.Length - 1)) 
     72                        { 
     73                            // throw new ChannelModeParseException(); 
     74                            Debug.WriteLine(String.Format("Channel mode: {0} / Invalid Parameters", s[j])); 
     75                            continue; 
     76                        } 
    6977                         
    7078                        ChannelMode cmode = new ChannelMode() 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore/IRCClient/IRCMessage.cs

    r374 r399  
    639639                private String _target = ""; 
    640640 
     641        public String ModeArgs 
     642        { 
     643            get { return _modeargs; } 
     644            set { _modeargs = value; } 
     645        } 
     646 
     647        public String Target 
     648        { 
     649            get { return _target; } 
     650            set { _target = value; } 
     651        } 
     652         
    641653                public 
    642654                ModeMessage() : base() 
     
    648660                { 
    649661                        _target = this.CommandParams[0]; 
    650                         _modeargs = this.CommandParams[1]; 
     662 
     663            StringBuilder sb = new StringBuilder(); 
     664            for (var i = 1; i < this.CommandParams.Length; i++) 
     665            { 
     666                if (String.IsNullOrEmpty(this.CommandParams[i])) 
     667                    break; 
     668                 
     669                if (i != 1) 
     670                    sb.Append(" "); 
     671 
     672                sb.Append(this.CommandParams[i]); 
     673            } 
     674            _modeargs = sb.ToString(); 
    651675                } 
    652676                public 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore/Server.cs

    r376 r399  
    9393        public IWebProxy Proxy = null; 
    9494 
     95        /// <summary> 
     96        /// �f�[�^�̎擾��OST���\�b�h�𗘗p���邩�ǂ��� 
     97        /// </summary> 
     98        public Boolean POSTFetchMode = false; 
     99 
    95100        public const String ServerName = "localhost"; 
    96101        public const String ServerNick = "$TwitterIrcGatewayServer$"; 
    97102 
    98         public event EventHandler<SessionStartedEventArgs> SessionStartedRecieved; 
     103        public event EventHandler<SessionStartedEventArgs> SessionStartedReceived; 
    99104 
    100105        void AcceptHandled(IAsyncResult ar) 
     
    111116                    _sessions.Add(session); 
    112117                } 
    113                 session.SessionStarted += new EventHandler<SessionStartedEventArgs>(session_SessionStartedRecieved); 
     118                session.SessionStarted += new EventHandler<SessionStartedEventArgs>(session_SessionStartedReceived); 
    114119                session.SessionEnded += new EventHandler(session_SessionEnded); 
    115120                session.Start(); 
     
    125130        } 
    126131 
    127         void session_SessionStartedRecieved(object sender, SessionStartedEventArgs e) 
     132        void session_SessionStartedReceived(object sender, SessionStartedEventArgs e) 
    128133        { 
    129134            // ���p 
    130             if (SessionStartedRecieved != null) 
     135            if (SessionStartedReceived != null) 
    131136            { 
    132                 SessionStartedRecieved(sender, e); 
     137                SessionStartedReceived(sender, e); 
    133138            } 
    134139        } 
  • TwitterIrcGateway/trunk/TwitterIrcGatewayCore/Session.cs

    r376 r399  
    2727        private String _clientHost; 
    2828        private TwitterService _twitter; 
     29        private TwitterIMService _twitterIm; 
    2930        private LinkedList<Int32> _lastStatusIdsFromGateway; 
    30         private Timer _timer; 
    31         private Timer _timerDirectMessage; 
    32         private Timer _timerReplies; 
    3331        private Groups _groups; 
    3432        private Filters _filter; 
    35  
    36         private DateTime _lastAccessTimeline = new DateTime(); 
    37         private DateTime _lastAccessReplies = new DateTime(); 
     33        private Config _config; 
     34 
    3835        private List<String> _nickNames = new List<string>(); 
    3936        private Boolean _isFirstTime = true; 
    40         private Boolean _isFirstTimeReplies = true; 
    41         private DateTime _lastAccessDirectMessage = DateTime.Now; 
    42         private LinkedList<Status> _statusBuffer; 
    43         private LinkedList<Status> _repliesBuffer; 
     37 
    4438        private TraceListener _traceListeneer; 
    4539 
    46         private event EventHandler<MessageRecievedEventArgs> MessageRecieved; 
     40        private event EventHandler<MessageReceivedEventArgs> MessageReceived; 
    4741        private String _username; 
    4842        private String _password; 
     
    5246        public event EventHandler SessionEnded; 
    5347 
     48        private Boolean _requireIMReconnect = false; 
     49        private Int32 _imReconnectCount = 0; 
     50 
    5451        public Session(Server server, TcpClient tcpClient) 
    5552        { 
    56             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_USER); 
    57             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_NICK); 
    58             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_PASS); 
    59             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_QUIT); 
    60             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_PRIVMSG); 
    61             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_WHOIS); 
    62             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_INVITE); 
    63             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_JOIN); 
    64             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_PART); 
    65             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_KICK); 
    66             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_LIST); 
    67             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_TIGGC); 
    68             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_TOPIC); 
    69             MessageRecieved += new EventHandler<MessageRecievedEventArgs>(MessageRecieved_MODE); 
     53            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_USER); 
     54            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_NICK); 
     55            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_PASS); 
     56            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_QUIT); 
     57            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_PRIVMSG); 
     58            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_WHOIS); 
     59            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_INVITE); 
     60            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_JOIN); 
     61            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_PART); 
     62            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_KICK); 
     63            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_LIST); 
     64            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_TIGGC); 
     65            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_TOPIC); 
     66            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_MODE); 
     67            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_TIGIMENABLE); 
     68            MessageReceived += new EventHandler<MessageReceivedEventArgs>(MessageReceived_TIGIMDISABLE); 
    7069 
    7170            _groups = new Groups(); 
    7271            _filter = new Filters(); 
     72            _config = new Config(); 
    7373 
    7474            _server = server; 
    7575            _tcpClient = tcpClient; 
    76             _statusBuffer = new LinkedList<Status>(); 
    77             _repliesBuffer = new LinkedList<Status>(); 
    7876            _lastStatusIdsFromGateway = new LinkedList<int>(); 
    79             _timer = new Timer(new TimerCallback(OnTimerCallback), null, Timeout.Infinite, Timeout.Infinite); 
    80             _timerDirectMessage = new Timer(new TimerCallback(OnTimerCallbackDirectMessage), null, Timeout.Infinite, Timeout.Infinite); 
    81             _timerReplies = new Timer(new TimerCallback(OnTimerCallbackReplies), null, Timeout.Infinite, Timeout.Infinite); 
    8277        } 
    8378 
     
    115110            { 
    116111                return _clientHost; 
    117             } 
    118         } 
    119          
    120         /// <summary> 
    121         ///  
    122         /// </summary> 
    123         /// <param name="stateObject"></param> 
    124         private void OnTimerCallback(Object stateObject) 
    125         { 
    126             RunCallback(_timer, delegate 
    127             { 
    128                 SendPing(); 
    129  
    130                 // 初回だけは先にチェックしておかないとnamesが後から来てジャマ 
    131                 if (_isFirstTime) 
    132                 { 
    133                     CheckFriends(); 
    134                 } 
    135  
    136                 // Friendsをチェックするのは成功して、チェックが必要となったとき 
    137                 Boolean friendsCheckRequired = false; 
    138                 if (CheckNewTimeLine(out friendsCheckRequired) && friendsCheckRequired && !_server.DisableUserList) 
    139                 { 
    140                     CheckFriends(); 
    141                 } 
    142             }); 
    143         } 
    144  
    145         /// <summary> 
    146         ///  
    147         /// </summary> 
    148         /// <param name="stateObject"></param> 
    149         private void OnTimerCallbackDirectMessage(Object stateObject) 
    150         { 
    151             RunCallback(_timerDirectMessage, delegate 
    152             { 
    153                 CheckDirectMessage(); 
    154             }); 
    155         } 
    156          
    157         /// <summary> 
    158         ///  
    159         /// </summary> 
    160         /// <param name="stateObject"></param> 
    161         private void OnTimerCallbackReplies(Object stateObject) 
    162         { 
    163             RunCallback(_timerReplies, delegate 
    164             { 
    165                 CheckNewReplies(); 
    166             }); 
    167         } 
    168  
    169         /// <summary> 
    170         ///  
    171         /// </summary> 
    172         private delegate void CallbackProcedure(); 
    173  
    174         /// <summary> 
    175         /// タイマーコールバックの処理を実行します。 
    176         /// </summary> 
    177         /// <param name="timer"></param> 
    178         /// <param name="callbackProcedure"></param> 
    179         private void RunCallback(Timer timer, CallbackProcedure callbackProcedure) 
    180         { 
    181             // あまりに処理が遅れると二重になる可能性がある 
    182             if (Monitor.TryEnter(timer)) 
    183             { 
    184                 try 
    185                 { 
    186                     callbackProcedure(); 
    187                 } 
    188                 finally 
    189                 { 
    190                     Monitor.Exit(timer); 
    191                 } 
    192112            } 
    193113        } 
     
    213133                        { 
    214134                            IRCMessage msg = IRCMessage.CreateMessage(line); 
    215                             OnMessageRecieved(msg); 
     135                            OnMessageReceived(msg); 
    216136                        } 
    217137                        catch (IRCException) 
     
    220140                } 
    221141            } 
    222             catch (IOException ie
     142            catch (IOException
    223143            {} 
    224             catch (NullReferenceException ne
     144            catch (NullReferenceException
    225145            {} 
    226146            finally 
     
    233153        #region イベント実行メソッド 
    234154 
    235         protected virtual void OnMessageRecieved(IRCMessage msg) 
    236         { 
    237             if (MessageRecieved != null) 
    238             { 
    239                 MessageRecieved(this, new MessageRecievedEventArgs(msg, _writer, _tcpClient)); 
     155        protected virtual void OnMessageReceived(IRCMessage msg) 
     156        { 
     157            if (MessageReceived != null) 
     158            { 
     159                MessageReceived(this, new MessageReceivedEventArgs(msg, _writer, _tcpClient)); 
    240160            } 
    241161        } 
     
    245165            LoadGroups(); 
    246166            LoadFilters(); 
    247  
    248             // 
     167            LoadConfig(); 
     168 
     169            if (!String.IsNullOrEmpty(_config.IMServiceServerName)) 
     170            { 
     171                ConnectToIMService(true); 
     172            } 
     173             
    249174            if (SessionStarted != null) 
    250175            { 
     
    259184        { 
    260185            // filters 読み取り 
    261             String path = Path.Combine(ConfigBasePath, Path.Combine(_nick, "Filters.xml")); 
    262             if (File.Exists(path)) 
    263             { 
    264                 Trace.WriteLine(String.Format("Load Filters: {0}", path)); 
    265                 try 
    266                 { 
    267                     using (FileStream fs = new FileStream(path, FileMode.Open)) 
    268                     { 
    269                         try 
    270                         { 
    271                             Filters filters = Filters.Serializer.Deserialize(fs) as Filters; 
    272                             if (filters != null) 
    273                             { 
    274                                 _filter = filters; 
    275                                 foreach (FilterItem item in _filter.Items) 
    276                                 { 
    277                                     Trace.WriteLine(String.Format(" - Filter:{0}", item.ToString())); 
    278                                 } 
    279                             } 
    280                         } 
    281                         catch (XmlException xe) { Trace.WriteLine(xe.Message); } 
    282                         catch (InvalidOperationException ioe) { Trace.WriteLine(ioe.Message); } 
    283                     } 
    284                 } 
    285                 catch (IOException ie) 
    286                 { 
    287                     SendTwitterGatewayServerMessage("エラー: " + ie.Message); 
    288                     Trace.WriteLine(ie.Message); 
    289                 } 
     186            String path = Path.Combine(ConfigBasePath, Path.Combine(_username, "Filters.xml")); 
     187            try 
     188            { 
     189                _filter = Filters.Load(path); 
     190            } 
     191            catch (IOException ie) 
     192            { 
     193                SendTwitterGatewayServerMessage("エラー: " + ie.Message); 
    290194            } 
    291195        } 
     
    295199        /// </summary> 
    296200        private void LoadGroups() 
    297         { 
    298            // group 読み取り 
    299             String path = Path.Combine(ConfigBasePath, Path.Combine(_username, "Groups.xml")); 
    300             if (File.Exists(path)) 
    301             { 
    302                 Trace.WriteLine(String.Format("Load Group: {0}", path)); 
    303                 try 
    304                 { 
    305                     using (FileStream fs = new FileStream(path, FileMode.Open)) 
    306                     { 
    307                         try 
    308                         { 
    309                             Groups groups = Groups.Deserialize(fs); 
    310                             _groups = groups; 
    311  
    312                             // 下位互換性FIX: グループに自分自身のNICKは存在しないようにします 
    313                             foreach (Group g in groups.Values) 
    314                             { 
    315                                 g.Members.Remove(_nick); 
    316                             } 
    317                         } 
    318                         catch (XmlException xe) { Trace.WriteLine(xe.Message); } 
    319                         catch (InvalidOperationException ioe) { Trace.WriteLine(ioe.Message); } 
    320                     } 
    321                 } 
    322                 catch (IOException ie) 
    323                 { 
    324                     SendTwitterGatewayServerMessage("エラー: " + ie.Message); 
    325                     Trace.WriteLine(ie.Message); 
    326                 } 
    327             } 
    328         } 
    329         /// <summary> 
    330         ///  
    331         /// </summary> 
    332         private void SaveGroups() 
    333201        { 
    334202            // group 読み取り 
    335203            lock (_groups) 
    336204            { 
    337                 String dir = Path.Combine(ConfigBasePath, _username); 
    338                 String path = Path.Combine(dir, "Groups.xml"); 
    339                 Trace.WriteLine(String.Format("Save Group: {0}", path)); 
     205                String path = Path.Combine(ConfigBasePath, Path.Combine(_username, "Groups.xml")); 
    340206                try 
    341207                { 
    342                     Directory.CreateDirectory(dir); 
    343                     using (FileStream fs = new FileStream(path, FileMode.Create)) 
    344                     { 
    345                         try 
    346                         { 
    347                             _groups.Serialize(fs); 
    348                         } 
    349                         catch (XmlException xe) { Trace.WriteLine(xe.Message); } 
    350                         catch (InvalidOperationException ioe) { Trace.WriteLine(ioe.Message); } 
     208                    _groups = Groups.Load(path); 
     209 
     210                    // 下位互換性FIX: グループに自分自身のNICKは存在しないようにします 
     211                    foreach (Group g in _groups.Values) 
     212                    { 
     213                        g.Members.Remove(_nick); 
    351214                    } 
    352215                } 
     
    354217                { 
    355218                    SendTwitterGatewayServerMessage("エラー: " + ie.Message); 
    356                     Trace.WriteLine(ie.Message); 
    357                 } 
    358             } 
    359         } 
    360  
     219                } 
     220            } 
     221        } 
     222        /// <summary> 
     223        ///  
     224        /// </summary> 
     225        private void SaveGroups() 
     226        { 
     227            // group 読み取り 
     228            lock (_groups) 
     229            { 
     230                String path = Path.Combine(ConfigBasePath, Path.Combine(_username, "Groups.xml")); 
     231                try 
     232                { 
     233                    _groups.Save(path); 
     234                } 
     235                catch (IOException ie) 
     236                { 
     237                    SendTwitterGatewayServerMessage("エラー: " + ie.Message); 
     238                } 
     239            } 
     240        } 
     241        /// <summary> 
     242        ///  
     243        /// </summary> 
     244        private void LoadConfig() 
     245        { 
     246            lock (_config) 
     247            { 
     248                String path = Path.Combine(ConfigBasePath, Path.Combine(_username, "Config.xml")); 
     249                try 
     250                { 
     251                    _config = Config.Load(path); 
     252                } 
     253                catch (IOException ie) 
     254                { 
     255                    SendTwitterGatewayServerMessage("エラー: " + ie.Message); 
     256                } 
     257            } 
     258        }         
     259        /// <summary> 
     260        ///  
     261        /// </summary> 
     262        private void SaveConfig() 
     263        { 
     264            lock (_config) 
     265            { 
     266                String path = Path.Combine(ConfigBasePath, Path.Combine(_username, "Config.xml")); 
     267                try 
     268                { 
     269                    _config.Save(path); 
     270                } 
     271                catch (IOException ie) 
     272                { 
     273                    SendTwitterGatewayServerMessage("エラー: " + ie.Message); 
     274                } 
     275            } 
     276        } 
    361277        protected virtual void OnSessionEnded() 
    362278        { 
     
    382298 
    383299        #region メッセージ処理イベント 
    384         private void MessageRecieved_JOIN(object sender, MessageRecievedEventArgs e) 
     300        private void MessageReceived_JOIN(object sender, MessageReceivedEventArgs e) 
    385301        { 
    386302            Trace.WriteLine(e.Message.ToString()); 
     
    422338                     
    423339                    // Set topic of client, if topic was set 
    424                     Send(new TopicMessage(channelName, group.Topic)); 
     340                    if (!String.IsNullOrEmpty(group.Topic)) 
     341                    { 
     342                        Send(new TopicMessage(channelName, group.Topic)); 
     343                    } 
     344                    else 
     345                    { 
     346                        SendNumericReply(NumericReply.RPL_NOTOPIC, channelName, "No topic is set"); 
     347                    } 
    425348                } 
    426349            } 
    427350       } 
    428351 
    429         private void MessageRecieved_PART(object sender, MessageRecievedEventArgs e) 
     352        private void MessageReceived_PART(object sender, MessageReceivedEventArgs e) 
    430353        { 
    431354            if (!(e.Message is PartMessage)) return;