Official support and updates for Dank Grinder have been discontinued indefinitely. While the possibility of future continuation has not been eliminated, it is unlikely and should not be counted on. We would like to exhibit the following fork as a good, up-to-date alternative of the official version: https://github.com/V4NSH4J/dankgrinder
The most feature-rich, advanced Dank Memer automation tool.
Want to join the community or need support? Join our Discord. Have a question? Create a question issue. Want to suggest a feature? Create a suggestion issue. Encountered a bug? Report a bug. Want to contribute? Read our contribution guidelines.
- Can run many instances at once
- Uses very little system resources
- High configurability; configure custom commands and much more
- Automation of most currency commands and blackjack
- Responds to fishing and hunting events (i.e. captures the dragon and special fish)
- Responds to global events, search, and postmeme
- Automatically uses tidepods and buys lifesavers when dying from them
- Automatically buys a fishing pole, hunting rifle or laptop if they have broken
- Download the latest release for your operating system here (darwin is for macOS), or build from source. If you build from source you can delete everything besides the compiled binaries and config.yml.
- Extract the archive
- Configure. Make sure
token
andchannel_id
fields of the instance are set, it will not run otherwise
- Double click dankgrinder.exe. If the program closes immediately after opening it, open a command prompt and drag the executable to it, then hit enter. You will now be able to see the error
- Run the binary:
$ ./dankgrinder
- Run by double clicking the dankgrinder binary
- Go to Discord, logged into the account you want to use
- Open the inspector by pressing
ctrl
+shift
+i
- Click the "network" tab
- Refresh the page
- Look for any entry called "science" and click on it
- Expand the "request headers" and look for the value "authorization", that is your token
To obtain a channel id for config.yml, you will need to have developer mode enabled.
- Go to your user settings on Discord
- Click "appearance" under "app settings"
- Scroll down to "advanced" and enable developer mode
You can now right click any user or channel to obtain the id.
If you use an architecture other than amd64, or you want to build from source for another reason, doing so is quite simple.
A working Go installation, see https://golang.org/doc/install.
- Clone the repository:
$ git clone https://github.com/dankgrinder/dankgrinder.git
- Build:
$ make build
The executables should then be in the /build
folder.
All configuration can be done by editing config.yml with your editor of choice (e.g. Visual Studio Code, Sublime Text, Notepad++). The comments in the file itself provide extra explanation where necessary. For the bot to run, you must at least enter an authorization token and a channel id. If you are running into issues, you can join our Discord.
If you do not know how yaml works and are getting fatal errors, use this guide to learn the basics of yaml. Configuration errors are characterized by a near-instant fatal error when starting the program. If the program opens and then closes immediately on Windows, open a command prompt first, drag the executable onto it and hit enter. You should now be able to see the error.
A question mark after a field name means this field is optional.
Name | Type | Description |
---|---|---|
clusters |
dictionary[string]cluster object | The clusters of instances run by the program. Each has at least a master, and optionally more instances |
shifts |
array of shift objects | One or more shifts which the instances use to schedule switching between the active and dormant state. Read more about shifts |
features |
features object | Several feature configurations which apply to all instances |
compatibility |
compatibility object | Several compatibility options which apply to all instances |
suspicion_avoidance |
suspicion avoidance object | Several techniques to avoid suspicion which apply to all instances |
Name | Type | Description |
---|---|---|
master |
instance object | The master instance of the cluster |
instances |
array of instance objects | The other instances in this cluster |
Name | Type | Description |
---|---|---|
token |
string | The Discord authorization token of the instance |
channel_id |
string | The channel id this instance sends and receives messages in, you must have Discord developer mode enabled to obtain one |
features? |
features object | Override the default features object of the config only for this specific instance, any fields left out will not be overridden and vice-versa, see default values and when you can leave out fields |
suspicion_avoidance? |
suspicion avoidance object | Override the default suspicion avoidance object of the config only for this specific instance, any fields left out will not be overridden and vice-versa, see default values and when you can leave out fields |
shifts? |
array of shift objects | Override the default shifts array of the config only for this specific instance, see default values and when you can leave out fields |
Name | Type | Description |
---|---|---|
state |
string | The state of the program for this shift, either active or dormant |
duration.base |
integer | The base duration of this shift in seconds. Read more about base and variation |
duration.variation |
integer | The random variation of this shift in seconds. Read more about base and variation |
Name | Type | Description |
---|---|---|
commands |
commands object | Enable or disable certain commands |
custom_commands |
array of custom command object | Configure your own, custom commands for the program to use |
auto_buy |
auto-buy object | Options for the automatic buying of certain items if it is detected that they are not available |
auto_sell |
auto-sell object | Options for the automatic, periodic selling of certain items |
auto_gift |
auto-gift object | Options for the automatic, periodic gifting of certain items to the master instance |
auto_blackjack |
auto-blackjack object | Options for automatically using the blackjack command |
auto_share |
auto-share object | Options for automatically sharing money with the master instance |
auto_tidepod |
auto-tidepod object | Options for automatically using tidepods |
balance_check |
balance check object | Options for checking balance |
verbose_log_to_stdout |
boolean | Whether or not to hook info events of instances to the standard logger |
log_to_file |
boolean | Whether or not to log errors and information to a file |
debug |
boolean | Enable logging debug level information. Currently has no effect |
Name | Type | Description |
---|---|---|
beg |
boolean | Enable the pls beg command |
postmeme |
boolean | Enable the pls postmeme command |
search |
boolean | Enable the pls search command |
highlow |
boolean | Enable the pls highlow command |
fish |
boolean | Enable the pls fish command |
hunt |
boolean | Enable the pls hunt command |
Name | Type | Description |
---|---|---|
value |
string | The value of the command, for example: pls dep max |
interval |
integer | The interval at which this command will be re-sent in seconds. Time may vary depending on other commands and responses. If 0 the command will only run once in the beginning of every active shift |
amount |
integer | The amount of times this command will be run in total every active shift. Set to 0 for no limit |
pause_below_balance |
integer | A wallet balance value below which this command will not be sent. The balance is read from the balance check functionality. Consider having the interval of this quite low, to make sure the balance the program thinks you have is as up-to-date as possible |
Name | Type | Description |
---|---|---|
fishing_pole |
boolean | Enable the automatic purchase of a fishing pole when it is detected that one is not available |
hunting_rifle |
boolean | Enable the automatic purchase of a hunting rifle when it is detected that one is not available |
laptop |
boolean | Enable the automatic purchase of a laptop when it is detected that one is not available |
Name | Type | Description |
---|---|---|
enable |
boolean | Whether or not to enable automatic selling |
interval |
integer | The interval at which items will be sold during an active shift. If set to 0, items will only be sold once at the beginning of every active shift |
items |
array of strings | The Dank Memer item ids of the items to sell |
Name | Type | Description |
---|---|---|
enable |
boolean | Whether or not to enable automatic gifting to the master instance |
interval |
integer | The interval at which items will be gifted during an active shift. If set to 0, items will only be gifted once at the beginning of every active shift |
items |
array of strings | The Dank Memer item ids of the items to gift |
Name | Type | Description |
---|---|---|
enable |
boolean | Whether or not to enable automatic blackjack |
priority |
boolean | Whether or not to give the command priority over other, regular commands if there are commands queued |
amount |
integer | The amount to bet every time, set to 0 to bet the maximum amount of coins |
pause_below_balance |
integer | The balance below which the program should stop betting. The balance is read from the balance check functionality. Consider having the interval of this quite low, to make sure the balance the program thinks you have is as up-to-date as possible |
logic_table |
dictionary[string]dictionary[string]string | What to do for every possible blackjack hand. The string values are the exact response that will be triggered |
Name | Type | Description |
---|---|---|
enable |
boolean | Whether or not to enable automatically giving money to the master |
fund |
boolean | Whether or not master instances should fund others that have auto-share enabled. This field is only read by master instances and ignored by others. It will fund them up to their minimum auto-share balance |
maximum_balance |
integer | The amount of money the instance may have before giving them to the master instance |
minimum_balance |
integer | The amount of money the instance should keep after giving money to the master instance and the amount the master will fund it to if an instance requests it |
Name | Type | Description |
---|---|---|
enable |
boolean | Whether or not to enable automatic usage of tidepods |
interval |
integer | The interval in seconds at which the program attempts to use tidepods. If set to 0, a tidepod will only be used once at the beginning of every active shift |
buy_lifesaver_on_death |
bool | Whether or not to buy a lifesaver after dying from tidepod usage |
Name | Type | Description |
---|---|---|
enable |
boolean | Whether or not to enable balance checks |
interval |
integer | The interval in seconds at which the program checks the balance. This is the same as the auto-share interval, if enabled |
Name | Type | Description |
---|---|---|
postmeme |
array of strings | What options can be chosen for the postmeme command. The program will pick one randomly |
allowed_searches |
array of strings | The searches the application is allowed to pick. Items higher/earlier in the list have higher priority |
search_cancel |
array of strings | List of things the program will say to cancel a search when no allowed searches are provided. It will pick one randomly |
cooldown |
cooldown object | Cooldowns of commands (not custom commands) |
await_response_timeout |
integer | The time that the program will wait for a response when it is expecting one. Set to a higher value when Dank Memer is slow to respond and this causes issues. Values below 3 are not recommended |
Name | Type | Description |
---|---|---|
beg |
integer | The cooldown of the beg command in seconds, set a few seconds higher to account for network delay |
search |
integer | The cooldown of the search command in seconds, set a few seconds higher to account for network delay |
highlow |
integer | The cooldown of the highlow command in seconds, set a few seconds higher to account for network delay |
postmeme |
integer | The cooldown of the postmeme command in seconds, set a few seconds higher to account for network delay |
fish |
integer | The cooldown of the fish command in seconds, set a few seconds higher to account for network delay |
hunt |
integer | The cooldown of the hunt command in seconds, set a few seconds higher to account for network delay |
blackjack |
integer | The cooldown of the blackjack command in seconds, set a few seconds higher to account for network delay |
sell |
integer | The cooldown of the sell command in seconds, set a few seconds higher to account for network delay |
gift |
integer | The cooldown of the gift command in seconds, set a few seconds higher to account for network delay |
share |
integer | The cooldown of the share command in seconds, set a few seconds higher to account for network delay |
Name | Type | Description |
---|---|---|
typing |
typing object | Options for the use of typing when sending messages |
message_delay |
message delay object | Delay between receiving a message and starting to type and send a response |
Name | Type | Description |
---|---|---|
base |
integer | The base duration of typing in milliseconds. Read more about base and variation |
variation |
integer | The random variation of typing in milliseconds. Read more about base and variation |
speed |
integer | The typing speed based on message length, in characters per minute |
Name | Type | Description |
---|---|---|
base |
integer | The base delay in milliseconds. Read more about base and variation |
variation |
integer | The random variation of the delay in milliseconds. Read more about base and variation |
A base is a value that forms the base for a final result; it is the value that the program starts with.
A variation is a random value, from 0 up to but excluding n, added to a starting value.
Say a base value of 100, and a variation of 50 are used. The final result will be a number from 100 up to and including 149 because of the random value added by the variation.
You can use shifts to make sure the bot is not suspicious because it is too active. We highly recommended using this option, and not running this program 24/7. An uptime of 50% per instance or less is advisable.
For example, if you would like to have the bot be active for 6 hours per day, then inactive for the remaining 18 you would do something like this (note that it will loop this, so after completing the last shift it will go back to the first):
shifts:
- state: "active"
duration:
base: 21600
variation: 0
- state: "dormant"
duration:
base: 64800
variation: 0
custom_commands:
- value: "pls command1"
interval: 60
- value: "pls command2"
interval: 300
amount: 5
- value: "pls command3"
- value: "pls buy zz 20"
pause_below_balance: 9000000
In example custom command 1, the value is sent every 60 seconds for infinite times, until the program enters the dormant state.
In example custom command 2, the value is sent every 5 minutes for a total of 5 times per active shift.
In example custom command 3, the value is sent once in the beginning of every active shift.
In example custom command 4, 20 zz will be bought whenever the balance is above 9,000,000.
Example if you would like to run two instances simultaneously and 24/7 (this shift configuration is not recommended):
clusters:
default:
master:
token: "bmljZSB0cnkgYnV0IHRoaXMgaXM.bm90IGE.cmVhbCB0b2tlbg"
channel_id: "791694339116892202"
instances:
- token: "b2YgY291cnNlIHRoaXM.aXNuJ3QgYQ.cmVhbCB0b2tlbiBlaXRoZXIsIHNpbGx5"
channel_id: "791694383098495047"
Because of the way Go structs work, most times, when you leave out a field in your config, it will default to a value such as 0
or false
. This is useful to avoid clutter. In the default config many fields are left out because their values would have been set to 0
or false
, but they are still available for use, of course. Simply lookup what configuration is possible for your object of choice in the configuration documentation above.
The only exception is the fields which are currently marked as optional, the features
, suspicion_avoidance
and shifts
fields on every instance object. These fields are used to override the values you have specified in the regular features
, suspicion_avoidance
and shifts
objects in the config. If you leave out one of these fields or a child field of one of these fields, the default configuration is not overridden and is used instead.
clusters:
default:
master:
token: "bmljZSB0cnkgYnV0IHRoaXMgaXM.bm90IGE.cmVhbCB0b2tlbg" # Instance 1
channel_id: "791694339116892202"
instances:
- token: "b2YgY291cnNlIHRoaXM.aXNuJ3QgYQ.cmVhbCB0b2tlbiBlaXRoZXIsIHNpbGx5" # Instance 2
channel_id: "791694383098495047"
shifts:
- state: "active"
- token: "MTI3OTgzNDcyMTkzNDM4Mg.ZmRzdg.dGhpcyBpcyBub3QgYW4gYWN0dWFsIH" # Instance 3
channel_id: "791691923098486933"
features:
auto_tidepod:
enable: false
shifts:
- state: "active"
base: 21600
- state: "dormant"
base: 32400
In the example above, all instances use a shift configuration of 6 hours active, 9 hours dormant, except for the second instance. This instance overrides the shift configuration defined below with a shift configuration that is always active.
The third instance in this example, overrides the normal configuration with one where auto-tidepod is disabled (the rest of the config is left out for simplicity), the rest of the instances would still use auto-tidepod if it was enabled.
This is a self-bot. Such bots are against Discord's terms of service. Automation of Dank Memer commands also breaks Dank Memer's rules. By using this software you acknowledge that we take no responsibility whatsoever for any action taken against your account, whether by Discord or Dank Memer, for not abiding by their respective rules.
Despite this, we believe the chance of detection by either Discord or Dank Memer to be low provided that you take appropriate measures to ensure this. This includes but is not limited to running the bot only in private channels, not being open about the fact that you use it and not running so much as to raise suspicion.