Advertisement
timeshifter

timebot2 core

Dec 31st, 2014
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.10 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net.Sockets;
  7. using System.Reflection;
  8. using System.Threading;
  9. using System.Diagnostics;
  10.  
  11. namespace timebot {
  12.     public class Program {
  13.         public static TcpClient socket;
  14.         public static StreamReader reader;
  15.         public static StreamWriter writer;
  16.  
  17.         static bool running = true;
  18.  
  19.         static DateTime dtLaunched = DateTime.Now;
  20.         public static DataSet dsData;
  21.  
  22.         static string
  23.             username = "timebot2",
  24.             host = "irc.freenode.net",
  25.             desc = "timebot 2.0",
  26.             password = "hunter2",
  27.             admin = "timeshifter",
  28.             AUTH_ERROR = "You are not allowed to do that!",
  29.             CommandCharacter = "!";
  30.  
  31.         static Type cpType;
  32.         static object cpObj;
  33.         static MethodInfo cpParse, cpGetNextMessage;
  34.         static Timer tmrTick = new Timer(GetNextMessage);
  35.  
  36.         static void Main() {
  37.             LoadData();
  38.  
  39.             try {
  40.                 socket = new TcpClient(host, 6667);
  41.                 socket.ReceiveBufferSize = 1024;
  42.                 Console.WriteLine("Connected");
  43.                 NetworkStream stream = socket.GetStream();
  44.                 reader = new StreamReader(stream);
  45.                 writer = new StreamWriter(stream);
  46.                 Send("USER " + username + " 8 * :" + desc);
  47.                 Send("NICK " + username);
  48.                 Send("PRIVMSG NickServ :identify " + password);
  49.                 ReloadProcessor(admin);
  50.                 ReadMessage(reader);
  51.                 reader.Close();
  52.                 writer.Close();
  53.                 stream.Close();
  54.             }
  55.             catch (Exception ex) {
  56.                 Console.WriteLine("Error: " + ex.Message);
  57.                 System.Threading.Thread.Sleep(15000);
  58.                 ReadMessage(reader);
  59.             }
  60.  
  61.         }
  62.  
  63.         static void LoadData() {
  64.             dsData = new DataSet();
  65.             dsData.ReadXml(Environment.CurrentDirectory + "\\data.xml");
  66.  
  67.             username = dsData.Tables["Config"].Rows[0]["UserName"].ToString();
  68.             host = dsData.Tables["Config"].Rows[0]["Host"].ToString();
  69.             desc = dsData.Tables["Config"].Rows[0]["Description"].ToString();
  70.             password = dsData.Tables["Config"].Rows[0]["Password"].ToString();
  71.             AUTH_ERROR = dsData.Tables["Config"].Rows[0]["AuthError"].ToString();
  72.             admin = dsData.Tables["Config"].Rows[0]["Admin"].ToString();
  73.             CommandCharacter = dsData.Tables["Config"].Rows[0]["CommandCharacter"].ToString();
  74.         }
  75.  
  76.         static void ReloadProcessor(string target) {
  77.             try {
  78.                 using (Microsoft.CSharp.CSharpCodeProvider cscp = new Microsoft.CSharp.CSharpCodeProvider()) {
  79.                     string dir = Environment.CurrentDirectory.Replace("\\x86", "");
  80.                     int idx = dir.IndexOf("timebot");
  81.                     dir = dir.Substring(0, idx + 7) + "\\CommandParser\\CommandParser.cs";
  82.                     List<string> fileLines = File.ReadAllLines(dir).ToList();
  83.  
  84.                     System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
  85.                     fileLines.RemoveAt(0);
  86.                     while (fileLines[0].Trim() != "*/") {
  87.                         cp.ReferencedAssemblies.Add(fileLines[0]);
  88.                         fileLines.RemoveAt(0);
  89.                     }
  90.                     fileLines.RemoveAt(0);
  91.  
  92.                     string file = string.Join("", fileLines).Replace("\t", "");
  93.  
  94.                     var res = cscp.CompileAssemblyFromSource(cp, file);
  95.  
  96.                     if (res.Errors.Count > 0) {
  97.                         foreach (System.CodeDom.Compiler.CompilerError e in res.Errors) {
  98.                             SendMessage(admin, e.ErrorText + " - " + e.FileName + ", line " + e.Line.ToString());
  99.                         }
  100.                     }
  101.                     else {
  102.                         cpType = res.CompiledAssembly.GetType("CommandParser");
  103.                         cpObj = Activator.CreateInstance(cpType);
  104.                         cpParse = cpType.GetMethod("Parse");
  105.                         cpGetNextMessage = cpType.GetMethod("GetNextMessage");
  106.                     }
  107.                 }
  108.  
  109.                 SendMessage(target, "Command processor loaded.");
  110.             }
  111.             catch (Exception ex) {
  112.                 if (target != admin)
  113.                     SendMessage(target, "Command processor errored on reload.");
  114.                 SendMessage(admin, "Error loading command processor: " + ex.Message);
  115.             }
  116.         }
  117.  
  118.  
  119.         static void SendMessage(string target, string data) {
  120.             Send("PRIVMSG " + target + " :" + data);
  121.         }
  122.  
  123.         static void Send(string data) {
  124.             try {
  125.                 writer.WriteLine(data);
  126.                 Console.ForegroundColor = ConsoleColor.Cyan;
  127.                 Console.Write(">>> ");
  128.                 Console.ResetColor();
  129.                 Console.Write(data);
  130.                 Console.WriteLine();
  131.                 writer.Flush();
  132.             }
  133.             catch (Exception ex) {
  134.                 Console.ForegroundColor = ConsoleColor.Red;
  135.                 Console.WriteLine("Send error: ");
  136.                 Console.ResetColor();
  137.                 Console.Write(ex.Message);
  138.                 Console.WriteLine();
  139.             }
  140.  
  141.         }
  142.  
  143.         static void ReadMessage(StreamReader reader) {
  144.             while (running) {
  145.                 Parse(reader.ReadLine());
  146.  
  147.             }
  148.         }
  149.  
  150.         static void Parse(string data) {
  151.             Console.WriteLine(data);
  152.             List<string> parts = data.Split(' ').ToList();
  153.  
  154.             if (parts[0].ToLower() == "ping") {
  155.                 Send("PONG " + parts[1]);
  156.             }
  157.             else {
  158.                 string user = parts[0].Split('!')[0].Substring(1),
  159.                     syscmd = parts[1].ToLower(),
  160.                     target = parts[2],
  161.                     msgText = "";
  162.  
  163.                 parts.RemoveRange(0, 3);
  164.  
  165.                 if (!target.StartsWith("#"))
  166.                     target = user;
  167.  
  168.                 for (int i = 0; i < parts.Count; i++)
  169.                     msgText += parts[i] + " ";
  170.                 if (msgText.Length > 0)
  171.                     msgText = msgText.Substring(1);
  172.  
  173.                 switch (syscmd) {
  174.                     case "join":
  175.                         if (user == username)
  176.                             SendMessage(admin, "I've joined " + target);
  177.                         break;
  178.                     case "part":
  179.                         if (user == username)
  180.                             SendMessage(admin, "I've left " + target);
  181.                         break;
  182.                     case "invite":
  183.                         Send("JOIN " + parts[0].Substring(1));
  184.                         break;
  185.                     case "notice":
  186.                         if (msgText.StartsWith("You are now identified for ")) {
  187.                             SendMessage(admin, "I'm authenticated.");
  188.                             foreach (DataRow dr in dsData.Tables["AutoJoin"].Rows) {
  189.                                 if (bool.Parse(dr["Active"].ToString()))
  190.                                     Send("JOIN " + dr["Channel"].ToString());
  191.                             }
  192.                             tmrTick.Change(0, 1000);
  193.  
  194.                         }
  195.                         break;
  196.                     case "privmsg":
  197.                         if (msgText.Trim() != "") {
  198.                             List<string> segments = msgText.Split(' ').ToList();
  199.  
  200.                             if (user == "EntBot") {
  201.                                 user = segments[0].TrimStart('<').TrimEnd('>');
  202.                                 segments.RemoveAt(0);
  203.                             }
  204.                             for (int i = segments.Count - 1; i >= 0; i--)
  205.                                 if (segments[i].Trim() == "")
  206.                                     segments.RemoveAt(i);
  207.  
  208.                             string cmd = segments[0];
  209.                             segments.RemoveAt(0);
  210.  
  211.  
  212.                             if (cmd.StartsWith(CommandCharacter)) {
  213.                                 cmd = cmd.TrimStart(CommandCharacter.ToCharArray());
  214.                                 switch (cmd) {
  215.                                     case "uptime":
  216.                                         TimeSpan ts = DateTime.Now - dtLaunched;
  217.                                         SendMessage(target, string.Format("I have been running for {0}{1}{2}{3}",
  218.                                             ts.Days > 0 ? ts.Days.ToString() + "d " : "",
  219.                                             ts.Hours > 0 ? ts.Hours.ToString() + "h " : "",
  220.                                             ts.Minutes > 0 ? ts.Minutes.ToString() + "m " : "",
  221.                                             ts.Seconds.ToString() + "s"
  222.                                             ));
  223.                                         break;
  224.                                     case "reload":
  225.                                         if (user.ToLower() == admin.ToLower())
  226.                                             ReloadProcessor(target);
  227.                                         else
  228.                                             SendMessage(target, AUTH_ERROR);
  229.                                         break;
  230.                                 }
  231.                             }
  232.                         }
  233.                         break;
  234.                 }
  235.                 cpParse.Invoke(cpObj, new object[] { data });
  236.             }
  237.         }
  238.  
  239.         static void GetNextMessage(object o) {
  240.             if (cpGetNextMessage != null) {
  241.                 string res = (string)cpGetNextMessage.Invoke(cpObj, null);
  242.                 if (res != "")
  243.                     Send(res);
  244.             }
  245.         }
  246.  
  247.     }
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement