Last active
October 28, 2025 03:02
-
-
Save RyanGarber/967b7aef129194116829adf62abe66bb to your computer and use it in GitHub Desktop.
A-to-Z Shift Stealer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name A-to-Z Shift Stealer | |
| // @match *://*.amazon.work/* | |
| // @version 1.0 | |
| // ==/UserScript== | |
| // I created this in 2024 while working as a Flex-Time Amazon employee. | |
| // The session keepalive and auto-login no longer works, I know that. | |
| // The rest should still work. | |
| // Config | |
| const CREDENTIALS = ["username", "password"]; | |
| const EMPLOYEE_ID = 12345678; | |
| const DESIRED_SHIFTS = ["12:30am-5:15am", "2:00am-5:15am", "7:45am-10:15am"]; | |
| const DESIRED_SPECIAL_ROLES = ["Associate TDR"]; | |
| const EXCLUDE_DATES = []; | |
| const EXCLUDE_DAYS = []; | |
| const DEBUG_LOGS = true; | |
| const DEBUG_API_CALLS = false; | |
| const POLLING_RATE = [500, 1000]; | |
| const RETRY_POLL_AFTER = 600000; | |
| // Helpers | |
| function log(...data) { | |
| unsafeWindow.console.log("[SS]", ...data); | |
| } | |
| function debug(...data) { | |
| if (DEBUG_LOGS) { | |
| log(...data); | |
| } | |
| } | |
| function getTime(date) { | |
| const pm = date.getHours() >= 12; | |
| const hours = (date.getHours() - (pm ? 12 : 0)); | |
| const minutes = (date.getMinutes() < 10 ? "0" : "") + date.getMinutes(); | |
| return (hours === 0 ? 12 : hours) + ":" + minutes + (pm ? "pm" : "am"); | |
| } | |
| function getShiftInfo(shift) { | |
| const added = ["DROP", "VOLUNTARY_TIME_OFF"].includes(shift.type); | |
| const start = new Date(shift.shift.timeRange.start); | |
| const end = new Date(shift.shift.timeRange.end); | |
| return { | |
| added: added, | |
| eligible: (!added && shift.eligibility.isEligible) || DEBUG_API_CALLS, | |
| day: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][start.getDay()], | |
| date: (start.getMonth() + 1) + "/" + start.getDate(), | |
| time: getTime(start) + "-" + getTime(end) | |
| }; | |
| } | |
| function getRequest(string) { | |
| const alphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"; | |
| let id = ''; | |
| for (let i = 0; i < 21; i++) { | |
| id += alphabet[(Math.random() * 64) | 0]; | |
| } | |
| return { | |
| "credentials": "include", | |
| "headers": { | |
| "Accept": "*/*", | |
| "Accept-Language": "en-US,en;q=0.5", | |
| "content-type": "application/json", | |
| "x-atoz-client-id": "SCHEDULE_MANAGEMENT_SERVICE", | |
| "x-atoz-client-request-id": id, | |
| "Sec-Fetch-Dest": "empty", | |
| "Sec-Fetch-Mode": "cors", | |
| "Sec-Fetch-Site": "same-site" | |
| }, | |
| "referrer": "https://atoz.amazon.work/", | |
| "body": string, | |
| "method": "POST", | |
| "mode": "cors" | |
| }; | |
| } | |
| function getSpecialRoleAvailable(shifts, baseShift) { | |
| const { date: baseShiftDate, time: baseShiftTime } = getShiftInfo(baseShift); | |
| for (const shift of shifts) { | |
| const { eligible, date, time } = getShiftInfo(shift); | |
| if (eligible && date === baseShiftDate && time === baseShiftTime && DESIRED_SPECIAL_ROLES.includes(shift.skill)) { | |
| if (!DESIRED_SPECIAL_ROLES.includes(baseShift.skill)) { | |
| return shift; | |
| } | |
| } | |
| } | |
| return null; | |
| } | |
| // Login | |
| setInterval(function() { | |
| if (unsafeWindow.location.href.indexOf('idp.amazon.work') !== -1) { | |
| let loginForm = false; | |
| try { if(document.getElementById('loginForm') !== null) { loginForm = true; } } catch { } | |
| if (loginForm) { | |
| log("Detected login page..."); | |
| document.getElementById('login').value = CREDENTIALS[0]; | |
| document.getElementById('password').value = CREDENTIALS[1]; | |
| document.getElementById('loginForm').submit(); | |
| } | |
| else { | |
| let buttons = document.getElementsByClassName("btn-primary"); | |
| if (buttons.length > 0) { buttons[0].click(); } | |
| } | |
| } | |
| }, 10000); | |
| // Shifts | |
| const container = document.createElement('div'); | |
| container.style = "width: 100%; text-align: center; padding: 20px 0"; | |
| document.getElementById('main-content').prepend(container); | |
| // State Display | |
| const state = document.createElement('div'); | |
| container.prepend(state); | |
| let lastUpdate = Date.now(); | |
| let ellipses = ''; | |
| const updateState = function(shifts) { | |
| lastUpdate = Date.now(); | |
| state.innerHTML = "<strong>Added shifts: " + shifts.length + "<strong>"; | |
| if (shifts.length > 0) { | |
| const { date, time } = getShiftInfo(shifts[0]); | |
| state.innerHTML += "<br>Next shift: " + date + " " + time; | |
| } | |
| ellipses = (ellipses.length === 3 ? '' : ellipses + '.'); | |
| state.innerHTML += "<br><br><small>Running" + ellipses + "</small>"; | |
| }; | |
| // Notification Display | |
| let notify = false; | |
| const audio = document.createElement('audio'); | |
| audio.src = "https://cdn.pixabay.com/download/audio/2021/08/04/audio_bb630cc098.mp3"; | |
| audio.preload = "auto"; | |
| const notified = document.createElement('button'); | |
| notified.innerText = 'Got it!'; | |
| notified.onclick = function() { notify = false; }; | |
| container.prepend(notified); | |
| setInterval(function() { | |
| if (notify) { audio.play(); } | |
| notified.style = "display: " + (notify ? "inline" : "none"); | |
| }, 500); | |
| // Shift Stealer | |
| const getShifts = async function() { | |
| const startDate = new Date(); | |
| startDate.setHours(0, 0, 0, 0); | |
| const endDate = new Date(startDate); | |
| endDate.setDate(endDate.getDate() + 7); | |
| endDate.setHours(23, 59, 59, 999); | |
| const findResponse = await fetch( | |
| "https://atoz-api-us-east-1.amazon.work/graphql?employeeId=" + EMPLOYEE_ID, | |
| getRequest("{\"operationName\":\"FindShiftsPage\",\"variables\":{\"associateSiteId\":\"WCH2\",\"canFetchPayBreakdown\":false,\"canFetchSwapRequests\":false,\"scheduleTimeRange\":{\"start\":\"2024-02-21T05:00:00.000Z\",\"end\":\"2024-05-02T03:59:59.999Z\"},\"timeRange\":{\"start\":\"" + startDate.toISOString() + "\",\"end\":\"" + endDate.toISOString() + "\"},\"filter\":{\"includeIneligible\":true,\"unavailableReasonsToInclude\":[\"AssociateAccepted\",\"ShiftOpportunityCapacityMet\",\"ShiftOpportunityExpired\"]},\"opportunityTypes\":{\"types\":[\"DROP\",\"VOLUNTARY_TIME_OFF\",\"ADD\",\"VOLUNTARY_EXTRA_TIME\"]},\"swapRequestsInput\":{\"swapFromTimeRange\":{\"start\":\"2024-02-21T05:00:00.000Z\",\"end\":\"2024-05-02T03:59:59.999Z\"}}},\"query\":\"query FindShiftsPage($timeRange: DateTimeRangeInput!, $scheduleTimeRange: DateTimeRangeInput!, $swapRequestsInput: SwapRequestsInput!, $filter: ShiftOpportunitiesFilter, $opportunityTypes: TypeFilter!, $associateSiteId: ID = \\\"\\\", $canFetchPayBreakdown: Boolean = false, $canFetchSwapRequests: Boolean = false) {\\n shiftOpportunities(timeRange: $timeRange, filter: $filter) {\\n opportunities(opportunityTypes: $opportunityTypes) {\\n id\\n type\\n ...OpportunityCardList_ShiftOpportunity\\n ...FilteredShifts_ShiftOpportunity\\n ...ShiftsPerDay_ShiftOpportunities\\n ...ShiftFilters_ShiftOpportunity\\n __typename\\n }\\n __typename\\n }\\n schedule(timeRange: $scheduleTimeRange) {\\n scheduleShifts {\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n ...ShiftsPerDay_ScheduleShift\\n __typename\\n }\\n __typename\\n }\\n swapConfigurationForSite(siteId: $associateSiteId) {\\n ...ShiftsPerDay_SiteSwapConfiguration\\n __typename\\n }\\n swaps(siteId: $associateSiteId) @skip(if: $canFetchSwapRequests) {\\n ...ShiftsPerDay_Swaps\\n __typename\\n }\\n swapRequests(input: $swapRequestsInput) @include(if: $canFetchSwapRequests) {\\n ...ShiftsPerDay_SwapRequests\\n __typename\\n }\\n}\\n\\nfragment OpportunityCardList_ShiftOpportunity on ShiftOpportunity {\\n ...OpportunityFlowModal_ShiftOpportunity\\n ...OpportunityCard_ShiftOpportunity\\n __typename\\n}\\n\\nfragment OpportunityFlowModal_ShiftOpportunity on ShiftOpportunity {\\n ...UseAddOpportunityModalContentData_ShiftOpportunity\\n ...UseShiftDetailsModalContentData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseAddOpportunityModalContentData_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n dropDeadline\\n penaltyStartTime\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n incentivePay {\\n payModifiers {\\n applicableNetAmount {\\n amount\\n code\\n __typename\\n }\\n category\\n hourlyAdditionalCompensation {\\n amount\\n code\\n __typename\\n }\\n name\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UseShiftDetailsModalContentData_Shift\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n ...UseShiftDetailsCardData_ShiftOpportunity\\n ...UseShiftPayLinkData_ShiftOpportunity\\n ...UseShiftPayBreakdownData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_Shift on Shift {\\n site {\\n specialInstructions\\n __typename\\n }\\n ...UseShiftDetailsCardData_Shift\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_Shift on Shift {\\n id\\n timeRange {\\n start\\n __typename\\n }\\n site {\\n address\\n __typename\\n }\\n ...UseShiftInfoData_Shift\\n __typename\\n}\\n\\nfragment UseShiftInfoData_Shift on Shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n site {\\n id\\n address\\n lineOfBusiness\\n name\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UseShiftDetailsCardData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftDetailsCardData_PayBreakdown\\n __typename\\n }\\n ...UseShiftInfoData_ShiftOpportunity\\n ...UseVtoAvailableCardData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_PayBreakdown on PayBreakdown {\\n ...UseShiftInfoData_PayBreakdown\\n __typename\\n}\\n\\nfragment UseShiftInfoData_PayBreakdown on PayBreakdown {\\n summary {\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftInfoData_ShiftOpportunity on ShiftOpportunity {\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shift {\\n ...UseShiftInfoData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftInfoData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseVtoAvailableCardData_ShiftOpportunity on ShiftOpportunity {\\n id\\n shift {\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n ...useAcceptVto_ShiftOpportunity\\n __typename\\n}\\n\\nfragment useAcceptVto_ShiftOpportunity on ShiftOpportunity {\\n id\\n ...UseAcceptVtoSuccessData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseAcceptVtoSuccessData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayLinkData_ShiftOpportunity on ShiftOpportunity {\\n incentivePay {\\n ...UseShiftPayLinkData_IncentivePay\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayLinkData_IncentivePay on IncentivePay {\\n netPayModifier {\\n code\\n amount\\n __typename\\n }\\n payModifiers {\\n category\\n applicableNetAmount {\\n code\\n amount\\n __typename\\n }\\n hourlyAdditionalCompensation {\\n code\\n amount\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_ShiftOpportunity on ShiftOpportunity {\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftPayBreakdownData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_PayBreakdown on PayBreakdown {\\n base {\\n ...UseShiftPayBreakdownData_BreakdownRange\\n __typename\\n }\\n shiftDifferential {\\n ...UseShiftPayBreakdownData_BreakdownRange\\n __typename\\n }\\n premiums {\\n ...UseShiftPayBreakdownData_BreakdownRange\\n __typename\\n }\\n summary {\\n ...UseShiftPayBreakdownData_BreakdownSummary\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_BreakdownRange on BreakdownRange {\\n category\\n hourlyCompensation {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n durationRange {\\n min {\\n value\\n __typename\\n }\\n max {\\n value\\n __typename\\n }\\n __typename\\n }\\n totalCompensationRange {\\n min {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n max {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_Currency on Currency {\\n amount\\n code\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_BreakdownSummary on BreakdownSummary {\\n totalShiftPayRange {\\n min {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n max {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n hourlyShiftRateRange {\\n min {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n max {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment OpportunityCard_ShiftOpportunity on ShiftOpportunity {\\n type\\n dropDeadline\\n penaltyStartTime\\n eligibility {\\n isEligible\\n unclaimableReasonCodes\\n __typename\\n }\\n shift {\\n id\\n ...UseShiftInfoData_Shift\\n __typename\\n }\\n incentivePay {\\n payModifiers {\\n applicableNetAmount {\\n amount\\n code\\n __typename\\n }\\n category\\n hourlyAdditionalCompensation {\\n amount\\n code\\n __typename\\n }\\n name\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n ...UsePayLabelData_ShiftOpportunity\\n ...UseShiftInfoData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UsePayLabelData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UsePayLabelData_Shift\\n __typename\\n }\\n incentivePay {\\n ...UsePayLabelData_IncentivePay\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UsePayLabelData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_Shift on Shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_IncentivePay on IncentivePay {\\n netPayModifier {\\n amount\\n code\\n __typename\\n }\\n payModifiers {\\n applicableNetAmount {\\n code\\n amount\\n __typename\\n }\\n category\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_PayBreakdown on PayBreakdown {\\n summary {\\n hourlyShiftRateRange {\\n min {\\n amount\\n code\\n __typename\\n }\\n max {\\n amount\\n code\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n premiums {\\n category\\n __typename\\n }\\n __typename\\n}\\n\\nfragment FilteredShifts_ShiftOpportunity on ShiftOpportunity {\\n type\\n shift {\\n site {\\n id\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n eligibility {\\n isEligible\\n unclaimableReasonCodes\\n __typename\\n }\\n incentivePay {\\n netPayModifier {\\n code\\n __typename\\n }\\n payModifiers {\\n name\\n __typename\\n }\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n premiums {\\n category\\n __typename\\n }\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftsPerDay_ShiftOpportunities on ShiftOpportunity {\\n ...ShiftFlowModal_ShiftOpportunities\\n ...ShiftCard_ShiftOpportunities\\n __typename\\n}\\n\\nfragment ShiftFlowModal_ShiftOpportunities on ShiftOpportunity {\\n id\\n type\\n addDeadline\\n shift {\\n ...ShiftFlowModal_Shift\\n __typename\\n }\\n ...UseDropShiftModalContentData_ShiftOpportunity\\n ...UseShiftDetailsModalBannersData_ShiftOpportunity\\n ...UseShiftDetailsModalContentData_ShiftOpportunities\\n ...UseSelectVtoModalContentData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment ShiftFlowModal_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseDropShiftModalContentData_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n penaltyStartTime\\n dropDeadline\\n shift {\\n id\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_ShiftOpportunity on ShiftOpportunity {\\n ...UseShiftDetailsModalScheduledBannersData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n shift {\\n ...UseShiftDetailsModalScheduledBannersData_Shift\\n __typename\\n }\\n ...UseScheduledShiftStatus_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n addDeadline\\n shift {\\n ...UseScheduledShiftStatus_Shift\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_ShiftOpportunities on ShiftOpportunity {\\n ...UseShiftDetailsModalContentData_ShiftOpportunity\\n ...UseShiftDetailsCardData_ShiftOpportunities\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_ShiftOpportunities on ShiftOpportunity {\\n ...UseShiftDetailsCardData_ShiftOpportunity\\n ...UseVtoAvailableCardData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseSelectVtoModalContentData_ShiftOpportunity on ShiftOpportunity {\\n id\\n shift {\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n type\\n ...useAcceptVto_ShiftOpportunity\\n __typename\\n}\\n\\nfragment ShiftCard_ShiftOpportunities on ShiftOpportunity {\\n id\\n type\\n penaltyStartTime\\n shift {\\n id\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n ...ShiftCard_Shift\\n __typename\\n }\\n eligibility {\\n isEligible\\n __typename\\n }\\n unavailability {\\n reasons\\n __typename\\n }\\n ...UseShiftCardStatusData_ShiftOpportunity\\n ...UseShiftInfoData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment ShiftCard_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_ShiftOpportunity on ShiftOpportunity {\\n ...UseShiftCardScheduledStatusData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UseShiftCardScheduledStatusData_Shift\\n __typename\\n }\\n ...UseScheduledShiftStatus_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_Shift on Shift {\\n id\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftFilters_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n site {\\n id\\n name\\n __typename\\n }\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftsPerDay_ScheduleShift on ScheduleShift {\\n ...ShiftCard_ScheduleShift\\n ...ShiftFlowModal_ScheduleShift\\n __typename\\n}\\n\\nfragment ShiftCard_ScheduleShift on ScheduleShift {\\n shift {\\n ...ShiftCard_Shift\\n __typename\\n }\\n incentivePay {\\n payModifiers {\\n category\\n __typename\\n }\\n __typename\\n }\\n shiftIntervals {\\n ...UseShiftIntervalListData_ShiftInterval\\n __typename\\n }\\n ...UseShiftInfoData_ScheduleShift\\n ...UseSwapButtons_ScheduleShift\\n ...UsePayLabelData_ScheduleShift\\n ...UseShiftCardStatusData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftIntervalListData_ShiftInterval on ShiftInterval {\\n ...UseShiftIntervalBlockData_ShiftInterval\\n __typename\\n}\\n\\nfragment UseShiftIntervalBlockData_ShiftInterval on ShiftInterval {\\n category\\n name {\\n defaultText\\n namespace\\n translationKey\\n __typename\\n }\\n skill {\\n defaultText\\n namespace\\n translationKey\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftInfoData_ScheduleShift on ScheduleShift {\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shift {\\n ...UseShiftInfoData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftInfoData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseSwapButtons_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UsePayLabelData_Shift\\n __typename\\n }\\n incentivePay {\\n ...UsePayLabelData_IncentivePay\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UsePayLabelData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n end\\n __typename\\n }\\n __typename\\n }\\n ...UseShiftCardScheduledStatusData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_ScheduleShift on ScheduleShift {\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n ...UseScheduledShiftStatus_ScheduleShift\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseScheduledShiftStatus_Shift\\n __typename\\n }\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftFlowModal_ScheduleShift on ScheduleShift {\\n shift {\\n ...ShiftFlowModal_Shift\\n __typename\\n }\\n ...UseShiftDetailsModalContentData_ScheduleShift\\n ...UseDropShiftModalContentData_ScheduleShift\\n ...UseLegacyCancelSwapRequestModalContentData_ScheduleShift\\n ...UseCancelSwapRequestModalSuccessData_ScheduleShift\\n ...UseShiftDetailsModalBannersData_ScheduleShift\\n ...UseAcceptVtoSuccessData_ScheduleShift\\n ...UseSwapButtons_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsModalContentData_Shift\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shiftIntervals {\\n ...UseShiftIntervalListData_ShiftInterval\\n __typename\\n }\\n ...UseShiftDetailsCardData_ScheduleShift\\n ...UseShiftPayLinkData_ScheduleShift\\n ...UseShiftPayBreakdownData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsCardData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftDetailsCardData_PayBreakdown\\n __typename\\n }\\n ...UseShiftInfoData_ScheduleShift\\n ...UseVtoAccepted_ScheduleShift\\n __typename\\n}\\n\\nfragment UseVtoAccepted_ScheduleShift on ScheduleShift {\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayLinkData_ScheduleShift on ScheduleShift {\\n incentivePay {\\n ...UseShiftPayLinkData_IncentivePay\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_ScheduleShift on ScheduleShift {\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftPayBreakdownData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseDropShiftModalContentData_ScheduleShift on ScheduleShift {\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseLegacyCancelSwapRequestModalContentData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseCancelSwapRequestModalSuccessData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsModalBannersData_Shift\\n __typename\\n }\\n ...UseShiftDetailsModalScheduledBannersData_ScheduleShift\\n ...UseShiftDetailsModalWorkedBannersData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_Shift on Shift {\\n timeRange {\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsModalScheduledBannersData_Shift\\n __typename\\n }\\n ...UseScheduledShiftStatus_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalWorkedBannersData_ScheduleShift on ScheduleShift {\\n ...UseWorkedShiftStatus_ScheduleShift\\n __typename\\n}\\n\\nfragment UseWorkedShiftStatus_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseWorkedShiftStatus_Shift\\n __typename\\n }\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseWorkedShiftStatus_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseAcceptVtoSuccessData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftsPerDay_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...ShiftFlowModal_SiteSwapConfiguration\\n ...ShiftCard_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment ShiftFlowModal_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseLegacyCancelSwapRequestModalContentData_SiteSwapConfiguration\\n ...UseShiftDetailsModalScheduledBannersData_SiteSwapConfiguration\\n ...UseSwapButtons_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseLegacyCancelSwapRequestModalContentData_SiteSwapConfiguration on SiteSwapConfiguration {\\n siteId\\n swapEnabled\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseScheduledShiftStatus_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_SiteSwapConfiguration on SiteSwapConfiguration {\\n swapEnabled\\n __typename\\n}\\n\\nfragment UseSwapButtons_SiteSwapConfiguration on SiteSwapConfiguration {\\n swapEnabled\\n swapRequestBoundaries {\\n start\\n end\\n __typename\\n }\\n blockedDates\\n swapOutRestriction {\\n restrictedDaysOfWeek\\n restrictionForNumberOfWeeks\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftCard_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseSwapButtons_SiteSwapConfiguration\\n ...UseShiftCardStatusData_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseShiftCardScheduledStatusData_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseScheduledShiftStatus_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment ShiftsPerDay_Swaps on Swaps {\\n ...ShiftFlowModal_Swaps\\n ...ShiftCard_Swaps\\n __typename\\n}\\n\\nfragment ShiftFlowModal_Swaps on Swaps {\\n ...UseLegacyCancelSwapRequestModalContentData_Swaps\\n ...UseShiftDetailsModalBannersData_Swaps\\n ...UseSwapButtons_Swaps\\n __typename\\n}\\n\\nfragment UseLegacyCancelSwapRequestModalContentData_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_Swaps on Swaps {\\n ...UseShiftDetailsModalScheduledBannersData_Swaps\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n ...UseScheduledShiftStatus_Swaps\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseSwapButtons_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftCard_Swaps on Swaps {\\n ...UseSwapButtons_Swaps\\n ...UseShiftCardStatusData_Swaps\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_Swaps on Swaps {\\n ...UseShiftCardScheduledStatusData_Swaps\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_Swaps on Swaps {\\n ...UseScheduledShiftStatus_Swaps\\n __typename\\n}\\n\\nfragment ShiftsPerDay_SwapRequests on SwapRequests {\\n ...ShiftFlowModal_SwapRequests\\n ...ShiftCard_SwapRequests\\n __typename\\n}\\n\\nfragment ShiftFlowModal_SwapRequests on SwapRequests {\\n ...UseCancelSwapRequestModalContentData_SwapRequests\\n ...UseShiftDetailsModalBannersData_SwapRequests\\n ...UseSwapButtons_SwapRequests\\n __typename\\n}\\n\\nfragment UseCancelSwapRequestModalContentData_SwapRequests on SwapRequests {\\n swaps {\\n from {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n id\\n status\\n to {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_SwapRequests on SwapRequests {\\n ...UseShiftDetailsModalScheduledBannersData_SwapRequests\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_SwapRequests on SwapRequests {\\n ...UseScheduledShiftStatus_SwapRequests\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_SwapRequests on SwapRequests {\\n swaps {\\n from {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n id\\n status\\n to {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseSwapButtons_SwapRequests on SwapRequests {\\n swaps {\\n from {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n id\\n status\\n to {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftCard_SwapRequests on SwapRequests {\\n ...UseSwapButtons_SwapRequests\\n ...UseShiftCardStatusData_SwapRequests\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_SwapRequests on SwapRequests {\\n ...UseShiftCardScheduledStatusData_SwapRequests\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_SwapRequests on SwapRequests {\\n ...UseScheduledShiftStatus_SwapRequests\\n __typename\\n}\\n\"}") | |
| ); | |
| if (!findResponse.ok) { | |
| log("Error fetching shifts!", findResponse); | |
| setTimeout(getShifts, RETRY_POLL_AFTER); | |
| return; | |
| } | |
| const shifts = (await findResponse.json()).data.shiftOpportunities.opportunities; | |
| const addShift = async (id) => { | |
| debug("Attempting to add shift: '" + id + "'..."); | |
| if (!DEBUG_API_CALLS) { | |
| const addResponse = await fetch( | |
| "https://atoz-api-us-east-1.amazon.work/graphql?employeeId=" + EMPLOYEE_ID, | |
| getRequest("{\"operationName\":\"AddShift\",\"variables\":{\"shiftOpportunityId\":{\"shiftOpportunityId\":\"" + id + "\"}},\"query\":\"mutation AddShift($shiftOpportunityId: AddShiftInput!) {\\n addShift(input: $shiftOpportunityId)\\n}\\n\"}") | |
| ); | |
| if (!addResponse.ok) { | |
| log("Error adding shift!", addResponse); | |
| return false; | |
| } | |
| } | |
| notify = true; | |
| log("Shift added!"); | |
| return true; | |
| }; | |
| const addedShifts = []; | |
| for (const shift of shifts) { | |
| const { added, eligible, day, date, time } = getShiftInfo(shift); | |
| if (added) { | |
| addedShifts.push(shift); | |
| } | |
| if (eligible) { | |
| debug("Shift available: '" + shift.id + "'..."); | |
| if (!DESIRED_SHIFTS.includes(time)) { | |
| debug("Shift is not desired; continuing."); | |
| continue; | |
| } | |
| if (EXCLUDE_DATES.includes(date) || EXCLUDE_DAYS.includes(day)) { | |
| debug("Date or day of the week is excluded; continuing."); | |
| continue; | |
| } | |
| const specialRole = getSpecialRoleAvailable(shifts, shift); | |
| if (specialRole !== null) { | |
| debug("Special role is available; going for it."); | |
| addShift(specialRole.id); | |
| } | |
| await addShift(shift.id); | |
| } | |
| } | |
| updateState(addedShifts); | |
| setTimeout(getShifts, POLLING_RATE[0] + Math.floor(Math.random() * (POLLING_RATE[1] - POLLING_RATE[0]))); | |
| }; | |
| setInterval(function() { | |
| if (Date.now() - lastUpdate > 15000) { | |
| log("No update in 15 seconds; reloading page..."); | |
| unsafeWindow.location.reload(); | |
| lastUpdate = Date.now(); | |
| } | |
| }); | |
| // Init | |
| log("Started!"); | |
| unsafeWindow.set_session_refresh_always(); | |
| getShifts(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment