def asyncGet(self):
        try:
            # Get request ip
            ip = self.getRequestIP()

            # Check arguments
            if not requestsManager.checkArguments(self.request.arguments,
                                                  ["c", "u", "h"]):
                raise exceptions.invalidArgumentsException(MODULE_NAME)

            # Get arguments
            username = self.get_argument("u")
            password = self.get_argument("h")
            replayID = self.get_argument("c")

            # Login check
            userID = userUtils.getID(username)
            if userID == 0:
                raise exceptions.loginFailedException(MODULE_NAME, userID)
            if not userUtils.checkLogin(userID, password, ip):
                raise exceptions.loginFailedException(MODULE_NAME, username)
            if userUtils.check2FA(userID, ip):
                raise exceptions.need2FAException(MODULE_NAME, username, ip)

            # Get user ID
            replayData = glob.db.fetch(
                "SELECT scores.*, users.username AS uname FROM scores LEFT JOIN users ON scores.userid = users.id WHERE scores.id = %s",
                [replayID])
            if replayData == None:
                replayData = glob.db.fetch(
                    "SELECT scores_relax.*, users.username AS uname FROM scores_relax LEFT JOIN users ON scores_relax.userid = users.id WHERE scores_relax.id = %s",
                    [replayID])
                fileName = "{}_relax/replay_{}.osr".format(
                    glob.conf.config["server"]["replayspath"], replayID)
            else:
                fileName = "{}/replay_{}.osr".format(
                    glob.conf.config["server"]["replayspath"], replayID)

            # Increment 'replays watched by others' if needed
            if replayData is not None:
                if username != replayData["uname"]:
                    userUtils.incrementReplaysWatched(replayData["userid"],
                                                      replayData["play_mode"])

            # Serve replay
            log.info("Serving replay_{}.osr".format(replayID))

            if os.path.isfile(fileName):
                with open(fileName, "rb") as f:
                    fileContent = f.read()
                self.write(fileContent)
            else:
                log.warning("Replay {} doesn't exist".format(replayID))
                self.write("")
        except exceptions.invalidArgumentsException:
            pass
        except exceptions.need2FAException:
            pass
        except exceptions.loginFailedException:
            pass
Ejemplo n.º 2
0
	def asyncGet(self):
		try:
			# Get request ip
			ip = self.getRequestIP()

			# Check arguments
			if not requestsManager.checkArguments(self.request.arguments, ["c", "u", "h"]):
				raise exceptions.invalidArgumentsException(MODULE_NAME)

			# Get arguments
			username = self.get_argument("u")
			password = self.get_argument("h")
			replayID = self.get_argument("c")

			isRelaxing = False
			if int(replayID) < 500000000:
				isRelaxing = True

			# Login check
			userID = userUtils.getID(username)
			if userID == 0:
				raise exceptions.loginFailedException(MODULE_NAME, userID)
			if not userUtils.checkLogin(userID, password, ip):
				raise exceptions.loginFailedException(MODULE_NAME, username)
			if userUtils.check2FA(userID, ip):
				raise exceptions.need2FAException(MODULE_NAME, username, ip)

			replayData = glob.db.fetch("SELECT scores{relax}.*, users.username AS uname FROM scores{relax} LEFT JOIN users ON scores{relax}.userid = users.id WHERE scores{relax}.id = %s".format(relax="_relax" if isRelaxing else ""), [replayID])

			# Increment 'replays watched by others' if needed
			if replayData is not None:
				if username != replayData["uname"]:
					userUtils.incrementReplaysWatched(replayData["userid"], replayData["play_mode"], replayData["mods"])

			log.info("Serving replay_{}.osr".format(replayID))
			fileName = ".data/replays/replay_{}.osr".format(replayID)
			if os.path.isfile(fileName):
				with open(fileName, "rb") as f:
					fileContent = f.read()
				self.write(fileContent)
			else:
				self.write("")
				log.warning("Replay {} doesn't exist.".format(replayID))

		except exceptions.invalidArgumentsException:
			pass
		except exceptions.need2FAException:
			pass
		except exceptions.loginFailedException:
			pass
