Giter Club home page Giter Club logo

dropbot's Introduction

Bear Stone Smart Home
DropBot

Watches Drops for you!

This Project is currently not maintained and will most likely not work!


@Zaarrg/DropBot issues @Zaarrg/DropBot pull requests Zaarrg/DropBot requests
Discord Discord


DropBot

๐Ÿค” What is this Drop Bot all about?

  • Makes your drop experience as easy as possible.
  • No need to watch the stream in a browser, fully uses gql.
  • No need to care about who is online and when.
  • Saves your session providing you autologin.
  • Can watch every Drop / Campaign available.
  • Automatically claims your Drops.
  • Switches automatically to other games or drops if drop is claimed/claimable or offline.

Disclaimer - DropBot is not intended for:

  • Mining channel points - it's about the drops only.
  • Mining anything else besides Twitch drops.
  • Unattended operation.
  • 100% uptime application, due to the underlying nature of it, expect fatal errors to happen every so often.
  • Being hosted on a remote server as a 24/7 bot.
  • Being used with more than one managed account.
  • Any form of automatic restart when an error happens.
  • Using it with more than one managed account.
  • Making it possible to mine campaigns that the managed account isn't linked to.
  • Anything that increases the site processing load caused by the application.
  • Mining campaigns the managed account isn't linked to.
  • Being associated in any way with Twitch

โšก Installation

Windows

  1. Download the windows executable from the build branch or release page.
  2. Move the executable to a folder.
  3. Execute the DropBot.exe. The settings and drop-session will be generated right beside the executable.

Linux

  1. Download the linux executable from the build branch or release page.

  2. Move the executable to a folder.

  3. Give the DropBot-linux-x64 file permission to execute via chmod if needed.

    chmod +x ./DropBot-linux-x64
  4. Execute the DropBot-linux-x64. The settings and drop-session will be generated right beside the executable.

    ./DropBot-linux-x64

Ubuntu

Using Bot with No GUI - Only Command Line
  1. Download the linux executable from the build branch or release page.

  2. Drag and Drop a settings.json and drop-session.json file right beside the executable.

  3. Make sure you have set displayless to true in your settings.json

  4. Execute the DropBot-linux-x64.

    ./DropBot-linux-x64

โš ๏ธ If you want to specifiy wich games to watch use the Prioritylist setting โš ๏ธ

โš ๏ธ If you want to watch Custom Channels drag and drop a customchannels.json to your executable location and set ForceCustomChannel in settings.json to true โš ๏ธ

โš ๏ธ If you can't seem to get any progress on drops "always stuck" try loging in instead of copying drop-session.json. โš ๏ธ

Npm

  1. Clone the Repository.

    git clone https://github.com/Zaarrg/DropBot
  2. Install NPM packages.

    cd DropBot/
    npm install
  3. Run the bot via npm scripts.

    npm run start:production
    OR
    npm run start:dev

Docker

  1. Get your auth token

    docker run --rm -it ghcr.io/zaarrg/dropbot/dropbot:latest node ./build/index.js --showtoken
  2. Login in, copy your auth token, and then exit the container with Ctrl + C

  3. Create the container

    docker run -d --name dropbot \
    -e dropbot_displayless=true \
    -e dropbot_token=TokenFromStep1 \
    -e dropbot_games="Sea_of_Thieves Rust Lost_Ark No_Man's_Sky" \
    -e dropbot_autoclaim=true \
    ghcr.io/zaarrg/dropbot/dropbot:latest

๐Ÿ“š How to use the Bot?

Step by Step Usage: Drops

1. Step

Select the way you want to Log in into your account.

โš ๏ธ If you cant login directly because of CAPTCHA use the browser method. โš ๏ธ
โš ๏ธ Only Chromium Browsers are supported like Brave and Chrome . โš ๏ธ

Drops

2. Step

Select Drops to watch a Campaign or Custom Channels if you want to add your own channels. Refer to Step by Step Usage: Custom Channels for those.

Drops

3. Step

Select the campaign you want to start watching. If you want to only watch certain campaign and not all refer to Settings: Priority list

Drops

4. Step

Select the Drop you want to start watching.

Drops

5. Step

๐ŸŽ‰ Enjoy! You are successfully watching your drop.

Drops

Step by Step Usage: Custom Channels

1. Step

Select Custom Channels to start watching them.

Drops

2. Step

Fill in the needed information to add a Channel. They can always be modified in the customchannel.json

Drops

3. Step

Select the Channel you want to start. The bot will switch between the Custom Channels, if one goes offline.

Drops

4. Step

๐ŸŽ‰ Enjoy! You are successfully watching your Custom Channel.

Drops

Step by Step Usage: Heroku

โš ๏ธ Only Recommended for advanced users. โš ๏ธ

1. Step

Click on the Deploy to Heroku Button at the top of the Readme

Drops

2. Step

Login if necessary, and choose any app name you want, select your region and click Deploy app
After that let Heroku go through the build process and then click on Manage App

Drops

3. Step

Go to the Resources tab and disable the web dyno and enable the worker instead

Drops

4. Step

Click on more in the top right corner and then on Run console.
Type in bash and click Run.

Drops

5. Step

Now run the command node ./build/index.js --showtoken in the Terminal.
Login Directly via command Line, until you see your auth token and copy it.

Drops

6. Step

Close the Terminal and go to Settings then Reveal Config Vars
Now type in as key dropbot_token and as value your copied token and click add
You can find more environment variables here

Drops

7. Step

๐ŸŽ‰ Thats it Enjoy! You are successfully watching.
To check if its working click on more in the top right corner then view logs.
Give it some time to start up, and you should see the bot working.

Drops


๐Ÿ“ Settings

Down below you can find the settings Variables and what they do.

Chromeexe

  • The path of your Browser: Linux: google-chrome | Windows: C:\Program Files\Google\Chrome\Application\chrome.exe

UserDataPath

  • Providing a userdatapath, will give the loginpage the option to use cookies out of your browser. Option not really needed anymore.
  • You can find the UserdataPath under chrome://version then under Profile Path

Webhook

WebHookEvents

  • Set what events should be send via webhook.
  • Defaults to: ["requestretry", "claim", "newdrop", "offline", "newgame", "get", "getresult", "progress", "start", "error", "warn", "info"]

Debug

  • Will log important values to the console for debugging.

Displayless

  • Give the ability to use the bot fully automated with no user input needed. Especially useful for gui-less systems. See Ubuntu - No Gui

ForceCustomChannel

  • Force the bot to watch Custom Channels, only useful for display-less mode.

ProgressCheckInterval

  • The time in ms, in what interval the progress should be checked. Recommended is 60000 ms - 60 s anything under could cause blocking your request.

RetryDelay

  • The time in ms, in what interval failed requests should be retried. Recommended is 60000 ms - 60 s anything under could cause blocking your request.

WaitforChannels

  • If set to false the Bot will no longer wait 5 Minutes for new Channels to come online. It will switch to another game instead.

Prioritylist

  • A list of Games the bot should watch / prioritize. Only Provide games with active Drop Campaigns in this Format: ["Rust","Fortnite", "Elite: Dangerous"]
  • You can get the valid name from
  • If provided the bot will only watch the games listed.

AutoClaim

  • Allow the bot to autoClaim or not

LogToFile

  • Log the Console to a file.

UseKeepAlive

  • If activated uses Express to the keepalive the bot useful for stuff like Replit.


โœ๏ธ Start Arguments

All available start Arguments, basically everything which is also in the settings.json file.

./DropBot.exe --help

Usage: ./DropBot or index.js --arg...

Options:
--help                              Show help. [boolean]
--version                           Show version number. [boolean]
-c, --chrome                        The path to your Chrome executable. [string]
-u, --userdata                      The path to your userdata folder location. [string]
--webhook, --wh                     The Discord Webhook URL. [string]
--webhookevents                     Set what events should be send via webhook. [array]
-i, --interval                      The progress interval in ms. [number]
--retryinterval, --retry            The retry interval in ms. [number]
-g, --games                         The Games the bot should watch. [array]
--token                             Your auth_token. [string]
-d, --debug                         Enable Debug logging. [boolean]
--displayless, --dl                 Enable Displayless mode. [boolean]
--forcecustomchannel                Force Custom Channels. Only useful for
                                    display-less mode. [boolean]
--waitforchannels, --waitonline     Disable waitforchannels, forcing the bot to not wait 
                                    for other channels with drops instead switch the game. [boolean]
--autoclaim                         Enable autoclaim. [boolean]
--log                               Enable logging to file. [boolean]
--usekeepalive                      Enable Express KeepAlive. [boolean]
--tray                              Start app in the tray. [boolean]

Examples:
--chrome C:path:to:chrome.exe             Sets your chrome path.
--userdata C:path:to:userdata-folder      Sets your userdata path.
--webhook https:discord.com:api:webh....  Sets your webhook url.
--webhookevents requestretry claim        Defaults to the events in this
newdrop offline newgame get getresult     example provided.
progress start error warn info
--interval 30000                          Sets the progress interval to 30s.
--retryinterval 30000                     Sets the retry interval to 30s.
--games Rust Krunker 'Elite: Dangerous'   Sets the Prioritylist to Rust,
Krunker and Elite: Dangerous.
--token yourkindalongtoken                Sets the your current  auth
                                          token, overwriting any in
                                          drop-session.json.

โœ๏ธ Environment variables

All these Start Arguments also work as environment variable:

dropbot_chrome = YourPath
dropbot_userdata = YourPath
dropbot_webhook = DiscordWebhookURL
dropbot_interval = 60000
dropbot_games = Game1 Game2 Game3... โš ๏ธ Black Desert -> Black_Desert โš ๏ธ
dropbot_debug = true || false
dropbot_displayless = true || false
dropbot_forcecustomchannel = true || false
dropbot_waitforchannels = true || false
dropbot_autoclaim = true || false
dropbot_log = true || false
dropbot_usekeepalive = true || false
dropbot_retryinterval = 60000
dropbot_webhookevents = Event1 Event2 Event3...
dropbot_showtoken = true || false  Usefull for System were you cant access your drop-session.json
dropbot_token = YourToken

๐Ÿ“˜ Adding Custom Channels


Drops

Name

  • The Name can be any String like Rainbow Six, Best Ch ever etc...

Url

  • The Url is very important, never use the same Url twice, it has to be a valid Channel link and has always to start with https://www..tv/. Example for a Valid Url: https://www..tv/rainbow6tw

How the Channel should be Watched

Watch until the time runs out:

  • Watches the channel until the left time reaches 0 then switches to other custom channel.

Watch indefinitely:

  • Watches the channel until it goes offline, then switches.

Farm Points

  • Pretty simple, should the bot farm Points or not.

Editing already Added Channel's

  • You can always edit Channel's which are already added in the CustomChannels.json.

๐Ÿ“„ Json Files Examples

Example Settings.json

{
   "Chromeexe": "",
   "UserDataPath": "",
   "WebHookURL": "",
   "WebHookEvents": [],
   "debug": false,
   "displayless": false,
   "ProgressCheckInterval": 60000,
   "RetryDelay": 60000,
   "WaitforChannels": true,
   "Prioritylist": [],
   "AutoClaim": true,
   "LogToFile": true,
   "ForceCustomChannel": false,
   "UseKeepAlive": false
}

Example CustomChannels.json

[
  {
    "Name": "tarik",
    "Link": "https://www..tv/tarik",
    "WatchType": "Watch until time runs out",
    "Time": "50",
    "Points": true
  }
]

Example Session

[
  {
    "name": "auth-token",
    "value": "yourtoken"
  }
]

โš ๏ธ Never share your Token with anyone, because it gives full access to your account โš ๏ธ


๐ŸŽ‰ Enjoy the bot and hopefully its helpful!

GitHub's followers GitHub stars GitHub watchers GitHub forks

If you like my work feel free to buy me a coffee. โ˜•

"Buy Me A Coffee"

Have fun and Enjoy! ๐Ÿ˜ƒ


๐Ÿฐ Contact

Quickest Response:
Discord Server: https://discord.gg/rV26FZ2upF

Slow Response:
Discord: - Zarg#8467

Distributed under the MIT License. See LICENSE for more information.โš ๏ธ

Made with a lot of โค๏ธโค๏ธ by @Zarg

dropbot's People

Contributors

aushick avatar zaarrg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dropbot's Issues

Can't login via command line

? What is your Password? [hidden]

Something went wrong...
Login failed for an unknown reason...
The Reason is probably:
Unhandled Rejection at: Promise {
  <rejected> TypeError: Cannot read property 'error_code' of undefined
      at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:221:95
      at Generator.next (<anonymous>)
      at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:8:71
      at new Promise (<anonymous>)
      at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:4:12
      at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:160:20
      at processTicksAndRejections (internal/process/task_queues.js:95:5) {
    [stack]: "TypeError: Cannot read property 'error_code' of undefined\n" +
      '    at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:221:95\n' +
      '    at Generator.next (<anonymous>)\n' +
      '    at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:8:71\n' +
      '    at new Promise (<anonymous>)\n' +
      '    at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:4:12\n' +
      '    at /snapshot/TTVDropBot-v2/build/functions/login/defaultlogin.js:160:20\n' +
      '    at processTicksAndRejections (internal/process/task_queues.js:95:5)',
    [message]: "Cannot read property 'error_code' of undefined"
  }
}
Unhandled Rejection Reason: TypeError: Cannot read property 'error_code' of undefined

I entering current information, buy getting this

Auto change the resolution/sound and so on (Suggestion)

Hello. Love using the bot!

Would be nice if you made it so that it sets all the streams to 160p or the lowest available resolution an also made it mute all channels automatically.

I've also encountered an issue with channels who have made their stream inappropriate to younger viewers. it will just stay stuck there not watching the stream until i click the button.

Error: EPERM: operation not permitted

Have a friend that was trying to use this but doesn't have a github account.

We get the following issue.

error

Anyone able to offer some insight? I'm confused why it is looking for the settings.json in the system32 folder?

dont know why, dont know why

it doesnt work. i tested latese pre patch and relase before it.

image

Starting...

Executable Path provided...
? Do you wanna use a custom UserDataDirectory? No

Successfully Saved Settings...

Starting Login Page...

Please Login with you Account...

Success Login...

Saving Cookies...

Closing Browser and Moving on...

Successfully Saved Cookies...

? Do you wanna watch a Custom Channel? No

Getting all Drops and other Details
(node:3528) UnhandledPromiseRejectionWarning: TimeoutError: Navigation timeout of 30000 ms exceeded
at C:\Users\cagda\OneDrive\Masaรผstรผ\titit\node_modules\puppeteer\lib\cjs\puppeteer\common\LifecycleWatcher.js:106:111
(Use TTVDropBot --trace-warnings ... to show where the warning was created)
(node:3528) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:3528) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

[Docker] Disable watching random games when all drops collected for one game?

Hello, I couldn't find if there was a Docker env variable for this, so I figured I'd ask. I'm currently using TTVDropBot to watch one specific game for drops. However, when I've collected all drops for that game, it will randomly pick another game to watch. This is really cluttering up my drops inventory within Twitch, and I'd like to stop that.

Can I make it so that TTVDropBot is always afking one specific game, even after all drops have been collected for that week?

Stuck on stream when it goes offline

If the stream you are "watching" goes offline you are stuck in the watching loop.
Makes the whole script useless when you want to idle while sleeping.

New error on 1.3.3 when watching stream

Firstly thanks and great work getting the issues fixed so quickly.

However currently 1.3.3 seems to be broken for me at least. Once you choose the channel to watch it gets below error, I have tried the npm and .exe compiled versions and they both do the same thing :

Setting Video Settings like Quality and Volume...

Watching https://www.twitch.tv/Sykkuno...

(node:35920) UnhandledPromiseRejectionWarning: Error: Evaluation failed: TypeError: Cannot read property 'startsWith' of undefined
at :57:33
at Array.filter ()
at :56:39
at ExecutionContext._evaluateInternal (S:\RustDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\ExecutionContext.js:218:19)
at runMicrotasks ()
at processTicksAndRejections (internal/process/task_queues.js:95:5)
at async ExecutionContext.evaluate (S:\RustDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\ExecutionContext.js:107:16)
at async MapDrops (S:\RustDropBot\src\functions\MapDrops.js:89:5)
at async CheckProgressCurrentPage (S:\RustDropBot\src\Checks\CheckProgressCurrentPage.js:14:5)
at async S:\RustDropBot\src\Pages\StreamPage.js:68:9
at async CurrentProgressEvent (S:\RustDropBot\src\Pages\StreamPage.js:66:5)
at async StreamPage (S:\RustDropBot\src\Pages\StreamPage.js:54:5)
at async intrust (S:\RustDropBot\src\Pages\WatchingPage.js:79:13)
(Use TTVDropBot --trace-warnings ... to show where the warning was created)
(node:35920) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:35920) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Error: Protocol error (Page.navigate): Invalid parameters Failed to deserialize params.url - BINDINGS: mandatory field missing at position 49

Watching (twitch link here)

Reached 100 %... Looking for new Channel...

Checking for Live Channels

Going to Starting Channel...
(node:5276) UnhandledPromiseRejectionWarning: Error: Protocol error (Page.navigate): Invalid parameters Failed to deserialize params.url - BINDINGS: mandatory field missing at position 49
at C:\Users\OneDrive\Desktop\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:208:63
at new Promise ()
at CDPSession.send (C:\Users\OneDrive\Desktop\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:207:16)
at next (C:\Users\OneDrive\Desktop\node_modules\puppeteer-extra-plugin-stealth\evasions\sourceurl\index.js:30:43)
at CDPSession.send (C:\Users\OneDrive\Desktop\node_modules\puppeteer-extra-plugin-stealth\evasions\sourceurl\index.js:46:18)
at navigate (C:\Users\OneDrive\Desktop\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:108:47)
at FrameManager.navigateFrame (C:\Users\OneDrive\Desktop\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:91:13)
at Frame.goto (C:\Users\OneDrive\Desktop\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:416:41)
at Page.goto (C:\Users\OneDrive\Desktop\node_modules\puppeteer\lib\cjs\puppeteer\common\Page.js:789:53)
at StreamPage (C:\Users\OneDrive\Desktop\src\Pages\StreamPage.js:31:24)
(Use TTVDropBot --trace-warnings ... to show where the warning was created)
(node:5276) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:5276) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Crashing on trying to find new channel

