Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // This code relies on https://github.com/alexreg/ircdotnet
- // I was too lazy to write my own implementation from scratch
- // The same bug occurs when using SmartIRC4Net.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using IrcDotNet;
- using System.Xml.Linq;
- using System.IO;
- using System.Threading;
- using LibMinecraft.Model;
- using System.Diagnostics;
- namespace IAmABotAMA
- {
- static class Program
- {
- static List<Server> Servers;
- static List<string> Managers;
- static string ControlChar;
- static bool ShouldQuit = false;
- /// <summary>
- /// The main entry point for the application.
- /// </summary>
- static void Main()
- {
- Servers = new List<Server>();
- Managers = new List<string>();
- XDocument config;
- using (Stream file = File.OpenRead("config.xml"))
- config = XDocument.Load(file);
- // Load up configuration
- ControlChar = config.Root.Attribute("controlchar").Value;
- foreach (var server in config.Root.Element("servers").Elements("server"))
- {
- Server instance = new Server();
- instance.Client = new IrcClient();
- if (server.Element("nick") != null)
- instance.Nick = server.Element("nick").Value;
- if (server.Element("password") != null)
- instance.Password = server.Element("password").Value;
- if (server.Attribute("address") != null)
- {
- instance.Client.Connect(new Uri(server.Attribute("address").Value), new IrcUserRegistrationInfo()
- {
- NickName = instance.Nick,
- RealName = "IAmABotAMA",
- UserName = "IAmABotAMA",
- });
- instance.Client.Connected += new EventHandler<EventArgs>(Client_Connected);
- }
- if (server.Element("channels") != null)
- {
- instance.Channels = new List<string>();
- foreach (var channel in server.Element("channels").Elements("channel"))
- instance.Channels.Add(channel.Value);
- }
- Servers.Add(instance);
- }
- foreach (var manager in config.Root.Element("managers").Elements("manager"))
- Managers.Add(manager.Value);
- while (!ShouldQuit)
- Thread.Sleep(10);
- }
- static void Client_Connected(object sender, EventArgs e)
- {
- Server server = GetServerFromSender(sender);
- server.Client.LocalUser.JoinedChannel += new EventHandler<IrcChannelEventArgs>(LocalUser_JoinedChannel);
- server.Client.LocalUser.NoticeReceived += new EventHandler<IrcMessageEventArgs>(LocalUser_NoticeReceived);
- server.Client.ProtocolError += new EventHandler<IrcProtocolErrorEventArgs>(Client_ProtocolError);
- server.Client.Disconnected += new EventHandler<EventArgs>(Client_Disconnected);
- server.Client.PongReceived += new EventHandler<IrcPingOrPongReceivedEventArgs>(Client_PongReceived);
- server.Client.PingReceived += new EventHandler<IrcPingOrPongReceivedEventArgs>(Client_PingReceived);
- server.Client.Channels.Join(server.Channels.ToArray());
- server.Client.LocalUser.SendMessage("NickServ", "identify " + server.Password);
- server.Client.LocalUser.MessageReceived += new EventHandler<IrcMessageEventArgs>(LocalUser_MessageReceived);
- //Timer timer = new Timer(new TimerCallback((object o) =>
- // {
- // Console.WriteLine("-->PING");
- // server.Client.Ping();
- // }), null, 10000, 10000);
- }
- static void Client_PingReceived(object sender, IrcPingOrPongReceivedEventArgs e)
- {
- Console.WriteLine("<--PING");
- }
- static void Client_PongReceived(object sender, IrcPingOrPongReceivedEventArgs e)
- {
- Console.WriteLine("<--PONG");
- }
- static void Client_Disconnected(object sender, EventArgs e)
- {
- Console.WriteLine("DISCONNECTED");
- }
- static void Client_ProtocolError(object sender, IrcProtocolErrorEventArgs e)
- {
- Console.WriteLine("ERROR: " + e.Code.ToString() + ": " + e.Message);
- }
- static void LocalUser_NoticeReceived(object sender, IrcMessageEventArgs e)
- {
- Console.WriteLine("-" + e.Source + "-: " + e.Text);
- }
- static void LocalUser_JoinedChannel(object sender, IrcChannelEventArgs e)
- {
- e.Channel.MessageReceived += new EventHandler<IrcMessageEventArgs>(Channel_MessageReceived);
- }
- static void Channel_MessageReceived(object sender, IrcMessageEventArgs e)
- {
- Server server = GetServerFromSender((sender as IrcChannel).Client);
- Console.WriteLine("<" + e.Source + "> " + e.Text);
- if (e.Text.StartsWith(ControlChar))
- ExecuteCommand(server, e.Text.Substring(1), sender as IrcChannel, e.Source.Name, Managers.Contains(e.Source.Name));
- }
- static void LocalUser_MessageReceived(object sender, IrcMessageEventArgs e)
- {
- //Server server = GetServerFromSender(sender);
- Console.WriteLine(e.Source.Name + ": " + e.Text);
- }
- static void ExecuteCommand(Server Server, string Command, IrcChannel Channel, string Source, bool IsManager)
- {
- if (Command.StartsWith("ping "))
- {
- MinecraftServer.GetServerAsync(Command.Substring(5), (MinecraftServer server, object o) =>
- {
- if (server.IsOnline)
- {
- Server.Client.LocalUser.SendMessage(Channel, Source + ": ONLINE (" + server.ConnectedPlayers +
- "/" + server.MaxPlayers + "): " + server.MotD);
- }
- else
- Server.Client.LocalUser.SendMessage(Channel, Source + ": OFFLINE");
- }, null);
- }
- if (Command == "servers")
- {
- var creative = MinecraftServer.GetServer("c.nerd.nu");
- var survival = MinecraftServer.GetServer("s.nerd.nu");
- var pve = MinecraftServer.GetServer("p.nerd.nu");
- string response = "c.nerd.nu: " + (creative.IsOnline ? "ONLINE" : "OFFLINE") +
- " | s.nerd.nu: " + (survival.IsOnline ? "ONLINE" : "OFFLINE") +
- " | p.nerd.nu: " + (pve.IsOnline ? "ONLINE" : "OFFLINE");
- Server.Client.LocalUser.SendMessage(Channel, response);
- }
- if (IsManager)
- {
- if (Command == "quit")
- ShouldQuit = true;
- if (Command == "op")
- Server.Client.LocalUser.SendMessage("ChanServ", "op " + Channel.Name + " " + Source);
- if (Command == "deop")
- Server.Client.LocalUser.SendMessage("ChanServ", "deop " + Channel.Name + " " + Source);
- }
- }
- static Server GetServerFromSender(object sender)
- {
- return Servers.Where(s => s.Client == sender as IrcClient).First();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment