using Extreme.Net; using RuriLib.Models; using System; using System.Windows.Media; namespace RuriLib.LS { /// /// Parses a SET command. /// class SetParser { /// /// Gets the Action that needs to be executed. /// /// The data line to parse /// The BotData needed for variable replacement /// The Action to execute public static Action Parse(string line, BotData data) { var input = line.Trim(); var field = LineParser.ParseToken(ref input, TokenType.Parameter, true).ToUpper(); return new Action(() => { switch (field) { case "SOURCE": data.ResponseSource = LineParser.ParseLiteral(ref input, "SOURCE", true, data); break; case "STATUS": data.Status = (BotStatus)LineParser.ParseEnum(ref input, "STATUS", typeof(BotStatus)); if (data.Status == BotStatus.CUSTOM) data.CustomStatus = LineParser.ParseLiteral(ref input, "CUSTOM STATUS"); break; case "RESPONSECODE": data.ResponseCode = LineParser.ParseInt(ref input, "RESPONSECODE").ToString(); break; case "COOKIE": var name = LineParser.ParseLiteral(ref input, "NAME", true, data); data.Cookies.Add(name, LineParser.ParseLiteral(ref input, "VALUE", true, data)); break; case "ADDRESS": data.Address = LineParser.ParseLiteral(ref input, "ADDRESS", true, data); break; case "PROXY": data.Proxy = new CProxy(LineParser.ParseLiteral(ref input, "PROXY", true, data), data.Proxy.Type); break; case "PROXYTYPE": data.Proxy.Type = (ProxyType)LineParser.ParseEnum(ref input, "PROXYTYPE", typeof(ProxyType)); break; case "DATA": data.Data = new CData(LineParser.ParseLiteral(ref input, "DATA", true, data), new WordlistType()); break; case "VAR": data.Variables.Set(new CVar( LineParser.ParseLiteral(ref input, "NAME", true, data), LineParser.ParseLiteral(ref input, "VALUE", true, data), false )); break; case "CAP": data.Variables.Set(new CVar( LineParser.ParseLiteral(ref input, "NAME", true, data), LineParser.ParseLiteral(ref input, "VALUE", true, data), true )); break; case "GVAR": try { data.GlobalVariables.Set(new CVar( LineParser.ParseLiteral(ref input, "NAME", true, data), LineParser.ParseLiteral(ref input, "VALUE", true, data), false )); } catch { } break; case "NEWGVAR": try { data.GlobalVariables.SetNew(new CVar( LineParser.ParseLiteral(ref input, "NAME", true, data), LineParser.ParseLiteral(ref input, "VALUE", true, data), false )); } catch { } break; case "GCOOKIES": data.GlobalCookies.Clear(); foreach (var cookie in data.Cookies) data.GlobalCookies.Add(cookie.Key, cookie.Value); break; default: throw new ArgumentException($"Invalid identifier {field}"); } data.Log(new LogEntry($"SET command executed on field {field}", Colors.White)); }); } } }