Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.IO;
- using System.Linq;
- using System.Net.Sockets;
- using System.Reflection;
- using System.Threading;
- using System.Diagnostics;
- namespace timebot {
- public class Program {
- public static TcpClient socket;
- public static StreamReader reader;
- public static StreamWriter writer;
- static bool running = true;
- static DateTime dtLaunched = DateTime.Now;
- public static DataSet dsData;
- static string
- username = "timebot2",
- host = "irc.freenode.net",
- desc = "timebot 2.0",
- password = "hunter2",
- admin = "timeshifter",
- AUTH_ERROR = "You are not allowed to do that!",
- CommandCharacter = "!";
- static Type cpType;
- static object cpObj;
- static MethodInfo cpParse, cpGetNextMessage;
- static Timer tmrTick = new Timer(GetNextMessage);
- static void Main() {
- LoadData();
- try {
- socket = new TcpClient(host, 6667);
- socket.ReceiveBufferSize = 1024;
- Console.WriteLine("Connected");
- NetworkStream stream = socket.GetStream();
- reader = new StreamReader(stream);
- writer = new StreamWriter(stream);
- Send("USER " + username + " 8 * :" + desc);
- Send("NICK " + username);
- Send("PRIVMSG NickServ :identify " + password);
- ReloadProcessor(admin);
- ReadMessage(reader);
- reader.Close();
- writer.Close();
- stream.Close();
- }
- catch (Exception ex) {
- Console.WriteLine("Error: " + ex.Message);
- System.Threading.Thread.Sleep(15000);
- ReadMessage(reader);
- }
- }
- static void LoadData() {
- dsData = new DataSet();
- dsData.ReadXml(Environment.CurrentDirectory + "\\data.xml");
- username = dsData.Tables["Config"].Rows[0]["UserName"].ToString();
- host = dsData.Tables["Config"].Rows[0]["Host"].ToString();
- desc = dsData.Tables["Config"].Rows[0]["Description"].ToString();
- password = dsData.Tables["Config"].Rows[0]["Password"].ToString();
- AUTH_ERROR = dsData.Tables["Config"].Rows[0]["AuthError"].ToString();
- admin = dsData.Tables["Config"].Rows[0]["Admin"].ToString();
- CommandCharacter = dsData.Tables["Config"].Rows[0]["CommandCharacter"].ToString();
- }
- static void ReloadProcessor(string target) {
- try {
- using (Microsoft.CSharp.CSharpCodeProvider cscp = new Microsoft.CSharp.CSharpCodeProvider()) {
- string dir = Environment.CurrentDirectory.Replace("\\x86", "");
- int idx = dir.IndexOf("timebot");
- dir = dir.Substring(0, idx + 7) + "\\CommandParser\\CommandParser.cs";
- List<string> fileLines = File.ReadAllLines(dir).ToList();
- System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
- fileLines.RemoveAt(0);
- while (fileLines[0].Trim() != "*/") {
- cp.ReferencedAssemblies.Add(fileLines[0]);
- fileLines.RemoveAt(0);
- }
- fileLines.RemoveAt(0);
- string file = string.Join("", fileLines).Replace("\t", "");
- var res = cscp.CompileAssemblyFromSource(cp, file);
- if (res.Errors.Count > 0) {
- foreach (System.CodeDom.Compiler.CompilerError e in res.Errors) {
- SendMessage(admin, e.ErrorText + " - " + e.FileName + ", line " + e.Line.ToString());
- }
- }
- else {
- cpType = res.CompiledAssembly.GetType("CommandParser");
- cpObj = Activator.CreateInstance(cpType);
- cpParse = cpType.GetMethod("Parse");
- cpGetNextMessage = cpType.GetMethod("GetNextMessage");
- }
- }
- SendMessage(target, "Command processor loaded.");
- }
- catch (Exception ex) {
- if (target != admin)
- SendMessage(target, "Command processor errored on reload.");
- SendMessage(admin, "Error loading command processor: " + ex.Message);
- }
- }
- static void SendMessage(string target, string data) {
- Send("PRIVMSG " + target + " :" + data);
- }
- static void Send(string data) {
- try {
- writer.WriteLine(data);
- Console.ForegroundColor = ConsoleColor.Cyan;
- Console.Write(">>> ");
- Console.ResetColor();
- Console.Write(data);
- Console.WriteLine();
- writer.Flush();
- }
- catch (Exception ex) {
- Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("Send error: ");
- Console.ResetColor();
- Console.Write(ex.Message);
- Console.WriteLine();
- }
- }
- static void ReadMessage(StreamReader reader) {
- while (running) {
- Parse(reader.ReadLine());
- }
- }
- static void Parse(string data) {
- Console.WriteLine(data);
- List<string> parts = data.Split(' ').ToList();
- if (parts[0].ToLower() == "ping") {
- Send("PONG " + parts[1]);
- }
- else {
- string user = parts[0].Split('!')[0].Substring(1),
- syscmd = parts[1].ToLower(),
- target = parts[2],
- msgText = "";
- parts.RemoveRange(0, 3);
- if (!target.StartsWith("#"))
- target = user;
- for (int i = 0; i < parts.Count; i++)
- msgText += parts[i] + " ";
- if (msgText.Length > 0)
- msgText = msgText.Substring(1);
- switch (syscmd) {
- case "join":
- if (user == username)
- SendMessage(admin, "I've joined " + target);
- break;
- case "part":
- if (user == username)
- SendMessage(admin, "I've left " + target);
- break;
- case "invite":
- Send("JOIN " + parts[0].Substring(1));
- break;
- case "notice":
- if (msgText.StartsWith("You are now identified for ")) {
- SendMessage(admin, "I'm authenticated.");
- foreach (DataRow dr in dsData.Tables["AutoJoin"].Rows) {
- if (bool.Parse(dr["Active"].ToString()))
- Send("JOIN " + dr["Channel"].ToString());
- }
- tmrTick.Change(0, 1000);
- }
- break;
- case "privmsg":
- if (msgText.Trim() != "") {
- List<string> segments = msgText.Split(' ').ToList();
- if (user == "EntBot") {
- user = segments[0].TrimStart('<').TrimEnd('>');
- segments.RemoveAt(0);
- }
- for (int i = segments.Count - 1; i >= 0; i--)
- if (segments[i].Trim() == "")
- segments.RemoveAt(i);
- string cmd = segments[0];
- segments.RemoveAt(0);
- if (cmd.StartsWith(CommandCharacter)) {
- cmd = cmd.TrimStart(CommandCharacter.ToCharArray());
- switch (cmd) {
- case "uptime":
- TimeSpan ts = DateTime.Now - dtLaunched;
- SendMessage(target, string.Format("I have been running for {0}{1}{2}{3}",
- ts.Days > 0 ? ts.Days.ToString() + "d " : "",
- ts.Hours > 0 ? ts.Hours.ToString() + "h " : "",
- ts.Minutes > 0 ? ts.Minutes.ToString() + "m " : "",
- ts.Seconds.ToString() + "s"
- ));
- break;
- case "reload":
- if (user.ToLower() == admin.ToLower())
- ReloadProcessor(target);
- else
- SendMessage(target, AUTH_ERROR);
- break;
- }
- }
- }
- break;
- }
- cpParse.Invoke(cpObj, new object[] { data });
- }
- }
- static void GetNextMessage(object o) {
- if (cpGetNextMessage != null) {
- string res = (string)cpGetNextMessage.Invoke(cpObj, null);
- if (res != "")
- Send(res);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement