async void CheckIfStolen(string assetUrl, String avatarID, string username, string displayName, string userID) { string fileName = string.Empty, author = string.Empty; using (WebClient web = new WebClient()) { try { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return(true); }); string url = assetUrl.Substring(36).Split('/')[0]; string resp = web.DownloadString($"https://api.vrchat.cloud/api/1/file/" + url + "/"); var obj = JsonConvert.DeserializeObject <Dictionary <object, object> >(resp); fileName = obj["name"].ToString(); author = obj["ownerId"].ToString(); } catch (Exception e) { } } if (fileName == string.Empty || fileName.ToLower().Contains("asset")) { return; } string n = Environment.NewLine; string toPrint = "=========================Stolen Avatar Detected===================" + n; toPrint += "Time: " + DateTime.Now.ToString("MM/dd/yyyy h:mm tt") + n; toPrint += "Username: "******"Displayname: " + displayName + n; toPrint += "User ID: " + userID + n; toPrint += "Stolen Avatar ID: " + avatarID + n; toPrint += "===============================================================" + n + n; ThreadHelperClass.SetText(this, logTextField, logTextField.Text + toPrint + n); }
async Task StartApi() { if (IsLoggedIn) { return; } string n = Environment.NewLine; string userID = ""; try { Global.ApiKey = apiKeyTextField.Text; try { System.IO.File.WriteAllLines("APIKey.cfg", new string[] { Global.ApiKey }); } catch (Exception e) { /*unhandled*/ } logTextField.Text += "Logging in to API as " + userTextField.Text + n; //logTextField.Text += "Creating API Instance" + n; api = new VRChatApi.VRChatApi(userTextField.Text, passwordTextField.Text); //logTextField.Text += "Getting config response" + n; ConfigResponse config = await api.RemoteConfig.Get(); UserResponse user = await api.UserApi.Login(); if (user == null) { logTextField.Text += "Login Failed (Incorrect Username/Password OR APIKey)" + n; IsLoggedIn = false; return; } loginButton.Enabled = false; //logTextField.Text += user.DeepDumpAsString() + n; IsLoggedIn = true; userID = user.id; if (!user.friends.Contains(userID)) { await api.UserApi.SendFriendRequest(userID); await api.FriendsApi.AcceptFriend(userID); } } catch (Exception e) { logTextField.Text += e.ToString() + Environment.NewLine; } new Thread(async() => { while (true) { if (!IsLoggedIn) { break; } if (!loggingOnButton.Checked) { Thread.Sleep(1000); continue; } //usr_80a984c9-2b8e-4396-b893-2f31d8fd2ba3 UserBriefResponse userPing = await api.UserApi.GetById(userID); //ThreadHelperClass.SetText(this, logTextField, logTextField.Text + "User Ping" + n + n + userPing.DeepDumpAsString() + n); ThreadHelperClass.SetText(this, logTextField, logTextField.Text + "Running check for stolen avatars" + n); IList <String> ids = await api.WorldApi.GetUsersInInstance(userPing.worldId + "/" + userPing.instanceId); foreach (String s in ids) { //ThreadHelperClass.SetText(this, logTextField, logTextField.Text + s + n); UserBriefResponse userInRoom = await api.UserApi.GetById(s); if (userInRoom == null) { continue; } IList <string> userPublicAvatars = await api.AvatarApi.GetAvatarList(userInRoom.id); foreach (String ss in userPublicAvatars) { //ThreadHelperClass.SetText(this, logTextField, logTextField.Text + " " + ss + n); try { AvatarResponse avatar = await api.AvatarApi.GetById(ss); CheckIfStolen(avatar.assetUrl, avatar.id, userInRoom.username, userInRoom.displayName, userInRoom.id); } catch (Exception e) { string response = await api.AvatarApi.GetUrl(ss); string[] parse = response.Split('"'); string assetURL = ""; string avatarID = ""; for (int i = 0; i < parse.Length; i++) { if (parse[i].Contains("assetUrl")) { assetURL = parse[i + 2]; break; } } foreach (String sss in parse) { if (sss.Contains("avtr_")) { avatarID = sss; break; } } CheckIfStolen(assetURL, avatarID, userInRoom.username, userInRoom.displayName, userInRoom.id); //ThreadHelperClass.SetText(this, logTextField, logTextField.Text + " " + "Manual Asset URL: " + assetURL + n); } } } ThreadHelperClass.SetText(this, logTextField, logTextField.Text + "Check finished. Waiting 60 seconds..." + n); Thread.Sleep(60000); } }).Start(); }