Ejemplo n.º 3
0
	def asyncGet(self):
		"""The actual handler."""

		# Argument Verification.
		if not requestsManager.checkArguments(self.request.arguments, ("u", "h", "c")):
			return self.write("no")
		
		# Set variables.
		username = self.get_argument("u")
		#p_hash = self.get_argument("h")
		replay_id = int(self.get_argument("c"))

		# Work out scores table from ID.
		suffix = ""
		# Relax replay
		if RELAX_OFFSET < replay_id < AP_OFFSET: suffix = "_relax"
		elif replay_id > AP_OFFSET: suffix = "_ap"

		# Grab data on the gamer that did this.
		play_db = glob.db.fetch(
			BASE_QUERY.format(suffix),
			(replay_id,)
		)

		if play_db: userUtils.incrementReplaysWatched(
			play_db["userid"], play_db["play_mode"]
		)

		rp_path = REPLAY_PATH_BASE.format(suffix, replay_id)
		if not os.path.exists(rp_path):
			log.warning(f"Attempted to serve non-existant replay ({rp_path}) to {username}")
			return self.write("no")

		# We send them le replay.
		log.info(f"Served {rp_path} to {username}.")
		with open(rp_path, "rb") as f: return self.write(f.read())
Ejemplo n.º 4
0
	def asyncGet(self):
		try:
			# insert ripple unfunny roblox word here. very unfunny
			# Get request ip
			ip = self.getRequestIP()

			# Check arguments
			if not requestsManager.checkArguments(self.request.arguments, ["c", "u", "h"]):
				raise exceptions.invalidArgumentsException(MODULE_NAME)

			# Get arguments
			username = self.get_argument("u")
			password = self.get_argument("h")
			replayID = self.get_argument("c")

			# Login check
			userID = userUtils.getID(username)
			if userID == 0:
				raise exceptions.loginFailedException(MODULE_NAME, userID)
			if not userUtils.checkLogin(userID, password, ip):
				raise exceptions.loginFailedException(MODULE_NAME, username)
			if userUtils.check2FA(userID, ip):
				raise exceptions.need2FAException(MODULE_NAME, username, ip)

			# Get user ID
			replayMode = 'NM'
			modeData = {
				'NM': (modeSwitches.rp_folder[0], 'VANILLA', modeSwitches.score[0]),
				'RL': (modeSwitches.rp_folder[1], 'RELAX', modeSwitches.score[1]),
				'V2': (modeSwitches.rp_folder[2], 'SCOREv2', modeSwitches.score[2])
			}
			
			if features.MASTER_SCORE_TABLE:
				replayData = glob.db.fetch("SELECT s.*, users.username AS uname FROM {} as s LEFT JOIN users ON s.userid = users.id WHERE s.id = %s".format('scores_master'), [replayID])
				if replayData is not None:
					replayMode = list(modeData.keys())[replayData['special_mode']]
				else:
					userStat = glob.db.fetch('select current_status as c from user_config where id = %s', [userID])
					if userStat['c'].endswith('on V2'):
						replayMode = 'V2'
					elif userStat['c'].endswith('on Relax'):
						replayMode = 'RL'
				pass
			else:
				userStat = glob.db.fetch('select current_status as c from user_config where id = %s', [userID])
				if userStat['c'].endswith('on V2'):
					replayMode = 'V2'
				elif userStat['c'].endswith('on Relax'):
					replayMode = 'RL'
				replayData = glob.db.fetch("SELECT s.*, users.username AS uname FROM {} as s LEFT JOIN users ON s.userid = users.id WHERE s.id = %s".format(modeData[replayMode][2]), [replayID])
			
			if replayData is not None:
				fileName = "{}{}/replay_{}.osr".format(glob.conf.config["server"]["replayspath"], modeData[replayMode][0], replayID)
				Play = modeData[replayMode][1]
			else:
				log.warning("Replay {} ({}) doesn't exist".format(replayID, replayMode))
				self.write("")
				return

			# Increment 'replays watched by others' if needed
			if replayData is not None:
				if username != replayData["uname"]:
					userUtils.incrementReplaysWatched(replayData["userid"], replayData["play_mode"])
			# Serve replay

			log.info("[{}] Serving replay_{}.osr".format(Play, replayID))

			if os.path.isfile(fileName):
				with open(fileName, "rb") as f:
					fileContent = f.read()
				self.write(fileContent)
			else:
				log.warning("Replay {} doesn't exist".format(replayID))
				self.write("")
		except exceptions.invalidArgumentsException:
			pass
		except exceptions.need2FAException:
			pass
		except exceptions.loginFailedException:
			pass
Ejemplo n.º 5
0
    def asyncGet(self):
        try:
            # Get request ip
            ip = self.getRequestIP()

            # Check arguments
            if not requestsManager.checkArguments(self.request.arguments,
                                                  ["c", "u", "h"]):
                raise exceptions.invalidArgumentsException(self.MODULE_NAME)

            # Get arguments
            username = self.get_argument("u")
            password = self.get_argument("h")
            replayID = self.get_argument("c")

            # Login check
            userID = userUtils.getID(username)
            if userID == 0:
                raise exceptions.loginFailedException(self.MODULE_NAME, userID)
            if not userUtils.checkLogin(userID, password, ip):
                raise exceptions.loginFailedException(self.MODULE_NAME,
                                                      username)
            if userUtils.check2FA(userID, ip):
                raise exceptions.need2FAException(self.MODULE_NAME, username,
                                                  ip)

            # Get user ID
            replayData = glob.db.fetch(
                "SELECT scores.*, users.username AS uname FROM scores LEFT JOIN users ON scores.userid = users.id WHERE scores.id = %s",
                [replayID])

            # Increment 'replays watched by others' if needed
            if replayData is not None:
                if username != replayData["uname"]:
                    userUtils.incrementReplaysWatched(replayData["userid"],
                                                      replayData["play_mode"])

            # Serve replay
            log.info("Serving replay_{}.osr".format(replayID))
            r = ""
            replayID = int(replayID)
            try:
                r = replayHelper.getRawReplayS3(replayID)
            except timeout_decorator.TimeoutError:
                log.warning("S3 timed out")
                sentry.captureMessage("S3 timeout while fetching replay.")
                glob.stats["replay_download_failures"].labels(
                    type="raw_s3_timeout").inc()
            except FileNotFoundError:
                log.warning("Replay {} doesn't exist".format(replayID))
            except:
                glob.stats["replay_download_failures"].labels(
                    type="raw_other").inc()
                raise
            finally:
                self.write(r)
        except exceptions.invalidArgumentsException:
            pass
        except exceptions.need2FAException:
            pass
        except exceptions.loginFailedException:
            pass
Ejemplo n.º 6
0
    def asyncGet(self):
        try:
            # OOF
            UsingRelax = False
            UsingAuto = False

            # Get request ip
            ip = self.getRequestIP()

            # Check arguments
            if not requestsManager.checkArguments(self.request.arguments,
                                                  ["c", "u", "h"]):
                raise exceptions.invalidArgumentsException(MODULE_NAME)

            # Get arguments
            username = self.get_argument("u")
            password = self.get_argument("h")
            replayID = self.get_argument("c")

            # Login check
            userID = userUtils.getID(username)
            if userID == 0:
                raise exceptions.loginFailedException(MODULE_NAME, userID)
            if not userUtils.checkLogin(userID, password, ip):
                raise exceptions.loginFailedException(MODULE_NAME, username)
            if userUtils.check2FA(userID, ip):
                raise exceptions.need2FAException(MODULE_NAME, username, ip)

            # Get user ID
            current_gamemode_redis = "lets:user_current_gamemode:{}".format(
                userID)
            cgamemode = int(glob.redis.get(current_gamemode_redis))
            replayData = glob.db.fetch(
                "SELECT scores.*, users.username AS uname FROM scores LEFT JOIN users ON scores.userid = users.id WHERE scores.id = %s",
                [replayID])
            if cgamemode == 3:
                log.debug("autopilot")
                UsingRelax = False
                usingAuto = True
                fileName = "{}_ap/replay_{}.osr".format(
                    glob.conf.config["server"]["replayspath"], replayID)
            if cgamemode == 2:
                log.debug("relax")
                fileName = "{}_relax/replay_{}.osr".format(
                    glob.conf.config["server"]["replayspath"], replayID)
                UsingRelax = True
                UsingAuto = False
            if cgamemode == 1:
                log.debug("std")
                UsingRelax = False
                UsingAuto = False
                fileName = "{}/replay_{}.osr".format(
                    glob.conf.config["server"]["replayspath"], replayID)

            # Increment 'replays watched by others' if needed
            if replayData is not None:
                if username != replayData["uname"]:
                    userUtils.incrementReplaysWatched(replayData["userid"],
                                                      replayData["play_mode"])

            Play = "VANILLA"
            if UsingRelax:
                Play = "RELAX"
            if UsingAuto:
                Play = "AUTOPILOT"
            # Serve replay
            log.info("[{}] Serving replay_{}.osr".format(Play, replayID))

            if os.path.isfile(fileName):
                with open(fileName, "rb") as f:
                    fileContent = f.read()
                self.write(fileContent)
            else:
                log.info("Replay {} doesn't exist".format(replayID))
                self.write("")
        except exceptions.invalidArgumentsException:
            pass
        except exceptions.need2FAException:
            pass
        except exceptions.loginFailedException:
            pass