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;
19 private string svnCommand;
20 private IrcClient client;
21 private ArrayList channels = new ArrayList(); /* IrcChannel */
22 private TechBotService service;
23 private bool isStopped = false;
25 public IrcService(string hostname,
36 this.hostname = hostname;
38 this.channelnames = channelnames;
39 this.botname = botname;
40 this.chmPath = chmPath;
41 this.mainChm = mainChm;
42 this.ntstatusXml = ntstatusXml;
43 this.winerrorXml = winerrorXml;
44 this.hresultXml = hresultXml;
45 this.svnCommand = svnCommand;
50 service = new TechBotService(this,
59 client = new IrcClient();
60 client.Encoding = System.Text.Encoding.GetEncoding("iso-8859-1");
61 client.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
62 client.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
63 System.Console.WriteLine(String.Format("Connecting to {0} port {1}",
65 client.Connect(hostname, port);
66 System.Console.WriteLine("Connected...");
67 client.Register(botname, null);
68 System.Console.WriteLine(String.Format("Registered as {0}...", botname));
78 System.Console.WriteLine("Disconnected...");
86 private void JoinChannels()
88 foreach (string channelname in channelnames.Split(new char[] { ';' }))
90 IrcChannel channel = client.JoinChannel(channelname);
91 channels.Add(channel);
92 System.Console.WriteLine(String.Format("Joined channel #{0}...",
97 private void PartChannels()
99 foreach (IrcChannel channel in channels)
101 client.PartChannel(channel, "Caught in the bitstream...");
102 System.Console.WriteLine(String.Format("Parted channel #{0}...",
107 private string GetMessageSource(MessageContext context)
109 if (context is ChannelMessageContext)
111 ChannelMessageContext channelContext = context as ChannelMessageContext;
112 return String.Format("#{0}",
113 channelContext.Channel.Name);
115 else if (context is UserMessageContext)
117 UserMessageContext userContext = context as UserMessageContext;
118 return userContext.User.Nickname;
122 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
127 public void WriteLine(MessageContext context,
130 if (context is ChannelMessageContext)
132 ChannelMessageContext channelContext = context as ChannelMessageContext;
133 channelContext.Channel.Talk(message);
135 else if (context is UserMessageContext)
137 UserMessageContext userContext = context as UserMessageContext;
138 userContext.User.Talk(message);
142 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
147 private void ExtractMessage(string parameters,
150 int startIndex = parameters.IndexOf(':');
151 if (startIndex != -1)
153 message = parameters.Substring(startIndex + 1);
157 message = parameters;
161 private bool GetChannelName(IrcMessage message,
162 out string channelName)
164 if (message.Parameters == null || !message.Parameters.StartsWith("#"))
170 int index = message.Parameters.IndexOf(' ');
172 index = message.Parameters.Length;
175 channelName = message.Parameters.Substring(1, index);
179 private bool GetTargetNickname(IrcMessage message,
182 if (message.Parameters == null)
188 int index = message.Parameters.IndexOf(' ');
190 index = message.Parameters.Length;
191 nickname = message.Parameters.Substring(0, index);
192 Console.WriteLine("nickname: " + nickname);
196 private bool ShouldAcceptMessage(IrcMessage message,
197 out MessageContext context)
199 if (message.Command.ToUpper().Equals("PRIVMSG"))
203 if (GetChannelName(message,
206 foreach (IrcChannel channel in channels)
208 if (String.Compare(channel.Name, channelName, true) == 0)
210 context = new ChannelMessageContext(channel);
215 else if (GetTargetNickname(message,
218 IrcUser targetUser = new IrcUser(client,
220 if (String.Compare(targetUser.Nickname, botname, true) == 0)
222 IrcUser sourceUser = new IrcUser(client,
223 message.PrefixNickname);
224 context = new UserMessageContext(sourceUser);
233 private void client_MessageReceived(IrcMessage message)
237 if (message.Command != null &&
238 message.Parameters != null)
240 string injectMessage;
241 ExtractMessage(message.Parameters,
243 MessageContext context;
244 if (ShouldAcceptMessage(message,
247 Console.WriteLine(String.Format("Injecting: {0} from {1}",
249 GetMessageSource(context)));
250 service.InjectMessage(context,
255 Console.WriteLine("Received: " + message.Line);
260 Console.WriteLine("Received: " + message.Line);
265 Console.WriteLine(String.Format("Exception: {0}", ex));
269 private void client_ChannelUserDatabaseChanged(IrcChannel channel)