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.MessageReceived += new MessageReceivedHandler(client_MessageReceived);
75 m_IrcClient.ChannelUserDatabaseChanged += new ChannelUserDatabaseChangedHandler(client_ChannelUserDatabaseChanged);
76 Console.WriteLine("Connecting to {0} port {1}",
79 m_IrcClient.Connect(hostname, port);
80 Console.WriteLine("Connected...");
81 m_IrcClient.Register(botname, password, null);
82 Console.WriteLine("Registered as {0}...", botname);
91 m_IrcClient.Diconnect();
92 Console.WriteLine("Disconnected...");
100 private void JoinChannels()
102 foreach (string channelname in channelnames.Split(new char[] { ';' }))
104 IrcChannel channel = m_IrcClient.JoinChannel(channelname);
105 channels.Add(channel);
106 System.Console.WriteLine(String.Format("Joined channel #{0}...",
111 private void PartChannels()
113 foreach (IrcChannel channel in channels)
115 m_IrcClient.PartChannel(channel, "Caught in the bitstream...");
116 System.Console.WriteLine(String.Format("Parted channel #{0}...",
121 private string GetMessageSource(MessageContext context)
123 if (context is ChannelMessageContext)
125 ChannelMessageContext channelContext = context as ChannelMessageContext;
126 return String.Format("#{0}",
127 channelContext.Channel.Name);
129 else if (context is UserMessageContext)
131 UserMessageContext userContext = context as UserMessageContext;
132 return userContext.User.Nickname;
136 throw new InvalidOperationException(String.Format("Unhandled message context '{0}'",
141 private void ExtractMessage(string parameters,
144 int startIndex = parameters.IndexOf(':');
145 if (startIndex != -1)
147 message = parameters.Substring(startIndex + 1);
151 message = parameters;
155 private bool GetChannelName(IrcMessage message,
156 out string channelName)
158 if (message.Parameters == null || !message.Parameters.StartsWith("#"))
164 int index = message.Parameters.IndexOf(' ');
166 index = message.Parameters.Length;
169 channelName = message.Parameters.Substring(1, index);
173 private bool GetTargetNickname(IrcMessage message,
176 if (message.Parameters == null)
182 int index = message.Parameters.IndexOf(' ');
184 index = message.Parameters.Length;
185 nickname = message.Parameters.Substring(0, index);
186 Console.WriteLine("nickname: " + nickname);
190 private bool ShouldAcceptMessage(IrcMessage message,
191 out MessageContext context)
193 if (message.Command.ToUpper().Equals("PRIVMSG"))
197 if (GetChannelName(message,
200 foreach (IrcChannel channel in channels)
202 if (String.Compare(channel.Name, channelName, true) == 0)
204 context = new ChannelMessageContext(channel);
209 else if (GetTargetNickname(message,
212 IrcUser targetUser = new IrcUser(m_IrcClient,
214 if (String.Compare(targetUser.Nickname, botname, true) == 0)
216 IrcUser sourceUser = new IrcUser(m_IrcClient,
217 message.PrefixNickname);
218 context = new UserMessageContext(sourceUser);
227 private void client_MessageReceived(IrcMessage message)
231 if (message.Command != null &&
232 message.Parameters != null)
234 string injectMessage;
235 ExtractMessage(message.Parameters,
237 MessageContext context;
238 if (ShouldAcceptMessage(message,
241 Console.WriteLine(String.Format("Injecting: {0} from {1}",
243 GetMessageSource(context)));
244 InjectMessage(context,
249 Console.WriteLine("Received: " + message.Line);
254 Console.WriteLine("Received: " + message.Line);
259 Console.WriteLine(String.Format("Exception: {0}", ex));
263 private void client_ChannelUserDatabaseChanged(IrcChannel channel)