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)
17 ChannelMessageContext channelContext = context as ChannelMessageContext;
18 channelContext.Channel.Talk(message);
20 else if (context is UserMessageContext)
22 UserMessageContext userContext = context as UserMessageContext;
23 userContext.User.Talk(message);
27 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
33 public class IrcTechBotService : TechBotService
36 private string hostname;
37 private string channelnames;
38 private string botname;
39 private string password;
40 private string chmPath;
41 private string mainChm;
42 private IrcClient m_IrcClient;
43 private ArrayList channels = new ArrayList();
44 private bool isStopped = false;
46 public IrcTechBotService(string hostname,
53 : base (new IrcServiceOutput() , chmPath , mainChm)
55 this.hostname = hostname;
57 this.channelnames = channelnames;
58 this.botname = botname;
59 if (password == null || password.Trim() == "")
62 this.password = password;
63 this.chmPath = chmPath;
64 this.mainChm = mainChm;
67 public override void Run()
72 m_IrcClient = new IrcClient();
73 m_IrcClient.Encoding = Encoding.GetEncoding("iso-8859-1");
74 m_IrcClient.OnConnect += new OnConnectHandler(m_IrcClient_OnConnect);
75 m_IrcClient.OnConnectionLost += new OnConnectionLostHandler(m_IrcClient_OnConnectionLost);
76 m_IrcClient.OnDisconnect += new OnDisconnectHandler(m_IrcClient_OnDisconnect);
77 m_IrcClient.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
78 m_IrcClient.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
83 void m_IrcClient_OnConnect()
85 Console.WriteLine("Connected...");
88 private void Connect()
90 Console.WriteLine("Connecting to {0} port {1}",
93 m_IrcClient.Connect(hostname, port);
95 m_IrcClient.Register(botname, password, null);
96 Console.WriteLine("Registered as {0}...", botname);
105 m_IrcClient.Diconnect();
108 void m_IrcClient_OnDisconnect()
110 Console.WriteLine("Disconnected...");
113 void m_IrcClient_OnConnectionLost()
115 //Dispose old connection
119 Thread.Sleep(1000 * 60);
125 private void Disconnect()
129 m_IrcClient.Diconnect();
142 private void JoinChannels()
144 foreach (string channelname in channelnames.Split(new char[] { ';' }))
146 IrcChannel channel = m_IrcClient.JoinChannel(channelname);
147 channels.Add(channel);
148 System.Console.WriteLine(String.Format("Joined channel #{0}...",
153 private void PartChannels()
155 foreach (IrcChannel channel in channels)
157 m_IrcClient.PartChannel(channel, "Caught in the bitstream...");
158 System.Console.WriteLine(String.Format("Parted channel #{0}...",
163 private string GetMessageSource(MessageContext context)
165 if (context is ChannelMessageContext)
167 ChannelMessageContext channelContext = context as ChannelMessageContext;
168 return String.Format("#{0}",
169 channelContext.Channel.Name);
171 else if (context is UserMessageContext)
173 UserMessageContext userContext = context as UserMessageContext;
174 return userContext.User.Nickname;
178 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
183 private void ExtractMessage(string parameters,
186 int startIndex = parameters.IndexOf(':');
187 if (startIndex != -1)
189 message = parameters.Substring(startIndex + 1);
193 message = parameters;
197 private bool GetChannelName(IrcMessage message,
198 out string channelName)
200 if (message.Parameters == null || !message.Parameters.StartsWith("#"))
206 int index = message.Parameters.IndexOf(' ');
208 index = message.Parameters.Length;
211 channelName = message.Parameters.Substring(1, index);
215 private bool GetTargetNickname(IrcMessage message,
218 if (message.Parameters == null)
224 int index = message.Parameters.IndexOf(' ');
226 index = message.Parameters.Length;
227 nickname = message.Parameters.Substring(0, index);
228 Console.WriteLine("nickname: " + nickname);
232 private bool ShouldAcceptMessage(IrcMessage message,
233 out MessageContext context)
235 if (message.Command.ToUpper().Equals("PRIVMSG"))
239 if (GetChannelName(message,
242 foreach (IrcChannel channel in channels)
244 if (String.Compare(channel.Name, channelName, true) == 0)
246 context = new ChannelMessageContext(channel);
251 else if (GetTargetNickname(message,
254 IrcUser targetUser = new IrcUser(m_IrcClient,
256 if (String.Compare(targetUser.Nickname, botname, true) == 0)
258 IrcUser sourceUser = new IrcUser(m_IrcClient,
259 message.PrefixNickname);
260 context = new UserMessageContext(sourceUser);
269 private void client_MessageReceived(IrcMessage message)
273 if (message.Command != null &&
274 message.Parameters != null)
276 string injectMessage;
277 ExtractMessage(message.Parameters,
279 MessageContext context;
280 if (ShouldAcceptMessage(message,
283 Console.WriteLine(String.Format("Injecting: {0} from {1}",
285 GetMessageSource(context)));
286 InjectMessage(context,
291 Console.WriteLine("Received: " + message.Line);
296 Console.WriteLine("Received: " + message.Line);
301 Console.WriteLine(String.Format("Exception: {0}", ex));
305 private void client_ChannelUserDatabaseChanged(IrcChannel channel)