There seems to be an issue when you already have the drop. I have 1.3.2.2 Hot Fix 2

It doesn't seem to scan for drops you already have and only channel up currently is ArikaSaki. When it watches it seems to finally decide I must already have the drop. however then just completely fails to find another channel and crashes as below.

Watching https://www.twitch.tv/AriaSaki...

Current Progress: - % | Try: 1
Current Progress: - % | Try: 2

Failed to get a valid Drop to progress on this Channel or it is already claimed... Looking for a new one...

Checking for Live Channels

Going to Starting Channel...
(node:20552) UnhandledPromiseRejectionWarning: Error: Protocol error (Page.navigate): Invalid parameters Failed to deserialize params.url - BINDINGS: mandatory field missing at position 49
at S:\Downloads\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:208:63
at new Promise ()
at CDPSession.send (S:\Downloads\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:207:16)
at next (S:\Downloads\TTVDropBot\node_modules\puppeteer-extra-plugin-stealth\evasions\sourceurl\index.js:30:43)
at CDPSession.send (S:\Downloads\TTVDropBot\node_modules\puppeteer-extra-plugin-stealth\evasions\sourceurl\index.js:46:18)
at navigate (S:\Downloads\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:108:47)
at FrameManager.navigateFrame (S:\Downloads\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:91:13)
at Frame.goto (S:\Downloads\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:416:41)
at Page.goto (S:\Downloads\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\Page.js:789:53)
at StreamPage (S:\Downloads\TTVDropBot\src\Pages\StreamPage.js:26:24)
(Use TTVDropBot --trace-warnings ... to show where the warning was created)
(node:20552) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:20552) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Twitch URL Interpreted as Invalid

Steps to reproduce

git clone https://github.com/Zaarrg/TTVDropBot
cd TTVDropBot
yarn install
yarn start:production

Select custom channel - Warframe
Enter url: https://twitch.tv/warframe

>> Please provide a Valid URL...

Similarly, yesterday while Warframe was live, the current dev channel cannot be auto-watched correctly (Select Warframe Campaign - Prime Time xxx) - it returns an error similar to #50, I recall it was something to do with the GAMEID, but I've lost my log due to a restart. Other channels/campaigns seemed to be fine.

image

No Custom Channels Found...
? Do you wanna add a Custom Channel? Yes
? Please provide a Name for this Custom Channel: r6
? Please provide the Twitch Url: https://twitch.tv/rainbow6
>> Please provide a Valid URL...

A suugestion about prioritylist.

TTVDropBot is a nice work. I deployed it on server and it saved me a lot of trouble. Appreciate it!

Some games like warframe, the drop is only active from every Thursday to Sunday. The bot removes games without active drop campaigns from prioritylist at startup, so I'll have to manually restart the bot sometimes to let it watch warframe.

Will it be better if the bot can monitor the drop status from prioritylist and start watching when it's active instead of just removing the games?

[QUESTIONS] About offline-streams

if I start the program while the streams is offline, when he go online, the program automatically start watching? or, I need do something for he do that?

  1. That's program works on heroku? if yes, you can add a button to easy deploy here on github :D

Docker

I run a bunch of stuff like this with docker-compose
So I would love official support/instructions for docker/docker-compose

Bot doesn't recognize Claimed Drop

Bug: Sometimes the Drop is already claimed but the Bot doesn't recognize it.
Also see here #21
The following happens:

  • Bot compares the names from https://twitch.facepunch.com/ to the claimed Drop names. Sometimes the names don't match so the Bot wont recognize it as claimed and will take a bit longer to skip the claimed channel.

Will be fixed in a future release.

Missing 2 streamers - Cyr and Sonii

Usually there is only 9 drops. But this time there is 11. https://twitch.facepunch.com/

It seems your program stops checking at 9, so is missing Cyr and Sonii off the streamer list. Possibly needs to be amended to check for larger streamer lists for these instances.

Getting all Drops and other Details

https://www.twitch.tv/Myth | Myth Assault Rifle | Live

https://www.twitch.tv/Voyboy | Voyboy Hammer | Offline

https://www.twitch.tv/xQcOW | xQc SAR | Offline

https://www.twitch.tv/AriaSaki | Ariasaki Hammer | Live

https://www.twitch.tv/Sykkuno | Sykkuno Assault Rifle | Offline

https://www.twitch.tv/ludwig | Ludwig Sleeping Bag | Offline

https://www.twitch.tv/pokimane | Pokimane Painted Garage Door | Offline

https://www.twitch.tv/Trainwreckstv | Trainwreckstv Combat Knife | Offline

https://www.twitch.tv/Account%20Not%20Found | WillNeff Burlap Headwrap | Offline

Checking for Live Channels

TypeError: Cannot read property 'name' of null

Hi !

Just wanted to report an issue.

What:
`TypeError: Cannot read property 'name' of null

More Details can be found in the error Log...

Closing Bot...`

That's what i have in my discord webhook error message.
it closes CMD window too.

When:
It seems to happen in long session like 2hrs+.
And when there are no drop available for too long.

Thank you.

Switches streams after 3 fails, even if not 3 in a row

The program seems to switch streams after 3 failures. It seems to get a failure to check every 3-5 attempts. This eventually causes it to switch streams even when the stream is still up.

In my opinion it should only switch if it is " 3 failures in a row" not "3 failures total"

I assume resetting the try count on a successful check, would be a quick way to fix this.

image

To add a suggestion to this. it would be useful to be able to add a list of streamers I already have drops for so it does not check them anymore. As it takes a long time to get 3 trys on a stream I already have the drop for.

Possibly automatically log streams the tool has got 100% for or detected 100% for too.

Couldn't Auto Restart Once Encounters An Issue

While leaving the script in a remote machine to run, it returned the below lengthy error message after around 6-7 hours of watching

It said it returned a 400 code (Bad Request)

The remote machine has 500Mbps of bandwidth, not excellent, but due to the nature of ISP/DC network, it's meant to be more reliable than home network. And the ping looked more than fine.

root@instance-prod:~# speedtest-cli
Retrieving speedtest.net configuration...
Testing from Oracle Cloud (xxx)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Jump Networks Ltd (London) [39.19 km]: 4.22 ms
Testing download speed................................................................................
Download: 494.91 Mbit/s
Testing upload speed......................................................................................................
Upload: 289.71 Mbit/s
root@instance-prod:~# ping twitch.tv
PING twitch.tv (151.101.194.167) 56(84) bytes of data.
64 bytes from 151.101.194.167 (151.101.194.167): icmp_seq=1 ttl=58 time=1.20 ms
64 bytes from 151.101.194.167 (151.101.194.167): icmp_seq=2 ttl=58 time=1.22 ms
64 bytes from 151.101.194.167 (151.101.194.167): icmp_seq=3 ttl=58 time=1.22 ms
64 bytes from 151.101.194.167 (151.101.194.167): icmp_seq=4 ttl=58 time=1.22 ms
64 bytes from 151.101.194.167 (151.101.194.167): icmp_seq=5 ttl=58 time=1.25 ms
^C
--- twitch.tv ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 1.200/1.222/1.247/0.014 ms

Due to the nature of this error is potentially unknown, is it possible to add two features:

  • Retry the connection if the previous one failed
  • Restart the script with the same config if it encounters some error

Currently it's impossible to run and forget, as eventually it will run into some issue that needs mannual operations. Thanks.

Below are the error messages:

Watching rainbow6 | Points: 55615
Current Progress: 0 % | Watched 0/240 Minutes | Drop 1/2 | Status Active | isClaimed true
Current Progress: 74.58 % | Watched 179/240 Minutes | Drop 2/2 | Status Active | isClaimed false

ERROR: Could not load https://www.twitch.tv... Check your connection...
Unhandled Rejection at: Promise {
  <rejected> Error: Request failed with status code 400
      at createError (/root/TTVDropBot/node_modules/axios/lib/core/createError.js:16:15)
      at settle (/root/TTVDropBot/node_modules/axios/lib/core/settle.js:17:12)
      at IncomingMessage.handleStreamEnd (/root/TTVDropBot/node_modules/axios/lib/adapters/http.js:322:11)
      at IncomingMessage.emit (node:events:538:35)
      at endReadableNT (node:internal/streams/readable:1345:12)
      at processTicksAndRejections (node:internal/process/task_queues:83:21) {
    [stack]: 'Error: Request failed with status code 400\n' +
      '    at createError (/root/TTVDropBot/node_modules/axios/lib/core/createError.js:16:15)\n' +
      '    at settle (/root/TTVDropBot/node_modules/axios/lib/core/settle.js:17:12)\n' +
      '    at IncomingMessage.handleStreamEnd (/root/TTVDropBot/node_modules/axios/lib/adapters/http.js:322:11)\n' +
      '    at IncomingMessage.emit (node:events:538:35)\n' +
      '    at endReadableNT (node:internal/streams/readable:1345:12)\n' +
      '    at processTicksAndRejections (node:internal/process/task_queues:83:21)',
    [message]: 'Request failed with status code 400',
    config: {
      transitional: {
        silentJSONParsing: true,
        forcedJSONParsing: true,
        clarifyTimeoutError: false
      },
      adapter: <ref *1> [Function: httpAdapter] {
        [length]: 1,
        [name]: 'httpAdapter',
        [prototype]: { [constructor]: [Circular *1] }
      },
      transformRequest: [
        [Function: transformRequest] {
          [length]: 2,
          [name]: 'transformRequest',
          [prototype]: [Object]
        },
        [length]: 1
      ],
      transformResponse: [
        [Function: transformResponse] {
          [length]: 1,
          [name]: 'transformResponse',
          [prototype]: [Object]
        },
        [length]: 1
      ],
      timeout: 0,
      xsrfCookieName: 'XSRF-TOKEN',
      xsrfHeaderName: 'X-XSRF-TOKEN',
      maxContentLength: -1,
      maxBodyLength: -1,
      validateStatus: <ref *2> [Function: validateStatus] {
        [length]: 1,
        [name]: 'validateStatus',
        [prototype]: { [constructor]: [Circular *2] }
      },
      headers: {
        Accept: 'application/json, text/plain, */*',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0',
        encoding: 'utf8',
        'Client-Id': 'kimne78kx3ncx6brgo4mv6wki5h1ko',
        Authorization: ''
      },
      raxConfig: {
        retry: 3,
        noResponseRetries: 3,
        retryDelay: 60000,
        statusCodesToRetry: [ [Array], [Array], [Array], [length]: 3 ],
        httpMethodsToRetry: [
          'GET',
          'HEAD',
          'OPTIONS',
          'DELETE',
          'PUT',
          'POST',
          [length]: 6
        ],
        onRetryAttempt: [Function: onRetryAttempt] {
          [length]: 1,
          [name]: 'onRetryAttempt'
        },
        backoffType: 'static',
        currentRetryAttempt: 0,
        instance: <ref *3> [Function: wrap] {
          [length]: 0,
          [name]: 'wrap',
          [prototype]: [Object],
          request: [Function],
          getUri: [Function],
          delete: [Function],
          get: [Function],
          head: [Function],
          options: [Function],
          post: [Function],
          put: [Function],
          patch: [Function],
          defaults: [Object],
          interceptors: [Object],
          create: [Function],
          Axios: [Function],
          Cancel: [Function],
          CancelToken: [Function],
          isCancel: [Function],
          VERSION: '0.26.1',
          all: [Function],
          spread: [Function],
          isAxiosError: [Function],
          default: [Circular *3]
        },
        checkRetryAfter: true,
        maxRetryAfter: 300000
      },
      method: 'get',
      url: 'https://www.twitch.tv/rainbow6',
      data: undefined
    },
    request: <ref *5> ClientRequest {
      _events: [Object: null prototype] {
        abort: [Function (anonymous)] {
          [length]: 3,
          [name]: '',
          [arguments]: null,
          [caller]: null,
          [prototype]: [Object]
        },
        aborted: [Function (anonymous)] {
          [length]: 3,
          [name]: '',
          [arguments]: null,
          [caller]: null,
          [prototype]: [Object]
        },
        connect: [Function (anonymous)] {
          [length]: 3,
          [name]: '',
          [arguments]: null,
          [caller]: null,
          [prototype]: [Object]
        },
        error: [Function (anonymous)] {
          [length]: 3,
          [name]: '',
          [arguments]: null,
          [caller]: null,
          [prototype]: [Object]
        },
        socket: [Function (anonymous)] {
          [length]: 3,
          [name]: '',
          [arguments]: null,
          [caller]: null,
          [prototype]: [Object]
        },
        timeout: [Function (anonymous)] {
          [length]: 3,
          [name]: '',
          [arguments]: null,
          [caller]: null,
          [prototype]: [Object]
        },
        prefinish: [Function: requestOnPrefinish] {
          [length]: 0,
          [name]: 'requestOnPrefinish',
          [prototype]: [Object]
        }
      },
      _eventsCount: 7,
      _maxListeners: undefined,
      outputData: [ [length]: 0 ],
      outputSize: 0,
      writable: true,
      destroyed: false,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: false,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      socket: <ref *4> TLSSocket {
        _tlsOptions: {
          allowHalfOpen: undefined,
          pipe: false,
          secureContext: [SecureContext],
          isServer: false,
          requestCert: true,
          rejectUnauthorized: true,
          session: <Buffer 30 82 07 a3 02 01 01 02 02 03 04 04 02 13 02 04 20 f3 54 06 fa 86 9a 1a f1 0c bd 9b ff 0a 35 d1 92 9c 10 e7 97 2a 9a ff 32 63 72 c1 81 02 af 9b c5 04 ... 1909 more bytes>,
          ALPNProtocols: undefined,
          requestOCSP: undefined,
          enableTrace: undefined,
          pskCallback: undefined,
          highWaterMark: undefined,
          onread: undefined,
          signal: undefined
        },
        _secureEstablished: true,
        _securePending: false,
        _newSessionPending: false,
        _controlReleased: true,
        secureConnecting: false,
        _SNICallback: null,
        servername: 'www.twitch.tv',
        alpnProtocol: false,
        authorized: true,
        authorizationError: null,
        encrypted: true,
        _events: [Object: null prototype] {
          close: [Array],
          end: [Function],
          newListener: [Function],
          secure: [Function],
          session: [Function],
          free: [Function],
          timeout: [Function],
          agentRemove: [Function],
          error: [Function],
          finish: [Function]
        },
        _eventsCount: 10,
        connecting: false,
        _hadError: false,
        _parent: null,
        _host: 'www.twitch.tv',
        _readableState: ReadableState {
          objectMode: false,
          highWaterMark: 16384,
          buffer: BufferList { head: null, tail: null, length: 0 },
          length: 0,
          pipes: [Array],
          flowing: true,
          ended: false,
          endEmitted: false,
          reading: true,
          constructed: true,
          sync: false,
          needReadable: true,
          emittedReadable: false,
          readableListening: false,
          resumeScheduled: false,
          errorEmitted: false,
          emitClose: false,
          autoDestroy: true,
          destroyed: false,
          errored: null,
          closed: false,
          closeEmitted: false,
          defaultEncoding: 'utf8',
          awaitDrainWriters: null,
          multiAwaitDrain: false,
          readingMore: false,
          dataEmitted: true,
          decoder: null,
          encoding: null,
          [Symbol(kPaused)]: false,
          [pipesCount]: [Getter],
          [paused]: [Getter/Setter]
        },
        _maxListeners: undefined,
        _writableState: WritableState {
          objectMode: false,
          highWaterMark: 16384,
          finalCalled: true,
          needDrain: false,
          ending: true,
          ended: true,
          finished: false,
          destroyed: false,
          decodeStrings: false,
          defaultEncoding: 'utf8',
          length: 0,
          writing: false,
          corked: 0,
          sync: false,
          bufferProcessing: false,
          onwrite: [Function],
          writecb: null,
          writelen: 0,
          afterWriteTickInfo: null,
          buffered: [Array],
          bufferedIndex: 0,
          allBuffers: true,
          allNoop: true,
          pendingcb: 1,
          constructed: true,
          prefinished: false,
          errorEmitted: false,
          emitClose: false,
          autoDestroy: true,
          errored: null,
          closed: false,
          closeEmitted: false,
          [Symbol(kOnFinished)]: [Array],
          [bufferedRequestCount]: [Getter]
        },
        allowHalfOpen: false,
        _sockname: null,
        _pendingData: null,
        _pendingEncoding: '',
        server: undefined,
        _server: null,
        ssl: TLSWrap {
          _parent: [TCP],
          _parentWrap: undefined,
          _secureContext: [SecureContext],
          reading: true,
          onkeylog: [Function],
          onhandshakestart: [Object],
          onhandshakedone: [Function],
          onocspresponse: [Function],
          onnewsession: [Function],
          onerror: [Function],
          [Symbol(owner_symbol)]: [Circular *4],
          writeQueueSize: [Getter],
          [fd]: [Getter],
          [_externalStream]: [Getter],
          [bytesRead]: [Getter],
          [bytesWritten]: [Getter],
          isStreamBase: true
        },
        _requestCert: true,
        _rejectUnauthorized: true,
        parser: null,
        _httpMessage: [Circular *5],
        [Symbol(res)]: TLSWrap {
          _parent: [TCP],
          _parentWrap: undefined,
          _secureContext: [SecureContext],
          reading: true,
          onkeylog: [Function],
          onhandshakestart: [Object],
          onhandshakedone: [Function],
          onocspresponse: [Function],
          onnewsession: [Function],
          onerror: [Function],
          [Symbol(owner_symbol)]: [Circular *4],
          writeQueueSize: [Getter],
          [fd]: [Getter],
          [_externalStream]: [Getter],
          [bytesRead]: [Getter],
          [bytesWritten]: [Getter],
          isStreamBase: true
        },
        [Symbol(verified)]: true,
        [Symbol(pendingSession)]: null,
        [Symbol(async_id_symbol)]: 277678,
        [Symbol(kHandle)]: TLSWrap {
          _parent: [TCP],
          _parentWrap: undefined,
          _secureContext: [SecureContext],
          reading: true,
          onkeylog: [Function],
          onhandshakestart: [Object],
          onhandshakedone: [Function],
          onocspresponse: [Function],
          onnewsession: [Function],
          onerror: [Function],
          [Symbol(owner_symbol)]: [Circular *4],
          writeQueueSize: [Getter],
          [fd]: [Getter],
          [_externalStream]: [Getter],
          [bytesRead]: [Getter],
          [bytesWritten]: [Getter],
          isStreamBase: true
        },
        [Symbol(kSetNoDelay)]: false,
        [Symbol(lastWriteQueueSize)]: 0,
        [Symbol(timeout)]: null,
        [Symbol(kBuffer)]: null,
        [Symbol(kBufferCb)]: null,
        [Symbol(kBufferGen)]: null,
        [Symbol(kCapture)]: false,
        [Symbol(kBytesRead)]: 0,
        [Symbol(kBytesWritten)]: 0,
        [Symbol(connect-options)]: {
          rejectUnauthorized: true,
          ciphers: 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA',
          checkServerIdentity: [Function],
          minDHSize: 1024,
          session: <Buffer 30 82 07 a3 02 01 01 02 02 03 04 04 02 13 02 04 20 f3 54 06 fa 86 9a 1a f1 0c bd 9b ff 0a 35 d1 92 9c 10 e7 97 2a 9a ff 32 63 72 c1 81 02 af 9b c5 04 ... 1909 more bytes>,
          maxRedirects: 21,
          maxBodyLength: 10485760,
          protocol: 'https:',
          path: null,
          method: 'GET',
          headers: [Object],
          agent: undefined,
          agents: [Object],
          auth: undefined,
          hostname: 'www.twitch.tv',
          port: 443,
          nativeProtocols: [Object],
          pathname: '/rainbow6',
          _defaultAgent: [Agent],
          host: 'www.twitch.tv',
          servername: 'www.twitch.tv',
          _agentKey: 'www.twitch.tv:443:::::::::::::::::::::',
          encoding: null,
          singleUse: true
        },
        [Symbol(RequestTimeout)]: undefined,
        [_connecting]: [Getter],
        [pending]: [Getter],
        [readyState]: [Getter],
        [bufferSize]: [Getter],
        bytesRead: [Getter],
        remoteAddress: [Getter],
        remoteFamily: [Getter],
        remotePort: [Getter],
        localAddress: [Getter],
        localPort: [Getter],
        _bytesDispatched: [Getter],
        bytesWritten: [Getter],
        [_handle]: [Getter/Setter],
        [Symbol(kUpdateTimer)]: [Getter],
        [writable]: [Getter/Setter],
        [writableHighWaterMark]: [Getter],
        [writableObjectMode]: [Getter],
        [writableBuffer]: [Getter],
        [writableLength]: [Getter],
        [writableFinished]: [Getter],
        [writableCorked]: [Getter],
        [writableEnded]: [Getter],
        [writableNeedDrain]: [Getter],
        [destroyed]: [Getter/Setter]
      },
      _header: 'GET /rainbow6 HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0\r\n' +
        'encoding: utf8\r\n' +
        'Client-Id: kimne78kx3ncx6brgo4mv6wki5h1ko\r\n' +
        'Authorization: ' +
        'Host: www.twitch.tv\r\n' +
        'Connection: close\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop] { [length]: 0, [name]: 'nop' },
      agent: Agent {
        _events: [Object: null prototype] {
          free: [Function],
          newListener: [Function]
        },
        _eventsCount: 2,
        _maxListeners: undefined,
        defaultPort: 443,
        protocol: 'https:',
        options: [Object: null prototype] { path: null },
        requests: [Object: null prototype] {},
        sockets: [Object: null prototype] {
          'www.twitch.tv:443:::::::::::::::::::::': [Array]
        },
        freeSockets: [Object: null prototype] {},
        keepAliveMsecs: 1000,
        keepAlive: false,
        maxSockets: Infinity,
        maxFreeSockets: 256,
        scheduling: 'lifo',
        maxTotalSockets: Infinity,
        totalSocketCount: 1,
        maxCachedSessions: 100,
        _sessionCache: { map: [Object], list: [Array] },
        [Symbol(kCapture)]: false
      },
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: undefined,
      path: '/rainbow6',
      _ended: true,
      res: IncomingMessage {
        _readableState: ReadableState {
          objectMode: false,
          highWaterMark: 16384,
          buffer: BufferList { head: null, tail: null, length: 0 },
          length: 0,
          pipes: [Array],
          flowing: true,
          ended: true,
          endEmitted: true,
          reading: false,
          constructed: true,
          sync: false,
          needReadable: false,
          emittedReadable: false,
          readableListening: false,
          resumeScheduled: false,
          errorEmitted: false,
          emitClose: true,
          autoDestroy: true,
          destroyed: true,
          errored: null,
          closed: true,
          closeEmitted: true,
          defaultEncoding: 'utf8',
          awaitDrainWriters: null,
          multiAwaitDrain: false,
          readingMore: false,
          dataEmitted: true,
          decoder: null,
          encoding: null,
          [Symbol(kPaused)]: false,
          [pipesCount]: [Getter],
          [paused]: [Getter/Setter]
        },
        _events: [Object: null prototype] {
          end: [Array],
          data: [Function],
          aborted: [Function],
          error: [Function]
        },
        _eventsCount: 4,
        _maxListeners: undefined,
        socket: <ref *4> TLSSocket {
          _tlsOptions: [Object],
          _secureEstablished: true,
          _securePending: false,
          _newSessionPending: false,
          _controlReleased: true,
          secureConnecting: false,
          _SNICallback: null,
          servername: 'www.twitch.tv',
          alpnProtocol: false,
          authorized: true,
          authorizationError: null,
          encrypted: true,
          _events: [Object: null prototype],
          _eventsCount: 10,
          connecting: false,
          _hadError: false,
          _parent: null,
          _host: 'www.twitch.tv',
          _readableState: [ReadableState],
          _maxListeners: undefined,
          _writableState: [WritableState],
          allowHalfOpen: false,
          _sockname: null,
          _pendingData: null,
          _pendingEncoding: '',
          server: undefined,
          _server: null,
          ssl: [TLSWrap],
          _requestCert: true,
          _rejectUnauthorized: true,
          parser: null,
          _httpMessage: [Circular *5],
          [Symbol(res)]: [TLSWrap],
          [Symbol(verified)]: true,
          [Symbol(pendingSession)]: null,
          [Symbol(async_id_symbol)]: 277678,
          [Symbol(kHandle)]: [TLSWrap],
          [Symbol(kSetNoDelay)]: false,
          [Symbol(lastWriteQueueSize)]: 0,
          [Symbol(timeout)]: null,
          [Symbol(kBuffer)]: null,
          [Symbol(kBufferCb)]: null,
          [Symbol(kBufferGen)]: null,
          [Symbol(kCapture)]: false,
          [Symbol(kBytesRead)]: 0,
          [Symbol(kBytesWritten)]: 0,
          [Symbol(connect-options)]: [Object],
          [Symbol(RequestTimeout)]: undefined,
          [_connecting]: [Getter],
          [pending]: [Getter],
          [readyState]: [Getter],
          [bufferSize]: [Getter],
          bytesRead: [Getter],
          remoteAddress: [Getter],
          remoteFamily: [Getter],
          remotePort: [Getter],
          localAddress: [Getter],
          localPort: [Getter],
          _bytesDispatched: [Getter],
          bytesWritten: [Getter],
          [_handle]: [Getter/Setter],
          [Symbol(kUpdateTimer)]: [Getter],
          [writable]: [Getter/Setter],
          [writableHighWaterMark]: [Getter],
          [writableObjectMode]: [Getter],
          [writableBuffer]: [Getter],
          [writableLength]: [Getter],
          [writableFinished]: [Getter],
          [writableCorked]: [Getter],
          [writableEnded]: [Getter],
          [writableNeedDrain]: [Getter],
          [destroyed]: [Getter/Setter]
        },
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        httpVersion: '1.1',
        complete: true,
        rawHeaders: [
          'Connection',
          'close',
          'Content-Type',
          'application/xml',
          'Date',
          'Mon, 25 Apr 2022 22:09:52 GMT',
          'Set-Cookie',
          'twitch.lohp.countryCode=GB; domain=.twitch.tv; expires=Sat, 20 May 2023 22:09:52 GMT;',
          'transfer-encoding',
          'chunked',
          [length]: 10
        ],
        rawTrailers: [ [length]: 0 ],
        aborted: false,
        upgrade: false,
        url: '',
        method: null,
        statusCode: 400,
        statusMessage: 'Bad Request',
        client: <ref *4> TLSSocket {
          _tlsOptions: [Object],
          _secureEstablished: true,
          _securePending: false,
          _newSessionPending: false,
          _controlReleased: true,
          secureConnecting: false,
          _SNICallback: null,
          servername: 'www.twitch.tv',
          alpnProtocol: false,
          authorized: true,
          authorizationError: null,
          encrypted: true,
          _events: [Object: null prototype],
          _eventsCount: 10,
          connecting: false,
          _hadError: false,
          _parent: null,
          _host: 'www.twitch.tv',
          _readableState: [ReadableState],
          _maxListeners: undefined,
          _writableState: [WritableState],
          allowHalfOpen: false,
          _sockname: null,
          _pendingData: null,
          _pendingEncoding: '',
          server: undefined,
          _server: null,
          ssl: [TLSWrap],
          _requestCert: true,
          _rejectUnauthorized: true,
          parser: null,
          _httpMessage: [Circular *5],
          [Symbol(res)]: [TLSWrap],
          [Symbol(verified)]: true,
          [Symbol(pendingSession)]: null,
          [Symbol(async_id_symbol)]: 277678,
          [Symbol(kHandle)]: [TLSWrap],
          [Symbol(kSetNoDelay)]: false,
          [Symbol(lastWriteQueueSize)]: 0,
          [Symbol(timeout)]: null,
          [Symbol(kBuffer)]: null,
          [Symbol(kBufferCb)]: null,
          [Symbol(kBufferGen)]: null,
          [Symbol(kCapture)]: false,
          [Symbol(kBytesRead)]: 0,
          [Symbol(kBytesWritten)]: 0,
          [Symbol(connect-options)]: [Object],
          [Symbol(RequestTimeout)]: undefined,
          [_connecting]: [Getter],
          [pending]: [Getter],
          [readyState]: [Getter],
          [bufferSize]: [Getter],
          bytesRead: [Getter],
          remoteAddress: [Getter],
          remoteFamily: [Getter],
          remotePort: [Getter],
          localAddress: [Getter],
          localPort: [Getter],
          _bytesDispatched: [Getter],
          bytesWritten: [Getter],
          [_handle]: [Getter/Setter],
          [Symbol(kUpdateTimer)]: [Getter],
          [writable]: [Getter/Setter],
          [writableHighWaterMark]: [Getter],
          [writableObjectMode]: [Getter],
          [writableBuffer]: [Getter],
          [writableLength]: [Getter],
          [writableFinished]: [Getter],
          [writableCorked]: [Getter],
          [writableEnded]: [Getter],
          [writableNeedDrain]: [Getter],
          [destroyed]: [Getter/Setter]
        },
        _consuming: true,
        _dumped: false,
        req: [Circular *5],
        responseUrl: 'https://www.twitch.tv/rainbow6',
        redirects: [ [length]: 0 ],
        [Symbol(kCapture)]: false,
        [Symbol(kHeaders)]: {
          connection: 'close',
          'content-type': 'application/xml',
          date: 'Mon, 25 Apr 2022 22:09:52 GMT',
          'set-cookie': [Array],
          'transfer-encoding': 'chunked'
        },
        [Symbol(kHeadersCount)]: 10,
        [Symbol(kTrailers)]: null,
        [Symbol(kTrailersCount)]: 0,
        [Symbol(RequestTimeout)]: undefined,
        [connection]: [Getter/Setter],
        [headers]: [Getter/Setter],
        [trailers]: [Getter/Setter],
        [readable]: [Getter/Setter],
        [readableDidRead]: [Getter],
        [readableAborted]: [Getter],
        [readableHighWaterMark]: [Getter],
        [readableBuffer]: [Getter],
        [readableFlowing]: [Getter/Setter],
        [readableLength]: [Getter],
        [readableObjectMode]: [Getter],
        [readableEncoding]: [Getter],
        [destroyed]: [Getter/Setter],
        [readableEnded]: [Getter]
      },
      aborted: false,
      timeoutCb: null,
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'www.twitch.tv',
      protocol: 'https:',
      _redirectable: Writable {
        _writableState: WritableState {
          objectMode: false,
          highWaterMark: 16384,
          finalCalled: false,
          needDrain: false,
          ending: false,
          ended: false,
          finished: false,
          destroyed: false,
          decodeStrings: true,
          defaultEncoding: 'utf8',
          length: 0,
          writing: false,
          corked: 0,
          sync: true,
          bufferProcessing: false,
          onwrite: [Function],
          writecb: null,
          writelen: 0,
          afterWriteTickInfo: null,
          buffered: [Array],
          bufferedIndex: 0,
          allBuffers: true,
          allNoop: true,
          pendingcb: 0,
          constructed: true,
          prefinished: false,
          errorEmitted: false,
          emitClose: true,
          autoDestroy: true,
          errored: null,
          closed: false,
          closeEmitted: false,
          [Symbol(kOnFinished)]: [Array],
          [bufferedRequestCount]: [Getter]
        },
        _events: [Object: null prototype] {
          response: [Function],
          error: [Function],
          socket: [Function]
        },
        _eventsCount: 3,
        _maxListeners: undefined,
        _options: {
          maxRedirects: 21,
          maxBodyLength: 10485760,
          protocol: 'https:',
          path: '/rainbow6',
          method: 'GET',
          headers: [Object],
          agent: undefined,
          agents: [Object],
          auth: undefined,
          hostname: 'www.twitch.tv',
          port: null,
          nativeProtocols: [Object],
          pathname: '/rainbow6'
        },
        _ended: true,
        _ending: true,
        _redirectCount: 0,
        _redirects: [ [length]: 0 ],
        _requestBodyLength: 0,
        _requestBodyBuffers: [ [length]: 0 ],
        _onNativeResponse: [Function (anonymous)] {
          [length]: 1,
          [name]: '',
          [arguments]: null,
          [caller]: null,
          [prototype]: [Object]
        },
        _currentRequest: [Circular *5],
        _currentUrl: 'https://www.twitch.tv/rainbow6',
        [Symbol(kCapture)]: false,
        [aborted]: [Getter],
        [connection]: [Getter],
        [socket]: [Getter],
        _writev: null,
        [destroyed]: [Getter/Setter],
        [writable]: [Getter/Setter],
        [writableFinished]: [Getter],
        [writableObjectMode]: [Getter],
        [writableBuffer]: [Getter],
        [writableEnded]: [Getter],
        [writableNeedDrain]: [Getter],
        [writableHighWaterMark]: [Getter],
        [writableCorked]: [Getter],
        [writableLength]: [Getter]
      },
      [Symbol(kCapture)]: false,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype] {
        accept: [ 'Accept', 'application/json, text/plain, */*', [length]: 2 ],
        'user-agent': [
          'User-Agent',
          'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0',
          [length]: 2
        ],
        encoding: [ 'encoding', 'utf8', [length]: 2 ],
        'client-id': [ 'Client-Id', 'kimne78kx3ncx6brgo4mv6wki5h1ko', [length]: 2 ],
        authorization: [
          'Authorization',
          '',
          [length]: 2
        ],
        host: [ 'Host', 'www.twitch.tv', [length]: 2 ]
      },
      [writableFinished]: [Getter],
      [writableObjectMode]: [Getter],
      [writableLength]: [Getter],
      [writableHighWaterMark]: [Getter],
      [writableCorked]: [Getter],
      [_headers]: [Getter/Setter],
      [connection]: [Getter/Setter],
      [_headerNames]: [Getter/Setter],
      headersSent: [Getter],
      [writableEnded]: [Getter],
      [writableNeedDrain]: [Getter]
    },
    response: {
      status: 400,
      statusText: 'Bad Request',
      headers: {
        connection: 'close',
        'content-type': 'application/xml',
        date: 'Mon, 25 Apr 2022 22:09:52 GMT',
        'set-cookie': [
          'twitch.lohp.countryCode=GB; domain=.twitch.tv; expires=Sat, 20 May 2023 22:09:52 GMT;',
          [length]: 1
        ],
        'transfer-encoding': 'chunked'
      },
      config: {
        transitional: {
          silentJSONParsing: true,
          forcedJSONParsing: true,
          clarifyTimeoutError: false
        },
        adapter: <ref *1> [Function: httpAdapter] {
          [length]: 1,
          [name]: 'httpAdapter',
          [prototype]: [Object]
        },
        transformRequest: [ [Function], [length]: 1 ],
        transformResponse: [ [Function], [length]: 1 ],
        timeout: 0,
        xsrfCookieName: 'XSRF-TOKEN',
        xsrfHeaderName: 'X-XSRF-TOKEN',
        maxContentLength: -1,
        maxBodyLength: -1,
        validateStatus: <ref *2> [Function: validateStatus] {
          [length]: 1,
          [name]: 'validateStatus',
          [prototype]: [Object]
        },
        headers: {
          Accept: 'application/json, text/plain, */*',
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0',
          encoding: 'utf8',
          'Client-Id': 'kimne78kx3ncx6brgo4mv6wki5h1ko',
          Authorization: ''
        },
        raxConfig: {
          retry: 3,
          noResponseRetries: 3,
          retryDelay: 60000,
          statusCodesToRetry: [Array],
          httpMethodsToRetry: [Array],
          onRetryAttempt: [Function],
          backoffType: 'static',
          currentRetryAttempt: 0,
          instance: [Function],
          checkRetryAfter: true,
          maxRetryAfter: 300000
        },
        method: 'get',
        url: 'https://www.twitch.tv/rainbow6',
        data: undefined
      },
      request: <ref *5> ClientRequest {
        _events: [Object: null prototype] {
          abort: [Function],
          aborted: [Function],
          connect: [Function],
          error: [Function],
          socket: [Function],
          timeout: [Function],
          prefinish: [Function]
        },
        _eventsCount: 7,
        _maxListeners: undefined,
        outputData: [ [length]: 0 ],
        outputSize: 0,
        writable: true,
        destroyed: false,
        _last: true,
        chunkedEncoding: false,
        shouldKeepAlive: false,
        maxRequestsOnConnectionReached: false,
        _defaultKeepAlive: true,
        useChunkedEncodingByDefault: false,
        sendDate: false,
        _removedConnection: false,
        _removedContLen: false,
        _removedTE: false,
        _contentLength: 0,
        _hasBody: true,
        _trailer: '',
        finished: true,
        _headerSent: true,
        _closed: false,
        socket: <ref *4> TLSSocket {
          _tlsOptions: [Object],
          _secureEstablished: true,
          _securePending: false,
          _newSessionPending: false,
          _controlReleased: true,
          secureConnecting: false,
          _SNICallback: null,
          servername: 'www.twitch.tv',
          alpnProtocol: false,
          authorized: true,
          authorizationError: null,
          encrypted: true,
          _events: [Object: null prototype],
          _eventsCount: 10,
          connecting: false,
          _hadError: false,
          _parent: null,
          _host: 'www.twitch.tv',
          _readableState: [ReadableState],
          _maxListeners: undefined,
          _writableState: [WritableState],
          allowHalfOpen: false,
          _sockname: null,
          _pendingData: null,
          _pendingEncoding: '',
          server: undefined,
          _server: null,
          ssl: [TLSWrap],
          _requestCert: true,
          _rejectUnauthorized: true,
          parser: null,
          _httpMessage: [Circular *5],
          [Symbol(res)]: [TLSWrap],
          [Symbol(verified)]: true,
          [Symbol(pendingSession)]: null,
          [Symbol(async_id_symbol)]: 277678,
          [Symbol(kHandle)]: [TLSWrap],
          [Symbol(kSetNoDelay)]: false,
          [Symbol(lastWriteQueueSize)]: 0,
          [Symbol(timeout)]: null,
          [Symbol(kBuffer)]: null,
          [Symbol(kBufferCb)]: null,
          [Symbol(kBufferGen)]: null,
          [Symbol(kCapture)]: false,
          [Symbol(kBytesRead)]: 0,
          [Symbol(kBytesWritten)]: 0,
          [Symbol(connect-options)]: [Object],
          [Symbol(RequestTimeout)]: undefined,
          [_connecting]: [Getter],
          [pending]: [Getter],
          [readyState]: [Getter],
          [bufferSize]: [Getter],
          bytesRead: [Getter],
          remoteAddress: [Getter],
          remoteFamily: [Getter],
          remotePort: [Getter],
          localAddress: [Getter],
          localPort: [Getter],
          _bytesDispatched: [Getter],
          bytesWritten: [Getter],
          [_handle]: [Getter/Setter],
          [Symbol(kUpdateTimer)]: [Getter],
          [writable]: [Getter/Setter],
          [writableHighWaterMark]: [Getter],
          [writableObjectMode]: [Getter],
          [writableBuffer]: [Getter],
          [writableLength]: [Getter],
          [writableFinished]: [Getter],
          [writableCorked]: [Getter],
          [writableEnded]: [Getter],
          [writableNeedDrain]: [Getter],
          [destroyed]: [Getter/Setter]
        },
        _header: 'GET /rainbow6 HTTP/1.1\r\n' +
          'Accept: application/json, text/plain, */*\r\n' +
          'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0\r\n' +
          'encoding: utf8\r\n' +
          'Client-Id: kimne78kx3ncx6brgo4mv6wki5h1ko\r\n' +
          'Authorization: ' +
          'Host: www.twitch.tv\r\n' +
          'Connection: close\r\n' +
          '\r\n',
        _keepAliveTimeout: 0,
        _onPendingData: [Function: nop] { [length]: 0, [name]: 'nop' },
        agent: Agent {
          _events: [Object: null prototype],
          _eventsCount: 2,
          _maxListeners: undefined,
          defaultPort: 443,
          protocol: 'https:',
          options: [Object: null prototype],
          requests: [Object: null prototype] {},
          sockets: [Object: null prototype],
          freeSockets: [Object: null prototype] {},
          keepAliveMsecs: 1000,
          keepAlive: false,
          maxSockets: Infinity,
          maxFreeSockets: 256,
          scheduling: 'lifo',
          maxTotalSockets: Infinity,
          totalSocketCount: 1,
          maxCachedSessions: 100,
          _sessionCache: [Object],
          [Symbol(kCapture)]: false
        },
        socketPath: undefined,
        method: 'GET',
        maxHeaderSize: undefined,
        insecureHTTPParser: undefined,
        path: '/rainbow6',
        _ended: true,
        res: IncomingMessage {
          _readableState: [ReadableState],
          _events: [Object: null prototype],
          _eventsCount: 4,
          _maxListeners: undefined,
          socket: [TLSSocket],
          httpVersionMajor: 1,
          httpVersionMinor: 1,
          httpVersion: '1.1',
          complete: true,
          rawHeaders: [Array],
          rawTrailers: [Array],
          aborted: false,
          upgrade: false,
          url: '',
          method: null,
          statusCode: 400,
          statusMessage: 'Bad Request',
          client: [TLSSocket],
          _consuming: true,
          _dumped: false,
          req: [Circular *5],
          responseUrl: 'https://www.twitch.tv/rainbow6',
          redirects: [Array],
          [Symbol(kCapture)]: false,
          [Symbol(kHeaders)]: [Object],
          [Symbol(kHeadersCount)]: 10,
          [Symbol(kTrailers)]: null,
          [Symbol(kTrailersCount)]: 0,
          [Symbol(RequestTimeout)]: undefined,
          [connection]: [Getter/Setter],
          [headers]: [Getter/Setter],
          [trailers]: [Getter/Setter],
          [readable]: [Getter/Setter],
          [readableDidRead]: [Getter],
          [readableAborted]: [Getter],
          [readableHighWaterMark]: [Getter],
          [readableBuffer]: [Getter],
          [readableFlowing]: [Getter/Setter],
          [readableLength]: [Getter],
          [readableObjectMode]: [Getter],
          [readableEncoding]: [Getter],
          [destroyed]: [Getter/Setter],
          [readableEnded]: [Getter]
        },
        aborted: false,
        timeoutCb: null,
        upgradeOrConnect: false,
        parser: null,
        maxHeadersCount: null,
        reusedSocket: false,
        host: 'www.twitch.tv',
        protocol: 'https:',
        _redirectable: Writable {
          _writableState: [WritableState],
          _events: [Object: null prototype],
          _eventsCount: 3,
          _maxListeners: undefined,
          _options: [Object],
          _ended: true,
          _ending: true,
          _redirectCount: 0,
          _redirects: [Array],
          _requestBodyLength: 0,
          _requestBodyBuffers: [Array],
          _onNativeResponse: [Function],
          _currentRequest: [Circular *5],
          _currentUrl: 'https://www.twitch.tv/rainbow6',
          [Symbol(kCapture)]: false,
          [aborted]: [Getter],
          [connection]: [Getter],
          [socket]: [Getter],
          _writev: null,
          [destroyed]: [Getter/Setter],
          [writable]: [Getter/Setter],
          [writableFinished]: [Getter],
          [writableObjectMode]: [Getter],
          [writableBuffer]: [Getter],
          [writableEnded]: [Getter],
          [writableNeedDrain]: [Getter],
          [writableHighWaterMark]: [Getter],
          [writableCorked]: [Getter],
          [writableLength]: [Getter]
        },
        [Symbol(kCapture)]: false,
        [Symbol(kNeedDrain)]: false,
        [Symbol(corked)]: 0,
        [Symbol(kOutHeaders)]: [Object: null prototype] {
          accept: [Array],
          'user-agent': [Array],
          encoding: [Array],
          'client-id': [Array],
          authorization: [Array],
          host: [Array]
        },
        [writableFinished]: [Getter],
        [writableObjectMode]: [Getter],
        [writableLength]: [Getter],
        [writableHighWaterMark]: [Getter],
        [writableCorked]: [Getter],
        [_headers]: [Getter/Setter],
        [connection]: [Getter/Setter],
        [_headerNames]: [Getter/Setter],
        headersSent: [Getter],
        [writableEnded]: [Getter],
        [writableNeedDrain]: [Getter]
      },
      data: '<?xml version="1.0" encoding="UTF-8"?>\n' +
        '<Error></Error>'
    },
    isAxiosError: true,
    toJSON: <ref *6> [Function: toJSON] {
      [length]: 0,
      [name]: 'toJSON',
      [prototype]: { [constructor]: [Circular *6] }
    }
  }
}
Unhandled Rejection Reason: Error: Request failed with status code 400
root@instance-prod:~/TTVDropBot# client_loop: send disconnect: Connection reset

Random Drop Selection #Suggestion

Can you add a feature to random selection that selects only linked games accounts?
I think this be better for everyone.

EDIT: I saw it on the to-do list. Sorry..

Failed to launch the browser process!

(node:7904) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process! spawn C:\Program Files (x86)\Google\Chrome\Application ENOENT

TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md

at onClose (C:\Users\yujis\Downloads\Compressed\TTVDropBot_2\node_modules\puppeteer\lib\cjs\puppeteer\node\BrowserRunner.js:193:20)
at ChildProcess.<anonymous> (C:\Users\yujis\Downloads\Compressed\TTVDropBot_2\node_modules\puppeteer\lib\cjs\puppeteer\node\BrowserRunner.js:185:85)
at ChildProcess.emit (events.js:315:20)
at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
at onErrorNT (internal/child_process.js:465:16)
at processTicksAndRejections (internal/process/task_queues.js:80:21)

(Use TTVDropBot --trace-warnings ... to show where the warning was created)
(node:7904) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:7904) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Program closes when adding a profile path

Tested on mine and friends PC now, and when adding the profile path after adding the chrome.exe path, the program just closes.

However editing the settings file and manually adding the path to that works fine.

Not sure what causes it to auto close during setup.

Unable to set user data directory

When i paste the path for the chrome profile, the program exits instantly.
I even tried to put it in settings manually, but i got like 10 rows of errors.
Is this a known issue, or am I messing up something?

