├── bot
├── src
│ ├── app
│ │ ├── version.js
│ │ ├── actions
│ │ │ ├── drawer.js
│ │ │ ├── notification.js
│ │ │ ├── menu.js
│ │ │ ├── atc.js
│ │ │ └── profiles.js
│ │ ├── constants
│ │ │ ├── Menus.js
│ │ │ ├── ActionTypes.js
│ │ │ ├── Styles.js
│ │ │ └── Utils.js
│ │ ├── reducers
│ │ │ ├── index.js
│ │ │ ├── drawer.js
│ │ │ ├── notification.js
│ │ │ ├── menu.js
│ │ │ ├── atc.js
│ │ │ └── profiles.js
│ │ ├── components
│ │ │ ├── FileInput.jsx
│ │ │ ├── shops
│ │ │ │ └── supreme
│ │ │ │ │ ├── pages
│ │ │ │ │ ├── DropProducts.jsx
│ │ │ │ │ ├── Products.jsx
│ │ │ │ │ ├── Drops.jsx
│ │ │ │ │ ├── Restocks.jsx
│ │ │ │ │ ├── Billing.jsx
│ │ │ │ │ ├── Sizes.jsx
│ │ │ │ │ ├── Atc.jsx
│ │ │ │ │ └── Options.jsx
│ │ │ │ │ ├── LocalChangeSelect.jsx
│ │ │ │ │ ├── Configuration.jsx
│ │ │ │ │ ├── ProductList.jsx
│ │ │ │ │ └── AtcCreateForm.jsx
│ │ │ ├── NotificationBar.jsx
│ │ │ ├── ProfileToggle.jsx
│ │ │ ├── ProfileImportForm.jsx
│ │ │ ├── ProfileExportForm.jsx
│ │ │ ├── ProfileCreateForm.jsx
│ │ │ └── Profile.jsx
│ │ ├── index.hbs
│ │ ├── migrations.js
│ │ ├── utils
│ │ │ ├── Helpers.js
│ │ │ ├── SupremeUtils.js
│ │ │ ├── FuzzyStringMatcher.js
│ │ │ └── FormValidators.js
│ │ ├── routes.jsx
│ │ ├── containers
│ │ │ ├── App.jsx
│ │ │ ├── Layout.jsx
│ │ │ └── AppDrawer.jsx
│ │ └── index.jsx
│ ├── assets
│ │ ├── img
│ │ │ ├── icon.png
│ │ │ ├── icon128.png
│ │ │ ├── icon16.png
│ │ │ ├── icon32.png
│ │ │ └── icon48.png
│ │ ├── fonts
│ │ │ ├── roboto-v15-latin-300.eot
│ │ │ ├── roboto-v15-latin-300.woff
│ │ │ ├── roboto-v15-latin-500.eot
│ │ │ ├── roboto-v15-latin-500.woff
│ │ │ ├── roboto-v15-latin-300.woff2
│ │ │ ├── roboto-v15-latin-500.woff2
│ │ │ ├── roboto-v15-latin-regular.eot
│ │ │ ├── roboto-v15-latin-regular.woff
│ │ │ └── roboto-v15-latin-regular.woff2
│ │ └── css
│ │ │ └── main.css
│ ├── extension
│ │ ├── content
│ │ │ ├── supreme
│ │ │ │ ├── processors
│ │ │ │ │ ├── baseProcessor.js
│ │ │ │ │ ├── checkoutProcessor.js
│ │ │ │ │ ├── cartProcessor.js
│ │ │ │ │ ├── atcProcessor.js
│ │ │ │ │ └── productProcessor.js
│ │ │ │ ├── index.js
│ │ │ │ ├── notification.js
│ │ │ │ ├── SupremeManager.js
│ │ │ │ └── helpers.js
│ │ │ └── index.js
│ │ └── background
│ │ │ ├── supreme
│ │ │ ├── RestockMonitor.js
│ │ │ └── index.js
│ │ │ └── index.js
│ ├── services
│ │ ├── CryptoService.js
│ │ ├── KeywordsService.js
│ │ ├── supreme
│ │ │ ├── RestocksService.js
│ │ │ ├── DropsService.js
│ │ │ ├── ProductsService.js
│ │ │ ├── AtcService.js
│ │ │ └── CheckoutService.js
│ │ ├── ChromeService.js
│ │ └── StorageService.js
│ └── preload
│ │ └── index.js
├── .flowconfig
├── .babelrc
├── .eslintrc.js
├── .editorconfig
├── manifest.json
├── package.json
├── webpack.config.js
├── webpack.config.prod.js
└── test
│ └── keywordmatcher.test.js
├── atc.gif
├── .gitignore
├── screenshot.jpg
└── README.md
/bot/src/app/version.js:
--------------------------------------------------------------------------------
1 | export default '2.10.1';
2 |
--------------------------------------------------------------------------------
/atc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/atc.gif
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | **/node_modules
3 | .vscode
4 | .expo
5 | bot/build
6 | bot/build.zip
--------------------------------------------------------------------------------
/screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/screenshot.jpg
--------------------------------------------------------------------------------
/bot/.flowconfig:
--------------------------------------------------------------------------------
1 | [ignore]
2 |
3 | [include]
4 |
5 | [libs]
6 |
7 | [lints]
8 |
9 | [options]
10 |
--------------------------------------------------------------------------------
/bot/src/assets/img/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/img/icon.png
--------------------------------------------------------------------------------
/bot/src/assets/img/icon128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/img/icon128.png
--------------------------------------------------------------------------------
/bot/src/assets/img/icon16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/img/icon16.png
--------------------------------------------------------------------------------
/bot/src/assets/img/icon32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/img/icon32.png
--------------------------------------------------------------------------------
/bot/src/assets/img/icon48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/img/icon48.png
--------------------------------------------------------------------------------
/bot/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["flow", "react", "es2015", "es2017"],
3 | "plugins": ["transform-object-rest-spread", "transform-runtime"],
4 | }
5 |
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-300.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-300.eot
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-300.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-300.woff
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-500.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-500.eot
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-500.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-500.woff
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-300.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-300.woff2
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-500.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-500.woff2
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-regular.eot
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-regular.woff
--------------------------------------------------------------------------------
/bot/src/assets/fonts/roboto-v15-latin-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YungVDev/Supreme-Auto-Checkout/HEAD/bot/src/assets/fonts/roboto-v15-latin-regular.woff2
--------------------------------------------------------------------------------
/bot/src/app/actions/drawer.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/ActionTypes';
2 |
3 | export function setDrawerOpen(open) {
4 | return {
5 | type: types.DRAWER_SET_OPEN,
6 | open
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/bot/src/app/actions/notification.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/ActionTypes';
2 |
3 | export default function addNotification(message) {
4 | return {
5 | type: types.NOTIFICATION_ADD,
6 | message,
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/bot/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "extends": "airbnb",
3 | "plugins": [
4 | "react",
5 | "jsx-a11y",
6 | "import"
7 | ],
8 | "env": {
9 | "browser": true
10 | }
11 | };
12 |
--------------------------------------------------------------------------------
/bot/src/app/constants/Menus.js:
--------------------------------------------------------------------------------
1 | export const MENU_OPTIONS = 'Options';
2 | export const MENU_BILLING = 'Billing';
3 | export const MENU_SIZES = 'Sizes';
4 | export const MENU_ATC = 'AutoCop';
5 | export const MENU_PRODUCTS = 'Products';
6 |
--------------------------------------------------------------------------------
/bot/src/extension/content/supreme/processors/baseProcessor.js:
--------------------------------------------------------------------------------
1 | export default class BaseProcessor {
2 | constructor(preferences, sizings, billing) {
3 | this.preferences = preferences;
4 | this.sizings = sizings;
5 | this.billing = billing;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/bot/src/app/reducers/index.js:
--------------------------------------------------------------------------------
1 | export { default as menu } from './menu';
2 | export { default as notification } from './notification';
3 | export { default as profiles } from './profiles';
4 | export { default as atc } from './atc';
5 | export { default as drawer } from './drawer';
6 |
--------------------------------------------------------------------------------
/bot/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | charset = utf-8
7 | trim_trailing_whitespace = true
8 | insert_final_newline = true
9 | end_of_line = lf
10 | # editorconfig-tools is unable to ignore longs strings or urls
11 | max_line_length = null
12 |
--------------------------------------------------------------------------------
/bot/src/app/reducers/drawer.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/ActionTypes';
2 |
3 | export default function drawer(state = {
4 | open: true,
5 | }, action) {
6 | switch (action.type) {
7 | case types.DRAWER_SET_OPEN:
8 | return { open: action.open };
9 | default:
10 | return state;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/bot/src/app/reducers/notification.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/ActionTypes';
2 |
3 | export default function notification(state = {
4 | message: null,
5 | }, action) {
6 | switch (action.type) {
7 | case types.NOTIFICATION_ADD:
8 | return { message: action.message };
9 | default:
10 | return state;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/bot/src/services/CryptoService.js:
--------------------------------------------------------------------------------
1 | import CryptoJs from 'crypto-js';
2 |
3 | export default class CryptoService {
4 | static encrypt(message, passphrase) {
5 | return CryptoJs.AES.encrypt(message, passphrase);
6 | }
7 |
8 | static decrypt(message, password) {
9 | return CryptoJs.AES.decrypt(message, password).toString(CryptoJs.enc.Utf8);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/bot/src/extension/content/index.js:
--------------------------------------------------------------------------------
1 | import SupremeExtension from './supreme/index';
2 | import StorageService from '../../services/StorageService';
3 |
4 |
5 | async function start() {
6 | const profile = await StorageService.getCurrentProfileSettings();
7 | const supremeExtension = new SupremeExtension();
8 | supremeExtension.start(profile);
9 | }
10 |
11 | start();
12 |
--------------------------------------------------------------------------------
/bot/src/app/reducers/menu.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/ActionTypes';
2 |
3 | export default function menu(state = {
4 | currentMenu: null,
5 | }, action) {
6 | switch (action.type) {
7 | case types.CHANGE_MENU:
8 | return Object.assign({}, state, {
9 | currentMenu: action.menu,
10 | });
11 | default:
12 | return state;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/bot/src/app/actions/menu.js:
--------------------------------------------------------------------------------
1 | import * as types from '../constants/ActionTypes';
2 | import * as menus from '../constants/Menus';
3 |
4 | export function changeMenu(newMenu) {
5 | const keys = Object.keys(menus).map(x => menus[x]);
6 | if (keys.indexOf(newMenu) !== -1) {
7 | return { type: types.CHANGE_MENU, menu: newMenu };
8 | }
9 | throw new Error(`Invalid menu : ${newMenu}`);
10 | }
11 |
--------------------------------------------------------------------------------
/bot/src/extension/content/supreme/index.js:
--------------------------------------------------------------------------------
1 | import SupremeManager from './SupremeManager';
2 | import { notify } from './notification';
3 |
4 | export default class SupremeExtension {
5 | start(profile) {
6 | if (!profile || !profile.Supreme) {
7 | notify('No profile configured', true);
8 | return;
9 | }
10 | const settings = profile.Supreme;
11 | const manager = new SupremeManager(settings.Options, settings.Sizes, settings.Billing);
12 | manager.start();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/bot/src/preload/index.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | function injectScript() {
4 | const script = document.createElement('script');
5 | script.setAttribute('type', 'text/javascript');
6 | script.innerText = `
7 | window.document.mockedQuerySelector = document.querySelector;
8 | window.document.mockedQuerySelectorAll = document.querySelectorAll;
9 | `;
10 | document.body.appendChild(script);
11 | }
12 |
13 | document.addEventListener('DOMContentLoaded', function(event) {
14 | injectScript();
15 | });
16 |
--------------------------------------------------------------------------------
/bot/src/app/components/FileInput.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export default class FileInput extends React.Component {
4 | constructor(props) {
5 | super(props);
6 | this.onChange = this.onChange.bind(this);
7 | }
8 |
9 | onChange(e) {
10 | const { input: { onChange } } = this.props;
11 | onChange(e.target.files[0]);
12 | }
13 |
14 | render() {
15 | return ();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/bot/src/app/constants/ActionTypes.js:
--------------------------------------------------------------------------------
1 | export const CHANGE_MENU = 'CHANGE_MENU';
2 | export const NOTIFICATION_ADD = 'NOTIFICATION_ADD';
3 | export const PROFILE_CREATE = 'PROFILE_CREATE';
4 | export const PROFILE_UPDATE_SETTINGS = 'PROFILE_UPDATE_SETTINGS';
5 | export const PROFILE_REMOVE = 'PROFILE_REMOVE';
6 | export const PROFILE_SET_ENABLED = 'PROFILE_SET_ENABLED';
7 | export const ATC_PRODUCT_ADD = 'ATC_PRODUCT_ADD';
8 | export const ATC_PRODUCT_REMOVE = 'ATC_PRODUCT_REMOVE';
9 | export const ATC_PRODUCT_EDIT = 'ATC_PRODUCT_EDIT';
10 | export const DRAWER_SET_OPEN = 'DRAWER_SET_OPEN';
11 |
--------------------------------------------------------------------------------
/bot/src/app/components/shops/supreme/pages/DropProducts.jsx:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import DropsService from '../../../../../services/supreme/DropsService';
3 | import ProductList from '../ProductList';
4 |
5 | export default class DropProducts extends Component {
6 | constructor(props) {
7 | super(props);
8 | this.state = {
9 | products: null,
10 | };
11 |
12 | DropsService.fetchProducts(props.params.slug).then(products => this.setState({ products }));
13 | }
14 |
15 | render() {
16 | return (
17 |
Click on a product to buy
43 |{ drop.name }
42 |Loading...
61 |No restocks yet
72 | } 73 | {items.length > 0 && ( 74 |74 | {product.name} 75 | {product.color &&
{product.color}
} 76 | 77 |Est price: {product.price}
} 82 |Loading...
96 |Click on a product to add to AutoCop
} 127 |Configure your billing infos
46 |Configure your desired sizes
27 |Create, import or export profiles to manage your different configurations.
194 |Note: AutoCop products are independent of profiles.
195 |Each product you add will be automatically added to your cart by the AutoCop once the timer reaches its end.
156 |Click 'Run now' to manually trigger AutoCop for a single product
157 |Configure options and features of the bot
70 |ATC Product description is only used to differentiate different ATC products, it doesn't have any effect on the Autocop process.
143 |Keywords is the most important information to find a product for Autocop, make sure to add detailed keywords. For example for a Box Logo add the following keywords: box, logo, hoodie.
144 |You can also add negative keywords by prepending a "!" to a keyword, for example the keywords "box logo !longsleeve tee" will match a product like "Box Logo Tee" but not "Box Logo Longsleeve tee"
145 |If you do not select a size, AutoCop will choose the size you selected in the "Sizings" tab.
146 | {this.state.matchedProducts.length > 0 && (147 | Warning! Your keywords already matches with the following products from the store, click on the bin to ignore unwanted products: 148 |
166 | Warning! Your keywords matches with multiple products from the incoming drop, click on the bin to ignore unwanted products: 167 |
The keywords will match the following product from the incoming drop:
187 |