Ejemplo n.º 1
0
 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()
Ejemplo n.º 2
0
 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()
Ejemplo n.º 3
0
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))
Ejemplo n.º 4
0
 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()
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
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")
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
    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()
Ejemplo n.º 11
0
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))
Ejemplo n.º 12
0
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()
Ejemplo n.º 13
0
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")
Ejemplo n.º 14
0
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))
Ejemplo n.º 15
0
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")
Ejemplo n.º 16
0
                      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_())
Ejemplo n.º 17
0
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
Ejemplo n.º 18
0
def removeFavoriteID(id):
    if id is None:
        return
    vrcl.log("removeFavorite: " + id)
    client.fetch_me().remove_favorite(id)
Ejemplo n.º 19
0
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()