SirCmpwn

Untitled

Jun 2nd, 2012
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.67 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Meebey.SmartIrc4net;
  6. using System.Threading;
  7. using Organic;
  8. using Inorganic;
  9. using SocketDebuggingProtocol;
  10. using System.Net;
  11. using Tomato;
  12.  
  13. namespace OrganicBot
  14. {
  15. public class Bot
  16. {
  17. public IrcClient Client;
  18. public List<string> RegisteredChannels;
  19. public List<string> Operators;
  20. public string Name = "OrganicBot";
  21. public string NickServPassword;
  22. string server;
  23. public SocketDebuggingClient SDPClient;
  24.  
  25. public Bot()
  26. {
  27. RegisteredChannels = new List<string>();
  28. Operators = new List<string>();
  29. }
  30.  
  31. public void Connect(string address, int port)
  32. {
  33. Client = new IrcClient();
  34. Client.OnConnected += new EventHandler(Client_OnConnected);
  35. server = address;
  36. Client.Connect(address, port);
  37. }
  38.  
  39. void Client_OnConnected(object sender, EventArgs e)
  40. {
  41. Client.OnChannelMessage += new IrcEventHandler(Client_OnChannelMessage);
  42. Client.OnQueryMessage += new IrcEventHandler(Client_OnQueryMessage);
  43. Client.OnUserModeChange += new IrcEventHandler(Client_OnUserModeChange);
  44. Client.OnRawMessage += new IrcEventHandler(Client_OnRawMessage);
  45. Client.ActiveChannelSyncing = true;
  46. Client.AutoRejoin = true;
  47. Client.Login(Name, "Drew DeVault");
  48. Thread t = new Thread(new ThreadStart(() =>
  49. {
  50. while (true)
  51. {
  52. Client.ListenOnce(false);
  53. Thread.Sleep(1);
  54. }
  55. }));
  56. t.Start();
  57. Timer timer = new Timer((obj) =>
  58. {
  59. Client.RfcPing(server);
  60. Client.SendMessage(SendType.Message, "OrganicBot", "ping");
  61. }, null, 30000, 30000);
  62. }
  63.  
  64. void Client_OnQueryMessage(object sender, IrcEventArgs e)
  65. {
  66. Console.WriteLine(e.Data.Message);
  67. if (e.Data.Message.StartsWith(Name + ": ") && Operators.Contains(e.Data.Nick))
  68. {
  69. // Parse command
  70. string command = e.Data.Message.Substring(Name.Length + 2).Trim();
  71. if (command.StartsWith("join "))
  72. Client.RfcJoin(command.Substring(5));
  73. }
  74. if (e.Data.Message.StartsWith(Name + ": "))
  75. {
  76. string command = e.Data.Message.Substring(Name.Length + 2).Trim();
  77. if (command == "help" || command == "usage")
  78. {
  79. string[] parts = command.Split(' ');
  80. if (parts.Length == 1)
  81. {
  82. Client.SendMessage(SendType.Message, e.Data.Nick,
  83. "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.");
  84. }
  85. else
  86. {
  87. switch (parts[1])
  88. {
  89. case "organic":
  90. Client.SendMessage(SendType.Message, e.Data.Nick,
  91. "Use \">> [assembly]\" to assemble the given code with organic. Output greater than 100 characters is taken to query.");
  92. break;
  93. case "inorganic":
  94. Client.SendMessage(SendType.Message, e.Data.Nick,
  95. "Use \"<< [data]\" to disassemble the given hex with inorganic. Output greater than 100 characters is taken to query.");
  96. break;
  97. case "sdp":
  98. Client.SendMessage(SendType.Message, e.Data.Nick,
  99. "Use \"::connect [address]\" to connect to the specified SDP server. Use \"::help\" to be sent a list of commands in query.");
  100. break;
  101. }
  102. }
  103. }
  104. }
  105. try
  106. {
  107. if (e.Data.Message.StartsWith(">>"))
  108. {
  109. Assembler assembler = new Assembler();
  110. List<ListEntry> output = assembler.Assemble(e.Data.Message.Substring(2).Replace("\\", "\n").Replace("/", "\n"));
  111. string message = "";
  112. foreach (var entry in output)
  113. {
  114. if (entry.ErrorCode != ErrorCode.Success)
  115. {
  116. message = "ERROR: " + ListEntry.GetFriendlyErrorMessage(entry.ErrorCode);
  117. break;
  118. }
  119. message += Assembler.DumpArray(entry.Output) + " ";
  120. }
  121. Client.SendMessage(SendType.Message, e.Data.Nick, message);
  122. }
  123. else if (e.Data.Message.StartsWith("<<"))
  124. {
  125. FastDisassembler disassmbler = new FastDisassembler();
  126. List<ushort> data = new List<ushort>();
  127. string message = null;
  128. string dataString = e.Data.Message.Replace(" ", "").Substring(2);
  129. while (dataString.Length % 4 != 0)
  130. dataString += "*";
  131. for (int i = 0; i < dataString.Length; i += 4)
  132. {
  133. ushort value = 0;
  134. if (ushort.TryParse(dataString.Substring(i, 4).Replace("*", ""), System.Globalization.NumberStyles.HexNumber, null, out value))
  135. {
  136. data.Add(value);
  137. }
  138. else
  139. {
  140. message = "Unable to parse value.";
  141. break;
  142. }
  143. }
  144. if (message == null)
  145. {
  146. message = "";
  147. var output = disassmbler.FastDisassemble(data.ToArray());
  148. foreach (var entry in output)
  149. message += entry.Code + " \\ ";
  150. message = message.Remove(message.Length - 3);
  151. }
  152. Client.SendMessage(SendType.Message, e.Data.Nick, message);
  153. }
  154. else if (e.Data.Message.StartsWith("::"))
  155. {
  156. // SDP stuff
  157. string command = e.Data.Message.Substring(2);
  158. if (command.StartsWith("connect "))
  159. {
  160. try
  161. {
  162. SDPClient.Disconnect();
  163. }
  164. catch { }
  165. SDPClient = new SocketDebuggingClient();
  166. string endpoint = command.Substring("connect ".Length);
  167. string[] parts = endpoint.Split(':');
  168. IPEndPoint ep;
  169. if (parts.Length == 1)
  170. ep = new IPEndPoint(IPAddress.Parse(parts[0]), 22348);
  171. else
  172. ep = new IPEndPoint(IPAddress.Parse(parts[0]), int.Parse(parts[1]));
  173. SDPClient.Connect(ep);
  174. Client.SendMessage(SendType.Message, e.Data.Nick, "Connected.");
  175. }
  176. else if (command == "info")
  177. {
  178. var details = SDPClient.GetEmulatorDetails();
  179. Client.SendMessage(SendType.Message, e.Data.Nick, details.EmulatorName + " (version " + details.EmulatorVersion + ")");
  180. }
  181. else if (command == "disconnect")
  182. {
  183. SDPClient.Disconnect();
  184. Client.SendMessage(SendType.Message, e.Data.Nick,"Done.");
  185. }
  186. else if (command == "getstate")
  187. {
  188. var state = SDPClient.GetMachineState();
  189. string message = e.Data.Nick + ": ";
  190. if (state.RegisterA != 0)
  191. message += "[A: 0x" + state.RegisterA.ToString("x") + "] ";
  192. if (state.RegisterB != 0)
  193. message += "[B: 0x" + state.RegisterB.ToString("x") + "] ";
  194. if (state.RegisterC != 0)
  195. message += "[C: 0x" + state.RegisterC.ToString("x") + "] ";
  196. if (state.RegisterX != 0)
  197. message += "[X: 0x" + state.RegisterX.ToString("x") + "] ";
  198. if (state.RegisterY != 0)
  199. message += "[Y: 0x" + state.RegisterY.ToString("x") + "] ";
  200. if (state.RegisterZ != 0)
  201. message += "[Z: 0x" + state.RegisterZ.ToString("x") + "] ";
  202. if (state.RegisterI != 0)
  203. message += "[I: 0x" + state.RegisterI.ToString("x") + "] ";
  204. if (state.RegisterJ != 0)
  205. message += "[J: 0x" + state.RegisterJ.ToString("x") + "] ";
  206. if (state.RegisterPC != 0)
  207. message += "[PC: 0x" + state.RegisterPC.ToString("x") + "] ";
  208. if (state.RegisterSP != 0)
  209. message += "[SP: 0x" + state.RegisterSP.ToString("x") + "] ";
  210. if (state.RegisterEX != 0)
  211. message += "[EX: 0x" + state.RegisterEX.ToString("x") + "] ";
  212. if (state.QueuedInterrupts != 0)
  213. message += "[Queued Interrupts: 0x" + state.QueuedInterrupts.ToString("x") + "] ";
  214. message += "[Is Running: " + state.IsRunning.ToString() + "]";
  215. Client.SendMessage(SendType.Message, e.Data.Channel, message);
  216. }
  217. }
  218. }
  219. catch
  220. {
  221. Client.SendMessage(SendType.Message, e.Data.Nick, "An error occured.");
  222. }
  223. }
  224.  
  225. void Client_OnRawMessage(object sender, IrcEventArgs e)
  226. {
  227. if (e.Data.Message != null)
  228. {
  229. if (e.Data.Message.StartsWith("PING"))
  230. {
  231. Console.Write(e.Data.Message);
  232. }
  233. }
  234. }
  235.  
  236. void Client_OnUserModeChange(object sender, IrcEventArgs e)
  237. {
  238. if (NickServPassword != null)
  239. Client.SendMessage(SendType.Message, "NickServ", "identify " + NickServPassword);
  240. foreach (string s in RegisteredChannels)
  241. Client.RfcJoin(s);
  242. }
  243.  
  244. void Client_OnChannelMessage(object sender, IrcEventArgs e)
  245. {
  246. Console.WriteLine(e.Data.Message);
  247. if (e.Data.Message.StartsWith(Name + ": ") && (Operators.Contains(e.Data.Nick)
  248. || Client.GetChannelUser(e.Data.Channel, e.Data.Nick).IsOp))
  249. {
  250. // Parse command
  251. string command = e.Data.Message.Substring(Name.Length + 2).Trim();
  252. if (command == "leave" || command == "quit")
  253. Client.RfcPart(e.Data.Channel);
  254. if (command.StartsWith("join "))
  255. Client.RfcJoin(command.Substring(5));
  256. }
  257. if (e.Data.Message.StartsWith(Name + ": "))
  258. {
  259. string command = e.Data.Message.Substring(Name.Length + 2).Trim();
  260. if (command == "help" || command == "usage")
  261. {
  262. string[] parts = command.Split(' ');
  263. if (parts.Length == 1)
  264. {
  265. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
  266. "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.");
  267. }
  268. else
  269. {
  270. switch (parts[1])
  271. {
  272. case "organic":
  273. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
  274. "Use \">> [assembly]\" to assemble the given code with organic. Output greater than 100 characters is taken to query.");
  275. break;
  276. case "inorganic":
  277. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
  278. "Use \"<< [data]\" to disassemble the given hex with inorganic. Output greater than 100 characters is taken to query.");
  279. break;
  280. case "sdp":
  281. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " +
  282. "Use \"::connect [address]\" to connect to the specified SDP server. Use \"::help\" to be sent a list of commands in query.");
  283. break;
  284. }
  285. }
  286. }
  287. }
  288. //if (Client.GetChannel(e.Data.Channel).Users.ContainsKey("mappumbot") ||
  289. // Client.GetChannel(e.Data.Channel).Users.ContainsKey("dcpubot"))
  290. // return;
  291. try
  292. {
  293. if (e.Data.Message.StartsWith(">>"))
  294. {
  295. Assembler assembler = new Assembler();
  296. List<ListEntry> output = assembler.Assemble(e.Data.Message.Substring(2).Replace("\\", "\n").Replace("/", "\n"));
  297. string message = e.Data.Nick + ": ";
  298. foreach (var entry in output)
  299. {
  300. if (entry.ErrorCode != ErrorCode.Success)
  301. {
  302. message = e.Data.Nick + ": ERROR: " + ListEntry.GetFriendlyErrorMessage(entry.ErrorCode);
  303. break;
  304. }
  305. message += Assembler.DumpArray(entry.Output) + " ";
  306. }
  307. if (message.Length < 100)
  308. Client.SendMessage(SendType.Message, e.Data.Channel, message);
  309. else
  310. {
  311. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Output too long; replying via query");
  312. Client.SendMessage(SendType.Message, e.Data.Nick, message);
  313. }
  314. }
  315. else if (e.Data.Message.StartsWith("<<"))
  316. {
  317. FastDisassembler disassmbler = new FastDisassembler();
  318. List<ushort> data = new List<ushort>();
  319. string message = null;
  320. string dataString = e.Data.Message.Replace(" ", "").Substring(2);
  321. while (dataString.Length % 4 != 0)
  322. dataString += "*";
  323. for (int i = 0; i < dataString.Length; i += 4)
  324. {
  325. ushort value = 0;
  326. if (ushort.TryParse(dataString.Substring(i, 4).Replace("*", ""), System.Globalization.NumberStyles.HexNumber, null, out value))
  327. {
  328. data.Add(value);
  329. }
  330. else
  331. {
  332. message = e.Data.Nick + ": Unable to parse value.";
  333. break;
  334. }
  335. }
  336. if (message == null)
  337. {
  338. message = e.Data.Nick + ": ";
  339. var output = disassmbler.FastDisassemble(data.ToArray());
  340. foreach (var entry in output)
  341. message += entry.Code + " \\ ";
  342. message = message.Remove(message.Length - 3);
  343. }
  344. if (message.Length < 100)
  345. Client.SendMessage(SendType.Message, e.Data.Channel, message);
  346. else
  347. {
  348. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Output too long; replying via query");
  349. Client.SendMessage(SendType.Message, e.Data.Nick, message);
  350. }
  351. }
  352. else if (e.Data.Message.StartsWith("::"))
  353. {
  354. // SDP stuff
  355. string command = e.Data.Message.Substring(2);
  356. if (command.StartsWith("connect "))
  357. {
  358. try
  359. {
  360. SDPClient.Disconnect();
  361. }
  362. catch { }
  363. SDPClient = new SocketDebuggingClient();
  364. string endpoint = command.Substring("connect ".Length);
  365. string[] parts = endpoint.Split(':');
  366. IPEndPoint ep;
  367. if (parts.Length == 1)
  368. ep = new IPEndPoint(IPAddress.Parse(parts[0]), 22348);
  369. else
  370. ep = new IPEndPoint(IPAddress.Parse(parts[0]), int.Parse(parts[1]));
  371. SDPClient.Connect(ep);
  372. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Connected.");
  373. }
  374. else if (command == "info")
  375. {
  376. var details = SDPClient.GetEmulatorDetails();
  377. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": " + details.EmulatorName + " (version " + details.EmulatorVersion + ")");
  378. }
  379. else if (command == "disconnect")
  380. {
  381. SDPClient.Disconnect();
  382. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": Done.");
  383. }
  384. else if (command == "getstate")
  385. {
  386. var state = SDPClient.GetMachineState();
  387. string message = e.Data.Nick + ": ";
  388. if (state.RegisterA != 0)
  389. message += "[A: 0x" + state.RegisterA.ToString("x") + "] ";
  390. if (state.RegisterB != 0)
  391. message += "[B: 0x" + state.RegisterB.ToString("x") + "] ";
  392. if (state.RegisterC != 0)
  393. message += "[C: 0x" + state.RegisterC.ToString("x") + "] ";
  394. if (state.RegisterX != 0)
  395. message += "[X: 0x" + state.RegisterX.ToString("x") + "] ";
  396. if (state.RegisterY != 0)
  397. message += "[Y: 0x" + state.RegisterY.ToString("x") + "] ";
  398. if (state.RegisterZ != 0)
  399. message += "[Z: 0x" + state.RegisterZ.ToString("x") + "] ";
  400. if (state.RegisterI != 0)
  401. message += "[I: 0x" + state.RegisterI.ToString("x") + "] ";
  402. if (state.RegisterJ != 0)
  403. message += "[J: 0x" + state.RegisterJ.ToString("x") + "] ";
  404. if (state.RegisterPC != 0)
  405. message += "[PC: 0x" + state.RegisterPC.ToString("x") + "] ";
  406. if (state.RegisterSP != 0)
  407. message += "[SP: 0x" + state.RegisterSP.ToString("x") + "] ";
  408. if (state.RegisterEX != 0)
  409. message += "[EX: 0x" + state.RegisterEX.ToString("x") + "] ";
  410. if (state.QueuedInterrupts != 0)
  411. message += "[Queued Interrupts: 0x" + state.QueuedInterrupts.ToString("x") + "] ";
  412. message += "[Is Running: " + state.IsRunning.ToString() + "]";
  413. Client.SendMessage(SendType.Message, e.Data.Channel, message);
  414. }
  415. }
  416. else if (e.Data.Message.StartsWith(":>>"))
  417. {
  418. DCPU target = new DCPU();
  419. Assembler assembler = new Assembler();
  420. List<ListEntry> assemblyOutput = assembler.Assemble(e.Data.Message.Substring(3).Replace("\\", "\n").Replace("/", "\n"));
  421. ushort[] output = GetOutput(assemblyOutput);
  422. target.FlashMemory(output);
  423. target.Breakpoints.Add((ushort)output.Length);
  424. target.BreakpointHit += new EventHandler<BreakpointEventArgs>((object o, BreakpointEventArgs ea) =>
  425. {
  426. ea.ContinueExecution = false;
  427. });
  428. target.Execute(1000);
  429. string message = e.Data.Nick + ": ";
  430. if (target.A != 0)
  431. message += "[A: 0x" + target.A.ToString("x") + "] ";
  432. if (target.B != 0)
  433. message += "[B: 0x" + target.B.ToString("x") + "] ";
  434. if (target.C != 0)
  435. message += "[C: 0x" + target.C.ToString("x") + "] ";
  436. if (target.X != 0)
  437. message += "[X: 0x" + target.X.ToString("x") + "] ";
  438. if (target.Y != 0)
  439. message += "[Y: 0x" + target.Y.ToString("x") + "] ";
  440. if (target.Z != 0)
  441. message += "[Z: 0x" + target.Z.ToString("x") + "] ";
  442. if (target.I != 0)
  443. message += "[I: 0x" + target.I.ToString("x") + "] ";
  444. if (target.J != 0)
  445. message += "[J: 0x" + target.J.ToString("x") + "] ";
  446. if (target.PC != 0)
  447. message += "[PC: 0x" + target.PC.ToString("x") + "] ";
  448. if (target.SP != 0)
  449. message += "[SP: 0x" + target.SP.ToString("x") + "] ";
  450. if (target.EX != 0)
  451. message += "[EX: 0x" + target.EX.ToString("x") + "] ";
  452. Client.SendMessage(SendType.Message, e.Data.Channel, message);
  453. }
  454. }
  455. catch
  456. {
  457. Client.SendMessage(SendType.Message, e.Data.Channel, e.Data.Nick + ": An error occured.");
  458. }
  459. }
  460.  
  461. private ushort[] GetOutput(List<ListEntry> Output)
  462. {
  463. List<ushort> result = new List<ushort>();
  464. foreach (var entry in Output)
  465. {
  466. if (entry.Listed && entry.Output != null)
  467. result.AddRange(entry.Output);
  468. }
  469. return result.ToArray();
  470. }
  471.  
  472. void HandleCommand(string command, bool isOp)
  473. {
  474.  
  475. }
  476.  
  477. public void Disconnect()
  478. {
  479. Client.Disconnect();
  480. }
  481. }
  482. }
Advertisement
Add Comment
Please, Sign In to add comment