# CorpBot.py
A *slightly* less clumsy python bot for discord

***

# Basic Settings

The bot's basic settings should be in a file called `settings_dict.json` in the same folder as the `Main.py` file.  Some basic formatting of this file would look like so:

```json
{
    "prefix": "your_custom_prefix_here",
    "token": "your_token_here",
    "weather": "your_weather_api_key_here",
    "currency": "your_currency_api_key_here"
}
```

You'll want to replace the values with your own.  The `prefix` key can be omitted, and the bot will fallback on its default `$` prefix.

***

# Command List

A list of cogs, commands, and descriptions:

[Actions](#actions), [Admin](#admin), [AmdArk](#amdark), [Ascii](#ascii), [Beer](#beer), [Bot](#bot), [BotAdmin](#botadmin), [CAH](#cah), [Calc](#calc), [Channel](#channel), [ChatterBot](#chatterbot), [Claptrap](#claptrap), [Clippy](#clippy), [CogManager](#cogmanager), [Comic](#comic), [DJRoles](#djroles), [Debugging](#debugging), [Dice](#dice), [Dictionary](#dictionary), [DisableCommand](#disablecommand), [Discogs](#discogs), [DrBeer](#drbeer), [EightBall](#eightball), [Embed](#embed), [Emoji](#emoji), [Encode](#encode), [Example](#example), [Face](#face), [Feed](#feed), [Fliptime](#fliptime), [GameLookup](#gamelookup), [Giphy](#giphy), [Groot](#groot), [Help](#help), [Humor](#humor), [Hw](#hw), [IntelArk](#intelark), [Invite](#invite), [JazUtils](#jazutils), [Jpeg](#jpeg), [LangFilter](#langfilter), [Lists](#lists), [Lockdown](#lockdown), [MadLibs](#madlibs), [Minesweeper](#minesweeper), [Morse](#morse), [Music](#music), [Mute](#mute), [NvidiaArk](#nvidiaark), [OfflineUser](#offlineuser), [OpenCore](#opencore), [PciUsb](#pciusb), [Plist](#plist), [Printer](#printer), [Profile](#profile), [Promote](#promote), [Quote](#quote), [RPS](#rps), [RateLimit](#ratelimit), [Reddit](#reddit), [Remind](#remind), [Responses](#responses), [Search](#search), [SecretSanta](#secretsanta), [Server](#server), [ServerStats](#serverstats), [Settings](#settings), [SettingsDict](#settingsdict), [Setup](#setup), [Spooktober](#spooktober), [Stream](#stream), [Strike](#strike), [Telephone](#telephone), [TempRole](#temprole), [Time](#time), [Translate](#translate), [Turret](#turret), [Uptime](#uptime), [UrbanDict](#urbandict), [UserRole](#userrole), [VoteKick](#votekick), [WatchURL](#watchurl), [Weather](#weather), [Welcome](#welcome), [Wiki](#wiki), [Xp](#xp), [XpBlock](#xpblock), [XpStack](#xpstack)

## Actions
####	Actions Cog (6 commands) - Actions.py Extension:
	  $boop [member]
	   └─ Boop da snoot.
	  $drink [member]
	   └─ Drink like a boss.
	  $eat [member]
	   └─ Eat like a boss.
	  $highfive [member]
	   └─ High five like a boss.
	  $pet [member]
	   └─ pet kitties.
	  $spook [member]
	   └─ sp00ktober by camiel.

## Admin
####	Admin Cog (28 commands) - Admin.py Extension:
	  $addadmin [role]
	   └─ Adds a new role to the admin list (admin only).
	  $addxprole [role] [xp]
	   └─ Adds a new role to the xp promotion/demotion system (admin only).
	  $broadcast [message]
	   └─ Broadcasts a message to all connected servers.  Can only be done by the owner.
	  $defaultchannel
	   └─ Lists the server's default channel, whether custom or not.
	  $lock
	   └─ Toggles whether the bot only responds to admins (admin only).
	  $onexprole [yes_no]
	   └─ Gets and sets whether or not to remove all but the current xp role a user has...
	  $prunexproles
	   └─ Removes any roles from the xp promotion/demotion system that are no longer on...
	  $rawrules
	   └─ Display the markdown for the server's rules (bot-admin only).
	  $removeadmin [role]
	   └─ Removes a role from the admin list (admin only).
	  $removemotd [chan]
	   └─ Removes the message of the day from the selected channel.
	  $removexprole [role]
	   └─ Removes a role from the xp promotion/demotion system (admin only).
	  $setdefaultchannel [channel]
	   └─ Sets a replacement default channel for bot messages (admin only).
	  $setdefaultrole [role]
	   └─ Sets the default role or position for auto-role assignment.
	  $sethackrole [role]
	   └─ Sets the required role ID to add/remove hacks (admin only).
	  $setlinkrole [role]
	   └─ Sets the required role ID to add/remove links (admin only).
	  $setmadlibschannel [channel]
	   └─ Sets the channel for MadLibs (admin only).
	  $setrules [rules]
	   └─ Set the server's rules (bot-admin only).
	  $setstoprole [role]
	   └─ Sets the required role ID to stop the music player (admin only).
	  $settagrole [role]
	   └─ Sets the required role ID to add/remove tags (admin only).
	  $settopic [channel] [message]
	   └─ Sets the channel topic of the passed channel (bot-admin only).
	  $setxp [member] [xpAmount]
	   └─ Sets an absolute value for the member's xp (admin only).
	  $setxpreserve [member] [xpAmount]
	   └─ Set's an absolute value for the member's xp reserve (admin only).
	  $setxprole [role]
	   └─ Sets the required role ID to give xp, gamble, or feed the bot (admin only).
	  $slowmode [channel] [seconds]
	   └─ Sets the number of seconds for slow mode for the passed channel - use any num...
	  $stoprole
	   └─ Lists the required role to stop the bot from playing music.
	  $xplimit [limit]
	   └─ Gets and sets a limit to the maximum xp a member can get.  Pass a negative va...
	  $xpreservelimit [limit]
	   └─ Gets and sets a limit to the maximum xp reserve a member can get.  Pass a neg...
	  $xprole
	   └─ Lists the required role to give xp, gamble, or feed the bot.

## AmdArk
####	AmdArk Cog (1 command) - AmdArk.py Extension:
	  $amdark [text] (AKA: iamd, aark)
	   └─ Searches AMD's site for CPU info.

## Ascii
####	Ascii Cog (2 commands) - Ascii.py Extension:
	  $ascii [text]
	   └─ Beautify some text.
	  $asciifonts [search_term] (AKA: font, fonts, fontlist)
	   └─ Lists the available ascii fonts.

## Beer
####	Beer Cog (4 commands) - Beer.py Extension:
	  $abv [original_gravity] [final_gravity]
	   └─ Calculates the alcohol by volume for the passed original and final gravity.
	  $hops [batch_size] [original_gravity] [target_ibu] [alpha_acid_percent] [boil_time_minutes] [output_unit] (AKA: hop, hops4ibu, hopsforibu, hibu)
	   └─ Calculates the amount of hops required to reach the target IBU.
	  $ibu [batch_size] [original_gravity] [hops_amount] [alpha_acid_percent] [boil_time_minutes] (AKA: bitternes, bitter)
	   └─ Calculates the IBU (International Bitterness Units) for the given values.  Th...
	  $vconvert [volume] [from_type] [to_type] (AKA: vcon, vconv)
	   └─ Converts between Ounces, Gallons, Liters, Milliliters, and Beer Barrels.  Fro...

## Bot
####	Bot Cog (24 commands) - Bot.py Extension:
	  $adminunlim [yes_no]
	   └─ Sets whether or not to allow unlimited xp to admins (bot-admin only).
	  $basadmin [yes_no]
	   └─ Sets whether or not to treat bot-admins as admins with regards to xp (admin o...
	  $botinfo
	   └─ Lists some general stats about the bot.
	  $cloc
	   └─ Outputs the total count of lines of code in the currently installed repo.
	  $getimage <image>
	   └─ Tests downloading - owner only
	  $hidehostname [yes_no]
	   └─ Queries or turns on/off hostname hiding in the hostinfo command (owner-only).
	  $hostinfo
	   └─ List info about the bot's host environment.
	  $joinpm [yes_no]
	   └─ Sets whether or not to pm the rules to new users when they join (bot-admin on...
	  $listengame [game]
	   └─ Sets the listening status of the bot (owner-only).
	  $nickname [name]
	   └─ Set the bot's nickname (admin-only).
	  $ping
	   └─ Feeling lonely?
	  $playgame [game]
	   └─ Sets the playing status of the bot (owner-only).
	  $pres [playing_type=0] [status_type=online] [game] [url]
	   └─ Changes the bot's presence (owner-only).
	  $reboot [install_or_update]
	   └─ Reboots the bot (owner only).  Can optionally take install or update as argum...
	  $servers
	   └─ Lists the number of servers I'm connected to!
	  $setavatar [filename] (AKA: setavi, setpfp)
	   └─ Sets the bot's avatar (owner only).
	  $setbotparts [parts]
	   └─ Set the bot's parts - can be a url, formatted text, or nothing to clear.
	  $setname [name]
	   └─ Sets the bot's name - may take awhile to reflect (owner only).
	  $shutdown
	   └─ Shuts down the bot (owner only).
	  $source
	   └─ Link the github source.
	  $speedtest
	   └─ Run a network speed test (owner only).
	  $status [status]
	   └─ Gets or sets the bot's online status (owner-only).
	  $streamgame [url] [game]
	   └─ Sets the streaming status of the bot, requires the url and the game (owner-on...
	  $watchgame [game]
	   └─ Sets the watching status of the bot (owner-only).

## BotAdmin
####	BotAdmin Cog (17 commands) - BotAdmin.py Extension:
	  $adddbl [member] (AKA: dbladd)
	   └─ Adds the passed member to the default role blacklist - preventing the bot fro...
	  $ban [members] [reason] (AKA: yote, bean)
	   └─ Bans the passed members for the specified reason.
	  $banned [user_id]
	   └─ Queries the guild's ban list for the passed user id and responds with whether...
	  $botowneroveradmin [yes_no]
	   └─ Gets or sets whether the bot owner(s) can kick/ban/klean admins and under (se...
	  $cleardbl  (AKA: dblclear)
	   └─ Clears the default role blacklist (bot-admin only).
	  $ignore [member_or_role]
	   └─ Adds a member or role to the bot's "ignore" list (bot-admin only).
	  $ignored
	   └─ Lists the users and roles currently being ignored.
	  $kick [members] [reason] (AKA: yeet)
	   └─ Kicks the passed members for the specified reason.
	  $klean [members] [reason] (AKA: scam)
	   └─ Bans the passed members for the specified reason, then unbans them in order t...
	  $listdbl  (AKA: dbllist)
	   └─ Lists the members in the default role blacklist.
	  $listen [member_or_role]
	   └─ Removes a member or role from the bot's "ignore" list (bot-admin only).
	  $listenall
	   └─ Clears the bot's ignore list (bot-admin only).
	  $rembanmessages [number_of_days]
	   └─ Gets or sets the default number of days worth of messages to remove when bann...
	  $remdbl [member] (AKA: dblrem)
	   └─ Removes the passed user from the default role blacklist (bot-admin only).
	  $removeinvitelinks [yes_no]
	   └─ Enables/Disables auto-deleting discord invite links in chat (bot-admin only).
	  $setuserparts [member] [parts]
	   └─ Set another user's parts list (owner only).
	  $unban [members] [reason]
	   └─ Unbans the passed members for the specified reason.

## CAH
####	CAH Cog (17 commands) - CAH.py Extension:
	  $addbot
	   └─ Adds a bot to the game.  Can only be done by the player who created the game.
	  $addbots [number]
	   └─ Adds bots to the game.  Can only be done by the player who created the game.
	  $cahgames
	   └─ Displays up to 10 CAH games in progress.
	  $flushhand
	   └─ Flushes the cards in your hand - can only be done once per game.
	  $game [message]
	   └─ Displays the game's current status.
	  $hand
	   └─ Shows your hand.
	  $idlekick [setting]
	   └─ Sets whether or not to kick members if idle for 5 minutes or more.  Can only ...
	  $joincah [id]
	   └─ Join a Cards Against Humanity game.  If no id or user is passed, joins a rand...
	  $laid
	   └─ Shows who laid their cards and who hasn't.
	  $lay [card]
	   └─ Lays a card or cards from your hand.  If multiple cards are needed, separate ...
	  $leavecah
	   └─ Leaves the current game you're in.
	  $newcah
	   └─ Starts a new Cards Against Humanity game.
	  $pick [card]
	   └─ As the judge - pick the winning card(s).
	  $removebot [id]
	   └─ Removes a bot from the game.  Can only be done by the player who created the ...
	  $removeplayer [name]
	   └─ Removes a player from the game.  Can only be done by the player who created t...
	  $say [message]
	   └─ Broadcasts a message to the other players in your game.
	  $score
	   └─ Display the score of the current game.

## Calc
####	Calc Cog (1 command) - Calc.py Extension:
	  $calc [formula] (AKA: calculate, math)
	   └─ Do some math.

## Channel
####	Channel Cog (4 commands) - Channel.py Extension:
	  $islocked
	   └─ Says whether the bot only responds to admins.
	  $listadmin
	   └─ Lists admin roles and id's.
	  $log [messages=25] [chan]
	   └─ Logs the passed number of messages from the given channel - 25 by default (ad...
	  $rules
	   └─ Display the server's rules.

## ChatterBot
####	ChatterBot Cog (2 commands) - ChatterBot.py Extension:
	  $chat [message]
	   └─ Chats with the bot.
	  $setchatchannel [channel]
	   └─ Sets the channel for bot chatter.

## Claptrap
####	Claptrap Cog (1 command) - Claptrap.py Extension:
	  $claptrap
	   └─ Can I shoot something now? Or climb some stairs? SOMETHING exciting?

## Clippy
####	Clippy Cog (1 command) - Clippy.py Extension:
	  $clippy [text]
	   └─ I *know* you wanted some help with something - what was it?

## CogManager
####	CogManager Cog (4 commands) - CogManager.py Extension:
	  $extension [extension] (AKA: extensions, ext)
	   └─ Outputs the cogs and command count for the passed extension - or all extensio...
	  $imports [extension]
	   └─ Outputs the extensions imported by the passed extension.
	  $reload [extension]
	   └─ Reloads the passed extension - or all if none passed.
	  $update [reset]
	   └─ Updates from git, pass "reset" or "-reset" to this command to first run "git ...

## Comic
####	Comic Cog (12 commands) - Comic.py Extension:
	  $calvin [date]
	   └─ Displays the Calvin & Hobbes comic for the passed date (MM-DD-YYYY) from 11-1...
	  $farside [date]
	   └─ Displays the Far Side comic for the passed date (MM-DD-YYYY) from 2 days ago ...
	  $garfield [date]
	   └─ Displays the Garfield comic for the passed date (MM-DD-YYYY) from 06-19-1978 ...
	  $gmg [date]
	   └─ Displays the Garfield Minus Garfield comic for the passed date (MM-DD-YYYY) f...
	  $peanuts [date]
	   └─ Displays the Peanuts comic for the passed date (MM-DD-YYYY) from 10-02-1950 t...
	  $randcalvin
	   └─ Displays a random Calvin & Hobbes comic from 11-18-1985 to today.
	  $randfarside
	   └─ Displays a random Far Side comic from 2 days ago to today.
	  $randgarfield
	   └─ Displays a random Garfield comic from 06-19-1978 to today.
	  $randgmg
	   └─ Displays a random Garfield Minus Garfield comic from 02-13-2008 to today.
	  $randpeanuts
	   └─ Displays a random Peanuts comic from 10-02-1950 to today.
	  $randxkcd
	   └─ Displays a random XKCD comic from 01-01-2006 to today.
	  $xkcd [date]
	   └─ Displays the XKCD comic for the passed date (MM-DD-YYYY) from 01-01-2006 to t...

## DJRoles
####	DJRoles Cog (6 commands) - DJRoles.py Extension:
	  $adddj [role] (AKA: newdj)
	   └─ Adds a new role to the dj list (bot-admin only).
	  $addmc [role] (AKA: newmc)
	   └─ Adds a new role to the mc list (bot-admin only).
	  $listdj
	   └─ Lists dj roles and id's.
	  $listmc
	   └─ Lists mc roles and id's.
	  $removedj [role] (AKA: remdj, deletedj, deldj)
	   └─ Removes a role from the dj list (bot-admin only).
	  $removemc [role] (AKA: remmc, deletemc, delmc)
	   └─ Removes a role from the mc list (bot-admin only).

## Debugging
####	Debugging Cog (9 commands) - Debugging.py Extension:
	  $clean [messages] [chan]
	   └─ Cleans the passed number of messages from the given channel (admin only).
	  $cleardebug
	   └─ Deletes the debug.txt file (owner only).
	  $heartbeat
	   └─ Write to the console and attempt to send a message (owner only).
	  $logdisable [options]
	   └─ Disables the passed, comma-delimited log vars.  If run with no arguments, dis...
	  $logenable [options]
	   └─ Enables the passed, comma-delimited log vars (bot-admin only).
	  $logging
	   └─ Outputs whether or not we're logging is enabled, the log channel, and any set...
	  $logpreset [preset]
	   └─ Can select one of 4 available presets - off, quiet, normal, verbose (bot-admi...
	  $setdebug [debug]
	   └─ Turns on/off debugging (owner only - always off by default).
	  $setlogchannel [channel]
	   └─ Sets the channel for Logging (bot-admin only).

## Dice
####	Dice Cog (1 command) - Dice.py Extension:
	  $roll [dice]
	   └─ Performs up to 10 space-delimited dice rolls in NdN±Na|d format.

## Dictionary
####	Dictionary Cog (1 command) - Dictionary.py Extension:
	  $dictionary [word] (AKA: dict)
	   └─ Queries dictionaryapi.dev for the definition of the word passed.

## DisableCommand
####	DisableCommand Cog (9 commands) - DisableCommand.py Extension:
	  $adminallow [yes_no]
	   └─ Sets whether admins can access disabled commands (admin-only).
	  $badminallow [yes_no]
	   └─ Sets whether bot-admins can access disabled commands (admin-only).
	  $disable [command_or_cog_name]
	   └─ Disables the passed command or all commands in the passed cog (admin-only).  ...
	  $disableall
	   └─ Disables all enabled commands outside this module (admin-only).
	  $disabledreact [yes_no]
	   └─ Sets whether the bot reacts to disabled commands when attempted (admin-only).
	  $enable [command_or_cog_name]
	   └─ Enables the passed command or all commands in the passed cog (admin-only).  C...
	  $enableall
	   └─ Enables all disabled commands (admin-only).
	  $isdisabled [command_or_cog_name]
	   └─ Outputs whether the passed command - or all commands in a passed cog are disa...
	  $listdisabled
	   └─ Lists all disabled commands (admin-only).

## Discogs
####	Discogs Cog (1 command) - Discogs.py Extension:
	  $discogs [search]
	   └─ Perform a general discogs.com search. Could return albums, artits, etc.

## DrBeer
####	DrBeer Cog (1 command) - DrBeer.py Extension:
	  $drbeer
	   └─ Put yourself in your place.

## EightBall
####	EightBall Cog (1 command) - EightBall.py Extension:
	  $eightball [question] (AKA: 8ball)
	   └─ Get some answers.

## Embed
####	Embed Cog (3 commands) - Embed.py Extension:
	  $embed [embed_json]
	   └─ Builds an embed using json formatting.
	  $getembed [message_url]
	   └─ Gets any embeds for the passed message url and uploads their data as json files.
	  $post [channel_id] [embed_json]
	   └─ Builds an embed using json formatting and sends it to the specified channel (...

## Emoji
####	Emoji Cog (2 commands) - Emoji.py Extension:
	  $addemoji [emoji] [name] (AKA: addemote)
	   └─ Adds the passed emoji, url, or attachment as a custom emoji with the passed n...
	  $emoji [emoji] (AKA: emote)
	   └─ Outputs the passed emoji... but bigger!

## Encode
####	Encode Cog (10 commands) - Encode.py Extension:
	  $binint [input_binary]
	   └─ Converts the input binary to its integer representation.
	  $binstr [input_binary]
	   └─ Converts the input binary to its string representation.
	  $color [value]
	   └─ View info on a rgb, hex or cmyk color and their
	  $dechex [input_dec]
	   └─ Converts an int to hex.
	  $encode [from_type] [to_type] [value] (AKA: enc)
	   └─ Data converter that supports hex, decimal, binary, base64, and ascii.
	  $hexdec [input_hex]
	   └─ Converts hex to decimal.
	  $hexswap [input_hex]
	   └─ Byte swaps the passed hex value.
	  $intbin [input_int]
	   └─ Converts the input integer to its binary representation.
	  $randomcolor
	   └─ Selects a random color.
	  $strbin [input_string]
	   └─ Converts the input string to its binary representation.

## Example
####	Example Cog (3 commands) - Example.py Extension:
	  $add <left> <right>
	   └─ Adds two numbers together.
	  $choose [choices...]
	   └─ Chooses between multiple choices.
	  $joined [member]
	   └─ Says when a member joined.

## Face
####	Face Cog (4 commands) - Face.py Extension:
	  $lastlenny
	   └─ Who Lenny'ed last?
	  $lastshrug
	   └─ Who shrugged last?
	  $lenny [message]
	   └─ Give me some Lenny.
	  $shrug [message]
	   └─ Shrug it off.

## Feed
####	Feed Cog (8 commands) - Feed.py Extension:
	  $feed [food]
	   └─ Feed the bot some xp!
	  $hunger
	   └─ How hungry is the bot?
	  $ignoredeath [yes_no]
	   └─ Sets whether the bot ignores its own death and continues to respond post-mort...
	  $iskill
	   └─ Check the ded of the bot.
	  $kill
	   └─ Kill the bot... you heartless soul.
	  $killrole
	   └─ Lists the required role to kill/resurrect the bot.
	  $resurrect
	   └─ Restore life to the bot.  What magic is this?
	  $setkillrole [role]
	   └─ Sets the required role to kill/resurrect the bot (admin only).

## Fliptime
####	Fliptime Cog (1 command) - Fliptime.py Extension:
	  $tableflip [yes_no]
	   └─ Turns on/off table flip muting (bot-admin only; always off by default).

## GameLookup
####	GameLookup Cog (1 command) - GameLookup.py Extension:
	  $gamelookup [game_name] (AKA: glu, glup, gamel, gamelu, glookup)
	   └─ Leverage IGDB's API to search for game information.

## Giphy
####	Giphy Cog (4 commands) - Giphy.py Extension:
	  $addgif [role]
	   └─ Adds a new role to the gif list (admin only).
	  $gif [gif]
	   └─ Search for some giphy!
	  $listgif
	   └─ Lists gif roles and id's.
	  $removegif [role]
	   └─ Removes a role from the gif list (admin only).

## Groot
####	Groot Cog (1 command) - Groot.py Extension:
	  $groot
	   └─ Who... who are you?

## Help
####	Help Cog (3 commands) - Help.py Extension:
	  $dumphelp [tab_indent_count]
	   └─ Dumps a timestamped, formatted list of commands and descriptions into the sam...
	  $dumpmarkdown
	   └─ Dumps a timestamped, markdown-formatted list of commands and descriptions int...
	  $help [command]
	   └─ Lists the bot's commands and cogs.

## Humor
####	Humor Cog (11 commands) - Humor.py Extension:
	  $fart
	   └─ PrincessZoey :P
	  $french
	   └─ Speaking French... probably...
	  $fry [url]
	   └─ Fry up some memes.
	  $german
	   └─ Speaking German... probably...
	  $holy [subject]
	   └─ Time to backup the Batman!
	  $meme [template_id] [box_text...]
	   └─ Generate Memes!  You can get a list of meme templates with the memetemps comm...
	  $memetemps
	   └─ Get Meme Templates
	  $poke [url]
	   └─ Pokes the passed url/user/uploaded image.
	  $slap [user]
	   └─ It's easier than talking... probably?
	  $stardew [user]
	   └─ Test your luck with another user.
	  $zalgo [message]
	   └─ Ỉ s̰hͨo̹u̳lͪd͆ r͈͍e͓̬a͓͜lͨ̈l̘̇y̡͟ h͚͆a̵͢v͐͑eͦ̓ i͋̍̕n̵̰ͤs͖̟̟t͔ͤ̉ǎ͓͐ḻ̪ͨl̦͒̂e...

## Hw
####	Hw Cog (19 commands) - Hw.py Extension:
	  $cancelhw  (AKA: hwcancel)
	   └─ Cancels a current hardware session.
	  $delbothw [build] (AKA: hwbotdel, rembothw, hwbotrem)
	   └─ Removes a build from the bot's build list (owner only).
	  $delhw [build] (AKA: hwdel, remhw, hwrem, hwdelete, deletehw, hwremove, removehw)
	   └─ Removes a build from your build list.
	  $editbothw [build]
	   └─ Edits a build from the bot's build list (owner only).
	  $edithw [build] (AKA: hwedit)
	   └─ Edits a build from your build list.
	  $gethw [user] [search] (AKA: hwget, searchhw, hwsearch)
	   └─ Searches the user's hardware for a specific search term.
	  $hw [user] [build]
	   └─ Lists the hardware for either the user's default build - or the passed build.
	  $hwchannel  (AKA: gethwchannel, listhwchannel)
	   └─ Lists the current channel for hardware - if any.
	  $lhw [user] (AKA: hwl)
	   └─ Lists only the titles of the builds for the specified user - or yourself if n...
	  $listhw [user] (AKA: hwlist)
	   └─ Lists the builds for the specified user - or yourself if no user passed.
	  $mainbothw [build] (AKA: hwbotmain)
	   └─ Sets a new main build from the bot's build list (owner only).
	  $mainhw [build] (AKA: hwmain)
	   └─ Sets a new main build from your build list.
	  $newbothw  (AKA: addbothw)
	   └─ Initiates a new-hardware conversation for the bot's hardware.  The hardware a...
	  $newhw  (AKA: hwnew, hwadd, addhw)
	   └─ Initiate a new-hardware conversation with the bot.  The hardware added will a...
	  $pcpp [url] [style] [escape]
	   └─ Convert a pcpartpicker.com link into markdown parts. Available styles: normal...
	  $rawhw [user] [build] (AKA: hwraw)
	   └─ Lists the raw markdown for either the user's default build - or the passed bu...
	  $renbothw [build] (AKA: hwbotren)
	   └─ Renames a build from the bot's build list (owner only).
	  $renhw [build] (AKA: hwren, renamehw, hwrename)
	   └─ Renames a build from your build list.
	  $sethwchannel [channel]
	   └─ Sets the channel for hardware (admin only).

## IntelArk
####	IntelArk Cog (1 command) - IntelArk.py Extension:
	  $iark [text] (AKA: intelark)
	   └─ Search for Intel CPU info.

## Invite
####	Invite Cog (9 commands) - Invite.py Extension:
	  $approvejoin [server_id]
	   └─ Temporarily allows the bot to join the passed server id or join url (owner-on...
	  $block [server]
	   └─ Blocks the bot from joining a server - takes either a name or an id (owner-on...
	  $blocked
	   └─ Lists all blocked servers and owners (owner-only).
	  $canjoin [yes_no]
	   └─ Sets whether the bot is allowed to join new servers (owner-only and enabled b...
	  $invite [invite_url]
	   └─ Outputs a url you can use to invite me to your server.
	  $requestjoin [invite_url]
	   └─ Forwards the invite url to the bot's owners for review.
	  $revokejoin [server_id]
	   └─ Revokes a previously approved temporary join (owner-only).
	  $unblock [server]
	   └─ Unblocks a server or owner (owner-only).
	  $unblockall
	   └─ Unblocks all blocked servers and owners (owner-only).

## JazUtils
####	JazUtils Cog (7 commands) - JazUtils.py Extension:
	  $emptyroles
	   └─ Shows a list of roles that have zero members.
	  $fullsnowflake [sid]
	   └─ show all available data about a snowflake ID
	  $rolecall <rolename>
	   └─ Counts the number of members with a specific role.
	  $rolecount
	   └─ Simply counts the number of roles on the server. (excluding @everyone)
	  $roles [sort_order=name]
	   └─ Shows roles and their member counts. Takes one argument,
	  $snowflake [sid]
	   └─ show the date a snowflake ID was created
	  $whohas <rolename>
	   └─ Lists the people who have the specified role alongside their online status.

## Jpeg
####	Jpeg Cog (1 command) - Jpeg.py Extension:
	  $jpeg [url]
	   └─ MOAR JPEG!  Accepts a url - or picks the first attachment.

## LangFilter
####	LangFilter Cog (5 commands) - LangFilter.py Extension:
	  $addfilter [words]
	   └─ Adds comma delimited words to the word list (bot-admin only).
	  $clearfilter
	   └─ Empties the list of words that will be filtered (bot-admin only).
	  $dumpfilter
	   └─ Saves the filtered word list to a text file and uploads it to the requestor (...
	  $listfilter
	   └─ Prints out the list of words that will be filtered (bot-admin only).
	  $remfilter [words]
	   └─ Removes comma delimited words from the word list (bot-admin only).

## Lists
####	Lists Cog (38 commands) - Lists.py Extension:
	  $addhack [name] [hack]
	   └─ Add a hack to the hack list.
	  $addlink [name] [link]
	   └─ Add a link to the link list.
	  $addtag [name] [tag]
	   └─ Add a tag to the tag list.
	  $clearhacks  (AKA: clrhacks)
	   └─ Clears all entries from the hack list.
	  $clearlinks  (AKA: clrtags)
	   └─ Clears all entries from the tag list.
	  $hack [name]
	   └─ Retrieve a hack from the hack list.
	  $hackinfo [name]
	   └─ Displays info about a hack from the hack list.
	  $hackrole
	   └─ Lists the required role to add hacks.
	  $hacks
	   └─ List all hack in the hack list.
	  $lastonline [member]
	   └─ Lists the last time a user was online if known.
	  $link [name]
	   └─ Retrieve a link from the link list.
	  $linkinfo [name]
	   └─ Displays info about a link from the link list.
	  $linkrole
	   └─ Lists the required role to add links.
	  $links
	   └─ List all links in the link list.
	  $loadhacks [url] (AKA: addhacks)
	   └─ Loads the passed json attachment or URL into the hack list.
	  $loadlinks [url] (AKA: addlinks)
	   └─ Loads the passed json attachment or URL into the link list.
	  $loadtags [url] (AKA: addtags)
	   └─ Loads the passed json attachment or URL into the tag list.
	  $online
	   └─ Lists the number of users online.
	  $parts [member]
	   └─ Retrieve a member's parts list. DEPRECATED - Use hw instead.
	  $partstemp
	   └─ Gives a copy & paste style template for setting a parts list.
	  $rawhack [name]
	   └─ Retrieve a hack's raw markdown from the hack list.
	  $rawhacks
	   └─ List raw markdown of all hacks in the hack list.
	  $rawlink [name]
	   └─ Retrieve a link's raw markdown from the link list.
	  $rawlinks
	   └─ List raw markdown of all links in the link list.
	  $rawparts [member]
	   └─ Retrieve the raw markdown for a member's parts list. DEPRECATED - Use rawhw i...
	  $rawtag [name]
	   └─ Retrieve a tag's raw markdown from the tag list.
	  $rawtags
	   └─ List raw markdown of all tags in the tag list.
	  $removehack [name] (AKA: remhack, deletehack, delhack)
	   └─ Remove a hack from the hack list.
	  $removelink [name] (AKA: remlink, deletelink, dellink)
	   └─ Remove a link from the link list.
	  $removetag [name] (AKA: remtag, deletetag, deltag)
	   └─ Remove a tag from the tag list.
	  $savehacks
	   └─ Saves the hack list to a json file and uploads.
	  $savelinks
	   └─ Saves the link list to a json file and uploads.
	  $savetags
	   └─ Saves the tag list to a json file and uploads.
	  $setparts [parts]
	   └─ Set your own parts - can be a url, formatted text, or nothing to clear. DEPRE...
	  $tag [name]
	   └─ Retrieve a tag from the tag list.
	  $taginfo [name]
	   └─ Displays info about a tag from the tag list.
	  $tagrole
	   └─ Lists the required role to add tags.
	  $tags
	   └─ List all tag in the tag list.

## Lockdown
####	Lockdown Cog (14 commands) - Lockdown.py Extension:
	  $addlock [channel_list]
	   └─ Adds the passed space-delimited list of channels and categories to the lockdo...
	  $addlockall
	   └─ Adds all channels and categories to the lockdown list (bot-admin only).
	  $addnamefilter [action] [regex]
	   └─ Adds a new action (kick|ban|mute) and regex name filter (bot-admin only).
	  $antiraid [on_off] [join_number] [join_seconds] [kick_ban_mute] [cooldown_minutes]
	   └─ Sets up the anti-raid module (bot-admin only).
	  $antiraidping [user_or_role] [channel]
	   └─ Sets up what user or role to ping and in what channel when anti-raid is activ...
	  $clearnamefilters
	   └─ Removes all name filters (bot-admin only).
	  $listlock
	   └─ Lists the channels and categories configured for lockdown (bot-admin only).
	  $listlockall
	   └─ Lists all channels and categories and their lockdown/sync status (bot-admin o...
	  $lockdown [target_channel]
	   └─ Iterate through the channels in the lockdown list and revoke the send_message...
	  $namefilters
	   └─ Lists the name filters and their actions (bot-admin only).
	  $remlock [channel_list]
	   └─ Removes the passed space-delimited list of channels and categories from the l...
	  $remlockall
	   └─ Removes all channels and categories from the lockdown list (bot-admin only).
	  $remnamefilter [name_filter_number]
	   └─ Removes the passed name filter (bot-admin only).
	  $unlockdown [target_channel]
	   └─ Iterate through the channels in the lockdown list and clear the send_message,...

## MadLibs
####	MadLibs Cog (4 commands) - MadLibs.py Extension:
	  $listml  (AKA: mlist, madlibslist, listmadlibs)
	   └─ List the available MadLibs
	  $madlibs [madlib]
	   └─ Let's play MadLibs!
	  $ml [word]
	   └─ Used to choose your words when in the middle of a madlibs.
	  $mleave
	   └─ Used to leave a current MadLibs game.

## Minesweeper
####	Minesweeper Cog (1 command) - Minesweeper.py Extension:
	  $minesweeper [grid_size=5] (AKA: ms, minesweep, msweep, msweeper)
	   └─ Generate and post a new minesweeper game - grid size can range from 3x3 to 9x9

## Morse
####	Morse Cog (3 commands) - Morse.py Extension:
	  $morse [content]
	   └─ Converts ascii to morse code.  Accepts a-z and 0-9.  Each letter is comprised...
	  $morsetable [num_per_row]
	   └─ Prints out the morse code lookup table.
	  $unmorse [content]
	   └─ Converts morse code to ascii.  Each letter is comprised of "-" or "." and sep...

## Music
####	Music Cog (46 commands) - Music.py Extension:
	  $allowplaynext [yes_no]
	   └─ Gets or sets whether playnext, shufflenext, radionext, loadplnext, and shuffl...
	  $autodeleteafter [seconds]
	   └─ Lists or sets the current delay before auto-deleting music related messages (...
	  $disableplay [yes_no]
	   └─ Enables/Disables the music commands.  Helpful in case Youtube is rate limitin...
	  $eqpreset [preset] (AKA: eqp)
	   └─ Sets the current eq to one of the following presets:  Boost, Flat, Metal
	  $geteq  (AKA: eq)
	   └─ Prints the current equalizer settings.
	  $join [channel] (AKA: summon)
	   └─ Joins a passed voice channel, or the author's if none passed.
	  $lasteq [yes_no]
	   └─ Gets or sets whether the current EQ settings are preserved between music sess...
	  $leave  (AKA: disconnect, okbye)
	   └─ Stops and disconnects the bot from voice.
	  $leavewhenalone [yes_no]
	   └─ Lists or sets whether the bot leaves the voice channel when the last non-bot ...
	  $loadpl [url]
	   └─ Loads the passed playlist json data.  Accepts a url - or picks the first atta...
	  $loadplnext [url] (AKA: loadpln)
	   └─ Loads the passed playlist json data.  Accepts a url - or picks the first atta...
	  $mvsong [song_index] [target_index] (AKA: movesong, mvtrack, movetrack)
	   └─ Moves the song at song_index in the queue to the target_index (bot-admin only).
	  $pause
	   └─ Pauses the currently playing song.
	  $paused [moons]
	   └─ Lists whether or not the player is paused.  Synonym of the playing command.
	  $play [url] (AKA: p)
	   └─ Plays from a url (almost anything Lavalink supports) or resumes a currently p...
	  $playing [moons]
	   └─ Lists the currently playing song if any.
	  $playingin
	   └─ Shows the number of servers the bot is currently playing music in.
	  $playlist  (AKA: queue, q)
	   └─ Lists the queued songs in the playlist.
	  $playnext [url] (AKA: pn, pnext, playn)
	   └─ Plays from a url (almost anything Lavalink supports) or resumes a currently p...
	  $radio [url] (AKA: suggest, r, recommend)
	   └─ Queues up recommendations for the passed search term, YouTube URL, or Spotify...
	  $radiocount [count] (AKA: suggestcount, recommendcount, rcount)
	   └─ Gets or sets the default number of recommended songs returned from 2 to 25 (b...
	  $radionext [url] (AKA: suggestnext, rn, recommendnext)
	   └─ Queues up recommendations for the passed search term, YouTube URL, or Spotify...
	  $reconnect  (AKA: recon, rec)
	   └─ Attempts to have the bot save the current playlist to memory, leave the voice...
	  $repeat [yes_no]
	   └─ Checks or sets whether to repeat the current playlist.
	  $reseteq  (AKA: req)
	   └─ Resets the current eq to the flat preset.
	  $resume
	   └─ Resumes the song if paused.
	  $savepl [options]
	   └─ Saves the current playlist to a json file that can be loaded later.
	  $searchlist [yes_no]
	   └─ Gets or sets whether or not the server will show a list of options when searc...
	  $searchtype [search_type]
	   └─ Gets or sets the default search type used.  Can be ytsearch, ytmsearch, or sc...
	  $seek [position]
	   └─ Seeks to the passed position in the song if possible.  Position should be in ...
	  $setband [band_number] [value] (AKA: sb)
	   └─ Sets the value of the passed eq band (1-15) to the passed value from -5 (sile...
	  $seteq [bands] (AKA: seq)
	   └─ Sets the equalizer to the passed 15 space-delimited values from -5 (silent) t...
	  $setfreq [freq_family] [value] (AKA: freq)
	   └─ Sets the frequency family to the passed value.  Valid families are bass, mid,...
	  $shuffle [url]
	   └─ Shuffles the current queue. If you pass a playlist url or search term, it fir...
	  $shufflenext [url] (AKA: shufflen)
	   └─ Shuffles the current queue. If you pass a playlist url or search term, it fir...
	  $shufflepl [url]
	   └─ Loads and shuffles the passed playlist json data.  Accepts a url - or picks t...
	  $shuffleplnext [url] (AKA: shufflepln)
	   └─ Loads and shuffles the passed playlist json data.  Accepts a url - or picks t...
	  $skip [remove]
	   └─ Adds your vote to skip the current song.  50% or more of the non-bot users ne...
	  $skips [user] (AKA: skipped)
	   └─ Lists the number of skips for the currently playing song.
	  $stop
	   └─ Stops and empties the current playlist.
	  $stopall
	   └─ Stops and disconnects the bot from all voice channels in all servers (owner-o...
	  $swsongs [song1_index] [song2_index] (AKA: swapsongs, swaptracks, swtracks)
	   └─ Swaps the songs at song1_index and song2_index in the queue.  You must have r...
	  $unplay [song_number] (AKA: unp)
	   └─ Removes the passed song number from the queue.  You must be the requester, or...
	  $unqueue [unqueue_from] (AKA: unq)
	   └─ Removes all songs you've added from the queue (does not include the currently...
	  $unskip
	   └─ Removes your vote to skip the current song.
	  $volume [volume] (AKA: v, vol)
	   └─ Changes the player's volume (0-150%).

## Mute
####	Mute Cog (10 commands) - Mute.py Extension:
	  $createmuterole [role_name]
	   └─ Sets the target role to apply when muting (bot-admin only).
	  $desyncmuterole
	   └─ Removes send_messages, add_reactions, and speak overrides from the mute role ...
	  $ismuted [member] (AKA: muted, listmuted)
	   └─ Says whether a member is muted in chat - pass no arguments to get a list of a...
	  $mute [members] [cooldown] [reason]
	   └─ Prevents the passed members from sending messages in chat or speaking in voic...
	  $muteautodelete [yes_no]
	   └─ Enables/Disables auto-delete of any messages that slip by from muted users (b...
	  $muterole
	   └─ Lists the target role to apply when muting (bot-admin only).
	  $setmuterole [role]
	   └─ Sets the target role to apply when muting.  Passing nothing will disable the ...
	  $syncmuterole
	   └─ Ensures that the mute role has the send_messages, add_reactions, and speak ov...
	  $timeout [members] [cooldown] [reason] (AKA: to)
	   └─ Alternative to $mute that uses discord's native timeout api (bot-admin only).
	  $unmute [members] [reason]
	   └─ Allows the passed members to send messages in chat or speak in voice (bot-adm...

## NvidiaArk
####	NvidiaArk Cog (1 command) - NvidiaArk.py Extension:
	  $nvidiaark [text] (AKA: nark, nvark)
	   └─ Searches TechPowerUP's site for GPU info.

## OfflineUser
####	OfflineUser Cog (1 command) - OfflineUser.py Extension:
	  $remindoffline [yes_no]
	   └─ Sets whether to inform users that pinged members are offline or not.

## OpenCore
####	OpenCore Cog (6 commands) - OpenCore.py Extension:
	  $codec [search_term] (AKA: alc)
	   └─ Searches the AppleALCCodecs.plist file in memory for the passed search term.
	  $getcodecs  (AKA: updatecodecs)
	   └─ Forces an update of the in-memory AppleALCCodecs.plist file (owner only).
	  $gettex  (AKA: updatetex)
	   └─ Forces an update of the in-memory Configuration.tex file (owner only).
	  $listcodecs [search_term] (AKA: codecs)
	   └─ Lists the codecs in the AppleALCCodecs.plist - can optionally take a codec na...
	  $octex [search_path] (AKA: occonfig, configtex, ocsearch, configsearch, seachtex, tex, occ)
	   └─ Searches the Configuration.tex file in memory for the passed path.  Must incl...
	  $slide [input_hex]
	   └─ Calculates your slide boot-arg based on an input address (in hex).

## PciUsb
####	PciUsb Cog (2 commands) - PciUsb.py Extension:
	  $pci [ven_dev]
	   └─ Searches pci-ids.ucw.cz for the passed PCI ven:dev id.
	  $usb [ven_dev]
	   └─ Searches usb-ids.gowdy.us for the passed USB ven:dev id.

## Plist
####	Plist Cog (2 commands) - Plist.py Extension:
	  $nvweb [os_build]
	   └─ Prints the download url for the passed OS build number (if it exists).  If no...
	  $plist [url]
	   └─ Validates plist file structure.  Accepts a url - or picks the first attachment.

## Printer
####	Printer Cog (3 commands) - Printer.py Extension:
	  $avatar [member] (AKA: printavi, avi, pfp)
	   └─ Returns a the passed member's global avatar - use the guildavatar command for...
	  $guildavatar [member] (AKA: printguildavi, printgavi, gavi, gpfp)
	   └─ Returns a the passed member's guild avatar if available - use the avatar comm...
	  $print [url]
	   └─ DOT MATRIX.  Accepts a url - or picks the first attachment.

## Profile
####	Profile Cog (7 commands) - Profile.py Extension:
	  $addprofile [name] [link]
	   └─ Add a profile to your profile list.
	  $profile [member] [name]
	   └─ Retrieve a profile from the passed user's profile list.
	  $profileinfo [member] [name]
	   └─ Displays info about a profile from the passed user's profile list.
	  $profiles [member]
	   └─ List all profiles in the passed user's profile list.
	  $rawprofile [member] [name]
	   └─ Retrieve a profile's raw markdown from the passed user's profile list.
	  $rawprofiles [member]
	   └─ List all profiles' raw markdown in the passed user's profile list.
	  $removeprofile [name]
	   └─ Remove a profile from your profile list.

## Promote
####	Promote Cog (4 commands) - Promote.py Extension:
	  $demote [member]
	   └─ Auto-removes the required xp to demote the passed user to the previous role (...
	  $demoteto [member] [role]
	   └─ Auto-removes the required xp to demote the passed user to the passed role (ad...
	  $promote [member]
	   └─ Auto-adds the required xp to promote the passed user to the next role (admin ...
	  $promoteto [member] [role]
	   └─ Auto-adds the required xp to promote the passed user to the passed role (admi...

## Quote
####	Quote Cog (11 commands) - Quote.py Extension:
	  $clearquotereaction  (AKA: clearqr, clearquoter, cqr)
	   └─ Clears the trigger reaction for quoting messages (bot-admin only).
	  $getquotechannel  (AKA: quotechannel, gqc, qc, getquotec)
	   └─ Prints the current quote channel.
	  $getquotereaction  (AKA: gqr, getquoter, getqr)
	   └─ Displays the quote reaction if there is one.
	  $isquoted [message_id]
	   └─ Checks if the passed message id is present in the QuotedMessages list (bot-ad...
	  $quoteadminonly [yes_no] (AKA: qao, quoteao, quoteadmino)
	   └─ Sets whether only admins/bot-admins can quote or not (bot-admin only).
	  $quoteinfo  (AKA: quote, qinfo, qi)
	   └─ Lists information about the current quote setup.
	  $quotevote [quote_votes] (AKA: quotev, qv)
	   └─ Gets or sets the number of votes/reactions needed for non admin/bot-admin use...
	  $setquotechannel [channel] (AKA: sqc, setquotec, setqc)
	   └─ Sets the channel for quoted messages or disables it if no channel sent (bot-a...
	  $setquotereaction  (AKA: sqr, setquoter, setqr)
	   └─ Sets the trigger reaction for quoting messages (bot-admin only).
	  $unquote [message_id]
	   └─ Removes the passed message id from the QuotedMessages list if found (bot-admi...
	  $unquoteall
	   └─ Removes all message ids from the QuotedMessages list (bot-admin only).

## RPS
####	RPS Cog (1 command) - RPS.py Extension:
	  $rps [choice] (AKA: prs, rockpaperscissors, paperscissorsrock)
	   └─ Play rock, paper, scissors.

## RateLimit
####	RateLimit Cog (1 command) - RateLimit.py Extension:
	  $ccooldown [delay]
	   └─ Sets the cooldown in seconds between each command (owner only).

## Reddit
####	Reddit Cog (32 commands) - Reddit.py Extension:
	  $abandoned
	   └─ Get something abandoned to look at.
	  $answer
	   └─ Spout out some interstellar answering... ?
	  $aww
	   └─ Whenever you're down - uppify.
	  $battlestation
	   └─ Let's look at some pretty stuff.
	  $beeple
	   └─ A new image every day... for years.
	  $brainfart
	   └─ Spout out some uh... intellectual brilliance...
	  $cablefail
	   └─ Might as well be a noose...
	  $carmod
	   └─ Marvels of modern engineering.
	  $dankmeme
	   └─ Only the dankest.
	  $dirtyjoke
	   └─ Let's see if reddit can be dir-... oh... uh.. funny... (bot-admin only)
	  $dragon
	   └─ From the past - when great winged beasts soared the skies.
	  $earthporn
	   └─ Earth is good.
	  $joke
	   └─ Let's see if reddit can be funny...
	  $lpt
	   └─ Become a pro - AT LIFE.
	  $macsetup
	   └─ Feast your eyes upon these setups.
	  $meirl
	   └─ Me in real life.
	  $nocontext
	   └─ Spout out some intersexual brilliance.
	  $nosleep
	   └─ I hope you're not tired...
	  $pun
	   └─ I don't know, don't ask...
	  $question
	   └─ Spout out some interstellar questioning... ?
	  $randomcat
	   └─ Meow.
	  $randomdog
	   └─ Bark if you know whassup.
	  $redditimage [subreddit]
	   └─ Try to grab an image from an image-based subreddit.
	  $ruser [user_name]
	   └─ Gets some info on the passed username - attempts to use your username if none...
	  $shittybattlestation
	   └─ Let's look at some shitty stuff.
	  $shittylpt
	   └─ Your advise is bad, and you should feel bad.
	  $software
	   └─ I uh... I wrote it myself.
	  $starterpack
	   └─ Starterpacks.
	  $techsupport
	   └─ Tech support irl.
	  $thinkdeep
	   └─ Spout out some intellectual brilliance.
	  $wallpaper
	   └─ Get something pretty to look at.
	  $withcontext
	   └─ Spout out some contextual brilliance.

## Remind
####	Remind Cog (3 commands) - Remind.py Extension:
	  $clearmind [index]
	   └─ Clear the reminder index passed - or all if none passed.
	  $reminders [member]
	   └─ List pending reminders - pass a member to see their reminders in the current ...
	  $remindme [message] [endtime]
	   └─ Set a reminder.  If the message contains spaces, it must be wrapped in quotes.

## Responses
####	Responses Cog (12 commands) - Responses.py Extension:
	  $addresponse [regex_trigger] [response]
	   └─ Adds a new response for the regex trigger - or updates the response if the tr...
	  $chkresponse [check_string] (AKA: checkresponse)
	   └─ Reports a breakdown of the first match (if any) in the responses for the pass...
	  $clearresponses  (AKA: clrresponses)
	   └─ Removes all response triggers (bot-admin only).
	  $editresponse [response_index] [response]
	   └─ Edits the response for the passed index.  The response passed here does not r...
	  $edittrigger [response_index] [regex_trigger]
	   └─ Edits the regex trigger for the passed index.  The triggers passed here do no...
	  $loadresponses [url] (AKA: addresponses)
	   └─ Loads the passed json attachment or URL into the responses dictionary.
	  $mvresponse [response_index] [target_index] (AKA: moveresponse)
	   └─ Moves the passed response index to the target index (bot-admin only).
	  $remresponse [regex_trigger_number] (AKA: removeresponse, deleteresponse, delresponse)
	   └─ Removes the passed response trigger (bot-admin only).
	  $responses  (AKA: listresponses)
	   └─ Lists the response triggers and their responses (bot-admin only).
	  $saveresponses
	   └─ Saves the responses dictionary to a json file and uploads.
	  $viewresponse [response_index] (AKA: getresponse)
	   └─ Displays the response in full which corresponds to the target index (bot-admi...
	  $viewtrigger [response_index] (AKA: gettrigger)
	   └─ Displays the regex trigger in full which corresponds to the target index (bot...

## Search
####	Search Cog (8 commands) - Search.py Extension:
	  $aol [query]
	   └─ The OG search engine.
	  $ask [query]
	   └─ Jeeves, please answer these questions.
	  $bing [query]
	   └─ Get some uh... more searching done.
	  $convert [amount] [frm] [to] (AKA: con, conv, currency, curr)
	   └─ Convert currencies.  If run with no values, the script will print a list of a...
	  $currlist [search] (AKA: listcurr, lcurr, currl)
	   └─ List currencies for the convert command.
	  $duck [query]
	   └─ Duck Duck... GOOSE.
	  $google [query]
	   └─ Get some searching done.
	  $yahoo [query]
	   └─ Let Yahoo! answer your questions.

## SecretSanta
####	SecretSanta Cog (11 commands) - SecretSanta.py Extension:
	  $allowss [yes_no]
	   └─ Sets whether the Secret Santa module is enabled (owner only; always off by de...
	  $getssrole
	   └─ Lists the current Secret Santa role.
	  $rawssmessage
	   └─ Prints the raw markdown for the Secret Santa channel create message (bot-admi...
	  $setssmessage [message]
	   └─ Sets the Secret Santa channel create message (bot-admin only).
	  $setssrole [role]
	   └─ Sets the Secret Santa role, or clears it if no role passed (bot-admin only).
	  $ssapplyreport [url]
	   └─ Applies the passed ss.json file's settings and gives the Secret Santa channel...
	  $sscreatechannels [category]
	   └─ Creates the private channels for all users with the Secret Santa role under t...
	  $ssgenreport [category]
	   └─ Randomly pairs users for Secret Santa and uploads a ss.json report (bot-admin...
	  $ssremovechannels [category]
	   └─ Removes all Secret Santa channels under a given category whose names correspo...
	  $ssrevert [category]
	   └─ Returns ownership of the Secret Santa channels to their original owners if fo...
	  $testssmessage
	   └─ Prints the current Secret Santa channel create message (bot-admin only).

## Server
####	Server Cog (14 commands) - Server.py Extension:
	  $addprefix [prefix]
	   └─ Adds a server-specific command prefix.  If it contains spaces, you will need ...
	  $autopcpp [setting]
	   └─ Sets the bot's auto-pcpartpicker markdown if found in messages (admin-only). ...
	  $clearprefix  (AKA: clearprefixes, clrprefix, clrprefixes)
	   └─ Clears any server-specific prefixes (bot-admin only).
	  $dumpservers
	   └─ Dumps a timpestamped list of servers into the same directory as the bot (owne...
	  $endpoll [message_url] (AKA: pollend, epoll, endp, endvote, endv)
	   └─ Ends the poll that resides at the passed message url.  Must be either the ori...
	  $getjoinrole  (AKA: joinrole)
	   └─ Gets the role applied to each new user that joins (admin only).
	  $getprefix  (AKA: getprefixes, prefix, prefixes)
	   └─ Output's the server's prefixes - custom or otherwise.  Each prefix is wrapped...
	  $info
	   └─ Displays the server info if any.
	  $leaveserver [targetServer]
	   └─ Leaves a server - can take a name or id (owner only).
	  $poll [poll_options] (AKA: vote)
	   └─ Starts a poll - which can take a custom prompt/question, as well as one or up...
	  $remprefix [prefix] (AKA: removeprefix, delprefix, deleteprefix)
	   └─ Removes a server-specific command prefix.  If it contains spaces, you will ne...
	  $setinfo [word]
	   └─ Sets the server info (bot-admin only).
	  $setjoinrole [role]
	   └─ Sets the role to apply to each new user that joins (admin only).
	  $setprefix [prefix]
	   └─ Sets the bot's server-specific prefix.  This will remove all other server-spe...

## ServerStats
####	ServerStats Cog (15 commands) - ServerStats.py Extension:
	  $allmessages
	   └─ Lists the number of messages I've seen on all severs so far. (only applies af...
	  $bottomservers
	   └─ Lists the bottom servers I'm connected to ordered by population.
	  $firstjoins
	   └─ Lists the first users to join.
	  $firstservers
	   └─ Lists the first servers I've joined.
	  $joinedatpos <position>
	   └─ Lists the user that joined at the passed position.
	  $joinpos [member]
	   └─ Tells when a user joined compared to other users.
	  $listbots [guild_name]
	   └─ Lists up to the first 20 bots of the current or passed server.
	  $listservers
	   └─ Lists the servers I'm connected to.
	  $messages
	   └─ Lists the number of messages I've seen on this sever so far. (only applies af...
	  $recentjoins
	   └─ Lists the most recent users to join.
	  $recentservers
	   └─ Lists the most recent users to join - default is 10, max is 25.
	  $serverinfo [guild_name]
	   └─ Lists some info about the current or passed server.
	  $sharedservers [member]
	   └─ Lists how many servers you share with the bot.
	  $topservers
	   └─ Lists the top servers I'm connected to ordered by population.
	  $users
	   └─ Lists the total number of users on all servers I'm connected to.

## Settings
####	Settings Cog (14 commands) - Settings.py Extension:
	  $addowner [member]
	   └─ Adds an owner to the owner list.  Can only be done by a current owner.
	  $claim
	   └─ Claims the bot if disowned - once set, can only be changed by the current owner.
	  $disown
	   └─ Revokes all ownership of the bot.
	  $flush
	   └─ Flush the bot settings to disk (admin only).
	  $getsstat [stat]
	   └─ Gets a server stat (admin only).
	  $getstat [stat] [member]
	   └─ Gets the value for a specific stat (case-sensitive).  If the stat has spaces,...
	  $ownerlock
	   └─ Locks/unlocks the bot to only respond to the owner (owner-only... ofc).
	  $owners
	   └─ Lists the bot's current owners.
	  $prune
	   └─ Iterate through all members on all connected servers and remove orphaned sett...
	  $prunelocalsettings
	   └─ Compares the current server's settings to the default list and removes any no...
	  $prunesettings
	   └─ Compares all connected servers' settings to the default list and removes any ...
	  $remowner [member]
	   └─ Removes an owner from the owner list.  Can only be done by a current owner.
	  $setsstat [stat] [value]
	   └─ Sets a server stat (admin only).
	  $verifydefaultroles  (AKA: recheckdefaultroles)
	   └─ Forces a recheck of all members to ensure they have the default role applied ...

## SettingsDict
####	SettingsDict Cog (1 command) - SettingsDict.py Extension:
	  $sdict [command] [key] [args]
	   └─ Allows the bot's owners to interface with the settings_dict.json.

## Setup
####	Setup Cog (1 command) - Setup.py Extension:
	  $setup
	   └─ Runs first-time setup (server owner only).

## Spooktober
####	Spooktober Cog (1 command) - Spooktober.py Extension:
	  $spooking [yes_no]
	   └─ Enables/Disables reacting 🎃 to every sp00py message on Halloween (owner only).

## Stream
####	Stream Cog (8 commands) - Stream.py Extension:
	  $addstreamer [member]
	   └─ Adds the passed member to the streamer list (bot-admin only).
	  $rawstream
	   └─ Displays the raw markdown for the stream announcement message (bot-admin only).
	  $remstreamer [member]
	   └─ Removes the passed member from the streamer list (bot-admin only).
	  $setstream [message]
	   └─ Sets the stream announcement message (bot-admin only).
	  $setstreamchannel [channel]
	   └─ Sets the channel for the stream announcements (bot-admin only).
	  $streamchannel
	   └─ Displays the channel for the stream announcements - if any.
	  $streamers
	   └─ Lists the current members in the streamer list.
	  $teststream
	   └─ Tests the stream announcement message (bot-admin only).

## Strike
####	Strike Cog (12 commands) - Strike.py Extension:
	  $addban [member]
	   └─ Adds the passed user to the ban list (bot-admin only).
	  $addkick [member]
	   └─ Adds the passed user to the kick list (bot-admin only).
	  $isbanned [member]
	   └─ Lists whether the user is in the ban list.
	  $iskicked [member]
	   └─ Lists whether the user is in the kick list.
	  $removeban [member]
	   └─ Removes the passed user from the ban list (bot-admin only).
	  $removekick [member]
	   └─ Removes the passed user from the kick list (bot-admin only).
	  $removestrike [member]
	   └─ Removes a strike given to a member (bot-admin only).
	  $setstrikelevel [member] [strikelevel]
	   └─ Sets the strike level of the passed user (bot-admin only).
	  $setstrikelimit [limit]
	   └─ Sets the number of strikes before advancing to the next consequence (bot-admi...
	  $strike [member] [days] [message]
	   └─ Give a user a strike (bot-admin only).
	  $strikelimit
	   └─ Lists the number of strikes before advancing to the next consequence.
	  $strikes [member]
	   └─ Check a your own, or another user's total strikes (bot-admin needed to check ...

## Telephone
####	Telephone Cog (10 commands) - Telephone.py Extension:
	  $call [number] (AKA: dial)
	   └─ Calls the passed number.  Can use *67 to hide your identity - or *69 to conne...
	  $callerid
	   └─ Reveals the last number to call regardless of *67 settings (bot-admin only).
	  $phonebook [look_up]
	   └─ Lets you page through the phonebook - or optionally lets you search for a ser...
	  $settelechannel [channel]
	   └─ Sets the channel for telephone commands - or disables that if nothing is pass...
	  $teleblock [guild_name]
	   └─ Blocks all tele-numbers associated with the passed guild (bot-admin only).
	  $teleblocklinks [yes_no]
	   └─ Enables/Disables removing links sent over telephone calls (bot-admin only).
	  $teleblocks
	   └─ Lists guilds with blocked tele-numbers.
	  $telechannel
	   └─ Prints the current channel for telephone commands.
	  $telenumber
	   └─ Prints your telephone number.
	  $teleunblock [guild_name]
	   └─ Unblocks all tele-numbers associated with the passed guild (bot-admin only).

## TempRole
####	TempRole Cog (10 commands) - TempRole.py Extension:
	  $addtemprole [role]
	   └─ Adds a new role to the temp role list (admin only).
	  $autotemp [role]
	   └─ Sets the temp role to apply to each new user that joins.
	  $getautotemp
	   └─ Gets the temp role applied to each new user that joins.
	  $hastemp [member]
	   └─ Displays any temp roles the passed user has, and the remaining time.
	  $listtemproles
	   └─ Lists all roles for the temp role system.
	  $removetemprole [role]
	   └─ Removes a role from the temp role list (admin only).
	  $temp [member] [role] [cooldown]
	   └─ Gives the passed member the temporary role for the passed amount of time - ne...
	  $temppm [yes_no]
	   └─ Sets whether to inform users that they've been given a temp role.
	  $temptime [minutes]
	   └─ Sets the number of minutes for the temp role - must be greater than 0 (admin-...
	  $untemp [member] [role]
	   └─ Removes the passed temp role from the passed user (bot-admin only).

## Time
####	Time Cog (6 commands) - Time.py Extension:
	  $listtz [tz_search]
	   └─ List all the supported TimeZones.
	  $offset [member]
	   └─ See a member's UTC offset.
	  $setoffset [offset]
	   └─ Set your UTC offset.
	  $settz [tz]
	   └─ Sets your TimeZone - Overrides your UTC offset - and accounts for DST.
	  $time [offset]
	   └─ Get UTC time +- an offset.
	  $tz [member]
	   └─ See a member's TimeZone.

## Translate
####	Translate Cog (4 commands) - Translate.py Extension:
	  $detectlang [text]
	   └─ Reports the detected language and certainty of the passed text.
	  $langlist [search] (AKA: listlang, llist, listl)
	   └─ Lists available languages - can optionally take a search term and will list t...
	  $pronounce [text] (AKA: pr)
	   └─ Pronunciation for a sentence in the English language.
	  $translate [translate] (AKA: tr)
	   └─ Translate some stuff!  Takes a phrase, the from language identifier and the t...

## Turret
####	Turret Cog (1 command) - Turret.py Extension:
	  $turret
	   └─ Now you're thinking with - wait... uh.. turrets?

## Uptime
####	Uptime Cog (1 command) - Uptime.py Extension:
	  $uptime
	   └─ Lists the bot's uptime.

## UrbanDict
####	UrbanDict Cog (2 commands) - UrbanDict.py Extension:
	  $define [word]
	   └─ Gives the definition of the word passed.
	  $randefine
	   └─ Gives a random word and its definition.

## UserRole
####	UserRole Cog (17 commands) - UserRole.py Extension:
	  $addrole [role]
	   └─ Adds a role from the user role list to your roles.  You can have multiples at...
	  $adduserrole [role]
	   └─ Adds a new role to the user role system (admin only).
	  $clearroles
	   └─ Removes all user roles from your roles.
	  $isurblocked [member]
	   └─ Outputs whether or not the passed user is blocked from the UserRole module.
	  $listuserroles
	   └─ Lists all roles for the user role system.
	  $oneuserrole [yes_no]
	   └─ Turns on/off one user role at a time (bot-admin only; always on by default).
	  $removeuserrole [role]
	   └─ Removes a role from the user role system (admin only).
	  $remrole [role]
	   └─ Removes a role from the user role list from your roles.
	  $rradd [role_name_or_id]
	   └─ Adds a new role to the reaction roles list.
	  $rrclear
	   └─ Removes the message to watch for user reaction roles, as well as all roles an...
	  $rrdel [role_name_or_id]
	   └─ Removes the passed role from the reaction roles list (bot-admin only).
	  $rrlist
	   └─ Lists the current reaction roles and their corresponding reactions (bot-admin...
	  $rrmessage [message_url]
	   └─ Gets or sets the message to watch for user reaction roles (bot-admin only).
	  $rrtoggle [yes_no]
	   └─ Sets whether or not reaction messages will toggle roles - or only add them (b...
	  $setrole [role]
	   └─ Sets your role from the user role list.  You can only have one at a time.
	  $urblock [member]
	   └─ Blocks a user from using the UserRole system and removes applicable roles (bo...
	  $urunblock [member]
	   └─ Unblocks a user from the UserRole system (bot-admin only).

## VoteKick
####	VoteKick Cog (13 commands) - VoteKick.py Extension:
	  $setvkchannel [channel]
	   └─ Sets which channel then mention posts to when enough votes against a user are...
	  $setvkmention [user_or_role]
	   └─ Sets which user or role is mentioned when enough votes against a user are rea...
	  $vk [user] [server]
	   └─ Places your vote to have the passed user kicked.
	  $vkanon [yes_no]
	   └─ Sets whether vote messages are removed after voting (bot-admin only; always o...
	  $vkchannel
	   └─ Gets which channel then mention posts to when enough votes against a user are...
	  $vkclear [user]
	   └─ Clears the votes against the passed user (bot-admin only).
	  $vkexpiretime [the_time]
	   └─ Sets the amount of time before a vote expires.  0 or less will make them perm...
	  $vkinfo
	   └─ Lists the vote-kick info.
	  $vkmention
	   └─ Gets which user or role is mentioned when enough votes against a user are rea...
	  $vkmutetime [the_time]
	   └─ Sets the number of time a user is muted when the mute votes are reached - 0 o...
	  $vks [user]
	   └─ Lists the vote count of the passed user (bot-admin only) or the author if no ...
	  $vktomention [number_of_votes]
	   └─ Sets the number of votes before the selected role or user is mentioned.  Anyt...
	  $vktomute [number_of_votes]
	   └─ Sets the number of votes before a user is muted.  Anything less than 1 will d...

## WatchURL
####	WatchURL Cog (7 commands) - WatchURL.py Extension:
	  $addwatchurl [url]
	   └─ Adds a new URL to watch for (bot-admin only).
	  $clearwatchedurls
	   └─ Clears all URLs to watch for (bot-admin only).
	  $clearwatchurlmatches
	   └─ Clears all URL watch list matches (bot-admin only).
	  $delwatchurl [url]
	   └─ Removes a URL from the watch list (bot-admin only).
	  $lasturls
	   └─ Shows up to the last 200 URLs sent that matched the URL watch lists in order ...
	  $listwatchurls
	   └─ Lists the URLs to watch for in passed messages.
	  $watchboturls [yes_no]
	   └─ Sets whether we watch for URLs from other bots (bot-admin only - disabled by ...

## Weather
####	Weather Cog (3 commands) - Weather.py Extension:
	  $forecast [city_name]
	   └─ Gets some weather, for 5 days or whatever.
	  $tconvert [temp] [from_type] [to_type] (AKA: tcon, tconv)
	   └─ Converts between Fahrenheit, Celsius, and Kelvin.  From/To types can be:
	  $weather [city_name]
	   └─ Gets some weather.

## Welcome
####	Welcome Cog (7 commands) - Welcome.py Extension:
	  $rawgoodbye [member]
	   └─ Prints the current goodbye message's markdown (bot-admin only).
	  $rawwelcome [member]
	   └─ Prints the current welcome message's markdown (bot-admin only).
	  $setgoodbye [message]
	   └─ Sets the goodbye message for your server (bot-admin only).
	  $setwelcome [message]
	   └─ Sets the welcome message for your server (bot-admin only).
	  $setwelcomechannel [channel]
	   └─ Sets the channel for the welcome and goodbye messages (bot-admin only).
	  $testgoodbye [member]
	   └─ Prints the current goodbye message (bot-admin only).
	  $testwelcome [member]
	   └─ Prints the current welcome message (bot-admin only).

## Wiki
####	Wiki Cog (1 command) - Wiki.py Extension:
	  $wiki [search]
	   └─ Search Wikipedia!

## Xp
####	Xp Cog (11 commands) - Xp.py Extension:
	  $bottomxp
	   └─ List the bottom xp-holders.
	  $defaultrole
	   └─ Lists the default role that new users are assigned.
	  $gamble [bet]
	   └─ Gamble your xp reserves for a chance at winning xp!
	  $leaderboard
	   └─ List the top xp-holders.
	  $listxproles
	   └─ Lists all roles, id's, and xp requirements for the xp promotion/demotion system.
	  $rank [member]
	   └─ Say the highest rank of a listed member.
	  $recheckrole [user]
	   └─ Re-iterate through all members and assign the proper roles based on their xp ...
	  $recheckroles
	   └─ Re-iterate through all members and assign the proper roles based on their xp ...
	  $stats [member]
	   └─ List the xp and xp reserve of a listed member.
	  $xp [member] [xpAmount]
	   └─ Gift xp to other members.
	  $xpinfo
	   └─ Gives a quick rundown of the xp system.

## XpBlock
####	XpBlock Cog (4 commands) - XpBlock.py Extension:
	  $listxpblock
	   └─ Lists xp blocked users and roles.
	  $xpblock [user_or_role]
	   └─ Adds a new user or role to the xp block list (bot-admin only).
	  $xpunblock [user_or_role]
	   └─ Removes a user or role from the xp block list (bot-admin only).
	  $xpunblockall
	   └─ Removes all users and roles from the xp block list (bot-admin only).

## XpStack
####	XpStack Cog (5 commands) - XpStack.py Extension:
	  $checkxp
	   └─ Displays the last xp transactions (bot-admin only).
	  $clearallxp
	   └─ Clears all xp transactions from the transaction list for all servers (owner-o...
	  $clearxp
	   └─ Clears the xp transaction list (bot-admin only).
	  $setxpcount [count]
	   └─ Sets the number of xp transactions to keep (default is 10).
	  $xpcount [count]
	   └─ Returns the number of xp transactions to keep (default is 10).


##

[![upload](https://img.shields.io/pypi/v/dynamo-release?logo=PyPI)](https://pypi.org/project/dynamo-release/)
[![conda](https://img.shields.io/conda/vn/conda-forge/dynamo-release.svg)](https://anaconda.org/conda-forge/dynamo-release)
[![download](https://static.pepy.tech/badge/dynamo-release)](https://pepy.tech/project/dynamo-release)
[![star](https://img.shields.io/github/stars/aristoteleo/dynamo-release?logo=GitHub&color=red)](https://github.com/aristoteleo/dynamo-release/stargazers)
[![build](https://github.com/aristoteleo/dynamo-release/actions/workflows/python-package.yml/badge.svg)](https://github.com/aristoteleo/dynamo-release/actions/workflows/python-package.yml)
[![documentation](https://readthedocs.org/projects/dynamo-release/badge/?version=latest)](https://dynamo-release.readthedocs.io/en/latest/)
[![upload_python_package](https://github.com/aristoteleo/dynamo-release/actions/workflows/python-publish.yml/badge.svg)](https://github.com/aristoteleo/dynamo-release/actions/workflows/python-publish.yml)
[![test](https://github.com/aristoteleo/dynamo-release/actions/workflows/python-plain-run-test.yml/badge.svg)](https://github.com/aristoteleo/dynamo-release/actions/workflows/python-plain-run-test.yml)

## **Dynamo**: Mapping Transcriptomic Vector Fields of Single Cells

Inclusive model of expression dynamics with metabolic labeling based scRNA-seq / multiomics, vector field reconstruction, potential landscape mapping, differential geometry analyses, and most probably paths / *in silico* perturbation predictions.

[Installation](https://dynamo-release.readthedocs.io/en/latest/ten_minutes_to_dynamo.html#how-to-install) - [Ten minutes to dynamo](https://dynamo-release.readthedocs.io/en/latest/ten_minutes_to_dynamo.html) - [Tutorials](https://dynamo-release.readthedocs.io/en/latest/notebooks/Differential_geometry.html) - [API](https://dynamo-release.readthedocs.io/en/latest/API.html) - [Citation](https://www.sciencedirect.com/science/article/pii/S0092867421015774?via%3Dihub) - [Theory](https://dynamo-release.readthedocs.io/en/latest/notebooks/Primer.html)

![Dynamo](https://user-images.githubusercontent.com/7456281/152110270-7ee1b0ed-1205-495d-9d65-59c7984d2fa2.png)

Single-cell (sc)RNA-seq, together with RNA velocity and metabolic labeling, reveals cellular states and transitions at unprecedented resolution. Fully exploiting these data, however, requires kinetic models capable of unveiling governing regulatory functions. Here, we introduce an analytical framework dynamo, which infers absolute RNA velocity, reconstructs continuous vector fields that predict cell fates, employs differential geometry to extract underlying regulations, and ultimately predicts optimal reprogramming paths and perturbation outcomes. We highlight dynamo’s power to overcome fundamental limitations of conventional splicing-based RNA velocity analyses to enable accurate velocity estimations on a metabolically labeled human hematopoiesis scRNA-seq dataset. Furthermore, differential geometry analyses reveal mechanisms driving early megakaryocyte appearance and elucidate asymmetrical regulation within the PU.1-GATA1 circuit. Leveraging the least-action-path method, dynamo accurately predicts drivers of numerous hematopoietic transitions. Finally, in silico perturbations predict cell-fate diversions induced by gene perturbations. Dynamo, thus, represents an important step in advancing quantitative and predictive theories of cell-state transitions.

## Highlights of dynamo

* Robust and accurate estimation of RNA velocities for regular scRNA-seq datasets:
    * Three methods for the velocity estimations (including the new negative binomial distribution based approach)
    * Improved kernels for transition matrix calculation and velocity projection
    * Strategies to correct RNA velocity vectors (when your RNA velocity direction is problematic)
* Inclusive modeling of time-resolved metabolic labeling based scRNA-seq:
    * Overcome intrinsic limitation of the conventional splicing based RNA velocity analyses
    * Explicitly model RNA metabolic labeling, in conjunction with RNA bursting, transcription, splicing and degradation
    * Comprehensive RNA kinetic rate estimation for one-shot, pulse, chase and mixture metabolic labeling experiments
* Move beyond RNA velocity to continuous vector field function for gaining mechannistic insights of cell fate transitions:
    * Dynamical systems approaches to identify stable cell types (fixed points), boundaries of cell states (separatrices), etc
    * Calculate RNA acceleration (reveals early drivers), curvature (reveals master regulators of fate decision points), divergence (stability of cell states) and RNA Jacobian (cell-state dependent regulatory networks)
    * Various downstream differential geometry analyses to rank critical regulators/effectors,  and visualize regulatory networks at key fate decision points
* Non-trivial vector field predictions of cell fate transitions:
    * Least action path approach to predict the optimal paths and transcription factors of cell fate reprogrammings
    * In silico perturbation to predict the gene-wise perturbation effects and cell fate diversion after genetic perturbations

## News
* 5/30/2023: dynamo 1.3.0 released!
* 3/1/2023: We welcome @Sichao25 to join the dynamo develop team!
* 1/28/2023: We welcome @Ukyeon to join the dynamo develop team!
* 15/12/2022: *Thanks for @elfofmaxwell and @MukundhMurthy's contribution*. dynamo 1.2.0 released
* 11/11/2022: the continuing development of dynamo and the Aristotle ecosystem will be supported by CZI. See [here](https://chanzuckerberg.com/eoss/proposals/predictive-modeling-of-single-cell-multiomics-over-time-and-space/)
* 4/14/2022: dynamo 1.1.0 released!
* 3/14/2022: Since today dynamo has its own logo! Here the arrow represents the RNA velocity vector field, while the helix the RNA molecule and the colored dots RNA metabolic labels (4sU labeling). See [readthedocs](https://dynamo-release.readthedocs.io/en/latest/index.html)
* 2/15/2022: primers and tutorials on least action paths and in silico perturbation are released.
* 2/1/2022: after 3.5+ years of perseverance, our dynamo paper is finally online in [Cell](https://www.sciencedirect.com/science/article/pii/S0092867421015774#tbl1) today!

## Discussion
Please use github issue tracker to report coding related [issues](https://github.com/aristoteleo/dynamo-release/issues) of dynamo. For community discussion of novel usage cases, analysis tips and biological interpretations of dynamo, please join our public slack workspace: [dynamo-discussion](https://join.slack.com/t/dynamo-discussionhq/shared_invite/zt-itnzjdxs-PV~C3Hr9uOArHZcmv622Kg) (Only a working email address is required from the slack side).

## Contribution
If you want to contribute to the development of dynamo, please check out CONTRIBUTION instruction: [Contribution](https://github.com/aristoteleo/dynamo-release/blob/master/CONTRIBUTING.md)


# pypistats

[![PyPI version](https://img.shields.io/pypi/v/pypistats.svg?logo=pypi&logoColor=FFE873)](https://pypi.org/project/pypistats/)
[![Supported Python versions](https://img.shields.io/pypi/pyversions/pypistats.svg?logo=python&logoColor=FFE873)](https://pypi.org/project/pypistats/)
[![PyPI downloads](https://img.shields.io/pypi/dm/pypistats.svg)](https://pypistats.org/packages/pypistats)
[![Azure Pipelines status](https://dev.azure.com/hugovk/hugovk/_apis/build/status/hugovk.pypistats?branchName=main)](https://dev.azure.com/hugovk/hugovk/_build?definitionId=1)
[![GitHub Actions status](https://github.com/hugovk/pypistats/workflows/Test/badge.svg)](https://github.com/hugovk/pypistats/actions)
[![codecov](https://codecov.io/gh/hugovk/pypistats/branch/main/graph/badge.svg)](https://codecov.io/gh/hugovk/pypistats)
[![Licence](https://img.shields.io/github/license/hugovk/pypistats.svg)](LICENSE.txt)
[![DOI](https://zenodo.org/badge/149862343.svg)](https://zenodo.org/badge/latestdoi/149862343)
[![Code style: Black](https://img.shields.io/badge/code%20style-Black-000000.svg)](https://github.com/psf/black)

Python interface to [PyPI Stats API](https://pypistats.org/api) to get aggregate
download statistics on Python packages on the Python Package Index without having to
execute queries directly against Google BigQuery.

Data is available for the [last 180 days](https://pypistats.org/about#data). (For longer
time periods, [pypinfo](https://github.com/ofek/pypinfo) can help, you'll need an API
key and get free quota.)

## Installation

### From PyPI

```bash
python3 -m pip install --upgrade pypistats
```

### From source

```bash
git clone https://github.com/hugovk/pypistats
cd pypistats
python3 -m pip install .
```

## Example command-line use

Run `pypistats` with a subcommand (corresponding to
[PyPI Stats endpoints](https://pypistats.org/api/#endpoints)), then options for that
subcommand.

Top-level help:

<!-- [[[cog
from scripts.run_command import run
run("pypistats --help")
]]] -->

```console
$ pypistats --help
usage: pypistats [-h] [-V]
                 {recent,overall,python_major,python_minor,system} ...

positional arguments:
  {recent,overall,python_major,python_minor,system}

options:
  -h, --help            show this help message and exit
  -V, --version         show program's version number and exit
```

<!-- [[[end]]] -->

Help for a subcommand:

<!-- [[[cog run("pypistats recent --help") ]]] -->

```console
$ pypistats recent --help
usage: pypistats recent [-h] [-p {day,week,month}]
                        [-f {html,json,pretty,md,markdown,rst,tsv}] [-j]
                        [-v]
                        package

Retrieve the aggregate download quantities for the last day/week/month

positional arguments:
  package

options:
  -h, --help            show this help message and exit
  -p {day,week,month}, --period {day,week,month}
  -f {html,json,pretty,md,markdown,rst,tsv}, --format {html,json,pretty,md,markdown,rst,tsv}
                        The format of output (default: pretty)
  -j, --json            Shortcut for "-f json" (default: False)
  -v, --verbose         Print debug messages to stderr (default: False)
```

<!-- [[[end]]] -->

Get recent downloads:

<!-- [[[cog run("pypistats recent pillow") ]]] -->

```console
$ pypistats recent pillow
┌───────────┬────────────┬────────────┐
│  last_day │ last_month │  last_week │
├───────────┼────────────┼────────────┤
│ 3,419,597 │ 91,237,125 │ 21,259,217 │
└───────────┴────────────┴────────────┘
```

<!-- [[[end]]] -->

Help for another subcommand:

<!-- [[[cog run("pypistats python_minor --help") ]]] -->

```console
$ pypistats python_minor --help
usage: pypistats python_minor [-h] [-V VERSION]
                              [-f {html,json,pretty,md,markdown,rst,tsv}]
                              [-j] [-sd yyyy-mm[-dd]|name]
                              [-ed yyyy-mm[-dd]|name] [-m yyyy-mm|name] [-l]
                              [-t] [-d] [--monthly] [-c {yes,no,auto}] [-v]
                              package

Retrieve the aggregate daily download time series by Python minor version
number

positional arguments:
  package

options:
  -h, --help            show this help message and exit
  -V VERSION, --version VERSION
                        eg. 2.7 or 3.6 (default: None)
  -f {html,json,pretty,md,markdown,rst,tsv}, --format {html,json,pretty,md,markdown,rst,tsv}
                        The format of output (default: pretty)
  -j, --json            Shortcut for "-f json" (default: False)
  -sd yyyy-mm[-dd]|name, --start-date yyyy-mm[-dd]|name
                        Start date (default: None)
  -ed yyyy-mm[-dd]|name, --end-date yyyy-mm[-dd]|name
                        End date (default: None)
  -m yyyy-mm|name, --month yyyy-mm|name
                        Shortcut for -sd & -ed for a single month (default:
                        None)
  -l, --last-month      Shortcut for -sd & -ed for last month (default: False)
  -t, --this-month      Shortcut for -sd for this month (default: False)
  -d, --daily           Show daily downloads (default: False)
  --monthly             Show monthly downloads (default: False)
  -c {yes,no,auto}, --color {yes,no,auto}
                        Color terminal output (default: auto)
  -v, --verbose         Print debug messages to stderr (default: False)
```

<!-- [[[end]]] -->

Get version downloads:

<!-- [[[cog run("pypistats python_minor pillow --last-month") ]]] -->

```console
$ pypistats python_minor pillow --last-month
┌──────────┬─────────┬────────────┐
│ category │ percent │  downloads │
├──────────┼─────────┼────────────┤
│ 3.8      │  18.37% │ 16,161,117 │
│ 3.10     │  17.47% │ 15,373,666 │
│ 3.7      │  16.70% │ 14,691,371 │
│ 3.11     │  15.49% │ 13,630,259 │
│ 3.9      │  13.19% │ 11,605,389 │
│ 3.6      │   9.68% │  8,519,789 │
│ null     │   4.64% │  4,085,994 │
│ 3.12     │   3.26% │  2,871,386 │
│ 2.7      │   0.95% │    837,638 │
│ 3.5      │   0.25% │    216,308 │
│ 3.13     │   0.00% │      2,830 │
│ 3.4      │   0.00% │      1,237 │
│ 3.3      │   0.00% │        109 │
│ 3.1      │   0.00% │          3 │
│ 3.2      │   0.00% │          2 │
│ Total    │         │ 87,997,098 │
└──────────┴─────────┴────────────┘

Date range: 2024-02-01 - 2024-02-29
```

<!-- [[[end]]] -->

You can format in Markdown, ready for pasting in GitHub issues and PRs:

<!-- [[[cog run("pypistats python_minor pillow --last-month --format md", with_console=False) ]]] -->

| category | percent |  downloads |
| :------- | ------: | ---------: |
| 3.8      |  18.37% | 16,161,117 |
| 3.10     |  17.47% | 15,373,666 |
| 3.7      |  16.70% | 14,691,371 |
| 3.11     |  15.49% | 13,630,259 |
| 3.9      |  13.19% | 11,605,389 |
| 3.6      |   9.68% |  8,519,789 |
| null     |   4.64% |  4,085,994 |
| 3.12     |   3.26% |  2,871,386 |
| 2.7      |   0.95% |    837,638 |
| 3.5      |   0.25% |    216,308 |
| 3.13     |   0.00% |      2,830 |
| 3.4      |   0.00% |      1,237 |
| 3.3      |   0.00% |        109 |
| 3.1      |   0.00% |          3 |
| 3.2      |   0.00% |          2 |
| Total    |         | 87,997,098 |

Date range: 2024-02-01 - 2024-02-29

<!-- [[[end]]] -->

These are equivalent (in May 2019):

```sh
pypistats python_major pip --last-month
pypistats python_major pip --month april
pypistats python_major pip --month apr
pypistats python_major pip --month 2019-04
```

And:

```sh
pypistats python_major pip --start-date december --end-date january
pypistats python_major pip --start-date dec      --end-date jan
pypistats python_major pip --start-date 2018-12  --end-date 2019-01
```

## Example programmatic use

Return values are from the JSON responses documented in the API:
https://pypistats.org/api/

```python
import pypistats
from pprint import pprint

# Call the API
print(pypistats.recent("pillow"))
print(pypistats.recent("pillow", "day", format="markdown"))
print(pypistats.recent("pillow", "week", format="rst"))
print(pypistats.recent("pillow", "month", format="html"))
pprint(pypistats.recent("pillow", "week", format="json"))
print(pypistats.recent("pillow", "day"))

print(pypistats.overall("pillow"))
print(pypistats.overall("pillow", mirrors=True, format="markdown"))
print(pypistats.overall("pillow", mirrors=False, format="rst"))
print(pypistats.overall("pillow", mirrors=True, format="html"))
pprint(pypistats.overall("pillow", mirrors=False, format="json"))

print(pypistats.python_major("pillow"))
print(pypistats.python_major("pillow", version=2, format="markdown"))
print(pypistats.python_major("pillow", version=3, format="rst"))
print(pypistats.python_major("pillow", version="2", format="html"))
pprint(pypistats.python_major("pillow", version="3", format="json"))

print(pypistats.python_minor("pillow"))
print(pypistats.python_minor("pillow", version=2.7, format="markdown"))
print(pypistats.python_minor("pillow", version="2.7", format="rst"))
print(pypistats.python_minor("pillow", version=3.7, format="html"))
pprint(pypistats.python_minor("pillow", version="3.7", format="json"))

print(pypistats.system("pillow"))
print(pypistats.system("pillow", os="darwin", format="markdown"))
print(pypistats.system("pillow", os="linux", format="rst"))
print(pypistats.system("pillow", os="darwin", format="html"))
pprint(pypistats.system("pillow", os="linux", format="json"))
```

### NumPy and pandas

To use with either NumPy or pandas, make sure they are first installed, or:

```bash
pip install --upgrade "pypistats[numpy]"
pip install --upgrade "pypistats[pandas]"
pip install --upgrade "pypistats[numpy,pandas]"
```

Return data in a NumPy array for further processing:

```python
import pypistats
numpy_array = pypistats.overall("pyvista", total=True, format="numpy")
print(type(numpy_array))
# <class 'numpy.ndarray'>
print(numpy_array)
# [['with_mirrors' '2019-09-20' '2.23%' 1204]
#  ['without_mirrors' '2019-09-20' '2.08%' 1122]
#  ['with_mirrors' '2019-09-19' '0.92%' 496]
#  ...
#  ['with_mirrors' '2019-10-26' '0.02%' 13]
#  ['without_mirrors' '2019-10-26' '0.02%' 12]
#  ['Total' None None 54041]]
```

Or in a pandas DataFrame:

```python
import pypistats
pandas_dataframe = pypistats.overall("pyvista", total=True, format="pandas")
print(type(pandas_dataframe))
# <class 'pandas.core.frame.DataFrame'>
print(pandas_dataframe)
#             category        date percent  downloads
# 0       with_mirrors  2019-09-20   2.23%       1204
# 1    without_mirrors  2019-09-20   2.08%       1122
# 2       with_mirrors  2019-09-19   0.92%        496
# 3       with_mirrors  2019-08-22   0.90%        489
# 4    without_mirrors  2019-09-19   0.86%        466
# ..               ...         ...     ...        ...
# 354  without_mirrors  2019-11-03   0.03%         15
# 355  without_mirrors  2019-11-16   0.03%         15
# 356     with_mirrors  2019-10-26   0.02%         13
# 357  without_mirrors  2019-10-26   0.02%         12
# 358            Total        None    None      54041
#
# [359 rows x 4 columns]
```

For example, create charts with pandas:

```python
# Show overall downloads over time, excluding mirrors
import pypistats
data = pypistats.overall("pillow", total=True, format="pandas")
data = data.groupby("category").get_group("without_mirrors").sort_values("date")

chart = data.plot(x="date", y="downloads", figsize=(10, 2))
chart.figure.show()
chart.figure.savefig("overall.png")  # alternatively
```

![overall.png](example/overall.png)

```python
# Show Python 3 downloads over time
import pypistats
data = pypistats.python_major("pillow", total=True, format="pandas")
data = data.groupby("category").get_group(3).sort_values("date")

chart = data.plot(x="date", y="downloads", figsize=(10, 2))
chart.figure.show()
chart.figure.savefig("python3.png")  # alternatively
```

![python3.png](example/python3.png)

## See also

Related projects

- https://github.com/ofek/pypinfo
- https://github.com/scivision/pypistats-plots


# Locust Plugins

[![Build Status](https://github.com/SvenskaSpel/locust-plugins/workflows/Tests/badge.svg)](https://github.com/SvenskaSpel/locust-plugins/actions?query=workflow%3ATests)
[![license](https://img.shields.io/github/license/SvenskaSpel/locust-plugins.svg)](https://github.com/SvenskaSpel/locust-plugins/blob/master/LICENSE)
[![PyPI](https://img.shields.io/pypi/v/locust-plugins.svg)](https://pypi.org/project/locust-plugins/)
[![PyPI](https://img.shields.io/pypi/pyversions/locust-plugins.svg)](https://pypi.org/project/locust-plugins/)
[![GitHub contributors](https://img.shields.io/github/contributors/SvenskaSpel/locust-plugins.svg)](https://github.com/SvenskaSpel/locust-plugins/graphs/contributors)

The purpose of this project is to gather a curated set of plugins/extensions for [Locust](https://github.com/locustio/locust).

Locust itself is a "bare bones" load generation tool (compared to for example JMeter or Gatling) and it is left to the user to build even basic functionality (like reading test data from a database, using non-HTTP protocols, etc). This keeps Locust lean and mean, but forcing everyone to reinvent the wheel is not good either.

So I decided to publish my own plugins and hope that others (maybe you?) will contribute their solutions to common Locust use cases.

Having this separate from "Locust core" allows the plugins to evolve faster (at the expense of being less mature), and avoids bloating Locust with functionality you might not be interested in.

# Installation

```
pip install locust-plugins
```

# Configuration

Most settings are configured from code, but some are exposed as command line arguments. You can list them by using Locust's regular --help argument:

```
locust --help
```

# Plugins

## Listeners
- Listen to events and log things
    - Timescale: Log and graph results using TimescaleDB and Grafana dashboards ([readme](locust_plugins/dashboards/), [source](locust_plugins/listeners.py))
    - Jmeter: Writes a jmeter-like output file ([example](examples/jmeter_listener_example.py), [source](locust_plugins/jmeter_listener.py))
    - ApplicationInsights: Writes the test logs to Azure Application Insights ([example](examples/appinsights_listener_ex.py), [source](locust_plugins/appinsights_listener.py))
    - RescheduleTaskOnFail / ExitOnFail / StopUserOnFail: Perform actions when a request fails ([source](locust_plugins/listeners.py))

## Users
- New protocols ([source](locust_plugins/users/))
    - Playwright ([example](examples/playwright_ex.py))
    - WebSockets/SocketIO ([example](examples/socketio_ex.py))
    - Selenium/Webdriver ([example](examples/webdriver_ex.py))
    - HTTP users that load html page resources ([example](examples/embedded_resource_manager_ex.py))
    - Kafka ([example](examples/kafka_ex.py))
    - MqttUser ([example](examples/mqtt_ex.py))
    - RestUser has been removed, as it is [now part of locust core](https://docs.locust.io/en/stable/increase-performance.html#rest)!

## Readers
- Provide ways to get test data into your tests
    - CSV ([example](examples/csvreader_ex.py), [source](locust_plugins/csvreader.py))
    - MongoDB ([example](examples/mongoreader_ex.py), [source](locust_plugins/mongoreader.py))

## Wait time
- Custom wait time functions ([example](examples/constant_total_ips_ex.py), [source](locust_plugins/wait_time.py))

## Distributing test data
- Support for distributing test data from master to workers while maintaining test data order ([example](examples/distributor_ex.py), [source](locust_plugins/distributor.py))

## Transaction manager
- Support for logging transactions (aggregating multiple requests or other actions) ([example](examples/transaction_example.py), [source](locust_plugins/transaction_manager.py))

## Connection Pool
- Allows users to occupy more ports when running tests, useful for dealing with strange behaviour from load balancers in low user count high throughput scenarios. scenarios. ([example](examples/connection_pool_ex.py), [source](locust_plugins/connection_pools.py))

## Command line options
- Additional locust command line options provided ([examples](examples/cmd_line_examples.sh), [source](locust_plugins/__init__.py))
    - Iteration limit (`-i`), stops Locust after a certain number of task iterations
    - Checks (`--check-rps`, `--check-fail-ratio`, `--check-avg-response-time`), gives an error return code if certain conditions are not met
    - [Dashboards](locust_plugins/dashboards/) (`--timescale`, `--grafana-url`, `--pghost`, ...)

# Further examples

Have a look at the [example locustfiles](examples/) to learn how to use the plugins.

# locust-swarm

These plugins work well together with [locust-swarm](https://github.com/SvenskaSpel/locust-swarm)

# Contributions

Contributions are very welcome! 😁

For guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md)

## License

Copyright 2019 AB SvenskaSpel

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


[![Tested with Hypothesis](https://img.shields.io/badge/hypothesis-tested-brightgreen.svg)](https://hypothesis.readthedocs.io/)
[![codecov](https://codecov.io/gh/rsokl/MyGrad/branch/master/graph/badge.svg)](https://codecov.io/gh/rsokl/MyGrad)
[![Documentation Status](https://readthedocs.org/projects/mygrad/badge/?version=latest)](https://mygrad.readthedocs.io/en/latest/?badge=latest)
[![Automated tests status](https://github.com/rsokl/MyGrad/workflows/Tests/badge.svg)](https://github.com/rsokl/MyGrad/actions?query=workflow%3ATests+branch%3Amaster)
[![PyPi version](https://img.shields.io/pypi/v/mygrad.svg)](https://pypi.python.org/pypi/mygrad)
![Python version support](https://img.shields.io/badge/python-3.7%20‐%203.11-blue.svg)

# [MyGrad's Documentation](https://mygrad.readthedocs.io/en/latest/)

# Introducing mygrad
MyGrad is a lightweight library that adds automatic differentiation to NumPy – its only dependency is NumPy! It is specifically able to compute gradients of scalar-valued functions via backpropagation (i.e. reverse-mode automatic differentiation).

```python
>>> import mygrad as mg
>>> import numpy as np

>>> x = mg.tensor([1., 2., 3.])  # like numpy.array, but supports backprop!
>>> f = np.sum(x * x)  # tensors work with numpy functions!
>>> f.backward() # triggers automatic differentiation
>>> x.grad  # stores [df/dx0, df/dx1, df/dx2]
array([2., 4., 6.])
```

MyGrad's primary goal is to make automatic differentiation accessible and easy to use across the Python/NumPy ecosystem.
As such, it strives to behave and feel exactly like NumPy so that users need not learn yet another array-based math library.
Of the various modes and flavors of auto-diff, MyGrad supports backpropagation from a scalar quantity.

Installing MyGrad:

```shell script
pip install mygrad
```

NumPy's ufuncs are richly supported; e.g. we can autodiff through in-place targets and boolean masks:

```python
>>> x = mg.tensor([1., 2., 3.])
>>> y = mg.zeros_like(x)
>>> np.multiply(x, x, where=[True, False, True], out=y)
>>> y.backward()
>>> x.grad
array([2., 0., 6.])
```

NumPy's view semantics are also mirrored to a high fidelity

```python
>>> x = mg.arange(9.).reshape(3, 3)
>>> diag_view = np.einsum("ii->i", x)
>>> x, diag_view
(Tensor([[0., 1., 2.],
         [3., 4., 5.],
         [6., 7., 8.]]),
 Tensor([0., 4., 8.]))

# views share memory
>>> np.shares_memory(x, diag_view)
True

# mutating a view affects its base (and all other views)
>>> diag_view *= -1  # mutates x in-place
>>> x
Tensor([[-0.,  1.,  2.],
        [ 3., -4.,  5.],
        [ 6.,  7., -8.]])

>>> (x ** 2).backward()
>>> x.grad, diag_view.grad
(array([[ -0.,   2.,   4.],
        [  6.,  -8.,  10.],
        [ 12.,  14., -16.]]),
 array([ -0.,  -8., -16.]))

# the gradients have the same view relationship!
>>> np.shares_memory(x.grad, diag_view.grad)
True
```

Basic and advanced indexing is fully supported

```python
>>> (x[x < 4] ** 2).backward()
>>> x.grad
array([[0., 2., 4.],
       [6., 0., 0.],
       [0., 0., 0.]])
```

NumPy arrays and other array-likes play nicely with MyGrad's tensor. These behave like constants
during automatic differentiation

```python
>>> x = mg.tensor([1., 2., 3.])
>>> y = np.array([-1., 0., 10])
>>> (x * y).backward()  # y is treated as a constant
>>> x.grad
array([-1.,  0., 10.])
```

[`mygrad.nnet`](https://mygrad.readthedocs.io/en/latest/nnet.html) supplies essential functions to facilitate typical machine learning examples:
- [N-dimensional convolutions](https://mygrad.readthedocs.io/en/latest/generated/mygrad.nnet.layers.conv_nd.html) (with striding, dilation, and padding)
- N-dimensional pooling
- A [gated recurrent unit](https://en.wikipedia.org/wiki/Gated_recurrent_unit) for sequence-learning (with input-level
  dropout and variational hidden-hidden dropout)

## Advanced Example
The following is an example of using `mygrad` to compute the [hinge loss](https://en.wikipedia.org/wiki/Hinge_loss) of classification scores and to "backpropagate" through (compute the gradient of) this loss. This example demonstrates some of mygrad's ability to perform backpropagation through broadcasted operations, basic indexing, advanced indexing, and in-place assignments.

```python
>>> import mygrad as mg
>>> import numpy as np
>>> class_scores = 10 * mg.random.rand(100, 10) # 100 samples, 10 possible classes for each
>>> class_labels = np.random.randint(low=0, high=10, size=100)  # correct label for each datum
>>> class_labels = (range(len(class_labels)), class_labels)
>>> correct_class_scores = class_scores[class_labels]

>>> Lij = class_scores - correct_class_scores[:, np.newaxis] + 1.  # 100x10 margins
>>> Lij[Lij <= 0] = 0      # scores within the hinge incur no loss
>>> Lij[class_labels] = 0  # the score corresponding to the correct label incurs no loss

>>> loss = Lij.sum() / class_scores.shape[0]  # compute mean hinge loss
>>> loss.backward()    # compute gradient of loss w.r.t all dependent tensors
>>> class_scores.grad  # d(loss)/d(class_scores)
array([[ 0.  ,  0.01,  0.  , -0.04,  0.  ,  0.  ,  0.01,  0.  ,  0.01, 0.01], ...])
```

## Computational Graph Visualization
`mygrad` uses [Graphviz](http://www.graphviz.org) and a [Python interface for Graphviz](https://graphviz.readthedocs.io/en/stable/) to render the computational graphs built using tensors. These graphs can be rendered in Jupyter notebooks, allowing for quick checks of graph structure, or can be saved to file for later reference.

The dependencies can be installed with:

```shell
conda install graphviz
conda install python-graphviz
```


# Ethereum ETL Airflow

Read this article: https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-how-we-built-dataset

## Setting up Airflow DAGs using Google Cloud Composer

### Create BigQuery Datasets

- Sign in to BigQuery https://bigquery.cloud.google.com/
- Create new datasets called `crypto_ethereum`, `crypto_ethereum_raw`, `crypto_ethereum_temp`

### Create Google Cloud Storage bucket

- Create a new Google Storage bucket to store exported files https://console.cloud.google.com/storage/browser

### Create Google Cloud Composer (version 2) environment

Create a new Cloud Composer environment:

```bash
export ENVIRONMENT_NAME=ethereum-etl-0

AIRFLOW_CONFIGS_ARR=(
    "celery-worker_concurrency=8"
    "scheduler-dag_dir_list_interval=300"
    "scheduler-min_file_process_interval=120"
)
export AIRFLOW_CONFIGS=$(IFS=, ; echo "${AIRFLOW_CONFIGS_ARR[*]}")

gcloud composer environments create \
    $ENVIRONMENT_NAME \
    --location=us-central1 \
    --image-version=composer-2.1.14-airflow-2.5.1 \
    --environment-size=medium \
    --scheduler-cpu=2 \
    --scheduler-memory=13 \
    --scheduler-storage=1 \
    --scheduler-count=1 \
    --web-server-cpu=1 \
    --web-server-memory=2 \
    --web-server-storage=512MB \
    --worker-cpu=2 \
    --worker-memory=13 \
    --worker-storage=10 \
    --min-workers=1 \
    --max-workers=8 \
    --airflow-configs=$AIRFLOW_CONFIGS

gcloud composer environments update \
    $ENVIRONMENT_NAME \
    --location=us-central1 \
    --update-pypi-packages-from-file=requirements_airflow.txt
```

Create variables in Airflow (**Admin > Variables** in the UI):

| Variable                                | Description                             |
|-----------------------------------------|-----------------------------------------|
| ethereum_output_bucket                  | GCS bucket to store exported files      |
| ethereum_provider_uris                  | Comma separated URIs of Ethereum nodes  |
| ethereum_destination_dataset_project_id | Project ID of BigQuery datasets         |
| notification_emails                     | email for notifications                 |

Check other variables in `dags/ethereumetl_airflow/variables.py`.

### Updating package requirements
Suggested package requirements for Composer are stored in `requirements_airflow.txt`.

You can update the Composer environment using the follow script:
```bash
ENVIRONMENT_NAME="ethereum-etl-0"
LOCAL_REQUIREMENTS_PATH="$(mktemp)"

# grep pattern removes comments and whitespace:
cat "./requirements_airflow.txt" | grep -o '^[^#| ]*' > "$LOCAL_REQUIREMENTS_PATH"

gcloud composer environments update \
  "$ENVIRONMENT_NAME" \
  --location="us-central1" \
  --update-pypi-packages-from-file="$LOCAL_REQUIREMENTS_PATH"
```

**Note:** Composer can be _very_ pedantic about conflicts in additional packages. You may have to fix dependency conflicts where you had no issues testing locally (when updating dependencies, Composer does something "cleverer" than just `pip install -r requirements.txt`). This is why `eth-hash` is currently pinned in `requirements_airflow.txt`. Typically we have found that pinning `eth-hash` and/or `eth-rlp` may make things work, though Your Mileage May Vary.

See [this issue](https://github.com/blockchain-etl/ethereum-etl-airflow/issues/481#issuecomment-1332878533) for further ideas on how to unblock problems you may encounter.

### Upload DAGs

```bash
> ./upload_dags.sh <airflow_bucket>
```

### Running Tests

```bash
pip install \
    -r requirements_test.txt \
    -r requirements_local.txt \
    -r requirements_airflow.txt
pytest -vv -s
```

### Running locally
A docker compose definition has been provided to easily spin up a local Airflow instance.

To build the required image:
```bash
docker compose build
```
To start Airflow:
```bash
docker compose up airflow
```

The instance requires the `CLOUDSDK_CORE_PROJECT` environment variable to be set in most cases. Airflow Variables can be defined in [variables.json](./docker/variables.json).

### Creating Table Definition Files for Parsing Events and Function Calls

Read this article: https://medium.com/@medvedev1088/query-ens-and-0x-events-with-sql-in-google-bigquery-4d197206e644

### More Information

You can follow the instructions here for Polygon DAGs https://github.com/blockchain-etl/polygon-etl. The architecture
there is very similar to Ethereum so in most case substituting `polygon` for `ethereum` will work. Contributions
to this README file for porting documentation from Polygon to Ethereum are welcome.