Priority list only watches the games on the list

I know this is how it is intended to work but I think changing it so it watches something random as long as noone can be watched from the prioritylist or allowing an option that does that would be a great feature.

Can't login in time

Using the new 1.3.3 version and I am getting this error after sucefully login into my account.
image
Any fix?

Things to do.....

at the end of each session it would be necessary to check all the channels to see who is live because the bot does not do it at the moment, and it would be necessary to put the user at the first session to mark the completed drops so the bot does not watch the channel with the completed drop

Discord Server - Report Bugs there

Report Bugs on the Discord Server, im way more active on discord.

So i created a Discord Server, if you have any questions, suggestions or bug reports please join the discord and report it there. Im way more active on Discord and can answer mostly instanly, if im online...

Discord Server
Invite Link:
https://discord.gg/rV26FZ2upF

Also if you want information about "Can this can get someone banned" take a look at this question #47

Stuck at getting current progress.

I tried reinstalling and running as admin but itโ€™s stuck at current progress. I opened chrome to
Watch the streamer and made sure progress was being counted but on the app its stuck.

MacOS issue

So I tried to use this software on MacOS the chrome login stuff is all doing well but after i start watching an error occurred

`Watching` https://www.twitch.tv/rainbow6latam...
 
/Users/songboyao/Downloads/TTVDropBot-main/src/Pages/StreamCustomPage.js:267
    const Pointscontent = await Points.getProperty('textContent')
                                       ^

TypeError: Cannot read property 'getProperty' of undefined
    at farmpoint (/Users/songboyao/Downloads/TTVDropBot-main/src/Pages/StreamCustomPage.js:267:40)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async /Users/songboyao/Downloads/TTVDropBot-main/src/Pages/StreamCustomPage.js:111:13
    at async /Users/songboyao/Downloads/TTVDropBot-main/src/Pages/StreamCustomPage.js:80:9
    at async CurrentProgressEvent (/Users/songboyao/Downloads/TTVDropBot-main/src/Pages/StreamCustomPage.js:78:5)
    at async StreamCustomPage (/Users/songboyao/Downloads/TTVDropBot-main/src/Pages/StreamCustomPage.js:67:5)
    at async /Users/songboyao/Downloads/TTVDropBot-main/src/Pages/WatchingPage.js:44:17
    at async /Users/songboyao/Downloads/TTVDropBot-main/src/Pages/WatchingPage.js:37:9
    at async Watch (/Users/songboyao/Downloads/TTVDropBot-main/src/Pages/WatchingPage.js:23:5)

Bot not Functionall

Rust changed the Site Layout, neans the current xpaths dont match with the new ones.

1.3.3 gives me all live channels claimed, but they are not

I just updated to 1.3.3 and opened it to continue watching Sykkuno (had 12%) and after selecting him the bot gives me All live channels claimed... Almost... All but sykkuno's drop are claimed. Maybe it can't differentiate from sykkuno's old drop (that i have indeed claimed) and his new drop (that is at 12%). Check the photo

