2 using System.Collections;
3 using System.Threading;
4 using TechBot.IRCLibrary;
6 namespace TechBot.Library
8 public class IrcService : IServiceOutput
10 private string hostname;
12 private string channelnames;
13 private string botname;
14 private string chmPath;
15 private string mainChm;
16 private string ntstatusXml;
17 private string winerrorXml;
18 private string hresultXml;
20 private string svnCommand;
21 private IrcClient client;
22 private ArrayList channels = new ArrayList(); /* IrcChannel */
23 private TechBotService service;
24 private bool isStopped = false;
26 public IrcService(string hostname,
38 this.hostname = hostname;
40 this.channelnames = channelnames;
41 this.botname = botname;
42 this.chmPath = chmPath;
43 this.mainChm = mainChm;
44 this.ntstatusXml = ntstatusXml;
45 this.winerrorXml = winerrorXml;
46 this.hresultXml = hresultXml;
48 this.svnCommand = svnCommand;
53 service = new TechBotService(this,
63 client = new IrcClient();
64 client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1");
65 client.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
66 client.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
67 System.Console.WriteLine(String.Format("Connecting to {0} port {1}",
69 client.Connect(hostname, port);
70 System.Console.WriteLine("Connected...");
71 client.Register(botname, null);
72 System.Console.WriteLine(String.Format("Registered as {0}...", botname));
82 System.Console.WriteLine("Disconnected...");
90 private void JoinChannels()
92 foreach (string channelname in channelnames.Split(new char[] { ';' }))
94 IrcChannel channel = client.JoinChannel(channelname);
95 channels.Add(channel);
96 System.Console.WriteLine(String.Format("Joined channel #{0}...",
101 private void PartChannels()
103 foreach (IrcChannel channel in channels)
105 client.PartChannel(channel, "Caught in the bitstream...");
106 System.Console.WriteLine(String.Format("Parted channel #{0}...",
111 private string GetMessageSource(MessageContext context)
113 if (context is ChannelMessageContext)
115 ChannelMessageContext channelContext = context as ChannelMessageContext;
116 return String.Format("#{0}",
117 channelContext.Channel.Name);
119 else if (context is UserMessageContext)
121 UserMessageContext userContext = context as UserMessageContext;
122 return userContext.User.Nickname;
126 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
131 public void WriteLine(MessageContext context,
134 if (context is ChannelMessageContext)
136 ChannelMessageContext channelContext = context as ChannelMessageContext;
137 channelContext.Channel.Talk(message);
139 else if (context is UserMessageContext)
141 UserMessageContext userContext = context as UserMessageContext;
142 userContext.User.Talk(message);
146 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
151 private void ExtractMessage(string parameters,
154 int startIndex = parameters.IndexOf(':');
155 if (startIndex != -1)
157 message = parameters.Substring(startIndex + 1);
161 message = parameters;
165 private bool GetChannelName(IrcMessage message,
166 out string channelName)
168 if (message.Parameters == null || !message.Parameters.StartsWith("#"))
174 int index = message.Parameters.IndexOf(' ');
176 index = message.Parameters.Length;
179 channelName = message.Parameters.Substring(1, index);
183 private bool GetTargetNickname(IrcMessage message,
186 if (message.Parameters == null)
192 int index = message.Parameters.IndexOf(' ');
194 index = message.Parameters.Length;
195 nickname = message.Parameters.Substring(0, index);
196 Console.WriteLine("nickname: " + nickname);
200 private bool ShouldAcceptMessage(IrcMessage message,
201 out MessageContext context)
203 if (message.Command.ToUpper().Equals("PRIVMSG"))
207 if (GetChannelName(message,
210 foreach (IrcChannel channel in channels)
212 if (String.Compare(channel.Name, channelName, true) == 0)
214 context = new ChannelMessageContext(channel);
219 else if (GetTargetNickname(message,
222 IrcUser targetUser = new IrcUser(client,
224 if (String.Compare(targetUser.Nickname, botname, true) == 0)
226 IrcUser sourceUser = new IrcUser(client,
227 message.PrefixNickname);
228 context = new UserMessageContext(sourceUser);
237 private void client_MessageReceived(IrcMessage message)
241 if (message.Command != null &&
242 message.Parameters != null)
244 string injectMessage;
245 ExtractMessage(message.Parameters,
247 MessageContext context;
248 if (ShouldAcceptMessage(message,
251 Console.WriteLine(String.Format("Injecting: {0} from {1}",
253 GetMessageSource(context)));
254 service.InjectMessage(context,
259 Console.WriteLine("Received: " + message.Line);
264 Console.WriteLine("Received: " + message.Line);
269 Console.WriteLine(String.Format("Exception: {0}", ex));
273 private void client_ChannelUserDatabaseChanged(IrcChannel channel)