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 System.Net;
- using System.IO;
- using System.Diagnostics;
- namespace SMProxyBot
- {
- public class IrcBot
- {
- private const string PastebinDevKey = "xxx";
- private const int MaxSessions = 10;
- private const string LoginUsername = "xxx";
- private const string LoginPassword = "xxx";
- public List<Session> ActiveSessions;
- public IrcClient client = new IrcClient();
- public string Nickname, NickServPassword;
- string server, myIp, userToken;
- public Dictionary<string, string[]> Log;
- public event EventHandler OnNewSession;
- public IrcBot()
- {
- ActiveSessions = new List<Session>();
- Log = new Dictionary<string, string[]>();
- WebClient wc = new WebClient();
- StreamReader reader = new StreamReader(wc.OpenRead("http://checkip.dyndns.org/"));
- string contents = reader.ReadToEnd();
- reader.Close();
- contents = contents.Substring(76);
- contents = contents.Remove(contents.Length - 16);
- myIp = contents;
- // Get login from pastebin
- HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://pastebin.com/api/api_login.php");
- hwr.ContentType = "application/x-www-form-urlencoded";
- hwr.Method = "POST";
- StreamWriter writer = new StreamWriter(hwr.GetRequestStream());
- writer.Write("api_dev_key=" + Uri.EscapeDataString(PastebinDevKey) + "&api_user_name=" + LoginUsername + "&api_user_password=" + LoginPassword);
- writer.Close();
- HttpWebResponse resp = (HttpWebResponse)hwr.GetResponse();
- reader = new StreamReader(resp.GetResponseStream());
- userToken = reader.ReadToEnd();
- reader.Close();
- }
- public void Connect(string server, int port)
- {
- client.OnConnected += new EventHandler(client_OnConnected);
- this.server = server;
- client.Connect(server, port);
- }
- void client_OnConnected(object sender, EventArgs e)
- {
- client.OnChannelMessage += new IrcEventHandler(client_OnChannelMessage);
- client.OnQueryMessage += new IrcEventHandler(client_OnQueryMessage);
- client.OnJoin += new JoinEventHandler(client_OnJoin);
- client.OnPart += new PartEventHandler(client_OnPart);
- client.ActiveChannelSyncing = true;
- client.Login(Nickname, "SMProxy Bot");
- Timer timer = new Timer(new TimerCallback((obj) =>
- {
- client.RfcPing(server);
- }), null, 30000, 30000);
- Thread t = new Thread(new ThreadStart(() => client.Listen()));
- t.Start();
- }
- void client_OnPart(object sender, PartEventArgs e)
- {
- if (Log.ContainsKey(e.Channel))
- Log.Remove(e.Channel);
- }
- void client_OnJoin(object sender, JoinEventArgs e)
- {
- Log.Add(e.Channel, new string[0]);
- }
- void client_OnQueryMessage(object sender, IrcEventArgs e)
- {
- if (!Log.ContainsKey(e.Data.Nick))
- Log.Add(e.Data.Nick, new string[] { "<" + e.Data.Nick + ">" + e.Data.Message });
- else
- Log[e.Data.Nick] = Log[e.Data.Nick].Concat(new string[] { "<" + e.Data.Nick + ">" + e.Data.Message }).ToArray();
- HandleMessage(e.Data.Message, e.Data.Nick, e);
- }
- void client_OnChannelMessage(object sender, IrcEventArgs e)
- {
- if (!Log.ContainsKey(e.Data.Channel))
- Log.Add(e.Data.Channel, new string[] { "<" + e.Data.Nick + ">" + e.Data.Message });
- else
- Log[e.Data.Channel] = Log[e.Data.Channel].Concat(new string[] { "<" + e.Data.Nick + ">" + e.Data.Message }).ToArray();
- if (e.Data.Message.StartsWith(Nickname + ":"))
- HandleMessage(e.Data.Message.Substring(Nickname.Length + 1).Trim(), e.Data.Channel, e);
- }
- void HandleMessage(string message, string respondTo, IrcEventArgs e)
- {
- string response = "";
- if (e.Data.Type == ReceiveType.ChannelMessage)
- response = e.Data.Nick + ": ";
- if (message == "help")
- {
- if (e.Data.Type == ReceiveType.ChannelMessage)
- response += "Use \"newsession [args]\" to launch SMProxy with the specified arguments. Ask for help in query for more details.";
- else
- {
- client.SendMessage(SendType.Message, e.Data.Nick, "Use \"newsession [args]\" to launch SMProxy with the specified arguments.");
- client.SendMessage(SendType.Message, e.Data.Nick, "Allowed arguments include -ss, -sc, -pr, -f, -!f, -sp, -ap, and -pv, as well as their long forms.");
- client.SendMessage(SendType.Message, e.Data.Nick, "Example usage: \"newsession c.nerd.n\". When you finish, the log will be uploaded to pastebin.com.");
- response = "For more information on SMProxy, see http://github.com/SirCmpwn/SMProxy";
- }
- }
- else if (message.StartsWith("newsession "))
- {
- respondTo = e.Data.Nick;
- bool shouldStart = true;
- if (ActiveSessions.Count != 0)
- {
- var foundSessions = ActiveSessions.Where(s => s.OwnerNick == e.Data.Nick);
- if (foundSessions.Count() != 0)
- {
- shouldStart = false;
- var timeSpan = foundSessions.First().SessionEnd - DateTime.Now;
- response = "You already have an active session, and may not start more. Say \"quit\" to stop early." +
- " Your current session expires in " + ((int)timeSpan.TotalSeconds).ToString() + " minutes.";
- }
- }
- else if (ActiveSessions.Count > MaxSessions)
- {
- shouldStart = false;
- response = "This bot is currently operating at full capacity. Please try again later.";
- }
- if (shouldStart)
- {
- Session session = new Session();
- session.OwnerNick = e.Data.Nick;
- session.SessionEnd = DateTime.Now.AddHours(1);
- int maxPort = 25570;
- if (ActiveSessions.Count != 0)
- maxPort = ActiveSessions.OrderBy(s => s.Port).First().Port;
- session.Port = maxPort;
- response = "New session created. Connect to " + myIp + ":" + maxPort + ". Session expires in 1 hour. Say \"quit\" to stop early.";
- Thread handlerThread = new Thread(new ThreadStart(() =>
- {
- session.SMProxy = new Process();
- session.SMProxy.StartInfo.FileName = "SMProxy/SMProxy.exe";
- string args = "--endpoint 0.0.0.0 --output results" + e.Data.Nick + ".txt --port " + session.Port.ToString() + " --persistent-session ";
- string[] providedArgs = e.Data.Message.Substring("newsession ".Length).Split(' ');
- string connectTo = null;
- for (int i = 0; i < providedArgs.Length; i++)
- {
- string arg = providedArgs[i];
- if (arg.StartsWith("-"))
- {
- switch (arg)
- {
- case "-ss":
- case "--suppress-server":
- args += "-ss ";
- break;
- case "-sc":
- case "--suppress-client":
- args += "-sc ";
- break;
- case "-f":
- case "--filter":
- args += "-f ";
- args += providedArgs[++i] + " ";
- break;
- case "-!f":
- args += "-!f ";
- args += providedArgs[++i] + " ";
- break;
- case "-pr":
- case "--enable-profiling":
- args += "-pr ";
- break;
- case "-ap":
- case "--add-packet":
- args += "-ap ";
- args += providedArgs[++i] + " ";
- break;
- case "-pv":
- case "--protocol-version":
- args += "-pv ";
- args += providedArgs[++i] + " ";
- break;
- default:
- response = "Invalid parameter: " + arg;
- shouldStart = false;
- break;
- }
- }
- else
- {
- if (connectTo == null)
- connectTo = arg;
- else
- {
- shouldStart = false;
- response += "Invalid parameter: " + arg;
- }
- }
- if (!shouldStart)
- break;
- }
- if (shouldStart)
- {
- args += connectTo;
- session.SMProxy.StartInfo.UseShellExecute = false;
- session.SMProxy.StartInfo.RedirectStandardOutput = true;
- session.SMProxy.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
- session.SMProxy.StartInfo.CreateNoWindow = true;
- session.SMProxy.StartInfo.Arguments = args;
- session.SMProxy.Start();
- string output = session.SMProxy.StandardOutput.ReadToEnd();
- session.SMProxy.WaitForExit();
- if (File.Exists("results" + e.Data.Nick + ".txt"))
- {
- StreamReader fileReader = new StreamReader("results" + e.Data.Nick + ".txt");
- output = fileReader.ReadToEnd();
- fileReader.Close();
- }
- HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://pastebin.com/api/api_post.php");
- hwr.Method = "POST";
- hwr.ContentType = "application/x-www-form-urlencoded";
- StreamWriter sw = new StreamWriter(hwr.GetRequestStream());
- sw.Write("api_option=paste&api_dev_key=" + Uri.EscapeDataString(PastebinDevKey) + "&api_paste_code=" + Uri.EscapeDataString(output) +
- "&api_user_key=" + Uri.EscapeDataString(userToken));
- sw.Close();
- HttpWebResponse resp = (HttpWebResponse)hwr.GetResponse();
- StreamReader reader = new StreamReader(resp.GetResponseStream());
- string pasteUrl = reader.ReadToEnd();
- reader.Close();
- client.SendMessage(SendType.Message, session.OwnerNick, "Session complete: " + pasteUrl);
- ActiveSessions.Remove(session);
- }
- }));
- handlerThread.Start();
- if (shouldStart)
- {
- ActiveSessions.Add(session);
- if (OnNewSession != null)
- OnNewSession(this, null);
- }
- }
- }
- else if (message == "quit")
- {
- if (ActiveSessions.Count != 0)
- {
- var foundSessions = ActiveSessions.Where(s => s.OwnerNick == e.Data.Nick);
- foundSessions.First().SMProxy.Kill();
- response += "Session ended. Uploading log to patsebin.";
- }
- else
- response = "You do not currently have an active session.";
- }
- client.SendMessage(SendType.Message, respondTo, response);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment