The easy to use and full featured Irc Bot everyone is talking about!
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Reflection;
  7. using System.Threading.Tasks;
  8. using Combot.IRCServices;
  9. using Combot.Configurations;
  10. using Combot.IRCServices.Messaging;
  11. using Combot.Modules;
  12. using Module = Combot.Modules.Module;
  13. namespace Combot
  14. {
  15. public class Bot
  16. {
  17. public event Action<CommandMessage> CommandReceivedEvent;
  18. public event Action<BotError> ErrorEvent;
  19. public ServerConfig ServerConfig;
  20. public IRC IRC;
  21. public bool Connected = false;
  22. public static Dictionary<PrivilegeMode, AccessType> AccessTypeMapping = new Dictionary<PrivilegeMode, AccessType>() { { PrivilegeMode.v, AccessType.Voice }, { PrivilegeMode.h, AccessType.HalfOperator }, { PrivilegeMode.o, AccessType.Operator }, { PrivilegeMode.a, AccessType.SuperOperator }, { PrivilegeMode.q, AccessType.Founder } };
  23. private List<Module> _Modules;
  24. public Bot(ServerConfig serverConfig)
  25. {
  26. IRC = new IRC();
  27. _Modules = new List<Module>();
  28. ServerConfig = serverConfig;
  29. IRC.ConnectEvent += HandleConnectEvent;
  30. IRC.DisconnectEvent += HandleDisconnectEvent;
  31. IRC.Message.ServerReplyEvent += HandleReplyEvent;
  32. IRC.Message.ChannelMessageReceivedEvent += HandleChannelMessageReceivedEvent;
  33. LoadModules();
  34. }
  35. /// <summary>
  36. /// Trys to connect to one of the IPs of the given hostname. If the connection was successful, it will login the nick.
  37. /// </summary>
  38. public void Connect()
  39. {
  40. bool serverConnected = false;
  41. int i = 0;
  42. do
  43. {
  44. if (ServerConfig.Hosts.Count > i)
  45. {
  46. IPAddress[] ipList = Dns.GetHostAddresses(ServerConfig.Hosts[i].Host);
  47. foreach (IPAddress ip in ipList)
  48. {
  49. serverConnected = IRC.Connect(ip, ServerConfig.Hosts[i].Port, 5000);
  50. if (serverConnected)
  51. {
  52. break;
  53. }
  54. }
  55. i++;
  56. }
  57. else
  58. {
  59. break;
  60. }
  61. }
  62. while (!serverConnected);
  63. if (serverConnected)
  64. {
  65. IRC.Login(ServerConfig.Name, new Nick() { Nickname = ServerConfig.Nickname, Host = Dns.GetHostName(), Realname = ServerConfig.Realname, Username = ServerConfig.Username });
  66. }
  67. }
  68. /// <summary>
  69. /// Disconnects from the current server.
  70. /// </summary>
  71. public void Disconnect()
  72. {
  73. IRC.Disconnect();
  74. Connected = false;
  75. }
  76. public void LoadModules()
  77. {
  78. foreach (Module module in ServerConfig.Modules)
  79. {
  80. if (module.Enabled && !_Modules.Exists(mod => mod.ClassName == module.ClassName))
  81. {
  82. Module loadedModule = module.CreateInstance(this);
  83. if (loadedModule.Loaded)
  84. {
  85. _Modules.Add(loadedModule);
  86. }
  87. }
  88. }
  89. }
  90. private void HandleConnectEvent()
  91. {
  92. Connected = true;
  93. }
  94. private void HandleDisconnectEvent()
  95. {
  96. Connected = false;
  97. }
  98. private void HandleReplyEvent(object sender, IReply e)
  99. {
  100. if (e.GetType() == typeof(ServerReplyMessage))
  101. {
  102. ServerReplyMessage reply = (ServerReplyMessage)e;
  103. // If the reply is Welcome, that means we are fully connected to the server and can now join the auto-join channels.
  104. if (reply.ReplyCode == IRCReplyCode.RPL_WELCOME && Connected)
  105. {
  106. foreach (ChannelConfig channel in ServerConfig.Channels)
  107. {
  108. IRC.SendJoin(channel.Name, channel.Key);
  109. }
  110. }
  111. }
  112. }
  113. private void HandleChannelMessageReceivedEvent(object sender, ChannelMessage e)
  114. {
  115. // The message was a command
  116. if (e.Message.StartsWith(ServerConfig.CommandPrefix))
  117. {
  118. if (!ServerConfig.ChannelBlacklist.Contains(e.Channel)
  119. && !ServerConfig.NickBlacklist.Contains(e.Sender.Nickname)
  120. )
  121. {
  122. ParseCommandMessage(e.TimeStamp, e.Message, e.Sender, e.Channel, LocationType.Channel);
  123. }
  124. }
  125. }
  126. private void ParseCommandMessage(DateTime timestamp, string message, Nick sender, string location, LocationType locationType)
  127. {
  128. // Extract command and arguments
  129. string[] msgArgs = message.Split(new[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries);
  130. string command = msgArgs[0].Remove(0, ServerConfig.CommandPrefix.Length);
  131. List<string> argsOnly = msgArgs.ToList();
  132. argsOnly.RemoveAt(0);
  133. Module module = _Modules.Find(mod => mod.Commands.Exists(c => c.Triggers.Contains(command)) && mod.Loaded);
  134. if (module != null)
  135. {
  136. Command cmd = module.Commands.Find(c => c.Triggers.Contains(command));
  137. if (cmd != null)
  138. {
  139. CommandMessage newCommand = new CommandMessage();
  140. newCommand.Nick.Copy(sender);
  141. IRC.Channels.ForEach(channel => channel.Nicks.ForEach(nick =>
  142. {
  143. if (nick.Nickname == newCommand.Nick.Nickname)
  144. {
  145. newCommand.Nick.AddPrivileges(nick.Privileges);
  146. }
  147. }));
  148. newCommand.TimeStamp = timestamp;
  149. newCommand.Location = location;
  150. newCommand.LocationType = locationType;
  151. newCommand.Command = command;
  152. if (argsOnly.Count > 0)
  153. {
  154. string[] argSplit = argsOnly.First()
  155. .Split(new[] {' '}, cmd.Arguments.Count + 1, StringSplitOptions.RemoveEmptyEntries);
  156. for (int i = 0; i < cmd.Arguments.Count; i++)
  157. {
  158. newCommand.Arguments.Add(argSplit[i]);
  159. }
  160. }
  161. if (CommandReceivedEvent != null)
  162. {
  163. CommandReceivedEvent(newCommand);
  164. }
  165. }
  166. }
  167. }
  168. }
  169. }