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 password;
15 private string chmPath;
16 private string mainChm;
17 private string ntstatusXml;
18 private string winerrorXml;
19 private string hresultXml;
21 private string svnCommand;
22 private string bugUrl, WineBugUrl, SambaBugUrl;
23 private IrcClient client;
24 private ArrayList channels = new ArrayList(); /* IrcChannel */
25 private TechBotService service;
26 private bool isStopped = false;
28 public IrcService(string hostname,
44 this.hostname = hostname;
46 this.channelnames = channelnames;
47 this.botname = botname;
48 if (password == null || password.Trim() == "")
51 this.password = password;
52 this.chmPath = chmPath;
53 this.mainChm = mainChm;
54 this.ntstatusXml = ntstatusXml;
55 this.winerrorXml = winerrorXml;
56 this.hresultXml = hresultXml;
58 this.svnCommand = svnCommand;
60 this.WineBugUrl = WineBugUrl;
61 this.SambaBugUrl = SambaBugUrl;
66 service = new TechBotService(this,
79 client = new IrcClient();
80 client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1");
81 client.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
82 client.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
83 System.Console.WriteLine(String.Format("Connecting to {0} port {1}",
85 client.Connect(hostname, port);
86 System.Console.WriteLine("Connected...");
87 client.Register(botname, password, null);
88 System.Console.WriteLine(String.Format("Registered as {0}...", botname));
98 System.Console.WriteLine("Disconnected...");
106 private void JoinChannels()
108 foreach (string channelname in channelnames.Split(new char[] { ';' }))
110 IrcChannel channel = client.JoinChannel(channelname);
111 channels.Add(channel);
112 System.Console.WriteLine(String.Format("Joined channel #{0}...",
117 private void PartChannels()
119 foreach (IrcChannel channel in channels)
121 client.PartChannel(channel, "Caught in the bitstream...");
122 System.Console.WriteLine(String.Format("Parted channel #{0}...",
127 private string GetMessageSource(MessageContext context)
129 if (context is ChannelMessageContext)
131 ChannelMessageContext channelContext = context as ChannelMessageContext;
132 return String.Format("#{0}",
133 channelContext.Channel.Name);
135 else if (context is UserMessageContext)
137 UserMessageContext userContext = context as UserMessageContext;
138 return userContext.User.Nickname;
142 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
147 public void WriteLine(MessageContext context,
150 if (context is ChannelMessageContext)
152 ChannelMessageContext channelContext = context as ChannelMessageContext;
153 channelContext.Channel.Talk(message);
155 else if (context is UserMessageContext)
157 UserMessageContext userContext = context as UserMessageContext;
158 userContext.User.Talk(message);
162 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
167 private void ExtractMessage(string parameters,
170 int startIndex = parameters.IndexOf(':');
171 if (startIndex != -1)
173 message = parameters.Substring(startIndex + 1);
177 message = parameters;
181 private bool GetChannelName(IrcMessage message,
182 out string channelName)
184 if (message.Parameters == null || !message.Parameters.StartsWith("#"))
190 int index = message.Parameters.IndexOf(' ');
192 index = message.Parameters.Length;
195 channelName = message.Parameters.Substring(1, index);
199 private bool GetTargetNickname(IrcMessage message,
202 if (message.Parameters == null)
208 int index = message.Parameters.IndexOf(' ');
210 index = message.Parameters.Length;
211 nickname = message.Parameters.Substring(0, index);
212 Console.WriteLine("nickname: " + nickname);
216 private bool ShouldAcceptMessage(IrcMessage message,
217 out MessageContext context)
219 if (message.Command.ToUpper().Equals("PRIVMSG"))
223 if (GetChannelName(message,
226 foreach (IrcChannel channel in channels)
228 if (String.Compare(channel.Name, channelName, true) == 0)
230 context = new ChannelMessageContext(channel);
235 else if (GetTargetNickname(message,
238 IrcUser targetUser = new IrcUser(client,
240 if (String.Compare(targetUser.Nickname, botname, true) == 0)
242 IrcUser sourceUser = new IrcUser(client,
243 message.PrefixNickname);
244 context = new UserMessageContext(sourceUser);
253 private void client_MessageReceived(IrcMessage message)
257 if (message.Command != null &&
258 message.Parameters != null)
260 string injectMessage;
261 ExtractMessage(message.Parameters,
263 MessageContext context;
264 if (ShouldAcceptMessage(message,
267 Console.WriteLine(String.Format("Injecting: {0} from {1}",
269 GetMessageSource(context)));
270 service.InjectMessage(context,
275 Console.WriteLine("Received: " + message.Line);
280 Console.WriteLine("Received: " + message.Line);
285 Console.WriteLine(String.Format("Exception: {0}", ex));
289 private void client_ChannelUserDatabaseChanged(IrcChannel channel)