Login takes too long error even when I auto login!

Currently having a problem with the latest build. Can't login properly ever since the last twitch drop using the program... Can you please check this issue out? I use 2FA so i hope that doesn't cause issues.

Compiled Files Placed in Master - Cloning Slow

Currently the compiled files are placed under the package directory, and each took up >50MB of size. The whole repo was 476.65 MiB making cloning the repo under low bandwidth environment slow.

root@instance-prod:~# git clone https://github.com/Zaarrg/TTVDropBot
Cloning into 'TTVDropBot'...
remote: Enumerating objects: 906, done.
remote: Counting objects: 100% (51/51), done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 906 (delta 16), reused 51 (delta 16), pack-reused 855
Receiving objects: 100% (906/906), 476.65 MiB | 12.04 MiB/s, done.
Resolving deltas: 100% (535/535), done.
Updating files: 100% (44/44), done.

Consider moving the compiled files to a separate branch or use Release. You can always do pre-releases and alpha versions.

crash after getting 5 drops, crash on no streamer online

Version 1.3.2.1

Crash during the night

(node:1856) UnhandledPromiseRejectionWarning: Error: Protocol error (Page.reload): Session closed. Most likely the page has been closed.
    at CDPSession.send (C:\Users\virtual\Desktop\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:195:35)
    at next (C:\Users\virtual\Desktop\TTVDropBot\node_modules\puppeteer-extra-plugin-stealth\evasions\sourceurl\index.js:30:43)
    at CDPSession.send (C:\Users\virtual\Desktop\TTVDropBot\node_modules\puppeteer-extra-plugin-stealth\evasions\sourceurl\index.js:33:18)
    at Page.reload (C:\Users\virtual\Desktop\TTVDropBot\node_modules\puppeteer\lib\cjs\puppeteer\common\Page.js:794:26)
    at MapDrops (C:\Users\virtual\Desktop\TTVDropBot\src\functions\MapDrops.js:5:21)
    at CheckProgressCurrentPage (C:\Users\virtual\Desktop\TTVDropBot\src\Checks\CheckProgressCurrentPage.js:13:11)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async C:\Users\virtual\Desktop\TTVDropBot\src\Pages\StreamPage.js:64:9
    at async CurrentProgressEvent (C:\Users\virtual\Desktop\TTVDropBot\src\Pages\StreamPage.js:62:5)
(Use `TTVDropBot --trace-warnings ...` to show where the warning was created)
(node:1856) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:1856) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Starting it again it doesn't find any drops (Checking for Live Channels is empty because all are offline except for iiTzTimmy where I got the drop already). If pressing enter at "Select Twitch Channel to start Watching?" it crashes to another error (I expected it will wait for someone to come online)

(node:11172) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'value' of undefined
    at ListPrompt.getCurrentValue (C:\Users\virtual\Desktop\TTVDropBot\node_modules\inquirer\lib\prompts\list.js:148:53)
    at MapSubscriber._next (C:\Users\virtual\Desktop\TTVDropBot\node_modules\rxjs\internal\operators\map.js:49:35)
    at MapSubscriber.Subscriber.next (C:\Users\virtual\Desktop\TTVDropBot\node_modules\rxjs\internal\Subscriber.js:66:18)
    at TakeSubscriber._next (C:\Users\virtual\Desktop\TTVDropBot\node_modules\rxjs\internal\operators\take.js:54:30)
    at TakeSubscriber.Subscriber.next (C:\Users\virtual\Desktop\TTVDropBot\node_modules\rxjs\internal\Subscriber.js:66:18)
    at Interface.handler (C:\Users\virtual\Desktop\TTVDropBot\node_modules\rxjs\internal\observable\fromEvent.js:22:28)
    at Interface.emit (events.js:327:22)
    at Interface._onLine (readline.js:337:10)
    at Interface._line (readline.js:666:8)
    at Interface._ttyWrite (readline.js:1010:14)
(Use `TTVDropBot --trace-warnings ...` to show where the warning was created)
(node:11172) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:11172) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Linux ready

Hey,
would be a cool feature if you make an linux version for it,
easy to make (I guess?!) since many people got a little linux server to run a few things its cool to run the script there so you dont need your pc to be online.

with kind regards

Send webhooks on events (enhancement)

Hi!
I'm running TTVDropBot on server and I'd like it to send webhooks on checks (fe. every so often or on claimed drop...)

for example Discord Webhook
image

I don't know typescript but I've worked with webhooks before so I can help at least with that!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.