Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"jQuery\"","webpack:///external \"Roblox\"","webpack:///./js/win10/appHybridClientInterface.js","webpack:///./js/authenticationChecker.js","webpack:///./js/bcUpsellModalInterface.js","webpack:///./js/videoPreRollDFP.js","webpack:///./js/protocolHandlerClientInterface.js","webpack:///./js/prerollPlayer.js","webpack:///./js/gameLauncher.js","webpack:///./js/gamePlayEvents.js","webpack:///./js/gameLaunchLogger.js","webpack:///./js/gamePlayEventsHandlers.js","webpack:///./js/gameLaunchEntry.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","jQuery","Roblox","startGame","gameLaunchParams","deferred","$","Deferred","Hybrid","Game","launchGame","resolve","translationProvider","langMap","AppHybridClientInterface","joinMultiplayerGame","placeLauncherParams","isPlayTogetherGame","requestType","LAUNCH_MODES","SIMPLE_GAME","placeId","toString","browserTrackerId","Cookies","getBrowserTrackerId","followPlayerIntoGame","FOLLOW_USER","userId","joinGameInstance","GAME_INSTANCE","instanceId","gameId","joinPrivateGame","PRIVATE_SERVER","accessCode","playTogetherGame","conversationId","soliConstants","modalClassName","loginUrl","signupUrl","eventContext","loginField","signupField","document","ready","TranslationResourceProvider","getTranslationResource","AuthenticationChecker","restrictGuests","params","data","Dialog","open","titleText","bodyContent","cssClass","acceptColor","green","acceptText","declineText","onDecline","FormEvents","SendInteractionClick","encodeURIComponent","window","location","pathname","search","href","Endpoints","getAbsoluteUrl","onAccept","eventField","redirectToSignupWithEvent","BCUpsellModalInterface","checkBcRequirement","isMembershipLevelOk","BCUpsellModal","reject","showBCOnlyModal","LoadingBar","bars","init","barID","innerBarID","percentageID","percentComplete","newBar","this","push","update","length","dispose","splice","bar","maxWidth","width","innerBarWidth","Math","round","animate","html","VideoPreRollDFP","newValue","showVideoPreRoll","videoInitialized","videoStarted","videoCompleted","videoSkipped","videoCancelled","videoErrored","loadingBarMaxTime","loadingBarCurrentTime","loadingBarIntervalID","loadingBarID","loadingBarInnerID","loadingBarPercentageID","videoDiv","companionAdDiv","contentElement","videoLoadingTimeout","videoPlayingTimeout","videoLogNote","logsEnabled","includedPlaceIds","isSwfPreloaderEnabled","isFlashInstalled","isPrerollShownEveryXMinutesEnabled","isAgeTargetingEnabled","isAgeOrSegmentTargetingEnabled","adUnit","adTime","customTargeting","userAge","userAgeOrSegment","userGender","gameGenres","environment","PLVU","adsManager","adsLoader","adDisplayContainer","intervalTimer","videoContent","isCompanionAdRenderedByGoogleTag","contentEndedListener","contentComplete","createVideoContent","getElementById","createAdDisplayContainer","google","ima","AdDisplayContainer","constructUrl","iu","ageTag","customTag","renderCompanionAd","googletag","defineSlot","addService","companionAds","enableServices","display","onAdEvent","adEvent","type","AdEvent","Type","LOADED","STARTED","isCompanionAdRenderedBywindow","cmd","getAd","getCompanionAds","content","getContent","innerHTML","SKIPPED","COMPLETE","cookie","onAdError","onAdsManagerLoaded","adsManagerLoadedEvent","getAdsManager","addEventListener","AdErrorEvent","AD_ERROR","ALL_ADS_COMPLETED","ViewMode","NORMAL","start","adError","requestAds","settings","setVpaidAllowed","initialize","AdsLoader","AdsManagerLoadedEvent","ADS_MANAGER_LOADED","adsRequest","AdsRequest","tagUrl","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","checkFlashEnabled","hasFlash","ActiveXObject","e","navigator","mimeTypes","undefined","enabledPlugin","logVideoPreRoll","category","RobloxLaunch","state","GaEventSettings","gaDFPPreRollEnabled","GoogleAnalyticsEvents","FireEvent","isPlaying","renderImaPreloader","adUrl","ajax","url","method","crossDomain","xhrFields","withCredentials","success","updatePrerollCount","assign","checkEligibility","Client","IsRobloxInstalled","isIDE","isRobloxBrowser","chrome","safari","hash","correctIEModalPosition","dialog","container","innerHeight","innerContainer","shiftDistance","floor","css","position","top","find","play_placeId","setInterval","cancel","modal","close","skip","MadStatus","running","stop","launcher","_cancelled","clearInterval","_resolveInit","PrerollPlayer","waitForPreroll","videoPreRoll","popupOptions","escClose","opacity","overlayCss","backgroundColor","zIndex","hide","delay","show","interval","ProtocolHandlerClientInterface","isInstalling","statusInterval","sendingLocalesEnabled","robloxLocale","gameLocale","protocolUrlSeparator","protocolUrlIncludesLaunchTime","protocolDetectionEnabled","avatarParamEnabled","separateScriptParamsEnabled","waitTimeBeforeFailure","protocolNameForStudio","protocolNameForClient","logger","initialized","Promise","launchModes","edit","plugin","play","build","showDialog","onClose","myOnClose","clearTimeout","showAreYouInstalledDialogTimeout","setTimeout","refactorEnabled","PlaceLauncher","Resources","RefactorEnabled","launchMode","studioMode","modalResource","ProtocolHandlerAreYouInstalled","studio","allowHtmlContentInBody","showAccept","buttonText","showDecline","dismissable","xToCancel","footerText","footerContent","allowHtmlContentInFooter","protocolHandlerInstall","off","click","showAreYouInstalledDialog","ProtocolHandlerStartingDialog","loader","onCloseCallback","onCancel","each","addClass","removeClass","showStartingDialog","showLaunchFailureDialog","Lang","VisitGameResources","ControlsResources","waitForStatus","status","cache","cleanUpAndLogSuccess","logParams","launchMethod","GameLauncher","trigger","startClientSucceededEvent","successfulInstallEvent","cleanUpAndLogFailure","setLocationHref","msLaunchUri","iframe","remove","attr","append","seleniumEvent","Event","dispatchEvent","launchProtocolUrl","urlSeparator","gameLaunchUrl","protocolName","urlComponents","gameInfo","indexOf","launchTime","IsProtocolHandlerBaseUrlParamEnabled","baseUrl","EnvironmentUrls","websiteUrl","host","otherParams","join","gameLaunchLogger","logToConsole","JSON","stringify","startGameFlow","when","gameLaunchDefaultParams","CurrentUser","isAuthenticated","doAuthTicketRequest","then","textStatus","xhr","authenticationTicket","getResponseHeader","getAuthTicket","resetClientStatus","continueInstallClick","hasClass","protocolHandlerAlwaysAllowElem","Date","getTime","browsertrackerid","startClientAttemptedEvent","getPlaceLauncherUrl","absoluteUrl","Urls","replace","args","request","extend","param","getEditScriptUrl","universeId","allowUpload","scriptHandlerName","upload","testMode","getStudioScriptUrl","startDownload","src","beginProtocolHandlerInstall","isStudioInstall","beginInstallEvent","text","none","declineColor","manualDownload","manualDownloadEvent","protocol","placeLauncherUrl","placelauncherurl","openStudio","avatar","returnToStudio","task","openPluginInStudio","pluginId","pluginid","editGameInStudio","script","attachManualDownloadToLink","authUrl","authApi","contentType","gameLaunchInterface","placeLauncherPanel","ProtocolHandlerLogger","gameLauncher","BcUpsellModalInterface","linkCode","bindGameLaunch","fn","el","authenticationChecker","prerollPlayer","bcUpsellModalInterface","setGameLaunchInterface","newInterface","setGameLaunchLogger","newLogger","startClientFailedEvent","gamePlayEvents","lastContext","contextCategories","joinUser","getProperties","referrerId","placeLauncherInfo","lType","toLowerCase","pid","refuid","pg","path","profilePageString","profileLastIndex","lastIndexOf","getPage","sendEvent","eventName","context","EventStream","SendEvent","SendGamePlayIntent","SendDevelopIntent","SendInstallBegin","SendInstallSuccess","SendClientStartAttempt","SendClientStartSuccessWeb","SendManualDownloadClick","GameLaunchLogger","logToConsoleEnabled","logToGAEnabled","logToEphemeralCountersEnabled","ephemeralCountersEvents","googleAnalyticsEvents","gaLaunchAttemptAndLaunchSuccessEnabled","eventStreamEvents","console","log","logToEphemeralCounters","counterName","osName","EventTracker","fireEvent","logToGA","label","logGameLauncherEvent","event","idx","getLaunchMode","GamePlayEvents","gameLauncherEvents","on","attachHandlers","eventsToWatch","currentElement","originator","originatorId","notificationApi","createdOn","interactionType","currentUserId","UrlParser","getParameterValueByName","tbl","parents","GamePlayEventsHandlers","DeviceMeta","isUWPApp"],"mappings":"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","file":"gameLaunch.bundle.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","module.exports = jQuery;","module.exports = Roblox;","import { Cookies, Hybrid } from 'Roblox';\r\nimport $ from 'jquery';\r\n\r\nfunction startGame(gameLaunchParams) {\r\n const deferred = new $.Deferred();\r\n Hybrid.Game.launchGame(gameLaunchParams, () => {\r\n deferred.resolve(gameLaunchParams);\r\n });\r\n return deferred;\r\n}\r\n\r\n// placeLauncherParams has placeId, genderId, isPlayTogetherGame\r\nfunction joinMultiplayerGame(placeLauncherParams) {\r\n const isPlayTogetherGame = placeLauncherParams.isPlayTogetherGame === true;\r\n return startGame({\r\n requestType: Hybrid.Game.LAUNCH_MODES.SIMPLE_GAME,\r\n placeId: placeLauncherParams.placeId.toString(),\r\n isPlayTogetherGame,\r\n browserTrackerId: Cookies.getBrowserTrackerId()\r\n });\r\n}\r\n\r\n// placeLauncherParams has userId, genderId (though genderId might be ignored)\r\nfunction followPlayerIntoGame(placeLauncherParams) {\r\n return startGame({\r\n requestType: Hybrid.Game.LAUNCH_MODES.FOLLOW_USER,\r\n userId: placeLauncherParams.userId.toString(),\r\n browserTrackerId: Cookies.getBrowserTrackerId()\r\n });\r\n}\r\n\r\n// placeLauncherParams has placeId, gameId, genderId, isPlayTogetherGame\r\nfunction joinGameInstance(placeLauncherParams) {\r\n const isPlayTogetherGame = placeLauncherParams.isPlayTogetherGame === true;\r\n return startGame({\r\n requestType: Hybrid.Game.LAUNCH_MODES.GAME_INSTANCE,\r\n placeId: placeLauncherParams.placeId.toString(),\r\n instanceId: placeLauncherParams.gameId,\r\n isPlayTogetherGame,\r\n browserTrackerId: Cookies.getBrowserTrackerId()\r\n });\r\n}\r\n\r\n// placeLauncherParams has placeId, accessCode\r\nfunction joinPrivateGame(placeLauncherParams) {\r\n return startGame({\r\n requestType: Hybrid.Game.LAUNCH_MODES.PRIVATE_SERVER,\r\n placeId: placeLauncherParams.placeId.toString(),\r\n accessCode: placeLauncherParams.accessCode,\r\n browserTrackerId: Cookies.getBrowserTrackerId()\r\n });\r\n}\r\n\r\n// placeLauncherParams has placeId, conversationId\r\nfunction playTogetherGame(placeLauncherParams) {\r\n return startGame({\r\n requestType: Hybrid.Game.LAUNCH_MODES.SIMPLE_GAME,\r\n placeId: placeLauncherParams.placeId.toString(),\r\n conversationId: placeLauncherParams.conversationId.toString(),\r\n browserTrackerId: Cookies.getBrowserTrackerId()\r\n });\r\n}\r\n\r\n// shim this under Roblox later.\r\nconst AppHybridClientInterface = {\r\n joinMultiplayerGame,\r\n followPlayerIntoGame,\r\n joinGameInstance,\r\n joinPrivateGame,\r\n playTogetherGame\r\n};\r\n\r\nexport default AppHybridClientInterface;\r\n","import {\r\n Dialog,\r\n Endpoints,\r\n FormEvents,\r\n TranslationResourceProvider\r\n} from 'Roblox';\r\nimport $ from 'jquery';\r\n\r\nlet translationProvider;\r\nlet langMap;\r\n\r\nconst soliConstants = {\r\n modalClassName: 'soli-modal',\r\n loginUrl: '/login?returnurl=',\r\n signupUrl: '/?returnurl=',\r\n eventContext: 'gameDetails',\r\n loginField: 'gameLaunch_login',\r\n signupField: 'gameLaunch_signup'\r\n};\r\n\r\nfunction redirectToSignupWithEvent(eventField) {\r\n const eventContext = 'gameDetails';\r\n if (FormEvents) {\r\n FormEvents.SendInteractionClick(eventContext, eventField);\r\n }\r\n const signupUrl =\r\n soliConstants.signupUrl +\r\n encodeURIComponent(window.location.pathname + window.location.search);\r\n window.location.href = Endpoints\r\n ? Endpoints.getAbsoluteUrl(signupUrl)\r\n : signupUrl;\r\n}\r\n\r\nfunction restrictGuests(params) {\r\n const deferred = new $.Deferred();\r\n if ($('#PlaceLauncherStatusPanel').data('is-user-logged-in') === 'True') {\r\n deferred.resolve(params);\r\n return deferred;\r\n }\r\n\r\n Dialog.open({\r\n titleText: langMap.get('Heading.Dialog.SignUpOrLogin'),\r\n bodyContent: langMap.get('Description.Dialog.SignUpOrLogin'),\r\n cssClass: soliConstants.modalClassName,\r\n acceptColor: Dialog.green,\r\n acceptText: langMap.get('Action.Dialog.SignUp'),\r\n declineText: langMap.get('Action.Dialog.Login'),\r\n onDecline: () => {\r\n if (FormEvents) {\r\n FormEvents.SendInteractionClick(\r\n soliConstants.eventContext,\r\n soliConstants.loginField\r\n );\r\n }\r\n const loginUrl =\r\n soliConstants.loginUrl +\r\n encodeURIComponent(window.location.pathname + window.location.search);\r\n window.location.href = Endpoints\r\n ? Endpoints.getAbsoluteUrl(loginUrl)\r\n : loginUrl;\r\n },\r\n onAccept: () => {\r\n redirectToSignupWithEvent(soliConstants.signupField);\r\n }\r\n });\r\n\r\n return deferred;\r\n}\r\n\r\n// set the translation provider\r\n$(document).ready(() => {\r\n translationProvider = new TranslationResourceProvider();\r\n langMap = translationProvider.getTranslationResource(\r\n 'Feature.GameLaunchGuestMode'\r\n );\r\n});\r\n\r\nconst AuthenticationChecker = {\r\n restrictGuests\r\n};\r\n\r\nexport default AuthenticationChecker;\r\n","import { BCUpsellModal } from 'Roblox';\r\nimport $ from 'jquery';\r\n\r\nconst BCUpsellModalInterface = {\r\n checkBcRequirement: (params, isMembershipLevelOk) => {\r\n const deferred = new $.Deferred();\r\n if (isMembershipLevelOk) {\r\n deferred.resolve(params);\r\n } else if (typeof BCUpsellModal !== 'undefined') {\r\n BCUpsellModal.open(); // used for VisitButtons.cshtml\r\n deferred.reject(params);\r\n } else if (typeof window.showBCOnlyModal !== 'undefined') {\r\n window.showBCOnlyModal(); // used for VisitButtons.ascx\r\n deferred.reject(params);\r\n } else {\r\n // if neither is available, let the game launch. They will get an error during connect, but it's better than nothing.\r\n deferred.resolve(params);\r\n }\r\n return deferred;\r\n }\r\n};\r\n\r\nexport default BCUpsellModalInterface;\r\n","import { Client, GaEventSettings } from 'Roblox';\r\nimport $ from 'jquery';\r\n\r\nconst LoadingBar = {\r\n bars: [],\r\n init: function loadingBarInit(\r\n barID,\r\n innerBarID,\r\n percentageID,\r\n percentComplete\r\n ) {\r\n let newBar = this.get(barID);\r\n if (newBar == null) {\r\n newBar = {};\r\n }\r\n newBar.barID = barID;\r\n newBar.innerBarID = innerBarID;\r\n newBar.percentageID = percentageID;\r\n if (typeof percentComplete === 'undefined') {\r\n newBar.percentComplete = 0; // value from 0 to 1\r\n }\r\n this.bars.push(newBar);\r\n this.update(barID, newBar.percentComplete);\r\n },\r\n get: function loadingBarGet(barID) {\r\n for (let i = 0; i < this.bars.length; i += 1) {\r\n if (this.bars[i].barID === barID) {\r\n return this.bars[i];\r\n }\r\n }\r\n return null;\r\n },\r\n dispose: function loadingBarDispose(barID) {\r\n for (let i = 0; i < this.bars.length; i += 1) {\r\n if (this.bars[i].barID === barID) {\r\n this.bars.splice(i, 1);\r\n }\r\n }\r\n },\r\n update: function loadingBarUpdate(barID, percentComplete) {\r\n const bar = this.get(barID);\r\n if (!bar) {\r\n return;\r\n }\r\n if (percentComplete > 1) {\r\n percentComplete = 1;\r\n }\r\n const maxWidth = $(`#${barID}`).width();\r\n const innerBarWidth = Math.round(maxWidth * percentComplete);\r\n // $(\"#\" + bar.innerBarID).width(innerBarWidth);\r\n $(`#${bar.innerBarID}`).animate({ width: innerBarWidth }, 200, 'swing');\r\n if (bar.percentageID && $(`#${bar.percentageID}`).length > 0) {\r\n $(`#${bar.percentageID}`).html(`${Math.round(percentComplete * 100)}%`);\r\n }\r\n bar.percentComplete = percentComplete;\r\n }\r\n};\r\n\r\nconst VideoPreRollDFP = {\r\n newValue: '',\r\n showVideoPreRoll: false,\r\n videoInitialized: false, // this.start has run\r\n videoStarted: false,\r\n videoCompleted: false,\r\n videoSkipped: false,\r\n videoCancelled: false,\r\n videoErrored: false,\r\n loadingBarMaxTime: 30000,\r\n loadingBarCurrentTime: 0,\r\n loadingBarIntervalID: 0,\r\n loadingBarID: 'videoPrerollLoadingBar',\r\n loadingBarInnerID: 'videoPrerollLoadingBarCompleted',\r\n loadingBarPercentageID: 'videoPrerollLoadingPercent',\r\n videoDiv: 'videoPrerollMainDiv',\r\n companionAdDiv: 'videoPrerollCompanionAd',\r\n contentElement: 'contentElement',\r\n videoLoadingTimeout: 7000,\r\n videoPlayingTimeout: 23000,\r\n videoLogNote: '', // if blank, assume this was successful\r\n logsEnabled: false,\r\n includedPlaceIds: '',\r\n isSwfPreloaderEnabled: false,\r\n isFlashInstalled: false,\r\n isPrerollShownEveryXMinutesEnabled: false,\r\n isAgeTargetingEnabled: true,\r\n isAgeOrSegmentTargetingEnabled: false,\r\n\r\n adUnit: '', // /1015347/VideoPreroll\r\n adTime: 0,\r\n placeId: 0,\r\n\r\n customTargeting: {\r\n userAge: '',\r\n userAgeOrSegment: '',\r\n userGender: '',\r\n gameGenres: '',\r\n environment: '',\r\n adTime: '',\r\n PLVU: false\r\n },\r\n\r\n adsManager: null,\r\n adsLoader: null,\r\n adDisplayContainer: null,\r\n intervalTimer: null,\r\n\r\n videoContent: null,\r\n\r\n isCompanionAdRenderedByGoogleTag: false\r\n};\r\n\r\nfunction contentEndedListener() {\r\n VideoPreRollDFP.adsLoader.contentComplete();\r\n}\r\n\r\nfunction createVideoContent() {\r\n VideoPreRollDFP.videoContent = document.getElementById(\r\n VideoPreRollDFP.contentElement\r\n );\r\n}\r\n\r\nfunction createAdDisplayContainer() {\r\n VideoPreRollDFP.adDisplayContainer = new window.google.ima.AdDisplayContainer(\r\n document.getElementById(VideoPreRollDFP.videoDiv),\r\n VideoPreRollDFP.videoContent\r\n );\r\n}\r\n\r\nfunction constructUrl() {\r\n const baseUrl =\r\n 'http://pubads.g.doubleclick.net/gampad/ads?impl=s&gdfp_req=1&env=vp&output=xml_vast2&unviewed_position_start=1&url=[referrer_url]&description_url=[description_url]&correlator=[timestamp]';\r\n const size = '&sz=400x300';\r\n const iu = `&iu=${VideoPreRollDFP.adUnit}`;\r\n const companionSize = '&ciu_szs=300x250';\r\n let ageTag = '';\r\n if (VideoPreRollDFP.isAgeTargetingEnabled) {\r\n ageTag += `&Age=${VideoPreRollDFP.customTargeting.userAge}`;\r\n }\r\n if (VideoPreRollDFP.isAgeOrSegmentTargetingEnabled) {\r\n ageTag += `&A=${VideoPreRollDFP.customTargeting.userAgeOrSegment}`;\r\n }\r\n const customTag = encodeURIComponent(\r\n `Env=${VideoPreRollDFP.customTargeting.environment}&Gender=${\r\n VideoPreRollDFP.customTargeting.userGender\r\n }${ageTag}&Genres=${VideoPreRollDFP.customTargeting.gameGenres}&PlaceID=${\r\n VideoPreRollDFP.placeId\r\n }&Time=${VideoPreRollDFP.customTargeting.adTime}&PLVU=${\r\n VideoPreRollDFP.customTargeting.PLVU\r\n }`\r\n );\r\n const url = `${baseUrl}${size}${iu}${companionSize}&cust_params=${customTag}&`;\r\n return url;\r\n}\r\n\r\nfunction renderCompanionAd() {\r\n window.googletag\r\n .defineSlot(\r\n VideoPreRollDFP.adUnit,\r\n [300, 250],\r\n VideoPreRollDFP.companionAdDiv\r\n )\r\n .addService(window.googletag.companionAds());\r\n window.googletag.enableServices();\r\n window.googletag.display(VideoPreRollDFP.companionAdDiv);\r\n}\r\n\r\nfunction onAdEvent(adEvent) {\r\n switch (adEvent.type) {\r\n case window.google.ima.AdEvent.Type.LOADED:\r\n // This is the first event sent for an ad\r\n break;\r\n case window.google.ima.AdEvent.Type.STARTED:\r\n VideoPreRollDFP.videoStarted = true;\r\n\r\n if (VideoPreRollDFP.isCompanionAdRenderedBywindow.googletag) {\r\n if (!window.googletag) {\r\n break;\r\n }\r\n window.googletag.cmd.push(renderCompanionAd);\r\n } else {\r\n // Get the ad from the event.\r\n const ad = adEvent.getAd();\r\n // Get a list of companion ads for an ad slot size and CompanionAdSelectionSettings\r\n const companionAds = ad.getCompanionAds(300, 250);\r\n if (companionAds.length > 0) {\r\n const companionAd = companionAds[0];\r\n // Get HTML content from the companion ad.\r\n const content = companionAd.getContent();\r\n // Write the content to the companion ad slot.\r\n const div = document.getElementById(VideoPreRollDFP.companionAdDiv);\r\n div.innerHTML = content;\r\n }\r\n }\r\n\r\n break;\r\n case window.google.ima.AdEvent.Type.SKIPPED:\r\n VideoPreRollDFP.videoCompleted = true;\r\n VideoPreRollDFP.videoSkipped = true;\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n break;\r\n case window.google.ima.AdEvent.Type.COMPLETE:\r\n if (VideoPreRollDFP.videoStarted) {\r\n if (VideoPreRollDFP.videoCancelled === false) {\r\n // video played to completion (or was skipped)\r\n VideoPreRollDFP.videoCompleted = true;\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n if (VideoPreRollDFP.newValue !== '') {\r\n $.cookie('RBXVPR', VideoPreRollDFP.newValue, 180);\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n }\r\n}\r\n\r\nfunction onAdError() {\r\n // Handle the error logging.\r\n VideoPreRollDFP.videoErrored = true;\r\n VideoPreRollDFP.videoCompleted = true;\r\n VideoPreRollDFP.videoLogNote = 'AdError';\r\n}\r\n\r\nfunction onAdsManagerLoaded(adsManagerLoadedEvent) {\r\n VideoPreRollDFP.adsManager = adsManagerLoadedEvent.getAdsManager(\r\n VideoPreRollDFP.videoContent\r\n ); // See API reference for contentPlayback\r\n\r\n VideoPreRollDFP.adsManager.addEventListener(\r\n window.google.ima.AdErrorEvent.Type.AD_ERROR,\r\n onAdError\r\n );\r\n VideoPreRollDFP.adsManager.addEventListener(\r\n window.google.ima.AdEvent.Type.ALL_ADS_COMPLETED,\r\n onAdEvent\r\n );\r\n VideoPreRollDFP.adsManager.addEventListener(\r\n window.google.ima.AdEvent.Type.LOADED,\r\n onAdEvent\r\n );\r\n VideoPreRollDFP.adsManager.addEventListener(\r\n window.google.ima.AdEvent.Type.STARTED,\r\n onAdEvent\r\n );\r\n VideoPreRollDFP.adsManager.addEventListener(\r\n window.google.ima.AdEvent.Type.SKIPPED,\r\n onAdEvent\r\n );\r\n VideoPreRollDFP.adsManager.addEventListener(\r\n window.google.ima.AdEvent.Type.COMPLETE,\r\n onAdEvent\r\n );\r\n\r\n try {\r\n VideoPreRollDFP.adsManager.init(\r\n 400,\r\n 300,\r\n window.google.ima.ViewMode.NORMAL\r\n );\r\n VideoPreRollDFP.adsManager.start();\r\n } catch (adError) {\r\n onAdError();\r\n }\r\n}\r\n\r\nfunction requestAds() {\r\n // Enable VPAID 2\r\n window.google.ima.settings.setVpaidAllowed(true);\r\n\r\n createVideoContent();\r\n createAdDisplayContainer();\r\n\r\n VideoPreRollDFP.adDisplayContainer.initialize();\r\n\r\n VideoPreRollDFP.adsLoader = new window.google.ima.AdsLoader(\r\n VideoPreRollDFP.adDisplayContainer\r\n );\r\n VideoPreRollDFP.adsLoader.addEventListener(\r\n window.google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\r\n onAdsManagerLoaded,\r\n false\r\n );\r\n VideoPreRollDFP.adsLoader.addEventListener(\r\n window.google.ima.AdErrorEvent.Type.AD_ERROR,\r\n onAdError,\r\n false\r\n );\r\n\r\n VideoPreRollDFP.videoContent.addEventListener('ended', contentEndedListener);\r\n\r\n // Request video ads.\r\n const adsRequest = new window.google.ima.AdsRequest();\r\n\r\n // construct tag url\r\n const tagUrl = constructUrl();\r\n adsRequest.adTagUrl = tagUrl;\r\n\r\n // Specify the linear and nonlinear slot sizes. This helps the SDK to\r\n // select the correct creative if multiple are returned.\r\n adsRequest.linearAdSlotWidth = 400;\r\n adsRequest.linearAdSlotHeight = 300;\r\n\r\n adsRequest.nonLinearAdSlotWidth = 400;\r\n adsRequest.nonLinearAdSlotHeight = 300;\r\n\r\n VideoPreRollDFP.adsLoader.requestAds(adsRequest);\r\n}\r\n\r\nfunction checkFlashEnabled() {\r\n let hasFlash = false;\r\n try {\r\n const flash = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash');\r\n if (flash) {\r\n hasFlash = true;\r\n }\r\n } catch (e) {\r\n if (\r\n navigator.mimeTypes &&\r\n navigator.mimeTypes['application/x-shockwave-flash'] !== undefined &&\r\n navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin\r\n ) {\r\n hasFlash = true;\r\n }\r\n }\r\n return hasFlash;\r\n}\r\n\r\nfunction checkEligibility() {\r\n if (VideoPreRollDFP.showVideoPreRoll) {\r\n if (checkFlashEnabled()) {\r\n VideoPreRollDFP.isFlashInstalled = true;\r\n }\r\n if (\r\n $('#PlaceLauncherStatusPanel').data(\r\n 'is-protocol-handler-launch-enabled'\r\n ) !== 'True' &&\r\n !Client.IsRobloxInstalled()\r\n ) {\r\n // we're not on protocol handler and Roblox is not installed\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n } else if (\r\n typeof window.google === 'undefined' ||\r\n typeof window.google.ima === 'undefined'\r\n ) {\r\n VideoPreRollDFP.videoLogNote = 'NoGoogle';\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n } else if (Client.isIDE()) {\r\n // is Studio, check this before player\r\n VideoPreRollDFP.videoLogNote = 'RobloxStudio';\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n } else if (Client.isRobloxBrowser()) {\r\n // is Player\r\n VideoPreRollDFP.videoLogNote = 'RobloxPlayer';\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n } else if (\r\n (window.chrome || window.safari) &&\r\n window.location.hash === '#chromeInstall'\r\n ) {\r\n // during chrome install\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n }\r\n }\r\n}\r\n\r\n// -------------google analysis fire\r\nfunction logVideoPreRoll() {\r\n if (!VideoPreRollDFP.logsEnabled) {\r\n return; // logs disabled\r\n }\r\n let category = '';\r\n if (VideoPreRollDFP.videoCompleted) {\r\n // Also encompasses timeouts\r\n category = 'Complete';\r\n if (VideoPreRollDFP.videoLogNote === '') {\r\n VideoPreRollDFP.videoLogNote = 'NoTimeout';\r\n }\r\n // log only once per page load\r\n VideoPreRollDFP.logsEnabled = false;\r\n } else if (VideoPreRollDFP.videoCancelled) {\r\n category = 'Cancelled';\r\n VideoPreRollDFP.videoLogNote = window.RobloxLaunch.state;\r\n } else if (\r\n VideoPreRollDFP.videoInitialized === false &&\r\n VideoPreRollDFP.videoLogNote !== ''\r\n ) {\r\n category = 'Failed';\r\n // log only once per page load\r\n VideoPreRollDFP.logsEnabled = false;\r\n } else {\r\n return; // nothing to report\r\n }\r\n if (GaEventSettings.gaDFPPreRollEnabled && window.GoogleAnalyticsEvents) {\r\n window.GoogleAnalyticsEvents.FireEvent([\r\n 'DFPPreRoll',\r\n category,\r\n VideoPreRollDFP.videoLogNote\r\n ]);\r\n }\r\n}\r\n\r\nfunction isPlaying() {\r\n if (!VideoPreRollDFP.videoInitialized) {\r\n return false;\r\n }\r\n\r\n // if video is not loaded post timeout, consider the video complete\r\n if (\r\n VideoPreRollDFP.videoInitialized &&\r\n !VideoPreRollDFP.videoStarted &&\r\n VideoPreRollDFP.loadingBarCurrentTime > VideoPreRollDFP.videoLoadingTimeout\r\n ) {\r\n VideoPreRollDFP.videoCompleted = true;\r\n VideoPreRollDFP.videoLogNote = 'LoadingTimeout';\r\n }\r\n // if video is waaay too long, consider the video complete\r\n if (\r\n VideoPreRollDFP.videoStarted &&\r\n !VideoPreRollDFP.videoCompleted &&\r\n VideoPreRollDFP.loadingBarCurrentTime > VideoPreRollDFP.videoPlayingTimeout\r\n ) {\r\n VideoPreRollDFP.videoCompleted = true;\r\n VideoPreRollDFP.videoLogNote = 'PlayingTimeout';\r\n }\r\n\r\n return !VideoPreRollDFP.videoCompleted;\r\n}\r\n\r\nfunction correctIEModalPosition(dialog) {\r\n if (dialog.container.innerHeight() <= 30) {\r\n // gives a little style buffer. should really be around 15px;\r\n // this must be IE (or equally stupid). shift the modal up.\r\n const innerContainer = $('#videoPrerollPanel');\r\n const shiftDistance = -Math.floor(innerContainer.innerHeight() / 2);\r\n innerContainer.css({ position: 'relative', top: `${shiftDistance}px` });\r\n dialog.container\r\n .find('.VprCloseButton')\r\n .css({ top: `${shiftDistance - 10}px`, 'z-index': '1003' });\r\n }\r\n}\r\n\r\nfunction renderImaPreloader() {\r\n const adUrl = encodeURIComponent(constructUrl());\r\n const adTagUrl = `adTagUrl=${adUrl}`;\r\n $.ajax({\r\n url: '/game/preloader',\r\n data: { url: adTagUrl },\r\n method: 'GET',\r\n crossDomain: true,\r\n xhrFields: {\r\n withCredentials: true\r\n }\r\n }).success(data => {\r\n $('#videoPrerollMainDiv').html(data);\r\n if (!VideoPreRollDFP.videoErrored) {\r\n VideoPreRollDFP.videoStarted = true;\r\n }\r\n });\r\n}\r\n\r\nfunction updatePrerollCount() {\r\n $.ajax({\r\n url: '/game/updateprerollcount',\r\n method: 'GET',\r\n crossDomain: true,\r\n xhrFields: {\r\n withCredentials: true\r\n }\r\n });\r\n}\r\n\r\nfunction start() {\r\n if (VideoPreRollDFP.placeId === 0 && typeof play_placeId !== 'undefined') {\r\n VideoPreRollDFP.placeId = play_placeId;\r\n }\r\n // flip state bits\r\n VideoPreRollDFP.videoInitialized = true;\r\n VideoPreRollDFP.videoStarted = false;\r\n VideoPreRollDFP.videoCancelled = false;\r\n VideoPreRollDFP.videoCompleted = false;\r\n VideoPreRollDFP.videoSkipped = false;\r\n VideoPreRollDFP.loadingBarCurrentTime = 0;\r\n VideoPreRollDFP.videoLogNote = '';\r\n\r\n const loadingBarInterval = 1000;\r\n\r\n // Start loading bar\r\n LoadingBar.init(\r\n VideoPreRollDFP.loadingBarID,\r\n VideoPreRollDFP.loadingBarInnerID,\r\n VideoPreRollDFP.loadingBarPercentageID\r\n );\r\n VideoPreRollDFP.loadingBarIntervalID = setInterval(() => {\r\n VideoPreRollDFP.loadingBarCurrentTime += loadingBarInterval;\r\n LoadingBar.update(\r\n VideoPreRollDFP.loadingBarID,\r\n VideoPreRollDFP.loadingBarCurrentTime / VideoPreRollDFP.loadingBarMaxTime\r\n );\r\n }, loadingBarInterval);\r\n\r\n // Fetch preroll ad\r\n if (\r\n VideoPreRollDFP.isSwfPreloaderEnabled &&\r\n VideoPreRollDFP.isFlashInstalled\r\n ) {\r\n renderImaPreloader();\r\n } else {\r\n requestAds();\r\n }\r\n}\r\n\r\nfunction cancel() {\r\n VideoPreRollDFP.videoCancelled = true;\r\n $.modal.close(); // calls this.close()\r\n}\r\n\r\nfunction skip() {\r\n VideoPreRollDFP.videoCompleted = true;\r\n VideoPreRollDFP.videoSkipped = true;\r\n VideoPreRollDFP.showVideoPreRoll = false;\r\n}\r\n\r\nfunction close() {\r\n if (window.MadStatus && window.MadStatus.running) {\r\n window.MadStatus.stop('');\r\n }\r\n // todo: see where this robloxlaunch is coming from and if we can import it.\r\n if (window.RobloxLaunch.launcher) {\r\n window.RobloxLaunch.launcher._cancelled = true;\r\n }\r\n clearInterval(VideoPreRollDFP.loadingBarIntervalID);\r\n LoadingBar.dispose(VideoPreRollDFP.loadingBarID);\r\n\r\n if (isPlaying()) {\r\n // closing before video ended, must be a cancel\r\n VideoPreRollDFP.videoCancelled = true;\r\n }\r\n\r\n $.modal.close();\r\n logVideoPreRoll();\r\n\r\n // Update preroll count\r\n if (\r\n VideoPreRollDFP.isPrerollShownEveryXMinutesEnabled &&\r\n VideoPreRollDFP.videoInitialized &&\r\n VideoPreRollDFP.videoCompleted\r\n ) {\r\n updatePrerollCount();\r\n }\r\n}\r\n\r\n// Add the functions\r\nObject.assign(VideoPreRollDFP, {\r\n contentEndedListener,\r\n createVideoContent,\r\n createAdDisplayContainer,\r\n constructUrl,\r\n renderCompanionAd,\r\n onAdEvent,\r\n onAdError,\r\n onAdsManagerLoaded,\r\n requestAds,\r\n checkFlashEnabled,\r\n checkEligibility,\r\n logVideoPreRoll,\r\n isPlaying,\r\n correctIEModalPosition,\r\n renderImaPreloader,\r\n updatePrerollCount,\r\n start,\r\n cancel,\r\n skip,\r\n close\r\n});\r\n\r\nexport default VideoPreRollDFP;\r\n","/* eslint-disable func-names */\r\n/* eslint-disable prefer-const */\r\n// Please note: This file depends on RobloxCookies.js being already loaded.\r\nimport {\r\n Cookies,\r\n CurrentUser,\r\n Dialog,\r\n Endpoints,\r\n EnvironmentUrls,\r\n Lang,\r\n PlaceLauncher\r\n} from 'Roblox';\r\nimport $ from 'jquery';\r\nimport GameLauncher from './gameLauncher';\r\n\r\nlet _resolveInit;\r\n\r\nconst ProtocolHandlerClientInterface = {\r\n isInstalling: false,\r\n statusInterval: 0,\r\n sendingLocalesEnabled: false,\r\n robloxLocale: '',\r\n gameLocale: '',\r\n protocolUrlSeparator: '+',\r\n protocolUrlIncludesLaunchTime: false,\r\n protocolDetectionEnabled: false,\r\n avatarParamEnabled: true,\r\n separateScriptParamsEnabled: false,\r\n waitTimeBeforeFailure: 300,\r\n protocolNameForStudio: 'roblox-studio',\r\n protocolNameForClient: 'roblox-client',\r\n logger: null,\r\n initialized: new Promise((resolve, reject) => {\r\n _resolveInit = resolve;\r\n })\r\n};\r\n\r\nconst launchModes = {\r\n edit: 'edit',\r\n plugin: 'plugin',\r\n play: 'play',\r\n build: 'build'\r\n};\r\n\r\nfunction showStartingDialog(onClose, launchMode) {\r\n const refactorEnabled = PlaceLauncher.Resources.RefactorEnabled === 'True';\r\n const studioMode =\r\n launchMode === launchModes.edit || launchMode === launchModes.plugin;\r\n\r\n // use Roblox dialog modal\r\n if (refactorEnabled) {\r\n const bodyContent = studioMode\r\n ? PlaceLauncher.Resources.ProtocolHandlerStartingDialog.studio.content\r\n : PlaceLauncher.Resources.ProtocolHandlerStartingDialog.play.content;\r\n const { loader } = PlaceLauncher.Resources.ProtocolHandlerStartingDialog;\r\n Dialog.open({\r\n bodyContent: bodyContent + loader,\r\n allowHtmlContentInBody: true,\r\n showAccept: false,\r\n showDecline: false,\r\n dismissable: false,\r\n cssClass: 'protocolhandler-starting-modal',\r\n onCloseCallback: onClose,\r\n onCancel() {\r\n onClose();\r\n $.modal.close();\r\n }\r\n });\r\n return;\r\n }\r\n\r\n if (studioMode) {\r\n $('.protocol-handler-container').each(function() {\r\n $(this)\r\n .find('.play-modal')\r\n .addClass('hidden');\r\n $(this)\r\n .find('.studio-modal')\r\n .removeClass('hidden');\r\n });\r\n } else {\r\n $('.protocol-handler-container').each(function() {\r\n $(this)\r\n .find('.play-modal')\r\n .removeClass('hidden');\r\n $(this)\r\n .find('.studio-modal')\r\n .addClass('hidden');\r\n });\r\n }\r\n\r\n $('#ProtocolHandlerStartingDialog').modal({\r\n escClose: true,\r\n opacity: 80,\r\n overlayCss: {\r\n backgroundColor: '#000'\r\n },\r\n onClose() {\r\n onClose();\r\n $.modal.close();\r\n },\r\n zIndex: 1031\r\n });\r\n}\r\n\r\nfunction showDialog(onClose, gameLaunchParams) {\r\n let showAreYouInstalledDialogTimeout;\r\n const myOnClose = () => {\r\n clearTimeout(showAreYouInstalledDialogTimeout);\r\n onClose();\r\n };\r\n\r\n showAreYouInstalledDialogTimeout = setTimeout(() => {\r\n $.modal.close();\r\n // adding eslint disable below because the function definition placements is too complicated in this big file. Will fix later\r\n // eslint-disable-next-line no-use-before-define\r\n showAreYouInstalledDialog(myOnClose, gameLaunchParams);\r\n }, 5000);\r\n\r\n showStartingDialog(myOnClose, gameLaunchParams.launchMode);\r\n}\r\n\r\nfunction showLaunchFailureDialog() {\r\n $.modal.close();\r\n Dialog.open({\r\n titleText: Lang.VisitGameResources['Heading.ErrorStartingGame'],\r\n bodyContent: Lang.VisitGameResources['Response.Dialog.ErrorLaunching'],\r\n acceptText: Lang.ControlsResources['Action.OK'] || 'OK',\r\n showDecline: false\r\n });\r\n}\r\n\r\nfunction waitForStatus(gameLaunchParams) {\r\n const deferred = new $.Deferred();\r\n clearInterval(ProtocolHandlerClientInterface.statusInterval);\r\n ProtocolHandlerClientInterface.statusInterval = setInterval(() => {\r\n const url = Endpoints.getAbsoluteUrl('/client-status');\r\n\r\n $.ajax(url, {\r\n success(status) {\r\n if (status !== 'Unknown') {\r\n deferred.resolve(gameLaunchParams);\r\n clearInterval(ProtocolHandlerClientInterface.statusInterval);\r\n }\r\n },\r\n cache: false\r\n });\r\n }, 3000);\r\n return deferred;\r\n}\r\n\r\nfunction cleanUpAndLogSuccess(gameLaunchParams) {\r\n // hide dialog\r\n $.modal.close();\r\n\r\n // Log success!\r\n const logParams = {\r\n launchMethod: 'Protocol',\r\n params: gameLaunchParams\r\n };\r\n $(GameLauncher).trigger(GameLauncher.startClientSucceededEvent, logParams);\r\n if (ProtocolHandlerClientInterface.isInstalling) {\r\n $(GameLauncher).trigger(GameLauncher.successfulInstallEvent, logParams);\r\n ProtocolHandlerClientInterface.isInstalling = false;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line no-unused-vars\r\nfunction cleanUpAndLogFailure(gameLaunchParams) {\r\n // err.\r\n // TODO: ???\r\n return false;\r\n}\r\n\r\nfunction resetClientStatus() {\r\n const url = Endpoints.getAbsoluteUrl('/client-status/set?status=Unknown');\r\n\r\n return $.ajax({\r\n method: 'POST',\r\n url\r\n });\r\n}\r\n\r\nfunction doAuthTicketRequest() {\r\n let authUrl = `${EnvironmentUrls.authApi}/v1/authentication-ticket/`;\r\n\r\n return $.ajax({\r\n method: 'POST',\r\n url: authUrl,\r\n contentType: 'application/json'\r\n });\r\n}\r\n\r\nfunction getAuthTicket(gameLaunchDefaultParams) {\r\n let deferred = new $.Deferred();\r\n let gameLaunchParams = Object.assign({}, gameLaunchDefaultParams);\r\n\r\n if (!CurrentUser.isAuthenticated) {\r\n deferred.resolve(gameLaunchParams);\r\n return deferred;\r\n }\r\n\r\n return ProtocolHandlerClientInterface.doAuthTicketRequest().then(function(\r\n data,\r\n textStatus,\r\n xhr\r\n ) {\r\n const authenticationTicket = xhr.getResponseHeader(\r\n 'RBX-Authentication-Ticket'\r\n );\r\n if (authenticationTicket && authenticationTicket.length > 0) {\r\n gameLaunchParams.gameInfo = authenticationTicket;\r\n deferred.resolve(gameLaunchParams);\r\n } else {\r\n deferred.reject();\r\n }\r\n\r\n return deferred;\r\n });\r\n}\r\n\r\nfunction setLocationHref(href) {\r\n if (\r\n ProtocolHandlerClientInterface.protocolDetectionEnabled &&\r\n typeof navigator.msLaunchUri !== 'undefined'\r\n ) {\r\n navigator.msLaunchUri(href, () => {}, () => {}); // swallow errors\r\n } else {\r\n let iframe = $('iframe#gamelaunch');\r\n if (iframe.length > 0) {\r\n iframe.remove();\r\n }\r\n\r\n iframe = $(\"<iframe id='gamelaunch' class='hidden'></iframe>\").attr(\r\n 'src',\r\n href\r\n );\r\n $('body').append(iframe);\r\n // for selenium\r\n const seleniumEvent = new Event('ProtocolLaunchStartSelenium');\r\n window.dispatchEvent(seleniumEvent);\r\n }\r\n}\r\n\r\nfunction launchProtocolUrl(gameLaunchParams) {\r\n const deferred = new $.Deferred();\r\n\r\n const urlSeparator = ProtocolHandlerClientInterface.protocolUrlSeparator;\r\n let gameLaunchUrl = `${gameLaunchParams.protocolName}:`;\r\n const urlComponents = [];\r\n\r\n urlComponents.push(1); // protocol version parameter - used if we wish to significantly change the structure of the protocol url\r\n urlComponents.push(`launchmode:${gameLaunchParams.launchMode}`);\r\n\r\n // Studio will freeze at log-in if passed a guest ticket\r\n if (\r\n gameLaunchParams.gameInfo &&\r\n (gameLaunchParams.protocolName !==\r\n ProtocolHandlerClientInterface.protocolNameForStudio ||\r\n gameLaunchParams.gameInfo.indexOf('Guest:') !== 0)\r\n ) {\r\n urlComponents.push(\r\n `gameinfo:${encodeURIComponent(gameLaunchParams.gameInfo)}`\r\n );\r\n }\r\n\r\n if (ProtocolHandlerClientInterface.protocolUrlIncludesLaunchTime) {\r\n urlComponents.push(`launchtime:${gameLaunchParams.launchTime}`);\r\n }\r\n\r\n if (PlaceLauncher.Resources.IsProtocolHandlerBaseUrlParamEnabled === 'True') {\r\n const baseUrl =\r\n EnvironmentUrls.websiteUrl || `https://${window.location.host}`;\r\n urlComponents.push(`baseUrl:${encodeURIComponent(baseUrl)}`);\r\n }\r\n\r\n $.each(gameLaunchParams.otherParams, (name, value) => {\r\n if (name === value) {\r\n // assume if name === value, just add name\r\n urlComponents.push(name);\r\n } else {\r\n urlComponents.push(`${name}:${encodeURIComponent(value)}`);\r\n }\r\n });\r\n\r\n gameLaunchUrl += urlComponents.join(urlSeparator);\r\n if (GameLauncher.gameLaunchLogger) {\r\n GameLauncher.gameLaunchLogger.logToConsole(\r\n `launchProtocolUrl: ${JSON.stringify({\r\n url: gameLaunchUrl,\r\n params: gameLaunchParams\r\n })}`\r\n );\r\n }\r\n // setLocationHref is used so that automated tests can intercept the protocol handler URL for verification. Do not refactor without checking the tests.\r\n setLocationHref(gameLaunchUrl);\r\n\r\n deferred.resolve(gameLaunchParams);\r\n return deferred;\r\n}\r\n\r\nfunction startGameFlow(gameLaunchParams) {\r\n return $.when(getAuthTicket(gameLaunchParams), resetClientStatus())\r\n .then(launchProtocolUrl, showLaunchFailureDialog)\r\n .then(waitForStatus)\r\n .then(cleanUpAndLogSuccess, cleanUpAndLogFailure);\r\n}\r\n\r\nfunction continueInstallClick(e) {\r\n const clickedElement = $(this);\r\n if (!clickedElement.hasClass('disabled')) {\r\n startGameFlow(e.data);\r\n const protocolHandlerAlwaysAllowElem = $(\r\n '#ProtocolHandlerClickAlwaysAllowed'\r\n );\r\n if (\r\n typeof protocolHandlerAlwaysAllowElem.data('hideRememberOverlay') ===\r\n 'undefined'\r\n ) {\r\n // if the attribute is not set, we should show the element.\r\n protocolHandlerAlwaysAllowElem.show();\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction startGame(gameLaunchDefaultParams) {\r\n const gameLaunchParams = Object.assign({}, gameLaunchDefaultParams);\r\n gameLaunchParams.launchTime = new Date().getTime();\r\n gameLaunchParams.otherParams.browsertrackerid = Cookies.getBrowserTrackerId();\r\n\r\n if (ProtocolHandlerClientInterface.sendingLocalesEnabled) {\r\n gameLaunchParams.otherParams.robloxLocale =\r\n ProtocolHandlerClientInterface.robloxLocale;\r\n gameLaunchParams.otherParams.gameLocale =\r\n ProtocolHandlerClientInterface.gameLocale;\r\n }\r\n\r\n // fire startClientAttempted\r\n $(GameLauncher).trigger(GameLauncher.startClientAttemptedEvent, {\r\n launchMethod: 'Protocol',\r\n params: gameLaunchParams\r\n });\r\n showDialog(() => {}, gameLaunchParams);\r\n // return the deferred object so we can continue chaining, if desired.\r\n return startGameFlow(gameLaunchParams);\r\n}\r\n\r\nfunction getPlaceLauncherUrl(requestType, otherParams) {\r\n let absoluteUrl = ' ';\r\n if (Endpoints && Endpoints.Urls) {\r\n absoluteUrl = `${Endpoints.getAbsoluteUrl('/Game/PlaceLauncher.ashx')}?`;\r\n }\r\n\r\n // if endpoints are turned off, or if the absolute url resolver returns a relative path, fallback on the old method\r\n if (absoluteUrl[0] !== 'h') {\r\n const domainUrl = `http://${window.location.host}`;\r\n const domainPath = '/Game/PlaceLauncher.ashx?';\r\n absoluteUrl = domainUrl + domainPath;\r\n }\r\n absoluteUrl = absoluteUrl.replace('placelauncher', 'PlaceLauncher');\r\n\r\n const args = {\r\n request: requestType,\r\n browserTrackerId: Cookies.getBrowserTrackerId()\r\n };\r\n $.extend(args, otherParams);\r\n return absoluteUrl + $.param(args);\r\n}\r\n\r\nfunction getStudioScriptUrl(\r\n scriptHandlerName,\r\n placeId,\r\n universeId,\r\n allowUpload\r\n) {\r\n let absoluteUrl = ' ';\r\n if (Endpoints && Endpoints.Urls) {\r\n absoluteUrl = `${Endpoints.getAbsoluteUrl(`/Game/${scriptHandlerName}`)}?`;\r\n }\r\n\r\n // if endpoints are turned off, or if the absolute url resolver returns a relative path, fallback on the old method\r\n if (absoluteUrl[0] !== 'h') {\r\n const domainUrl = `http://${window.location.host}`;\r\n const domainPath = `/Game/${scriptHandlerName}?`;\r\n absoluteUrl = domainUrl + domainPath;\r\n }\r\n\r\n const args = {\r\n placeId,\r\n upload: allowUpload ? placeId : '',\r\n universeId,\r\n testMode: false\r\n };\r\n return absoluteUrl + $.param(args);\r\n}\r\n\r\nfunction getEditScriptUrl(placeId, universeId, allowUpload) {\r\n return getStudioScriptUrl('Edit.ashx', placeId, universeId, allowUpload);\r\n}\r\n\r\nfunction openStudio() {\r\n const otherParams = {};\r\n\r\n if (ProtocolHandlerClientInterface.avatarParamEnabled) {\r\n otherParams.avatar = 'avatar';\r\n }\r\n\r\n return startGame({\r\n protocolName: ProtocolHandlerClientInterface.protocolNameForStudio,\r\n launchMode: 'edit',\r\n otherParams\r\n });\r\n}\r\n\r\nfunction returnToStudio() {\r\n const otherParams = {\r\n task: 'ReturnFromLogin'\r\n };\r\n\r\n if (ProtocolHandlerClientInterface.avatarParamEnabled) {\r\n otherParams.avatar = 'avatar';\r\n }\r\n\r\n return startGame({\r\n protocolName: ProtocolHandlerClientInterface.protocolNameForStudio,\r\n launchMode: 'edit',\r\n otherParams\r\n });\r\n}\r\n\r\nfunction openPluginInStudio(pluginId) {\r\n const otherParams = {\r\n pluginid: pluginId\r\n };\r\n\r\n if (ProtocolHandlerClientInterface.avatarParamEnabled) {\r\n otherParams.avatar = 'avatar';\r\n }\r\n\r\n startGame({\r\n protocolName: ProtocolHandlerClientInterface.protocolNameForStudio,\r\n launchMode: 'plugin',\r\n otherParams\r\n });\r\n}\r\n\r\nfunction editGameInStudio(placeId, universeId, allowUpload) {\r\n let otherParams;\r\n if (ProtocolHandlerClientInterface.separateScriptParamsEnabled) {\r\n otherParams = {\r\n task: 'EditPlace',\r\n placeId,\r\n universeId\r\n };\r\n } else {\r\n const scriptUrl = getEditScriptUrl(placeId, universeId, allowUpload);\r\n otherParams = {\r\n script: scriptUrl\r\n };\r\n }\r\n\r\n if (ProtocolHandlerClientInterface.avatarParamEnabled) {\r\n otherParams.avatar = 'avatar';\r\n }\r\n\r\n // we currently always pass \"avatar\" to studio, but in the future it may need to be optional\r\n startGame({\r\n protocolName: ProtocolHandlerClientInterface.protocolNameForStudio,\r\n launchMode: 'edit',\r\n otherParams,\r\n placeId\r\n });\r\n}\r\n\r\n// placeLauncherParams has placeId, genderId, isPlayTogetherGame\r\nfunction joinMultiplayerGame(placeLauncherParams) {\r\n const protocol = ProtocolHandlerClientInterface.protocolNameForClient;\r\n\r\n const launchMode = 'play';\r\n const placeLauncherUrl = getPlaceLauncherUrl(\r\n 'RequestGame',\r\n placeLauncherParams\r\n );\r\n const isPlayTogetherGame = placeLauncherParams.isPlayTogetherGame === true;\r\n const otherParams = {\r\n placelauncherurl: placeLauncherUrl\r\n };\r\n const startGameParams = {\r\n protocolName: protocol,\r\n launchMode,\r\n otherParams,\r\n placeId: placeLauncherParams.placeId,\r\n isPlayTogetherGame\r\n };\r\n\r\n return startGame(startGameParams);\r\n}\r\n\r\n// placeLauncherParams has userId, genderId (though genderId might be ignored)\r\nfunction followPlayerIntoGame(placeLauncherParams) {\r\n const protocol = ProtocolHandlerClientInterface.protocolNameForClient;\r\n\r\n const launchMode = 'play';\r\n const placeLauncherUrl = getPlaceLauncherUrl(\r\n 'RequestFollowUser',\r\n placeLauncherParams\r\n );\r\n const params = {\r\n placelauncherurl: placeLauncherUrl\r\n };\r\n const startGameParams = {\r\n protocolName: protocol,\r\n launchMode,\r\n otherParams: params\r\n };\r\n\r\n return startGame(startGameParams);\r\n}\r\n\r\n// placeLauncherParams has placeId, gameId, genderId, isPlayTogetherGame\r\nfunction joinGameInstance(placeLauncherParams) {\r\n const protocol = ProtocolHandlerClientInterface.protocolNameForClient;\r\n\r\n const launchMode = 'play';\r\n const placeLauncherUrl = getPlaceLauncherUrl(\r\n 'RequestGameJob',\r\n placeLauncherParams\r\n );\r\n const isPlayTogetherGame = placeLauncherParams.isPlayTogetherGame === true;\r\n const params = {\r\n placelauncherurl: placeLauncherUrl\r\n };\r\n const startGameParams = {\r\n protocolName: protocol,\r\n launchMode,\r\n otherParams: params,\r\n placeId: placeLauncherParams.placeId,\r\n isPlayTogetherGame\r\n };\r\n\r\n return startGame(startGameParams);\r\n}\r\n\r\n// placeLauncherParams has placeId, accessCode\r\nfunction joinPrivateGame(placeLauncherParams) {\r\n const protocol = ProtocolHandlerClientInterface.protocolNameForClient;\r\n\r\n const launchMode = 'play';\r\n const placeLauncherUrl = getPlaceLauncherUrl(\r\n 'RequestPrivateGame',\r\n placeLauncherParams\r\n );\r\n const params = {\r\n placelauncherurl: placeLauncherUrl\r\n };\r\n const startGameParams = {\r\n protocolName: protocol,\r\n launchMode,\r\n otherParams: params,\r\n placeId: placeLauncherParams.placeId\r\n };\r\n\r\n return startGame(startGameParams);\r\n}\r\n\r\n// placeLauncherParams has placeId, conversationId\r\nfunction playTogetherGame(placeLauncherParams) {\r\n const protocol = ProtocolHandlerClientInterface.protocolNameForClient;\r\n\r\n const launchMode = 'play';\r\n const placeLauncherUrl = getPlaceLauncherUrl(\r\n 'RequestPlayTogetherGame',\r\n placeLauncherParams\r\n );\r\n const otherParams = {\r\n placelauncherurl: placeLauncherUrl\r\n };\r\n const startGameParams = {\r\n protocolName: protocol,\r\n launchMode,\r\n otherParams,\r\n placeId: placeLauncherParams.placeId,\r\n conversationId: placeLauncherParams.conversationId\r\n };\r\n\r\n return startGame(startGameParams);\r\n}\r\n\r\nfunction startDownload() {\r\n const iframe = document.getElementById('downloadInstallerIFrame');\r\n iframe.src = '/install/setup.ashx';\r\n}\r\n\r\nfunction startStudioDownload() {\r\n const iframe = document.getElementById('downloadInstallerIFrame');\r\n iframe.src = '/install/setupStudio.ashx';\r\n}\r\n\r\nfunction beginProtocolHandlerInstall(gameLaunchDefaultParams, isStudioInstall) {\r\n // remove gameinfo, if it's there\r\n let gameLaunchParams = Object.assign({}, gameLaunchDefaultParams);\r\n const { gameInfo } = gameLaunchParams;\r\n if (typeof gameLaunchParams.gameInfo !== 'undefined') {\r\n gameLaunchParams.gameInfo = undefined;\r\n }\r\n // fire begin install event\r\n $(GameLauncher).trigger(GameLauncher.beginInstallEvent, {\r\n launchMethod: 'Protocol',\r\n params: gameLaunchParams\r\n });\r\n ProtocolHandlerClientInterface.isInstalling = true;\r\n // store in cookie\r\n gameLaunchParams.url = window.location.href;\r\n // re-add gameInfo, for in-page installation\r\n if (typeof gameInfo !== 'undefined') {\r\n gameLaunchParams.gameInfo = gameInfo;\r\n }\r\n\r\n if (isStudioInstall) {\r\n startStudioDownload();\r\n } else {\r\n startDownload();\r\n }\r\n}\r\n\r\nfunction protocolHandlerInstall(gameLaunchParams) {\r\n const { launchMode } = gameLaunchParams;\r\n const studioMode =\r\n launchMode === launchModes.edit || launchMode === launchModes.plugin;\r\n\r\n $.modal.close();\r\n if (!studioMode) {\r\n Dialog.open({\r\n titleText: $('#InstallationInstructions .ph-modal-header .title').text(),\r\n allowHtmlContentInBody: true,\r\n bodyContent: $(\r\n '#InstallationInstructions .modal-content-container'\r\n ).html(),\r\n allowHtmlContentInFooter: true,\r\n footerText: $('#InstallationInstructions .xsmall').html(),\r\n acceptColor: Dialog.none,\r\n declineColor: Dialog.none,\r\n cssClass: 'install-instructions-modal',\r\n xToCancel: true,\r\n onCloseCallback() {\r\n $('#ProtocolHandlerClickAlwaysAllowed').hide();\r\n }\r\n });\r\n\r\n setTimeout(() => {\r\n $('.VisitButtonContinueGLI a')\r\n .removeClass('disabled')\r\n .click(gameLaunchParams, continueInstallClick);\r\n }, 5000);\r\n }\r\n\r\n beginProtocolHandlerInstall(gameLaunchParams, studioMode);\r\n}\r\n\r\nfunction showAreYouInstalledDialog(onClose, gameLaunchParams) {\r\n const refactorEnabled = PlaceLauncher.Resources.RefactorEnabled === 'True';\r\n const { launchMode } = gameLaunchParams;\r\n const studioMode =\r\n launchMode === launchModes.edit || launchMode === launchModes.plugin;\r\n\r\n if (refactorEnabled) {\r\n const modalResource = studioMode\r\n ? PlaceLauncher.Resources.ProtocolHandlerAreYouInstalled.studio\r\n : PlaceLauncher.Resources.ProtocolHandlerAreYouInstalled.play;\r\n Dialog.open({\r\n bodyContent: modalResource.content,\r\n allowHtmlContentInBody: true,\r\n showAccept: true,\r\n acceptColor: Dialog.green,\r\n acceptText: modalResource.buttonText,\r\n showDecline: false,\r\n dismissable: false,\r\n xToCancel: true,\r\n footerText: modalResource.footerContent,\r\n allowHtmlContentInFooter: true,\r\n onAccept() {\r\n protocolHandlerInstall(gameLaunchParams);\r\n },\r\n cssClass: 'protocolhandler-are-you-installed-modal'\r\n });\r\n return;\r\n }\r\n\r\n $('#ProtocolHandlerAreYouInstalled').modal({\r\n escClose: true,\r\n opacity: 80,\r\n overlayCss: {\r\n backgroundColor: '#000'\r\n },\r\n onClose() {\r\n onClose();\r\n $('#ProtocolHandlerInstallButton').off('click');\r\n $.modal.close();\r\n },\r\n zIndex: 1031\r\n });\r\n $('#ProtocolHandlerInstallButton, #ProtocolHandlerStudioInstallButton').click(\r\n function() {\r\n protocolHandlerInstall(gameLaunchParams);\r\n }\r\n );\r\n}\r\n\r\nfunction manualDownload() {\r\n $(GameLauncher).trigger(GameLauncher.manualDownloadEvent, {\r\n launchMethod: 'Protocol',\r\n params: {}\r\n });\r\n startDownload();\r\n}\r\n\r\nfunction attachManualDownloadToLink() {\r\n $('body #GameLaunchManualInstallLink').click(function() {\r\n manualDownload();\r\n return false;\r\n });\r\n}\r\n\r\n// attach the functions\r\nObject.assign(ProtocolHandlerClientInterface, {\r\n // functions\r\n joinMultiplayerGame,\r\n openStudio,\r\n returnToStudio,\r\n openPluginInStudio,\r\n editGameInStudio,\r\n followPlayerIntoGame,\r\n joinGameInstance,\r\n joinPrivateGame,\r\n playTogetherGame,\r\n manualDownload,\r\n attachManualDownloadToLink,\r\n startDownload,\r\n setLocationHref, // this is used by automated tests to intercept the protocol handler URL for verification. Do not remove.\r\n doAuthTicketRequest, // expose this so usable from other places.\r\n\r\n // test overrides\r\n showDialog,\r\n showLaunchFailureDialog,\r\n cleanUpAndLogSuccess,\r\n cleanUpAndLogFailure\r\n});\r\n\r\n$(document).ready(function() {\r\n GameLauncher.gameLaunchInterface = ProtocolHandlerClientInterface;\r\n const placeLauncherPanel = $('#PlaceLauncherStatusPanel');\r\n ProtocolHandlerClientInterface.protocolNameForClient = placeLauncherPanel.data(\r\n 'protocol-name-for-client'\r\n );\r\n ProtocolHandlerClientInterface.protocolNameForStudio = placeLauncherPanel.data(\r\n 'protocol-name-for-studio'\r\n );\r\n ProtocolHandlerClientInterface.protocolUrlIncludesLaunchTime = placeLauncherPanel.data(\r\n 'protocol-url-includes-launchtime'\r\n );\r\n ProtocolHandlerClientInterface.protocolDetectionEnabled = placeLauncherPanel.data(\r\n 'protocol-detection-enabled'\r\n );\r\n ProtocolHandlerClientInterface.separateScriptParamsEnabled = placeLauncherPanel.data(\r\n 'protocol-separate-script-parameters-enabled'\r\n );\r\n ProtocolHandlerClientInterface.avatarParamEnabled = placeLauncherPanel.data(\r\n 'protocol-avatar-parameter-enabled'\r\n );\r\n ProtocolHandlerClientInterface.sendingLocalesEnabled = placeLauncherPanel.data(\r\n 'protocol-sending-locales-enabled'\r\n );\r\n ProtocolHandlerClientInterface.robloxLocale = placeLauncherPanel.data(\r\n 'protocol-roblox-locale'\r\n );\r\n ProtocolHandlerClientInterface.gameLocale = placeLauncherPanel.data(\r\n 'protocol-game-locale'\r\n );\r\n\r\n if (\r\n !ProtocolHandlerClientInterface.logger &&\r\n typeof window.Roblox.ProtocolHandlerLogger !== 'undefined'\r\n ) {\r\n ProtocolHandlerClientInterface.logger = window.Roblox.ProtocolHandlerLogger;\r\n }\r\n\r\n _resolveInit();\r\n});\r\n\r\n// todo: set Roblox.ProtocolHandlerClientInterface to be this.\r\nexport default ProtocolHandlerClientInterface;\r\n","import $ from 'jquery';\r\nimport VideoPreRollDFP from './videoPreRollDFP';\r\n\r\nconst PrerollPlayer = {\r\n waitForPreroll: params => {\r\n const deferred = new $.Deferred();\r\n\r\n const videoPreRoll = VideoPreRollDFP;\r\n videoPreRoll.placeId =\r\n typeof params.placeId !== 'undefined' ? params.placeId : 0;\r\n if (videoPreRoll.showVideoPreRoll) {\r\n const popupOptions = {\r\n escClose: true,\r\n opacity: 80,\r\n overlayCss: { backgroundColor: '#000' },\r\n zIndex: 1031 // higher than nav\r\n };\r\n popupOptions.onShow = dialog => {\r\n videoPreRoll.correctIEModalPosition(dialog);\r\n videoPreRoll.start();\r\n // Enable close button after ad (:15 or :30)\r\n $('#prerollClose').hide();\r\n $('#prerollClose')\r\n .delay(1000 * videoPreRoll.adTime)\r\n .show(300);\r\n };\r\n popupOptions.onClose = () => {\r\n videoPreRoll.close();\r\n };\r\n popupOptions.closeHTML =\r\n '<a href=\"#\" id=\"prerollClose\" class=\"ImageButton closeBtnCircle_35h ABCloseCircle VprCloseButton\"></a>';\r\n\r\n $('#videoPrerollPanel').modal(popupOptions);\r\n\r\n const interval = setInterval(() => {\r\n if (!videoPreRoll.isPlaying()) {\r\n $.modal.close();\r\n clearInterval(interval);\r\n if (videoPreRoll.videoCancelled) {\r\n deferred.reject(params);\r\n } else {\r\n deferred.resolve(params);\r\n }\r\n }\r\n }, 200);\r\n } else {\r\n deferred.resolve(params);\r\n videoPreRoll.logVideoPreRoll();\r\n }\r\n\r\n return deferred;\r\n }\r\n};\r\n\r\nexport default PrerollPlayer;\r\n","import $ from 'jquery';\r\nimport AuthenticationChecker from './authenticationChecker';\r\nimport BcUpsellModalInterface from './bcUpsellModalInterface';\r\nimport PrerollPlayer from './prerollPlayer';\r\nimport ProtocolHandlerClientInterface from './protocolHandlerClientInterface';\r\n\r\n// EventNames\r\nconst startClientAttemptedEvent = 'startClientAttempted';\r\nconst startClientFailedEvent = 'startClientFailed';\r\nconst startClientSucceededEvent = 'startClientSucceeded';\r\nconst beginInstallEvent = 'beginInstall';\r\nconst successfulInstallEvent = 'successfulInstall';\r\nconst manualDownloadEvent = 'manualDownload';\r\n\r\nconst gameLauncher = {\r\n // can be overriden by win10 roblox app appHybridClientInterface.js\r\n gameLaunchInterface: ProtocolHandlerClientInterface,\r\n gameLaunchLogger: null\r\n};\r\n\r\nfunction setGameLaunchInterface(newInterface) {\r\n gameLauncher.gameLaunchInterface = newInterface;\r\n}\r\n\r\nfunction setGameLaunchLogger(newLogger) {\r\n gameLauncher.gameLaunchLogger = newLogger;\r\n}\r\n\r\nfunction editGameInStudio(placeId, universeId, allowUpload) {\r\n gameLauncher.gameLaunchInterface.editGameInStudio(\r\n placeId,\r\n universeId,\r\n allowUpload\r\n );\r\n}\r\n\r\nfunction openStudio() {\r\n gameLauncher.gameLaunchInterface.openStudio();\r\n}\r\nfunction returnToStudio() {\r\n gameLauncher.gameLaunchInterface.returnToStudio();\r\n}\r\n\r\nfunction openPluginInStudio(pluginId) {\r\n gameLauncher.gameLaunchInterface.openPluginInStudio(pluginId);\r\n}\r\n\r\nfunction joinMultiplayerGame(\r\n placeId,\r\n isMembershipLevelOk = true,\r\n isPlayTogetherGame\r\n) {\r\n const params = { placeId, isPlayTogetherGame: isPlayTogetherGame === true };\r\n\r\n const deferred = BcUpsellModalInterface.checkBcRequirement(\r\n params,\r\n isMembershipLevelOk\r\n )\r\n .then(AuthenticationChecker.restrictGuests)\r\n .then(PrerollPlayer.waitForPreroll)\r\n .then(gameLauncher.gameLaunchInterface.joinMultiplayerGame);\r\n return deferred;\r\n}\r\n\r\nfunction followPlayerIntoGame(userId) {\r\n const params = { userId };\r\n const deferred = AuthenticationChecker.restrictGuests(params)\r\n .then(PrerollPlayer.waitForPreroll)\r\n .then(gameLauncher.gameLaunchInterface.followPlayerIntoGame);\r\n return deferred;\r\n}\r\n\r\nfunction joinGameInstance(\r\n placeId,\r\n gameId,\r\n isMembershipLevelOk,\r\n isPlayTogetherGame\r\n) {\r\n const params = {\r\n placeId,\r\n gameId,\r\n isPlayTogetherGame: isPlayTogetherGame === true\r\n };\r\n const deferred = AuthenticationChecker.restrictGuests(params)\r\n .then(PrerollPlayer.waitForPreroll)\r\n .then(gameLauncher.gameLaunchInterface.joinGameInstance);\r\n return deferred;\r\n}\r\n\r\nasync function joinPrivateGame(placeId, accessCode, linkCode) {\r\n await gameLauncher.gameLaunchInterface.initialized;\r\n const params = {\r\n placeId,\r\n accessCode,\r\n linkCode\r\n };\r\n const deferred = PrerollPlayer.waitForPreroll(params)\r\n .then(\r\n gameLauncher.gameLaunchInterface.joinPrivateGame\r\n );\r\n return deferred;\r\n}\r\n\r\nfunction playTogetherGame(placeId, conversationId) {\r\n const params = { placeId, conversationId };\r\n\r\n const deferred = BcUpsellModalInterface.checkBcRequirement(params, true)\r\n .then(AuthenticationChecker.restrictGuests)\r\n .then(PrerollPlayer.waitForPreroll)\r\n .then(gameLauncher.gameLaunchInterface.playTogetherGame);\r\n return deferred;\r\n}\r\n\r\n$(document).ready(() => {\r\n // ---------- VisitButtons bindings: --------------\r\n $('body').bindGameLaunch();\r\n});\r\n\r\n// jQuery plugin for binding game launch buttons. Finds any protocol handler game launch buttons in the current jQuery object and binds them.\r\n// eg: $(\"#ajaxUpdatedContainer\").bindGameLaunch();\r\n$.fn.bindGameLaunch = function bindGameLaunch() {\r\n this.find('.VisitButtonPlayGLI').click(function() {\r\n const el = $(this);\r\n const placeId = el.attr('placeid');\r\n const isMembershipLevelOk = el.data('is-membership-level-ok');\r\n joinMultiplayerGame(placeId, isMembershipLevelOk);\r\n });\r\n\r\n this.find('.VisitButtonEditGLI').click(function() {\r\n const el = $(this);\r\n const placeId = el.attr('placeid');\r\n const universeId = el.data('universeid');\r\n const allowUpload = !!el.data('allowupload');\r\n editGameInStudio(placeId, universeId, allowUpload);\r\n });\r\n\r\n return this;\r\n};\r\n\r\nObject.assign(gameLauncher, {\r\n // implementations of objects, set by implementers at page load\r\n authenticationChecker: AuthenticationChecker,\r\n prerollPlayer: PrerollPlayer,\r\n bcUpsellModalInterface: BcUpsellModalInterface,\r\n\r\n // Functions\r\n joinMultiplayerGame,\r\n openStudio,\r\n returnToStudio,\r\n openPluginInStudio,\r\n editGameInStudio,\r\n followPlayerIntoGame,\r\n joinGameInstance,\r\n joinPrivateGame,\r\n playTogetherGame,\r\n setGameLaunchInterface,\r\n setGameLaunchLogger,\r\n\r\n // EventNames\r\n startClientAttemptedEvent,\r\n startClientFailedEvent,\r\n startClientSucceededEvent,\r\n beginInstallEvent,\r\n successfulInstallEvent,\r\n manualDownloadEvent\r\n});\r\n\r\nexport default gameLauncher;\r\n","import { EventStream } from 'Roblox';\r\nimport $ from 'jquery';\r\n\r\nconst gamePlayEvents = {\r\n lastContext: 'unknown',\r\n contextCategories: {\r\n joinUser: 'JoinUser'\r\n }\r\n};\r\n\r\nfunction getPage() {\r\n const path = window.location.pathname.toLowerCase();\r\n const profilePageString = 'profile';\r\n const profileLastIndex = path.lastIndexOf(profilePageString);\r\n // roundabout way of saying .endsWith since .endsWith is not supported by IE. Surprise surprise!\r\n if (\r\n profileLastIndex !== -1 &&\r\n path.length === profileLastIndex + profilePageString.length\r\n ) {\r\n return profilePageString;\r\n }\r\n if (path.indexOf('/develop') !== -1) {\r\n return 'develop';\r\n }\r\n return 'gameDetail';\r\n}\r\n\r\nfunction getProperties(placeId, referrerId) {\r\n const placeLauncherInfo = $('#PlaceLauncherStatusPanel');\r\n return {\r\n lType:\r\n placeLauncherInfo &&\r\n placeLauncherInfo.data('is-protocol-handler-launch-enabled') &&\r\n placeLauncherInfo\r\n .data('is-protocol-handler-launch-enabled')\r\n .toLowerCase() === 'true'\r\n ? 'protocol'\r\n : 'plugin',\r\n pid: placeId,\r\n refuid: referrerId,\r\n pg: getPage()\r\n };\r\n}\r\n\r\nfunction sendEvent(eventName, context, placeId, referrerId) {\r\n if (context !== null && context !== '' && context !== 'unknown') {\r\n gamePlayEvents.lastContext = context;\r\n }\r\n EventStream.SendEvent(\r\n eventName,\r\n gamePlayEvents.lastContext,\r\n getProperties(placeId, referrerId)\r\n );\r\n}\r\n\r\nfunction sendGamePlayIntent(context, placeId, referrerId) {\r\n sendEvent('gamePlayIntent', context, placeId, referrerId);\r\n $(document).trigger('playButton:gamePlayIntent');\r\n}\r\n\r\nfunction sendDevelopIntent(context, placeId) {\r\n sendEvent('developIntent', context, placeId);\r\n}\r\n\r\nfunction sendInstallBegin(context, placeId) {\r\n sendEvent('installBegin', context, placeId);\r\n}\r\n\r\nfunction sendInstallSuccess(context, placeId) {\r\n sendEvent('installSuccess', context, placeId);\r\n}\r\n\r\nfunction sendClientStartAttempt(context, placeId) {\r\n sendEvent('clientStartAttempt', context, placeId);\r\n}\r\nfunction sendClientStartSuccessWeb(context, placeId) {\r\n sendEvent('clientStartSuccessWeb', context, placeId);\r\n}\r\n\r\nfunction sendManualDownloadClick(context, placeId) {\r\n sendEvent('manualDownload', context, placeId);\r\n}\r\n\r\nObject.assign(gamePlayEvents, {\r\n SendGamePlayIntent: sendGamePlayIntent,\r\n SendDevelopIntent: sendDevelopIntent,\r\n SendInstallBegin: sendInstallBegin,\r\n SendInstallSuccess: sendInstallSuccess,\r\n SendClientStartAttempt: sendClientStartAttempt,\r\n SendClientStartSuccessWeb: sendClientStartSuccessWeb,\r\n SendManualDownloadClick: sendManualDownloadClick\r\n});\r\n\r\nexport default gamePlayEvents;\r\n","/* eslint-disable prefer-const */\r\nimport { GaEventSettings } from 'Roblox';\r\nimport $ from 'jquery';\r\nimport GameLauncher from './gameLauncher';\r\nimport GamePlayEvents from './gamePlayEvents';\r\n\r\nconst GameLaunchLogger = {\r\n logToConsoleEnabled: false,\r\n logToGAEnabled: true,\r\n logToEphemeralCountersEnabled: true\r\n};\r\n\r\nconst ephemeralCountersEvents = {};\r\nephemeralCountersEvents[GameLauncher.startClientAttemptedEvent] = [\r\n 'GameLaunchAttempt_<os>',\r\n 'GameLaunchAttempt_<os>_<launchmethod>'\r\n];\r\nephemeralCountersEvents[GameLauncher.startClientSucceededEvent] = [\r\n 'GameLaunchSuccessWeb_<os>',\r\n 'GameLaunchSuccessWeb_<os>_<launchmethod>'\r\n];\r\n\r\nconst googleAnalyticsEvents = {};\r\nif (GaEventSettings.gaLaunchAttemptAndLaunchSuccessEnabled) {\r\n googleAnalyticsEvents[GameLauncher.startClientAttemptedEvent] =\r\n 'Launch Attempt';\r\n googleAnalyticsEvents[GameLauncher.startClientSucceededEvent] =\r\n 'Launch Success';\r\n}\r\ngoogleAnalyticsEvents[GameLauncher.beginInstallEvent] = 'Install Begin';\r\ngoogleAnalyticsEvents[GameLauncher.successfulInstallEvent] = 'Install Success';\r\ngoogleAnalyticsEvents[GameLauncher.manualDownloadEvent] = 'Manual Download';\r\n\r\nconst eventStreamEvents = {};\r\neventStreamEvents[GameLauncher.startClientAttemptedEvent] =\r\n GamePlayEvents.SendClientStartAttempt;\r\neventStreamEvents[GameLauncher.startClientSucceededEvent] =\r\n GamePlayEvents.SendClientStartSuccessWeb;\r\neventStreamEvents[GameLauncher.beginInstallEvent] =\r\n GamePlayEvents.SendInstallBegin;\r\neventStreamEvents[GameLauncher.successfulInstallEvent] =\r\n GamePlayEvents.SendInstallSuccess;\r\neventStreamEvents[GameLauncher.manualDownloadEvent] =\r\n GamePlayEvents.SendManualDownloadClick;\r\n\r\nfunction getLaunchMode(params) {\r\n return params.params.launchMode;\r\n}\r\n\r\nfunction getOsName() {\r\n return $('#PlaceLauncherStatusPanel').data('os-name');\r\n}\r\n\r\nfunction logToConsole(value) {\r\n if (GameLaunchLogger.logToConsoleEnabled) {\r\n console.log(value);\r\n }\r\n}\r\n\r\nfunction logToEphemeralCounters(counterName, launchMethod) {\r\n if (GameLaunchLogger.logToEphemeralCountersEnabled) {\r\n let osName = getOsName();\r\n if (osName === 'Windows') {\r\n osName = 'Win32';\r\n }\r\n counterName = counterName.replace('<os>', osName);\r\n counterName = counterName.replace('<launchmethod>', launchMethod);\r\n if (window.EventTracker.fireEvent) {\r\n window.EventTracker.fireEvent(counterName);\r\n }\r\n }\r\n}\r\n\r\nfunction logToGA(category, name, label, value) {\r\n if (\r\n typeof window.GoogleAnalyticsEvents !== 'undefined' &&\r\n GameLaunchLogger.logToGAEnabled &&\r\n window.GoogleAnalyticsEvents.FireEvent\r\n ) {\r\n window.GoogleAnalyticsEvents.FireEvent([category, name, label, value]);\r\n }\r\n}\r\n\r\nfunction logGameLauncherEvent(event, params) {\r\n logToConsole(`${event.type}: ${JSON.stringify(params)}`);\r\n if (ephemeralCountersEvents[event.type]) {\r\n $.each(ephemeralCountersEvents[event.type], (idx, counterName) => {\r\n logToEphemeralCounters(counterName, params.launchMethod);\r\n });\r\n }\r\n if (googleAnalyticsEvents[event.type]) {\r\n logToGA(\r\n params.launchMethod,\r\n googleAnalyticsEvents[event.type],\r\n getLaunchMode(params),\r\n 0\r\n );\r\n }\r\n if (\r\n $('#PlaceLauncherStatusPanel').data('event-stream-for-protocol-enabled') ===\r\n 'True' &&\r\n eventStreamEvents[event.type]\r\n ) {\r\n // pass null into context so we use lastContext (set by gamePlayIntent event)\r\n eventStreamEvents[event.type](null, params.params.placeId);\r\n }\r\n}\r\n\r\n// public interface\r\nObject.assign(GameLaunchLogger, {\r\n // functions\r\n logToConsole,\r\n logToEphemeralCounters,\r\n logToGA\r\n});\r\n\r\n$(document).ready(() => {\r\n const gameLauncherEvents = [\r\n GameLauncher.startClientAttemptedEvent,\r\n GameLauncher.startClientFailedEvent,\r\n GameLauncher.startClientSucceededEvent,\r\n GameLauncher.beginInstallEvent,\r\n GameLauncher.successfulInstallEvent,\r\n GameLauncher.manualDownloadEvent\r\n ];\r\n $(GameLauncher).on(gameLauncherEvents.join(' '), logGameLauncherEvent);\r\n});\r\n\r\nexport default GameLaunchLogger;\r\n","/* eslint-disable func-names */\r\nimport { EnvironmentUrls, UrlParser } from 'Roblox';\r\nimport $ from 'jquery';\r\nimport GamePlayEvents from './gamePlayEvents';\r\n\r\nfunction attachHandlers() {\r\n const allRunningGameInstancesSectionPath = '#rbx-running-games';\r\n const allrunningGameInstancesJoinServerPath =\r\n '.rbx-game-server-item .rbx-game-server-join';\r\n const runningGameInstancesForFriendsSectionPath =\r\n '#rbx-friends-running-games';\r\n const runningGameInstancesForFriendsJoinServerPath =\r\n '.rbx-friends-game-server-item .rbx-friends-game-server-join';\r\n const gameInstancesForVipServersSectionPath = '#game-instances';\r\n const gameInstancesForVipJoinServerPath =\r\n '#rbx-vip-servers .rbx-vip-server-item .rbx-vip-server-join';\r\n const eventsToWatch = 'click';\r\n\r\n // Generic visit buttons - game detail\r\n $('body').on(\r\n eventsToWatch,\r\n '.VisitButtonPlay, .VisitButtonPlayGLI',\r\n function() {\r\n let context;\r\n const currentElement = $(this);\r\n if (\r\n currentElement.hasClass('VisitButtonPlay') ||\r\n currentElement.hasClass('VisitButtonPlayGLI')\r\n ) {\r\n context = 'PlayButton';\r\n }\r\n if (context) {\r\n const placeId = $(this).attr('placeid');\r\n const universeId = $(this).data('universe-id');\r\n const userId = $(this).data('user-id');\r\n const originator = $(this).data('originator-type');\r\n const originatorId = $(this).data('originator-id');\r\n\r\n if (originator === 'GameUpdateNotification') {\r\n $.ajax({\r\n url: `${\r\n EnvironmentUrls.notificationApi\r\n }/v2/stream-notifications/game-update-notification-interacted`,\r\n type: 'POST',\r\n data: {\r\n universeId,\r\n createdOn: new Date(originatorId),\r\n interactionType: 'Played',\r\n currentUserId: userId\r\n }\r\n });\r\n }\r\n\r\n const referrerId = UrlParser\r\n ? UrlParser.getParameterValueByName('rbxp')\r\n : null;\r\n GamePlayEvents.SendGamePlayIntent(context, placeId, referrerId);\r\n }\r\n }\r\n );\r\n\r\n // Generic edit/build buttons - profile or game detail\r\n $('body').on(\r\n eventsToWatch,\r\n '.VisitButtonEdit, .VisitButtonEditGLI',\r\n function() {\r\n const placeId = $(this).attr('placeid');\r\n GamePlayEvents.SendDevelopIntent('Edit', placeId);\r\n }\r\n );\r\n\r\n // Game detail page join instance from all running games\r\n $(allRunningGameInstancesSectionPath).on(\r\n eventsToWatch,\r\n allrunningGameInstancesJoinServerPath,\r\n function() {\r\n const placeId = $(this).data('placeid');\r\n if (placeId) {\r\n GamePlayEvents.SendGamePlayIntent('JoinInstance', placeId);\r\n }\r\n }\r\n );\r\n\r\n // Game detail page join instance from running games that contain friends\r\n $(runningGameInstancesForFriendsSectionPath).on(\r\n eventsToWatch,\r\n runningGameInstancesForFriendsJoinServerPath,\r\n function() {\r\n const placeId = $(this).data('placeid');\r\n if (placeId) {\r\n GamePlayEvents.SendGamePlayIntent('JoinInstance', placeId);\r\n }\r\n }\r\n );\r\n\r\n // Game detail page join VIPS\r\n $(gameInstancesForVipServersSectionPath).on(\r\n eventsToWatch,\r\n gameInstancesForVipJoinServerPath,\r\n function() {\r\n const placeId = $(this).data('placeid');\r\n if (placeId) {\r\n GamePlayEvents.SendGamePlayIntent('PrivateServer', placeId);\r\n }\r\n }\r\n );\r\n\r\n // Develop page click edit\r\n $('#build-page').on(eventsToWatch, '.roblox-edit-button', function() {\r\n const tbl = $(this).parents('table.item-table');\r\n const placeId = tbl.data('rootplace-id') || tbl.data('item-id');\r\n if (placeId) {\r\n GamePlayEvents.SendDevelopIntent('Edit', placeId);\r\n }\r\n });\r\n}\r\n\r\n// call this in entry file later.\r\nexport default attachHandlers;\r\n","import $ from 'jquery';\r\nimport { DeviceMeta } from 'Roblox';\r\nimport AppHybridClientInterface from './win10/appHybridClientInterface';\r\nimport AuthenticationChecker from './authenticationChecker';\r\nimport BCUpsellModalInterface from './bcUpsellModalInterface';\r\nimport GameLauncher from './gameLauncher';\r\nimport GameLaunchLogger from './gameLaunchLogger';\r\nimport GamePlayEvents from './gamePlayEvents';\r\nimport GamePlayEventsHandlers from './gamePlayEventsHandlers';\r\nimport PrerollPlayer from './prerollPlayer';\r\nimport ProtocolHandlerClientInterface from './protocolHandlerClientInterface';\r\nimport VideoPreRollDFP from './videoPreRollDFP';\r\n\r\n// shim all the things that are available globally for backwards compatibility;\r\nif (!window.Roblox) {\r\n window.Roblox = {};\r\n}\r\n\r\nObject.assign(window.Roblox, {\r\n AuthenticationChecker,\r\n BCUpsellModalInterface,\r\n GameLauncher,\r\n GameLaunchLogger,\r\n GamePlayEvents,\r\n PrerollPlayer,\r\n ProtocolHandlerClientInterface,\r\n VideoPreRollDFP\r\n});\r\n\r\n$(document).ready(() => {\r\n GamePlayEventsHandlers();\r\n const device = DeviceMeta();\r\n if (device.isUWPApp) {\r\n window.Roblox.AppHybridClientInterface = AppHybridClientInterface;\r\n GameLauncher.setGameLaunchInterface(AppHybridClientInterface);\r\n }\r\n GameLauncher.setGameLaunchLogger(GameLaunchLogger);\r\n});\r\n"],"sourceRoot":""}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement