SirCmpwn

Untitled

Jun 17th, 2012
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.52 KB | None | 0 0
  1. // This code relies on https://github.com/alexreg/ircdotnet
  2. // I was too lazy to write my own implementation from scratch
  3. // The same bug occurs when using SmartIRC4Net.
  4.  
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using IrcDotNet;
  9. using System.Xml.Linq;
  10. using System.IO;
  11. using System.Threading;
  12. using LibMinecraft.Model;
  13. using System.Diagnostics;
  14.  
  15. namespace IAmABotAMA
  16. {
  17. static class Program
  18. {
  19. static List<Server> Servers;
  20. static List<string> Managers;
  21. static string ControlChar;
  22. static bool ShouldQuit = false;
  23.  
  24. /// <summary>
  25. /// The main entry point for the application.
  26. /// </summary>
  27. static void Main()
  28. {
  29. Servers = new List<Server>();
  30. Managers = new List<string>();
  31. XDocument config;
  32. using (Stream file = File.OpenRead("config.xml"))
  33. config = XDocument.Load(file);
  34.  
  35. // Load up configuration
  36. ControlChar = config.Root.Attribute("controlchar").Value;
  37. foreach (var server in config.Root.Element("servers").Elements("server"))
  38. {
  39. Server instance = new Server();
  40. instance.Client = new IrcClient();
  41. if (server.Element("nick") != null)
  42. instance.Nick = server.Element("nick").Value;
  43. if (server.Element("password") != null)
  44. instance.Password = server.Element("password").Value;
  45. if (server.Attribute("address") != null)
  46. {
  47. instance.Client.Connect(new Uri(server.Attribute("address").Value), new IrcUserRegistrationInfo()
  48. {
  49. NickName = instance.Nick,
  50. RealName = "IAmABotAMA",
  51. UserName = "IAmABotAMA",
  52. });
  53. instance.Client.Connected += new EventHandler<EventArgs>(Client_Connected);
  54. }
  55. if (server.Element("channels") != null)
  56. {
  57. instance.Channels = new List<string>();
  58. foreach (var channel in server.Element("channels").Elements("channel"))
  59. instance.Channels.Add(channel.Value);
  60. }
  61. Servers.Add(instance);
  62. }
  63. foreach (var manager in config.Root.Element("managers").Elements("manager"))
  64. Managers.Add(manager.Value);
  65. while (!ShouldQuit)
  66. Thread.Sleep(10);
  67. }
  68.  
  69. static void Client_Connected(object sender, EventArgs e)
  70. {
  71. Server server = GetServerFromSender(sender);
  72. server.Client.LocalUser.JoinedChannel += new EventHandler<IrcChannelEventArgs>(LocalUser_JoinedChannel);
  73. server.Client.LocalUser.NoticeReceived += new EventHandler<IrcMessageEventArgs>(LocalUser_NoticeReceived);
  74. server.Client.ProtocolError += new EventHandler<IrcProtocolErrorEventArgs>(Client_ProtocolError);
  75. server.Client.Disconnected += new EventHandler<EventArgs>(Client_Disconnected);
  76. server.Client.PongReceived += new EventHandler<IrcPingOrPongReceivedEventArgs>(Client_PongReceived);
  77. server.Client.PingReceived += new EventHandler<IrcPingOrPongReceivedEventArgs>(Client_PingReceived);
  78. server.Client.Channels.Join(server.Channels.ToArray());
  79. server.Client.LocalUser.SendMessage("NickServ", "identify " + server.Password);
  80.  
  81. server.Client.LocalUser.MessageReceived += new EventHandler<IrcMessageEventArgs>(LocalUser_MessageReceived);
  82.  
  83. //Timer timer = new Timer(new TimerCallback((object o) =>
  84. // {
  85. // Console.WriteLine("-->PING");
  86. // server.Client.Ping();
  87. // }), null, 10000, 10000);
  88. }
  89.  
  90. static void Client_PingReceived(object sender, IrcPingOrPongReceivedEventArgs e)
  91. {
  92. Console.WriteLine("<--PING");
  93. }
  94.  
  95. static void Client_PongReceived(object sender, IrcPingOrPongReceivedEventArgs e)
  96. {
  97. Console.WriteLine("<--PONG");
  98. }
  99.  
  100. static void Client_Disconnected(object sender, EventArgs e)
  101. {
  102. Console.WriteLine("DISCONNECTED");
  103. }
  104.  
  105. static void Client_ProtocolError(object sender, IrcProtocolErrorEventArgs e)
  106. {
  107. Console.WriteLine("ERROR: " + e.Code.ToString() + ": " + e.Message);
  108. }
  109.  
  110. static void LocalUser_NoticeReceived(object sender, IrcMessageEventArgs e)
  111. {
  112. Console.WriteLine("-" + e.Source + "-: " + e.Text);
  113. }
  114.  
  115. static void LocalUser_JoinedChannel(object sender, IrcChannelEventArgs e)
  116. {
  117. e.Channel.MessageReceived += new EventHandler<IrcMessageEventArgs>(Channel_MessageReceived);
  118. }
  119.  
  120. static void Channel_MessageReceived(object sender, IrcMessageEventArgs e)
  121. {
  122. Server server = GetServerFromSender((sender as IrcChannel).Client);
  123. Console.WriteLine("<" + e.Source + "> " + e.Text);
  124. if (e.Text.StartsWith(ControlChar))
  125. ExecuteCommand(server, e.Text.Substring(1), sender as IrcChannel, e.Source.Name, Managers.Contains(e.Source.Name));
  126. }
  127.  
  128. static void LocalUser_MessageReceived(object sender, IrcMessageEventArgs e)
  129. {
  130. //Server server = GetServerFromSender(sender);
  131. Console.WriteLine(e.Source.Name + ": " + e.Text);
  132. }
  133.  
  134. static void ExecuteCommand(Server Server, string Command, IrcChannel Channel, string Source, bool IsManager)
  135. {
  136. if (Command.StartsWith("ping "))
  137. {
  138. MinecraftServer.GetServerAsync(Command.Substring(5), (MinecraftServer server, object o) =>
  139. {
  140. if (server.IsOnline)
  141. {
  142. Server.Client.LocalUser.SendMessage(Channel, Source + ": ONLINE (" + server.ConnectedPlayers +
  143. "/" + server.MaxPlayers + "): " + server.MotD);
  144. }
  145. else
  146. Server.Client.LocalUser.SendMessage(Channel, Source + ": OFFLINE");
  147. }, null);
  148. }
  149. if (Command == "servers")
  150. {
  151. var creative = MinecraftServer.GetServer("c.nerd.nu");
  152. var survival = MinecraftServer.GetServer("s.nerd.nu");
  153. var pve = MinecraftServer.GetServer("p.nerd.nu");
  154. string response = "c.nerd.nu: " + (creative.IsOnline ? "ONLINE" : "OFFLINE") +
  155. " | s.nerd.nu: " + (survival.IsOnline ? "ONLINE" : "OFFLINE") +
  156. " | p.nerd.nu: " + (pve.IsOnline ? "ONLINE" : "OFFLINE");
  157. Server.Client.LocalUser.SendMessage(Channel, response);
  158. }
  159. if (IsManager)
  160. {
  161. if (Command == "quit")
  162. ShouldQuit = true;
  163. if (Command == "op")
  164. Server.Client.LocalUser.SendMessage("ChanServ", "op " + Channel.Name + " " + Source);
  165. if (Command == "deop")
  166. Server.Client.LocalUser.SendMessage("ChanServ", "deop " + Channel.Name + " " + Source);
  167. }
  168. }
  169.  
  170. static Server GetServerFromSender(object sender)
  171. {
  172. return Servers.Where(s => s.Client == sender as IrcClient).First();
  173. }
  174. }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment