3 using System.Collections;
4 using System.Threading;
6 using TechBot.IRCLibrary;
8 namespace TechBot.Library
10 public class IrcServiceOutput : IServiceOutput
12 public void WriteLine(MessageContext context,
15 if (context is ChannelMessageContext)
18 ChannelMessageContext channelContext = context as ChannelMessageContext;
19 channelContext.Channel.Talk(message);
21 else if (context is UserMessageContext)
23 UserMessageContext userContext = context as UserMessageContext;
24 userContext.User.Talk(message);
28 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
34 public class IrcTechBotService : TechBotService
37 private string hostname;
38 private string channelnames;
39 private string botname;
40 private string password;
41 private IrcClient m_IrcClient;
42 private ArrayList channels = new ArrayList();
43 private bool isStopped = false;
45 public IrcTechBotService(string hostname,
50 : base (new IrcServiceOutput())
52 this.hostname = hostname;
54 this.channelnames = channelnames;
55 this.botname = botname;
56 if (password == null || password.Trim() == "")
59 this.password = password;
62 public override void Run()
67 m_IrcClient = new IrcClient();
68 m_IrcClient.Encoding = Encoding.GetEncoding("iso-8859-1");
69 m_IrcClient.OnConnect += new OnConnectHandler(m_IrcClient_OnConnect);
70 m_IrcClient.OnConnectionLost += new OnConnectionLostHandler(m_IrcClient_OnConnectionLost);
71 m_IrcClient.OnDisconnect += new OnDisconnectHandler(m_IrcClient_OnDisconnect);
72 m_IrcClient.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
73 m_IrcClient.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
78 void m_IrcClient_OnConnect()
80 Console.WriteLine("Connected...");
83 private void Connect()
85 Console.WriteLine("Connecting to {0} port {1}",
88 m_IrcClient.Connect(hostname, port);
90 m_IrcClient.Register(botname, password, null);
91 Console.WriteLine("Registered as {0}...", botname);
100 m_IrcClient.Diconnect();
103 void m_IrcClient_OnDisconnect()
105 Console.WriteLine("Disconnected...");
108 void m_IrcClient_OnConnectionLost()
110 //Dispose old connection
114 Thread.Sleep(1000 * 60);
120 private void Disconnect()
124 m_IrcClient.Diconnect();
137 private void JoinChannels()
139 foreach (string channelname in channelnames.Split(new char[] { ';' }))
141 IrcChannel channel = m_IrcClient.JoinChannel(channelname);
142 channels.Add(channel);
143 System.Console.WriteLine(String.Format("Joined channel #{0}...",
148 private void PartChannels()
150 foreach (IrcChannel channel in channels)
152 m_IrcClient.PartChannel(channel, "Caught in the bitstream...");
153 System.Console.WriteLine(String.Format("Parted channel #{0}...",
158 private string GetMessageSource(MessageContext context)
160 if (context is ChannelMessageContext)
162 ChannelMessageContext channelContext = context as ChannelMessageContext;
163 return String.Format("#{0}",
164 channelContext.Channel.Name);
166 else if (context is UserMessageContext)
168 UserMessageContext userContext = context as UserMessageContext;
169 return userContext.User.Nickname;
173 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
178 private void ExtractMessage(string parameters,
181 int startIndex = parameters.IndexOf(':');
182 if (startIndex != -1)
184 message = parameters.Substring(startIndex + 1);
188 message = parameters;
192 private bool GetChannelName(IrcMessage message,
193 out string channelName)
195 if (message.Parameters == null || !message.Parameters.StartsWith("#"))
201 int index = message.Parameters.IndexOf(' ');
203 index = message.Parameters.Length;
206 channelName = message.Parameters.Substring(1, index);
210 private bool GetTargetNickname(IrcMessage message,
213 if (message.Parameters == null)
219 int index = message.Parameters.IndexOf(' ');
221 index = message.Parameters.Length;
222 nickname = message.Parameters.Substring(0, index);
223 Console.WriteLine("nickname: " + nickname);
227 private bool ShouldAcceptMessage(IrcMessage message,
228 out MessageContext context)
230 if (message.Command.ToUpper().Equals("PRIVMSG"))
234 if (GetChannelName(message,
237 foreach (IrcChannel channel in channels)
239 if (String.Compare(channel.Name, channelName, true) == 0)
241 context = new ChannelMessageContext(channel);
246 else if (GetTargetNickname(message,
249 IrcUser targetUser = new IrcUser(m_IrcClient,
251 if (String.Compare(targetUser.Nickname, botname, true) == 0)
253 IrcUser sourceUser = new IrcUser(m_IrcClient,
254 message.PrefixNickname);
255 context = new UserMessageContext(sourceUser);
264 private void client_MessageReceived(IrcMessage message)
268 if (message.Command != null &&
269 message.Parameters != null)
271 string injectMessage;
272 ExtractMessage(message.Parameters,
274 MessageContext context;
275 if (ShouldAcceptMessage(message,
278 Console.WriteLine(String.Format("Injecting: {0} from {1}",
280 GetMessageSource(context)));
281 InjectMessage(context,
286 Console.WriteLine("Received: " + message.Line);
291 Console.WriteLine("Received: " + message.Line);
296 Console.WriteLine(String.Format("Exception: {0}", ex));
300 private void client_ChannelUserDatabaseChanged(IrcChannel channel)