Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Meebey.SmartIrc4net;
- using System.Threading;
- using Organic;
- using Inorganic;
- using SocketDebuggingProtocol;
- using System.Net;
- using Tomato;
- namespace OrganicBot
- {
- public class Bot
- {
- public IrcClient Client;
- public List<string> RegisteredChannels;
- public List<string> Operators;
- public string Name = "OrganicBot";
- public string NickServPassword;
- string server;
- public SocketDebuggingClient SDPClient;
- public Bot()
- {
- RegisteredChannels = new List<string>();
- Operators = new List<string>();
- }
- public void Connect(string address, int port)
- {
- Client = new IrcClient();
- Client.OnConnected += new EventHandler(Client_OnConnected);
- server = address;
- Client.Connect(address, port);
- }
- void Client_OnConnected(object sender, EventArgs e)
- {
- Client.OnChannelMessage += new IrcEventHandler(Client_OnChannelMessage);
- Client.OnQueryMessage += new IrcEventHandler(Client_OnQueryMessage);
- Client.OnUserModeChange += new IrcEventHandler(Client_OnUserModeChange);
- Client.OnRawMessage += new IrcEventHandler(Client_OnRawMessage);
- Client.ActiveChannelSyncing = true;
- Client.AutoRejoin = true;
- Client.Login(Name, "Drew DeVault");
- Thread t = new Thread(new ThreadStart(() =>
- {
- while (true)
- {
- Client.ListenOnce(false);
- Thread.Sleep(1);
- }
- }));
- t.Start();
- Timer timer = new Timer((obj) =>
- {
- Client.RfcPing(server);
- Client.SendMessage(SendType.Message, "OrganicBot", "ping");
- }, null, 30000, 30000);
- }
- void Client_OnQueryMessage(object sender, IrcEventArgs e)
- {
- Console.WriteLine(e.Data.Message);
- if (e.Data.Message.StartsWith(Name + ": ") && Operators.Contains(e.Data.Nick))
- {
- // Parse command
- string command = e.Data.Message.Substring(Name.Length + 2).Trim();
- if (command.StartsWith("join "))
- Client.RfcJoin(command.Substring(5));
- }
- if (e.Data.Message.StartsWith(Name + ": "))
- {
- string command = e.Data.Message.Substring(Name.Length + 2).Trim();
- if (command == "help" || command == "usage")
- {
- string[] parts = command.Split(' ');
- if (parts.Length == 1)
- {
- Client.SendMessage(SendType.Message, e.Data.Nick,
- "Includes organic, inorganic, and sdp. Use \"help [subcategory]\" to get info on any of these. OPs, you can get rid of me with \"leave\". I don't talk when dcpubot or mappumbot is here.");
- }
- else
- {
- switch (parts[1])
- {
- case "organic":
- Client.SendMessage(SendType.Message, e.Data.Nick,
- "Use \">> [assembly]\" to assemble the given code with organic. Output greater than 100 characters is taken to query.");
- break;
- case "inorganic":
- Client.SendMessage(SendType.Message, e.Data.Nick,
- "Use \"<< [data]\" to disassemble the given hex with inorganic. Output greater than 100 characters is taken to query.");
- break;
- case "sdp":
- Client.SendMessage(SendType.Message, e.Data.Nick,
- "Use \"::connect [address]\" to connect to the specified SDP server. Use \"::help\" to be sent a list of commands in query.");
- break;
- }
- }
- }
- }
- try
- {
- if (e.Data.Message.StartsWith(">>"))
- {
- Assembler assembler = new Assembler();
- List<ListEntry> output = assembler.Assemble(e.Data.Message.Substring(2).Replace("\\", "\n").Replace("/", "\n"));
- string message = "";
- foreach (var entry in output)
- {
- if (entry.ErrorCode != ErrorCode.Success)
- {
- message = "ERROR: " + ListEntry.GetFriendlyErrorMessage(entry.ErrorCode);
- break;
- }
- message += Assembler.DumpArray(entry.Output) + " ";
- }
- Client.SendMessage(SendType.Message, e.Data.Nick, message);
- }
- else if (e.Data.Message.StartsWith("<<"))
- {
- FastDisassembler disassmbler = new FastDisassembler();
- List<ushort> data = new List<ushort>();
- string message = null;
- string dataString = e.Data.Message.Replace(" ", "").Substring(2);
- while (dataString.Length % 4 != 0)
- dataString += "*";
- for (int i = 0; i < dataString.Length; i += 4)
- {
- ushort value = 0;
- if (ushort.TryParse(dataString.Substring(i, 4).Replace("*", ""), System.Globalization.NumberStyles.HexNumber, null, out value))
- {
- data.Add(value);
- }
- else
- {
- message = "Unable to parse value.";
- break;
- }
- }
- if (message == null)
- {
- message = "";
- var output = disassmbler.FastDisassemble(data.ToArray());
- foreach (var entry in output)
- message += entry.Code + " \\ ";
- message = message.Remove(message.Length - 3);
- }
- Client.SendMessage(SendType.Message, e.Data.Nick, message);
- }
- else if (e.Data.Message.StartsWith("::"))
- {
- // SDP stuff
- string command = e.Data.Message.Substring(2);
- if (command.StartsWith("connect "))
- {
- try
- {
- SDPClient.Disconnect();
- }
- catch { }
- SDPClient = new SocketDebuggingClient();
- string endpoint = command.Substring("connect ".Length);
- string[] parts = endpoint.Split(':');
- IPEndPoint ep;
- if (parts.Length == 1)
- ep = new IPEndPoint(IPAddress.Parse(parts[0]), 22348);
- else
- ep = new IPEndPoint(IPAddress.Parse(parts[0]), int.Parse(parts[1]));
- SDPClient.Connect(ep);
- Client.SendMessage(SendType.Message, e.Data.Nick, "Connected.");
- }
- else if (command == "info")
- {
- var details = SDPClient.GetEmulatorDetails();
- Client.SendMessage(SendType.Message, e.Data.Nick, details.EmulatorName + " (version " + details.EmulatorVersion + ")");
- }
- else if (command == "disconnect")
- {
- SDPClient.Disconnect();
- Client.SendMessage(SendType.Message, e.Data.Nick,"Done.");
- }
- else if (command == "getstate")
- {
- var state = SDPClient.GetMachineState();
- string message = e.Data.Nick + ": ";
- if (state.RegisterA != 0)
- message += "[A: 0x" + state.RegisterA.ToString("x") + "] ";
- if (state.RegisterB != 0)
- message += "[B: 0x" + state.RegisterB.ToString("x") + "] ";
- if (state.RegisterC != 0)
- message += "[C: 0x" + state.RegisterC.ToString("x") + "] ";
- if (state.RegisterX != 0)
- message += "[X: 0x" + state.RegisterX.ToString("x") + "] ";
- if (state.RegisterY != 0)
- message += "[Y: 0x" + state.RegisterY.ToString("x") + "] ";
- if (state.RegisterZ != 0)
- message += "[Z: 0x" + state.RegisterZ.ToString("x") + "] ";
- if (state.RegisterI != 0)
- message += "[I: 0x" + state.RegisterI.ToString("x") + "] ";
- if (state.RegisterJ != 0)
- message += "[J: 0x" + state.RegisterJ.ToString("x") + "] ";
- if (state.RegisterPC != 0)
- message += "[PC: 0x" + state.RegisterPC.ToString("x") + "] ";
- if (state.RegisterSP != 0)
- message += "[SP: 0x" + state.RegisterSP.ToString("x") + "] ";
- if (state.RegisterEX != 0)
- message += "[EX: 0x" + state.RegisterEX.ToString("x") + "] ";
- if (state.QueuedInterrupts != 0)
- message += "[Queued Interrupts: 0x" + state.QueuedInterrupts.ToString("x") + "] ";
- message += "[Is Running: " + state.IsRunning.ToString() + "]";
- Client.SendMessage(SendType.Message, e.Data.Channel, message);
- }
- }
- }
- catch
- {
- Client.SendMessage(SendType.Message, e.Data.Nick, "An error occured.");
- }
- }
- void Client_OnRawMessage(object sender, IrcEventArgs e)
- {
- if (e.Data.Message != null)
- {
- if (e.Data.Message.StartsWith("PING"))
- {
- Console.Write(e.Data.Message);
- }
- }
- }
- void Client_OnUserModeChange(object sender, IrcEventArgs e)
- {
- if (NickServPassword != null)
- Client.SendMessage(SendType.Message, "NickServ", "identify " + NickServPassword);
- foreach (string s in RegisteredChannels)
- Client.RfcJoin(s);
- }
- void Client_OnChannelMessage(object sender, IrcEventArgs e)
- {
- Console.WriteLine(e.Data.Message);
- if (e.Data.Message.StartsWith(Name + ": ") && (Operators.Contains(e.Data.Nick)
- || Client.GetChannelUser(e.Data.Channel, e.Data.Nick).IsOp))
- {
- // Parse command
- string command = e.Data.Message.Substring(Name.Length + 2).Trim();
- if (command == "leave" || command == "quit")
- Client.RfcPart(e.Data.Channel);
- if (command.StartsWith("join "))
- Client.RfcJoin(command.Substring(5));
- }
- if (e.Data.Message.StartsWith(Name + ": "))
- {
- string command = e.Data.Message.Substring(Name.Length + 2).Trim();
- if (command == "help" || command == "usage")
- {
- string[] parts = command.Split(' ');
- if (parts.Length == 1)
- {
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
- "Includes organic, inorganic, tomato, and sdp. Use \"help [subcategory]\" to get info on any of these. OPs, you can get rid of me with \"leave\". I don't talk when dcpubot or mappumbot is here.");
- }
- else
- {
- switch (parts[1])
- {
- case "organic":
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
- "Use \">> [assembly]\" to assemble the given code with organic. Output greater than 100 characters is taken to query.");
- break;
- case "inorganic":
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
- "Use \"<< [data]\" to disassemble the given hex with inorganic. Output greater than 100 characters is taken to query.");
- break;
- case "sdp":
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
- "Use \"::connect [address]\" to connect to the specified SDP server. Use \"::help\" to be sent a list of commands in query.");
- break;
- }
- }
- }
- }
- //if (Client.GetChannel(e.Data.Channel).Users.ContainsKey("mappumbot") ||
- // Client.GetChannel(e.Data.Channel).Users.ContainsKey("dcpubot"))
- // return;
- try
- {
- if (e.Data.Message.StartsWith(">>"))
- {
- Assembler assembler = new Assembler();
- List<ListEntry> output = assembler.Assemble(e.Data.Message.Substring(2).Replace("\\", "\n").Replace("/", "\n"));
- string message = e.Data.Nick + ": ";
- foreach (var entry in output)
- {
- if (entry.ErrorCode != ErrorCode.Success)
- {
- message = e.Data.Nick + ": ERROR: " + ListEntry.GetFriendlyErrorMessage(entry.ErrorCode);
- break;
- }
- message += Assembler.DumpArray(entry.Output) + " ";
- }
- if (message.Length < 100)
- Client.SendMessage(SendType.Message, e.Data.Channel, message);
- else
- {
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Output too long; replying via query");
- Client.SendMessage(SendType.Message, e.Data.Nick, message);
- }
- }
- else if (e.Data.Message.StartsWith("<<"))
- {
- FastDisassembler disassmbler = new FastDisassembler();
- List<ushort> data = new List<ushort>();
- string message = null;
- string dataString = e.Data.Message.Replace(" ", "").Substring(2);
- while (dataString.Length % 4 != 0)
- dataString += "*";
- for (int i = 0; i < dataString.Length; i += 4)
- {
- ushort value = 0;
- if (ushort.TryParse(dataString.Substring(i, 4).Replace("*", ""), System.Globalization.NumberStyles.HexNumber, null, out value))
- {
- data.Add(value);
- }
- else
- {
- message = e.Data.Nick + ": Unable to parse value.";
- break;
- }
- }
- if (message == null)
- {
- message = e.Data.Nick + ": ";
- var output = disassmbler.FastDisassemble(data.ToArray());
- foreach (var entry in output)
- message += entry.Code + " \\ ";
- message = message.Remove(message.Length - 3);
- }
- if (message.Length < 100)
- Client.SendMessage(SendType.Message, e.Data.Channel, message);
- else
- {
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Output too long; replying via query");
- Client.SendMessage(SendType.Message, e.Data.Nick, message);
- }
- }
- else if (e.Data.Message.StartsWith("::"))
- {
- // SDP stuff
- string command = e.Data.Message.Substring(2);
- if (command.StartsWith("connect "))
- {
- try
- {
- SDPClient.Disconnect();
- }
- catch { }
- SDPClient = new SocketDebuggingClient();
- string endpoint = command.Substring("connect ".Length);
- string[] parts = endpoint.Split(':');
- IPEndPoint ep;
- if (parts.Length == 1)
- ep = new IPEndPoint(IPAddress.Parse(parts[0]), 22348);
- else
- ep = new IPEndPoint(IPAddress.Parse(parts[0]), int.Parse(parts[1]));
- SDPClient.Connect(ep);
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Connected.");
- }
- else if (command == "info")
- {
- var details = SDPClient.GetEmulatorDetails();
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " + details.EmulatorName + " (version " + details.EmulatorVersion + ")");
- }
- else if (command == "disconnect")
- {
- SDPClient.Disconnect();
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Done.");
- }
- else if (command == "getstate")
- {
- var state = SDPClient.GetMachineState();
- string message = e.Data.Nick + ": ";
- if (state.RegisterA != 0)
- message += "[A: 0x" + state.RegisterA.ToString("x") + "] ";
- if (state.RegisterB != 0)
- message += "[B: 0x" + state.RegisterB.ToString("x") + "] ";
- if (state.RegisterC != 0)
- message += "[C: 0x" + state.RegisterC.ToString("x") + "] ";
- if (state.RegisterX != 0)
- message += "[X: 0x" + state.RegisterX.ToString("x") + "] ";
- if (state.RegisterY != 0)
- message += "[Y: 0x" + state.RegisterY.ToString("x") + "] ";
- if (state.RegisterZ != 0)
- message += "[Z: 0x" + state.RegisterZ.ToString("x") + "] ";
- if (state.RegisterI != 0)
- message += "[I: 0x" + state.RegisterI.ToString("x") + "] ";
- if (state.RegisterJ != 0)
- message += "[J: 0x" + state.RegisterJ.ToString("x") + "] ";
- if (state.RegisterPC != 0)
- message += "[PC: 0x" + state.RegisterPC.ToString("x") + "] ";
- if (state.RegisterSP != 0)
- message += "[SP: 0x" + state.RegisterSP.ToString("x") + "] ";
- if (state.RegisterEX != 0)
- message += "[EX: 0x" + state.RegisterEX.ToString("x") + "] ";
- if (state.QueuedInterrupts != 0)
- message += "[Queued Interrupts: 0x" + state.QueuedInterrupts.ToString("x") + "] ";
- message += "[Is Running: " + state.IsRunning.ToString() + "]";
- Client.SendMessage(SendType.Message, e.Data.Channel, message);
- }
- }
- else if (e.Data.Message.StartsWith(":>>"))
- {
- DCPU target = new DCPU();
- Assembler assembler = new Assembler();
- List<ListEntry> assemblyOutput = assembler.Assemble(e.Data.Message.Substring(3).Replace("\\", "\n").Replace("/", "\n"));
- ushort[] output = GetOutput(assemblyOutput);
- target.FlashMemory(output);
- target.Breakpoints.Add((ushort)output.Length);
- target.BreakpointHit += new EventHandler<BreakpointEventArgs>((object o, BreakpointEventArgs ea) =>
- {
- ea.ContinueExecution = false;
- });
- target.Execute(1000);
- string message = e.Data.Nick + ": ";
- if (target.A != 0)
- message += "[A: 0x" + target.A.ToString("x") + "] ";
- if (target.B != 0)
- message += "[B: 0x" + target.B.ToString("x") + "] ";
- if (target.C != 0)
- message += "[C: 0x" + target.C.ToString("x") + "] ";
- if (target.X != 0)
- message += "[X: 0x" + target.X.ToString("x") + "] ";
- if (target.Y != 0)
- message += "[Y: 0x" + target.Y.ToString("x") + "] ";
- if (target.Z != 0)
- message += "[Z: 0x" + target.Z.ToString("x") + "] ";
- if (target.I != 0)
- message += "[I: 0x" + target.I.ToString("x") + "] ";
- if (target.J != 0)
- message += "[J: 0x" + target.J.ToString("x") + "] ";
- if (target.PC != 0)
- message += "[PC: 0x" + target.PC.ToString("x") + "] ";
- if (target.SP != 0)
- message += "[SP: 0x" + target.SP.ToString("x") + "] ";
- if (target.EX != 0)
- message += "[EX: 0x" + target.EX.ToString("x") + "] ";
- Client.SendMessage(SendType.Message, e.Data.Channel, message);
- }
- }
- catch
- {
- Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": An error occured.");
- }
- }
- private ushort[] GetOutput(List<ListEntry> Output)
- {
- List<ushort> result = new List<ushort>();
- foreach (var entry in Output)
- {
- if (entry.Listed && entry.Output != null)
- result.AddRange(entry.Output);
- }
- return result.ToArray();
- }
- void HandleCommand(string command, bool isOp)
- {
- }
- public void Disconnect()
- {
- Client.Disconnect();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment