def btnFavAvatarID(self): sID = vrcf.stringToID(self.idEntry.text()) self.clearId() if (sID is None): vrcl.log("No avtr_id in string to favorite") self.setCooldown(config.failCooldown) else: vrcf.setFavorite(sID) self.setCooldown(config.normalCooldown) self.cooldown()
def btnCollectAvtrById(self): sID = vrcf.stringToID(self.idEntry.text()) self.clearId() if (sID is None): vrcl.log("ID field was empty or doesn't have a valid ID") self.setCooldown(config.failCooldown) else: self.setCooldown(config.normalCooldown) vrcf.collectAvatarById(sID) self.cooldown()
def clearFavorites(): try: list = getFavoriteList() user = client.fetch_me() for favAv in list: vrcl.log("removeFavorite: " + favAv.favoriteId ) #id - fvrt_4b216a69-3159-49bb-a1c1-0fb2408883f6 user.remove_favorite(favAv.favoriteId) except Exception as e: print(str(e))
def btnRemoveAvtrById(self): sID = vrcf.stringToID(self.idEntry.text()) self.clearId() if (sID is None): vrcl.log("No avtr_id in string to remove") self.setCooldown(config.failCooldown) else: self.setCooldown(config.normalCooldown) vrcf.removeFavoriteID(sID) self.cooldown()
def getFavoritesToml( self ): # gets favorites from file when needed, allows updating your favorites without restarting try: tomlData = toml.load( open(join(self.app_dir, 'config', 'favorites.toml'))) return tomlData except Exception as e: vrcl.log(e) vrcl.log("Failed to load favorites.toml") return None
def updateAvatarDir(self): if (self.getAvatarFolder.isalnum()): self.avatar_dir = join(self.app_dir, self.getAvatarFolder) else: vrcl.log("Avatar folder name invalid, falling back to 'avatars'") self.avatar_dir = join(self.app_dir, 'avatars') self.dbfile = join(self.avatar_dir, 'vrcdb.sqlite') if not isdir(self.avatar_dir): mkdir(self.avatar_dir)
def revertFavorites(): clearFavorites() for x in range(1, 26): try: ta = config.getFavoritesToml().get(str(x)) if (ta is None): vrcl.log("Skipping favorite " + str(x) + " as it is not set") else: setFavorite(stringToID(ta)) except Exception as e: vrcl.log("Skipping favorite " + str(x) + " as it is not set")
def stringToID(input): reg = re.compile( "(avtr_[0-9,a-f]{8}-[0-9,a-f]{4}-[0-9,a-f]{4}-[0-9,a-f]{4}-[0-9,a-f]{12})" ) #tests https://regexr.com/56rb9 #removes extra prefixes like skip_, private_, deleted_, nsfw_, etc result = reg.search(input) #search full path string vrcl.log("re:" + str(result)) try: return result.group(1) except Exception as e: vrcl.log(str(e)) return None
def dropEvent(self, event): if (event.mimeData().hasImage and self.allowDrop == True): event.setDropAction(Qt.CopyAction) file_path = event.mimeData().urls()[0].toLocalFile() sID = vrcf.stringToID(file_path) self.clearId() if (sID is None): vrcl.log("No avtr_id in file_path") self.setCooldown(config.failCooldown) else: vrcf.setFavorite(sID) self.setCooldown(config.normalCooldown) self.cooldown() event.accept() else: event.ignore()
def setConfigFile(self, configFile): tomlData = toml.load(open(join(self.app_dir, 'config', configFile))) # print(tomlData) self.getUsername = self.setValDefault( tomlData.get('credentials').get('username'), "ChangeMe") self.getPassword = self.setValDefault( tomlData.get('credentials').get('password'), "ChangeMe") self.get2FARequired = self.setValDefault( tomlData.get('credentials').get('2fa'), False) if (self.get2FARequired): vrcl.log("2FA not supported yet") self.getAvatarFolder = self.setValDefault( tomlData.get('management').get('avatarFolder'), "avatars") self.writeAvatarDB = self.setValDefault( tomlData.get('management').get('writeAvatarDB'), False) self.getReleaseStatusCheck = self.setValDefault( tomlData.get('management').get('releaseStatusCheck'), True) self.failCooldown = self.setValDefault( tomlData.get('management').get('failCooldown'), 2) self.normalCooldown = self.setValDefault( tomlData.get('management').get('normalCooldown'), 60) self.longCooldown = self.setValDefault( tomlData.get('management').get('longCooldown'), 120) self.useGlobalKeybind = self.setValDefault( tomlData.get('management').get('useGlobalKeybind'), False) self.getGlobalKeyBind = self.setValDefault( tomlData.get('management').get('globalKeybind'), ["control", "k"]) self.getDebugLogEnabled = self.setValDefault( tomlData.get('debug').get('debugLog'), False) self.getExtraOptions = self.setValDefault( tomlData.get('debug').get('extraOptions'), False) self.getSpec = tomlData.get('debug').get('configSpec') if (self.getSpec != configSpec): vrcl.log( "ConfigSpec in " + configFile + " doesn't match this version, your config may be out of date") self.getRaw = tomlData if (self.getDebugLogEnabled): print(tomlData) self.updateAvatarDir()
def checkdb(): if config.writeAvatarDB: #check if sqlite db is enabled if not exists(config.dbfile): #if db doesn't exist create one try: conn = sqlite3.connect(config.dbfile) gc = conn.cursor() gc.execute('''CREATE TABLE IF NOT EXISTS "AVATARS" ( "avtr_id" TEXT NOT NULL CHECK(length(avtr_id) = 41) UNIQUE COLLATE NOCASE, "avtr_name" TEXT NOT NULL, "avtr_desc" TEXT, "avtr_img" TEXT, "user_id" TEXT NOT NULL CHECK(length(user_id) = 40), "user_name" TEXT NOT NULL COLLATE NOCASE, "user_username" TEXT NOT NULL COLLATE NOCASE, "date_collected" TEXT, "release_status" TEXT COLLATE NOCASE, "mark" TEXT COLLATE NOCASE, "notes" TEXT, "nsfw" INTEGER DEFAULT 0, PRIMARY KEY("avtr_id") ); ''') conn.commit() gc.close() vrcl.log("Generated vrcdb.sqlite") except Exception as e: vrcl.log("Unable to open vrcdb.sqlite") vrcl.log(str(e))
def login(): try: client.login(config.getUsername, config.getPassword) b = client.fetch_me() vrcl.log("Logged in as: " + b.displayName) except Exception as e: vrcl.log(str(e)) vrcl.log("Failed to Login") end()
def updatecheck(): try: response = requests.get( "https://api.github.com/repos/XDelta/VRC_Fav_UI/releases/latest") cver = parse_version(config.version) rver = parse_version(response.json()["name"]) if rver > cver: vrcl.log("New version available [" + str(rver) + "], Current [" + str(cver) + "]") elif rver < cver: vrcl.log("Ahead of Remote [" + str(rver) + "], Current [" + str(cver) + "]") else: vrcl.log("Up to date [" + str(rver) + "]") except Exception as e: print(str(e)) vrcl.log("Unable to check for update")
def setFavorite(id): if (id is None): vrcl.log("No avtr id in string to favorite") return try: a = client.fetch_avatar(id) vrcl.log("Adding " + str(id) + " to favorites") except Exception as e: vrcl.log(str(e)) vrcl.log("Failed to find " + str(id) + ", avatar may have been deleted") return if (a.releaseStatus == "private" and config.getReleaseStatusCheck): vrcl.log("Failed to add " + str(id) + ", avatar was made private and would be unavailable in game") vrcl.log( "You may change releaseStatusCheck in config.toml to skip this check" ) return try: a.favorite() except Exception as e: vrcl.log("Failed to add to favorites, likely at max") vrcl.log(str(e))
def collectAvatarById(idInput): a = client.fetch_avatar(idInput) #refresh user object avtr_id = a.id avtr_name = a.name avtr_desc = a.description avtr_img = a.thumbnailImageUrl #sometimes gets api.vrchat.cloud img link instead of cloudfront thumbnail png user_id = a.author().id user_name = a.author().displayName user_username = a.author().username date_collected = datetime.now().strftime("%m/%d/%y-%H:%M:%S") release_status = a.releaseStatus vrcl.log("-" * 24) #show console message of avatar info vrcl.log("Name: " + avtr_name) vrcl.log("ID: " + avtr_id) vrcl.log("Img: " + avtr_img) outputFile = join(config.avatar_dir, avtr_id + ".png") vrcl.log(outputFile) if config.writeAvatarDB: # write to sqlite db if configured try: conn = sqlite3.connect(join(config.avatar_dir, 'vrcdb.sqlite')) ac = conn.cursor() if ac.execute( "SELECT EXISTS(SELECT 1 FROM AVATARS WHERE avtr_id=?)", (idInput, )).fetchone()[0] > 0: #check if id is already in db print("Found " + idInput + " in db") else: #if not, add try to add it to db print(idInput + " was not found in db") try: ac.execute( "INSERT INTO AVATARS (avtr_id, avtr_name, avtr_desc, avtr_img, user_id, user_name, user_username, date_collected, release_status) VALUES (?,?,?,?,?,?,?,?,?)", (avtr_id, avtr_name, avtr_desc, avtr_img, user_id, user_name, user_username, date_collected, release_status)) conn.commit() ac.close() vrcl.log("Saved: " + avtr_id + " to db") except Exception as e: vrcl.log(e) vrcl.log("Error in insert") raise e conn.commit() ac.close() except Exception as e: vrcl.log("Unable to open vrcdb.sqlite") vrcl.log(str(e)) if not exists( outputFile): #check if image already exists if not, download it r = requests.get( avtr_img, allow_redirects=True, stream=True, headers={'User-Agent': ""} ) #stopped by cf if useragent is missing, fine if empty, https://i.gifer.com/72nt.gif r.raw.decode_content = True with open(outputFile, 'wb') as f: shutil.copyfileobj(r.raw, f) vrcl.log("Got: " + avtr_name + ":" + avtr_id) else: vrcl.log("Avatar " + avtr_name + ":" + avtr_id + " has already been downloaded") vrcl.log("Skipping")
buffering=1) #sys.stderr = open(join(config.app_dir,'debug.err.log'), mode='a+', encoding='utf-8', errors='ignore', buffering=1) #not catching sys.stderr using debug.bat to catch just err def suppress_qt_warnings(): environ["QT_DEVICE_PIXEL_RATIO"] = "0" environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1" environ["QT_SCREEN_SCALE_FACTORS"] = "1" environ["QT_SCALE_FACTOR"] = "1" suppress_qt_warnings() app = QApplication(sys.argv) vrcf.updatecheck() appWindow = AppWindow() appWindow.show() if (config.useGlobalKeybind): try: hk.register((config.getGlobalKeyBind), callback=lambda x: appWindow.btnCollectAvtr()) except SystemHotkey.InvalidKeyError: vrcl.log("Invalid key combo, using default ctrl+k") hk.register(('control', 'k'), callback=lambda x: appWindow.btnCollectAvtr()) except Exception as e: print(str(e)) sys.exit(app.exec_())
def getFavoriteList(): vrcl.log("Fetching favorites") a = client.fetch_me().fetch_favorites("avatar") for x in a: #log favorites vrcl.log(x.favoriteId) return a
def removeFavoriteID(id): if id is None: return vrcl.log("removeFavorite: " + id) client.fetch_me().remove_favorite(id)
client = vrcpy.Client() def end(): try: #client may not be logged in client.logout() except: pass vrcl.closeLog() sys.exit() try: config.setConfigFile('config.toml') except Exception as e: vrcl.log("Error opening config") vrcl.log(str(e)) end() def login(): try: client.login(config.getUsername, config.getPassword) b = client.fetch_me() vrcl.log("Logged in as: " + b.displayName) except Exception as e: vrcl.log(str(e)) vrcl.log("Failed to Login") end()