Support private messages
[reactos.git] / irc / TechBot / TechBot.Library / IrcService.cs
index efb9d60..374c475 100644 (file)
@@ -104,13 +104,44 @@ namespace TechBot.Library
                        }\r
                }\r
 \r
+               private string GetMessageSource(MessageContext context)\r
+               {\r
+                       if (context is ChannelMessageContext)\r
+                       {\r
+                               ChannelMessageContext channelContext = context as ChannelMessageContext;\r
+                               return String.Format("#{0}",\r
+                                                    channelContext.Channel.Name);\r
+                       }\r
+                       else if (context is UserMessageContext)\r
+                       {\r
+                               UserMessageContext userContext = context as UserMessageContext;\r
+                               return userContext.User.Nickname;\r
+                       }\r
+                       else\r
+                       {\r
+                               throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",\r
+                                                                                 context.GetType()));\r
+                       }\r
+               }\r
+\r
                public void WriteLine(MessageContext context,\r
                                      string message)\r
                {\r
-                       Console.WriteLine(String.Format("Sending: {0} to #{1}",\r
-                                                       message,\r
-                                                       context.Channel != null ? context.Channel.Name : "(null)"));\r
-                       context.Channel.Talk(message);\r
+                       if (context is ChannelMessageContext)\r
+                       {\r
+                               ChannelMessageContext channelContext = context as ChannelMessageContext;\r
+                               channelContext.Channel.Talk(message);\r
+                       }\r
+                       else if (context is UserMessageContext)\r
+                       {\r
+                               UserMessageContext userContext = context as UserMessageContext;\r
+                               userContext.User.Talk(message);\r
+                       }\r
+                       else\r
+                       {\r
+                               throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",\r
+                                                                                 context.GetType()));\r
+                       }\r
                }\r
 \r
                private void ExtractMessage(string parameters,\r
@@ -139,7 +170,26 @@ namespace TechBot.Library
                        int index = message.Parameters.IndexOf(' ');\r
                        if (index == -1)\r
                                index = message.Parameters.Length;\r
-                       channelName = message.Parameters.Substring(1, index - 1);\r
+                       else\r
+                               index = index - 1;\r
+                       channelName = message.Parameters.Substring(1, index);\r
+                       return true;\r
+               }\r
+\r
+               private bool GetTargetNickname(IrcMessage message,\r
+                                              out string nickname)\r
+               {\r
+                       if (message.Parameters == null)\r
+                       {\r
+                               nickname = null;\r
+                               return false;\r
+                       }\r
+\r
+                       int index = message.Parameters.IndexOf(' ');\r
+                       if (index == -1)\r
+                               index = message.Parameters.Length;\r
+                       nickname = message.Parameters.Substring(0, index);\r
+                       Console.WriteLine("nickname: " + nickname);\r
                        return true;\r
                }\r
 \r
@@ -149,6 +199,7 @@ namespace TechBot.Library
                        if (message.Command.ToUpper().Equals("PRIVMSG"))\r
                        {\r
                                string channelName;\r
+                               string nickname;\r
                                if (GetChannelName(message,\r
                                                   out channelName))\r
                                {\r
@@ -156,11 +207,24 @@ namespace TechBot.Library
                                        {\r
                                                if (String.Compare(channel.Name, channelName, true) == 0)\r
                                                {\r
-                                                       context = new MessageContext(channel);\r
+                                                       context = new ChannelMessageContext(channel);\r
                                                        return true;\r
                                                }\r
                                        }\r
                                }\r
+                               else if (GetTargetNickname(message,\r
+                                                          out nickname))\r
+                               {\r
+                                       IrcUser targetUser = new IrcUser(client,\r
+                                                                        nickname);\r
+                                       if (String.Compare(targetUser.Nickname, botname, true) == 0)\r
+                                       {\r
+                                               IrcUser sourceUser = new IrcUser(client,\r
+                                                                                message.PrefixNickname);\r
+                                               context = new UserMessageContext(sourceUser);\r
+                                               return true;\r
+                                       }\r
+                               }\r
                        }\r
                        context = null;\r
                        return false;\r
@@ -180,9 +244,9 @@ namespace TechBot.Library
                                        if (ShouldAcceptMessage(message,\r
                                                                out context))\r
                                        {\r
-                                               Console.WriteLine(String.Format("Injecting: {0} from #{1}",\r
+                                               Console.WriteLine(String.Format("Injecting: {0} from {1}",\r
                                                                                injectMessage,\r
-                                                                               context.Channel.Name));\r
+                                                                               GetMessageSource(context)));\r
                                                service.InjectMessage(context,\r
                                                                      injectMessage);\r
                                        }\r