public static ResponseObject Handle(StandardisedRequestObject Context) { bool ErrorOccured = false; Backend.Data.Objects.Bot CorrespondingBot = AuthCheck(Context); if (Context.Headers.AllKeys.Contains("TwitchID")) { if (!Checks.IsValidID(Context.Headers["TwitchID"])) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, TwitchID contains invalid characters"; return(Context.ResponseObject); } } if (Context.Headers.AllKeys.Contains("DiscordID")) { if (!Checks.IsValidID(Context.Headers["DiscordID"])) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, DiscordID contains invalid characters"; return(Context.ResponseObject); } } if (Context.URLSegments[1] == "viewer") { if ((Context.Headers.AllKeys.Contains("TwitchID") || Context.Headers.AllKeys.Contains("DiscordID") || Context.Headers.AllKeys.Contains("Notifications") || Context.Headers.AllKeys.Contains("WatchTime") || Context.Headers.AllKeys.Contains("DontReward")) && Context.Headers.AllKeys.Contains("ID")) { if (CorrespondingBot != null) { Data.Objects.Viewer B = Data.Objects.Viewer.FromID(int.Parse(Context.Headers["ID"])); if (B == null) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing viewer"; return(Context.ResponseObject); } if (B.Currency.ID == CorrespondingBot.Currency.ID || CorrespondingBot.IsSuperBot) { if (Context.Headers["DiscordID"] != null) { B.DiscordID = Context.Headers["DiscordID"]; } if (Context.Headers["TwitchID"] != null) { B.TwitchID = Context.Headers["TwitchID"]; } if (Context.Headers["Notifications"] != null) { B.LiveNotifcations = Context.Headers["Notifications"] == "True"; } if (Context.Headers["WatchTime"] != null) { B.WatchTime = int.Parse(Context.Headers["WatchTime"]); } if (Context.Headers["DontReward"] != null) { B.DontReward = Context.Headers["DontReward"] == "True"; } B.Update(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, This bot does not have permission to edit that Bank"; } } else { ErrorOccured = true; //Context.ResponseObject.Code = 403; Context.ResponseObject.Message = "Invalid AuthToken"; } } else if (Context.Headers.AllKeys.Contains("TwitchID") || Context.Headers.AllKeys.Contains("DiscordID")) { if (CorrespondingBot != null) { Data.Objects.Viewer B = new Data.Objects.Viewer(); if (B == null) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing viewer"; return(Context.ResponseObject); } B.DiscordID = Context.Headers["DiscordID"]; B.TwitchID = Context.Headers["TwitchID"]; if (Context.Headers.AllKeys.Contains("CurrencyID")) { try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } if (int.Parse(Context.Headers["CurrencyID"]) == CorrespondingBot.Currency.ID || CorrespondingBot.IsSuperBot) { B.Currency = Data.Objects.Currency.FromID(int.Parse(Context.Headers["CurrencyID"])); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, This bot does not have permission to edit that Currency"; return(Context.ResponseObject); } } else { B.Currency = CorrespondingBot.Currency; } B.Balance = int.Parse(CorrespondingBot.Currency.CommandConfig["InititalBalance"].ToString()); if (B.Currency != null) { if (!B.Save()) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, a Viewer already exists in this currency witht that Discord and/or Twitch ID"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, was unable to set Currency, try explicitly setting Currency with CurrencyID header"; } } else { ErrorOccured = true; //Context.ResponseObject.Code = 403; Context.ResponseObject.Message = "Invalid AuthToken"; } } else if (Context.Headers.AllKeys.Contains("ID") && Context.Headers.AllKeys.Contains("Operator") && Context.Headers.AllKeys.Contains("Value")) { if (CorrespondingBot != null) { try { int.Parse(Context.Headers["ID"]); int.Parse(Context.Headers["Value"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID and/or Value"; return(Context.ResponseObject); } Data.Objects.Viewer B = Data.Objects.Viewer.FromID(int.Parse(Context.Headers["ID"])); if (B == null) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing viewer"; return(Context.ResponseObject); } if (B.Currency.ID == CorrespondingBot.Currency.ID || CorrespondingBot.IsSuperBot) { if (Context.Headers["Operator"].ToString() == "+") { B.Balance += int.Parse(Context.Headers["Value"]); if (B.Balance >= 0) { B.Update(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Cannot set balance as negative"; } } else if (Context.Headers["Operator"].ToString() == "-") { B.Balance -= int.Parse(Context.Headers["Value"]); if (B.Balance >= 0) { B.Update(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Cannot set balance as negative"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Operator must be + or -"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, This bot does not have permission to edit that Bank"; } } else { ErrorOccured = true; //Context.ResponseObject.Code = 403; Context.ResponseObject.Message = "Invalid AuthToken"; } } else if ((Context.Headers.AllKeys.Contains("BalanceIncrement") || Context.Headers.AllKeys.Contains("WatchTimeIncrement")) && Context.Headers.AllKeys.Contains("CurrencyID") && Context.RequestData != null) { if (CorrespondingBot != null) { int BalanceIncrement = 0, WatchTimeIncrement = 0; if (Context.Headers.AllKeys.Contains("BalanceIncrement")) { try { BalanceIncrement = int.Parse(Context.Headers["BalanceIncrement"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed BalanceIncrement"; return(Context.ResponseObject); } } if (Context.Headers.AllKeys.Contains("WatchTimeIncrement")) { try { WatchTimeIncrement = int.Parse(Context.Headers["WatchTimeIncrement"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed WatchTimeIncrement"; return(Context.ResponseObject); } } try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Currency C = Data.Objects.Currency.FromID(int.Parse(Context.Headers["CurrencyID"])); if (C != null) { if (C.ID == CorrespondingBot.Currency.ID || CorrespondingBot.IsSuperBot) { List <string> DiscordIDs = new List <string> { }, TwitchIDs = new List <string> { }; if (Context.RequestData["DiscordIDs"] != null) { DiscordIDs = Context.RequestData["DiscordIDs"].ToObject <List <string> >(); } if (Context.RequestData["TwitchIDs"] != null) { TwitchIDs = Context.RequestData["TwitchIDs"].ToObject <List <string> >(); } Data.Objects.Viewer.Increment(DiscordIDs, TwitchIDs, BalanceIncrement, WatchTimeIncrement, C.ID); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, This bot does not have permission to edit that Bank"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, CurrencyID does not correspond to an existing Currency"; } } else { ErrorOccured = true; //Context.ResponseObject.Code = 403; Context.ResponseObject.Message = "Invalid AuthToken"; } } else if (Context.Headers.AllKeys.Contains("ID")) { if (CorrespondingBot != null) { try { int.Parse(Context.Headers["ID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Viewer B = Data.Objects.Viewer.FromID(int.Parse(Context.Headers["ID"])); if (B == null) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing viewer"; return(Context.ResponseObject); } if (B.Currency.ID == CorrespondingBot.Currency.ID || CorrespondingBot.IsSuperBot) { B.Delete(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, This bot does not have permission to edit that Bank"; } } else { ErrorOccured = true; //Context.ResponseObject.Code = 403; Context.ResponseObject.Message = "Invalid AuthToken"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "login") { if ((Context.Headers.AllKeys.Contains("UserName") || Context.Headers.AllKeys.Contains("Email") || Context.Headers.AllKeys.Contains("Password")) && Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("ID")) { try { int.Parse(Context.Headers["ID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["ID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { if (Context.Headers["Email"] != null) { if (!Checks.IsValidEmail(Context.Headers["Email"])) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Email is not valid"; return(Context.ResponseObject); } L.Email = Context.Headers["Email"]; } if (Context.Headers["UserName"] != null) { if (!Checks.IsAlphaNumericString(Context.Headers["UserName"])) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Username is not AlphaNumeric"; return(Context.ResponseObject); } L.UserName = Context.Headers["UserName"]; } if (Context.Headers["Password"] != null) { if (Context.Headers["Password"].Length < 8) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password too short"; return(Context.ResponseObject); } if (!Checks.IsValidPassword(Context.Headers["Password"])) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password requires at least 1 Capital, 1 Number, 1 Special"; return(Context.ResponseObject); } L.HashedPassword = new Scrypt.ScryptEncoder().Encode(Context.Headers["Password"]); } if (!L.UpdateUserNameEmailPassword()) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, That UserName or Email may be in use by another account"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing user"; } } else if (Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("ID")) { try { int.Parse(Context.Headers["ID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["ID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { if (!L.UpdateToken()) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Was unable to refresh"; ErrorOccured = true; } else { Context.ResponseObject.Data = L.ToJson(); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing user"; } } else if (Context.Headers.AllKeys.Contains("Password")) { if (Context.Headers.AllKeys.Contains("UserName")) { Data.Objects.Login L = Data.Objects.Login.FromUserName(Context.Headers["UserName"], true); if (L != null) { if (Context.Headers["Password"] == null) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password is null"; } else { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["Password"], L.HashedPassword)) { L.UpdateToken(); L.HashedPassword = null; Context.ResponseObject.Data = L.ToJson(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password does not match"; } } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, UserName does not correspond to an existing user"; } } else if (Context.Headers.AllKeys.Contains("Email")) { Data.Objects.Login L = Data.Objects.Login.FromEmail(Context.Headers["Email"], true); if (L != null) { if (Context.Headers["Password"] == null) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password is null"; } else { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["Password"], L.HashedPassword)) { L.UpdateToken(); L.HashedPassword = null; Context.ResponseObject.Data = L.ToJson(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password does not match"; } } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Email does not correspond to an existing user"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Email or UserName header is required"; } } else if (Context.URLSegments.Length == 3) { try { int.Parse(Context.Headers["ID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } if (Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("ID") && Context.URLSegments[2] == "delete") { Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["ID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { L.Delete(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing user"; } } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "signup") { if (Context.Headers.AllKeys.Contains("UserName") && Context.Headers.AllKeys.Contains("Email") && Context.Headers.AllKeys.Contains("Password")) { Backend.Data.Objects.Login L = new Data.Objects.Login(); L.Email = Context.Headers["Email"]; L.UserName = Context.Headers["UserName"]; if (L.UserName != null) { if (!Checks.IsAlphaNumericString(L.UserName)) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Username is not AlphaNumeric"; return(Context.ResponseObject); } } if (L.Email != null) { if (!Checks.IsValidEmail(L.Email)) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Email is not valid"; return(Context.ResponseObject); } } if (Data.Objects.Login.FromEmail(L.Email) == null && Data.Objects.Login.FromUserName(L.UserName) == null) { string RawPassword = Context.Headers["Password"]; if (RawPassword.Length < 8) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password too short"; return(Context.ResponseObject); } if (!Checks.IsValidPassword(RawPassword)) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Password requires at least 1 Capital, 1 Number, 1 Special"; return(Context.ResponseObject); } L.HashedPassword = Backend.Init.ScryptEncoder.Encode(RawPassword); L.Save(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, User already exists"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "bot") { if (Context.Headers.AllKeys.Contains("RefreshToken") && Context.Headers.AllKeys.Contains("BotID")) { try { int.Parse(Context.Headers["BotID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Bot B = Data.Objects.Bot.FromID(int.Parse(Context.Headers["BotID"]), true); if (B != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["RefreshToken"], B.RefreshToken)) { B.PerformRefresh(); Context.ResponseObject.Data = B.ToJson(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Refresh Token is not valid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, BotID does not correspond to a bot"; } } else if (Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("CurrencyID") && Context.Headers.AllKeys.Contains("BotID") && Context.Headers.AllKeys.Contains("LoginID")) { try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } try { int.Parse(Context.Headers["BotID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed BotID"; return(Context.ResponseObject); } try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed LoginID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["LoginID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { Data.Objects.Bot B = Data.Objects.Bot.FromID(int.Parse(Context.Headers["BotID"])); if (B != null) { if (B.Currency == null) { B.Currency = Data.Objects.Currency.FromLogin(L.ID).Find(x => x.ID == int.Parse(Context.Headers["CurrencyID"])); if (B.Currency == null) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is not allowed to edit that currency"; } else { B.UpdateCurrency(); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Bot is already bound to a currency"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, BotID doesnt match any bot"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing user"; } } else if (Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("LoginID")) { try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed LoginID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["LoginID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { if (Data.Objects.Bot.FromLogin(L.ID).Count >= 5) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, You are already at the max Bot count"; } else { Data.Objects.Bot B = new Data.Objects.Bot(); if (Context.Headers.AllKeys.Contains("BotName")) { B.BotName = Context.Headers["BotName"]; if (!Checks.IsAlphaNumericString(B.BotName)) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, BotName is not AlphaNumeric"; return(Context.ResponseObject); } } else { B.BotName = "No Name Given"; } B.OwnerLogin = Data.Objects.Login.FromID(L.ID); B.Save(); Data.Objects.Bot NewB = Data.Objects.Bot.FromLogin(L.ID, true).Last(); NewB.RefreshToken = B.RefreshToken; NewB.AccessToken = B.AccessToken; Context.ResponseObject.Data = NewB.ToJson(); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing user"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "currency") { if (Context.URLSegments.Length == 3) { if (Context.URLSegments[2] == "all") { if (CorrespondingBot != null && CorrespondingBot.IsSuperBot) { Context.ResponseObject.Data = Newtonsoft.Json.Linq.JToken.FromObject(Data.Objects.Currency.All(true)); } else { Context.ResponseObject.Data = Newtonsoft.Json.Linq.JToken.FromObject(Data.Objects.Currency.All()); } } else if (Context.URLSegments[2] == "delete") { if (Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("LoginID") && Context.Headers.AllKeys.Contains("CurrencyID")) { try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed LoginID"; return(Context.ResponseObject); } try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["LoginID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { Data.Objects.Currency C = Data.Objects.Currency.FromID(int.Parse(Context.Headers["CurrencyID"])); if (C != null) { C.Delete(); } else { } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing user"; } } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Bot is not SuperBot"; } } else if (((Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("LoginID")) || CorrespondingBot != null) && Context.RequestData != null && Context.Headers.AllKeys.Contains("CurrencyID")) { try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Login L = null; if (Context.Headers.AllKeys.Contains("LoginID")) { try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed LoginID"; return(Context.ResponseObject); } L = Data.Objects.Login.FromID(int.Parse(Context.Headers["LoginID"]), true); if (!Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { L = null; } } if (L != null || CorrespondingBot != null) { Data.Objects.Currency B = Data.Objects.Currency.FromID(int.Parse(Context.Headers["CurrencyID"])); B.LoadConfigs(true); bool LoginGood = false, BotGood = false; if (L != null) { LoginGood = B.OwnerLogin.ID == L.ID; } if (CorrespondingBot != null) { BotGood = /*CorrespondingBot.Currency.ID == B.ID ||*/ CorrespondingBot.IsSuperBot; } if (LoginGood || BotGood) { if (Context.RequestData["LoginConfig"] != null) { if (CorrespondingBot == null || CorrespondingBot.IsSuperBot) { if (Checks.JSONLayoutCompare( Newtonsoft.Json.Linq.JToken.Parse(System.IO.File.ReadAllText("./Data/DefaultConfigs/Login.config.json")), Context.RequestData["LoginConfig"])) { B.LoginConfig = Context.RequestData["LoginConfig"]; } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, LoginConfig does not follow the required structure"; } } } if (Context.RequestData["CommandConfig"] != null) { if (Checks.JSONLayoutCompare( Newtonsoft.Json.Linq.JToken.Parse(System.IO.File.ReadAllText("./Data/DefaultConfigs/Command.config.json")), Context.RequestData["CommandConfig"])) { B.CommandConfig = Context.RequestData["CommandConfig"]; } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ComamndConfig does not follow the required structure"; } } if (ErrorOccured == false) { B.UpdateConfigs(); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, This login does not have permission to edit that Currency"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else if (Context.Headers.AllKeys.Contains("CurrencyID") && CorrespondingBot != null) { try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Currency C = Data.Objects.Currency.FromID(int.Parse(Context.Headers["CurrencyID"])); if (/*CorrespondingBot.Currency.ID == C.ID ||*/ CorrespondingBot.IsSuperBot) { C.LoadConfigs(true); Context.ResponseObject.Data = C.ToJson(); } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, This bot does not have permission to read that Currency"; } } else if (Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("LoginID")) { try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed LoginID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["LoginID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { if (Data.Objects.Currency.FromLogin(L.ID).Count >= 5) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, You are already at the max currency count"; } else { Data.Objects.Currency B = new Data.Objects.Currency(); B.OwnerLogin = Data.Objects.Login.FromID(L.ID); B.Save(); B = Data.Objects.Currency.FromLogin(L.ID).Last(); Context.ResponseObject.Data = B.ToJson(); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not correspond to an existing user"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else { Context.ResponseObject.Code = 404; Context.ResponseObject.Message = "Not Found"; ErrorOccured = true; } if (ErrorOccured == false) { Context.ResponseObject.Code = 200; Context.ResponseObject.Message = "The requested task was performed successfully"; } return(Context.ResponseObject); }
public static ResponseObject Handle(StandardisedRequestObject Context) { bool ErrorOccured = false; // Check if TwitchID and DiscordID only compose of numbers if (Context.Headers.AllKeys.Contains("TwitchID")) { if (!Checks.IsValidID(Context.Headers["TwitchID"])) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, TwitchID contains invalid characters"; return(Context.ResponseObject); } } if (Context.Headers.AllKeys.Contains("DiscordID")) { if (!Checks.IsValidID(Context.Headers["DiscordID"])) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, DiscordID contains invalid characters"; return(Context.ResponseObject); } } if (Context.URLSegments[1] == "viewer") //Check the url path for viewer { if (Context.Headers.AllKeys.Contains("ID")) // Get the viewer where header ID matches { try { int.Parse(Context.Headers["ID"]); }//Check if the ID Header can be converted to an integer catch {//If it cant be converted, set the contents of the Response Object to reflect this Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Viewer B = Data.Objects.Viewer.FromID(int.Parse(Context.Headers["ID"]));//Fetch the Viewer Object with the given ID if (B != null) { Context.ResponseObject.Data = B.ToJson(); } //If We get a Viewer back, set the Response Objects data to the JSON format of the Viewer else //If we didnt get a viewer back, set the contents of the Response Object to reflect that a viewer doesnt exist with the given ID { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not match an existing object"; ErrorOccured = true; } } else if ((Context.Headers.AllKeys.Contains("TwitchID") || Context.Headers.AllKeys.Contains("DiscordID")) && Context.Headers.AllKeys.Contains("CurrencyID")) // Get the viewer where header (TwitchID and/or DiscordID) and CurrencyID matches { try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Viewer B = Data.Objects.Viewer.FromTwitchDiscord(Context.Headers["DiscordID"], Context.Headers["TwitchID"], int.Parse(Context.Headers["CurrencyID"])); if (B != null) { Context.ResponseObject.Data = B.ToJson(); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, TwitchID and/or DiscordID does not match an existing object"; ErrorOccured = true; } } else if (Context.Headers.AllKeys.Contains("CurrencyID")) // Get all viewers for the CurrencyID { string OrderBy = null; if (Context.Headers["Order"] == "WatchTime" || Context.Headers["Order"] == "Balance") { OrderBy = Context.Headers["Order"]; } try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } List <Data.Objects.Viewer> B = Data.Objects.Viewer.FromCurrency(int.Parse(Context.Headers["CurrencyID"]), OrderBy); if (B.Count != 0) { Context.ResponseObject.Data = Newtonsoft.Json.Linq.JToken.FromObject(B); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, CurrencyID does not match an existing object"; ErrorOccured = true; } } else if (Context.Headers.AllKeys.Contains("TwitchID") || Context.Headers.AllKeys.Contains("DiscordID")) // Get all viewers for any currency where TwitchID and/or DiscordID matches { List <Data.Objects.Viewer> B = Data.Objects.Viewer.FromTwitchDiscord(Context.Headers["DiscordID"], Context.Headers["TwitchID"]); if (B.Count != 0) { Context.ResponseObject.Data = Newtonsoft.Json.Linq.JToken.FromObject(B); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, TwitchID and/or DiscordID does not match an existing object"; ErrorOccured = true; } } else//Inform requestor that we dont have any infomation to work with { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "currency") { if (Context.Headers.AllKeys.Contains("ID"))//Get Currency where ID matches { try { int.Parse(Context.Headers["ID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Currency C = Data.Objects.Currency.FromID(int.Parse(Context.Headers["ID"])); if (Context.Headers.AllKeys.Contains("AccessToken") && Context.Headers.AllKeys.Contains("LoginID")) { // If a valid accesstoken is provided, get private information try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["LoginID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { if (Data.Objects.Currency.FromLogin(L.ID).Find(x => x.ID == C.ID) != null) { C.LoadConfigs(true); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, LoginID does not correspond to an existing user"; } } if (C != null) { Context.ResponseObject.Data = C.ToJson(); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not match an existing object"; ErrorOccured = true; } } else if (Context.Headers.AllKeys.Contains("LoginID"))// Get all Currencies of the LoginID { try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed LoginID"; return(Context.ResponseObject); } List <Data.Objects.Currency> C = Data.Objects.Currency.FromLogin(int.Parse(Context.Headers["LoginID"])); Context.ResponseObject.Data = Newtonsoft.Json.Linq.JToken.FromObject(C); Context.ResponseObject.Code = 200; Context.ResponseObject.Message = "Unknown Outcome, It is not known if the LoginID matches an object"; ErrorOccured = true; } else//Inform requestor that we dont have any infomation to work with { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "login") { if (Context.Headers.AllKeys.Contains("ID"))//Get Login where ID matches { try { int.Parse(Context.Headers["ID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["ID"])); if (L != null) { Context.ResponseObject.Data = L.ToJson(); if (Context.Headers.AllKeys.Contains("AccessToken")) { if (Context.Headers["AccessToken"] != "") { L = Data.Objects.Login.FromID(int.Parse(Context.Headers["ID"]), true); if (!Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken doesnt match"; ErrorOccured = true; } else { L.AccessToken = null; L.HashedPassword = null; Context.ResponseObject.Data = L.ToJson(); } } } } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not match an existing object"; ErrorOccured = true; } } else if (Context.Headers.AllKeys.Contains("UserName"))//Get Login where UserName matches { Data.Objects.Login L = Data.Objects.Login.FromUserName(Context.Headers["UserName"]); if (L != null) { Context.ResponseObject.Data = L.ToJson(); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, UserName does not match an existing object"; ErrorOccured = true; } } else if (Context.Headers.AllKeys.Contains("Email"))//Get Login where Email matches { Data.Objects.Login L = Data.Objects.Login.FromEmail(Context.Headers["Email"]); if (Context.URLSegments.Length == 3) { if (Context.URLSegments[2] == "recover") { if (!L.UpdateToken()) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Was unable to recover"; ErrorOccured = true; } else { MailMessage Message = new MailMessage(Backend.Init.APIConfig["Email"]["Email"].ToString(), Context.Headers["Email"], "Password Recovery", Backend.Init.APIConfig["Email"]["Body"].ToString().Replace("<@Token>", L.AccessToken)); Message.BodyEncoding = UTF8Encoding.UTF8; Message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure; Backend.Init.Emailer.Send(Message); } } } else { if (L != null) { Context.ResponseObject.Data = L.ToJson(); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Email does not match an existing object"; ErrorOccured = true; } } } else//Inform requestor that we dont have any infomation to work with { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "bot") { if (Context.Headers.AllKeys.Contains("ID") && Context.Headers.AllKeys.Contains("LoginID"))//Get Bot where ID matches { bool WithSecretData = false; try { int.Parse(Context.Headers["ID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } if (Context.Headers.AllKeys.Contains("AccessToken"))// If a valid accesstoken is provided, get private information { try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed ID"; return(Context.ResponseObject); } Data.Objects.Login L = Data.Objects.Login.FromID(int.Parse(Context.Headers["LoginID"]), true); if (L != null) { if (Backend.Init.ScryptEncoder.Compare(Context.Headers["AccessToken"], L.AccessToken)) { if (Data.Objects.Bot.FromLogin(L.ID).Find(x => x.ID == int.Parse(Context.Headers["ID"])) != null) { WithSecretData = true; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, AccessToken is invalid"; } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, LoginID does not correspond to an existing user"; } } Data.Objects.Bot B = Data.Objects.Bot.FromID(int.Parse(Context.Headers["ID"]), WithSecretData); if (B != null) { Context.ResponseObject.Data = B.ToJson(); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, ID does not match an existing object"; ErrorOccured = true; } } else if (Context.Headers.AllKeys.Contains("LoginID"))//Get all Bots of LoginID { try { int.Parse(Context.Headers["LoginID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed LoginID"; return(Context.ResponseObject); } List <Data.Objects.Bot> B = Data.Objects.Bot.FromLogin(int.Parse(Context.Headers["LoginID"])); Context.ResponseObject.Data = Newtonsoft.Json.Linq.JToken.FromObject(B); Context.ResponseObject.Code = 200; Context.ResponseObject.Message = "Unknown Outcome, It is not known if the LoginID matches an object"; ErrorOccured = true; } else if (Context.Headers.AllKeys.Contains("CurrencyID"))//Get all Bots of CurrencyID { try { int.Parse(Context.Headers["CurrencyID"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } List <Data.Objects.Bot> B = Data.Objects.Bot.FromCurrency(int.Parse(Context.Headers["CurrencyID"])); if (B.Count != 0) { Context.ResponseObject.Data = Newtonsoft.Json.Linq.JToken.FromObject(B); } else { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, CurrencyID does not match an existing object"; ErrorOccured = true; } } else//Inform requestor that we dont have any infomation to work with { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, No operable Headers provided"; } } else if (Context.URLSegments[1] == "nightbot") { Context.GetStateParams(); if (Context.URLParamaters.ContainsKey("code") && Context.StateParamaters.ContainsKey("accesstoken") && Context.URLParamaters.ContainsKey("state") && Context.StateParamaters.ContainsKey("currencyid") && Context.StateParamaters.ContainsKey("accesstoken")) { string Code = Context.URLParamaters["code"]; try { int.Parse(Context.StateParamaters["currencyid"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Currency C = Data.Objects.Currency.FromID(int.Parse(Context.StateParamaters["currencyid"])); if (C == null) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, CurrencyID does not match an existing object"; ErrorOccured = true; } else { Data.Objects.Login L = Data.Objects.Login.FromID(C.OwnerLogin.ID, true); if (Backend.Init.ScryptEncoder.Compare(Context.StateParamaters["accesstoken"], L.AccessToken)) { C.LoadConfigs(true); WebRequest Req = WebRequest.Create("https://api.nightbot.tv/oauth2/token"); Req.Method = "POST"; byte[] PostData = Encoding.UTF8.GetBytes("client_id=" + C.LoginConfig["NightBot"]["ClientId"] + "&client_secret=" + C.LoginConfig["NightBot"]["ClientSecret"] + "&grant_type=authorization_code&redirect_uri=" + Backend.Init.APIConfig["WebURL"] + "/nightbot/&code=" + Code); Req.Method = "POST"; Req.ContentType = "application/x-www-form-urlencoded"; Req.ContentLength = PostData.Length; Stream PostStream = Req.GetRequestStream(); PostStream.Write(PostData, 0, PostData.Length); PostStream.Flush(); PostStream.Close(); try { WebResponse Res = Req.GetResponse(); string D = new StreamReader(Res.GetResponseStream()).ReadToEnd(); Newtonsoft.Json.Linq.JObject JD = Newtonsoft.Json.Linq.JObject.Parse(D); C.LoginConfig["NightBot"]["RefreshToken"] = JD["refresh_token"]; C.UpdateConfigs(); } catch (WebException E) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Something went wrong"; Console.WriteLine(new StreamReader(E.Response.GetResponseStream()).ReadToEnd()); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "AccessToken is not allowed to modify that currency"; } } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Code and/or currencyid and/or accesstoken is missing"; } } else if (Context.URLSegments[1] == "streamlabs") { Context.GetStateParams(); if (Context.URLParamaters.ContainsKey("code") && Context.URLParamaters.ContainsKey("state") && Context.StateParamaters.ContainsKey("currencyid") && Context.StateParamaters.ContainsKey("accesstoken")) { string Code = Context.URLParamaters["code"]; try { int.Parse(Context.StateParamaters["currencyid"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Currency C = Data.Objects.Currency.FromID(int.Parse(Context.StateParamaters["currencyid"])); if (C == null) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, CurrencyID does not match an existing object"; ErrorOccured = true; } else { Data.Objects.Login L = Data.Objects.Login.FromID(C.OwnerLogin.ID, true); if (Backend.Init.ScryptEncoder.Compare(Context.StateParamaters["accesstoken"], L.AccessToken)) { C.LoadConfigs(true); WebRequest Req = WebRequest.Create("https://streamlabs.com/api/v1.0/token"); Req.Method = "POST"; Req.ContentType = "application/x-www-form-urlencoded"; byte[] PostData = Encoding.UTF8.GetBytes("grant_type=authorization_code&client_id=" + C.LoginConfig["StreamLabs"]["ClientId"] + "&client_secret=" + C.LoginConfig["StreamLabs"]["ClientSecret"] + "&redirect_uri=" + Backend.Init.APIConfig["WebURL"] + "/streamlabs/&code=" + Code); Req.ContentLength = PostData.Length; Stream PostStream = Req.GetRequestStream(); PostStream.Write(PostData, 0, PostData.Length); PostStream.Flush(); PostStream.Close(); WebResponse Res; try { Res = Req.GetResponse(); Newtonsoft.Json.Linq.JObject D = Newtonsoft.Json.Linq.JObject.Parse(new StreamReader(Res.GetResponseStream()).ReadToEnd()); C.LoginConfig["StreamLabs"]["RefreshToken"] = D["refresh_token"]; C.UpdateConfigs(); } catch (WebException E) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Something went wrong"; Console.WriteLine(new StreamReader(E.Response.GetResponseStream()).ReadToEnd()); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "AccessToken is not allowed to modify that currency"; } } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Code and/or currencyid and/or accesstoken is missing"; } } else if (Context.URLSegments[1] == "twitch") { Context.GetStateParams(); if (Context.URLParamaters.ContainsKey("code") && Context.StateParamaters.ContainsKey("accesstoken") && Context.URLParamaters.ContainsKey("state") && Context.StateParamaters.ContainsKey("currencyid")) { string Code = Context.URLParamaters["code"]; try { int.Parse(Context.StateParamaters["currencyid"]); } catch { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, Malformed CurrencyID"; return(Context.ResponseObject); } Data.Objects.Currency C = Data.Objects.Currency.FromID(int.Parse(Context.StateParamaters["currencyid"])); if (C == null) { Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Bad Request, CurrencyID does not match an existing object"; ErrorOccured = true; } else { Data.Objects.Login L = Data.Objects.Login.FromID(C.OwnerLogin.ID, true); if (Backend.Init.ScryptEncoder.Compare(Context.StateParamaters["accesstoken"], L.AccessToken)) { C.LoadConfigs(true); WebRequest Req = WebRequest.Create("https://id.twitch.tv/oauth2/token"); Req.Method = "POST"; Req.ContentType = "application/x-www-form-urlencoded"; byte[] PostData = Encoding.UTF8.GetBytes("grant_type=authorization_code&client_id=" + C.LoginConfig["Twitch"]["API"]["ClientId"] + "&client_secret=" + C.LoginConfig["Twitch"]["API"]["ClientSecret"] + "&redirect_uri=" + Backend.Init.APIConfig["WebURL"] + "/twitch/&code=" + Code); Req.ContentLength = PostData.Length; Stream PostStream = Req.GetRequestStream(); PostStream.Write(PostData, 0, PostData.Length); PostStream.Flush(); PostStream.Close(); WebResponse Res; try { Res = Req.GetResponse(); Newtonsoft.Json.Linq.JObject D = Newtonsoft.Json.Linq.JObject.Parse(new StreamReader(Res.GetResponseStream()).ReadToEnd()); C.LoginConfig["Twitch"]["API"]["RefreshToken"] = D["refresh_token"]; C.UpdateConfigs(); } catch (WebException E) { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Something went wrong"; Console.WriteLine(new StreamReader(E.Response.GetResponseStream()).ReadToEnd()); } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "AccessToken is not allowed to modify that currency"; } } } else { ErrorOccured = true; Context.ResponseObject.Code = 400; Context.ResponseObject.Message = "Code and/or currencyid and/or accesstoken is missing"; } } else//Inform requestor that the url does not got anywhere { Context.ResponseObject.Code = 404; Context.ResponseObject.Message = "Not Found"; ErrorOccured = true; } if (ErrorOccured == false) { Context.ResponseObject.Code = 200; Context.ResponseObject.Message = "The requested task was performed successfully"; } return(Context.ResponseObject); }