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 string bugUrl;
22 private IrcClient client;
23 private ArrayList channels = new ArrayList(); /* IrcChannel */
24 private TechBotService service;
25 private bool isStopped = false;
27 public IrcService(string hostname,
40 this.hostname = hostname;
42 this.channelnames = channelnames;
43 this.botname = botname;
44 this.chmPath = chmPath;
45 this.mainChm = mainChm;
46 this.ntstatusXml = ntstatusXml;
47 this.winerrorXml = winerrorXml;
48 this.hresultXml = hresultXml;
50 this.svnCommand = svnCommand;
56 service = new TechBotService(this,
67 client = new IrcClient();
68 client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1");
69 client.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
70 client.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
71 System.Console.WriteLine(String.Format("Connecting to {0} port {1}",
73 client.Connect(hostname, port);
74 System.Console.WriteLine("Connected...");
75 client.Register(botname, null);
76 System.Console.WriteLine(String.Format("Registered as {0}...", botname));
86 System.Console.WriteLine("Disconnected...");
94 private void JoinChannels()
96 foreach (string channelname in channelnames.Split(new char[] { ';' }))
98 IrcChannel channel = client.JoinChannel(channelname);
99 channels.Add(channel);
100 System.Console.WriteLine(String.Format("Joined channel #{0}...",
105 private void PartChannels()
107 foreach (IrcChannel channel in channels)
109 client.PartChannel(channel, "Caught in the bitstream...");
110 System.Console.WriteLine(String.Format("Parted channel #{0}...",
115 private string GetMessageSource(MessageContext context)
117 if (context is ChannelMessageContext)
119 ChannelMessageContext channelContext = context as ChannelMessageContext;
120 return String.Format("#{0}",
121 channelContext.Channel.Name);
123 else if (context is UserMessageContext)
125 UserMessageContext userContext = context as UserMessageContext;
126 return userContext.User.Nickname;
130 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
135 public void WriteLine(MessageContext context,
138 if (context is ChannelMessageContext)
140 ChannelMessageContext channelContext = context as ChannelMessageContext;
141 channelContext.Channel.Talk(message);
143 else if (context is UserMessageContext)
145 UserMessageContext userContext = context as UserMessageContext;
146 userContext.User.Talk(message);
150 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
155 private void ExtractMessage(string parameters,
158 int startIndex = parameters.IndexOf(':');
159 if (startIndex != -1)
161 message = parameters.Substring(startIndex + 1);
165 message = parameters;
169 private bool GetChannelName(IrcMessage message,
170 out string channelName)
172 if (message.Parameters == null || !message.Parameters.StartsWith("#"))
178 int index = message.Parameters.IndexOf(' ');
180 index = message.Parameters.Length;
183 channelName = message.Parameters.Substring(1, index);
187 private bool GetTargetNickname(IrcMessage message,
190 if (message.Parameters == null)
196 int index = message.Parameters.IndexOf(' ');
198 index = message.Parameters.Length;
199 nickname = message.Parameters.Substring(0, index);
200 Console.WriteLine("nickname: " + nickname);
204 private bool ShouldAcceptMessage(IrcMessage message,
205 out MessageContext context)
207 if (message.Command.ToUpper().Equals("PRIVMSG"))
211 if (GetChannelName(message,
214 foreach (IrcChannel channel in channels)
216 if (String.Compare(channel.Name, channelName, true) == 0)
218 context = new ChannelMessageContext(channel);
223 else if (GetTargetNickname(message,
226 IrcUser targetUser = new IrcUser(client,
228 if (String.Compare(targetUser.Nickname, botname, true) == 0)
230 IrcUser sourceUser = new IrcUser(client,
231 message.PrefixNickname);
232 context = new UserMessageContext(sourceUser);
241 private void client_MessageReceived(IrcMessage message)
245 if (message.Command != null &&
246 message.Parameters != null)
248 string injectMessage;
249 ExtractMessage(message.Parameters,
251 MessageContext context;
252 if (ShouldAcceptMessage(message,
255 Console.WriteLine(String.Format("Injecting: {0} from {1}",
257 GetMessageSource(context)));
258 service.InjectMessage(context,
263 Console.WriteLine("Received: " + message.Line);
268 Console.WriteLine("Received: " + message.Line);
273 Console.WriteLine(String.Format("Exception: {0}", ex));
277 private void client_ChannelUserDatabaseChanged(IrcChannel channel)