diff --git a/.gitignore b/.gitignore index df1024a7..30036293 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,85 @@ +#Manually added files + +src/NadekoBot/credentials.json +src/NadekoBot/data/NadekoBot.db +src/NadekoBot/musicdata + +# Created by https://www.gitignore.io/api/visualstudio,visualstudiocode,windows,linux,macos + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json + + +### Windows ### +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + + +### macOS ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +### VisualStudio ### ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. @@ -6,19 +88,154 @@ *.user *.userosscache *.sln.docstates -*.pfx -.vs -obj/ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs -**/src/NadekoBot/bin -Tests/bin -src/NadekoBot/credentials.json -src/NadekoBot/project.lock.json -src/NadekoBot/data/NadekoBot.db -src/NadekoBot/musicdata/* -src/NadekoBot/project.lock.json + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ # NuGet Packages *.nupkg @@ -28,7 +245,109 @@ src/NadekoBot/project.lock.json !**/packages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/packages/repositories.config -NadekoBot.sln.iml -.idea/workspace.xml -.idea/vcs.xml -.idea/modules.xml \ No newline at end of file +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/ + +### VisualStudio Patch ### +build/ \ No newline at end of file diff --git a/NadekoBot.sln b/NadekoBot.sln index 48336ef6..aba14bf4 100644 --- a/NadekoBot.sln +++ b/NadekoBot.sln @@ -16,6 +16,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Discord.Net", "discord.net\ EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Discord.Net.Commands", "discord.net\src\Discord.Net.Commands\Discord.Net.Commands.xproj", "{078DD7E6-943D-4D09-AFC2-D2BA58B76C9C}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "tests", "src\tests\tests.xproj", "{14CBADA0-971C-44E3-B331-C7D01DD74F0B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -34,11 +36,16 @@ Global {078DD7E6-943D-4D09-AFC2-D2BA58B76C9C}.Debug|Any CPU.Build.0 = Debug|Any CPU {078DD7E6-943D-4D09-AFC2-D2BA58B76C9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {078DD7E6-943D-4D09-AFC2-D2BA58B76C9C}.Release|Any CPU.Build.0 = Release|Any CPU + {14CBADA0-971C-44E3-B331-C7D01DD74F0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14CBADA0-971C-44E3-B331-C7D01DD74F0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14CBADA0-971C-44E3-B331-C7D01DD74F0B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14CBADA0-971C-44E3-B331-C7D01DD74F0B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {45EC1473-C678-4857-A544-07DFE0D0B478} = {04929013-5BAB-42B0-B9B2-8F2BB8F16AF2} + {14CBADA0-971C-44E3-B331-C7D01DD74F0B} = {04929013-5BAB-42B0-B9B2-8F2BB8F16AF2} EndGlobalSection EndGlobal diff --git a/discord.net b/discord.net index b51408de..6a7f7b81 160000 --- a/discord.net +++ b/discord.net @@ -1 +1 @@ -Subproject commit b51408def863ee5f4273478efa65eb50e4008487 +Subproject commit 6a7f7b81322266977ef809e521af6c199ec8de54 diff --git a/docs/Commands List.md b/docs/Commands List.md new file mode 100644 index 00000000..c9367655 --- /dev/null +++ b/docs/Commands List.md @@ -0,0 +1,311 @@ + +### Administration +Command and aliases | Description | Usage +----------------|--------------|------- +`.restart` | `.restart` | Restarts the bot. Might not work. **Bot owner only.** +`.delmsgoncmd` | `.delmsgoncmd` | Toggles the automatic deletion of user's successful command message to prevent chat flood. **Server Manager Only.** **Requires Administrator server permission.** +`.setrole` `.sr` | `.sr @User Guest` | Sets a role for a given user. **Requires ManageRoles server permission.** +`.removerole` `.rr` | `.rr @User Admin` | Removes a role from a given user. **Requires ManageRoles server permission.** +`.renamerole` `.renr` | `.renr "First role" SecondRole` | Renames a role. Roles you are renaming must be lower than bot's highest role. **Manage Roles Permissions.** **Requires ManageRoles server permission.** +`.removeallroles` `.rar` | `.rar @User` | Removes all roles from a mentioned user. **Requires ManageRoles server permission.** +`.createrole` `.cr` | `.cr Awesome Role` | Creates a role with a given name. **Requires ManageRoles server permission.** +`.rolecolor` `.rc` | `.rc Admin 255 200 100` or `.rc Admin ffba55` | Set a role's color to the hex or 0-255 rgb color value provided. **Requires ManageRoles server permission.** +`.ban` `.b` | `.b "@some Guy" Your behaviour is toxic.` | Bans a user by id or name with an optional message. **Requires BanMembers server permission.** +`.softban` `.sb` | `.sb "@some Guy" Your behaviour is toxic.` | Bans and then unbans a user by id or name with an optional message. **Requires BanMembers server permission.** +`.kick` `.k` | `.k "@some Guy" Your behaviour is toxic.` | Kicks a mentioned user. **Requires KickMembers server permission.** +`.mute` | `.mute @Someone` | Mutes a mentioned user in a voice channel. **Requires MuteMembers server permission.** +`.unmute` | `.unmute "@Someguy"` or `.unmute "@Someguy" "@Someguy"` | Unmutes mentioned user or users. **Requires MuteMembers server permission.** +`.deafen` `.deaf` | `.deaf "@Someguy"` or `.deaf "@Someguy" "@Someguy"` | Deafens mentioned user or users. **Requires DeafenMembers server permission.** +`.undeafen` `.undef` | `.undef "@Someguy"` or `.undef "@Someguy" "@Someguy"` | Undeafens mentioned user or users. **Requires DeafenMembers server permission.** +`.delvoichanl` `.dvch` | `.dvch VoiceChannelName` | Deletes a voice channel with a given name. **Requires ManageChannels server permission.** +`.creatvoichanl` `.cvch` | `.cvch VoiceChannelName` | Creates a new voice channel with a given name. **Requires ManageChannels server permission.** +`.deltxtchanl` `.dtch` | `.dtch TextChannelName` | Deletes a text channel with a given name. **Requires ManageChannels server permission.** +`.creatxtchanl` `.ctch` | `.ctch TextChannelName` | Creates a new text channel with a given name. **Requires ManageChannels server permission.** +`.settopic` `.st` | `.st My new topic` | Sets a topic on the current channel. **Requires ManageChannels server permission.** +`.setchanlname` `.schn` | `.schn NewName` | Changed the name of the current channel. **Requires ManageChannels server permission.** +`.prune` `.clr` | `.prune` or `.prune 5` or `.prune @Someone` or `.prune @Someone X` | `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. +`.prune` `.clr` | `.prune` or `.prune 5` or `.prune @Someone` or `.prune @Someone X` | `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. **Requires ManageMessages server permission.** +`.prune` `.clr` | `.prune` or `.prune 5` or `.prune @Someone` or `.prune @Someone X` | `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. **Requires ManageMessages server permission.** +`.die` | `@NadekoBot die` | Works only for the owner. Shuts the bot down. **Bot owner only.** +`.setname` `.newnm` | `.newnm BotName` | Give the bot a new name. **Bot owner only.** +`.setavatar` `.setav` | `.setav http://i.imgur.com/xTG3a1I.jpg` | Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot owner only.** +`.setgame` | `.setgame Playing with kwoth` | Sets the bots game. **Bot owner only.** +`.send` | `.send sid` | Send a message to someone on a different server through the bot. **Bot owner only.** +`.announce` | `.announce Useless spam` | Sends a message to all servers' general channel bot is connected to. **Bot owner only.** +`.savechat` | `.savechat 150` | Saves a number of messages to a text file and sends it to you. **Bot owner only.** +`.mentionrole` `.menro` | `.menro RoleName` | Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. **Requires MentionEveryone server permission.** +`.donators` | `.donators` | List of lovely people who donated to keep this project alive. +`.donadd` | `.donadd Donate Amount` | Add a donator to the database. **Kwoth Only** **Bot owner only.** +`.autoassignrole` `.aar` | `.aar` to disable, `.aar Role Name` to enable | Automaticaly assigns a specified role to every user who joins the server. **Requires ManageRoles server permission.** +`.scsc` | `.scsc` | Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance. **Bot owner only.** +`.jcsc` | `.jcsc` | Joins current channel to an instance of cross server channel using the token. **Requires ManageServer server permission.** +`.lcsc` | `.lcsc` | Leaves Cross server channel instance from this channel. **Requires ManageServer server permission.** +`.logserver` | `.logserver` | Logs server activity in this channel. **Requires Administrator server permission.** **Bot owner only.** +`.logignore` | `.logignore` | Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Requires Administrator server permission.** **Bot owner only.** +`.userpresence` | `.userpresence` | Starts logging to this channel when someone from the server goes online/offline/idle. **Requires Administrator server permission.** +`.voicepresence` | `.voicerpresence` | Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Requires Administrator server permission.** +`.repeatinvoke` `.repinv` | `.repinv` | Immediately shows the repeat message and restarts the timer. **Requires ManageMessages server permission.** +`.repeat` | `.repeat 5 Hello there` | Repeat a message every X minutes. If no parameters are specified, repeat is disabled. +`.repeat` | `.repeat 5 Hello there` | Repeat a message every X minutes. If no parameters are specified, repeat is disabled. +`.migratedata` | `.migratedata` | Migrate data from old bot configuration **Bot owner only.** +`.rotateplaying` `.ropl` | `.ropl` | Toggles rotation of playing status of the dynamic strings you specified earlier. **Bot owner only.** +`.addplaying` `.adpl` | `.adpl` | Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued% **Bot owner only.** +`.listplaying` `.lipl` | `.lipl` | Lists all playing statuses with their corresponding number. **Bot owner only.** +`.removeplaying` `.rmlp` `.repl` | `.rmpl` | Removes a playing string on a given number. **Bot owner only.** +`.slowmode` | `.slowmode` | Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. +`.asar` | `.asar Gamer` | Adds a role, or list of roles separated by whitespace(use quotations for multiword roles) to the list of self-assignable roles. **Requires ManageRoles server permission.** +`.rsar` | `.rsar` | Removes a specified role from the list of self-assignable roles. **Requires ManageRoles server permission.** +`.lsar` | `.lsar` | Lists all self-assignable roles. +`.togglexclsar` `.tesar` | `.tesar` | toggle whether the self-assigned roles should be exclusive **Requires ManageRoles server permission.** +`.iam` | `.iam Gamer` | Adds a role to you that you choose. Role must be on a list of self-assignable roles. +`.iamnot` `.iamn` | `.iamn Gamer` | Removes a role to you that you choose. Role must be on a list of self-assignable roles. +`.leave` | `.leave 123123123331` | Makes Nadeko leave the server. Either name or id required. **Bot owner only.** +`.greetdel` | `.greetdel` | Toggles automatic deletion of greet messages. **Requires ManageServer server permission.** +`.greet` | `.greet` | Toggles anouncements on the current channel when someone joins the server. **Requires ManageServer server permission.** +`.greetmsg` | `.greetmsg Welcome, %user%.` | Sets a new join announcement message which will be shown in the server's channel. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. **Requires ManageServer server permission.** +`.greetdm` | `.greetdm` | Toggles whether the greet messages will be sent in a DM (This is separate from greet - you can have both, any or neither enabled). **Requires ManageServer server permission.** +`.greetdmmsg` | `.greetdmmsg Welcome to the server, %user%`. | Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. **Requires ManageServer server permission.** +`.bye` | `.bye` | Toggles anouncements on the current channel when someone leaves the server. **Requires ManageServer server permission.** +`.byemsg` | `.byemsg %user% has left.` | Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. **Requires ManageServer server permission.** +`.byedel` | `.byedel` | Toggles automatic deletion of bye messages. **Requires ManageServer server permission.** +`.voice+text` `.v+t` | `.voice+text` | Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. **Requires ManageRoles server permission.** **Requires ManageChannels server permission.** +`.cleanvplust` `.cv+t` | `.cleanv+t` | Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk. Needs Manage Roles and Manage Channels Permissions.** **Requires ManageChannels server permission.** **Requires ManageRoles server permission.** + +### Permissions +Command and aliases | Description | Usage +----------------|--------------|------- +`;verbose` `;v` | `;verbose true` | Sets whether to show when a command/module is blocked. +`;permrole` `;pr` | `;pr role` | Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'. +`;listperms` `;lp` | `;lp` or `;lp 3` | Lists whole permission chain with their indexes. You can specify optional page number if there are a lot of permissions +`;removeperm` `;rp` | `;rp 1` | Removes a permission from a given position +`;moveperm` `;mp` | `;mp 2 4` | Moves permission from one position to another. +`;srvrcmd` `;sc` | `;sc "command name" disable` | Sets a command's permission at the server level. +`;srvrmdl` `;sm` | `;sm "module name" enable` | Sets a module's permission at the server level. +`;usrcmd` `;uc` | `;uc "command name" enable SomeUsername` | Sets a command's permission at the user level. +`;usrmdl` `;um` | `;um "module name" enable SomeUsername` | Sets a module's permission at the user level. +`;rolecmd` `;rc` | `;rc "command name" disable MyRole` | Sets a command's permission at the role level. +`;rolemdl` `;rm` | `;rm "module name" enable MyRole` | Sets a module's permission at the role level. +`;chnlcmd` `;cc` | `;cc "command name" enable SomeChannel` | Sets a command's permission at the channel level. +`;chnlmdl` `;cm` | `;cm "module name" enable SomeChannel` | Sets a module's permission at the channel level. +`;allchnlmdls` `;acm` | `;acm enable #SomeChannel` | Enable or disable all modules in a specified channel. +`;allrolemdls` `;arm` | `;arm [enable/disable] MyRole` | Enable or disable all modules for a specific role. +`;allusrmdls` `;aum` | `;aum enable @someone` | Enable or disable all modules for a specific user. +`;allsrvrmdls` `;asm` | `;asm [enable/disable]` | Enable or disable all modules for your server. +`;ubl` | `;ubl add @SomeUser` or `;ubl rem 12312312313` | Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. **Bot owner only.** +`;ubl` | `;ubl add @SomeUser` or `;ubl rem 12312312313` | Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. **Bot owner only.** +`;cbl` | `;cbl rem 12312312312` | Either [add]s or [rem]oves a channel specified by an ID from a blacklist. **Bot owner only.** +`;sbl` | `;sbl add 12312321312` or `;sbl rem SomeTrashServer` | Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist. **Bot owner only.** +`;sbl` | `;sbl add 12312321312` or `;sbl rem SomeTrashServer` | Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist. **Bot owner only.** +`;cmdcooldown` `;cmdcd` | `;cmdcd "some cmd" 5` | Sets a cooldown per user for a command. Set 0 to clear. +`;allcmdcooldowns` `;acmdcds` | `;acmdcds` | Shows a list of all commands and their respective cooldowns. +`;srvrfilterinv` `;sfi` | `;sfi disable` | Enables or disables automatic deleting of invites on the server. +`;chnlfilterinv` `;cfi` | `;cfi enable #general-chat` | Enables or disables automatic deleting of invites on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. +`;srvrfilterwords` `;sfw` | `;sfw disable` | Enables or disables automatic deleting of messages containing forbidden words on the server. +`;chnlfilterwords` `;cfw` | `;cfw enable #general-chat` | Enables or disables automatic deleting of messages containing banned words on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. +`;fw` | `;fw poop` | Adds or removes (if it exists) a word from the list of filtered words +`;lstfilterwords` `;lfw` | `;lfw` | Shows a list of filtered words + +### Utility +Command and aliases | Description | Usage +----------------|--------------|------- +`.whosplaying` | `.whoplays Overwatch` | Shows a list of users who are playing the specified game. +`.inrole` | `.inrole Role` | Lists every person from the provided role or roles (separated by a ',') on this server. If the list is too long for 1 message, you must have Manage Messages permission. +`.checkmyperms` | `.checkmyperms` | Checks your userspecific permissions on this channel. +`.userid` `.uid` | `.uid` or `.uid "@SomeGuy"` | Shows user ID. +`.channelid` `.cid` | `.cid` | Shows current channel ID. +`.serverid` `.sid` | `.sid` | Shows current server ID. +`.roles` | `.roles` | List all roles on this server or a single user if specified. +`.channeltopic` `.ct` | `.ct` | Sends current channel's topic as a message. +`.stats` | `.stats` | Shows some basic stats for Nadeko. +`.showemojis` `.se` | `.se A message full of SPECIALemojis` | Shows a name and a link to every SPECIAL emoji in the message. +`.serverinfo` `.sinfo` | `.sinfo Some Server` | Shows info about the server the bot is on. If no channel is supplied, it defaults to current one. +`.channelinfo` `.cinfo` | `.cinfo #some-channel` | Shows info about the channel. If no channel is supplied, it defaults to current one. +`.userinfo` `.uinfo` | `.uinfo @SomeUser` | Shows info about the user. If no user is supplied, it defaults a user running the command. +`...` | `... abc` | Shows a random quote with a specified name. +`..` | `.. sayhi Hi` | Adds a new quote with the specified name and message. +`.deletequote` `.delq` | `.delq abc` | Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it. +`.delallq` `.daq` | `.delallq kek` | Deletes all quotes on a specified keyword. +`.remind` | `.remind me 1d5h Do something` or `.remind #general Start now!` | Sends a message to you or a channel after certain amount of time. First argument is me/here/'channelname'. Second argument is time in a descending order (mo>w>d>h>m) example: 1w5d3h10m. Third argument is a (multiword)message. +`.remindtemplate` | `.remindtemplate %user%, you gotta do %message%!` | Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. **Bot owner only.** + +### Searches +Command and aliases | Description | Usage +----------------|--------------|------- +`~weather` `~we` | `~we Moscow RF` | Shows weather data for a specified city and a country. BOTH ARE REQUIRED. Use country abbrevations. +`~youtube` `~yt` | `~yt query` | Searches youtubes and shows the first result +`~imdb` | `~imdb Batman vs Superman` | Queries imdb for movies or series, show first result. +`~randomcat` `~meow` | `~meow` | Shows a random cat image. +`~randomdog` `~woof` | `~woof` | Shows a random dog image. +`~img` `~i` | `~i cute kitten` | Pulls the first image found using a search parameter. Use ~ir for different results. +`~ir` | `~ir cute kitten` | Pulls a random image using a search parameter. +`~lmgtfy` | `~lmgtfy query` | Google something for an idiot. +`~google` `~g` | `~google query` | Get a google search link for some terms. +`~hearthstone` `~hs` | `~hs Ysera` | Searches for a Hearthstone card and shows its image. Takes a while to complete. +`~urbandict` `~ud` | `~ud Pineapple` | Searches Urban Dictionary for a word. +`~#` | `~# ff` | Searches Tagdef.com for a hashtag. +`~catfact` | `~catfact` | Shows a random catfact from +`~revav` | `~revav "@SomeGuy"` | Returns a google reverse image search for someone's avatar. +`~revimg` | `~revimg Image link` | Returns a google reverse image search for an image from a link. +`~safebooru` | `~safebooru yuri+kissing` | Shows a random image from safebooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) +`~wikipedia` `~wiki` | `~wiki query` | Gives you back a wikipedia link +`~color` `~clr` | `~clr 00ff00` | Shows you what color corresponds to that hex. +`~videocall` | `~videocall "@SomeGuy"` | Creates a private video call link for you and other mentioned people. The link is sent to mentioned people via a private message. +`~av` `~avatar` | `~av "@SomeGuy"` | Shows a mentioned person's avatar. +`~calculate` `~calc` | `~calc 1+1` | Evaluate a mathematical expression. +`~calcops` | `~calcops` | Shows all available operations in .calc command +`~lolban` | `~lolban` | Shows top banned champions ordered by ban rate. +`~memelist` | `~memelist` | Pulls a list of memes you can use with `~memegen` from http://memegen.link/templates/ +`~memegen` | `~memegen biw "gets iced coffee" "in the winter"` | Generates a meme from memelist with top and bottom text. +`~anime` `~ani` `~aq` | `~ani aquarion evol` | Queries anilist for an anime and shows the first result. +`~manga` `~mang` `~mq` | `~mq Shingeki no kyojin` | Queries anilist for a manga and shows the first result. +`~yomama` `~ym` | `~ym` | Shows a random joke from +`~randjoke` `~rj` | `~rj` | Shows a random joke from +`~chucknorris` `~cn` | `~cn` | Shows a random chucknorris joke from +`~wowjoke` | `~wowjoke` | Get one of Kwoth's penultimate WoW jokes. +`~magicitem` `~mi` | `~mi` | Shows a random magicitem from +`~osu` | `~osu Name` or `~osu Name taiko` | Shows osu stats for a player. +`~osub` | `~osub https://osu.ppy.sh/s/127712` | Shows information about an osu beatmap. +`~osu5` | `~osu5 Name` | Displays a user's top 5 plays. +`~pokemon` `~poke` | `~poke Sylveon` | Searches for a pokemon. +`~pokemonability` `~pokeab` | `~pokeab "water gun"` | Searches for a pokemon ability. +`~hitbox` `~hb` | `~hitbox SomeStreamer` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** +`~twitch` `~tw` | `~twitch SomeStreamer` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** +`~beam` `~bm` | `~beam SomeStreamer` | Notifies this channel when a certain user starts streaming. **Requires ManageMessages server permission.** +`~liststreams` `~ls` | `~ls` | Lists all streams you are following on this server. +`~removestream` `~rms` | `~rms SomeGuy` | Removes notifications of a certain streamer on this channel. +`~checkstream` `~cs` | `~cs twitch MyFavStreamer` | Checks if a user is online on a certain streaming platform. +`~convertlist` | `~convertlist` | List of the convertable dimensions and currencies. +`~convert` | `~convert m>km 1000` | Convert quantities from>to. + +### Help +Command and aliases | Description | Usage +----------------|--------------|------- +`-modules` `-mdls` | `-modules` or `.modules` | List all bot modules. +`-commands` `-cmds` | `-commands` or `.commands` | List all of the bot's commands from a certain module. +`-h` `-help` | `-h !m q` or just `-h` | Either shows a help for a single command, or PMs you help link if no arguments are specified. +`-hgit` | `-hgit` | Generates the commandlist.md file. **Bot owner only.** +`-readme` `-guide` | `-readme` or `-guide` | Sends a readme and a guide links to the channel. +`-donate` | `-donate` or `~donate` | Instructions for helping the project! + +### NSFW +Command and aliases | Description | Usage +----------------|--------------|------- +`~hentai` | `~hentai yuri+kissing` | Shows a random NSFW hentai image from gelbooru and danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) +`~danbooru` | `~danbooru yuri+kissing` | Shows a random hentai image from danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) +`~gelbooru` | `~gelbooru yuri+kissing` | Shows a random hentai image from gelbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) +`~rule34` | `~rule34 yuri+kissing` | Shows a random image from rule34.xx with a given tag. Tag is optional but preffered. (multiple tags are appended with +) +`~e621` | `~e621 yuri kissing` | Shows a random hentai image from e621.net with a given tag. Tag is optional but preffered. Use spaces for multiple tags. +`~cp` | `~cp` | We all know where this will lead you to. +`~boobs` | `~boobs` | Real adult content. +`~butts` `~ass` `~butt` | `~butts` or `~ass` | Real adult content. + +### Gambling +Command and aliases | Description | Usage +----------------|--------------|------- +`$raffle` | `$raffle` or `$raffle RoleName` | Prints a name and ID of a random user from the online list from the (optional) role. +`$cash` `$$$` | `$$$` or `$$$ @SomeGuy` | Check how much NadekoFlowers a person has. (Defaults to yourself) +`$cash` `$$$` | `$$$` or `$$$ @SomeGuy` | Check how much NadekoFlowers a person has. (Defaults to yourself) +`$give` | `$give 1 "@SomeGuy"` | Give someone a certain amount of NadekoFlowers +`$award` | `$award 100 @person` | Gives someone a certain amount of flowers. **Bot owner only.** +`$award` | `$award 100 @person` | Gives someone a certain amount of flowers. **Bot owner only.** +`$take` | `$take 1 "@someguy"` | Takes a certain amount of flowers from someone. **Bot owner only.** +`$take` | `$take 1 "@someguy"` | Takes a certain amount of flowers from someone. **Bot owner only.** +`$betroll` `$br` | `$br 5` | Bets a certain amount of NadekoFlowers and rolls a dice. Rolling over 66 yields x2 flowers, over 90 - x3 and 100 x10. +`$leaderboard` `$lb` | `$lb` | Displays bot currency leaderboard +`$race` | `$race` | Starts a new animal race. +`$joinrace` `$jr` | `$jr` or `$jr 5` | Joins a new race. You can specify an amount of flowers for betting (optional). You will get YourBet*(participants-1) back if you win. +`$roll` | `$roll` or `$roll 7` or `$roll 3d5` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. +`$roll` | `$roll` or `$roll 7` or `$roll 3d5` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. +`$roll` | `$roll` or `$roll 7` or `$roll 3d5` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. +`$rolluo` | `$rolluo` or `$rolluo 7` or `$rolluo 3d5` | Rolls X normal dice (up to 30) unordered. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. +`$rolluo` | `$rolluo` or `$rolluo 7` or `$rolluo 3d5` | Rolls X normal dice (up to 30) unordered. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. +`$nroll` | `$nroll 5` (rolls 0-5) or `$nroll 5-15` | Rolls in a given range. +`$draw` | `$draw` or `$draw 5` | Draws a card from the deck.If you supply number X, she draws up to 5 cards from the deck. +`$shuffle` `$sh` | `$sh` | Reshuffles all cards back into the deck. +`$flip` | `$flip` or `$flip 3` | Flips coin(s) - heads or tails, and shows an image. +`$betflip` `$bf` | `$bf 5 heads` or `$bf 3 t` | Bet to guess will the result be heads or tails. Guessing award you double flowers you've bet. + +### Games +Command and aliases | Description | Usage +----------------|--------------|------- +`>choose` | `>choose Get up;Sleep;Sleep more` | Chooses a thing from a list of things +`>8ball` | `>8ball should i do something` | Ask the 8ball a yes/no question. +`>rps` | `>rps scissors` | Play a game of rocket paperclip scissors with Nadeko. +`>linux` | `>linux Spyware Windows` | Prints a customizable Linux interjection +`>leet` | `>leet 3 Hello` | Converts a text to leetspeak with 6 (1-6) severity levels +`>poll` | `>poll Question?;Answer1;Answ 2;A_3` | Creates a poll, only person who has manage server permission can do it. +`>pollend` | `>pollend` | Stops active poll on this server and prints the results in this channel. +`>pick` | `>pick` | Picks a flower planted in this channel. +`>plant` | `>plant` | Spend a flower to plant it in this channel. (If bot is restarted or crashes, flower will be lost) +`>gencurrency` `>gc` | `>gc` | Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a NadekoFlower. Requires Manage Messages permission. **Requires ManageMessages server permission.** +`>typestart` | `>typestart` | Starts a typing contest. +`>typestop` | `>typestop` | Stops a typing contest on the current channel. +`>typeadd` | `>typeadd wordswords` | Adds a new article to the typing contest. **Bot owner only.** +`>trivia` `>t` | `>t nohint` or `>t 5 nohint` | Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question. +`>tl` | `>tl` | Shows a current trivia leaderboard. +`>tq` | `>tq` | Quits current trivia after current question. + +### ClashOfClans +Command and aliases | Description | Usage +----------------|--------------|------- +`,createwar` `,cw` | `,cw 15 The Enemy Clan` | Creates a new war by specifying a size (>10 and multiple of 5) and enemy clan name. +`,startwar` `,sw` | `,sw 15` | Starts a war with a given number. +`,listwar` `,lw` | `,lw [war_number] or ,lw` | Shows the active war claims by a number. Shows all wars in a short way if no number is specified. +`,claim` `,call` `,c` | `,call [war_number] [base_number] [optional_other_name]` | Claims a certain base from a certain war. You can supply a name in the third optional argument to claim in someone else's place. +`,claimfinish1` `,cf1` | `,cf [war_number] [optional_other_name]` | Finish your claim with 1 stars if you destroyed a base. Optional second argument finishes for someone else. +`,claimfinish2` `,cf2` | `,cf [war_number] [optional_other_name]` | Finish your claim with 2 stars if you destroyed a base. Optional second argument finishes for someone else. +`,claimfinish` `,cf` `,cf3` `,claimfinish3` | `,cf [war_number] [optional_other_name]` | Finish your claim with 3 stars if you destroyed a base. Optional second argument finishes for someone else. +`,endwar` `,ew` | `,ew [war_number]` | Ends the war with a given index. +`,unclaim` `,ucall` `,uc` | `,uc [war_number] [optional_other_name]` | Removes your claim from a certain war. Optional second argument denotes a person in whose place to unclaim + +### CustomReactions +Command and aliases | Description | Usage +----------------|--------------|------- +`.addcustreact` `.acr` | `.acr "hello" Hi there %user%` | Add a custom reaction with a trigger and a response. Running this command in server requires Administration permission. Running this command in DM is Bot Owner only and adds a new global custom reaction. Guide here: +`.listcustreact` `.lcr` | `.lcr 1` | Lists global or server custom reactions (15 commands per page). Running the command in DM will list global custom reactions, while running it in server will list that server's custom reactions. +`.delcustreact` `.dcr` | `.dcr 5` | Deletes a custom reaction on a specific index. If ran in DM, it is bot owner only and deletes a global custom reaction. If ran in a server, it requires Administration priviledges and removes server custom reaction. + +### Translator +Command and aliases | Description | Usage +----------------|--------------|------- +`~translate` `~trans` | `~trans en>fr Hello` | Translates from>to text. From the given language to the destiation language. +`~translangs` | `~translangs` | List the valid languages for translation. + +### Pokemon +Command and aliases | Description | Usage +----------------|--------------|------- +`>poke_cmd` | poke_usage | poke_desc + +### Music +Command and aliases | Description | Usage +----------------|--------------|------- +`!!next` `!!n` | `!!n` | Goes to the next song in the queue. You have to be in the same voice channel as the bot. +`!!stop` `!!s` | `!!s` | Stops the music and clears the playlist. Stays in the channel. +`!!destroy` `!!d` | `!!d` | Completely stops the music and unbinds the bot from the channel. (may cause weird behaviour) +`!!pause` `!!p` | `!!p` | Pauses or Unpauses the song. +`!!queue` `!!q` `!!yq` | `!!q Dream Of Venice` | Queue a song using keywords or a link. Bot will join your voice channel.**You must be in a voice channel**. +`!!soundcloudqueue` `!!sq` | `!!sq Dream Of Venice` | Queue a soundcloud song using keywords. Bot will join your voice channel.**You must be in a voice channel**. +`!!listqueue` `!!lq` | `!!lq` or `!!lq 2` | Lists 15 currently queued songs per page. Default page is 1. +`!!nowplaying` `!!np` | `!!np` | Shows the song currently playing. +`!!volume` `!!vol` | `!!vol 50` | Sets the music volume 0-100% +`!!defvol` `!!dv` | `!!dv 80` | Sets the default music volume when music playback is started (0-100). Persists through restarts. +`!!shuffle` `!!sh` | `!!sh` | Shuffles the current playlist. +`!!playlist` `!!pl` | `!!pl playlist link or name` | Queues up to 500 songs from a youtube playlist specified by a link, or keywords. +`!!soundcloudpl` `!!scpl` | `!!scpl soundcloudseturl` | Queue a soundcloud playlist using a link. +`!!localplaylst` `!!lopl` | `!!lopl C:/music/classical` | Queues all songs from a directory. **Bot owner only.** +`!!radio` `!!ra` | `!!ra radio link here` | Queues a radio stream from a link. It can be a direct mp3 radio stream, .m3u, .pls .asx or .xspf (Usage Video: ) +`!!local` `!!lo` | `!!lo C:/music/mysong.mp3` | Queues a local file by specifying a full path. **Bot owner only.** +`!!move` `!!mv` | `!!mv` | Moves the bot to your voice channel. (works only if music is already playing) +`!!remove` `!!rm` | `!!rm 5` | Remove a song by its # in the queue, or 'all' to remove whole queue. +`!!remove` `!!rm` | `!!rm 5` | Remove a song by its # in the queue, or 'all' to remove whole queue. +`!!movesong` `!!ms` | `!! ms 5>3` | Moves a song from one position to another. +`!!setmaxqueue` `!!smq` | `!!smq 50` or `!!smq` | Sets a maximum queue size. Supply 0 or no argument to have no limit. +`!!reptcursong` `!!rcs` | `!!rcs` | Toggles repeat of current song. +`!!rpeatplaylst` `!!rpl` | `!!rpl` | Toggles repeat of all songs in the queue (every song that finishes is added to the end of the queue). +`!!save` | `!!save classical1` | Saves a playlist under a certain name. Name must be no longer than 20 characters and mustn't contain dashes. +`!!load` | `!!load classical-1` | Loads a playlist under a certain name. +`!!playlists` `!!pls` | `!!pls 1` | Lists all playlists. Paginated. 20 per page. Default page is 0. +`!!deleteplaylist` `!!delpls` | `!!delpls animu-5` | Deletes a saved playlist. Only if you made it or if you are the bot owner. +`!!goto` | `!!goto 30` | Goes to a specific time in seconds in a song. +`!!getlink` `!!gl` | `!!gl` | Shows a link to the song in the queue by index, or the currently playing song by default. +`!!autoplay` `!!ap` | `!!ap` | Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty) diff --git a/docs/Contribution Guide.md b/docs/Contribution Guide.md new file mode 100644 index 00000000..41c7249a --- /dev/null +++ b/docs/Contribution Guide.md @@ -0,0 +1,7 @@ +### How to contribute + +1. Make Pull Requests to **DEV BRANCH** +2. Keep 1 Pull Request to a single feature +3. Explain what you did in the PR message + +Thanks for all the help ^_^ diff --git a/docs/Custom Reactions.md b/docs/Custom Reactions.md new file mode 100644 index 00000000..fc2dd0b5 --- /dev/null +++ b/docs/Custom Reactions.md @@ -0,0 +1,69 @@ +##Custom Reactions +

Every time you add or remove a custom reaction you will need to restart your bot with either .restart if you are hosting or Nadeko is on VPS, or .die if Nadeko is on Droplet

+

Important

+
    +
  • .acr.dcr, and .ecr Require you to be Bot Owner
  • +
  • Adding multiple commands of the same name will make Nadeko randomly select one of the command's responses
  • +
+###Commands and Their Use + + + + + + + + + + + + + + + + + + + + + + + + +
Command NameDescriptionExample
.acrAdds a Custom Reaction.acr Hello Hi!
.dcrDeletes an entire Custom Reaction or a Specified Response Index Number.dcr "command name" or .dcr "command name" 3
.lcrLists a specified page of Custom Commands.lcr Number i.e .lcr 2
.scrShows all responses to a command. Index Number will be in brackets [ ].scr Hello
.ecrEdit a custom reaction, needs: reaction's name, index to change, and new multiword response..ecr Hello 3 What's up
+

Now that we know the commands let's take a look at the arguments and placeholders available for .acr,

+

.addcustreact (.acr) takes two arguments: +

+
● First, The name of the command; this directly follows the .acr
+
- If your command name is more than 1 word use quotation marks;
i.e .acr Nice weather sure is > .acr "Nice weather" sure is
+
- Now everytime someone says "Nice weather" the bot will respond with, "sure is"
+
● Next, The Response, this follows the name of the command.
+
- i.e .acr "Nice weather"sure is

+###And finally on to the Placeholders +

There are currently four placeholders, which we will be looking at, with many more to come in the future.

+ + + + + + + + + + + + + + + + + + + + +
PlaceholderHow the placeholder worksExamples
%mention%The %mention% placeholder is triggered when you type @botname.acr "%mention% Hello" Hello! > User input: @botname Hello | Bot Replies: Hello!
%target%The %target% placeholder is used to make Nadeko Mention another person.acr "%mention% Hello" %target% Hi! > User inputs: "@botname Hello @somebody" + Bot replies: "Hi @somebody"
%user%The %user% placeholder mentions the person who said the command.acr "Who am i" You are %user%!
%rng%The %rng% generates a random number.acr Random %rng% +
+ + Thanks to Nekai for being creative. <3 + diff --git a/docs/Donate.md b/docs/Donate.md new file mode 100644 index 00000000..b33eed3a --- /dev/null +++ b/docs/Donate.md @@ -0,0 +1,17 @@ +##Donate to NadekoBot + +If you want to help Nadeko and Nadeko's team by donating, you can do that in the two of the following ways: + +###Patreon + +You can donate over [Patreon][Patreon] and support the project. + +[![img][img]](https://www.patreon.com/nadekobot) + + +###PayPal + +If you wish to donate over PayPal, you can send your donations to: `nadekodiscordbot@gmail.com` + +[Patreon]: https://www.patreon.com/nadekobot +[img]: http://www.mister-and-me.com/wp-content/plugins/patron-button-and-widgets-by-codebard/images/patreon-medium-button.png diff --git a/docs/Frequently Asked Questions.md b/docs/Frequently Asked Questions.md new file mode 100644 index 00000000..804444d4 --- /dev/null +++ b/docs/Frequently Asked Questions.md @@ -0,0 +1,70 @@ +#Frequently Asked Questions + + +###Question 1: How do I get Nadeko to join my server? +---- +**Answer:** Simply send Nadeko a Direct Message with -h and follow the link. **Only Server Owners can add the bot to the server** +###Question 2: I want to change permissions, but it isn't working! +---- +**Answer:** You must have the ;permsrole (by default this is the "Nadeko" role, for more details on permissions check [here](http://nadekobot.readthedocs.io/en/latest/Permissions%20System/ "Permissions")) + +**Please note:** *Only the Server Owner can change permissions without the "Nadeko" role*. +###Question 3: Music isn't working on Mac!! +---- +**Answer:** You will have to build `mono` from source. Simply follow the [mono-guide](http://www.mono-project.com/docs/compiling-mono/mac/ "Building mono"). +###Question 4: I want to disable NSFW on my server. +---- +**Answer:** To disable the NSFW Module for your server type, `;sm NSFW disable`. If this does not work refer to Question 2. +###Question 5: How do I get NadekoFlowers/Currency? +---- +**Answer:** You get NadekoFlowers by answering Trivia questions or picking them up after they have been generated with `>gc`, which you can then either plant (give away to a channel so that someone can pick it), gamble it with `$betflip`, `$betroll` and `$jr`, or spend on healing and setting your type in the Pokemon game. +###Question 6: I have an issue/bug/suggestion, where do I put it so it gets noticed? +----------- +**Answer:** First, check [issues](https://github.com/Kwoth/NadekoBot/issues "GitHub NadekoBot Issues"), then check the `#suggestions` in the Nadeko [help server](https://discord.gg/0ehQwTK2RBjAxzEY). + +If your problem or suggestion is not there, feel free to request it either in Issues or in `#suggestions`. +###Question 7: How do I use this command? +-------- +**Answer:** You can see the description and usage of certain commands by using `-h command` **i.e** `-h ;sm`. + +The whole list of commands can be found [here](http://nadekobot.readthedocs.io/en/latest/Commands%20List/ "Command List") +###Question 8: Music isn't working? +---- +**Answer:** Music is disabled on public Nadeko, it will be re-enabled later in the future. + +**If you would like music you must host Nadeko yourself**. Be sure you have FFMPEG installed correctly, read the [guide](http://nadekobot.readthedocs.io/en/latest/guides/Windows%20Guide/) for more info. +###Question 9: My music is still not working/very laggy? +---- +**Answer:** Try changing your discord [location][1], if this doesn't work be sure you have enabled the correct permissions for Nadeko. +[1]: https://support.discordapp.com/hc/en-us/articles/216661717-How-do-I-change-my-Voice-Server-Region- +###Question 10: I want to change data in the database (like NadekoFlowers or the pokemontypes of users, but how? +---- +**Answer:** Open data/nadekobot.sqlite using sqlitebrowser (or some alternative), Browse Data, select relevant table, change data, Write changes +###Question 11: The .greet and .bye commands doesn't work, but everything else is (From @Kong) +----- +**Answer:** Set a greeting message by using `.greetmsg YourMessageHere` and a bye-message by using `.byemsg YourMessageHere` +###Question 12: How do I import certs on linux? +------- +**Answer:** + +`certmgr -ssl https://discordapp.com` + +`certmgr -ssl https://gateway.discord.gg` +###Question 13: I want "BOT" tag with my bot a, is there a simple way? +---- +**Answer:** Yes, you can create an application using your account and use the APP BOT USER TOKEN from here: [DiscordApp][1] **NOTE: This will create a new bot account** +[1]:https://discordapp.com/developers/applications/me + +###Question 14: I made an application, but I can't add that new bot to my server, how do I invite it to my server? +---- +**Answer:** You need to use oauth link to add it to you server, just copy your CLIENT ID (that's in the same Developer page where you brought your token) and replace `12345678` in the link below: https://discordapp.com/oauth2/authorize?client_id=12345678&scope=bot&permissions=66186303 + +Follow this Detailed [Guide](http://discord.kongslien.net/guide.html) if you do not understand. +###Question 15:I'm building NadekoBot from source, but I get hundreds of (namespace) errors without changing anything!? +----- +**Answer:** Using Visual Studio, you can solve these errors by going to `Tools` -> `NuGet Package Manager` -> `Manage NuGet Packages for Solution`. Go to the Installed tab, select the Packages that were missing (usually `Newtonsoft.json` and `RestSharp`) and install them for all projects +###Question 16: My bot has all permissions but it's still saying, "Failed to add roles. Bot has insufficient permissions.". How do I fix this? +---------- +**Answer:** Discord has added a few new features and roles now follow hierarchy. This means you need to place your bot's role above every-other role your server has. + +**Please Note:** *The bot can only set/add all roles below its own highest role. It can not assign it's "highest role" to anyone else.* diff --git a/docs/JSON Explanations.md b/docs/JSON Explanations.md new file mode 100644 index 00000000..304e9e0e --- /dev/null +++ b/docs/JSON Explanations.md @@ -0,0 +1,60 @@ +###Setting up your Credentials +If you do not see `credentials.json` you will need to rename `credentials_example.json` to `credentials.json`. + +**This is how the unedited credentials look:** +```json +{ + "Token": "", + "ClientId": "116275390695079945", + "BotId": 1231231231231, + "OwnerIds": [ + 123123123123, + 5675675679845 + ], + "GoogleAPIKey": "", + "SoundCloudClientID": "", + "MashapeKey": "", + "LOLAPIKEY": "", + "TrelloAPPKey": "", + "OsuAPIKey": "", + "CarbonKey": "", +} +``` +####Required Parts ++ **Token** - Required to log in. Refer to this [guide](http://discord.kongslien.net/guide.html) ++ **OwnerIds** - Required for the **Owner-Only** commands. Seperate multiple Id's with a comma. ++ **BotId** - Required for custom reactions and conversation commands to work. + + **Important : Bot ID and Client ID are the same in newer bot accounts due to recent Discord API changes.** + +_BotId and the OwnerIds are **NOT** the names of the owner and the bot. If you do not know the id of your bot, keep the two random numbers in those fields and +run the bot then do `.uid @MyBotName` - this will give you your bot_id. +Do the same for yourself with `.uid @MyName` Put these numbers in their respective field of the credentials._ + +Setting up your API keys +==================== +####This part is completely optional, **However it is necessary for music to work properly** ++ **GoogleAPIKey** - Required for Youtube Song Search, Playlist queuing, and URL Shortener. `~i` and `~img`. + + You can get this api Key [here](https://console.developers.google.com/apis) ++ **SoundCloudClientID** - Required to queue soundloud songs from sc links. + + You will need to create a new app [here](http://soundcloud.com/you/apps). **Please note you must be logged into SoundCloud** + + You should come to a page that looks like this ![Imgur](http://i.imgur.com/RAZ2HDM.png) + + Simply click Register a new application and enter a name. + + After naming your app you will be brought to this page: ![Imgur](http://i.imgur.com/GH1gjKK.png) Copy the Client ID and click "save app" then paste the Client Id it into your `credentials.json` ++ **MashapeKey** - Required for Urban Disctionary, Hashtag search, and Hearthstone cards. + + You need to create an account on their [api marketplace](https://market.mashape.com/), after that go to `market.mashape.com/YOURNAMEHERE/applications/default-application` and press **Get the keys** in the top right corner. + + Copy the key and paste it into `credentials.json` ++ **LOLAPIKey** - Required for all League of Legends commands. + + You can get this key [here](http://api.champion.gg/) ++ **TrelloAppKey** - Required for the trello commands. + + You can get this key [here](https://trello.com/app-key) **Be sure you are logged into Trello first** ++ **OsuAPIKey** - Required for Osu commands + + You can get this key [here](https://osu.ppy.sh/p/api) **You will need to log in and like the soundcloud it may take a few tries** ++ **CarbonKey** -This key is for Carobnitex.net stats. + + Most likely unnecessary **Needed only if your bot is listed on Carbonitex.net** + +Config.json +=========== +In the folder where `NadekoBot.exe` is located you should also see a `Data` folder. In this folder you will find `config.json` among other files. +`config.json` contains user specific commands, such as: if DM's sent to the bot are forwarded to you, Blacklisted Ids, Servers, and channels...etc. + +**If you do not see** `config.json` **you need to rename** `config_example.json` **to** `config.json` diff --git a/docs/Readme.md b/docs/Readme.md new file mode 100644 index 00000000..7aefbd19 --- /dev/null +++ b/docs/Readme.md @@ -0,0 +1,29 @@ +##Readme for Commands List + +###Bot Owner Only + +- *Bot Owner Only* commands refer to the commands only the **owner** of the bot can use. +- *Bot Owner Only* commands do **not** refer to the owner of the **server**, just the owner of the **bot**. +- *Owner of the bot* is a person who is **hosting** his own bot, and his **ID** is inside of **credentials.json** file. +- You are **not** the bot **owner** if you invited the bot using **Carbonitex** or other invitation links. + +###Music on the public Nadeko + +- In case you got Nadeko in your server by the invitation from **Carbonitex**, our **GitHub** invite or **help (-h)**, music is disabled. +- Music is **disabled** due to large maintenance expenses, unless Kwoth is **testing** music module. +- If you want to have music module on your server, you will have to **host** the bot on your PC, or any of the external servers. +- How to **host** the bot, check the **guides** on the left side. + +###NadekoFlowers + +- NadekoFlowers is the **currency** of the public Nadeko. +- NadekoFlowers can be earned by playing **trivia**, or other games, like betting games. +- You can give NadekoFlowers to other users, using the command `$give X @person`. +- You can only give flowers you **own**. +- If you want to have **unlimited** number of flowers, you will have to **host** the bot. +- Command `$award X @person` can only be used by the *bot owner*. +- If you `>plant` the flower, flower will be avaliable for everyone to `>pick` it. In that case you will **lose** the flower. + +###Manage Permissions + +**These permissions refer to the permissions you can set in Discord settings for individual users or roles.** diff --git a/docs/about.md b/docs/about.md new file mode 100644 index 00000000..8435eda2 --- /dev/null +++ b/docs/about.md @@ -0,0 +1,13 @@ +## Terms of Use + +The MIT License (MIT) + +Copyright (c) 2016 NadekoBot Team + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + diff --git a/docs/commandlist.md b/docs/commandlist.md deleted file mode 100644 index 516eff12..00000000 --- a/docs/commandlist.md +++ /dev/null @@ -1,363 +0,0 @@ -######For more information and how to setup your own NadekoBot, go to: **http://github.com/Kwoth/NadekoBot/** -######You can donate on patreon: `https://patreon.com/nadekobot` -######or paypal: `nadekodiscordbot@gmail.com` - -#NadekoBot List Of Commands -Version: `NadekoBot v0.9.6054.4837` -### Help -Command and aliases | Description | Usage -----------------|--------------|------- -`-h`, `-help`, `@BotName help`, `@BotName h`, `~h` | Either shows a help for a single command, or PMs you help link if no arguments are specified. | `-h !m q` or just `-h` -`-hgit` | Generates the commandlist.md file. **Bot Owner Only!** | `-hgit` -`-readme`, `-guide` | Sends a readme and a guide links to the channel. | `-readme` or `-guide` -`-donate`, `~donate` | Instructions for helping the project! | `{Prefix}donate` or `~donate` -`-modules`, `.modules` | List all bot modules. | `{Prefix}modules` or `.modules` -`-commands`, `.commands` | List all of the bot's commands from a certain module. | `{Prefix}commands` or `.commands` - -### Administration -Command and aliases | Description | Usage -----------------|--------------|------- -`.grdel` | Toggles automatic deletion of greet and bye messages. | `.grdel` -`.greet` | Toggles anouncements on the current channel when someone joins the server. | `.greet` -`.greetmsg` | Sets a new join announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. | `.greetmsg Welcome to the server, %user%.` -`.bye` | Toggles anouncements on the current channel when someone leaves the server. | `.bye` -`.byemsg` | Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. | `.byemsg %user% has left the server.` -`.byepm` | Toggles whether the good bye messages will be sent in a PM or in the text channel. | `.byepm` -`.greetpm` | Toggles whether the greet messages will be sent in a PM or in the text channel. | `.greetpm` -`.spmom` | Toggles whether mentions of other offline users on your server will send a pm to them. | `.spmom` -`.logserver` | Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!** | `.logserver` -`.logignore` | Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. | `.logignore` -`.userpresence` | Starts logging to this channel when someone from the server goes online/offline/idle. | `.userpresence` -`.voicepresence` | Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. | `{Prefix}voicerpresence` -`.repeatinvoke`, `.repinv` | Immediately shows the repeat message and restarts the timer. | `{Prefix}repinv` -`.repeat` | Repeat a message every X minutes. If no parameters are specified, repeat is disabled. Requires manage messages. | `.repeat 5 Hello there` -`.rotateplaying`, `.ropl` | Toggles rotation of playing status of the dynamic strings you specified earlier. | `.ropl` -`.addplaying`, `.adpl` | Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%, %trivia% | `.adpl` -`.listplaying`, `.lipl` | Lists all playing statuses with their corresponding number. | `.lipl` -`.removeplaying`, `.repl`, `.rmpl` | Removes a playing string on a given number. | `.rmpl` -`.slowmode` | Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. | `.slowmode` -`.cleanv+t`, `.cv+t` | Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk.** | `.cleanv+t` -`.voice+text`, `.v+t` | Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. | `.voice+text` -`.scsc` | Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance. | `.scsc` -`.jcsc` | Joins current channel to an instance of cross server channel using the token. | `.jcsc` -`.lcsc` | Leaves Cross server channel instance from this channel. | `.lcsc` -`.asar` | Adds a role, or list of roles separated by whitespace(use quotations for multiword roles) to the list of self-assignable roles. | .asar Gamer -`.rsar` | Removes a specified role from the list of self-assignable roles. | `.rsar` -`.lsar` | Lists all self-assignable roles. | `.lsar` -`.togglexclsar`, `.tesar` | toggle whether the self-assigned roles should be exclusive | `.tesar` -`.iam` | Adds a role to you that you choose. Role must be on a list of self-assignable roles. | .iam Gamer -`.iamnot`, `.iamn` | Removes a role to you that you choose. Role must be on a list of self-assignable roles. | .iamn Gamer -`.addcustreact`, `.acr` | Add a custom reaction. Guide here: **Bot Owner Only!** | `.acr "hello" I love saying hello to %user%` -`.listcustreact`, `.lcr` | Lists custom reactions (paginated with 30 commands per page). Use 'all' instead of page number to get all custom reactions DM-ed to you. | `.lcr 1` -`.showcustreact`, `.scr` | Shows all possible responses from a single custom reaction. | `.scr %mention% bb` -`.editcustreact`, `.ecr` | Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message **Bot Owner Only** | `.ecr "%mention% disguise" 2 Test 123` -`.delcustreact`, `.dcr` | Deletes a custom reaction with given name (and index). | `.dcr index` -`.autoassignrole`, `.aar` | Automaticaly assigns a specified role to every user who joins the server. Type `.aar` to disable, `.aar Role Name` to enable -`.leave` | Makes Nadeko leave the server. Either name or id required. | `.leave 123123123331` -`.listincidents`, `.lin` | List all UNREAD incidents and flags them as read. | `.lin` -`.listallincidents`, `.lain` | Sends you a file containing all incidents and flags them as read. | `.lain` -`.delmsgoncmd` | Toggles the automatic deletion of user's successful command message to prevent chat flood. Server Manager Only. | `.delmsgoncmd` -`.restart` | Restarts the bot. Might not work. **Bot Owner Only** | `.restart` -`.setrole`, `.sr` | Sets a role for a given user. | `.sr @User Guest` -`.removerole`, `.rr` | Removes a role from a given user. | `.rr @User Admin` -`.renamerole`, `.renr` | Renames a role. Role you are renaming must be lower than bot's highest role. | `.renr "First role" SecondRole` -`.removeallroles`, `.rar` | Removes all roles from a mentioned user. | `.rar @User` -`.createrole`, `.cr` | Creates a role with a given name. | `.cr Awesome Role` -`.rolecolor`, `.rc` | Set a role's color to the hex or 0-255 rgb color value provided. | `.rc Admin 255 200 100` or `.rc Admin ffba55` -`.ban`, `.b` | Bans a user by id or name with an optional message. | `.b "@some Guy" Your behaviour is toxic.` -`.softban`, `.sb` | Bans and then unbans a user by id or name with an optional message. | `.sb "@some Guy" Your behaviour is toxic.` -`.kick`, `.k` | Kicks a mentioned user. | `.k "@some Guy" Your behaviour is toxic.` -`.mute` | Mutes mentioned user or users. | `.mute "@Someguy"` or `.mute "@Someguy" "@Someguy"` -`.unmute` | Unmutes mentioned user or users. | `.unmute "@Someguy"` or `.unmute "@Someguy" "@Someguy"` -`.deafen`, `.deaf` | Deafens mentioned user or users | `.deaf "@Someguy"` or `.deaf "@Someguy" "@Someguy"` -`.undeafen`, `.undef` | Undeafens mentioned user or users | `.undef "@Someguy"` or `.undef "@Someguy" "@Someguy"` -`.delvoichanl`, `.dvch` | Deletes a voice channel with a given name. | `.dvch VoiceChannelName` -`.creatvoichanl`, `.cvch` | Creates a new voice channel with a given name. | `.cvch VoiceChannelName` -`.deltxtchanl`, `.dtch` | Deletes a text channel with a given name. | `.dtch TextChannelName` -`.creatxtchanl`, `.ctch` | Creates a new text channel with a given name. | `.ctch TextChannelName` -`.settopic`, `.st` | Sets a topic on the current channel. | `.st My new topic` -`.setchanlname`, `.schn` | Changed the name of the current channel.| `.schn NewName` -`.heap` | Shows allocated memory - **Bot Owner Only!** | `.heap` -`.prune`, `.clr` | `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. | `.prune` or `.prune 5` or `.prune @Someone` or `.prune @Someone X` -`.die` | Shuts the bot down and notifies users about the restart. **Bot Owner Only!** | `.die` -`.setname`, `.newnm` | Give the bot a new name. **Bot Owner Only!** | .newnm BotName -`.newavatar`, `.setavatar` | Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner Only!** | `.setavatar https://i.ytimg.com/vi/WDudkR1eTMM/maxresdefault.jpg` -`.setgame` | Sets the bots game. **Bot Owner Only!** | `.setgame Playing with kwoth` -`.send` | Send a message to someone on a different server through the bot. **Bot Owner Only!** | `.send serverid|u:user_id Send this to a user!` or `.send serverid|c:channel_id Send this to a channel!` -`.mentionrole`, `.menro` | Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. | `.menro RoleName` -`.unstuck` | Clears the message queue. **Bot Owner Only!** | `.unstuck` -`.donators` | List of lovely people who donated to keep this project alive. -`.donadd` | Add a donator to the database. | `.donadd Donate Amount` -`.announce` | Sends a message to all servers' general channel bot is connected to.**Bot Owner Only!** | `.announce Useless spam` -`.savechat` | Saves a number of messages to a text file and sends it to you. **Bot Owner Only** | `.savechat 150` - -### Utility -Command and aliases | Description | Usage -----------------|--------------|------- -`.remind` | Sends a message to you or a channel after certain amount of time. First argument is me/here/'channelname'. Second argument is time in a descending order (mo>w>d>h>m) example: 1w5d3h10m. Third argument is a (multiword)message. | `.remind me 1d5h Do something` or `.remind #general Start now!` -`.remindmsg` | Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. **Bot Owner Only!** | `.remindmsg do something else` -`.serverinfo`, `.sinfo` | Shows info about the server the bot is on. If no channel is supplied, it defaults to current one. | `.sinfo Some Server` -`.channelinfo`, `.cinfo` | Shows info about the channel. If no channel is supplied, it defaults to current one. | `.cinfo #some-channel` -`.userinfo`, `.uinfo` | Shows info about the user. If no user is supplied, it defaults a user running the command. | `.uinfo @SomeUser` -`.whoplays` | Shows a list of users who are playing the specified game. | `.whoplays Overwatch` -`.inrole` | Lists every person from the provided role or roles (separated by a ',') on this server. If the list is too long for 1 message, you must have Manage Messages permission. | `.inrole Role` -`.checkmyperms` | Checks your userspecific permissions on this channel. | `.checkmyperms` -`.stats` | Shows some basic stats for Nadeko. | `.stats` -`.dysyd` | Shows some basic stats for Nadeko. | `.dysyd` -`.userid`, `.uid` | Shows user ID. | `.uid` or `.uid "@SomeGuy"` -`.channelid`, `.cid` | Shows current channel ID. | `.cid` -`.serverid`, `.sid` | Shows current server ID. | `.sid` -`.roles` | List all roles on this server or a single user if specified. -`.channeltopic`, `.ct` | Sends current channel's topic as a message. | `.ct` - -### Permissions -Command and aliases | Description | Usage -----------------|--------------|------- -`;chnlfilterinv`, `;cfi` | Enables or disables automatic deleting of invites on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. | ;cfi enable #general-chat -`;srvrfilterinv`, `;sfi` | Enables or disables automatic deleting of invites on the server. | ;sfi disable -`;chnlfilterwords`, `;cfw` | Enables or disables automatic deleting of messages containing banned words on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. | ;cfw enable #general-chat -`;addfilterword`, `;afw` | Adds a new word to the list of filtered words | ;afw poop -`;rmvfilterword`, `;rfw` | Removes the word from the list of filtered words | ;rw poop -`;lstfilterwords`, `;lfw` | Shows a list of filtered words | ;lfw -`;srvrfilterwords`, `;sfw` | Enables or disables automatic deleting of messages containing forbidden words on the server. | ;sfw disable -`;permrole`, `;pr` | Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'. | `;pr role` -`;rolepermscopy`, `;rpc` | Copies BOT PERMISSIONS (not discord permissions) from one role to another. | `;rpc Some Role ~ Some other role` -`;chnlpermscopy`, `;cpc` | Copies BOT PERMISSIONS (not discord permissions) from one channel to another. | `;cpc Some Channel ~ Some other channel` -`;usrpermscopy`, `;upc` | Copies BOT PERMISSIONS (not discord permissions) from one role to another. | `;upc @SomeUser ~ @SomeOtherUser` -`;verbose`, `;v` | Sets whether to show when a command/module is blocked. | `;verbose true` -`;srvrperms`, `;sp` | Shows banned permissions for this server. | `;sp` -`;roleperms`, `;rp` | Shows banned permissions for a certain role. No argument means for everyone. | `;rp AwesomeRole` -`;chnlperms`, `;cp` | Shows banned permissions for a certain channel. No argument means for this channel. | `;cp #dev` -`;userperms`, `;up` | Shows banned permissions for a certain user. No argument means for yourself. | `;up Kwoth` -`;srvrmdl`, `;sm` | Sets a module's permission at the server level. | `;sm "module name" enable` -`;srvrcmd`, `;sc` | Sets a command's permission at the server level. | `;sc "command name" disable` -`;rolemdl`, `;rm` | Sets a module's permission at the role level. | `;rm "module name" enable MyRole` -`;rolecmd`, `;rc` | Sets a command's permission at the role level. | `;rc "command name" disable MyRole` -`;chnlmdl`, `;cm` | Sets a module's permission at the channel level. | `;cm "module name" enable SomeChannel` -`;chnlcmd`, `;cc` | Sets a command's permission at the channel level. | `;cc "command name" enable SomeChannel` -`;usrmdl`, `;um` | Sets a module's permission at the user level. | `;um "module name" enable SomeUsername` -`;usrcmd`, `;uc` | Sets a command's permission at the user level. | `;uc "command name" enable SomeUsername` -`;allsrvrmdls`, `;asm` | Sets permissions for all modules at the server level. | `;asm [enable/disable]` -`;allsrvrcmds`, `;asc` | Sets permissions for all commands from a certain module at the server level. | `;asc "module name" [enable/disable]` -`;allchnlmdls`, `;acm` | Sets permissions for all modules at the channel level. | `;acm [enable/disable] SomeChannel` -`;allchnlcmds`, `;acc` | Sets permissions for all commands from a certain module at the channel level. | `;acc "module name" [enable/disable] SomeChannel` -`;allrolemdls`, `;arm` | Sets permissions for all modules at the role level. | `;arm [enable/disable] MyRole` -`;allrolecmds`, `;arc` | Sets permissions for all commands from a certain module at the role level. | `;arc "module name" [enable/disable] MyRole` -`;ubl` | Blacklists a mentioned user. | `;ubl [user_mention]` -`;uubl` | Unblacklists a mentioned user. | `;uubl [user_mention]` -`;cbl` | Blacklists a mentioned channel (#general for example). | `;cbl #some_channel` -`;cubl` | Unblacklists a mentioned channel (#general for example). | `;cubl #some_channel` -`;sbl` | Blacklists a server by a name or id (#general for example). **BOT OWNER ONLY** | `;sbl [servername/serverid]` -`;cmdcooldown`, `;cmdcd` | Sets a cooldown per user for a command. Set 0 to clear. | `;cmdcd "some cmd" 5` -`;allcmdcooldowns`, `;acmdcds` | Shows a list of all commands and their respective cooldowns. - -### Conversations -Command and aliases | Description | Usage -----------------|--------------|------- -`..` | Adds a new quote with the specified name (single word) and message (no limit). | `.. abc My message` -`...` | Shows a random quote with a specified name. | `... abc` -`..qdel`, `..quotedelete` | Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it. | `..qdel abc` -`@BotName rip` | Shows a grave image of someone with a start year | @NadekoBot rip @Someone 2000 -`@BotName die` | Works only for the owner. Shuts the bot down. | `@NadekoBot die` -`@BotName do you love me` | Replies with positive answer only to the bot owner. | `@NadekoBot do you love me` -`@BotName how are you`, `@BotName how are you?` | Replies positive only if bot owner is online. | `@NadekoBot how are you` -`@BotName fire` | Shows a unicode fire message. Optional parameter [x] tells her how many times to repeat the fire. | `@NadekoBot fire [x]` -`@BotName dump` | Dumps all of the invites it can to dump.txt.** Owner Only.** | `@NadekoBot dump` -`@BotName ab` | Try to get 'abalabahaha'| `@NadekoBot ab` - -### Gambling -Command and aliases | Description | Usage -----------------|--------------|------- -`$draw` | Draws a card from the deck.If you supply number [x], she draws up to 5 cards from the deck. | `$draw [x]` -`$shuffle`, `$sh` | Reshuffles all cards back into the deck.|`$shuffle` -`$flip` | Flips coin(s) - heads or tails, and shows an image. | `$flip` or `$flip 3` -`$betflip`, `$bf` | Bet to guess will the result be heads or tails. Guessing award you double flowers you've bet. | `$bf 5 heads` or `$bf 3 t` -`$roll` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. | `$roll` or `$roll 7` or `$roll 3d5` -`$rolluo` | Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice (unordered). If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. | `$roll` or `$roll` 7 or `$roll 3d5` -`$nroll` | Rolls in a given range. | `$nroll 5` (rolls 0-5) or `$nroll 5-15` -`$race` | Starts a new animal race. | `$race` -`$joinrace`, `$jr` | Joins a new race. You can specify an amount of flowers for betting (optional). You will get YourBet*(participants-1) back if you win. | `$jr` or `$jr 5` -`$raffle` | Prints a name and ID of a random user from the online list from the (optional) role. | `$raffle` or `$raffle RoleName` -`$$$` | Check how much NadekoFlowers a person has. (Defaults to yourself) | `$$$` or `$$$ @Someone` -`$give` | Give someone a certain amount of NadekoFlowers|`$give 1 "@SomeGuy"` -`$award` | Gives someone a certain amount of flowers. **Bot Owner Only!** | `$award 100 @person` -`$take` | Takes a certain amount of flowers from someone. **Bot Owner Only!** | `$take 1 "@someguy"` -`$betroll`, `$br` | Bets a certain amount of NadekoFlowers and rolls a dice. Rolling over 66 yields x2 flowers, over 90 - x3 and 100 x10. | `$br 5` -`$leaderboard`, `$lb` | Displays bot currency leaderboard | $lb - -### Games -Command and aliases | Description | Usage -----------------|--------------|------- -`>t` | Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question. | `>t nohint` or `>t 5 nohint` -`>tl` | Shows a current trivia leaderboard. | `>tl` -`>tq` | Quits current trivia after current question. | `>tq` -`>typestart` | Starts a typing contest. | `>typestart` -`>typestop` | Stops a typing contest on the current channel. | `>typestop` -`>typeadd` | Adds a new article to the typing contest. Owner only. | `>typeadd wordswords` -`>poll` | Creates a poll, only person who has manage server permission can do it. | `>poll Question?;Answer1;Answ 2;A_3` -`>pollend` | Stops active poll on this server and prints the results in this channel. | `>pollend` -`>pick` | Picks a flower planted in this channel. | `>pick` -`>plant` | Spend a flower to plant it in this channel. (If bot is restarted or crashes, flower will be lost) | `>plant` -`>gencurrency`, `>gc` | Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a NadekoFlower. Optional parameter cooldown time in minutes, 5 minutes by default. Requires Manage Messages permission. | `>gc` or `>gc 60` -`>leet` | Converts a text to leetspeak with 6 (1-6) severity levels | `>leet 3 Hello` -`>choose` | Chooses a thing from a list of things | `>choose Get up;Sleep;Sleep more` -`>8ball` | Ask the 8ball a yes/no question. | `>8ball should i do something` -`>rps` | Play a game of rocket paperclip scissors with Nadeko. | `>rps scissors` -`>linux` | Prints a customizable Linux interjection | `>linux Spyware Windows` - -### Music -Command and aliases | Description | Usage -----------------|--------------|------- -`!!next`, `!!n`, `!!skip` | Goes to the next song in the queue. You have to be in the same voice channel as the bot. | `!!n` -`!!stop`, `!!s` | Stops the music and clears the playlist. Stays in the channel. | `!!s` -`!!destroy`, `!!d` | Completely stops the music and unbinds the bot from the channel. (may cause weird behaviour) | `!!d` -`!!pause`, `!!p` | Pauses or Unpauses the song. | `!!p` -`!!queue`, `!!q`, `!!yq` | Queue a song using keywords or a link. Bot will join your voice channel.**You must be in a voice channel**. | `!!q Dream Of Venice` -`!!soundcloudqueue`, `!!sq` | Queue a soundcloud song using keywords. Bot will join your voice channel.**You must be in a voice channel**. | `!!sq Dream Of Venice` -`!!listqueue`, `!!lq` | Lists 15 currently queued songs per page. Default page is 1. | `!!lq` or `!!lq 2` -`!!nowplaying`, `!!np` | Shows the song currently playing. | `!!np` -`!!volume`, `!!vol` | Sets the music volume 0-100% | `!!vol 50` -`!!defvol`, `!!dv` | Sets the default music volume when music playback is started (0-100). Persists through restarts. | `!!dv 80` -`!!mute`, `!!min` | Sets the music volume to 0% | `!!min` -`!!max` | Sets the music volume to 100%. | `!!max` -`!!half` | Sets the music volume to 50%. | `!!half` -`!!shuffle`, `!!sh` | Shuffles the current playlist. | `!!sh` -`!!playlist`, `!!pl` | Queues up to 500 songs from a youtube playlist specified by a link, or keywords. | `!!pl playlist link or name` -`!!soundcloudpl`, `!!scpl` | Queue a soundcloud playlist using a link. | `!!scpl https://soundcloud.com/saratology/sets/symphony` -`!!localplaylst`, `!!lopl` | Queues all songs from a directory. **Bot Owner Only!** | `!!lopl C:/music/classical` -`!!radio`, `!!ra` | Queues a radio stream from a link. It can be a direct mp3 radio stream, .m3u, .pls .asx or .xspf (Usage Video: ) | `!!ra radio link here` -`!!local`, `!!lo` | Queues a local file by specifying a full path. **Bot Owner Only!** | `!!lo C:/music/mysong.mp3` -`!!move`, `!!mv` | Moves the bot to your voice channel. (works only if music is already playing) | `!!mv` -`!!remove`, `!!rm` | Remove a song by its # in the queue, or 'all' to remove whole queue. | `!!rm 5` -`!!movesong`, `!!ms` | Moves a song from one position to another. | `!! ms` 5>3 -`!!setmaxqueue`, `!!smq` | Sets a maximum queue size. Supply 0 or no argument to have no limit. | `!!smq` 50 or `!!smq` -`!!cleanup` | Cleans up hanging voice connections. **Bot Owner Only!** | `!!cleanup` -`!!reptcursong`, `!!rcs` | Toggles repeat of current song. | `!!rcs` -`!!rpeatplaylst`, `!!rpl` | Toggles repeat of all songs in the queue (every song that finishes is added to the end of the queue). | `!!rpl` -`!!save` | Saves a playlist under a certain name. Name must be no longer than 20 characters and mustn't contain dashes. | `!!save classical1` -`!!load` | Loads a playlist under a certain name. | `!!load classical-1` -`!!playlists`, `!!pls` | Lists all playlists. Paginated. 20 per page. Default page is 0. | `!!pls 1` -`!!deleteplaylist`, `!!delpls` | Deletes a saved playlist. Only if you made it or if you are the bot owner. | `!!delpls animu-5` -`!!goto` | Goes to a specific time in seconds in a song. | `!!goto 30` -`!!getlink`, `!!gl` | Shows a link to the currently playing song. -`!!autoplay`, `!!ap` | Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty) - -### Searches -Command and aliases | Description | Usage -----------------|--------------|------- -`~lolchamp` | Shows League Of Legends champion statistics. If there are spaces/apostrophes or in the name - omit them. Optional second parameter is a role. | `~lolchamp Riven` or `~lolchamp Annie sup` -`~lolban` | Shows top 6 banned champions ordered by ban rate. Ban these champions and you will be Plat 5 in no time. | `~lolban` -`~hitbox`, `~hb` | Notifies this channel when a certain user starts streaming. | `~hitbox SomeStreamer` -`~twitch`, `~tw` | Notifies this channel when a certain user starts streaming. | `~twitch SomeStreamer` -`~beam`, `~bm` | Notifies this channel when a certain user starts streaming. | `~beam SomeStreamer` -`~checkhitbox`, `~chhb` | Checks if a certain user is streaming on the hitbox platform. | `~chhb SomeStreamer` -`~checktwitch`, `~chtw` | Checks if a certain user is streaming on the twitch platform. | `~chtw SomeStreamer` -`~checkbeam`, `~chbm` | Checks if a certain user is streaming on the beam platform. | `~chbm SomeStreamer` -`~removestream`, `~rms` | Removes notifications of a certain streamer on this channel. | `~rms SomeGuy` -`~liststreams`, `~ls` | Lists all streams you are following on this server. | `~ls` -`~convert` | Convert quantities from>to. | `~convert m>km 1000` -`~convertlist` | List of the convertable dimensions and currencies. -`~wowjoke` | Get one of Kwoth's penultimate WoW jokes. | `~wowjoke` -`~calculate`, `~calc` | Evaluate a mathematical expression. | ~calc 1+1 -`~osu` | Shows osu stats for a player. | `~osu Name` or `~osu Name taiko` -`~osu b` | Shows information about an osu beatmap. | `~osu b` https://osu.ppy.sh/s/127712` -`~osu top5` | Displays a user's top 5 plays. | ~osu top5 Name -`~pokemon`, `~poke` | Searches for a pokemon. | `~poke Sylveon` -`~pokemonability`, `~pokeab` | Searches for a pokemon ability. | `~pokeab "water gun"` -`~memelist` | Pulls a list of memes you can use with `~memegen` from http://memegen.link/templates/ | `~memelist` -`~memegen` | Generates a meme from memelist with top and bottom text. | `~memegen biw "gets iced coffee" "in the winter"` -`~we` | Shows weather data for a specified city and a country. BOTH ARE REQUIRED. Use country abbrevations. | `~we Moscow RF` -`~yt` | Searches youtubes and shows the first result | `~yt query` -`~ani`, `~anime`, `~aq` | Queries anilist for an anime and shows the first result. | `~aq aquerion evol` -`~imdb` | Queries imdb for movies or series, show first result. | `~imdb query` -`~mang`, `~manga`, `~mq` | Queries anilist for a manga and shows the first result. | `~mq query` -`~randomcat`, `~meow` | Shows a random cat image. -`~randomdog`, `~woof` | Shows a random dog image. -`~i` | Pulls the first image found using a search parameter. Use ~ir for different results. | `~i cute kitten` -`~ir` | Pulls a random image using a search parameter. | `~ir cute kitten` -`~lmgtfy` | Google something for an idiot. | `~lmgtfy query` -`~google`, `~g` | Get a google search link for some terms. | `~google query` -`~hs` | Searches for a Hearthstone card and shows its image. Takes a while to complete. | `~hs Ysera` -`~ud` | Searches Urban Dictionary for a word. | `~ud Pineapple` -`~#` | Searches Tagdef.com for a hashtag. | `~# ff` -`~quote` | Shows a random quote. | `~quote` -`~catfact` | Shows a random catfact from | `~catfact` -`~yomama`, `~ym` | Shows a random joke from | `~ym` -`~randjoke`, `~rj` | Shows a random joke from | `~rj` -`~chucknorris`, `~cn` | Shows a random chucknorris joke from | `~cn` -`~magicitem`, `~mi` | Shows a random magicitem from | `~mi` -`~revav` | Returns a google reverse image search for someone's avatar. | `~revav "@SomeGuy"` -`~revimg` | Returns a google reverse image search for an image from a link. | `~revav Image link` -`~safebooru` | Shows a random image from safebooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `~safebooru yuri+kissing` -`~wiki` | Gives you back a wikipedia link | `~wiki query` -`~clr` | Shows you what color corresponds to that hex. | `~clr 00ff00` -`~videocall` | Creates a private video call link for you and other mentioned people. The link is sent to mentioned people via a private message. | `~videocall "@SomeGuy"` -`~av`, `~avatar` | Shows a mentioned person's avatar. | `~av @X` - -### NSFW -Command and aliases | Description | Usage -----------------|--------------|------- -`~hentai` | Shows a random NSFW hentai image from gelbooru and danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `~hentai yuri+kissing` -`~danbooru` | Shows a random hentai image from danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `~danbooru yuri+kissing` -`~gelbooru` | Shows a random hentai image from gelbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `~gelbooru yuri+kissing` -`~rule34` | Shows a random image from rule34.xx with a given tag. Tag is optional but preffered. (multiple tags are appended with +) | `~rule34 yuri+kissing` -`~e621` | Shows a random hentai image from e621.net with a given tag. Tag is optional but preffered. Use spaces for multiple tags. | `~e621 yuri kissing` -`~cp` | We all know where this will lead you to. | `~cp` -`~boobs` | Real adult content. | `~boobs` -`~butts`, `~ass`, `~butt` | Real adult content. | `~butts` or `~ass` - -### ClashOfClans -Command and aliases | Description | Usage -----------------|--------------|------- -`,createwar`, `,cw` | Creates a new war by specifying a size (>10 and multiple of 5) and enemy clan name. | ,cw 15 The Enemy Clan -`,startwar`, `,sw` | Starts a war with a given number. -`,listwar`, `,lw` | Shows the active war claims by a number. Shows all wars in a short way if no number is specified. | ,lw [war_number] or ,lw -`,claim`, `,call`, `,c` | Claims a certain base from a certain war. You can supply a name in the third optional argument to claim in someone else's place. | ,call [war_number] [base_number] [optional_other_name] -`,claimfinish`, `,cf`, `,cf3`, `,claimfinish3` | Finish your claim with 3 stars if you destroyed a base. Optional second argument finishes for someone else. | ,cf [war_number] [optional_other_name] -`,claimfinish2`, `,cf2` | Finish your claim with 2 stars if you destroyed a base. Optional second argument finishes for someone else. | ,cf [war_number] [optional_other_name] -`,claimfinish1`, `,cf1` | Finish your claim with 1 stars if you destroyed a base. Optional second argument finishes for someone else. | ,cf [war_number] [optional_other_name] -`,unclaim`, `,uncall`, `,uc` | Removes your claim from a certain war. Optional second argument denotes a person in whose place to unclaim | ,uc [war_number] [optional_other_name] -`,endwar`, `,ew` | Ends the war with a given index. | ,ew [war_number] - -### Pokegame -Command and aliases | Description | Usage -----------------|--------------|------- -`>attack` | Attacks a target with the given move. Use `>movelist` to see a list of moves your type can use. | `>attack "vine whip" @someguy` -`>movelist`, `>ml` | Lists the moves you are able to use | `>ml` -`>heal` | Heals someone. Revives those who fainted. Costs a NadekoFlower | `>heal @someone` -`>type` | Get the poketype of the target. | `>type @someone` -`>settype` | Set your poketype. Costs a NadekoFlower. | `>settype fire` - -### Translator -Command and aliases | Description | Usage -----------------|--------------|------- -`~translate`, `~trans` | Translates from>to text. From the given language to the destiation language. | `~trans en>fr Hello` -`~translangs` | List the valid languages for translation. | `{Prefix}translangs` or `{Prefix}translangs language` - -### Customreactions -Command and aliases | Description | Usage -----------------|--------------|------- -`\o\` | Custom reaction. | \o\ -`/o/` | Custom reaction. | /o/ -`moveto` | Custom reaction. | moveto -`comeatmebro` | Custom reaction. | comeatmebro -`e` | Custom reaction. | e -`@BotName insult`, `<@!116275390695079945> insult` | Custom reaction. | %mention% insult -`@BotName praise`, `<@!116275390695079945> praise` | Custom reaction. | %mention% praise -`@BotName pat`, `<@!116275390695079945> pat` | Custom reaction. | %mention% pat -`@BotName cry`, `<@!116275390695079945> cry` | Custom reaction. | %mention% cry -`@BotName are you real?`, `<@!116275390695079945> are you real?` | Custom reaction. | %mention% are you real? -`@BotName are you there?`, `<@!116275390695079945> are you there?` | Custom reaction. | %mention% are you there? -`@BotName draw`, `<@!116275390695079945> draw` | Custom reaction. | %mention% draw -`@BotName bb`, `<@!116275390695079945> bb` | Custom reaction. | %mention% bb -`@BotName call`, `<@!116275390695079945> call` | Custom reaction. | %mention% call -`@BotName disguise`, `<@!116275390695079945> disguise` | Custom reaction. | %mention% disguise -`~hentai` | Custom reaction. | ~hentai - -### Trello -Command and aliases | Description | Usage -----------------|--------------|------- -`trello bind` | Bind a trello bot to a single channel. You will receive notifications from your board when something is added or edited. | `trello bind [board_id]` -`trello unbind` | Unbinds a bot from the channel and board. -`trello lists`, `trello list` | Lists all lists yo ;) -`trello cards` | Lists all cards from the supplied list. You can supply either a name or an index. | `trello cards index` diff --git a/docs/guides/Building from Source.md b/docs/guides/Building from Source.md new file mode 100644 index 00000000..557dc3c3 --- /dev/null +++ b/docs/guides/Building from Source.md @@ -0,0 +1,8 @@ +###Building from Source +For easy setup and no programming knowledge, you can use [Updater](https://github.com/Kwoth/NadekoUpdater/releases/latest) or download release from [Releases](https://github.com/Kwoth/NadekoBot/releases) and follow the [Windows Guide](Windows Guide.md) + +In your bin/debug folder (or next to your exe if you are using release version), you must have a file called 'credentials.json' in which you will store all the necessary data to make the bot know who the owner is, and your api keys. + +When you clone the project, make sure to run `git submodule init` and `git submodule update` to get the correct discord.net version + +Make sure you've read ComprehensiveGuide to get a grasp of basic config/credentials setup and then look at "Credentials and config" chapter. diff --git a/docs/DockerGuide.md b/docs/guides/Docker Guide.md similarity index 97% rename from docs/DockerGuide.md rename to docs/guides/Docker Guide.md index 5a87bc22..1c0bb3c4 100644 --- a/docs/DockerGuide.md +++ b/docs/guides/Docker Guide.md @@ -1,6 +1,6 @@ -## Docker guide with digitalocean +# Docker Guide with DigitalOcean -#####Prerequisites: +#####Prerequisites - Digital ocean account (you can use my [reflink][reflink] to support the project and get 10$ after you register) - [PuTTY][PuTTY] - A bot account - follow this [guide][guide] diff --git a/docs/LinuxSetup.md b/docs/guides/Linux Guide.md similarity index 80% rename from docs/LinuxSetup.md rename to docs/guides/Linux Guide.md index 0272affc..c60eb5c3 100644 --- a/docs/LinuxSetup.md +++ b/docs/guides/Linux Guide.md @@ -1,9 +1,9 @@ -#Setting up NadekoBot on Linux +##Setting up NadekoBot on Linux ####Setting up NadekoBot on Linux Digital Ocean Droplet -######If you want Nadeko to play music for you 24/7 without having to hosting it on your PC and want to keep it cheap, reliable and convenient as possible, you can try Nadeko on Linux Digital Ocean Droplet using the link [DigitalOcean][DigitalOcean] (and using this link will be supporting Nadeko and will give you **$10 credit**) +If you want Nadeko to play music for you 24/7 without having to hosting it on your PC and want to keep it cheap, reliable and convenient as possible, you can try Nadeko on Linux Digital Ocean Droplet using the link [DigitalOcean][DigitalOcean] (and using this link will be supporting Nadeko and will give you **$10 credit**) -######Keep this helpful video handy [Linux Setup Video][Linux Setup Video] (thanks to klincheR) it contains how to set up the Digital Ocean droplet aswell. +Keep this helpful video handy [Linux Setup Video][Linux Setup Video] (thanks to klincheR) it contains how to set up the Digital Ocean droplet aswell. ####Setting up NadekoBot Assuming you have followed the link above to created an account in Digital Ocean and video to set up the bot until you get the `IP address and root password (in email)` to login, its time to begin. @@ -24,47 +24,52 @@ If you entered your Droplets IP address correctly, it should show **login as:** **Copy and just paste** using **mouse right-click** (it should paste automatically) -######MONO (Source: [Mono Source][Mono Source]) +####Installing Mono +MONO (Source: [Mono Source][Mono Source]) -**1) Installing Mono** +**1)** `sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF` - `echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list` - `sudo apt-get update` Note if the command is not being initiated, hit **Enter** **2)** -`echo "deb http://download.mono-project.com/repo/debian wheezy-apache24-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list` +`echo "deb http://download.mono-project.com/repo/debian wheezy-apache24-compat main" | sudo +tee -a /etc/apt/sources.list.d/mono-xamarin.list` +####Mono on Debian 8 and later **2.5)** -*ONLY DEBIAN 8 and later* -`echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list` +`echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | sudo +tee -a /etc/apt/sources.list.d/mono-xamarin.list` +####Mono on CentOS 7, Fedora 19 (and later) and later **2.6)** -*ONLY CentOS 7, Fedora 19 (and later)* `yum install yum-util` - `rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"` - `yum-config-manager --add-repo http://download.mono-project.com/repo/centos/` +####Mono Devel **3)** -*Mono Devel* `apt-get install mono-devel` **Type** `y` **hit Enter** +####Mono Fix +**In case you are having issues with Mono where you get a random string and the bot won't run, do this:** +`sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF` +`echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list` +`apt-get install ca-certificates-mono` +`mozroots --import --sync` + +####Installing Opus Voice Codec **4)** -Opus Voice Codec - `sudo apt-get install libopus0 opus-tools` **Type** `y` **hit Enter** @@ -72,17 +77,6 @@ Opus Voice Codec **5)** `sudo apt-get install libopus-dev` -**In case you are having issues with Mono where you get a random string and the bot won't run, do this:** - -`sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF` - -`echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list` - -`apt-get install ca-certificates-mono` - -`mozroots --import --sync` - - ####FFMPEG **6)** @@ -95,9 +89,7 @@ NOTE: if its "not installing" then, follow the guide here: [FFMPEG Help Guide][F **All you need to do, if you are running UBUNTU 14.04 is initiate these:** `sudo add-apt-repository ppa:mc3man/trusty-media` - `sudo apt-get update` - `sudo apt-get dist-upgrade` *Before executing* `sudo apt-get install ffmpeg` @@ -109,11 +101,8 @@ NOTE: if its "not installing" then, follow the guide here: [FFMPEG Help Guide][F In case you are not able to install it with installer ^up there, follow these steps: `sudo apt-get update` - `echo "deb http://ftp.debian.org/debian jessie-backports main" | tee /etc/apt/sources.list.d/debian-backports.list` - `sudo apt-get update` - `sudo apt-get install ffmpeg -y` ####Uncomplicated Firewall UFW @@ -134,30 +123,25 @@ In case you are not able to install it with installer ^up there, follow these st **10)** `sudo ufw allow ssh` - - +####Installing Unzip **11)** -Unzip - `apt-get install unzip` +####Installing TMUX **12)** -TMUX - `apt-get install tmux` **Type** `y` **hit Enter** -####NOW WE NEED TO IMPORT SOME DISCORD CERTS +####Importing Discord certs **13)** `certmgr -ssl https://discordapp.com` - **14)** `certmgr -ssl https://gateway.discord.gg` Type `yes` and hit Enter **(three times - as it will ask for three times)** - +####Creating Nadeko folder **15)** Create a new folder “nadeko” or anything you prefer @@ -168,7 +152,7 @@ Move to “nadeko” folder (note `cd --` to go back the directory) `cd nadeko` -**NOW WE NEED TO GET NADEKO FROM RELEASES** +####Getting NadekoBot from Releases Go to this link: [Releases][Releases] and **copy the zip file address** of the lalest version available, it should look like `https://github.com/Kwoth/NadekoBot/releases/download/vx.xx/NadekoBot.vx.x.zip` @@ -181,14 +165,13 @@ Get the correct link, type `wget`, then *paste the link*, then hit **Enter**. **^Do not copy-paste it** **18)** - Now we need to `unzip` the downloaded zip file and to do that, type the file name as it showed in your screen or just copy from the screen, should be like ` NadekoBot.vx.x.zip` `unzip NadekoBot.vx.x.zip` **^Do not copy-paste it** -#####NOW TO SETUP NADEKO +####Setting up NadekoBot - Open **CyberDuck** - Click on **Open Connection** (top-left corner), a new window should appear. @@ -201,15 +184,16 @@ Now we need to `unzip` the downloaded zip file and to do that, type the file nam - It should show you the new folder you created. - Open it. -#####MAKE SURE YOU READ THE README BEFORE PROCEEDING +####Renaming Credentials.json - Copy the `credentials_example.json` to desktop -- EDIT it as it is guided here: [Readme][Readme] +- EDIT it as it is guided here: [Setting up Credentials.json](Windows Guide.md#setting-up-credentialsjson-file) +- Read here how to [Create DiscordBot application](https://github.com/miraai/NadekoBot/blob/dev/docs/guides/Windows%20Guide.md#creating-discordbot-application) - Rename it to `credentials.json` and paste/put it back in the folder. `(Yes, using CyberDuck)` - You should see two files `credentials_example.json` and `credentials.json` - Also if you already have nadeko setup and have `credentials.json`, `config.json`, `nadekobot.sqlite`, and `"permissions" folder`, you can just copy and paste it to the Droplets folder using CyberDuck. -######TIME TO RUN +####Running NadekoBot Go back to **PuTTY**, `(hope its still running xD)` @@ -218,7 +202,8 @@ Type/ Copy and hit **Enter**. `tmux new -s nadeko` -**^this will create a new session named “nadeko”** `(you can replace “nadeko” with anything you prefer and remember its your session name) so you can run the bot in background without having to keep running PuTTY in the background.` +**^this will create a new session named “nadeko”** `(you can replace “nadeko” with anything you prefer and remember +its your session name) so you can run the bot in background without having to keep running PuTTY in the background.` `cd nadeko` @@ -227,33 +212,33 @@ Type/ Copy and hit **Enter**. **CHECK THE BOT IN DISCORD, IF EVERYTHING IS WORKING** -Now time to **move bot to background** and to do that, press **CTRL+B+D** (this will ditach the nadeko session using TMUX), and you can finally close PuTTY now. +####Setting up Nadeko Music + +For how to set up Nadeko for music and Google API Keys, follow [Setting up NadekoBot for Music](Windows Guide.md#setting-up-nadekobot-for-music) + +Now time to **move bot to background** and to do that, press **CTRL+B+D** (this will detach the nadeko session using TMUX), and you can finally close PuTTY now. Copy your CLIENT ID (that's in the same Developer page where you brought your token) and replace `12345678` in this link: `https://discordapp.com/oauth2/authorize?client_id=12345678&scope=bot&permissions=66186303` with it. Go to that link and you will be able to add your bot to your server. **NOW YOU HAVE YOUR OWN NADEKO BOT** `Thanks to Kwoth <3` -######SOME MORE INFO (JUST TO KNOW): +####Some more Info (just in case) -If you want to **see the sessions** after logging back again, type `tmux ls`, and that will give you the list of sessions running. -If you want to **switch to/ see that session**, type `tmux a -t nadeko` (**nadeko** is the name of the session we created before so, replace **“nadeko”** with the session name you created.) - -**21)** -If you want to **kill** NadekoBot **session**, type `tmux kill-session -t nadeko` -######TO RESTART YOUR BOT ALONG WITH THE WHOLE SERVER (for science): -**22)** +####Restarting Nadeko with the Server Open **PuTTY** and login as you have before, type `reboot` and hit Enter. -######IF YOU WANT TO UPDATE YOUR BOT +####Updating Nadeko **FOLLOW THESE STEPS SERIALLY** -- **-21 OR 22** -- **-19** - **-16** - **-17** - **-18** +- **-19** - **-20** HIT **CTRL+B+D** and close **PuTTY** diff --git a/docs/guides/OSX Guide.md b/docs/guides/OSX Guide.md new file mode 100644 index 00000000..4fed4867 --- /dev/null +++ b/docs/guides/OSX Guide.md @@ -0,0 +1,167 @@ +### Setting Up NadekoBot on OSX +#### Prerequisites +- 1) [Homebrew][Homebrew] +- 2) Mono +- 3) Google Account +- 4) Soundcloud Account (if you want soundcloud support) +- 5) Text Editor (TextWrangler, or equivalent) or outside editor such as [Atom][Atom] + +####Installing Homebrew + +`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` + +Run `brew update` to fetch the latest package data. +####Installing dependencies +``` +brew install git +brew install ffmpeg +brew update && brew upgrade ffmpeg +brew install opus +brew install opus-tools +brew install opusfile +brew install libffi +brew install libsodium +brew install tmux +``` + +####Check your `FFMPEG` + +**In case your `FFMPEG` wasnt installed properly** + +- `brew options ffmpeg` +- `brew install ffmpeg --with-x --with-y --with-z` etc. +- `brew update && brew upgrade` (Update formulae and Homebrew itself && Install newer versions of outdated packages) +- `brew prune` (Remove dead symlinks from Homebrew’s prefix) +- `brew doctor` (Check your Homebrew installation for common issues) +- Then try `brew install ffmpeg` again. + +####Installing xcode-select +Xcode command line tools. You will do this in Terminal.app by running the following command line: + +`xcode-select --install` + +A dialog box will open asking if you want to install `xcode-select`. Select install and finish the installation. + +####Installing Mono +- Building Mono dependencies: + +`brew install autoconf automake libtool pkg-config` + +- Building Mono from Source: + +To build Mono from a Git Source Code checkout, you will want to have the official Mono installed on the system, as the build requires a working C# compiler to run. Once you do this, run the following commands, remember to replace PREFIX with your installation prefix that you selected: + +``` +PATH=$PREFIX/bin:$PATH +git clone https://github.com/mono/mono.git +cd mono +CC='cc -m32' ./autogen.sh --prefix=$PREFIX --disable-nls --build=i386-apple-darwin11.2.0 +make +make install +``` +To build Mono in 64 bit mode instead use this to configure the build: + +`./autogen.sh --prefix=$PREFIX --disable-nls` + +####Nadeko Setup +- Create a new folder and name it `Nadeko`. +- Move to our `Nadeko` folder + +`cd Nadeko` +- Go to [Releases][Releases] and copy the zip file address of the lalest version available, it should look like `https://github.com/Kwoth/NadekoBot/releases/download/vx.xx/NadekoBot.vx.x.zip` +- Get the correct link, type `curl -O` and past the link, then hit `Enter` +- It should be something like this: + +`curl -O https://github.com/Kwoth/NadekoBot/releases/download/vx.xx/NadekoBot.vx.x.zip` + +^ do not copy-paste it + +- Unzip the downloaded file in our `Nadeko` folder + +####Creating DiscordBot application +- Go to [DiscordApp][DiscordApp]. +- Log in with your Discord account. +- On the left side, press `New Application`. +- Fill out the `App Name` (your bot's name, in this case), put the image you want, and add an app description(optional). +- Create the application. +- Once the application is created, click on `Create a Bot User` and confirm it. +- Keep this window open for now. + +####Setting up Credentials.json file +- In our `NadekoBot` folder you should have `.json` file named `credentials_example.json`. (Note: If you do not see a **.json** after `credentials_example.json `, do not add the `**.json**`. You most likely have `"Hide file extensions"` enabled.) +- Rename `credentials_example.json` to `credentials.json`. +- Open the file with your Text editor. +- In there you will see fields like `Token`, `ClientId`, `BotId`, `OwnerIDs`. +- In your [DiscordApp][DiscordApp], under `Bot User` part, you will see the `Token:click to reveal` part, click to reveal it. +- Copy your bot's token, and put it between `" "` in your `credentials.json` file. +- Copy `Client ID` and replace it with the example one in your `credentials.json` in `Client ID` **and** `BotID` field. +- Save your `credentials.json` but keep it open. We need to put your `User ID` and owner. + +####Running NadekoBot +- Copy/past and hit `Enter` + +`tmux new -s nadeko` + +^this will create a new session named “nadeko” `(you can replace “nadeko” with anything you prefer and remember its your +session name)`. + +or if you want to use Screen, run: + +`screen -S nadeko` + +^this will create a new screen named “nadeko” `(you can replace “nadeko” with anything you prefer and remember its your +screen name)`. + +`cd nadeko` + +- Start NadekoBot.exe using Mono: + +`mono NadekoBot.exe` + +CHECK THE BOT IN DISCORD, IF EVERYTHING IS WORKING + +Now time to move bot to background and to do that, press CTRL+B+D (this will ditach the nadeko session using TMUX) + +*if you used Screen press CTRL+A+D (this will detach the nadeko screen)* + +####Inviting your bot to your server - [Invite Guide][Invite Guide] +- Create a new server in Discord. +- Copy your `Client ID` from your [DiscordApp][DiscordApp]. +- Replace `12345678` in this link `https://discordapp.com/oauth2/authorize?client_id=12345678&scope=bot&permissions=66186303` with your `Client ID`. +- Link should look like this: `https://discordapp.com/oauth2/authorize?client_id=**YOUR_CLENT_ID**&scope=bot&permissions=66186303`. +- Go to newly created link and pick the server we created, and click `Authorize`. +- Bot should be added to your server. + +####Setting up OwnerIds +- In the server where your bot is, in a text channel, type `.uid` +- Your `User ID` should show, copy it. +- Close `NadekoBot.exe` +- Replace your `User ID` in the `credentials.json` between `[ ]` and save the changes. +- Run `NadekoBot.exe` again. +- Now you are the bot owner. +- You can add `User IDs` from the other users by separating IDs with a comma if you want to have more owners. + +####Setting NadekoBot Music + +For Music Setup and API keys check [Setting up NadekoBot for Music](Windows Guide.md#setting-up-nadekobot-for-music) and [JSON Explanations](JSON Explanations.md). + +####Some more Info - TMUX + +-If you want to see the sessions after logging back again, type `tmux ls`, and that will give you the list of sessions running. +-If you want to switch to/ see that session, type `tmux a -t nadeko` (nadeko is the name of the session we created before so, replace `“nadeko”` with the session name you created.) +-If you want to kill NadekoBot session, type `tmux kill-session -t nadeko` + +####Some more Info - Screen + +-If you want to see the sessions after logging back again, type `screen -ls`, and that will give you the list of screens. +-If you want to switch to/ see that screen, type `screen -r nadeko` (nadeko is the name of the screen we created before so, replace `“nadeko”` with the screen name you created.) +-If you want to kill the NadekoBot screen, type `screen -X -S nadeko quit` + +[Homebrew]: http://brew.sh/ +[Mono]: http://www.mono-project.com/docs/compiling-mono/mac/ +[Releases]: https://github.com/Kwoth/NadekoBot/releases +[DiscordApp]: https://discordapp.com/developers/applications/me +[Atom]: https://atom.io/ +[Invite Guide]: http://discord.kongslien.net/guide.html +[Google Console]: https://console.developers.google.com +[Soundcloud]: https://soundcloud.com/you/apps/new diff --git a/docs/ComprehensiveGuide.md b/docs/guides/Windows Guide.md similarity index 86% rename from docs/ComprehensiveGuide.md rename to docs/guides/Windows Guide.md index 1666d345..5d1a680d 100644 --- a/docs/ComprehensiveGuide.md +++ b/docs/guides/Windows Guide.md @@ -11,10 +11,10 @@ ________________________________________________________________________________ - 5) [7zip][7zip] (or whatever you are using, WinRar) - 6) [Notepad++][Notepad++] -####Guide: +####Guide - Create a folder, name it `Nadeko`. -- Head to [Releases][Releases]* and download `WINDOWS.-.nadeupdater.7z`. +- Head to [Updater Releases Page][Updater] and download `WINDOWS.-.nadeupdater.7z`. - Copy `WINDOWS.-.nadeupdater.7z` to the `Nadeko` (folder we created before) and extract everything. - You will see a file `NadekoUpdater.bat ` and a folder `publish ` after extraction. - Run/Launch/Open the file `NadekoUpdater.bat ` and you will see it running in cmd.exe asking you with **3 options** *1-3*. @@ -40,11 +40,11 @@ ________________________________________________________________________________ - In there you will see fields like `Token`, `ClientId`, `BotId`, `OwnerIDs`. - In your [DiscordApp][DiscordApp], under `Bot User` part, you will see the `Token:click to reveal` part, click to reveal it. - Copy your bot's token, and put it between `" "` in your `credentials.json` file. -- Copy `Client ID` and replace it with the example one in your `credentials.json`. -- Copy `Bot ID` and replace it with the example one in your `credentials.json`. +- Copy `Client ID` and replace it with the example one in your `credentials.json` in `Client ID` **and** `BotID` field. - Save your `credentials.json` but keep it open. We need to put your `User ID` and owner. -####Inviting your bot to your server [Invite Guide][Invite Guide] +####Inviting your bot to your server +- [Invite Guide][Invite Guide] - Create a new server in Discord. - Copy your `Client ID` from your [DiscordApp][DiscordApp]. - Replace `12345678` in this link `https://discordapp.com/oauth2/authorize?client_id=12345678&scope=bot&permissions=66186303` with your `Client ID`. @@ -58,7 +58,7 @@ ________________________________________________________________________________ - Your bot should now be online in the server we added him to. - Note: Your bot will be offline in case you close `NadekoBot.exe`. -####Setting up OwnerIds: +####Setting up OwnerIds - In the server where your bot is, in a text channel, type `.uid` - Your `User ID` should show, copy it. - Close `NadekoBot.exe` @@ -67,7 +67,10 @@ ________________________________________________________________________________ - Now you are the bot owner. - You can add `User IDs` from the other users by separating IDs with a comma if you want to have more owners. -`*Alternatively, you can download nadekobot from [Releases][Releases] and extract the zip yourself. That is what updater does, except it makes it easier for you to update because it doesn't overwrite important files. If you are downloading releases you will have to be careful about your config, credentials, and other files you edited in order to preserve your data every time you update.` +`*Alternatively, you can download nadekobot from` [Releases][Releases] `and extract the zip yourself. +That is what updater does, except it makes it easier for you to update because it doesn't overwrite +important files.If you are downloading releases you will have to be careful about your config, +credentials, and other files you edited in order to preserve your data every time you update.` ________________________________________________________________________________ @@ -80,7 +83,7 @@ ________________________________________________________________________________ - Go to [Google Console][Google Console] and log in. - Create a new project (name does not matter). Once the project is created, go into "Enable and manage APIs." - Under the "Other Popular APIs" section, enable `URL Shortener API` and `Custom Search Api`. Under the `YouTube APIs` section, enable `YouTube Data API`. - - On the left tab, access `Credentials`. Click `Create Credentials` button. Click on `API Key`, and then `Server Key` in the new window that appears. Enter in a name for the `Server Key`. A new window will appear with your `Google API key`. + - On the left tab, access `Credentials`. Click `Create Credentials` button. Click on `API Key`. A new window will appear with your `Google API key`. - Copy the key. - Open up `credentials.json`. - For `"GoogleAPIKey"`, fill in with the new key we copied. @@ -91,8 +94,9 @@ ________________________________________________________________________________ - In `credentials.json`, fill in `"SoundcloudClientID"` with the copied ID. - Restart your computer. -##### Prerequisites for manual `ffmpeg` setup: +####Manual `ffmpeg` setup **Do this step in case you were not able to install `ffmpeg` with the installer.** + - Create a folder named `ffmpeg` in your main Windows directory. We will use **C:\ffmpeg** (for our guide) - Download FFMPEG through the link https://ffmpeg.zeranoe.com/builds/ (download static build) - Extract it using `7zip` and place the folder `ffmpeg-xxxxx-git-xxxxx-xxxx-static` inside **C:\ffmpeg** @@ -104,7 +108,8 @@ ________________________________________________________________________________ [NET Framework]: https://www.microsoft.com/en-us/download/details.aspx?id=48130 [FFMPEG]: https://github.com/Soundofdarkness/FFMPEG-Installer [7zip]: http://www.7-zip.org/download.html -[Releases]: //github.com/Kwoth/NadekoUpdater/releases/tag/v1.0 +[Updater]: https://github.com/Kwoth/NadekoUpdater/releases +[Releases]: https://github.com/Kwoth/NadekoBot/releases [DiscordApp]: https://discordapp.com/developers/applications/me [Notepad++]: https://notepad-plus-plus.org/ [Invite Guide]: http://discord.kongslien.net/guide.html diff --git a/docs/guides/mii-chan.md b/docs/guides/mii-chan.md new file mode 100644 index 00000000..76be958b --- /dev/null +++ b/docs/guides/mii-chan.md @@ -0,0 +1,2 @@ +Docs are in the air. +Kwoth is magic. diff --git a/docs/index.md b/docs/index.md index 9cec30e0..942c22a5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1 +1,47 @@ -Hai, this will be docs of nakeda \ No newline at end of file +#NadekoBot Documentation + +To invite NadekoBot to your server, click on the image bellow: + +[![img][img]](https://discordapp.com/oauth2/authorize?client_id=170254782546575360&scope=bot&permissions=66186303) + +In case you need any help, hop on [NadekoBot Server][NadekoBot Server], where we can provide support. + +NadekoBot is an open source project, and it can be found on our [GitHub][GitHub] page. + +Here you can read current [Issues][Issues]. + +If you want to contribute, be sure to PR on the **[dev][dev]** branch. +##Content +- [About](about.md) +- Guides + - [Windows Guide](guides/Windows Guide.md) + - [Linux Guide](guides/Linux Guide.md) + - [OSX Guide](guides/OSX Guide.md) + - [Building from Source](guides/Building from Source.md) + - [Docker Guide](guides/Docker Guide.md) +- Commands + - [Readme](Readme.md) + - [Commands List](Commands List.md) +- [Permissions System](Permissions System.md) +- [JSON Explanations](JSON Explanations.md) +- [Custom Reactions](Custom Reactions.md) +- [Frequently Asked Questions](Frequently Asked Questions.md) +- [Contribution Guide](Contribution Guide.md) +- [Donate](Donate.md) + +[img]: https://discordcdn.com/attachments/202743183774318593/210580315381563392/discord.png +[NadekoBot Server]: https://discord.gg/0ehQwTK2RBjAxzEY +[GitHub]: https://github.com/Kwoth/NadekoBot +[Issues]: https://github.com/Kwoth/NadekoBot/issues +[dev]: https://github.com/Kwoth/NadekoBot/tree/dev + +[Italian]: http://i.imgur.com/SsaTwOF.png?1 +[Russian]: http://i.imgur.com/wf9bc5G.png?1 +[German]: http://i.imgur.com/EM5qPzf.png?1 +[Chinese]: http://i.imgur.com/MVCNOjT.png?1 +[English]: http://i.imgur.com/jHTyZFS.png?1 +[Spanish]: http://i.imgur.com/9BsusB6.png?1 +[French]: http://i.imgur.com/g2ARPF6.png?1 +[Dutch]: http://i.imgur.com/SadddLj.png?1 +[Norwegian]: http://i.imgur.com/TCVa0V8.png?1 +[Serbian]: http://i.imgur.com/5evoUbU.png diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 9cec30e0..00000000 --- a/docs/index.rst +++ /dev/null @@ -1 +0,0 @@ -Hai, this will be docs of nakeda \ No newline at end of file diff --git a/docs/license.md b/docs/license.md deleted file mode 100644 index ad9c4e5f..00000000 --- a/docs/license.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015 Master Kwoth - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/src/NadekoBot/Attributes/LocalizedAlias.cs b/src/NadekoBot/Attributes/Aliases.cs similarity index 52% rename from src/NadekoBot/Attributes/LocalizedAlias.cs rename to src/NadekoBot/Attributes/Aliases.cs index 97f808aa..ee6e18ad 100644 --- a/src/NadekoBot/Attributes/LocalizedAlias.cs +++ b/src/NadekoBot/Attributes/Aliases.cs @@ -9,9 +9,9 @@ using System.Threading.Tasks; namespace NadekoBot.Attributes { - public class LocalizedAliasAttribute : AliasAttribute + public class Aliases : AliasAttribute { - public LocalizedAliasAttribute([CallerMemberName] string memberName = "") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_text").Split(' ').Skip(1).ToArray()) + public Aliases([CallerMemberName] string memberName = "") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_cmd").Split(' ').Skip(1).ToArray()) { } } diff --git a/src/NadekoBot/Attributes/Description.cs b/src/NadekoBot/Attributes/Description.cs new file mode 100644 index 00000000..a6f32c74 --- /dev/null +++ b/src/NadekoBot/Attributes/Description.cs @@ -0,0 +1,14 @@ +using Discord.Commands; +using NadekoBot.Services; +using System.Runtime.CompilerServices; + +namespace NadekoBot.Attributes +{ + public class Description : SummaryAttribute + { + public Description([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_desc")) + { + + } + } +} diff --git a/src/NadekoBot/Attributes/LocalizedCommand.cs b/src/NadekoBot/Attributes/LocalizedCommand.cs deleted file mode 100644 index dcb96537..00000000 --- a/src/NadekoBot/Attributes/LocalizedCommand.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Discord.Commands; -using NadekoBot.Services; -using System.Linq; -using System.Runtime.CompilerServices; - -namespace NadekoBot.Attributes -{ - public class LocalizedCommandAttribute : CommandAttribute - { - public LocalizedCommandAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_text").Split(' ')[0]) - { - - } - } -} diff --git a/src/NadekoBot/Attributes/LocalizedDescription.cs b/src/NadekoBot/Attributes/LocalizedDescription.cs deleted file mode 100644 index 470b6113..00000000 --- a/src/NadekoBot/Attributes/LocalizedDescription.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Discord.Commands; -using NadekoBot.Services; -using System.Runtime.CompilerServices; - -namespace NadekoBot.Attributes -{ - public class LocalizedDescriptionAttribute : DescriptionAttribute - { - public LocalizedDescriptionAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant()+"_desc")) - { - - } - } -} diff --git a/src/NadekoBot/Attributes/LocalizedSummary.cs b/src/NadekoBot/Attributes/LocalizedSummary.cs deleted file mode 100644 index 9ded83bc..00000000 --- a/src/NadekoBot/Attributes/LocalizedSummary.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Discord.Commands; -using NadekoBot.Services; -using System.Runtime.CompilerServices; - -namespace NadekoBot.Attributes -{ - public class LocalizedSummaryAttribute : SummaryAttribute - { - public LocalizedSummaryAttribute([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_summary")) - { - - } - } -} diff --git a/src/NadekoBot/Attributes/NadekoCommand.cs b/src/NadekoBot/Attributes/NadekoCommand.cs new file mode 100644 index 00000000..ab473cbb --- /dev/null +++ b/src/NadekoBot/Attributes/NadekoCommand.cs @@ -0,0 +1,15 @@ +using Discord.Commands; +using NadekoBot.Services; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace NadekoBot.Attributes +{ + public class NadekoCommand : CommandAttribute + { + public NadekoCommand([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant() + "_cmd").Split(' ')[0]) + { + + } + } +} diff --git a/src/NadekoBot/Attributes/OwnerOnlyAttribute.cs b/src/NadekoBot/Attributes/OwnerOnlyAttribute.cs index 8236f1d1..f04b6ef2 100644 --- a/src/NadekoBot/Attributes/OwnerOnlyAttribute.cs +++ b/src/NadekoBot/Attributes/OwnerOnlyAttribute.cs @@ -1,11 +1,12 @@ -//using System.Threading.Tasks; -//using Discord.Commands; -//using Discord; +using System.Threading.Tasks; +using Discord.Commands; +using Discord; -//namespace NadekoBot.Attributes { -// public class OwnerOnlyAttribute : PreconditionAttribute -// { -// public override Task CheckPermissions(IUserMessage context, Command executingCommand, object moduleInstance) => -// Task.FromResult((NadekoBot.Credentials.IsOwner(context.Author) ? PreconditionResult.FromSuccess() : PreconditionResult.FromError("Not owner"))); -// } -//} \ No newline at end of file +namespace NadekoBot.Attributes +{ + public class OwnerOnlyAttribute : PreconditionAttribute + { + public override Task CheckPermissions(IUserMessage context, Command executingCommand, object moduleInstance) => + Task.FromResult((NadekoBot.Credentials.IsOwner(context.Author) ? PreconditionResult.FromSuccess() : PreconditionResult.FromError("Not owner"))); + } +} \ No newline at end of file diff --git a/src/NadekoBot/Attributes/Usage.cs b/src/NadekoBot/Attributes/Usage.cs new file mode 100644 index 00000000..b3e18519 --- /dev/null +++ b/src/NadekoBot/Attributes/Usage.cs @@ -0,0 +1,14 @@ +using Discord.Commands; +using NadekoBot.Services; +using System.Runtime.CompilerServices; + +namespace NadekoBot.Attributes +{ + public class Usage : RemarksAttribute + { + public Usage([CallerMemberName] string memberName="") : base(Localization.LoadCommandString(memberName.ToLowerInvariant()+"_usage")) + { + + } + } +} diff --git a/src/NadekoBot/DataStructures/ConcurrentHashSet.cs b/src/NadekoBot/DataStructures/ConcurrentHashSet.cs new file mode 100644 index 00000000..b29a8842 --- /dev/null +++ b/src/NadekoBot/DataStructures/ConcurrentHashSet.cs @@ -0,0 +1,761 @@ +// License MIT +// Source: https://github.com/i3arnon/ConcurrentHashSet + +using ConcurrentCollections; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; + +namespace System.Collections.Concurrent +{ + ///

+ /// Represents a thread-safe hash-based unique collection. + /// + /// The type of the items in the collection. + /// + /// All public members of are thread-safe and may be used + /// concurrently from multiple threads. + /// + [DebuggerDisplay("Count = {Count}")] + public sealed class ConcurrentHashSet : IReadOnlyCollection, ICollection + { + private const int DefaultCapacity = 31; + private const int MaxLockNumber = 1024; + + private readonly IEqualityComparer _comparer; + private readonly bool _growLockArray; + + private int _budget; + private volatile Tables _tables; + + private static int DefaultConcurrencyLevel => PlatformHelper.ProcessorCount; + + /// + /// Gets the number of items contained in the . + /// + /// The number of items contained in the . + /// Count has snapshot semantics and represents the number of items in the + /// at the moment when Count was accessed. + public int Count { + get { + var count = 0; + var acquiredLocks = 0; + try + { + AcquireAllLocks(ref acquiredLocks); + + for (var i = 0; i < _tables.CountPerLock.Length; i++) + { + count += _tables.CountPerLock[i]; + } + } + finally + { + ReleaseLocks(0, acquiredLocks); + } + + return count; + } + } + + /// + /// Gets a value that indicates whether the is empty. + /// + /// true if the is empty; otherwise, + /// false. + public bool IsEmpty { + get { + var acquiredLocks = 0; + try + { + AcquireAllLocks(ref acquiredLocks); + + for (var i = 0; i < _tables.CountPerLock.Length; i++) + { + if (_tables.CountPerLock[i] != 0) + { + return false; + } + } + } + finally + { + ReleaseLocks(0, acquiredLocks); + } + + return true; + } + } + + /// + /// Initializes a new instance of the + /// class that is empty, has the default concurrency level, has the default initial capacity, and + /// uses the default comparer for the item type. + /// + public ConcurrentHashSet() + : this(DefaultConcurrencyLevel, DefaultCapacity, true, EqualityComparer.Default) + { + } + + /// + /// Initializes a new instance of the + /// class that is empty, has the specified concurrency level and capacity, and uses the default + /// comparer for the item type. + /// + /// The estimated number of threads that will update the + /// concurrently. + /// The initial number of elements that the + /// can contain. + /// is + /// less than 1. + /// is less than + /// 0. + public ConcurrentHashSet(int concurrencyLevel, int capacity) + : this(concurrencyLevel, capacity, false, EqualityComparer.Default) + { + } + + /// + /// Initializes a new instance of the + /// class that contains elements copied from the specified , has the default concurrency + /// level, has the default initial capacity, and uses the default comparer for the item type. + /// + /// The whose elements are copied to + /// the new + /// . + /// is a null reference. + public ConcurrentHashSet(IEnumerable collection) + : this(collection, EqualityComparer.Default) + { + } + + /// + /// Initializes a new instance of the + /// class that is empty, has the specified concurrency level and capacity, and uses the specified + /// . + /// + /// The + /// implementation to use when comparing items. + /// is a null reference. + public ConcurrentHashSet(IEqualityComparer comparer) + : this(DefaultConcurrencyLevel, DefaultCapacity, true, comparer) + { + } + + /// + /// Initializes a new instance of the + /// class that contains elements copied from the specified , has the default concurrency level, has the default + /// initial capacity, and uses the specified + /// . + /// + /// The whose elements are copied to + /// the new + /// . + /// The + /// implementation to use when comparing items. + /// is a null reference + /// (Nothing in Visual Basic). -or- + /// is a null reference (Nothing in Visual Basic). + /// + public ConcurrentHashSet(IEnumerable collection, IEqualityComparer comparer) + : this(comparer) + { + if (collection == null) throw new ArgumentNullException(nameof(collection)); + + InitializeFromCollection(collection); + } + + + /// + /// Initializes a new instance of the + /// class that contains elements copied from the specified , + /// has the specified concurrency level, has the specified initial capacity, and uses the specified + /// . + /// + /// The estimated number of threads that will update the + /// concurrently. + /// The whose elements are copied to the new + /// . + /// The implementation to use + /// when comparing items. + /// + /// is a null reference. + /// -or- + /// is a null reference. + /// + /// + /// is less than 1. + /// + public ConcurrentHashSet(int concurrencyLevel, IEnumerable collection, IEqualityComparer comparer) + : this(concurrencyLevel, DefaultCapacity, false, comparer) + { + if (collection == null) throw new ArgumentNullException(nameof(collection)); + if (comparer == null) throw new ArgumentNullException(nameof(comparer)); + + InitializeFromCollection(collection); + } + + /// + /// Initializes a new instance of the + /// class that is empty, has the specified concurrency level, has the specified initial capacity, and + /// uses the specified . + /// + /// The estimated number of threads that will update the + /// concurrently. + /// The initial number of elements that the + /// can contain. + /// The + /// implementation to use when comparing items. + /// + /// is less than 1. -or- + /// is less than 0. + /// + /// is a null reference. + public ConcurrentHashSet(int concurrencyLevel, int capacity, IEqualityComparer comparer) + : this(concurrencyLevel, capacity, false, comparer) + { + } + + private ConcurrentHashSet(int concurrencyLevel, int capacity, bool growLockArray, IEqualityComparer comparer) + { + if (concurrencyLevel < 1) throw new ArgumentOutOfRangeException(nameof(concurrencyLevel)); + if (capacity < 0) throw new ArgumentOutOfRangeException(nameof(capacity)); + if (comparer == null) throw new ArgumentNullException(nameof(comparer)); + + // The capacity should be at least as large as the concurrency level. Otherwise, we would have locks that don't guard + // any buckets. + if (capacity < concurrencyLevel) + { + capacity = concurrencyLevel; + } + + var locks = new object[concurrencyLevel]; + for (var i = 0; i < locks.Length; i++) + { + locks[i] = new object(); + } + + var countPerLock = new int[locks.Length]; + var buckets = new Node[capacity]; + _tables = new Tables(buckets, locks, countPerLock); + + _growLockArray = growLockArray; + _budget = buckets.Length / locks.Length; + _comparer = comparer; + } + + /// + /// Adds the specified item to the . + /// + /// The item to add. + /// true if the items was added to the + /// successfully; false if it already exists. + /// The + /// contains too many items. + public bool Add(T item) => + AddInternal(item, _comparer.GetHashCode(item), true); + + /// + /// Removes all items from the . + /// + public void Clear() + { + var locksAcquired = 0; + try + { + AcquireAllLocks(ref locksAcquired); + + var newTables = new Tables(new Node[DefaultCapacity], _tables.Locks, new int[_tables.CountPerLock.Length]); + _tables = newTables; + _budget = Math.Max(1, newTables.Buckets.Length / newTables.Locks.Length); + } + finally + { + ReleaseLocks(0, locksAcquired); + } + } + + /// + /// Determines whether the contains the specified + /// item. + /// + /// The item to locate in the . + /// true if the contains the item; otherwise, false. + public bool Contains(T item) + { + var hashcode = _comparer.GetHashCode(item); + + // We must capture the _buckets field in a local variable. It is set to a new table on each table resize. + var tables = _tables; + + var bucketNo = GetBucket(hashcode, tables.Buckets.Length); + + // We can get away w/out a lock here. + // The Volatile.Read ensures that the load of the fields of 'n' doesn't move before the load from buckets[i]. + var current = Volatile.Read(ref tables.Buckets[bucketNo]); + + while (current != null) + { + if (hashcode == current.Hashcode && _comparer.Equals(current.Item, item)) + { + return true; + } + current = current.Next; + } + + return false; + } + + /// + /// Attempts to remove the item from the . + /// + /// The item to remove. + /// true if an item was removed successfully; otherwise, false. + public bool TryRemove(T item) + { + var hashcode = _comparer.GetHashCode(item); + while (true) + { + var tables = _tables; + + int bucketNo, lockNo; + GetBucketAndLockNo(hashcode, out bucketNo, out lockNo, tables.Buckets.Length, tables.Locks.Length); + + lock (tables.Locks[lockNo]) + { + // If the table just got resized, we may not be holding the right lock, and must retry. + // This should be a rare occurrence. + if (tables != _tables) + { + continue; + } + + Node previous = null; + for (var current = tables.Buckets[bucketNo]; current != null; current = current.Next) + { + Debug.Assert((previous == null && current == tables.Buckets[bucketNo]) || previous.Next == current); + + if (hashcode == current.Hashcode && _comparer.Equals(current.Item, item)) + { + if (previous == null) + { + Volatile.Write(ref tables.Buckets[bucketNo], current.Next); + } + else + { + previous.Next = current.Next; + } + + tables.CountPerLock[lockNo]--; + return true; + } + previous = current; + } + } + + return false; + } + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + /// Returns an enumerator that iterates through the . + /// An enumerator for the . + /// + /// The enumerator returned from the collection is safe to use concurrently with + /// reads and writes to the collection, however it does not represent a moment-in-time snapshot + /// of the collection. The contents exposed through the enumerator may contain modifications + /// made to the collection after was called. + /// + public IEnumerator GetEnumerator() + { + var buckets = _tables.Buckets; + + for (var i = 0; i < buckets.Length; i++) + { + // The Volatile.Read ensures that the load of the fields of 'current' doesn't move before the load from buckets[i]. + var current = Volatile.Read(ref buckets[i]); + + while (current != null) + { + yield return current.Item; + current = current.Next; + } + } + } + + void ICollection.Add(T item) => Add(item); + + bool ICollection.IsReadOnly => false; + + void ICollection.CopyTo(T[] array, int arrayIndex) + { + if (array == null) throw new ArgumentNullException(nameof(array)); + if (arrayIndex < 0) throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + + var locksAcquired = 0; + try + { + AcquireAllLocks(ref locksAcquired); + + var count = 0; + + for (var i = 0; i < _tables.Locks.Length && count >= 0; i++) + { + count += _tables.CountPerLock[i]; + } + + if (array.Length - count < arrayIndex || count < 0) //"count" itself or "count + arrayIndex" can overflow + { + throw new ArgumentException("The index is equal to or greater than the length of the array, or the number of elements in the set is greater than the available space from index to the end of the destination array."); + } + + CopyToItems(array, arrayIndex); + } + finally + { + ReleaseLocks(0, locksAcquired); + } + } + + bool ICollection.Remove(T item) => TryRemove(item); + + private void InitializeFromCollection(IEnumerable collection) + { + foreach (var item in collection) + { + AddInternal(item, _comparer.GetHashCode(item), false); + } + + if (_budget == 0) + { + _budget = _tables.Buckets.Length / _tables.Locks.Length; + } + } + + private bool AddInternal(T item, int hashcode, bool acquireLock) + { + while (true) + { + int bucketNo, lockNo; + + var tables = _tables; + GetBucketAndLockNo(hashcode, out bucketNo, out lockNo, tables.Buckets.Length, tables.Locks.Length); + + var resizeDesired = false; + var lockTaken = false; + try + { + if (acquireLock) + Monitor.Enter(tables.Locks[lockNo], ref lockTaken); + + // If the table just got resized, we may not be holding the right lock, and must retry. + // This should be a rare occurrence. + if (tables != _tables) + { + continue; + } + + // Try to find this item in the bucket + Node previous = null; + for (var current = tables.Buckets[bucketNo]; current != null; current = current.Next) + { + Debug.Assert((previous == null && current == tables.Buckets[bucketNo]) || previous.Next == current); + if (hashcode == current.Hashcode && _comparer.Equals(current.Item, item)) + { + return false; + } + previous = current; + } + + // The item was not found in the bucket. Insert the new item. + Volatile.Write(ref tables.Buckets[bucketNo], new Node(item, hashcode, tables.Buckets[bucketNo])); + checked + { + tables.CountPerLock[lockNo]++; + } + + // + // If the number of elements guarded by this lock has exceeded the budget, resize the bucket table. + // It is also possible that GrowTable will increase the budget but won't resize the bucket table. + // That happens if the bucket table is found to be poorly utilized due to a bad hash function. + // + if (tables.CountPerLock[lockNo] > _budget) + { + resizeDesired = true; + } + } + finally + { + if (lockTaken) + Monitor.Exit(tables.Locks[lockNo]); + } + + // + // The fact that we got here means that we just performed an insertion. If necessary, we will grow the table. + // + // Concurrency notes: + // - Notice that we are not holding any locks at when calling GrowTable. This is necessary to prevent deadlocks. + // - As a result, it is possible that GrowTable will be called unnecessarily. But, GrowTable will obtain lock 0 + // and then verify that the table we passed to it as the argument is still the current table. + // + if (resizeDesired) + { + GrowTable(tables); + } + + return true; + } + } + + private static int GetBucket(int hashcode, int bucketCount) + { + var bucketNo = (hashcode & 0x7fffffff) % bucketCount; + Debug.Assert(bucketNo >= 0 && bucketNo < bucketCount); + return bucketNo; + } + + private static void GetBucketAndLockNo(int hashcode, out int bucketNo, out int lockNo, int bucketCount, int lockCount) + { + bucketNo = (hashcode & 0x7fffffff) % bucketCount; + lockNo = bucketNo % lockCount; + + Debug.Assert(bucketNo >= 0 && bucketNo < bucketCount); + Debug.Assert(lockNo >= 0 && lockNo < lockCount); + } + + private void GrowTable(Tables tables) + { + const int maxArrayLength = 0X7FEFFFFF; + var locksAcquired = 0; + try + { + // The thread that first obtains _locks[0] will be the one doing the resize operation + AcquireLocks(0, 1, ref locksAcquired); + + // Make sure nobody resized the table while we were waiting for lock 0: + if (tables != _tables) + { + // We assume that since the table reference is different, it was already resized (or the budget + // was adjusted). If we ever decide to do table shrinking, or replace the table for other reasons, + // we will have to revisit this logic. + return; + } + + // Compute the (approx.) total size. Use an Int64 accumulation variable to avoid an overflow. + long approxCount = 0; + for (var i = 0; i < tables.CountPerLock.Length; i++) + { + approxCount += tables.CountPerLock[i]; + } + + // + // If the bucket array is too empty, double the budget instead of resizing the table + // + if (approxCount < tables.Buckets.Length / 4) + { + _budget = 2 * _budget; + if (_budget < 0) + { + _budget = int.MaxValue; + } + return; + } + + // Compute the new table size. We find the smallest integer larger than twice the previous table size, and not divisible by + // 2,3,5 or 7. We can consider a different table-sizing policy in the future. + var newLength = 0; + var maximizeTableSize = false; + try + { + checked + { + // Double the size of the buckets table and add one, so that we have an odd integer. + newLength = tables.Buckets.Length * 2 + 1; + + // Now, we only need to check odd integers, and find the first that is not divisible + // by 3, 5 or 7. + while (newLength % 3 == 0 || newLength % 5 == 0 || newLength % 7 == 0) + { + newLength += 2; + } + + Debug.Assert(newLength % 2 != 0); + + if (newLength > maxArrayLength) + { + maximizeTableSize = true; + } + } + } + catch (OverflowException) + { + maximizeTableSize = true; + } + + if (maximizeTableSize) + { + newLength = maxArrayLength; + + // We want to make sure that GrowTable will not be called again, since table is at the maximum size. + // To achieve that, we set the budget to int.MaxValue. + // + // (There is one special case that would allow GrowTable() to be called in the future: + // calling Clear() on the ConcurrentHashSet will shrink the table and lower the budget.) + _budget = int.MaxValue; + } + + // Now acquire all other locks for the table + AcquireLocks(1, tables.Locks.Length, ref locksAcquired); + + var newLocks = tables.Locks; + + // Add more locks + if (_growLockArray && tables.Locks.Length < MaxLockNumber) + { + newLocks = new object[tables.Locks.Length * 2]; + Array.Copy(tables.Locks, 0, newLocks, 0, tables.Locks.Length); + for (var i = tables.Locks.Length; i < newLocks.Length; i++) + { + newLocks[i] = new object(); + } + } + + var newBuckets = new Node[newLength]; + var newCountPerLock = new int[newLocks.Length]; + + // Copy all data into a new table, creating new nodes for all elements + for (var i = 0; i < tables.Buckets.Length; i++) + { + var current = tables.Buckets[i]; + while (current != null) + { + var next = current.Next; + int newBucketNo, newLockNo; + GetBucketAndLockNo(current.Hashcode, out newBucketNo, out newLockNo, newBuckets.Length, newLocks.Length); + + newBuckets[newBucketNo] = new Node(current.Item, current.Hashcode, newBuckets[newBucketNo]); + + checked + { + newCountPerLock[newLockNo]++; + } + + current = next; + } + } + + // Adjust the budget + _budget = Math.Max(1, newBuckets.Length / newLocks.Length); + + // Replace tables with the new versions + _tables = new Tables(newBuckets, newLocks, newCountPerLock); + } + finally + { + // Release all locks that we took earlier + ReleaseLocks(0, locksAcquired); + } + } + + private void AcquireAllLocks(ref int locksAcquired) + { + // First, acquire lock 0 + AcquireLocks(0, 1, ref locksAcquired); + + // Now that we have lock 0, the _locks array will not change (i.e., grow), + // and so we can safely read _locks.Length. + AcquireLocks(1, _tables.Locks.Length, ref locksAcquired); + Debug.Assert(locksAcquired == _tables.Locks.Length); + } + + private void AcquireLocks(int fromInclusive, int toExclusive, ref int locksAcquired) + { + Debug.Assert(fromInclusive <= toExclusive); + var locks = _tables.Locks; + + for (var i = fromInclusive; i < toExclusive; i++) + { + var lockTaken = false; + try + { + Monitor.Enter(locks[i], ref lockTaken); + } + finally + { + if (lockTaken) + { + locksAcquired++; + } + } + } + } + + private void ReleaseLocks(int fromInclusive, int toExclusive) + { + Debug.Assert(fromInclusive <= toExclusive); + + for (var i = fromInclusive; i < toExclusive; i++) + { + Monitor.Exit(_tables.Locks[i]); + } + } + + private void CopyToItems(T[] array, int index) + { + var buckets = _tables.Buckets; + for (var i = 0; i < buckets.Length; i++) + { + for (var current = buckets[i]; current != null; current = current.Next) + { + array[index] = current.Item; + index++; //this should never flow, CopyToItems is only called when there's no overflow risk + } + } + } + + private sealed class Tables + { + public readonly Node[] Buckets; + public readonly object[] Locks; + + public volatile int[] CountPerLock; + + public Tables(Node[] buckets, object[] locks, int[] countPerLock) + { + Buckets = buckets; + Locks = locks; + CountPerLock = countPerLock; + } + } + + private sealed class Node + { + public readonly T Item; + public readonly int Hashcode; + + public volatile Node Next; + + public Node(T item, int hashcode, Node next) + { + Item = item; + Hashcode = hashcode; + Next = next; + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/DataStructures/PlatformHelper.cs b/src/NadekoBot/DataStructures/PlatformHelper.cs new file mode 100644 index 00000000..d0b5a4ba --- /dev/null +++ b/src/NadekoBot/DataStructures/PlatformHelper.cs @@ -0,0 +1,25 @@ +using System; + +namespace ConcurrentCollections +{ + internal static class PlatformHelper + { + private const int ProcessorCountRefreshIntervalMs = 30000; + + private static volatile int _processorCount; + private static volatile int _lastProcessorCountRefreshTicks; + + internal static int ProcessorCount { + get { + var now = Environment.TickCount; + if (_processorCount == 0 || (now - _lastProcessorCountRefreshTicks) >= ProcessorCountRefreshIntervalMs) + { + _processorCount = Environment.ProcessorCount; + _lastProcessorCountRefreshTicks = now; + } + + return _processorCount; + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Migrations/20160910180231_first.Designer.cs b/src/NadekoBot/Migrations/20161007091612_first.Designer.cs similarity index 76% rename from src/NadekoBot/Migrations/20160910180231_first.Designer.cs rename to src/NadekoBot/Migrations/20161007091612_first.Designer.cs index 1097f981..8a0b6f16 100644 --- a/src/NadekoBot/Migrations/20160910180231_first.Designer.cs +++ b/src/NadekoBot/Migrations/20161007091612_first.Designer.cs @@ -8,7 +8,7 @@ using NadekoBot.Services.Database.Impl; namespace NadekoBot.Migrations { [DbContext(typeof(NadekoSqliteContext))] - [Migration("20160910180231_first")] + [Migration("20161007091612_first")] partial class first { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -25,6 +25,8 @@ namespace NadekoBot.Migrations b.Property("ItemId"); + b.Property("Type"); + b.HasKey("Id"); b.HasIndex("BotConfigId"); @@ -49,12 +51,18 @@ namespace NadekoBot.Migrations b.Property("CurrencySign"); + b.Property("DMHelpString"); + b.Property("DontJoinServers"); b.Property("ForwardMessages"); b.Property("ForwardToAllOwners"); + b.Property("HelpString"); + + b.Property("MigrationVersion"); + b.Property("RemindMessageFormat"); b.Property("RotatingStatuses"); @@ -176,6 +184,42 @@ namespace NadekoBot.Migrations b.ToTable("EightBallResponses"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildConfigId1"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.HasIndex("GuildConfigId1"); + + b.ToTable("FilterChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildConfigId"); + + b.Property("Word"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => { b.Property("Id") @@ -229,6 +273,10 @@ namespace NadekoBot.Migrations b.Property("ExclusiveSelfAssignedRoles"); + b.Property("FilterInvites"); + + b.Property("FilterWords"); + b.Property("GenerateCurrencyChannelId"); b.Property("GreetMessageChannelId"); @@ -237,12 +285,18 @@ namespace NadekoBot.Migrations b.Property("LogSettingId"); + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + b.Property("SendChannelByeMessage"); b.Property("SendChannelGreetMessage"); b.Property("SendDmGreetMessage"); + b.Property("VerbosePermissions"); + b.Property("VoicePlusTextEnabled"); b.HasKey("Id"); @@ -252,6 +306,8 @@ namespace NadekoBot.Migrations b.HasIndex("LogSettingId"); + b.HasIndex("RootPermissionId"); + b.ToTable("GuildConfigs"); }); @@ -308,8 +364,6 @@ namespace NadekoBot.Migrations b.Property("MessageDeleted"); - b.Property("MessageReceived"); - b.Property("MessageUpdated"); b.Property("UserBanned"); @@ -349,6 +403,47 @@ namespace NadekoBot.Migrations b.ToTable("ModulePrefixes"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("AuthorId"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("NextId"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => { b.Property("Id") @@ -365,6 +460,30 @@ namespace NadekoBot.Migrations b.ToTable("PlayingStatus"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("MusicPlaylistId"); + + b.Property("Provider"); + + b.Property("ProviderType"); + + b.Property("Query"); + + b.Property("Title"); + + b.Property("Uri"); + + b.HasKey("Id"); + + b.HasIndex("MusicPlaylistId"); + + b.ToTable("PlaylistSong"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => { b.Property("Id") @@ -502,6 +621,24 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId"); + + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId1"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => { b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") @@ -514,6 +651,10 @@ namespace NadekoBot.Migrations b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") .WithMany() .HasForeignKey("LogSettingId"); + + b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission") + .WithMany() + .HasForeignKey("RootPermissionId"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => @@ -538,6 +679,13 @@ namespace NadekoBot.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") @@ -545,6 +693,14 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") diff --git a/src/NadekoBot/Migrations/20160910180231_first.cs b/src/NadekoBot/Migrations/20161007091612_first.cs similarity index 76% rename from src/NadekoBot/Migrations/20160910180231_first.cs rename to src/NadekoBot/Migrations/20161007091612_first.cs index c24604f5..0b8325dc 100644 --- a/src/NadekoBot/Migrations/20160910180231_first.cs +++ b/src/NadekoBot/Migrations/20161007091612_first.cs @@ -20,9 +20,12 @@ namespace NadekoBot.Migrations CurrencyName = table.Column(nullable: true), CurrencyPluralName = table.Column(nullable: true), CurrencySign = table.Column(nullable: true), + DMHelpString = table.Column(nullable: true), DontJoinServers = table.Column(nullable: false), ForwardMessages = table.Column(nullable: false), ForwardToAllOwners = table.Column(nullable: false), + HelpString = table.Column(nullable: true), + MigrationVersion = table.Column(nullable: false), RemindMessageFormat = table.Column(nullable: true), RotatingStatuses = table.Column(nullable: false) }, @@ -107,7 +110,6 @@ namespace NadekoBot.Migrations LogUserPresence = table.Column(nullable: false), LogVoicePresence = table.Column(nullable: false), MessageDeleted = table.Column(nullable: false), - MessageReceived = table.Column(nullable: false), MessageUpdated = table.Column(nullable: false), UserBanned = table.Column(nullable: false), UserJoined = table.Column(nullable: false), @@ -122,6 +124,45 @@ namespace NadekoBot.Migrations table.PrimaryKey("PK_LogSettings", x => x.Id); }); + migrationBuilder.CreateTable( + name: "MusicPlaylists", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + Author = table.Column(nullable: true), + AuthorId = table.Column(nullable: false), + Name = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_MusicPlaylists", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Permission", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + NextId = table.Column(nullable: true), + PrimaryTarget = table.Column(nullable: false), + PrimaryTargetId = table.Column(nullable: false), + SecondaryTarget = table.Column(nullable: false), + SecondaryTargetName = table.Column(nullable: true), + State = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Permission", x => x.Id); + table.ForeignKey( + name: "FK_Permission_Permission_NextId", + column: x => x.NextId, + principalTable: "Permission", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + migrationBuilder.CreateTable( name: "Quotes", columns: table => new @@ -208,7 +249,8 @@ namespace NadekoBot.Migrations Id = table.Column(nullable: false) .Annotation("Autoincrement", true), BotConfigId = table.Column(nullable: true), - ItemId = table.Column(nullable: false) + ItemId = table.Column(nullable: false), + Type = table.Column(nullable: false) }, constraints: table => { @@ -326,44 +368,6 @@ namespace NadekoBot.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "GuildConfigs", - columns: table => new - { - Id = table.Column(nullable: false) - .Annotation("Autoincrement", true), - AutoAssignRoleId = table.Column(nullable: false), - AutoDeleteByeMessages = table.Column(nullable: false), - AutoDeleteGreetMessages = table.Column(nullable: false), - AutoDeleteGreetMessagesTimer = table.Column(nullable: false), - AutoDeleteSelfAssignedRoleMessages = table.Column(nullable: false), - ByeMessageChannelId = table.Column(nullable: false), - ChannelByeMessageText = table.Column(nullable: true), - ChannelGreetMessageText = table.Column(nullable: true), - DefaultMusicVolume = table.Column(nullable: false), - DeleteMessageOnCommand = table.Column(nullable: false), - DmGreetMessageText = table.Column(nullable: true), - ExclusiveSelfAssignedRoles = table.Column(nullable: false), - GenerateCurrencyChannelId = table.Column(nullable: true), - GreetMessageChannelId = table.Column(nullable: false), - GuildId = table.Column(nullable: false), - LogSettingId = table.Column(nullable: true), - SendChannelByeMessage = table.Column(nullable: false), - SendChannelGreetMessage = table.Column(nullable: false), - SendDmGreetMessage = table.Column(nullable: false), - VoicePlusTextEnabled = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_GuildConfigs", x => x.Id); - table.ForeignKey( - name: "FK_GuildConfigs_LogSettings_LogSettingId", - column: x => x.LogSettingId, - principalTable: "LogSettings", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - migrationBuilder.CreateTable( name: "IgnoredLogChannels", columns: table => new @@ -404,6 +408,126 @@ namespace NadekoBot.Migrations onDelete: ReferentialAction.Restrict); }); + migrationBuilder.CreateTable( + name: "PlaylistSong", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + MusicPlaylistId = table.Column(nullable: true), + Provider = table.Column(nullable: true), + ProviderType = table.Column(nullable: false), + Query = table.Column(nullable: true), + Title = table.Column(nullable: true), + Uri = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PlaylistSong", x => x.Id); + table.ForeignKey( + name: "FK_PlaylistSong_MusicPlaylists_MusicPlaylistId", + column: x => x.MusicPlaylistId, + principalTable: "MusicPlaylists", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "GuildConfigs", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + AutoAssignRoleId = table.Column(nullable: false), + AutoDeleteByeMessages = table.Column(nullable: false), + AutoDeleteGreetMessages = table.Column(nullable: false), + AutoDeleteGreetMessagesTimer = table.Column(nullable: false), + AutoDeleteSelfAssignedRoleMessages = table.Column(nullable: false), + ByeMessageChannelId = table.Column(nullable: false), + ChannelByeMessageText = table.Column(nullable: true), + ChannelGreetMessageText = table.Column(nullable: true), + DefaultMusicVolume = table.Column(nullable: false), + DeleteMessageOnCommand = table.Column(nullable: false), + DmGreetMessageText = table.Column(nullable: true), + ExclusiveSelfAssignedRoles = table.Column(nullable: false), + FilterInvites = table.Column(nullable: false), + FilterWords = table.Column(nullable: false), + GenerateCurrencyChannelId = table.Column(nullable: true), + GreetMessageChannelId = table.Column(nullable: false), + GuildId = table.Column(nullable: false), + LogSettingId = table.Column(nullable: true), + PermissionRole = table.Column(nullable: true), + RootPermissionId = table.Column(nullable: true), + SendChannelByeMessage = table.Column(nullable: false), + SendChannelGreetMessage = table.Column(nullable: false), + SendDmGreetMessage = table.Column(nullable: false), + VerbosePermissions = table.Column(nullable: false), + VoicePlusTextEnabled = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_GuildConfigs", x => x.Id); + table.ForeignKey( + name: "FK_GuildConfigs_LogSettings_LogSettingId", + column: x => x.LogSettingId, + principalTable: "LogSettings", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_GuildConfigs_Permission_RootPermissionId", + column: x => x.RootPermissionId, + principalTable: "Permission", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "FilterChannelId", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + ChannelId = table.Column(nullable: false), + GuildConfigId = table.Column(nullable: true), + GuildConfigId1 = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_FilterChannelId", x => x.Id); + table.ForeignKey( + name: "FK_FilterChannelId_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_FilterChannelId_GuildConfigs_GuildConfigId1", + column: x => x.GuildConfigId1, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "FilteredWord", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + GuildConfigId = table.Column(nullable: true), + Word = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_FilteredWord", x => x.Id); + table.ForeignKey( + name: "FK_FilteredWord_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + migrationBuilder.CreateTable( name: "FollowedStream", columns: table => new @@ -455,6 +579,21 @@ namespace NadekoBot.Migrations table: "EightBallResponses", column: "BotConfigId"); + migrationBuilder.CreateIndex( + name: "IX_FilterChannelId_GuildConfigId", + table: "FilterChannelId", + column: "GuildConfigId"); + + migrationBuilder.CreateIndex( + name: "IX_FilterChannelId_GuildConfigId1", + table: "FilterChannelId", + column: "GuildConfigId1"); + + migrationBuilder.CreateIndex( + name: "IX_FilteredWord_GuildConfigId", + table: "FilteredWord", + column: "GuildConfigId"); + migrationBuilder.CreateIndex( name: "IX_FollowedStream_GuildConfigId", table: "FollowedStream", @@ -471,6 +610,11 @@ namespace NadekoBot.Migrations table: "GuildConfigs", column: "LogSettingId"); + migrationBuilder.CreateIndex( + name: "IX_GuildConfigs_RootPermissionId", + table: "GuildConfigs", + column: "RootPermissionId"); + migrationBuilder.CreateIndex( name: "IX_IgnoredLogChannels_LogSettingId", table: "IgnoredLogChannels", @@ -486,11 +630,22 @@ namespace NadekoBot.Migrations table: "ModulePrefixes", column: "BotConfigId"); + migrationBuilder.CreateIndex( + name: "IX_Permission_NextId", + table: "Permission", + column: "NextId", + unique: true); + migrationBuilder.CreateIndex( name: "IX_PlayingStatus_BotConfigId", table: "PlayingStatus", column: "BotConfigId"); + migrationBuilder.CreateIndex( + name: "IX_PlaylistSong_MusicPlaylistId", + table: "PlaylistSong", + column: "MusicPlaylistId"); + migrationBuilder.CreateIndex( name: "IX_RaceAnimals_BotConfigId", table: "RaceAnimals", @@ -529,6 +684,12 @@ namespace NadekoBot.Migrations migrationBuilder.DropTable( name: "EightBallResponses"); + migrationBuilder.DropTable( + name: "FilterChannelId"); + + migrationBuilder.DropTable( + name: "FilteredWord"); + migrationBuilder.DropTable( name: "FollowedStream"); @@ -544,6 +705,9 @@ namespace NadekoBot.Migrations migrationBuilder.DropTable( name: "PlayingStatus"); + migrationBuilder.DropTable( + name: "PlaylistSong"); + migrationBuilder.DropTable( name: "Quotes"); @@ -568,11 +732,17 @@ namespace NadekoBot.Migrations migrationBuilder.DropTable( name: "GuildConfigs"); + migrationBuilder.DropTable( + name: "MusicPlaylists"); + migrationBuilder.DropTable( name: "BotConfig"); migrationBuilder.DropTable( name: "LogSettings"); + + migrationBuilder.DropTable( + name: "Permission"); } } } diff --git a/src/NadekoBot/Migrations/20161007210034_cmdcds.Designer.cs b/src/NadekoBot/Migrations/20161007210034_cmdcds.Designer.cs new file mode 100644 index 00000000..79c21557 --- /dev/null +++ b/src/NadekoBot/Migrations/20161007210034_cmdcds.Designer.cs @@ -0,0 +1,737 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database.Impl; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoSqliteContext))] + [Migration("20161007210034_cmdcds")] + partial class cmdcds + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.0.0-rtm-21431"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ItemId"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("BlacklistItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BufferSize"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DontJoinServers"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("MigrationVersion"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.HasKey("Id"); + + b.ToTable("BotConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BaseDestroyed"); + + b.Property("CallUser"); + + b.Property("ClashWarId"); + + b.Property("Stars"); + + b.Property("TimeAdded"); + + b.HasKey("Id"); + + b.HasIndex("ClashWarId"); + + b.ToTable("ClashCallers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("EnemyClan"); + + b.Property("GuildId"); + + b.Property("Size"); + + b.Property("StartedAt"); + + b.Property("WarState"); + + b.HasKey("Id"); + + b.ToTable("ClashOfClans"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CommandName"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("InternalTrigger"); + + b.Property("Modifier"); + + b.Property("UnitType"); + + b.HasKey("Id"); + + b.ToTable("ConversionUnits"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("Name"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Donators"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("EightBallResponses"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildConfigId1"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.HasIndex("GuildConfigId1"); + + b.ToTable("FilterChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildConfigId"); + + b.Property("Word"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("LastStatus"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GenerateCurrencyChannelId"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("LogSettingId"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("VerbosePermissions"); + + b.Property("VoicePlusTextEnabled"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.HasIndex("LogSettingId"); + + b.HasIndex("RootPermissionId"); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredLogChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredVoicePresenceCHannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelCreated"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("IsLogging"); + + b.Property("LogUserPresence"); + + b.Property("LogVoicePresence"); + + b.Property("MessageDeleted"); + + b.Property("MessageUpdated"); + + b.Property("UserBanned"); + + b.Property("UserJoined"); + + b.Property("UserLeft"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUpdated"); + + b.Property("VoicePresenceChannelId"); + + b.HasKey("Id"); + + b.ToTable("LogSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ModuleName"); + + b.Property("Prefix"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("ModulePrefixes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("AuthorId"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("NextId"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Status"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("PlayingStatus"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("MusicPlaylistId"); + + b.Property("Provider"); + + b.Property("ProviderType"); + + b.Property("Query"); + + b.Property("Title"); + + b.Property("Uri"); + + b.HasKey("Id"); + + b.HasIndex("MusicPlaylistId"); + + b.ToTable("PlaylistSong"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuthorId"); + + b.Property("AuthorName") + .IsRequired(); + + b.Property("GuildId"); + + b.Property("Keyword") + .IsRequired(); + + b.Property("Text") + .IsRequired(); + + b.HasKey("Id"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Icon"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("RaceAnimals"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("IsPrivate"); + + b.Property("Message"); + + b.Property("ServerId"); + + b.Property("UserId"); + + b.Property("When"); + + b.HasKey("Id"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Repeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId") + .IsUnique(); + + b.ToTable("Repeaters"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.TypingArticle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.ToTable("TypingArticles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("Blacklist") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar") + .WithMany("Bases") + .HasForeignKey("ClashWarId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("EightBallResponses") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId"); + + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId1"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany() + .HasForeignKey("LogSettingId"); + + b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission") + .WithMany() + .HasForeignKey("RootPermissionId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("LogSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredVoicePresenceChannelIds") + .HasForeignKey("LogSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig", "BotConfig") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RotatingStatusMessages") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RaceAnimals") + .HasForeignKey("BotConfigId"); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20161007210034_cmdcds.cs b/src/NadekoBot/Migrations/20161007210034_cmdcds.cs new file mode 100644 index 00000000..cbed2902 --- /dev/null +++ b/src/NadekoBot/Migrations/20161007210034_cmdcds.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class cmdcds : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CommandCooldown", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + CommandName = table.Column(nullable: true), + GuildConfigId = table.Column(nullable: true), + Seconds = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CommandCooldown", x => x.Id); + table.ForeignKey( + name: "FK_CommandCooldown_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_CommandCooldown_GuildConfigId", + table: "CommandCooldown", + column: "GuildConfigId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CommandCooldown"); + } + } +} diff --git a/src/NadekoBot/Migrations/20161008022813_customreactions.Designer.cs b/src/NadekoBot/Migrations/20161008022813_customreactions.Designer.cs new file mode 100644 index 00000000..ca6a19c5 --- /dev/null +++ b/src/NadekoBot/Migrations/20161008022813_customreactions.Designer.cs @@ -0,0 +1,755 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database.Impl; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoSqliteContext))] + [Migration("20161008022813_customreactions")] + partial class customreactions + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.0.0-rtm-21431"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ItemId"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("BlacklistItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BufferSize"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DontJoinServers"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("MigrationVersion"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.HasKey("Id"); + + b.ToTable("BotConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BaseDestroyed"); + + b.Property("CallUser"); + + b.Property("ClashWarId"); + + b.Property("Stars"); + + b.Property("TimeAdded"); + + b.HasKey("Id"); + + b.HasIndex("ClashWarId"); + + b.ToTable("ClashCallers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("EnemyClan"); + + b.Property("GuildId"); + + b.Property("Size"); + + b.Property("StartedAt"); + + b.Property("WarState"); + + b.HasKey("Id"); + + b.ToTable("ClashOfClans"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CommandName"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("InternalTrigger"); + + b.Property("Modifier"); + + b.Property("UnitType"); + + b.HasKey("Id"); + + b.ToTable("ConversionUnits"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildId"); + + b.Property("IsRegex"); + + b.Property("Response"); + + b.Property("Trigger"); + + b.HasKey("Id"); + + b.ToTable("CustomReactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("Name"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Donators"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("EightBallResponses"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildConfigId1"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.HasIndex("GuildConfigId1"); + + b.ToTable("FilterChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildConfigId"); + + b.Property("Word"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("LastStatus"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GenerateCurrencyChannelId"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("LogSettingId"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("VerbosePermissions"); + + b.Property("VoicePlusTextEnabled"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.HasIndex("LogSettingId"); + + b.HasIndex("RootPermissionId"); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredLogChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredVoicePresenceCHannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelCreated"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("IsLogging"); + + b.Property("LogUserPresence"); + + b.Property("LogVoicePresence"); + + b.Property("MessageDeleted"); + + b.Property("MessageUpdated"); + + b.Property("UserBanned"); + + b.Property("UserJoined"); + + b.Property("UserLeft"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUpdated"); + + b.Property("VoicePresenceChannelId"); + + b.HasKey("Id"); + + b.ToTable("LogSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ModuleName"); + + b.Property("Prefix"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("ModulePrefixes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("AuthorId"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("NextId"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Status"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("PlayingStatus"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("MusicPlaylistId"); + + b.Property("Provider"); + + b.Property("ProviderType"); + + b.Property("Query"); + + b.Property("Title"); + + b.Property("Uri"); + + b.HasKey("Id"); + + b.HasIndex("MusicPlaylistId"); + + b.ToTable("PlaylistSong"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuthorId"); + + b.Property("AuthorName") + .IsRequired(); + + b.Property("GuildId"); + + b.Property("Keyword") + .IsRequired(); + + b.Property("Text") + .IsRequired(); + + b.HasKey("Id"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Icon"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("RaceAnimals"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("IsPrivate"); + + b.Property("Message"); + + b.Property("ServerId"); + + b.Property("UserId"); + + b.Property("When"); + + b.HasKey("Id"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Repeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId") + .IsUnique(); + + b.ToTable("Repeaters"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.TypingArticle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.ToTable("TypingArticles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("Blacklist") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar") + .WithMany("Bases") + .HasForeignKey("ClashWarId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("EightBallResponses") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId"); + + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId1"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany() + .HasForeignKey("LogSettingId"); + + b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission") + .WithMany() + .HasForeignKey("RootPermissionId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("LogSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredVoicePresenceChannelIds") + .HasForeignKey("LogSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig", "BotConfig") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RotatingStatusMessages") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RaceAnimals") + .HasForeignKey("BotConfigId"); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20161008022813_customreactions.cs b/src/NadekoBot/Migrations/20161008022813_customreactions.cs new file mode 100644 index 00000000..7531b628 --- /dev/null +++ b/src/NadekoBot/Migrations/20161008022813_customreactions.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class customreactions : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CustomReactions", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Autoincrement", true), + GuildId = table.Column(nullable: true), + IsRegex = table.Column(nullable: false), + Response = table.Column(nullable: true), + Trigger = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CustomReactions", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CustomReactions"); + } + } +} diff --git a/src/NadekoBot/Migrations/20161009041508_second.Designer.cs b/src/NadekoBot/Migrations/20161009041508_second.Designer.cs new file mode 100644 index 00000000..25a7fb06 --- /dev/null +++ b/src/NadekoBot/Migrations/20161009041508_second.Designer.cs @@ -0,0 +1,757 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database.Impl; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoSqliteContext))] + [Migration("20161009041508_second")] + partial class second + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.0.0-rtm-21431"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ItemId"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("BlacklistItem"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BufferSize"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DontJoinServers"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("MigrationVersion"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.HasKey("Id"); + + b.ToTable("BotConfig"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BaseDestroyed"); + + b.Property("CallUser"); + + b.Property("ClashWarId"); + + b.Property("Stars"); + + b.Property("TimeAdded"); + + b.HasKey("Id"); + + b.HasIndex("ClashWarId"); + + b.ToTable("ClashCallers"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashWar", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("EnemyClan"); + + b.Property("GuildId"); + + b.Property("Size"); + + b.Property("StartedAt"); + + b.Property("WarState"); + + b.HasKey("Id"); + + b.ToTable("ClashOfClans"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CommandName"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("InternalTrigger"); + + b.Property("Modifier"); + + b.Property("UnitType"); + + b.HasKey("Id"); + + b.ToTable("ConversionUnits"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Currency", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildId"); + + b.Property("IsRegex"); + + b.Property("OwnerOnly"); + + b.Property("Response"); + + b.Property("Trigger"); + + b.HasKey("Id"); + + b.ToTable("CustomReactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("Name"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Donators"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("EightBallResponses"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildConfigId1"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.HasIndex("GuildConfigId1"); + + b.ToTable("FilterChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildConfigId"); + + b.Property("Word"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("LastStatus"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GenerateCurrencyChannelId"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("LogSettingId"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("VerbosePermissions"); + + b.Property("VoicePlusTextEnabled"); + + b.HasKey("Id"); + + b.HasIndex("GuildId") + .IsUnique(); + + b.HasIndex("LogSettingId"); + + b.HasIndex("RootPermissionId"); + + b.ToTable("GuildConfigs"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredLogChannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("LogSettingId"); + + b.HasKey("Id"); + + b.HasIndex("LogSettingId"); + + b.ToTable("IgnoredVoicePresenceCHannels"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.LogSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelCreated"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("IsLogging"); + + b.Property("LogUserPresence"); + + b.Property("LogVoicePresence"); + + b.Property("MessageDeleted"); + + b.Property("MessageUpdated"); + + b.Property("UserBanned"); + + b.Property("UserJoined"); + + b.Property("UserLeft"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUpdated"); + + b.Property("VoicePresenceChannelId"); + + b.HasKey("Id"); + + b.ToTable("LogSettings"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("ModuleName"); + + b.Property("Prefix"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("ModulePrefixes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("AuthorId"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("NextId"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Status"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("PlayingStatus"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("MusicPlaylistId"); + + b.Property("Provider"); + + b.Property("ProviderType"); + + b.Property("Query"); + + b.Property("Title"); + + b.Property("Uri"); + + b.HasKey("Id"); + + b.HasIndex("MusicPlaylistId"); + + b.ToTable("PlaylistSong"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuthorId"); + + b.Property("AuthorName") + .IsRequired(); + + b.Property("GuildId"); + + b.Property("Keyword") + .IsRequired(); + + b.Property("Text") + .IsRequired(); + + b.HasKey("Id"); + + b.ToTable("Quotes"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("Icon"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.ToTable("RaceAnimals"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Reminder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("IsPrivate"); + + b.Property("Message"); + + b.Property("ServerId"); + + b.Property("UserId"); + + b.Property("When"); + + b.HasKey("Id"); + + b.ToTable("Reminders"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Repeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("ChannelId") + .IsUnique(); + + b.ToTable("Repeaters"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.TypingArticle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("Text"); + + b.HasKey("Id"); + + b.ToTable("TypingArticles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("Blacklist") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => + { + b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar") + .WithMany("Bases") + .HasForeignKey("ClashWarId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("EightBallResponses") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId"); + + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId1"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FollowedStreams") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany() + .HasForeignKey("LogSettingId"); + + b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission") + .WithMany() + .HasForeignKey("RootPermissionId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("LogSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredVoicePresenceChannel", b => + { + b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") + .WithMany("IgnoredVoicePresenceChannelIds") + .HasForeignKey("LogSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ModulePrefix", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig", "BotConfig") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RotatingStatusMessages") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("RaceAnimals") + .HasForeignKey("BotConfigId"); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20161009041508_second.cs b/src/NadekoBot/Migrations/20161009041508_second.cs new file mode 100644 index 00000000..0d02f292 --- /dev/null +++ b/src/NadekoBot/Migrations/20161009041508_second.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class second : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "OwnerOnly", + table: "CustomReactions", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "OwnerOnly", + table: "CustomReactions"); + } + } +} diff --git a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs index 92d2ea09..0acf0498 100644 --- a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs +++ b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs @@ -24,6 +24,8 @@ namespace NadekoBot.Migrations b.Property("ItemId"); + b.Property("Type"); + b.HasKey("Id"); b.HasIndex("BotConfigId"); @@ -48,12 +50,18 @@ namespace NadekoBot.Migrations b.Property("CurrencySign"); + b.Property("DMHelpString"); + b.Property("DontJoinServers"); b.Property("ForwardMessages"); b.Property("ForwardToAllOwners"); + b.Property("HelpString"); + + b.Property("MigrationVersion"); + b.Property("RemindMessageFormat"); b.Property("RotatingStatuses"); @@ -107,6 +115,24 @@ namespace NadekoBot.Migrations b.ToTable("ClashOfClans"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CommandName"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => { b.Property("Id") @@ -140,6 +166,26 @@ namespace NadekoBot.Migrations b.ToTable("Currency"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildId"); + + b.Property("IsRegex"); + + b.Property("OwnerOnly"); + + b.Property("Response"); + + b.Property("Trigger"); + + b.HasKey("Id"); + + b.ToTable("CustomReactions"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => { b.Property("Id") @@ -175,6 +221,42 @@ namespace NadekoBot.Migrations b.ToTable("EightBallResponses"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("GuildConfigId"); + + b.Property("GuildConfigId1"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.HasIndex("GuildConfigId1"); + + b.ToTable("FilterChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("GuildConfigId"); + + b.Property("Word"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FilteredWord"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => { b.Property("Id") @@ -228,6 +310,10 @@ namespace NadekoBot.Migrations b.Property("ExclusiveSelfAssignedRoles"); + b.Property("FilterInvites"); + + b.Property("FilterWords"); + b.Property("GenerateCurrencyChannelId"); b.Property("GreetMessageChannelId"); @@ -236,12 +322,18 @@ namespace NadekoBot.Migrations b.Property("LogSettingId"); + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + b.Property("SendChannelByeMessage"); b.Property("SendChannelGreetMessage"); b.Property("SendDmGreetMessage"); + b.Property("VerbosePermissions"); + b.Property("VoicePlusTextEnabled"); b.HasKey("Id"); @@ -251,6 +343,8 @@ namespace NadekoBot.Migrations b.HasIndex("LogSettingId"); + b.HasIndex("RootPermissionId"); + b.ToTable("GuildConfigs"); }); @@ -307,8 +401,6 @@ namespace NadekoBot.Migrations b.Property("MessageDeleted"); - b.Property("MessageReceived"); - b.Property("MessageUpdated"); b.Property("UserBanned"); @@ -348,6 +440,47 @@ namespace NadekoBot.Migrations b.ToTable("ModulePrefixes"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.MusicPlaylist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Author"); + + b.Property("AuthorId"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("NextId"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("NextId") + .IsUnique(); + + b.ToTable("Permission"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => { b.Property("Id") @@ -364,6 +497,30 @@ namespace NadekoBot.Migrations b.ToTable("PlayingStatus"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("MusicPlaylistId"); + + b.Property("Provider"); + + b.Property("ProviderType"); + + b.Property("Query"); + + b.Property("Title"); + + b.Property("Uri"); + + b.HasKey("Id"); + + b.HasIndex("MusicPlaylistId"); + + b.ToTable("PlaylistSong"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.Quote", b => { b.Property("Id") @@ -494,6 +651,13 @@ namespace NadekoBot.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandCooldowns") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.EightBallResponse", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") @@ -501,6 +665,24 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilterChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterInvitesChannelIds") + .HasForeignKey("GuildConfigId"); + + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilterWordsChannelIds") + .HasForeignKey("GuildConfigId1"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.FilteredWord", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("FilteredWords") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.FollowedStream", b => { b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") @@ -513,6 +695,10 @@ namespace NadekoBot.Migrations b.HasOne("NadekoBot.Services.Database.Models.LogSetting", "LogSetting") .WithMany() .HasForeignKey("LogSettingId"); + + b.HasOne("NadekoBot.Services.Database.Models.Permission", "RootPermission") + .WithMany() + .HasForeignKey("RootPermissionId"); }); modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => @@ -537,6 +723,13 @@ namespace NadekoBot.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.HasOne("NadekoBot.Services.Database.Models.Permission", "Next") + .WithOne("Previous") + .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") @@ -544,6 +737,14 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlaylistSong", b => + { + b.HasOne("NadekoBot.Services.Database.Models.MusicPlaylist") + .WithMany("Songs") + .HasForeignKey("MusicPlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.RaceAnimal", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") diff --git a/src/NadekoBot/Modules/Administration/Administration.cs b/src/NadekoBot/Modules/Administration/Administration.cs index 2d62e236..0231f8d4 100644 --- a/src/NadekoBot/Modules/Administration/Administration.cs +++ b/src/NadekoBot/Modules/Administration/Administration.cs @@ -13,13 +13,16 @@ using System.Text.RegularExpressions; using Discord.WebSocket; using NadekoBot.Services.Database; using NadekoBot.Services.Database.Models; +using System.Net.Http; +using ImageProcessorCore; +using System.IO; namespace NadekoBot.Modules.Administration { [NadekoModule("Administration", ".")] public partial class Administration : DiscordModule { - public Administration(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + public Administration(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { NadekoBot.CommandHandler.CommandExecuted += DelMsgOnCmd_Handler; } @@ -39,7 +42,7 @@ namespace NadekoBot.Modules.Administration } if (shouldDelete) - await e.Message.DeleteAsync(); + await e.Message.DeleteAsync().ConfigureAwait(false); } catch (Exception ex) { @@ -47,20 +50,23 @@ namespace NadekoBot.Modules.Administration } } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Restart(IUserMessage umsg) - //{ - // var channel = (ITextChannel)umsg.Channel; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Restart(IUserMessage umsg) + { + var channel = (ITextChannel)umsg.Channel; - // await channel.SendMessageAsync("`Restarting in 2 seconds...`"); - // await Task.Delay(2000); - // System.Diagnostics.Process.Start(System.Reflection.Assembly.GetEntryAssembly().Location); - // Environment.Exit(0); - //} + await channel.SendMessageAsync("`Restarting in 2 seconds...`").ConfigureAwait(false); + await Task.Delay(2000).ConfigureAwait(false); + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo + { + Arguments = "dotnet " + System.Reflection.Assembly.GetEntryAssembly().Location + }); + Environment.Exit(0); + } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.Administrator)] public async Task Delmsgoncmd(IUserMessage umsg) @@ -75,12 +81,12 @@ namespace NadekoBot.Modules.Administration await uow.CompleteAsync(); } if (conf.DeleteMessageOnCommand) - await channel.SendMessageAsync("❗`Now automatically deleting successfull command invokations.`"); + await channel.SendMessageAsync("❗`Now automatically deleting successfull command invokations.`").ConfigureAwait(false); else - await channel.SendMessageAsync("❗`Stopped automatic deletion of successfull command invokations.`"); + await channel.SendMessageAsync("❗`Stopped automatic deletion of successfull command invokations.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Setrole(IUserMessage umsg, IGuildUser usr, [Remainder] IRole role) @@ -98,7 +104,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Removerole(IUserMessage umsg, IGuildUser usr, [Remainder] IRole role) @@ -115,7 +121,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task RenameRole(IUserMessage umsg, IRole roleToEdit, string newname) @@ -137,7 +143,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task RemoveAllRoles(IUserMessage umsg, [Remainder] IGuildUser user) @@ -155,7 +161,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task CreateRole(IUserMessage umsg, [Remainder] string roleName = null) @@ -176,7 +182,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task RoleColor(IUserMessage umsg, params string[] args) @@ -205,7 +211,7 @@ namespace NadekoBot.Modules.Administration var green = Convert.ToByte(rgb ? int.Parse(args[2]) : Convert.ToInt32(arg1.Substring(2, 2), 16)); var blue = Convert.ToByte(rgb ? int.Parse(args[3]) : Convert.ToInt32(arg1.Substring(4, 2), 16)); - await role.ModifyAsync(r => r.Color = new Color(red, green, blue).RawValue).ConfigureAwait(false); + await role.ModifyAsync(r => r.Color = new Discord.Color(red, green, blue).RawValue).ConfigureAwait(false); await channel.SendMessageAsync($"Role {role.Name}'s color has been changed.").ConfigureAwait(false); } catch (Exception) @@ -214,7 +220,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.BanMembers)] public async Task Ban(IUserMessage umsg, IGuildUser user) @@ -241,7 +247,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.BanMembers)] public async Task Softban(IUserMessage umsg, IGuildUser user, [Remainder] string msg = null) @@ -267,8 +273,9 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.KickMembers)] public async Task Kick(IUserMessage umsg, IGuildUser user, [Remainder] string msg = null) { var channel = (ITextChannel)umsg.Channel; @@ -295,7 +302,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.MuteMembers)] public async Task Mute(IUserMessage umsg, params IGuildUser[] users) @@ -318,7 +325,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.MuteMembers)] public async Task Unmute(IUserMessage umsg, params IGuildUser[] users) @@ -341,7 +348,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.DeafenMembers)] public async Task Deafen(IUserMessage umsg, params IGuildUser[] users) @@ -364,7 +371,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.DeafenMembers)] public async Task UnDeafen(IUserMessage umsg, params IGuildUser[] users) @@ -387,7 +394,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task DelVoiChanl(IUserMessage umsg, [Remainder] IVoiceChannel voiceChannel) @@ -396,7 +403,7 @@ namespace NadekoBot.Modules.Administration await umsg.Channel.SendMessageAsync($"Removed channel **{voiceChannel.Name}**.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task CreatVoiChanl(IUserMessage umsg, [Remainder] string channelName) @@ -406,7 +413,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"Created voice channel **{ch.Name}**, id `{ch.Id}`.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task DelTxtChanl(IUserMessage umsg, [Remainder] ITextChannel channel) @@ -415,7 +422,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"Removed text channel **{channel.Name}**, id `{channel.Id}`.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task CreaTxtChanl(IUserMessage umsg, [Remainder] string channelName) @@ -425,7 +432,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"Added text channel **{txtCh.Name}**, id `{txtCh.Id}`.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task SetTopic(IUserMessage umsg, [Remainder] string topic = null) @@ -436,7 +443,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(":ok: **New channel topic set.**").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] public async Task SetChanlName(IUserMessage umsg, [Remainder] string name) @@ -449,40 +456,35 @@ namespace NadekoBot.Modules.Administration //delets her own messages, no perm required - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Prune(IUserMessage umsg) { var channel = (ITextChannel)umsg.Channel; - var user = await channel.Guild.GetCurrentUserAsync(); + var user = channel.Guild.GetCurrentUser(); var enumerable = (await umsg.Channel.GetMessagesAsync()).Where(x => x.Author.Id == user.Id); await umsg.Channel.DeleteMessagesAsync(enumerable); } // prune x - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(ChannelPermission.ManageMessages)] public async Task Prune(IUserMessage msg, int count) { var channel = (ITextChannel)msg.Channel; await (msg as IUserMessage).DeleteAsync(); - while (count > 0) - { - int limit = (count < 100) ? count : 100; - var enumerable = (await msg.Channel.GetMessagesAsync(limit: limit)); - await msg.Channel.DeleteMessagesAsync(enumerable); - await Task.Delay(1000); // there is a 1 per second per guild ratelimit for deletemessages - if (enumerable.Count < limit) break; - count -= limit; - } + int limit = (count < 100) ? count : 100; + var enumerable = (await msg.Channel.GetMessagesAsync(limit: limit)); + await msg.Channel.DeleteMessagesAsync(enumerable); } //prune @user [x] - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequirePermission(ChannelPermission.ManageMessages)] public async Task Prune(IUserMessage msg, IGuildUser user, int count = 100) { var channel = (ITextChannel)msg.Channel; @@ -490,152 +492,168 @@ namespace NadekoBot.Modules.Administration var enumerable = (await msg.Channel.GetMessagesAsync(limit: limit)).Where(m => m.Author == user); await msg.Channel.DeleteMessagesAsync(enumerable); } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Die(IUserMessage umsg) - //{ - // var channel = (ITextChannel)umsg.Channel; - // await channel.SendMessageAsync("`Shutting down.`").ConfigureAwait(false); - // await Task.Delay(2000).ConfigureAwait(false); - // Environment.Exit(0); - //} + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Die(IUserMessage umsg) + { + var channel = (ITextChannel)umsg.Channel; - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Setname(IUserMessage umsg, [Remainder] string newName = null) - //{ - // var channel = (ITextChannel)umsg.Channel; + try { await channel.SendMessageAsync("`Shutting down.`").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } + await Task.Delay(2000).ConfigureAwait(false); + Environment.Exit(0); + } - //} + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Setname(IUserMessage umsg, [Remainder] string newName) + { + var channel = (ITextChannel)umsg.Channel; + if (string.IsNullOrWhiteSpace(newName)) + return; - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task NewAvatar(IUserMessage umsg, [Remainder] string img = null) - //{ - // var channel = (ITextChannel)umsg.Channel; + await NadekoBot.Client.GetCurrentUser().ModifyAsync(u => u.Username = newName).ConfigureAwait(false); - // if (string.IsNullOrWhiteSpace(img)) - // return; - // // Gather user provided URL. - // var avatarAddress = img; - // var imageStream = await SearchHelper.GetResponseStreamAsync(avatarAddress).ConfigureAwait(false); - // var image = System.Drawing.Image.FromStream(imageStream); - // await client.CurrentUser.Edit("", avatar: image.ToStream()).ConfigureAwait(false); + await channel.SendMessageAsync($"Successfully changed name to {newName}").ConfigureAwait(false); + } - // // Send confirm. - // await channel.SendMessageAsync("New avatar set.").ConfigureAwait(false); - //} + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task SetAvatar(IUserMessage umsg, [Remainder] string img = null) + { + var channel = (ITextChannel)umsg.Channel; - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task SetGame(IUserMessage umsg, [Remainder] string game = null) - //{ - // var channel = (ITextChannel)umsg.Channel; + if (string.IsNullOrWhiteSpace(img)) + return; - // game = game ?? ""; + using (var http = new HttpClient()) + { + using (var sr = await http.GetStreamAsync(img)) + { + var imgStream = new MemoryStream(); + await sr.CopyToAsync(imgStream); + imgStream.Position = 0; - // client.SetGame(set_game); - //} + await NadekoBot.Client.GetCurrentUser().ModifyAsync(u => u.Avatar = imgStream).ConfigureAwait(false); + } + } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Send(IUserMessage umsg, string where, [Remainder] string msg = null) - //{ - // var channel = (ITextChannel)umsg.Channel; + await channel.SendMessageAsync("New avatar set.").ConfigureAwait(false); + } - // if (string.IsNullOrWhiteSpace(msg)) - // return; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task SetGame(IUserMessage umsg, [Remainder] string game = null) + { + var channel = (ITextChannel)umsg.Channel; - // var ids = where.Split('|'); - // if (ids.Length != 2) - // return; - // var sid = ulong.Parse(ids[0]); - // var server = NadekoBot.Client.Servers.Where(s => s.Id == sid).FirstOrDefault(); + game = game ?? ""; - // if (server == null) - // return; + await NadekoBot.Client.GetCurrentUser().ModifyStatusAsync(u => u.Game = new Game(game)).ConfigureAwait(false); - // if (ids[1].ToUpperInvariant().StartsWith("C:")) - // { - // var cid = ulong.Parse(ids[1].Substring(2)); - // var channel = server.TextChannels.Where(c => c.Id == cid).FirstOrDefault(); - // if (channel == null) - // { - // return; - // } - // await channel.SendMessageAsync(msg); - // } - // else if (ids[1].ToUpperInvariant().StartsWith("U:")) - // { - // var uid = ulong.Parse(ids[1].Substring(2)); - // var user = server.Users.Where(u => u.Id == uid).FirstOrDefault(); - // if (user == null) - // { - // return; - // } - // await user.SendMessageAsync(msg); - // } - // else - // { - // await channel.SendMessageAsync("`Invalid format.`"); - // } - //} + await channel.SendMessageAsync("New game set.").ConfigureAwait(false); + } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Announce(IUserMessage umsg, [Remainder] string message) - //{ - // var channel = (ITextChannel)umsg.Channel; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Send(IUserMessage umsg, string where, [Remainder] string msg = null) + { + var channel = (ITextChannel)umsg.Channel; - // foreach (var ch in (await _client.GetGuildsAsync().ConfigureAwait(false)).Select(async g => await g.GetDefaultChannelAsync().ConfigureAwait(false))) - // { - // await channel.SendMessageAsync(message).ConfigureAwait(false); - // } + if (string.IsNullOrWhiteSpace(msg)) + return; - // await channel.SendMessageAsync(":ok:").ConfigureAwait(false); - //} + var ids = where.Split('|'); + if (ids.Length != 2) + return; + var sid = ulong.Parse(ids[0]); + var server = NadekoBot.Client.GetGuilds().Where(s => s.Id == sid).FirstOrDefault(); - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task SaveChat(IUserMessage umsg, int cnt) - //{ - // var channel = (ITextChannel)umsg.Channel; + if (server == null) + return; - // ulong? lastmsgId = null; - // var sb = new StringBuilder(); - // var msgs = new List(cnt); - // while (cnt > 0) - // { - // var dlcnt = cnt < 100 ? cnt : 100; - // IReadOnlyCollection dledMsgs; - // if (lastmsgId == null) - // dledMsgs = await umsg.Channel.GetMessagesAsync(cnt).ConfigureAwait(false); - // else - // dledMsgs = await umsg.Channel.GetMessagesAsync(lastmsgId.Value, Direction.Before, dlcnt); + if (ids[1].ToUpperInvariant().StartsWith("C:")) + { + var cid = ulong.Parse(ids[1].Substring(2)); + var ch = server.GetTextChannels().Where(c => c.Id == cid).FirstOrDefault(); + if (ch == null) + { + return; + } + await ch.SendMessageAsync(msg).ConfigureAwait(false); + } + else if (ids[1].ToUpperInvariant().StartsWith("U:")) + { + var uid = ulong.Parse(ids[1].Substring(2)); + var user = server.GetUsers().Where(u => u.Id == uid).FirstOrDefault(); + if (user == null) + { + return; + } + await user.SendMessageAsync(msg).ConfigureAwait(false); + } + else + { + await channel.SendMessageAsync("`Invalid format.`").ConfigureAwait(false); + } + } - // if (!dledMsgs.Any()) - // break; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Announce(IUserMessage umsg, [Remainder] string message) + { + var channel = (ITextChannel)umsg.Channel; - // msgs.AddRange(dledMsgs); - // lastmsgId = msgs[msgs.Count - 1].Id; - // cnt -= 100; - // } - // var title = $"Chatlog-{channel.Guild.Name}/#{channel.Name}-{DateTime.Now}.txt"; - // await (umsg.Author as IGuildUser).SendFileAsync( - // await JsonConvert.SerializeObject(new { Messages = msgs.Select(s => s.ToString()) }, Formatting.Indented).ToStream().ConfigureAwait(false), - // title, title).ConfigureAwait(false); - //} + var channels = await Task.WhenAll(_client.GetGuilds().Select(g => + g.GetDefaultChannelAsync() + )).ConfigureAwait(false); + + await Task.WhenAll(channels.Select(c => c.SendMessageAsync($"`Message from {umsg.Author} (Bot Owner):` " + message))) + .ConfigureAwait(false); + + await channel.SendMessageAsync(":ok:").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task SaveChat(IUserMessage umsg, int cnt) + { + var channel = (ITextChannel)umsg.Channel; + + ulong? lastmsgId = null; + var sb = new StringBuilder(); + var msgs = new List(cnt); + while (cnt > 0) + { + var dlcnt = cnt < 100 ? cnt : 100; + IReadOnlyCollection dledMsgs; + if (lastmsgId == null) + dledMsgs = await umsg.Channel.GetMessagesAsync(cnt).ConfigureAwait(false); + else + dledMsgs = await umsg.Channel.GetMessagesAsync(lastmsgId.Value, Direction.Before, dlcnt); + + if (!dledMsgs.Any()) + break; + + msgs.AddRange(dledMsgs); + lastmsgId = msgs[msgs.Count - 1].Id; + cnt -= 100; + } + var title = $"Chatlog-{channel.Guild.Name}/#{channel.Name}-{DateTime.Now}.txt"; + await (umsg.Author as IGuildUser).SendFileAsync( + await JsonConvert.SerializeObject(new { Messages = msgs.Select(s => s.ToString()) }, Formatting.Indented).ToStream().ConfigureAwait(false), + title, title).ConfigureAwait(false); + } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.MentionEveryone)] public async Task MentionRole(IUserMessage umsg, params IRole[] roles) @@ -660,7 +678,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(send).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Donators(IUserMessage umsg) { @@ -676,8 +694,9 @@ namespace NadekoBot.Modules.Administration } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task Donadd(IUserMessage umsg, IUser donator, int amount) { var channel = (ITextChannel)umsg.Channel; diff --git a/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs b/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs index 1cde1716..968f9dd9 100644 --- a/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/AutoAssignRoleCommands.cs @@ -42,7 +42,7 @@ namespace NadekoBot.Modules.Administration }; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task AutoAssignRole(IUserMessage umsg, [Remainder] IRole role = null) diff --git a/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs b/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs index 36b00e9e..b6f3a612 100644 --- a/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs +++ b/src/NadekoBot/Modules/Administration/Commands/CrossServerTextChannel.cs @@ -3,6 +3,8 @@ using Discord.Commands; using Discord.WebSocket; using NadekoBot.Attributes; using NadekoBot.Extensions; +using NadekoBot.Services; +using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -18,8 +20,12 @@ namespace NadekoBot.Modules.Administration { public CrossServerTextChannel() { + _log = LogManager.GetCurrentClassLogger(); NadekoBot.Client.MessageReceived += (imsg) => { + if (imsg.Author.IsBot) + return Task.CompletedTask; + var msg = imsg as IUserMessage; if (msg == null) return Task.CompletedTask; @@ -30,8 +36,6 @@ namespace NadekoBot.Modules.Administration Task.Run(async () => { - try - { if (msg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return; foreach (var subscriber in Subscribers) { @@ -40,11 +44,9 @@ namespace NadekoBot.Modules.Administration continue; foreach (var chan in set.Except(new[] { channel })) { - await chan.SendMessageAsync(GetText(channel.Guild, channel, (IGuildUser)msg.Author, msg)).ConfigureAwait(false); + try { await chan.SendMessageAsync(GetText(channel.Guild, channel, (IGuildUser)msg.Author, msg)).ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } } } - } - catch { } }); return Task.CompletedTask; }; @@ -52,39 +54,40 @@ namespace NadekoBot.Modules.Administration private string GetText(IGuild server, ITextChannel channel, IGuildUser user, IUserMessage message) => $"**{server.Name} | {channel.Name}** `{user.Username}`: " + message.Content; + + public static readonly ConcurrentDictionary> Subscribers = new ConcurrentDictionary>(); + private Logger _log { get; } - public static readonly ConcurrentDictionary> Subscribers = new ConcurrentDictionary>(); + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Scsc(IUserMessage msg) + { + var channel = (ITextChannel)msg.Channel; + var token = new NadekoRandom().Next(); + var set = new ConcurrentHashSet(); + if (Subscribers.TryAdd(token, set)) + { + set.Add(channel); + await ((IGuildUser)msg.Author).SendMessageAsync("This is your CSC token:" + token.ToString()).ConfigureAwait(false); + } + } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Scsc(IUserMessage msg) - //{ - // var channel = (ITextChannel)msg.Channel; - // var token = new NadekoRandom().Next(); - // var set = new HashSet(); - // if (Subscribers.TryAdd(token, set)) - // { - // set.Add(channel); - // await ((IGuildUser)msg.Author).SendMessageAsync("This is your CSC token:" + token.ToString()).ConfigureAwait(false); - // } - //} - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task Jcsc(IUserMessage imsg, int token) { var channel = (ITextChannel)imsg.Channel; - HashSet set; + ConcurrentHashSet set; if (!Subscribers.TryGetValue(token, out set)) return; set.Add(channel); await channel.SendMessageAsync(":ok:").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task Lcsc(IUserMessage imsg) @@ -93,7 +96,7 @@ namespace NadekoBot.Modules.Administration foreach (var subscriber in Subscribers) { - subscriber.Value.Remove(channel); + subscriber.Value.TryRemove(channel); } await channel.SendMessageAsync(":ok:").ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs index 6cff7855..890a6302 100644 --- a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs @@ -22,7 +22,7 @@ namespace NadekoBot.Modules.Administration [Group] public class LogCommands { - private DiscordSocketClient _client { get; } + private ShardedDiscordClient _client { get; } private Logger _log { get; } private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; @@ -33,7 +33,7 @@ namespace NadekoBot.Modules.Administration private Timer t; private IGoogleApiService _google { get; } - public LogCommands(DiscordSocketClient client, IGoogleApiService google) + public LogCommands(ShardedDiscordClient client, IGoogleApiService google) { _client = client; _google = google; @@ -60,7 +60,7 @@ namespace NadekoBot.Modules.Administration }, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); - _client.MessageReceived += _client_MessageReceived; + //_client.MessageReceived += _client_MessageReceived; _client.MessageUpdated += _client_MessageUpdated; _client.MessageDeleted += _client_MessageDeleted; _client.UserBanned += _client_UserBanned; @@ -168,7 +168,7 @@ namespace NadekoBot.Modules.Administration var task = Task.Run(async () => { - await logChannel.SendMessageAsync($"❗`{prettyCurrentTime}` `{(ch is IVoiceChannel ? "Voice" : "Text")} Channel Deleted:` **#{ch.Name}** ({ch.Id})").ConfigureAwait(false); + try { await logChannel.SendMessageAsync($"❗`{prettyCurrentTime}` `{(ch is IVoiceChannel ? "Voice" : "Text")} Channel Deleted:` **#{ch.Name}** ({ch.Id})").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; @@ -192,7 +192,7 @@ namespace NadekoBot.Modules.Administration var task = Task.Run(async () => { - await logChannel.SendMessageAsync($"`{prettyCurrentTime}`🆕`{(ch is IVoiceChannel ? "Voice" : "Text")} Channel Created:` **#{ch.Name}** ({ch.Id})").ConfigureAwait(false); + try { await logChannel.SendMessageAsync($"`{prettyCurrentTime}`🆕`{(ch is IVoiceChannel ? "Voice" : "Text")} Channel Created:` **#{ch.Name}** ({ch.Id})").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; @@ -275,7 +275,7 @@ namespace NadekoBot.Modules.Administration var task = Task.Run(async () => { - await logChannel.SendMessageAsync($"`{prettyCurrentTime}`❗`User left:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); + try { await logChannel.SendMessageAsync($"`{prettyCurrentTime}`❗`User left:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; @@ -295,7 +295,7 @@ namespace NadekoBot.Modules.Administration var task = Task.Run(async () => { - await logChannel.SendMessageAsync($"`{prettyCurrentTime}`❗`User joined:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); + try { await logChannel.SendMessageAsync($"`{prettyCurrentTime}`❗`User joined:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; @@ -315,7 +315,7 @@ namespace NadekoBot.Modules.Administration var task = Task.Run(async () => { - await logChannel.SendMessageAsync($"`{prettyCurrentTime}`♻`User unbanned:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); + try { await logChannel.SendMessageAsync($"`{prettyCurrentTime}`♻`User unbanned:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; @@ -335,7 +335,7 @@ namespace NadekoBot.Modules.Administration var task = Task.Run(async () => { - await logChannel.SendMessageAsync($"❗`{prettyCurrentTime}`❌`User banned:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); + try { await logChannel.SendMessageAsync($"❗`{prettyCurrentTime}`❌`User banned:` **{usr.Username}** ({usr.Id})").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; @@ -399,46 +399,46 @@ namespace NadekoBot.Modules.Administration var task = Task.Run(async () => { - await logChannel.SendMessageAsync($@"🕔`{prettyCurrentTime}` **Message** 📝 `#{channel.Name}` + try { await logChannel.SendMessageAsync($@"🕔`{prettyCurrentTime}` **Message** 📝 `#{channel.Name}` 👤`{before.Author.Username}` `Old:` {before.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)} - `New:` {after.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)}").ConfigureAwait(false); + `New:` {after.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)}").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; } - private Task _client_MessageReceived(IMessage imsg) - { - var msg = imsg as IUserMessage; - if (msg == null || msg.IsAuthor()) - return Task.CompletedTask; +// private Task _client_MessageReceived(IMessage imsg) +// { +// var msg = imsg as IUserMessage; +// if (msg == null || msg.IsAuthor()) +// return Task.CompletedTask; - var channel = msg.Channel as ITextChannel; - if (channel == null) - return Task.CompletedTask; +// var channel = msg.Channel as ITextChannel; +// if (channel == null) +// return Task.CompletedTask; - LogSetting logSetting; - if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting) - || !logSetting.IsLogging - || !logSetting.MessageReceived) - return Task.CompletedTask; +// LogSetting logSetting; +// if (!GuildLogSettings.TryGetValue(channel.Guild.Id, out logSetting) +// || !logSetting.IsLogging +// || !logSetting.MessageReceived) +// return Task.CompletedTask; - ITextChannel logChannel; - if ((logChannel = TryGetLogChannel(channel.Guild, logSetting)) == null || logChannel.Id == imsg.Channel.Id) - return Task.CompletedTask; +// ITextChannel logChannel; +// if ((logChannel = TryGetLogChannel(channel.Guild, logSetting)) == null || logChannel.Id == imsg.Channel.Id) +// return Task.CompletedTask; - var task = Task.Run(async () => - { - var str = $@"🕔`{prettyCurrentTime}` **New Message** `#{channel.Name}` -👤`{msg.Author.Username}`: {msg.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)}"; - if (msg.Attachments.Any()) - str += $"{Environment.NewLine}`Attachements`: {string.Join(", ", msg.Attachments.Select(a => a.ProxyUrl))}"; - await logChannel.SendMessageAsync(str).ConfigureAwait(false); - }); +// var task = Task.Run(async () => +// { +// var str = $@"🕔`{prettyCurrentTime}` **New Message** `#{channel.Name}` +//👤`{msg.Author.Username}`: {msg.Resolve(userHandling: UserMentionHandling.NameAndDiscriminator)}"; +// if (msg.Attachments.Any()) +// str += $"{Environment.NewLine}`Attachements`: {string.Join(", ", msg.Attachments.Select(a => a.ProxyUrl))}"; +// await logChannel.SendMessageAsync(str).ConfigureAwait(false); +// }); - return Task.CompletedTask; - } +// return Task.CompletedTask; +// } private enum LogChannelType { Text, Voice, UserPresence }; private ITextChannel TryGetLogChannel(IGuild guild, LogSetting logSetting, LogChannelType logChannelType = LogChannelType.Text) @@ -482,8 +482,10 @@ namespace NadekoBot.Modules.Administration return channel; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.Administrator)] + [OwnerOnly] public async Task LogServer(IUserMessage msg) { var channel = (ITextChannel)msg.Channel; @@ -504,8 +506,10 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`Logging disabled.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.Administrator)] + [OwnerOnly] public async Task LogIgnore(IUserMessage imsg) { var channel = (ITextChannel)imsg.Channel; @@ -527,40 +531,41 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"`Logging will no longer ignore {channel.Name} ({channel.Id}) channel.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] - public async Task LogAdd(IUserMessage msg, [Remainder] string eventName) - { - var channel = (ITextChannel)msg.Channel; - //eventName = eventName?.Replace(" ","").ToLowerInvariant(); + //[LocalizedCommand, LocalizedRemarks, LocalizedSummary, LocalizedAlias] + //[RequireContext(ContextType.Guild)] + //[OwnerOnly] + //public async Task LogAdd(IUserMessage msg, [Remainder] string eventName) + //{ + // var channel = (ITextChannel)msg.Channel; + // //eventName = eventName?.Replace(" ","").ToLowerInvariant(); - switch (eventName.ToLowerInvariant()) - { - case "messagereceived": - case "messageupdated": - case "messagedeleted": - case "userjoined": - case "userleft": - case "userbanned": - case "userunbanned": - case "channelcreated": - case "channeldestroyed": - case "channelupdated": - using (var uow = DbHandler.UnitOfWork()) - { - var logSetting = uow.GuildConfigs.For(channel.Guild.Id).LogSetting; - GuildLogSettings.AddOrUpdate(channel.Guild.Id, (id) => logSetting, (id, old) => logSetting); - var prop = logSetting.GetType().GetProperty(eventName); - prop.SetValue(logSetting, true); - await uow.CompleteAsync().ConfigureAwait(false); - } - await channel.SendMessageAsync($"`Now logging {eventName} event.`").ConfigureAwait(false); - break; - default: - await channel.SendMessageAsync($"`Event \"{eventName}\" not found.`").ConfigureAwait(false); - break; - } - } + // switch (eventName.ToLowerInvariant()) + // { + // case "messagereceived": + // case "messageupdated": + // case "messagedeleted": + // case "userjoined": + // case "userleft": + // case "userbanned": + // case "userunbanned": + // case "channelcreated": + // case "channeldestroyed": + // case "channelupdated": + // using (var uow = DbHandler.UnitOfWork()) + // { + // var logSetting = uow.GuildConfigs.For(channel.Guild.Id).LogSetting; + // GuildLogSettings.AddOrUpdate(channel.Guild.Id, (id) => logSetting, (id, old) => logSetting); + // var prop = logSetting.GetType().GetProperty(eventName); + // prop.SetValue(logSetting, true); + // await uow.CompleteAsync().ConfigureAwait(false); + // } + // await channel.SendMessageAsync($"`Now logging {eventName} event.`").ConfigureAwait(false); + // break; + // default: + // await channel.SendMessageAsync($"`Event \"{eventName}\" not found.`").ConfigureAwait(false); + // break; + // } + //} //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] //[RequireContext(ContextType.Guild)] @@ -597,8 +602,9 @@ namespace NadekoBot.Modules.Administration // } //} - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.Administrator)] public async Task UserPresence(IUserMessage imsg) { var channel = (ITextChannel)imsg.Channel; @@ -619,8 +625,9 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($"`Stopped logging user presence updates.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.Administrator)] public async Task VoicePresence(IUserMessage imsg) { var channel = (ITextChannel)imsg.Channel; diff --git a/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs b/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs index 57c5fe9a..0a7ba01d 100644 --- a/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs +++ b/src/NadekoBot/Modules/Administration/Commands/MessageRepeater.cs @@ -5,6 +5,7 @@ using NadekoBot.Attributes; using NadekoBot.Services; using NadekoBot.Services.Database; using NadekoBot.Services.Database.Models; +using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -23,6 +24,8 @@ namespace NadekoBot.Modules.Administration public class RepeatRunner { + private Logger _log { get; } + private CancellationTokenSource source { get; set; } private CancellationToken token { get; set; } public Repeater Repeater { get; } @@ -30,6 +33,7 @@ namespace NadekoBot.Modules.Administration public RepeatRunner(Repeater repeater, ITextChannel channel = null) { + _log = LogManager.GetCurrentClassLogger(); this.Repeater = repeater; this.Channel = channel ?? NadekoBot.Client.GetGuild(repeater.GuildId)?.GetTextChannel(repeater.ChannelId); if (Channel == null) @@ -47,7 +51,7 @@ namespace NadekoBot.Modules.Administration while (!token.IsCancellationRequested) { await Task.Delay(Repeater.Interval, token).ConfigureAwait(false); - await Channel.SendMessageAsync("🔄 " + Repeater.Message).ConfigureAwait(false); + try { await Channel.SendMessageAsync("🔄 " + Repeater.Message).ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } } } catch (OperationCanceledException) { } @@ -73,7 +77,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageMessages)] public async Task RepeatInvoke(IUserMessage imsg) @@ -90,7 +94,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("🔄 " + rep.Repeater.Message).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Repeat(IUserMessage imsg) { @@ -110,7 +114,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`No message is repeating.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Repeat(IUserMessage imsg, int minutes, [Remainder] string message) { diff --git a/src/NadekoBot/Modules/Administration/Commands/Migration.cs b/src/NadekoBot/Modules/Administration/Commands/Migration.cs new file mode 100644 index 00000000..e5f6a7c1 --- /dev/null +++ b/src/NadekoBot/Modules/Administration/Commands/Migration.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using NadekoBot.Services; +using NadekoBot.Services.Database.Models; +using Newtonsoft.Json; +using NLog; +using NadekoBot.Modules.Administration.Commands.Migration; +using System.Collections.Concurrent; + +namespace NadekoBot.Modules.Administration +{ + public partial class Administration + { + [Group] + public class Migration + { + private const int CURRENT_VERSION = 1; + + private Logger _log { get; } + + public Migration() + { + _log = LogManager.GetCurrentClassLogger(); + } + + [NadekoCommand, Usage, Description, Aliases] + [OwnerOnly] + public async Task MigrateData(IUserMessage umsg) + { + var channel = (ITextChannel) umsg.Channel; + + var version = 0; + using (var uow = DbHandler.UnitOfWork()) + { + version = uow.BotConfig.GetOrCreate().MigrationVersion; + } + try + { + for (var i = version; i < CURRENT_VERSION; i++) + { + switch (i) + { + case 0: + await Migrate0_9To1_0(); + break; + } + } + await umsg.Channel.SendMessageAsync("Migration done.").ConfigureAwait(false); + } + catch (MigrationException) + { + await umsg.Channel.SendMessageAsync(":warning: Error while migrating, check logs for more informations.").ConfigureAwait(false); + } + } + + private async Task Migrate0_9To1_0() + { + Config0_9 oldData; + try + { + oldData = JsonConvert.DeserializeObject(File.ReadAllText("./data/config.json")); + } + catch (FileNotFoundException) + { + _log.Warn("config.json not found"); + return; + } + catch (Exception) + { + _log.Error("Unknow error while deserializing file config.json, pls check its integrity, aborting migration"); + throw new MigrationException(); + } + using (var uow = DbHandler.UnitOfWork()) + { + var botConfig = uow.BotConfig.GetOrCreate(); + + //Basic + botConfig.DontJoinServers = oldData.DontJoinServers; + botConfig.ForwardMessages = oldData.ForwardMessages; + botConfig.ForwardToAllOwners = oldData.ForwardToAllOwners; + botConfig.BufferSize = (ulong) oldData.BufferSize; + botConfig.RemindMessageFormat = oldData.RemindMessageFormat; + botConfig.CurrencySign = oldData.CurrencySign; + botConfig.CurrencyName = oldData.CurrencyName; + botConfig.DMHelpString = oldData.DMHelpString; + botConfig.HelpString = oldData.HelpString; + + //messages + botConfig.RotatingStatuses = oldData.IsRotatingStatus; + var messages = new List(); + + oldData.RotatingStatuses.ForEach(i => messages.Add(new PlayingStatus { Status = i })); + botConfig.RotatingStatusMessages = messages; + + //races + var races = new HashSet(); + oldData.RaceAnimals.ForEach(i => races.Add(new RaceAnimal() { Icon = i, Name = i })); + botConfig.RaceAnimals = races; + + //Prefix + var prefix = new HashSet + { + new ModulePrefix() + { + ModuleName = "Administration", + Prefix = oldData.CommandPrefixes.Administration + }, + new ModulePrefix() + { + ModuleName = "Searches", + Prefix = oldData.CommandPrefixes.Searches + }, + new ModulePrefix() {ModuleName = "NSFW", Prefix = oldData.CommandPrefixes.NSFW}, + new ModulePrefix() + { + ModuleName = "Conversations", + Prefix = oldData.CommandPrefixes.Conversations + }, + new ModulePrefix() + { + ModuleName = "ClashOfClans", + Prefix = oldData.CommandPrefixes.ClashOfClans + }, + new ModulePrefix() {ModuleName = "Help", Prefix = oldData.CommandPrefixes.Help}, + new ModulePrefix() {ModuleName = "Music", Prefix = oldData.CommandPrefixes.Music}, + new ModulePrefix() {ModuleName = "Trello", Prefix = oldData.CommandPrefixes.Trello}, + new ModulePrefix() {ModuleName = "Games", Prefix = oldData.CommandPrefixes.Games}, + new ModulePrefix() + { + ModuleName = "Gambling", + Prefix = oldData.CommandPrefixes.Gambling + }, + new ModulePrefix() + { + ModuleName = "Permissions", + Prefix = oldData.CommandPrefixes.Permissions + }, + new ModulePrefix() + { + ModuleName = "Programming", + Prefix = oldData.CommandPrefixes.Programming + }, + new ModulePrefix() {ModuleName = "Pokemon", Prefix = oldData.CommandPrefixes.Pokemon}, + new ModulePrefix() {ModuleName = "Utility", Prefix = oldData.CommandPrefixes.Utility} + }; + botConfig.ModulePrefixes = prefix; + + //Blacklist + var blacklist = oldData.ServerBlacklist.Select(server => new BlacklistItem() {ItemId = server, Type = BlacklistItem.BlacklistType.Server}).ToList(); + blacklist.AddRange(oldData.ChannelBlacklist.Select(channel => new BlacklistItem() {ItemId = channel, Type = BlacklistItem.BlacklistType.Channel})); + blacklist.AddRange(oldData.UserBlacklist.Select(user => new BlacklistItem() {ItemId = user, Type = BlacklistItem.BlacklistType.User})); + botConfig.Blacklist = new HashSet(blacklist); + + //Eightball + botConfig.EightBallResponses = new HashSet(oldData._8BallResponses.Select(response => new EightBallResponse() {Text = response})); + + //NOW save it + botConfig.MigrationVersion = 1; + await uow.CompleteAsync().ConfigureAwait(false); + } + } + } + } +} diff --git a/src/NadekoBot/Modules/Administration/Commands/Migration/0_9..cs b/src/NadekoBot/Modules/Administration/Commands/Migration/0_9..cs new file mode 100644 index 00000000..87a18f9b --- /dev/null +++ b/src/NadekoBot/Modules/Administration/Commands/Migration/0_9..cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Administration.Commands.Migration +{ + public class CommandPrefixes0_9 + { + public string Administration { get; set; } + public string Searches { get; set; } + public string NSFW { get; set; } + public string Conversations { get; set; } + public string ClashOfClans { get; set; } + public string Help { get; set; } + public string Music { get; set; } + public string Trello { get; set; } + public string Games { get; set; } + public string Gambling { get; set; } + public string Permissions { get; set; } + public string Programming { get; set; } + public string Pokemon { get; set; } + public string Utility { get; set; } + } + + public class Config0_9 + { + public bool DontJoinServers { get; set; } + public bool ForwardMessages { get; set; } + public bool ForwardToAllOwners { get; set; } + public bool IsRotatingStatus { get; set; } + public int BufferSize { get; set; } + public List RaceAnimals { get; set; } + public string RemindMessageFormat { get; set; } + public Dictionary> CustomReactions { get; set; } + public List RotatingStatuses { get; set; } + public CommandPrefixes0_9 CommandPrefixes { get; set; } + public List ServerBlacklist { get; set; } + public List ChannelBlacklist { get; set; } + public List UserBlacklist { get; set; } + public List _8BallResponses { get; set; } + public string CurrencySign { get; set; } + public string CurrencyName { get; set; } + public string DMHelpString { get; set; } + public string HelpString { get; set; } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Administration/Commands/Migration/MigrationException.cs b/src/NadekoBot/Modules/Administration/Commands/Migration/MigrationException.cs new file mode 100644 index 00000000..1b26d161 --- /dev/null +++ b/src/NadekoBot/Modules/Administration/Commands/Migration/MigrationException.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Administration.Commands.Migration +{ + public class MigrationException : Exception + { + + } +} diff --git a/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs b/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs index 59baf3d4..ab8721e8 100644 --- a/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs @@ -13,7 +13,6 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -//todo owner only namespace NadekoBot.Modules.Administration { public partial class Administration @@ -86,8 +85,9 @@ namespace NadekoBot.Modules.Administration {"%queued%", () => Music.Music.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()} }; - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task RotatePlaying(IUserMessage umsg) { var channel = (ITextChannel)umsg.Channel; @@ -106,8 +106,9 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`Rotating playing status disabled.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task AddPlaying(IUserMessage umsg, [Remainder] string status) { var channel = (ITextChannel)umsg.Channel; @@ -122,8 +123,9 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`Added.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task ListPlaying(IUserMessage umsg) { var channel = (ITextChannel)umsg.Channel; @@ -144,8 +146,9 @@ namespace NadekoBot.Modules.Administration } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task RemovePlaying(IUserMessage umsg, int index) { var channel = (ITextChannel)umsg.Channel; diff --git a/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs b/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs index c127c439..51ca481e 100644 --- a/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/RatelimitCommand.cs @@ -17,7 +17,7 @@ namespace NadekoBot.Modules.Administration { public static ConcurrentDictionary RatelimitingChannels = new ConcurrentDictionary(); - private DiscordSocketClient _client { get; } + private ShardedDiscordClient _client { get; } public class Ratelimiter { @@ -84,8 +84,9 @@ namespace NadekoBot.Modules.Administration }; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequirePermission(GuildPermission.ManageMessages)] public async Task Slowmode(IUserMessage umsg, int msg = 1, int perSec = 5) { var channel = (ITextChannel)umsg.Channel; diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs b/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs index 8a05ceea..4a9c171e 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs @@ -6,6 +6,7 @@ using NadekoBot.Services; using NadekoBot.Services.Database; using NadekoBot.Services.Database.Models; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; @@ -19,7 +20,7 @@ namespace NadekoBot.Modules.Administration public class SelfAssignedRolesCommands { - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Asar(IUserMessage umsg, [Remainder] IRole role) @@ -49,7 +50,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(msg.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Rsar(IUserMessage umsg, [Remainder] IRole role) @@ -70,13 +71,13 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync($":ok:**{role.Name}** has been removed from the list of self-assignable roles").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Lsar(IUserMessage umsg) { var channel = (ITextChannel)umsg.Channel; - var toRemove = new HashSet(); + var toRemove = new ConcurrentHashSet(); var removeMsg = new StringBuilder(); var msg = new StringBuilder(); using (var uow = DbHandler.UnitOfWork()) @@ -105,7 +106,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(msg.ToString() + "\n\n" + removeMsg.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] public async Task Tesar(IUserMessage umsg) @@ -124,7 +125,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Self assigned roles are now " + exl); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Iam(IUserMessage umsg, [Remainder] IRole role) { @@ -182,7 +183,7 @@ namespace NadekoBot.Modules.Administration } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Iamnot(IUserMessage umsg, [Remainder] IRole role) { diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs index ef6c11a6..87bf6860 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfCommands.cs @@ -1,50 +1,51 @@ -//using Discord; -//using Discord.Commands; -//using Discord.WebSocket; -//using NadekoBot.Attributes; -//using System.Linq; -//using System.Threading.Tasks; +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using NadekoBot.Attributes; +using System.Linq; +using System.Threading.Tasks; -////todo owner only -//namespace NadekoBot.Modules.Administration -//{ -// public partial class Administration -// { -// [Group] -// class SelfCommands -// { -// private DiscordSocketClient _client; +namespace NadekoBot.Modules.Administration +{ + public partial class Administration + { + [Group] + class SelfCommands + { + private ShardedDiscordClient _client; -// public SelfCommands(DiscordSocketClient client) -// { -// this._client = client; -// } + public SelfCommands(ShardedDiscordClient client) + { + this._client = client; + } -// [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] -// [RequireContext(ContextType.Guild)] -// public async Task Leave(IUserMessage umsg, [Remainder] string guildStr) -// { -// var channel = (ITextChannel)umsg.Channel; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Leave(IUserMessage umsg, [Remainder] string guildStr) + { + var channel = (ITextChannel)umsg.Channel; -// guildStr = guildStr.ToUpperInvariant(); -// var server = _client.GetGuilds().FirstOrDefault(g => g.Id.ToString() == guildStr) ?? _client.GetGuilds().FirstOrDefault(g => g.Name.ToUpperInvariant() == guildStr); + guildStr = guildStr.Trim().ToUpperInvariant(); + var server = _client.GetGuilds().FirstOrDefault(g => g.Id.ToString().Trim().ToUpperInvariant() == guildStr) ?? + _client.GetGuilds().FirstOrDefault(g => g.Name.Trim().ToUpperInvariant() == guildStr); -// if (server == null) -// { -// await channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false); -// return; -// } -// if (server.OwnerId != _client.GetCurrentUser().Id) -// { -// await server.LeaveAsync().ConfigureAwait(false); -// await channel.SendMessageAsync("Left server " + server.Name).ConfigureAwait(false); -// } -// else -// { -// await server.DeleteAsync().ConfigureAwait(false); -// await channel.SendMessageAsync("Deleted server " + server.Name).ConfigureAwait(false); -// } -// } -// } -// } -//} \ No newline at end of file + if (server == null) + { + await channel.SendMessageAsync("Cannot find that server").ConfigureAwait(false); + return; + } + if (server.OwnerId != _client.GetCurrentUser().Id) + { + await server.LeaveAsync().ConfigureAwait(false); + await channel.SendMessageAsync("Left server " + server.Name).ConfigureAwait(false); + } + else + { + await server.DeleteAsync().ConfigureAwait(false); + await channel.SendMessageAsync("Deleted server " + server.Name).ConfigureAwait(false); + } + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs b/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs index 53a5abd5..0d5561a0 100644 --- a/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/ServerGreetCommands.cs @@ -1,9 +1,11 @@ using Discord; using Discord.Commands; using NadekoBot.Attributes; +using NadekoBot.Extensions; using NadekoBot.Services; using NadekoBot.Services.Database.Models; using NLog; +using System; using System.Collections.Concurrent; using System.Linq; using System.Threading.Tasks; @@ -41,19 +43,22 @@ namespace NadekoBot.Modules.Administration if (channel == null) //maybe warn the server owner that the channel is missing return; - var msg = conf.ChannelByeMessageText.Replace("%user%", "**" + user.Username + "**"); + var msg = conf.ChannelByeMessageText.Replace("%user%", user.Username).Replace("%server%", user.Guild.Name); if (string.IsNullOrWhiteSpace(msg)) return; - - var toDelete = await channel.SendMessageAsync(msg).ConfigureAwait(false); - if (conf.AutoDeleteByeMessages) + try { - var t = Task.Run(async () => + var toDelete = await channel.SendMessageAsync(msg.SanitizeMentions()).ConfigureAwait(false); + if (conf.AutoDeleteByeMessages) { - await Task.Delay(conf.AutoDeleteGreetMessagesTimer * 1000).ConfigureAwait(false); // 5 minutes - await toDelete.DeleteAsync().ConfigureAwait(false); - }); + var t = Task.Run(async () => + { + await Task.Delay(conf.AutoDeleteGreetMessagesTimer * 1000).ConfigureAwait(false); // 5 minutes + await toDelete.DeleteAsync().ConfigureAwait(false); + }); + } } + catch (Exception ex) { _log.Warn(ex); } }); return Task.CompletedTask; } @@ -76,15 +81,19 @@ namespace NadekoBot.Modules.Administration var msg = conf.ChannelGreetMessageText.Replace("%user%", user.Username).Replace("%server%", user.Guild.Name); if (!string.IsNullOrWhiteSpace(msg)) { - var toDelete = await channel.SendMessageAsync(msg).ConfigureAwait(false); - if (conf.AutoDeleteGreetMessages) + try { - var t = Task.Run(async () => + var toDelete = await channel.SendMessageAsync(msg.SanitizeMentions()).ConfigureAwait(false); + if (conf.AutoDeleteGreetMessages) { - await Task.Delay(conf.AutoDeleteGreetMessagesTimer * 1000).ConfigureAwait(false); // 5 minutes + var t = Task.Run(async () => + { + await Task.Delay(conf.AutoDeleteGreetMessagesTimer * 1000).ConfigureAwait(false); // 5 minutes await toDelete.DeleteAsync().ConfigureAwait(false); - }); + }); + } } + catch (Exception ex) { _log.Warn(ex); } } } } @@ -106,7 +115,7 @@ namespace NadekoBot.Modules.Administration return Task.CompletedTask; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetDel(IUserMessage umsg) @@ -128,7 +137,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("`Automatic deletion of greet messages has been disabled.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task Greet(IUserMessage umsg) @@ -151,7 +160,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Greet announcements disabled.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetMsg(IUserMessage umsg, [Remainder] string text) @@ -164,7 +173,7 @@ namespace NadekoBot.Modules.Administration conf = uow.GuildConfigs.For(channel.Guild.Id); if (!string.IsNullOrWhiteSpace(text)) { - conf.ChannelGreetMessageText = text; + conf.ChannelGreetMessageText = text.SanitizeMentions(); uow.GuildConfigs.Update(conf); await uow.CompleteAsync(); } @@ -172,7 +181,7 @@ namespace NadekoBot.Modules.Administration if (string.IsNullOrWhiteSpace(text)) { - await channel.SendMessageAsync("`Current greet message:` " + conf.ChannelGreetMessageText); + await channel.SendMessageAsync("`Current greet message:` " + conf.ChannelGreetMessageText.SanitizeMentions()); return; } await channel.SendMessageAsync("New greet message set.").ConfigureAwait(false); @@ -180,7 +189,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Enable greet messsages by typing `.greet`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetDm(IUserMessage umsg) @@ -202,7 +211,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Greet announcements disabled.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task GreetDmMsg(IUserMessage umsg, [Remainder] string text) @@ -231,7 +240,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Enable DM greet messsages by typing `.greetdm`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task Bye(IUserMessage umsg) @@ -254,7 +263,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Bye announcements disabled.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task ByeMsg(IUserMessage umsg, [Remainder] string text) @@ -267,7 +276,7 @@ namespace NadekoBot.Modules.Administration conf = uow.GuildConfigs.For(channel.Guild.Id); if (!string.IsNullOrWhiteSpace(text)) { - conf.ChannelByeMessageText = text; + conf.ChannelByeMessageText = text.SanitizeMentions(); uow.GuildConfigs.Update(conf); await uow.CompleteAsync(); } @@ -275,7 +284,7 @@ namespace NadekoBot.Modules.Administration if (string.IsNullOrWhiteSpace(text)) { - await channel.SendMessageAsync("`Current bye message:` " + conf.ChannelGreetMessageText); + await channel.SendMessageAsync("`Current bye message:` " + conf.ChannelGreetMessageText.SanitizeMentions()); return; } await channel.SendMessageAsync("New bye message set.").ConfigureAwait(false); @@ -283,7 +292,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync("Enable bye messsages by typing `.bye`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageGuild)] public async Task ByeDel(IUserMessage umsg) diff --git a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs index 75f4d649..9696c188 100644 --- a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs @@ -97,7 +97,7 @@ namespace NadekoBot.Modules.Administration private string GetChannelName(string voiceName) => channelNameRegex.Replace(voiceName, "").Trim().Replace(" ", "-").TrimTo(90, true) + "-voice"; - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageRoles)] [RequirePermission(GuildPermission.ManageChannels)] @@ -138,7 +138,7 @@ namespace NadekoBot.Modules.Administration await channel.SendMessageAsync(ex.ToString()).ConfigureAwait(false); } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageChannels)] [RequirePermission(GuildPermission.ManageRoles)] @@ -148,7 +148,7 @@ namespace NadekoBot.Modules.Administration var guild = channel.Guild; if (!guild.GetCurrentUser().GuildPermissions.ManageChannels) { - await channel.SendMessageAsync("`I have insufficient permission to do that.`"); + await channel.SendMessageAsync("`I have insufficient permission to do that.`").ConfigureAwait(false); return; } @@ -163,7 +163,7 @@ namespace NadekoBot.Modules.Administration await Task.Delay(500); } - await channel.SendMessageAsync("`Done.`"); + await channel.SendMessageAsync("`Done.`").ConfigureAwait(false); } } } diff --git a/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs index c7e8e708..b4254162 100644 --- a/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs +++ b/src/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs @@ -19,7 +19,7 @@ namespace NadekoBot.Modules.ClashOfClans { public static ConcurrentDictionary> ClashWars { get; set; } = new ConcurrentDictionary>(); - public ClashOfClans(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + public ClashOfClans(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { using (var uow = DbHandler.UnitOfWork()) { @@ -45,13 +45,13 @@ namespace NadekoBot.Modules.ClashOfClans if (Bases[i] == null) continue; if (!Bases[i].BaseDestroyed && DateTime.UtcNow - Bases[i].TimeAdded >= callExpire) { - await war.Channel.SendMessageAsync($"❗🔰**Claim from @{Bases[i].CallUser} for a war against {war.ShortPrint()} has expired.**").ConfigureAwait(false); Bases[i] = null; - } + try { await war.Channel.SendMessageAsync($"❗🔰**Claim from @{Bases[i].CallUser} for a war against {war.ShortPrint()} has expired.**").ConfigureAwait(false); } catch { } + } } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task CreateWar(IUserMessage umsg, int size, [Remainder] string enemyClan = null) { @@ -84,7 +84,7 @@ namespace NadekoBot.Modules.ClashOfClans await channel.SendMessageAsync($"❗🔰**CREATED CLAN WAR AGAINST {cw.ShortPrint()}**").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task StartWar(IUserMessage umsg, [Remainder] string number = null) { @@ -112,7 +112,7 @@ namespace NadekoBot.Modules.ClashOfClans SaveWar(war); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ListWar(IUserMessage umsg, [Remainder] string number = null) { @@ -155,7 +155,7 @@ namespace NadekoBot.Modules.ClashOfClans await channel.SendMessageAsync(warsInfo.Item1[warsInfo.Item2].ToPrettyString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Claim(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -183,7 +183,7 @@ namespace NadekoBot.Modules.ClashOfClans } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ClaimFinish1(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -191,7 +191,7 @@ namespace NadekoBot.Modules.ClashOfClans await FinishClaim(umsg, number, baseNumber, other_name, 1); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ClaimFinish2(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -199,7 +199,7 @@ namespace NadekoBot.Modules.ClashOfClans await FinishClaim(umsg, number, baseNumber, other_name, 2); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ClaimFinish(IUserMessage umsg, int number, int baseNumber, [Remainder] string other_name = null) { @@ -207,7 +207,7 @@ namespace NadekoBot.Modules.ClashOfClans await FinishClaim(umsg, number, baseNumber, other_name); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task EndWar(IUserMessage umsg, int number) { @@ -228,7 +228,7 @@ namespace NadekoBot.Modules.ClashOfClans warsInfo.Item1.RemoveAt(warsInfo.Item2); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Unclaim(IUserMessage umsg, int number, [Remainder] string otherName = null) { diff --git a/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs new file mode 100644 index 00000000..833b7881 --- /dev/null +++ b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord.Commands; +using NadekoBot.Services; +using NadekoBot.Attributes; +using NadekoBot.Services.Database; +using System.Collections.Concurrent; +using NadekoBot.Services.Database.Models; +using Discord; +using NadekoBot.Extensions; + +namespace NadekoBot.Modules.CustomReactions +{ + [NadekoModule("CustomReactions",".")] + public class CustomReactions : DiscordModule + { + public static ConcurrentHashSet GlobalReactions { get; } = new ConcurrentHashSet(); + public static ConcurrentDictionary> GuildReactions { get; } = new ConcurrentDictionary>(); + static CustomReactions() + { + using (var uow = DbHandler.UnitOfWork()) + { + var items = uow.CustomReactions.GetAll(); + GuildReactions = new ConcurrentDictionary>(items.Where(g => g.GuildId != null).GroupBy(k => k.GuildId.Value).ToDictionary(g => g.Key, g => new ConcurrentHashSet(g))); + GlobalReactions = new ConcurrentHashSet(items.Where(g => g.GuildId == null)); + } + } + public CustomReactions(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) + { + client.MessageReceived += (imsg) => + { + var umsg = imsg as IUserMessage; + if (umsg == null) + return Task.CompletedTask; + + var channel = umsg.Channel as ITextChannel; + if (channel == null) + return Task.CompletedTask; + + var t = Task.Run(async () => + { + var content = umsg.Content.ToLowerInvariant(); + ConcurrentHashSet reactions; + GuildReactions.TryGetValue(channel.Guild.Id, out reactions); + if (reactions != null && reactions.Any()) + { + var reaction = reactions.Where(cr => cr.TriggerWithContext(umsg) == content).Shuffle().FirstOrDefault(); + if (reaction != null) + { + try { await channel.SendMessageAsync(reaction.ResponseWithContext(umsg)).ConfigureAwait(false); } catch { } + return; + } + } + var greaction = GlobalReactions.Where(cr => cr.TriggerWithContext(umsg) == content).Shuffle().FirstOrDefault(); + if (greaction != null) + { + try { await channel.SendMessageAsync(greaction.ResponseWithContext(umsg)).ConfigureAwait(false); } catch { } + return; + } + }); + return Task.CompletedTask; + }; + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task AddCustReact(IUserMessage imsg, string key, [Remainder] string message) + { + var channel = imsg.Channel as ITextChannel; + if (string.IsNullOrWhiteSpace(message) || string.IsNullOrWhiteSpace(key)) + return; + + key = key.ToLowerInvariant(); + + if ((channel == null && !NadekoBot.Credentials.IsOwner(imsg.Author)) || (channel != null && !((IGuildUser)imsg.Author).GuildPermissions.Administrator)) + { + try { await imsg.Channel.SendMessageAsync("Insufficient permissions. Requires Bot ownership for global custom reactions, and Administrator for guild custom reactions."); } catch { } + return; + } + + var cr = new CustomReaction() + { + GuildId = channel?.Guild.Id, + IsRegex = false, + Trigger = key, + Response = message, + }; + + using (var uow = DbHandler.UnitOfWork()) + { + uow.CustomReactions.Add(cr); + + await uow.CompleteAsync().ConfigureAwait(false); + } + + if (channel == null) + { + GlobalReactions.Add(cr); + } + else + { + var reactions = GuildReactions.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet()); + reactions.Add(cr); + } + + await imsg.Channel.SendMessageAsync($"`Added new custom reaction:`\n\t`Trigger:` {key}\n\t`Response:` {message}").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task ListCustReact(IUserMessage imsg,int page = 1) + { + var channel = imsg.Channel as ITextChannel; + + if (page < 1 || page > 1000) + return; + ConcurrentHashSet customReactions; + if (channel == null) + customReactions = GlobalReactions; + else + customReactions = GuildReactions.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet()); + + if (customReactions == null || !customReactions.Any()) + await imsg.Channel.SendMessageAsync("`No custom reactions found`").ConfigureAwait(false); + else + await imsg.Channel.SendMessageAsync(string.Join("\n", customReactions.OrderBy(cr => cr.Trigger).Skip((page - 1) * 10).Take(10))) + .ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task DelCustReact(IUserMessage imsg, int id) + { + var channel = imsg.Channel as ITextChannel; + + if ((channel == null && !NadekoBot.Credentials.IsOwner(imsg.Author)) || (channel != null && !((IGuildUser)imsg.Author).GuildPermissions.Administrator)) + { + try { await imsg.Channel.SendMessageAsync("Insufficient permissions. Requires Bot ownership for global custom reactions, and Administrator for guild custom reactions."); } catch { } + return; + } + + var success = false; + CustomReaction toDelete; + using (var uow = DbHandler.UnitOfWork()) + { + toDelete = uow.CustomReactions.Get(id); + if (toDelete == null) //not found + return; + + if (toDelete.GuildId == null && channel == null) + { + uow.CustomReactions.Remove(toDelete); + var toRemove = GlobalReactions.FirstOrDefault(cr => cr.Id == toDelete.Id); + GlobalReactions.TryRemove(toRemove); + success = true; + } + else if (toDelete.GuildId != null && channel?.Guild.Id == toDelete.GuildId) + { + uow.CustomReactions.Remove(toDelete); + var crs = GuildReactions.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet()); + var toRemove = crs.FirstOrDefault(cr => cr.Id == toDelete.Id); + + success = true; + } + if(success) + await uow.CompleteAsync().ConfigureAwait(false); + } + + if (success) + await imsg.Channel.SendMessageAsync("**Successfully deleted custom reaction** " + toDelete.ToString()).ConfigureAwait(false); + else + await imsg.Channel.SendMessageAsync("`Failed to find that custom reaction.`").ConfigureAwait(false); + } + } +} diff --git a/src/NadekoBot/Modules/CustomReactions/Extensions.cs b/src/NadekoBot/Modules/CustomReactions/Extensions.cs new file mode 100644 index 00000000..147d6dcf --- /dev/null +++ b/src/NadekoBot/Modules/CustomReactions/Extensions.cs @@ -0,0 +1,38 @@ +using Discord; +using NadekoBot.Extensions; +using NadekoBot.Services; +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.CustomReactions +{ + public static class Extensions + { + public static Dictionary> placeholders = new Dictionary>() + { + {"%mention%", (ctx) => { return $"<@{NadekoBot.Client.GetCurrentUser().Id}>"; } }, + {"%user%", (ctx) => { return ctx.Author.Mention; } }, + {"%target%", (ctx) => { return ctx.MentionedUsers.Shuffle().FirstOrDefault()?.Mention ?? "Nobody"; } }, + {"%rng%", (ctx) => { return new NadekoRandom().Next(0,10).ToString(); } } + }; + + private static string ResolveCRString(this string str, IUserMessage ctx) + { + foreach (var ph in placeholders) + { + str = str.Replace(ph.Key, ph.Value(ctx)); + } + return str; + } + + public static string TriggerWithContext(this CustomReaction cr, IUserMessage ctx) + => cr.Trigger.ResolveCRString(ctx); + + public static string ResponseWithContext(this CustomReaction cr, IUserMessage ctx) + => cr.Response.ResolveCRString(ctx); + } +} diff --git a/src/NadekoBot/Modules/DiscordModule.cs b/src/NadekoBot/Modules/DiscordModule.cs index e73d1789..5ad80226 100644 --- a/src/NadekoBot/Modules/DiscordModule.cs +++ b/src/NadekoBot/Modules/DiscordModule.cs @@ -10,11 +10,11 @@ namespace NadekoBot.Modules { protected ILocalization _l { get; } protected CommandService _commands { get; } - protected DiscordSocketClient _client { get; } + protected ShardedDiscordClient _client { get; } protected Logger _log { get; } private string _prefix { get; } - public DiscordModule(ILocalization loc, CommandService cmds, DiscordSocketClient client) + public DiscordModule(ILocalization loc, CommandService cmds, ShardedDiscordClient client) { string prefix; if (NadekoBot.ModulePrefixes.TryGetValue(this.GetType().Name, out prefix)) diff --git a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs index 7870fa6a..649fe8fa 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/AnimalRacing.cs @@ -4,6 +4,7 @@ using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Services; using NadekoBot.Services.Database; +using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -24,7 +25,7 @@ namespace NadekoBot.Modules.Gambling } public static ConcurrentDictionary AnimalRaces = new ConcurrentDictionary(); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Race(IUserMessage umsg) { @@ -36,7 +37,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync("🏁 `Failed starting a race. Another race is probably running.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task JoinRace(IUserMessage umsg, int amount = 0) { @@ -47,7 +48,7 @@ namespace NadekoBot.Modules.Gambling if (amount > 0) if(!await CurrencyHandler.RemoveCurrencyAsync((IGuildUser)umsg.Author, "BetRace", amount, true).ConfigureAwait(false)) - await channel.SendMessageAsync($"{umsg.Author.Mention} You don't have enough {Gambling.CurrencyName}s.").ConfigureAwait(false); + try { await channel.SendMessageAsync($"{umsg.Author.Mention} You don't have enough {Gambling.CurrencyName}s.").ConfigureAwait(false); } catch { } AnimalRace ar; @@ -69,12 +70,14 @@ namespace NadekoBot.Modules.Gambling public List participants = new List(); private ulong serverId; private int messagesSinceGameStarted = 0; + private Logger _log { get; } public ITextChannel raceChannel { get; set; } public bool Started { get; private set; } = false; public AnimalRace(ulong serverId, ITextChannel ch) { + this._log = LogManager.GetCurrentClassLogger(); this.serverId = serverId; this.raceChannel = ch; if (!AnimalRaces.TryAdd(serverId, this)) @@ -85,7 +88,7 @@ namespace NadekoBot.Modules.Gambling using (var uow = DbHandler.UnitOfWork()) { - animals = new ConcurrentQueue(uow.BotConfig.GetOrCreate().RaceAnimals.Select(ra=>ra.Icon).Shuffle()); + animals = new ConcurrentQueue(uow.BotConfig.GetOrCreate().RaceAnimals.Select(ra => ra.Icon).Shuffle()); } @@ -96,23 +99,23 @@ namespace NadekoBot.Modules.Gambling { try { - await raceChannel.SendMessageAsync($"🏁`Race is starting in 20 seconds or when the room is full. Type {NadekoBot.ModulePrefixes["Gambling"]}jr to join the race.`"); + try { await raceChannel.SendMessageAsync($"🏁`Race is starting in 20 seconds or when the room is full. Type {NadekoBot.ModulePrefixes[typeof(Gambling).Name]}jr to join the race.`"); } catch (Exception ex) { _log.Warn(ex); } var t = await Task.WhenAny(Task.Delay(20000, token), fullgame); Started = true; cancelSource.Cancel(); if (t == fullgame) { - await raceChannel.SendMessageAsync("🏁`Race full, starting right now!`"); + try { await raceChannel.SendMessageAsync("🏁`Race full, starting right now!`"); } catch (Exception ex) { _log.Warn(ex); } } else if (participants.Count > 1) { - await raceChannel.SendMessageAsync("🏁`Game starting with " + participants.Count + " participants.`"); + try { await raceChannel.SendMessageAsync("🏁`Game starting with " + participants.Count + " participants.`"); } catch (Exception ex) { _log.Warn(ex); } } else { - await raceChannel.SendMessageAsync("🏁`Race failed to start since there was not enough participants.`"); + try { await raceChannel.SendMessageAsync("🏁`Race failed to start since there was not enough participants.`"); } catch (Exception ex) { _log.Warn(ex); } var p = participants.FirstOrDefault(); - + if (p != null) await CurrencyHandler.AddCurrencyAsync(p.User, "BetRace", p.AmountBet, true).ConfigureAwait(false); End(); @@ -169,11 +172,13 @@ namespace NadekoBot.Modules.Gambling { if (msg != null) try { await msg.DeleteAsync(); } catch { } - msg = await raceChannel.SendMessageAsync(text).ConfigureAwait(false); messagesSinceGameStarted = 0; + try { msg = await raceChannel.SendMessageAsync(text).ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } } else - await msg.ModifyAsync(m => m.Content = text).ConfigureAwait(false); + { + try { await msg.ModifyAsync(m => m.Content = text).ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } + } await Task.Delay(2500); } diff --git a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs index 95ab1cf8..a6e6a8ba 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/DiceRollCommand.cs @@ -21,7 +21,7 @@ namespace NadekoBot.Modules.Gambling { private Regex dndRegex { get; } = new Regex(@"(?\d+)d(?\d+)", RegexOptions.Compiled); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Roll(IUserMessage umsg) { @@ -44,8 +44,9 @@ namespace NadekoBot.Modules.Gambling await channel.SendFileAsync(imageStream, "dice.png", $"{umsg.Author.Mention} rolled " + Format.Code(gen.ToString())).ConfigureAwait(false); } //todo merge into internallDndRoll and internalRoll - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [Priority(1)] public async Task Roll(IUserMessage umsg, string arg) { var channel = (ITextChannel)umsg.Channel; @@ -69,13 +70,14 @@ namespace NadekoBot.Modules.Gambling arr[i] = rng.Next(1, n2 + 1); } var elemCnt = 0; - await channel.SendMessageAsync($"`{umsg.Author.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.`\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false); + await channel.SendMessageAsync($"{umsg.Author.Mention} rolled {n1} {(n1 == 1 ? "die" : "dice")} 1-{n2}.\n`Result:` " + string.Join(", ", (ordered ? arr.OrderBy(x => x).AsEnumerable() : arr).Select(x => elemCnt++ % 2 == 0 ? $"**{x}**" : x.ToString()))).ConfigureAwait(false); } } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [Priority(2)] public async Task Roll(IUserMessage umsg, int num) { var channel = (ITextChannel)umsg.Channel; @@ -87,7 +89,6 @@ namespace NadekoBot.Modules.Gambling if (num < 1 || num > 30) { await channel.SendMessageAsync("Invalid number specified. You can roll up to 1-30 dice at a time.").ConfigureAwait(false); - num = 30; return; } @@ -128,7 +129,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendFileAsync(ms, "dice.png", $"{umsg.Author.Mention} rolled {values.Count} {(values.Count == 1 ? "die" : "dice")}. Total: **{values.Sum()}** Average: **{(values.Sum() / (1.0f * values.Count)).ToString("N2")}**").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Rolluo(IUserMessage umsg, string arg) { @@ -158,7 +159,7 @@ namespace NadekoBot.Modules.Gambling } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Rolluo(IUserMessage umsg, int num) { @@ -171,7 +172,7 @@ namespace NadekoBot.Modules.Gambling if (num < 1 || num > 30) { await channel.SendMessageAsync("Invalid number specified. You can roll up to 1-30 dice at a time.").ConfigureAwait(false); - num = 30; + return; } var rng = new NadekoRandom(); @@ -211,7 +212,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendFileAsync(ms, "dice.png", $"{umsg.Author.Mention} rolled {values.Count} {(values.Count == 1 ? "die" : "dice")}. Total: **{values.Sum()}** Average: **{(values.Sum() / (1.0f * values.Count)).ToString("N2")}**").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task NRoll(IUserMessage umsg, [Remainder] string range) { diff --git a/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs index e7f36388..1de5650a 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/DrawCommand.cs @@ -4,6 +4,7 @@ using ImageProcessorCore; using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Modules.Gambling.Models; +using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -12,59 +13,70 @@ using System.Threading.Tasks; namespace NadekoBot.Modules.Gambling { - [Group] - public class DrawCommands + public partial class Gambling { - private static readonly ConcurrentDictionary AllDecks = new ConcurrentDictionary(); - - private const string cardsPath = "data/images/cards"; - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] - public async Task Draw(IUserMessage msg) + [Group] + public class DrawCommands { - var channel = (ITextChannel)msg.Channel; - var cards = AllDecks.GetOrAdd(channel.Guild, (s) => new Cards()); - - var num = 1; - var images = new List(); - var cardObjects = new List(); - for (var i = 0; i < num; i++) + private static readonly ConcurrentDictionary AllDecks = new ConcurrentDictionary(); + + + public DrawCommands() { - if (cards.CardPool.Count == 0 && i != 0) + _log = LogManager.GetCurrentClassLogger(); + } + + private const string cardsPath = "data/images/cards"; + private Logger _log { get; } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task Draw(IUserMessage msg) + { + var channel = (ITextChannel)msg.Channel; + var cards = AllDecks.GetOrAdd(channel.Guild, (s) => new Cards()); + + var num = 1; + var images = new List(); + var cardObjects = new List(); + for (var i = 0; i < num; i++) { - await channel.SendMessageAsync("No more cards in a deck.").ConfigureAwait(false); - break; - } - var currentCard = cards.DrawACard(); - cardObjects.Add(currentCard); - using (var stream = File.OpenRead(Path.Combine(cardsPath, currentCard.GetName()))) - images.Add(new Image(stream)); - } - MemoryStream bitmapStream = new MemoryStream(); - images.Merge().SaveAsPng(bitmapStream); - bitmapStream.Position = 0; - await channel.SendFileAsync(bitmapStream, images.Count + " cards.jpg", $"{msg.Author.Mention} drew (TODO: CARD NAMES HERE)").ConfigureAwait(false); - if (cardObjects.Count == 5) - { - await channel.SendMessageAsync($"{msg.Author.Mention} `{Cards.GetHandValue(cardObjects)}`").ConfigureAwait(false); - } - } - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] - public async Task Shuffle(IUserMessage imsg) - { - var channel = (ITextChannel)imsg.Channel; - - AllDecks.AddOrUpdate(channel.Guild, - (g) => new Cards(), - (g, c) => + if (cards.CardPool.Count == 0 && i != 0) { - c.Restart(); - return c; - }); + try { await channel.SendMessageAsync("No more cards in a deck.").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } + break; + } + var currentCard = cards.DrawACard(); + cardObjects.Add(currentCard); + using (var stream = File.OpenRead(Path.Combine(cardsPath, currentCard.GetName()))) + images.Add(new Image(stream)); + } + MemoryStream bitmapStream = new MemoryStream(); + images.Merge().SaveAsPng(bitmapStream); + bitmapStream.Position = 0; + await channel.SendFileAsync(bitmapStream, images.Count + " cards.jpg", $"{msg.Author.Mention} drew (TODO: CARD NAMES HERE)").ConfigureAwait(false); + if (cardObjects.Count == 5) + { + await channel.SendMessageAsync($"{msg.Author.Mention} `{Cards.GetHandValue(cardObjects)}`").ConfigureAwait(false); + } + } - await channel.SendMessageAsync("`Deck reshuffled.`").ConfigureAwait(false); + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task ShuffleDeck(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + + AllDecks.AddOrUpdate(channel.Guild, + (g) => new Cards(), + (g, c) => + { + c.Restart(); + return c; + }); + + await channel.SendMessageAsync("`Deck reshuffled.`").ConfigureAwait(false); + } } } -} +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs index c1888913..5fb0ddf4 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs @@ -19,7 +19,7 @@ namespace NadekoBot.Modules.Gambling private const string tailsPath = "data/images/coins/tails.png"; public FlipCoinCommands() { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Flip(IUserMessage imsg, int count = 1) { @@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendFileAsync(imgs.Merge().ToStream(), $"{count} coins.png").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Betflip(IUserMessage umsg, int amount, string guess) { diff --git a/src/NadekoBot/Modules/Gambling/Gambling.cs b/src/NadekoBot/Modules/Gambling/Gambling.cs index 589441ac..6335295f 100644 --- a/src/NadekoBot/Modules/Gambling/Gambling.cs +++ b/src/NadekoBot/Modules/Gambling/Gambling.cs @@ -21,7 +21,7 @@ namespace NadekoBot.Modules.Gambling public static string CurrencyPluralName { get; set; } public static string CurrencySign { get; set; } - public Gambling(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + public Gambling(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { using (var uow = DbHandler.UnitOfWork()) { @@ -33,7 +33,7 @@ namespace NadekoBot.Modules.Gambling } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Raffle(IUserMessage umsg, [Remainder] IRole role = null) { @@ -46,12 +46,12 @@ namespace NadekoBot.Modules.Gambling var usr = membersArray[new NadekoRandom().Next(0, membersArray.Length)]; await channel.SendMessageAsync($"**Raffled user:** {usr.Username} (id: {usr.Id})").ConfigureAwait(false); } - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] + + [NadekoCommand, Usage, Description, Aliases] + [Priority(1)] public async Task Cash(IUserMessage umsg, [Remainder] IUser user = null) { - var channel = (ITextChannel)umsg.Channel; + var channel = umsg.Channel; user = user ?? umsg.Author; long amount; @@ -64,8 +64,25 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync($"{user.Username} has {amount} {config.CurrencySign}").ConfigureAwait(false); } - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + + [NadekoCommand, Usage, Description, Aliases] + [Priority(0)] + public async Task Cash(IUserMessage umsg, ulong userId) + { + var channel = umsg.Channel; + + long amount; + BotConfig config; + using (var uow = DbHandler.UnitOfWork()) + { + amount = uow.Currency.GetUserCurrency(userId); + config = uow.BotConfig.GetOrCreate(); + } + + await channel.SendMessageAsync($"`{userId}` has {amount} {config.CurrencySign}").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Give(IUserMessage umsg, long amount, [Remainder] IGuildUser receiver) { @@ -82,14 +99,15 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync($"{umsg.Author.Mention} successfully sent {amount} {Gambling.CurrencyPluralName}s to {receiver.Mention}!").ConfigureAwait(false); } - //todo owner only - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public Task Award(IUserMessage umsg, long amount, [Remainder] IGuildUser usr) => Award(umsg, amount, usr.Id); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task Award(IUserMessage umsg, long amount, [Remainder] ulong usrId) { var channel = (ITextChannel)umsg.Channel; @@ -101,28 +119,39 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync($"{umsg.Author.Mention} successfully awarded {amount} {Gambling.CurrencyName}s to <@{usrId}>!").ConfigureAwait(false); } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Take(IUserMessage umsg, long amount, [Remainder] IGuildUser user) + { + var channel = (ITextChannel)umsg.Channel; + if (amount <= 0) + return; - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public Task Take(IUserMessage umsg, long amount, [Remainder] IGuildUser user) => - // Take(umsg, amount, user.Id); + if(await CurrencyHandler.RemoveCurrencyAsync(user, $"Taken by bot owner.({umsg.Author.Username}/{umsg.Author.Id})", amount, true).ConfigureAwait(false)) + await channel.SendMessageAsync($"{umsg.Author.Mention} successfully took {amount} {Gambling.CurrencyPluralName} from {user}!").ConfigureAwait(false); + else + await channel.SendMessageAsync($"{umsg.Author.Mention} was unable to take {amount} {Gambling.CurrencyPluralName} from {user} because the user doesn't have that much {Gambling.CurrencyPluralName}!").ConfigureAwait(false); + } - //todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Take(IUserMessage umsg, long amount, [Remainder] ulong usrId) - //{ - // var channel = (ITextChannel)umsg.Channel; - // if (amount <= 0) - // return; - // await CurrencyHandler.RemoveFlowers(usrId, $"Taken by bot owner.({umsg.Author.Username}/{umsg.Author.Id})", (int)amount).ConfigureAwait(false); + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Take(IUserMessage umsg, long amount, [Remainder] ulong usrId) + { + var channel = (ITextChannel)umsg.Channel; + if (amount <= 0) + return; - // await channel.SendMessageAsync($"{umsg.Author.Mention} successfully took {amount} {Gambling.CurrencyName}s from <@{usrId}>!").ConfigureAwait(false); - //} + if(await CurrencyHandler.RemoveCurrencyAsync(usrId, $"Taken by bot owner.({umsg.Author.Username}/{umsg.Author.Id})", amount).ConfigureAwait(false)) + await channel.SendMessageAsync($"{umsg.Author.Mention} successfully took {amount} {Gambling.CurrencyName}s from <@{usrId}>!").ConfigureAwait(false); + else + await channel.SendMessageAsync($"{umsg.Author.Mention} was unable to take {amount} {Gambling.CurrencyPluralName} from `{usrId}` because the user doesn't have that much {Gambling.CurrencyPluralName}!").ConfigureAwait(false); + } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task BetRoll(IUserMessage umsg, long amount) { @@ -172,7 +201,7 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync(str).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Leaderboard(IUserMessage umsg) { @@ -188,13 +217,12 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync( richest.Aggregate(new StringBuilder( $@"```xl - ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓ - ┃ Id ┃ $$$ ┃ - "), - (cur, cs) => cur.AppendLine( -$@"┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫ - ┃{(channel.Guild.GetUser(cs.UserId)?.Username.TrimTo(18, true) ?? cs.UserId.ToString()),-20} ┃ {cs,5} ┃") - ).ToString() + "┗━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛```").ConfigureAwait(false); +┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ +┃ Id ┃ $$$ ┃ +"), + (cur, cs) => cur.AppendLine($@"┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━┫ +┃{(channel.Guild.GetUser(cs.UserId)?.Username.TrimTo(18, true) ?? cs.UserId.ToString()),-20} ┃ {cs.Amount,6} ┃") + ).ToString() + "┗━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━┛```").ConfigureAwait(false); } } } diff --git a/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs b/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs index 63e4ca54..1a7657b4 100644 --- a/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/LeetCommands.cs @@ -12,7 +12,7 @@ namespace NadekoBot.Modules.Games { public partial class Games { - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Leet(IUserMessage umsg, int level, [Remainder] string text = null) { diff --git a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs index a6976739..022e8f13 100644 --- a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs @@ -5,6 +5,7 @@ using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Services; using NadekoBot.Services.Database; +using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -16,6 +17,8 @@ using System.Threading.Tasks; namespace NadekoBot.Modules.Games { + //todo make currency generation change and cooldown modifyable + //only by bot owner through commands public partial class Games { /// @@ -38,9 +41,11 @@ namespace NadekoBot.Modules.Games private float chance; private int cooldown; + private Logger _log { get; } public PlantPickCommands() { + _log = LogManager.GetCurrentClassLogger(); NadekoBot.Client.MessageReceived += PotentialFlowerGeneration; rng = new NadekoRandom(); @@ -59,7 +64,7 @@ namespace NadekoBot.Modules.Games private Task PotentialFlowerGeneration(IMessage imsg) { var msg = imsg as IUserMessage; - if (msg == null || msg.IsAuthor()) + if (msg == null || msg.IsAuthor() || msg.Author.IsBot) return Task.CompletedTask; var channel = imsg.Channel as ITextChannel; @@ -86,7 +91,7 @@ namespace NadekoBot.Modules.Games { var sent = await channel.SendFileAsync( GetRandomCurrencyImagePath(), - $"❗ A random { Gambling.Gambling.CurrencyName } appeared! Pick it up by typing `{NadekoBot.ModulePrefixes["Gambling"]}pick`") + $"❗ A random { Gambling.Gambling.CurrencyName } appeared! Pick it up by typing `{NadekoBot.ModulePrefixes[typeof(Games).Name]}pick`") .ConfigureAwait(false); plantedFlowers.AddOrUpdate(channel.Id, new List() { sent }, (id, old) => { old.Add(sent); return old; }); } @@ -96,7 +101,7 @@ namespace NadekoBot.Modules.Games }); return Task.CompletedTask; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Pick(IUserMessage imsg) { @@ -119,17 +124,13 @@ namespace NadekoBot.Modules.Games await CurrencyHandler.AddCurrencyAsync((IGuildUser)imsg.Author, "Picked flower(s).", msgs.Count, false).ConfigureAwait(false); var msg = await channel.SendMessageAsync($"**{imsg.Author.Username}** picked {msgs.Count}{Gambling.Gambling.CurrencySign}!").ConfigureAwait(false); var t = Task.Run(async () => - { - try - { - await Task.Delay(10000).ConfigureAwait(false); - await msg.DeleteAsync().ConfigureAwait(false); - } - catch { } - }); + { + await Task.Delay(10000).ConfigureAwait(false); + try { await msg.DeleteAsync().ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } + }); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Plant(IUserMessage imsg) { @@ -148,7 +149,7 @@ namespace NadekoBot.Modules.Games IUserMessage msg; var vowelFirst = new[] { 'a', 'e', 'i', 'o', 'u' }.Contains(Gambling.Gambling.CurrencyName[0]); - var msgToSend = $"Oh how Nice! **{imsg.Author.Username}** planted {(vowelFirst ? "an" : "a")} {Gambling.Gambling.CurrencyName}. Pick it using {NadekoBot.ModulePrefixes["Games"]}pick"; + var msgToSend = $"Oh how Nice! **{imsg.Author.Username}** planted {(vowelFirst ? "an" : "a")} {Gambling.Gambling.CurrencyName}. Pick it using {NadekoBot.ModulePrefixes[typeof(Gambling.Gambling).Name]}pick"; if (file == null) { msg = await channel.SendMessageAsync(Gambling.Gambling.CurrencySign).ConfigureAwait(false); @@ -160,7 +161,7 @@ namespace NadekoBot.Modules.Games plantedFlowers.AddOrUpdate(channel.Id, new List() { msg }, (id, old) => { old.Add(msg); return old; }); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageMessages)] public async Task Gencurrency(IUserMessage imsg) diff --git a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs index 711873d3..5daf7add 100644 --- a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs @@ -14,7 +14,7 @@ namespace NadekoBot.Modules.Games { public static ConcurrentDictionary ActivePolls = new ConcurrentDictionary(); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Poll(IUserMessage umsg, [Remainder] string arg = null) { @@ -35,7 +35,7 @@ namespace NadekoBot.Modules.Games } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Pollend(IUserMessage umsg) { @@ -111,7 +111,7 @@ namespace NadekoBot.Modules.Games { // has to be a user message var msg = imsg as IUserMessage; - if (msg == null) + if (msg == null || msg.Author.IsBot) return Task.CompletedTask; // channel must be private IPrivateChannel ch; @@ -124,17 +124,12 @@ namespace NadekoBot.Modules.Games var t = Task.Run(async () => { - try + if (vote < 1 || vote > answers.Length) + return; + if (participants.TryAdd(msg.Author, vote)) { - - if (vote < 1 || vote > answers.Length) - return; - if (participants.TryAdd(msg.Author, vote)) - { - await (ch as ITextChannel).SendMessageAsync($"Thanks for voting **{msg.Author.Username}**.").ConfigureAwait(false); - } + try { await (ch as ITextChannel).SendMessageAsync($"Thanks for voting **{msg.Author.Username}**.").ConfigureAwait(false); } catch { } } - catch { } }); return Task.CompletedTask; } diff --git a/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs b/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs index 7817a61a..2b092d78 100644 --- a/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/SpeedTypingCommands.cs @@ -5,6 +5,7 @@ using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Services; using NadekoBot.Services.Database; +using NLog; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -24,9 +25,11 @@ namespace NadekoBot.Modules.Games public bool IsActive; private readonly Stopwatch sw; private readonly List finishedUserIds; + private Logger _log { get; } public TypingGame(ITextChannel channel) { + _log = LogManager.GetCurrentClassLogger(); this.channel = channel; IsActive = false; sw = new Stopwatch(); @@ -43,28 +46,33 @@ namespace NadekoBot.Modules.Games IsActive = false; sw.Stop(); sw.Reset(); - await channel.SendMessageAsync("Typing contest stopped").ConfigureAwait(false); + try { await channel.SendMessageAsync("Typing contest stopped").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } return true; } public async Task Start() { - while (true) + if (IsActive) return; // can't start running game + IsActive = true; + CurrentSentence = GetRandomSentence(); + var i = (int)(CurrentSentence.Length / WORD_VALUE * 1.7f); + try { - if (IsActive) return; // can't start running game - IsActive = true; - CurrentSentence = GetRandomSentence(); - var i = (int)(CurrentSentence.Length / WORD_VALUE * 1.7f); - await channel.SendMessageAsync($":clock2: Next contest will last for {i} seconds. Type the bolded text as fast as you can.").ConfigureAwait(false); + await channel.SendMessageAsync($@":clock2: Next contest will last for {i} seconds. Type the bolded text as fast as you can.").ConfigureAwait(false); var msg = await channel.SendMessageAsync("Starting new typing contest in **3**...").ConfigureAwait(false); await Task.Delay(1000).ConfigureAwait(false); - await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **2**...").ConfigureAwait(false); - await Task.Delay(1000).ConfigureAwait(false); - await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **1**...").ConfigureAwait(false); - await Task.Delay(1000).ConfigureAwait(false); - await msg.ModifyAsync(m => m.Content = $":book:**{CurrentSentence.Replace(" ", " \x200B")}**:book:").ConfigureAwait(false); + try + { + await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **2**...").ConfigureAwait(false); + await Task.Delay(1000).ConfigureAwait(false); + await msg.ModifyAsync(m => m.Content = "Starting new typing contest in **1**...").ConfigureAwait(false); + await Task.Delay(1000).ConfigureAwait(false); + } + catch (Exception ex) { _log.Warn(ex); } + + await msg.ModifyAsync(m => m.Content = $"**{Format.Sanitize(CurrentSentence.Replace(" ", " \x200B")).SanitizeMentions()}").ConfigureAwait(false); sw.Start(); HandleAnswers(); @@ -76,6 +84,10 @@ namespace NadekoBot.Modules.Games return; } + } + catch { } + finally + { await Stop().ConfigureAwait(false); } } @@ -84,7 +96,7 @@ namespace NadekoBot.Modules.Games { using (var uow = DbHandler.UnitOfWork()) { - return uow.TypingArticles.GetRandom()?.Text ?? "No typing articles found. Use `>typeadd` command to add a new article for typing."; + return uow.TypingArticles.GetRandom()?.Text ?? $"No typing articles found. Use {NadekoBot.ModulePrefixes[typeof(Games).Name]}typeadd command to add a new article for typing."; } } @@ -96,6 +108,8 @@ namespace NadekoBot.Modules.Games private Task AnswerReceived(IMessage imsg) { + if (imsg.Author.IsBot) + return Task.CompletedTask; var msg = imsg as IUserMessage; if (msg == null) return Task.CompletedTask; @@ -115,7 +129,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync($"{msg.Author.Mention} finished in **{sw.Elapsed.Seconds}** seconds with { distance } errors, **{ CurrentSentence.Length / WORD_VALUE / sw.Elapsed.Seconds * 60 }** WPM!").ConfigureAwait(false); if (finishedUserIds.Count % 2 == 0) { - await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n:book:**{CurrentSentence}**:book:").ConfigureAwait(false); + await channel.SendMessageAsync($":exclamation: `A lot of people finished, here is the text for those still typing:`\n\n**{Format.Sanitize(CurrentSentence.Replace(" ", " \x200B")).SanitizeMentions()}**").ConfigureAwait(false); } } } @@ -139,7 +153,7 @@ namespace NadekoBot.Modules.Games RunningContests = new ConcurrentDictionary(); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task TypeStart(IUserMessage msg) { @@ -160,7 +174,7 @@ namespace NadekoBot.Modules.Games } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task TypeStop(IUserMessage imsg) { @@ -174,24 +188,26 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync("No contest to stop on this channel.").ConfigureAwait(false); } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Typeadd(IUserMessage imsg, [Remainder] string text) - //{ - // var channel = (ITextChannel)imsg.Channel; + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task Typeadd(IUserMessage imsg, [Remainder] string text) + { + var channel = (ITextChannel)imsg.Channel; - // using (var uow = DbHandler.UnitOfWork()) - // { - // uow.TypingArticles.Add(new Services.Database.Models.TypingArticle - // { - // Author = imsg.Author.Username, - // Text = text - // }); - // } + using (var uow = DbHandler.UnitOfWork()) + { + uow.TypingArticles.Add(new Services.Database.Models.TypingArticle + { + Author = imsg.Author.Username, + Text = text.SanitizeMentions(), + }); + await uow.CompleteAsync().ConfigureAwait(false); + } - // await channel.SendMessageAsync("Added new article for typing game.").ConfigureAwait(false); - //} + await channel.SendMessageAsync("Added new article for typing game.").ConfigureAwait(false); + } } } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs index c4e960a6..2356a6a7 100644 --- a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs +++ b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaGame.cs @@ -1,5 +1,7 @@ using Discord; using NadekoBot.Extensions; +using NLog; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; @@ -12,9 +14,10 @@ namespace NadekoBot.Modules.Games.Trivia public class TriviaGame { private readonly SemaphoreSlim _guessLock = new SemaphoreSlim(1, 1); + private Logger _log { get; } - private IGuild guild { get; } - private ITextChannel channel { get; } + public IGuild guild { get; } + public ITextChannel channel { get; } private int QuestionDurationMiliseconds { get; } = 30000; private int HintTimeoutMiliseconds { get; } = 6000; @@ -33,6 +36,7 @@ namespace NadekoBot.Modules.Games.Trivia public TriviaGame(IGuild guild, ITextChannel channel, bool showHints, int winReq = 10) { + _log = LogManager.GetCurrentClassLogger(); ShowHints = showHints; this.guild = guild; this.channel = channel; @@ -51,13 +55,13 @@ namespace NadekoBot.Modules.Games.Trivia CurrentQuestion = TriviaQuestionPool.Instance.GetRandomQuestion(oldQuestions); if (CurrentQuestion == null) { - await channel.SendMessageAsync($":exclamation: Failed loading a trivia question").ConfigureAwait(false); + try { await channel.SendMessageAsync($":exclamation: Failed loading a trivia question").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } await End().ConfigureAwait(false); return; } oldQuestions.Add(CurrentQuestion); //add it to exclusion list so it doesn't show up again //sendquestion - await channel.SendMessageAsync($":question: **{CurrentQuestion.Question}**").ConfigureAwait(false); + try { await channel.SendMessageAsync($":question: **{CurrentQuestion.Question}**").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } //receive messages NadekoBot.Client.MessageReceived += PotentialGuess; @@ -70,7 +74,7 @@ namespace NadekoBot.Modules.Games.Trivia //hint await Task.Delay(HintTimeoutMiliseconds, token).ConfigureAwait(false); if (ShowHints) - await channel.SendMessageAsync($":exclamation:**Hint:** {CurrentQuestion.GetHint()}").ConfigureAwait(false); + try { await channel.SendMessageAsync($":exclamation:**Hint:** {CurrentQuestion.GetHint()}").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } //timeout await Task.Delay(QuestionDurationMiliseconds - HintTimeoutMiliseconds, token).ConfigureAwait(false); @@ -79,7 +83,7 @@ namespace NadekoBot.Modules.Games.Trivia catch (TaskCanceledException) { } //means someone guessed the answer GameActive = false; if (!triviaCancelSource.IsCancellationRequested) - await channel.SendMessageAsync($":clock2: :question: **Time's up!** The correct answer was **{CurrentQuestion.Answer}**").ConfigureAwait(false); + try { await channel.SendMessageAsync($":clock2: :question: **Time's up!** The correct answer was **{CurrentQuestion.Answer}**").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } NadekoBot.Client.MessageReceived -= PotentialGuess; // load next question if game is still running await Task.Delay(2000).ConfigureAwait(false); @@ -96,12 +100,14 @@ namespace NadekoBot.Modules.Games.Trivia public async Task StopGame() { if (!ShouldStopGame) - await channel.SendMessageAsync(":exclamation: Trivia will stop after this question.").ConfigureAwait(false); + try { await channel.SendMessageAsync(":exclamation: Trivia will stop after this question.").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } ShouldStopGame = true; } private Task PotentialGuess(IMessage imsg) { + if (imsg.Author.IsBot) + return Task.CompletedTask; var umsg = imsg as IUserMessage; if (umsg == null) return Task.CompletedTask; @@ -111,7 +117,7 @@ namespace NadekoBot.Modules.Games.Trivia { if (!(umsg.Channel is IGuildChannel && umsg.Channel is ITextChannel)) return; if ((umsg.Channel as ITextChannel).Guild != guild) return; - if (umsg.Author.Id == (await NadekoBot.Client.GetCurrentUserAsync()).Id) return; + if (umsg.Author.Id == NadekoBot.Client.GetCurrentUser().Id) return; var guildUser = umsg.Author as IGuildUser; @@ -128,13 +134,13 @@ namespace NadekoBot.Modules.Games.Trivia finally { _guessLock.Release(); } if (!guess) return; triviaCancelSource.Cancel(); - await channel.SendMessageAsync($"☑️ {guildUser.Mention} guessed it! The answer was: **{CurrentQuestion.Answer}**").ConfigureAwait(false); + try { await channel.SendMessageAsync($"☑️ {guildUser.Mention} guessed it! The answer was: **{CurrentQuestion.Answer}**").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } if (Users[guildUser] != WinRequirement) return; ShouldStopGame = true; await channel.SendMessageAsync($":exclamation: We have a winner! It's {guildUser.Mention}.").ConfigureAwait(false); } - catch { } - }); + catch (Exception ex) { _log.Warn(ex); } + }); return Task.CompletedTask; } diff --git a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs index 9682bbef..3afa8a9c 100644 --- a/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs +++ b/src/NadekoBot/Modules/Games/Commands/Trivia/TriviaQuestionPool.cs @@ -1,6 +1,8 @@ -using NadekoBot.Services; +using NadekoBot.Extensions; +using NadekoBot.Services; using Newtonsoft.Json.Linq; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -10,7 +12,7 @@ namespace NadekoBot.Modules.Games.Trivia public class TriviaQuestionPool { public static TriviaQuestionPool Instance { get; } = new TriviaQuestionPool(); - public HashSet pool = new HashSet(); + public ConcurrentHashSet pool = new ConcurrentHashSet(); private Random rng { get; } = new NadekoRandom(); @@ -30,15 +32,15 @@ namespace NadekoBot.Modules.Games.Trivia public void Reload() { - var arr = JArray.Parse(File.ReadAllText("data/triviaquestions.json")); + var arr = JArray.Parse(File.ReadAllText("data/questions.json")); foreach (var item in arr) { - var tq = new TriviaQuestion(item["Question"].ToString(), item["Answer"].ToString(), item["Category"]?.ToString()); + var tq = new TriviaQuestion(item["Question"].ToString().SanitizeMentions(), item["Answer"].ToString().SanitizeMentions(), item["Category"]?.ToString()); pool.Add(tq); } var r = new NadekoRandom(); - pool = new HashSet(pool.OrderBy(x => r.Next())); + pool = new ConcurrentHashSet(pool.OrderBy(x => r.Next())); } } } diff --git a/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs b/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs index 63a8a820..56fd3fc1 100644 --- a/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/TriviaCommands.cs @@ -17,7 +17,7 @@ namespace NadekoBot.Modules.Games { public static ConcurrentDictionary RunningTrivias = new ConcurrentDictionary(); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Trivia(IUserMessage umsg, params string[] args) { @@ -44,7 +44,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync("Trivia game is already running on this server.\n" + trivia.CurrentQuestion).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Tl(IUserMessage umsg) { @@ -57,7 +57,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync("No trivia is running on this server.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Tq(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Games/Games.cs b/src/NadekoBot/Modules/Games/Games.cs index 99083ae7..81a3532d 100644 --- a/src/NadekoBot/Modules/Games/Games.cs +++ b/src/NadekoBot/Modules/Games/Games.cs @@ -23,11 +23,11 @@ namespace NadekoBot.Modules.Games } } } - public Games(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + public Games(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Choose(IUserMessage umsg, [Remainder] string list = null) { @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Games await channel.SendMessageAsync(listArr[rng.Next(0, listArr.Length)]).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task _8Ball(IUserMessage umsg, [Remainder] string question = null) { @@ -54,7 +54,7 @@ namespace NadekoBot.Modules.Games 🎱 `8Ball Answers` __**{_8BallResponses.Shuffle().FirstOrDefault()}**__").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Rps(IUserMessage umsg, string input) { @@ -97,14 +97,14 @@ namespace NadekoBot.Modules.Games else if ((pick == 0 && nadekoPick == 1) || (pick == 1 && nadekoPick == 2) || (pick == 2 && nadekoPick == 0)) - msg = $"{(await NadekoBot.Client.GetCurrentUserAsync()).Mention} won! :{GetRPSPick(nadekoPick)}: beats :{GetRPSPick(pick)}:"; + msg = $"{NadekoBot.Client.GetCurrentUser().Mention} won! :{GetRPSPick(nadekoPick)}: beats :{GetRPSPick(pick)}:"; else msg = $"{umsg.Author.Mention} won! :{GetRPSPick(pick)}: beats :{GetRPSPick(nadekoPick)}:"; await channel.SendMessageAsync(msg).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Linux(IUserMessage umsg, string guhnoo, string loonix) { diff --git a/src/NadekoBot/Modules/Help/Help.cs b/src/NadekoBot/Modules/Help/Help.cs index 070b6930..b9b90702 100644 --- a/src/NadekoBot/Modules/Help/Help.cs +++ b/src/NadekoBot/Modules/Help/Help.cs @@ -9,44 +9,56 @@ using System; using System.IO; using System.Text; using Discord.WebSocket; +using System.Collections; +using System.Collections.Generic; +using NadekoBot.Services.Database; +using System.Threading; namespace NadekoBot.Modules.Help { [NadekoModule("Help", "-")] public partial class Help : DiscordModule { - public string HelpString { - get { - var str = "To add me to your server, use this link -> \n"; - return str + String.Format(str, NadekoBot.Credentials.ClientId); + private static string helpString { get; } + public static string HelpString => String.Format(helpString, NadekoBot.Credentials.ClientId, NadekoBot.ModulePrefixes[typeof(Help).Name]); + + public static string DMHelpString { get; } + + static Help() + { + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.BotConfig.GetOrCreate(); + helpString = config.HelpString; + DMHelpString = config.DMHelpString; } } - public Help(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + + public Help(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] + [NadekoCommand, Usage, Description, Aliases] public async Task Modules(IUserMessage umsg) { - var channel = (ITextChannel)umsg.Channel; - await channel.SendMessageAsync("`List of modules:` \n• " + string.Join("\n• ", _commands.Modules.Select(m => m.Name)) + $"\n`Type \"-commands module_name\" to get a list of commands in that module.`") + await umsg.Channel.SendMessageAsync("`List of modules:` ```xl\n• " + string.Join("\n• ", _commands.Modules.Select(m => m.Name)) + $"\n``` `Type \"-commands module_name\" to get a list of commands in that module.`") .ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] + [NadekoCommand, Usage, Description, Aliases] public async Task Commands(IUserMessage umsg, [Remainder] string module = null) { - var channel = (ITextChannel)umsg.Channel; + var channel = umsg.Channel; module = module?.Trim().ToUpperInvariant(); if (string.IsNullOrWhiteSpace(module)) return; var cmds = _commands.Commands.Where(c => c.Module.Name.ToUpperInvariant().StartsWith(module)) .OrderBy(c => c.Text) + .Distinct(new CommandTextEqualityComparer()) .AsEnumerable(); + var cmdsArray = cmds as Command[] ?? cmds.ToArray(); if (!cmdsArray.Any()) { @@ -61,19 +73,19 @@ namespace NadekoBot.Modules.Help { await channel.SendMessageAsync("`List Of Commands:`\n• " + string.Join("\n• ", cmdsArray.Select(c => $"{c.Text}"))); } - await channel.SendMessageAsync($"`You can type \"-h command_name\" to see the help about that specific command.`").ConfigureAwait(false); + await channel.SendMessageAsync($"`You can type \"{NadekoBot.ModulePrefixes[typeof(Help).Name]}h CommandName\" to see the help about that specific command.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] + [NadekoCommand, Usage, Description, Aliases] public async Task H(IUserMessage umsg, [Remainder] string comToFind = null) { - var channel = (ITextChannel)umsg.Channel; + var channel = umsg.Channel; comToFind = comToFind?.ToLowerInvariant(); if (string.IsNullOrWhiteSpace(comToFind)) { - await (await (umsg.Author as IGuildUser).CreateDMChannelAsync()).SendMessageAsync(HelpString).ConfigureAwait(false); + IMessageChannel ch = channel is ITextChannel ? await ((IGuildUser)umsg.Author).CreateDMChannelAsync() : channel; + await ch.SendMessageAsync(HelpString).ConfigureAwait(false); return; } var com = _commands.Commands.FirstOrDefault(c => c.Text.ToLowerInvariant() == comToFind || c.Aliases.Select(a=>a.ToLowerInvariant()).Contains(comToFind)); @@ -88,18 +100,34 @@ namespace NadekoBot.Modules.Help if (alias != null) str += $" / `{ alias }`"; if (com != null) - await channel.SendMessageAsync(str + $@"{Environment.NewLine}**Desc:** {com.Description} -**Usage:** {com.Summary}").ConfigureAwait(false); + await channel.SendMessageAsync(str + $@"{Environment.NewLine}**Desc:** {com.Summary} {GetCommandRequirements(com)} +**Usage:** {com.Remarks}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + private string GetCommandRequirements(Command cmd) + { + return String.Join(" ", cmd.Source.CustomAttributes + .Where(ca => ca.AttributeType == typeof(OwnerOnlyAttribute) || ca.AttributeType == typeof(RequirePermissionAttribute)) + .Select(ca => + { + if (ca.AttributeType == typeof(OwnerOnlyAttribute)) + return "**Bot owner only.**"; + else if (ca.AttributeType == typeof(RequirePermissionAttribute)) + return $"**Requires {(GuildPermission)ca.ConstructorArguments.FirstOrDefault().Value} server permission.**".Replace("Guild", "Server"); + else + return $"**Requires {(GuildPermission)ca.ConstructorArguments.FirstOrDefault().Value} channel permission.**".Replace("Guild", "Server"); + })); + } + + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task Hgit(IUserMessage umsg) + [OwnerOnly] + public Task Hgit(IUserMessage umsg) { var helpstr = new StringBuilder(); var lastModule = ""; - foreach (var com in _commands.Commands) + foreach (var com in _commands.Commands.GroupBy(c=>c.Text).Select(g=>g.First())) { if (com.Module.Name != lastModule) { @@ -108,17 +136,18 @@ namespace NadekoBot.Modules.Help helpstr.AppendLine("----------------|--------------|-------"); lastModule = com.Module.Name; } - helpstr.AppendLine($"`{com.Text}` {string.Join(" ", com.Aliases.Skip(1).Select(a=>"`"+a+"`"))} | {com.Description} | {com.Summary}"); + helpstr.AppendLine($"`{com.Text}` {string.Join(" ", com.Aliases.Skip(1).Select(a=>"`"+a+"`"))} | {com.Summary} | {com.Remarks} {GetCommandRequirements(com)}"); } - helpstr = helpstr.Replace((await NadekoBot.Client.GetCurrentUserAsync()).Username , "@BotName"); + helpstr = helpstr.Replace(NadekoBot.Client.GetCurrentUser().Username , "@BotName"); #if DEBUG - File.WriteAllText("../../../../../docs/Commands List.md", helpstr.ToString()); + File.WriteAllText("../../docs/Commands List.md", helpstr.ToString()); #else File.WriteAllText("commandlist.md", helpstr.ToString()); #endif + return Task.CompletedTask; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Guide(IUserMessage umsg) { @@ -129,7 +158,7 @@ namespace NadekoBot.Modules.Help **Hosting Guides and docs can be found here**: ").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Donate(IUserMessage umsg) { @@ -143,4 +172,12 @@ Don't forget to leave your discord name or id in the message. **Thank you** ♥️").ConfigureAwait(false); } } + + public class CommandTextEqualityComparer : IEqualityComparer + { + public bool Equals(Command x, Command y) => x.Text == y.Text; + + public int GetHashCode(Command obj) => obj.Text.GetHashCode(); + + } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Music/Classes/MusicControls.cs b/src/NadekoBot/Modules/Music/Classes/MusicControls.cs index 233bca09..fa4e2302 100644 --- a/src/NadekoBot/Modules/Music/Classes/MusicControls.cs +++ b/src/NadekoBot/Modules/Music/Classes/MusicControls.cs @@ -252,7 +252,7 @@ namespace NadekoBot.Modules.Music.Classes playlist.Clear(); if (!SongCancelSource.IsCancellationRequested) SongCancelSource.Cancel(); - await audioClient.DisconnectAsync(); + await audioClient.DisconnectAsync(); }); } diff --git a/src/NadekoBot/Modules/Music/Music.cs b/src/NadekoBot/Modules/Music/Music.cs index 5675eff1..aabe19cf 100644 --- a/src/NadekoBot/Modules/Music/Music.cs +++ b/src/NadekoBot/Modules/Music/Music.cs @@ -14,10 +14,11 @@ using System.Net.Http; using Newtonsoft.Json.Linq; using System.Collections.Generic; using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; namespace NadekoBot.Modules.Music { - [NadekoModule("ClashOfClans", "!!")] + [NadekoModule("Music", "!!")] public partial class Music : DiscordModule { public static ConcurrentDictionary MusicPlayers = new ConcurrentDictionary(); @@ -25,7 +26,7 @@ namespace NadekoBot.Modules.Music public const string MusicDataPath = "data/musicdata"; private IGoogleApiService _google; - public Music(ILocalization loc, CommandService cmds, DiscordSocketClient client, IGoogleApiService google) : base(loc, cmds, client) + public Music(ILocalization loc, CommandService cmds, ShardedDiscordClient client, IGoogleApiService google) : base(loc, cmds, client) { //it can fail if its currenctly opened or doesn't exist. Either way i don't care try { Directory.Delete(MusicDataPath, true); } catch { } @@ -35,7 +36,7 @@ namespace NadekoBot.Modules.Music _google = google; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public Task Next(IUserMessage umsg) { @@ -48,7 +49,7 @@ namespace NadekoBot.Modules.Music return Task.CompletedTask; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public Task Stop(IUserMessage umsg) { @@ -64,7 +65,7 @@ namespace NadekoBot.Modules.Music return Task.CompletedTask; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public Task Destroy(IUserMessage umsg) { @@ -77,7 +78,7 @@ namespace NadekoBot.Modules.Music return Task.CompletedTask; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Pause(IUserMessage umsg) { @@ -94,7 +95,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync("🎵`Music Player unpaused.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Queue(IUserMessage umsg, [Remainder] string query) { @@ -108,7 +109,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task SoundCloudQueue(IUserMessage umsg, [Remainder] string query) { @@ -122,7 +123,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ListQueue(IUserMessage umsg, int page = 1) { @@ -155,7 +156,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync(toSend + string.Join("\n", musicPlayer.Playlist.Skip(startAt).Take(15).Select(v => $"`{number++}.` {v.PrettyName}"))).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task NowPlaying(IUserMessage umsg) { @@ -170,7 +171,7 @@ namespace NadekoBot.Modules.Music $"{currentSong.PrettyCurrentTime()}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Volume(IUserMessage umsg, int val) { @@ -186,7 +187,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵 `Volume set to {volume}%`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Defvol(IUserMessage umsg, [Remainder] int val) { @@ -205,37 +206,9 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵 `Default volume set to {val}%`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public Task Mute(IUserMessage umsg) - { - var channel = (ITextChannel)umsg.Channel; - MusicPlayer musicPlayer; - if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) - return Task.CompletedTask; - if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel) - return Task.CompletedTask; - musicPlayer.SetVolume(0); - return Task.CompletedTask; - } - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] - public Task Max(IUserMessage umsg) - { - var channel = (ITextChannel)umsg.Channel; - MusicPlayer musicPlayer; - if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) - return Task.CompletedTask; - if (((IGuildUser)umsg.Author).VoiceChannel != musicPlayer.PlaybackVoiceChannel) - return Task.CompletedTask; - musicPlayer.SetVolume(100); - return Task.CompletedTask; - } - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] - public async Task Shuffle(IUserMessage umsg) + public async Task ShufflePlaylist(IUserMessage umsg) { var channel = (ITextChannel)umsg.Channel; MusicPlayer musicPlayer; @@ -253,7 +226,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync("🎵 `Songs shuffled.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Playlist(IUserMessage umsg, [Remainder] string playlist) { @@ -295,7 +268,7 @@ namespace NadekoBot.Modules.Music await msg.ModifyAsync(m => m.Content = "🎵 `Playlist queue complete.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task SoundCloudPl(IUserMessage umsg, [Remainder] string pl) { @@ -332,8 +305,9 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task LocalPl(IUserMessage umsg, [Remainder] string directory) { var channel = (ITextChannel)umsg.Channel; @@ -361,7 +335,7 @@ namespace NadekoBot.Modules.Music catch { } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Radio(IUserMessage umsg, string radio_link) { @@ -379,8 +353,9 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [OwnerOnly] public async Task Local(IUserMessage umsg, [Remainder] string path) { var channel = (ITextChannel)umsg.Channel; @@ -391,7 +366,7 @@ namespace NadekoBot.Modules.Music } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Move(IUserMessage umsg) { @@ -403,7 +378,7 @@ namespace NadekoBot.Modules.Music await musicPlayer.MoveToVoiceChannel(voiceChannel); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Remove(IUserMessage umsg, int num) { @@ -423,7 +398,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵**Track {song.PrettyName} at position `#{num}` has been removed.**").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Remove(IUserMessage umsg, string all) { @@ -438,7 +413,7 @@ namespace NadekoBot.Modules.Music return; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task MoveSong(IUserMessage umsg, [Remainder] string fromto) { @@ -474,7 +449,7 @@ namespace NadekoBot.Modules.Music } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task SetMaxQueue(IUserMessage umsg, uint size) { @@ -488,7 +463,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵 `Max queue set to {(size == 0 ? ("unlimited") : size + " tracks")}`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ReptCurSong(IUserMessage umsg) { @@ -506,7 +481,7 @@ namespace NadekoBot.Modules.Music .ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task RepeatPl(IUserMessage umsg) { @@ -518,40 +493,135 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"🎵🔁`Repeat playlist {(currentValue ? "enabled" : "disabled")}`").ConfigureAwait(false); } - /// - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Save(IUserMessage umsg, [Remainder] string name) - //{ - // var channel = (ITextChannel)umsg.Channel; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task Save(IUserMessage umsg, [Remainder] string name) + { + var channel = (ITextChannel)umsg.Channel; + MusicPlayer musicPlayer; + if (!MusicPlayers.TryGetValue(channel.Guild.Id, out musicPlayer)) + return; - //} + var curSong = musicPlayer.CurrentSong; + var songs = musicPlayer.Playlist.Append(curSong) + .Select(s=> new PlaylistSong() { + Provider = s.SongInfo.Provider, + ProviderType = s.SongInfo.ProviderType, + Title = s.SongInfo.Title, + Uri = s.SongInfo.Uri, + Query = s.SongInfo.Query, + }).ToList(); - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Load(IUserMessage umsg, [Remainder] string name) - //{ - // var channel = (ITextChannel)umsg.Channel; + MusicPlaylist playlist; + using (var uow = DbHandler.UnitOfWork()) + { + playlist = new MusicPlaylist + { + Name = name, + Author = umsg.Author.Username, + AuthorId = umsg.Author.Id, + Songs = songs, + }; + uow.MusicPlaylists.Add(playlist); + await uow.CompleteAsync().ConfigureAwait(false); + } - //} + await channel.SendMessageAsync(($"🎵 `Saved playlist as {name}.` `Id: {playlist.Id}`")).ConfigureAwait(false); + } - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Playlists(IUserMessage umsg, [Remainder] string num) - //{ - // var channel = (ITextChannel)umsg.Channel; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task Load(IUserMessage umsg, [Remainder] int id) + { + var channel = (ITextChannel)umsg.Channel; - //} + MusicPlaylist mpl; + using (var uow = DbHandler.UnitOfWork()) + { + mpl = uow.MusicPlaylists.GetWithSongs(id); + } - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task DeletePlaylist(IUserMessage umsg, [Remainder] string pl) - //{ - // var channel = (ITextChannel)umsg.Channel; + if (mpl == null) + { + await channel.SendMessageAsync("`Can't find playlist with that ID`").ConfigureAwait(false); + return; + } + IUserMessage msg = null; + try { msg = await channel.SendMessageAsync($"`Attempting to load {mpl.Songs.Count} songs...`").ConfigureAwait(false); } catch (Exception ex) { _log.Warn(ex); } + foreach (var item in mpl.Songs) + { + var usr = (IGuildUser)umsg.Author; + try + { + await QueueSong(usr, channel, usr.VoiceChannel, item.Query, true, item.ProviderType).ConfigureAwait(false); + } + catch { break; } + } + if (msg != null) + await msg.ModifyAsync(m => m.Content = $"`Done loading playlist {mpl.Name}.`").ConfigureAwait(false); + } - //} + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task Playlists(IUserMessage umsg, [Remainder] int num = 1) + { + var channel = (ITextChannel)umsg.Channel; - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + if (num <= 0) + return; + + List playlists; + + using (var uow = DbHandler.UnitOfWork()) + { + playlists = uow.MusicPlaylists.GetPlaylistsOnPage(num); + } + + await channel.SendMessageAsync($@"`Page {num} of saved playlists` + +" + string.Join("\n", playlists.Select(r => $"`#{r.Id}` - `{r.Name}` by {r.Author} - **{r.Songs.Count}** songs"))).ConfigureAwait(false); + } + + //todo only author or owner + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task DeletePlaylist(IUserMessage umsg, [Remainder] int id) + { + var channel = (ITextChannel)umsg.Channel; + + bool success = false; + MusicPlaylist pl = null; + try + { + using (var uow = DbHandler.UnitOfWork()) + { + pl = uow.MusicPlaylists.Get(id); + + if (pl != null) + { + if (NadekoBot.Credentials.IsOwner(umsg.Author) || pl.AuthorId == umsg.Author.Id) + { + uow.MusicPlaylists.Remove(pl); + await uow.CompleteAsync().ConfigureAwait(false); + success = true; + } + else + success = false; + } + } + + if (!success) + await channel.SendMessageAsync("Failed to delete that playlist. It either doesn't exist, or you are not its author.").ConfigureAwait(false); + else + await channel.SendMessageAsync("`Playlist successfully deleted.`").ConfigureAwait(false); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Goto(IUserMessage umsg, int time) { @@ -588,7 +658,7 @@ namespace NadekoBot.Modules.Music await channel.SendMessageAsync($"`Skipped to {minutes}:{seconds}`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task GetLink(IUserMessage umsg, int index = 0) { @@ -623,7 +693,7 @@ namespace NadekoBot.Modules.Music } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Autoplay(IUserMessage umsg) { @@ -671,16 +741,13 @@ namespace NadekoBot.Modules.Music await lastFinishedMessage.DeleteAsync().ConfigureAwait(false); if (playingMessage != null) await playingMessage.DeleteAsync().ConfigureAwait(false); - lastFinishedMessage = await textCh.SendMessageAsync($"🎵`Finished`{song.PrettyName}").ConfigureAwait(false); + try { lastFinishedMessage = await textCh.SendMessageAsync($"🎵`Finished`{song.PrettyName}").ConfigureAwait(false); } catch { } if (mp.Autoplay && mp.Playlist.Count == 0 && song.SongInfo.Provider == "YouTube") { await QueueSong(queuer.Guild.GetCurrentUser(), textCh, voiceCh, (await NadekoBot.Google.GetRelatedVideosAsync(song.SongInfo.Query, 4)).ToList().Shuffle().FirstOrDefault(), silent, musicType).ConfigureAwait(false); } } - catch (Exception e) - { - Console.WriteLine(e); - } + catch { } } }; mp.OnStarted += async (s, song) => @@ -691,13 +758,8 @@ namespace NadekoBot.Modules.Music if (sender == null) return; - try - { - var msgTxt = $"🎵`Playing`{song.PrettyName} `Vol: {(int)(sender.Volume * 100)}%`"; - playingMessage = await textCh.SendMessageAsync(msgTxt).ConfigureAwait(false); - } - catch { } + try { playingMessage = await textCh.SendMessageAsync(msgTxt).ConfigureAwait(false); } catch { } } }; return mp; @@ -712,23 +774,25 @@ namespace NadekoBot.Modules.Music } catch (PlaylistFullException) { - await textCh.SendMessageAsync($"🎵 `Queue is full at {musicPlayer.MaxQueueSize}/{musicPlayer.MaxQueueSize}.` "); + try { await textCh.SendMessageAsync($"🎵 `Queue is full at {musicPlayer.MaxQueueSize}/{musicPlayer.MaxQueueSize}.` "); } catch { } throw; } if (!silent) { - var queuedMessage = await textCh.SendMessageAsync($"🎵`Queued`{resolvedSong.PrettyName} **at** `#{musicPlayer.Playlist.Count + 1}`").ConfigureAwait(false); -#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed - Task.Run(async () => + try { - await Task.Delay(10000).ConfigureAwait(false); - try + var queuedMessage = await textCh.SendMessageAsync($"🎵`Queued`{resolvedSong.PrettyName} **at** `#{musicPlayer.Playlist.Count + 1}`").ConfigureAwait(false); + var t = Task.Run(async () => { - await queuedMessage.DeleteAsync().ConfigureAwait(false); - } - catch { } - }).ConfigureAwait(false); -#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed + await Task.Delay(10000).ConfigureAwait(false); + try + { + await queuedMessage.DeleteAsync().ConfigureAwait(false); + } + catch { } + }).ConfigureAwait(false); + } + catch { } // if queued message sending fails, don't attempt to delete it } } } diff --git a/src/NadekoBot/Modules/NSFW/NSFW.cs b/src/NadekoBot/Modules/NSFW/NSFW.cs index cbcfc15d..52a38ce7 100644 --- a/src/NadekoBot/Modules/NSFW/NSFW.cs +++ b/src/NadekoBot/Modules/NSFW/NSFW.cs @@ -18,11 +18,11 @@ namespace NadekoBot.Modules.NSFW [NadekoModule("NSFW", "~")] public class NSFW : DiscordModule { - public NSFW(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + public NSFW(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Hentai(IUserMessage umsg, [Remainder] string tag = null) { @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(String.Join("\n\n", links)).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Danbooru(IUserMessage umsg, [Remainder] string tag = null) { @@ -55,7 +55,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Gelbooru(IUserMessage umsg, [Remainder] string tag = null) { @@ -69,7 +69,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Rule34(IUserMessage umsg, [Remainder] string tag = null) { @@ -83,7 +83,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task E621(IUserMessage umsg, [Remainder] string tag = null) { @@ -97,7 +97,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Cp(IUserMessage umsg) { @@ -106,7 +106,7 @@ namespace NadekoBot.Modules.NSFW await channel.SendMessageAsync("http://i.imgur.com/MZkY1md.jpg").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Boobs(IUserMessage umsg) { @@ -126,7 +126,7 @@ namespace NadekoBot.Modules.NSFW } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Butts(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Permissions/Commands/BlacklistCommands.cs b/src/NadekoBot/Modules/Permissions/Commands/BlacklistCommands.cs new file mode 100644 index 00000000..6f5b3862 --- /dev/null +++ b/src/NadekoBot/Modules/Permissions/Commands/BlacklistCommands.cs @@ -0,0 +1,117 @@ +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using NadekoBot.Modules.Games.Trivia; +using NadekoBot.Services; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static NadekoBot.Services.Database.Models.BlacklistItem; + +namespace NadekoBot.Modules.Permissions +{ + public partial class Permissions + { + public enum AddRemove + { + Add, + Rem + } + + [Group] + public class BlacklistCommands + { + public static ConcurrentHashSet BlacklistedItems { get; set; } = new ConcurrentHashSet(); + + static BlacklistCommands() + { + using (var uow = DbHandler.UnitOfWork()) + { + BlacklistedItems = new ConcurrentHashSet(uow.BotConfig.GetOrCreate().Blacklist); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [OwnerOnly] + public Task UserBlacklist(IUserMessage imsg, AddRemove action, ulong id) + => Blacklist(imsg, action, id, BlacklistType.User); + + [NadekoCommand, Usage, Description, Aliases] + [OwnerOnly] + public Task UserBlacklist(IUserMessage imsg, AddRemove action, IUser usr) + => Blacklist(imsg, action, usr.Id, BlacklistType.User); + + [NadekoCommand, Usage, Description, Aliases] + [OwnerOnly] + public Task ChannelBlacklist(IUserMessage imsg, AddRemove action, ulong id) + => Blacklist(imsg, action, id, BlacklistType.Channel); + + [NadekoCommand, Usage, Description, Aliases] + [OwnerOnly] + public Task ServerBlacklist(IUserMessage imsg, AddRemove action, ulong id) + => Blacklist(imsg, action, id, BlacklistType.Server); + + [NadekoCommand, Usage, Description, Aliases] + [OwnerOnly] + public Task ServerBlacklist(IUserMessage imsg, AddRemove action, IGuild guild) + => Blacklist(imsg, action, guild.Id, BlacklistType.Server); + + private async Task Blacklist(IUserMessage imsg, AddRemove action, ulong id, BlacklistType type) + { + var channel = imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + if (action == AddRemove.Add) + { + var item = new BlacklistItem { ItemId = id, Type = type }; + uow.BotConfig.GetOrCreate().Blacklist.Add(item); + BlacklistedItems.Add(item); + } + else + { + uow.BotConfig.GetOrCreate().Blacklist.RemoveWhere(bi => bi.ItemId == id && bi.Type == type); + var toRemove = BlacklistedItems.FirstOrDefault(bi => bi.ItemId == id && bi.Type == type); + if (toRemove != null) + BlacklistedItems.TryRemove(toRemove); + } + await uow.CompleteAsync().ConfigureAwait(false); + } + if (action == AddRemove.Rem) + { + TriviaGame tg; + switch (type) + { + case BlacklistType.Server: + Games.Games.TriviaCommands.RunningTrivias.TryRemove(id, out tg); + if (tg != null) + { + await tg.StopGame().ConfigureAwait(false); + } + break; + case BlacklistType.Channel: + var item = Games.Games.TriviaCommands.RunningTrivias.FirstOrDefault(kvp => kvp.Value.channel.Id == id); + Games.Games.TriviaCommands.RunningTrivias.TryRemove(item.Key, out tg); + if (tg != null) + { + await tg.StopGame().ConfigureAwait(false); + } + break; + case BlacklistType.User: + break; + default: + break; + } + + } + + await channel.SendMessageAsync(":ok:").ConfigureAwait(false); + } + } + } +} diff --git a/src/NadekoBot/Modules/Permissions/Commands/CmdCdsCommands.cs b/src/NadekoBot/Modules/Permissions/Commands/CmdCdsCommands.cs new file mode 100644 index 00000000..7deaaa1e --- /dev/null +++ b/src/NadekoBot/Modules/Permissions/Commands/CmdCdsCommands.cs @@ -0,0 +1,124 @@ +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Services; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Permissions +{ + public partial class Permissions + { + + public class ActiveCooldown + { + public string Command { get; set; } + public ulong UserId { get; set; } + } + + [Group] + public class CmdCdsCommands + { + public static ConcurrentDictionary> commandCooldowns { get; } + private static ConcurrentDictionary> activeCooldowns = new ConcurrentDictionary>(); + + static CmdCdsCommands() + { + using (var uow = DbHandler.UnitOfWork()) + { + var configs = uow.GuildConfigs.GetAll(); + commandCooldowns = new ConcurrentDictionary>(configs.ToDictionary(k => k.GuildId, v => v.CommandCooldowns)); + } + } + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task CmdCooldown(IUserMessage imsg, Command command, int secs) + { + var channel = (ITextChannel)imsg.Channel; + if (secs < 0 || secs > 3600) + { + await channel.SendMessageAsync("Invalid second parameter. (Must be a number between 0 and 3600)").ConfigureAwait(false); + return; + } + + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + var localSet = commandCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet()); + + config.CommandCooldowns.RemoveWhere(cc => cc.CommandName == command.Text.ToLowerInvariant()); + localSet.RemoveWhere(cc => cc.CommandName == command.Text.ToLowerInvariant()); + if (secs != 0) + { + var cc = new CommandCooldown() + { + CommandName = command.Text.ToLowerInvariant(), + Seconds = secs, + }; + config.CommandCooldowns.Add(cc); + localSet.Add(cc); + } + await uow.CompleteAsync().ConfigureAwait(false); + } + if (secs == 0) + { + var activeCds = activeCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet()); + activeCds.RemoveWhere(ac => ac.Command == command.Text.ToLowerInvariant()); + await channel.SendMessageAsync($"Command **{command}** has no coooldown now and all existing cooldowns have been cleared.").ConfigureAwait(false); + } + else + await channel.SendMessageAsync($"Command **{command}** now has a **{secs} {(secs == 1 ? "second" : "seconds")}** cooldown.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task AllCmdCooldowns(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + var localSet = commandCooldowns.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet()); + + if (!localSet.Any()) + await channel.SendMessageAsync("`No command cooldowns set.`").ConfigureAwait(false); + else + await channel.SendTableAsync("", localSet.Select(c => c.CommandName + ": " + c.Seconds + " secs"), s => $"{s,-30}", 2).ConfigureAwait(false); + } + + public static bool HasCooldown(Command cmd, IGuild guild, IUser user) + { + if (guild == null) + return false; + var cmdcds = CmdCdsCommands.commandCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet()); + CommandCooldown cdRule; + if ((cdRule = cmdcds.FirstOrDefault(cc => cc.CommandName == cmd.Text.ToLowerInvariant())) != null) + { + var activeCdsForGuild = activeCooldowns.GetOrAdd(guild.Id, new ConcurrentHashSet()); + if (activeCdsForGuild.FirstOrDefault(ac => ac.UserId == user.Id && ac.Command == cmd.Text.ToLowerInvariant()) != null) + { + return true; + } + else + { + activeCdsForGuild.Add(new ActiveCooldown() + { + UserId = user.Id, + Command = cmd.Text.ToLowerInvariant(), + }); + var t = Task.Run(async () => + { + await Task.Delay(cdRule.Seconds * 1000); + activeCdsForGuild.RemoveWhere(ac => ac.Command == cmd.Text.ToLowerInvariant() && ac.UserId == user.Id); + }); + } + } + return false; + } + } + } +} diff --git a/src/NadekoBot/Modules/Permissions/Commands/FilterCommands.cs b/src/NadekoBot/Modules/Permissions/Commands/FilterCommands.cs new file mode 100644 index 00000000..b5eaa5df --- /dev/null +++ b/src/NadekoBot/Modules/Permissions/Commands/FilterCommands.cs @@ -0,0 +1,238 @@ +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using NadekoBot.Services; +using NadekoBot.Services.Database; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Permissions +{ + public partial class Permissions + { + [Group] + public class FilterCommands + { + public static ConcurrentHashSet InviteFilteringChannels { get; set; } + public static ConcurrentHashSet InviteFilteringServers { get; set; } + + //serverid, filteredwords + private static ConcurrentDictionary> ServerFilteredWords { get; set; } + + public static ConcurrentHashSet WordFilteringChannels { get; set; } + public static ConcurrentHashSet WordFilteringServers { get; set; } + + public static ConcurrentHashSet FilteredWordsForChannel(ulong channelId, ulong guildId) + { + ConcurrentHashSet words = new ConcurrentHashSet(); + if(WordFilteringChannels.Contains(channelId)) + ServerFilteredWords.TryGetValue(guildId, out words); + return words; + } + + public static ConcurrentHashSet FilteredWordsForServer(ulong guildId) + { + var words = new ConcurrentHashSet(); + if(WordFilteringServers.Contains(guildId)) + ServerFilteredWords.TryGetValue(guildId, out words); + return words; + } + + static FilterCommands() + { + using (var uow = DbHandler.UnitOfWork()) + { + var guildConfigs = uow.GuildConfigs.GetAll(); + + InviteFilteringServers = new ConcurrentHashSet(guildConfigs.Where(gc => gc.FilterInvites).Select(gc => gc.GuildId)); + InviteFilteringChannels = new ConcurrentHashSet(guildConfigs.SelectMany(gc => gc.FilterInvitesChannelIds.Select(fci => fci.ChannelId))); + + var dict = guildConfigs.ToDictionary(gc => gc.GuildId, gc => new ConcurrentHashSet(gc.FilteredWords.Select(fw => fw.Word))); + + ServerFilteredWords = new ConcurrentDictionary>(dict); + + var serverFiltering = guildConfigs.Where(gc => gc.FilterWords); + WordFilteringServers = new ConcurrentHashSet(serverFiltering.Select(gc => gc.GuildId)); + + WordFilteringChannels = new ConcurrentHashSet(guildConfigs.SelectMany(gc => gc.FilterWordsChannelIds.Select(fwci => fwci.ChannelId))); + + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task SrvrFilterInv(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + + bool enabled; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + enabled = config.FilterInvites = !config.FilterInvites; + await uow.CompleteAsync().ConfigureAwait(false); + } + + if (enabled) + { + InviteFilteringServers.Add(channel.Guild.Id); + await channel.SendMessageAsync("`Invite filtering enabled on this server.`").ConfigureAwait(false); + } + else + { + InviteFilteringServers.Remove(channel.Guild.Id); + await channel.SendMessageAsync("`Invite filtering disabled on this server.`").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task ChnlFilterInv(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + + int removed; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + removed = config.FilterInvitesChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); + if (removed == 0) + { + config.FilterInvitesChannelIds.Add(new Services.Database.Models.FilterChannelId() + { + ChannelId = channel.Id + }); + } + await uow.CompleteAsync().ConfigureAwait(false); + } + + if (removed == 0) + { + InviteFilteringChannels.Add(channel.Id); + await channel.SendMessageAsync("`Invite filtering enabled on this channel.`").ConfigureAwait(false); + } + else + { + InviteFilteringChannels.Remove(channel.Id); + await channel.SendMessageAsync("`Invite filtering disabled on this channel.`").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task SrvrFilterWords(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + + bool enabled; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + enabled = config.FilterWords = !config.FilterWords; + await uow.CompleteAsync().ConfigureAwait(false); + } + + if (enabled) + { + WordFilteringServers.Add(channel.Guild.Id); + await channel.SendMessageAsync("`Word filtering enabled on this server.`").ConfigureAwait(false); + } + else + { + WordFilteringServers.Remove(channel.Guild.Id); + await channel.SendMessageAsync("`Word filtering disabled on this server.`").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task ChnlFilterWords(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + + int removed; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + removed = config.FilterWordsChannelIds.RemoveWhere(fc => fc.ChannelId == channel.Id); + if (removed == 0) + { + config.FilterWordsChannelIds.Add(new Services.Database.Models.FilterChannelId() + { + ChannelId = channel.Id + }); + } + await uow.CompleteAsync().ConfigureAwait(false); + } + + if (removed == 0) + { + WordFilteringChannels.Add(channel.Id); + await channel.SendMessageAsync("`Word filtering enabled on this channel.`").ConfigureAwait(false); + } + else + { + WordFilteringChannels.Remove(channel.Id); + await channel.SendMessageAsync("`Word filtering disabled on this channel.`").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task FilterWord(IUserMessage imsg, [Remainder] string word) + { + var channel = (ITextChannel)imsg.Channel; + + word = word?.Trim().ToLowerInvariant(); + + if (string.IsNullOrWhiteSpace(word)) + return; + + int removed; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + + removed = config.FilteredWords.RemoveWhere(fw => fw.Word == word); + + if (removed == 0) + config.FilteredWords.Add(new Services.Database.Models.FilteredWord() { Word = word }); + + await uow.CompleteAsync().ConfigureAwait(false); + } + + var filteredWords = ServerFilteredWords.GetOrAdd(channel.Guild.Id, new ConcurrentHashSet()); + + if (removed == 0) + { + filteredWords.Add(word); + await channel.SendMessageAsync($"Word `{word}` successfully added to the list of filtered words.") + .ConfigureAwait(false); + } + else + { + filteredWords.Remove(word); + await channel.SendMessageAsync($"Word `{word}` removed from the list of filtered words.") + .ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task LstFilterWords(IUserMessage imsg) + { + var channel = (ITextChannel)imsg.Channel; + + ConcurrentHashSet filteredWords; + ServerFilteredWords.TryGetValue(channel.Guild.Id, out filteredWords); + + await channel.SendMessageAsync($"`List of banned words:`\n" + string.Join(",\n", filteredWords)) + .ConfigureAwait(false); + } + } + } +} diff --git a/src/NadekoBot/Modules/Permissions/PermissionExtensions.cs b/src/NadekoBot/Modules/Permissions/PermissionExtensions.cs new file mode 100644 index 00000000..783e2b90 --- /dev/null +++ b/src/NadekoBot/Modules/Permissions/PermissionExtensions.cs @@ -0,0 +1,242 @@ +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using NadekoBot.Services; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Permissions +{ + public static class PermissionExtensions + { + public static bool CheckPermissions(this IEnumerable permsEnumerable, IUserMessage message, Command command) + { + var perms = permsEnumerable as List ?? permsEnumerable.ToList(); + int throwaway; + return perms.CheckPermissions(message, command.Name, command.Module.Name, out throwaway); + } + + public static bool CheckPermissions(this IEnumerable permsEnumerable, IUserMessage message, string commandName, string moduleName) + { + var perms = permsEnumerable as List ?? permsEnumerable.ToList(); + int throwaway; + return perms.CheckPermissions(message, commandName, moduleName, out throwaway); + } + + public static bool CheckPermissions(this IEnumerable permsEnumerable, IUserMessage message, string commandName, string moduleName, out int permIndex) + { + var perms = permsEnumerable as List ?? permsEnumerable.ToList(); + + for (int i = 0; i < perms.Count; i++) + { + var perm = perms[i]; + + var result = perm.CheckPermission(message, commandName, moduleName); + + if (result == null) + { + continue; + } + else + { + permIndex = i; + return result.Value; + } + } + permIndex = -1; //defaut behaviour + return true; + } + + //null = not applicable + //true = applicable, allowed + //false = applicable, not allowed + public static bool? CheckPermission(this Permission perm, IUserMessage message, string commandName, string moduleName) + { + if (!((perm.SecondaryTarget == SecondaryPermissionType.Command && + perm.SecondaryTargetName.ToLowerInvariant() == commandName.ToLowerInvariant()) || + (perm.SecondaryTarget == SecondaryPermissionType.Module && + perm.SecondaryTargetName.ToLowerInvariant() == moduleName.ToLowerInvariant()) || + perm.SecondaryTarget == SecondaryPermissionType.AllModules)) + return null; + + var guildUser = message.Author as IGuildUser; + + switch (perm.PrimaryTarget) + { + case PrimaryPermissionType.User: + if (perm.PrimaryTargetId == message.Author.Id) + return perm.State; + break; + case PrimaryPermissionType.Channel: + if (perm.PrimaryTargetId == message.Channel.Id) + return perm.State; + break; + case PrimaryPermissionType.Role: + if (guildUser == null) + break; + if (guildUser.Roles.Any(r => r.Id == perm.PrimaryTargetId)) + return perm.State; + break; + case PrimaryPermissionType.Server: + if (guildUser == null) + break; + return perm.State; + } + return null; + } + + public static string GetCommand(this Permission perm, IGuild guild = null) + { + var com = ""; + switch (perm.PrimaryTarget) + { + case PrimaryPermissionType.User: + com += "u"; + break; + case PrimaryPermissionType.Channel: + com += "c"; + break; + case PrimaryPermissionType.Role: + com += "r"; + break; + case PrimaryPermissionType.Server: + com += "s"; + break; + } + + switch (perm.SecondaryTarget) + { + case SecondaryPermissionType.Module: + com += "m"; + break; + case SecondaryPermissionType.Command: + com += "c"; + break; + case SecondaryPermissionType.AllModules: + com = "a" + com + "m"; + break; + } + com += " " + (perm.SecondaryTargetName != "*" ? perm.SecondaryTargetName + " " : "") + (perm.State ? "enable" : "disable") + " "; + + switch (perm.PrimaryTarget) + { + case PrimaryPermissionType.User: + if (guild == null) + com += $"<@{perm.PrimaryTargetId}>"; + else + com += guild.GetUser(perm.PrimaryTargetId).ToString() ?? $"<@{perm.PrimaryTargetId}>"; + break; + case PrimaryPermissionType.Channel: + com += $"<#{perm.PrimaryTargetId}>"; + break; + case PrimaryPermissionType.Role: + com += $"<@&{perm.PrimaryTargetId}>"; + break; + case PrimaryPermissionType.Server: + break; + } + + return NadekoBot.ModulePrefixes[typeof(Permissions).Name] + com; + } + + public static void Prepend(this Permission perm, Permission toAdd) + { + perm = perm.GetRoot(); + + perm.Previous = toAdd; + toAdd.Next = perm; + } + + /* /this can't work if index < 0 and perm isn't roo + public static void Insert(this Permission perm, int index, Permission toAdd) + { + if (index < 0) + throw new IndexOutOfRangeException(); + + if (index == 0) + { + perm.Prepend(toAdd); + return; + } + + var atIndex = perm; + var i = 0; + while (i != index) + { + atIndex = atIndex.Next; + i++; + if (atIndex == null) + throw new IndexOutOfRangeException(); + } + var previous = atIndex.Previous; + + //connect right side + atIndex.Previous = toAdd; + toAdd.Next = atIndex; + + //connect left side + toAdd.Previous = previous; + previous.Next = toAdd; + } + */ + public static Permission RemoveAt(this Permission perm, int index) + { + if (index <= 0) //can't really remove at 0, that means deleting the element right now. Just use perm.Next if its 0 + throw new IndexOutOfRangeException(); + + var toRemove = perm; + var i = 0; + while (i != index) + { + toRemove = toRemove.Next; + i++; + if (toRemove == null) + throw new IndexOutOfRangeException(); + } + + toRemove.Previous.Next = toRemove.Next; + if (toRemove.Next != null) + toRemove.Next.Previous = toRemove.Previous; + return toRemove; + } + + public static Permission GetAt(this Permission perm, int index) + { + if (index < 0) + throw new IndexOutOfRangeException(); + var temp = perm; + while (index > 0) { temp = temp?.Next; index--; } + if (temp == null) + throw new IndexOutOfRangeException(); + return temp; + } + + public static int Count(this Permission perm) + { + var i = 1; + var temp = perm; + while ((temp = temp.Next) != null) { i++; } + return i; + } + + public static IEnumerable AsEnumerable(this Permission perm) + { + do yield return perm; + while ((perm = perm.Next) != null); + } + + public static Permission GetRoot(this Permission perm) + { + Permission toReturn; + do toReturn = perm; + while ((perm = perm.Previous) != null); + return toReturn; + } + } +} diff --git a/src/NadekoBot/Modules/Permissions/Permissions.cs b/src/NadekoBot/Modules/Permissions/Permissions.cs index 5619ddf0..d8e2d167 100644 --- a/src/NadekoBot/Modules/Permissions/Permissions.cs +++ b/src/NadekoBot/Modules/Permissions/Permissions.cs @@ -8,32 +8,504 @@ using Discord.Commands; using Discord.WebSocket; using NadekoBot.Services; using Discord; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using Discord.API; namespace NadekoBot.Modules.Permissions { [NadekoModule("Permissions", ";")] - public class Permissions : DiscordModule + public partial class Permissions : DiscordModule { - public Permissions(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + public Permissions(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task UsrCmd(IUserMessage imsg, Command command, PermissionAction action, IGuildUser user) + public async Task Verbose(IUserMessage msg, PermissionAction action) { - var channel = (ITextChannel)imsg.Channel; + var channel = (ITextChannel)msg.Channel; - await channel.SendMessageAsync($"{command.Text} {action.Value} {user}"); + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + config.VerbosePermissions = action.Value; + await uow.CompleteAsync().ConfigureAwait(false); + } + + await channel.SendMessageAsync("I will " + (action.Value ? "now" : "no longer") + " show permission warnings.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task UsrMdl(IUserMessage imsg, Module module, PermissionAction action, IGuildUser user) + public async Task PermRole(IUserMessage msg, [Remainder] IRole role = null) + { + var channel = (ITextChannel)msg.Channel; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(channel.Guild.Id); + if (role == null) + { + await channel.SendMessageAsync($"Current permission role is **{config.PermissionRole}**.").ConfigureAwait(false); + return; + } + else { + config.PermissionRole = role.Name.Trim(); + await uow.CompleteAsync().ConfigureAwait(false); + } + } + + await channel.SendMessageAsync($"Users now require **{role.Name}** role in order to edit permissions.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task ListPerms(IUserMessage msg, int page = 1) + { + var channel = (ITextChannel)msg.Channel; + + if (page < 1 || page > 4) + return; + string toSend = ""; + using (var uow = DbHandler.UnitOfWork()) + { + var perms = uow.GuildConfigs.PermissionsFor(channel.Guild.Id).RootPermission; + var i = 1; + toSend = Format.Code($"Permissions page {page}") + "\n\n" + String.Join("\n", perms.AsEnumerable().Skip((page - 1) * 20).Take(20).Select(p => $"`{(i++)}.` {(p.Next == null ? Format.Bold(p.GetCommand(channel.Guild) + " [uneditable]") : (p.GetCommand(channel.Guild)))}")); + } + + if (string.IsNullOrWhiteSpace(toSend)) + await channel.SendMessageAsync("`No permissions set.`").ConfigureAwait(false); + else + await channel.SendMessageAsync(toSend).ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task RemovePerm(IUserMessage imsg, int index) + { + var channel = (ITextChannel)imsg.Channel; + index -= 1; + try + { + Permission p; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.PermissionsFor(channel.Guild.Id); + var perms = config.RootPermission; + if (index == perms.Count() - 1) + { + return; + } + else if (index == 0) + { + p = perms; + config.RootPermission = perms.Next; + } + else + { + p = perms.RemoveAt(index); + } + await uow.CompleteAsync().ConfigureAwait(false); + } + + using (var uow2 = DbHandler.UnitOfWork()) + { + uow2._context.Remove(p); + uow2._context.SaveChanges(); + } + + await channel.SendMessageAsync($"{imsg.Author.Mention} removed permission **{p.GetCommand(channel.Guild)}** from position #{index + 1}.").ConfigureAwait(false); + } + catch (ArgumentOutOfRangeException) + { + await channel.SendMessageAsync("`No command on that index found.`").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task MovePerm(IUserMessage imsg, int from, int to) + { + from -= 1; + to -= 1; + var channel = (ITextChannel)imsg.Channel; + if (!(from == to || from < 0 || to < 0)) + { + try + { + Permission fromPerm = null; + Permission toPerm = null; + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.PermissionsFor(channel.Guild.Id); + var perms = config.RootPermission; + var root = perms; + var index = 0; + var fromFound = false; + var toFound = false; + while ((!toFound || !fromFound) && perms != null) + { + if (index == from) + { + fromPerm = perms; + fromFound = true; + } + if (index == to) + { + toPerm = perms; + toFound = true; + } + if (!toFound) + { + toPerm = perms; //In case of to > size + } + perms = perms.Next; + index++; + } + if (perms == null) + { + if (!fromFound) + { + await channel.SendMessageAsync($"`Can't find permission at index `#{++from}`").ConfigureAwait(false); + return; + } + + if (!toFound) + { + await channel.SendMessageAsync($"`Can't find permission at index `#{++to}`").ConfigureAwait(false); + return; + } + } + + //Change chain for from indx + var next = fromPerm.Next; + var pre = fromPerm.Previous; + if (pre != null) + pre.Next = next; + if (fromPerm.Next == null || toPerm.Next == null) + { + throw new IndexOutOfRangeException(); + } + next.Previous = pre; + if (from == 0) + { + root = next; + } + await uow.CompleteAsync().ConfigureAwait(false); + //Inserting + if (to > from) + { + fromPerm.Previous = toPerm; + fromPerm.Next = toPerm.Next; + + toPerm.Next.Previous = fromPerm; + toPerm.Next = fromPerm; + } + else + { + pre = toPerm.Previous; + + fromPerm.Next = toPerm; + fromPerm.Previous = pre; + + toPerm.Previous = fromPerm; + if (pre != null) + pre.Next = fromPerm; + } + + config.RootPermission = fromPerm.GetRoot(); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"`Moved permission:` \"{fromPerm.GetCommand(channel.Guild)}\" `from #{++from} to #{++to}.`").ConfigureAwait(false); + return; + } + catch (Exception e) when (e is ArgumentOutOfRangeException || e is IndexOutOfRangeException) + { + } + } + await channel.SendMessageAsync("`Invalid index(es) specified.`").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task SrvrCmd(IUserMessage imsg, Command command, PermissionAction action) { var channel = (ITextChannel)imsg.Channel; - await channel.SendMessageAsync($"{module.Name} {action.Value} {user}"); + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Text.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command on this server.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task SrvrMdl(IUserMessage imsg, Module module, PermissionAction action) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module on this server.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task UsrCmd(IUserMessage imsg, Command command, PermissionAction action, [Remainder] IGuildUser user) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = user.Id, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Text.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{user}` user.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task UsrMdl(IUserMessage imsg, Module module, PermissionAction action, [Remainder] IGuildUser user) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = user.Id, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{user}` user.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task RoleCmd(IUserMessage imsg, Command command, PermissionAction action, [Remainder] IRole role) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Role, + PrimaryTargetId = role.Id, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Text.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{role}` role.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task RoleMdl(IUserMessage imsg, Module module, PermissionAction action, [Remainder] IRole role) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Role, + PrimaryTargetId = role.Id, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{role}` role.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task ChnlCmd(IUserMessage imsg, Command command, PermissionAction action, [Remainder] ITextChannel chnl) + { + var channel = (ITextChannel)imsg.Channel; + try + { + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Channel, + PrimaryTargetId = chnl.Id, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Text.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + } + catch (Exception ex) { + Console.WriteLine(ex); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{command.Text}` command for `{chnl}` channel.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task ChnlMdl(IUserMessage imsg, Module module, PermissionAction action, [Remainder] ITextChannel chnl) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Channel, + PrimaryTargetId = chnl.Id, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `{module.Name}` module for `{chnl}` channel.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task AllChnlMdls(IUserMessage imsg, PermissionAction action, [Remainder] ITextChannel chnl) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Channel, + PrimaryTargetId = chnl.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` for `{chnl}` channel.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task AllRoleMdls(IUserMessage imsg, PermissionAction action, [Remainder] IRole role) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Role, + PrimaryTargetId = role.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` for `{role}` role.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task AllUsrMdls(IUserMessage imsg, PermissionAction action, [Remainder] IUser user) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = user.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` for `{user}` user.").ConfigureAwait(false); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task AllSrvrMdls(IUserMessage imsg, PermissionAction action) + { + var channel = (ITextChannel)imsg.Channel; + + using (var uow = DbHandler.UnitOfWork()) + { + var newPerm = new Permission + { + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }; + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, newPerm); + + var allowUser = new Permission + { + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = imsg.Author.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = true, + }; + + uow.GuildConfigs.SetNewRootPermission(channel.Guild.Id, allowUser); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync($"{(action.Value ? "Allowed" : "Denied")} usage of `ALL MODULES` on this server.").ConfigureAwait(false); } } } diff --git a/src/NadekoBot/Modules/Pokemon/Pokemon.cs b/src/NadekoBot/Modules/Pokemon/Pokemon.cs deleted file mode 100644 index 31082944..00000000 --- a/src/NadekoBot/Modules/Pokemon/Pokemon.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Discord.Commands; -using Discord; -using NadekoBot.Attributes; -using System.Threading.Tasks; -using NadekoBot.Services; -using Discord.WebSocket; - -namespace NadekoBot.Modules.Games -{ - [Module(">", AppendSpace = false)] - public partial class Pokemon : DiscordModule - { - public Pokemon(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) - { - } - - //todo Dragon should PR this in - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] - public async Task Poke(IUserMessage umsg) - { - var channel = (ITextChannel)umsg.Channel; - - - } - } -} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs b/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs index dd96cf0e..27320f0d 100644 --- a/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/AnimeSearchCommands.cs @@ -29,7 +29,7 @@ namespace NadekoBot.Modules.Searches _log = LogManager.GetCurrentClassLogger(); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Anime(IUserMessage umsg, [Remainder] string query) { @@ -43,7 +43,7 @@ namespace NadekoBot.Modules.Searches await channel.SendMessageAsync(result.ToString() ?? "`No anime found.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Manga(IUserMessage umsg, [Remainder] string query) { diff --git a/src/NadekoBot/Modules/Translator/GoogleTranslator.cs b/src/NadekoBot/Modules/Searches/Commands/GoogleTranslator.cs similarity index 99% rename from src/NadekoBot/Modules/Translator/GoogleTranslator.cs rename to src/NadekoBot/Modules/Searches/Commands/GoogleTranslator.cs index 7421db47..769d2a80 100644 --- a/src/NadekoBot/Modules/Translator/GoogleTranslator.cs +++ b/src/NadekoBot/Modules/Searches/Commands/GoogleTranslator.cs @@ -5,7 +5,7 @@ using System.Net; using System.Net.Http; using System.Threading.Tasks; -namespace NadekoBot.Modules.Translator +namespace NadekoBot.Modules.Searches { public class GoogleTranslator { diff --git a/src/NadekoBot/Modules/Searches/Commands/IMDB/ImdbScraper.cs b/src/NadekoBot/Modules/Searches/Commands/IMDB/ImdbScraper.cs index fc8c7ec8..32f2c34f 100644 --- a/src/NadekoBot/Modules/Searches/Commands/IMDB/ImdbScraper.cs +++ b/src/NadekoBot/Modules/Searches/Commands/IMDB/ImdbScraper.cs @@ -140,10 +140,7 @@ namespace NadekoBot.Modules.Searches.IMDB List list = new List(); string recUrl = "http://www.imdb.com/widget/recommendations/_ajax/get_more_recs?specs=p13nsims%3A" + mov.Id; string json = await GetUrlDataAsync(recUrl); - list = MatchAll(@"title=\\""(.*?)\\""", json); - HashSet set = new HashSet(); - foreach (String rec in list) set.Add(rec); - return new List(set.ToList()); + return MatchAll(@"title=\\""(.*?)\\""", json); } /*******************************[ Helper Methods ]********************************/ //Match single instance diff --git a/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs b/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs index 4bacbb52..b291aadd 100644 --- a/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/JokeCommands.cs @@ -42,7 +42,7 @@ namespace NadekoBot.Modules.Searches _log.Warn("data/magicitems.json is missing. Magic items are not loaded."); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Yomama(IUserMessage umsg) { @@ -54,7 +54,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Randjoke(IUserMessage umsg) { @@ -66,7 +66,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ChuckNorris(IUserMessage umsg) { @@ -78,7 +78,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task WowJoke(IUserMessage umsg) { @@ -90,7 +90,7 @@ namespace NadekoBot.Modules.Searches await channel.SendMessageAsync(wowJokes[new NadekoRandom().Next(0, wowJokes.Count)].ToString()); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task MagicItem(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs b/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs index 0dc758e3..2108878f 100644 --- a/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/LoLCommands.cs @@ -32,7 +32,7 @@ namespace NadekoBot.Modules.Searches "Doesn't matter what you ban really. Enemy will ban your main and you will lose." }; - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Lolban(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs b/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs index 43b6fbe4..d35c37d2 100644 --- a/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/MemegenCommands.cs @@ -15,7 +15,7 @@ namespace NadekoBot.Modules.Searches { public partial class Searches { - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Memelist(IUserMessage umsg) { @@ -29,7 +29,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Memegen(IUserMessage umsg, string meme, string topText, string botText) { diff --git a/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs b/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs index fffe02e2..0f02a9e1 100644 --- a/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/OsuCommands.cs @@ -25,9 +25,9 @@ namespace NadekoBot.Modules.Searches { _log = LogManager.GetCurrentClassLogger(); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task Osu(IUserMessage umsg, string usr, string mode) + public async Task Osu(IUserMessage umsg, string usr, [Remainder] string mode = null) { var channel = (ITextChannel)umsg.Channel; @@ -47,8 +47,7 @@ namespace NadekoBot.Modules.Searches var res = await http.GetStreamAsync(new Uri($"http://lemmmy.pw/osusig/sig.php?uname={ usr }&flagshadow&xpbar&xpbarhex&pp=2&mode={m}")).ConfigureAwait(false); res.Position = 0; - await channel.SendFileAsync(res, $"{usr}.png").ConfigureAwait(false); - await channel.SendMessageAsync($"`Profile Link:`https://osu.ppy.sh/u/{Uri.EscapeDataString(usr)}\n`Image provided by https://lemmmy.pw/osusig`").ConfigureAwait(false); + await channel.SendFileAsync(res, $"{usr}.png", $"`Profile Link:`https://osu.ppy.sh/u/{Uri.EscapeDataString(usr)}\n`Image provided by https://lemmmy.pw/osusig`").ConfigureAwait(false); } catch (Exception ex) { @@ -58,7 +57,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Osub(IUserMessage umsg, [Remainder] string map) { @@ -95,7 +94,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Osu5(IUserMessage umsg, string user, [Remainder] string mode) { diff --git a/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs b/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs index e090d09f..efb7ee93 100644 --- a/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/PokemonSearchCommands.cs @@ -38,7 +38,7 @@ namespace NadekoBot.Modules.Searches _log.Warn(PokemonAbilitiesFile + " is missing. Pokemon abilities not loaded."); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Pokemon(IUserMessage umsg, [Remainder] string pokemon = null) { @@ -59,7 +59,7 @@ namespace NadekoBot.Modules.Searches await channel.SendMessageAsync("`No pokemon found.`"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task PokemonAbility(IUserMessage umsg, [Remainder] string ability = null) { diff --git a/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs b/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs index b313bf63..b18bd349 100644 --- a/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/StreamNotificationCommands.cs @@ -68,9 +68,9 @@ namespace NadekoBot.Modules.Searches msg += $"\n`Here is the Link:`【 http://www.twitch.tv/{stream.Username}/ 】"; else if (stream.Type == FollowedStream.FollowedStreamType.Beam) msg += $"\n`Here is the Link:`【 http://www.beam.pro/{stream.Username}/ 】"; - //else if (stream.Type == FollowedStream.FollowedStreamType.YoutubeGaming) - // msg += $"\n`Here is the Link:`【 not implemented yet - {stream.Username} 】"; - await channel.SendMessageAsync(msg).ConfigureAwait(false); + //else if (stream.Type == FollowedStream.FollowedStreamType.YoutubeGaming) + // msg += $"\n`Here is the Link:`【 not implemented yet - {stream.Username} 】"; + try { await channel.SendMessageAsync(msg).ConfigureAwait(false); } catch { } } } FirstPass = false; @@ -101,7 +101,7 @@ namespace NadekoBot.Modules.Searches cachedStatuses.TryAdd(hitboxUrl, result); return result; case FollowedStream.FollowedStreamType.Twitch: - var twitchUrl = $"https://api.twitch.tv/kraken/streams/{Uri.EscapeUriString(stream.Username)}"; + var twitchUrl = $"https://api.twitch.tv/kraken/streams/{Uri.EscapeUriString(stream.Username)}?client_id=67w6z9i09xv2uoojdm9l0wsyph4hxo6"; if (checkCache && cachedStatuses.TryGetValue(twitchUrl, out result)) return result; using (var http = new HttpClient()) @@ -110,7 +110,7 @@ namespace NadekoBot.Modules.Searches } data = JObject.Parse(response); isLive = !string.IsNullOrWhiteSpace(data["stream"].ToString()); - result = new Tuple(isLive, isLive ? data["stream"]["viewers"].ToString() : "0"); + result = new Tuple(isLive, isLive ? data["stream"]["viewers"].ToString() : stream.Username); cachedStatuses.TryAdd(twitchUrl, result); return result; case FollowedStream.FollowedStreamType.Beam: @@ -132,28 +132,28 @@ namespace NadekoBot.Modules.Searches return new Tuple(false, "0"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageMessages)] public async Task Hitbox(IUserMessage msg, [Remainder] string username) => await TrackStream((ITextChannel)msg.Channel, username, FollowedStream.FollowedStreamType.Hitbox) .ConfigureAwait(false); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageMessages)] public async Task Twitch(IUserMessage msg, [Remainder] string username) => await TrackStream((ITextChannel)msg.Channel, username, FollowedStream.FollowedStreamType.Twitch) .ConfigureAwait(false); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequirePermission(GuildPermission.ManageMessages)] public async Task Beam(IUserMessage msg, [Remainder] string username) => await TrackStream((ITextChannel)msg.Channel, username, FollowedStream.FollowedStreamType.Beam) .ConfigureAwait(false); - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ListStreams(IUserMessage imsg) { @@ -179,7 +179,7 @@ namespace NadekoBot.Modules.Searches await channel.SendMessageAsync($"You are following **{streams.Count()}** streams on this server.\n\n" + text).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task RemoveStream(IUserMessage msg, [Remainder] string username) { @@ -207,7 +207,7 @@ namespace NadekoBot.Modules.Searches await channel.SendMessageAsync($":ok: Removed `{toRemove.Username}`'s stream ({toRemove.Type}) from notifications.").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task CheckStream(IUserMessage imsg, FollowedStream.FollowedStreamType platform, [Remainder] string username) { @@ -225,7 +225,11 @@ namespace NadekoBot.Modules.Searches })); if (streamStatus.Item1) { - await channel.SendMessageAsync($"`Streamer {streamStatus.Item2} is online.`"); + await channel.SendMessageAsync($"`Streamer {username} is online with {streamStatus.Item2}.`"); + } + else + { + await channel.SendMessageAsync($"`Streamer {username} is offline.`"); } } catch diff --git a/src/NadekoBot/Modules/Translator/Translator.cs b/src/NadekoBot/Modules/Searches/Commands/Translator.cs similarity index 78% rename from src/NadekoBot/Modules/Translator/Translator.cs rename to src/NadekoBot/Modules/Searches/Commands/Translator.cs index e974746a..07d36f91 100644 --- a/src/NadekoBot/Modules/Translator/Translator.cs +++ b/src/NadekoBot/Modules/Searches/Commands/Translator.cs @@ -7,16 +7,11 @@ using System.Threading.Tasks; using NadekoBot.Services; using Discord.WebSocket; -namespace NadekoBot.Modules.Translator +namespace NadekoBot.Modules.Searches { - [NadekoModule("Translator", "~")] - public class Translator : DiscordModule + public partial class Searches { - public Translator(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) - { - } - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Translate(IUserMessage umsg, string langs, [Remainder] string text = null) { @@ -44,7 +39,7 @@ namespace NadekoBot.Modules.Translator } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Translangs(IUserMessage umsg) { diff --git a/src/NadekoBot/Modules/Searches/Searches.cs b/src/NadekoBot/Modules/Searches/Searches.cs index da2fee95..e88656d3 100644 --- a/src/NadekoBot/Modules/Searches/Searches.cs +++ b/src/NadekoBot/Modules/Searches/Searches.cs @@ -25,12 +25,12 @@ namespace NadekoBot.Modules.Searches { private IGoogleApiService _google { get; } - public Searches(ILocalization loc, CommandService cmds, DiscordSocketClient client, IGoogleApiService youtube) : base(loc, cmds, client) + public Searches(ILocalization loc, CommandService cmds, ShardedDiscordClient client, IGoogleApiService youtube) : base(loc, cmds, client) { _google = youtube; } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Weather(IUserMessage umsg, string city, string country) { @@ -39,7 +39,7 @@ namespace NadekoBot.Modules.Searches country = city.Replace(" ", ""); string response; using (var http = new HttpClient()) - response = await http.GetStringAsync($"http://api.lawlypopzz.xyz/nadekobot/weather/?city={city}&country={country}").ConfigureAwait(false); + response = await http.GetStringAsync($"http://api.ninetales.us/nadekobot/weather/?city={city}&country={country}").ConfigureAwait(false); var obj = JObject.Parse(response)["weather"]; @@ -51,7 +51,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 🌄 **Sunrise:** {obj["sunrise"]} 🌇 **Sunset:** {obj["sunset"]}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Youtube(IUserMessage umsg, [Remainder] string query = null) { @@ -66,7 +66,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync(result).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Imdb(IUserMessage umsg, [Remainder] string query = null) { @@ -90,7 +90,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync(result.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task RandomCat(IUserMessage umsg) { @@ -103,7 +103,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task RandomDog(IUserMessage umsg) { @@ -114,7 +114,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task I(IUserMessage umsg, [Remainder] string query = null) { @@ -144,7 +144,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Ir(IUserMessage umsg, [Remainder] string query = null) { @@ -176,7 +176,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Lmgtfy(IUserMessage umsg, [Remainder] string ffs = null) { @@ -190,7 +190,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Google(IUserMessage umsg, [Remainder] string terms = null) { @@ -204,7 +204,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 .ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Hearthstone(IUserMessage umsg, [Remainder] string name = null) { @@ -256,9 +256,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task Ud(IUserMessage umsg, [Remainder] string query = null) + public async Task UrbanDict(IUserMessage umsg, [Remainder] string query = null) { var channel = (ITextChannel)umsg.Channel; @@ -290,7 +290,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Hashtag(IUserMessage umsg, [Remainder] string query = null) { @@ -325,7 +325,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Catfact(IUserMessage umsg) { @@ -339,7 +339,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Revav(IUserMessage umsg, [Remainder] string arg = null) { @@ -356,7 +356,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Revimg(IUserMessage umsg, [Remainder] string imageLink = null) { @@ -368,7 +368,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync($"https://images.google.com/searchbyimage?image_url={imageLink}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Safebooru(IUserMessage umsg, [Remainder] string tag = null) { @@ -382,7 +382,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendMessageAsync(link).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Wiki(IUserMessage umsg, [Remainder] string query = null) { @@ -402,9 +402,9 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task Clr(IUserMessage umsg, [Remainder] string color = null) + public async Task Color(IUserMessage umsg, [Remainder] string color = null) { var channel = (ITextChannel)umsg.Channel; @@ -422,7 +422,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 await channel.SendFileAsync(img.ToStream(), $"{color}.png"); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Videocall(IUserMessage umsg, [Remainder] string arg = null) { @@ -445,7 +445,7 @@ $@"🌍 **Weather for** 【{obj["target"]}】 } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Avatar(IUserMessage umsg, [Remainder] string mention = null) { diff --git a/src/NadekoBot/Modules/Searches/Commands/CalcCommand.cs b/src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs similarity index 90% rename from src/NadekoBot/Modules/Searches/Commands/CalcCommand.cs rename to src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs index 1f9f00dc..e3ad166b 100644 --- a/src/NadekoBot/Modules/Searches/Commands/CalcCommand.cs +++ b/src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs @@ -9,12 +9,12 @@ using System.Reflection; using System.Text; using System.Threading.Tasks; -namespace NadekoBot.Modules.Searches +namespace NadekoBot.Modules.Utility { [Group] - public partial class Searches + public partial class Utility { - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public static async Task Calculate(IUserMessage msg, [Remainder] string expression) { @@ -41,7 +41,7 @@ namespace NadekoBot.Modules.Searches } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task CalcOps(IUserMessage msg) { diff --git a/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs b/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs index 9993c1d3..806deac2 100644 --- a/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs +++ b/src/NadekoBot/Modules/Utility/Commands/InfoCommands.cs @@ -12,7 +12,7 @@ namespace NadekoBot.Modules.Utility { partial class Utility : DiscordModule { - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ServerInfo(IUserMessage msg, string guild = null) { @@ -47,7 +47,7 @@ namespace NadekoBot.Modules.Utility await msg.Reply(sb.ToString()).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ChannelInfo(IUserMessage msg, ITextChannel channel = null) { @@ -63,7 +63,7 @@ namespace NadekoBot.Modules.Utility await msg.Reply(toReturn).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task UserInfo(IUserMessage msg, IGuildUser usr = null) { @@ -77,7 +77,7 @@ namespace NadekoBot.Modules.Utility toReturn += $@"`Id:` **{user.Id}** `Current Game:` **{(user.Game?.Name == null ? "-" : user.Game.Name)}** `Joined At:` **{user.JoinedAt}** -`Roles:` **({user.Roles.Count()}) - {string.Join(", ", user.Roles.Select(r => r.Name))}** +`Roles:` **({user.Roles.Count()}) - {string.Join(", ", user.Roles.Select(r => r.Name)).SanitizeMentions()}** `AvatarUrl:` **{user.AvatarUrl}**"; await msg.Reply(toReturn).ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs b/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs index f2102c15..f1133359 100644 --- a/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs +++ b/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs @@ -1,6 +1,7 @@ using Discord; using Discord.Commands; using NadekoBot.Attributes; +using NadekoBot.Extensions; using NadekoBot.Services; using NadekoBot.Services.Database; using NadekoBot.Services.Database.Models; @@ -14,9 +15,9 @@ namespace NadekoBot.Modules.Utility { public partial class Utility { - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task ShowQuote(IUserMessage umsg, string keyword) + public async Task ShowQuote(IUserMessage umsg, [Remainder] string keyword) { var channel = (ITextChannel)umsg.Channel; @@ -34,10 +35,10 @@ namespace NadekoBot.Modules.Utility if (quote == null) return; - await channel.SendMessageAsync("📣 " + quote.Text); + await channel.SendMessageAsync("📣 " + quote.Text.SanitizeMentions()); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task AddQuote(IUserMessage umsg, string keyword, [Remainder] string text) { @@ -59,40 +60,46 @@ namespace NadekoBot.Modules.Utility Text = text, }); await uow.CompleteAsync().ConfigureAwait(false); - await channel.SendMessageAsync("`Quote added.`").ConfigureAwait(false); } + await channel.SendMessageAsync("`Quote added.`").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task DeleteQuote(IUserMessage umsg, string keyword) + public async Task DeleteQuote(IUserMessage umsg, [Remainder] string keyword) { var channel = (ITextChannel)umsg.Channel; if (string.IsNullOrWhiteSpace(keyword)) return; - keyword = keyword.ToUpperInvariant(); + var isAdmin = ((IGuildUser)umsg.Author).GuildPermissions.Administrator; + keyword = keyword.ToUpperInvariant(); + string response; using (var uow = DbHandler.UnitOfWork()) { - var q = await uow.Quotes.GetRandomQuoteByKeywordAsync(channel.Guild.Id, keyword); + var qs = uow.Quotes.GetAllQuotesByKeyword(channel.Guild.Id, keyword); - if (q == null) + if (qs==null || !qs.Any()) { - await channel.SendMessageAsync("`No quotes found.`"); + response = "`No quotes found.`"; return; } + var q = qs.Shuffle().FirstOrDefault(elem => isAdmin || elem.AuthorId == umsg.Author.Id); + uow.Quotes.Remove(q); - await uow.CompleteAsync(); + await uow.CompleteAsync().ConfigureAwait(false); + response = "`Deleted a random quote`"; } - await channel.SendMessageAsync("`Deleted a random quote.`"); + await channel.SendMessageAsync(response); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task DelAllQuotes(IUserMessage umsg, string keyword) + [RequirePermission(GuildPermission.Administrator)] + public async Task DelAllQuotes(IUserMessage umsg, [Remainder] string keyword) { var channel = (ITextChannel)umsg.Channel; @@ -103,7 +110,7 @@ namespace NadekoBot.Modules.Utility using (var uow = DbHandler.UnitOfWork()) { - var quotes = uow.Quotes.GetAllQuotesByKeyword(keyword); + var quotes = uow.Quotes.GetAllQuotesByKeyword(channel.Guild.Id, keyword); uow.Quotes.RemoveRange(quotes.ToArray());//wtf?! diff --git a/src/NadekoBot/Modules/Utility/Commands/Remind.cs b/src/NadekoBot/Modules/Utility/Commands/Remind.cs index ba48f1e9..1a65b535 100644 --- a/src/NadekoBot/Modules/Utility/Commands/Remind.cs +++ b/src/NadekoBot/Modules/Utility/Commands/Remind.cs @@ -2,9 +2,11 @@ using Discord.Commands; using Discord.WebSocket; using NadekoBot.Attributes; +using NadekoBot.Extensions; using NadekoBot.Services; using NadekoBot.Services.Database; using NadekoBot.Services.Database.Models; +using NLog; using System; using System.Collections.Generic; using System.Linq; @@ -31,9 +33,11 @@ namespace NadekoBot.Modules.Utility { "%user%", (r) => $"<@!{r.UserId}>" }, { "%target%", (r) => r.IsPrivate ? "Direct Message" : $"<#{r.ChannelId}>"} }; + private Logger _log { get; } public RemindCommands() { + _log = LogManager.GetCurrentClassLogger(); List reminders; using (var uow = DbHandler.UnitOfWork()) { @@ -44,7 +48,7 @@ namespace NadekoBot.Modules.Utility foreach (var r in reminders) { - var t = StartReminder(r); + try { var t = StartReminder(r); } catch (Exception ex) { _log.Warn(ex); } } } @@ -52,7 +56,7 @@ namespace NadekoBot.Modules.Utility { var now = DateTime.Now; var twoMins = new TimeSpan(0, 2, 0); - TimeSpan time = r.When - now; + TimeSpan time = r.When - now; if (time.TotalMilliseconds > int.MaxValue) return; @@ -74,14 +78,11 @@ namespace NadekoBot.Modules.Utility await ch.SendMessageAsync( replacements.Aggregate(RemindMessageFormat, - (cur, replace) => cur.Replace(replace.Key, replace.Value(r))) + (cur, replace) => cur.Replace(replace.Key, replace.Value(r))) + .SanitizeMentions() ).ConfigureAwait(false); //it works trust me - - } - catch (Exception ex) - { - Console.WriteLine($"Timer error! {ex}"); } + catch (Exception ex) { _log.Warn(ex); } finally { using (var uow = DbHandler.UnitOfWork()) @@ -92,7 +93,7 @@ namespace NadekoBot.Modules.Utility } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Remind(IUserMessage umsg, string meorchannel, string timeStr, [Remainder] string message) { @@ -180,25 +181,27 @@ namespace NadekoBot.Modules.Utility await uow.CompleteAsync(); } - await channel.SendMessageAsync($"⏰ I will remind \"{(ch is ITextChannel ? ((ITextChannel)ch).Name : umsg.Author.Username)}\" to \"{message.ToString()}\" in {output}. ({time:d.M.yyyy.} at {time:HH:mm})").ConfigureAwait(false); + try { await channel.SendMessageAsync($"⏰ I will remind \"{(ch is ITextChannel ? ((ITextChannel)ch).Name : umsg.Author.Username)}\" to \"{message.SanitizeMentions()}\" in {output}. ({time:d.M.yyyy.} at {time:HH:mm})").ConfigureAwait(false); } catch { } await StartReminder(rem); } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task RemindTemplate(IUserMessage umsg, [Remainder] string arg) - //{ - // var channel = (ITextChannel)umsg.Channel; + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [OwnerOnly] + public async Task RemindTemplate(IUserMessage umsg, [Remainder] string arg) + { + var channel = (ITextChannel)umsg.Channel; + if (string.IsNullOrWhiteSpace(arg)) + return; - // arg = arg?.Trim(); - // if (string.IsNullOrWhiteSpace(arg)) - // return; - - // NadekoBot.Config.RemindMessageFormat = arg; - // await channel.SendMessageAsync("`New remind message set.`"); - //} + using (var uow = DbHandler.UnitOfWork()) + { + uow.BotConfig.GetOrCreate().RemindMessageFormat = arg.Trim(); + await uow.CompleteAsync().ConfigureAwait(false); + } + await channel.SendMessageAsync("`New remind template set.`"); + } } } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Searches/Commands/UnitConversion.cs b/src/NadekoBot/Modules/Utility/Commands/UnitConversion.cs similarity index 80% rename from src/NadekoBot/Modules/Searches/Commands/UnitConversion.cs rename to src/NadekoBot/Modules/Utility/Commands/UnitConversion.cs index 64422620..ead333ca 100644 --- a/src/NadekoBot/Modules/Searches/Commands/UnitConversion.cs +++ b/src/NadekoBot/Modules/Utility/Commands/UnitConversion.cs @@ -2,7 +2,7 @@ using Discord.Commands; using NadekoBot.Attributes; using NadekoBot.Extensions; -using NadekoBot.Modules.Searches.Commands.Models; +using NadekoBot.Modules.Utility.Commands.Models; using NadekoBot.Services; using NadekoBot.Services.Database.Models; using Newtonsoft.Json; @@ -17,9 +17,9 @@ using System.Threading; using System.Threading.Tasks; using System.Xml; -namespace NadekoBot.Modules.Searches +namespace NadekoBot.Modules.Utility { - public partial class Searches + public partial class Utility { [Group] public class UnitConverterCommands @@ -94,28 +94,7 @@ namespace NadekoBot.Modules.Searches } public List Units { get; set; } - - - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] - public async Task ConvertListE(IUserMessage msg) //extended and bugged list - { - var channel = msg.Channel as IGuildChannel; - - var sb = new StringBuilder("Units that can be used by the converter: \n"); - var res = Units.GroupBy(x => x.UnitType); - foreach (var group in res) - { - sb.AppendLine($"{group.Key}: ```xl"); - foreach (var el in group) - { - sb.Append($" [{string.Join(",", el.Triggers)}] "); - } - sb.AppendLine("```"); - } - await msg.ReplyLong(sb.ToString(), breakOn: new[] { "```xl", "\n" }); - } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ConvertList(IUserMessage msg) { @@ -129,7 +108,7 @@ namespace NadekoBot.Modules.Searches } await msg.ReplyLong(sb.ToString(), breakOn: new[] { "```xl\n", "\n" }); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] public async Task Convert(IUserMessage msg, string origin, string target, decimal value) { var originUnit = Units.Find(x => x.Triggers.Select(y => y.ToLowerInvariant()).Contains(origin.ToLowerInvariant())); @@ -152,10 +131,10 @@ namespace NadekoBot.Modules.Searches switch (originUnit.Triggers.First().ToUpperInvariant()) { case "C": - res = value + (decimal)273.15; //celcius! + res = value + 273.15m; //celcius! break; case "F": - res = (value + (decimal)459.67) * ((decimal)5 / 9); + res = (value + 459.67m) * (5m / 9m); break; default: res = value; @@ -165,10 +144,10 @@ namespace NadekoBot.Modules.Searches switch (targetUnit.Triggers.First()) { case "C": - res = value - (decimal)273.15; //celcius! + res = value - 273.15m; //celcius! break; case "F": - res = res * ((decimal)9 / 5) - (decimal)458.67; + res = res * (9m / 5m) - 459.67m; break; default: break; @@ -176,7 +155,6 @@ namespace NadekoBot.Modules.Searches } else { - //I just love currency if (originUnit.UnitType == "currency") { res = (value * targetUnit.Modifier) / originUnit.Modifier; @@ -184,8 +162,9 @@ namespace NadekoBot.Modules.Searches else res = (value * originUnit.Modifier) / targetUnit.Modifier; } - res = Math.Round(res, 2); - await msg.Reply(string.Format("{0} {1} is equal to {2} {3}", value, originUnit.Triggers.First(), res, targetUnit.Triggers.First())); + res = Math.Round(res, 4); + + await msg.Reply(string.Format("{0} {1} is equal to {2} {3}", value, (originUnit.Triggers.First() + "s").SnPl(value.IsInteger() ? (int)value : 2), res, (targetUnit.Triggers.First() + "s").SnPl(res.IsInteger() ? (int)res : 2))); } } diff --git a/src/NadekoBot/Modules/Searches/Commands/Models/MeasurementUnit.cs b/src/NadekoBot/Modules/Utility/Models/MeasurementUnit.cs similarity index 81% rename from src/NadekoBot/Modules/Searches/Commands/Models/MeasurementUnit.cs rename to src/NadekoBot/Modules/Utility/Models/MeasurementUnit.cs index ba4d1bb7..017ea8b4 100644 --- a/src/NadekoBot/Modules/Searches/Commands/Models/MeasurementUnit.cs +++ b/src/NadekoBot/Modules/Utility/Models/MeasurementUnit.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace NadekoBot.Modules.Searches.Commands.Models +namespace NadekoBot.Modules.Utility.Commands.Models { public class MeasurementUnit { diff --git a/src/NadekoBot/Modules/Searches/Commands/Models/Rates.cs b/src/NadekoBot/Modules/Utility/Models/Rates.cs similarity index 85% rename from src/NadekoBot/Modules/Searches/Commands/Models/Rates.cs rename to src/NadekoBot/Modules/Utility/Models/Rates.cs index 5aed22fa..b460a3c5 100644 --- a/src/NadekoBot/Modules/Searches/Commands/Models/Rates.cs +++ b/src/NadekoBot/Modules/Utility/Models/Rates.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; -namespace NadekoBot.Modules.Searches.Commands.Models +namespace NadekoBot.Modules.Utility.Commands.Models { public class Rates { diff --git a/src/NadekoBot/Modules/Utility/Utility.cs b/src/NadekoBot/Modules/Utility/Utility.cs index 5ce18ef3..946ee7c1 100644 --- a/src/NadekoBot/Modules/Utility/Utility.cs +++ b/src/NadekoBot/Modules/Utility/Utility.cs @@ -18,12 +18,12 @@ namespace NadekoBot.Modules.Utility [NadekoModule("Utility", ".")] public partial class Utility : DiscordModule { - public Utility(ILocalization loc, CommandService cmds, DiscordSocketClient client) : base(loc, cmds, client) + public Utility(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client) { } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task WhosPlaying(IUserMessage umsg, [Remainder] string game = null) { @@ -43,9 +43,9 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync("```xl\n" + string.Join("\n", arr.GroupBy(item => (i++) / 3).Select(ig => string.Concat(ig.Select(el => $"• {el,-35}")))) + "\n```").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task InRole(IUserMessage umsg, [Remainder] string roles = null) + public async Task InRole(IUserMessage umsg, [Remainder] string roles) { if (string.IsNullOrWhiteSpace(roles)) return; @@ -76,7 +76,7 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync(send).ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task CheckMyPerms(IUserMessage msg) { @@ -93,44 +93,54 @@ namespace NadekoBot.Modules.Utility await msg.Reply(builder.ToString()); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task UserId(IUserMessage msg, IGuildUser target = null) { var usr = target ?? msg.Author; - await msg.Reply($"Id of the user { usr.Username } is { usr.Id })").ConfigureAwait(false); + await msg.Reply($"Id of the user { usr.Username } is { usr.Id }").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] public async Task ChannelId(IUserMessage msg) { await msg.Reply($"This Channel's ID is {msg.Channel.Id}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ServerId(IUserMessage msg) { await msg.Reply($"This server's ID is {((ITextChannel)msg.Channel).Guild.Id}").ConfigureAwait(false); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task Roles(IUserMessage msg, IGuildUser target = null) + public async Task Roles(IUserMessage msg, IGuildUser target, int page = 1) { var channel = (ITextChannel)msg.Channel; var guild = channel.Guild; + + const int RolesPerPage = 20; + + if (page < 1 || page > 100) + return; if (target != null) { - await msg.Reply($"`List of roles for **{target.Username}**:` \n• " + string.Join("\n• ", target.Roles.Except(new[] { guild.EveryoneRole }).OrderBy(r => r.Position))); + await msg.Reply($"`Page #{page} of roles for **{target.Username}**:` \n• " + string.Join("\n• ", target.Roles.Except(new[] { guild.EveryoneRole }).OrderBy(r => r.Position).Skip((page - 1) * RolesPerPage).Take(RolesPerPage)).SanitizeMentions()); } else { - await msg.Reply("`List of roles:` \n• " + string.Join("\n• ", guild.Roles.Except(new[] { guild.EveryoneRole }).OrderBy(r=>r.Position))); + await msg.Reply($"`Page #{page} of all roles on this server:` \n• " + string.Join("\n• ", guild.Roles.Except(new[] { guild.EveryoneRole }).OrderBy(r => r.Position).Skip((page - 1) * RolesPerPage).Take(RolesPerPage)).SanitizeMentions()); } } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public Task Roles(IUserMessage msg, int page = 1) => + Roles(msg, null, page); + + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task ChannelTopic(IUserMessage umsg) { @@ -143,14 +153,27 @@ namespace NadekoBot.Modules.Utility await channel.SendMessageAsync("`Topic:` " + topic); } - [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - [RequireContext(ContextType.Guild)] + [NadekoCommand, Usage, Description, Aliases] public async Task Stats(IUserMessage umsg) { - var channel = (ITextChannel)umsg.Channel; + var channel = umsg.Channel; await channel.SendMessageAsync(await NadekoBot.Stats.Print()); } + + private Regex emojiFinder { get; } = new Regex(@"<:(?.+?):(?\d*)>", RegexOptions.Compiled); + [NadekoCommand, Usage, Description, Aliases] + public async Task Showemojis(IUserMessage msg, [Remainder] string emojis) + { + var matches = emojiFinder.Matches(emojis); + + + + var result = string.Join("\n", matches.Cast() + .Select(m => $"`Name:` {m.Groups["name"]} `Link:` http://discordapp.com/api/emojis/{m.Groups["id"]}.png")); + + await msg.Channel.SendMessageAsync(result).ConfigureAwait(false); + } } } diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index d4e4d904..bf26ad28 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -26,7 +26,7 @@ namespace NadekoBot public static CommandService CommandService { get; private set; } public static CommandHandler CommandHandler { get; private set; } - public static DiscordSocketClient Client { get; private set; } + public static ShardedDiscordClient Client { get; private set; } public static Localization Localizer { get; private set; } public static BotCredentials Credentials { get; private set; } @@ -42,16 +42,20 @@ namespace NadekoBot _log.Info("Starting NadekoBot v" + typeof(NadekoBot).GetTypeInfo().Assembly.GetCustomAttribute().InformationalVersion); + + Credentials = new BotCredentials(); + //create client - Client = new DiscordSocketClient(new DiscordSocketConfig + Client = new ShardedDiscordClient (new DiscordSocketConfig { AudioMode = Discord.Audio.AudioMode.Outgoing, MessageCacheSize = 10, LogLevel = LogSeverity.Warning, + TotalShards = Credentials.TotalShards, + ConnectionTimeout = 60000 }); //initialize Services - Credentials = new BotCredentials(); CommandService = new CommandService(); Localizer = new Localization(); Google = new GoogleApiService(); @@ -61,7 +65,7 @@ namespace NadekoBot //setup DI var depMap = new DependencyMap(); depMap.Add(Localizer); - depMap.Add(Client); + depMap.Add(Client); depMap.Add(CommandService); depMap.Add(Google); @@ -70,6 +74,7 @@ namespace NadekoBot CommandService.AddTypeReader(new PermissionActionTypeReader()); CommandService.AddTypeReader(new CommandTypeReader()); CommandService.AddTypeReader(new ModuleTypeReader()); + CommandService.AddTypeReader(new GuildTypeReader()); //connect await Client.LoginAsync(TokenType.Bot, Credentials.Token).ConfigureAwait(false); diff --git a/src/NadekoBot/Resources/CommandStrings.Designer.cs b/src/NadekoBot/Resources/CommandStrings.Designer.cs index 25136f16..45b92683 100644 --- a/src/NadekoBot/Resources/CommandStrings.Designer.cs +++ b/src/NadekoBot/Resources/CommandStrings.Designer.cs @@ -59,6 +59,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to 8ball. + /// + public static string _8ball_cmd { + get { + return ResourceManager.GetString("_8ball_cmd", resourceCulture); + } + } + /// /// Looks up a localized string similar to Ask the 8ball a yes/no question.. /// @@ -69,25 +78,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `>8ball should i do something`. + /// Looks up a localized string similar to `>8ball should I do something`. /// - public static string _8ball_summary { + public static string _8ball_usage { get { - return ResourceManager.GetString("_8ball_summary", resourceCulture); + return ResourceManager.GetString("_8ball_usage", resourceCulture); } } /// - /// Looks up a localized string similar to 8ball. + /// Looks up a localized string similar to addcustreact acr. /// - public static string _8ball_text { + public static string addcustreact_cmd { get { - return ResourceManager.GetString("_8ball_text", resourceCulture); + return ResourceManager.GetString("addcustreact_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Add a custom reaction. Guide here: <https://github.com/Kwoth/NadekoBot/wiki/Custom-Reactions> **Bot Owner Only!**. + /// Looks up a localized string similar to Add a custom reaction with a trigger and a response. Running this command in server requires Administration permission. Running this command in DM is Bot Owner only and adds a new global custom reaction. Guide here: <http://nadekobot.readthedocs.io/en/1.0/Custom%20Reactions/>. /// public static string addcustreact_desc { get { @@ -98,50 +107,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.acr "hello" Hi there %user%`. /// - public static string addcustreact_summary { + public static string addcustreact_usage { get { - return ResourceManager.GetString("addcustreact_summary", resourceCulture); + return ResourceManager.GetString("addcustreact_usage", resourceCulture); } } /// - /// Looks up a localized string similar to addcustreact acr. + /// Looks up a localized string similar to addplaying adpl. /// - public static string addcustreact_text { + public static string addplaying_cmd { get { - return ResourceManager.GetString("addcustreact_text", resourceCulture); + return ResourceManager.GetString("addplaying_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Adds a new word to the list of filtered words. - /// - public static string addfilterword_desc { - get { - return ResourceManager.GetString("addfilterword_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;afw poop`. - /// - public static string addfilterword_summary { - get { - return ResourceManager.GetString("addfilterword_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to addfilterword afw. - /// - public static string addfilterword_text { - get { - return ResourceManager.GetString("addfilterword_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%, %trivia% **Bot Owner Only!**. + /// Looks up a localized string similar to Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%. /// public static string addplaying_desc { get { @@ -152,23 +134,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.adpl`. /// - public static string addplaying_summary { + public static string addplaying_usage { get { - return ResourceManager.GetString("addplaying_summary", resourceCulture); + return ResourceManager.GetString("addplaying_usage", resourceCulture); } } /// - /// Looks up a localized string similar to addplaying adpl. + /// Looks up a localized string similar to .. /// - public static string addplaying_text { + public static string addquote_cmd { get { - return ResourceManager.GetString("addplaying_text", resourceCulture); + return ResourceManager.GetString("addquote_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Adds a new quote with the specified name (single word) and message (no limit).. + /// Looks up a localized string similar to Adds a new quote with the specified name and message.. /// public static string addquote_desc { get { @@ -177,52 +159,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `.. abc My message`. + /// Looks up a localized string similar to `.. sayhi Hi`. /// - public static string addquote_summary { + public static string addquote_usage { get { - return ResourceManager.GetString("addquote_summary", resourceCulture); + return ResourceManager.GetString("addquote_usage", resourceCulture); } } /// - /// Looks up a localized string similar to .. + /// Looks up a localized string similar to allchnlmdls acm. /// - public static string addquote_text { + public static string allchnlmdls_cmd { get { - return ResourceManager.GetString("addquote_text", resourceCulture); + return ResourceManager.GetString("allchnlmdls_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets permissions for all commands from a certain module at the channel level.. - /// - public static string allchnlcmds_desc { - get { - return ResourceManager.GetString("allchnlcmds_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;acc "module name" [enable/disable] SomeChannel`. - /// - public static string allchnlcmds_summary { - get { - return ResourceManager.GetString("allchnlcmds_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to allchnlcmds acc. - /// - public static string allchnlcmds_text { - get { - return ResourceManager.GetString("allchnlcmds_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sets permissions for all modules at the channel level.. + /// Looks up a localized string similar to Enable or disable all modules in a specified channel.. /// public static string allchnlmdls_desc { get { @@ -231,20 +186,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `;acm [enable/disable] SomeChannel`. + /// Looks up a localized string similar to `;acm enable #SomeChannel`. /// - public static string allchnlmdls_summary { + public static string allchnlmdls_usage { get { - return ResourceManager.GetString("allchnlmdls_summary", resourceCulture); + return ResourceManager.GetString("allchnlmdls_usage", resourceCulture); } } /// - /// Looks up a localized string similar to allchnlmdls acm. + /// Looks up a localized string similar to allcmdcooldowns acmdcds. /// - public static string allchnlmdls_text { + public static string allcmdcooldowns_cmd { get { - return ResourceManager.GetString("allchnlmdls_text", resourceCulture); + return ResourceManager.GetString("allcmdcooldowns_cmd", resourceCulture); } } @@ -260,50 +215,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;acmdcds`. /// - public static string allcmdcooldowns_summary { + public static string allcmdcooldowns_usage { get { - return ResourceManager.GetString("allcmdcooldowns_summary", resourceCulture); + return ResourceManager.GetString("allcmdcooldowns_usage", resourceCulture); } } /// - /// Looks up a localized string similar to allcmdcooldowns. + /// Looks up a localized string similar to allrolemdls arm. /// - public static string allcmdcooldowns_text { + public static string allrolemdls_cmd { get { - return ResourceManager.GetString("allcmdcooldowns_text", resourceCulture); + return ResourceManager.GetString("allrolemdls_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets permissions for all commands from a certain module at the role level.. - /// - public static string allrolecmds_desc { - get { - return ResourceManager.GetString("allrolecmds_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;arc "module name" [enable/disable] MyRole`. - /// - public static string allrolecmds_summary { - get { - return ResourceManager.GetString("allrolecmds_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to allrolecmds acmdcds. - /// - public static string allrolecmds_text { - get { - return ResourceManager.GetString("allrolecmds_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sets permissions for all modules at the role level.. + /// Looks up a localized string similar to Enable or disable all modules for a specific role.. /// public static string allrolemdls_desc { get { @@ -314,50 +242,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;arm [enable/disable] MyRole`. /// - public static string allrolemdls_summary { + public static string allrolemdls_usage { get { - return ResourceManager.GetString("allrolemdls_summary", resourceCulture); + return ResourceManager.GetString("allrolemdls_usage", resourceCulture); } } /// - /// Looks up a localized string similar to allrolemdls arm. + /// Looks up a localized string similar to allsrvrmdls asm. /// - public static string allrolemdls_text { + public static string allsrvrmdls_cmd { get { - return ResourceManager.GetString("allrolemdls_text", resourceCulture); + return ResourceManager.GetString("allsrvrmdls_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets permissions for all commands from a certain module at the server level.. - /// - public static string allsrvrcmds_desc { - get { - return ResourceManager.GetString("allsrvrcmds_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;asc "module name" [enable/disable]`. - /// - public static string allsrvrcmds_summary { - get { - return ResourceManager.GetString("allsrvrcmds_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to allsrvrcmds asc. - /// - public static string allsrvrcmds_text { - get { - return ResourceManager.GetString("allsrvrcmds_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sets permissions for all modules at the server level.. + /// Looks up a localized string similar to Enable or disable all modules for your server.. /// public static string allsrvrmdls_desc { get { @@ -368,50 +269,77 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;asm [enable/disable]`. /// - public static string allsrvrmdls_summary { + public static string allsrvrmdls_usage { get { - return ResourceManager.GetString("allsrvrmdls_summary", resourceCulture); + return ResourceManager.GetString("allsrvrmdls_usage", resourceCulture); } } /// - /// Looks up a localized string similar to allsrvrmdls asm. + /// Looks up a localized string similar to allusrmdls aum. /// - public static string allsrvrmdls_text { + public static string allusrmdls_cmd { get { - return ResourceManager.GetString("allsrvrmdls_text", resourceCulture); + return ResourceManager.GetString("allusrmdls_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable or disable all modules for a specific user.. + /// + public static string allusrmdls_desc { + get { + return ResourceManager.GetString("allusrmdls_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;aum enable @someone`. + /// + public static string allusrmdls_usage { + get { + return ResourceManager.GetString("allusrmdls_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to anime ani aq. + /// + public static string anime_cmd { + get { + return ResourceManager.GetString("anime_cmd", resourceCulture); } } /// /// Looks up a localized string similar to Queries anilist for an anime and shows the first result.. /// - public static string ani_desc { + public static string anime_desc { get { - return ResourceManager.GetString("ani_desc", resourceCulture); + return ResourceManager.GetString("anime_desc", resourceCulture); } } /// - /// Looks up a localized string similar to `~aq aquarion evol`. + /// Looks up a localized string similar to `~ani aquarion evol`. /// - public static string ani_summary { + public static string anime_usage { get { - return ResourceManager.GetString("ani_summary", resourceCulture); + return ResourceManager.GetString("anime_usage", resourceCulture); } } /// - /// Looks up a localized string similar to ani anime aq. + /// Looks up a localized string similar to announce. /// - public static string ani_text { + public static string announce_cmd { get { - return ResourceManager.GetString("ani_text", resourceCulture); + return ResourceManager.GetString("announce_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sends a message to all servers' general channel bot is connected to.**Bot Owner Only!**. + /// Looks up a localized string similar to Sends a message to all servers' general channel bot is connected to.. /// public static string announce_desc { get { @@ -422,23 +350,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.announce Useless spam`. /// - public static string announce_summary { + public static string announce_usage { get { - return ResourceManager.GetString("announce_summary", resourceCulture); + return ResourceManager.GetString("announce_usage", resourceCulture); } } /// - /// Looks up a localized string similar to announce. + /// Looks up a localized string similar to asar. /// - public static string announce_text { + public static string asar_cmd { get { - return ResourceManager.GetString("announce_text", resourceCulture); + return ResourceManager.GetString("asar_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Adds a role, or list of roles separated by whitespace(use quotations for multiword roles) to the list of self-assignable roles. **Needs Manage Roles Permissions.**. + /// Looks up a localized string similar to Adds a role, or list of roles separated by whitespace(use quotations for multiword roles) to the list of self-assignable roles.. /// public static string asar_desc { get { @@ -449,18 +377,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.asar Gamer`. /// - public static string asar_summary { + public static string asar_usage { get { - return ResourceManager.GetString("asar_summary", resourceCulture); + return ResourceManager.GetString("asar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to asar. + /// Looks up a localized string similar to attack. /// - public static string asar_text { + public static string attack_cmd { get { - return ResourceManager.GetString("asar_text", resourceCulture); + return ResourceManager.GetString("attack_cmd", resourceCulture); } } @@ -476,23 +404,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>attack "vine whip" @someguy`. /// - public static string attack_summary { + public static string attack_usage { get { - return ResourceManager.GetString("attack_summary", resourceCulture); + return ResourceManager.GetString("attack_usage", resourceCulture); } } /// - /// Looks up a localized string similar to attack. + /// Looks up a localized string similar to autoassignrole aar. /// - public static string attack_text { + public static string autoassignrole_cmd { get { - return ResourceManager.GetString("attack_text", resourceCulture); + return ResourceManager.GetString("autoassignrole_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Automaticaly assigns a specified role to every user who joins the server. **Needs Manage Roles Permissions.**. + /// Looks up a localized string similar to Automaticaly assigns a specified role to every user who joins the server. . /// public static string autoassignrole_desc { get { @@ -503,18 +431,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.aar` to disable, `.aar Role Name` to enable. /// - public static string autoassignrole_summary { + public static string autoassignrole_usage { get { - return ResourceManager.GetString("autoassignrole_summary", resourceCulture); + return ResourceManager.GetString("autoassignrole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to autoassignrole aar. + /// Looks up a localized string similar to autoplay ap. /// - public static string autoassignrole_text { + public static string autoplay_cmd { get { - return ResourceManager.GetString("autoassignrole_text", resourceCulture); + return ResourceManager.GetString("autoplay_cmd", resourceCulture); } } @@ -530,18 +458,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!ap`. /// - public static string autoplay_summary { + public static string autoplay_usage { get { - return ResourceManager.GetString("autoplay_summary", resourceCulture); + return ResourceManager.GetString("autoplay_usage", resourceCulture); } } /// - /// Looks up a localized string similar to autoplay ap. + /// Looks up a localized string similar to av avatar. /// - public static string autoplay_text { + public static string avatar_cmd { get { - return ResourceManager.GetString("autoplay_text", resourceCulture); + return ResourceManager.GetString("avatar_cmd", resourceCulture); } } @@ -557,23 +485,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~av "@SomeGuy"`. /// - public static string avatar_summary { + public static string avatar_usage { get { - return ResourceManager.GetString("avatar_summary", resourceCulture); + return ResourceManager.GetString("avatar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to av avatar. + /// Looks up a localized string similar to award. /// - public static string avatar_text { + public static string award_cmd { get { - return ResourceManager.GetString("avatar_text", resourceCulture); + return ResourceManager.GetString("award_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Gives someone a certain amount of flowers. **Bot Owner Only!**. + /// Looks up a localized string similar to Awards someone a certain amount of currency. . /// public static string award_desc { get { @@ -584,23 +512,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$award 100 @person`. /// - public static string award_summary { + public static string award_usage { get { - return ResourceManager.GetString("award_summary", resourceCulture); + return ResourceManager.GetString("award_usage", resourceCulture); } } /// - /// Looks up a localized string similar to award. + /// Looks up a localized string similar to ban b. /// - public static string award_text { + public static string ban_cmd { get { - return ResourceManager.GetString("award_text", resourceCulture); + return ResourceManager.GetString("ban_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Bans a user by id or name with an optional message. **Needs Ban Permissions.**. + /// Looks up a localized string similar to Bans a user by id or name with an optional message.. /// public static string ban_desc { get { @@ -611,18 +539,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.b "@some Guy" Your behaviour is toxic.`. /// - public static string ban_summary { + public static string ban_usage { get { - return ResourceManager.GetString("ban_summary", resourceCulture); + return ResourceManager.GetString("ban_usage", resourceCulture); } } /// - /// Looks up a localized string similar to ban b. + /// Looks up a localized string similar to beam bm. /// - public static string ban_text { + public static string beam_cmd { get { - return ResourceManager.GetString("ban_text", resourceCulture); + return ResourceManager.GetString("beam_cmd", resourceCulture); } } @@ -638,23 +566,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~beam SomeStreamer`. /// - public static string beam_summary { + public static string beam_usage { get { - return ResourceManager.GetString("beam_summary", resourceCulture); + return ResourceManager.GetString("beam_usage", resourceCulture); } } /// - /// Looks up a localized string similar to beam bm. + /// Looks up a localized string similar to betflip bf. /// - public static string beam_text { + public static string betflip_cmd { get { - return ResourceManager.GetString("beam_text", resourceCulture); + return ResourceManager.GetString("betflip_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Bet to guess will the result be heads or tails. Guessing award you double flowers you've bet.. + /// Looks up a localized string similar to Bet to guess will the result be heads or tails. Guessing awards you double flowers you've bet.. /// public static string betflip_desc { get { @@ -665,18 +593,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$bf 5 heads` or `$bf 3 t`. /// - public static string betflip_summary { + public static string betflip_usage { get { - return ResourceManager.GetString("betflip_summary", resourceCulture); + return ResourceManager.GetString("betflip_usage", resourceCulture); } } /// - /// Looks up a localized string similar to betflip bf. + /// Looks up a localized string similar to betroll br. /// - public static string betflip_text { + public static string betroll_cmd { get { - return ResourceManager.GetString("betflip_text", resourceCulture); + return ResourceManager.GetString("betroll_cmd", resourceCulture); } } @@ -692,23 +620,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$br 5`. /// - public static string betroll_summary { + public static string betroll_usage { get { - return ResourceManager.GetString("betroll_summary", resourceCulture); + return ResourceManager.GetString("betroll_usage", resourceCulture); } } /// - /// Looks up a localized string similar to betroll br. + /// Looks up a localized string similar to bind. /// - public static string betroll_text { + public static string bind_cmd { get { - return ResourceManager.GetString("betroll_text", resourceCulture); + return ResourceManager.GetString("bind_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Bind a trello bot to a single channel. You will receive notifications from your board when something is added or edited. **Bot Owner Only!**. + /// Looks up a localized string similar to Bind a trello bot to a single channel. You will receive notifications from your board when something is added or edited.. /// public static string bind_desc { get { @@ -719,18 +647,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `trello bind [board_id]`. /// - public static string bind_summary { + public static string bind_usage { get { - return ResourceManager.GetString("bind_summary", resourceCulture); + return ResourceManager.GetString("bind_usage", resourceCulture); } } /// - /// Looks up a localized string similar to bind. + /// Looks up a localized string similar to boobs. /// - public static string bind_text { + public static string boobs_cmd { get { - return ResourceManager.GetString("bind_text", resourceCulture); + return ResourceManager.GetString("boobs_cmd", resourceCulture); } } @@ -746,18 +674,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~boobs`. /// - public static string boobs_summary { + public static string boobs_usage { get { - return ResourceManager.GetString("boobs_summary", resourceCulture); + return ResourceManager.GetString("boobs_usage", resourceCulture); } } /// - /// Looks up a localized string similar to boobs. + /// Looks up a localized string similar to butts ass butt. /// - public static string boobs_text { + public static string butts_cmd { get { - return ResourceManager.GetString("boobs_text", resourceCulture); + return ResourceManager.GetString("butts_cmd", resourceCulture); } } @@ -773,18 +701,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~butts` or `~ass`. /// - public static string butts_summary { + public static string butts_usage { get { - return ResourceManager.GetString("butts_summary", resourceCulture); + return ResourceManager.GetString("butts_usage", resourceCulture); } } /// - /// Looks up a localized string similar to butts ass butt. + /// Looks up a localized string similar to bye. /// - public static string butts_text { + public static string bye_cmd { get { - return ResourceManager.GetString("butts_text", resourceCulture); + return ResourceManager.GetString("bye_cmd", resourceCulture); } } @@ -800,23 +728,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.bye`. /// - public static string bye_summary { + public static string bye_usage { get { - return ResourceManager.GetString("bye_summary", resourceCulture); + return ResourceManager.GetString("bye_usage", resourceCulture); } } /// - /// Looks up a localized string similar to bye. + /// Looks up a localized string similar to byedel. /// - public static string bye_text { + public static string byedel_cmd { get { - return ResourceManager.GetString("bye_text", resourceCulture); + return ResourceManager.GetString("byedel_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles automatic deletion of bye messages. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Toggles automatic deletion of bye messages. . /// public static string byedel_desc { get { @@ -827,23 +755,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.byedel`. /// - public static string byedel_summary { + public static string byedel_usage { get { - return ResourceManager.GetString("byedel_summary", resourceCulture); + return ResourceManager.GetString("byedel_usage", resourceCulture); } } /// - /// Looks up a localized string similar to byedel. + /// Looks up a localized string similar to byemsg. /// - public static string byedel_text { + public static string byemsg_cmd { get { - return ResourceManager.GetString("byedel_text", resourceCulture); + return ResourceManager.GetString("byemsg_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. . /// public static string byemsg_desc { get { @@ -854,18 +782,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.byemsg %user% has left.`. /// - public static string byemsg_summary { + public static string byemsg_usage { get { - return ResourceManager.GetString("byemsg_summary", resourceCulture); + return ResourceManager.GetString("byemsg_usage", resourceCulture); } } /// - /// Looks up a localized string similar to byemsg. + /// Looks up a localized string similar to calcops. /// - public static string byemsg_text { + public static string calcops_cmd { get { - return ResourceManager.GetString("byemsg_text", resourceCulture); + return ResourceManager.GetString("calcops_cmd", resourceCulture); } } @@ -881,18 +809,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.calcops`. /// - public static string calcops_summary { + public static string calcops_usage { get { - return ResourceManager.GetString("calcops_summary", resourceCulture); + return ResourceManager.GetString("calcops_usage", resourceCulture); } } /// - /// Looks up a localized string similar to calcops. + /// Looks up a localized string similar to calculate calc. /// - public static string calcops_text { + public static string calculate_cmd { get { - return ResourceManager.GetString("calcops_text", resourceCulture); + return ResourceManager.GetString("calculate_cmd", resourceCulture); } } @@ -906,25 +834,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `~calc 1+1`. + /// Looks up a localized string similar to `.calc 1+1`. /// - public static string calculate_summary { + public static string calculate_usage { get { - return ResourceManager.GetString("calculate_summary", resourceCulture); + return ResourceManager.GetString("calculate_usage", resourceCulture); } } /// - /// Looks up a localized string similar to calculate calc. + /// Looks up a localized string similar to cards. /// - public static string calculate_text { + public static string cards_cmd { get { - return ResourceManager.GetString("calculate_text", resourceCulture); + return ResourceManager.GetString("cards_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Lists all cards from the supplied list. You can supply either a name or an index. **Bot Owner Only!**. + /// Looks up a localized string similar to Lists all cards from the supplied list. You can supply either a name or an index.. /// public static string cards_desc { get { @@ -935,18 +863,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `trello cards index`. /// - public static string cards_summary { + public static string cards_usage { get { - return ResourceManager.GetString("cards_summary", resourceCulture); + return ResourceManager.GetString("cards_usage", resourceCulture); } } /// - /// Looks up a localized string similar to cards. + /// Looks up a localized string similar to cash $$. /// - public static string cards_text { + public static string cash_cmd { get { - return ResourceManager.GetString("cards_text", resourceCulture); + return ResourceManager.GetString("cash_cmd", resourceCulture); } } @@ -962,18 +890,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$$$` or `$$$ @SomeGuy`. /// - public static string cash_summary { + public static string cash_usage { get { - return ResourceManager.GetString("cash_summary", resourceCulture); + return ResourceManager.GetString("cash_usage", resourceCulture); } } /// - /// Looks up a localized string similar to cash $$. + /// Looks up a localized string similar to catfact. /// - public static string cash_text { + public static string catfact_cmd { get { - return ResourceManager.GetString("cash_text", resourceCulture); + return ResourceManager.GetString("catfact_cmd", resourceCulture); } } @@ -989,45 +917,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~catfact`. /// - public static string catfact_summary { + public static string catfact_usage { get { - return ResourceManager.GetString("catfact_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to catfact. - /// - public static string catfact_text { - get { - return ResourceManager.GetString("catfact_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Blacklists a mentioned channel (#general for example).. - /// - public static string cbl_desc { - get { - return ResourceManager.GetString("cbl_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;cbl #some_channel`. - /// - public static string cbl_summary { - get { - return ResourceManager.GetString("cbl_summary", resourceCulture); + return ResourceManager.GetString("catfact_usage", resourceCulture); } } /// /// Looks up a localized string similar to cbl. /// - public static string cbl_text { + public static string channelblacklist_cmd { get { - return ResourceManager.GetString("cbl_text", resourceCulture); + return ResourceManager.GetString("channelblacklist_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Either [add]s or [rem]oves a channel specified by an ID from a blacklist.. + /// + public static string channelblacklist_desc { + get { + return ResourceManager.GetString("channelblacklist_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;cbl rem 12312312312`. + /// + public static string channelblacklist_usage { + get { + return ResourceManager.GetString("channelblacklist_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to channelid cid. + /// + public static string channelid_cmd { + get { + return ResourceManager.GetString("channelid_cmd", resourceCulture); } } @@ -1043,18 +971,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.cid`. /// - public static string channelid_summary { + public static string channelid_usage { get { - return ResourceManager.GetString("channelid_summary", resourceCulture); + return ResourceManager.GetString("channelid_usage", resourceCulture); } } /// - /// Looks up a localized string similar to channelid. + /// Looks up a localized string similar to channelinfo cinfo. /// - public static string channelid_text { + public static string channelinfo_cmd { get { - return ResourceManager.GetString("channelid_text", resourceCulture); + return ResourceManager.GetString("channelinfo_cmd", resourceCulture); } } @@ -1070,18 +998,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.cinfo #some-channel`. /// - public static string channelinfo_summary { + public static string channelinfo_usage { get { - return ResourceManager.GetString("channelinfo_summary", resourceCulture); + return ResourceManager.GetString("channelinfo_usage", resourceCulture); } } /// - /// Looks up a localized string similar to channelinfo cinfo. + /// Looks up a localized string similar to channeltopic ct. /// - public static string channelinfo_text { + public static string channeltopic_cmd { get { - return ResourceManager.GetString("channelinfo_text", resourceCulture); + return ResourceManager.GetString("channeltopic_cmd", resourceCulture); } } @@ -1097,72 +1025,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.ct`. /// - public static string channeltopic_summary { + public static string channeltopic_usage { get { - return ResourceManager.GetString("channeltopic_summary", resourceCulture); + return ResourceManager.GetString("channeltopic_usage", resourceCulture); } } /// - /// Looks up a localized string similar to channeltopic ct. + /// Looks up a localized string similar to checkmyperms. /// - public static string channeltopic_text { + public static string checkmyperms_cmd { get { - return ResourceManager.GetString("channeltopic_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Checks if a certain user is streaming on the beam platform.. - /// - public static string checkbeam_desc { - get { - return ResourceManager.GetString("checkbeam_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `~chbm SomeStreamer`. - /// - public static string checkbeam_summary { - get { - return ResourceManager.GetString("checkbeam_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to checkbeam chbm. - /// - public static string checkbeam_text { - get { - return ResourceManager.GetString("checkbeam_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Checks if a certain user is streaming on the hitbox platform.. - /// - public static string checkhitbox_desc { - get { - return ResourceManager.GetString("checkhitbox_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `~chhb SomeStreamer`. - /// - public static string checkhitbox_summary { - get { - return ResourceManager.GetString("checkhitbox_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to checkhitbox chhb. - /// - public static string checkhitbox_text { - get { - return ResourceManager.GetString("checkhitbox_text", resourceCulture); + return ResourceManager.GetString("checkmyperms_cmd", resourceCulture); } } @@ -1178,45 +1052,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.checkmyperms`. /// - public static string checkmyperms_summary { + public static string checkmyperms_usage { get { - return ResourceManager.GetString("checkmyperms_summary", resourceCulture); + return ResourceManager.GetString("checkmyperms_usage", resourceCulture); } } /// - /// Looks up a localized string similar to checkmyperms. + /// Looks up a localized string similar to checkstream cs. /// - public static string checkmyperms_text { + public static string checkstream_cmd { get { - return ResourceManager.GetString("checkmyperms_text", resourceCulture); + return ResourceManager.GetString("checkstream_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Checks if a certain user is streaming on the twitch platform.. + /// Looks up a localized string similar to Checks if a user is online on a certain streaming platform.. /// - public static string checktwitch_desc { + public static string checkstream_desc { get { - return ResourceManager.GetString("checktwitch_desc", resourceCulture); + return ResourceManager.GetString("checkstream_desc", resourceCulture); } } /// - /// Looks up a localized string similar to `~chtw SomeStreamer`. + /// Looks up a localized string similar to `~cs twitch MyFavStreamer`. /// - public static string checktwitch_summary { + public static string checkstream_usage { get { - return ResourceManager.GetString("checktwitch_summary", resourceCulture); + return ResourceManager.GetString("checkstream_usage", resourceCulture); } } /// - /// Looks up a localized string similar to checktwitch chtw. + /// Looks up a localized string similar to chnlcmd cc. /// - public static string checktwitch_text { + public static string chnlcmd_cmd { get { - return ResourceManager.GetString("checktwitch_text", resourceCulture); + return ResourceManager.GetString("chnlcmd_cmd", resourceCulture); } } @@ -1232,23 +1106,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;cc "command name" enable SomeChannel`. /// - public static string chnlcmd_summary { + public static string chnlcmd_usage { get { - return ResourceManager.GetString("chnlcmd_summary", resourceCulture); + return ResourceManager.GetString("chnlcmd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to chnlcmd cc. + /// Looks up a localized string similar to chnlfilterinv cfi. /// - public static string chnlcmd_text { + public static string chnlfilterinv_cmd { get { - return ResourceManager.GetString("chnlcmd_text", resourceCulture); + return ResourceManager.GetString("chnlfilterinv_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Enables or disables automatic deleting of invites on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once.. + /// Looks up a localized string similar to Toggles automatic deleting of invites posted in the channel. Does not negate the .srvrfilterinv enabled setting. Does not affect Bot Owner.. /// public static string chnlfilterinv_desc { get { @@ -1257,25 +1131,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `;cfi enable #general-chat`. + /// Looks up a localized string similar to `;cfi`. /// - public static string chnlfilterinv_summary { + public static string chnlfilterinv_usage { get { - return ResourceManager.GetString("chnlfilterinv_summary", resourceCulture); + return ResourceManager.GetString("chnlfilterinv_usage", resourceCulture); } } /// - /// Looks up a localized string similar to chnlfilterinv cfi. + /// Looks up a localized string similar to chnlfilterwords cfw. /// - public static string chnlfilterinv_text { + public static string chnlfilterwords_cmd { get { - return ResourceManager.GetString("chnlfilterinv_text", resourceCulture); + return ResourceManager.GetString("chnlfilterwords_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Enables or disables automatic deleting of messages containing banned words on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once.. + /// Looks up a localized string similar to Toggles automatic deleting of messages containing banned words on the channel. Does not negate the .srvrfilterwords enabled setting. Does not affect bot owner.. /// public static string chnlfilterwords_desc { get { @@ -1284,20 +1158,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `;cfw enable #general-chat`. + /// Looks up a localized string similar to `;cfw`. /// - public static string chnlfilterwords_summary { + public static string chnlfilterwords_usage { get { - return ResourceManager.GetString("chnlfilterwords_summary", resourceCulture); + return ResourceManager.GetString("chnlfilterwords_usage", resourceCulture); } } /// - /// Looks up a localized string similar to chnlfilterwords cfw. + /// Looks up a localized string similar to chnlmdl cm. /// - public static string chnlfilterwords_text { + public static string chnlmdl_cmd { get { - return ResourceManager.GetString("chnlfilterwords_text", resourceCulture); + return ResourceManager.GetString("chnlmdl_cmd", resourceCulture); } } @@ -1313,18 +1187,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;cm "module name" enable SomeChannel`. /// - public static string chnlmdl_summary { + public static string chnlmdl_usage { get { - return ResourceManager.GetString("chnlmdl_summary", resourceCulture); + return ResourceManager.GetString("chnlmdl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to chnlmdl cm. + /// Looks up a localized string similar to chnlperms cp. /// - public static string chnlmdl_text { + public static string chnlperms_cmd { get { - return ResourceManager.GetString("chnlmdl_text", resourceCulture); + return ResourceManager.GetString("chnlperms_cmd", resourceCulture); } } @@ -1340,18 +1214,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;cp #dev`. /// - public static string chnlperms_summary { + public static string chnlperms_usage { get { - return ResourceManager.GetString("chnlperms_summary", resourceCulture); + return ResourceManager.GetString("chnlperms_usage", resourceCulture); } } /// - /// Looks up a localized string similar to chnlperms cp. + /// Looks up a localized string similar to chnlpermscopy cpc. /// - public static string chnlperms_text { + public static string chnlpermscopy_cmd { get { - return ResourceManager.GetString("chnlperms_text", resourceCulture); + return ResourceManager.GetString("chnlpermscopy_cmd", resourceCulture); } } @@ -1367,18 +1241,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;cpc Some Channel ~ Some other channel`. /// - public static string chnlpermscopy_summary { + public static string chnlpermscopy_usage { get { - return ResourceManager.GetString("chnlpermscopy_summary", resourceCulture); + return ResourceManager.GetString("chnlpermscopy_usage", resourceCulture); } } /// - /// Looks up a localized string similar to chnlpermscopy cpc. + /// Looks up a localized string similar to choose. /// - public static string chnlpermscopy_text { + public static string choose_cmd { get { - return ResourceManager.GetString("chnlpermscopy_text", resourceCulture); + return ResourceManager.GetString("choose_cmd", resourceCulture); } } @@ -1394,18 +1268,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>choose Get up;Sleep;Sleep more`. /// - public static string choose_summary { + public static string choose_usage { get { - return ResourceManager.GetString("choose_summary", resourceCulture); + return ResourceManager.GetString("choose_usage", resourceCulture); } } /// - /// Looks up a localized string similar to choose. + /// Looks up a localized string similar to chucknorris cn. /// - public static string choose_text { + public static string chucknorris_cmd { get { - return ResourceManager.GetString("choose_text", resourceCulture); + return ResourceManager.GetString("chucknorris_cmd", resourceCulture); } } @@ -1421,18 +1295,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~cn`. /// - public static string chucknorris_summary { + public static string chucknorris_usage { get { - return ResourceManager.GetString("chucknorris_summary", resourceCulture); + return ResourceManager.GetString("chucknorris_usage", resourceCulture); } } /// - /// Looks up a localized string similar to chucknorris cn. + /// Looks up a localized string similar to claim call c. /// - public static string chucknorris_text { + public static string claim_cmd { get { - return ResourceManager.GetString("chucknorris_text", resourceCulture); + return ResourceManager.GetString("claim_cmd", resourceCulture); } } @@ -1448,23 +1322,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `,call [war_number] [base_number] [optional_other_name]`. /// - public static string claim_summary { + public static string claim_usage { get { - return ResourceManager.GetString("claim_summary", resourceCulture); + return ResourceManager.GetString("claim_usage", resourceCulture); } } /// - /// Looks up a localized string similar to claim call c. + /// Looks up a localized string similar to claimfinish cf. /// - public static string claim_text { + public static string claimfinish_cmd { get { - return ResourceManager.GetString("claim_text", resourceCulture); + return ResourceManager.GetString("claimfinish_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Finish your claim with 3 stars if you destroyed a base. Optional second argument finishes for someone else.. + /// Looks up a localized string similar to Finish your claim with 3 stars if you destroyed a base. First argument is the war number, optional second argument finishes for someone else.. /// public static string claimfinish_desc { get { @@ -1473,25 +1347,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `,cf [war_number] [optional_other_name]`. + /// Looks up a localized string similar to `,cf 1 Someone`. /// - public static string claimfinish_summary { + public static string claimfinish_usage { get { - return ResourceManager.GetString("claimfinish_summary", resourceCulture); + return ResourceManager.GetString("claimfinish_usage", resourceCulture); } } /// - /// Looks up a localized string similar to claimfinish cf cf3 claimfinish3. + /// Looks up a localized string similar to claimfinish1 cf1. /// - public static string claimfinish_text { + public static string claimfinish1_cmd { get { - return ResourceManager.GetString("claimfinish_text", resourceCulture); + return ResourceManager.GetString("claimfinish1_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Finish your claim with 1 stars if you destroyed a base. Optional second argument finishes for someone else.. + /// Looks up a localized string similar to Finish your claim with 1 star if you destroyed a base. First argument is the war number, optional second argument finishes for someone else.. /// public static string claimfinish1_desc { get { @@ -1500,25 +1374,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `,cf [war_number] [optional_other_name]`. + /// Looks up a localized string similar to `,cf1 2 SomeGirl`. /// - public static string claimfinish1_summary { + public static string claimfinish1_usage { get { - return ResourceManager.GetString("claimfinish1_summary", resourceCulture); + return ResourceManager.GetString("claimfinish1_usage", resourceCulture); } } /// - /// Looks up a localized string similar to claimfinish1 cf1. + /// Looks up a localized string similar to claimfinish2 cf2. /// - public static string claimfinish1_text { + public static string claimfinish2_cmd { get { - return ResourceManager.GetString("claimfinish1_text", resourceCulture); + return ResourceManager.GetString("claimfinish2_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Finish your claim with 2 stars if you destroyed a base. Optional second argument finishes for someone else.. + /// Looks up a localized string similar to Finish your claim with 2 stars if you destroyed a base. First argument is the war number, optional second argument finishes for someone else.. /// public static string claimfinish2_desc { get { @@ -1527,25 +1401,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `,cf [war_number] [optional_other_name]`. + /// Looks up a localized string similar to `,cf2 1 SomeGuy`. /// - public static string claimfinish2_summary { + public static string claimfinish2_usage { get { - return ResourceManager.GetString("claimfinish2_summary", resourceCulture); + return ResourceManager.GetString("claimfinish2_usage", resourceCulture); } } /// - /// Looks up a localized string similar to claimfinish2 cf2. + /// Looks up a localized string similar to cleanup. /// - public static string claimfinish2_text { + public static string cleanup_cmd { get { - return ResourceManager.GetString("claimfinish2_text", resourceCulture); + return ResourceManager.GetString("cleanup_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Cleans up hanging voice connections. **Bot Owner Only!**. + /// Looks up a localized string similar to Cleans up hanging voice connections. . /// public static string cleanup_desc { get { @@ -1556,18 +1430,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!cleanup`. /// - public static string cleanup_summary { + public static string cleanup_usage { get { - return ResourceManager.GetString("cleanup_summary", resourceCulture); + return ResourceManager.GetString("cleanup_usage", resourceCulture); } } /// - /// Looks up a localized string similar to cleanup. + /// Looks up a localized string similar to cleanvplust cv+t. /// - public static string cleanup_text { + public static string cleanvplust_cmd { get { - return ResourceManager.GetString("cleanup_text", resourceCulture); + return ResourceManager.GetString("cleanvplust_cmd", resourceCulture); } } @@ -1583,50 +1457,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.cleanv+t`. /// - public static string cleanvplust_summary { + public static string cleanvplust_usage { get { - return ResourceManager.GetString("cleanvplust_summary", resourceCulture); + return ResourceManager.GetString("cleanvplust_usage", resourceCulture); } } /// - /// Looks up a localized string similar to cleanvplust cv+t. + /// Looks up a localized string similar to cmdcooldown cmdcd. /// - public static string cleanvplust_text { + public static string cmdcooldown_cmd { get { - return ResourceManager.GetString("cleanvplust_text", resourceCulture); + return ResourceManager.GetString("cmdcooldown_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Shows you what color corresponds to that hex.. - /// - public static string clr_desc { - get { - return ResourceManager.GetString("clr_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `~clr 00ff00`. - /// - public static string clr_summary { - get { - return ResourceManager.GetString("clr_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to clr prune. - /// - public static string clr_text { - get { - return ResourceManager.GetString("clr_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sets a cooldown per user for a command. Set 0 to clear. **Needs Manager Messages Permissions**. + /// Looks up a localized string similar to Sets a cooldown per user for a command. Set to 0 to remove the cooldown.. /// public static string cmdcooldown_desc { get { @@ -1637,23 +1484,50 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;cmdcd "some cmd" 5`. /// - public static string cmdcooldown_summary { + public static string cmdcooldown_usage { get { - return ResourceManager.GetString("cmdcooldown_summary", resourceCulture); + return ResourceManager.GetString("cmdcooldown_usage", resourceCulture); } } /// - /// Looks up a localized string similar to cmdcooldown cmdcd. + /// Looks up a localized string similar to color clr. /// - public static string cmdcooldown_text { + public static string color_cmd { get { - return ResourceManager.GetString("cmdcooldown_text", resourceCulture); + return ResourceManager.GetString("color_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to List all of the bot's commands from a certain module.. + /// Looks up a localized string similar to Shows you what color corresponds to that hex.. + /// + public static string color_desc { + get { + return ResourceManager.GetString("color_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `~clr 00ff00`. + /// + public static string color_usage { + get { + return ResourceManager.GetString("color_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to commands cmds. + /// + public static string commands_cmd { + get { + return ResourceManager.GetString("commands_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to List all of the bot's commands from a certain module. You can either specify full, or only first few letters of the module name.. /// public static string commands_desc { get { @@ -1662,25 +1536,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `-commands` or `.commands`. + /// Looks up a localized string similar to `-commands Administration` or `-cmds Admin`. /// - public static string commands_summary { + public static string commands_usage { get { - return ResourceManager.GetString("commands_summary", resourceCulture); + return ResourceManager.GetString("commands_usage", resourceCulture); } } /// - /// Looks up a localized string similar to commands. + /// Looks up a localized string similar to convert. /// - public static string commands_text { + public static string convert_cmd { get { - return ResourceManager.GetString("commands_text", resourceCulture); + return ResourceManager.GetString("convert_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Convert quantities from>to.. + /// Looks up a localized string similar to Convert quantities. Use `.convertlist` to see supported dimensions and currencies.. /// public static string convert_desc { get { @@ -1689,25 +1563,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `~convert m>km 1000`. + /// Looks up a localized string similar to `.convert m km 1000`. /// - public static string convert_summary { + public static string convert_usage { get { - return ResourceManager.GetString("convert_summary", resourceCulture); + return ResourceManager.GetString("convert_usage", resourceCulture); } } /// - /// Looks up a localized string similar to convert. + /// Looks up a localized string similar to convertlist. /// - public static string convert_text { + public static string convertlist_cmd { get { - return ResourceManager.GetString("convert_text", resourceCulture); + return ResourceManager.GetString("convertlist_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to List of the convertable dimensions and currencies.. + /// Looks up a localized string similar to List of the convertible dimensions and currencies.. /// public static string convertlist_desc { get { @@ -1716,20 +1590,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to . + /// Looks up a localized string similar to `.convertlist`. /// - public static string convertlist_summary { + public static string convertlist_usage { get { - return ResourceManager.GetString("convertlist_summary", resourceCulture); + return ResourceManager.GetString("convertlist_usage", resourceCulture); } } /// - /// Looks up a localized string similar to convertlist. + /// Looks up a localized string similar to cp. /// - public static string convertlist_text { + public static string cp_cmd { get { - return ResourceManager.GetString("convertlist_text", resourceCulture); + return ResourceManager.GetString("cp_cmd", resourceCulture); } } @@ -1745,23 +1619,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~cp`. /// - public static string cp_summary { + public static string cp_usage { get { - return ResourceManager.GetString("cp_summary", resourceCulture); + return ResourceManager.GetString("cp_usage", resourceCulture); } } /// - /// Looks up a localized string similar to cp. + /// Looks up a localized string similar to createrole cr. /// - public static string cp_text { + public static string createrole_cmd { get { - return ResourceManager.GetString("cp_text", resourceCulture); + return ResourceManager.GetString("createrole_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Creates a role with a given name. **Needs Manage Roles Permissions.**. + /// Looks up a localized string similar to Creates a role with a given name. . /// public static string createrole_desc { get { @@ -1772,18 +1646,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.cr Awesome Role`. /// - public static string createrole_summary { + public static string createrole_usage { get { - return ResourceManager.GetString("createrole_summary", resourceCulture); + return ResourceManager.GetString("createrole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to createrole cr. + /// Looks up a localized string similar to createwar cw. /// - public static string createrole_text { + public static string createwar_cmd { get { - return ResourceManager.GetString("createrole_text", resourceCulture); + return ResourceManager.GetString("createwar_cmd", resourceCulture); } } @@ -1799,23 +1673,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `,cw 15 The Enemy Clan`. /// - public static string createwar_summary { + public static string createwar_usage { get { - return ResourceManager.GetString("createwar_summary", resourceCulture); + return ResourceManager.GetString("createwar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to createwar cw. + /// Looks up a localized string similar to creatvoichanl cvch. /// - public static string createwar_text { + public static string creatvoichanl_cmd { get { - return ResourceManager.GetString("createwar_text", resourceCulture); + return ResourceManager.GetString("creatvoichanl_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Creates a new voice channel with a given name. **Needs Manage Channel Permissions.**. + /// Looks up a localized string similar to Creates a new voice channel with a given name. . /// public static string creatvoichanl_desc { get { @@ -1826,23 +1700,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.cvch VoiceChannelName`. /// - public static string creatvoichanl_summary { + public static string creatvoichanl_usage { get { - return ResourceManager.GetString("creatvoichanl_summary", resourceCulture); + return ResourceManager.GetString("creatvoichanl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to creatvoichanl cvch. + /// Looks up a localized string similar to creatxtchanl ctch. /// - public static string creatvoichanl_text { + public static string creatxtchanl_cmd { get { - return ResourceManager.GetString("creatvoichanl_text", resourceCulture); + return ResourceManager.GetString("creatxtchanl_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Creates a new text channel with a given name. **Needs Manage Channel Permissions.**. + /// Looks up a localized string similar to Creates a new text channel with a given name. . /// public static string creatxtchanl_desc { get { @@ -1853,45 +1727,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.ctch TextChannelName`. /// - public static string creatxtchanl_summary { + public static string creatxtchanl_usage { get { - return ResourceManager.GetString("creatxtchanl_summary", resourceCulture); + return ResourceManager.GetString("creatxtchanl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to creatxtchanl ctch. + /// Looks up a localized string similar to danbooru. /// - public static string creatxtchanl_text { + public static string danbooru_cmd { get { - return ResourceManager.GetString("creatxtchanl_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unblacklists a mentioned channel (#general for example).. - /// - public static string cubl_desc { - get { - return ResourceManager.GetString("cubl_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;cubl #some_channel`. - /// - public static string cubl_summary { - get { - return ResourceManager.GetString("cubl_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to cubl. - /// - public static string cubl_text { - get { - return ResourceManager.GetString("cubl_text", resourceCulture); + return ResourceManager.GetString("danbooru_cmd", resourceCulture); } } @@ -1907,23 +1754,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~danbooru yuri+kissing`. /// - public static string danbooru_summary { + public static string danbooru_usage { get { - return ResourceManager.GetString("danbooru_summary", resourceCulture); + return ResourceManager.GetString("danbooru_usage", resourceCulture); } } /// - /// Looks up a localized string similar to danbooru. + /// Looks up a localized string similar to deafen deaf. /// - public static string danbooru_text { + public static string deafen_cmd { get { - return ResourceManager.GetString("danbooru_text", resourceCulture); + return ResourceManager.GetString("deafen_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Deafens mentioned user or users. **Needs Deafen Permissions.**. + /// Looks up a localized string similar to Deafens mentioned user or users. . /// public static string deafen_desc { get { @@ -1934,18 +1781,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.deaf "@Someguy"` or `.deaf "@Someguy" "@Someguy"`. /// - public static string deafen_summary { + public static string deafen_usage { get { - return ResourceManager.GetString("deafen_summary", resourceCulture); + return ResourceManager.GetString("deafen_usage", resourceCulture); } } /// - /// Looks up a localized string similar to deafen deaf. + /// Looks up a localized string similar to defvol dv. /// - public static string deafen_text { + public static string defvol_cmd { get { - return ResourceManager.GetString("deafen_text", resourceCulture); + return ResourceManager.GetString("defvol_cmd", resourceCulture); } } @@ -1961,18 +1808,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!dv 80`. /// - public static string defvol_summary { + public static string defvol_usage { get { - return ResourceManager.GetString("defvol_summary", resourceCulture); + return ResourceManager.GetString("defvol_usage", resourceCulture); } } /// - /// Looks up a localized string similar to defvol dv. + /// Looks up a localized string similar to delallq daq. /// - public static string defvol_text { + public static string delallquotes_cmd { get { - return ResourceManager.GetString("defvol_text", resourceCulture); + return ResourceManager.GetString("delallquotes_cmd", resourceCulture); } } @@ -1986,25 +1833,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `.delallq`. + /// Looks up a localized string similar to `.delallq kek`. /// - public static string delallquotes_summary { + public static string delallquotes_usage { get { - return ResourceManager.GetString("delallquotes_summary", resourceCulture); + return ResourceManager.GetString("delallquotes_usage", resourceCulture); } } /// - /// Looks up a localized string similar to delallq daq. + /// Looks up a localized string similar to delcustreact dcr. /// - public static string delallquotes_text { + public static string delcustreact_cmd { get { - return ResourceManager.GetString("delallquotes_text", resourceCulture); + return ResourceManager.GetString("delcustreact_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Deletes a custom reaction with given name (and index). **Bot Owner Only.**. + /// Looks up a localized string similar to Deletes a custom reaction on a specific index. If ran in DM, it is bot owner only and deletes a global custom reaction. If ran in a server, it requires Administration priviledges and removes server custom reaction.. /// public static string delcustreact_desc { get { @@ -2013,20 +1860,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `.dcr index`. + /// Looks up a localized string similar to `.dcr 5`. /// - public static string delcustreact_summary { + public static string delcustreact_usage { get { - return ResourceManager.GetString("delcustreact_summary", resourceCulture); + return ResourceManager.GetString("delcustreact_usage", resourceCulture); } } /// - /// Looks up a localized string similar to delcustreact dcr. + /// Looks up a localized string similar to deleteplaylist delpls. /// - public static string delcustreact_text { + public static string deleteplaylist_cmd { get { - return ResourceManager.GetString("delcustreact_text", resourceCulture); + return ResourceManager.GetString("deleteplaylist_cmd", resourceCulture); } } @@ -2042,23 +1889,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!delpls animu-5`. /// - public static string deleteplaylist_summary { + public static string deleteplaylist_usage { get { - return ResourceManager.GetString("deleteplaylist_summary", resourceCulture); + return ResourceManager.GetString("deleteplaylist_usage", resourceCulture); } } /// - /// Looks up a localized string similar to deleteplaylist delpls. + /// Looks up a localized string similar to deletequote delq. /// - public static string deleteplaylist_text { + public static string deletequote_cmd { get { - return ResourceManager.GetString("deleteplaylist_text", resourceCulture); + return ResourceManager.GetString("deletequote_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it.. + /// Looks up a localized string similar to Deletes a random quote with the specified keyword. You have to either be server Administrator or the creator of the quote to delete it.. /// public static string deletequote_desc { get { @@ -2069,18 +1916,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.delq abc`. /// - public static string deletequote_summary { + public static string deletequote_usage { get { - return ResourceManager.GetString("deletequote_summary", resourceCulture); + return ResourceManager.GetString("deletequote_usage", resourceCulture); } } /// - /// Looks up a localized string similar to deletequote delq. + /// Looks up a localized string similar to delmsgoncmd. /// - public static string deletequote_text { + public static string delmsgoncmd_cmd { get { - return ResourceManager.GetString("deletequote_text", resourceCulture); + return ResourceManager.GetString("delmsgoncmd_cmd", resourceCulture); } } @@ -2096,23 +1943,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.delmsgoncmd`. /// - public static string delmsgoncmd_summary { + public static string delmsgoncmd_usage { get { - return ResourceManager.GetString("delmsgoncmd_summary", resourceCulture); + return ResourceManager.GetString("delmsgoncmd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to delmsgoncmd. + /// Looks up a localized string similar to deltxtchanl dtch. /// - public static string delmsgoncmd_text { + public static string deltxtchanl_cmd { get { - return ResourceManager.GetString("delmsgoncmd_text", resourceCulture); + return ResourceManager.GetString("deltxtchanl_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Deletes a text channel with a given name. **Needs Manage Channel Permissions.**. + /// Looks up a localized string similar to Deletes a text channel with a given name. . /// public static string deltxtchanl_desc { get { @@ -2123,23 +1970,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.dtch TextChannelName`. /// - public static string deltxtchanl_summary { + public static string deltxtchanl_usage { get { - return ResourceManager.GetString("deltxtchanl_summary", resourceCulture); + return ResourceManager.GetString("deltxtchanl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to deltxtchanl dtch. + /// Looks up a localized string similar to delvoichanl dvch. /// - public static string deltxtchanl_text { + public static string delvoichanl_cmd { get { - return ResourceManager.GetString("deltxtchanl_text", resourceCulture); + return ResourceManager.GetString("delvoichanl_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Deletes a voice channel with a given name. **Needs Manage Channel Permissions.**. + /// Looks up a localized string similar to Deletes a voice channel with a given name. . /// public static string delvoichanl_desc { get { @@ -2150,18 +1997,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.dvch VoiceChannelName`. /// - public static string delvoichanl_summary { + public static string delvoichanl_usage { get { - return ResourceManager.GetString("delvoichanl_summary", resourceCulture); + return ResourceManager.GetString("delvoichanl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to delvoichanl dvch. + /// Looks up a localized string similar to destroy d. /// - public static string delvoichanl_text { + public static string destroy_cmd { get { - return ResourceManager.GetString("delvoichanl_text", resourceCulture); + return ResourceManager.GetString("destroy_cmd", resourceCulture); } } @@ -2177,18 +2024,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!d`. /// - public static string destroy_summary { + public static string destroy_usage { get { - return ResourceManager.GetString("destroy_summary", resourceCulture); + return ResourceManager.GetString("destroy_usage", resourceCulture); } } /// - /// Looks up a localized string similar to destroy d. + /// Looks up a localized string similar to die. /// - public static string destroy_text { + public static string die_cmd { get { - return ResourceManager.GetString("destroy_text", resourceCulture); + return ResourceManager.GetString("die_cmd", resourceCulture); } } @@ -2204,18 +2051,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `@NadekoBot die`. /// - public static string die_summary { + public static string die_usage { get { - return ResourceManager.GetString("die_summary", resourceCulture); + return ResourceManager.GetString("die_usage", resourceCulture); } } /// - /// Looks up a localized string similar to die. + /// Looks up a localized string similar to donadd. /// - public static string die_text { + public static string donadd_cmd { get { - return ResourceManager.GetString("die_text", resourceCulture); + return ResourceManager.GetString("donadd_cmd", resourceCulture); } } @@ -2231,23 +2078,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.donadd Donate Amount`. /// - public static string donadd_summary { + public static string donadd_usage { get { - return ResourceManager.GetString("donadd_summary", resourceCulture); + return ResourceManager.GetString("donadd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to donadd. + /// Looks up a localized string similar to donate. /// - public static string donadd_text { + public static string donate_cmd { get { - return ResourceManager.GetString("donadd_text", resourceCulture); + return ResourceManager.GetString("donate_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Instructions for helping the project!. + /// Looks up a localized string similar to Instructions for helping the project financially.. /// public static string donate_desc { get { @@ -2256,20 +2103,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `-donate` or `~donate`. + /// Looks up a localized string similar to `-donate`. /// - public static string donate_summary { + public static string donate_usage { get { - return ResourceManager.GetString("donate_summary", resourceCulture); + return ResourceManager.GetString("donate_usage", resourceCulture); } } /// - /// Looks up a localized string similar to donate. + /// Looks up a localized string similar to donators. /// - public static string donate_text { + public static string donators_cmd { get { - return ResourceManager.GetString("donate_text", resourceCulture); + return ResourceManager.GetString("donators_cmd", resourceCulture); } } @@ -2285,18 +2132,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.donators`. /// - public static string donators_summary { + public static string donators_usage { get { - return ResourceManager.GetString("donators_summary", resourceCulture); + return ResourceManager.GetString("donators_usage", resourceCulture); } } /// - /// Looks up a localized string similar to donators. + /// Looks up a localized string similar to do you love me. /// - public static string donators_text { + public static string doyouloveme_cmd { get { - return ResourceManager.GetString("donators_text", resourceCulture); + return ResourceManager.GetString("doyouloveme_cmd", resourceCulture); } } @@ -2312,23 +2159,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `@NadekoBot do you love me`. /// - public static string doyouloveme_summary { + public static string doyouloveme_usage { get { - return ResourceManager.GetString("doyouloveme_summary", resourceCulture); + return ResourceManager.GetString("doyouloveme_usage", resourceCulture); } } /// - /// Looks up a localized string similar to do you love me. + /// Looks up a localized string similar to draw. /// - public static string doyouloveme_text { + public static string draw_cmd { get { - return ResourceManager.GetString("doyouloveme_text", resourceCulture); + return ResourceManager.GetString("draw_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Draws a card from the deck.If you supply number [x], she draws up to 5 cards from the deck.. + /// Looks up a localized string similar to Draws a card from the deck.If you supply number X, she draws up to 5 cards from the deck.. /// public static string draw_desc { get { @@ -2337,47 +2184,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `$draw [x]`. + /// Looks up a localized string similar to `$draw` or `$draw 5`. /// - public static string draw_summary { + public static string draw_usage { get { - return ResourceManager.GetString("draw_summary", resourceCulture); + return ResourceManager.GetString("draw_usage", resourceCulture); } } /// - /// Looks up a localized string similar to draw. + /// Looks up a localized string similar to dysyd. /// - public static string draw_text { + public static string dysyd_cmd { get { - return ResourceManager.GetString("draw_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Dumps all of the invites it can to dump.txt.** Owner Only.**. - /// - public static string dump_desc { - get { - return ResourceManager.GetString("dump_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `@NadekoBot dump`. - /// - public static string dump_summary { - get { - return ResourceManager.GetString("dump_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to dump. - /// - public static string dump_text { - get { - return ResourceManager.GetString("dump_text", resourceCulture); + return ResourceManager.GetString("dysyd_cmd", resourceCulture); } } @@ -2393,18 +2213,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.dysyd`. /// - public static string dysyd_summary { + public static string dysyd_usage { get { - return ResourceManager.GetString("dysyd_summary", resourceCulture); + return ResourceManager.GetString("dysyd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to dysyd. + /// Looks up a localized string similar to e621. /// - public static string dysyd_text { + public static string e621_cmd { get { - return ResourceManager.GetString("dysyd_text", resourceCulture); + return ResourceManager.GetString("e621_cmd", resourceCulture); } } @@ -2420,23 +2240,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~e621 yuri kissing`. /// - public static string e621_summary { + public static string e621_usage { get { - return ResourceManager.GetString("e621_summary", resourceCulture); + return ResourceManager.GetString("e621_usage", resourceCulture); } } /// - /// Looks up a localized string similar to e621. + /// Looks up a localized string similar to editcustreact ecr. /// - public static string e621_text { + public static string editcustreact_cmd { get { - return ResourceManager.GetString("e621_text", resourceCulture); + return ResourceManager.GetString("editcustreact_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message **Bot Owner Only**. + /// Looks up a localized string similar to Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message.. /// public static string editcustreact_desc { get { @@ -2447,18 +2267,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.ecr "%mention% disguise" 2 Test 123`. /// - public static string editcustreact_summary { + public static string editcustreact_usage { get { - return ResourceManager.GetString("editcustreact_summary", resourceCulture); + return ResourceManager.GetString("editcustreact_usage", resourceCulture); } } /// - /// Looks up a localized string similar to editcustreact ecr. + /// Looks up a localized string similar to endwar ew. /// - public static string editcustreact_text { + public static string endwar_cmd { get { - return ResourceManager.GetString("editcustreact_text", resourceCulture); + return ResourceManager.GetString("endwar_cmd", resourceCulture); } } @@ -2474,18 +2294,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `,ew [war_number]`. /// - public static string endwar_summary { + public static string endwar_usage { get { - return ResourceManager.GetString("endwar_summary", resourceCulture); + return ResourceManager.GetString("endwar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to endwar ew. + /// Looks up a localized string similar to fw. /// - public static string endwar_text { + public static string filterword_cmd { get { - return ResourceManager.GetString("endwar_text", resourceCulture); + return ResourceManager.GetString("filterword_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adds or removes (if it exists) a word from the list of filtered words. Use` ;sfw` or `;cfw` to toggle filtering.. + /// + public static string filterword_desc { + get { + return ResourceManager.GetString("filterword_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;fw poop`. + /// + public static string filterword_usage { + get { + return ResourceManager.GetString("filterword_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to fire. + /// + public static string fire_cmd { + get { + return ResourceManager.GetString("fire_cmd", resourceCulture); } } @@ -2501,18 +2348,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `@NadekoBot fire [x]`. /// - public static string fire_summary { + public static string fire_usage { get { - return ResourceManager.GetString("fire_summary", resourceCulture); + return ResourceManager.GetString("fire_usage", resourceCulture); } } /// - /// Looks up a localized string similar to fire. + /// Looks up a localized string similar to flip. /// - public static string fire_text { + public static string flip_cmd { get { - return ResourceManager.GetString("fire_text", resourceCulture); + return ResourceManager.GetString("flip_cmd", resourceCulture); } } @@ -2528,18 +2375,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$flip` or `$flip 3`. /// - public static string flip_summary { + public static string flip_usage { get { - return ResourceManager.GetString("flip_summary", resourceCulture); + return ResourceManager.GetString("flip_usage", resourceCulture); } } /// - /// Looks up a localized string similar to flip. + /// Looks up a localized string similar to gelbooru. /// - public static string flip_text { + public static string gelbooru_cmd { get { - return ResourceManager.GetString("flip_text", resourceCulture); + return ResourceManager.GetString("gelbooru_cmd", resourceCulture); } } @@ -2555,23 +2402,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~gelbooru yuri+kissing`. /// - public static string gelbooru_summary { + public static string gelbooru_usage { get { - return ResourceManager.GetString("gelbooru_summary", resourceCulture); + return ResourceManager.GetString("gelbooru_usage", resourceCulture); } } /// - /// Looks up a localized string similar to gelbooru. + /// Looks up a localized string similar to gencurrency gc. /// - public static string gelbooru_text { + public static string gencurrency_cmd { get { - return ResourceManager.GetString("gelbooru_text", resourceCulture); + return ResourceManager.GetString("gencurrency_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a NadekoFlower. Optional parameter cooldown time in minutes, 5 minutes by default. Requires Manage Messages permission.. + /// Looks up a localized string similar to Toggles currency generation on this channel. Every posted message will have chance to spawn a NadekoFlower. Chance is specified by the Bot Owner. (default is 2%). /// public static string gencurrency_desc { get { @@ -2580,20 +2427,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `>gc` or `>gc 60`. + /// Looks up a localized string similar to `>gc`. /// - public static string gencurrency_summary { + public static string gencurrency_usage { get { - return ResourceManager.GetString("gencurrency_summary", resourceCulture); + return ResourceManager.GetString("gencurrency_usage", resourceCulture); } } /// - /// Looks up a localized string similar to gencurrency gc. + /// Looks up a localized string similar to getlink gl. /// - public static string gencurrency_text { + public static string getlink_cmd { get { - return ResourceManager.GetString("gencurrency_text", resourceCulture); + return ResourceManager.GetString("getlink_cmd", resourceCulture); } } @@ -2609,23 +2456,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!gl`. /// - public static string getlink_summary { + public static string getlink_usage { get { - return ResourceManager.GetString("getlink_summary", resourceCulture); + return ResourceManager.GetString("getlink_usage", resourceCulture); } } /// - /// Looks up a localized string similar to getlink gl. + /// Looks up a localized string similar to give. /// - public static string getlink_text { + public static string give_cmd { get { - return ResourceManager.GetString("getlink_text", resourceCulture); + return ResourceManager.GetString("give_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Give someone a certain amount of NadekoFlowers. + /// Looks up a localized string similar to Give someone a certain amount of currency.. /// public static string give_desc { get { @@ -2636,18 +2483,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$give 1 "@SomeGuy"`. /// - public static string give_summary { + public static string give_usage { get { - return ResourceManager.GetString("give_summary", resourceCulture); + return ResourceManager.GetString("give_usage", resourceCulture); } } /// - /// Looks up a localized string similar to give. + /// Looks up a localized string similar to google g. /// - public static string give_text { + public static string google_cmd { get { - return ResourceManager.GetString("give_text", resourceCulture); + return ResourceManager.GetString("google_cmd", resourceCulture); } } @@ -2663,18 +2510,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~google query`. /// - public static string google_summary { + public static string google_usage { get { - return ResourceManager.GetString("google_summary", resourceCulture); + return ResourceManager.GetString("google_usage", resourceCulture); } } /// - /// Looks up a localized string similar to google g. + /// Looks up a localized string similar to goto. /// - public static string google_text { + public static string goto_cmd { get { - return ResourceManager.GetString("google_text", resourceCulture); + return ResourceManager.GetString("goto_cmd", resourceCulture); } } @@ -2690,23 +2537,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!goto 30`. /// - public static string goto_summary { + public static string goto_usage { get { - return ResourceManager.GetString("goto_summary", resourceCulture); + return ResourceManager.GetString("goto_usage", resourceCulture); } } /// - /// Looks up a localized string similar to goto. + /// Looks up a localized string similar to greet. /// - public static string goto_text { + public static string greet_cmd { get { - return ResourceManager.GetString("goto_text", resourceCulture); + return ResourceManager.GetString("greet_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles anouncements on the current channel when someone joins the server. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Toggles anouncements on the current channel when someone joins the server. . /// public static string greet_desc { get { @@ -2717,23 +2564,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.greet`. /// - public static string greet_summary { + public static string greet_usage { get { - return ResourceManager.GetString("greet_summary", resourceCulture); + return ResourceManager.GetString("greet_usage", resourceCulture); } } /// - /// Looks up a localized string similar to greet. + /// Looks up a localized string similar to greetdel grdel. /// - public static string greet_text { + public static string greetdel_cmd { get { - return ResourceManager.GetString("greet_text", resourceCulture); + return ResourceManager.GetString("greetdel_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles automatic deletion of greet messages. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Toggles automatic deletion of greet messages. . /// public static string greetdel_desc { get { @@ -2744,23 +2591,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.greetdel`. /// - public static string greetdel_summary { + public static string greetdel_usage { get { - return ResourceManager.GetString("greetdel_summary", resourceCulture); + return ResourceManager.GetString("greetdel_usage", resourceCulture); } } /// - /// Looks up a localized string similar to greetdel. + /// Looks up a localized string similar to greetdm. /// - public static string greetdel_text { + public static string greetdm_cmd { get { - return ResourceManager.GetString("greetdel_text", resourceCulture); + return ResourceManager.GetString("greetdm_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles whether the greet messages will be sent in a DM (This is separate from greet - you can have both, any or neither enabled). **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Toggles whether the greet messages will be sent in a DM (This is separate from greet - you can have both, any or neither enabled). . /// public static string greetdm_desc { get { @@ -2771,23 +2618,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.greetdm`. /// - public static string greetdm_summary { + public static string greetdm_usage { get { - return ResourceManager.GetString("greetdm_summary", resourceCulture); + return ResourceManager.GetString("greetdm_usage", resourceCulture); } } /// - /// Looks up a localized string similar to greetdm. + /// Looks up a localized string similar to greetdmmsg. /// - public static string greetdm_text { + public static string greetdmmsg_cmd { get { - return ResourceManager.GetString("greetdm_text", resourceCulture); + return ResourceManager.GetString("greetdmmsg_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. . /// public static string greetdmmsg_desc { get { @@ -2798,23 +2645,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.greetdmmsg Welcome to the server, %user%`.. /// - public static string greetdmmsg_summary { + public static string greetdmmsg_usage { get { - return ResourceManager.GetString("greetdmmsg_summary", resourceCulture); + return ResourceManager.GetString("greetdmmsg_usage", resourceCulture); } } /// - /// Looks up a localized string similar to greetdmmsg. + /// Looks up a localized string similar to greetmsg. /// - public static string greetdmmsg_text { + public static string greetmsg_cmd { get { - return ResourceManager.GetString("greetdmmsg_text", resourceCulture); + return ResourceManager.GetString("greetmsg_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets a new join announcement message which will be shown in the server's channel. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Sets a new join announcement message which will be shown in the server's channel. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. . /// public static string greetmsg_desc { get { @@ -2825,18 +2672,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.greetmsg Welcome, %user%.`. /// - public static string greetmsg_summary { + public static string greetmsg_usage { get { - return ResourceManager.GetString("greetmsg_summary", resourceCulture); + return ResourceManager.GetString("greetmsg_usage", resourceCulture); } } /// - /// Looks up a localized string similar to greetmsg. + /// Looks up a localized string similar to readme guide. /// - public static string greetmsg_text { + public static string guide_cmd { get { - return ResourceManager.GetString("greetmsg_text", resourceCulture); + return ResourceManager.GetString("guide_cmd", resourceCulture); } } @@ -2852,23 +2699,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `-readme` or `-guide`. /// - public static string guide_summary { + public static string guide_usage { get { - return ResourceManager.GetString("guide_summary", resourceCulture); + return ResourceManager.GetString("guide_usage", resourceCulture); } } /// - /// Looks up a localized string similar to readme guide. + /// Looks up a localized string similar to help h. /// - public static string guide_text { + public static string h_cmd { get { - return ResourceManager.GetString("guide_text", resourceCulture); + return ResourceManager.GetString("h_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Either shows a help for a single command, or PMs you help link if no arguments are specified.. + /// Looks up a localized string similar to Either shows a help for a single command, or DMs you help link if no arguments are specified.. /// public static string h_desc { get { @@ -2877,20 +2724,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `-h !m q` or just `-h`. + /// Looks up a localized string similar to `-h !!q` or `-h`. /// - public static string h_summary { + public static string h_usage { get { - return ResourceManager.GetString("h_summary", resourceCulture); + return ResourceManager.GetString("h_usage", resourceCulture); } } /// - /// Looks up a localized string similar to h help. + /// Looks up a localized string similar to half. /// - public static string h_text { + public static string half_cmd { get { - return ResourceManager.GetString("h_text", resourceCulture); + return ResourceManager.GetString("half_cmd", resourceCulture); } } @@ -2906,18 +2753,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!half`. /// - public static string half_summary { + public static string half_usage { get { - return ResourceManager.GetString("half_summary", resourceCulture); + return ResourceManager.GetString("half_usage", resourceCulture); } } /// - /// Looks up a localized string similar to half. + /// Looks up a localized string similar to #. /// - public static string half_text { + public static string hashtag_cmd { get { - return ResourceManager.GetString("half_text", resourceCulture); + return ResourceManager.GetString("hashtag_cmd", resourceCulture); } } @@ -2933,18 +2780,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~# ff`. /// - public static string hashtag_summary { + public static string hashtag_usage { get { - return ResourceManager.GetString("hashtag_summary", resourceCulture); + return ResourceManager.GetString("hashtag_usage", resourceCulture); } } /// - /// Looks up a localized string similar to #. + /// Looks up a localized string similar to heal. /// - public static string hashtag_text { + public static string heal_cmd { get { - return ResourceManager.GetString("hashtag_text", resourceCulture); + return ResourceManager.GetString("heal_cmd", resourceCulture); } } @@ -2960,23 +2807,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>heal @someone`. /// - public static string heal_summary { + public static string heal_usage { get { - return ResourceManager.GetString("heal_summary", resourceCulture); + return ResourceManager.GetString("heal_usage", resourceCulture); } } /// - /// Looks up a localized string similar to heal. + /// Looks up a localized string similar to heap. /// - public static string heal_text { + public static string heap_cmd { get { - return ResourceManager.GetString("heal_text", resourceCulture); + return ResourceManager.GetString("heap_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Shows allocated memory - **Bot Owner Only!**. + /// Looks up a localized string similar to Shows allocated memory - . /// public static string heap_desc { get { @@ -2987,18 +2834,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.heap`. /// - public static string heap_summary { + public static string heap_usage { get { - return ResourceManager.GetString("heap_summary", resourceCulture); + return ResourceManager.GetString("heap_usage", resourceCulture); } } /// - /// Looks up a localized string similar to heap. + /// Looks up a localized string similar to hearthstone hs. /// - public static string heap_text { + public static string hearthstone_cmd { get { - return ResourceManager.GetString("heap_text", resourceCulture); + return ResourceManager.GetString("hearthstone_cmd", resourceCulture); } } @@ -3014,23 +2861,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~hs Ysera`. /// - public static string hearthstone_summary { + public static string hearthstone_usage { get { - return ResourceManager.GetString("hearthstone_summary", resourceCulture); + return ResourceManager.GetString("hearthstone_usage", resourceCulture); } } /// - /// Looks up a localized string similar to hearthstone hs. + /// Looks up a localized string similar to hentai. /// - public static string hearthstone_text { + public static string hentai_cmd { get { - return ResourceManager.GetString("hearthstone_text", resourceCulture); + return ResourceManager.GetString("hentai_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Shows a random NSFW hentai image from gelbooru and danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +). + /// Looks up a localized string similar to Shows a 2 random images (from gelbooru and danbooru) with a given tag. Tag is optional but preferred. Only 1 tag allowed.. /// public static string hentai_desc { get { @@ -3039,25 +2886,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `~hentai yuri+kissing`. + /// Looks up a localized string similar to `~hentai yuri`. /// - public static string hentai_summary { + public static string hentai_usage { get { - return ResourceManager.GetString("hentai_summary", resourceCulture); + return ResourceManager.GetString("hentai_usage", resourceCulture); } } /// - /// Looks up a localized string similar to hentai. + /// Looks up a localized string similar to hgit. /// - public static string hentai_text { + public static string hgit_cmd { get { - return ResourceManager.GetString("hentai_text", resourceCulture); + return ResourceManager.GetString("hgit_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Generates the commandlist.md file. **Bot Owner Only!**. + /// Looks up a localized string similar to Generates the commandlist.md file.. /// public static string hgit_desc { get { @@ -3068,18 +2915,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `-hgit`. /// - public static string hgit_summary { + public static string hgit_usage { get { - return ResourceManager.GetString("hgit_summary", resourceCulture); + return ResourceManager.GetString("hgit_usage", resourceCulture); } } /// - /// Looks up a localized string similar to hgit. + /// Looks up a localized string similar to hitbox hb. /// - public static string hgit_text { + public static string hitbox_cmd { get { - return ResourceManager.GetString("hgit_text", resourceCulture); + return ResourceManager.GetString("hitbox_cmd", resourceCulture); } } @@ -3095,18 +2942,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~hitbox SomeStreamer`. /// - public static string hitbox_summary { + public static string hitbox_usage { get { - return ResourceManager.GetString("hitbox_summary", resourceCulture); + return ResourceManager.GetString("hitbox_usage", resourceCulture); } } /// - /// Looks up a localized string similar to hitbox hb. + /// Looks up a localized string similar to how are you. /// - public static string hitbox_text { + public static string howareyou_cmd { get { - return ResourceManager.GetString("hitbox_text", resourceCulture); + return ResourceManager.GetString("howareyou_cmd", resourceCulture); } } @@ -3122,18 +2969,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `@NadekoBot how are you`. /// - public static string howareyou_summary { + public static string howareyou_usage { get { - return ResourceManager.GetString("howareyou_summary", resourceCulture); + return ResourceManager.GetString("howareyou_usage", resourceCulture); } } /// - /// Looks up a localized string similar to how are you. + /// Looks up a localized string similar to img i. /// - public static string howareyou_text { + public static string i_cmd { get { - return ResourceManager.GetString("howareyou_text", resourceCulture); + return ResourceManager.GetString("i_cmd", resourceCulture); } } @@ -3149,18 +2996,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~i cute kitten`. /// - public static string i_summary { + public static string i_usage { get { - return ResourceManager.GetString("i_summary", resourceCulture); + return ResourceManager.GetString("i_usage", resourceCulture); } } /// - /// Looks up a localized string similar to img i. + /// Looks up a localized string similar to iam. /// - public static string i_text { + public static string iam_cmd { get { - return ResourceManager.GetString("i_text", resourceCulture); + return ResourceManager.GetString("iam_cmd", resourceCulture); } } @@ -3176,18 +3023,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.iam Gamer`. /// - public static string iam_summary { + public static string iam_usage { get { - return ResourceManager.GetString("iam_summary", resourceCulture); + return ResourceManager.GetString("iam_usage", resourceCulture); } } /// - /// Looks up a localized string similar to iam. + /// Looks up a localized string similar to iamnot iamn. /// - public static string iam_text { + public static string iamnot_cmd { get { - return ResourceManager.GetString("iam_text", resourceCulture); + return ResourceManager.GetString("iamnot_cmd", resourceCulture); } } @@ -3203,18 +3050,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.iamn Gamer`. /// - public static string iamnot_summary { + public static string iamnot_usage { get { - return ResourceManager.GetString("iamnot_summary", resourceCulture); + return ResourceManager.GetString("iamnot_usage", resourceCulture); } } /// - /// Looks up a localized string similar to iamnot iamn. + /// Looks up a localized string similar to imdb. /// - public static string iamnot_text { + public static string imdb_cmd { get { - return ResourceManager.GetString("iamnot_text", resourceCulture); + return ResourceManager.GetString("imdb_cmd", resourceCulture); } } @@ -3230,18 +3077,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~imdb Batman vs Superman`. /// - public static string imdb_summary { + public static string imdb_usage { get { - return ResourceManager.GetString("imdb_summary", resourceCulture); + return ResourceManager.GetString("imdb_usage", resourceCulture); } } /// - /// Looks up a localized string similar to imdb. + /// Looks up a localized string similar to inrole. /// - public static string imdb_text { + public static string inrole_cmd { get { - return ResourceManager.GetString("imdb_text", resourceCulture); + return ResourceManager.GetString("inrole_cmd", resourceCulture); } } @@ -3257,18 +3104,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.inrole Role`. /// - public static string inrole_summary { + public static string inrole_usage { get { - return ResourceManager.GetString("inrole_summary", resourceCulture); + return ResourceManager.GetString("inrole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to inrole. + /// Looks up a localized string similar to ir. /// - public static string inrole_text { + public static string ir_cmd { get { - return ResourceManager.GetString("inrole_text", resourceCulture); + return ResourceManager.GetString("ir_cmd", resourceCulture); } } @@ -3284,23 +3131,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~ir cute kitten`. /// - public static string ir_summary { + public static string ir_usage { get { - return ResourceManager.GetString("ir_summary", resourceCulture); + return ResourceManager.GetString("ir_usage", resourceCulture); } } /// - /// Looks up a localized string similar to ir. + /// Looks up a localized string similar to jcsc. /// - public static string ir_text { + public static string jcsc_cmd { get { - return ResourceManager.GetString("ir_text", resourceCulture); + return ResourceManager.GetString("jcsc_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Joins current channel to an instance of cross server channel using the token. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Joins current channel to an instance of cross server channel using the token. . /// public static string jcsc_desc { get { @@ -3309,20 +3156,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `.jcsc`. + /// Looks up a localized string similar to `.jcsc TokenHere`. /// - public static string jcsc_summary { + public static string jcsc_usage { get { - return ResourceManager.GetString("jcsc_summary", resourceCulture); + return ResourceManager.GetString("jcsc_usage", resourceCulture); } } /// - /// Looks up a localized string similar to jcsc. + /// Looks up a localized string similar to joinrace jr. /// - public static string jcsc_text { + public static string joinrace_cmd { get { - return ResourceManager.GetString("jcsc_text", resourceCulture); + return ResourceManager.GetString("joinrace_cmd", resourceCulture); } } @@ -3338,23 +3185,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$jr` or `$jr 5`. /// - public static string joinrace_summary { + public static string joinrace_usage { get { - return ResourceManager.GetString("joinrace_summary", resourceCulture); + return ResourceManager.GetString("joinrace_usage", resourceCulture); } } /// - /// Looks up a localized string similar to joinrace jr. + /// Looks up a localized string similar to kick k. /// - public static string joinrace_text { + public static string kick_cmd { get { - return ResourceManager.GetString("joinrace_text", resourceCulture); + return ResourceManager.GetString("kick_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Kicks a mentioned user. **Needs Kick Permissions.**. + /// Looks up a localized string similar to Kicks a mentioned user. . /// public static string kick_desc { get { @@ -3365,23 +3212,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.k "@some Guy" Your behaviour is toxic.`. /// - public static string kick_summary { + public static string kick_usage { get { - return ResourceManager.GetString("kick_summary", resourceCulture); + return ResourceManager.GetString("kick_usage", resourceCulture); } } /// - /// Looks up a localized string similar to kick k. + /// Looks up a localized string similar to lcsc. /// - public static string kick_text { + public static string lcsc_cmd { get { - return ResourceManager.GetString("kick_text", resourceCulture); + return ResourceManager.GetString("lcsc_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Leaves Cross server channel instance from this channel. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Leaves Cross server channel instance from this channel. . /// public static string lcsc_desc { get { @@ -3392,23 +3239,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.lcsc`. /// - public static string lcsc_summary { + public static string lcsc_usage { get { - return ResourceManager.GetString("lcsc_summary", resourceCulture); + return ResourceManager.GetString("lcsc_usage", resourceCulture); } } /// - /// Looks up a localized string similar to lcsc. + /// Looks up a localized string similar to leaderboard lb. /// - public static string lcsc_text { + public static string leaderboard_cmd { get { - return ResourceManager.GetString("lcsc_text", resourceCulture); + return ResourceManager.GetString("leaderboard_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Displays bot currency leaderboard. + /// Looks up a localized string similar to Displays bot currency leaderboard.. /// public static string leaderboard_desc { get { @@ -3419,23 +3266,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$lb`. /// - public static string leaderboard_summary { + public static string leaderboard_usage { get { - return ResourceManager.GetString("leaderboard_summary", resourceCulture); + return ResourceManager.GetString("leaderboard_usage", resourceCulture); } } /// - /// Looks up a localized string similar to leaderboard lb. + /// Looks up a localized string similar to leave. /// - public static string leaderboard_text { + public static string leave_cmd { get { - return ResourceManager.GetString("leaderboard_text", resourceCulture); + return ResourceManager.GetString("leave_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Makes Nadeko leave the server. Either name or id required. **Bot Owner Only!**. + /// Looks up a localized string similar to Makes Nadeko leave the server. Either name or id required. . /// public static string leave_desc { get { @@ -3446,18 +3293,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.leave 123123123331`. /// - public static string leave_summary { + public static string leave_usage { get { - return ResourceManager.GetString("leave_summary", resourceCulture); + return ResourceManager.GetString("leave_usage", resourceCulture); } } /// - /// Looks up a localized string similar to leave. + /// Looks up a localized string similar to leet. /// - public static string leave_text { + public static string leet_cmd { get { - return ResourceManager.GetString("leave_text", resourceCulture); + return ResourceManager.GetString("leet_cmd", resourceCulture); } } @@ -3473,18 +3320,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>leet 3 Hello`. /// - public static string leet_summary { + public static string leet_usage { get { - return ResourceManager.GetString("leet_summary", resourceCulture); + return ResourceManager.GetString("leet_usage", resourceCulture); } } /// - /// Looks up a localized string similar to leet. + /// Looks up a localized string similar to linux. /// - public static string leet_text { + public static string linux_cmd { get { - return ResourceManager.GetString("leet_text", resourceCulture); + return ResourceManager.GetString("linux_cmd", resourceCulture); } } @@ -3500,23 +3347,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>linux Spyware Windows`. /// - public static string linux_summary { + public static string linux_usage { get { - return ResourceManager.GetString("linux_summary", resourceCulture); + return ResourceManager.GetString("linux_usage", resourceCulture); } } /// - /// Looks up a localized string similar to linux. + /// Looks up a localized string similar to listallincidents lain. /// - public static string linux_text { + public static string listallincidents_cmd { get { - return ResourceManager.GetString("linux_text", resourceCulture); + return ResourceManager.GetString("listallincidents_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sends you a file containing all incidents and flags them as read. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Sends you a file containing all incidents and flags them as read. . /// public static string listallincidents_desc { get { @@ -3527,23 +3374,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.lain`. /// - public static string listallincidents_summary { + public static string listallincidents_usage { get { - return ResourceManager.GetString("listallincidents_summary", resourceCulture); + return ResourceManager.GetString("listallincidents_usage", resourceCulture); } } /// - /// Looks up a localized string similar to listallincidents lain. + /// Looks up a localized string similar to listcustreact lcr. /// - public static string listallincidents_text { + public static string listcustreact_cmd { get { - return ResourceManager.GetString("listallincidents_text", resourceCulture); + return ResourceManager.GetString("listcustreact_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Lists custom reactions (paginated with 30 commands per page). Use 'all' instead of page number to get all custom reactions DM-ed to you.. + /// Looks up a localized string similar to Lists global or server custom reactions (15 commands per page). Running the command in DM will list global custom reactions, while running it in server will list that server's custom reactions.. /// public static string listcustreact_desc { get { @@ -3554,23 +3401,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.lcr 1`. /// - public static string listcustreact_summary { + public static string listcustreact_usage { get { - return ResourceManager.GetString("listcustreact_summary", resourceCulture); + return ResourceManager.GetString("listcustreact_usage", resourceCulture); } } /// - /// Looks up a localized string similar to listcustreact lcr. + /// Looks up a localized string similar to listincidents lin. /// - public static string listcustreact_text { + public static string listincidents_cmd { get { - return ResourceManager.GetString("listcustreact_text", resourceCulture); + return ResourceManager.GetString("listincidents_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to List all UNREAD incidents and flags them as read. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to List all UNREAD incidents and flags them as read. . /// public static string listincidents_desc { get { @@ -3581,23 +3428,50 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.lin`. /// - public static string listincidents_summary { + public static string listincidents_usage { get { - return ResourceManager.GetString("listincidents_summary", resourceCulture); + return ResourceManager.GetString("listincidents_usage", resourceCulture); } } /// - /// Looks up a localized string similar to listincidents lin. + /// Looks up a localized string similar to listperms lp. /// - public static string listincidents_text { + public static string listperms_cmd { get { - return ResourceManager.GetString("listincidents_text", resourceCulture); + return ResourceManager.GetString("listperms_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Lists all playing statuses with their corresponding number. **Bot Owner Only!**. + /// Looks up a localized string similar to Lists whole permission chain with their indexes. You can specify an optional page number if there are a lot of permissions.. + /// + public static string listperms_desc { + get { + return ResourceManager.GetString("listperms_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;lp` or `;lp 3`. + /// + public static string listperms_usage { + get { + return ResourceManager.GetString("listperms_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to listplaying lipl. + /// + public static string listplaying_cmd { + get { + return ResourceManager.GetString("listplaying_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lists all playing statuses with their corresponding number.. /// public static string listplaying_desc { get { @@ -3608,18 +3482,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.lipl`. /// - public static string listplaying_summary { + public static string listplaying_usage { get { - return ResourceManager.GetString("listplaying_summary", resourceCulture); + return ResourceManager.GetString("listplaying_usage", resourceCulture); } } /// - /// Looks up a localized string similar to listplaying lipl. + /// Looks up a localized string similar to listqueue lq. /// - public static string listplaying_text { + public static string listqueue_cmd { get { - return ResourceManager.GetString("listplaying_text", resourceCulture); + return ResourceManager.GetString("listqueue_cmd", resourceCulture); } } @@ -3635,23 +3509,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!lq` or `!!lq 2`. /// - public static string listqueue_summary { + public static string listqueue_usage { get { - return ResourceManager.GetString("listqueue_summary", resourceCulture); + return ResourceManager.GetString("listqueue_usage", resourceCulture); } } /// - /// Looks up a localized string similar to listqueue lq. + /// Looks up a localized string similar to lists list. /// - public static string listqueue_text { + public static string lists_cmd { get { - return ResourceManager.GetString("listqueue_text", resourceCulture); + return ResourceManager.GetString("lists_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Lists all lists, yo ;) **Bot Owner Only!**. + /// Looks up a localized string similar to Lists all lists, yo ;). /// public static string lists_desc { get { @@ -3662,18 +3536,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `trello list`. /// - public static string lists_summary { + public static string lists_usage { get { - return ResourceManager.GetString("lists_summary", resourceCulture); + return ResourceManager.GetString("lists_usage", resourceCulture); } } /// - /// Looks up a localized string similar to lists list. + /// Looks up a localized string similar to liststreams ls. /// - public static string lists_text { + public static string liststreams_cmd { get { - return ResourceManager.GetString("lists_text", resourceCulture); + return ResourceManager.GetString("liststreams_cmd", resourceCulture); } } @@ -3689,18 +3563,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~ls`. /// - public static string liststreams_summary { + public static string liststreams_usage { get { - return ResourceManager.GetString("liststreams_summary", resourceCulture); + return ResourceManager.GetString("liststreams_usage", resourceCulture); } } /// - /// Looks up a localized string similar to liststreams ls. + /// Looks up a localized string similar to listwar lw. /// - public static string liststreams_text { + public static string listwar_cmd { get { - return ResourceManager.GetString("liststreams_text", resourceCulture); + return ResourceManager.GetString("listwar_cmd", resourceCulture); } } @@ -3716,18 +3590,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `,lw [war_number] or ,lw`. /// - public static string listwar_summary { + public static string listwar_usage { get { - return ResourceManager.GetString("listwar_summary", resourceCulture); + return ResourceManager.GetString("listwar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to listwar lw. + /// Looks up a localized string similar to lmgtfy. /// - public static string listwar_text { + public static string lmgtfy_cmd { get { - return ResourceManager.GetString("listwar_text", resourceCulture); + return ResourceManager.GetString("lmgtfy_cmd", resourceCulture); } } @@ -3743,18 +3617,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~lmgtfy query`. /// - public static string lmgtfy_summary { + public static string lmgtfy_usage { get { - return ResourceManager.GetString("lmgtfy_summary", resourceCulture); + return ResourceManager.GetString("lmgtfy_usage", resourceCulture); } } /// - /// Looks up a localized string similar to lmgtfy. + /// Looks up a localized string similar to load. /// - public static string lmgtfy_text { + public static string load_cmd { get { - return ResourceManager.GetString("lmgtfy_text", resourceCulture); + return ResourceManager.GetString("load_cmd", resourceCulture); } } @@ -3770,23 +3644,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!load classical-1`. /// - public static string load_summary { + public static string load_usage { get { - return ResourceManager.GetString("load_summary", resourceCulture); + return ResourceManager.GetString("load_usage", resourceCulture); } } /// - /// Looks up a localized string similar to load. + /// Looks up a localized string similar to local lo. /// - public static string load_text { + public static string local_cmd { get { - return ResourceManager.GetString("load_text", resourceCulture); + return ResourceManager.GetString("local_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Queues a local file by specifying a full path. **Bot Owner Only!**. + /// Looks up a localized string similar to Queues a local file by specifying a full path.. /// public static string local_desc { get { @@ -3797,23 +3671,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!lo C:/music/mysong.mp3`. /// - public static string local_summary { + public static string local_usage { get { - return ResourceManager.GetString("local_summary", resourceCulture); + return ResourceManager.GetString("local_usage", resourceCulture); } } /// - /// Looks up a localized string similar to local lo. + /// Looks up a localized string similar to localplaylst lopl. /// - public static string local_text { + public static string localpl_cmd { get { - return ResourceManager.GetString("local_text", resourceCulture); + return ResourceManager.GetString("localpl_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Queues all songs from a directory. **Bot Owner Only!**. + /// Looks up a localized string similar to Queues all songs from a directory.. /// public static string localpl_desc { get { @@ -3824,23 +3698,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!lopl C:/music/classical`. /// - public static string localpl_summary { + public static string localpl_usage { get { - return ResourceManager.GetString("localpl_summary", resourceCulture); + return ResourceManager.GetString("localpl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to localplaylst lopl. + /// Looks up a localized string similar to logignore. /// - public static string localpl_text { + public static string logignore_cmd { get { - return ResourceManager.GetString("localpl_text", resourceCulture); + return ResourceManager.GetString("logignore_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Bot Owner Only!**. + /// Looks up a localized string similar to Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel.. /// public static string logignore_desc { get { @@ -3851,23 +3725,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.logignore`. /// - public static string logignore_summary { + public static string logignore_usage { get { - return ResourceManager.GetString("logignore_summary", resourceCulture); + return ResourceManager.GetString("logignore_usage", resourceCulture); } } /// - /// Looks up a localized string similar to logignore. + /// Looks up a localized string similar to logserver. /// - public static string logignore_text { + public static string logserver_cmd { get { - return ResourceManager.GetString("logignore_text", resourceCulture); + return ResourceManager.GetString("logserver_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!**. + /// Looks up a localized string similar to Logs server activity in this channel.. /// public static string logserver_desc { get { @@ -3878,18 +3752,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.logserver`. /// - public static string logserver_summary { + public static string logserver_usage { get { - return ResourceManager.GetString("logserver_summary", resourceCulture); + return ResourceManager.GetString("logserver_usage", resourceCulture); } } /// - /// Looks up a localized string similar to logserver. + /// Looks up a localized string similar to lolban. /// - public static string logserver_text { + public static string lolban_cmd { get { - return ResourceManager.GetString("logserver_text", resourceCulture); + return ResourceManager.GetString("lolban_cmd", resourceCulture); } } @@ -3905,18 +3779,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~lolban`. /// - public static string lolban_summary { + public static string lolban_usage { get { - return ResourceManager.GetString("lolban_summary", resourceCulture); + return ResourceManager.GetString("lolban_usage", resourceCulture); } } /// - /// Looks up a localized string similar to lolban. + /// Looks up a localized string similar to lolchamp. /// - public static string lolban_text { + public static string lolchamp_cmd { get { - return ResourceManager.GetString("lolban_text", resourceCulture); + return ResourceManager.GetString("lolchamp_cmd", resourceCulture); } } @@ -3932,18 +3806,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~lolchamp Riven` or `~lolchamp Annie sup`. /// - public static string lolchamp_summary { + public static string lolchamp_usage { get { - return ResourceManager.GetString("lolchamp_summary", resourceCulture); + return ResourceManager.GetString("lolchamp_usage", resourceCulture); } } /// - /// Looks up a localized string similar to lolchamp. + /// Looks up a localized string similar to lsar. /// - public static string lolchamp_text { + public static string lsar_cmd { get { - return ResourceManager.GetString("lolchamp_text", resourceCulture); + return ResourceManager.GetString("lsar_cmd", resourceCulture); } } @@ -3959,23 +3833,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.lsar`. /// - public static string lsar_summary { + public static string lsar_usage { get { - return ResourceManager.GetString("lsar_summary", resourceCulture); + return ResourceManager.GetString("lsar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to lsar. + /// Looks up a localized string similar to lstfilterwords lfw. /// - public static string lsar_text { + public static string lstfilterwords_cmd { get { - return ResourceManager.GetString("lsar_text", resourceCulture); + return ResourceManager.GetString("lstfilterwords_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Shows a list of filtered words. + /// Looks up a localized string similar to Shows a list of filtered words.. /// public static string lstfilterwords_desc { get { @@ -3986,18 +3860,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;lfw`. /// - public static string lstfilterwords_summary { + public static string lstfilterwords_usage { get { - return ResourceManager.GetString("lstfilterwords_summary", resourceCulture); + return ResourceManager.GetString("lstfilterwords_usage", resourceCulture); } } /// - /// Looks up a localized string similar to lstfilterwords lfw. + /// Looks up a localized string similar to magicitem mi. /// - public static string lstfilterwords_text { + public static string magicitem_cmd { get { - return ResourceManager.GetString("lstfilterwords_text", resourceCulture); + return ResourceManager.GetString("magicitem_cmd", resourceCulture); } } @@ -4013,18 +3887,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~mi`. /// - public static string magicitem_summary { + public static string magicitem_usage { get { - return ResourceManager.GetString("magicitem_summary", resourceCulture); + return ResourceManager.GetString("magicitem_usage", resourceCulture); } } /// - /// Looks up a localized string similar to magicitem mi. + /// Looks up a localized string similar to manga mang mq. /// - public static string magicitem_text { + public static string manga_cmd { get { - return ResourceManager.GetString("magicitem_text", resourceCulture); + return ResourceManager.GetString("manga_cmd", resourceCulture); } } @@ -4040,18 +3914,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~mq Shingeki no kyojin`. /// - public static string manga_summary { + public static string manga_usage { get { - return ResourceManager.GetString("manga_summary", resourceCulture); + return ResourceManager.GetString("manga_usage", resourceCulture); } } /// - /// Looks up a localized string similar to manga mang mq. + /// Looks up a localized string similar to max. /// - public static string manga_text { + public static string max_cmd { get { - return ResourceManager.GetString("manga_text", resourceCulture); + return ResourceManager.GetString("max_cmd", resourceCulture); } } @@ -4067,18 +3941,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!max`. /// - public static string max_summary { + public static string max_usage { get { - return ResourceManager.GetString("max_summary", resourceCulture); + return ResourceManager.GetString("max_usage", resourceCulture); } } /// - /// Looks up a localized string similar to max. + /// Looks up a localized string similar to memegen. /// - public static string max_text { + public static string memegen_cmd { get { - return ResourceManager.GetString("max_text", resourceCulture); + return ResourceManager.GetString("memegen_cmd", resourceCulture); } } @@ -4094,18 +3968,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~memegen biw "gets iced coffee" "in the winter"`. /// - public static string memegen_summary { + public static string memegen_usage { get { - return ResourceManager.GetString("memegen_summary", resourceCulture); + return ResourceManager.GetString("memegen_usage", resourceCulture); } } /// - /// Looks up a localized string similar to memegen. + /// Looks up a localized string similar to memelist. /// - public static string memegen_text { + public static string memelist_cmd { get { - return ResourceManager.GetString("memegen_text", resourceCulture); + return ResourceManager.GetString("memelist_cmd", resourceCulture); } } @@ -4121,18 +3995,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~memelist`. /// - public static string memelist_summary { + public static string memelist_usage { get { - return ResourceManager.GetString("memelist_summary", resourceCulture); + return ResourceManager.GetString("memelist_usage", resourceCulture); } } /// - /// Looks up a localized string similar to memelist. + /// Looks up a localized string similar to mentionrole menro. /// - public static string memelist_text { + public static string mentionrole_cmd { get { - return ResourceManager.GetString("memelist_text", resourceCulture); + return ResourceManager.GetString("mentionrole_cmd", resourceCulture); } } @@ -4148,23 +4022,50 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.menro RoleName`. /// - public static string mentionrole_summary { + public static string mentionrole_usage { get { - return ResourceManager.GetString("mentionrole_summary", resourceCulture); + return ResourceManager.GetString("mentionrole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to mentionrole menro. + /// Looks up a localized string similar to migratedata. /// - public static string mentionrole_text { + public static string migratedata_cmd { get { - return ResourceManager.GetString("mentionrole_text", resourceCulture); + return ResourceManager.GetString("migratedata_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to List all bot modules.. + /// Looks up a localized string similar to Migrate data from old bot configuration. + /// + public static string migratedata_desc { + get { + return ResourceManager.GetString("migratedata_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `.migratedata`. + /// + public static string migratedata_usage { + get { + return ResourceManager.GetString("migratedata_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to modules mdls. + /// + public static string modules_cmd { + get { + return ResourceManager.GetString("modules_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lists all bot modules.. /// public static string modules_desc { get { @@ -4173,20 +4074,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `-modules` or `.modules`. + /// Looks up a localized string similar to `-modules`. /// - public static string modules_summary { + public static string modules_usage { get { - return ResourceManager.GetString("modules_summary", resourceCulture); + return ResourceManager.GetString("modules_usage", resourceCulture); } } /// - /// Looks up a localized string similar to modules. + /// Looks up a localized string similar to move mv. /// - public static string modules_text { + public static string move_cmd { get { - return ResourceManager.GetString("modules_text", resourceCulture); + return ResourceManager.GetString("move_cmd", resourceCulture); } } @@ -4202,18 +4103,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!mv`. /// - public static string move_summary { + public static string move_usage { get { - return ResourceManager.GetString("move_summary", resourceCulture); + return ResourceManager.GetString("move_usage", resourceCulture); } } /// - /// Looks up a localized string similar to move mv. + /// Looks up a localized string similar to movelist ml. /// - public static string move_text { + public static string movelist_cmd { get { - return ResourceManager.GetString("move_text", resourceCulture); + return ResourceManager.GetString("movelist_cmd", resourceCulture); } } @@ -4229,18 +4130,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>ml`. /// - public static string movelist_summary { + public static string movelist_usage { get { - return ResourceManager.GetString("movelist_summary", resourceCulture); + return ResourceManager.GetString("movelist_usage", resourceCulture); } } /// - /// Looks up a localized string similar to movelist ml. + /// Looks up a localized string similar to moveperm mp. /// - public static string movelist_text { + public static string moveperm_cmd { get { - return ResourceManager.GetString("movelist_text", resourceCulture); + return ResourceManager.GetString("moveperm_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Moves permission from one position to another.. + /// + public static string moveperm_desc { + get { + return ResourceManager.GetString("moveperm_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;mp 2 4`. + /// + public static string moveperm_usage { + get { + return ResourceManager.GetString("moveperm_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to movesong ms. + /// + public static string movesong_cmd { + get { + return ResourceManager.GetString("movesong_cmd", resourceCulture); } } @@ -4256,23 +4184,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!! ms 5>3`. /// - public static string movesong_summary { + public static string movesong_usage { get { - return ResourceManager.GetString("movesong_summary", resourceCulture); + return ResourceManager.GetString("movesong_usage", resourceCulture); } } /// - /// Looks up a localized string similar to movesong ms. + /// Looks up a localized string similar to mute. /// - public static string movesong_text { + public static string mute_cmd { get { - return ResourceManager.GetString("movesong_text", resourceCulture); + return ResourceManager.GetString("mute_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets the music volume to 0%. + /// Looks up a localized string similar to Mutes a mentioned user in a voice channel.. /// public static string mute_desc { get { @@ -4281,47 +4209,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `!!min`. + /// Looks up a localized string similar to `.mute @Someone`. /// - public static string mute_summary { + public static string mute_usage { get { - return ResourceManager.GetString("mute_summary", resourceCulture); + return ResourceManager.GetString("mute_usage", resourceCulture); } } /// - /// Looks up a localized string similar to mute min. + /// Looks up a localized string similar to next n. /// - public static string mute_text { + public static string next_cmd { get { - return ResourceManager.GetString("mute_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner Only!**. - /// - public static string newavatar_desc { - get { - return ResourceManager.GetString("newavatar_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `.setavatar http://i.imgur.com/xTG3a1I.jpg`. - /// - public static string newavatar_summary { - get { - return ResourceManager.GetString("newavatar_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to newavatar setavatar. - /// - public static string newavatar_text { - get { - return ResourceManager.GetString("newavatar_text", resourceCulture); + return ResourceManager.GetString("next_cmd", resourceCulture); } } @@ -4337,18 +4238,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!n`. /// - public static string next_summary { + public static string next_usage { get { - return ResourceManager.GetString("next_summary", resourceCulture); + return ResourceManager.GetString("next_usage", resourceCulture); } } /// - /// Looks up a localized string similar to next n. + /// Looks up a localized string similar to nowplaying np. /// - public static string next_text { + public static string nowplaying_cmd { get { - return ResourceManager.GetString("next_text", resourceCulture); + return ResourceManager.GetString("nowplaying_cmd", resourceCulture); } } @@ -4364,18 +4265,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!np`. /// - public static string nowplaying_summary { + public static string nowplaying_usage { get { - return ResourceManager.GetString("nowplaying_summary", resourceCulture); + return ResourceManager.GetString("nowplaying_usage", resourceCulture); } } /// - /// Looks up a localized string similar to nowplaying np. + /// Looks up a localized string similar to nroll. /// - public static string nowplaying_text { + public static string nroll_cmd { get { - return ResourceManager.GetString("nowplaying_text", resourceCulture); + return ResourceManager.GetString("nroll_cmd", resourceCulture); } } @@ -4391,18 +4292,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$nroll 5` (rolls 0-5) or `$nroll 5-15`. /// - public static string nroll_summary { + public static string nroll_usage { get { - return ResourceManager.GetString("nroll_summary", resourceCulture); + return ResourceManager.GetString("nroll_usage", resourceCulture); } } /// - /// Looks up a localized string similar to nroll. + /// Looks up a localized string similar to osu. /// - public static string nroll_text { + public static string osu_cmd { get { - return ResourceManager.GetString("nroll_text", resourceCulture); + return ResourceManager.GetString("osu_cmd", resourceCulture); } } @@ -4418,18 +4319,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~osu Name` or `~osu Name taiko`. /// - public static string osu_summary { + public static string osu_usage { get { - return ResourceManager.GetString("osu_summary", resourceCulture); + return ResourceManager.GetString("osu_usage", resourceCulture); } } /// - /// Looks up a localized string similar to osu. + /// Looks up a localized string similar to osu5. /// - public static string osu_text { + public static string osu5_cmd { get { - return ResourceManager.GetString("osu_text", resourceCulture); + return ResourceManager.GetString("osu5_cmd", resourceCulture); } } @@ -4443,20 +4344,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `~osu top5 Name`. + /// Looks up a localized string similar to `~osu5 Name`. /// - public static string osu5_summary { + public static string osu5_usage { get { - return ResourceManager.GetString("osu5_summary", resourceCulture); + return ResourceManager.GetString("osu5_usage", resourceCulture); } } /// - /// Looks up a localized string similar to osu5. + /// Looks up a localized string similar to osub. /// - public static string osu5_text { + public static string osub_cmd { get { - return ResourceManager.GetString("osu5_text", resourceCulture); + return ResourceManager.GetString("osub_cmd", resourceCulture); } } @@ -4470,20 +4371,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `~osu b https://osu.ppy.sh/s/127712`. + /// Looks up a localized string similar to `~osub https://osu.ppy.sh/s/127712`. /// - public static string osub_summary { + public static string osub_usage { get { - return ResourceManager.GetString("osub_summary", resourceCulture); + return ResourceManager.GetString("osub_usage", resourceCulture); } } /// - /// Looks up a localized string similar to osub. + /// Looks up a localized string similar to pause p. /// - public static string osub_text { + public static string pause_cmd { get { - return ResourceManager.GetString("osub_text", resourceCulture); + return ResourceManager.GetString("pause_cmd", resourceCulture); } } @@ -4499,18 +4400,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!p`. /// - public static string pause_summary { + public static string pause_usage { get { - return ResourceManager.GetString("pause_summary", resourceCulture); + return ResourceManager.GetString("pause_usage", resourceCulture); } } /// - /// Looks up a localized string similar to pause p. + /// Looks up a localized string similar to permrole pr. /// - public static string pause_text { + public static string permrole_cmd { get { - return ResourceManager.GetString("pause_text", resourceCulture); + return ResourceManager.GetString("permrole_cmd", resourceCulture); } } @@ -4526,18 +4427,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;pr role`. /// - public static string permrole_summary { + public static string permrole_usage { get { - return ResourceManager.GetString("permrole_summary", resourceCulture); + return ResourceManager.GetString("permrole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to permrole pr. + /// Looks up a localized string similar to pick. /// - public static string permrole_text { + public static string pick_cmd { get { - return ResourceManager.GetString("permrole_text", resourceCulture); + return ResourceManager.GetString("pick_cmd", resourceCulture); } } @@ -4553,18 +4454,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>pick`. /// - public static string pick_summary { + public static string pick_usage { get { - return ResourceManager.GetString("pick_summary", resourceCulture); + return ResourceManager.GetString("pick_usage", resourceCulture); } } /// - /// Looks up a localized string similar to pick. + /// Looks up a localized string similar to plant. /// - public static string pick_text { + public static string plant_cmd { get { - return ResourceManager.GetString("pick_text", resourceCulture); + return ResourceManager.GetString("plant_cmd", resourceCulture); } } @@ -4580,18 +4481,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>plant`. /// - public static string plant_summary { + public static string plant_usage { get { - return ResourceManager.GetString("plant_summary", resourceCulture); + return ResourceManager.GetString("plant_usage", resourceCulture); } } /// - /// Looks up a localized string similar to plant. + /// Looks up a localized string similar to playlist pl. /// - public static string plant_text { + public static string playlist_cmd { get { - return ResourceManager.GetString("plant_text", resourceCulture); + return ResourceManager.GetString("playlist_cmd", resourceCulture); } } @@ -4607,18 +4508,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!pl playlist link or name`. /// - public static string playlist_summary { + public static string playlist_usage { get { - return ResourceManager.GetString("playlist_summary", resourceCulture); + return ResourceManager.GetString("playlist_usage", resourceCulture); } } /// - /// Looks up a localized string similar to playlist pl. + /// Looks up a localized string similar to playlists pls. /// - public static string playlist_text { + public static string playlists_cmd { get { - return ResourceManager.GetString("playlist_text", resourceCulture); + return ResourceManager.GetString("playlists_cmd", resourceCulture); } } @@ -4634,18 +4535,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!pls 1`. /// - public static string playlists_summary { + public static string playlists_usage { get { - return ResourceManager.GetString("playlists_summary", resourceCulture); + return ResourceManager.GetString("playlists_usage", resourceCulture); } } /// - /// Looks up a localized string similar to playlists pls. + /// Looks up a localized string similar to pokemon poke. /// - public static string playlists_text { + public static string pokemon_cmd { get { - return ResourceManager.GetString("playlists_text", resourceCulture); + return ResourceManager.GetString("pokemon_cmd", resourceCulture); } } @@ -4661,18 +4562,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~poke Sylveon`. /// - public static string pokemon_summary { + public static string pokemon_usage { get { - return ResourceManager.GetString("pokemon_summary", resourceCulture); + return ResourceManager.GetString("pokemon_usage", resourceCulture); } } /// - /// Looks up a localized string similar to pokemon poke. + /// Looks up a localized string similar to pokemonability pokeab. /// - public static string pokemon_text { + public static string pokemonability_cmd { get { - return ResourceManager.GetString("pokemon_text", resourceCulture); + return ResourceManager.GetString("pokemonability_cmd", resourceCulture); } } @@ -4688,23 +4589,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~pokeab "water gun"`. /// - public static string pokemonability_summary { + public static string pokemonability_usage { get { - return ResourceManager.GetString("pokemonability_summary", resourceCulture); + return ResourceManager.GetString("pokemonability_usage", resourceCulture); } } /// - /// Looks up a localized string similar to pokemonability pokeab. + /// Looks up a localized string similar to poll. /// - public static string pokemonability_text { + public static string poll_cmd { get { - return ResourceManager.GetString("pokemonability_text", resourceCulture); + return ResourceManager.GetString("poll_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Creates a poll, only person who has manage server permission can do it. **Needs Manage Server Permissions**. + /// Looks up a localized string similar to Creates a poll, only person who has manage server permission can do it.. /// public static string poll_desc { get { @@ -4715,18 +4616,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>poll Question?;Answer1;Answ 2;A_3`. /// - public static string poll_summary { + public static string poll_usage { get { - return ResourceManager.GetString("poll_summary", resourceCulture); + return ResourceManager.GetString("poll_usage", resourceCulture); } } /// - /// Looks up a localized string similar to poll. + /// Looks up a localized string similar to pollend. /// - public static string poll_text { + public static string pollend_cmd { get { - return ResourceManager.GetString("poll_text", resourceCulture); + return ResourceManager.GetString("pollend_cmd", resourceCulture); } } @@ -4742,23 +4643,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>pollend`. /// - public static string pollend_summary { + public static string pollend_usage { get { - return ResourceManager.GetString("pollend_summary", resourceCulture); + return ResourceManager.GetString("pollend_usage", resourceCulture); } } /// - /// Looks up a localized string similar to pollend. + /// Looks up a localized string similar to prune clr. /// - public static string pollend_text { + public static string prune_cmd { get { - return ResourceManager.GetString("pollend_text", resourceCulture); + return ResourceManager.GetString("prune_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. **Needs Manage Messages Permissions**. + /// Looks up a localized string similar to `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. . /// public static string prune_desc { get { @@ -4769,18 +4670,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.prune` or `.prune 5` or `.prune @Someone` or `.prune @Someone X`. /// - public static string prune_summary { + public static string prune_usage { get { - return ResourceManager.GetString("prune_summary", resourceCulture); + return ResourceManager.GetString("prune_usage", resourceCulture); } } /// - /// Looks up a localized string similar to prune clr. + /// Looks up a localized string similar to queue q yq. /// - public static string prune_text { + public static string queue_cmd { get { - return ResourceManager.GetString("prune_text", resourceCulture); + return ResourceManager.GetString("queue_cmd", resourceCulture); } } @@ -4796,18 +4697,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!q Dream Of Venice`. /// - public static string queue_summary { + public static string queue_usage { get { - return ResourceManager.GetString("queue_summary", resourceCulture); + return ResourceManager.GetString("queue_usage", resourceCulture); } } /// - /// Looks up a localized string similar to queue q yq. + /// Looks up a localized string similar to race. /// - public static string queue_text { + public static string race_cmd { get { - return ResourceManager.GetString("queue_text", resourceCulture); + return ResourceManager.GetString("race_cmd", resourceCulture); } } @@ -4823,18 +4724,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$race`. /// - public static string race_summary { + public static string race_usage { get { - return ResourceManager.GetString("race_summary", resourceCulture); + return ResourceManager.GetString("race_usage", resourceCulture); } } /// - /// Looks up a localized string similar to race. + /// Looks up a localized string similar to radio ra. /// - public static string race_text { + public static string radio_cmd { get { - return ResourceManager.GetString("race_text", resourceCulture); + return ResourceManager.GetString("radio_cmd", resourceCulture); } } @@ -4850,18 +4751,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!ra radio link here`. /// - public static string radio_summary { + public static string radio_usage { get { - return ResourceManager.GetString("radio_summary", resourceCulture); + return ResourceManager.GetString("radio_usage", resourceCulture); } } /// - /// Looks up a localized string similar to radio ra. + /// Looks up a localized string similar to raffle. /// - public static string radio_text { + public static string raffle_cmd { get { - return ResourceManager.GetString("radio_text", resourceCulture); + return ResourceManager.GetString("raffle_cmd", resourceCulture); } } @@ -4877,18 +4778,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$raffle` or `$raffle RoleName`. /// - public static string raffle_summary { + public static string raffle_usage { get { - return ResourceManager.GetString("raffle_summary", resourceCulture); + return ResourceManager.GetString("raffle_usage", resourceCulture); } } /// - /// Looks up a localized string similar to raffle. + /// Looks up a localized string similar to randjoke rj. /// - public static string raffle_text { + public static string randjoke_cmd { get { - return ResourceManager.GetString("raffle_text", resourceCulture); + return ResourceManager.GetString("randjoke_cmd", resourceCulture); } } @@ -4904,18 +4805,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~rj`. /// - public static string randjoke_summary { + public static string randjoke_usage { get { - return ResourceManager.GetString("randjoke_summary", resourceCulture); + return ResourceManager.GetString("randjoke_usage", resourceCulture); } } /// - /// Looks up a localized string similar to randjoke rj. + /// Looks up a localized string similar to randomcat meow. /// - public static string randjoke_text { + public static string randomcat_cmd { get { - return ResourceManager.GetString("randjoke_text", resourceCulture); + return ResourceManager.GetString("randomcat_cmd", resourceCulture); } } @@ -4931,18 +4832,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~meow`. /// - public static string randomcat_summary { + public static string randomcat_usage { get { - return ResourceManager.GetString("randomcat_summary", resourceCulture); + return ResourceManager.GetString("randomcat_usage", resourceCulture); } } /// - /// Looks up a localized string similar to randomcat meow. + /// Looks up a localized string similar to randomdog woof. /// - public static string randomcat_text { + public static string randomdog_cmd { get { - return ResourceManager.GetString("randomcat_text", resourceCulture); + return ResourceManager.GetString("randomdog_cmd", resourceCulture); } } @@ -4958,18 +4859,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~woof`. /// - public static string randomdog_summary { + public static string randomdog_usage { get { - return ResourceManager.GetString("randomdog_summary", resourceCulture); + return ResourceManager.GetString("randomdog_usage", resourceCulture); } } /// - /// Looks up a localized string similar to randomdog woof. + /// Looks up a localized string similar to remind. /// - public static string randomdog_text { + public static string remind_cmd { get { - return ResourceManager.GetString("randomdog_text", resourceCulture); + return ResourceManager.GetString("remind_cmd", resourceCulture); } } @@ -4985,45 +4886,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.remind me 1d5h Do something` or `.remind #general Start now!`. /// - public static string remind_summary { + public static string remind_usage { get { - return ResourceManager.GetString("remind_summary", resourceCulture); + return ResourceManager.GetString("remind_usage", resourceCulture); } } /// - /// Looks up a localized string similar to remind. + /// Looks up a localized string similar to remindtemplate. /// - public static string remind_text { + public static string remindtemplate_cmd { get { - return ResourceManager.GetString("remind_text", resourceCulture); + return ResourceManager.GetString("remindtemplate_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. **Bot Owner Only!**. + /// Looks up a localized string similar to Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. . /// - public static string remindmsg_desc { + public static string remindtemplate_desc { get { - return ResourceManager.GetString("remindmsg_desc", resourceCulture); + return ResourceManager.GetString("remindtemplate_desc", resourceCulture); } } /// - /// Looks up a localized string similar to `.remindmsg do something else`. + /// Looks up a localized string similar to `.remindtemplate %user%, you gotta do %message%!`. /// - public static string remindmsg_summary { + public static string remindtemplate_usage { get { - return ResourceManager.GetString("remindmsg_summary", resourceCulture); + return ResourceManager.GetString("remindtemplate_usage", resourceCulture); } } /// - /// Looks up a localized string similar to remindmsg. + /// Looks up a localized string similar to remove rm. /// - public static string remindmsg_text { + public static string remove_cmd { get { - return ResourceManager.GetString("remindmsg_text", resourceCulture); + return ResourceManager.GetString("remove_cmd", resourceCulture); } } @@ -5039,23 +4940,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!rm 5`. /// - public static string remove_summary { + public static string remove_usage { get { - return ResourceManager.GetString("remove_summary", resourceCulture); + return ResourceManager.GetString("remove_usage", resourceCulture); } } /// - /// Looks up a localized string similar to remove rm. + /// Looks up a localized string similar to removeallroles rar. /// - public static string remove_text { + public static string removeallroles_cmd { get { - return ResourceManager.GetString("remove_text", resourceCulture); + return ResourceManager.GetString("removeallroles_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Removes all roles from a mentioned user. **Needs Manage Roles Permissions.**. + /// Looks up a localized string similar to Removes all roles from a mentioned user. . /// public static string removeallroles_desc { get { @@ -5066,23 +4967,50 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.rar @User`. /// - public static string removeallroles_summary { + public static string removeallroles_usage { get { - return ResourceManager.GetString("removeallroles_summary", resourceCulture); + return ResourceManager.GetString("removeallroles_usage", resourceCulture); } } /// - /// Looks up a localized string similar to removeallroles rar. + /// Looks up a localized string similar to removeperm rp. /// - public static string removeallroles_text { + public static string removeperm_cmd { get { - return ResourceManager.GetString("removeallroles_text", resourceCulture); + return ResourceManager.GetString("removeperm_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Removes a playing string on a given number. **Bot Owner Only!**. + /// Looks up a localized string similar to Removes a permission from a given position. + /// + public static string removeperm_desc { + get { + return ResourceManager.GetString("removeperm_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;rp 1`. + /// + public static string removeperm_usage { + get { + return ResourceManager.GetString("removeperm_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to removeplaying rmpl repl. + /// + public static string removeplaying_cmd { + get { + return ResourceManager.GetString("removeplaying_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removes a playing string on a given number. . /// public static string removeplaying_desc { get { @@ -5093,23 +5021,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.rmpl`. /// - public static string removeplaying_summary { + public static string removeplaying_usage { get { - return ResourceManager.GetString("removeplaying_summary", resourceCulture); + return ResourceManager.GetString("removeplaying_usage", resourceCulture); } } /// - /// Looks up a localized string similar to removeplaying rmlp repl. + /// Looks up a localized string similar to removerole rr. /// - public static string removeplaying_text { + public static string removerole_cmd { get { - return ResourceManager.GetString("removeplaying_text", resourceCulture); + return ResourceManager.GetString("removerole_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Removes a role from a given user. **Needs Manage Roles Permissions.**. + /// Looks up a localized string similar to Removes a role from a given user. . /// public static string removerole_desc { get { @@ -5120,18 +5048,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.rr @User Admin`. /// - public static string removerole_summary { + public static string removerole_usage { get { - return ResourceManager.GetString("removerole_summary", resourceCulture); + return ResourceManager.GetString("removerole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to removerole rr. + /// Looks up a localized string similar to removestream rms. /// - public static string removerole_text { + public static string removestream_cmd { get { - return ResourceManager.GetString("removerole_text", resourceCulture); + return ResourceManager.GetString("removestream_cmd", resourceCulture); } } @@ -5147,23 +5075,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~rms SomeGuy`. /// - public static string removestream_summary { + public static string removestream_usage { get { - return ResourceManager.GetString("removestream_summary", resourceCulture); + return ResourceManager.GetString("removestream_usage", resourceCulture); } } /// - /// Looks up a localized string similar to removestream rms. + /// Looks up a localized string similar to renamerole renr. /// - public static string removestream_text { + public static string renamerole_cmd { get { - return ResourceManager.GetString("removestream_text", resourceCulture); + return ResourceManager.GetString("renamerole_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Renames a role. Roles you are renaming must be lower than bot's highest role. **Manage Roles Permissions.**. + /// Looks up a localized string similar to Renames a role. Roles you are renaming must be lower than bot's highest role.. /// public static string renamerole_desc { get { @@ -5174,23 +5102,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.renr "First role" SecondRole`. /// - public static string renamerole_summary { + public static string renamerole_usage { get { - return ResourceManager.GetString("renamerole_summary", resourceCulture); + return ResourceManager.GetString("renamerole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to renamerole renr. + /// Looks up a localized string similar to repeat. /// - public static string renamerole_text { + public static string repeat_cmd { get { - return ResourceManager.GetString("renamerole_text", resourceCulture); + return ResourceManager.GetString("repeat_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Repeat a message every X minutes. If no parameters are specified, repeat is disabled. **Needs Manage Messages Permissions.**. + /// Looks up a localized string similar to Repeat a message every X minutes. If no parameters are specified, repeat is disabled.. /// public static string repeat_desc { get { @@ -5201,23 +5129,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.repeat 5 Hello there`. /// - public static string repeat_summary { + public static string repeat_usage { get { - return ResourceManager.GetString("repeat_summary", resourceCulture); + return ResourceManager.GetString("repeat_usage", resourceCulture); } } /// - /// Looks up a localized string similar to repeat. + /// Looks up a localized string similar to repeatinvoke repinv. /// - public static string repeat_text { + public static string repeatinvoke_cmd { get { - return ResourceManager.GetString("repeat_text", resourceCulture); + return ResourceManager.GetString("repeatinvoke_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Immediately shows the repeat message and restarts the timer. **Needs Manage Messages Permissions.**. + /// Looks up a localized string similar to Immediately shows the repeat message and restarts the timer. . /// public static string repeatinvoke_desc { get { @@ -5228,18 +5156,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.repinv`. /// - public static string repeatinvoke_summary { + public static string repeatinvoke_usage { get { - return ResourceManager.GetString("repeatinvoke_summary", resourceCulture); + return ResourceManager.GetString("repeatinvoke_usage", resourceCulture); } } /// - /// Looks up a localized string similar to repeatinvoke repinv. + /// Looks up a localized string similar to rpeatplaylst rpl. /// - public static string repeatinvoke_text { + public static string repeatpl_cmd { get { - return ResourceManager.GetString("repeatinvoke_text", resourceCulture); + return ResourceManager.GetString("repeatpl_cmd", resourceCulture); } } @@ -5255,18 +5183,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!rpl`. /// - public static string repeatpl_summary { + public static string repeatpl_usage { get { - return ResourceManager.GetString("repeatpl_summary", resourceCulture); + return ResourceManager.GetString("repeatpl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rpeatplaylst rpl. + /// Looks up a localized string similar to reptcursong rcs. /// - public static string repeatpl_text { + public static string reptcursong_cmd { get { - return ResourceManager.GetString("repeatpl_text", resourceCulture); + return ResourceManager.GetString("reptcursong_cmd", resourceCulture); } } @@ -5282,23 +5210,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!rcs`. /// - public static string reptcursong_summary { + public static string reptcursong_usage { get { - return ResourceManager.GetString("reptcursong_summary", resourceCulture); + return ResourceManager.GetString("reptcursong_usage", resourceCulture); } } /// - /// Looks up a localized string similar to reptcursong rcs. + /// Looks up a localized string similar to restart. /// - public static string reptcursong_text { + public static string restart_cmd { get { - return ResourceManager.GetString("reptcursong_text", resourceCulture); + return ResourceManager.GetString("restart_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Restarts the bot. Might not work. **Bot Owner Only**. + /// Looks up a localized string similar to Restarts the bot. Might not work.. /// public static string restart_desc { get { @@ -5309,18 +5237,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.restart`. /// - public static string restart_summary { + public static string restart_usage { get { - return ResourceManager.GetString("restart_summary", resourceCulture); + return ResourceManager.GetString("restart_usage", resourceCulture); } } /// - /// Looks up a localized string similar to restart. + /// Looks up a localized string similar to revav. /// - public static string restart_text { + public static string revav_cmd { get { - return ResourceManager.GetString("restart_text", resourceCulture); + return ResourceManager.GetString("revav_cmd", resourceCulture); } } @@ -5336,18 +5264,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~revav "@SomeGuy"`. /// - public static string revav_summary { + public static string revav_usage { get { - return ResourceManager.GetString("revav_summary", resourceCulture); + return ResourceManager.GetString("revav_usage", resourceCulture); } } /// - /// Looks up a localized string similar to revav. + /// Looks up a localized string similar to revimg. /// - public static string revav_text { + public static string revimg_cmd { get { - return ResourceManager.GetString("revav_text", resourceCulture); + return ResourceManager.GetString("revimg_cmd", resourceCulture); } } @@ -5363,18 +5291,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~revimg Image link`. /// - public static string revimg_summary { + public static string revimg_usage { get { - return ResourceManager.GetString("revimg_summary", resourceCulture); + return ResourceManager.GetString("revimg_usage", resourceCulture); } } /// - /// Looks up a localized string similar to revimg. + /// Looks up a localized string similar to rip. /// - public static string revimg_text { + public static string rip_cmd { get { - return ResourceManager.GetString("revimg_text", resourceCulture); + return ResourceManager.GetString("rip_cmd", resourceCulture); } } @@ -5390,45 +5318,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `@NadekoBot rip @Someone 2000`. /// - public static string rip_summary { + public static string rip_usage { get { - return ResourceManager.GetString("rip_summary", resourceCulture); + return ResourceManager.GetString("rip_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rip. + /// Looks up a localized string similar to rolecmd rc. /// - public static string rip_text { + public static string rolecmd_cmd { get { - return ResourceManager.GetString("rip_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Removes the word from the list of filtered words. - /// - public static string rmvfilterword_desc { - get { - return ResourceManager.GetString("rmvfilterword_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;rw poop`. - /// - public static string rmvfilterword_summary { - get { - return ResourceManager.GetString("rmvfilterword_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to rmvfilterword rw. - /// - public static string rmvfilterword_text { - get { - return ResourceManager.GetString("rmvfilterword_text", resourceCulture); + return ResourceManager.GetString("rolecmd_cmd", resourceCulture); } } @@ -5444,23 +5345,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;rc "command name" disable MyRole`. /// - public static string rolecmd_summary { + public static string rolecmd_usage { get { - return ResourceManager.GetString("rolecmd_summary", resourceCulture); + return ResourceManager.GetString("rolecmd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rolecmd rc. + /// Looks up a localized string similar to rolecolor rc. /// - public static string rolecmd_text { + public static string rolecolor_cmd { get { - return ResourceManager.GetString("rolecmd_text", resourceCulture); + return ResourceManager.GetString("rolecolor_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Set a role's color to the hex or 0-255 rgb color value provided. **Needs Manage Roles Permissions.**. + /// Looks up a localized string similar to Set a role's color to the hex or 0-255 rgb color value provided. . /// public static string rolecolor_desc { get { @@ -5471,18 +5372,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.rc Admin 255 200 100` or `.rc Admin ffba55`. /// - public static string rolecolor_summary { + public static string rolecolor_usage { get { - return ResourceManager.GetString("rolecolor_summary", resourceCulture); + return ResourceManager.GetString("rolecolor_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rolecolor rc. + /// Looks up a localized string similar to rolemdl rm. /// - public static string rolecolor_text { + public static string rolemdl_cmd { get { - return ResourceManager.GetString("rolecolor_text", resourceCulture); + return ResourceManager.GetString("rolemdl_cmd", resourceCulture); } } @@ -5498,18 +5399,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;rm "module name" enable MyRole`. /// - public static string rolemdl_summary { + public static string rolemdl_usage { get { - return ResourceManager.GetString("rolemdl_summary", resourceCulture); + return ResourceManager.GetString("rolemdl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rolemdl rm. + /// Looks up a localized string similar to roleperms rp. /// - public static string rolemdl_text { + public static string roleperms_cmd { get { - return ResourceManager.GetString("rolemdl_text", resourceCulture); + return ResourceManager.GetString("roleperms_cmd", resourceCulture); } } @@ -5525,18 +5426,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;rp AwesomeRole`. /// - public static string roleperms_summary { + public static string roleperms_usage { get { - return ResourceManager.GetString("roleperms_summary", resourceCulture); + return ResourceManager.GetString("roleperms_usage", resourceCulture); } } /// - /// Looks up a localized string similar to roleperms rp. + /// Looks up a localized string similar to rolepermscopy rpc. /// - public static string roleperms_text { + public static string rolepermscopy_cmd { get { - return ResourceManager.GetString("roleperms_text", resourceCulture); + return ResourceManager.GetString("rolepermscopy_cmd", resourceCulture); } } @@ -5552,18 +5453,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;rpc Some Role ~ Some other role`. /// - public static string rolepermscopy_summary { + public static string rolepermscopy_usage { get { - return ResourceManager.GetString("rolepermscopy_summary", resourceCulture); + return ResourceManager.GetString("rolepermscopy_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rolepermscopy rpc. + /// Looks up a localized string similar to roles. /// - public static string rolepermscopy_text { + public static string roles_cmd { get { - return ResourceManager.GetString("rolepermscopy_text", resourceCulture); + return ResourceManager.GetString("roles_cmd", resourceCulture); } } @@ -5579,18 +5480,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.roles`. /// - public static string roles_summary { + public static string roles_usage { get { - return ResourceManager.GetString("roles_summary", resourceCulture); + return ResourceManager.GetString("roles_usage", resourceCulture); } } /// - /// Looks up a localized string similar to roles. + /// Looks up a localized string similar to roll. /// - public static string roles_text { + public static string roll_cmd { get { - return ResourceManager.GetString("roles_text", resourceCulture); + return ResourceManager.GetString("roll_cmd", resourceCulture); } } @@ -5606,18 +5507,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$roll` or `$roll 7` or `$roll 3d5`. /// - public static string roll_summary { + public static string roll_usage { get { - return ResourceManager.GetString("roll_summary", resourceCulture); + return ResourceManager.GetString("roll_usage", resourceCulture); } } /// - /// Looks up a localized string similar to roll. + /// Looks up a localized string similar to rolluo. /// - public static string roll_text { + public static string rolluo_cmd { get { - return ResourceManager.GetString("roll_text", resourceCulture); + return ResourceManager.GetString("rolluo_cmd", resourceCulture); } } @@ -5633,23 +5534,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$rolluo` or `$rolluo 7` or `$rolluo 3d5`. /// - public static string rolluo_summary { + public static string rolluo_usage { get { - return ResourceManager.GetString("rolluo_summary", resourceCulture); + return ResourceManager.GetString("rolluo_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rolluo. + /// Looks up a localized string similar to rotateplaying ropl. /// - public static string rolluo_text { + public static string rotateplaying_cmd { get { - return ResourceManager.GetString("rolluo_text", resourceCulture); + return ResourceManager.GetString("rotateplaying_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles rotation of playing status of the dynamic strings you specified earlier. **Bot Owner Only!**. + /// Looks up a localized string similar to Toggles rotation of playing status of the dynamic strings you specified earlier.. /// public static string rotateplaying_desc { get { @@ -5660,18 +5561,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.ropl`. /// - public static string rotateplaying_summary { + public static string rotateplaying_usage { get { - return ResourceManager.GetString("rotateplaying_summary", resourceCulture); + return ResourceManager.GetString("rotateplaying_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rotateplaying ropl. + /// Looks up a localized string similar to rps. /// - public static string rotateplaying_text { + public static string rps_cmd { get { - return ResourceManager.GetString("rotateplaying_text", resourceCulture); + return ResourceManager.GetString("rps_cmd", resourceCulture); } } @@ -5687,18 +5588,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>rps scissors`. /// - public static string rps_summary { + public static string rps_usage { get { - return ResourceManager.GetString("rps_summary", resourceCulture); + return ResourceManager.GetString("rps_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rps. + /// Looks up a localized string similar to rsar. /// - public static string rps_text { + public static string rsar_cmd { get { - return ResourceManager.GetString("rps_text", resourceCulture); + return ResourceManager.GetString("rsar_cmd", resourceCulture); } } @@ -5714,18 +5615,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.rsar`. /// - public static string rsar_summary { + public static string rsar_usage { get { - return ResourceManager.GetString("rsar_summary", resourceCulture); + return ResourceManager.GetString("rsar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rsar. + /// Looks up a localized string similar to rule34. /// - public static string rsar_text { + public static string rule34_cmd { get { - return ResourceManager.GetString("rsar_text", resourceCulture); + return ResourceManager.GetString("rule34_cmd", resourceCulture); } } @@ -5741,18 +5642,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~rule34 yuri+kissing`. /// - public static string rule34_summary { + public static string rule34_usage { get { - return ResourceManager.GetString("rule34_summary", resourceCulture); + return ResourceManager.GetString("rule34_usage", resourceCulture); } } /// - /// Looks up a localized string similar to rule34. + /// Looks up a localized string similar to safebooru. /// - public static string rule34_text { + public static string safebooru_cmd { get { - return ResourceManager.GetString("rule34_text", resourceCulture); + return ResourceManager.GetString("safebooru_cmd", resourceCulture); } } @@ -5768,18 +5669,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~safebooru yuri+kissing`. /// - public static string safebooru_summary { + public static string safebooru_usage { get { - return ResourceManager.GetString("safebooru_summary", resourceCulture); + return ResourceManager.GetString("safebooru_usage", resourceCulture); } } /// - /// Looks up a localized string similar to safebooru. + /// Looks up a localized string similar to save. /// - public static string safebooru_text { + public static string save_cmd { get { - return ResourceManager.GetString("safebooru_text", resourceCulture); + return ResourceManager.GetString("save_cmd", resourceCulture); } } @@ -5795,23 +5696,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!save classical1`. /// - public static string save_summary { + public static string save_usage { get { - return ResourceManager.GetString("save_summary", resourceCulture); + return ResourceManager.GetString("save_usage", resourceCulture); } } /// - /// Looks up a localized string similar to save. + /// Looks up a localized string similar to savechat. /// - public static string save_text { + public static string savechat_cmd { get { - return ResourceManager.GetString("save_text", resourceCulture); + return ResourceManager.GetString("savechat_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Saves a number of messages to a text file and sends it to you. **Bot Owner Only**. + /// Looks up a localized string similar to Saves a number of messages to a text file and sends it to you.. /// public static string savechat_desc { get { @@ -5822,50 +5723,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.savechat 150`. /// - public static string savechat_summary { + public static string savechat_usage { get { - return ResourceManager.GetString("savechat_summary", resourceCulture); + return ResourceManager.GetString("savechat_usage", resourceCulture); } } /// - /// Looks up a localized string similar to savechat. + /// Looks up a localized string similar to scsc. /// - public static string savechat_text { + public static string scsc_cmd { get { - return ResourceManager.GetString("savechat_text", resourceCulture); + return ResourceManager.GetString("scsc_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Blacklists a server by a name or id (#general for example). **BOT OWNER ONLY**. - /// - public static string sbl_desc { - get { - return ResourceManager.GetString("sbl_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;sbl [servername/serverid]`. - /// - public static string sbl_summary { - get { - return ResourceManager.GetString("sbl_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to sbl. - /// - public static string sbl_text { - get { - return ResourceManager.GetString("sbl_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance. **Bot Owner Only.**. + /// Looks up a localized string similar to Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance.. /// public static string scsc_desc { get { @@ -5876,23 +5750,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.scsc`. /// - public static string scsc_summary { + public static string scsc_usage { get { - return ResourceManager.GetString("scsc_summary", resourceCulture); + return ResourceManager.GetString("scsc_usage", resourceCulture); } } /// - /// Looks up a localized string similar to scsc. + /// Looks up a localized string similar to send. /// - public static string scsc_text { + public static string send_cmd { get { - return ResourceManager.GetString("scsc_text", resourceCulture); + return ResourceManager.GetString("send_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Send a message to someone on a different server through the bot. **Bot Owner Only!**. + /// Looks up a localized string similar to Sends a message to someone on a different server through the bot. Separate server and channel/user ids with | and prepend channel id with `c:` and user id with `u:`.. /// public static string send_desc { get { @@ -5901,20 +5775,47 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `.send sid. + /// Looks up a localized string similar to `.send serverid|c:channelid` or `.send serverid|u:userid`. /// - public static string send_summary { + public static string send_usage { get { - return ResourceManager.GetString("send_summary", resourceCulture); + return ResourceManager.GetString("send_usage", resourceCulture); } } /// - /// Looks up a localized string similar to send. + /// Looks up a localized string similar to sbl. /// - public static string send_text { + public static string serverblacklist_cmd { get { - return ResourceManager.GetString("send_text", resourceCulture); + return ResourceManager.GetString("serverblacklist_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist.. + /// + public static string serverblacklist_desc { + get { + return ResourceManager.GetString("serverblacklist_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;sbl add 12312321312` or `;sbl rem SomeTrashServer`. + /// + public static string serverblacklist_usage { + get { + return ResourceManager.GetString("serverblacklist_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to serverid sid. + /// + public static string serverid_cmd { + get { + return ResourceManager.GetString("serverid_cmd", resourceCulture); } } @@ -5930,18 +5831,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.sid`. /// - public static string serverid_summary { + public static string serverid_usage { get { - return ResourceManager.GetString("serverid_summary", resourceCulture); + return ResourceManager.GetString("serverid_usage", resourceCulture); } } /// - /// Looks up a localized string similar to serverid sid. + /// Looks up a localized string similar to serverinfo sinfo. /// - public static string serverid_text { + public static string serverinfo_cmd { get { - return ResourceManager.GetString("serverid_text", resourceCulture); + return ResourceManager.GetString("serverinfo_cmd", resourceCulture); } } @@ -5957,23 +5858,50 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.sinfo Some Server`. /// - public static string serverinfo_summary { + public static string serverinfo_usage { get { - return ResourceManager.GetString("serverinfo_summary", resourceCulture); + return ResourceManager.GetString("serverinfo_usage", resourceCulture); } } /// - /// Looks up a localized string similar to serverinfo sinfo. + /// Looks up a localized string similar to setavatar setav. /// - public static string serverinfo_text { + public static string setavatar_cmd { get { - return ResourceManager.GetString("serverinfo_text", resourceCulture); + return ResourceManager.GetString("setavatar_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Changed the name of the current channel. **Needs Manage Channel Permissions.**. + /// Looks up a localized string similar to Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. . + /// + public static string setavatar_desc { + get { + return ResourceManager.GetString("setavatar_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `.setav http://i.imgur.com/xTG3a1I.jpg`. + /// + public static string setavatar_usage { + get { + return ResourceManager.GetString("setavatar_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to setchanlname schn. + /// + public static string setchanlname_cmd { + get { + return ResourceManager.GetString("setchanlname_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Changed the name of the current channel. . /// public static string setchanlname_desc { get { @@ -5984,23 +5912,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.schn NewName`. /// - public static string setchanlname_summary { + public static string setchanlname_usage { get { - return ResourceManager.GetString("setchanlname_summary", resourceCulture); + return ResourceManager.GetString("setchanlname_usage", resourceCulture); } } /// - /// Looks up a localized string similar to setchanlname schn. + /// Looks up a localized string similar to setgame. /// - public static string setchanlname_text { + public static string setgame_cmd { get { - return ResourceManager.GetString("setchanlname_text", resourceCulture); + return ResourceManager.GetString("setgame_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets the bots game. **Bot Owner Only!**. + /// Looks up a localized string similar to Sets the bots game. . /// public static string setgame_desc { get { @@ -6011,18 +5939,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.setgame Playing with kwoth`. /// - public static string setgame_summary { + public static string setgame_usage { get { - return ResourceManager.GetString("setgame_summary", resourceCulture); + return ResourceManager.GetString("setgame_usage", resourceCulture); } } /// - /// Looks up a localized string similar to setgame. + /// Looks up a localized string similar to setmaxqueue smq. /// - public static string setgame_text { + public static string setmaxqueue_cmd { get { - return ResourceManager.GetString("setgame_text", resourceCulture); + return ResourceManager.GetString("setmaxqueue_cmd", resourceCulture); } } @@ -6038,23 +5966,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!smq 50` or `!!smq`. /// - public static string setmaxqueue_summary { + public static string setmaxqueue_usage { get { - return ResourceManager.GetString("setmaxqueue_summary", resourceCulture); + return ResourceManager.GetString("setmaxqueue_usage", resourceCulture); } } /// - /// Looks up a localized string similar to setmaxqueue smq. + /// Looks up a localized string similar to setname newnm. /// - public static string setmaxqueue_text { + public static string setname_cmd { get { - return ResourceManager.GetString("setmaxqueue_text", resourceCulture); + return ResourceManager.GetString("setname_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Give the bot a new name. **Bot Owner Only!**. + /// Looks up a localized string similar to Give the bot a new name. . /// public static string setname_desc { get { @@ -6065,23 +5993,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.newnm BotName`. /// - public static string setname_summary { + public static string setname_usage { get { - return ResourceManager.GetString("setname_summary", resourceCulture); + return ResourceManager.GetString("setname_usage", resourceCulture); } } /// - /// Looks up a localized string similar to setname newnm. + /// Looks up a localized string similar to setrole sr. /// - public static string setname_text { + public static string setrole_cmd { get { - return ResourceManager.GetString("setname_text", resourceCulture); + return ResourceManager.GetString("setrole_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets a role for a given user. **Needs Manage Roles Permissions.**. + /// Looks up a localized string similar to Sets a role for a given user. . /// public static string setrole_desc { get { @@ -6092,23 +6020,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.sr @User Guest`. /// - public static string setrole_summary { + public static string setrole_usage { get { - return ResourceManager.GetString("setrole_summary", resourceCulture); + return ResourceManager.GetString("setrole_usage", resourceCulture); } } /// - /// Looks up a localized string similar to setrole sr. + /// Looks up a localized string similar to settopic st. /// - public static string setrole_text { + public static string settopic_cmd { get { - return ResourceManager.GetString("setrole_text", resourceCulture); + return ResourceManager.GetString("settopic_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Sets a topic on the current channel. **Needs Manage Channel Permissions.**. + /// Looks up a localized string similar to Sets a topic on the current channel. . /// public static string settopic_desc { get { @@ -6119,18 +6047,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.st My new topic`. /// - public static string settopic_summary { + public static string settopic_usage { get { - return ResourceManager.GetString("settopic_summary", resourceCulture); + return ResourceManager.GetString("settopic_usage", resourceCulture); } } /// - /// Looks up a localized string similar to settopic st. + /// Looks up a localized string similar to settype. /// - public static string settopic_text { + public static string settype_cmd { get { - return ResourceManager.GetString("settopic_text", resourceCulture); + return ResourceManager.GetString("settype_cmd", resourceCulture); } } @@ -6146,18 +6074,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>settype fire`. /// - public static string settype_summary { + public static string settype_usage { get { - return ResourceManager.GetString("settype_summary", resourceCulture); + return ResourceManager.GetString("settype_usage", resourceCulture); } } /// - /// Looks up a localized string similar to settype. + /// Looks up a localized string similar to showcustreact scr. /// - public static string settype_text { + public static string showcustreact_cmd { get { - return ResourceManager.GetString("settype_text", resourceCulture); + return ResourceManager.GetString("showcustreact_cmd", resourceCulture); } } @@ -6173,18 +6101,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.scr %mention% bb`. /// - public static string showcustreact_summary { + public static string showcustreact_usage { get { - return ResourceManager.GetString("showcustreact_summary", resourceCulture); + return ResourceManager.GetString("showcustreact_usage", resourceCulture); } } /// - /// Looks up a localized string similar to showcustreact scr. + /// Looks up a localized string similar to showemojis se. /// - public static string showcustreact_text { + public static string showemojis_cmd { get { - return ResourceManager.GetString("showcustreact_text", resourceCulture); + return ResourceManager.GetString("showemojis_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shows a name and a link to every SPECIAL emoji in the message.. + /// + public static string showemojis_desc { + get { + return ResourceManager.GetString("showemojis_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `.se A message full of SPECIALemojis`. + /// + public static string showemojis_usage { + get { + return ResourceManager.GetString("showemojis_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ... + /// + public static string showquote_cmd { + get { + return ResourceManager.GetString("showquote_cmd", resourceCulture); } } @@ -6200,50 +6155,77 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `... abc`. /// - public static string showquote_summary { + public static string showquote_usage { get { - return ResourceManager.GetString("showquote_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ... - /// - public static string showquote_text { - get { - return ResourceManager.GetString("showquote_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Shuffles the current playlist.. - /// - public static string shuffle_desc { - get { - return ResourceManager.GetString("shuffle_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `!!sh`. - /// - public static string shuffle_summary { - get { - return ResourceManager.GetString("shuffle_summary", resourceCulture); + return ResourceManager.GetString("showquote_usage", resourceCulture); } } /// /// Looks up a localized string similar to shuffle sh. /// - public static string shuffle_text { + public static string shuffledeck_cmd { get { - return ResourceManager.GetString("shuffle_text", resourceCulture); + return ResourceManager.GetString("shuffledeck_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. **Needs Manage Messages Permissions.**. + /// Looks up a localized string similar to Reshuffles all cards back into the deck.. + /// + public static string shuffledeck_desc { + get { + return ResourceManager.GetString("shuffledeck_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `$sh`. + /// + public static string shuffledeck_usage { + get { + return ResourceManager.GetString("shuffledeck_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to shuffle sh. + /// + public static string shuffleplaylist_cmd { + get { + return ResourceManager.GetString("shuffleplaylist_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shuffles the current playlist.. + /// + public static string shuffleplaylist_desc { + get { + return ResourceManager.GetString("shuffleplaylist_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `!!sh`. + /// + public static string shuffleplaylist_usage { + get { + return ResourceManager.GetString("shuffleplaylist_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to slowmode. + /// + public static string slowmode_cmd { + get { + return ResourceManager.GetString("slowmode_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. . /// public static string slowmode_desc { get { @@ -6254,23 +6236,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.slowmode`. /// - public static string slowmode_summary { + public static string slowmode_usage { get { - return ResourceManager.GetString("slowmode_summary", resourceCulture); + return ResourceManager.GetString("slowmode_usage", resourceCulture); } } /// - /// Looks up a localized string similar to slowmode. + /// Looks up a localized string similar to softban sb. /// - public static string slowmode_text { + public static string softban_cmd { get { - return ResourceManager.GetString("slowmode_text", resourceCulture); + return ResourceManager.GetString("softban_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Bans and then unbans a user by id or name with an optional message. **Needs Ban Permissions.**. + /// Looks up a localized string similar to Bans and then unbans a user by id or name with an optional message. . /// public static string softban_desc { get { @@ -6281,18 +6263,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.sb "@some Guy" Your behaviour is toxic.`. /// - public static string softban_summary { + public static string softban_usage { get { - return ResourceManager.GetString("softban_summary", resourceCulture); + return ResourceManager.GetString("softban_usage", resourceCulture); } } /// - /// Looks up a localized string similar to softban sb. + /// Looks up a localized string similar to soundcloudpl scpl. /// - public static string softban_text { + public static string soundcloudpl_cmd { get { - return ResourceManager.GetString("softban_text", resourceCulture); + return ResourceManager.GetString("soundcloudpl_cmd", resourceCulture); } } @@ -6308,18 +6290,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!scpl soundcloudseturl`. /// - public static string soundcloudpl_summary { + public static string soundcloudpl_usage { get { - return ResourceManager.GetString("soundcloudpl_summary", resourceCulture); + return ResourceManager.GetString("soundcloudpl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to soundcloudpl scpl. + /// Looks up a localized string similar to soundcloudqueue sq. /// - public static string soundcloudpl_text { + public static string soundcloudqueue_cmd { get { - return ResourceManager.GetString("soundcloudpl_text", resourceCulture); + return ResourceManager.GetString("soundcloudqueue_cmd", resourceCulture); } } @@ -6335,23 +6317,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!sq Dream Of Venice`. /// - public static string soundcloudqueue_summary { + public static string soundcloudqueue_usage { get { - return ResourceManager.GetString("soundcloudqueue_summary", resourceCulture); + return ResourceManager.GetString("soundcloudqueue_usage", resourceCulture); } } /// - /// Looks up a localized string similar to soundcloudqueue sq. + /// Looks up a localized string similar to spmom. /// - public static string soundcloudqueue_text { + public static string spmom_cmd { get { - return ResourceManager.GetString("soundcloudqueue_text", resourceCulture); + return ResourceManager.GetString("spmom_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles whether mentions of other offline users on your server will send a pm to them. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Toggles whether mentions of other offline users on your server will send a pm to them. . /// public static string spmom_desc { get { @@ -6362,18 +6344,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.spmom`. /// - public static string spmom_summary { + public static string spmom_usage { get { - return ResourceManager.GetString("spmom_summary", resourceCulture); + return ResourceManager.GetString("spmom_usage", resourceCulture); } } /// - /// Looks up a localized string similar to spmom. + /// Looks up a localized string similar to srvrcmd sc. /// - public static string spmom_text { + public static string srvrcmd_cmd { get { - return ResourceManager.GetString("spmom_text", resourceCulture); + return ResourceManager.GetString("srvrcmd_cmd", resourceCulture); } } @@ -6389,23 +6371,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;sc "command name" disable`. /// - public static string srvrcmd_summary { + public static string srvrcmd_usage { get { - return ResourceManager.GetString("srvrcmd_summary", resourceCulture); + return ResourceManager.GetString("srvrcmd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to srvrcmd sc. + /// Looks up a localized string similar to srvrfilterinv sfi. /// - public static string srvrcmd_text { + public static string srvrfilterinv_cmd { get { - return ResourceManager.GetString("srvrcmd_text", resourceCulture); + return ResourceManager.GetString("srvrfilterinv_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Enables or disables automatic deleting of invites on the server.. + /// Looks up a localized string similar to Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner.. /// public static string srvrfilterinv_desc { get { @@ -6414,25 +6396,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `;sfi disable`. + /// Looks up a localized string similar to `;sfi`. /// - public static string srvrfilterinv_summary { + public static string srvrfilterinv_usage { get { - return ResourceManager.GetString("srvrfilterinv_summary", resourceCulture); + return ResourceManager.GetString("srvrfilterinv_usage", resourceCulture); } } /// - /// Looks up a localized string similar to srvrfilterinv sfi. + /// Looks up a localized string similar to srvrfilterwords sfw. /// - public static string srvrfilterinv_text { + public static string srvrfilterwords_cmd { get { - return ResourceManager.GetString("srvrfilterinv_text", resourceCulture); + return ResourceManager.GetString("srvrfilterwords_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Enables or disables automatic deleting of messages containing forbidden words on the server.. + /// Looks up a localized string similar to Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner.. /// public static string srvrfilterwords_desc { get { @@ -6441,20 +6423,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `;sfw disable`. + /// Looks up a localized string similar to `;sfw`. /// - public static string srvrfilterwords_summary { + public static string srvrfilterwords_usage { get { - return ResourceManager.GetString("srvrfilterwords_summary", resourceCulture); + return ResourceManager.GetString("srvrfilterwords_usage", resourceCulture); } } /// - /// Looks up a localized string similar to srvrfilterwords sfw. + /// Looks up a localized string similar to srvrmdl sm. /// - public static string srvrfilterwords_text { + public static string srvrmdl_cmd { get { - return ResourceManager.GetString("srvrfilterwords_text", resourceCulture); + return ResourceManager.GetString("srvrmdl_cmd", resourceCulture); } } @@ -6470,18 +6452,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;sm "module name" enable`. /// - public static string srvrmdl_summary { + public static string srvrmdl_usage { get { - return ResourceManager.GetString("srvrmdl_summary", resourceCulture); + return ResourceManager.GetString("srvrmdl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to srvrmdl sm. + /// Looks up a localized string similar to srvrperms sp. /// - public static string srvrmdl_text { + public static string srvrperms_cmd { get { - return ResourceManager.GetString("srvrmdl_text", resourceCulture); + return ResourceManager.GetString("srvrperms_cmd", resourceCulture); } } @@ -6497,18 +6479,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;sp`. /// - public static string srvrperms_summary { + public static string srvrperms_usage { get { - return ResourceManager.GetString("srvrperms_summary", resourceCulture); + return ResourceManager.GetString("srvrperms_usage", resourceCulture); } } /// - /// Looks up a localized string similar to srvrperms sp. + /// Looks up a localized string similar to startwar sw. /// - public static string srvrperms_text { + public static string startwar_cmd { get { - return ResourceManager.GetString("srvrperms_text", resourceCulture); + return ResourceManager.GetString("startwar_cmd", resourceCulture); } } @@ -6524,18 +6506,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `,sw 15`. /// - public static string startwar_summary { + public static string startwar_usage { get { - return ResourceManager.GetString("startwar_summary", resourceCulture); + return ResourceManager.GetString("startwar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to startwar sw. + /// Looks up a localized string similar to stats. /// - public static string startwar_text { + public static string stats_cmd { get { - return ResourceManager.GetString("startwar_text", resourceCulture); + return ResourceManager.GetString("stats_cmd", resourceCulture); } } @@ -6551,18 +6533,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.stats`. /// - public static string stats_summary { + public static string stats_usage { get { - return ResourceManager.GetString("stats_summary", resourceCulture); + return ResourceManager.GetString("stats_usage", resourceCulture); } } /// - /// Looks up a localized string similar to stats. + /// Looks up a localized string similar to stop s. /// - public static string stats_text { + public static string stop_cmd { get { - return ResourceManager.GetString("stats_text", resourceCulture); + return ResourceManager.GetString("stop_cmd", resourceCulture); } } @@ -6578,50 +6560,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!s`. /// - public static string stop_summary { + public static string stop_usage { get { - return ResourceManager.GetString("stop_summary", resourceCulture); + return ResourceManager.GetString("stop_usage", resourceCulture); } } /// - /// Looks up a localized string similar to stop s. + /// Looks up a localized string similar to take. /// - public static string stop_text { + public static string take_cmd { get { - return ResourceManager.GetString("stop_text", resourceCulture); + return ResourceManager.GetString("take_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question.. - /// - public static string t_desc { - get { - return ResourceManager.GetString("t_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `>t nohint` or `>t 5 nohint`. - /// - public static string t_summary { - get { - return ResourceManager.GetString("t_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to trivia t. - /// - public static string t_text { - get { - return ResourceManager.GetString("t_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Takes a certain amount of flowers from someone. **Bot Owner Only!**. + /// Looks up a localized string similar to Takes a certain amount of flowers from someone. . /// public static string take_desc { get { @@ -6632,23 +6587,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `$take 1 "@someguy"`. /// - public static string take_summary { + public static string take_usage { get { - return ResourceManager.GetString("take_summary", resourceCulture); + return ResourceManager.GetString("take_usage", resourceCulture); } } /// - /// Looks up a localized string similar to take. + /// Looks up a localized string similar to togglexclsar tesar. /// - public static string take_text { + public static string tesar_cmd { get { - return ResourceManager.GetString("take_text", resourceCulture); + return ResourceManager.GetString("tesar_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to toggle whether the self-assigned roles should be exclusive. + /// Looks up a localized string similar to Toggles whether the self-assigned roles are exclusive. (So that any person can have only one of the self assignable roles). /// public static string tesar_desc { get { @@ -6659,18 +6614,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.tesar`. /// - public static string tesar_summary { + public static string tesar_usage { get { - return ResourceManager.GetString("tesar_summary", resourceCulture); + return ResourceManager.GetString("tesar_usage", resourceCulture); } } /// - /// Looks up a localized string similar to togglexclsar tesar. + /// Looks up a localized string similar to tl. /// - public static string tesar_text { + public static string tl_cmd { get { - return ResourceManager.GetString("tesar_text", resourceCulture); + return ResourceManager.GetString("tl_cmd", resourceCulture); } } @@ -6686,18 +6641,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>tl`. /// - public static string tl_summary { + public static string tl_usage { get { - return ResourceManager.GetString("tl_summary", resourceCulture); + return ResourceManager.GetString("tl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to tl. + /// Looks up a localized string similar to tq. /// - public static string tl_text { + public static string tq_cmd { get { - return ResourceManager.GetString("tl_text", resourceCulture); + return ResourceManager.GetString("tq_cmd", resourceCulture); } } @@ -6713,23 +6668,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>tq`. /// - public static string tq_summary { + public static string tq_usage { get { - return ResourceManager.GetString("tq_summary", resourceCulture); + return ResourceManager.GetString("tq_usage", resourceCulture); } } /// - /// Looks up a localized string similar to tq. + /// Looks up a localized string similar to translangs. /// - public static string tq_text { + public static string translangs_cmd { get { - return ResourceManager.GetString("tq_text", resourceCulture); + return ResourceManager.GetString("translangs_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to List the valid languages for translation.. + /// Looks up a localized string similar to Lists the valid languages for translation.. /// public static string translangs_desc { get { @@ -6738,25 +6693,25 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `~translangs` or `~translangs language`. + /// Looks up a localized string similar to `~translangs`. /// - public static string translangs_summary { + public static string translangs_usage { get { - return ResourceManager.GetString("translangs_summary", resourceCulture); + return ResourceManager.GetString("translangs_usage", resourceCulture); } } /// - /// Looks up a localized string similar to translangs. + /// Looks up a localized string similar to translate trans. /// - public static string translangs_text { + public static string translate_cmd { get { - return ResourceManager.GetString("translangs_text", resourceCulture); + return ResourceManager.GetString("translate_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Translates from>to text. From the given language to the destiation language.. + /// Looks up a localized string similar to Translates from>to text. From the given language to the destination language.. /// public static string translate_desc { get { @@ -6767,18 +6722,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~trans en>fr Hello`. /// - public static string translate_summary { + public static string translate_usage { get { - return ResourceManager.GetString("translate_summary", resourceCulture); + return ResourceManager.GetString("translate_usage", resourceCulture); } } /// - /// Looks up a localized string similar to translate trans. + /// Looks up a localized string similar to trivia t. /// - public static string translate_text { + public static string trivia_cmd { get { - return ResourceManager.GetString("translate_text", resourceCulture); + return ResourceManager.GetString("trivia_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question.. + /// + public static string trivia_desc { + get { + return ResourceManager.GetString("trivia_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `>t nohint` or `>t 5 nohint`. + /// + public static string trivia_usage { + get { + return ResourceManager.GetString("trivia_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to twitch tw. + /// + public static string twitch_cmd { + get { + return ResourceManager.GetString("twitch_cmd", resourceCulture); } } @@ -6794,18 +6776,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~twitch SomeStreamer`. /// - public static string twitch_summary { + public static string twitch_usage { get { - return ResourceManager.GetString("twitch_summary", resourceCulture); + return ResourceManager.GetString("twitch_usage", resourceCulture); } } /// - /// Looks up a localized string similar to twitch tw. + /// Looks up a localized string similar to type. /// - public static string twitch_text { + public static string type_cmd { get { - return ResourceManager.GetString("twitch_text", resourceCulture); + return ResourceManager.GetString("type_cmd", resourceCulture); } } @@ -6821,23 +6803,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>type @someone`. /// - public static string type_summary { + public static string type_usage { get { - return ResourceManager.GetString("type_summary", resourceCulture); + return ResourceManager.GetString("type_usage", resourceCulture); } } /// - /// Looks up a localized string similar to type. + /// Looks up a localized string similar to typeadd. /// - public static string type_text { + public static string typeadd_cmd { get { - return ResourceManager.GetString("type_text", resourceCulture); + return ResourceManager.GetString("typeadd_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Adds a new article to the typing contest. Owner only.. + /// Looks up a localized string similar to Adds a new article to the typing contest.. /// public static string typeadd_desc { get { @@ -6848,18 +6830,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>typeadd wordswords`. /// - public static string typeadd_summary { + public static string typeadd_usage { get { - return ResourceManager.GetString("typeadd_summary", resourceCulture); + return ResourceManager.GetString("typeadd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to typeadd. + /// Looks up a localized string similar to typestart. /// - public static string typeadd_text { + public static string typestart_cmd { get { - return ResourceManager.GetString("typeadd_text", resourceCulture); + return ResourceManager.GetString("typestart_cmd", resourceCulture); } } @@ -6875,18 +6857,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>typestart`. /// - public static string typestart_summary { + public static string typestart_usage { get { - return ResourceManager.GetString("typestart_summary", resourceCulture); + return ResourceManager.GetString("typestart_usage", resourceCulture); } } /// - /// Looks up a localized string similar to typestart. + /// Looks up a localized string similar to typestop. /// - public static string typestart_text { + public static string typestop_cmd { get { - return ResourceManager.GetString("typestart_text", resourceCulture); + return ResourceManager.GetString("typestop_cmd", resourceCulture); } } @@ -6902,50 +6884,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `>typestop`. /// - public static string typestop_summary { + public static string typestop_usage { get { - return ResourceManager.GetString("typestop_summary", resourceCulture); + return ResourceManager.GetString("typestop_usage", resourceCulture); } } /// - /// Looks up a localized string similar to typestop. + /// Looks up a localized string similar to unbind. /// - public static string typestop_text { + public static string unbind_cmd { get { - return ResourceManager.GetString("typestop_text", resourceCulture); + return ResourceManager.GetString("unbind_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Blacklists a mentioned user. **Bot Owner Only!**. - /// - public static string ubl_desc { - get { - return ResourceManager.GetString("ubl_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;ubl [user_mention]`. - /// - public static string ubl_summary { - get { - return ResourceManager.GetString("ubl_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ubl. - /// - public static string ubl_text { - get { - return ResourceManager.GetString("ubl_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unbinds a bot from the channel and board. **Bot Owner Only!**. + /// Looks up a localized string similar to Unbinds a bot from the channel and board.. /// public static string unbind_desc { get { @@ -6956,18 +6911,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `trello unbind`. /// - public static string unbind_summary { + public static string unbind_usage { get { - return ResourceManager.GetString("unbind_summary", resourceCulture); + return ResourceManager.GetString("unbind_usage", resourceCulture); } } /// - /// Looks up a localized string similar to unbind. + /// Looks up a localized string similar to unclaim ucall uc. /// - public static string unbind_text { + public static string unclaim_cmd { get { - return ResourceManager.GetString("unbind_text", resourceCulture); + return ResourceManager.GetString("unclaim_cmd", resourceCulture); } } @@ -6983,23 +6938,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `,uc [war_number] [optional_other_name]`. /// - public static string unclaim_summary { + public static string unclaim_usage { get { - return ResourceManager.GetString("unclaim_summary", resourceCulture); + return ResourceManager.GetString("unclaim_usage", resourceCulture); } } /// - /// Looks up a localized string similar to unclaim ucall uc. + /// Looks up a localized string similar to undeafen undef. /// - public static string unclaim_text { + public static string undeafen_cmd { get { - return ResourceManager.GetString("unclaim_text", resourceCulture); + return ResourceManager.GetString("undeafen_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Undeafens mentioned user or users. **Needs Deafen Permissions.**. + /// Looks up a localized string similar to Undeafens mentioned user or users. . /// public static string undeafen_desc { get { @@ -7010,23 +6965,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.undef "@Someguy"` or `.undef "@Someguy" "@Someguy"`. /// - public static string undeafen_summary { + public static string undeafen_usage { get { - return ResourceManager.GetString("undeafen_summary", resourceCulture); + return ResourceManager.GetString("undeafen_usage", resourceCulture); } } /// - /// Looks up a localized string similar to undeafen undef. + /// Looks up a localized string similar to unmute. /// - public static string undeafen_text { + public static string unmute_cmd { get { - return ResourceManager.GetString("undeafen_text", resourceCulture); + return ResourceManager.GetString("unmute_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Unmutes mentioned user or users. **Needs Mute Permissions.**. + /// Looks up a localized string similar to Unmutes mentioned user or users. . /// public static string unmute_desc { get { @@ -7037,23 +6992,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.unmute "@Someguy"` or `.unmute "@Someguy" "@Someguy"`. /// - public static string unmute_summary { + public static string unmute_usage { get { - return ResourceManager.GetString("unmute_summary", resourceCulture); + return ResourceManager.GetString("unmute_usage", resourceCulture); } } /// - /// Looks up a localized string similar to unmute. + /// Looks up a localized string similar to unstuck. /// - public static string unmute_text { + public static string unstuck_cmd { get { - return ResourceManager.GetString("unmute_text", resourceCulture); + return ResourceManager.GetString("unstuck_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Clears the message queue. **Bot Owner Only!**. + /// Looks up a localized string similar to Clears the message queue. . /// public static string unstuck_desc { get { @@ -7064,18 +7019,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.unstuck`. /// - public static string unstuck_summary { + public static string unstuck_usage { get { - return ResourceManager.GetString("unstuck_summary", resourceCulture); + return ResourceManager.GetString("unstuck_usage", resourceCulture); } } /// - /// Looks up a localized string similar to unstuck. + /// Looks up a localized string similar to urbandict ud. /// - public static string unstuck_text { + public static string urbandict_cmd { get { - return ResourceManager.GetString("unstuck_text", resourceCulture); + return ResourceManager.GetString("urbandict_cmd", resourceCulture); } } @@ -7091,18 +7046,45 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~ud Pineapple`. /// - public static string urbandict_summary { + public static string urbandict_usage { get { - return ResourceManager.GetString("urbandict_summary", resourceCulture); + return ResourceManager.GetString("urbandict_usage", resourceCulture); } } /// - /// Looks up a localized string similar to urbandict ud. + /// Looks up a localized string similar to ubl. /// - public static string urbandict_text { + public static string userblacklist_cmd { get { - return ResourceManager.GetString("urbandict_text", resourceCulture); + return ResourceManager.GetString("userblacklist_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist.. + /// + public static string userblacklist_desc { + get { + return ResourceManager.GetString("userblacklist_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `;ubl add @SomeUser` or `;ubl rem 12312312313`. + /// + public static string userblacklist_usage { + get { + return ResourceManager.GetString("userblacklist_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to userid uid. + /// + public static string userid_cmd { + get { + return ResourceManager.GetString("userid_cmd", resourceCulture); } } @@ -7118,18 +7100,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.uid` or `.uid "@SomeGuy"`. /// - public static string userid_summary { + public static string userid_usage { get { - return ResourceManager.GetString("userid_summary", resourceCulture); + return ResourceManager.GetString("userid_usage", resourceCulture); } } /// - /// Looks up a localized string similar to userid uid. + /// Looks up a localized string similar to userinfo uinfo. /// - public static string userid_text { + public static string userinfo_cmd { get { - return ResourceManager.GetString("userid_text", resourceCulture); + return ResourceManager.GetString("userinfo_cmd", resourceCulture); } } @@ -7145,18 +7127,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.uinfo @SomeUser`. /// - public static string userinfo_summary { + public static string userinfo_usage { get { - return ResourceManager.GetString("userinfo_summary", resourceCulture); + return ResourceManager.GetString("userinfo_usage", resourceCulture); } } /// - /// Looks up a localized string similar to userinfo uinfo. + /// Looks up a localized string similar to userperms up. /// - public static string userinfo_text { + public static string userperms_cmd { get { - return ResourceManager.GetString("userinfo_text", resourceCulture); + return ResourceManager.GetString("userperms_cmd", resourceCulture); } } @@ -7172,23 +7154,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;up Kwoth`. /// - public static string userperms_summary { + public static string userperms_usage { get { - return ResourceManager.GetString("userperms_summary", resourceCulture); + return ResourceManager.GetString("userperms_usage", resourceCulture); } } /// - /// Looks up a localized string similar to userperms up. + /// Looks up a localized string similar to userpresence. /// - public static string userperms_text { + public static string userpresence_cmd { get { - return ResourceManager.GetString("userperms_text", resourceCulture); + return ResourceManager.GetString("userpresence_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Starts logging to this channel when someone from the server goes online/offline/idle. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Starts logging to this channel when someone from the server goes online/offline/idle. . /// public static string userpresence_desc { get { @@ -7199,18 +7181,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.userpresence`. /// - public static string userpresence_summary { + public static string userpresence_usage { get { - return ResourceManager.GetString("userpresence_summary", resourceCulture); + return ResourceManager.GetString("userpresence_usage", resourceCulture); } } /// - /// Looks up a localized string similar to userpresence. + /// Looks up a localized string similar to usrcmd uc. /// - public static string userpresence_text { + public static string usrcmd_cmd { get { - return ResourceManager.GetString("userpresence_text", resourceCulture); + return ResourceManager.GetString("usrcmd_cmd", resourceCulture); } } @@ -7226,18 +7208,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;uc "command name" enable SomeUsername`. /// - public static string usrcmd_summary { + public static string usrcmd_usage { get { - return ResourceManager.GetString("usrcmd_summary", resourceCulture); + return ResourceManager.GetString("usrcmd_usage", resourceCulture); } } /// - /// Looks up a localized string similar to usrcmd uc. + /// Looks up a localized string similar to usrmdl um. /// - public static string usrcmd_text { + public static string usrmdl_cmd { get { - return ResourceManager.GetString("usrcmd_text", resourceCulture); + return ResourceManager.GetString("usrmdl_cmd", resourceCulture); } } @@ -7253,18 +7235,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;um "module name" enable SomeUsername`. /// - public static string usrmdl_summary { + public static string usrmdl_usage { get { - return ResourceManager.GetString("usrmdl_summary", resourceCulture); + return ResourceManager.GetString("usrmdl_usage", resourceCulture); } } /// - /// Looks up a localized string similar to usrmdl um. + /// Looks up a localized string similar to usrpermscopy upc. /// - public static string usrmdl_text { + public static string usrpermscopy_cmd { get { - return ResourceManager.GetString("usrmdl_text", resourceCulture); + return ResourceManager.GetString("usrpermscopy_cmd", resourceCulture); } } @@ -7280,45 +7262,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;upc @SomeUser ~ @SomeOtherUser`. /// - public static string usrpermscopy_summary { + public static string usrpermscopy_usage { get { - return ResourceManager.GetString("usrpermscopy_summary", resourceCulture); + return ResourceManager.GetString("usrpermscopy_usage", resourceCulture); } } /// - /// Looks up a localized string similar to usrpermscopy upc. + /// Looks up a localized string similar to verbose v. /// - public static string usrpermscopy_text { + public static string verbose_cmd { get { - return ResourceManager.GetString("usrpermscopy_text", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unblacklists a mentioned user. **Bot Owner Only!**. - /// - public static string uubl_desc { - get { - return ResourceManager.GetString("uubl_desc", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to `;uubl [user_mention]`. - /// - public static string uubl_summary { - get { - return ResourceManager.GetString("uubl_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to uubl. - /// - public static string uubl_text { - get { - return ResourceManager.GetString("uubl_text", resourceCulture); + return ResourceManager.GetString("verbose_cmd", resourceCulture); } } @@ -7334,18 +7289,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `;verbose true`. /// - public static string verbose_summary { + public static string verbose_usage { get { - return ResourceManager.GetString("verbose_summary", resourceCulture); + return ResourceManager.GetString("verbose_usage", resourceCulture); } } /// - /// Looks up a localized string similar to verbose v. + /// Looks up a localized string similar to videocall. /// - public static string verbose_text { + public static string videocall_cmd { get { - return ResourceManager.GetString("verbose_text", resourceCulture); + return ResourceManager.GetString("videocall_cmd", resourceCulture); } } @@ -7361,23 +7316,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~videocall "@SomeGuy"`. /// - public static string videocall_summary { + public static string videocall_usage { get { - return ResourceManager.GetString("videocall_summary", resourceCulture); + return ResourceManager.GetString("videocall_usage", resourceCulture); } } /// - /// Looks up a localized string similar to videocall. + /// Looks up a localized string similar to voice+text v+t. /// - public static string videocall_text { + public static string voiceplustext_cmd { get { - return ResourceManager.GetString("videocall_text", resourceCulture); + return ResourceManager.GetString("voiceplustext_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. **Needs Manage Roles and Manage Channels Permissions.**. + /// Looks up a localized string similar to Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. . /// public static string voiceplustext_desc { get { @@ -7388,23 +7343,23 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `.voice+text`. /// - public static string voiceplustext_summary { + public static string voiceplustext_usage { get { - return ResourceManager.GetString("voiceplustext_summary", resourceCulture); + return ResourceManager.GetString("voiceplustext_usage", resourceCulture); } } /// - /// Looks up a localized string similar to voice+text v+t. + /// Looks up a localized string similar to voicepresence. /// - public static string voiceplustext_text { + public static string voicepresence_cmd { get { - return ResourceManager.GetString("voiceplustext_text", resourceCulture); + return ResourceManager.GetString("voicepresence_cmd", resourceCulture); } } /// - /// Looks up a localized string similar to Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Needs Manage Server Permissions.**. + /// Looks up a localized string similar to Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. . /// public static string voicepresence_desc { get { @@ -7413,20 +7368,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `.voicerpresence`. + /// Looks up a localized string similar to `.voicepresence`. /// - public static string voicepresence_summary { + public static string voicepresence_usage { get { - return ResourceManager.GetString("voicepresence_summary", resourceCulture); + return ResourceManager.GetString("voicepresence_usage", resourceCulture); } } /// - /// Looks up a localized string similar to voicepresence. + /// Looks up a localized string similar to volume vol. /// - public static string voicepresence_text { + public static string volume_cmd { get { - return ResourceManager.GetString("voicepresence_text", resourceCulture); + return ResourceManager.GetString("volume_cmd", resourceCulture); } } @@ -7442,18 +7397,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `!!vol 50`. /// - public static string volume_summary { + public static string volume_usage { get { - return ResourceManager.GetString("volume_summary", resourceCulture); + return ResourceManager.GetString("volume_usage", resourceCulture); } } /// - /// Looks up a localized string similar to volume vol. + /// Looks up a localized string similar to weather we. /// - public static string volume_text { + public static string weather_cmd { get { - return ResourceManager.GetString("volume_text", resourceCulture); + return ResourceManager.GetString("weather_cmd", resourceCulture); } } @@ -7469,18 +7424,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~we Moscow RF`. /// - public static string weather_summary { + public static string weather_usage { get { - return ResourceManager.GetString("weather_summary", resourceCulture); + return ResourceManager.GetString("weather_usage", resourceCulture); } } /// - /// Looks up a localized string similar to weather we. + /// Looks up a localized string similar to whosplaying whpl. /// - public static string weather_text { + public static string whosplaying_cmd { get { - return ResourceManager.GetString("weather_text", resourceCulture); + return ResourceManager.GetString("whosplaying_cmd", resourceCulture); } } @@ -7494,20 +7449,20 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `.whoplays Overwatch`. + /// Looks up a localized string similar to `.whpl Overwatch`. /// - public static string whosplaying_summary { + public static string whosplaying_usage { get { - return ResourceManager.GetString("whosplaying_summary", resourceCulture); + return ResourceManager.GetString("whosplaying_usage", resourceCulture); } } /// - /// Looks up a localized string similar to whosplaying. + /// Looks up a localized string similar to wikipedia wiki. /// - public static string whosplaying_text { + public static string wiki_cmd { get { - return ResourceManager.GetString("whosplaying_text", resourceCulture); + return ResourceManager.GetString("wiki_cmd", resourceCulture); } } @@ -7523,18 +7478,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~wiki query`. /// - public static string wiki_summary { + public static string wiki_usage { get { - return ResourceManager.GetString("wiki_summary", resourceCulture); + return ResourceManager.GetString("wiki_usage", resourceCulture); } } /// - /// Looks up a localized string similar to wikipedia wiki. + /// Looks up a localized string similar to wowjoke. /// - public static string wiki_text { + public static string wowjoke_cmd { get { - return ResourceManager.GetString("wiki_text", resourceCulture); + return ResourceManager.GetString("wowjoke_cmd", resourceCulture); } } @@ -7550,18 +7505,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~wowjoke`. /// - public static string wowjoke_summary { + public static string wowjoke_usage { get { - return ResourceManager.GetString("wowjoke_summary", resourceCulture); + return ResourceManager.GetString("wowjoke_usage", resourceCulture); } } /// - /// Looks up a localized string similar to wowjoke. + /// Looks up a localized string similar to yomama ym. /// - public static string wowjoke_text { + public static string yomama_cmd { get { - return ResourceManager.GetString("wowjoke_text", resourceCulture); + return ResourceManager.GetString("yomama_cmd", resourceCulture); } } @@ -7577,18 +7532,18 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~ym`. /// - public static string yomama_summary { + public static string yomama_usage { get { - return ResourceManager.GetString("yomama_summary", resourceCulture); + return ResourceManager.GetString("yomama_usage", resourceCulture); } } /// - /// Looks up a localized string similar to yomama ym. + /// Looks up a localized string similar to youtube yt. /// - public static string yomama_text { + public static string youtube_cmd { get { - return ResourceManager.GetString("yomama_text", resourceCulture); + return ResourceManager.GetString("youtube_cmd", resourceCulture); } } @@ -7604,18 +7559,9 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to `~yt query`. /// - public static string youtube_summary { + public static string youtube_usage { get { - return ResourceManager.GetString("youtube_summary", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to youtube yt. - /// - public static string youtube_text { - get { - return ResourceManager.GetString("youtube_text", resourceCulture); + return ResourceManager.GetString("youtube_usage", resourceCulture); } } } diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx index e43b132f..8af562f3 100644 --- a/src/NadekoBot/Resources/CommandStrings.resx +++ b/src/NadekoBot/Resources/CommandStrings.resx @@ -117,2524 +117,2506 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - h help + + help h - Either shows a help for a single command, or PMs you help link if no arguments are specified. + Either shows a help for a single command, or DMs you help link if no arguments are specified. - - `-h !m q` or just `-h` + + `-h !!q` or `-h` - + hgit - Generates the commandlist.md file. **Bot Owner Only!** + Generates the commandlist.md file. - + `-hgit` - + donate - Instructions for helping the project! + Instructions for helping the project financially. - - `-donate` or `~donate` + + `-donate` - - modules + + modules mdls - List all bot modules. + Lists all bot modules. - - `-modules` or `.modules` + + `-modules` - - commands + + commands cmds - List all of the bot's commands from a certain module. + List all of the bot's commands from a certain module. You can either specify full, or only first few letters of the module name. - - `-commands` or `.commands` + + `-commands Administration` or `-cmds Admin` - - greetdel + + greetdel grdel - Toggles automatic deletion of greet messages. **Needs Manage Server Permissions.** + Toggles automatic deletion of greet messages. - + `.greetdel` - + greet - Toggles anouncements on the current channel when someone joins the server. **Needs Manage Server Permissions.** + Toggles anouncements on the current channel when someone joins the server. - + `.greet` - + greetmsg - Sets a new join announcement message which will be shown in the server's channel. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. **Needs Manage Server Permissions.** + Sets a new join announcement message which will be shown in the server's channel. Type %user% if you want to mention the new member. Using it with no message will show the current greet message. - + `.greetmsg Welcome, %user%.` - + bye Toggles anouncements on the current channel when someone leaves the server. - + `.bye` - + byemsg - Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. **Needs Manage Server Permissions.** + Sets a new leave announcement message. Type %user% if you want to mention the new member. Using it with no message will show the current bye message. - + `.byemsg %user% has left.` - + byedel - Toggles automatic deletion of bye messages. **Needs Manage Server Permissions.** + Toggles automatic deletion of bye messages. - + `.byedel` - + greetdm - Toggles whether the greet messages will be sent in a DM (This is separate from greet - you can have both, any or neither enabled). **Needs Manage Server Permissions.** + Toggles whether the greet messages will be sent in a DM (This is separate from greet - you can have both, any or neither enabled). - + `.greetdm` - + spmom - Toggles whether mentions of other offline users on your server will send a pm to them. **Needs Manage Server Permissions.** + Toggles whether mentions of other offline users on your server will send a pm to them. - + `.spmom` - + logserver - Toggles logging in this channel. Logs every message sent/deleted/edited on the server. **Bot Owner Only!** + Logs server activity in this channel. - + `.logserver` - + logignore - Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. **Bot Owner Only!** + Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. - + `.logignore` - + userpresence - Starts logging to this channel when someone from the server goes online/offline/idle. **Needs Manage Server Permissions.** + Starts logging to this channel when someone from the server goes online/offline/idle. - + `.userpresence` - + voicepresence - Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. **Needs Manage Server Permissions.** + Toggles logging to this channel whenever someone joins or leaves a voice channel you are in right now. - - `.voicerpresence` + + `.voicepresence` - + repeatinvoke repinv - Immediately shows the repeat message and restarts the timer. **Needs Manage Messages Permissions.** + Immediately shows the repeat message and restarts the timer. - + `.repinv` - + repeat - Repeat a message every X minutes. If no parameters are specified, repeat is disabled. **Needs Manage Messages Permissions.** + Repeat a message every X minutes. If no parameters are specified, repeat is disabled. - + `.repeat 5 Hello there` - + rotateplaying ropl - Toggles rotation of playing status of the dynamic strings you specified earlier. **Bot Owner Only!** + Toggles rotation of playing status of the dynamic strings you specified earlier. - + `.ropl` - + addplaying adpl - Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%, %trivia% **Bot Owner Only!** + Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued% - + `.adpl` - + listplaying lipl - Lists all playing statuses with their corresponding number. **Bot Owner Only!** + Lists all playing statuses with their corresponding number. - + `.lipl` - - removeplaying rmlp repl + + removeplaying rmpl repl - Removes a playing string on a given number. **Bot Owner Only!** + Removes a playing string on a given number. - + `.rmpl` - + slowmode - Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. **Needs Manage Messages Permissions.** + Toggles slow mode. When ON, users will be able to send only 1 message every 5 seconds. - + `.slowmode` - + cleanvplust cv+t Deletes all text channels ending in `-voice` for which voicechannels are not found. **Use at your own risk. Needs Manage Roles and Manage Channels Permissions.** - + `.cleanv+t` - + voice+text v+t - Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. **Needs Manage Roles and Manage Channels Permissions.** + Creates a text channel for each voice channel only users in that voice channel can see.If you are server owner, keep in mind you will see them all the time regardless. - + `.voice+text` - + scsc - Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance. **Bot Owner Only.** + Starts an instance of cross server channel. You will get a token as a DM that other people will use to tune in to the same instance. - + `.scsc` - + jcsc - Joins current channel to an instance of cross server channel using the token. **Needs Manage Server Permissions.** + Joins current channel to an instance of cross server channel using the token. - - `.jcsc` + + `.jcsc TokenHere` - + lcsc - Leaves Cross server channel instance from this channel. **Needs Manage Server Permissions.** + Leaves Cross server channel instance from this channel. - + `.lcsc` - + asar - Adds a role, or list of roles separated by whitespace(use quotations for multiword roles) to the list of self-assignable roles. **Needs Manage Roles Permissions.** + Adds a role, or list of roles separated by whitespace(use quotations for multiword roles) to the list of self-assignable roles. - + `.asar Gamer` - + rsar Removes a specified role from the list of self-assignable roles. - + `.rsar` - + lsar Lists all self-assignable roles. - + `.lsar` - + togglexclsar tesar - toggle whether the self-assigned roles should be exclusive + Toggles whether the self-assigned roles are exclusive. (So that any person can have only one of the self assignable roles) - + `.tesar` - + iam Adds a role to you that you choose. Role must be on a list of self-assignable roles. - + `.iam Gamer` - + iamnot iamn Removes a role to you that you choose. Role must be on a list of self-assignable roles. - + `.iamn Gamer` - + addcustreact acr - Add a custom reaction. Guide here: <https://github.com/Kwoth/NadekoBot/wiki/Custom-Reactions> **Bot Owner Only!** + Add a custom reaction with a trigger and a response. Running this command in server requires Administration permission. Running this command in DM is Bot Owner only and adds a new global custom reaction. Guide here: <http://nadekobot.readthedocs.io/en/1.0/Custom%20Reactions/> - + `.acr "hello" Hi there %user%` - + listcustreact lcr - Lists custom reactions (paginated with 30 commands per page). Use 'all' instead of page number to get all custom reactions DM-ed to you. + Lists global or server custom reactions (15 commands per page). Running the command in DM will list global custom reactions, while running it in server will list that server's custom reactions. - + `.lcr 1` - + showcustreact scr Shows all possible responses from a single custom reaction. - + `.scr %mention% bb` - + editcustreact ecr - Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message **Bot Owner Only** + Edits a custom reaction, arguments are custom reactions name, index to change, and a (multiword) message. - + `.ecr "%mention% disguise" 2 Test 123` - + delcustreact dcr - Deletes a custom reaction with given name (and index). **Bot Owner Only.** + Deletes a custom reaction on a specific index. If ran in DM, it is bot owner only and deletes a global custom reaction. If ran in a server, it requires Administration priviledges and removes server custom reaction. - - `.dcr index` + + `.dcr 5` - + autoassignrole aar - Automaticaly assigns a specified role to every user who joins the server. **Needs Manage Roles Permissions.** + Automaticaly assigns a specified role to every user who joins the server. - + `.aar` to disable, `.aar Role Name` to enable - + leave - Makes Nadeko leave the server. Either name or id required. **Bot Owner Only!** + Makes Nadeko leave the server. Either name or id required. - + `.leave 123123123331` - + listincidents lin - List all UNREAD incidents and flags them as read. **Needs Manage Server Permissions.** + List all UNREAD incidents and flags them as read. - + `.lin` - + listallincidents lain - Sends you a file containing all incidents and flags them as read. **Needs Manage Server Permissions.** + Sends you a file containing all incidents and flags them as read. - + `.lain` - + delmsgoncmd Toggles the automatic deletion of user's successful command message to prevent chat flood. **Server Manager Only.** - + `.delmsgoncmd` - + restart - Restarts the bot. Might not work. **Bot Owner Only** + Restarts the bot. Might not work. - + `.restart` - + setrole sr - Sets a role for a given user. **Needs Manage Roles Permissions.** + Sets a role for a given user. - + `.sr @User Guest` - + removerole rr - Removes a role from a given user. **Needs Manage Roles Permissions.** + Removes a role from a given user. - + `.rr @User Admin` - + renamerole renr - Renames a role. Roles you are renaming must be lower than bot's highest role. **Manage Roles Permissions.** + Renames a role. Roles you are renaming must be lower than bot's highest role. - + `.renr "First role" SecondRole` - + removeallroles rar - Removes all roles from a mentioned user. **Needs Manage Roles Permissions.** + Removes all roles from a mentioned user. - + `.rar @User` - + createrole cr - Creates a role with a given name. **Needs Manage Roles Permissions.** + Creates a role with a given name. - + `.cr Awesome Role` - + rolecolor rc - Set a role's color to the hex or 0-255 rgb color value provided. **Needs Manage Roles Permissions.** + Set a role's color to the hex or 0-255 rgb color value provided. - + `.rc Admin 255 200 100` or `.rc Admin ffba55` - + ban b - Bans a user by id or name with an optional message. **Needs Ban Permissions.** + Bans a user by id or name with an optional message. - + `.b "@some Guy" Your behaviour is toxic.` - + softban sb - Bans and then unbans a user by id or name with an optional message. **Needs Ban Permissions.** + Bans and then unbans a user by id or name with an optional message. - + `.sb "@some Guy" Your behaviour is toxic.` - + kick k - Kicks a mentioned user. **Needs Kick Permissions.** + Kicks a mentioned user. - + `.k "@some Guy" Your behaviour is toxic.` - - mute min + + mute - Sets the music volume to 0% + Mutes a mentioned user in a voice channel. - - `!!min` + + `.mute @Someone` - + unmute - Unmutes mentioned user or users. **Needs Mute Permissions.** + Unmutes mentioned user or users. - + `.unmute "@Someguy"` or `.unmute "@Someguy" "@Someguy"` - + deafen deaf - Deafens mentioned user or users. **Needs Deafen Permissions.** + Deafens mentioned user or users. - + `.deaf "@Someguy"` or `.deaf "@Someguy" "@Someguy"` - + undeafen undef - Undeafens mentioned user or users. **Needs Deafen Permissions.** + Undeafens mentioned user or users. - + `.undef "@Someguy"` or `.undef "@Someguy" "@Someguy"` - + delvoichanl dvch - Deletes a voice channel with a given name. **Needs Manage Channel Permissions.** + Deletes a voice channel with a given name. - + `.dvch VoiceChannelName` - + creatvoichanl cvch - Creates a new voice channel with a given name. **Needs Manage Channel Permissions.** + Creates a new voice channel with a given name. - + `.cvch VoiceChannelName` - + deltxtchanl dtch - Deletes a text channel with a given name. **Needs Manage Channel Permissions.** + Deletes a text channel with a given name. - + `.dtch TextChannelName` - + creatxtchanl ctch - Creates a new text channel with a given name. **Needs Manage Channel Permissions.** + Creates a new text channel with a given name. - + `.ctch TextChannelName` - + settopic st - Sets a topic on the current channel. **Needs Manage Channel Permissions.** + Sets a topic on the current channel. - + `.st My new topic` - + setchanlname schn - Changed the name of the current channel. **Needs Manage Channel Permissions.** + Changed the name of the current channel. - + `.schn NewName` - + heap - Shows allocated memory - **Bot Owner Only!** + Shows allocated memory - - + `.heap` - + prune clr - `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. **Needs Manage Messages Permissions** + `.prune` removes all nadeko's messages in the last 100 messages.`.prune X` removes last X messages from the channel (up to 100)`.prune @Someone` removes all Someone's messages in the last 100 messages.`.prune @Someone X` removes last X 'Someone's' messages in the channel. - + `.prune` or `.prune 5` or `.prune @Someone` or `.prune @Someone X` - + die Works only for the owner. Shuts the bot down. - + `@NadekoBot die` - + setname newnm - Give the bot a new name. **Bot Owner Only!** + Give the bot a new name. - + `.newnm BotName` - - newavatar setavatar + + setavatar setav - - Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner Only!** + + Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. - - `.setavatar http://i.imgur.com/xTG3a1I.jpg` + + `.setav http://i.imgur.com/xTG3a1I.jpg` - + setgame - Sets the bots game. **Bot Owner Only!** + Sets the bots game. - + `.setgame Playing with kwoth` - + send - Send a message to someone on a different server through the bot. **Bot Owner Only!** + Sends a message to someone on a different server through the bot. Separate server and channel/user ids with | and prepend channel id with `c:` and user id with `u:`. - - `.send sid + + `.send serverid|c:channelid` or `.send serverid|u:userid` - + mentionrole menro Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. - + `.menro RoleName` - + unstuck - Clears the message queue. **Bot Owner Only!** + Clears the message queue. - + `.unstuck` - + donators List of lovely people who donated to keep this project alive. - + `.donators` - + donadd Add a donator to the database. **Kwoth Only** - + `.donadd Donate Amount` - + announce - Sends a message to all servers' general channel bot is connected to.**Bot Owner Only!** + Sends a message to all servers' general channel bot is connected to. - + `.announce Useless spam` - + savechat - Saves a number of messages to a text file and sends it to you. **Bot Owner Only** + Saves a number of messages to a text file and sends it to you. - + `.savechat 150` - + remind Sends a message to you or a channel after certain amount of time. First argument is me/here/'channelname'. Second argument is time in a descending order (mo>w>d>h>m) example: 1w5d3h10m. Third argument is a (multiword)message. - + `.remind me 1d5h Do something` or `.remind #general Start now!` - - remindmsg + + remindtemplate - - Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. **Bot Owner Only!** + + Sets message for when the remind is triggered. Available placeholders are %user% - user who ran the command, %message% - Message specified in the remind, %target% - target channel of the remind. - - `.remindmsg do something else` + + `.remindtemplate %user%, you gotta do %message%!` - + serverinfo sinfo Shows info about the server the bot is on. If no channel is supplied, it defaults to current one. - + `.sinfo Some Server` - + channelinfo cinfo Shows info about the channel. If no channel is supplied, it defaults to current one. - + `.cinfo #some-channel` - + userinfo uinfo Shows info about the user. If no user is supplied, it defaults a user running the command. - + `.uinfo @SomeUser` - - whosplaying + + whosplaying whpl Shows a list of users who are playing the specified game. - - `.whoplays Overwatch` + + `.whpl Overwatch` - + inrole Lists every person from the provided role or roles (separated by a ',') on this server. If the list is too long for 1 message, you must have Manage Messages permission. - + `.inrole Role` - + checkmyperms Checks your userspecific permissions on this channel. - + `.checkmyperms` - + stats Shows some basic stats for Nadeko. - + `.stats` - + dysyd Shows some basic stats for Nadeko. - + `.dysyd` - + userid uid Shows user ID. - + `.uid` or `.uid "@SomeGuy"` - - channelid + + channelid cid Shows current channel ID. - + `.cid` - + serverid sid Shows current server ID. - + `.sid` - + roles List all roles on this server or a single user if specified. - + `.roles` - + channeltopic ct Sends current channel's topic as a message. - + `.ct` - + chnlfilterinv cfi - Enables or disables automatic deleting of invites on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. + Toggles automatic deleting of invites posted in the channel. Does not negate the .srvrfilterinv enabled setting. Does not affect Bot Owner. - - `;cfi enable #general-chat` + + `;cfi` - + srvrfilterinv sfi - Enables or disables automatic deleting of invites on the server. + Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner. - - `;sfi disable` + + `;sfi` - + chnlfilterwords cfw - Enables or disables automatic deleting of messages containing banned words on the channel.If no channel supplied, it will default to current one. Use ALL to apply to all existing channels at once. + Toggles automatic deleting of messages containing banned words on the channel. Does not negate the .srvrfilterwords enabled setting. Does not affect bot owner. - - `;cfw enable #general-chat` + + `;cfw` - - addfilterword afw + + fw - - Adds a new word to the list of filtered words + + Adds or removes (if it exists) a word from the list of filtered words. Use` ;sfw` or `;cfw` to toggle filtering. - - `;afw poop` + + `;fw poop` - - rmvfilterword rw - - - Removes the word from the list of filtered words - - - `;rw poop` - - + lstfilterwords lfw - Shows a list of filtered words + Shows a list of filtered words. - + `;lfw` - + srvrfilterwords sfw - Enables or disables automatic deleting of messages containing forbidden words on the server. + Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner. - - `;sfw disable` + + `;sfw` - + permrole pr Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'. - + `;pr role` - + rolepermscopy rpc Copies BOT PERMISSIONS (not discord permissions) from one role to another. - + `;rpc Some Role ~ Some other role` - + chnlpermscopy cpc Copies BOT PERMISSIONS (not discord permissions) from one channel to another. - + `;cpc Some Channel ~ Some other channel` - + usrpermscopy upc Copies BOT PERMISSIONS (not discord permissions) from one role to another. - + `;upc @SomeUser ~ @SomeOtherUser` - + verbose v Sets whether to show when a command/module is blocked. - + `;verbose true` - + srvrperms sp Shows banned permissions for this server. - + `;sp` - + roleperms rp Shows banned permissions for a certain role. No argument means for everyone. - + `;rp AwesomeRole` - + chnlperms cp Shows banned permissions for a certain channel. No argument means for this channel. - + `;cp #dev` - + userperms up Shows banned permissions for a certain user. No argument means for yourself. - + `;up Kwoth` - + srvrmdl sm Sets a module's permission at the server level. - + `;sm "module name" enable` - + srvrcmd sc Sets a command's permission at the server level. - + `;sc "command name" disable` - + rolemdl rm Sets a module's permission at the role level. - + `;rm "module name" enable MyRole` - + rolecmd rc Sets a command's permission at the role level. - + `;rc "command name" disable MyRole` - + chnlmdl cm Sets a module's permission at the channel level. - + `;cm "module name" enable SomeChannel` - + chnlcmd cc Sets a command's permission at the channel level. - + `;cc "command name" enable SomeChannel` - + usrmdl um Sets a module's permission at the user level. - + `;um "module name" enable SomeUsername` - + usrcmd uc Sets a command's permission at the user level. - + `;uc "command name" enable SomeUsername` - + allsrvrmdls asm - Sets permissions for all modules at the server level. + Enable or disable all modules for your server. - + `;asm [enable/disable]` - - allsrvrcmds asc - - - Sets permissions for all commands from a certain module at the server level. - - - `;asc "module name" [enable/disable]` - - + allchnlmdls acm - Sets permissions for all modules at the channel level. + Enable or disable all modules in a specified channel. - - `;acm [enable/disable] SomeChannel` + + `;acm enable #SomeChannel` - - allchnlcmds acc - - - Sets permissions for all commands from a certain module at the channel level. - - - `;acc "module name" [enable/disable] SomeChannel` - - + allrolemdls arm - Sets permissions for all modules at the role level. + Enable or disable all modules for a specific role. - + `;arm [enable/disable] MyRole` - - allrolecmds acmdcds - - - Sets permissions for all commands from a certain module at the role level. - - - `;arc "module name" [enable/disable] MyRole` - - + ubl - - Blacklists a mentioned user. **Bot Owner Only!** + + Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. - - `;ubl [user_mention]` + + `;ubl add @SomeUser` or `;ubl rem 12312312313` - - uubl - - - Unblacklists a mentioned user. **Bot Owner Only!** - - - `;uubl [user_mention]` - - + cbl - - Blacklists a mentioned channel (#general for example). + + Either [add]s or [rem]oves a channel specified by an ID from a blacklist. - - `;cbl #some_channel` + + `;cbl rem 12312312312` - - cubl - - - Unblacklists a mentioned channel (#general for example). - - - `;cubl #some_channel` - - + sbl - - Blacklists a server by a name or id (#general for example). **BOT OWNER ONLY** + + Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist. - - `;sbl [servername/serverid]` + + `;sbl add 12312321312` or `;sbl rem SomeTrashServer` - + cmdcooldown cmdcd - Sets a cooldown per user for a command. Set 0 to clear. **Needs Manager Messages Permissions** + Sets a cooldown per user for a command. Set to 0 to remove the cooldown. - + `;cmdcd "some cmd" 5` - - allcmdcooldowns + + allcmdcooldowns acmdcds Shows a list of all commands and their respective cooldowns. - + `;acmdcds` - + . - Adds a new quote with the specified name (single word) and message (no limit). + Adds a new quote with the specified name and message. - - `.. abc My message` + + `.. sayhi Hi` - + .. Shows a random quote with a specified name. - + `... abc` - + deletequote delq - Deletes all quotes with the specified keyword. You have to either be bot owner or the creator of the quote to delete it. + Deletes a random quote with the specified keyword. You have to either be server Administrator or the creator of the quote to delete it. - + `.delq abc` - + rip Shows a grave image of someone with a start year - + `@NadekoBot rip @Someone 2000` - + do you love me Replies with positive answer only to the bot owner. - + `@NadekoBot do you love me` - + how are you Replies positive only if bot owner is online. - + `@NadekoBot how are you` - + fire Shows a unicode fire message. Optional parameter [x] tells her how many times to repeat the fire. - + `@NadekoBot fire [x]` - - dump - - - Dumps all of the invites it can to dump.txt.** Owner Only.** - - - `@NadekoBot dump` - - + draw - Draws a card from the deck.If you supply number [x], she draws up to 5 cards from the deck. + Draws a card from the deck.If you supply number X, she draws up to 5 cards from the deck. - - `$draw [x]` + + `$draw` or `$draw 5` - + shuffle sh - + Shuffles the current playlist. - + `!!sh` - + flip Flips coin(s) - heads or tails, and shows an image. - + `$flip` or `$flip 3` - + betflip bf - Bet to guess will the result be heads or tails. Guessing award you double flowers you've bet. + Bet to guess will the result be heads or tails. Guessing awards you double flowers you've bet. - + `$bf 5 heads` or `$bf 3 t` - + roll Rolls 0-100. If you supply a number [x] it rolls up to 30 normal dice. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. - + `$roll` or `$roll 7` or `$roll 3d5` - + rolluo Rolls X normal dice (up to 30) unordered. If you split 2 numbers with letter d (xdy) it will roll x dice from 1 to y. - + `$rolluo` or `$rolluo 7` or `$rolluo 3d5` - + nroll Rolls in a given range. - + `$nroll 5` (rolls 0-5) or `$nroll 5-15` - + race Starts a new animal race. - + `$race` - + joinrace jr Joins a new race. You can specify an amount of flowers for betting (optional). You will get YourBet*(participants-1) back if you win. - + `$jr` or `$jr 5` - + raffle Prints a name and ID of a random user from the online list from the (optional) role. - + `$raffle` or `$raffle RoleName` - + give - Give someone a certain amount of NadekoFlowers + Give someone a certain amount of currency. - + `$give 1 "@SomeGuy"` - + award - Gives someone a certain amount of flowers. **Bot Owner Only!** + Awards someone a certain amount of currency. - + `$award 100 @person` - + take - Takes a certain amount of flowers from someone. **Bot Owner Only!** + Takes a certain amount of flowers from someone. - + `$take 1 "@someguy"` - + betroll br Bets a certain amount of NadekoFlowers and rolls a dice. Rolling over 66 yields x2 flowers, over 90 - x3 and 100 x10. - + `$br 5` - + leaderboard lb - Displays bot currency leaderboard + Displays bot currency leaderboard. - + `$lb` - + trivia t - + Starts a game of trivia. You can add nohint to prevent hints.First player to get to 10 points wins by default. You can specify a different number. 30 seconds per question. - + `>t nohint` or `>t 5 nohint` - + tl Shows a current trivia leaderboard. - + `>tl` - + tq Quits current trivia after current question. - + `>tq` - + typestart Starts a typing contest. - + `>typestart` - + typestop Stops a typing contest on the current channel. - + `>typestop` - + typeadd - Adds a new article to the typing contest. Owner only. + Adds a new article to the typing contest. - + `>typeadd wordswords` - + poll - Creates a poll, only person who has manage server permission can do it. **Needs Manage Server Permissions** + Creates a poll, only person who has manage server permission can do it. - + `>poll Question?;Answer1;Answ 2;A_3` - + pollend Stops active poll on this server and prints the results in this channel. - + `>pollend` - + pick Picks a flower planted in this channel. - + `>pick` - + plant Spend a flower to plant it in this channel. (If bot is restarted or crashes, flower will be lost) - + `>plant` - + gencurrency gc - Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a NadekoFlower. Optional parameter cooldown time in minutes, 5 minutes by default. Requires Manage Messages permission. + Toggles currency generation on this channel. Every posted message will have chance to spawn a NadekoFlower. Chance is specified by the Bot Owner. (default is 2%) - - `>gc` or `>gc 60` + + `>gc` - + leet Converts a text to leetspeak with 6 (1-6) severity levels - + `>leet 3 Hello` - + choose Chooses a thing from a list of things - + `>choose Get up;Sleep;Sleep more` - + 8ball Ask the 8ball a yes/no question. - - `>8ball should i do something` + + `>8ball should I do something` - + rps Play a game of rocket paperclip scissors with Nadeko. - + `>rps scissors` - + linux Prints a customizable Linux interjection - + `>linux Spyware Windows` - + next n Goes to the next song in the queue. You have to be in the same voice channel as the bot. - + `!!n` - + stop s Stops the music and clears the playlist. Stays in the channel. - + `!!s` - + destroy d Completely stops the music and unbinds the bot from the channel. (may cause weird behaviour) - + `!!d` - + pause p Pauses or Unpauses the song. - + `!!p` - + queue q yq Queue a song using keywords or a link. Bot will join your voice channel.**You must be in a voice channel**. - + `!!q Dream Of Venice` - + soundcloudqueue sq Queue a soundcloud song using keywords. Bot will join your voice channel.**You must be in a voice channel**. - + `!!sq Dream Of Venice` - + listqueue lq Lists 15 currently queued songs per page. Default page is 1. - + `!!lq` or `!!lq 2` - + nowplaying np Shows the song currently playing. - + `!!np` - + volume vol Sets the music volume 0-100% - + `!!vol 50` - + defvol dv Sets the default music volume when music playback is started (0-100). Persists through restarts. - + `!!dv 80` - + max Sets the music volume to 100%. - + `!!max` - + half Sets the music volume to 50%. - + `!!half` - + playlist pl Queues up to 500 songs from a youtube playlist specified by a link, or keywords. - + `!!pl playlist link or name` - + soundcloudpl scpl Queue a soundcloud playlist using a link. - + `!!scpl soundcloudseturl` - + localplaylst lopl - Queues all songs from a directory. **Bot Owner Only!** + Queues all songs from a directory. - + `!!lopl C:/music/classical` - + radio ra Queues a radio stream from a link. It can be a direct mp3 radio stream, .m3u, .pls .asx or .xspf (Usage Video: <https://streamable.com/al54>) - + `!!ra radio link here` - + local lo - Queues a local file by specifying a full path. **Bot Owner Only!** + Queues a local file by specifying a full path. - + `!!lo C:/music/mysong.mp3` - + move mv Moves the bot to your voice channel. (works only if music is already playing) - + `!!mv` - + remove rm Remove a song by its # in the queue, or 'all' to remove whole queue. - + `!!rm 5` - + movesong ms Moves a song from one position to another. - + `!! ms 5>3` - + setmaxqueue smq Sets a maximum queue size. Supply 0 or no argument to have no limit. - + `!!smq 50` or `!!smq` - + cleanup - Cleans up hanging voice connections. **Bot Owner Only!** + Cleans up hanging voice connections. - + `!!cleanup` - + reptcursong rcs Toggles repeat of current song. - + `!!rcs` - + rpeatplaylst rpl Toggles repeat of all songs in the queue (every song that finishes is added to the end of the queue). - + `!!rpl` - + save Saves a playlist under a certain name. Name must be no longer than 20 characters and mustn't contain dashes. - + `!!save classical1` - + load Loads a playlist under a certain name. - + `!!load classical-1` - + playlists pls Lists all playlists. Paginated. 20 per page. Default page is 0. - + `!!pls 1` - + deleteplaylist delpls Deletes a saved playlist. Only if you made it or if you are the bot owner. - + `!!delpls animu-5` - + goto Goes to a specific time in seconds in a song. - + `!!goto 30` - + getlink gl Shows a link to the song in the queue by index, or the currently playing song by default. - + `!!gl` - + autoplay ap Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty) - + `!!ap` - + lolchamp Shows League Of Legends champion statistics. If there are spaces/apostrophes or in the name - omit them. Optional second parameter is a role. - + `~lolchamp Riven` or `~lolchamp Annie sup` - + lolban Shows top banned champions ordered by ban rate. - + `~lolban` - + hitbox hb Notifies this channel when a certain user starts streaming. - + `~hitbox SomeStreamer` - + twitch tw Notifies this channel when a certain user starts streaming. - + `~twitch SomeStreamer` - + beam bm Notifies this channel when a certain user starts streaming. - + `~beam SomeStreamer` - - checkhitbox chhb - - - Checks if a certain user is streaming on the hitbox platform. - - - `~chhb SomeStreamer` - - - checktwitch chtw - - - Checks if a certain user is streaming on the twitch platform. - - - `~chtw SomeStreamer` - - - checkbeam chbm - - - Checks if a certain user is streaming on the beam platform. - - - `~chbm SomeStreamer` - - + removestream rms Removes notifications of a certain streamer on this channel. - + `~rms SomeGuy` - + liststreams ls Lists all streams you are following on this server. - + `~ls` - + convert - Convert quantities from>to. + Convert quantities. Use `.convertlist` to see supported dimensions and currencies. - - `~convert m>km 1000` + + `.convert m km 1000` - + convertlist - List of the convertable dimensions and currencies. + List of the convertible dimensions and currencies. - - + + `.convertlist` - + wowjoke Get one of Kwoth's penultimate WoW jokes. - + `~wowjoke` - + calculate calc Evaluate a mathematical expression. - - `~calc 1+1` + + `.calc 1+1` - + osu Shows osu stats for a player. - + `~osu Name` or `~osu Name taiko` - + osub Shows information about an osu beatmap. - - `~osu b https://osu.ppy.sh/s/127712` + + `~osub https://osu.ppy.sh/s/127712` - + osu5 Displays a user's top 5 plays. - - `~osu top5 Name` + + `~osu5 Name` - + pokemon poke Searches for a pokemon. - + `~poke Sylveon` - + pokemonability pokeab Searches for a pokemon ability. - + `~pokeab "water gun"` - + memelist Pulls a list of memes you can use with `~memegen` from http://memegen.link/templates/ - + `~memelist` - + memegen Generates a meme from memelist with top and bottom text. - + `~memegen biw "gets iced coffee" "in the winter"` - + weather we Shows weather data for a specified city and a country. BOTH ARE REQUIRED. Use country abbrevations. - + `~we Moscow RF` - + youtube yt Searches youtubes and shows the first result - + `~yt query` - - ani anime aq + + anime ani aq - + Queries anilist for an anime and shows the first result. - - `~aq aquarion evol` + + `~ani aquarion evol` - + imdb Queries imdb for movies or series, show first result. - + `~imdb Batman vs Superman` - + manga mang mq Queries anilist for a manga and shows the first result. - + `~mq Shingeki no kyojin` - + randomcat meow Shows a random cat image. - + `~meow` - + randomdog woof Shows a random dog image. - + `~woof` - + img i Pulls the first image found using a search parameter. Use ~ir for different results. - + `~i cute kitten` - + ir Pulls a random image using a search parameter. - + `~ir cute kitten` - + lmgtfy Google something for an idiot. - + `~lmgtfy query` - + google g Get a google search link for some terms. - + `~google query` - + hearthstone hs Searches for a Hearthstone card and shows its image. Takes a while to complete. - + `~hs Ysera` - + urbandict ud Searches Urban Dictionary for a word. - + `~ud Pineapple` - + # Searches Tagdef.com for a hashtag. - + `~# ff` - + catfact Shows a random catfact from <http://catfacts-api.appspot.com/api/facts> - + `~catfact` - + yomama ym Shows a random joke from <http://api.yomomma.info/> - + `~ym` - + randjoke rj Shows a random joke from <http://tambal.azurewebsites.net/joke/random> - + `~rj` - + chucknorris cn Shows a random chucknorris joke from <http://tambal.azurewebsites.net/joke/random> - + `~cn` - + magicitem mi Shows a random magicitem from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items> - + `~mi` - + revav Returns a google reverse image search for someone's avatar. - + `~revav "@SomeGuy"` - + revimg Returns a google reverse image search for an image from a link. - + `~revimg Image link` - + safebooru Shows a random image from safebooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) - + `~safebooru yuri+kissing` - + wikipedia wiki Gives you back a wikipedia link - + `~wiki query` - - clr prune + + color clr - + Shows you what color corresponds to that hex. - + `~clr 00ff00` - + videocall Creates a private <http://www.appear.in> video call link for you and other mentioned people. The link is sent to mentioned people via a private message. - + `~videocall "@SomeGuy"` - + av avatar Shows a mentioned person's avatar. - + `~av "@SomeGuy"` - + hentai - Shows a random NSFW hentai image from gelbooru and danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) + Shows a 2 random images (from gelbooru and danbooru) with a given tag. Tag is optional but preferred. Only 1 tag allowed. - - `~hentai yuri+kissing` + + `~hentai yuri` - + danbooru Shows a random hentai image from danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) - + `~danbooru yuri+kissing` - + gelbooru Shows a random hentai image from gelbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +) - + `~gelbooru yuri+kissing` - + rule34 Shows a random image from rule34.xx with a given tag. Tag is optional but preffered. (multiple tags are appended with +) - + `~rule34 yuri+kissing` - + e621 Shows a random hentai image from e621.net with a given tag. Tag is optional but preffered. Use spaces for multiple tags. - + `~e621 yuri kissing` - + cp We all know where this will lead you to. - + `~cp` - + boobs Real adult content. - + `~boobs` - + butts ass butt Real adult content. - + `~butts` or `~ass` - + createwar cw Creates a new war by specifying a size (>10 and multiple of 5) and enemy clan name. - + `,cw 15 The Enemy Clan` - + startwar sw Starts a war with a given number. - + `,sw 15` - + listwar lw Shows the active war claims by a number. Shows all wars in a short way if no number is specified. - + `,lw [war_number] or ,lw` - + claim call c Claims a certain base from a certain war. You can supply a name in the third optional argument to claim in someone else's place. - + `,call [war_number] [base_number] [optional_other_name]` - - claimfinish cf cf3 claimfinish3 + + claimfinish cf - Finish your claim with 3 stars if you destroyed a base. Optional second argument finishes for someone else. + Finish your claim with 3 stars if you destroyed a base. First argument is the war number, optional second argument finishes for someone else. - - `,cf [war_number] [optional_other_name]` + + `,cf 1 Someone` - + claimfinish2 cf2 - Finish your claim with 2 stars if you destroyed a base. Optional second argument finishes for someone else. + Finish your claim with 2 stars if you destroyed a base. First argument is the war number, optional second argument finishes for someone else. - - `,cf [war_number] [optional_other_name]` + + `,cf2 1 SomeGuy` - + claimfinish1 cf1 - Finish your claim with 1 stars if you destroyed a base. Optional second argument finishes for someone else. + Finish your claim with 1 star if you destroyed a base. First argument is the war number, optional second argument finishes for someone else. - - `,cf [war_number] [optional_other_name]` + + `,cf1 2 SomeGirl` - + unclaim ucall uc Removes your claim from a certain war. Optional second argument denotes a person in whose place to unclaim - + `,uc [war_number] [optional_other_name]` - + endwar ew Ends the war with a given index. - + `,ew [war_number]` - + attack Attacks a target with the given move. Use `>movelist` to see a list of moves your type can use. - + `>attack "vine whip" @someguy` - + movelist ml Lists the moves you are able to use - + `>ml` - + heal Heals someone. Revives those who fainted. Costs a NadekoFlower - + `>heal @someone` - + type Get the poketype of the target. - + `>type @someone` - + settype Set your poketype. Costs a NadekoFlower. - + `>settype fire` - + translate trans - Translates from>to text. From the given language to the destiation language. + Translates from>to text. From the given language to the destination language. - + `~trans en>fr Hello` - + translangs - List the valid languages for translation. + Lists the valid languages for translation. - - `~translangs` or `~translangs language` + + `~translangs` - + bind - Bind a trello bot to a single channel. You will receive notifications from your board when something is added or edited. **Bot Owner Only!** + Bind a trello bot to a single channel. You will receive notifications from your board when something is added or edited. - + `trello bind [board_id]` - + unbind - Unbinds a bot from the channel and board. **Bot Owner Only!** + Unbinds a bot from the channel and board. - + `trello unbind` - + lists list - Lists all lists, yo ;) **Bot Owner Only!** + Lists all lists, yo ;) - + `trello list` - + cards - Lists all cards from the supplied list. You can supply either a name or an index. **Bot Owner Only!** + Lists all cards from the supplied list. You can supply either a name or an index. - + `trello cards index` Sends a readme and a guide links to the channel. - + `-readme` or `-guide` - + readme guide Shows all available operations in .calc command - + `.calcops` - + calcops Deletes all quotes on a specified keyword. - - `.delallq` + + `.delallq kek` - + delallq daq - + greetdmmsg - + `.greetdmmsg Welcome to the server, %user%`. - Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. **Needs Manage Server Permissions.** + Sets a new join announcement message which will be sent to the user who joined. Type %user% if you want to mention the new member. Using it with no message will show the current DM greet message. Check how much NadekoFlowers a person has. (Defaults to yourself) - + `$$$` or `$$$ @SomeGuy` - + cash $$ + + Lists whole permission chain with their indexes. You can specify an optional page number if there are a lot of permissions. + + + `;lp` or `;lp 3` + + + listperms lp + + + Enable or disable all modules for a specific user. + + + `;aum enable @someone` + + + allusrmdls aum + + + Moves permission from one position to another. + + + `;mp 2 4` + + + moveperm mp + + + Removes a permission from a given position + + + `;rp 1` + + + removeperm rp + + + Migrate data from old bot configuration + + + `.migratedata` + + + migratedata + + + Checks if a user is online on a certain streaming platform. + + + `~cs twitch MyFavStreamer` + + + checkstream cs + + + showemojis se + + + Shows a name and a link to every SPECIAL emoji in the message. + + + `.se A message full of SPECIALemojis` + + + shuffle sh + + + Reshuffles all cards back into the deck. + + + `$sh` + \ No newline at end of file diff --git a/src/NadekoBot/Services/CommandHandler.cs b/src/NadekoBot/Services/CommandHandler.cs index 493571ce..da9cbe68 100644 --- a/src/NadekoBot/Services/CommandHandler.cs +++ b/src/NadekoBot/Services/CommandHandler.cs @@ -8,18 +8,27 @@ using Discord; using NLog; using System.Diagnostics; using Discord.Commands; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using NadekoBot.Modules.Permissions; +using Microsoft.Data.Sqlite; +using Discord.Net; +using NadekoBot.Extensions; +using static NadekoBot.Modules.Permissions.Permissions; +using System.Collections.Concurrent; +using NadekoBot.Modules.Help; namespace NadekoBot.Services { public class CommandHandler { - private DiscordSocketClient _client; + private ShardedDiscordClient _client; private CommandService _commandService; private Logger _log; public event EventHandler CommandExecuted = delegate { }; - public CommandHandler(DiscordSocketClient client, CommandService commandService) + public CommandHandler(ShardedDiscordClient client, CommandService commandService) { _client = client; _commandService = commandService; @@ -28,54 +37,224 @@ namespace NadekoBot.Services _client.MessageReceived += MessageReceivedHandler; } - private Task MessageReceivedHandler(IMessage msg) + private async Task MessageReceivedHandler(IMessage msg) { var usrMsg = msg as IUserMessage; if (usrMsg == null) - return Task.CompletedTask; - var throwaway = Task.Run(async () => - { - var sw = new Stopwatch(); - sw.Start(); - var t = await _commandService.Execute(usrMsg, usrMsg.Content, MultiMatchHandling.Best); - var command = t.Item1; - var result = t.Item2; - sw.Stop(); - var channel = (usrMsg.Channel as ITextChannel); - if (result.IsSuccess) - { - CommandExecuted(this, new CommandExecutedEventArgs(usrMsg, command)); - _log.Info("Command Executed after {4}s\n\t" + - "User: {0}\n\t" + - "Server: {1}\n\t" + - "Channel: {2}\n\t" + - "Message: {3}", - usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0} - (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1} - (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2} - usrMsg.Content, // {3} - sw.Elapsed.TotalSeconds // {4} - ); - } - else if (!result.IsSuccess && result.Error != CommandError.UnknownCommand) - { - _log.Warn("Command Errored after {5}s\n\t" + - "User: {0}\n\t" + - "Server: {1}\n\t" + - "Channel: {2}\n\t" + - "Message: {3}\n\t" + - "Error: {4}", - usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0} - (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1} - (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2} - usrMsg.Content,// {3} - result.ErrorReason, // {4} - sw.Elapsed.TotalSeconds // {5} - ); - } - }); + return; - return Task.CompletedTask; + if (usrMsg.Author.IsBot) //no bots + return; + + var guild = (msg.Channel as ITextChannel)?.Guild; + + if (guild != null && guild.OwnerId != usrMsg.Author.Id) + { + if (Permissions.FilterCommands.InviteFilteringChannels.Contains(usrMsg.Channel.Id) || + Permissions.FilterCommands.InviteFilteringServers.Contains(guild.Id)) + { + if (usrMsg.Content.IsDiscordInvite()) + { + try + { + await usrMsg.DeleteAsync().ConfigureAwait(false); + return; + } + catch (HttpException ex) + { + _log.Warn("I do not have permission to filter invites in channel with id " + usrMsg.Channel.Id, ex); + } + } + } + + + var filteredWords = Permissions.FilterCommands.FilteredWordsForChannel(usrMsg.Channel.Id, guild.Id).Concat(Permissions.FilterCommands.FilteredWordsForServer(guild.Id)); + var wordsInMessage = usrMsg.Content.ToLowerInvariant().Split(' '); + if (filteredWords.Any(w => wordsInMessage.Contains(w))) + { + try + { + await usrMsg.DeleteAsync().ConfigureAwait(false); + return; + } + catch (HttpException ex) + { + _log.Warn("I do not have permission to filter words in channel with id " + usrMsg.Channel.Id, ex); + } + } + + BlacklistItem blacklistedItem; + if ((blacklistedItem = Permissions.BlacklistCommands.BlacklistedItems.FirstOrDefault(bi => + (bi.Type == BlacklistItem.BlacklistType.Server && bi.ItemId == guild?.Id) || + (bi.Type == BlacklistItem.BlacklistType.Channel && bi.ItemId == msg.Channel.Id) || + (bi.Type == BlacklistItem.BlacklistType.User && bi.ItemId == usrMsg.Author.Id))) != null) + { + return; + } + } + + + + try + { + bool verbose = false; + Permission rootPerm = null; + string permRole = ""; + if (guild != null) + { + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.PermissionsFor(guild.Id); + verbose = config.VerbosePermissions; + rootPerm = config.RootPermission; + permRole = config.PermissionRole.Trim().ToLowerInvariant(); + } + + + } + + var throwaway = Task.Run(async () => + { + var sw = new Stopwatch(); + sw.Start(); + + try + { + var t = await ExecuteCommand(usrMsg, usrMsg.Content, guild, usrMsg.Author, rootPerm, permRole, MultiMatchHandling.Best); + var command = t.Item1; + var result = t.Item2; + sw.Stop(); + var channel = (usrMsg.Channel as ITextChannel); + if (result.IsSuccess) + { + CommandExecuted(this, new CommandExecutedEventArgs(usrMsg, command)); + _log.Info("Command Executed after {4}s\n\t" + + "User: {0}\n\t" + + "Server: {1}\n\t" + + "Channel: {2}\n\t" + + "Message: {3}", + usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0} + (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1} + (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2} + usrMsg.Content, // {3} + sw.Elapsed.TotalSeconds // {4} + ); + } + else if (!result.IsSuccess && result.Error != CommandError.UnknownCommand) + { + _log.Warn("Command Errored after {5}s\n\t" + + "User: {0}\n\t" + + "Server: {1}\n\t" + + "Channel: {2}\n\t" + + "Message: {3}\n\t" + + "Error: {4}", + usrMsg.Author + " [" + usrMsg.Author.Id + "]", // {0} + (channel == null ? "PRIVATE" : channel.Guild.Name + " [" + channel.Guild.Id + "]"), // {1} + (channel == null ? "PRIVATE" : channel.Name + " [" + channel.Id + "]"), // {2} + usrMsg.Content,// {3} + result.ErrorReason, // {4} + sw.Elapsed.TotalSeconds // {5} + ); + if (guild != null && command != null && result.Error == CommandError.Exception) + { + if (verbose) + await msg.Channel.SendMessageAsync(":warning: " + result.ErrorReason).ConfigureAwait(false); + } + } + else + { + if (msg.Channel is IPrivateChannel) + { + await msg.Channel.SendMessageAsync(Help.DMHelpString).ConfigureAwait(false); + } + } + } + catch (Exception ex) + { + _log.Warn(ex, "Error in CommandHandler"); + if (ex.InnerException != null) + _log.Warn(ex.InnerException, "Inner Exception of the error in CommandHandler"); + } + }); + } + catch (Exception ex) + { + _log.Error(ex, "Error in the outter scope of the commandhandler."); + if (ex.InnerException != null) + _log.Error(ex.InnerException, "Inner exception: "); + } + } + + public async Task> ExecuteCommand(IUserMessage message, string input, IGuild guild, IUser user, Permission rootPerm, string permRole, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Best) { + var searchResult = _commandService.Search(message, input); + if (!searchResult.IsSuccess) + return new Tuple(null, searchResult); + + var commands = searchResult.Commands; + for (int i = commands.Count - 1; i >= 0; i--) + { + var preconditionResult = await commands[i].CheckPreconditions(message); + if (!preconditionResult.IsSuccess) + { + if (commands.Count == 1) + return new Tuple(null, searchResult); + else + continue; + } + + var parseResult = await commands[i].Parse(message, searchResult, preconditionResult); + if (!parseResult.IsSuccess) + { + if (parseResult.Error == CommandError.MultipleMatches) + { + TypeReaderValue[] argList, paramList; + switch (multiMatchHandling) + { + case MultiMatchHandling.Best: + argList = parseResult.ArgValues.Select(x => x.Values.OrderByDescending(y => y.Score).First()).ToArray(); + paramList = parseResult.ParamValues.Select(x => x.Values.OrderByDescending(y => y.Score).First()).ToArray(); + parseResult = ParseResult.FromSuccess(argList, paramList); + break; + } + } + + if (!parseResult.IsSuccess) + { + if (commands.Count == 1) + return new Tuple(null, parseResult); + else + continue; + } + } + var cmd = commands[i]; + //check permissions + if (guild != null) + { + int index; + if (!rootPerm.AsEnumerable().CheckPermissions(message, cmd.Text, cmd.Module.Name, out index)) + { + var returnMsg = $"Permission number #{index + 1} **{rootPerm.GetAt(index).GetCommand()}** is preventing this action."; + return new Tuple(cmd, SearchResult.FromError(CommandError.Exception, returnMsg)); + } + + + if (cmd.Module.Source.Name == typeof(Permissions).Name) //permissions, you must have special role + { + if (!((IGuildUser)user).Roles.Any(r => r.Name.Trim().ToLowerInvariant() == permRole)) + { + return new Tuple(cmd, SearchResult.FromError(CommandError.Exception, $"You need the **{permRole}** role in order to use permission commands.")); + } + } + } + + + if (CmdCdsCommands.HasCooldown(cmd, guild, user)) + return new Tuple(cmd, SearchResult.FromError(CommandError.Exception, $"That command is on cooldown for you.")); + + return new Tuple(commands[i], await commands[i].Execute(message, parseResult)); + } + + return new Tuple(null, SearchResult.FromError(CommandError.UnknownCommand, "This input does not match any overload.")); } } diff --git a/src/NadekoBot/Services/CurrencyHandler.cs b/src/NadekoBot/Services/CurrencyHandler.cs index f2834589..2c0128b3 100644 --- a/src/NadekoBot/Services/CurrencyHandler.cs +++ b/src/NadekoBot/Services/CurrencyHandler.cs @@ -13,6 +13,16 @@ namespace NadekoBot.Services public static class CurrencyHandler { public static async Task RemoveCurrencyAsync(IGuildUser author, string reason, long amount, bool sendMessage) + { + var success = await RemoveCurrencyAsync(author.Id, reason, amount); + + if (success && sendMessage) + try { await author.SendMessageAsync($"`You lost:` {amount} {Gambling.CurrencySign}\n`Reason:` {reason}").ConfigureAwait(false); } catch { } + + return success; + } + + public static async Task RemoveCurrencyAsync(ulong authorId, string reason, long amount) { if (amount < 0) throw new ArgumentNullException(nameof(amount)); @@ -20,15 +30,12 @@ namespace NadekoBot.Services using (var uow = DbHandler.UnitOfWork()) { - var success = uow.Currency.TryUpdateState(author.Id, -amount); + var success = uow.Currency.TryUpdateState(authorId, -amount); if (!success) return false; - await uow.CompleteAsync(); + await uow.CompleteAsync().ConfigureAwait(false); } - if (sendMessage) - try { await author.SendMessageAsync($"`You lost:` {amount} {Gambling.CurrencySign}\n`Reason:` {reason}").ConfigureAwait(false); } catch { } - return true; } @@ -37,7 +44,7 @@ namespace NadekoBot.Services await AddCurrencyAsync(author.Id, reason, amount); if (sendMessage) - await author.SendMessageAsync($"`You received:` {amount} {Gambling.CurrencySign}\n`Reason:` {reason}").ConfigureAwait(false); + try { await author.SendMessageAsync($"`You received:` {amount} {Gambling.CurrencySign}\n`Reason:` {reason}").ConfigureAwait(false); } catch { } } public static async Task AddCurrencyAsync(ulong receiverId, string reason, long amount) diff --git a/src/NadekoBot/Services/Database/IUnitOfWork.cs b/src/NadekoBot/Services/Database/IUnitOfWork.cs index 14719461..68d99b0e 100644 --- a/src/NadekoBot/Services/Database/IUnitOfWork.cs +++ b/src/NadekoBot/Services/Database/IUnitOfWork.cs @@ -9,6 +9,8 @@ namespace NadekoBot.Services.Database { public interface IUnitOfWork : IDisposable { + NadekoContext _context { get; } + IQuoteRepository Quotes { get; } IGuildConfigRepository GuildConfigs { get; } IDonatorsRepository Donators { get; } @@ -18,6 +20,10 @@ namespace NadekoBot.Services.Database IBotConfigRepository BotConfig { get; } IRepeaterRepository Repeaters { get; } IUnitConverterRepository ConverterUnits { get; } + ICustomReactionRepository CustomReactions { get; } + ICurrencyRepository Currency { get; } + ITypingArticlesRepository TypingArticles { get; } + IMusicPlaylistRepository MusicPlaylists { get; } int Complete(); Task CompleteAsync(); diff --git a/src/NadekoBot/Services/Database/Models/BotConfig.cs b/src/NadekoBot/Services/Database/Models/BotConfig.cs index acb5d199..39bb8e38 100644 --- a/src/NadekoBot/Services/Database/Models/BotConfig.cs +++ b/src/NadekoBot/Services/Database/Models/BotConfig.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations.Schema; @@ -19,7 +20,7 @@ namespace NadekoBot.Services.Database.Models public float CurrencyGenerationChance { get; set; } = 0.02f; public int CurrencyGenerationCooldown { get; set; } = 10; - public List ModulePrefixes { get; set; } = new List(); + public HashSet ModulePrefixes { get; set; } = new HashSet(); public List RotatingStatusMessages { get; set; } = new List(); @@ -31,8 +32,24 @@ namespace NadekoBot.Services.Database.Models public string CurrencyName { get; set; } = "Nadeko Flower"; public string CurrencyPluralName { get; set; } = "Nadeko Flowers"; - public List EightBallResponses { get; set; } = new List(); - public List RaceAnimals { get; set; } = new List(); + public HashSet EightBallResponses { get; set; } = new HashSet(); + public HashSet RaceAnimals { get; set; } = new HashSet(); + + public string DMHelpString { get; set; } = "Type `-h` for help."; + public string HelpString { get; set; } = @"To add me to your server, use this link -> +You can use `{1}modules` command to see a list of all modules. +You can use `{1}commands ModuleName` +(for example `{1}commands Administration`) to see a list of all of the commands in that module. +For a specific command help, use `{1}h CommandName` (for example {1}h !!q) + + +**LIST OF COMMANDS CAN BE FOUND ON THIS LINK** + + + +Nadeko Support Server: https://discord.gg/0ehQwTK2RBjAxzEY"; + + public int MigrationVersion { get; set; } } public class PlayingStatus :DbEntity @@ -43,6 +60,8 @@ namespace NadekoBot.Services.Database.Models public class BlacklistItem : DbEntity { public ulong ItemId { get; set; } + public BlacklistType Type { get; set; } + public enum BlacklistType { Server, diff --git a/src/NadekoBot/Services/Database/Models/CommandCooldown.cs b/src/NadekoBot/Services/Database/Models/CommandCooldown.cs new file mode 100644 index 00000000..e5048f70 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/CommandCooldown.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Models +{ + public class CommandCooldown : DbEntity + { + public int Seconds { get; set; } + public string CommandName { get; set; } + } +} diff --git a/src/NadekoBot/Services/Database/Models/CustomReaction.cs b/src/NadekoBot/Services/Database/Models/CustomReaction.cs new file mode 100644 index 00000000..3b436060 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/CustomReaction.cs @@ -0,0 +1,28 @@ +using Discord; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Models +{ + public class CustomReaction : DbEntity + { + public ulong? GuildId { get; set; } + [NotMapped] + public Regex Regex { get; set; } + public string Response { get; set; } + public string Trigger { get; set; } + public bool IsRegex { get; set; } + public bool OwnerOnly { get; set; } + public override string ToString() => $"`#{Id}` `Trigger:` {Trigger}\n `Response:` {Response}"; + } + + public class ReactionResponse : DbEntity + { + public bool OwnerOnly { get; set; } + public string Text { get; set; } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Services/Database/Models/GuildConfig.cs b/src/NadekoBot/Services/Database/Models/GuildConfig.cs index ada21e94..cc0c87ee 100644 --- a/src/NadekoBot/Services/Database/Models/GuildConfig.cs +++ b/src/NadekoBot/Services/Database/Models/GuildConfig.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; @@ -37,9 +38,34 @@ namespace NadekoBot.Services.Database.Models public bool VoicePlusTextEnabled { get; set; } //stream notifications - public List FollowedStreams { get; set; } = new List(); + public HashSet FollowedStreams { get; set; } = new HashSet(); //currencyGeneration public ulong? GenerateCurrencyChannelId { get; set; } + + //permissions + public Permission RootPermission { get; set; } + public bool VerbosePermissions { get; set; } = true; + public string PermissionRole { get; set; } = "Nadeko"; + + public HashSet CommandCooldowns { get; set; } = new HashSet(); + + //filtering + public bool FilterInvites { get; set; } + public HashSet FilterInvitesChannelIds { get; set; } = new HashSet(); + + public bool FilterWords { get; set; } + public HashSet FilteredWords { get; set; } = new HashSet(); + public HashSet FilterWordsChannelIds { get; set; } = new HashSet(); + } + + public class FilterChannelId :DbEntity + { + public ulong ChannelId { get; set; } + } + + public class FilteredWord :DbEntity + { + public string Word { get; set; } } } diff --git a/src/NadekoBot/Services/Database/Models/LogSetting.cs b/src/NadekoBot/Services/Database/Models/LogSetting.cs index a02cfcbc..02a97858 100644 --- a/src/NadekoBot/Services/Database/Models/LogSetting.cs +++ b/src/NadekoBot/Services/Database/Models/LogSetting.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; @@ -10,9 +11,8 @@ namespace NadekoBot.Services.Database.Models { public bool IsLogging { get; set; } public ulong ChannelId { get; set; } - public HashSet IgnoredChannels { get; set; } + public ConcurrentHashSet IgnoredChannels { get; set; } - public bool MessageReceived { get; set; } = true; public bool MessageUpdated { get; set; } = true; public bool MessageDeleted { get; set; } = true; diff --git a/src/NadekoBot/Services/Database/Models/MusicPlaylist.cs b/src/NadekoBot/Services/Database/Models/MusicPlaylist.cs new file mode 100644 index 00000000..d14d3c01 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/MusicPlaylist.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Models +{ + public class MusicPlaylist : DbEntity + { + public string Name { get; set; } + public string Author { get; set; } + public ulong AuthorId { get; set; } + public List Songs { get; set; } + } +} diff --git a/src/NadekoBot/Services/Database/Models/Permission.cs b/src/NadekoBot/Services/Database/Models/Permission.cs new file mode 100644 index 00000000..b88de0d3 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/Permission.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Models +{ + [DebuggerDisplay("{global::NadekoBot.Modules.Permissions.PermissionExtensions.GetCommand(this)}", Target = typeof(Permission))] + public class Permission : DbEntity + { + public Permission Previous { get; set; } = null; + public Permission Next { get; set; } = null; + + public PrimaryPermissionType PrimaryTarget { get; set; } + public ulong PrimaryTargetId { get; set; } + + public SecondaryPermissionType SecondaryTarget { get; set; } + public string SecondaryTargetName { get; set; } + + public bool State { get; set; } + + [NotMapped] + private static Permission AllowAllPerm => new Permission() + { + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = true, + }; + [NotMapped] + private static Permission BlockNsfwPerm => new Permission() + { + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = "nsfw", + State = false, + }; + + public static Permission GetDefaultRoot() + { + var root = AllowAllPerm; + var blockNsfw = BlockNsfwPerm; + + root.Previous = blockNsfw; + blockNsfw.Next = root; + + return blockNsfw; + } + + public Permission Clone() => new Permission() + { + PrimaryTarget = PrimaryTarget, + SecondaryTarget = SecondaryTarget, + PrimaryTargetId = PrimaryTargetId, + SecondaryTargetName = SecondaryTargetName, + State = State, + }; + } + + public enum PrimaryPermissionType + { + User, + Channel, + Role, + Server + } + + public enum SecondaryPermissionType + { + Module, + Command, + AllModules + } +} diff --git a/src/NadekoBot/Services/Database/Models/PlaylistSong.cs b/src/NadekoBot/Services/Database/Models/PlaylistSong.cs new file mode 100644 index 00000000..166bedd0 --- /dev/null +++ b/src/NadekoBot/Services/Database/Models/PlaylistSong.cs @@ -0,0 +1,18 @@ +using NadekoBot.Modules.Music.Classes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Models +{ + public class PlaylistSong : DbEntity + { + public string Provider { get; set; } + public MusicType ProviderType { get; set; } + public string Title { get; set; } + public string Uri { get; set; } + public string Query { get; set; } + } +} diff --git a/src/NadekoBot/Services/Database/NadekoContext.cs b/src/NadekoBot/Services/Database/NadekoContext.cs index b2da1c17..83fc449e 100644 --- a/src/NadekoBot/Services/Database/NadekoContext.cs +++ b/src/NadekoBot/Services/Database/NadekoContext.cs @@ -22,6 +22,8 @@ namespace NadekoBot.Services.Database public DbSet Currency { get; set; } public DbSet ConversionUnits { get; set; } public DbSet TypingArticles { get; set; } + public DbSet MusicPlaylists { get; set; } + public DbSet CustomReactions { get; set; } //logging public DbSet LogSettings { get; set; } @@ -35,8 +37,8 @@ namespace NadekoBot.Services.Database public NadekoContext() { - this.Database.Migrate(); - EnsureSeedData(); + this.Database.Migrate(); + EnsureSeedData(); } public void EnsureSeedData() @@ -45,7 +47,7 @@ namespace NadekoBot.Services.Database { var bc = new BotConfig(); - bc.ModulePrefixes.AddRange(new HashSet() + bc.ModulePrefixes.AddRange(new ConcurrentHashSet() { new ModulePrefix() { ModuleName = "Administration", Prefix = "." }, new ModulePrefix() { ModuleName = "Searches", Prefix = "~" }, @@ -59,9 +61,10 @@ namespace NadekoBot.Services.Database new ModulePrefix() { ModuleName = "Gambling", Prefix = "$" }, new ModulePrefix() { ModuleName = "Permissions", Prefix = ";" }, new ModulePrefix() { ModuleName = "Pokemon", Prefix = ">" }, - new ModulePrefix() { ModuleName = "Utility", Prefix = "." } + new ModulePrefix() { ModuleName = "Utility", Prefix = "." }, + new ModulePrefix() { ModuleName = "CustomReactions", Prefix = "." } }); - bc.RaceAnimals.AddRange(new HashSet + bc.RaceAnimals.AddRange(new ConcurrentHashSet { new RaceAnimal { Icon = "🐼", Name = "Panda" }, new RaceAnimal { Icon = "🐻", Name = "Bear" }, @@ -72,7 +75,7 @@ namespace NadekoBot.Services.Database new RaceAnimal { Icon = "🦀", Name = "Crab" }, new RaceAnimal { Icon = "🦄", Name = "Unicorn" } }); - bc.EightBallResponses.AddRange(new HashSet + bc.EightBallResponses.AddRange(new ConcurrentHashSet { new EightBallResponse() { Text = "Most definitely yes" }, new EightBallResponse() { Text = "For sure" }, @@ -181,6 +184,14 @@ namespace NadekoBot.Services.Database .IsUnique(); #endregion + #region Permission + var permissionEntity = modelBuilder.Entity(); + permissionEntity + .HasOne(p => p.Next) + .WithOne(p => p.Previous) + .IsRequired(false); + #endregion + #region LogSettings //var logSettingEntity = modelBuilder.Entity(); @@ -194,6 +205,17 @@ namespace NadekoBot.Services.Database // .HasMany(ls => ls.IgnoredVoicePresenceChannelIds) // .WithOne(ls => ls.LogSetting); #endregion + + #region MusicPlaylists + var musicPlaylistEntity = modelBuilder.Entity(); + + musicPlaylistEntity + .HasMany(p => p.Songs) + .WithOne() + .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Cascade); + + + #endregion } protected abstract override void OnConfiguring(DbContextOptionsBuilder optionsBuilder); } diff --git a/src/NadekoBot/Services/Database/Repositories/ICustomReactionRepository.cs b/src/NadekoBot/Services/Database/Repositories/ICustomReactionRepository.cs new file mode 100644 index 00000000..a5daccfc --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/ICustomReactionRepository.cs @@ -0,0 +1,14 @@ +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Repositories +{ + public interface ICustomReactionRepository : IRepository + { + + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs index 82767a80..e6797de1 100644 --- a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs @@ -11,6 +11,8 @@ namespace NadekoBot.Services.Database.Repositories public interface IGuildConfigRepository : IRepository { GuildConfig For(ulong guildId); + GuildConfig PermissionsFor(ulong guildId); + void SetNewRootPermission(ulong guildId, Permission p); IEnumerable GetAllFollowedStreams(); } } diff --git a/src/NadekoBot/Services/Database/Repositories/IMusicPlaylistRepository.cs b/src/NadekoBot/Services/Database/Repositories/IMusicPlaylistRepository.cs new file mode 100644 index 00000000..58c870c8 --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/IMusicPlaylistRepository.cs @@ -0,0 +1,15 @@ +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Services.Database.Repositories +{ + public interface IMusicPlaylistRepository : IRepository + { + List GetPlaylistsOnPage(int num); + MusicPlaylist GetWithSongs(int id); + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs b/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs index 3bbef352..f119fb1e 100644 --- a/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs @@ -9,7 +9,7 @@ namespace NadekoBot.Services.Database.Repositories { public interface IQuoteRepository : IRepository { - IEnumerable GetAllQuotesByKeyword(string keyword); + IEnumerable GetAllQuotesByKeyword(ulong guildId, string keyword); Task GetRandomQuoteByKeywordAsync(ulong guildId, string keyword); } } diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/CustomReactionRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/CustomReactionRepository.cs new file mode 100644 index 00000000..f4c1b5d2 --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/Impl/CustomReactionRepository.cs @@ -0,0 +1,17 @@ +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; + +namespace NadekoBot.Services.Database.Repositories.Impl +{ + public class CustomReactionsRepository : Repository, ICustomReactionRepository + { + public CustomReactionsRepository(DbContext context) : base(context) + { + } + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs index 3ff0b7e6..b15d8ab8 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using NadekoBot.Modules.Permissions; namespace NadekoBot.Services.Database.Repositories.Impl { @@ -19,6 +20,14 @@ namespace NadekoBot.Services.Database.Repositories.Impl .ThenInclude(ls => ls.IgnoredChannels) .Include(gc => gc.LogSetting) .ThenInclude(ls => ls.IgnoredVoicePresenceChannelIds) + .Include(gc => gc.RootPermission) + .ThenInclude(gc => gc.Previous) + .Include(gc => gc.RootPermission) + .ThenInclude(gc => gc.Next) + .Include(gc => gc.FilterInvitesChannelIds) + .Include(gc => gc.FilterWordsChannelIds) + .Include(gc => gc.FilteredWords) + .Include(gc => gc.CommandCooldowns) .ToList(); /// @@ -30,14 +39,48 @@ namespace NadekoBot.Services.Database.Repositories.Impl { var config = _set.Include(gc => gc.FollowedStreams) .Include(gc => gc.LogSetting) - .ThenInclude(ls=>ls.IgnoredChannels) - .FirstOrDefault(c => c.GuildId == guildId); + .ThenInclude(ls => ls.IgnoredChannels) + .Include(gc => gc.LogSetting) + .ThenInclude(ls => ls.IgnoredVoicePresenceChannelIds) + .Include(gc => gc.FilterInvitesChannelIds) + .Include(gc => gc.FilterWordsChannelIds) + .Include(gc => gc.FilteredWords) + .Include(gc => gc.CommandCooldowns) + .FirstOrDefault(c => c.GuildId == guildId); if (config == null) { _set.Add((config = new GuildConfig { - GuildId = guildId + GuildId = guildId, + RootPermission = Permission.GetDefaultRoot(), + })); + _context.SaveChanges(); + } + return config; + } + + public GuildConfig PermissionsFor(ulong guildId) + { + var query = _set.Include(gc => gc.RootPermission); + + //todo this is possibly a disaster for performance + //What i could do instead is count the number of permissions in the permission table for this guild + // and make a for loop with those. + // or just select permissions for this guild and manually chain them + for (int i = 0; i < 60; i++) + { + query = query.ThenInclude(gc => gc.Next); + } + + var config = query.FirstOrDefault(c => c.GuildId == guildId); + + if (config == null) + { + _set.Add((config = new GuildConfig + { + GuildId = guildId, + RootPermission = Permission.GetDefaultRoot(), })); _context.SaveChanges(); } @@ -48,5 +91,15 @@ namespace NadekoBot.Services.Database.Repositories.Impl _set.Include(gc => gc.FollowedStreams) .SelectMany(gc => gc.FollowedStreams) .ToList(); + + public void SetNewRootPermission(ulong guildId, Permission p) + { + var data = _set + .Include(gc => gc.RootPermission) + .FirstOrDefault(gc => gc.GuildId == guildId); + + data.RootPermission.Prepend(p); + data.RootPermission = p; + } } } diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/MusicPlaylistRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/MusicPlaylistRepository.cs new file mode 100644 index 00000000..572461ce --- /dev/null +++ b/src/NadekoBot/Services/Database/Repositories/Impl/MusicPlaylistRepository.cs @@ -0,0 +1,32 @@ +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; + +namespace NadekoBot.Services.Database.Repositories.Impl +{ + public class MusicPlaylistRepository : Repository, IMusicPlaylistRepository + { + public MusicPlaylistRepository(DbContext context) : base(context) + { + } + + public List GetPlaylistsOnPage(int num) + { + if (num < 1) + throw new IndexOutOfRangeException(); + + return _set.Skip((num - 1) * 20) + .Take(20) + .Include(pl => pl.Songs) + .ToList(); + } + + public MusicPlaylist GetWithSongs(int id) => + _set.Include(mpl => mpl.Songs) + .FirstOrDefault(mpl => mpl.Id == id); + } +} diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs index 702cfc21..35e9bd0e 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs @@ -15,13 +15,13 @@ namespace NadekoBot.Services.Database.Repositories.Impl { } - public IEnumerable GetAllQuotesByKeyword(string keyword) => - _set.Where(q => q.Keyword == keyword); + public IEnumerable GetAllQuotesByKeyword(ulong guildId, string keyword) => + _set.Where(q => q.GuildId == guildId && q.Keyword == keyword); public Task GetRandomQuoteByKeywordAsync(ulong guildId, string keyword) { var rng = new NadekoRandom(); - return _set.Where(q => q.Keyword == keyword).OrderBy(q => rng.Next()).FirstOrDefaultAsync(); + return _set.Where(q => q.GuildId == guildId && q.Keyword == keyword).OrderBy(q => rng.Next()).FirstOrDefaultAsync(); } } } diff --git a/src/NadekoBot/Services/Database/UnitOfWork.cs b/src/NadekoBot/Services/Database/UnitOfWork.cs index 7a4c9520..7079b9ee 100644 --- a/src/NadekoBot/Services/Database/UnitOfWork.cs +++ b/src/NadekoBot/Services/Database/UnitOfWork.cs @@ -10,7 +10,7 @@ namespace NadekoBot.Services.Database { public class UnitOfWork : IUnitOfWork { - private NadekoContext _context; + public NadekoContext _context { get; } private IQuoteRepository _quotes; public IQuoteRepository Quotes => _quotes ?? (_quotes = new QuoteRepository(_context)); @@ -38,12 +38,19 @@ namespace NadekoBot.Services.Database private ICurrencyRepository _currency; public ICurrencyRepository Currency => _currency ?? (_currency = new CurrencyRepository(_context)); + private IUnitConverterRepository _conUnits; public IUnitConverterRepository ConverterUnits => _conUnits ?? (_conUnits = new UnitConverterRepository(_context)); private ITypingArticlesRepository _typingArticles; public ITypingArticlesRepository TypingArticles => _typingArticles ?? (_typingArticles = new TypingArticlesRepository(_context)); + private IMusicPlaylistRepository _musicPlaylists; + public IMusicPlaylistRepository MusicPlaylists => _musicPlaylists ?? (_musicPlaylists = new MusicPlaylistRepository(_context)); + + private ICustomReactionRepository _customReactions; + public ICustomReactionRepository CustomReactions => _customReactions ?? (_customReactions = new CustomReactionsRepository(_context)); + public UnitOfWork(NadekoContext context) { _context = context; diff --git a/src/NadekoBot/Services/DbHandler.cs b/src/NadekoBot/Services/DbHandler.cs index 76437166..ee1833dd 100644 --- a/src/NadekoBot/Services/DbHandler.cs +++ b/src/NadekoBot/Services/DbHandler.cs @@ -36,10 +36,10 @@ namespace NadekoBot.Services public NadekoContext GetDbContext() => Activator.CreateInstance(dbType) as NadekoContext; - public UnitOfWork GetUnitOfWork() => + public IUnitOfWork GetUnitOfWork() => new UnitOfWork(GetDbContext()); - public static UnitOfWork UnitOfWork() => + public static IUnitOfWork UnitOfWork() => DbHandler.Instance.GetUnitOfWork(); } } diff --git a/src/NadekoBot/Services/IBotCredentials.cs b/src/NadekoBot/Services/IBotCredentials.cs index 385b0e27..64b5f7d7 100644 --- a/src/NadekoBot/Services/IBotCredentials.cs +++ b/src/NadekoBot/Services/IBotCredentials.cs @@ -6,7 +6,9 @@ namespace NadekoBot.Services { public interface IBotCredentials { - string ClientId { get; } + ulong ClientId { get; } + ulong BotId { get; } + string Token { get; } string GoogleApiKey { get; } ulong[] OwnerIds { get; } diff --git a/src/NadekoBot/Services/Impl/BotCredentials.cs b/src/NadekoBot/Services/Impl/BotCredentials.cs index 23e4fcb9..9343efd9 100644 --- a/src/NadekoBot/Services/Impl/BotCredentials.cs +++ b/src/NadekoBot/Services/Impl/BotCredentials.cs @@ -12,7 +12,8 @@ namespace NadekoBot.Services.Impl { private Logger _log; - public string ClientId { get; } + public ulong ClientId { get; } + public ulong BotId { get; } public string GoogleApiKey { get; } @@ -27,6 +28,7 @@ namespace NadekoBot.Services.Impl public string SoundCloudClientId { get; } public DB Db { get; } + public int TotalShards { get; } public BotCredentials() { @@ -40,18 +42,26 @@ namespace NadekoBot.Services.Impl GoogleApiKey = cm.GoogleApiKey; MashapeKey = cm.MashapeKey; OsuApiKey = cm.OsuApiKey; - SoundCloudClientId = cm.SoundCloudClientId; + TotalShards = cm.TotalShards < 1 ? 1 : cm.TotalShards; + BotId = cm.BotId ?? cm.ClientId; + ClientId = cm.ClientId; if (cm.Db == null) Db = new DB("sqlite", ""); else Db = new DB(cm.Db.Type, cm.Db.ConnectionString); } else - _log.Fatal("credentials.json is missing. Failed to start."); + { + File.WriteAllText("./credentials_example.json", JsonConvert.SerializeObject(new CredentialsModel(), Formatting.Indented)); + _log.Fatal($"credentials.json is missing. Failed to start. Example written to {Path.GetFullPath("./credentials_example.json")}"); + throw new FileNotFoundException(); + } } private class CredentialsModel { + public ulong ClientId { get; set; } + public ulong? BotId { get; set; } public string Token { get; set; } public ulong[] OwnerIds { get; set; } public string LoLApiKey { get; set; } @@ -60,6 +70,7 @@ namespace NadekoBot.Services.Impl public string OsuApiKey { get; set; } public string SoundCloudClientId { get; set; } public DB Db { get; set; } + public int TotalShards { get; set; } = 1; } private class DbModel diff --git a/src/NadekoBot/Services/Impl/StatsService.cs b/src/NadekoBot/Services/Impl/StatsService.cs index 3d33bb9f..a2ec5b65 100644 --- a/src/NadekoBot/Services/Impl/StatsService.cs +++ b/src/NadekoBot/Services/Impl/StatsService.cs @@ -13,7 +13,7 @@ namespace NadekoBot.Services.Impl public class StatsService : IStatsService { private int messageCounter; - private DiscordSocketClient client; + private ShardedDiscordClient client; private DateTime started; private int commandsRan = 0; @@ -22,7 +22,7 @@ namespace NadekoBot.Services.Impl public string Heap => Math.Round((double)GC.GetTotalMemory(false) / 1.MiB(), 2).ToString(); - public StatsService(DiscordSocketClient client, CommandHandler cmdHandler) + public StatsService(ShardedDiscordClient client, CommandHandler cmdHandler) { this.client = client; @@ -33,14 +33,18 @@ namespace NadekoBot.Services.Impl this.client.Disconnected += _ => Reset(); } - public Task Print() => Task.FromResult($@"`Author: Kwoth` `Library: Discord.Net` + public Task Print() + { + var curUser = client.GetCurrentUser(); + return Task.FromResult($@"`Author: Kwoth` `Library: Discord.Net` `Bot Version: {BotVersion}` -`Bot id: {(client.GetCurrentUser()).Id}` +`Bot id: {curUser.Id}` `Owners' Ids: {string.Join(", ", NadekoBot.Credentials.OwnerIds)}` `Uptime: {GetUptimeString()}` `Servers: {client.GetGuilds().Count} | TextChannels: {client.GetGuilds().SelectMany(g => g.GetChannels().Where(c => c is ITextChannel)).Count()} | VoiceChannels: {client.GetGuilds().SelectMany(g => g.GetChannels().Where(c => c is IVoiceChannel)).Count()}` `Commands Ran this session: {commandsRan}` `Messages: {messageCounter} ({messageCounter / (double)GetUptime().TotalSeconds:F2}/sec)` `Heap: {Heap} MB`"); + } public Task Reset() { diff --git a/src/NadekoBot/ShardedDiscordClient.cs b/src/NadekoBot/ShardedDiscordClient.cs new file mode 100644 index 00000000..6e454a4e --- /dev/null +++ b/src/NadekoBot/ShardedDiscordClient.cs @@ -0,0 +1,83 @@ +using Discord; +using Discord.WebSocket; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord.API; +using Discord.Logging; +using System.IO; + +namespace NadekoBot +{ + public class ShardedDiscordClient + { + private DiscordSocketConfig discordSocketConfig; + + public Func UserJoined { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func MessageReceived { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func UserLeft { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func UserUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func, IMessage, Task> MessageUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func, Task> MessageDeleted { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func UserBanned { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func UserUnbanned { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func UserPresenceUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func UserVoiceStateUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func ChannelCreated { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func ChannelDestroyed { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func ChannelUpdated { get; internal set; } = delegate { return Task.CompletedTask; }; + public Func Disconnected { get; internal set; } = delegate { return Task.CompletedTask; }; + + private IReadOnlyList Clients { get; } + + public ShardedDiscordClient (DiscordSocketConfig discordSocketConfig) + { + this.discordSocketConfig = discordSocketConfig; + + var clientList = new List(); + for (int i = 0; i < discordSocketConfig.TotalShards; i++) + { + discordSocketConfig.ShardId = i; + var client = new DiscordSocketClient(discordSocketConfig); + clientList.Add(client); + client.UserJoined += async arg1 => await UserJoined(arg1); + client.MessageReceived += async arg1 => await MessageReceived(arg1); + client.UserLeft += async arg1 => await UserLeft(arg1); + client.UserUpdated += async (arg1, gu2) => await UserUpdated(arg1, gu2); + client.MessageUpdated += async (arg1, m2) => await MessageUpdated(arg1, m2); + client.MessageDeleted += async (arg1, arg2) => await MessageDeleted(arg1, arg2); + client.UserBanned += async (arg1, arg2) => await UserBanned(arg1, arg2); + client.UserPresenceUpdated += async (arg1, arg2, arg3) => await UserPresenceUpdated(arg1, arg2, arg3); + client.UserVoiceStateUpdated += async (arg1, arg2, arg3) => await UserVoiceStateUpdated(arg1, arg2, arg3); + client.ChannelCreated += async arg => await ChannelCreated(arg); + client.ChannelDestroyed += async arg => await ChannelDestroyed(arg); + client.ChannelUpdated += async (arg1, arg2) => await ChannelUpdated(arg1, arg2); + } + + Clients = clientList.AsReadOnly(); + } + + public ISelfUser GetCurrentUser() => + Clients.Select(c => c.GetCurrentUser()).FirstOrDefault(u => u != null); + + public IReadOnlyCollection GetGuilds() => + Clients.SelectMany(c => c.GetGuilds()).ToArray(); + + public IGuild GetGuild(ulong id) => + Clients.Select(c => c.GetGuild(id)).FirstOrDefault(g => g != null); + + public Task GetDMChannelAsync(ulong channelId) => + Clients.Select(async c => await c.GetDMChannelAsync(channelId).ConfigureAwait(false)).FirstOrDefault(c => c != null); + + internal Task LoginAsync(TokenType tokenType, string token) => + Task.WhenAll(Clients.Select(c => c.LoginAsync(tokenType, token))); + + internal Task ConnectAsync() => + Task.WhenAll(Clients.Select(c => c.ConnectAsync())); + + internal Task DownloadAllUsersAsync() => + Task.WhenAll(Clients.Select(c => c.DownloadAllUsersAsync())); + } +} diff --git a/src/NadekoBot/TypeReaders/GuildTypeReader.cs b/src/NadekoBot/TypeReaders/GuildTypeReader.cs new file mode 100644 index 00000000..8863aa00 --- /dev/null +++ b/src/NadekoBot/TypeReaders/GuildTypeReader.cs @@ -0,0 +1,27 @@ +using Discord.Commands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord; +using Discord.WebSocket; + +namespace NadekoBot.TypeReaders +{ + public class GuildTypeReader : TypeReader + { + public override Task Read(IUserMessage context, string input) + { + input = input.Trim().ToLowerInvariant(); + var guilds = NadekoBot.Client.GetGuilds(); + var guild = guilds.FirstOrDefault(g => g.Id.ToString().Trim().ToLowerInvariant() == input) ?? //by id + guilds.FirstOrDefault(g => g.Name.Trim().ToLowerInvariant() == input); //by name + + if (guild != null) + return Task.FromResult(TypeReaderResult.FromSuccess(guild)); + + return Task.FromResult(TypeReaderResult.FromError(CommandError.ParseFailed, "No guild by that name or Id found")); + } + } +} diff --git a/src/NadekoBot/_Extensions/Extensions.cs b/src/NadekoBot/_Extensions/Extensions.cs index 98a1be46..d73eab9b 100644 --- a/src/NadekoBot/_Extensions/Extensions.cs +++ b/src/NadekoBot/_Extensions/Extensions.cs @@ -23,6 +23,11 @@ namespace NadekoBot.Extensions http.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); } + public static bool IsInteger(this decimal number) => number == Math.Truncate(number); + + public static string SanitizeMentions(this string str) => + str.Replace("@everyone", "@everyοne").Replace("@here", "@һere"); + public static double UnixTimestamp(this DateTime dt) => dt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds; public static async Task SendMessageAsync(this IGuildUser user, string message, bool isTTS = false) => @@ -298,5 +303,10 @@ namespace NadekoBot.Extensions imageStream.Position = 0; return imageStream; } + + private static readonly Regex filterRegex = new Regex(@"(?:discord(?:\.gg|app\.com\/invite)\/(?([\w]{16}|(?:[\w]+-?){3})))", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + public static bool IsDiscordInvite(this string str) + => filterRegex.IsMatch(str); } } \ No newline at end of file diff --git a/src/NadekoBot/data/magicitems.json b/src/NadekoBot/data/magicitems.json new file mode 100644 index 00000000..6cf69b83 --- /dev/null +++ b/src/NadekoBot/data/magicitems.json @@ -0,0 +1,314 @@ +[ + { + "Name": "Ace of Spades", + "Description": "An ace of spades from a standard card deck. No matter where you store it on your body, you will always be able to find it in your right sleeve afterwards." + }, + { + "Name": "Arrow of Euarere", + "Description": "A silver arrow, suspended on a string. It always points to the person holding the string." + }, + { + "Name": "Amulet of Extra Amulet Slot", + "Description": "This amulet allows you to gain the benefit from two magical amulets rather than one. It cannot be further enchanted." + }, + { + "Name": "Amulet of Feather Fall", + "Description": "When worn, this amulet turns into a feather and falls to the ground." + }, + { + "Name": "Anti-Matches", + "Description": "A box of matches. Striking one will make it begin to drip water from the tip while the match shrivels away. The amount of water a match releases is about enough to fill a tablespoon." + }, + { + "Name": "The Artist's Bludgeon", + "Description": "Inanimate objects hit with this bludgeon will receive no damage; they will however change color." + }, + { + "Name": "Attentive Guardsman's Pike", + "Description": "These ornate and deadly-looking ceremonial pikes are reach weapons and appear to weigh at least 20 lbs, not counting the weight of the fluttering banners that can be unfurled for parade use. Constructed of shadowstuff, they weigh one pound, and inflict only a single point of damage on an attack, being almost entirely for show, although they also have the unique property of remaining in place when set (although unable to support more than 20 lbs), allowing a 'resting his eyes' guardsman to prop it up and leave it standing under its own power, while his hand sags off of it." + }, + { + "Name": "Attentive Guardsman's Tabard", + "Description": "A dozen of these tabards were fashioned for palace guardsmen in the Empire of Sard, 250 miles from the nearest enemy. The bearer is placed under a glamour that causes him to appear alert and awake, even if his eyes are closed and he is snoring lightly." + }, + { + "Name": "Axe of Big Numbers", + "Description": "This axe shouts \"Big numbers baby, come on!\" whenever it is swung, but always deals 1 damage or less." + }, + { + "Name": "Axe of Empathy", + "Description": "Every time you hit something with this +5 greataxe, you get dealt an equal amount of damage. Both you and the thing you hit are then healed the amount of damage dealt by the axe, even if either are dead. The Axe hopes you have learned your lesson." + }, + { + "Name": "Axe of Pain", + "Description": "The axe is always moaning and groaning with pain." + }, + { + "Name": "Baby Oil", + "Description": "An aphrodisiac made from the finest mashed babies. Strangely unpopular in the upper planes, the judgmental prudes." + }, + { + "Name": "Bag of Faerie Gold", + "Description": "This sack appears to be full of gold coins and jewels. When one attempts to spend them, however, the glamour on them soon vanishes, revealing them to be nothing but leaves and pebbles. Obviously, most shopkeepers will not be happy about this, and no amount of 'we didn't know, I swear!' will change their mind." + }, + { + "Name": "Bag of Holding", + "Description": "This item functions as a normal backpack, however when attempting to retrieve an item, a calm female voice tells them there is a wait time of 4d10 minutes before they can retrieve their item (actual time is stated time plus 6d6 additional minutes). During this wait, the bag plays either annoying muzak or advertisements for the bag's creator's other products/services. Upon attempting to retrieve an item, there is a chance that the wrong item is retrieved, or that the intended item is simply missing. Obtaining the original item requires an additional 4d10+6d6 minutes and has only a 5% chance of success." + }, + { + "Name": "Bag of Holding (Alternate)", + "Description": "This sack needs a hug!" + }, + { + "Name": "Bag of Trading", + "Description": "You can take one thing out of the bag for each object you put in the bag. However, you have no control over what you get, and there are no trade-backs. Past research seems to imply there's some sort of correlation to what gets you what, but it's extremely convoluted and far from understood." + }, + { + "Name": "Bag of Trick", + "Description": "This bag operates like a Bag of Tricks, except it only works once a week and produces a rat each time itis used." + }, + { + "Name": "Bag of Unholding", + "Description": "Quite a large backpack but even the smallest item doesn't fit." + }, + { + "Name": "Bagpipe of Stealth", + "Description": "Grants the user invisibility as long as it is being played." + }, + { + "Name": "Ball of Eyes", + "Description": "A snow-globe filled with miniature eyeballs. When shaken, it grants the user a blurry, jittery vision of some future event." + }, + { + "Name": "Banana Walkie-Talkies", + "Description": "There exist two, and only two, of these items in the world. One of which is possessed by a cranky and lonely half-orc. It appears to be an innocuous wooden banana with a coat of faded yellow paint. When an end (doesn't matter which one) is placed against your ear, you can hear a ringing followed by a *click* and a half-orc yelling at you for waking him up at this ungodly hour. If you drop the banana or \"hang up,\" the call ends. If you stay and listen, the half-orc will yell at you, call out obscenities, and start going on about his daily problems and mishaps in his love life. Every so often (2% chance/day), the banana will ring while you are sleeping and the half-orc will want to talk to you about his problems." + }, + { + "Name": "Barrel of Holding", + "Description": "This large wooden barrel measuring √(12/π) feet in diameter and 5 feet in height can hold up to 15 cubic feet of matter." + }, + { + "Name": "Beam Sword of Severed Nerves", + "Description": "A beam sword. It cannot cut anything but nerve strings. Will pass through any other material leaving no harm." + }, + { + "Name": "Belt of Pants", + "Description": "This belt creates illusory pants on the wearer. The wearer can suppress the illusion at will" + }, + { + "Name": "Belt of Tightening", + "Description": "Every time you put this belt on, all of your clothes permanently shrink a fraction of a millimeter. The effect is compound." + }, + { + "Name": "Belt of Unbathed Breath", + "Description": "When worn around the waist, allows the user to breathe underwater. Does not function when wet." + }, + { + "Name": "Boogie Skeleton", + "Description": "This pile of bones is small, such as one that might be obtained from a bird or a toad, though it can look as though it came from any creature. When a song is sung or played in the vicinity of the skeleton, it begins to dance appropriately. As soon as the music stops, it collapses into the pile of bones again. The skeleton, when dancing, can be no larger than Diminutive." + }, + { + "Name": "Book of Canon", + "Description": "A book that automatically transforms into a copy of the sacred text of any religion, translated into the language the user is most familiar with." + }, + { + "Name": "Book of Confusion", + "Description": "The letters in this book always appear to be upside down, even if viewed from different directions at the same time. The book is a bad novel about zombies." + }, + { + "Name": "Book of Curses", + "Description": "When opened, the book verbally berates anyone in the immediate vicinity, calling into question their combat ability, intellect, personal hygiene, lineage and profession of their mothers, and other delightful insults. Once closed the book continues shouting (although it is muffled) until placed inside a bag or some other similar container for 1d4+1 minutes and ignored. Replying to the book in any other way causes the insults to get louder and more childish the more time you spend replying to it." + }, + { + "Name": "Book of Exalted Deeds", + "Description": "Contains a listing of some of the finest houses ever sold and the specifics of the titles to the properties." + }, + { + "Name": "Boots of Levitation", + "Description": "These boots levitate a few inches off the ground when not worn." + }, + { + "Name": "Boots of Stylishness", + "Description": "Knee high black boots that are always clean and shiny. They never take in water, thus feet are always dry." + }, + { + "Name": "Boots of Walking", + "Description": "The wearer of the boots cannot run, nor can he take a double move action, and takes a -5 to Tumble checks. These boots are made for walkin', and that's just what they'll do." + }, + { + "Name": "Bottle of Air", + "Description": "It's a bottle. Full of air. Congratulations." + }, + { + "Name": "Bottomless Beer Mug", + "Description": "Any liquid poured into this mug treats the bottom as incorporeal, but solid objects don't" + }, + { + "Name": "Bowl of Comfortable Warmth", + "Description": "Any liquid in the bowl will feel comfortably warm, so icy cold water will feel like it's a bit over room temperature. Do note, however, that it's still icy cold water, it just feels warmer." + }, + { + "Name": "Breastplate of Secret Detection", + "Description": "If the wearer of this breastplate gains a piece of information that is somehow connected to the concealment of a hidden conspiracy or plot, a live and still wet red herring forms on the inside of the armor." + }, + { + "Name": "Bullying Gloves", + "Description": "At random intervals, these gloves instil the wearer with a near-irresistible urge to hit themselves." + }, + { + "Name": "Bunyan’s Belt", + "Description": "When worn, causes an enormous, bushy black beard to appear on the wearer’s face." + }, + { + "Name": "Cape of Resistance", + "Description": "When this item is placed on any living thing it somehow manages to fall off, untie itself, slip past the owner’s neck entirely, or otherwise avoid being worn." + }, + { + "Name": "Case of the Litigator", + "Description": "Translates any document placed in the case into legal jargon; non-reversible. Does not confer the ability to understand legal jargon." + }, + { + "Name": "Cat of Schrodinger", + "Description": "When this cat is not being observed in any way it is both dead and alive. When something observes it, it suddenly becomes either dead or alive with a 50% chance of either." + }, + { + "Name": "Chair of Steadiness", + "Description": "This chair can be moved but cannot be tipped over by anything less than a DC 35 Strength check." + }, + { + "Name": "Charles", + "Description": "This small, unremarkable figurine of a gnome refuses to be called anything but Charles. No other name will leave the lips of the speaker. It has no other powers." + }, + { + "Name": "Chime of Interruption", + "Description": "This instrument can be struck once every round, which takes a standard action. On any round the chime is activated the user may ready one action without spending an action to do so." + }, + { + "Name": "Chime of Opening", + "Description": "Commonly affixed to or near doors, when pressed it emits a sound on the interior of the owner’s home to let them know guests have arrived." + }, + { + "Name": "Chime of Opening (Alternate)", + "Description": "When struck against a solid surface, this chime emits a loud click, and opens along its length, to reveal a tiny compartment adequate to conceal a single 'smoke' worth of pipeweed or a blowgun needle. When the compartment is closed, it is seamless and can be detected only with a DC 20 Search check. If hit with an instrument such as a small mallet, it chimes." + }, + { + "Name": "Cloak of Billowing", + "Description": "This black and silver cloak will always billow dramatically behind the wearer, it has no other effects." + }, + { + "Name": "Cloak of Displacement, Minor", + "Description": "This item appears to be a normal cloak, but when worn by a character its magical properties distort and warp reality. When any attack is made against the wearer the cloak has a 20% chance of falling off, no matter how it is secured." + }, + { + "Name": "Compacting hammer", + "Description": "The force imparted by it is multiplied, but is spread around the surface of a struck object facing inward." + }, + { + "Name": "Cymbal of Symbols", + "Description": "This musical instrument enables the user to comprehend dead languages, but only while they are deafened by noise." + }, + { + "Name": "Dagger of Told Secrets", + "Description": "A simple-looking dagger. If used to backstab someone to death, it will whisper your most embarrassing secret to that person." + }, + { + "Name": "Dagger of Untold Secrets", + "Description": "A simple looking dagger. If used to backstab someone to death, it will whisper the most embarrassing secret of that person to you." + }, + { + "Name": "Decanter of Endless Sorrow", + "Description": "A pewter flask that produces limitless alcohol when held to their lips by someone who is troubled. It gets them drunk but they never feel any better." + }, + { + "Name": "Diadem of Brothaurity", + "Description": "When wearing this headpiece, you are as elegant and well-spoken as a famous diplomat or regent, but you can't stop calling everyone bro." + }, + { + "Name": "Enchanted Book of Collected Stories", + "Description": "Opening this will cause miniature creatures/people to pour out and preform a chapter from the book much like a theater." + }, + { + "Name": "Fade to Black Belt", + "Description": "The wearer of this belt will be unable to remember any sexual encounter begun while they were wearing the belt." + }, + { + "Name": "Focusing Ring", + "Description": "The digit on which this ring is worn can be viewed in extremely high definition from a great distance." + }, + { + "Name": "Gloves of Tinkering", + "Description": "Wearing the gloves will make you able to almost repair any broken item. However, you will always end up with pieces from the item that don't seem to fit anywhere." + }, + { + "Name": "Greater Staff of Random Summoning", + "Description": "Summons a random creature at a random place. You could be summoning a giant Ogre on the other side of the globe for all you know." + }, + { + "Name": "Hoarder's Wand", + "Description": "Does nothing but for some reason you think it might be important later in your quest." + }, + { + "Name": "Hood of Offensive Facades", + "Description": "This hood will change your identity in the eyes of others to the appearance of the person they most personally dislike." + }, + { + "Name": "Hood Of Worrisome Facades", + "Description": "This hood will change your identity in the eyes of others, however the identity used will be random." + }, + { + "Name": "Indestructible Notebook of Memories", + "Description": "This otherwise normal notepad of normal notepad size cannot be damaged or destroyed, and anything written in it cannot be obscured or defaced. It also has unlimited pages despite its finite size. However, the data it holds only lasts as long as the writer independently remembers it, and decays in exact proportion to the relevant memories. Remember who and when, but not where? Then the words describing the location in that particular entry are the only ones gone." + }, + { + "Name": "Intransigent Rod", + "Description": "When the button on this artifact is pressed in, the holder's opinions solidify and they become impossible to convince." + }, + { + "Name": "Lunchbox of Delicious Unfulfillment", + "Description": "This lunchbox will hold whatever food you desire. However you will never get full and the food will deliver no nourishment." + }, + { + "Name": "The Mattress of Poverty", + "Description": "No matter how you fluff this gorgeous, thick, mattress, you will always sleep on the thin part of it." + }, + { + "Name": "Mug O' Dissatisfaction", + "Description": "A mug that always produces a steaming hot cup of coffee or tea when tapped on the bottom. It conjures the opposite of what the tapper prefers, so if you like tea you get coffee and vice versa. Handing the full mug to another person will make the drink in it transform to the opposite of that persons preferences." + }, + { + "Name": "Murder Dagger", + "Description": "All damage it would deal is instead replaced by the target being harassed by crows for that many hours." + }, + { + "Name": "Needle Of Learned Compromise", + "Description": "This needle will create beautiful tattoos of any design, however they hurt a tiny bit more. When used to sew it is entirely normal." + }, + { + "Name": "Portable Dark Tavern Corner", + "Description": "Consisting of two wooden boards connected by a hinge, this artifact draws those nearby into assuming it is a perfect spot to conduct seedy business." + }, + { + "Name": "Ring of First Impression", + "Description": "Wearing the ring will make you able to perform a perfect handshake with the hand wearing it." + }, + { + "Name": "Sack of Hive Eggs", + "Description": "Crushing one of the numerous tiny eggs will cause the thoughts of everybody in the proximity to merge. Everybody can hear what you think and you can hear everybody." + }, + { + "Name": "Shoes of the Restless Traveler", + "Description": "These shoes allow their user to run for miles without feeling fatigue, but if they try to do anything else with it (walk, sit down, jump), they will instantly trip" + }, + { + "Name": "Sword of Parrying", + "Description": "Parries every attack, swinging it yourself will force it to \"parry\" your opponents weapon/attack even though he/she/it is defenseless." + }, + { + "Name": "Vorpal Grindstone", + "Description": "It can \"sharpen\" any object to become vorpal. Any object." + }, + { + "Name": "The Water Hat", + "Description": "A small red hat, when worn, causes water to pour from the wearer's fingers at the speed " + } +] diff --git a/src/NadekoBot/data/pokemon/LICENSE b/src/NadekoBot/data/pokemon/LICENSE new file mode 100644 index 00000000..283bf7a1 --- /dev/null +++ b/src/NadekoBot/data/pokemon/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011-2016 Guangcong Luo and other contributors +http://pokemonshowdown.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/NadekoBot/data/pokemon/pokemon_abilities.json b/src/NadekoBot/data/pokemon/pokemon_abilities.json new file mode 100644 index 00000000..7cfde85f --- /dev/null +++ b/src/NadekoBot/data/pokemon/pokemon_abilities.json @@ -0,0 +1,1596 @@ +{ + "adaptability": { + "desc": "This Pokemon's moves that match one of its types have a same-type attack bonus (STAB) of 2 instead of 1.5.", + "shortDesc": "This Pokemon's same-type attack bonus (STAB) is 2 instead of 1.5.", + "id": "adaptability", + "name": "Adaptability", + "rating": 3.5, + "num": 91 + }, + "aftermath": { + "desc": "If this Pokemon is knocked out with a contact move, that move's user loses 1/4 of its maximum HP, rounded down. If any active Pokemon has the Ability Damp, this effect is prevented.", + "shortDesc": "If this Pokemon is KOed with a contact move, that move's user loses 1/4 its max HP.", + "id": "aftermath", + "name": "Aftermath", + "onAfterDamageOrder": 1, + "rating": 2.5, + "num": 106 + }, + "aerilate": { + "desc": "This Pokemon's Normal-type moves become Flying-type moves and have their power multiplied by 1.3. This effect comes after other effects that change a move's type, but before Ion Deluge and Electrify's effects.", + "shortDesc": "This Pokemon's Normal-type moves become Flying type and have 1.3x power.", + "onModifyMovePriority": -1, + "effect": { + "duration": 1, + "onBasePowerPriority": 8 + }, + "id": "aerilate", + "name": "Aerilate", + "rating": 4, + "num": 185 + }, + "airlock": { + "shortDesc": "While this Pokemon is active, the effects of weather conditions are disabled.", + "suppressWeather": true, + "id": "airlock", + "name": "Air Lock", + "rating": 3, + "num": 76 + }, + "analytic": { + "desc": "The power of this Pokemon's move is multiplied by 1.3 if it is the last to move in a turn. Does not affect Doom Desire and Future Sight.", + "shortDesc": "This Pokemon's attacks have 1.3x power if it is the last to move in a turn.", + "onBasePowerPriority": 8, + "id": "analytic", + "name": "Analytic", + "rating": 2, + "num": 148 + }, + "angerpoint": { + "desc": "If this Pokemon, but not its substitute, is struck by a critical hit, its Attack is raised by 12 stages.", + "shortDesc": "If this Pokemon (not its substitute) takes a critical hit, its Attack is raised 12 stages.", + "id": "angerpoint", + "name": "Anger Point", + "rating": 2, + "num": 83 + }, + "anticipation": { + "desc": "On switch-in, this Pokemon is alerted if any opposing Pokemon has an attack that is super effective on this Pokemon, or an OHKO move. Counter, Metal Burst, and Mirror Coat count as attacking moves of their respective types, while Hidden Power, Judgment, Natural Gift, Techno Blast, and Weather Ball are considered Normal-type moves.", + "shortDesc": "On switch-in, this Pokemon shudders if any foe has a supereffective or OHKO move.", + "id": "anticipation", + "name": "Anticipation", + "rating": 1, + "num": 107 + }, + "arenatrap": { + "desc": "Prevents adjacent opposing Pokemon from choosing to switch out unless they are immune to trapping or are airborne.", + "shortDesc": "Prevents adjacent foes from choosing to switch unless they are airborne.", + "id": "arenatrap", + "name": "Arena Trap", + "rating": 4.5, + "num": 71 + }, + "aromaveil": { + "desc": "This Pokemon and its allies cannot be affected by Attract, Disable, Encore, Heal Block, Taunt, or Torment.", + "shortDesc": "Protects user/allies from Attract, Disable, Encore, Heal Block, Taunt, and Torment.", + "id": "aromaveil", + "name": "Aroma Veil", + "rating": 1.5, + "num": 165 + }, + "aurabreak": { + "desc": "While this Pokemon is active, the effects of the Abilities Dark Aura and Fairy Aura are reversed, multiplying the power of Dark- and Fairy-type moves, respectively, by 3/4 instead of 1.33.", + "shortDesc": "While this Pokemon is active, the Dark Aura and Fairy Aura power modifier is 0.75x.", + "effect": { + "duration": 1 + }, + "id": "aurabreak", + "name": "Aura Break", + "rating": 2, + "num": 188 + }, + "baddreams": { + "desc": "Causes adjacent opposing Pokemon to lose 1/8 of their maximum HP, rounded down, at the end of each turn if they are asleep.", + "shortDesc": "Causes sleeping adjacent foes to lose 1/8 of their max HP at the end of each turn.", + "onResidualOrder": 26, + "onResidualSubOrder": 1, + "id": "baddreams", + "name": "Bad Dreams", + "rating": 2, + "num": 123 + }, + "battlearmor": { + "shortDesc": "This Pokemon cannot be struck by a critical hit.", + "onCriticalHit": false, + "id": "battlearmor", + "name": "Battle Armor", + "rating": 1, + "num": 4 + }, + "bigpecks": { + "shortDesc": "Prevents other Pokemon from lowering this Pokemon's Defense stat stage.", + "id": "bigpecks", + "name": "Big Pecks", + "rating": 0.5, + "num": 145 + }, + "blaze": { + "desc": "When this Pokemon has 1/3 or less of its maximum HP, rounded down, its attacking stat is multiplied by 1.5 while using a Fire-type attack.", + "shortDesc": "When this Pokemon has 1/3 or less of its max HP, its Fire attacks do 1.5x damage.", + "onModifyAtkPriority": 5, + "onModifySpAPriority": 5, + "id": "blaze", + "name": "Blaze", + "rating": 2, + "num": 66 + }, + "bulletproof": { + "desc": "This Pokemon is immune to ballistic moves. Ballistic moves include BulvarSeed, Octazooka, Barrage, Rock Wrecker, Zap Cannon, Acid Spray, Aura Sphere, Focus Blast, and all moves with Ball or Bomb in their name.", + "shortDesc": "Makes user immune to ballistic moves (Shadow Ball, Sludge Bomb, Focus Blast, etc).", + "id": "bulletproof", + "name": "Bulletproof", + "rating": 3, + "num": 171 + }, + "cheekpouch": { + "desc": "If this Pokemon eats a Berry, it restores 1/3 of its maximum HP, rounded down, in addition to the Berry's effect.", + "shortDesc": "If this Pokemon eats a Berry, it restores 1/3 of its max HP after the Berry's effect.", + "id": "cheekpouch", + "name": "Cheek Pouch", + "rating": 2, + "num": 167 + }, + "chlorophyll": { + "shortDesc": "If Sunny Day is active, this Pokemon's Speed is doubled.", + "id": "chlorophyll", + "name": "Chlorophyll", + "rating": 2.5, + "num": 34 + }, + "clearbody": { + "shortDesc": "Prevents other Pokemon from lowering this Pokemon's stat stages.", + "id": "clearbody", + "name": "Clear Body", + "rating": 2, + "num": 29 + }, + "cloudnine": { + "shortDesc": "While this Pokemon is active, the effects of weather conditions are disabled.", + "suppressWeather": true, + "id": "cloudnine", + "name": "Cloud Nine", + "rating": 3, + "num": 13 + }, + "colorchange": { + "desc": "This Pokemon's type changes to match the type of the last move that hit it, unless that type is already one of its types. This effect applies after all hits from a multi-hit move; Sheer Force prevents it from activating if the move has a secondary effect.", + "shortDesc": "This Pokemon's type changes to the type of a move it's hit by, unless it has the type.", + "id": "colorchange", + "name": "Color Change", + "rating": 1, + "num": 16 + }, + "competitive": { + "desc": "This Pokemon's Special Attack is raised by 2 stages for each of its stat stages that is lowered by an opposing Pokemon.", + "shortDesc": "This Pokemon's Sp. Atk is raised by 2 for each of its stats that is lowered by a foe.", + "id": "competitive", + "name": "Competitive", + "rating": 2.5, + "num": 172 + }, + "compoundeyes": { + "shortDesc": "This Pokemon's moves have their accuracy multiplied by 1.3.", + "id": "compoundeyes", + "name": "Compound Eyes", + "rating": 3.5, + "num": 14 + }, + "contrary": { + "shortDesc": "If this Pokemon has a stat stage raised it is lowered instead, and vice versa.", + "id": "contrary", + "name": "Contrary", + "rating": 4, + "num": 126 + }, + "cursedbody": { + "desc": "If this Pokemon is hit by an attack, there is a 30% chance that move gets disabled unless one of the attacker's moves is already disabled.", + "shortDesc": "If this Pokemon is hit by an attack, there is a 30% chance that move gets disabled.", + "id": "cursedbody", + "name": "Cursed Body", + "rating": 2, + "num": 130 + }, + "cutecharm": { + "desc": "There is a 30% chance a Pokemon making contact with this Pokemon will become infatuated if it is of the opposite gender.", + "shortDesc": "30% chance of infatuating Pokemon of the opposite gender if they make contact.", + "id": "cutecharm", + "name": "Cute Charm", + "rating": 1, + "num": 56 + }, + "damp": { + "desc": "While this Pokemon is active, Self-Destruct, Explosion, and the Ability Aftermath are prevented from having an effect.", + "shortDesc": "While this Pokemon is active, Self-Destruct, Explosion, and Aftermath have no effect.", + "id": "damp", + "name": "Damp", + "rating": 1, + "num": 6 + }, + "darkaura": { + "desc": "While this Pokemon is active, the power of Dark-type moves used by active Pokemon is multiplied by 1.33.", + "shortDesc": "While this Pokemon is active, a Dark move used by any Pokemon has 1.33x power.", + "id": "darkaura", + "name": "Dark Aura", + "rating": 3, + "num": 186 + }, + "defeatist": { + "desc": "While this Pokemon has 1/2 or less of its maximum HP, its Attack and Special Attack are halved.", + "shortDesc": "While this Pokemon has 1/2 or less of its max HP, its Attack and Sp. Atk are halved.", + "onModifyAtkPriority": 5, + "onModifySpAPriority": 5, + "id": "defeatist", + "name": "Defeatist", + "rating": -1, + "num": 129 + }, + "defiant": { + "desc": "This Pokemon's Attack is raised by 2 stages for each of its stat stages that is lowered by an opposing Pokemon.", + "shortDesc": "This Pokemon's Attack is raised by 2 for each of its stats that is lowered by a foe.", + "id": "defiant", + "name": "Defiant", + "rating": 2.5, + "num": 128 + }, + "deltastream": { + "desc": "On switch-in, the weather becomes strong winds that remove the weaknesses of the Flying type from Flying-type Pokemon. This weather remains in effect until this Ability is no longer active for any Pokemon, or the weather is changed by Desolate Land or Primordial Sea.", + "shortDesc": "On switch-in, strong winds begin until this Ability is not active in battle.", + "id": "deltastream", + "name": "Delta Stream", + "rating": 5, + "num": 191 + }, + "desolateland": { + "desc": "On switch-in, the weather becomes extremely harsh sunlight that prevents damaging Water-type moves from executing, in addition to all the effects of Sunny Day. This weather remains in effect until this Ability is no longer active for any Pokemon, or the weather is changed by Delta Stream or Primordial Sea.", + "shortDesc": "On switch-in, extremely harsh sunlight begins until this Ability is not active in battle.", + "id": "desolateland", + "name": "Desolate Land", + "rating": 5, + "num": 190 + }, + "download": { + "desc": "On switch-in, this Pokemon's Attack or Special Attack is raised by 1 stage based on the weaker combined defensive stat of all opposing Pokemon. Attack is raised if their Defense is lower, and Special Attack is raised if their Special Defense is the same or lower.", + "shortDesc": "On switch-in, Attack or Sp. Atk is raised 1 stage based on the foes' weaker Defense.", + "id": "download", + "name": "Download", + "rating": 4, + "num": 88 + }, + "drizzle": { + "shortDesc": "On switch-in, this Pokemon summons Rain Dance.", + "id": "drizzle", + "name": "Drizzle", + "rating": 4.5, + "num": 2 + }, + "drought": { + "shortDesc": "On switch-in, this Pokemon summons Sunny Day.", + "id": "drought", + "name": "Drought", + "rating": 4.5, + "num": 70 + }, + "dryskin": { + "desc": "This Pokemon is immune to Water-type moves and restores 1/4 of its maximum HP, rounded down, when hit by a Water-type move. The power of Fire-type moves is multiplied by 1.25 when used on this Pokemon. At the end of each turn, this Pokemon restores 1/8 of its maximum HP, rounded down, if the weather is Rain Dance, and loses 1/8 of its maximum HP, rounded down, if the weather is Sunny Day.", + "shortDesc": "This Pokemon is healed 1/4 by Water, 1/8 by Rain; is hurt 1.25x by Fire, 1/8 by Sun.", + "onBasePowerPriority": 7, + "id": "dryskin", + "name": "Dry Skin", + "rating": 3.5, + "num": 87 + }, + "earlybird": { + "shortDesc": "This Pokemon's sleep counter drops by 2 instead of 1.", + "id": "earlybird", + "name": "Early Bird", + "rating": 2.5, + "num": 48 + }, + "effectspore": { + "desc": "30% chance a Pokemon making contact with this Pokemon will be poisoned, paralyzed, or fall asleep.", + "shortDesc": "30% chance of poison/paralysis/sleep on others making contact with this Pokemon.", + "id": "effectspore", + "name": "Effect Spore", + "rating": 2, + "num": 27 + }, + "fairyaura": { + "desc": "While this Pokemon is active, the power of Fairy-type moves used by active Pokemon is multiplied by 1.33.", + "shortDesc": "While this Pokemon is active, a Fairy move used by any Pokemon has 1.33x power.", + "id": "fairyaura", + "name": "Fairy Aura", + "rating": 3, + "num": 187 + }, + "filter": { + "shortDesc": "This Pokemon receives 3/4 damage from supereffective attacks.", + "id": "filter", + "name": "Filter", + "rating": 3, + "num": 111 + }, + "flamebody": { + "shortDesc": "30% chance a Pokemon making contact with this Pokemon will be burned.", + "id": "flamebody", + "name": "Flame Body", + "rating": 2, + "num": 49 + }, + "flareboost": { + "desc": "While this Pokemon is burned, the power of its special attacks is multiplied by 1.5.", + "shortDesc": "While this Pokemon is burned, its special attacks have 1.5x power.", + "onBasePowerPriority": 8, + "id": "flareboost", + "name": "Flare Boost", + "rating": 2.5, + "num": 138 + }, + "flashfire": { + "desc": "This Pokemon is immune to Fire-type moves. The first time it is hit by a Fire-type move, its attacking stat is multiplied by 1.5 while using a Fire-type attack as long as it remains active and has this Ability. If this Pokemon is frozen, it cannot be defrosted by Fire-type attacks.", + "shortDesc": "This Pokemon's Fire attacks do 1.5x damage if hit by one Fire move; Fire immunity.", + "effect": { + "noCopy": true, + "onModifyAtkPriority": 5, + "onModifySpAPriority": 5 + }, + "id": "flashfire", + "name": "Flash Fire", + "rating": 3, + "num": 18 + }, + "flowergift": { + "desc": "If this Pokemon is a Cherrim and Sunny Day is active, it changes to Sunshine Form and the Attack and Special Defense of it and its allies are multiplied by 1.5.", + "shortDesc": "If user is Cherrim and Sunny Day is active, it and allies' Attack and Sp. Def are 1.5x.", + "onModifyAtkPriority": 3, + "onModifySpDPriority": 4, + "id": "flowergift", + "name": "Flower Gift", + "rating": 2.5, + "num": 122 + }, + "flowerveil": { + "desc": "Grass-type Pokemon on this Pokemon's side cannot have their stat stages lowered by other Pokemon or have a major status condition inflicted on them by other Pokemon.", + "shortDesc": "This side's Grass types can't have stats lowered or status inflicted by other Pokemon.", + "id": "flowerveil", + "name": "Flower Veil", + "rating": 0, + "num": 166 + }, + "forecast": { + "desc": "If this Pokemon is a Castform, its type changes to the current weather condition's type, except Sandstorm.", + "shortDesc": "Castform's type changes to the current weather condition's type, except Sandstorm.", + "id": "forecast", + "name": "Forecast", + "rating": 3, + "num": 59 + }, + "forewarn": { + "desc": "On switch-in, this Pokemon is alerted to the move with the highest power, at random, known by an opposing Pokemon.", + "shortDesc": "On switch-in, this Pokemon is alerted to the foes' move with the highest power.", + "id": "forewarn", + "name": "Forewarn", + "rating": 1, + "num": 108 + }, + "friendguard": { + "shortDesc": "This Pokemon's allies receive 3/4 damage from other Pokemon's attacks.", + "id": "friendguard", + "name": "Friend Guard", + "rating": 0, + "num": 132 + }, + "frisk": { + "shortDesc": "On switch-in, this Pokemon identifies the held items of all opposing Pokemon.", + "id": "frisk", + "name": "Frisk", + "rating": 1.5, + "num": 119 + }, + "furcoat": { + "shortDesc": "This Pokemon's Defense is doubled.", + "onModifyDefPriority": 6, + "id": "furcoat", + "name": "Fur Coat", + "rating": 3.5, + "num": 169 + }, + "galewings": { + "shortDesc": "This Pokemon's Flying-type moves have their priority increased by 1.", + "id": "galewings", + "name": "Gale Wings", + "rating": 4.5, + "num": 177 + }, + "gluttony": { + "shortDesc": "When this Pokemon has 1/2 or less of its maximum HP, it uses certain Berries early.", + "id": "gluttony", + "name": "Gluttony", + "rating": 1, + "num": 82 + }, + "gooey": { + "shortDesc": "Pokemon making contact with this Pokemon have their Speed lowered by 1 stage.", + "id": "gooey", + "name": "Gooey", + "rating": 2.5, + "num": 183 + }, + "grasspelt": { + "shortDesc": "If Grassy Terrain is active, this Pokemon's Defense is multiplied by 1.5.", + "onModifyDefPriority": 6, + "id": "grasspelt", + "name": "Grass Pelt", + "rating": 0.5, + "num": 179 + }, + "guts": { + "desc": "If this Pokemon has a major status condition, its Attack is multiplied by 1.5; burn's physical damage halving is ignored.", + "shortDesc": "If this Pokemon is statused, its Attack is 1.5x; ignores burn halving physical damage.", + "onModifyAtkPriority": 5, + "id": "guts", + "name": "Guts", + "rating": 3, + "num": 62 + }, + "harvest": { + "desc": "If the last item this Pokemon used is a Berry, there is a 50% chance it gets restored at the end of each turn. If Sunny Day is active, this chance is 100%.", + "shortDesc": "If last item used is a Berry, 50% chance to restore it each end of turn. 100% in Sun.", + "id": "harvest", + "name": "Harvest", + "onResidualOrder": 26, + "onResidualSubOrder": 1, + "rating": 2.5, + "num": 139 + }, + "healer": { + "desc": "There is a 30% chance of curing an adjacent ally's major status condition at the end of each turn.", + "shortDesc": "30% chance of curing an adjacent ally's status at the end of each turn.", + "id": "healer", + "name": "Healer", + "onResidualOrder": 5, + "onResidualSubOrder": 1, + "rating": 0, + "num": 131 + }, + "heatproof": { + "desc": "The power of Fire-type attacks against this Pokemon is halved, and any burn damage taken is 1/16 of its maximum HP, rounded down.", + "shortDesc": "The power of Fire-type attacks against this Pokemon is halved; burn damage halved.", + "onBasePowerPriority": 7, + "id": "heatproof", + "name": "Heatproof", + "rating": 2.5, + "num": 85 + }, + "heavymetal": { + "shortDesc": "This Pokemon's weight is doubled.", + "id": "heavymetal", + "name": "Heavy Metal", + "rating": -1, + "num": 134 + }, + "honeygather": { + "shortDesc": "No competitive use.", + "id": "honeygather", + "name": "Honey Gather", + "rating": 0, + "num": 118 + }, + "hugepower": { + "shortDesc": "This Pokemon's Attack is doubled.", + "onModifyAtkPriority": 5, + "id": "hugepower", + "name": "Huge Power", + "rating": 5, + "num": 37 + }, + "hustle": { + "desc": "This Pokemon's Attack is multiplied by 1.5 and the accuracy of its physical attacks is multiplied by 0.8.", + "shortDesc": "This Pokemon's Attack is 1.5x and accuracy of its physical attacks is 0.8x.", + "onModifyAtkPriority": 5, + "id": "hustle", + "name": "Hustle", + "rating": 3, + "num": 55 + }, + "hydration": { + "desc": "This Pokemon has its major status condition cured at the end of each turn if Rain Dance is active.", + "shortDesc": "This Pokemon has its status cured at the end of each turn if Rain Dance is active.", + "onResidualOrder": 5, + "onResidualSubOrder": 1, + "id": "hydration", + "name": "Hydration", + "rating": 2, + "num": 93 + }, + "hypercutter": { + "shortDesc": "Prevents other Pokemon from lowering this Pokemon's Attack stat stage.", + "id": "hypercutter", + "name": "Hyper Cutter", + "rating": 1.5, + "num": 52 + }, + "icebody": { + "desc": "If Hail is active, this Pokemon restores 1/16 of its maximum HP, rounded down, at the end of each turn. This Pokemon takes no damage from Hail.", + "shortDesc": "If Hail is active, this Pokemon heals 1/16 of its max HP each turn; immunity to Hail.", + "id": "icebody", + "name": "Ice Body", + "rating": 1.5, + "num": 115 + }, + "illuminate": { + "shortDesc": "No competitive use.", + "id": "illuminate", + "name": "Illuminate", + "rating": 0, + "num": 35 + }, + "illusion": { + "desc": "When this Pokemon switches in, it appears as the last unfainted Pokemon in its party until it takes direct damage from another Pokemon's attack. This Pokemon's actual level and HP are displayed instead of those of the mimicked Pokemon.", + "shortDesc": "This Pokemon appears as the last Pokemon in the party until it takes direct damage.", + "id": "illusion", + "name": "Illusion", + "rating": 4.5, + "num": 149 + }, + "immunity": { + "shortDesc": "This Pokemon cannot be poisoned. Gaining this Ability while poisoned cures it.", + "id": "immunity", + "name": "Immunity", + "rating": 2, + "num": 17 + }, + "imposter": { + "desc": "On switch-in, this Pokemon Transforms into the opposing Pokemon that is facing it. If there is no Pokemon at that position, this Pokemon does not Transform.", + "shortDesc": "On switch-in, this Pokemon Transforms into the opposing Pokemon that is facing it.", + "id": "imposter", + "name": "Imposter", + "rating": 4.5, + "num": 150 + }, + "infiltrator": { + "desc": "This Pokemon's moves ignore substitutes and the opposing side's Reflect, Light Screen, Safeguard, and Mist.", + "shortDesc": "Moves ignore substitutes and opposing Reflect, Light Screen, Safeguard, and Mist.", + "id": "infiltrator", + "name": "Infiltrator", + "rating": 3, + "num": 151 + }, + "innerfocus": { + "shortDesc": "This Pokemon cannot be made to flinch.", + "onFlinch": false, + "id": "innerfocus", + "name": "Inner Focus", + "rating": 1.5, + "num": 39 + }, + "insomnia": { + "shortDesc": "This Pokemon cannot fall asleep. Gaining this Ability while asleep cures it.", + "id": "insomnia", + "name": "Insomnia", + "rating": 2, + "num": 15 + }, + "intimidate": { + "desc": "On switch-in, this Pokemon lowers the Attack of adjacent opposing Pokemon by 1 stage. Pokemon behind a substitute are immune.", + "shortDesc": "On switch-in, this Pokemon lowers the Attack of adjacent opponents by 1 stage.", + "id": "intimidate", + "name": "Intimidate", + "rating": 3.5, + "num": 22 + }, + "ironbarbs": { + "desc": "Pokemon making contact with this Pokemon lose 1/8 of their maximum HP, rounded down.", + "shortDesc": "Pokemon making contact with this Pokemon lose 1/8 of their max HP.", + "onAfterDamageOrder": 1, + "id": "ironbarbs", + "name": "Iron Barbs", + "rating": 3, + "num": 160 + }, + "ironfist": { + "desc": "This Pokemon's punch-based attacks have their power multiplied by 1.2.", + "shortDesc": "This Pokemon's punch-based attacks have 1.2x power. Sucker Punch is not boosted.", + "onBasePowerPriority": 8, + "id": "ironfist", + "name": "Iron Fist", + "rating": 3, + "num": 89 + }, + "justified": { + "shortDesc": "This Pokemon's Attack is raised by 1 stage after it is damaged by a Dark-type move.", + "id": "justified", + "name": "Justified", + "rating": 2, + "num": 154 + }, + "keeneye": { + "desc": "Prevents other Pokemon from lowering this Pokemon's accuracy stat stage. This Pokemon ignores a target's evasiveness stat stage.", + "shortDesc": "This Pokemon's accuracy can't be lowered by others; ignores their evasiveness stat.", + "id": "keeneye", + "name": "Keen Eye", + "rating": 1, + "num": 51 + }, + "klutz": { + "desc": "This Pokemon's held item has no effect. This Pokemon cannot use Fling successfully. Macho Brace, Power Anklet, Power Band, Power Belt, Power Bracer, Power Lens, and Power Weight still have their effects.", + "shortDesc": "This Pokemon's held item has no effect, except Macho Brace. Fling cannot be used.", + "id": "klutz", + "name": "Klutz", + "rating": -1, + "num": 103 + }, + "leafguard": { + "desc": "If Sunny Day is active, this Pokemon cannot gain a major status condition and Rest will fail for it.", + "shortDesc": "If Sunny Day is active, this Pokemon cannot be statused and Rest will fail for it.", + "id": "leafguard", + "name": "Leaf Guard", + "rating": 1, + "num": 102 + }, + "levitate": { + "desc": "This Pokemon is immune to Ground. Gravity, Ingrain, Smack Down, Thousand Arrows, and Iron Ball nullify the immunity.", + "shortDesc": "This Pokemon is immune to Ground; Gravity/Ingrain/Smack Down/Iron Ball nullify it.", + "id": "levitate", + "name": "Levitate", + "rating": 3.5, + "num": 26 + }, + "lightmetal": { + "shortDesc": "This Pokemon's weight is halved.", + "id": "lightmetal", + "name": "Light Metal", + "rating": 1, + "num": 135 + }, + "lightningrod": { + "desc": "This Pokemon is immune to Electric-type moves and raises its Special Attack by 1 stage when hit by an Electric-type move. If this Pokemon is not the target of a single-target Electric-type move used by another Pokemon, this Pokemon redirects that move to itself if it is within the range of that move.", + "shortDesc": "This Pokemon draws Electric moves to itself to raise Sp. Atk by 1; Electric immunity.", + "id": "lightningrod", + "name": "Lightning Rod", + "rating": 3.5, + "num": 32 + }, + "limber": { + "shortDesc": "This Pokemon cannot be paralyzed. Gaining this Ability while paralyzed cures it.", + "id": "limber", + "name": "Limber", + "rating": 1.5, + "num": 7 + }, + "liquidooze": { + "shortDesc": "This Pokemon damages those draining HP from it for as much as they would heal.", + "id": "liquidooze", + "name": "Liquid Ooze", + "rating": 1.5, + "num": 64 + }, + "magicbounce": { + "desc": "This Pokemon blocks certain status moves and instead uses the move against the original user.", + "shortDesc": "This Pokemon blocks certain status moves and bounces them back to the user.", + "id": "magicbounce", + "name": "Magic Bounce", + "onTryHitPriority": 1, + "effect": { + "duration": 1 + }, + "rating": 4.5, + "num": 156 + }, + "magicguard": { + "desc": "This Pokemon can only be damaged by direct attacks. Curse and Substitute on use, Belly Drum, Pain Split, Struggle recoil, and confusion damage are considered direct damage.", + "shortDesc": "This Pokemon can only be damaged by direct attacks.", + "id": "magicguard", + "name": "Magic Guard", + "rating": 4.5, + "num": 98 + }, + "magician": { + "desc": "If this Pokemon has no item, it steals the item off a Pokemon it hits with an attack. Does not affect Doom Desire and Future Sight.", + "shortDesc": "If this Pokemon has no item, it steals the item off a Pokemon it hits with an attack.", + "id": "magician", + "name": "Magician", + "rating": 1.5, + "num": 170 + }, + "magmaarmor": { + "shortDesc": "This Pokemon cannot be frozen. Gaining this Ability while frozen cures it.", + "id": "magmaarmor", + "name": "Magma Armor", + "rating": 0.5, + "num": 40 + }, + "magnetpull": { + "desc": "Prevents adjacent opposing Steel-type Pokemon from choosing to switch out unless they are immune to trapping.", + "shortDesc": "Prevents adjacent Steel-type foes from choosing to switch.", + "id": "magnetpull", + "name": "Magnet Pull", + "rating": 4.5, + "num": 42 + }, + "marvelscale": { + "desc": "If this Pokemon has a major status condition, its Defense is multiplied by 1.5.", + "shortDesc": "If this Pokemon is statused, its Defense is 1.5x.", + "onModifyDefPriority": 6, + "id": "marvelscale", + "name": "Marvel Scale", + "rating": 2.5, + "num": 63 + }, + "megalauncher": { + "desc": "This Pokemon's pulse moves have their power multiplied by 1.5. Heal Pulse restores 3/4 of a target's maximum HP, rounded half down.", + "shortDesc": "This Pokemon's pulse moves have 1.5x power. Heal Pulse heals 3/4 target's max HP.", + "onBasePowerPriority": 8, + "id": "megalauncher", + "name": "Mega Launcher", + "rating": 3.5, + "num": 178 + }, + "minus": { + "desc": "If an active ally has this Ability or the Ability Plus, this Pokemon's Special Attack is multiplied by 1.5.", + "shortDesc": "If an active ally has this Ability or the Ability Plus, this Pokemon's Sp. Atk is 1.5x.", + "onModifySpAPriority": 5, + "id": "minus", + "name": "Minus", + "rating": 0, + "num": 58 + }, + "moldbreaker": { + "shortDesc": "This Pokemon's moves and their effects ignore the Abilities of other Pokemon.", + "stopAttackEvents": true, + "id": "moldbreaker", + "name": "Mold Breaker", + "rating": 3.5, + "num": 104 + }, + "moody": { + "desc": "This Pokemon has a random stat raised by 2 stages and another stat lowered by 1 stage at the end of each turn.", + "shortDesc": "Raises a random stat by 2 and lowers another stat by 1 at the end of each turn.", + "onResidualOrder": 26, + "onResidualSubOrder": 1, + "id": "moody", + "name": "Moody", + "rating": 5, + "num": 141 + }, + "motordrive": { + "desc": "This Pokemon is immune to Electric-type moves and raises its Speed by 1 stage when hit by an Electric-type move.", + "shortDesc": "This Pokemon's Speed is raised 1 stage if hit by an Electric move; Electric immunity.", + "id": "motordrive", + "name": "Motor Drive", + "rating": 3, + "num": 78 + }, + "moxie": { + "desc": "This Pokemon's Attack is raised by 1 stage if it attacks and knocks out another Pokemon.", + "shortDesc": "This Pokemon's Attack is raised by 1 stage if it attacks and KOes another Pokemon.", + "id": "moxie", + "name": "Moxie", + "rating": 3.5, + "num": 153 + }, + "multiscale": { + "shortDesc": "If this Pokemon is at full HP, damage taken from attacks is halved.", + "id": "multiscale", + "name": "Multiscale", + "rating": 4, + "num": 136 + }, + "multitype": { + "shortDesc": "If this Pokemon is an Arceus, its type changes to match its held Plate.", + "id": "multitype", + "name": "Multitype", + "rating": 4, + "num": 121 + }, + "mummy": { + "desc": "Pokemon making contact with this Pokemon have their Ability changed to Mummy. Does not affect the Abilities Multitype or Stance Change.", + "shortDesc": "Pokemon making contact with this Pokemon have their Ability changed to Mummy.", + "id": "mummy", + "name": "Mummy", + "rating": 2, + "num": 152 + }, + "naturalcure": { + "shortDesc": "This Pokemon has its major status condition cured when it switches out.", + "id": "naturalcure", + "name": "Natural Cure", + "rating": 3.5, + "num": 30 + }, + "noguard": { + "shortDesc": "Every move used by or against this Pokemon will always hit.", + "id": "noguard", + "name": "No Guard", + "rating": 4, + "num": 99 + }, + "normalize": { + "desc": "This Pokemon's moves are changed to be Normal type. This effect comes before other effects that change a move's type.", + "shortDesc": "This Pokemon's moves are changed to be Normal type.", + "onModifyMovePriority": 1, + "id": "normalize", + "name": "Normalize", + "rating": -1, + "num": 96 + }, + "oblivious": { + "desc": "This Pokemon cannot be infatuated or taunted. Gaining this Ability while affected cures it.", + "shortDesc": "This Pokemon cannot be infatuated or taunted. Gaining this Ability cures it.", + "id": "oblivious", + "name": "Oblivious", + "rating": 1, + "num": 12 + }, + "overcoat": { + "shortDesc": "This Pokemon is immune to powder moves and damage from Sandstorm or Hail.", + "id": "overcoat", + "name": "Overcoat", + "rating": 2.5, + "num": 142 + }, + "overgrow": { + "desc": "When this Pokemon has 1/3 or less of its maximum HP, its attacking stat is multiplied by 1.5 while using a Grass-type attack.", + "shortDesc": "When this Pokemon has 1/3 or less of its max HP, its Grass attacks do 1.5x damage.", + "onModifyAtkPriority": 5, + "onModifySpAPriority": 5, + "id": "overgrow", + "name": "Overgrow", + "rating": 2, + "num": 65 + }, + "owntempo": { + "shortDesc": "This Pokemon cannot be confused. Gaining this Ability while confused cures it.", + "id": "owntempo", + "name": "Own Tempo", + "rating": 1, + "num": 20 + }, + "parentalbond": { + "desc": "This Pokemon's damaging moves become multi-hit moves that hit twice. The second hit has its damage halved. Does not affect multi-hit moves or moves that have multiple targets.", + "shortDesc": "This Pokemon's damaging moves hit twice. The second hit has its damage halved.", + "effect": { + "duration": 1, + "onBasePowerPriority": 8 + }, + "id": "parentalbond", + "name": "Parental Bond", + "rating": 5, + "num": 184 + }, + "pickup": { + "shortDesc": "If this Pokemon has no item, it finds one used by an adjacent Pokemon this turn.", + "onResidualOrder": 26, + "onResidualSubOrder": 1, + "id": "pickup", + "name": "Pickup", + "rating": 0.5, + "num": 53 + }, + "pickpocket": { + "desc": "If this Pokemon has no item, it steals the item off a Pokemon that makes contact with it. This effect applies after all hits from a multi-hit move; Sheer Force prevents it from activating if the move has a secondary effect.", + "shortDesc": "If this Pokemon has no item, it steals the item off a Pokemon making contact with it.", + "id": "pickpocket", + "name": "Pickpocket", + "rating": 1, + "num": 124 + }, + "pixilate": { + "desc": "This Pokemon's Normal-type moves become Fairy-type moves and have their power multiplied by 1.3. This effect comes after other effects that change a move's type, but before Ion Deluge and Electrify's effects.", + "shortDesc": "This Pokemon's Normal-type moves become Fairy type and have 1.3x power.", + "onModifyMovePriority": -1, + "effect": { + "duration": 1, + "onBasePowerPriority": 8 + }, + "id": "pixilate", + "name": "Pixilate", + "rating": 4, + "num": 182 + }, + "plus": { + "desc": "If an active ally has this Ability or the Ability Minus, this Pokemon's Special Attack is multiplied by 1.5.", + "shortDesc": "If an active ally has this Ability or the Ability Minus, this Pokemon's Sp. Atk is 1.5x.", + "onModifySpAPriority": 5, + "id": "plus", + "name": "Plus", + "rating": 0, + "num": 57 + }, + "poisonheal": { + "desc": "If this Pokemon is poisoned, it restores 1/8 of its maximum HP, rounded down, at the end of each turn instead of losing HP.", + "shortDesc": "This Pokemon is healed by 1/8 of its max HP each turn when poisoned; no HP loss.", + "id": "poisonheal", + "name": "Poison Heal", + "rating": 4, + "num": 90 + }, + "poisonpoint": { + "shortDesc": "30% chance a Pokemon making contact with this Pokemon will be poisoned.", + "id": "poisonpoint", + "name": "Poison Point", + "rating": 2, + "num": 38 + }, + "poisontouch": { + "shortDesc": "This Pokemon's contact moves have a 30% chance of poisoning.", + "id": "poisontouch", + "name": "Poison Touch", + "rating": 2, + "num": 143 + }, + "prankster": { + "shortDesc": "This Pokemon's non-damaging moves have their priority increased by 1.", + "id": "prankster", + "name": "Prankster", + "rating": 4.5, + "num": 158 + }, + "pressure": { + "desc": "If this Pokemon is the target of an opposing Pokemon's move, that move loses one additional PP.", + "shortDesc": "If this Pokemon is the target of a foe's move, that move loses one additional PP.", + "id": "pressure", + "name": "Pressure", + "rating": 1.5, + "num": 46 + }, + "primordialsea": { + "desc": "On switch-in, the weather becomes heavy rain that prevents damaging Fire-type moves from executing, in addition to all the effects of Rain Dance. This weather remains in effect until this Ability is no longer active for any Pokemon, or the weather is changed by Delta Stream or Desolate Land.", + "shortDesc": "On switch-in, heavy rain begins until this Ability is not active in battle.", + "id": "primordialsea", + "name": "Primordial Sea", + "rating": 5, + "num": 189 + }, + "protean": { + "desc": "This Pokemon's type changes to match the type of the move it is about to use. This effect comes after all effects that change a move's type.", + "shortDesc": "This Pokemon's type changes to match the type of the move it is about to use.", + "id": "protean", + "name": "Protean", + "rating": 4, + "num": 168 + }, + "purepower": { + "shortDesc": "This Pokemon's Attack is doubled.", + "onModifyAtkPriority": 5, + "id": "purepower", + "name": "Pure Power", + "rating": 5, + "num": 74 + }, + "quickfeet": { + "desc": "If this Pokemon has a major status condition, its Speed is multiplied by 1.5; the Speed drop from paralysis is ignored.", + "shortDesc": "If this Pokemon is statused, its Speed is 1.5x; ignores Speed drop from paralysis.", + "id": "quickfeet", + "name": "Quick Feet", + "rating": 2.5, + "num": 95 + }, + "raindish": { + "desc": "If Rain Dance is active, this Pokemon restores 1/16 of its maximum HP, rounded down, at the end of each turn.", + "shortDesc": "If Rain Dance is active, this Pokemon heals 1/16 of its max HP each turn.", + "id": "raindish", + "name": "Rain Dish", + "rating": 1.5, + "num": 44 + }, + "rattled": { + "desc": "This Pokemon's Speed is raised by 1 stage if hit by a Bug-, Dark-, or Ghost-type attack.", + "shortDesc": "This Pokemon's Speed is raised 1 stage if hit by a Bug-, Dark-, or Ghost-type attack.", + "id": "rattled", + "name": "Rattled", + "rating": 1.5, + "num": 155 + }, + "reckless": { + "desc": "This Pokemon's attacks with recoil or crash damage have their power multiplied by 1.2. Does not affect Struggle.", + "shortDesc": "This Pokemon's attacks with recoil or crash damage have 1.2x power; not Struggle.", + "onBasePowerPriority": 8, + "id": "reckless", + "name": "Reckless", + "rating": 3, + "num": 120 + }, + "refrigerate": { + "desc": "This Pokemon's Normal-type moves become Ice-type moves and have their power multiplied by 1.3. This effect comes after other effects that change a move's type, but before Ion Deluge and Electrify's effects.", + "shortDesc": "This Pokemon's Normal-type moves become Ice type and have 1.3x power.", + "onModifyMovePriority": -1, + "effect": { + "duration": 1, + "onBasePowerPriority": 8 + }, + "id": "refrigerate", + "name": "Refrigerate", + "rating": 4, + "num": 174 + }, + "regenerator": { + "shortDesc": "This Pokemon restores 1/3 of its maximum HP, rounded down, when it switches out.", + "id": "regenerator", + "name": "Regenerator", + "rating": 4, + "num": 144 + }, + "rivalry": { + "desc": "This Pokemon's attacks have their power multiplied by 1.25 against targets of the same gender or multiplied by 0.75 against targets of the opposite gender. There is no modifier if either this Pokemon or the target is genderless.", + "shortDesc": "This Pokemon's attacks do 1.25x on same gender targets; 0.75x on opposite gender.", + "onBasePowerPriority": 8, + "id": "rivalry", + "name": "Rivalry", + "rating": 0.5, + "num": 79 + }, + "rockhead": { + "desc": "This Pokemon does not take recoil damage besides Struggle, Life Orb, and crash damage.", + "shortDesc": "This Pokemon does not take recoil damage besides Struggle/Life Orb/crash damage.", + "id": "rockhead", + "name": "Rock Head", + "rating": 3, + "num": 69 + }, + "roughskin": { + "desc": "Pokemon making contact with this Pokemon lose 1/8 of their maximum HP, rounded down.", + "shortDesc": "Pokemon making contact with this Pokemon lose 1/8 of their max HP.", + "onAfterDamageOrder": 1, + "id": "roughskin", + "name": "Rough Skin", + "rating": 3, + "num": 24 + }, + "runaway": { + "shortDesc": "No competitive use.", + "id": "runaway", + "name": "Run Away", + "rating": 0, + "num": 50 + }, + "sandforce": { + "desc": "If Sandstorm is active, this Pokemon's Ground-, Rock-, and Steel-type attacks have their power multiplied by 1.3. This Pokemon takes no damage from Sandstorm.", + "shortDesc": "This Pokemon's Ground/Rock/Steel attacks do 1.3x in Sandstorm; immunity to it.", + "onBasePowerPriority": 8, + "id": "sandforce", + "name": "Sand Force", + "rating": 2, + "num": 159 + }, + "sandrush": { + "desc": "If Sandstorm is active, this Pokemon's Speed is doubled. This Pokemon takes no damage from Sandstorm.", + "shortDesc": "If Sandstorm is active, this Pokemon's Speed is doubled; immunity to Sandstorm.", + "id": "sandrush", + "name": "Sand Rush", + "rating": 2.5, + "num": 146 + }, + "sandstream": { + "shortDesc": "On switch-in, this Pokemon summons Sandstorm.", + "id": "sandstream", + "name": "Sand Stream", + "rating": 4.5, + "num": 45 + }, + "sandveil": { + "desc": "If Sandstorm is active, this Pokemon's evasiveness is multiplied by 1.25. This Pokemon takes no damage from Sandstorm.", + "shortDesc": "If Sandstorm is active, this Pokemon's evasiveness is 1.25x; immunity to Sandstorm.", + "id": "sandveil", + "name": "Sand Veil", + "rating": 1.5, + "num": 8 + }, + "sapsipper": { + "desc": "This Pokemon is immune to Grass-type moves and raises its Attack by 1 stage when hit by a Grass-type move.", + "shortDesc": "This Pokemon's Attack is raised 1 stage if hit by a Grass move; Grass immunity.", + "id": "sapsipper", + "name": "Sap Sipper", + "rating": 3.5, + "num": 157 + }, + "scrappy": { + "shortDesc": "This Pokemon can hit Ghost types with Normal- and Fighting-type moves.", + "onModifyMovePriority": -5, + "id": "scrappy", + "name": "Scrappy", + "rating": 3, + "num": 113 + }, + "serenegrace": { + "shortDesc": "This Pokemon's moves have their secondary effect chance doubled.", + "onModifyMovePriority": -2, + "id": "serenegrace", + "name": "Serene Grace", + "rating": 4, + "num": 32 + }, + "shadowtag": { + "desc": "Prevents adjacent opposing Pokemon from choosing to switch out unless they are immune to trapping or also have this Ability.", + "shortDesc": "Prevents adjacent foes from choosing to switch unless they also have this Ability.", + "id": "shadowtag", + "name": "Shadow Tag", + "rating": 5, + "num": 23 + }, + "shedskin": { + "desc": "This Pokemon has a 33% chance to have its major status condition cured at the end of each turn.", + "shortDesc": "This Pokemon has a 33% chance to have its status cured at the end of each turn.", + "onResidualOrder": 5, + "onResidualSubOrder": 1, + "id": "shedskin", + "name": "Shed Skin", + "rating": 3.5, + "num": 61 + }, + "sheerforce": { + "desc": "This Pokemon's attacks with secondary effects have their power multiplied by 1.3, but the secondary effects are removed.", + "shortDesc": "This Pokemon's attacks with secondary effects have 1.3x power; nullifies the effects.", + "effect": { + "duration": 1, + "onBasePowerPriority": 8 + }, + "id": "sheerforce", + "name": "Sheer Force", + "rating": 4, + "num": 125 + }, + "shellarmor": { + "shortDesc": "This Pokemon cannot be struck by a critical hit.", + "onCriticalHit": false, + "id": "shellarmor", + "name": "Shell Armor", + "rating": 1, + "num": 75 + }, + "shielddust": { + "shortDesc": "This Pokemon is not affected by the secondary effect of another Pokemon's attack.", + "id": "shielddust", + "name": "Shield Dust", + "rating": 2.5, + "num": 19 + }, + "simple": { + "shortDesc": "If this Pokemon's stat stages are raised or lowered, the effect is doubled instead.", + "id": "simple", + "name": "Simple", + "rating": 4, + "num": 86 + }, + "skilllink": { + "shortDesc": "This Pokemon's multi-hit attacks always hit the maximum number of times.", + "id": "skilllink", + "name": "Skill Link", + "rating": 4, + "num": 92 + }, + "slowstart": { + "shortDesc": "On switch-in, this Pokemon's Attack and Speed are halved for 5 turns.", + "effect": { + "duration": 5, + "onModifyAtkPriority": 5 + }, + "id": "slowstart", + "name": "Slow Start", + "rating": -2, + "num": 112 + }, + "sniper": { + "shortDesc": "If this Pokemon strikes with a critical hit, the damage is multiplied by 1.5.", + "id": "sniper", + "name": "Sniper", + "rating": 1, + "num": 97 + }, + "snowcloak": { + "desc": "If Hail is active, this Pokemon's evasiveness is multiplied by 1.25. This Pokemon takes no damage from Hail.", + "shortDesc": "If Hail is active, this Pokemon's evasiveness is 1.25x; immunity to Hail.", + "id": "snowcloak", + "name": "Snow Cloak", + "rating": 1.5, + "num": 81 + }, + "snowwarning": { + "shortDesc": "On switch-in, this Pokemon summons Hail.", + "id": "snowwarning", + "name": "Snow Warning", + "rating": 4, + "num": 117 + }, + "solarpower": { + "desc": "If Sunny Day is active, this Pokemon's Special Attack is multiplied by 1.5 and it loses 1/8 of its maximum HP, rounded down, at the end of each turn.", + "shortDesc": "If Sunny Day is active, this Pokemon's Sp. Atk is 1.5x; loses 1/8 max HP per turn.", + "onModifySpAPriority": 5, + "id": "solarpower", + "name": "Solar Power", + "rating": 1.5, + "num": 94 + }, + "solidrock": { + "shortDesc": "This Pokemon receives 3/4 damage from supereffective attacks.", + "id": "solidrock", + "name": "Solid Rock", + "rating": 3, + "num": 116 + }, + "soundproof": { + "shortDesc": "This Pokemon is immune to sound-based moves, including Heal Bell.", + "id": "soundproof", + "name": "Soundproof", + "rating": 2, + "num": 43 + }, + "speedboost": { + "desc": "This Pokemon's Speed is raised by 1 stage at the end of each full turn it has been on the field.", + "shortDesc": "This Pokemon's Speed is raised 1 stage at the end of each full turn on the field.", + "onResidualOrder": 26, + "onResidualSubOrder": 1, + "id": "speedboost", + "name": "Speed Boost", + "rating": 4.5, + "num": 3 + }, + "stall": { + "shortDesc": "This Pokemon moves last among Pokemon using the same or greater priority moves.", + "id": "stall", + "name": "Stall", + "rating": -1, + "num": 100 + }, + "stancechange": { + "desc": "If this Pokemon is an Aegislash, it changes to Blade Forme before attempting to use an attacking move, and changes to Shield Forme before attempting to use King's Shield.", + "shortDesc": "If Aegislash, changes Forme to Blade before attacks and Shield before King's Shield.", + "onBeforeMovePriority": 11, + "id": "stancechange", + "name": "Stance Change", + "rating": 5, + "num": 176 + }, + "static": { + "shortDesc": "30% chance a Pokemon making contact with this Pokemon will be paralyzed.", + "id": "static", + "name": "Static", + "rating": 2, + "num": 9 + }, + "steadfast": { + "shortDesc": "If this Pokemon flinches, its Speed is raised by 1 stage.", + "id": "steadfast", + "name": "Steadfast", + "rating": 1, + "num": 80 + }, + "stench": { + "shortDesc": "This Pokemon's attacks without a chance to flinch have a 10% chance to flinch.", + "id": "stench", + "name": "Stench", + "rating": 0.5, + "num": 1 + }, + "stickyhold": { + "shortDesc": "This Pokemon cannot lose its held item due to another Pokemon's attack.", + "id": "stickyhold", + "name": "Sticky Hold", + "rating": 1.5, + "num": 60 + }, + "stormdrain": { + "desc": "This Pokemon is immune to Water-type moves and raises its Special Attack by 1 stage when hit by a Water-type move. If this Pokemon is not the target of a single-target Water-type move used by another Pokemon, this Pokemon redirects that move to itself if it is within the range of that move.", + "shortDesc": "This Pokemon draws Water moves to itself to raise Sp. Atk by 1; Water immunity.", + "id": "stormdrain", + "name": "Storm Drain", + "rating": 3.5, + "num": 114 + }, + "strongjaw": { + "desc": "This Pokemon's bite-based attacks have their power multiplied by 1.5.", + "shortDesc": "This Pokemon's bite-based attacks have 1.5x power. Bug Bite is not boosted.", + "onBasePowerPriority": 8, + "id": "strongjaw", + "name": "Strong Jaw", + "rating": 3, + "num": 173 + }, + "sturdy": { + "desc": "If this Pokemon is at full HP, it survives one hit with at least 1 HP. OHKO moves fail when used against this Pokemon.", + "shortDesc": "If this Pokemon is at full HP, it survives one hit with at least 1 HP. Immune to OHKO.", + "onDamagePriority": -100, + "id": "sturdy", + "name": "Sturdy", + "rating": 3, + "num": 5 + }, + "suctioncups": { + "shortDesc": "This Pokemon cannot be forced to switch out by another Pokemon's attack or item.", + "onDragOutPriority": 1, + "id": "suctioncups", + "name": "Suction Cups", + "rating": 2, + "num": 21 + }, + "superluck": { + "shortDesc": "This Pokemon's critical hit ratio is raised by 1 stage.", + "id": "superluck", + "name": "Super Luck", + "rating": 1.5, + "num": 105 + }, + "swarm": { + "desc": "When this Pokemon has 1/3 or less of its maximum HP, rounded down, its attacking stat is multiplied by 1.5 while using a Bug-type attack.", + "shortDesc": "When this Pokemon has 1/3 or less of its max HP, its Bug attacks do 1.5x damage.", + "onModifyAtkPriority": 5, + "onModifySpAPriority": 5, + "id": "swarm", + "name": "Swarm", + "rating": 2, + "num": 68 + }, + "sweetveil": { + "shortDesc": "This Pokemon and its allies cannot fall asleep.", + "id": "sweetveil", + "name": "Sweet Veil", + "rating": 2, + "num": 175 + }, + "swiftswim": { + "shortDesc": "If Rain Dance is active, this Pokemon's Speed is doubled.", + "id": "swiftswim", + "name": "Swift Swim", + "rating": 2.5, + "num": 33 + }, + "symbiosis": { + "desc": "If an ally uses its item, this Pokemon gives its item to that ally immediately. Does not activate if the ally's item was stolen or knocked off.", + "shortDesc": "If an ally uses its item, this Pokemon gives its item to that ally immediately.", + "id": "symbiosis", + "name": "Symbiosis", + "rating": 0, + "num": 180 + }, + "synchronize": { + "desc": "If another Pokemon burns, paralyzes, poisons, or badly poisons this Pokemon, that Pokemon receives the same major status condition.", + "shortDesc": "If another Pokemon burns/poisons/paralyzes this Pokemon, it also gets that status.", + "id": "synchronize", + "name": "Synchronize", + "rating": 2.5, + "num": 28 + }, + "tangledfeet": { + "shortDesc": "This Pokemon's evasiveness is doubled as long as it is confused.", + "id": "tangledfeet", + "name": "Tangled Feet", + "rating": 1, + "num": 77 + }, + "technician": { + "desc": "This Pokemon's moves of 60 power or less have their power multiplied by 1.5. Does affect Struggle.", + "shortDesc": "This Pokemon's moves of 60 power or less have 1.5x power. Includes Struggle.", + "onBasePowerPriority": 8, + "id": "technician", + "name": "Technician", + "rating": 4, + "num": 101 + }, + "telepathy": { + "shortDesc": "This Pokemon does not take damage from attacks made by its allies.", + "id": "telepathy", + "name": "Telepathy", + "rating": 0, + "num": 140 + }, + "teravolt": { + "shortDesc": "This Pokemon's moves and their effects ignore the Abilities of other Pokemon.", + "stopAttackEvents": true, + "id": "teravolt", + "name": "Teravolt", + "rating": 3.5, + "num": 164 + }, + "thickfat": { + "desc": "If a Pokemon uses a Fire- or Ice-type attack against this Pokemon, that Pokemon's attacking stat is halved when calculating the damage to this Pokemon.", + "shortDesc": "Fire/Ice-type moves against this Pokemon deal damage with a halved attacking stat.", + "onModifyAtkPriority": 6, + "onModifySpAPriority": 5, + "id": "thickfat", + "name": "Thick Fat", + "rating": 3.5, + "num": 47 + }, + "tintedlens": { + "shortDesc": "This Pokemon's attacks that are not very effective on a target deal double damage.", + "id": "tintedlens", + "name": "Tinted Lens", + "rating": 3.5, + "num": 110 + }, + "torrent": { + "desc": "When this Pokemon has 1/3 or less of its maximum HP, rounded down, its attacking stat is multiplied by 1.5 while using a Water-type attack.", + "shortDesc": "When this Pokemon has 1/3 or less of its max HP, its Water attacks do 1.5x damage.", + "onModifyAtkPriority": 5, + "onModifySpAPriority": 5, + "id": "torrent", + "name": "Torrent", + "rating": 2, + "num": 67 + }, + "toxicboost": { + "desc": "While this Pokemon is poisoned, the power of its physical attacks is multiplied by 1.5.", + "shortDesc": "While this Pokemon is poisoned, its physical attacks have 1.5x power.", + "onBasePowerPriority": 8, + "id": "toxicboost", + "name": "Toxic Boost", + "rating": 3, + "num": 137 + }, + "toughclaws": { + "shortDesc": "This Pokemon's contact moves have their power multiplied by 1.3.", + "onBasePowerPriority": 8, + "id": "toughclaws", + "name": "Tough Claws", + "rating": 3.5, + "num": 181 + }, + "trace": { + "desc": "On switch-in, this Pokemon copies a random adjacent opposing Pokemon's Ability. If there is no Ability that can be copied at that time, this Ability will activate as soon as an Ability can be copied. Abilities that cannot be copied are Flower Gift, Forecast, Illusion, Imposter, Multitype, Stance Change, Trace, and Zen Mode.", + "shortDesc": "On switch-in, or when it can, this Pokemon copies a random adjacent foe's Ability.", + "id": "trace", + "name": "Trace", + "rating": 3, + "num": 36 + }, + "truant": { + "shortDesc": "This Pokemon skips every other turn instead of using a move.", + "onBeforeMovePriority": 9, + "effect": { + "duration": 2 + }, + "id": "truant", + "name": "Truant", + "rating": -2, + "num": 54 + }, + "turboblaze": { + "shortDesc": "This Pokemon's moves and their effects ignore the Abilities of other Pokemon.", + "stopAttackEvents": true, + "id": "turboblaze", + "name": "Turboblaze", + "rating": 3.5, + "num": 163 + }, + "unaware": { + "desc": "This Pokemon ignores other Pokemon's Attack, Special Attack, and accuracy stat stages when taking damage, and ignores other Pokemon's Defense, Special Defense, and evasiveness stat stages when dealing damage.", + "shortDesc": "This Pokemon ignores other Pokemon's stat stages when taking or doing damage.", + "id": "unaware", + "name": "Unaware", + "rating": 3, + "num": 109 + }, + "unburden": { + "desc": "If this Pokemon loses its held item for any reason, its Speed is doubled. This boost is lost if it switches out or gains a new item or Ability.", + "shortDesc": "Speed is doubled on held item loss; boost is lost if it switches, gets new item/Ability.", + "effect": {}, + "id": "unburden", + "name": "Unburden", + "rating": 3.5, + "num": 84 + }, + "unnerve": { + "shortDesc": "While this Pokemon is active, it prevents opposing Pokemon from using their Berries.", + "onFoeTryEatItem": false, + "id": "unnerve", + "name": "Unnerve", + "rating": 1.5, + "num": 127 + }, + "victorystar": { + "shortDesc": "This Pokemon and its allies' moves have their accuracy multiplied by 1.1.", + "id": "victorystar", + "name": "Victory Star", + "rating": 2.5, + "num": 162 + }, + "vitalspirit": { + "shortDesc": "This Pokemon cannot fall asleep. Gaining this Ability while asleep cures it.", + "id": "vitalspirit", + "name": "Vital Spirit", + "rating": 2, + "num": 72 + }, + "voltabsorb": { + "desc": "This Pokemon is immune to Electric-type moves and restores 1/4 of its maximum HP, rounded down, when hit by an Electric-type move.", + "shortDesc": "This Pokemon heals 1/4 of its max HP when hit by Electric moves; Electric immunity.", + "id": "voltabsorb", + "name": "Volt Absorb", + "rating": 3.5, + "num": 10 + }, + "waterabsorb": { + "desc": "This Pokemon is immune to Water-type moves and restores 1/4 of its maximum HP, rounded down, when hit by a Water-type move.", + "shortDesc": "This Pokemon heals 1/4 of its max HP when hit by Water moves; Water immunity.", + "id": "waterabsorb", + "name": "Water Absorb", + "rating": 3.5, + "num": 11 + }, + "waterveil": { + "shortDesc": "This Pokemon cannot be burned. Gaining this Ability while burned cures it.", + "id": "waterveil", + "name": "Water Veil", + "rating": 2, + "num": 41 + }, + "weakarmor": { + "desc": "If a physical attack hits this Pokemon, its Defense is lowered by 1 stage and its Speed is raised by 1 stage.", + "shortDesc": "If a physical attack hits this Pokemon, Defense is lowered by 1, Speed is raised by 1.", + "id": "weakarmor", + "name": "Weak Armor", + "rating": 0.5, + "num": 133 + }, + "whitesmoke": { + "shortDesc": "Prevents other Pokemon from lowering this Pokemon's stat stages.", + "id": "whitesmoke", + "name": "White Smoke", + "rating": 2, + "num": 73 + }, + "wonderguard": { + "shortDesc": "This Pokemon can only be damaged by supereffective moves and indirect damage.", + "id": "wonderguard", + "name": "Wonder Guard", + "rating": 5, + "num": 25 + }, + "wonderskin": { + "desc": "All non-damaging moves that check accuracy have their accuracy changed to 50% when used on this Pokemon. This change is done before any other accuracy modifying effects.", + "shortDesc": "Status moves with accuracy checks are 50% accurate when used on this Pokemon.", + "onModifyAccuracyPriority": 10, + "id": "wonderskin", + "name": "Wonder Skin", + "rating": 2, + "num": 147 + }, + "zenmode": { + "desc": "If this Pokemon is a Darmanitan, it changes to Zen Mode if it has 1/2 or less of its maximum HP at the end of a turn. If Darmanitan's HP is above 1/2 of its maximum HP at the end of a turn, it changes back to Standard Mode. If Darmanitan loses this Ability while in Zen Mode it reverts to Standard Mode immediately.", + "shortDesc": "If Darmanitan, at end of turn changes Mode to Standard if > 1/2 max HP, else Zen.", + "onResidualOrder": 27, + "effect": {}, + "id": "zenmode", + "name": "Zen Mode", + "rating": -1, + "num": 161 + }, + "mountaineer": { + "shortDesc": "On switch-in, this Pokemon avoids all Rock-type attacks and Stealth Rock.", + "id": "mountaineer", + "isNonstandard": true, + "name": "Mountaineer", + "rating": 3.5, + "num": -2 + }, + "rebound": { + "desc": "On switch-in, this Pokemon blocks certain status moves and instead uses the move against the original user.", + "shortDesc": "On switch-in, blocks certain status moves and bounces them back to the user.", + "id": "rebound", + "isNonstandard": true, + "name": "Rebound", + "onTryHitPriority": 1, + "effect": { + "duration": 1 + }, + "rating": 3.5, + "num": -3 + }, + "persistent": { + "shortDesc": "The duration of certain field effects is increased by 2 turns if used by this Pokemon.", + "id": "persistent", + "isNonstandard": true, + "name": "Persistent", + "rating": 3.5, + "num": -4 + } +} \ No newline at end of file diff --git a/src/NadekoBot/data/pokemon/pokemon_list.json b/src/NadekoBot/data/pokemon/pokemon_list.json new file mode 100644 index 00000000..d93b3557 --- /dev/null +++ b/src/NadekoBot/data/pokemon/pokemon_list.json @@ -0,0 +1,25607 @@ +{ + "bulbasaur": { + "num": 1, + "species": "Bulbasaur", + "types": [ + "Grass", + "Poison" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 45, + "atk": 49, + "def": 49, + "spa": 65, + "spd": 65, + "spe": 45 + }, + "abilities": { + "0": "Overgrow", + "H": "Chlorophyll" + }, + "heightm": 0.7, + "weightkg": 6.9, + "color": "Green", + "evos": [ + "ivysaur" + ], + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "ivysaur": { + "num": 2, + "species": "Ivysaur", + "types": [ + "Grass", + "Poison" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 60, + "atk": 62, + "def": 63, + "spa": 80, + "spd": 80, + "spe": 60 + }, + "abilities": { + "0": "Overgrow", + "H": "Chlorophyll" + }, + "heightm": 1, + "weightkg": 13, + "color": "Green", + "prevo": "bulbasaur", + "evos": [ + "venusaur" + ], + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "venusaur": { + "num": 3, + "species": "Venusaur", + "types": [ + "Grass", + "Poison" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 80, + "atk": 82, + "def": 83, + "spa": 100, + "spd": 100, + "spe": 80 + }, + "abilities": { + "0": "Overgrow", + "H": "Chlorophyll" + }, + "heightm": 2, + "weightkg": 100, + "color": "Green", + "prevo": "ivysaur", + "evoLevel": 32, + "eggGroups": [ + "Monster", + "Grass" + ], + "otherFormes": [ + "venusaurmega" + ] + }, + "venusaurmega": { + "num": 3, + "species": "Venusaur-Mega", + "baseSpecies": "Venusaur", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Grass", + "Poison" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 80, + "atk": 100, + "def": 123, + "spa": 122, + "spd": 120, + "spe": 80 + }, + "abilities": { + "0": "Thick Fat" + }, + "heightm": 2.4, + "weightkg": 155.5, + "color": "Green", + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "charmander": { + "num": 4, + "species": "Charmander", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 39, + "atk": 52, + "def": 43, + "spa": 60, + "spd": 50, + "spe": 65 + }, + "abilities": { + "0": "Blaze", + "H": "Solar Power" + }, + "heightm": 0.6, + "weightkg": 8.5, + "color": "Red", + "evos": [ + "charmeleon" + ], + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "charmeleon": { + "num": 5, + "species": "Charmeleon", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 58, + "atk": 64, + "def": 58, + "spa": 80, + "spd": 65, + "spe": 80 + }, + "abilities": { + "0": "Blaze", + "H": "Solar Power" + }, + "heightm": 1.1, + "weightkg": 19, + "color": "Red", + "prevo": "charmander", + "evos": [ + "charizard" + ], + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "charizard": { + "num": 6, + "species": "Charizard", + "types": [ + "Fire", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 78, + "atk": 84, + "def": 78, + "spa": 109, + "spd": 85, + "spe": 100 + }, + "abilities": { + "0": "Blaze", + "H": "Solar Power" + }, + "heightm": 1.7, + "weightkg": 90.5, + "color": "Red", + "prevo": "charmeleon", + "evoLevel": 36, + "eggGroups": [ + "Monster", + "Dragon" + ], + "otherFormes": [ + "charizardmegax", + "charizardmegay" + ] + }, + "charizardmegax": { + "num": 6, + "species": "Charizard-Mega-X", + "baseSpecies": "Charizard", + "forme": "Mega-X", + "formeLetter": "M", + "types": [ + "Fire", + "Dragon" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 78, + "atk": 130, + "def": 111, + "spa": 130, + "spd": 85, + "spe": 100 + }, + "abilities": { + "0": "Tough Claws" + }, + "heightm": 1.7, + "weightkg": 110.5, + "color": "Red", + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "charizardmegay": { + "num": 6, + "species": "Charizard-Mega-Y", + "baseSpecies": "Charizard", + "forme": "Mega-Y", + "formeLetter": "M", + "types": [ + "Fire", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 78, + "atk": 104, + "def": 78, + "spa": 159, + "spd": 115, + "spe": 100 + }, + "abilities": { + "0": "Drought" + }, + "heightm": 1.7, + "weightkg": 100.5, + "color": "Red", + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "squirtle": { + "num": 7, + "species": "Squirtle", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 44, + "atk": 48, + "def": 65, + "spa": 50, + "spd": 64, + "spe": 43 + }, + "abilities": { + "0": "Torrent", + "H": "Rain Dish" + }, + "heightm": 0.5, + "weightkg": 9, + "color": "Blue", + "evos": [ + "wartortle" + ], + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "wartortle": { + "num": 8, + "species": "Wartortle", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 59, + "atk": 63, + "def": 80, + "spa": 65, + "spd": 80, + "spe": 58 + }, + "abilities": { + "0": "Torrent", + "H": "Rain Dish" + }, + "heightm": 1, + "weightkg": 22.5, + "color": "Blue", + "prevo": "squirtle", + "evos": [ + "blastoise" + ], + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "blastoise": { + "num": 9, + "species": "Blastoise", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 79, + "atk": 83, + "def": 100, + "spa": 85, + "spd": 105, + "spe": 78 + }, + "abilities": { + "0": "Torrent", + "H": "Rain Dish" + }, + "heightm": 1.6, + "weightkg": 85.5, + "color": "Blue", + "prevo": "wartortle", + "evoLevel": 36, + "eggGroups": [ + "Monster", + "Water 1" + ], + "otherFormes": [ + "blastoisemega" + ] + }, + "blastoisemega": { + "num": 9, + "species": "Blastoise-Mega", + "baseSpecies": "Blastoise", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 79, + "atk": 103, + "def": 120, + "spa": 135, + "spd": 115, + "spe": 78 + }, + "abilities": { + "0": "Mega Launcher" + }, + "heightm": 1.6, + "weightkg": 101.1, + "color": "Blue", + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "caterpie": { + "num": 10, + "species": "Caterpie", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 45, + "atk": 30, + "def": 35, + "spa": 20, + "spd": 20, + "spe": 45 + }, + "abilities": { + "0": "Shield Dust", + "H": "Run Away" + }, + "heightm": 0.3, + "weightkg": 2.9, + "color": "Green", + "evos": [ + "metapod" + ], + "eggGroups": [ + "Bug" + ] + }, + "metapod": { + "num": 11, + "species": "Metapod", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 50, + "atk": 20, + "def": 55, + "spa": 25, + "spd": 25, + "spe": 30 + }, + "abilities": { + "0": "Shed Skin" + }, + "heightm": 0.7, + "weightkg": 9.9, + "color": "Green", + "prevo": "caterpie", + "evos": [ + "butterfree" + ], + "evoLevel": 7, + "eggGroups": [ + "Bug" + ] + }, + "butterfree": { + "num": 12, + "species": "Butterfree", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 60, + "atk": 45, + "def": 50, + "spa": 90, + "spd": 80, + "spe": 70 + }, + "abilities": { + "0": "Compound Eyes", + "H": "Tinted Lens" + }, + "heightm": 1.1, + "weightkg": 32, + "color": "White", + "prevo": "metapod", + "evoLevel": 10, + "eggGroups": [ + "Bug" + ] + }, + "weedle": { + "num": 13, + "species": "Weedle", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 40, + "atk": 35, + "def": 30, + "spa": 20, + "spd": 20, + "spe": 50 + }, + "abilities": { + "0": "Shield Dust", + "H": "Run Away" + }, + "heightm": 0.3, + "weightkg": 3.2, + "color": "Brown", + "evos": [ + "kakuna" + ], + "eggGroups": [ + "Bug" + ] + }, + "kakuna": { + "num": 14, + "species": "Kakuna", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 45, + "atk": 25, + "def": 50, + "spa": 25, + "spd": 25, + "spe": 35 + }, + "abilities": { + "0": "Shed Skin" + }, + "heightm": 0.6, + "weightkg": 10, + "color": "Yellow", + "prevo": "weedle", + "evos": [ + "beedrill" + ], + "evoLevel": 7, + "eggGroups": [ + "Bug" + ] + }, + "beedrill": { + "num": 15, + "species": "Beedrill", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 65, + "atk": 90, + "def": 40, + "spa": 45, + "spd": 80, + "spe": 75 + }, + "abilities": { + "0": "Swarm", + "H": "Sniper" + }, + "heightm": 1, + "weightkg": 29.5, + "color": "Yellow", + "prevo": "kakuna", + "evoLevel": 10, + "eggGroups": [ + "Bug" + ], + "otherFormes": [ + "beedrillmega" + ] + }, + "beedrillmega": { + "num": 15, + "species": "Beedrill-Mega", + "baseSpecies": "Beedrill", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 65, + "atk": 150, + "def": 40, + "spa": 15, + "spd": 80, + "spe": 145 + }, + "abilities": { + "0": "Adaptability" + }, + "heightm": 1.4, + "weightkg": 40.5, + "color": "Yellow", + "eggGroups": [ + "Bug" + ] + }, + "pidgey": { + "num": 16, + "species": "Pidgey", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 45, + "def": 40, + "spa": 35, + "spd": 35, + "spe": 56 + }, + "abilities": { + "0": "Keen Eye", + "1": "Tangled Feet", + "H": "Big Pecks" + }, + "heightm": 0.3, + "weightkg": 1.8, + "color": "Brown", + "evos": [ + "pidgeotto" + ], + "eggGroups": [ + "Flying" + ] + }, + "pidgeotto": { + "num": 17, + "species": "Pidgeotto", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 63, + "atk": 60, + "def": 55, + "spa": 50, + "spd": 50, + "spe": 71 + }, + "abilities": { + "0": "Keen Eye", + "1": "Tangled Feet", + "H": "Big Pecks" + }, + "heightm": 1.1, + "weightkg": 30, + "color": "Brown", + "prevo": "pidgey", + "evos": [ + "pidgeot" + ], + "evoLevel": 18, + "eggGroups": [ + "Flying" + ] + }, + "pidgeot": { + "num": 18, + "species": "Pidgeot", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 83, + "atk": 80, + "def": 75, + "spa": 70, + "spd": 70, + "spe": 101 + }, + "abilities": { + "0": "Keen Eye", + "1": "Tangled Feet", + "H": "Big Pecks" + }, + "heightm": 1.5, + "weightkg": 39.5, + "color": "Brown", + "prevo": "pidgeotto", + "evoLevel": 36, + "eggGroups": [ + "Flying" + ], + "otherFormes": [ + "pidgeotmega" + ] + }, + "pidgeotmega": { + "num": 18, + "species": "Pidgeot-Mega", + "baseSpecies": "Pidgeot", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 83, + "atk": 80, + "def": 80, + "spa": 135, + "spd": 80, + "spe": 121 + }, + "abilities": { + "0": "No Guard" + }, + "heightm": 2.2, + "weightkg": 50.5, + "color": "Brown", + "eggGroups": [ + "Flying" + ] + }, + "rattata": { + "num": 19, + "species": "Rattata", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 30, + "atk": 56, + "def": 35, + "spa": 25, + "spd": 35, + "spe": 72 + }, + "abilities": { + "0": "Run Away", + "1": "Guts", + "H": "Hustle" + }, + "heightm": 0.3, + "weightkg": 3.5, + "color": "Purple", + "evos": [ + "raticate" + ], + "eggGroups": [ + "Field" + ] + }, + "raticate": { + "num": 20, + "species": "Raticate", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 55, + "atk": 81, + "def": 60, + "spa": 50, + "spd": 70, + "spe": 97 + }, + "abilities": { + "0": "Run Away", + "1": "Guts", + "H": "Hustle" + }, + "heightm": 0.7, + "weightkg": 18.5, + "color": "Brown", + "prevo": "rattata", + "evoLevel": 20, + "eggGroups": [ + "Field" + ] + }, + "spearow": { + "num": 21, + "species": "Spearow", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 60, + "def": 30, + "spa": 31, + "spd": 31, + "spe": 70 + }, + "abilities": { + "0": "Keen Eye", + "H": "Sniper" + }, + "heightm": 0.3, + "weightkg": 2, + "color": "Brown", + "evos": [ + "fearow" + ], + "eggGroups": [ + "Flying" + ] + }, + "fearow": { + "num": 22, + "species": "Fearow", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 65, + "atk": 90, + "def": 65, + "spa": 61, + "spd": 61, + "spe": 100 + }, + "abilities": { + "0": "Keen Eye", + "H": "Sniper" + }, + "heightm": 1.2, + "weightkg": 38, + "color": "Brown", + "prevo": "spearow", + "evoLevel": 20, + "eggGroups": [ + "Flying" + ] + }, + "ekans": { + "num": 23, + "species": "Ekans", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 35, + "atk": 60, + "def": 44, + "spa": 40, + "spd": 54, + "spe": 55 + }, + "abilities": { + "0": "Intimidate", + "1": "Shed Skin", + "H": "Unnerve" + }, + "heightm": 2, + "weightkg": 6.9, + "color": "Purple", + "evos": [ + "arbok" + ], + "eggGroups": [ + "Field", + "Dragon" + ] + }, + "arbok": { + "num": 24, + "species": "Arbok", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 85, + "def": 69, + "spa": 65, + "spd": 79, + "spe": 80 + }, + "abilities": { + "0": "Intimidate", + "1": "Shed Skin", + "H": "Unnerve" + }, + "heightm": 3.5, + "weightkg": 65, + "color": "Purple", + "prevo": "ekans", + "evoLevel": 22, + "eggGroups": [ + "Field", + "Dragon" + ] + }, + "pikachu": { + "num": 25, + "species": "Pikachu", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Static", + "H": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Yellow", + "prevo": "pichu", + "evos": [ + "raichu" + ], + "evoLevel": 1, + "eggGroups": [ + "Field", + "Fairy" + ], + "otherFormes": [ + "pikachucosplay", + "pikachurockstar", + "pikachubelle", + "pikachupopstar", + "pikachuphd", + "pikachulibre" + ] + }, + "pikachucosplay": { + "num": 25, + "species": "Pikachu-Cosplay", + "baseSpecies": "Pikachu", + "forme": "Cosplay", + "formeLetter": "C", + "types": [ + "Electric" + ], + "gender": "F", + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "pikachurockstar": { + "num": 25, + "species": "Pikachu-Rock-Star", + "baseSpecies": "Pikachu", + "forme": "Rock-Star", + "formeLetter": "R", + "types": [ + "Electric" + ], + "gender": "F", + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "pikachubelle": { + "num": 25, + "species": "Pikachu-Belle", + "baseSpecies": "Pikachu", + "forme": "Belle", + "formeLetter": "B", + "types": [ + "Electric" + ], + "gender": "F", + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "pikachupopstar": { + "num": 25, + "species": "Pikachu-Pop-Star", + "baseSpecies": "Pikachu", + "forme": "Pop-Star", + "formeLetter": "P", + "types": [ + "Electric" + ], + "gender": "F", + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "pikachuphd": { + "num": 25, + "species": "Pikachu-PhD", + "baseSpecies": "Pikachu", + "forme": "PhD", + "formeLetter": "D", + "types": [ + "Electric" + ], + "gender": "F", + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "pikachulibre": { + "num": 25, + "species": "Pikachu-Libre", + "baseSpecies": "Pikachu", + "forme": "Libre", + "formeLetter": "L", + "types": [ + "Electric" + ], + "gender": "F", + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "raichu": { + "num": 26, + "species": "Raichu", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 60, + "atk": 90, + "def": 55, + "spa": 90, + "spd": 80, + "spe": 110 + }, + "abilities": { + "0": "Static", + "H": "Lightning Rod" + }, + "heightm": 0.8, + "weightkg": 30, + "color": "Yellow", + "prevo": "pikachu", + "evoLevel": 1, + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "sandshrew": { + "num": 27, + "species": "Sandshrew", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 50, + "atk": 75, + "def": 85, + "spa": 20, + "spd": 30, + "spe": 40 + }, + "abilities": { + "0": "Sand Veil", + "H": "Sand Rush" + }, + "heightm": 0.6, + "weightkg": 12, + "color": "Yellow", + "evos": [ + "sandslash" + ], + "eggGroups": [ + "Field" + ] + }, + "sandslash": { + "num": 28, + "species": "Sandslash", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 75, + "atk": 100, + "def": 110, + "spa": 45, + "spd": 55, + "spe": 65 + }, + "abilities": { + "0": "Sand Veil", + "H": "Sand Rush" + }, + "heightm": 1, + "weightkg": 29.5, + "color": "Yellow", + "prevo": "sandshrew", + "evoLevel": 22, + "eggGroups": [ + "Field" + ] + }, + "nidoranf": { + "num": 29, + "species": "Nidoran-F", + "types": [ + "Poison" + ], + "gender": "F", + "baseStats": { + "hp": 55, + "atk": 47, + "def": 52, + "spa": 40, + "spd": 40, + "spe": 41 + }, + "abilities": { + "0": "Poison Point", + "1": "Rivalry", + "H": "Hustle" + }, + "heightm": 0.4, + "weightkg": 7, + "color": "Blue", + "evos": [ + "nidorina" + ], + "eggGroups": [ + "Monster", + "Field" + ] + }, + "nidorina": { + "num": 30, + "species": "Nidorina", + "types": [ + "Poison" + ], + "gender": "F", + "baseStats": { + "hp": 70, + "atk": 62, + "def": 67, + "spa": 55, + "spd": 55, + "spe": 56 + }, + "abilities": { + "0": "Poison Point", + "1": "Rivalry", + "H": "Hustle" + }, + "heightm": 0.8, + "weightkg": 20, + "color": "Blue", + "prevo": "nidoranf", + "evos": [ + "nidoqueen" + ], + "evoLevel": 16, + "eggGroups": [ + "Undiscovered" + ] + }, + "nidoqueen": { + "num": 31, + "species": "Nidoqueen", + "types": [ + "Poison", + "Ground" + ], + "gender": "F", + "baseStats": { + "hp": 90, + "atk": 92, + "def": 87, + "spa": 75, + "spd": 85, + "spe": 76 + }, + "abilities": { + "0": "Poison Point", + "1": "Rivalry", + "H": "Sheer Force" + }, + "heightm": 1.3, + "weightkg": 60, + "color": "Blue", + "prevo": "nidorina", + "evoLevel": 16, + "eggGroups": [ + "Undiscovered" + ] + }, + "nidoranm": { + "num": 32, + "species": "Nidoran-M", + "types": [ + "Poison" + ], + "gender": "M", + "baseStats": { + "hp": 46, + "atk": 57, + "def": 40, + "spa": 40, + "spd": 40, + "spe": 50 + }, + "abilities": { + "0": "Poison Point", + "1": "Rivalry", + "H": "Hustle" + }, + "heightm": 0.5, + "weightkg": 9, + "color": "Purple", + "evos": [ + "nidorino" + ], + "eggGroups": [ + "Monster", + "Field" + ] + }, + "nidorino": { + "num": 33, + "species": "Nidorino", + "types": [ + "Poison" + ], + "gender": "M", + "baseStats": { + "hp": 61, + "atk": 72, + "def": 57, + "spa": 55, + "spd": 55, + "spe": 65 + }, + "abilities": { + "0": "Poison Point", + "1": "Rivalry", + "H": "Hustle" + }, + "heightm": 0.9, + "weightkg": 19.5, + "color": "Purple", + "prevo": "nidoranm", + "evos": [ + "nidoking" + ], + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Field" + ] + }, + "nidoking": { + "num": 34, + "species": "Nidoking", + "types": [ + "Poison", + "Ground" + ], + "gender": "M", + "baseStats": { + "hp": 81, + "atk": 102, + "def": 77, + "spa": 85, + "spd": 75, + "spe": 85 + }, + "abilities": { + "0": "Poison Point", + "1": "Rivalry", + "H": "Sheer Force" + }, + "heightm": 1.4, + "weightkg": 62, + "color": "Purple", + "prevo": "nidorino", + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Field" + ] + }, + "clefairy": { + "num": 35, + "species": "Clefairy", + "types": [ + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 70, + "atk": 45, + "def": 48, + "spa": 60, + "spd": 65, + "spe": 35 + }, + "abilities": { + "0": "Cute Charm", + "1": "Magic Guard", + "H": "Friend Guard" + }, + "heightm": 0.6, + "weightkg": 7.5, + "color": "Pink", + "prevo": "cleffa", + "evos": [ + "clefable" + ], + "evoLevel": 1, + "eggGroups": [ + "Fairy" + ] + }, + "clefable": { + "num": 36, + "species": "Clefable", + "types": [ + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 95, + "atk": 70, + "def": 73, + "spa": 95, + "spd": 90, + "spe": 60 + }, + "abilities": { + "0": "Cute Charm", + "1": "Magic Guard", + "H": "Unaware" + }, + "heightm": 1.3, + "weightkg": 40, + "color": "Pink", + "prevo": "clefairy", + "evoLevel": 1, + "eggGroups": [ + "Fairy" + ] + }, + "vulpix": { + "num": 37, + "species": "Vulpix", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 38, + "atk": 41, + "def": 40, + "spa": 50, + "spd": 65, + "spe": 65 + }, + "abilities": { + "0": "Flash Fire", + "H": "Drought" + }, + "heightm": 0.6, + "weightkg": 9.9, + "color": "Brown", + "evos": [ + "ninetales" + ], + "eggGroups": [ + "Field" + ] + }, + "ninetales": { + "num": 38, + "species": "Ninetales", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 73, + "atk": 76, + "def": 75, + "spa": 81, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Flash Fire", + "H": "Drought" + }, + "heightm": 1.1, + "weightkg": 19.9, + "color": "Yellow", + "prevo": "vulpix", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "jigglypuff": { + "num": 39, + "species": "Jigglypuff", + "types": [ + "Normal", + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 115, + "atk": 45, + "def": 20, + "spa": 45, + "spd": 25, + "spe": 20 + }, + "abilities": { + "0": "Cute Charm", + "1": "Competitive", + "H": "Friend Guard" + }, + "heightm": 0.5, + "weightkg": 5.5, + "color": "Pink", + "prevo": "igglybuff", + "evos": [ + "wigglytuff" + ], + "evoLevel": 1, + "eggGroups": [ + "Fairy" + ] + }, + "wigglytuff": { + "num": 40, + "species": "Wigglytuff", + "types": [ + "Normal", + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 140, + "atk": 70, + "def": 45, + "spa": 85, + "spd": 50, + "spe": 45 + }, + "abilities": { + "0": "Cute Charm", + "1": "Competitive", + "H": "Frisk" + }, + "heightm": 1, + "weightkg": 12, + "color": "Pink", + "prevo": "jigglypuff", + "evoLevel": 1, + "eggGroups": [ + "Fairy" + ] + }, + "zubat": { + "num": 41, + "species": "Zubat", + "types": [ + "Poison", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 45, + "def": 35, + "spa": 30, + "spd": 40, + "spe": 55 + }, + "abilities": { + "0": "Inner Focus", + "H": "Infiltrator" + }, + "heightm": 0.8, + "weightkg": 7.5, + "color": "Purple", + "evos": [ + "golbat" + ], + "eggGroups": [ + "Flying" + ] + }, + "golbat": { + "num": 42, + "species": "Golbat", + "types": [ + "Poison", + "Flying" + ], + "baseStats": { + "hp": 75, + "atk": 80, + "def": 70, + "spa": 65, + "spd": 75, + "spe": 90 + }, + "abilities": { + "0": "Inner Focus", + "H": "Infiltrator" + }, + "heightm": 1.6, + "weightkg": 55, + "color": "Purple", + "prevo": "zubat", + "evos": [ + "crobat" + ], + "evoLevel": 22, + "eggGroups": [ + "Flying" + ] + }, + "oddish": { + "num": 43, + "species": "Oddish", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 45, + "atk": 50, + "def": 55, + "spa": 75, + "spd": 65, + "spe": 30 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Run Away" + }, + "heightm": 0.5, + "weightkg": 5.4, + "color": "Blue", + "evos": [ + "gloom" + ], + "eggGroups": [ + "Grass" + ] + }, + "gloom": { + "num": 44, + "species": "Gloom", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 65, + "def": 70, + "spa": 85, + "spd": 75, + "spe": 40 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Stench" + }, + "heightm": 0.8, + "weightkg": 8.6, + "color": "Blue", + "prevo": "oddish", + "evos": [ + "vileplume", + "bellossom" + ], + "evoLevel": 21, + "eggGroups": [ + "Grass" + ] + }, + "vileplume": { + "num": 45, + "species": "Vileplume", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 75, + "atk": 80, + "def": 85, + "spa": 110, + "spd": 90, + "spe": 50 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Effect Spore" + }, + "heightm": 1.2, + "weightkg": 18.6, + "color": "Red", + "prevo": "gloom", + "evoLevel": 21, + "eggGroups": [ + "Grass" + ] + }, + "paras": { + "num": 46, + "species": "Paras", + "types": [ + "Bug", + "Grass" + ], + "baseStats": { + "hp": 35, + "atk": 70, + "def": 55, + "spa": 45, + "spd": 55, + "spe": 25 + }, + "abilities": { + "0": "Effect Spore", + "1": "Dry Skin", + "H": "Damp" + }, + "heightm": 0.3, + "weightkg": 5.4, + "color": "Red", + "evos": [ + "parasect" + ], + "eggGroups": [ + "Bug", + "Grass" + ] + }, + "parasect": { + "num": 47, + "species": "Parasect", + "types": [ + "Bug", + "Grass" + ], + "baseStats": { + "hp": 60, + "atk": 95, + "def": 80, + "spa": 60, + "spd": 80, + "spe": 30 + }, + "abilities": { + "0": "Effect Spore", + "1": "Dry Skin", + "H": "Damp" + }, + "heightm": 1, + "weightkg": 29.5, + "color": "Red", + "prevo": "paras", + "evoLevel": 24, + "eggGroups": [ + "Bug", + "Grass" + ] + }, + "venonat": { + "num": 48, + "species": "Venonat", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 55, + "def": 50, + "spa": 40, + "spd": 55, + "spe": 45 + }, + "abilities": { + "0": "Compound Eyes", + "1": "Tinted Lens", + "H": "Run Away" + }, + "heightm": 1, + "weightkg": 30, + "color": "Purple", + "evos": [ + "venomoth" + ], + "eggGroups": [ + "Bug" + ] + }, + "venomoth": { + "num": 49, + "species": "Venomoth", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 70, + "atk": 65, + "def": 60, + "spa": 90, + "spd": 75, + "spe": 90 + }, + "abilities": { + "0": "Shield Dust", + "1": "Tinted Lens", + "H": "Wonder Skin" + }, + "heightm": 1.5, + "weightkg": 12.5, + "color": "Purple", + "prevo": "venonat", + "evoLevel": 31, + "eggGroups": [ + "Bug" + ] + }, + "diglett": { + "num": 50, + "species": "Diglett", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 10, + "atk": 55, + "def": 25, + "spa": 35, + "spd": 45, + "spe": 95 + }, + "abilities": { + "0": "Sand Veil", + "1": "Arena Trap", + "H": "Sand Force" + }, + "heightm": 0.2, + "weightkg": 0.8, + "color": "Brown", + "evos": [ + "dugtrio" + ], + "eggGroups": [ + "Field" + ] + }, + "dugtrio": { + "num": 51, + "species": "Dugtrio", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 35, + "atk": 80, + "def": 50, + "spa": 50, + "spd": 70, + "spe": 120 + }, + "abilities": { + "0": "Sand Veil", + "1": "Arena Trap", + "H": "Sand Force" + }, + "heightm": 0.7, + "weightkg": 33.3, + "color": "Brown", + "prevo": "diglett", + "evoLevel": 26, + "eggGroups": [ + "Field" + ] + }, + "meowth": { + "num": 52, + "species": "Meowth", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 40, + "atk": 45, + "def": 35, + "spa": 40, + "spd": 40, + "spe": 90 + }, + "abilities": { + "0": "Pickup", + "1": "Technician", + "H": "Unnerve" + }, + "heightm": 0.4, + "weightkg": 4.2, + "color": "Yellow", + "evos": [ + "persian" + ], + "eggGroups": [ + "Field" + ] + }, + "persian": { + "num": 53, + "species": "Persian", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 65, + "atk": 70, + "def": 60, + "spa": 65, + "spd": 65, + "spe": 115 + }, + "abilities": { + "0": "Limber", + "1": "Technician", + "H": "Unnerve" + }, + "heightm": 1, + "weightkg": 32, + "color": "Yellow", + "prevo": "meowth", + "evoLevel": 28, + "eggGroups": [ + "Field" + ] + }, + "psyduck": { + "num": 54, + "species": "Psyduck", + "types": [ + "Water" + ], + "baseStats": { + "hp": 50, + "atk": 52, + "def": 48, + "spa": 65, + "spd": 50, + "spe": 55 + }, + "abilities": { + "0": "Damp", + "1": "Cloud Nine", + "H": "Swift Swim" + }, + "heightm": 0.8, + "weightkg": 19.6, + "color": "Yellow", + "evos": [ + "golduck" + ], + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "golduck": { + "num": 55, + "species": "Golduck", + "types": [ + "Water" + ], + "baseStats": { + "hp": 80, + "atk": 82, + "def": 78, + "spa": 95, + "spd": 80, + "spe": 85 + }, + "abilities": { + "0": "Damp", + "1": "Cloud Nine", + "H": "Swift Swim" + }, + "heightm": 1.7, + "weightkg": 76.6, + "color": "Blue", + "prevo": "psyduck", + "evoLevel": 33, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "mankey": { + "num": 56, + "species": "Mankey", + "types": [ + "Fighting" + ], + "baseStats": { + "hp": 40, + "atk": 80, + "def": 35, + "spa": 35, + "spd": 45, + "spe": 70 + }, + "abilities": { + "0": "Vital Spirit", + "1": "Anger Point", + "H": "Defiant" + }, + "heightm": 0.5, + "weightkg": 28, + "color": "Brown", + "evos": [ + "primeape" + ], + "eggGroups": [ + "Field" + ] + }, + "primeape": { + "num": 57, + "species": "Primeape", + "types": [ + "Fighting" + ], + "baseStats": { + "hp": 65, + "atk": 105, + "def": 60, + "spa": 60, + "spd": 70, + "spe": 95 + }, + "abilities": { + "0": "Vital Spirit", + "1": "Anger Point", + "H": "Defiant" + }, + "heightm": 1, + "weightkg": 32, + "color": "Brown", + "prevo": "mankey", + "evoLevel": 28, + "eggGroups": [ + "Field" + ] + }, + "growlithe": { + "num": 58, + "species": "Growlithe", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 55, + "atk": 70, + "def": 45, + "spa": 70, + "spd": 50, + "spe": 60 + }, + "abilities": { + "0": "Intimidate", + "1": "Flash Fire", + "H": "Justified" + }, + "heightm": 0.7, + "weightkg": 19, + "color": "Brown", + "evos": [ + "arcanine" + ], + "eggGroups": [ + "Field" + ] + }, + "arcanine": { + "num": 59, + "species": "Arcanine", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 90, + "atk": 110, + "def": 80, + "spa": 100, + "spd": 80, + "spe": 95 + }, + "abilities": { + "0": "Intimidate", + "1": "Flash Fire", + "H": "Justified" + }, + "heightm": 1.9, + "weightkg": 155, + "color": "Brown", + "prevo": "growlithe", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "poliwag": { + "num": 60, + "species": "Poliwag", + "types": [ + "Water" + ], + "baseStats": { + "hp": 40, + "atk": 50, + "def": 40, + "spa": 40, + "spd": 40, + "spe": 90 + }, + "abilities": { + "0": "Water Absorb", + "1": "Damp", + "H": "Swift Swim" + }, + "heightm": 0.6, + "weightkg": 12.4, + "color": "Blue", + "evos": [ + "poliwhirl" + ], + "eggGroups": [ + "Water 1" + ] + }, + "poliwhirl": { + "num": 61, + "species": "Poliwhirl", + "types": [ + "Water" + ], + "baseStats": { + "hp": 65, + "atk": 65, + "def": 65, + "spa": 50, + "spd": 50, + "spe": 90 + }, + "abilities": { + "0": "Water Absorb", + "1": "Damp", + "H": "Swift Swim" + }, + "heightm": 1, + "weightkg": 20, + "color": "Blue", + "prevo": "poliwag", + "evos": [ + "poliwrath", + "politoed" + ], + "evoLevel": 25, + "eggGroups": [ + "Water 1" + ] + }, + "poliwrath": { + "num": 62, + "species": "Poliwrath", + "types": [ + "Water", + "Fighting" + ], + "baseStats": { + "hp": 90, + "atk": 95, + "def": 95, + "spa": 70, + "spd": 90, + "spe": 70 + }, + "abilities": { + "0": "Water Absorb", + "1": "Damp", + "H": "Swift Swim" + }, + "heightm": 1.3, + "weightkg": 54, + "color": "Blue", + "prevo": "poliwhirl", + "evoLevel": 25, + "eggGroups": [ + "Water 1" + ] + }, + "abra": { + "num": 63, + "species": "Abra", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 25, + "atk": 20, + "def": 15, + "spa": 105, + "spd": 55, + "spe": 90 + }, + "abilities": { + "0": "Synchronize", + "1": "Inner Focus", + "H": "Magic Guard" + }, + "heightm": 0.9, + "weightkg": 19.5, + "color": "Brown", + "evos": [ + "kadabra" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "kadabra": { + "num": 64, + "species": "Kadabra", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 40, + "atk": 35, + "def": 30, + "spa": 120, + "spd": 70, + "spe": 105 + }, + "abilities": { + "0": "Synchronize", + "1": "Inner Focus", + "H": "Magic Guard" + }, + "heightm": 1.3, + "weightkg": 56.5, + "color": "Brown", + "prevo": "abra", + "evos": [ + "alakazam" + ], + "evoLevel": 16, + "eggGroups": [ + "Human-Like" + ] + }, + "alakazam": { + "num": 65, + "species": "Alakazam", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 55, + "atk": 50, + "def": 45, + "spa": 135, + "spd": 95, + "spe": 120 + }, + "abilities": { + "0": "Synchronize", + "1": "Inner Focus", + "H": "Magic Guard" + }, + "heightm": 1.5, + "weightkg": 48, + "color": "Brown", + "prevo": "kadabra", + "evoLevel": 16, + "eggGroups": [ + "Human-Like" + ], + "otherFormes": [ + "alakazammega" + ] + }, + "alakazammega": { + "num": 65, + "species": "Alakazam-Mega", + "baseSpecies": "Alakazam", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 55, + "atk": 50, + "def": 65, + "spa": 175, + "spd": 95, + "spe": 150 + }, + "abilities": { + "0": "Trace" + }, + "heightm": 1.2, + "weightkg": 48, + "color": "Brown", + "eggGroups": [ + "Human-Like" + ] + }, + "machop": { + "num": 66, + "species": "Machop", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 70, + "atk": 80, + "def": 50, + "spa": 35, + "spd": 35, + "spe": 35 + }, + "abilities": { + "0": "Guts", + "1": "No Guard", + "H": "Steadfast" + }, + "heightm": 0.8, + "weightkg": 19.5, + "color": "Gray", + "evos": [ + "machoke" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "machoke": { + "num": 67, + "species": "Machoke", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 80, + "atk": 100, + "def": 70, + "spa": 50, + "spd": 60, + "spe": 45 + }, + "abilities": { + "0": "Guts", + "1": "No Guard", + "H": "Steadfast" + }, + "heightm": 1.5, + "weightkg": 70.5, + "color": "Gray", + "prevo": "machop", + "evos": [ + "machamp" + ], + "evoLevel": 28, + "eggGroups": [ + "Human-Like" + ] + }, + "machamp": { + "num": 68, + "species": "Machamp", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 90, + "atk": 130, + "def": 80, + "spa": 65, + "spd": 85, + "spe": 55 + }, + "abilities": { + "0": "Guts", + "1": "No Guard", + "H": "Steadfast" + }, + "heightm": 1.6, + "weightkg": 130, + "color": "Gray", + "prevo": "machoke", + "evoLevel": 28, + "eggGroups": [ + "Human-Like" + ] + }, + "bellsprout": { + "num": 69, + "species": "Bellsprout", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 50, + "atk": 75, + "def": 35, + "spa": 70, + "spd": 30, + "spe": 40 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Gluttony" + }, + "heightm": 0.7, + "weightkg": 4, + "color": "Green", + "evos": [ + "weepinbell" + ], + "eggGroups": [ + "Grass" + ] + }, + "weepinbell": { + "num": 70, + "species": "Weepinbell", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 65, + "atk": 90, + "def": 50, + "spa": 85, + "spd": 45, + "spe": 55 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Gluttony" + }, + "heightm": 1, + "weightkg": 6.4, + "color": "Green", + "prevo": "bellsprout", + "evos": [ + "victreebel" + ], + "evoLevel": 21, + "eggGroups": [ + "Grass" + ] + }, + "victreebel": { + "num": 71, + "species": "Victreebel", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 80, + "atk": 105, + "def": 65, + "spa": 100, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Gluttony" + }, + "heightm": 1.7, + "weightkg": 15.5, + "color": "Green", + "prevo": "weepinbell", + "evoLevel": 21, + "eggGroups": [ + "Grass" + ] + }, + "tentacool": { + "num": 72, + "species": "Tentacool", + "types": [ + "Water", + "Poison" + ], + "baseStats": { + "hp": 40, + "atk": 40, + "def": 35, + "spa": 50, + "spd": 100, + "spe": 70 + }, + "abilities": { + "0": "Clear Body", + "1": "Liquid Ooze", + "H": "Rain Dish" + }, + "heightm": 0.9, + "weightkg": 45.5, + "color": "Blue", + "evos": [ + "tentacruel" + ], + "eggGroups": [ + "Water 3" + ] + }, + "tentacruel": { + "num": 73, + "species": "Tentacruel", + "types": [ + "Water", + "Poison" + ], + "baseStats": { + "hp": 80, + "atk": 70, + "def": 65, + "spa": 80, + "spd": 120, + "spe": 100 + }, + "abilities": { + "0": "Clear Body", + "1": "Liquid Ooze", + "H": "Rain Dish" + }, + "heightm": 1.6, + "weightkg": 55, + "color": "Blue", + "prevo": "tentacool", + "evoLevel": 30, + "eggGroups": [ + "Water 3" + ] + }, + "geodude": { + "num": 74, + "species": "Geodude", + "types": [ + "Rock", + "Ground" + ], + "baseStats": { + "hp": 40, + "atk": 80, + "def": 100, + "spa": 30, + "spd": 30, + "spe": 20 + }, + "abilities": { + "0": "Rock Head", + "1": "Sturdy", + "H": "Sand Veil" + }, + "heightm": 0.4, + "weightkg": 20, + "color": "Brown", + "evos": [ + "graveler" + ], + "eggGroups": [ + "Mineral" + ] + }, + "graveler": { + "num": 75, + "species": "Graveler", + "types": [ + "Rock", + "Ground" + ], + "baseStats": { + "hp": 55, + "atk": 95, + "def": 115, + "spa": 45, + "spd": 45, + "spe": 35 + }, + "abilities": { + "0": "Rock Head", + "1": "Sturdy", + "H": "Sand Veil" + }, + "heightm": 1, + "weightkg": 105, + "color": "Brown", + "prevo": "geodude", + "evos": [ + "golem" + ], + "evoLevel": 25, + "eggGroups": [ + "Mineral" + ] + }, + "golem": { + "num": 76, + "species": "Golem", + "types": [ + "Rock", + "Ground" + ], + "baseStats": { + "hp": 80, + "atk": 120, + "def": 130, + "spa": 55, + "spd": 65, + "spe": 45 + }, + "abilities": { + "0": "Rock Head", + "1": "Sturdy", + "H": "Sand Veil" + }, + "heightm": 1.4, + "weightkg": 300, + "color": "Brown", + "prevo": "graveler", + "evoLevel": 25, + "eggGroups": [ + "Mineral" + ] + }, + "ponyta": { + "num": 77, + "species": "Ponyta", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 50, + "atk": 85, + "def": 55, + "spa": 65, + "spd": 65, + "spe": 90 + }, + "abilities": { + "0": "Run Away", + "1": "Flash Fire", + "H": "Flame Body" + }, + "heightm": 1, + "weightkg": 30, + "color": "Yellow", + "evos": [ + "rapidash" + ], + "eggGroups": [ + "Field" + ] + }, + "rapidash": { + "num": 78, + "species": "Rapidash", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 65, + "atk": 100, + "def": 70, + "spa": 80, + "spd": 80, + "spe": 105 + }, + "abilities": { + "0": "Run Away", + "1": "Flash Fire", + "H": "Flame Body" + }, + "heightm": 1.7, + "weightkg": 95, + "color": "Yellow", + "prevo": "ponyta", + "evoLevel": 40, + "eggGroups": [ + "Field" + ] + }, + "slowpoke": { + "num": 79, + "species": "Slowpoke", + "types": [ + "Water", + "Psychic" + ], + "baseStats": { + "hp": 90, + "atk": 65, + "def": 65, + "spa": 40, + "spd": 40, + "spe": 15 + }, + "abilities": { + "0": "Oblivious", + "1": "Own Tempo", + "H": "Regenerator" + }, + "heightm": 1.2, + "weightkg": 36, + "color": "Pink", + "evos": [ + "slowbro", + "slowking" + ], + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "slowbro": { + "num": 80, + "species": "Slowbro", + "types": [ + "Water", + "Psychic" + ], + "baseStats": { + "hp": 95, + "atk": 75, + "def": 110, + "spa": 100, + "spd": 80, + "spe": 30 + }, + "abilities": { + "0": "Oblivious", + "1": "Own Tempo", + "H": "Regenerator" + }, + "heightm": 1.6, + "weightkg": 78.5, + "color": "Pink", + "prevo": "slowpoke", + "evoLevel": 37, + "eggGroups": [ + "Monster", + "Water 1" + ], + "otherFormes": [ + "slowbromega" + ] + }, + "slowbromega": { + "num": 80, + "species": "Slowbro-Mega", + "baseSpecies": "Slowbro", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Water", + "Psychic" + ], + "baseStats": { + "hp": 95, + "atk": 75, + "def": 180, + "spa": 130, + "spd": 80, + "spe": 30 + }, + "abilities": { + "0": "Shell Armor" + }, + "heightm": 2, + "weightkg": 120, + "color": "Pink", + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "magnemite": { + "num": 81, + "species": "Magnemite", + "types": [ + "Electric", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 25, + "atk": 35, + "def": 70, + "spa": 95, + "spd": 55, + "spe": 45 + }, + "abilities": { + "0": "Magnet Pull", + "1": "Sturdy", + "H": "Analytic" + }, + "heightm": 0.3, + "weightkg": 6, + "color": "Gray", + "evos": [ + "magneton" + ], + "eggGroups": [ + "Mineral" + ] + }, + "magneton": { + "num": 82, + "species": "Magneton", + "types": [ + "Electric", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 60, + "def": 95, + "spa": 120, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Magnet Pull", + "1": "Sturdy", + "H": "Analytic" + }, + "heightm": 1, + "weightkg": 60, + "color": "Gray", + "prevo": "magnemite", + "evos": [ + "magnezone" + ], + "evoLevel": 30, + "eggGroups": [ + "Mineral" + ] + }, + "farfetchd": { + "num": 83, + "species": "Farfetch'd", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 52, + "atk": 65, + "def": 55, + "spa": 58, + "spd": 62, + "spe": 60 + }, + "abilities": { + "0": "Keen Eye", + "1": "Inner Focus", + "H": "Defiant" + }, + "heightm": 0.8, + "weightkg": 15, + "color": "Brown", + "eggGroups": [ + "Flying", + "Field" + ] + }, + "doduo": { + "num": 84, + "species": "Doduo", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 35, + "atk": 85, + "def": 45, + "spa": 35, + "spd": 35, + "spe": 75 + }, + "abilities": { + "0": "Run Away", + "1": "Early Bird", + "H": "Tangled Feet" + }, + "heightm": 1.4, + "weightkg": 39.2, + "color": "Brown", + "evos": [ + "dodrio" + ], + "eggGroups": [ + "Flying" + ] + }, + "dodrio": { + "num": 85, + "species": "Dodrio", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 60, + "atk": 110, + "def": 70, + "spa": 60, + "spd": 60, + "spe": 100 + }, + "abilities": { + "0": "Run Away", + "1": "Early Bird", + "H": "Tangled Feet" + }, + "heightm": 1.8, + "weightkg": 85.2, + "color": "Brown", + "prevo": "doduo", + "evoLevel": 31, + "eggGroups": [ + "Flying" + ] + }, + "seel": { + "num": 86, + "species": "Seel", + "types": [ + "Water" + ], + "baseStats": { + "hp": 65, + "atk": 45, + "def": 55, + "spa": 45, + "spd": 70, + "spe": 45 + }, + "abilities": { + "0": "Thick Fat", + "1": "Hydration", + "H": "Ice Body" + }, + "heightm": 1.1, + "weightkg": 90, + "color": "White", + "evos": [ + "dewgong" + ], + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "dewgong": { + "num": 87, + "species": "Dewgong", + "types": [ + "Water", + "Ice" + ], + "baseStats": { + "hp": 90, + "atk": 70, + "def": 80, + "spa": 70, + "spd": 95, + "spe": 70 + }, + "abilities": { + "0": "Thick Fat", + "1": "Hydration", + "H": "Ice Body" + }, + "heightm": 1.7, + "weightkg": 120, + "color": "White", + "prevo": "seel", + "evoLevel": 34, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "grimer": { + "num": 88, + "species": "Grimer", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 80, + "atk": 80, + "def": 50, + "spa": 40, + "spd": 50, + "spe": 25 + }, + "abilities": { + "0": "Stench", + "1": "Sticky Hold", + "H": "Poison Touch" + }, + "heightm": 0.9, + "weightkg": 30, + "color": "Purple", + "evos": [ + "muk" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "muk": { + "num": 89, + "species": "Muk", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 105, + "atk": 105, + "def": 75, + "spa": 65, + "spd": 100, + "spe": 50 + }, + "abilities": { + "0": "Stench", + "1": "Sticky Hold", + "H": "Poison Touch" + }, + "heightm": 1.2, + "weightkg": 30, + "color": "Purple", + "prevo": "grimer", + "evoLevel": 38, + "eggGroups": [ + "Amorphous" + ] + }, + "shellder": { + "num": 90, + "species": "Shellder", + "types": [ + "Water" + ], + "baseStats": { + "hp": 30, + "atk": 65, + "def": 100, + "spa": 45, + "spd": 25, + "spe": 40 + }, + "abilities": { + "0": "Shell Armor", + "1": "Skill Link", + "H": "Overcoat" + }, + "heightm": 0.3, + "weightkg": 4, + "color": "Purple", + "evos": [ + "cloyster" + ], + "eggGroups": [ + "Water 3" + ] + }, + "cloyster": { + "num": 91, + "species": "Cloyster", + "types": [ + "Water", + "Ice" + ], + "baseStats": { + "hp": 50, + "atk": 95, + "def": 180, + "spa": 85, + "spd": 45, + "spe": 70 + }, + "abilities": { + "0": "Shell Armor", + "1": "Skill Link", + "H": "Overcoat" + }, + "heightm": 1.5, + "weightkg": 132.5, + "color": "Purple", + "prevo": "shellder", + "evoLevel": 1, + "eggGroups": [ + "Water 3" + ] + }, + "gastly": { + "num": 92, + "species": "Gastly", + "types": [ + "Ghost", + "Poison" + ], + "baseStats": { + "hp": 30, + "atk": 35, + "def": 30, + "spa": 100, + "spd": 35, + "spe": 80 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.3, + "weightkg": 0.1, + "color": "Purple", + "evos": [ + "haunter" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "haunter": { + "num": 93, + "species": "Haunter", + "types": [ + "Ghost", + "Poison" + ], + "baseStats": { + "hp": 45, + "atk": 50, + "def": 45, + "spa": 115, + "spd": 55, + "spe": 95 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.6, + "weightkg": 0.1, + "color": "Purple", + "prevo": "gastly", + "evos": [ + "gengar" + ], + "evoLevel": 25, + "eggGroups": [ + "Amorphous" + ] + }, + "gengar": { + "num": 94, + "species": "Gengar", + "types": [ + "Ghost", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 65, + "def": 60, + "spa": 130, + "spd": 75, + "spe": 110 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.5, + "weightkg": 40.5, + "color": "Purple", + "prevo": "haunter", + "evoLevel": 25, + "eggGroups": [ + "Amorphous" + ], + "otherFormes": [ + "gengarmega" + ] + }, + "gengarmega": { + "num": 94, + "species": "Gengar-Mega", + "baseSpecies": "Gengar", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Ghost", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 65, + "def": 80, + "spa": 170, + "spd": 95, + "spe": 130 + }, + "abilities": { + "0": "Shadow Tag" + }, + "heightm": 1.4, + "weightkg": 40.5, + "color": "Purple", + "eggGroups": [ + "Amorphous" + ] + }, + "onix": { + "num": 95, + "species": "Onix", + "types": [ + "Rock", + "Ground" + ], + "baseStats": { + "hp": 35, + "atk": 45, + "def": 160, + "spa": 30, + "spd": 45, + "spe": 70 + }, + "abilities": { + "0": "Rock Head", + "1": "Sturdy", + "H": "Weak Armor" + }, + "heightm": 8.8, + "weightkg": 210, + "color": "Gray", + "evos": [ + "steelix" + ], + "eggGroups": [ + "Mineral" + ] + }, + "drowzee": { + "num": 96, + "species": "Drowzee", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 60, + "atk": 48, + "def": 45, + "spa": 43, + "spd": 90, + "spe": 42 + }, + "abilities": { + "0": "Insomnia", + "1": "Forewarn", + "H": "Inner Focus" + }, + "heightm": 1, + "weightkg": 32.4, + "color": "Yellow", + "evos": [ + "hypno" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "hypno": { + "num": 97, + "species": "Hypno", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 85, + "atk": 73, + "def": 70, + "spa": 73, + "spd": 115, + "spe": 67 + }, + "abilities": { + "0": "Insomnia", + "1": "Forewarn", + "H": "Inner Focus" + }, + "heightm": 1.6, + "weightkg": 75.6, + "color": "Yellow", + "prevo": "drowzee", + "evoLevel": 26, + "eggGroups": [ + "Human-Like" + ] + }, + "krabby": { + "num": 98, + "species": "Krabby", + "types": [ + "Water" + ], + "baseStats": { + "hp": 30, + "atk": 105, + "def": 90, + "spa": 25, + "spd": 25, + "spe": 50 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Shell Armor", + "H": "Sheer Force" + }, + "heightm": 0.4, + "weightkg": 6.5, + "color": "Red", + "evos": [ + "kingler" + ], + "eggGroups": [ + "Water 3" + ] + }, + "kingler": { + "num": 99, + "species": "Kingler", + "types": [ + "Water" + ], + "baseStats": { + "hp": 55, + "atk": 130, + "def": 115, + "spa": 50, + "spd": 50, + "spe": 75 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Shell Armor", + "H": "Sheer Force" + }, + "heightm": 1.3, + "weightkg": 60, + "color": "Red", + "prevo": "krabby", + "evoLevel": 28, + "eggGroups": [ + "Water 3" + ] + }, + "voltorb": { + "num": 100, + "species": "Voltorb", + "types": [ + "Electric" + ], + "gender": "N", + "baseStats": { + "hp": 40, + "atk": 30, + "def": 50, + "spa": 55, + "spd": 55, + "spe": 100 + }, + "abilities": { + "0": "Soundproof", + "1": "Static", + "H": "Aftermath" + }, + "heightm": 0.5, + "weightkg": 10.4, + "color": "Red", + "evos": [ + "electrode" + ], + "eggGroups": [ + "Mineral" + ] + }, + "electrode": { + "num": 101, + "species": "Electrode", + "types": [ + "Electric" + ], + "gender": "N", + "baseStats": { + "hp": 60, + "atk": 50, + "def": 70, + "spa": 80, + "spd": 80, + "spe": 140 + }, + "abilities": { + "0": "Soundproof", + "1": "Static", + "H": "Aftermath" + }, + "heightm": 1.2, + "weightkg": 66.6, + "color": "Red", + "prevo": "voltorb", + "evoLevel": 30, + "eggGroups": [ + "Mineral" + ] + }, + "exeggcute": { + "num": 102, + "species": "Exeggcute", + "types": [ + "Grass", + "Psychic" + ], + "baseStats": { + "hp": 60, + "atk": 40, + "def": 80, + "spa": 60, + "spd": 45, + "spe": 40 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Harvest" + }, + "heightm": 0.4, + "weightkg": 2.5, + "color": "Pink", + "evos": [ + "exeggutor" + ], + "eggGroups": [ + "Grass" + ] + }, + "exeggutor": { + "num": 103, + "species": "Exeggutor", + "types": [ + "Grass", + "Psychic" + ], + "baseStats": { + "hp": 95, + "atk": 95, + "def": 85, + "spa": 125, + "spd": 65, + "spe": 55 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Harvest" + }, + "heightm": 2, + "weightkg": 120, + "color": "Yellow", + "prevo": "exeggcute", + "evoLevel": 1, + "eggGroups": [ + "Grass" + ] + }, + "cubone": { + "num": 104, + "species": "Cubone", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 50, + "atk": 50, + "def": 95, + "spa": 40, + "spd": 50, + "spe": 35 + }, + "abilities": { + "0": "Rock Head", + "1": "Lightning Rod", + "H": "Battle Armor" + }, + "heightm": 0.4, + "weightkg": 6.5, + "color": "Brown", + "evos": [ + "marowak" + ], + "eggGroups": [ + "Monster" + ] + }, + "marowak": { + "num": 105, + "species": "Marowak", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 60, + "atk": 80, + "def": 110, + "spa": 50, + "spd": 80, + "spe": 45 + }, + "abilities": { + "0": "Rock Head", + "1": "Lightning Rod", + "H": "Battle Armor" + }, + "heightm": 1, + "weightkg": 45, + "color": "Brown", + "prevo": "cubone", + "evoLevel": 28, + "eggGroups": [ + "Monster" + ] + }, + "hitmonlee": { + "num": 106, + "species": "Hitmonlee", + "types": [ + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 50, + "atk": 120, + "def": 53, + "spa": 35, + "spd": 110, + "spe": 87 + }, + "abilities": { + "0": "Limber", + "1": "Reckless", + "H": "Unburden" + }, + "heightm": 1.5, + "weightkg": 49.8, + "color": "Brown", + "prevo": "tyrogue", + "evoLevel": 20, + "eggGroups": [ + "Human-Like" + ] + }, + "hitmonchan": { + "num": 107, + "species": "Hitmonchan", + "types": [ + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 50, + "atk": 105, + "def": 79, + "spa": 35, + "spd": 110, + "spe": 76 + }, + "abilities": { + "0": "Keen Eye", + "1": "Iron Fist", + "H": "Inner Focus" + }, + "heightm": 1.4, + "weightkg": 50.2, + "color": "Brown", + "prevo": "tyrogue", + "evoLevel": 20, + "eggGroups": [ + "Human-Like" + ] + }, + "lickitung": { + "num": 108, + "species": "Lickitung", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 90, + "atk": 55, + "def": 75, + "spa": 60, + "spd": 75, + "spe": 30 + }, + "abilities": { + "0": "Own Tempo", + "1": "Oblivious", + "H": "Cloud Nine" + }, + "heightm": 1.2, + "weightkg": 65.5, + "color": "Pink", + "evos": [ + "lickilicky" + ], + "eggGroups": [ + "Monster" + ] + }, + "koffing": { + "num": 109, + "species": "Koffing", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 40, + "atk": 65, + "def": 95, + "spa": 60, + "spd": 45, + "spe": 35 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.6, + "weightkg": 1, + "color": "Purple", + "evos": [ + "weezing" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "weezing": { + "num": 110, + "species": "Weezing", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 65, + "atk": 90, + "def": 120, + "spa": 85, + "spd": 70, + "spe": 60 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.2, + "weightkg": 9.5, + "color": "Purple", + "prevo": "koffing", + "evoLevel": 35, + "eggGroups": [ + "Amorphous" + ] + }, + "rhyhorn": { + "num": 111, + "species": "Rhyhorn", + "types": [ + "Ground", + "Rock" + ], + "baseStats": { + "hp": 80, + "atk": 85, + "def": 95, + "spa": 30, + "spd": 30, + "spe": 25 + }, + "abilities": { + "0": "Lightning Rod", + "1": "Rock Head", + "H": "Reckless" + }, + "heightm": 1, + "weightkg": 115, + "color": "Gray", + "evos": [ + "rhydon" + ], + "eggGroups": [ + "Monster", + "Field" + ] + }, + "rhydon": { + "num": 112, + "species": "Rhydon", + "types": [ + "Ground", + "Rock" + ], + "baseStats": { + "hp": 105, + "atk": 130, + "def": 120, + "spa": 45, + "spd": 45, + "spe": 40 + }, + "abilities": { + "0": "Lightning Rod", + "1": "Rock Head", + "H": "Reckless" + }, + "heightm": 1.9, + "weightkg": 120, + "color": "Gray", + "prevo": "rhyhorn", + "evos": [ + "rhyperior" + ], + "evoLevel": 42, + "eggGroups": [ + "Monster", + "Field" + ] + }, + "chansey": { + "num": 113, + "species": "Chansey", + "types": [ + "Normal" + ], + "gender": "F", + "baseStats": { + "hp": 250, + "atk": 5, + "def": 5, + "spa": 35, + "spd": 105, + "spe": 50 + }, + "abilities": { + "0": "Natural Cure", + "1": "Serene Grace", + "H": "Healer" + }, + "heightm": 1.1, + "weightkg": 34.6, + "color": "Pink", + "prevo": "happiny", + "evos": [ + "blissey" + ], + "evoLevel": 1, + "eggGroups": [ + "Fairy" + ] + }, + "tangela": { + "num": 114, + "species": "Tangela", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 65, + "atk": 55, + "def": 115, + "spa": 100, + "spd": 40, + "spe": 60 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Leaf Guard", + "H": "Regenerator" + }, + "heightm": 1, + "weightkg": 35, + "color": "Blue", + "evos": [ + "tangrowth" + ], + "eggGroups": [ + "Grass" + ] + }, + "kangaskhan": { + "num": 115, + "species": "Kangaskhan", + "types": [ + "Normal" + ], + "gender": "F", + "baseStats": { + "hp": 105, + "atk": 95, + "def": 80, + "spa": 40, + "spd": 80, + "spe": 90 + }, + "abilities": { + "0": "Early Bird", + "1": "Scrappy", + "H": "Inner Focus" + }, + "heightm": 2.2, + "weightkg": 80, + "color": "Brown", + "eggGroups": [ + "Monster" + ], + "otherFormes": [ + "kangaskhanmega" + ] + }, + "kangaskhanmega": { + "num": 115, + "species": "Kangaskhan-Mega", + "baseSpecies": "Kangaskhan", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Normal" + ], + "gender": "F", + "baseStats": { + "hp": 105, + "atk": 125, + "def": 100, + "spa": 60, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Parental Bond" + }, + "heightm": 2.2, + "weightkg": 100, + "color": "Brown", + "eggGroups": [ + "Monster" + ] + }, + "horsea": { + "num": 116, + "species": "Horsea", + "types": [ + "Water" + ], + "baseStats": { + "hp": 30, + "atk": 40, + "def": 70, + "spa": 70, + "spd": 25, + "spe": 60 + }, + "abilities": { + "0": "Swift Swim", + "1": "Sniper", + "H": "Damp" + }, + "heightm": 0.4, + "weightkg": 8, + "color": "Blue", + "evos": [ + "seadra" + ], + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "seadra": { + "num": 117, + "species": "Seadra", + "types": [ + "Water" + ], + "baseStats": { + "hp": 55, + "atk": 65, + "def": 95, + "spa": 95, + "spd": 45, + "spe": 85 + }, + "abilities": { + "0": "Poison Point", + "1": "Sniper", + "H": "Damp" + }, + "heightm": 1.2, + "weightkg": 25, + "color": "Blue", + "prevo": "horsea", + "evos": [ + "kingdra" + ], + "evoLevel": 32, + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "goldeen": { + "num": 118, + "species": "Goldeen", + "types": [ + "Water" + ], + "baseStats": { + "hp": 45, + "atk": 67, + "def": 60, + "spa": 35, + "spd": 50, + "spe": 63 + }, + "abilities": { + "0": "Swift Swim", + "1": "Water Veil", + "H": "Lightning Rod" + }, + "heightm": 0.6, + "weightkg": 15, + "color": "Red", + "evos": [ + "seaking" + ], + "eggGroups": [ + "Water 2" + ] + }, + "seaking": { + "num": 119, + "species": "Seaking", + "types": [ + "Water" + ], + "baseStats": { + "hp": 80, + "atk": 92, + "def": 65, + "spa": 65, + "spd": 80, + "spe": 68 + }, + "abilities": { + "0": "Swift Swim", + "1": "Water Veil", + "H": "Lightning Rod" + }, + "heightm": 1.3, + "weightkg": 39, + "color": "Red", + "prevo": "goldeen", + "evoLevel": 33, + "eggGroups": [ + "Water 2" + ] + }, + "staryu": { + "num": 120, + "species": "Staryu", + "types": [ + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 30, + "atk": 45, + "def": 55, + "spa": 70, + "spd": 55, + "spe": 85 + }, + "abilities": { + "0": "Illuminate", + "1": "Natural Cure", + "H": "Analytic" + }, + "heightm": 0.8, + "weightkg": 34.5, + "color": "Brown", + "evos": [ + "starmie" + ], + "eggGroups": [ + "Water 3" + ] + }, + "starmie": { + "num": 121, + "species": "Starmie", + "types": [ + "Water", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 60, + "atk": 75, + "def": 85, + "spa": 100, + "spd": 85, + "spe": 115 + }, + "abilities": { + "0": "Illuminate", + "1": "Natural Cure", + "H": "Analytic" + }, + "heightm": 1.1, + "weightkg": 80, + "color": "Purple", + "prevo": "staryu", + "evoLevel": 1, + "eggGroups": [ + "Water 3" + ] + }, + "mrmime": { + "num": 122, + "species": "Mr. Mime", + "types": [ + "Psychic", + "Fairy" + ], + "baseStats": { + "hp": 40, + "atk": 45, + "def": 65, + "spa": 100, + "spd": 120, + "spe": 90 + }, + "abilities": { + "0": "Soundproof", + "1": "Filter", + "H": "Technician" + }, + "heightm": 1.3, + "weightkg": 54.5, + "color": "Pink", + "prevo": "mimejr", + "evoLevel": 1, + "evoMove": "Mimic", + "eggGroups": [ + "Human-Like" + ] + }, + "scyther": { + "num": 123, + "species": "Scyther", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 70, + "atk": 110, + "def": 80, + "spa": 55, + "spd": 80, + "spe": 105 + }, + "abilities": { + "0": "Swarm", + "1": "Technician", + "H": "Steadfast" + }, + "heightm": 1.5, + "weightkg": 56, + "color": "Green", + "evos": [ + "scizor" + ], + "eggGroups": [ + "Bug" + ] + }, + "jynx": { + "num": 124, + "species": "Jynx", + "types": [ + "Ice", + "Psychic" + ], + "gender": "F", + "baseStats": { + "hp": 65, + "atk": 50, + "def": 35, + "spa": 115, + "spd": 95, + "spe": 95 + }, + "abilities": { + "0": "Oblivious", + "1": "Forewarn", + "H": "Dry Skin" + }, + "heightm": 1.4, + "weightkg": 40.6, + "color": "Red", + "prevo": "smoochum", + "evoLevel": 30, + "eggGroups": [ + "Human-Like" + ] + }, + "electabuzz": { + "num": 125, + "species": "Electabuzz", + "types": [ + "Electric" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 65, + "atk": 83, + "def": 57, + "spa": 95, + "spd": 85, + "spe": 105 + }, + "abilities": { + "0": "Static", + "H": "Vital Spirit" + }, + "heightm": 1.1, + "weightkg": 30, + "color": "Yellow", + "prevo": "elekid", + "evos": [ + "electivire" + ], + "evoLevel": 30, + "eggGroups": [ + "Human-Like" + ] + }, + "magmar": { + "num": 126, + "species": "Magmar", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 65, + "atk": 95, + "def": 57, + "spa": 100, + "spd": 85, + "spe": 93 + }, + "abilities": { + "0": "Flame Body", + "H": "Vital Spirit" + }, + "heightm": 1.3, + "weightkg": 44.5, + "color": "Red", + "prevo": "magby", + "evos": [ + "magmortar" + ], + "evoLevel": 30, + "eggGroups": [ + "Human-Like" + ] + }, + "pinsir": { + "num": 127, + "species": "Pinsir", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 65, + "atk": 125, + "def": 100, + "spa": 55, + "spd": 70, + "spe": 85 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Mold Breaker", + "H": "Moxie" + }, + "heightm": 1.5, + "weightkg": 55, + "color": "Brown", + "eggGroups": [ + "Bug" + ], + "otherFormes": [ + "pinsirmega" + ] + }, + "pinsirmega": { + "num": 127, + "species": "Pinsir-Mega", + "baseSpecies": "Pinsir", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 65, + "atk": 155, + "def": 120, + "spa": 65, + "spd": 90, + "spe": 105 + }, + "abilities": { + "0": "Aerilate" + }, + "heightm": 1.7, + "weightkg": 59, + "color": "Brown", + "eggGroups": [ + "Bug" + ] + }, + "tauros": { + "num": 128, + "species": "Tauros", + "types": [ + "Normal" + ], + "gender": "M", + "baseStats": { + "hp": 75, + "atk": 100, + "def": 95, + "spa": 40, + "spd": 70, + "spe": 110 + }, + "abilities": { + "0": "Intimidate", + "1": "Anger Point", + "H": "Sheer Force" + }, + "heightm": 1.4, + "weightkg": 88.4, + "color": "Brown", + "eggGroups": [ + "Field" + ] + }, + "magikarp": { + "num": 129, + "species": "Magikarp", + "types": [ + "Water" + ], + "baseStats": { + "hp": 20, + "atk": 10, + "def": 55, + "spa": 15, + "spd": 20, + "spe": 80 + }, + "abilities": { + "0": "Swift Swim", + "H": "Rattled" + }, + "heightm": 0.9, + "weightkg": 10, + "color": "Red", + "evos": [ + "gyarados" + ], + "eggGroups": [ + "Water 2", + "Dragon" + ] + }, + "gyarados": { + "num": 130, + "species": "Gyarados", + "types": [ + "Water", + "Flying" + ], + "baseStats": { + "hp": 95, + "atk": 125, + "def": 79, + "spa": 60, + "spd": 100, + "spe": 81 + }, + "abilities": { + "0": "Intimidate", + "H": "Moxie" + }, + "heightm": 6.5, + "weightkg": 235, + "color": "Blue", + "prevo": "magikarp", + "evoLevel": 20, + "eggGroups": [ + "Water 2", + "Dragon" + ], + "otherFormes": [ + "gyaradosmega" + ] + }, + "gyaradosmega": { + "num": 130, + "species": "Gyarados-Mega", + "baseSpecies": "Gyarados", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Water", + "Dark" + ], + "baseStats": { + "hp": 95, + "atk": 155, + "def": 109, + "spa": 70, + "spd": 130, + "spe": 81 + }, + "abilities": { + "0": "Mold Breaker" + }, + "heightm": 6.5, + "weightkg": 305, + "color": "Blue", + "eggGroups": [ + "Water 2", + "Dragon" + ] + }, + "lapras": { + "num": 131, + "species": "Lapras", + "types": [ + "Water", + "Ice" + ], + "baseStats": { + "hp": 130, + "atk": 85, + "def": 80, + "spa": 85, + "spd": 95, + "spe": 60 + }, + "abilities": { + "0": "Water Absorb", + "1": "Shell Armor", + "H": "Hydration" + }, + "heightm": 2.5, + "weightkg": 220, + "color": "Blue", + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "ditto": { + "num": 132, + "species": "Ditto", + "types": [ + "Normal" + ], + "gender": "N", + "baseStats": { + "hp": 48, + "atk": 48, + "def": 48, + "spa": 48, + "spd": 48, + "spe": 48 + }, + "abilities": { + "0": "Limber", + "H": "Imposter" + }, + "heightm": 0.3, + "weightkg": 4, + "color": "Purple", + "eggGroups": [ + "Ditto" + ] + }, + "eevee": { + "num": 133, + "species": "Eevee", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 55, + "atk": 55, + "def": 50, + "spa": 45, + "spd": 65, + "spe": 55 + }, + "abilities": { + "0": "Run Away", + "1": "Adaptability", + "H": "Anticipation" + }, + "heightm": 0.3, + "weightkg": 6.5, + "color": "Brown", + "evos": [ + "vaporeon", + "jolteon", + "flareon", + "espeon", + "umbreon", + "leafeon", + "glaceon", + "sylveon" + ], + "eggGroups": [ + "Field" + ] + }, + "vaporeon": { + "num": 134, + "species": "Vaporeon", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 130, + "atk": 65, + "def": 60, + "spa": 110, + "spd": 95, + "spe": 65 + }, + "abilities": { + "0": "Water Absorb", + "H": "Hydration" + }, + "heightm": 1, + "weightkg": 29, + "color": "Blue", + "prevo": "eevee", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "jolteon": { + "num": 135, + "species": "Jolteon", + "types": [ + "Electric" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 65, + "atk": 65, + "def": 60, + "spa": 110, + "spd": 95, + "spe": 130 + }, + "abilities": { + "0": "Volt Absorb", + "H": "Quick Feet" + }, + "heightm": 0.8, + "weightkg": 24.5, + "color": "Yellow", + "prevo": "eevee", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "flareon": { + "num": 136, + "species": "Flareon", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 65, + "atk": 130, + "def": 60, + "spa": 95, + "spd": 110, + "spe": 65 + }, + "abilities": { + "0": "Flash Fire", + "H": "Guts" + }, + "heightm": 0.9, + "weightkg": 25, + "color": "Red", + "prevo": "eevee", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "porygon": { + "num": 137, + "species": "Porygon", + "types": [ + "Normal" + ], + "gender": "N", + "baseStats": { + "hp": 65, + "atk": 60, + "def": 70, + "spa": 85, + "spd": 75, + "spe": 40 + }, + "abilities": { + "0": "Trace", + "1": "Download", + "H": "Analytic" + }, + "heightm": 0.8, + "weightkg": 36.5, + "color": "Pink", + "evos": [ + "porygon2" + ], + "eggGroups": [ + "Mineral" + ] + }, + "omanyte": { + "num": 138, + "species": "Omanyte", + "types": [ + "Rock", + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 35, + "atk": 40, + "def": 100, + "spa": 90, + "spd": 55, + "spe": 35 + }, + "abilities": { + "0": "Swift Swim", + "1": "Shell Armor", + "H": "Weak Armor" + }, + "heightm": 0.4, + "weightkg": 7.5, + "color": "Blue", + "evos": [ + "omastar" + ], + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "omastar": { + "num": 139, + "species": "Omastar", + "types": [ + "Rock", + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 70, + "atk": 60, + "def": 125, + "spa": 115, + "spd": 70, + "spe": 55 + }, + "abilities": { + "0": "Swift Swim", + "1": "Shell Armor", + "H": "Weak Armor" + }, + "heightm": 1, + "weightkg": 35, + "color": "Blue", + "prevo": "omanyte", + "evoLevel": 40, + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "kabuto": { + "num": 140, + "species": "Kabuto", + "types": [ + "Rock", + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 30, + "atk": 80, + "def": 90, + "spa": 55, + "spd": 45, + "spe": 55 + }, + "abilities": { + "0": "Swift Swim", + "1": "Battle Armor", + "H": "Weak Armor" + }, + "heightm": 0.5, + "weightkg": 11.5, + "color": "Brown", + "evos": [ + "kabutops" + ], + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "kabutops": { + "num": 141, + "species": "Kabutops", + "types": [ + "Rock", + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 60, + "atk": 115, + "def": 105, + "spa": 65, + "spd": 70, + "spe": 80 + }, + "abilities": { + "0": "Swift Swim", + "1": "Battle Armor", + "H": "Weak Armor" + }, + "heightm": 1.3, + "weightkg": 40.5, + "color": "Brown", + "prevo": "kabuto", + "evoLevel": 40, + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "aerodactyl": { + "num": 142, + "species": "Aerodactyl", + "types": [ + "Rock", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 80, + "atk": 105, + "def": 65, + "spa": 60, + "spd": 75, + "spe": 130 + }, + "abilities": { + "0": "Rock Head", + "1": "Pressure", + "H": "Unnerve" + }, + "heightm": 1.8, + "weightkg": 59, + "color": "Purple", + "eggGroups": [ + "Flying" + ], + "otherFormes": [ + "aerodactylmega" + ] + }, + "aerodactylmega": { + "num": 142, + "species": "Aerodactyl-Mega", + "baseSpecies": "Aerodactyl", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Rock", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 80, + "atk": 135, + "def": 85, + "spa": 70, + "spd": 95, + "spe": 150 + }, + "abilities": { + "0": "Tough Claws" + }, + "heightm": 2.1, + "weightkg": 79, + "color": "Purple", + "eggGroups": [ + "Flying" + ] + }, + "snorlax": { + "num": 143, + "species": "Snorlax", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 160, + "atk": 110, + "def": 65, + "spa": 65, + "spd": 110, + "spe": 30 + }, + "abilities": { + "0": "Immunity", + "1": "Thick Fat", + "H": "Gluttony" + }, + "heightm": 2.1, + "weightkg": 460, + "color": "Black", + "prevo": "munchlax", + "evoLevel": 1, + "eggGroups": [ + "Monster" + ] + }, + "articuno": { + "num": 144, + "species": "Articuno", + "types": [ + "Ice", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 90, + "atk": 85, + "def": 100, + "spa": 95, + "spd": 125, + "spe": 85 + }, + "abilities": { + "0": "Pressure", + "H": "Snow Cloak" + }, + "heightm": 1.7, + "weightkg": 55.4, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "zapdos": { + "num": 145, + "species": "Zapdos", + "types": [ + "Electric", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 90, + "atk": 90, + "def": 85, + "spa": 125, + "spd": 90, + "spe": 100 + }, + "abilities": { + "0": "Pressure", + "H": "Static" + }, + "heightm": 1.6, + "weightkg": 52.6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "moltres": { + "num": 146, + "species": "Moltres", + "types": [ + "Fire", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 90, + "atk": 100, + "def": 90, + "spa": 125, + "spd": 85, + "spe": 90 + }, + "abilities": { + "0": "Pressure", + "H": "Flame Body" + }, + "heightm": 2, + "weightkg": 60, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "dratini": { + "num": 147, + "species": "Dratini", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 41, + "atk": 64, + "def": 45, + "spa": 50, + "spd": 50, + "spe": 50 + }, + "abilities": { + "0": "Shed Skin", + "H": "Marvel Scale" + }, + "heightm": 1.8, + "weightkg": 3.3, + "color": "Blue", + "evos": [ + "dragonair" + ], + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "dragonair": { + "num": 148, + "species": "Dragonair", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 61, + "atk": 84, + "def": 65, + "spa": 70, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Shed Skin", + "H": "Marvel Scale" + }, + "heightm": 4, + "weightkg": 16.5, + "color": "Blue", + "prevo": "dratini", + "evos": [ + "dragonite" + ], + "evoLevel": 30, + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "dragonite": { + "num": 149, + "species": "Dragonite", + "types": [ + "Dragon", + "Flying" + ], + "baseStats": { + "hp": 91, + "atk": 134, + "def": 95, + "spa": 100, + "spd": 100, + "spe": 80 + }, + "abilities": { + "0": "Inner Focus", + "H": "Multiscale" + }, + "heightm": 2.2, + "weightkg": 210, + "color": "Brown", + "prevo": "dragonair", + "evoLevel": 55, + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "mewtwo": { + "num": 150, + "species": "Mewtwo", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 106, + "atk": 110, + "def": 90, + "spa": 154, + "spd": 90, + "spe": 130 + }, + "abilities": { + "0": "Pressure", + "H": "Unnerve" + }, + "heightm": 2, + "weightkg": 122, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "mewtwomegax", + "mewtwomegay" + ] + }, + "mewtwomegax": { + "num": 150, + "species": "Mewtwo-Mega-X", + "baseSpecies": "Mewtwo", + "forme": "Mega-X", + "formeLetter": "M", + "types": [ + "Psychic", + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 106, + "atk": 190, + "def": 100, + "spa": 154, + "spd": 100, + "spe": 130 + }, + "abilities": { + "0": "Steadfast" + }, + "heightm": 2.3, + "weightkg": 127, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "mewtwomegay": { + "num": 150, + "species": "Mewtwo-Mega-Y", + "baseSpecies": "Mewtwo", + "forme": "Mega-Y", + "formeLetter": "M", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 106, + "atk": 150, + "def": 70, + "spa": 194, + "spd": 120, + "spe": 140 + }, + "abilities": { + "0": "Insomnia" + }, + "heightm": 1.5, + "weightkg": 33, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "mew": { + "num": 151, + "species": "Mew", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 100, + "def": 100, + "spa": 100, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Synchronize" + }, + "heightm": 0.4, + "weightkg": 4, + "color": "Pink", + "eggGroups": [ + "Undiscovered" + ] + }, + "chikorita": { + "num": 152, + "species": "Chikorita", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 45, + "atk": 49, + "def": 65, + "spa": 49, + "spd": 65, + "spe": 45 + }, + "abilities": { + "0": "Overgrow", + "H": "Leaf Guard" + }, + "heightm": 0.9, + "weightkg": 6.4, + "color": "Green", + "evos": [ + "bayleef" + ], + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "bayleef": { + "num": 153, + "species": "Bayleef", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 60, + "atk": 62, + "def": 80, + "spa": 63, + "spd": 80, + "spe": 60 + }, + "abilities": { + "0": "Overgrow", + "H": "Leaf Guard" + }, + "heightm": 1.2, + "weightkg": 15.8, + "color": "Green", + "prevo": "chikorita", + "evos": [ + "meganium" + ], + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "meganium": { + "num": 154, + "species": "Meganium", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 80, + "atk": 82, + "def": 100, + "spa": 83, + "spd": 100, + "spe": 80 + }, + "abilities": { + "0": "Overgrow", + "H": "Leaf Guard" + }, + "heightm": 1.8, + "weightkg": 100.5, + "color": "Green", + "prevo": "bayleef", + "evoLevel": 32, + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "cyndaquil": { + "num": 155, + "species": "Cyndaquil", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 39, + "atk": 52, + "def": 43, + "spa": 60, + "spd": 50, + "spe": 65 + }, + "abilities": { + "0": "Blaze", + "H": "Flash Fire" + }, + "heightm": 0.5, + "weightkg": 7.9, + "color": "Yellow", + "evos": [ + "quilava" + ], + "eggGroups": [ + "Field" + ] + }, + "quilava": { + "num": 156, + "species": "Quilava", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 58, + "atk": 64, + "def": 58, + "spa": 80, + "spd": 65, + "spe": 80 + }, + "abilities": { + "0": "Blaze", + "H": "Flash Fire" + }, + "heightm": 0.9, + "weightkg": 19, + "color": "Yellow", + "prevo": "cyndaquil", + "evos": [ + "typhlosion" + ], + "evoLevel": 14, + "eggGroups": [ + "Field" + ] + }, + "typhlosion": { + "num": 157, + "species": "Typhlosion", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 78, + "atk": 84, + "def": 78, + "spa": 109, + "spd": 85, + "spe": 100 + }, + "abilities": { + "0": "Blaze", + "H": "Flash Fire" + }, + "heightm": 1.7, + "weightkg": 79.5, + "color": "Yellow", + "prevo": "quilava", + "evoLevel": 36, + "eggGroups": [ + "Field" + ] + }, + "totodile": { + "num": 158, + "species": "Totodile", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 50, + "atk": 65, + "def": 64, + "spa": 44, + "spd": 48, + "spe": 43 + }, + "abilities": { + "0": "Torrent", + "H": "Sheer Force" + }, + "heightm": 0.6, + "weightkg": 9.5, + "color": "Blue", + "evos": [ + "croconaw" + ], + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "croconaw": { + "num": 159, + "species": "Croconaw", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 65, + "atk": 80, + "def": 80, + "spa": 59, + "spd": 63, + "spe": 58 + }, + "abilities": { + "0": "Torrent", + "H": "Sheer Force" + }, + "heightm": 1.1, + "weightkg": 25, + "color": "Blue", + "prevo": "totodile", + "evos": [ + "feraligatr" + ], + "evoLevel": 18, + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "feraligatr": { + "num": 160, + "species": "Feraligatr", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 85, + "atk": 105, + "def": 100, + "spa": 79, + "spd": 83, + "spe": 78 + }, + "abilities": { + "0": "Torrent", + "H": "Sheer Force" + }, + "heightm": 2.3, + "weightkg": 88.8, + "color": "Blue", + "prevo": "croconaw", + "evoLevel": 30, + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "sentret": { + "num": 161, + "species": "Sentret", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 35, + "atk": 46, + "def": 34, + "spa": 35, + "spd": 45, + "spe": 20 + }, + "abilities": { + "0": "Run Away", + "1": "Keen Eye", + "H": "Frisk" + }, + "heightm": 0.8, + "weightkg": 6, + "color": "Brown", + "evos": [ + "furret" + ], + "eggGroups": [ + "Field" + ] + }, + "furret": { + "num": 162, + "species": "Furret", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 85, + "atk": 76, + "def": 64, + "spa": 45, + "spd": 55, + "spe": 90 + }, + "abilities": { + "0": "Run Away", + "1": "Keen Eye", + "H": "Frisk" + }, + "heightm": 1.8, + "weightkg": 32.5, + "color": "Brown", + "prevo": "sentret", + "evoLevel": 15, + "eggGroups": [ + "Field" + ] + }, + "hoothoot": { + "num": 163, + "species": "Hoothoot", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 60, + "atk": 30, + "def": 30, + "spa": 36, + "spd": 56, + "spe": 50 + }, + "abilities": { + "0": "Insomnia", + "1": "Keen Eye", + "H": "Tinted Lens" + }, + "heightm": 0.7, + "weightkg": 21.2, + "color": "Brown", + "evos": [ + "noctowl" + ], + "eggGroups": [ + "Flying" + ] + }, + "noctowl": { + "num": 164, + "species": "Noctowl", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 100, + "atk": 50, + "def": 50, + "spa": 76, + "spd": 96, + "spe": 70 + }, + "abilities": { + "0": "Insomnia", + "1": "Keen Eye", + "H": "Tinted Lens" + }, + "heightm": 1.6, + "weightkg": 40.8, + "color": "Brown", + "prevo": "hoothoot", + "evoLevel": 20, + "eggGroups": [ + "Flying" + ] + }, + "ledyba": { + "num": 165, + "species": "Ledyba", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 20, + "def": 30, + "spa": 40, + "spd": 80, + "spe": 55 + }, + "abilities": { + "0": "Swarm", + "1": "Early Bird", + "H": "Rattled" + }, + "heightm": 1, + "weightkg": 10.8, + "color": "Red", + "evos": [ + "ledian" + ], + "eggGroups": [ + "Bug" + ] + }, + "ledian": { + "num": 166, + "species": "Ledian", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 55, + "atk": 35, + "def": 50, + "spa": 55, + "spd": 110, + "spe": 85 + }, + "abilities": { + "0": "Swarm", + "1": "Early Bird", + "H": "Iron Fist" + }, + "heightm": 1.4, + "weightkg": 35.6, + "color": "Red", + "prevo": "ledyba", + "evoLevel": 18, + "eggGroups": [ + "Bug" + ] + }, + "spinarak": { + "num": 167, + "species": "Spinarak", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 40, + "atk": 60, + "def": 40, + "spa": 40, + "spd": 40, + "spe": 30 + }, + "abilities": { + "0": "Swarm", + "1": "Insomnia", + "H": "Sniper" + }, + "heightm": 0.5, + "weightkg": 8.5, + "color": "Green", + "evos": [ + "ariados" + ], + "eggGroups": [ + "Bug" + ] + }, + "ariados": { + "num": 168, + "species": "Ariados", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 70, + "atk": 90, + "def": 70, + "spa": 60, + "spd": 60, + "spe": 40 + }, + "abilities": { + "0": "Swarm", + "1": "Insomnia", + "H": "Sniper" + }, + "heightm": 1.1, + "weightkg": 33.5, + "color": "Red", + "prevo": "spinarak", + "evoLevel": 22, + "eggGroups": [ + "Bug" + ] + }, + "crobat": { + "num": 169, + "species": "Crobat", + "types": [ + "Poison", + "Flying" + ], + "baseStats": { + "hp": 85, + "atk": 90, + "def": 80, + "spa": 70, + "spd": 80, + "spe": 130 + }, + "abilities": { + "0": "Inner Focus", + "H": "Infiltrator" + }, + "heightm": 1.8, + "weightkg": 75, + "color": "Purple", + "prevo": "golbat", + "evoLevel": 23, + "eggGroups": [ + "Flying" + ] + }, + "chinchou": { + "num": 170, + "species": "Chinchou", + "types": [ + "Water", + "Electric" + ], + "baseStats": { + "hp": 75, + "atk": 38, + "def": 38, + "spa": 56, + "spd": 56, + "spe": 67 + }, + "abilities": { + "0": "Volt Absorb", + "1": "Illuminate", + "H": "Water Absorb" + }, + "heightm": 0.5, + "weightkg": 12, + "color": "Blue", + "evos": [ + "lanturn" + ], + "eggGroups": [ + "Water 2" + ] + }, + "lanturn": { + "num": 171, + "species": "Lanturn", + "types": [ + "Water", + "Electric" + ], + "baseStats": { + "hp": 125, + "atk": 58, + "def": 58, + "spa": 76, + "spd": 76, + "spe": 67 + }, + "abilities": { + "0": "Volt Absorb", + "1": "Illuminate", + "H": "Water Absorb" + }, + "heightm": 1.2, + "weightkg": 22.5, + "color": "Blue", + "prevo": "chinchou", + "evoLevel": 27, + "eggGroups": [ + "Water 2" + ] + }, + "pichu": { + "num": 172, + "species": "Pichu", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 20, + "atk": 40, + "def": 15, + "spa": 35, + "spd": 35, + "spe": 60 + }, + "abilities": { + "0": "Static", + "H": "Lightning Rod" + }, + "heightm": 0.3, + "weightkg": 2, + "color": "Yellow", + "evos": [ + "pikachu" + ], + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "pichuspikyeared" + ] + }, + "pichuspikyeared": { + "num": 172, + "species": "Pichu-Spiky-eared", + "baseSpecies": "Pichu", + "forme": "Spiky-eared", + "formeLetter": "S", + "types": [ + "Electric" + ], + "gender": "F", + "baseStats": { + "hp": 20, + "atk": 40, + "def": 15, + "spa": 35, + "spd": 35, + "spe": 60 + }, + "abilities": { + "0": "Static" + }, + "heightm": 0.3, + "weightkg": 2, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "cleffa": { + "num": 173, + "species": "Cleffa", + "types": [ + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 50, + "atk": 25, + "def": 28, + "spa": 45, + "spd": 55, + "spe": 15 + }, + "abilities": { + "0": "Cute Charm", + "1": "Magic Guard", + "H": "Friend Guard" + }, + "heightm": 0.3, + "weightkg": 3, + "color": "Pink", + "evos": [ + "clefairy" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "igglybuff": { + "num": 174, + "species": "Igglybuff", + "types": [ + "Normal", + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 90, + "atk": 30, + "def": 15, + "spa": 40, + "spd": 20, + "spe": 15 + }, + "abilities": { + "0": "Cute Charm", + "1": "Competitive", + "H": "Friend Guard" + }, + "heightm": 0.3, + "weightkg": 1, + "color": "Pink", + "evos": [ + "jigglypuff" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "togepi": { + "num": 175, + "species": "Togepi", + "types": [ + "Fairy" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 35, + "atk": 20, + "def": 65, + "spa": 40, + "spd": 65, + "spe": 20 + }, + "abilities": { + "0": "Hustle", + "1": "Serene Grace", + "H": "Super Luck" + }, + "heightm": 0.3, + "weightkg": 1.5, + "color": "White", + "evos": [ + "togetic" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "togetic": { + "num": 176, + "species": "Togetic", + "types": [ + "Fairy", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 55, + "atk": 40, + "def": 85, + "spa": 80, + "spd": 105, + "spe": 40 + }, + "abilities": { + "0": "Hustle", + "1": "Serene Grace", + "H": "Super Luck" + }, + "heightm": 0.6, + "weightkg": 3.2, + "color": "White", + "prevo": "togepi", + "evos": [ + "togekiss" + ], + "evoLevel": 2, + "eggGroups": [ + "Flying", + "Fairy" + ] + }, + "natu": { + "num": 177, + "species": "Natu", + "types": [ + "Psychic", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 50, + "def": 45, + "spa": 70, + "spd": 45, + "spe": 70 + }, + "abilities": { + "0": "Synchronize", + "1": "Early Bird", + "H": "Magic Bounce" + }, + "heightm": 0.2, + "weightkg": 2, + "color": "Green", + "evos": [ + "xatu" + ], + "eggGroups": [ + "Flying" + ] + }, + "xatu": { + "num": 178, + "species": "Xatu", + "types": [ + "Psychic", + "Flying" + ], + "baseStats": { + "hp": 65, + "atk": 75, + "def": 70, + "spa": 95, + "spd": 70, + "spe": 95 + }, + "abilities": { + "0": "Synchronize", + "1": "Early Bird", + "H": "Magic Bounce" + }, + "heightm": 1.5, + "weightkg": 15, + "color": "Green", + "prevo": "natu", + "evoLevel": 25, + "eggGroups": [ + "Flying" + ] + }, + "mareep": { + "num": 179, + "species": "Mareep", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 55, + "atk": 40, + "def": 40, + "spa": 65, + "spd": 45, + "spe": 35 + }, + "abilities": { + "0": "Static", + "H": "Plus" + }, + "heightm": 0.6, + "weightkg": 7.8, + "color": "White", + "evos": [ + "flaaffy" + ], + "eggGroups": [ + "Monster", + "Field" + ] + }, + "flaaffy": { + "num": 180, + "species": "Flaaffy", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 70, + "atk": 55, + "def": 55, + "spa": 80, + "spd": 60, + "spe": 45 + }, + "abilities": { + "0": "Static", + "H": "Plus" + }, + "heightm": 0.8, + "weightkg": 13.3, + "color": "Pink", + "prevo": "mareep", + "evos": [ + "ampharos" + ], + "evoLevel": 15, + "eggGroups": [ + "Monster", + "Field" + ] + }, + "ampharos": { + "num": 181, + "species": "Ampharos", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 90, + "atk": 75, + "def": 85, + "spa": 115, + "spd": 90, + "spe": 55 + }, + "abilities": { + "0": "Static", + "H": "Plus" + }, + "heightm": 1.4, + "weightkg": 61.5, + "color": "Yellow", + "prevo": "flaaffy", + "evoLevel": 30, + "eggGroups": [ + "Monster", + "Field" + ], + "otherFormes": [ + "ampharosmega" + ] + }, + "ampharosmega": { + "num": 181, + "species": "Ampharos-Mega", + "baseSpecies": "Ampharos", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Electric", + "Dragon" + ], + "baseStats": { + "hp": 90, + "atk": 95, + "def": 105, + "spa": 165, + "spd": 110, + "spe": 45 + }, + "abilities": { + "0": "Mold Breaker" + }, + "heightm": 1.4, + "weightkg": 61.5, + "color": "Yellow", + "eggGroups": [ + "Monster", + "Field" + ] + }, + "bellossom": { + "num": 182, + "species": "Bellossom", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 75, + "atk": 80, + "def": 95, + "spa": 90, + "spd": 100, + "spe": 50 + }, + "abilities": { + "0": "Chlorophyll", + "H": "Healer" + }, + "heightm": 0.4, + "weightkg": 5.8, + "color": "Green", + "prevo": "gloom", + "evoLevel": 21, + "eggGroups": [ + "Grass" + ] + }, + "marill": { + "num": 183, + "species": "Marill", + "types": [ + "Water", + "Fairy" + ], + "baseStats": { + "hp": 70, + "atk": 20, + "def": 50, + "spa": 20, + "spd": 50, + "spe": 40 + }, + "abilities": { + "0": "Thick Fat", + "1": "Huge Power", + "H": "Sap Sipper" + }, + "heightm": 0.4, + "weightkg": 8.5, + "color": "Blue", + "prevo": "azurill", + "evos": [ + "azumarill" + ], + "evoLevel": 1, + "eggGroups": [ + "Water 1", + "Fairy" + ] + }, + "azumarill": { + "num": 184, + "species": "Azumarill", + "types": [ + "Water", + "Fairy" + ], + "baseStats": { + "hp": 100, + "atk": 50, + "def": 80, + "spa": 60, + "spd": 80, + "spe": 50 + }, + "abilities": { + "0": "Thick Fat", + "1": "Huge Power", + "H": "Sap Sipper" + }, + "heightm": 0.8, + "weightkg": 28.5, + "color": "Blue", + "prevo": "marill", + "evoLevel": 18, + "eggGroups": [ + "Water 1", + "Fairy" + ] + }, + "sudowoodo": { + "num": 185, + "species": "Sudowoodo", + "types": [ + "Rock" + ], + "baseStats": { + "hp": 70, + "atk": 100, + "def": 115, + "spa": 30, + "spd": 65, + "spe": 30 + }, + "abilities": { + "0": "Sturdy", + "1": "Rock Head", + "H": "Rattled" + }, + "heightm": 1.2, + "weightkg": 38, + "color": "Brown", + "prevo": "bonsly", + "evoLevel": 1, + "evoMove": "Mimic", + "eggGroups": [ + "Mineral" + ] + }, + "politoed": { + "num": 186, + "species": "Politoed", + "types": [ + "Water" + ], + "baseStats": { + "hp": 90, + "atk": 75, + "def": 75, + "spa": 90, + "spd": 100, + "spe": 70 + }, + "abilities": { + "0": "Water Absorb", + "1": "Damp", + "H": "Drizzle" + }, + "heightm": 1.1, + "weightkg": 33.9, + "color": "Green", + "prevo": "poliwhirl", + "evoLevel": 25, + "eggGroups": [ + "Water 1" + ] + }, + "hoppip": { + "num": 187, + "species": "Hoppip", + "types": [ + "Grass", + "Flying" + ], + "baseStats": { + "hp": 35, + "atk": 35, + "def": 40, + "spa": 35, + "spd": 55, + "spe": 50 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Leaf Guard", + "H": "Infiltrator" + }, + "heightm": 0.4, + "weightkg": 0.5, + "color": "Pink", + "evos": [ + "skiploom" + ], + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "skiploom": { + "num": 188, + "species": "Skiploom", + "types": [ + "Grass", + "Flying" + ], + "baseStats": { + "hp": 55, + "atk": 45, + "def": 50, + "spa": 45, + "spd": 65, + "spe": 80 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Leaf Guard", + "H": "Infiltrator" + }, + "heightm": 0.6, + "weightkg": 1, + "color": "Green", + "prevo": "hoppip", + "evos": [ + "jumpluff" + ], + "evoLevel": 18, + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "jumpluff": { + "num": 189, + "species": "Jumpluff", + "types": [ + "Grass", + "Flying" + ], + "baseStats": { + "hp": 75, + "atk": 55, + "def": 70, + "spa": 55, + "spd": 95, + "spe": 110 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Leaf Guard", + "H": "Infiltrator" + }, + "heightm": 0.8, + "weightkg": 3, + "color": "Blue", + "prevo": "skiploom", + "evoLevel": 27, + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "aipom": { + "num": 190, + "species": "Aipom", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 55, + "atk": 70, + "def": 55, + "spa": 40, + "spd": 55, + "spe": 85 + }, + "abilities": { + "0": "Run Away", + "1": "Pickup", + "H": "Skill Link" + }, + "heightm": 0.8, + "weightkg": 11.5, + "color": "Purple", + "evos": [ + "ambipom" + ], + "eggGroups": [ + "Field" + ] + }, + "sunkern": { + "num": 191, + "species": "Sunkern", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 30, + "atk": 30, + "def": 30, + "spa": 30, + "spd": 30, + "spe": 30 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Solar Power", + "H": "Early Bird" + }, + "heightm": 0.3, + "weightkg": 1.8, + "color": "Yellow", + "evos": [ + "sunflora" + ], + "eggGroups": [ + "Grass" + ] + }, + "sunflora": { + "num": 192, + "species": "Sunflora", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 75, + "atk": 75, + "def": 55, + "spa": 105, + "spd": 85, + "spe": 30 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Solar Power", + "H": "Early Bird" + }, + "heightm": 0.8, + "weightkg": 8.5, + "color": "Yellow", + "prevo": "sunkern", + "evoLevel": 1, + "eggGroups": [ + "Grass" + ] + }, + "yanma": { + "num": 193, + "species": "Yanma", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 65, + "atk": 65, + "def": 45, + "spa": 75, + "spd": 45, + "spe": 95 + }, + "abilities": { + "0": "Speed Boost", + "1": "Compound Eyes", + "H": "Frisk" + }, + "heightm": 1.2, + "weightkg": 38, + "color": "Red", + "evos": [ + "yanmega" + ], + "eggGroups": [ + "Bug" + ] + }, + "wooper": { + "num": 194, + "species": "Wooper", + "types": [ + "Water", + "Ground" + ], + "baseStats": { + "hp": 55, + "atk": 45, + "def": 45, + "spa": 25, + "spd": 25, + "spe": 15 + }, + "abilities": { + "0": "Damp", + "1": "Water Absorb", + "H": "Unaware" + }, + "heightm": 0.4, + "weightkg": 8.5, + "color": "Blue", + "evos": [ + "quagsire" + ], + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "quagsire": { + "num": 195, + "species": "Quagsire", + "types": [ + "Water", + "Ground" + ], + "baseStats": { + "hp": 95, + "atk": 85, + "def": 85, + "spa": 65, + "spd": 65, + "spe": 35 + }, + "abilities": { + "0": "Damp", + "1": "Water Absorb", + "H": "Unaware" + }, + "heightm": 1.4, + "weightkg": 75, + "color": "Blue", + "prevo": "wooper", + "evoLevel": 20, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "espeon": { + "num": 196, + "species": "Espeon", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 65, + "atk": 65, + "def": 60, + "spa": 130, + "spd": 95, + "spe": 110 + }, + "abilities": { + "0": "Synchronize", + "H": "Magic Bounce" + }, + "heightm": 0.9, + "weightkg": 26.5, + "color": "Purple", + "prevo": "eevee", + "evoLevel": 2, + "eggGroups": [ + "Field" + ] + }, + "umbreon": { + "num": 197, + "species": "Umbreon", + "types": [ + "Dark" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 95, + "atk": 65, + "def": 110, + "spa": 60, + "spd": 130, + "spe": 65 + }, + "abilities": { + "0": "Synchronize", + "H": "Inner Focus" + }, + "heightm": 1, + "weightkg": 27, + "color": "Black", + "prevo": "eevee", + "evoLevel": 2, + "eggGroups": [ + "Field" + ] + }, + "murkrow": { + "num": 198, + "species": "Murkrow", + "types": [ + "Dark", + "Flying" + ], + "baseStats": { + "hp": 60, + "atk": 85, + "def": 42, + "spa": 85, + "spd": 42, + "spe": 91 + }, + "abilities": { + "0": "Insomnia", + "1": "Super Luck", + "H": "Prankster" + }, + "heightm": 0.5, + "weightkg": 2.1, + "color": "Black", + "evos": [ + "honchkrow" + ], + "eggGroups": [ + "Flying" + ] + }, + "slowking": { + "num": 199, + "species": "Slowking", + "types": [ + "Water", + "Psychic" + ], + "baseStats": { + "hp": 95, + "atk": 75, + "def": 80, + "spa": 100, + "spd": 110, + "spe": 30 + }, + "abilities": { + "0": "Oblivious", + "1": "Own Tempo", + "H": "Regenerator" + }, + "heightm": 2, + "weightkg": 79.5, + "color": "Pink", + "prevo": "slowpoke", + "evoLevel": 1, + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "misdreavus": { + "num": 200, + "species": "Misdreavus", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 60, + "atk": 60, + "def": 60, + "spa": 85, + "spd": 85, + "spe": 85 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.7, + "weightkg": 1, + "color": "Gray", + "evos": [ + "mismagius" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "unown": { + "num": 201, + "species": "Unown", + "baseForme": "A", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 48, + "atk": 72, + "def": 48, + "spa": 72, + "spd": 48, + "spe": 48 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.5, + "weightkg": 5, + "color": "Black", + "eggGroups": [ + "Undiscovered" + ], + "otherForms": [ + "unownb", + "unownc", + "unownd", + "unowne", + "unownf", + "unowng", + "unownh", + "unowni", + "unownj", + "unownk", + "unownl", + "unownm", + "unownn", + "unowno", + "unownp", + "unownq", + "unownr", + "unowns", + "unownt", + "unownu", + "unownv", + "unownw", + "unownx", + "unowny", + "unownz", + "unownexclamation", + "unownquestion" + ] + }, + "wobbuffet": { + "num": 202, + "species": "Wobbuffet", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 190, + "atk": 33, + "def": 58, + "spa": 33, + "spd": 58, + "spe": 33 + }, + "abilities": { + "0": "Shadow Tag", + "H": "Telepathy" + }, + "heightm": 1.3, + "weightkg": 28.5, + "color": "Blue", + "prevo": "wynaut", + "evoLevel": 15, + "eggGroups": [ + "Amorphous" + ] + }, + "girafarig": { + "num": 203, + "species": "Girafarig", + "types": [ + "Normal", + "Psychic" + ], + "baseStats": { + "hp": 70, + "atk": 80, + "def": 65, + "spa": 90, + "spd": 65, + "spe": 85 + }, + "abilities": { + "0": "Inner Focus", + "1": "Early Bird", + "H": "Sap Sipper" + }, + "heightm": 1.5, + "weightkg": 41.5, + "color": "Yellow", + "eggGroups": [ + "Field" + ] + }, + "pineco": { + "num": 204, + "species": "Pineco", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 50, + "atk": 65, + "def": 90, + "spa": 35, + "spd": 35, + "spe": 15 + }, + "abilities": { + "0": "Sturdy", + "H": "Overcoat" + }, + "heightm": 0.6, + "weightkg": 7.2, + "color": "Gray", + "evos": [ + "forretress" + ], + "eggGroups": [ + "Bug" + ] + }, + "forretress": { + "num": 205, + "species": "Forretress", + "types": [ + "Bug", + "Steel" + ], + "baseStats": { + "hp": 75, + "atk": 90, + "def": 140, + "spa": 60, + "spd": 60, + "spe": 40 + }, + "abilities": { + "0": "Sturdy", + "H": "Overcoat" + }, + "heightm": 1.2, + "weightkg": 125.8, + "color": "Purple", + "prevo": "pineco", + "evoLevel": 31, + "eggGroups": [ + "Bug" + ] + }, + "dunsparce": { + "num": 206, + "species": "Dunsparce", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 100, + "atk": 70, + "def": 70, + "spa": 65, + "spd": 65, + "spe": 45 + }, + "abilities": { + "0": "Serene Grace", + "1": "Run Away", + "H": "Rattled" + }, + "heightm": 1.5, + "weightkg": 14, + "color": "Yellow", + "eggGroups": [ + "Field" + ] + }, + "gligar": { + "num": 207, + "species": "Gligar", + "types": [ + "Ground", + "Flying" + ], + "baseStats": { + "hp": 65, + "atk": 75, + "def": 105, + "spa": 35, + "spd": 65, + "spe": 85 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Sand Veil", + "H": "Immunity" + }, + "heightm": 1.1, + "weightkg": 64.8, + "color": "Purple", + "evos": [ + "gliscor" + ], + "eggGroups": [ + "Bug" + ] + }, + "steelix": { + "num": 208, + "species": "Steelix", + "types": [ + "Steel", + "Ground" + ], + "baseStats": { + "hp": 75, + "atk": 85, + "def": 200, + "spa": 55, + "spd": 65, + "spe": 30 + }, + "abilities": { + "0": "Rock Head", + "1": "Sturdy", + "H": "Sheer Force" + }, + "heightm": 9.2, + "weightkg": 400, + "color": "Gray", + "prevo": "onix", + "evoLevel": 1, + "eggGroups": [ + "Mineral" + ], + "otherFormes": [ + "steelixmega" + ] + }, + "steelixmega": { + "num": 208, + "species": "Steelix-Mega", + "baseSpecies": "Steelix", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Steel", + "Ground" + ], + "baseStats": { + "hp": 75, + "atk": 125, + "def": 230, + "spa": 55, + "spd": 95, + "spe": 30 + }, + "abilities": { + "0": "Sand Force" + }, + "heightm": 10.5, + "weightkg": 740, + "color": "Gray", + "eggGroups": [ + "Mineral" + ] + }, + "snubbull": { + "num": 209, + "species": "Snubbull", + "types": [ + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 60, + "atk": 80, + "def": 50, + "spa": 40, + "spd": 40, + "spe": 30 + }, + "abilities": { + "0": "Intimidate", + "1": "Run Away", + "H": "Rattled" + }, + "heightm": 0.6, + "weightkg": 7.8, + "color": "Pink", + "evos": [ + "granbull" + ], + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "granbull": { + "num": 210, + "species": "Granbull", + "types": [ + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 90, + "atk": 120, + "def": 75, + "spa": 60, + "spd": 60, + "spe": 45 + }, + "abilities": { + "0": "Intimidate", + "1": "Quick Feet", + "H": "Rattled" + }, + "heightm": 1.4, + "weightkg": 48.7, + "color": "Purple", + "prevo": "snubbull", + "evoLevel": 23, + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "qwilfish": { + "num": 211, + "species": "Qwilfish", + "types": [ + "Water", + "Poison" + ], + "baseStats": { + "hp": 65, + "atk": 95, + "def": 75, + "spa": 55, + "spd": 55, + "spe": 85 + }, + "abilities": { + "0": "Poison Point", + "1": "Swift Swim", + "H": "Intimidate" + }, + "heightm": 0.5, + "weightkg": 3.9, + "color": "Gray", + "eggGroups": [ + "Water 2" + ] + }, + "scizor": { + "num": 212, + "species": "Scizor", + "types": [ + "Bug", + "Steel" + ], + "baseStats": { + "hp": 70, + "atk": 130, + "def": 100, + "spa": 55, + "spd": 80, + "spe": 65 + }, + "abilities": { + "0": "Swarm", + "1": "Technician", + "H": "Light Metal" + }, + "heightm": 1.8, + "weightkg": 118, + "color": "Red", + "prevo": "scyther", + "evoLevel": 1, + "eggGroups": [ + "Bug" + ], + "otherFormes": [ + "scizormega" + ] + }, + "scizormega": { + "num": 212, + "species": "Scizor-Mega", + "baseSpecies": "Scizor", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Bug", + "Steel" + ], + "baseStats": { + "hp": 70, + "atk": 150, + "def": 140, + "spa": 65, + "spd": 100, + "spe": 75 + }, + "abilities": { + "0": "Technician" + }, + "heightm": 2, + "weightkg": 125, + "color": "Red", + "eggGroups": [ + "Bug" + ] + }, + "shuckle": { + "num": 213, + "species": "Shuckle", + "types": [ + "Bug", + "Rock" + ], + "baseStats": { + "hp": 20, + "atk": 10, + "def": 230, + "spa": 10, + "spd": 230, + "spe": 5 + }, + "abilities": { + "0": "Sturdy", + "1": "Gluttony", + "H": "Contrary" + }, + "heightm": 0.6, + "weightkg": 20.5, + "color": "Yellow", + "eggGroups": [ + "Bug" + ] + }, + "heracross": { + "num": 214, + "species": "Heracross", + "types": [ + "Bug", + "Fighting" + ], + "baseStats": { + "hp": 80, + "atk": 125, + "def": 75, + "spa": 40, + "spd": 95, + "spe": 85 + }, + "abilities": { + "0": "Swarm", + "1": "Guts", + "H": "Moxie" + }, + "heightm": 1.5, + "weightkg": 54, + "color": "Blue", + "eggGroups": [ + "Bug" + ], + "otherFormes": [ + "heracrossmega" + ] + }, + "heracrossmega": { + "num": 214, + "species": "Heracross-Mega", + "baseSpecies": "Heracross", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Bug", + "Fighting" + ], + "baseStats": { + "hp": 80, + "atk": 185, + "def": 115, + "spa": 40, + "spd": 105, + "spe": 75 + }, + "abilities": { + "0": "Skill Link" + }, + "heightm": 1.7, + "weightkg": 62.5, + "color": "Blue", + "eggGroups": [ + "Bug" + ] + }, + "sneasel": { + "num": 215, + "species": "Sneasel", + "types": [ + "Dark", + "Ice" + ], + "baseStats": { + "hp": 55, + "atk": 95, + "def": 55, + "spa": 35, + "spd": 75, + "spe": 115 + }, + "abilities": { + "0": "Inner Focus", + "1": "Keen Eye", + "H": "Pickpocket" + }, + "heightm": 0.9, + "weightkg": 28, + "color": "Black", + "evos": [ + "weavile" + ], + "eggGroups": [ + "Field" + ] + }, + "teddiursa": { + "num": 216, + "species": "Teddiursa", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 60, + "atk": 80, + "def": 50, + "spa": 50, + "spd": 50, + "spe": 40 + }, + "abilities": { + "0": "Pickup", + "1": "Quick Feet", + "H": "Honey Gather" + }, + "heightm": 0.6, + "weightkg": 8.8, + "color": "Brown", + "evos": [ + "ursaring" + ], + "eggGroups": [ + "Field" + ] + }, + "ursaring": { + "num": 217, + "species": "Ursaring", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 90, + "atk": 130, + "def": 75, + "spa": 75, + "spd": 75, + "spe": 55 + }, + "abilities": { + "0": "Guts", + "1": "Quick Feet", + "H": "Unnerve" + }, + "heightm": 1.8, + "weightkg": 125.8, + "color": "Brown", + "prevo": "teddiursa", + "evoLevel": 30, + "eggGroups": [ + "Field" + ] + }, + "slugma": { + "num": 218, + "species": "Slugma", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 40, + "atk": 40, + "def": 40, + "spa": 70, + "spd": 40, + "spe": 20 + }, + "abilities": { + "0": "Magma Armor", + "1": "Flame Body", + "H": "Weak Armor" + }, + "heightm": 0.7, + "weightkg": 35, + "color": "Red", + "evos": [ + "magcargo" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "magcargo": { + "num": 219, + "species": "Magcargo", + "types": [ + "Fire", + "Rock" + ], + "baseStats": { + "hp": 50, + "atk": 50, + "def": 120, + "spa": 80, + "spd": 80, + "spe": 30 + }, + "abilities": { + "0": "Magma Armor", + "1": "Flame Body", + "H": "Weak Armor" + }, + "heightm": 0.8, + "weightkg": 55, + "color": "Red", + "prevo": "slugma", + "evoLevel": 38, + "eggGroups": [ + "Amorphous" + ] + }, + "swinub": { + "num": 220, + "species": "Swinub", + "types": [ + "Ice", + "Ground" + ], + "baseStats": { + "hp": 50, + "atk": 50, + "def": 40, + "spa": 30, + "spd": 30, + "spe": 50 + }, + "abilities": { + "0": "Oblivious", + "1": "Snow Cloak", + "H": "Thick Fat" + }, + "heightm": 0.4, + "weightkg": 6.5, + "color": "Brown", + "evos": [ + "piloswine" + ], + "eggGroups": [ + "Field" + ] + }, + "piloswine": { + "num": 221, + "species": "Piloswine", + "types": [ + "Ice", + "Ground" + ], + "baseStats": { + "hp": 100, + "atk": 100, + "def": 80, + "spa": 60, + "spd": 60, + "spe": 50 + }, + "abilities": { + "0": "Oblivious", + "1": "Snow Cloak", + "H": "Thick Fat" + }, + "heightm": 1.1, + "weightkg": 55.8, + "color": "Brown", + "prevo": "swinub", + "evos": [ + "mamoswine" + ], + "evoLevel": 33, + "eggGroups": [ + "Field" + ] + }, + "corsola": { + "num": 222, + "species": "Corsola", + "types": [ + "Water", + "Rock" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 55, + "atk": 55, + "def": 85, + "spa": 65, + "spd": 85, + "spe": 35 + }, + "abilities": { + "0": "Hustle", + "1": "Natural Cure", + "H": "Regenerator" + }, + "heightm": 0.6, + "weightkg": 5, + "color": "Pink", + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "remoraid": { + "num": 223, + "species": "Remoraid", + "types": [ + "Water" + ], + "baseStats": { + "hp": 35, + "atk": 65, + "def": 35, + "spa": 65, + "spd": 35, + "spe": 65 + }, + "abilities": { + "0": "Hustle", + "1": "Sniper", + "H": "Moody" + }, + "heightm": 0.6, + "weightkg": 12, + "color": "Gray", + "evos": [ + "octillery" + ], + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "octillery": { + "num": 224, + "species": "Octillery", + "types": [ + "Water" + ], + "baseStats": { + "hp": 75, + "atk": 105, + "def": 75, + "spa": 105, + "spd": 75, + "spe": 45 + }, + "abilities": { + "0": "Suction Cups", + "1": "Sniper", + "H": "Moody" + }, + "heightm": 0.9, + "weightkg": 28.5, + "color": "Red", + "prevo": "remoraid", + "evoLevel": 25, + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "delibird": { + "num": 225, + "species": "Delibird", + "types": [ + "Ice", + "Flying" + ], + "baseStats": { + "hp": 45, + "atk": 55, + "def": 45, + "spa": 65, + "spd": 45, + "spe": 75 + }, + "abilities": { + "0": "Vital Spirit", + "1": "Hustle", + "H": "Insomnia" + }, + "heightm": 0.9, + "weightkg": 16, + "color": "Red", + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "mantine": { + "num": 226, + "species": "Mantine", + "types": [ + "Water", + "Flying" + ], + "baseStats": { + "hp": 65, + "atk": 40, + "def": 70, + "spa": 80, + "spd": 140, + "spe": 70 + }, + "abilities": { + "0": "Swift Swim", + "1": "Water Absorb", + "H": "Water Veil" + }, + "heightm": 2.1, + "weightkg": 220, + "color": "Purple", + "prevo": "mantyke", + "evoLevel": 1, + "eggGroups": [ + "Water 1" + ] + }, + "skarmory": { + "num": 227, + "species": "Skarmory", + "types": [ + "Steel", + "Flying" + ], + "baseStats": { + "hp": 65, + "atk": 80, + "def": 140, + "spa": 40, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Keen Eye", + "1": "Sturdy", + "H": "Weak Armor" + }, + "heightm": 1.7, + "weightkg": 50.5, + "color": "Gray", + "eggGroups": [ + "Flying" + ] + }, + "houndour": { + "num": 228, + "species": "Houndour", + "types": [ + "Dark", + "Fire" + ], + "baseStats": { + "hp": 45, + "atk": 60, + "def": 30, + "spa": 80, + "spd": 50, + "spe": 65 + }, + "abilities": { + "0": "Early Bird", + "1": "Flash Fire", + "H": "Unnerve" + }, + "heightm": 0.6, + "weightkg": 10.8, + "color": "Black", + "evos": [ + "houndoom" + ], + "eggGroups": [ + "Field" + ] + }, + "houndoom": { + "num": 229, + "species": "Houndoom", + "types": [ + "Dark", + "Fire" + ], + "baseStats": { + "hp": 75, + "atk": 90, + "def": 50, + "spa": 110, + "spd": 80, + "spe": 95 + }, + "abilities": { + "0": "Early Bird", + "1": "Flash Fire", + "H": "Unnerve" + }, + "heightm": 1.4, + "weightkg": 35, + "color": "Black", + "prevo": "houndour", + "evoLevel": 24, + "eggGroups": [ + "Field" + ], + "otherFormes": [ + "houndoommega" + ] + }, + "houndoommega": { + "num": 229, + "species": "Houndoom-Mega", + "baseSpecies": "Houndoom", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dark", + "Fire" + ], + "baseStats": { + "hp": 75, + "atk": 90, + "def": 90, + "spa": 140, + "spd": 90, + "spe": 115 + }, + "abilities": { + "0": "Solar Power" + }, + "heightm": 1.9, + "weightkg": 49.5, + "color": "Black", + "eggGroups": [ + "Field" + ] + }, + "kingdra": { + "num": 230, + "species": "Kingdra", + "types": [ + "Water", + "Dragon" + ], + "baseStats": { + "hp": 75, + "atk": 95, + "def": 95, + "spa": 95, + "spd": 95, + "spe": 85 + }, + "abilities": { + "0": "Swift Swim", + "1": "Sniper", + "H": "Damp" + }, + "heightm": 1.8, + "weightkg": 152, + "color": "Blue", + "prevo": "seadra", + "evoLevel": 32, + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "phanpy": { + "num": 231, + "species": "Phanpy", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 90, + "atk": 60, + "def": 60, + "spa": 40, + "spd": 40, + "spe": 40 + }, + "abilities": { + "0": "Pickup", + "H": "Sand Veil" + }, + "heightm": 0.5, + "weightkg": 33.5, + "color": "Blue", + "evos": [ + "donphan" + ], + "eggGroups": [ + "Field" + ] + }, + "donphan": { + "num": 232, + "species": "Donphan", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 90, + "atk": 120, + "def": 120, + "spa": 60, + "spd": 60, + "spe": 50 + }, + "abilities": { + "0": "Sturdy", + "H": "Sand Veil" + }, + "heightm": 1.1, + "weightkg": 120, + "color": "Gray", + "prevo": "phanpy", + "evoLevel": 25, + "eggGroups": [ + "Field" + ] + }, + "porygon2": { + "num": 233, + "species": "Porygon2", + "types": [ + "Normal" + ], + "gender": "N", + "baseStats": { + "hp": 85, + "atk": 80, + "def": 90, + "spa": 105, + "spd": 95, + "spe": 60 + }, + "abilities": { + "0": "Trace", + "1": "Download", + "H": "Analytic" + }, + "heightm": 0.6, + "weightkg": 32.5, + "color": "Red", + "prevo": "porygon", + "evos": [ + "porygonz" + ], + "evoLevel": 1, + "eggGroups": [ + "Mineral" + ] + }, + "stantler": { + "num": 234, + "species": "Stantler", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 73, + "atk": 95, + "def": 62, + "spa": 85, + "spd": 65, + "spe": 85 + }, + "abilities": { + "0": "Intimidate", + "1": "Frisk", + "H": "Sap Sipper" + }, + "heightm": 1.4, + "weightkg": 71.2, + "color": "Brown", + "eggGroups": [ + "Field" + ] + }, + "smeargle": { + "num": 235, + "species": "Smeargle", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 55, + "atk": 20, + "def": 35, + "spa": 20, + "spd": 45, + "spe": 75 + }, + "abilities": { + "0": "Own Tempo", + "1": "Technician", + "H": "Moody" + }, + "heightm": 1.2, + "weightkg": 58, + "color": "White", + "eggGroups": [ + "Field" + ] + }, + "tyrogue": { + "num": 236, + "species": "Tyrogue", + "types": [ + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 35, + "atk": 35, + "def": 35, + "spa": 35, + "spd": 35, + "spe": 35 + }, + "abilities": { + "0": "Guts", + "1": "Steadfast", + "H": "Vital Spirit" + }, + "heightm": 0.7, + "weightkg": 21, + "color": "Purple", + "evos": [ + "hitmonlee", + "hitmonchan", + "hitmontop" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "hitmontop": { + "num": 237, + "species": "Hitmontop", + "types": [ + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 50, + "atk": 95, + "def": 95, + "spa": 35, + "spd": 110, + "spe": 70 + }, + "abilities": { + "0": "Intimidate", + "1": "Technician", + "H": "Steadfast" + }, + "heightm": 1.4, + "weightkg": 48, + "color": "Brown", + "prevo": "tyrogue", + "evoLevel": 20, + "eggGroups": [ + "Human-Like" + ] + }, + "smoochum": { + "num": 238, + "species": "Smoochum", + "types": [ + "Ice", + "Psychic" + ], + "gender": "F", + "baseStats": { + "hp": 45, + "atk": 30, + "def": 15, + "spa": 85, + "spd": 65, + "spe": 65 + }, + "abilities": { + "0": "Oblivious", + "1": "Forewarn", + "H": "Hydration" + }, + "heightm": 0.4, + "weightkg": 6, + "color": "Pink", + "evos": [ + "jynx" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "elekid": { + "num": 239, + "species": "Elekid", + "types": [ + "Electric" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 45, + "atk": 63, + "def": 37, + "spa": 65, + "spd": 55, + "spe": 95 + }, + "abilities": { + "0": "Static", + "H": "Vital Spirit" + }, + "heightm": 0.6, + "weightkg": 23.5, + "color": "Yellow", + "evos": [ + "electabuzz" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "magby": { + "num": 240, + "species": "Magby", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 45, + "atk": 75, + "def": 37, + "spa": 70, + "spd": 55, + "spe": 83 + }, + "abilities": { + "0": "Flame Body", + "H": "Vital Spirit" + }, + "heightm": 0.7, + "weightkg": 21.4, + "color": "Red", + "evos": [ + "magmar" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "miltank": { + "num": 241, + "species": "Miltank", + "types": [ + "Normal" + ], + "gender": "F", + "baseStats": { + "hp": 95, + "atk": 80, + "def": 105, + "spa": 40, + "spd": 70, + "spe": 100 + }, + "abilities": { + "0": "Thick Fat", + "1": "Scrappy", + "H": "Sap Sipper" + }, + "heightm": 1.2, + "weightkg": 75.5, + "color": "Pink", + "eggGroups": [ + "Field" + ] + }, + "blissey": { + "num": 242, + "species": "Blissey", + "types": [ + "Normal" + ], + "gender": "F", + "baseStats": { + "hp": 255, + "atk": 10, + "def": 10, + "spa": 75, + "spd": 135, + "spe": 55 + }, + "abilities": { + "0": "Natural Cure", + "1": "Serene Grace", + "H": "Healer" + }, + "heightm": 1.5, + "weightkg": 46.8, + "color": "Pink", + "prevo": "chansey", + "evoLevel": 2, + "eggGroups": [ + "Fairy" + ] + }, + "raikou": { + "num": 243, + "species": "Raikou", + "types": [ + "Electric" + ], + "gender": "N", + "baseStats": { + "hp": 90, + "atk": 85, + "def": 75, + "spa": 115, + "spd": 100, + "spe": 115 + }, + "abilities": { + "0": "Pressure", + "H": "Volt Absorb" + }, + "heightm": 1.9, + "weightkg": 178, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "entei": { + "num": 244, + "species": "Entei", + "types": [ + "Fire" + ], + "gender": "N", + "baseStats": { + "hp": 115, + "atk": 115, + "def": 85, + "spa": 90, + "spd": 75, + "spe": 100 + }, + "abilities": { + "0": "Pressure", + "H": "Flash Fire" + }, + "heightm": 2.1, + "weightkg": 198, + "color": "Brown", + "eggGroups": [ + "Undiscovered" + ] + }, + "suicune": { + "num": 245, + "species": "Suicune", + "types": [ + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 75, + "def": 115, + "spa": 90, + "spd": 115, + "spe": 85 + }, + "abilities": { + "0": "Pressure", + "H": "Water Absorb" + }, + "heightm": 2, + "weightkg": 187, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "larvitar": { + "num": 246, + "species": "Larvitar", + "types": [ + "Rock", + "Ground" + ], + "baseStats": { + "hp": 50, + "atk": 64, + "def": 50, + "spa": 45, + "spd": 50, + "spe": 41 + }, + "abilities": { + "0": "Guts", + "H": "Sand Veil" + }, + "heightm": 0.6, + "weightkg": 72, + "color": "Green", + "evos": [ + "pupitar" + ], + "eggGroups": [ + "Monster" + ] + }, + "pupitar": { + "num": 247, + "species": "Pupitar", + "types": [ + "Rock", + "Ground" + ], + "baseStats": { + "hp": 70, + "atk": 84, + "def": 70, + "spa": 65, + "spd": 70, + "spe": 51 + }, + "abilities": { + "0": "Shed Skin" + }, + "heightm": 1.2, + "weightkg": 152, + "color": "Gray", + "prevo": "larvitar", + "evos": [ + "tyranitar" + ], + "evoLevel": 30, + "eggGroups": [ + "Monster" + ] + }, + "tyranitar": { + "num": 248, + "species": "Tyranitar", + "types": [ + "Rock", + "Dark" + ], + "baseStats": { + "hp": 100, + "atk": 134, + "def": 110, + "spa": 95, + "spd": 100, + "spe": 61 + }, + "abilities": { + "0": "Sand Stream", + "H": "Unnerve" + }, + "heightm": 2, + "weightkg": 202, + "color": "Green", + "prevo": "pupitar", + "evoLevel": 55, + "eggGroups": [ + "Monster" + ], + "otherFormes": [ + "tyranitarmega" + ] + }, + "tyranitarmega": { + "num": 248, + "species": "Tyranitar-Mega", + "baseSpecies": "Tyranitar", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Rock", + "Dark" + ], + "baseStats": { + "hp": 100, + "atk": 164, + "def": 150, + "spa": 95, + "spd": 120, + "spe": 71 + }, + "abilities": { + "0": "Sand Stream" + }, + "heightm": 2.5, + "weightkg": 255, + "color": "Green", + "eggGroups": [ + "Monster" + ] + }, + "lugia": { + "num": 249, + "species": "Lugia", + "types": [ + "Psychic", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 106, + "atk": 90, + "def": 130, + "spa": 90, + "spd": 154, + "spe": 110 + }, + "abilities": { + "0": "Pressure", + "H": "Multiscale" + }, + "heightm": 5.2, + "weightkg": 216, + "color": "White", + "eggGroups": [ + "Undiscovered" + ] + }, + "hooh": { + "num": 250, + "species": "Ho-Oh", + "types": [ + "Fire", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 106, + "atk": 130, + "def": 90, + "spa": 110, + "spd": 154, + "spe": 90 + }, + "abilities": { + "0": "Pressure", + "H": "Regenerator" + }, + "heightm": 3.8, + "weightkg": 199, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ] + }, + "celebi": { + "num": 251, + "species": "Celebi", + "types": [ + "Psychic", + "Grass" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 100, + "def": 100, + "spa": 100, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Natural Cure" + }, + "heightm": 0.6, + "weightkg": 5, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ] + }, + "treecko": { + "num": 252, + "species": "Treecko", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 40, + "atk": 45, + "def": 35, + "spa": 65, + "spd": 55, + "spe": 70 + }, + "abilities": { + "0": "Overgrow", + "H": "Unburden" + }, + "heightm": 0.5, + "weightkg": 5, + "color": "Green", + "evos": [ + "grovyle" + ], + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "grovyle": { + "num": 253, + "species": "Grovyle", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 50, + "atk": 65, + "def": 45, + "spa": 85, + "spd": 65, + "spe": 95 + }, + "abilities": { + "0": "Overgrow", + "H": "Unburden" + }, + "heightm": 0.9, + "weightkg": 21.6, + "color": "Green", + "prevo": "treecko", + "evos": [ + "sceptile" + ], + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "sceptile": { + "num": 254, + "species": "Sceptile", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 70, + "atk": 85, + "def": 65, + "spa": 105, + "spd": 85, + "spe": 120 + }, + "abilities": { + "0": "Overgrow", + "H": "Unburden" + }, + "heightm": 1.7, + "weightkg": 52.2, + "color": "Green", + "prevo": "grovyle", + "evoLevel": 36, + "eggGroups": [ + "Monster", + "Dragon" + ], + "otherFormes": [ + "sceptilemega" + ] + }, + "sceptilemega": { + "num": 254, + "species": "Sceptile-Mega", + "baseSpecies": "Sceptile", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Grass", + "Dragon" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 70, + "atk": 110, + "def": 75, + "spa": 145, + "spd": 85, + "spe": 145 + }, + "abilities": { + "0": "Lightning Rod" + }, + "heightm": 1.9, + "weightkg": 55.2, + "color": "Green", + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "torchic": { + "num": 255, + "species": "Torchic", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 45, + "atk": 60, + "def": 40, + "spa": 70, + "spd": 50, + "spe": 45 + }, + "abilities": { + "0": "Blaze", + "H": "Speed Boost" + }, + "heightm": 0.4, + "weightkg": 2.5, + "color": "Red", + "evos": [ + "combusken" + ], + "eggGroups": [ + "Field" + ] + }, + "combusken": { + "num": 256, + "species": "Combusken", + "types": [ + "Fire", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 60, + "atk": 85, + "def": 60, + "spa": 85, + "spd": 60, + "spe": 55 + }, + "abilities": { + "0": "Blaze", + "H": "Speed Boost" + }, + "heightm": 0.9, + "weightkg": 19.5, + "color": "Red", + "prevo": "torchic", + "evos": [ + "blaziken" + ], + "evoLevel": 16, + "eggGroups": [ + "Field" + ] + }, + "blaziken": { + "num": 257, + "species": "Blaziken", + "types": [ + "Fire", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 80, + "atk": 120, + "def": 70, + "spa": 110, + "spd": 70, + "spe": 80 + }, + "abilities": { + "0": "Blaze", + "H": "Speed Boost" + }, + "heightm": 1.9, + "weightkg": 52, + "color": "Red", + "prevo": "combusken", + "evoLevel": 36, + "eggGroups": [ + "Field" + ], + "otherFormes": [ + "blazikenmega" + ] + }, + "blazikenmega": { + "num": 257, + "species": "Blaziken-Mega", + "baseSpecies": "Blaziken", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Fire", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 80, + "atk": 160, + "def": 80, + "spa": 130, + "spd": 80, + "spe": 100 + }, + "abilities": { + "0": "Speed Boost" + }, + "heightm": 1.9, + "weightkg": 52, + "color": "Red", + "eggGroups": [ + "Field" + ] + }, + "mudkip": { + "num": 258, + "species": "Mudkip", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 50, + "atk": 70, + "def": 50, + "spa": 50, + "spd": 50, + "spe": 40 + }, + "abilities": { + "0": "Torrent", + "H": "Damp" + }, + "heightm": 0.4, + "weightkg": 7.6, + "color": "Blue", + "evos": [ + "marshtomp" + ], + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "marshtomp": { + "num": 259, + "species": "Marshtomp", + "types": [ + "Water", + "Ground" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 70, + "atk": 85, + "def": 70, + "spa": 60, + "spd": 70, + "spe": 50 + }, + "abilities": { + "0": "Torrent", + "H": "Damp" + }, + "heightm": 0.7, + "weightkg": 28, + "color": "Blue", + "prevo": "mudkip", + "evos": [ + "swampert" + ], + "evoLevel": 16, + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "swampert": { + "num": 260, + "species": "Swampert", + "types": [ + "Water", + "Ground" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 100, + "atk": 110, + "def": 90, + "spa": 85, + "spd": 90, + "spe": 60 + }, + "abilities": { + "0": "Torrent", + "H": "Damp" + }, + "heightm": 1.5, + "weightkg": 81.9, + "color": "Blue", + "prevo": "marshtomp", + "evoLevel": 36, + "eggGroups": [ + "Monster", + "Water 1" + ], + "otherFormes": [ + "swampertmega" + ] + }, + "swampertmega": { + "num": 260, + "species": "Swampert-Mega", + "baseSpecies": "Swampert", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Water", + "Ground" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 100, + "atk": 150, + "def": 110, + "spa": 95, + "spd": 110, + "spe": 70 + }, + "abilities": { + "0": "Swift Swim" + }, + "heightm": 1.9, + "weightkg": 102, + "color": "Blue", + "eggGroups": [ + "Monster", + "Water 1" + ] + }, + "poochyena": { + "num": 261, + "species": "Poochyena", + "types": [ + "Dark" + ], + "baseStats": { + "hp": 35, + "atk": 55, + "def": 35, + "spa": 30, + "spd": 30, + "spe": 35 + }, + "abilities": { + "0": "Run Away", + "1": "Quick Feet", + "H": "Rattled" + }, + "heightm": 0.5, + "weightkg": 13.6, + "color": "Gray", + "evos": [ + "mightyena" + ], + "eggGroups": [ + "Field" + ] + }, + "mightyena": { + "num": 262, + "species": "Mightyena", + "types": [ + "Dark" + ], + "baseStats": { + "hp": 70, + "atk": 90, + "def": 70, + "spa": 60, + "spd": 60, + "spe": 70 + }, + "abilities": { + "0": "Intimidate", + "1": "Quick Feet", + "H": "Moxie" + }, + "heightm": 1, + "weightkg": 37, + "color": "Gray", + "prevo": "poochyena", + "evoLevel": 18, + "eggGroups": [ + "Field" + ] + }, + "zigzagoon": { + "num": 263, + "species": "Zigzagoon", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 38, + "atk": 30, + "def": 41, + "spa": 30, + "spd": 41, + "spe": 60 + }, + "abilities": { + "0": "Pickup", + "1": "Gluttony", + "H": "Quick Feet" + }, + "heightm": 0.4, + "weightkg": 17.5, + "color": "Brown", + "evos": [ + "linoone" + ], + "eggGroups": [ + "Field" + ] + }, + "linoone": { + "num": 264, + "species": "Linoone", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 78, + "atk": 70, + "def": 61, + "spa": 50, + "spd": 61, + "spe": 100 + }, + "abilities": { + "0": "Pickup", + "1": "Gluttony", + "H": "Quick Feet" + }, + "heightm": 0.5, + "weightkg": 32.5, + "color": "White", + "prevo": "zigzagoon", + "evoLevel": 20, + "eggGroups": [ + "Field" + ] + }, + "wurmple": { + "num": 265, + "species": "Wurmple", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 45, + "atk": 45, + "def": 35, + "spa": 20, + "spd": 30, + "spe": 20 + }, + "abilities": { + "0": "Shield Dust", + "H": "Run Away" + }, + "heightm": 0.3, + "weightkg": 3.6, + "color": "Red", + "evos": [ + "silcoon", + "cascoon" + ], + "eggGroups": [ + "Bug" + ] + }, + "silcoon": { + "num": 266, + "species": "Silcoon", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 50, + "atk": 35, + "def": 55, + "spa": 25, + "spd": 25, + "spe": 15 + }, + "abilities": { + "0": "Shed Skin" + }, + "heightm": 0.6, + "weightkg": 10, + "color": "White", + "prevo": "wurmple", + "evos": [ + "beautifly" + ], + "evoLevel": 7, + "eggGroups": [ + "Bug" + ] + }, + "beautifly": { + "num": 267, + "species": "Beautifly", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 60, + "atk": 70, + "def": 50, + "spa": 100, + "spd": 50, + "spe": 65 + }, + "abilities": { + "0": "Swarm", + "H": "Rivalry" + }, + "heightm": 1, + "weightkg": 28.4, + "color": "Yellow", + "prevo": "silcoon", + "evoLevel": 10, + "eggGroups": [ + "Bug" + ] + }, + "cascoon": { + "num": 268, + "species": "Cascoon", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 50, + "atk": 35, + "def": 55, + "spa": 25, + "spd": 25, + "spe": 15 + }, + "abilities": { + "0": "Shed Skin" + }, + "heightm": 0.7, + "weightkg": 11.5, + "color": "Purple", + "prevo": "wurmple", + "evos": [ + "dustox" + ], + "evoLevel": 7, + "eggGroups": [ + "Bug" + ] + }, + "dustox": { + "num": 269, + "species": "Dustox", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 50, + "def": 70, + "spa": 50, + "spd": 90, + "spe": 65 + }, + "abilities": { + "0": "Shield Dust", + "H": "Compound Eyes" + }, + "heightm": 1.2, + "weightkg": 31.6, + "color": "Green", + "prevo": "cascoon", + "evoLevel": 10, + "eggGroups": [ + "Bug" + ] + }, + "lotad": { + "num": 270, + "species": "Lotad", + "types": [ + "Water", + "Grass" + ], + "baseStats": { + "hp": 40, + "atk": 30, + "def": 30, + "spa": 40, + "spd": 50, + "spe": 30 + }, + "abilities": { + "0": "Swift Swim", + "1": "Rain Dish", + "H": "Own Tempo" + }, + "heightm": 0.5, + "weightkg": 2.6, + "color": "Green", + "evos": [ + "lombre" + ], + "eggGroups": [ + "Water 1", + "Grass" + ] + }, + "lombre": { + "num": 271, + "species": "Lombre", + "types": [ + "Water", + "Grass" + ], + "baseStats": { + "hp": 60, + "atk": 50, + "def": 50, + "spa": 60, + "spd": 70, + "spe": 50 + }, + "abilities": { + "0": "Swift Swim", + "1": "Rain Dish", + "H": "Own Tempo" + }, + "heightm": 1.2, + "weightkg": 32.5, + "color": "Green", + "prevo": "lotad", + "evos": [ + "ludicolo" + ], + "evoLevel": 14, + "eggGroups": [ + "Water 1", + "Grass" + ] + }, + "ludicolo": { + "num": 272, + "species": "Ludicolo", + "types": [ + "Water", + "Grass" + ], + "baseStats": { + "hp": 80, + "atk": 70, + "def": 70, + "spa": 90, + "spd": 100, + "spe": 70 + }, + "abilities": { + "0": "Swift Swim", + "1": "Rain Dish", + "H": "Own Tempo" + }, + "heightm": 1.5, + "weightkg": 55, + "color": "Green", + "prevo": "lombre", + "evoLevel": 14, + "eggGroups": [ + "Water 1", + "Grass" + ] + }, + "seedot": { + "num": 273, + "species": "Seedot", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 40, + "atk": 40, + "def": 50, + "spa": 30, + "spd": 30, + "spe": 30 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Early Bird", + "H": "Pickpocket" + }, + "heightm": 0.5, + "weightkg": 4, + "color": "Brown", + "evos": [ + "nuzleaf" + ], + "eggGroups": [ + "Field", + "Grass" + ] + }, + "nuzleaf": { + "num": 274, + "species": "Nuzleaf", + "types": [ + "Grass", + "Dark" + ], + "baseStats": { + "hp": 70, + "atk": 70, + "def": 40, + "spa": 60, + "spd": 40, + "spe": 60 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Early Bird", + "H": "Pickpocket" + }, + "heightm": 1, + "weightkg": 28, + "color": "Brown", + "prevo": "seedot", + "evos": [ + "shiftry" + ], + "evoLevel": 14, + "eggGroups": [ + "Field", + "Grass" + ] + }, + "shiftry": { + "num": 275, + "species": "Shiftry", + "types": [ + "Grass", + "Dark" + ], + "baseStats": { + "hp": 90, + "atk": 100, + "def": 60, + "spa": 90, + "spd": 60, + "spe": 80 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Early Bird", + "H": "Pickpocket" + }, + "heightm": 1.3, + "weightkg": 59.6, + "color": "Brown", + "prevo": "nuzleaf", + "evoLevel": 14, + "eggGroups": [ + "Field", + "Grass" + ] + }, + "taillow": { + "num": 276, + "species": "Taillow", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 55, + "def": 30, + "spa": 30, + "spd": 30, + "spe": 85 + }, + "abilities": { + "0": "Guts", + "H": "Scrappy" + }, + "heightm": 0.3, + "weightkg": 2.3, + "color": "Blue", + "evos": [ + "swellow" + ], + "eggGroups": [ + "Flying" + ] + }, + "swellow": { + "num": 277, + "species": "Swellow", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 60, + "atk": 85, + "def": 60, + "spa": 50, + "spd": 50, + "spe": 125 + }, + "abilities": { + "0": "Guts", + "H": "Scrappy" + }, + "heightm": 0.7, + "weightkg": 19.8, + "color": "Blue", + "prevo": "taillow", + "evoLevel": 22, + "eggGroups": [ + "Flying" + ] + }, + "wingull": { + "num": 278, + "species": "Wingull", + "types": [ + "Water", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 30, + "def": 30, + "spa": 55, + "spd": 30, + "spe": 85 + }, + "abilities": { + "0": "Keen Eye", + "H": "Rain Dish" + }, + "heightm": 0.6, + "weightkg": 9.5, + "color": "White", + "evos": [ + "pelipper" + ], + "eggGroups": [ + "Water 1", + "Flying" + ] + }, + "pelipper": { + "num": 279, + "species": "Pelipper", + "types": [ + "Water", + "Flying" + ], + "baseStats": { + "hp": 60, + "atk": 50, + "def": 100, + "spa": 85, + "spd": 70, + "spe": 65 + }, + "abilities": { + "0": "Keen Eye", + "H": "Rain Dish" + }, + "heightm": 1.2, + "weightkg": 28, + "color": "Yellow", + "prevo": "wingull", + "evoLevel": 25, + "eggGroups": [ + "Water 1", + "Flying" + ] + }, + "ralts": { + "num": 280, + "species": "Ralts", + "types": [ + "Psychic", + "Fairy" + ], + "baseStats": { + "hp": 28, + "atk": 25, + "def": 25, + "spa": 45, + "spd": 35, + "spe": 40 + }, + "abilities": { + "0": "Synchronize", + "1": "Trace", + "H": "Telepathy" + }, + "heightm": 0.4, + "weightkg": 6.6, + "color": "White", + "evos": [ + "kirlia" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "kirlia": { + "num": 281, + "species": "Kirlia", + "types": [ + "Psychic", + "Fairy" + ], + "baseStats": { + "hp": 38, + "atk": 35, + "def": 35, + "spa": 65, + "spd": 55, + "spe": 50 + }, + "abilities": { + "0": "Synchronize", + "1": "Trace", + "H": "Telepathy" + }, + "heightm": 0.8, + "weightkg": 20.2, + "color": "White", + "prevo": "ralts", + "evos": [ + "gardevoir", + "gallade" + ], + "evoLevel": 20, + "eggGroups": [ + "Amorphous" + ] + }, + "gardevoir": { + "num": 282, + "species": "Gardevoir", + "types": [ + "Psychic", + "Fairy" + ], + "baseStats": { + "hp": 68, + "atk": 65, + "def": 65, + "spa": 125, + "spd": 115, + "spe": 80 + }, + "abilities": { + "0": "Synchronize", + "1": "Trace", + "H": "Telepathy" + }, + "heightm": 1.6, + "weightkg": 48.4, + "color": "White", + "prevo": "kirlia", + "evoLevel": 30, + "eggGroups": [ + "Amorphous" + ], + "otherFormes": [ + "gardevoirmega" + ] + }, + "gardevoirmega": { + "num": 282, + "species": "Gardevoir-Mega", + "baseSpecies": "Gardevoir", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Psychic", + "Fairy" + ], + "baseStats": { + "hp": 68, + "atk": 85, + "def": 65, + "spa": 165, + "spd": 135, + "spe": 100 + }, + "abilities": { + "0": "Pixilate" + }, + "heightm": 1.6, + "weightkg": 48.4, + "color": "White", + "eggGroups": [ + "Amorphous" + ] + }, + "surskit": { + "num": 283, + "species": "Surskit", + "types": [ + "Bug", + "Water" + ], + "baseStats": { + "hp": 40, + "atk": 30, + "def": 32, + "spa": 50, + "spd": 52, + "spe": 65 + }, + "abilities": { + "0": "Swift Swim", + "H": "Rain Dish" + }, + "heightm": 0.5, + "weightkg": 1.7, + "color": "Blue", + "evos": [ + "masquerain" + ], + "eggGroups": [ + "Water 1", + "Bug" + ] + }, + "masquerain": { + "num": 284, + "species": "Masquerain", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 70, + "atk": 60, + "def": 62, + "spa": 80, + "spd": 82, + "spe": 60 + }, + "abilities": { + "0": "Intimidate", + "H": "Unnerve" + }, + "heightm": 0.8, + "weightkg": 3.6, + "color": "Blue", + "prevo": "surskit", + "evoLevel": 22, + "eggGroups": [ + "Water 1", + "Bug" + ] + }, + "shroomish": { + "num": 285, + "species": "Shroomish", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 60, + "atk": 40, + "def": 60, + "spa": 40, + "spd": 60, + "spe": 35 + }, + "abilities": { + "0": "Effect Spore", + "1": "Poison Heal", + "H": "Quick Feet" + }, + "heightm": 0.4, + "weightkg": 4.5, + "color": "Brown", + "evos": [ + "breloom" + ], + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "breloom": { + "num": 286, + "species": "Breloom", + "types": [ + "Grass", + "Fighting" + ], + "baseStats": { + "hp": 60, + "atk": 130, + "def": 80, + "spa": 60, + "spd": 60, + "spe": 70 + }, + "abilities": { + "0": "Effect Spore", + "1": "Poison Heal", + "H": "Technician" + }, + "heightm": 1.2, + "weightkg": 39.2, + "color": "Green", + "prevo": "shroomish", + "evoLevel": 23, + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "slakoth": { + "num": 287, + "species": "Slakoth", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 60, + "atk": 60, + "def": 60, + "spa": 35, + "spd": 35, + "spe": 30 + }, + "abilities": { + "0": "Truant" + }, + "heightm": 0.8, + "weightkg": 24, + "color": "Brown", + "evos": [ + "vigoroth" + ], + "eggGroups": [ + "Field" + ] + }, + "vigoroth": { + "num": 288, + "species": "Vigoroth", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 80, + "atk": 80, + "def": 80, + "spa": 55, + "spd": 55, + "spe": 90 + }, + "abilities": { + "0": "Vital Spirit" + }, + "heightm": 1.4, + "weightkg": 46.5, + "color": "White", + "prevo": "slakoth", + "evos": [ + "slaking" + ], + "evoLevel": 18, + "eggGroups": [ + "Field" + ] + }, + "slaking": { + "num": 289, + "species": "Slaking", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 150, + "atk": 160, + "def": 100, + "spa": 95, + "spd": 65, + "spe": 100 + }, + "abilities": { + "0": "Truant" + }, + "heightm": 2, + "weightkg": 130.5, + "color": "Brown", + "prevo": "vigoroth", + "evoLevel": 36, + "eggGroups": [ + "Field" + ] + }, + "nincada": { + "num": 290, + "species": "Nincada", + "types": [ + "Bug", + "Ground" + ], + "baseStats": { + "hp": 31, + "atk": 45, + "def": 90, + "spa": 30, + "spd": 30, + "spe": 40 + }, + "abilities": { + "0": "Compound Eyes", + "H": "Run Away" + }, + "heightm": 0.5, + "weightkg": 5.5, + "color": "Gray", + "evos": [ + "ninjask", + "shedinja" + ], + "eggGroups": [ + "Bug" + ] + }, + "ninjask": { + "num": 291, + "species": "Ninjask", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 61, + "atk": 90, + "def": 45, + "spa": 50, + "spd": 50, + "spe": 160 + }, + "abilities": { + "0": "Speed Boost", + "H": "Infiltrator" + }, + "heightm": 0.8, + "weightkg": 12, + "color": "Yellow", + "prevo": "nincada", + "evoLevel": 20, + "eggGroups": [ + "Bug" + ] + }, + "shedinja": { + "num": 292, + "species": "Shedinja", + "types": [ + "Bug", + "Ghost" + ], + "gender": "N", + "baseStats": { + "hp": 1, + "atk": 90, + "def": 45, + "spa": 30, + "spd": 30, + "spe": 40 + }, + "maxHP": 1, + "abilities": { + "0": "Wonder Guard" + }, + "heightm": 0.8, + "weightkg": 1.2, + "color": "Brown", + "prevo": "nincada", + "evoLevel": 20, + "eggGroups": [ + "Mineral" + ] + }, + "whismur": { + "num": 293, + "species": "Whismur", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 64, + "atk": 51, + "def": 23, + "spa": 51, + "spd": 23, + "spe": 28 + }, + "abilities": { + "0": "Soundproof", + "H": "Rattled" + }, + "heightm": 0.6, + "weightkg": 16.3, + "color": "Pink", + "evos": [ + "loudred" + ], + "eggGroups": [ + "Monster", + "Field" + ] + }, + "loudred": { + "num": 294, + "species": "Loudred", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 84, + "atk": 71, + "def": 43, + "spa": 71, + "spd": 43, + "spe": 48 + }, + "abilities": { + "0": "Soundproof", + "H": "Scrappy" + }, + "heightm": 1, + "weightkg": 40.5, + "color": "Blue", + "prevo": "whismur", + "evos": [ + "exploud" + ], + "evoLevel": 20, + "eggGroups": [ + "Monster", + "Field" + ] + }, + "exploud": { + "num": 295, + "species": "Exploud", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 104, + "atk": 91, + "def": 63, + "spa": 91, + "spd": 73, + "spe": 68 + }, + "abilities": { + "0": "Soundproof", + "H": "Scrappy" + }, + "heightm": 1.5, + "weightkg": 84, + "color": "Blue", + "prevo": "loudred", + "evoLevel": 40, + "eggGroups": [ + "Monster", + "Field" + ] + }, + "makuhita": { + "num": 296, + "species": "Makuhita", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 72, + "atk": 60, + "def": 30, + "spa": 20, + "spd": 30, + "spe": 25 + }, + "abilities": { + "0": "Thick Fat", + "1": "Guts", + "H": "Sheer Force" + }, + "heightm": 1, + "weightkg": 86.4, + "color": "Yellow", + "evos": [ + "hariyama" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "hariyama": { + "num": 297, + "species": "Hariyama", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 144, + "atk": 120, + "def": 60, + "spa": 40, + "spd": 60, + "spe": 50 + }, + "abilities": { + "0": "Thick Fat", + "1": "Guts", + "H": "Sheer Force" + }, + "heightm": 2.3, + "weightkg": 253.8, + "color": "Brown", + "prevo": "makuhita", + "evoLevel": 24, + "eggGroups": [ + "Human-Like" + ] + }, + "azurill": { + "num": 298, + "species": "Azurill", + "types": [ + "Normal", + "Fairy" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 50, + "atk": 20, + "def": 40, + "spa": 20, + "spd": 40, + "spe": 20 + }, + "abilities": { + "0": "Thick Fat", + "1": "Huge Power", + "H": "Sap Sipper" + }, + "heightm": 0.2, + "weightkg": 2, + "color": "Blue", + "evos": [ + "marill" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "nosepass": { + "num": 299, + "species": "Nosepass", + "types": [ + "Rock" + ], + "baseStats": { + "hp": 30, + "atk": 45, + "def": 135, + "spa": 45, + "spd": 90, + "spe": 30 + }, + "abilities": { + "0": "Sturdy", + "1": "Magnet Pull", + "H": "Sand Force" + }, + "heightm": 1, + "weightkg": 97, + "color": "Gray", + "evos": [ + "probopass" + ], + "eggGroups": [ + "Mineral" + ] + }, + "skitty": { + "num": 300, + "species": "Skitty", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 50, + "atk": 45, + "def": 45, + "spa": 35, + "spd": 35, + "spe": 50 + }, + "abilities": { + "0": "Cute Charm", + "1": "Normalize", + "H": "Wonder Skin" + }, + "heightm": 0.6, + "weightkg": 11, + "color": "Pink", + "evos": [ + "delcatty" + ], + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "delcatty": { + "num": 301, + "species": "Delcatty", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 70, + "atk": 65, + "def": 65, + "spa": 55, + "spd": 55, + "spe": 70 + }, + "abilities": { + "0": "Cute Charm", + "1": "Normalize", + "H": "Wonder Skin" + }, + "heightm": 1.1, + "weightkg": 32.6, + "color": "Purple", + "prevo": "skitty", + "evoLevel": 1, + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "sableye": { + "num": 302, + "species": "Sableye", + "types": [ + "Dark", + "Ghost" + ], + "baseStats": { + "hp": 50, + "atk": 75, + "def": 75, + "spa": 65, + "spd": 65, + "spe": 50 + }, + "abilities": { + "0": "Keen Eye", + "1": "Stall", + "H": "Prankster" + }, + "heightm": 0.5, + "weightkg": 11, + "color": "Purple", + "eggGroups": [ + "Human-Like" + ], + "otherFormes": [ + "sableyemega" + ] + }, + "sableyemega": { + "num": 302, + "species": "Sableye-Mega", + "baseSpecies": "Sableye", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dark", + "Ghost" + ], + "baseStats": { + "hp": 50, + "atk": 85, + "def": 125, + "spa": 85, + "spd": 115, + "spe": 20 + }, + "abilities": { + "0": "Magic Bounce" + }, + "heightm": 0.5, + "weightkg": 161, + "color": "Purple", + "eggGroups": [ + "Human-Like" + ] + }, + "mawile": { + "num": 303, + "species": "Mawile", + "types": [ + "Steel", + "Fairy" + ], + "baseStats": { + "hp": 50, + "atk": 85, + "def": 85, + "spa": 55, + "spd": 55, + "spe": 50 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Intimidate", + "H": "Sheer Force" + }, + "heightm": 0.6, + "weightkg": 11.5, + "color": "Black", + "eggGroups": [ + "Field", + "Fairy" + ], + "otherFormes": [ + "mawilemega" + ] + }, + "mawilemega": { + "num": 303, + "species": "Mawile-Mega", + "baseSpecies": "Mawile", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Steel", + "Fairy" + ], + "baseStats": { + "hp": 50, + "atk": 105, + "def": 125, + "spa": 55, + "spd": 95, + "spe": 50 + }, + "abilities": { + "0": "Huge Power" + }, + "heightm": 1, + "weightkg": 23.5, + "color": "Black", + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "aron": { + "num": 304, + "species": "Aron", + "types": [ + "Steel", + "Rock" + ], + "baseStats": { + "hp": 50, + "atk": 70, + "def": 100, + "spa": 40, + "spd": 40, + "spe": 30 + }, + "abilities": { + "0": "Sturdy", + "1": "Rock Head", + "H": "Heavy Metal" + }, + "heightm": 0.4, + "weightkg": 60, + "color": "Gray", + "evos": [ + "lairon" + ], + "eggGroups": [ + "Monster" + ] + }, + "lairon": { + "num": 305, + "species": "Lairon", + "types": [ + "Steel", + "Rock" + ], + "baseStats": { + "hp": 60, + "atk": 90, + "def": 140, + "spa": 50, + "spd": 50, + "spe": 40 + }, + "abilities": { + "0": "Sturdy", + "1": "Rock Head", + "H": "Heavy Metal" + }, + "heightm": 0.9, + "weightkg": 120, + "color": "Gray", + "prevo": "aron", + "evos": [ + "aggron" + ], + "evoLevel": 32, + "eggGroups": [ + "Monster" + ] + }, + "aggron": { + "num": 306, + "species": "Aggron", + "types": [ + "Steel", + "Rock" + ], + "baseStats": { + "hp": 70, + "atk": 110, + "def": 180, + "spa": 60, + "spd": 60, + "spe": 50 + }, + "abilities": { + "0": "Sturdy", + "1": "Rock Head", + "H": "Heavy Metal" + }, + "heightm": 2.1, + "weightkg": 360, + "color": "Gray", + "prevo": "lairon", + "evoLevel": 42, + "eggGroups": [ + "Monster" + ], + "otherFormes": [ + "aggronmega" + ] + }, + "aggronmega": { + "num": 306, + "species": "Aggron-Mega", + "baseSpecies": "Aggron", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Steel" + ], + "baseStats": { + "hp": 70, + "atk": 140, + "def": 230, + "spa": 60, + "spd": 80, + "spe": 50 + }, + "abilities": { + "0": "Filter" + }, + "heightm": 2.2, + "weightkg": 395, + "color": "Gray", + "eggGroups": [ + "Monster" + ] + }, + "meditite": { + "num": 307, + "species": "Meditite", + "types": [ + "Fighting", + "Psychic" + ], + "baseStats": { + "hp": 30, + "atk": 40, + "def": 55, + "spa": 40, + "spd": 55, + "spe": 60 + }, + "abilities": { + "0": "Pure Power", + "H": "Telepathy" + }, + "heightm": 0.6, + "weightkg": 11.2, + "color": "Blue", + "evos": [ + "medicham" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "medicham": { + "num": 308, + "species": "Medicham", + "types": [ + "Fighting", + "Psychic" + ], + "baseStats": { + "hp": 60, + "atk": 60, + "def": 75, + "spa": 60, + "spd": 75, + "spe": 80 + }, + "abilities": { + "0": "Pure Power", + "H": "Telepathy" + }, + "heightm": 1.3, + "weightkg": 31.5, + "color": "Red", + "prevo": "meditite", + "evoLevel": 37, + "eggGroups": [ + "Human-Like" + ], + "otherFormes": [ + "medichammega" + ] + }, + "medichammega": { + "num": 308, + "species": "Medicham-Mega", + "baseSpecies": "Medicham", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Fighting", + "Psychic" + ], + "baseStats": { + "hp": 60, + "atk": 100, + "def": 85, + "spa": 80, + "spd": 85, + "spe": 100 + }, + "abilities": { + "0": "Pure Power" + }, + "heightm": 1.3, + "weightkg": 31.5, + "color": "Red", + "eggGroups": [ + "Human-Like" + ] + }, + "electrike": { + "num": 309, + "species": "Electrike", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 40, + "atk": 45, + "def": 40, + "spa": 65, + "spd": 40, + "spe": 65 + }, + "abilities": { + "0": "Static", + "1": "Lightning Rod", + "H": "Minus" + }, + "heightm": 0.6, + "weightkg": 15.2, + "color": "Green", + "evos": [ + "manectric" + ], + "eggGroups": [ + "Field" + ] + }, + "manectric": { + "num": 310, + "species": "Manectric", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 70, + "atk": 75, + "def": 60, + "spa": 105, + "spd": 60, + "spe": 105 + }, + "abilities": { + "0": "Static", + "1": "Lightning Rod", + "H": "Minus" + }, + "heightm": 1.5, + "weightkg": 40.2, + "color": "Yellow", + "prevo": "electrike", + "evoLevel": 26, + "eggGroups": [ + "Field" + ], + "otherFormes": [ + "manectricmega" + ] + }, + "manectricmega": { + "num": 310, + "species": "Manectric-Mega", + "baseSpecies": "Manectric", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 70, + "atk": 75, + "def": 80, + "spa": 135, + "spd": 80, + "spe": 135 + }, + "abilities": { + "0": "Intimidate" + }, + "heightm": 1.8, + "weightkg": 44, + "color": "Yellow", + "eggGroups": [ + "Field" + ] + }, + "plusle": { + "num": 311, + "species": "Plusle", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 60, + "atk": 50, + "def": 40, + "spa": 85, + "spd": 75, + "spe": 95 + }, + "abilities": { + "0": "Plus", + "H": "Lightning Rod" + }, + "heightm": 0.4, + "weightkg": 4.2, + "color": "Yellow", + "eggGroups": [ + "Fairy" + ] + }, + "minun": { + "num": 312, + "species": "Minun", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 60, + "atk": 40, + "def": 50, + "spa": 75, + "spd": 85, + "spe": 95 + }, + "abilities": { + "0": "Minus", + "H": "Volt Absorb" + }, + "heightm": 0.4, + "weightkg": 4.2, + "color": "Yellow", + "eggGroups": [ + "Fairy" + ] + }, + "volbeat": { + "num": 313, + "species": "Volbeat", + "types": [ + "Bug" + ], + "gender": "M", + "baseStats": { + "hp": 65, + "atk": 73, + "def": 55, + "spa": 47, + "spd": 75, + "spe": 85 + }, + "abilities": { + "0": "Illuminate", + "1": "Swarm", + "H": "Prankster" + }, + "heightm": 0.7, + "weightkg": 17.7, + "color": "Gray", + "eggGroups": [ + "Bug", + "Human-Like" + ] + }, + "illumise": { + "num": 314, + "species": "Illumise", + "types": [ + "Bug" + ], + "gender": "F", + "baseStats": { + "hp": 65, + "atk": 47, + "def": 55, + "spa": 73, + "spd": 75, + "spe": 85 + }, + "abilities": { + "0": "Oblivious", + "1": "Tinted Lens", + "H": "Prankster" + }, + "heightm": 0.6, + "weightkg": 17.7, + "color": "Purple", + "eggGroups": [ + "Bug", + "Human-Like" + ] + }, + "roselia": { + "num": 315, + "species": "Roselia", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 50, + "atk": 60, + "def": 45, + "spa": 100, + "spd": 80, + "spe": 65 + }, + "abilities": { + "0": "Natural Cure", + "1": "Poison Point", + "H": "Leaf Guard" + }, + "heightm": 0.3, + "weightkg": 2, + "color": "Green", + "prevo": "budew", + "evos": [ + "roserade" + ], + "evoLevel": 1, + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "gulpin": { + "num": 316, + "species": "Gulpin", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 70, + "atk": 43, + "def": 53, + "spa": 43, + "spd": 53, + "spe": 40 + }, + "abilities": { + "0": "Liquid Ooze", + "1": "Sticky Hold", + "H": "Gluttony" + }, + "heightm": 0.4, + "weightkg": 10.3, + "color": "Green", + "evos": [ + "swalot" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "swalot": { + "num": 317, + "species": "Swalot", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 100, + "atk": 73, + "def": 83, + "spa": 73, + "spd": 83, + "spe": 55 + }, + "abilities": { + "0": "Liquid Ooze", + "1": "Sticky Hold", + "H": "Gluttony" + }, + "heightm": 1.7, + "weightkg": 80, + "color": "Purple", + "prevo": "gulpin", + "evoLevel": 26, + "eggGroups": [ + "Amorphous" + ] + }, + "carvanha": { + "num": 318, + "species": "Carvanha", + "types": [ + "Water", + "Dark" + ], + "baseStats": { + "hp": 45, + "atk": 90, + "def": 20, + "spa": 65, + "spd": 20, + "spe": 65 + }, + "abilities": { + "0": "Rough Skin", + "H": "Speed Boost" + }, + "heightm": 0.8, + "weightkg": 20.8, + "color": "Red", + "evos": [ + "sharpedo" + ], + "eggGroups": [ + "Water 2" + ] + }, + "sharpedo": { + "num": 319, + "species": "Sharpedo", + "types": [ + "Water", + "Dark" + ], + "baseStats": { + "hp": 70, + "atk": 120, + "def": 40, + "spa": 95, + "spd": 40, + "spe": 95 + }, + "abilities": { + "0": "Rough Skin", + "H": "Speed Boost" + }, + "heightm": 1.8, + "weightkg": 88.8, + "color": "Blue", + "prevo": "carvanha", + "evoLevel": 30, + "eggGroups": [ + "Water 2" + ], + "otherFormes": [ + "sharpedomega" + ] + }, + "sharpedomega": { + "num": 319, + "species": "Sharpedo-Mega", + "baseSpecies": "Sharpedo", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Water", + "Dark" + ], + "baseStats": { + "hp": 70, + "atk": 140, + "def": 70, + "spa": 110, + "spd": 65, + "spe": 105 + }, + "abilities": { + "0": "Strong Jaw" + }, + "heightm": 2.5, + "weightkg": 130.3, + "color": "Blue", + "eggGroups": [ + "Water 2" + ] + }, + "wailmer": { + "num": 320, + "species": "Wailmer", + "types": [ + "Water" + ], + "baseStats": { + "hp": 130, + "atk": 70, + "def": 35, + "spa": 70, + "spd": 35, + "spe": 60 + }, + "abilities": { + "0": "Water Veil", + "1": "Oblivious", + "H": "Pressure" + }, + "heightm": 2, + "weightkg": 130, + "color": "Blue", + "evos": [ + "wailord" + ], + "eggGroups": [ + "Field", + "Water 2" + ] + }, + "wailord": { + "num": 321, + "species": "Wailord", + "types": [ + "Water" + ], + "baseStats": { + "hp": 170, + "atk": 90, + "def": 45, + "spa": 90, + "spd": 45, + "spe": 60 + }, + "abilities": { + "0": "Water Veil", + "1": "Oblivious", + "H": "Pressure" + }, + "heightm": 14.5, + "weightkg": 398, + "color": "Blue", + "prevo": "wailmer", + "evoLevel": 40, + "eggGroups": [ + "Field", + "Water 2" + ] + }, + "numel": { + "num": 322, + "species": "Numel", + "types": [ + "Fire", + "Ground" + ], + "baseStats": { + "hp": 60, + "atk": 60, + "def": 40, + "spa": 65, + "spd": 45, + "spe": 35 + }, + "abilities": { + "0": "Oblivious", + "1": "Simple", + "H": "Own Tempo" + }, + "heightm": 0.7, + "weightkg": 24, + "color": "Yellow", + "evos": [ + "camerupt" + ], + "eggGroups": [ + "Field" + ] + }, + "camerupt": { + "num": 323, + "species": "Camerupt", + "types": [ + "Fire", + "Ground" + ], + "baseStats": { + "hp": 70, + "atk": 100, + "def": 70, + "spa": 105, + "spd": 75, + "spe": 40 + }, + "abilities": { + "0": "Magma Armor", + "1": "Solid Rock", + "H": "Anger Point" + }, + "heightm": 1.9, + "weightkg": 220, + "color": "Red", + "prevo": "numel", + "evoLevel": 33, + "eggGroups": [ + "Field" + ], + "otherFormes": [ + "cameruptmega" + ] + }, + "cameruptmega": { + "num": 323, + "species": "Camerupt-Mega", + "baseSpecies": "Camerupt", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Fire", + "Ground" + ], + "baseStats": { + "hp": 70, + "atk": 120, + "def": 100, + "spa": 145, + "spd": 105, + "spe": 20 + }, + "abilities": { + "0": "Sheer Force" + }, + "heightm": 2.5, + "weightkg": 320.5, + "color": "Red", + "eggGroups": [ + "Field" + ] + }, + "torkoal": { + "num": 324, + "species": "Torkoal", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 70, + "atk": 85, + "def": 140, + "spa": 85, + "spd": 70, + "spe": 20 + }, + "abilities": { + "0": "White Smoke", + "H": "Shell Armor" + }, + "heightm": 0.5, + "weightkg": 80.4, + "color": "Brown", + "eggGroups": [ + "Field" + ] + }, + "spoink": { + "num": 325, + "species": "Spoink", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 60, + "atk": 25, + "def": 35, + "spa": 70, + "spd": 80, + "spe": 60 + }, + "abilities": { + "0": "Thick Fat", + "1": "Own Tempo", + "H": "Gluttony" + }, + "heightm": 0.7, + "weightkg": 30.6, + "color": "Black", + "evos": [ + "grumpig" + ], + "eggGroups": [ + "Field" + ] + }, + "grumpig": { + "num": 326, + "species": "Grumpig", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 80, + "atk": 45, + "def": 65, + "spa": 90, + "spd": 110, + "spe": 80 + }, + "abilities": { + "0": "Thick Fat", + "1": "Own Tempo", + "H": "Gluttony" + }, + "heightm": 0.9, + "weightkg": 71.5, + "color": "Purple", + "prevo": "spoink", + "evoLevel": 32, + "eggGroups": [ + "Field" + ] + }, + "spinda": { + "num": 327, + "species": "Spinda", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 60, + "atk": 60, + "def": 60, + "spa": 60, + "spd": 60, + "spe": 60 + }, + "abilities": { + "0": "Own Tempo", + "1": "Tangled Feet", + "H": "Contrary" + }, + "heightm": 1.1, + "weightkg": 5, + "color": "Brown", + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "trapinch": { + "num": 328, + "species": "Trapinch", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 45, + "atk": 100, + "def": 45, + "spa": 45, + "spd": 45, + "spe": 10 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Arena Trap", + "H": "Sheer Force" + }, + "heightm": 0.7, + "weightkg": 15, + "color": "Brown", + "evos": [ + "vibrava" + ], + "eggGroups": [ + "Bug" + ] + }, + "vibrava": { + "num": 329, + "species": "Vibrava", + "types": [ + "Ground", + "Dragon" + ], + "baseStats": { + "hp": 50, + "atk": 70, + "def": 50, + "spa": 50, + "spd": 50, + "spe": 70 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.1, + "weightkg": 15.3, + "color": "Green", + "prevo": "trapinch", + "evos": [ + "flygon" + ], + "evoLevel": 35, + "eggGroups": [ + "Bug" + ] + }, + "flygon": { + "num": 330, + "species": "Flygon", + "types": [ + "Ground", + "Dragon" + ], + "baseStats": { + "hp": 80, + "atk": 100, + "def": 80, + "spa": 80, + "spd": 80, + "spe": 100 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 2, + "weightkg": 82, + "color": "Green", + "prevo": "vibrava", + "evoLevel": 45, + "eggGroups": [ + "Bug" + ] + }, + "cacnea": { + "num": 331, + "species": "Cacnea", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 50, + "atk": 85, + "def": 40, + "spa": 85, + "spd": 40, + "spe": 35 + }, + "abilities": { + "0": "Sand Veil", + "H": "Water Absorb" + }, + "heightm": 0.4, + "weightkg": 51.3, + "color": "Green", + "evos": [ + "cacturne" + ], + "eggGroups": [ + "Grass", + "Human-Like" + ] + }, + "cacturne": { + "num": 332, + "species": "Cacturne", + "types": [ + "Grass", + "Dark" + ], + "baseStats": { + "hp": 70, + "atk": 115, + "def": 60, + "spa": 115, + "spd": 60, + "spe": 55 + }, + "abilities": { + "0": "Sand Veil", + "H": "Water Absorb" + }, + "heightm": 1.3, + "weightkg": 77.4, + "color": "Green", + "prevo": "cacnea", + "evoLevel": 32, + "eggGroups": [ + "Grass", + "Human-Like" + ] + }, + "swablu": { + "num": 333, + "species": "Swablu", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 45, + "atk": 40, + "def": 60, + "spa": 40, + "spd": 75, + "spe": 50 + }, + "abilities": { + "0": "Natural Cure", + "H": "Cloud Nine" + }, + "heightm": 0.4, + "weightkg": 1.2, + "color": "Blue", + "evos": [ + "altaria" + ], + "eggGroups": [ + "Flying", + "Dragon" + ] + }, + "altaria": { + "num": 334, + "species": "Altaria", + "types": [ + "Dragon", + "Flying" + ], + "baseStats": { + "hp": 75, + "atk": 70, + "def": 90, + "spa": 70, + "spd": 105, + "spe": 80 + }, + "abilities": { + "0": "Natural Cure", + "H": "Cloud Nine" + }, + "heightm": 1.1, + "weightkg": 20.6, + "color": "Blue", + "prevo": "swablu", + "evoLevel": 35, + "eggGroups": [ + "Flying", + "Dragon" + ], + "otherFormes": [ + "altariamega" + ] + }, + "altariamega": { + "num": 334, + "species": "Altaria-Mega", + "baseSpecies": "Altaria", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dragon", + "Fairy" + ], + "baseStats": { + "hp": 75, + "atk": 110, + "def": 110, + "spa": 110, + "spd": 105, + "spe": 80 + }, + "abilities": { + "0": "Pixilate" + }, + "heightm": 1.5, + "weightkg": 20.6, + "color": "Blue", + "eggGroups": [ + "Flying", + "Dragon" + ] + }, + "zangoose": { + "num": 335, + "species": "Zangoose", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 73, + "atk": 115, + "def": 60, + "spa": 60, + "spd": 60, + "spe": 90 + }, + "abilities": { + "0": "Immunity", + "H": "Toxic Boost" + }, + "heightm": 1.3, + "weightkg": 40.3, + "color": "White", + "eggGroups": [ + "Field" + ] + }, + "seviper": { + "num": 336, + "species": "Seviper", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 73, + "atk": 100, + "def": 60, + "spa": 100, + "spd": 60, + "spe": 65 + }, + "abilities": { + "0": "Shed Skin", + "H": "Infiltrator" + }, + "heightm": 2.7, + "weightkg": 52.5, + "color": "Black", + "eggGroups": [ + "Field", + "Dragon" + ] + }, + "lunatone": { + "num": 337, + "species": "Lunatone", + "types": [ + "Rock", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 70, + "atk": 55, + "def": 65, + "spa": 95, + "spd": 85, + "spe": 70 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1, + "weightkg": 168, + "color": "Yellow", + "eggGroups": [ + "Mineral" + ] + }, + "solrock": { + "num": 338, + "species": "Solrock", + "types": [ + "Rock", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 70, + "atk": 95, + "def": 85, + "spa": 55, + "spd": 65, + "spe": 70 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.2, + "weightkg": 154, + "color": "Red", + "eggGroups": [ + "Mineral" + ] + }, + "barboach": { + "num": 339, + "species": "Barboach", + "types": [ + "Water", + "Ground" + ], + "baseStats": { + "hp": 50, + "atk": 48, + "def": 43, + "spa": 46, + "spd": 41, + "spe": 60 + }, + "abilities": { + "0": "Oblivious", + "1": "Anticipation", + "H": "Hydration" + }, + "heightm": 0.4, + "weightkg": 1.9, + "color": "Gray", + "evos": [ + "whiscash" + ], + "eggGroups": [ + "Water 2" + ] + }, + "whiscash": { + "num": 340, + "species": "Whiscash", + "types": [ + "Water", + "Ground" + ], + "baseStats": { + "hp": 110, + "atk": 78, + "def": 73, + "spa": 76, + "spd": 71, + "spe": 60 + }, + "abilities": { + "0": "Oblivious", + "1": "Anticipation", + "H": "Hydration" + }, + "heightm": 0.9, + "weightkg": 23.6, + "color": "Blue", + "prevo": "barboach", + "evoLevel": 30, + "eggGroups": [ + "Water 2" + ] + }, + "corphish": { + "num": 341, + "species": "Corphish", + "types": [ + "Water" + ], + "baseStats": { + "hp": 43, + "atk": 80, + "def": 65, + "spa": 50, + "spd": 35, + "spe": 35 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Shell Armor", + "H": "Adaptability" + }, + "heightm": 0.6, + "weightkg": 11.5, + "color": "Red", + "evos": [ + "crawdaunt" + ], + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "crawdaunt": { + "num": 342, + "species": "Crawdaunt", + "types": [ + "Water", + "Dark" + ], + "baseStats": { + "hp": 63, + "atk": 120, + "def": 85, + "spa": 90, + "spd": 55, + "spe": 55 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Shell Armor", + "H": "Adaptability" + }, + "heightm": 1.1, + "weightkg": 32.8, + "color": "Red", + "prevo": "corphish", + "evoLevel": 30, + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "baltoy": { + "num": 343, + "species": "Baltoy", + "types": [ + "Ground", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 40, + "atk": 40, + "def": 55, + "spa": 40, + "spd": 70, + "spe": 55 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.5, + "weightkg": 21.5, + "color": "Brown", + "evos": [ + "claydol" + ], + "eggGroups": [ + "Mineral" + ] + }, + "claydol": { + "num": 344, + "species": "Claydol", + "types": [ + "Ground", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 60, + "atk": 70, + "def": 105, + "spa": 70, + "spd": 120, + "spe": 75 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.5, + "weightkg": 108, + "color": "Black", + "prevo": "baltoy", + "evoLevel": 36, + "eggGroups": [ + "Mineral" + ] + }, + "lileep": { + "num": 345, + "species": "Lileep", + "types": [ + "Rock", + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 66, + "atk": 41, + "def": 77, + "spa": 61, + "spd": 87, + "spe": 23 + }, + "abilities": { + "0": "Suction Cups", + "H": "Storm Drain" + }, + "heightm": 1, + "weightkg": 23.8, + "color": "Purple", + "evos": [ + "cradily" + ], + "eggGroups": [ + "Water 3" + ] + }, + "cradily": { + "num": 346, + "species": "Cradily", + "types": [ + "Rock", + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 86, + "atk": 81, + "def": 97, + "spa": 81, + "spd": 107, + "spe": 43 + }, + "abilities": { + "0": "Suction Cups", + "H": "Storm Drain" + }, + "heightm": 1.5, + "weightkg": 60.4, + "color": "Green", + "prevo": "lileep", + "evoLevel": 40, + "eggGroups": [ + "Water 3" + ] + }, + "anorith": { + "num": 347, + "species": "Anorith", + "types": [ + "Rock", + "Bug" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 45, + "atk": 95, + "def": 50, + "spa": 40, + "spd": 50, + "spe": 75 + }, + "abilities": { + "0": "Battle Armor", + "H": "Swift Swim" + }, + "heightm": 0.7, + "weightkg": 12.5, + "color": "Gray", + "evos": [ + "armaldo" + ], + "eggGroups": [ + "Water 3" + ] + }, + "armaldo": { + "num": 348, + "species": "Armaldo", + "types": [ + "Rock", + "Bug" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 125, + "def": 100, + "spa": 70, + "spd": 80, + "spe": 45 + }, + "abilities": { + "0": "Battle Armor", + "H": "Swift Swim" + }, + "heightm": 1.5, + "weightkg": 68.2, + "color": "Gray", + "prevo": "anorith", + "evoLevel": 40, + "eggGroups": [ + "Water 3" + ] + }, + "feebas": { + "num": 349, + "species": "Feebas", + "types": [ + "Water" + ], + "baseStats": { + "hp": 20, + "atk": 15, + "def": 20, + "spa": 10, + "spd": 55, + "spe": 80 + }, + "abilities": { + "0": "Swift Swim", + "1": "Oblivious", + "H": "Adaptability" + }, + "heightm": 0.6, + "weightkg": 7.4, + "color": "Brown", + "evos": [ + "milotic" + ], + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "milotic": { + "num": 350, + "species": "Milotic", + "types": [ + "Water" + ], + "baseStats": { + "hp": 95, + "atk": 60, + "def": 79, + "spa": 100, + "spd": 125, + "spe": 81 + }, + "abilities": { + "0": "Marvel Scale", + "1": "Competitive", + "H": "Cute Charm" + }, + "heightm": 6.2, + "weightkg": 162, + "color": "Pink", + "prevo": "feebas", + "evoLevel": 1, + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "castform": { + "num": 351, + "species": "Castform", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 70, + "atk": 70, + "def": 70, + "spa": 70, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Forecast" + }, + "heightm": 0.3, + "weightkg": 0.8, + "color": "White", + "eggGroups": [ + "Fairy", + "Amorphous" + ], + "otherFormes": [ + "castformsunny", + "castformrainy", + "castformsnowy" + ] + }, + "castformsunny": { + "num": 351, + "species": "Castform-Sunny", + "baseSpecies": "Castform", + "forme": "Sunny", + "formeLetter": "S", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 70, + "atk": 70, + "def": 70, + "spa": 70, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Forecast" + }, + "heightm": 0.3, + "weightkg": 0.8, + "color": "White", + "eggGroups": [ + "Fairy", + "Amorphous" + ] + }, + "castformrainy": { + "num": 351, + "species": "Castform-Rainy", + "baseSpecies": "Castform", + "forme": "Rainy", + "formeLetter": "R", + "types": [ + "Water" + ], + "baseStats": { + "hp": 70, + "atk": 70, + "def": 70, + "spa": 70, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Forecast" + }, + "heightm": 0.3, + "weightkg": 0.8, + "color": "White", + "eggGroups": [ + "Fairy", + "Amorphous" + ] + }, + "castformsnowy": { + "num": 351, + "species": "Castform-Snowy", + "baseSpecies": "Castform", + "forme": "Snowy", + "formeLetter": "S", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 70, + "atk": 70, + "def": 70, + "spa": 70, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Forecast" + }, + "heightm": 0.3, + "weightkg": 0.8, + "color": "White", + "eggGroups": [ + "Fairy", + "Amorphous" + ] + }, + "kecleon": { + "num": 352, + "species": "Kecleon", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 60, + "atk": 90, + "def": 70, + "spa": 60, + "spd": 120, + "spe": 40 + }, + "abilities": { + "0": "Color Change", + "H": "Protean" + }, + "heightm": 1, + "weightkg": 22, + "color": "Green", + "eggGroups": [ + "Field" + ] + }, + "shuppet": { + "num": 353, + "species": "Shuppet", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 44, + "atk": 75, + "def": 35, + "spa": 63, + "spd": 33, + "spe": 45 + }, + "abilities": { + "0": "Insomnia", + "1": "Frisk", + "H": "Cursed Body" + }, + "heightm": 0.6, + "weightkg": 2.3, + "color": "Black", + "evos": [ + "banette" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "banette": { + "num": 354, + "species": "Banette", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 64, + "atk": 115, + "def": 65, + "spa": 83, + "spd": 63, + "spe": 65 + }, + "abilities": { + "0": "Insomnia", + "1": "Frisk", + "H": "Cursed Body" + }, + "heightm": 1.1, + "weightkg": 12.5, + "color": "Black", + "prevo": "shuppet", + "evoLevel": 37, + "eggGroups": [ + "Amorphous" + ], + "otherFormes": [ + "banettemega" + ] + }, + "banettemega": { + "num": 354, + "species": "Banette-Mega", + "baseSpecies": "Banette", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 64, + "atk": 165, + "def": 75, + "spa": 93, + "spd": 83, + "spe": 75 + }, + "abilities": { + "0": "Prankster" + }, + "heightm": 1.2, + "weightkg": 13, + "color": "Black", + "eggGroups": [ + "Amorphous" + ] + }, + "duskull": { + "num": 355, + "species": "Duskull", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 20, + "atk": 40, + "def": 90, + "spa": 30, + "spd": 90, + "spe": 25 + }, + "abilities": { + "0": "Levitate", + "H": "Frisk" + }, + "heightm": 0.8, + "weightkg": 15, + "color": "Black", + "evos": [ + "dusclops" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "dusclops": { + "num": 356, + "species": "Dusclops", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 40, + "atk": 70, + "def": 130, + "spa": 60, + "spd": 130, + "spe": 25 + }, + "abilities": { + "0": "Pressure", + "H": "Frisk" + }, + "heightm": 1.6, + "weightkg": 30.6, + "color": "Black", + "prevo": "duskull", + "evos": [ + "dusknoir" + ], + "evoLevel": 37, + "eggGroups": [ + "Amorphous" + ] + }, + "tropius": { + "num": 357, + "species": "Tropius", + "types": [ + "Grass", + "Flying" + ], + "baseStats": { + "hp": 99, + "atk": 68, + "def": 83, + "spa": 72, + "spd": 87, + "spe": 51 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Solar Power", + "H": "Harvest" + }, + "heightm": 2, + "weightkg": 100, + "color": "Green", + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "chimecho": { + "num": 358, + "species": "Chimecho", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 65, + "atk": 50, + "def": 70, + "spa": 95, + "spd": 80, + "spe": 65 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.6, + "weightkg": 1, + "color": "Blue", + "prevo": "chingling", + "evoLevel": 1, + "eggGroups": [ + "Amorphous" + ] + }, + "absol": { + "num": 359, + "species": "Absol", + "types": [ + "Dark" + ], + "baseStats": { + "hp": 65, + "atk": 130, + "def": 60, + "spa": 75, + "spd": 60, + "spe": 75 + }, + "abilities": { + "0": "Pressure", + "1": "Super Luck", + "H": "Justified" + }, + "heightm": 1.2, + "weightkg": 47, + "color": "White", + "eggGroups": [ + "Field" + ], + "otherFormes": [ + "absolmega" + ] + }, + "absolmega": { + "num": 359, + "species": "Absol-Mega", + "baseSpecies": "Absol", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dark" + ], + "baseStats": { + "hp": 65, + "atk": 150, + "def": 60, + "spa": 115, + "spd": 60, + "spe": 115 + }, + "abilities": { + "0": "Magic Bounce" + }, + "heightm": 1.2, + "weightkg": 49, + "color": "White", + "eggGroups": [ + "Field" + ] + }, + "wynaut": { + "num": 360, + "species": "Wynaut", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 95, + "atk": 23, + "def": 48, + "spa": 23, + "spd": 48, + "spe": 23 + }, + "abilities": { + "0": "Shadow Tag", + "H": "Telepathy" + }, + "heightm": 0.6, + "weightkg": 14, + "color": "Blue", + "evos": [ + "wobbuffet" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "snorunt": { + "num": 361, + "species": "Snorunt", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 50, + "atk": 50, + "def": 50, + "spa": 50, + "spd": 50, + "spe": 50 + }, + "abilities": { + "0": "Inner Focus", + "1": "Ice Body", + "H": "Moody" + }, + "heightm": 0.7, + "weightkg": 16.8, + "color": "Gray", + "evos": [ + "glalie", + "froslass" + ], + "eggGroups": [ + "Fairy", + "Mineral" + ] + }, + "glalie": { + "num": 362, + "species": "Glalie", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 80, + "atk": 80, + "def": 80, + "spa": 80, + "spd": 80, + "spe": 80 + }, + "abilities": { + "0": "Inner Focus", + "1": "Ice Body", + "H": "Moody" + }, + "heightm": 1.5, + "weightkg": 256.5, + "color": "Gray", + "prevo": "snorunt", + "evoLevel": 42, + "eggGroups": [ + "Fairy", + "Mineral" + ], + "otherFormes": [ + "glaliemega" + ] + }, + "glaliemega": { + "num": 362, + "species": "Glalie-Mega", + "baseSpecies": "Glalie", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 80, + "atk": 120, + "def": 80, + "spa": 120, + "spd": 80, + "spe": 100 + }, + "abilities": { + "0": "Refrigerate" + }, + "heightm": 2.1, + "weightkg": 350.2, + "color": "Gray", + "eggGroups": [ + "Fairy", + "Mineral" + ] + }, + "spheal": { + "num": 363, + "species": "Spheal", + "types": [ + "Ice", + "Water" + ], + "baseStats": { + "hp": 70, + "atk": 40, + "def": 50, + "spa": 55, + "spd": 50, + "spe": 25 + }, + "abilities": { + "0": "Thick Fat", + "1": "Ice Body", + "H": "Oblivious" + }, + "heightm": 0.8, + "weightkg": 39.5, + "color": "Blue", + "evos": [ + "sealeo" + ], + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "sealeo": { + "num": 364, + "species": "Sealeo", + "types": [ + "Ice", + "Water" + ], + "baseStats": { + "hp": 90, + "atk": 60, + "def": 70, + "spa": 75, + "spd": 70, + "spe": 45 + }, + "abilities": { + "0": "Thick Fat", + "1": "Ice Body", + "H": "Oblivious" + }, + "heightm": 1.1, + "weightkg": 87.6, + "color": "Blue", + "prevo": "spheal", + "evos": [ + "walrein" + ], + "evoLevel": 32, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "walrein": { + "num": 365, + "species": "Walrein", + "types": [ + "Ice", + "Water" + ], + "baseStats": { + "hp": 110, + "atk": 80, + "def": 90, + "spa": 95, + "spd": 90, + "spe": 65 + }, + "abilities": { + "0": "Thick Fat", + "1": "Ice Body", + "H": "Oblivious" + }, + "heightm": 1.4, + "weightkg": 150.6, + "color": "Blue", + "prevo": "sealeo", + "evoLevel": 44, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "clamperl": { + "num": 366, + "species": "Clamperl", + "types": [ + "Water" + ], + "baseStats": { + "hp": 35, + "atk": 64, + "def": 85, + "spa": 74, + "spd": 55, + "spe": 32 + }, + "abilities": { + "0": "Shell Armor", + "H": "Rattled" + }, + "heightm": 0.4, + "weightkg": 52.5, + "color": "Blue", + "evos": [ + "huntail", + "gorebyss" + ], + "eggGroups": [ + "Water 1" + ] + }, + "huntail": { + "num": 367, + "species": "Huntail", + "types": [ + "Water" + ], + "baseStats": { + "hp": 55, + "atk": 104, + "def": 105, + "spa": 94, + "spd": 75, + "spe": 52 + }, + "abilities": { + "0": "Swift Swim", + "H": "Water Veil" + }, + "heightm": 1.7, + "weightkg": 27, + "color": "Blue", + "prevo": "clamperl", + "evoLevel": 1, + "eggGroups": [ + "Water 1" + ] + }, + "gorebyss": { + "num": 368, + "species": "Gorebyss", + "types": [ + "Water" + ], + "baseStats": { + "hp": 55, + "atk": 84, + "def": 105, + "spa": 114, + "spd": 75, + "spe": 52 + }, + "abilities": { + "0": "Swift Swim", + "H": "Hydration" + }, + "heightm": 1.8, + "weightkg": 22.6, + "color": "Pink", + "prevo": "clamperl", + "evoLevel": 1, + "eggGroups": [ + "Water 1" + ] + }, + "relicanth": { + "num": 369, + "species": "Relicanth", + "types": [ + "Water", + "Rock" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 100, + "atk": 90, + "def": 130, + "spa": 45, + "spd": 65, + "spe": 55 + }, + "abilities": { + "0": "Swift Swim", + "1": "Rock Head", + "H": "Sturdy" + }, + "heightm": 1, + "weightkg": 23.4, + "color": "Gray", + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "luvdisc": { + "num": 370, + "species": "Luvdisc", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 43, + "atk": 30, + "def": 55, + "spa": 40, + "spd": 65, + "spe": 97 + }, + "abilities": { + "0": "Swift Swim", + "H": "Hydration" + }, + "heightm": 0.6, + "weightkg": 8.7, + "color": "Pink", + "eggGroups": [ + "Water 2" + ] + }, + "bagon": { + "num": 371, + "species": "Bagon", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 45, + "atk": 75, + "def": 60, + "spa": 40, + "spd": 30, + "spe": 50 + }, + "abilities": { + "0": "Rock Head", + "H": "Sheer Force" + }, + "heightm": 0.6, + "weightkg": 42.1, + "color": "Blue", + "evos": [ + "shelgon" + ], + "eggGroups": [ + "Dragon" + ] + }, + "shelgon": { + "num": 372, + "species": "Shelgon", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 65, + "atk": 95, + "def": 100, + "spa": 60, + "spd": 50, + "spe": 50 + }, + "abilities": { + "0": "Rock Head", + "H": "Overcoat" + }, + "heightm": 1.1, + "weightkg": 110.5, + "color": "White", + "prevo": "bagon", + "evos": [ + "salamence" + ], + "evoLevel": 30, + "eggGroups": [ + "Dragon" + ] + }, + "salamence": { + "num": 373, + "species": "Salamence", + "types": [ + "Dragon", + "Flying" + ], + "baseStats": { + "hp": 95, + "atk": 135, + "def": 80, + "spa": 110, + "spd": 80, + "spe": 100 + }, + "abilities": { + "0": "Intimidate", + "H": "Moxie" + }, + "heightm": 1.5, + "weightkg": 102.6, + "color": "Blue", + "prevo": "shelgon", + "evoLevel": 50, + "eggGroups": [ + "Dragon" + ], + "otherFormes": [ + "salamencemega" + ] + }, + "salamencemega": { + "num": 373, + "species": "Salamence-Mega", + "baseSpecies": "Salamence", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dragon", + "Flying" + ], + "baseStats": { + "hp": 95, + "atk": 145, + "def": 130, + "spa": 120, + "spd": 90, + "spe": 120 + }, + "abilities": { + "0": "Aerilate" + }, + "heightm": 1.8, + "weightkg": 112.6, + "color": "Blue", + "eggGroups": [ + "Dragon" + ] + }, + "beldum": { + "num": 374, + "species": "Beldum", + "types": [ + "Steel", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 40, + "atk": 55, + "def": 80, + "spa": 35, + "spd": 60, + "spe": 30 + }, + "abilities": { + "0": "Clear Body", + "H": "Light Metal" + }, + "heightm": 0.6, + "weightkg": 95.2, + "color": "Blue", + "evos": [ + "metang" + ], + "eggGroups": [ + "Mineral" + ] + }, + "metang": { + "num": 375, + "species": "Metang", + "types": [ + "Steel", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 60, + "atk": 75, + "def": 100, + "spa": 55, + "spd": 80, + "spe": 50 + }, + "abilities": { + "0": "Clear Body", + "H": "Light Metal" + }, + "heightm": 1.2, + "weightkg": 202.5, + "color": "Blue", + "prevo": "beldum", + "evos": [ + "metagross" + ], + "evoLevel": 20, + "eggGroups": [ + "Mineral" + ] + }, + "metagross": { + "num": 376, + "species": "Metagross", + "types": [ + "Steel", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 135, + "def": 130, + "spa": 95, + "spd": 90, + "spe": 70 + }, + "abilities": { + "0": "Clear Body", + "H": "Light Metal" + }, + "heightm": 1.6, + "weightkg": 550, + "color": "Blue", + "prevo": "metang", + "evoLevel": 45, + "eggGroups": [ + "Mineral" + ], + "otherFormes": [ + "metagrossmega" + ] + }, + "metagrossmega": { + "num": 376, + "species": "Metagross-Mega", + "baseSpecies": "Metagross", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Steel", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 145, + "def": 150, + "spa": 105, + "spd": 110, + "spe": 110 + }, + "abilities": { + "0": "Tough Claws" + }, + "heightm": 2.5, + "weightkg": 942.9, + "color": "Blue", + "eggGroups": [ + "Mineral" + ] + }, + "regirock": { + "num": 377, + "species": "Regirock", + "types": [ + "Rock" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 100, + "def": 200, + "spa": 50, + "spd": 100, + "spe": 50 + }, + "abilities": { + "0": "Clear Body", + "H": "Sturdy" + }, + "heightm": 1.7, + "weightkg": 230, + "color": "Brown", + "eggGroups": [ + "Undiscovered" + ] + }, + "regice": { + "num": 378, + "species": "Regice", + "types": [ + "Ice" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 50, + "def": 100, + "spa": 100, + "spd": 200, + "spe": 50 + }, + "abilities": { + "0": "Clear Body", + "H": "Ice Body" + }, + "heightm": 1.8, + "weightkg": 175, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "registeel": { + "num": 379, + "species": "Registeel", + "types": [ + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 75, + "def": 150, + "spa": 75, + "spd": 150, + "spe": 50 + }, + "abilities": { + "0": "Clear Body", + "H": "Light Metal" + }, + "heightm": 1.9, + "weightkg": 205, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "latias": { + "num": 380, + "species": "Latias", + "types": [ + "Dragon", + "Psychic" + ], + "gender": "F", + "baseStats": { + "hp": 80, + "atk": 80, + "def": 90, + "spa": 110, + "spd": 130, + "spe": 110 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.4, + "weightkg": 40, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "latiasmega" + ] + }, + "latiasmega": { + "num": 380, + "species": "Latias-Mega", + "baseSpecies": "Latias", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dragon", + "Psychic" + ], + "gender": "F", + "baseStats": { + "hp": 80, + "atk": 100, + "def": 120, + "spa": 140, + "spd": 150, + "spe": 110 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.8, + "weightkg": 52, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ] + }, + "latios": { + "num": 381, + "species": "Latios", + "types": [ + "Dragon", + "Psychic" + ], + "gender": "M", + "baseStats": { + "hp": 80, + "atk": 90, + "def": 80, + "spa": 130, + "spd": 110, + "spe": 110 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 2, + "weightkg": 60, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "latiosmega" + ] + }, + "latiosmega": { + "num": 381, + "species": "Latios-Mega", + "baseSpecies": "Latios", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dragon", + "Psychic" + ], + "gender": "M", + "baseStats": { + "hp": 80, + "atk": 130, + "def": 100, + "spa": 160, + "spd": 120, + "spe": 110 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 2.3, + "weightkg": 70, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "kyogre": { + "num": 382, + "species": "Kyogre", + "types": [ + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 100, + "def": 90, + "spa": 150, + "spd": 140, + "spe": 90 + }, + "abilities": { + "0": "Drizzle" + }, + "heightm": 4.5, + "weightkg": 352, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "kyogreprimal" + ] + }, + "kyogreprimal": { + "num": 382, + "species": "Kyogre-Primal", + "baseSpecies": "Kyogre", + "forme": "Primal", + "formeLetter": "P", + "types": [ + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 150, + "def": 90, + "spa": 180, + "spd": 160, + "spe": 90 + }, + "abilities": { + "0": "Primordial Sea" + }, + "heightm": 9.8, + "weightkg": 430, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "groudon": { + "num": 383, + "species": "Groudon", + "types": [ + "Ground" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 150, + "def": 140, + "spa": 100, + "spd": 90, + "spe": 90 + }, + "abilities": { + "0": "Drought" + }, + "heightm": 3.5, + "weightkg": 950, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "groudonprimal" + ] + }, + "groudonprimal": { + "num": 383, + "species": "Groudon-Primal", + "baseSpecies": "Groudon", + "forme": "Primal", + "formeLetter": "P", + "types": [ + "Ground", + "Fire" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 180, + "def": 160, + "spa": 150, + "spd": 90, + "spe": 90 + }, + "abilities": { + "0": "Desolate Land" + }, + "heightm": 5, + "weightkg": 999.7, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ] + }, + "rayquaza": { + "num": 384, + "species": "Rayquaza", + "types": [ + "Dragon", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 105, + "atk": 150, + "def": 90, + "spa": 150, + "spd": 90, + "spe": 95 + }, + "abilities": { + "0": "Air Lock" + }, + "heightm": 7, + "weightkg": 206.5, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "rayquazamega" + ] + }, + "rayquazamega": { + "num": 384, + "species": "Rayquaza-Mega", + "baseSpecies": "Rayquaza", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dragon", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 105, + "atk": 180, + "def": 100, + "spa": 180, + "spd": 100, + "spe": 115 + }, + "abilities": { + "0": "Delta Stream" + }, + "heightm": 10.8, + "weightkg": 392, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ] + }, + "jirachi": { + "num": 385, + "species": "Jirachi", + "types": [ + "Steel", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 100, + "def": 100, + "spa": 100, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Serene Grace" + }, + "heightm": 0.3, + "weightkg": 1.1, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "deoxys": { + "num": 386, + "species": "Deoxys", + "baseForme": "Normal", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 150, + "def": 50, + "spa": 150, + "spd": 50, + "spe": 150 + }, + "abilities": { + "0": "Pressure" + }, + "heightm": 1.7, + "weightkg": 60.8, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "deoxysattack", + "deoxysdefense", + "deoxysspeed" + ] + }, + "deoxysattack": { + "num": 386, + "species": "Deoxys-Attack", + "baseSpecies": "Deoxys", + "forme": "Attack", + "formeLetter": "A", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 180, + "def": 20, + "spa": 180, + "spd": 20, + "spe": 150 + }, + "abilities": { + "0": "Pressure" + }, + "heightm": 1.7, + "weightkg": 60.8, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ] + }, + "deoxysdefense": { + "num": 386, + "species": "Deoxys-Defense", + "baseSpecies": "Deoxys", + "forme": "Defense", + "formeLetter": "D", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 70, + "def": 160, + "spa": 70, + "spd": 160, + "spe": 90 + }, + "abilities": { + "0": "Pressure" + }, + "heightm": 1.7, + "weightkg": 60.8, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ] + }, + "deoxysspeed": { + "num": 386, + "species": "Deoxys-Speed", + "baseSpecies": "Deoxys", + "forme": "Speed", + "formeLetter": "S", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 95, + "def": 90, + "spa": 95, + "spd": 90, + "spe": 180 + }, + "abilities": { + "0": "Pressure" + }, + "heightm": 1.7, + "weightkg": 60.8, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ] + }, + "turtwig": { + "num": 387, + "species": "Turtwig", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 55, + "atk": 68, + "def": 64, + "spa": 45, + "spd": 55, + "spe": 31 + }, + "abilities": { + "0": "Overgrow", + "H": "Shell Armor" + }, + "heightm": 0.4, + "weightkg": 10.2, + "color": "Green", + "evos": [ + "grotle" + ], + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "grotle": { + "num": 388, + "species": "Grotle", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 89, + "def": 85, + "spa": 55, + "spd": 65, + "spe": 36 + }, + "abilities": { + "0": "Overgrow", + "H": "Shell Armor" + }, + "heightm": 1.1, + "weightkg": 97, + "color": "Green", + "prevo": "turtwig", + "evos": [ + "torterra" + ], + "evoLevel": 18, + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "torterra": { + "num": 389, + "species": "Torterra", + "types": [ + "Grass", + "Ground" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 95, + "atk": 109, + "def": 105, + "spa": 75, + "spd": 85, + "spe": 56 + }, + "abilities": { + "0": "Overgrow", + "H": "Shell Armor" + }, + "heightm": 2.2, + "weightkg": 310, + "color": "Green", + "prevo": "grotle", + "evoLevel": 32, + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "chimchar": { + "num": 390, + "species": "Chimchar", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 44, + "atk": 58, + "def": 44, + "spa": 58, + "spd": 44, + "spe": 61 + }, + "abilities": { + "0": "Blaze", + "H": "Iron Fist" + }, + "heightm": 0.5, + "weightkg": 6.2, + "color": "Brown", + "evos": [ + "monferno" + ], + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "monferno": { + "num": 391, + "species": "Monferno", + "types": [ + "Fire", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 64, + "atk": 78, + "def": 52, + "spa": 78, + "spd": 52, + "spe": 81 + }, + "abilities": { + "0": "Blaze", + "H": "Iron Fist" + }, + "heightm": 0.9, + "weightkg": 22, + "color": "Brown", + "prevo": "chimchar", + "evos": [ + "infernape" + ], + "evoLevel": 14, + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "infernape": { + "num": 392, + "species": "Infernape", + "types": [ + "Fire", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 76, + "atk": 104, + "def": 71, + "spa": 104, + "spd": 71, + "spe": 108 + }, + "abilities": { + "0": "Blaze", + "H": "Iron Fist" + }, + "heightm": 1.2, + "weightkg": 55, + "color": "Brown", + "prevo": "monferno", + "evoLevel": 36, + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "piplup": { + "num": 393, + "species": "Piplup", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 53, + "atk": 51, + "def": 53, + "spa": 61, + "spd": 56, + "spe": 40 + }, + "abilities": { + "0": "Torrent", + "H": "Defiant" + }, + "heightm": 0.4, + "weightkg": 5.2, + "color": "Blue", + "evos": [ + "prinplup" + ], + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "prinplup": { + "num": 394, + "species": "Prinplup", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 64, + "atk": 66, + "def": 68, + "spa": 81, + "spd": 76, + "spe": 50 + }, + "abilities": { + "0": "Torrent", + "H": "Defiant" + }, + "heightm": 0.8, + "weightkg": 23, + "color": "Blue", + "prevo": "piplup", + "evos": [ + "empoleon" + ], + "evoLevel": 16, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "empoleon": { + "num": 395, + "species": "Empoleon", + "types": [ + "Water", + "Steel" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 84, + "atk": 86, + "def": 88, + "spa": 111, + "spd": 101, + "spe": 60 + }, + "abilities": { + "0": "Torrent", + "H": "Defiant" + }, + "heightm": 1.7, + "weightkg": 84.5, + "color": "Blue", + "prevo": "prinplup", + "evoLevel": 36, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "starly": { + "num": 396, + "species": "Starly", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 40, + "atk": 55, + "def": 30, + "spa": 30, + "spd": 30, + "spe": 60 + }, + "abilities": { + "0": "Keen Eye", + "H": "Reckless" + }, + "heightm": 0.3, + "weightkg": 2, + "color": "Brown", + "evos": [ + "staravia" + ], + "eggGroups": [ + "Flying" + ] + }, + "staravia": { + "num": 397, + "species": "Staravia", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 55, + "atk": 75, + "def": 50, + "spa": 40, + "spd": 40, + "spe": 80 + }, + "abilities": { + "0": "Intimidate", + "H": "Reckless" + }, + "heightm": 0.6, + "weightkg": 15.5, + "color": "Brown", + "prevo": "starly", + "evos": [ + "staraptor" + ], + "evoLevel": 14, + "eggGroups": [ + "Flying" + ] + }, + "staraptor": { + "num": 398, + "species": "Staraptor", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 85, + "atk": 120, + "def": 70, + "spa": 50, + "spd": 60, + "spe": 100 + }, + "abilities": { + "0": "Intimidate", + "H": "Reckless" + }, + "heightm": 1.2, + "weightkg": 24.9, + "color": "Brown", + "prevo": "staravia", + "evoLevel": 34, + "eggGroups": [ + "Flying" + ] + }, + "bidoof": { + "num": 399, + "species": "Bidoof", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 59, + "atk": 45, + "def": 40, + "spa": 35, + "spd": 40, + "spe": 31 + }, + "abilities": { + "0": "Simple", + "1": "Unaware", + "H": "Moody" + }, + "heightm": 0.5, + "weightkg": 20, + "color": "Brown", + "evos": [ + "bibarel" + ], + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "bibarel": { + "num": 400, + "species": "Bibarel", + "types": [ + "Normal", + "Water" + ], + "baseStats": { + "hp": 79, + "atk": 85, + "def": 60, + "spa": 55, + "spd": 60, + "spe": 71 + }, + "abilities": { + "0": "Simple", + "1": "Unaware", + "H": "Moody" + }, + "heightm": 1, + "weightkg": 31.5, + "color": "Brown", + "prevo": "bidoof", + "evoLevel": 15, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "kricketot": { + "num": 401, + "species": "Kricketot", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 37, + "atk": 25, + "def": 41, + "spa": 25, + "spd": 41, + "spe": 25 + }, + "abilities": { + "0": "Shed Skin", + "H": "Run Away" + }, + "heightm": 0.3, + "weightkg": 2.2, + "color": "Red", + "evos": [ + "kricketune" + ], + "eggGroups": [ + "Bug" + ] + }, + "kricketune": { + "num": 402, + "species": "Kricketune", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 77, + "atk": 85, + "def": 51, + "spa": 55, + "spd": 51, + "spe": 65 + }, + "abilities": { + "0": "Swarm", + "H": "Technician" + }, + "heightm": 1, + "weightkg": 25.5, + "color": "Red", + "prevo": "kricketot", + "evoLevel": 10, + "eggGroups": [ + "Bug" + ] + }, + "shinx": { + "num": 403, + "species": "Shinx", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 45, + "atk": 65, + "def": 34, + "spa": 40, + "spd": 34, + "spe": 45 + }, + "abilities": { + "0": "Rivalry", + "1": "Intimidate", + "H": "Guts" + }, + "heightm": 0.5, + "weightkg": 9.5, + "color": "Blue", + "evos": [ + "luxio" + ], + "eggGroups": [ + "Field" + ] + }, + "luxio": { + "num": 404, + "species": "Luxio", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 60, + "atk": 85, + "def": 49, + "spa": 60, + "spd": 49, + "spe": 60 + }, + "abilities": { + "0": "Rivalry", + "1": "Intimidate", + "H": "Guts" + }, + "heightm": 0.9, + "weightkg": 30.5, + "color": "Blue", + "prevo": "shinx", + "evos": [ + "luxray" + ], + "evoLevel": 15, + "eggGroups": [ + "Field" + ] + }, + "luxray": { + "num": 405, + "species": "Luxray", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 80, + "atk": 120, + "def": 79, + "spa": 95, + "spd": 79, + "spe": 70 + }, + "abilities": { + "0": "Rivalry", + "1": "Intimidate", + "H": "Guts" + }, + "heightm": 1.4, + "weightkg": 42, + "color": "Blue", + "prevo": "luxio", + "evoLevel": 30, + "eggGroups": [ + "Field" + ] + }, + "budew": { + "num": 406, + "species": "Budew", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 40, + "atk": 30, + "def": 35, + "spa": 50, + "spd": 70, + "spe": 55 + }, + "abilities": { + "0": "Natural Cure", + "1": "Poison Point", + "H": "Leaf Guard" + }, + "heightm": 0.2, + "weightkg": 1.2, + "color": "Green", + "evos": [ + "roselia" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "roserade": { + "num": 407, + "species": "Roserade", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 70, + "def": 65, + "spa": 125, + "spd": 105, + "spe": 90 + }, + "abilities": { + "0": "Natural Cure", + "1": "Poison Point", + "H": "Technician" + }, + "heightm": 0.9, + "weightkg": 14.5, + "color": "Green", + "prevo": "roselia", + "evoLevel": 1, + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "cranidos": { + "num": 408, + "species": "Cranidos", + "types": [ + "Rock" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 67, + "atk": 125, + "def": 40, + "spa": 30, + "spd": 30, + "spe": 58 + }, + "abilities": { + "0": "Mold Breaker", + "H": "Sheer Force" + }, + "heightm": 0.9, + "weightkg": 31.5, + "color": "Blue", + "evos": [ + "rampardos" + ], + "eggGroups": [ + "Monster" + ] + }, + "rampardos": { + "num": 409, + "species": "Rampardos", + "types": [ + "Rock" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 97, + "atk": 165, + "def": 60, + "spa": 65, + "spd": 50, + "spe": 58 + }, + "abilities": { + "0": "Mold Breaker", + "H": "Sheer Force" + }, + "heightm": 1.6, + "weightkg": 102.5, + "color": "Blue", + "prevo": "cranidos", + "evoLevel": 30, + "eggGroups": [ + "Monster" + ] + }, + "shieldon": { + "num": 410, + "species": "Shieldon", + "types": [ + "Rock", + "Steel" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 30, + "atk": 42, + "def": 118, + "spa": 42, + "spd": 88, + "spe": 30 + }, + "abilities": { + "0": "Sturdy", + "H": "Soundproof" + }, + "heightm": 0.5, + "weightkg": 57, + "color": "Gray", + "evos": [ + "bastiodon" + ], + "eggGroups": [ + "Monster" + ] + }, + "bastiodon": { + "num": 411, + "species": "Bastiodon", + "types": [ + "Rock", + "Steel" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 60, + "atk": 52, + "def": 168, + "spa": 47, + "spd": 138, + "spe": 30 + }, + "abilities": { + "0": "Sturdy", + "H": "Soundproof" + }, + "heightm": 1.3, + "weightkg": 149.5, + "color": "Gray", + "prevo": "shieldon", + "evoLevel": 30, + "eggGroups": [ + "Monster" + ] + }, + "burmy": { + "num": 412, + "species": "Burmy", + "baseForme": "Grass", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 40, + "atk": 29, + "def": 45, + "spa": 29, + "spd": 45, + "spe": 36 + }, + "abilities": { + "0": "Shed Skin", + "H": "Overcoat" + }, + "heightm": 0.2, + "weightkg": 3.4, + "color": "Gray", + "evos": [ + "wormadam", + "wormadamsandy", + "wormadamtrash", + "mothim" + ], + "eggGroups": [ + "Bug" + ], + "otherForms": [ + "burmysandy", + "burmytrash" + ] + }, + "wormadam": { + "num": 413, + "species": "Wormadam", + "baseForme": "Grass", + "types": [ + "Bug", + "Grass" + ], + "gender": "F", + "baseStats": { + "hp": 60, + "atk": 59, + "def": 85, + "spa": 79, + "spd": 105, + "spe": 36 + }, + "abilities": { + "0": "Anticipation", + "H": "Overcoat" + }, + "heightm": 0.5, + "weightkg": 6.5, + "color": "Gray", + "prevo": "burmy", + "evoLevel": 20, + "eggGroups": [ + "Bug" + ], + "otherFormes": [ + "wormadamsandy", + "wormadamtrash" + ] + }, + "wormadamsandy": { + "num": 413, + "species": "Wormadam-Sandy", + "baseSpecies": "Wormadam", + "forme": "Sandy", + "formeLetter": "G", + "types": [ + "Bug", + "Ground" + ], + "gender": "F", + "baseStats": { + "hp": 60, + "atk": 79, + "def": 105, + "spa": 59, + "spd": 85, + "spe": 36 + }, + "abilities": { + "0": "Anticipation", + "H": "Overcoat" + }, + "heightm": 0.5, + "weightkg": 6.5, + "color": "Gray", + "prevo": "burmy", + "evoLevel": 20, + "eggGroups": [ + "Bug" + ] + }, + "wormadamtrash": { + "num": 413, + "species": "Wormadam-Trash", + "baseSpecies": "Wormadam", + "forme": "Trash", + "formeLetter": "S", + "types": [ + "Bug", + "Steel" + ], + "gender": "F", + "baseStats": { + "hp": 60, + "atk": 69, + "def": 95, + "spa": 69, + "spd": 95, + "spe": 36 + }, + "abilities": { + "0": "Anticipation", + "H": "Overcoat" + }, + "heightm": 0.5, + "weightkg": 6.5, + "color": "Gray", + "prevo": "burmy", + "evoLevel": 20, + "eggGroups": [ + "Bug" + ] + }, + "mothim": { + "num": 414, + "species": "Mothim", + "types": [ + "Bug", + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 70, + "atk": 94, + "def": 50, + "spa": 94, + "spd": 50, + "spe": 66 + }, + "abilities": { + "0": "Swarm", + "H": "Tinted Lens" + }, + "heightm": 0.9, + "weightkg": 23.3, + "color": "Yellow", + "prevo": "burmy", + "evoLevel": 20, + "eggGroups": [ + "Bug" + ] + }, + "combee": { + "num": 415, + "species": "Combee", + "types": [ + "Bug", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 30, + "atk": 30, + "def": 42, + "spa": 30, + "spd": 42, + "spe": 70 + }, + "abilities": { + "0": "Honey Gather", + "H": "Hustle" + }, + "heightm": 0.3, + "weightkg": 5.5, + "color": "Yellow", + "evos": [ + "vespiquen" + ], + "eggGroups": [ + "Bug" + ] + }, + "vespiquen": { + "num": 416, + "species": "Vespiquen", + "types": [ + "Bug", + "Flying" + ], + "gender": "F", + "baseStats": { + "hp": 70, + "atk": 80, + "def": 102, + "spa": 80, + "spd": 102, + "spe": 40 + }, + "abilities": { + "0": "Pressure", + "H": "Unnerve" + }, + "heightm": 1.2, + "weightkg": 38.5, + "color": "Yellow", + "prevo": "combee", + "evoLevel": 21, + "eggGroups": [ + "Bug" + ] + }, + "pachirisu": { + "num": 417, + "species": "Pachirisu", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 60, + "atk": 45, + "def": 70, + "spa": 45, + "spd": 90, + "spe": 95 + }, + "abilities": { + "0": "Run Away", + "1": "Pickup", + "H": "Volt Absorb" + }, + "heightm": 0.4, + "weightkg": 3.9, + "color": "White", + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "buizel": { + "num": 418, + "species": "Buizel", + "types": [ + "Water" + ], + "baseStats": { + "hp": 55, + "atk": 65, + "def": 35, + "spa": 60, + "spd": 30, + "spe": 85 + }, + "abilities": { + "0": "Swift Swim", + "H": "Water Veil" + }, + "heightm": 0.7, + "weightkg": 29.5, + "color": "Brown", + "evos": [ + "floatzel" + ], + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "floatzel": { + "num": 419, + "species": "Floatzel", + "types": [ + "Water" + ], + "baseStats": { + "hp": 85, + "atk": 105, + "def": 55, + "spa": 85, + "spd": 50, + "spe": 115 + }, + "abilities": { + "0": "Swift Swim", + "H": "Water Veil" + }, + "heightm": 1.1, + "weightkg": 33.5, + "color": "Brown", + "prevo": "buizel", + "evoLevel": 26, + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "cherubi": { + "num": 420, + "species": "Cherubi", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 45, + "atk": 35, + "def": 45, + "spa": 62, + "spd": 53, + "spe": 35 + }, + "abilities": { + "0": "Chlorophyll" + }, + "heightm": 0.4, + "weightkg": 3.3, + "color": "Pink", + "evos": [ + "cherrim" + ], + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "cherrim": { + "num": 421, + "species": "Cherrim", + "baseForme": "Overcast", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 70, + "atk": 60, + "def": 70, + "spa": 87, + "spd": 78, + "spe": 85 + }, + "abilities": { + "0": "Flower Gift" + }, + "heightm": 0.5, + "weightkg": 9.3, + "color": "Pink", + "prevo": "cherubi", + "evoLevel": 25, + "eggGroups": [ + "Fairy", + "Grass" + ], + "otherFormes": [ + "cherrimsunshine" + ] + }, + "cherrimsunshine": { + "num": 421, + "species": "Cherrim-Sunshine", + "baseSpecies": "Cherrim", + "forme": "Sunshine", + "formeLetter": "S", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 70, + "atk": 60, + "def": 70, + "spa": 87, + "spd": 78, + "spe": 85 + }, + "abilities": { + "0": "Flower Gift" + }, + "heightm": 0.5, + "weightkg": 9.3, + "color": "Pink", + "prevo": "cherubi", + "evoLevel": 25, + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "shellos": { + "num": 422, + "species": "Shellos", + "baseForme": "West", + "types": [ + "Water" + ], + "baseStats": { + "hp": 76, + "atk": 48, + "def": 48, + "spa": 57, + "spd": 62, + "spe": 34 + }, + "abilities": { + "0": "Sticky Hold", + "1": "Storm Drain", + "H": "Sand Force" + }, + "heightm": 0.3, + "weightkg": 6.3, + "color": "Purple", + "evos": [ + "gastrodon" + ], + "eggGroups": [ + "Water 1", + "Amorphous" + ], + "otherForms": [ + "shelloseast" + ] + }, + "gastrodon": { + "num": 423, + "species": "Gastrodon", + "baseForme": "West", + "types": [ + "Water", + "Ground" + ], + "baseStats": { + "hp": 111, + "atk": 83, + "def": 68, + "spa": 92, + "spd": 82, + "spe": 39 + }, + "abilities": { + "0": "Sticky Hold", + "1": "Storm Drain", + "H": "Sand Force" + }, + "heightm": 0.9, + "weightkg": 29.9, + "color": "Purple", + "prevo": "shellos", + "evoLevel": 30, + "eggGroups": [ + "Water 1", + "Amorphous" + ], + "otherForms": [ + "gastrodoneast" + ] + }, + "ambipom": { + "num": 424, + "species": "Ambipom", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 75, + "atk": 100, + "def": 66, + "spa": 60, + "spd": 66, + "spe": 115 + }, + "abilities": { + "0": "Technician", + "1": "Pickup", + "H": "Skill Link" + }, + "heightm": 1.2, + "weightkg": 20.3, + "color": "Purple", + "prevo": "aipom", + "evoLevel": 2, + "evoMove": "Double Hit", + "eggGroups": [ + "Field" + ] + }, + "drifloon": { + "num": 425, + "species": "Drifloon", + "types": [ + "Ghost", + "Flying" + ], + "baseStats": { + "hp": 90, + "atk": 50, + "def": 34, + "spa": 60, + "spd": 44, + "spe": 70 + }, + "abilities": { + "0": "Aftermath", + "1": "Unburden", + "H": "Flare Boost" + }, + "heightm": 0.4, + "weightkg": 1.2, + "color": "Purple", + "evos": [ + "drifblim" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "drifblim": { + "num": 426, + "species": "Drifblim", + "types": [ + "Ghost", + "Flying" + ], + "baseStats": { + "hp": 150, + "atk": 80, + "def": 44, + "spa": 90, + "spd": 54, + "spe": 80 + }, + "abilities": { + "0": "Aftermath", + "1": "Unburden", + "H": "Flare Boost" + }, + "heightm": 1.2, + "weightkg": 15, + "color": "Purple", + "prevo": "drifloon", + "evoLevel": 28, + "eggGroups": [ + "Amorphous" + ] + }, + "buneary": { + "num": 427, + "species": "Buneary", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 55, + "atk": 66, + "def": 44, + "spa": 44, + "spd": 56, + "spe": 85 + }, + "abilities": { + "0": "Run Away", + "1": "Klutz", + "H": "Limber" + }, + "heightm": 0.4, + "weightkg": 5.5, + "color": "Brown", + "evos": [ + "lopunny" + ], + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "lopunny": { + "num": 428, + "species": "Lopunny", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 65, + "atk": 76, + "def": 84, + "spa": 54, + "spd": 96, + "spe": 105 + }, + "abilities": { + "0": "Cute Charm", + "1": "Klutz", + "H": "Limber" + }, + "heightm": 1.2, + "weightkg": 33.3, + "color": "Brown", + "prevo": "buneary", + "evoLevel": 2, + "eggGroups": [ + "Field", + "Human-Like" + ], + "otherFormes": [ + "lopunnymega" + ] + }, + "lopunnymega": { + "num": 428, + "species": "Lopunny-Mega", + "baseSpecies": "Lopunny", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Normal", + "Fighting" + ], + "baseStats": { + "hp": 65, + "atk": 136, + "def": 94, + "spa": 54, + "spd": 96, + "spe": 135 + }, + "abilities": { + "0": "Scrappy" + }, + "heightm": 1.3, + "weightkg": 28.3, + "color": "Brown", + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "mismagius": { + "num": 429, + "species": "Mismagius", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 60, + "atk": 60, + "def": 60, + "spa": 105, + "spd": 105, + "spe": 105 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.9, + "weightkg": 4.4, + "color": "Purple", + "prevo": "misdreavus", + "evoLevel": 1, + "eggGroups": [ + "Amorphous" + ] + }, + "honchkrow": { + "num": 430, + "species": "Honchkrow", + "types": [ + "Dark", + "Flying" + ], + "baseStats": { + "hp": 100, + "atk": 125, + "def": 52, + "spa": 105, + "spd": 52, + "spe": 71 + }, + "abilities": { + "0": "Insomnia", + "1": "Super Luck", + "H": "Moxie" + }, + "heightm": 0.9, + "weightkg": 27.3, + "color": "Black", + "prevo": "murkrow", + "evoLevel": 1, + "eggGroups": [ + "Flying" + ] + }, + "glameow": { + "num": 431, + "species": "Glameow", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 49, + "atk": 55, + "def": 42, + "spa": 42, + "spd": 37, + "spe": 85 + }, + "abilities": { + "0": "Limber", + "1": "Own Tempo", + "H": "Keen Eye" + }, + "heightm": 0.5, + "weightkg": 3.9, + "color": "Gray", + "evos": [ + "purugly" + ], + "eggGroups": [ + "Field" + ] + }, + "purugly": { + "num": 432, + "species": "Purugly", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 71, + "atk": 82, + "def": 64, + "spa": 64, + "spd": 59, + "spe": 112 + }, + "abilities": { + "0": "Thick Fat", + "1": "Own Tempo", + "H": "Defiant" + }, + "heightm": 1, + "weightkg": 43.8, + "color": "Gray", + "prevo": "glameow", + "evoLevel": 38, + "eggGroups": [ + "Field" + ] + }, + "chingling": { + "num": 433, + "species": "Chingling", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 45, + "atk": 30, + "def": 50, + "spa": 65, + "spd": 50, + "spe": 45 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.2, + "weightkg": 0.6, + "color": "Yellow", + "evos": [ + "chimecho" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "stunky": { + "num": 434, + "species": "Stunky", + "types": [ + "Poison", + "Dark" + ], + "baseStats": { + "hp": 63, + "atk": 63, + "def": 47, + "spa": 41, + "spd": 41, + "spe": 74 + }, + "abilities": { + "0": "Stench", + "1": "Aftermath", + "H": "Keen Eye" + }, + "heightm": 0.4, + "weightkg": 19.2, + "color": "Purple", + "evos": [ + "skuntank" + ], + "eggGroups": [ + "Field" + ] + }, + "skuntank": { + "num": 435, + "species": "Skuntank", + "types": [ + "Poison", + "Dark" + ], + "baseStats": { + "hp": 103, + "atk": 93, + "def": 67, + "spa": 71, + "spd": 61, + "spe": 84 + }, + "abilities": { + "0": "Stench", + "1": "Aftermath", + "H": "Keen Eye" + }, + "heightm": 1, + "weightkg": 38, + "color": "Purple", + "prevo": "stunky", + "evoLevel": 34, + "eggGroups": [ + "Field" + ] + }, + "bronzor": { + "num": 436, + "species": "Bronzor", + "types": [ + "Steel", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 57, + "atk": 24, + "def": 86, + "spa": 24, + "spd": 86, + "spe": 23 + }, + "abilities": { + "0": "Levitate", + "1": "Heatproof", + "H": "Heavy Metal" + }, + "heightm": 0.5, + "weightkg": 60.5, + "color": "Green", + "evos": [ + "bronzong" + ], + "eggGroups": [ + "Mineral" + ] + }, + "bronzong": { + "num": 437, + "species": "Bronzong", + "types": [ + "Steel", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 67, + "atk": 89, + "def": 116, + "spa": 79, + "spd": 116, + "spe": 33 + }, + "abilities": { + "0": "Levitate", + "1": "Heatproof", + "H": "Heavy Metal" + }, + "heightm": 1.3, + "weightkg": 187, + "color": "Green", + "prevo": "bronzor", + "evoLevel": 33, + "eggGroups": [ + "Mineral" + ] + }, + "bonsly": { + "num": 438, + "species": "Bonsly", + "types": [ + "Rock" + ], + "baseStats": { + "hp": 50, + "atk": 80, + "def": 95, + "spa": 10, + "spd": 45, + "spe": 10 + }, + "abilities": { + "0": "Sturdy", + "1": "Rock Head", + "H": "Rattled" + }, + "heightm": 0.5, + "weightkg": 15, + "color": "Brown", + "evos": [ + "sudowoodo" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "mimejr": { + "num": 439, + "species": "Mime Jr.", + "types": [ + "Psychic", + "Fairy" + ], + "baseStats": { + "hp": 20, + "atk": 25, + "def": 45, + "spa": 70, + "spd": 90, + "spe": 60 + }, + "abilities": { + "0": "Soundproof", + "1": "Filter", + "H": "Technician" + }, + "heightm": 0.6, + "weightkg": 13, + "color": "Pink", + "evos": [ + "mrmime" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "happiny": { + "num": 440, + "species": "Happiny", + "types": [ + "Normal" + ], + "gender": "F", + "baseStats": { + "hp": 100, + "atk": 5, + "def": 5, + "spa": 15, + "spd": 65, + "spe": 30 + }, + "abilities": { + "0": "Natural Cure", + "1": "Serene Grace", + "H": "Friend Guard" + }, + "heightm": 0.6, + "weightkg": 24.4, + "color": "Pink", + "evos": [ + "chansey" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "chatot": { + "num": 441, + "species": "Chatot", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 76, + "atk": 65, + "def": 45, + "spa": 92, + "spd": 42, + "spe": 91 + }, + "abilities": { + "0": "Keen Eye", + "1": "Tangled Feet", + "H": "Big Pecks" + }, + "heightm": 0.5, + "weightkg": 1.9, + "color": "Black", + "eggGroups": [ + "Flying" + ] + }, + "spiritomb": { + "num": 442, + "species": "Spiritomb", + "types": [ + "Ghost", + "Dark" + ], + "baseStats": { + "hp": 50, + "atk": 92, + "def": 108, + "spa": 92, + "spd": 108, + "spe": 35 + }, + "abilities": { + "0": "Pressure", + "H": "Infiltrator" + }, + "heightm": 1, + "weightkg": 108, + "color": "Purple", + "eggGroups": [ + "Amorphous" + ] + }, + "gible": { + "num": 443, + "species": "Gible", + "types": [ + "Dragon", + "Ground" + ], + "baseStats": { + "hp": 58, + "atk": 70, + "def": 45, + "spa": 40, + "spd": 45, + "spe": 42 + }, + "abilities": { + "0": "Sand Veil", + "H": "Rough Skin" + }, + "heightm": 0.7, + "weightkg": 20.5, + "color": "Blue", + "evos": [ + "gabite" + ], + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "gabite": { + "num": 444, + "species": "Gabite", + "types": [ + "Dragon", + "Ground" + ], + "baseStats": { + "hp": 68, + "atk": 90, + "def": 65, + "spa": 50, + "spd": 55, + "spe": 82 + }, + "abilities": { + "0": "Sand Veil", + "H": "Rough Skin" + }, + "heightm": 1.4, + "weightkg": 56, + "color": "Blue", + "prevo": "gible", + "evos": [ + "garchomp" + ], + "evoLevel": 24, + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "garchomp": { + "num": 445, + "species": "Garchomp", + "types": [ + "Dragon", + "Ground" + ], + "baseStats": { + "hp": 108, + "atk": 130, + "def": 95, + "spa": 80, + "spd": 85, + "spe": 102 + }, + "abilities": { + "0": "Sand Veil", + "H": "Rough Skin" + }, + "heightm": 1.9, + "weightkg": 95, + "color": "Blue", + "prevo": "gabite", + "evoLevel": 48, + "eggGroups": [ + "Monster", + "Dragon" + ], + "otherFormes": [ + "garchompmega" + ] + }, + "garchompmega": { + "num": 445, + "species": "Garchomp-Mega", + "baseSpecies": "Garchomp", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Dragon", + "Ground" + ], + "baseStats": { + "hp": 108, + "atk": 170, + "def": 115, + "spa": 120, + "spd": 95, + "spe": 92 + }, + "abilities": { + "0": "Sand Force" + }, + "heightm": 1.9, + "weightkg": 95, + "color": "Blue", + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "munchlax": { + "num": 446, + "species": "Munchlax", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 135, + "atk": 85, + "def": 40, + "spa": 40, + "spd": 85, + "spe": 5 + }, + "abilities": { + "0": "Pickup", + "1": "Thick Fat", + "H": "Gluttony" + }, + "heightm": 0.6, + "weightkg": 105, + "color": "Black", + "evos": [ + "snorlax" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "riolu": { + "num": 447, + "species": "Riolu", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 40, + "atk": 70, + "def": 40, + "spa": 35, + "spd": 40, + "spe": 60 + }, + "abilities": { + "0": "Steadfast", + "1": "Inner Focus", + "H": "Prankster" + }, + "heightm": 0.7, + "weightkg": 20.2, + "color": "Blue", + "evos": [ + "lucario" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "lucario": { + "num": 448, + "species": "Lucario", + "types": [ + "Fighting", + "Steel" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 70, + "atk": 110, + "def": 70, + "spa": 115, + "spd": 70, + "spe": 90 + }, + "abilities": { + "0": "Steadfast", + "1": "Inner Focus", + "H": "Justified" + }, + "heightm": 1.2, + "weightkg": 54, + "color": "Blue", + "prevo": "riolu", + "evoLevel": 2, + "eggGroups": [ + "Field", + "Human-Like" + ], + "otherFormes": [ + "lucariomega" + ] + }, + "lucariomega": { + "num": 448, + "species": "Lucario-Mega", + "baseSpecies": "Lucario", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Fighting", + "Steel" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 70, + "atk": 145, + "def": 88, + "spa": 140, + "spd": 70, + "spe": 112 + }, + "abilities": { + "0": "Adaptability" + }, + "heightm": 1.3, + "weightkg": 57.5, + "color": "Blue", + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "hippopotas": { + "num": 449, + "species": "Hippopotas", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 68, + "atk": 72, + "def": 78, + "spa": 38, + "spd": 42, + "spe": 32 + }, + "abilities": { + "0": "Sand Stream", + "H": "Sand Force" + }, + "heightm": 0.8, + "weightkg": 49.5, + "color": "Brown", + "evos": [ + "hippowdon" + ], + "eggGroups": [ + "Field" + ] + }, + "hippowdon": { + "num": 450, + "species": "Hippowdon", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 108, + "atk": 112, + "def": 118, + "spa": 68, + "spd": 72, + "spe": 47 + }, + "abilities": { + "0": "Sand Stream", + "H": "Sand Force" + }, + "heightm": 2, + "weightkg": 300, + "color": "Brown", + "prevo": "hippopotas", + "evoLevel": 34, + "eggGroups": [ + "Field" + ] + }, + "skorupi": { + "num": 451, + "species": "Skorupi", + "types": [ + "Poison", + "Bug" + ], + "baseStats": { + "hp": 40, + "atk": 50, + "def": 90, + "spa": 30, + "spd": 55, + "spe": 65 + }, + "abilities": { + "0": "Battle Armor", + "1": "Sniper", + "H": "Keen Eye" + }, + "heightm": 0.8, + "weightkg": 12, + "color": "Purple", + "evos": [ + "drapion" + ], + "eggGroups": [ + "Bug", + "Water 3" + ] + }, + "drapion": { + "num": 452, + "species": "Drapion", + "types": [ + "Poison", + "Dark" + ], + "baseStats": { + "hp": 70, + "atk": 90, + "def": 110, + "spa": 60, + "spd": 75, + "spe": 95 + }, + "abilities": { + "0": "Battle Armor", + "1": "Sniper", + "H": "Keen Eye" + }, + "heightm": 1.3, + "weightkg": 61.5, + "color": "Purple", + "prevo": "skorupi", + "evoLevel": 40, + "eggGroups": [ + "Bug", + "Water 3" + ] + }, + "croagunk": { + "num": 453, + "species": "Croagunk", + "types": [ + "Poison", + "Fighting" + ], + "baseStats": { + "hp": 48, + "atk": 61, + "def": 40, + "spa": 61, + "spd": 40, + "spe": 50 + }, + "abilities": { + "0": "Anticipation", + "1": "Dry Skin", + "H": "Poison Touch" + }, + "heightm": 0.7, + "weightkg": 23, + "color": "Blue", + "evos": [ + "toxicroak" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "toxicroak": { + "num": 454, + "species": "Toxicroak", + "types": [ + "Poison", + "Fighting" + ], + "baseStats": { + "hp": 83, + "atk": 106, + "def": 65, + "spa": 86, + "spd": 65, + "spe": 85 + }, + "abilities": { + "0": "Anticipation", + "1": "Dry Skin", + "H": "Poison Touch" + }, + "heightm": 1.3, + "weightkg": 44.4, + "color": "Blue", + "prevo": "croagunk", + "evoLevel": 37, + "eggGroups": [ + "Human-Like" + ] + }, + "carnivine": { + "num": 455, + "species": "Carnivine", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 74, + "atk": 100, + "def": 72, + "spa": 90, + "spd": 72, + "spe": 46 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.4, + "weightkg": 27, + "color": "Green", + "eggGroups": [ + "Grass" + ] + }, + "finneon": { + "num": 456, + "species": "Finneon", + "types": [ + "Water" + ], + "baseStats": { + "hp": 49, + "atk": 49, + "def": 56, + "spa": 49, + "spd": 61, + "spe": 66 + }, + "abilities": { + "0": "Swift Swim", + "1": "Storm Drain", + "H": "Water Veil" + }, + "heightm": 0.4, + "weightkg": 7, + "color": "Blue", + "evos": [ + "lumineon" + ], + "eggGroups": [ + "Water 2" + ] + }, + "lumineon": { + "num": 457, + "species": "Lumineon", + "types": [ + "Water" + ], + "baseStats": { + "hp": 69, + "atk": 69, + "def": 76, + "spa": 69, + "spd": 86, + "spe": 91 + }, + "abilities": { + "0": "Swift Swim", + "1": "Storm Drain", + "H": "Water Veil" + }, + "heightm": 1.2, + "weightkg": 24, + "color": "Blue", + "prevo": "finneon", + "evoLevel": 31, + "eggGroups": [ + "Water 2" + ] + }, + "mantyke": { + "num": 458, + "species": "Mantyke", + "types": [ + "Water", + "Flying" + ], + "baseStats": { + "hp": 45, + "atk": 20, + "def": 50, + "spa": 60, + "spd": 120, + "spe": 50 + }, + "abilities": { + "0": "Swift Swim", + "1": "Water Absorb", + "H": "Water Veil" + }, + "heightm": 1, + "weightkg": 65, + "color": "Blue", + "evos": [ + "mantine" + ], + "eggGroups": [ + "Undiscovered" + ] + }, + "snover": { + "num": 459, + "species": "Snover", + "types": [ + "Grass", + "Ice" + ], + "baseStats": { + "hp": 60, + "atk": 62, + "def": 50, + "spa": 62, + "spd": 60, + "spe": 40 + }, + "abilities": { + "0": "Snow Warning", + "H": "Soundproof" + }, + "heightm": 1, + "weightkg": 50.5, + "color": "White", + "evos": [ + "abomasnow" + ], + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "abomasnow": { + "num": 460, + "species": "Abomasnow", + "types": [ + "Grass", + "Ice" + ], + "baseStats": { + "hp": 90, + "atk": 92, + "def": 75, + "spa": 92, + "spd": 85, + "spe": 60 + }, + "abilities": { + "0": "Snow Warning", + "H": "Soundproof" + }, + "heightm": 2.2, + "weightkg": 135.5, + "color": "White", + "prevo": "snover", + "evoLevel": 40, + "eggGroups": [ + "Monster", + "Grass" + ], + "otherFormes": [ + "abomasnowmega" + ] + }, + "abomasnowmega": { + "num": 460, + "species": "Abomasnow-Mega", + "baseSpecies": "Abomasnow", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Grass", + "Ice" + ], + "baseStats": { + "hp": 90, + "atk": 132, + "def": 105, + "spa": 132, + "spd": 105, + "spe": 30 + }, + "abilities": { + "0": "Snow Warning" + }, + "heightm": 2.7, + "weightkg": 185, + "color": "White", + "eggGroups": [ + "Monster", + "Grass" + ] + }, + "weavile": { + "num": 461, + "species": "Weavile", + "types": [ + "Dark", + "Ice" + ], + "baseStats": { + "hp": 70, + "atk": 120, + "def": 65, + "spa": 45, + "spd": 85, + "spe": 125 + }, + "abilities": { + "0": "Pressure", + "H": "Pickpocket" + }, + "heightm": 1.1, + "weightkg": 34, + "color": "Black", + "prevo": "sneasel", + "evoLevel": 2, + "eggGroups": [ + "Field" + ] + }, + "magnezone": { + "num": 462, + "species": "Magnezone", + "types": [ + "Electric", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 70, + "atk": 70, + "def": 115, + "spa": 130, + "spd": 90, + "spe": 60 + }, + "abilities": { + "0": "Magnet Pull", + "1": "Sturdy", + "H": "Analytic" + }, + "heightm": 1.2, + "weightkg": 180, + "color": "Gray", + "prevo": "magneton", + "evoLevel": 31, + "eggGroups": [ + "Mineral" + ] + }, + "lickilicky": { + "num": 463, + "species": "Lickilicky", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 110, + "atk": 85, + "def": 95, + "spa": 80, + "spd": 95, + "spe": 50 + }, + "abilities": { + "0": "Own Tempo", + "1": "Oblivious", + "H": "Cloud Nine" + }, + "heightm": 1.7, + "weightkg": 140, + "color": "Pink", + "prevo": "lickitung", + "evoLevel": 2, + "evoMove": "Rollout", + "eggGroups": [ + "Monster" + ] + }, + "rhyperior": { + "num": 464, + "species": "Rhyperior", + "types": [ + "Ground", + "Rock" + ], + "baseStats": { + "hp": 115, + "atk": 140, + "def": 130, + "spa": 55, + "spd": 55, + "spe": 40 + }, + "abilities": { + "0": "Lightning Rod", + "1": "Solid Rock", + "H": "Reckless" + }, + "heightm": 2.4, + "weightkg": 282.8, + "color": "Gray", + "prevo": "rhydon", + "evoLevel": 42, + "eggGroups": [ + "Monster", + "Field" + ] + }, + "tangrowth": { + "num": 465, + "species": "Tangrowth", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 100, + "atk": 100, + "def": 125, + "spa": 110, + "spd": 50, + "spe": 50 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Leaf Guard", + "H": "Regenerator" + }, + "heightm": 2, + "weightkg": 128.6, + "color": "Blue", + "prevo": "tangela", + "evoLevel": 2, + "evoMove": "AncientPower", + "eggGroups": [ + "Grass" + ] + }, + "electivire": { + "num": 466, + "species": "Electivire", + "types": [ + "Electric" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 75, + "atk": 123, + "def": 67, + "spa": 95, + "spd": 85, + "spe": 95 + }, + "abilities": { + "0": "Motor Drive", + "H": "Vital Spirit" + }, + "heightm": 1.8, + "weightkg": 138.6, + "color": "Yellow", + "prevo": "electabuzz", + "evoLevel": 30, + "eggGroups": [ + "Human-Like" + ] + }, + "magmortar": { + "num": 467, + "species": "Magmortar", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 75, + "atk": 95, + "def": 67, + "spa": 125, + "spd": 95, + "spe": 83 + }, + "abilities": { + "0": "Flame Body", + "H": "Vital Spirit" + }, + "heightm": 1.6, + "weightkg": 68, + "color": "Red", + "prevo": "magmar", + "evoLevel": 30, + "eggGroups": [ + "Human-Like" + ] + }, + "togekiss": { + "num": 468, + "species": "Togekiss", + "types": [ + "Fairy", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 85, + "atk": 50, + "def": 95, + "spa": 120, + "spd": 115, + "spe": 80 + }, + "abilities": { + "0": "Hustle", + "1": "Serene Grace", + "H": "Super Luck" + }, + "heightm": 1.5, + "weightkg": 38, + "color": "White", + "prevo": "togetic", + "evoLevel": 2, + "eggGroups": [ + "Flying", + "Fairy" + ] + }, + "yanmega": { + "num": 469, + "species": "Yanmega", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 86, + "atk": 76, + "def": 86, + "spa": 116, + "spd": 56, + "spe": 95 + }, + "abilities": { + "0": "Speed Boost", + "1": "Tinted Lens", + "H": "Frisk" + }, + "heightm": 1.9, + "weightkg": 51.5, + "color": "Green", + "prevo": "yanma", + "evoLevel": 2, + "evoMove": "AncientPower", + "eggGroups": [ + "Bug" + ] + }, + "leafeon": { + "num": 470, + "species": "Leafeon", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 65, + "atk": 110, + "def": 130, + "spa": 60, + "spd": 65, + "spe": 95 + }, + "abilities": { + "0": "Leaf Guard", + "H": "Chlorophyll" + }, + "heightm": 1, + "weightkg": 25.5, + "color": "Green", + "prevo": "eevee", + "evoLevel": 2, + "eggGroups": [ + "Field" + ] + }, + "glaceon": { + "num": 471, + "species": "Glaceon", + "types": [ + "Ice" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 65, + "atk": 60, + "def": 110, + "spa": 130, + "spd": 95, + "spe": 65 + }, + "abilities": { + "0": "Snow Cloak", + "H": "Ice Body" + }, + "heightm": 0.8, + "weightkg": 25.9, + "color": "Blue", + "prevo": "eevee", + "evoLevel": 2, + "eggGroups": [ + "Field" + ] + }, + "gliscor": { + "num": 472, + "species": "Gliscor", + "types": [ + "Ground", + "Flying" + ], + "baseStats": { + "hp": 75, + "atk": 95, + "def": 125, + "spa": 45, + "spd": 75, + "spe": 95 + }, + "abilities": { + "0": "Hyper Cutter", + "1": "Sand Veil", + "H": "Poison Heal" + }, + "heightm": 2, + "weightkg": 42.5, + "color": "Purple", + "prevo": "gligar", + "evoLevel": 2, + "eggGroups": [ + "Bug" + ] + }, + "mamoswine": { + "num": 473, + "species": "Mamoswine", + "types": [ + "Ice", + "Ground" + ], + "baseStats": { + "hp": 110, + "atk": 130, + "def": 80, + "spa": 70, + "spd": 60, + "spe": 80 + }, + "abilities": { + "0": "Oblivious", + "1": "Snow Cloak", + "H": "Thick Fat" + }, + "heightm": 2.5, + "weightkg": 291, + "color": "Brown", + "prevo": "piloswine", + "evoLevel": 34, + "evoMove": "AncientPower", + "eggGroups": [ + "Field" + ] + }, + "porygonz": { + "num": 474, + "species": "Porygon-Z", + "types": [ + "Normal" + ], + "gender": "N", + "baseStats": { + "hp": 85, + "atk": 80, + "def": 70, + "spa": 135, + "spd": 75, + "spe": 90 + }, + "abilities": { + "0": "Adaptability", + "1": "Download", + "H": "Analytic" + }, + "heightm": 0.9, + "weightkg": 34, + "color": "Red", + "prevo": "porygon2", + "evoLevel": 1, + "eggGroups": [ + "Mineral" + ] + }, + "gallade": { + "num": 475, + "species": "Gallade", + "types": [ + "Psychic", + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 68, + "atk": 125, + "def": 65, + "spa": 65, + "spd": 115, + "spe": 80 + }, + "abilities": { + "0": "Steadfast", + "H": "Justified" + }, + "heightm": 1.6, + "weightkg": 52, + "color": "White", + "prevo": "kirlia", + "evoLevel": 20, + "eggGroups": [ + "Amorphous" + ], + "otherFormes": [ + "gallademega" + ] + }, + "gallademega": { + "num": 475, + "species": "Gallade-Mega", + "baseSpecies": "Gallade", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Psychic", + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 68, + "atk": 165, + "def": 95, + "spa": 65, + "spd": 115, + "spe": 110 + }, + "abilities": { + "0": "Inner Focus" + }, + "heightm": 1.6, + "weightkg": 56.4, + "color": "White", + "eggGroups": [ + "Amorphous" + ] + }, + "probopass": { + "num": 476, + "species": "Probopass", + "types": [ + "Rock", + "Steel" + ], + "baseStats": { + "hp": 60, + "atk": 55, + "def": 145, + "spa": 75, + "spd": 150, + "spe": 40 + }, + "abilities": { + "0": "Sturdy", + "1": "Magnet Pull", + "H": "Sand Force" + }, + "heightm": 1.4, + "weightkg": 340, + "color": "Gray", + "prevo": "nosepass", + "evoLevel": 2, + "eggGroups": [ + "Mineral" + ] + }, + "dusknoir": { + "num": 477, + "species": "Dusknoir", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 45, + "atk": 100, + "def": 135, + "spa": 65, + "spd": 135, + "spe": 45 + }, + "abilities": { + "0": "Pressure", + "H": "Frisk" + }, + "heightm": 2.2, + "weightkg": 106.6, + "color": "Black", + "prevo": "dusclops", + "evoLevel": 37, + "eggGroups": [ + "Amorphous" + ] + }, + "froslass": { + "num": 478, + "species": "Froslass", + "types": [ + "Ice", + "Ghost" + ], + "gender": "F", + "baseStats": { + "hp": 70, + "atk": 80, + "def": 70, + "spa": 80, + "spd": 70, + "spe": 110 + }, + "abilities": { + "0": "Snow Cloak", + "H": "Cursed Body" + }, + "heightm": 1.3, + "weightkg": 26.6, + "color": "White", + "prevo": "snorunt", + "evoLevel": 1, + "eggGroups": [ + "Fairy", + "Mineral" + ] + }, + "rotom": { + "num": 479, + "species": "Rotom", + "types": [ + "Electric", + "Ghost" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 50, + "def": 77, + "spa": 95, + "spd": 77, + "spe": 91 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Red", + "eggGroups": [ + "Amorphous" + ], + "otherFormes": [ + "rotomheat", + "rotomwash", + "rotomfrost", + "rotomfan", + "rotommow" + ] + }, + "rotomheat": { + "num": 479, + "species": "Rotom-Heat", + "baseSpecies": "Rotom", + "forme": "Heat", + "formeLetter": "H", + "types": [ + "Electric", + "Fire" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 65, + "def": 107, + "spa": 105, + "spd": 107, + "spe": 86 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Red", + "eggGroups": [ + "Amorphous" + ] + }, + "rotomwash": { + "num": 479, + "species": "Rotom-Wash", + "baseSpecies": "Rotom", + "forme": "Wash", + "formeLetter": "W", + "types": [ + "Electric", + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 65, + "def": 107, + "spa": 105, + "spd": 107, + "spe": 86 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Red", + "eggGroups": [ + "Amorphous" + ] + }, + "rotomfrost": { + "num": 479, + "species": "Rotom-Frost", + "baseSpecies": "Rotom", + "forme": "Frost", + "formeLetter": "F", + "types": [ + "Electric", + "Ice" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 65, + "def": 107, + "spa": 105, + "spd": 107, + "spe": 86 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Red", + "eggGroups": [ + "Amorphous" + ] + }, + "rotomfan": { + "num": 479, + "species": "Rotom-Fan", + "baseSpecies": "Rotom", + "forme": "Fan", + "formeLetter": "S", + "types": [ + "Electric", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 65, + "def": 107, + "spa": 105, + "spd": 107, + "spe": 86 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Red", + "eggGroups": [ + "Amorphous" + ] + }, + "rotommow": { + "num": 479, + "species": "Rotom-Mow", + "baseSpecies": "Rotom", + "forme": "Mow", + "formeLetter": "C", + "types": [ + "Electric", + "Grass" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 65, + "def": 107, + "spa": 105, + "spd": 107, + "spe": 86 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Red", + "eggGroups": [ + "Amorphous" + ] + }, + "uxie": { + "num": 480, + "species": "Uxie", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 75, + "atk": 75, + "def": 130, + "spa": 75, + "spd": 130, + "spe": 95 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "mesprit": { + "num": 481, + "species": "Mesprit", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 105, + "def": 105, + "spa": 105, + "spd": 105, + "spe": 80 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Pink", + "eggGroups": [ + "Undiscovered" + ] + }, + "azelf": { + "num": 482, + "species": "Azelf", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 75, + "atk": 125, + "def": 70, + "spa": 125, + "spd": 70, + "spe": 115 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.3, + "weightkg": 0.3, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "dialga": { + "num": 483, + "species": "Dialga", + "types": [ + "Steel", + "Dragon" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 120, + "def": 120, + "spa": 150, + "spd": 100, + "spe": 90 + }, + "abilities": { + "0": "Pressure", + "H": "Telepathy" + }, + "heightm": 5.4, + "weightkg": 683, + "color": "White", + "eggGroups": [ + "Undiscovered" + ] + }, + "palkia": { + "num": 484, + "species": "Palkia", + "types": [ + "Water", + "Dragon" + ], + "gender": "N", + "baseStats": { + "hp": 90, + "atk": 120, + "def": 100, + "spa": 150, + "spd": 120, + "spe": 100 + }, + "abilities": { + "0": "Pressure", + "H": "Telepathy" + }, + "heightm": 4.2, + "weightkg": 336, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "heatran": { + "num": 485, + "species": "Heatran", + "types": [ + "Fire", + "Steel" + ], + "baseStats": { + "hp": 91, + "atk": 90, + "def": 106, + "spa": 130, + "spd": 106, + "spe": 77 + }, + "abilities": { + "0": "Flash Fire", + "H": "Flame Body" + }, + "heightm": 1.7, + "weightkg": 430, + "color": "Brown", + "eggGroups": [ + "Undiscovered" + ] + }, + "regigigas": { + "num": 486, + "species": "Regigigas", + "types": [ + "Normal" + ], + "gender": "N", + "baseStats": { + "hp": 110, + "atk": 160, + "def": 110, + "spa": 80, + "spd": 110, + "spe": 100 + }, + "abilities": { + "0": "Slow Start" + }, + "heightm": 3.7, + "weightkg": 420, + "color": "White", + "eggGroups": [ + "Undiscovered" + ] + }, + "giratina": { + "num": 487, + "species": "Giratina", + "baseForme": "Altered", + "types": [ + "Ghost", + "Dragon" + ], + "gender": "N", + "baseStats": { + "hp": 150, + "atk": 100, + "def": 120, + "spa": 100, + "spd": 120, + "spe": 90 + }, + "abilities": { + "0": "Pressure", + "H": "Telepathy" + }, + "heightm": 4.5, + "weightkg": 750, + "color": "Black", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "giratinaorigin" + ] + }, + "giratinaorigin": { + "num": 487, + "species": "Giratina-Origin", + "baseSpecies": "Giratina", + "forme": "Origin", + "formeLetter": "O", + "types": [ + "Ghost", + "Dragon" + ], + "gender": "N", + "baseStats": { + "hp": 150, + "atk": 120, + "def": 100, + "spa": 120, + "spd": 100, + "spe": 90 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 6.9, + "weightkg": 650, + "color": "Black", + "eggGroups": [ + "Undiscovered" + ] + }, + "cresselia": { + "num": 488, + "species": "Cresselia", + "types": [ + "Psychic" + ], + "gender": "F", + "baseStats": { + "hp": 120, + "atk": 70, + "def": 120, + "spa": 75, + "spd": 130, + "spe": 85 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.5, + "weightkg": 85.6, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "phione": { + "num": 489, + "species": "Phione", + "types": [ + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 80, + "def": 80, + "spa": 80, + "spd": 80, + "spe": 80 + }, + "abilities": { + "0": "Hydration" + }, + "heightm": 0.4, + "weightkg": 3.1, + "color": "Blue", + "eggGroups": [ + "Water 1", + "Fairy" + ] + }, + "manaphy": { + "num": 490, + "species": "Manaphy", + "types": [ + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 100, + "def": 100, + "spa": 100, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Hydration" + }, + "heightm": 0.3, + "weightkg": 1.4, + "color": "Blue", + "eggGroups": [ + "Water 1", + "Fairy" + ] + }, + "darkrai": { + "num": 491, + "species": "Darkrai", + "types": [ + "Dark" + ], + "gender": "N", + "baseStats": { + "hp": 70, + "atk": 90, + "def": 90, + "spa": 135, + "spd": 90, + "spe": 125 + }, + "abilities": { + "0": "Bad Dreams" + }, + "heightm": 1.5, + "weightkg": 50.5, + "color": "Black", + "eggGroups": [ + "Undiscovered" + ] + }, + "shaymin": { + "num": 492, + "species": "Shaymin", + "baseForme": "Land", + "types": [ + "Grass" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 100, + "def": 100, + "spa": 100, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Natural Cure" + }, + "heightm": 0.2, + "weightkg": 2.1, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "shayminsky" + ] + }, + "shayminsky": { + "num": 492, + "species": "Shaymin-Sky", + "baseSpecies": "Shaymin", + "forme": "Sky", + "formeLetter": "S", + "types": [ + "Grass", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 103, + "def": 75, + "spa": 120, + "spd": 75, + "spe": 127 + }, + "abilities": { + "0": "Serene Grace" + }, + "heightm": 0.4, + "weightkg": 5.2, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceus": { + "num": 493, + "species": "Arceus", + "baseForme": "Normal", + "types": [ + "Normal" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "arceusbug", + "arceusdark", + "arceusdragon", + "arceuselectric", + "arceusfairy", + "arceusfighting", + "arceusfire", + "arceusflying", + "arceusghost", + "arceusgrass", + "arceusground", + "arceusice", + "arceuspoison", + "arceuspsychic", + "arceusrock", + "arceussteel", + "arceuswater" + ] + }, + "arceusbug": { + "num": 493, + "species": "Arceus-Bug", + "baseSpecies": "Arceus", + "forme": "Bug", + "formeLetter": "B", + "types": [ + "Bug" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusdark": { + "num": 493, + "species": "Arceus-Dark", + "baseSpecies": "Arceus", + "forme": "Dark", + "formeLetter": "D", + "types": [ + "Dark" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusdragon": { + "num": 493, + "species": "Arceus-Dragon", + "baseSpecies": "Arceus", + "forme": "Dragon", + "formeLetter": "D", + "types": [ + "Dragon" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceuselectric": { + "num": 493, + "species": "Arceus-Electric", + "baseSpecies": "Arceus", + "forme": "Electric", + "formeLetter": "E", + "types": [ + "Electric" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusfairy": { + "num": 493, + "species": "Arceus-Fairy", + "baseSpecies": "Arceus", + "forme": "Fairy", + "formeLetter": "F", + "types": [ + "Fairy" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusfighting": { + "num": 493, + "species": "Arceus-Fighting", + "baseSpecies": "Arceus", + "forme": "Fighting", + "formeLetter": "F", + "types": [ + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusfire": { + "num": 493, + "species": "Arceus-Fire", + "baseSpecies": "Arceus", + "forme": "Fire", + "formeLetter": "F", + "types": [ + "Fire" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusflying": { + "num": 493, + "species": "Arceus-Flying", + "baseSpecies": "Arceus", + "forme": "Flying", + "formeLetter": "F", + "types": [ + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusghost": { + "num": 493, + "species": "Arceus-Ghost", + "baseSpecies": "Arceus", + "forme": "Ghost", + "formeLetter": "G", + "types": [ + "Ghost" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusgrass": { + "num": 493, + "species": "Arceus-Grass", + "baseSpecies": "Arceus", + "forme": "Grass", + "formeLetter": "G", + "types": [ + "Grass" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusground": { + "num": 493, + "species": "Arceus-Ground", + "baseSpecies": "Arceus", + "forme": "Ground", + "formeLetter": "G", + "types": [ + "Ground" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusice": { + "num": 493, + "species": "Arceus-Ice", + "baseSpecies": "Arceus", + "forme": "Ice", + "formeLetter": "I", + "types": [ + "Ice" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceuspoison": { + "num": 493, + "species": "Arceus-Poison", + "baseSpecies": "Arceus", + "forme": "Poison", + "formeLetter": "P", + "types": [ + "Poison" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceuspsychic": { + "num": 493, + "species": "Arceus-Psychic", + "baseSpecies": "Arceus", + "forme": "Psychic", + "formeLetter": "P", + "types": [ + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceusrock": { + "num": 493, + "species": "Arceus-Rock", + "baseSpecies": "Arceus", + "forme": "Rock", + "formeLetter": "R", + "types": [ + "Rock" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceussteel": { + "num": 493, + "species": "Arceus-Steel", + "baseSpecies": "Arceus", + "forme": "Steel", + "formeLetter": "S", + "types": [ + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arceuswater": { + "num": 493, + "species": "Arceus-Water", + "baseSpecies": "Arceus", + "forme": "Water", + "formeLetter": "W", + "types": [ + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 120, + "atk": 120, + "def": 120, + "spa": 120, + "spd": 120, + "spe": 120 + }, + "abilities": { + "0": "Multitype" + }, + "heightm": 3.2, + "weightkg": 320, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "victini": { + "num": 494, + "species": "Victini", + "types": [ + "Psychic", + "Fire" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 100, + "def": 100, + "spa": 100, + "spd": 100, + "spe": 100 + }, + "abilities": { + "0": "Victory Star" + }, + "heightm": 0.4, + "weightkg": 4, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "snivy": { + "num": 495, + "species": "Snivy", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 45, + "atk": 45, + "def": 55, + "spa": 45, + "spd": 55, + "spe": 63 + }, + "abilities": { + "0": "Overgrow", + "H": "Contrary" + }, + "heightm": 0.6, + "weightkg": 8.1, + "color": "Green", + "evos": [ + "servine" + ], + "eggGroups": [ + "Field", + "Grass" + ] + }, + "servine": { + "num": 496, + "species": "Servine", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 60, + "atk": 60, + "def": 75, + "spa": 60, + "spd": 75, + "spe": 83 + }, + "abilities": { + "0": "Overgrow", + "H": "Contrary" + }, + "heightm": 0.8, + "weightkg": 16, + "color": "Green", + "prevo": "snivy", + "evos": [ + "serperior" + ], + "evoLevel": 17, + "eggGroups": [ + "Field", + "Grass" + ] + }, + "serperior": { + "num": 497, + "species": "Serperior", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 75, + "def": 95, + "spa": 75, + "spd": 95, + "spe": 113 + }, + "abilities": { + "0": "Overgrow", + "H": "Contrary" + }, + "heightm": 3.3, + "weightkg": 63, + "color": "Green", + "prevo": "servine", + "evoLevel": 36, + "eggGroups": [ + "Field", + "Grass" + ] + }, + "tepig": { + "num": 498, + "species": "Tepig", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 65, + "atk": 63, + "def": 45, + "spa": 45, + "spd": 45, + "spe": 45 + }, + "abilities": { + "0": "Blaze", + "H": "Thick Fat" + }, + "heightm": 0.5, + "weightkg": 9.9, + "color": "Red", + "evos": [ + "pignite" + ], + "eggGroups": [ + "Field" + ] + }, + "pignite": { + "num": 499, + "species": "Pignite", + "types": [ + "Fire", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 90, + "atk": 93, + "def": 55, + "spa": 70, + "spd": 55, + "spe": 55 + }, + "abilities": { + "0": "Blaze", + "H": "Thick Fat" + }, + "heightm": 1, + "weightkg": 55.5, + "color": "Red", + "prevo": "tepig", + "evos": [ + "emboar" + ], + "evoLevel": 17, + "eggGroups": [ + "Field" + ] + }, + "emboar": { + "num": 500, + "species": "Emboar", + "types": [ + "Fire", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 110, + "atk": 123, + "def": 65, + "spa": 100, + "spd": 65, + "spe": 65 + }, + "abilities": { + "0": "Blaze", + "H": "Reckless" + }, + "heightm": 1.6, + "weightkg": 150, + "color": "Red", + "prevo": "pignite", + "evoLevel": 36, + "eggGroups": [ + "Field" + ] + }, + "oshawott": { + "num": 501, + "species": "Oshawott", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 55, + "atk": 55, + "def": 45, + "spa": 63, + "spd": 45, + "spe": 45 + }, + "abilities": { + "0": "Torrent", + "H": "Shell Armor" + }, + "heightm": 0.5, + "weightkg": 5.9, + "color": "Blue", + "evos": [ + "dewott" + ], + "eggGroups": [ + "Field" + ] + }, + "dewott": { + "num": 502, + "species": "Dewott", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 75, + "def": 60, + "spa": 83, + "spd": 60, + "spe": 60 + }, + "abilities": { + "0": "Torrent", + "H": "Shell Armor" + }, + "heightm": 0.8, + "weightkg": 24.5, + "color": "Blue", + "prevo": "oshawott", + "evos": [ + "samurott" + ], + "evoLevel": 17, + "eggGroups": [ + "Field" + ] + }, + "samurott": { + "num": 503, + "species": "Samurott", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 95, + "atk": 100, + "def": 85, + "spa": 108, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Torrent", + "H": "Shell Armor" + }, + "heightm": 1.5, + "weightkg": 94.6, + "color": "Blue", + "prevo": "dewott", + "evoLevel": 36, + "eggGroups": [ + "Field" + ] + }, + "patrat": { + "num": 504, + "species": "Patrat", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 45, + "atk": 55, + "def": 39, + "spa": 35, + "spd": 39, + "spe": 42 + }, + "abilities": { + "0": "Run Away", + "1": "Keen Eye", + "H": "Analytic" + }, + "heightm": 0.5, + "weightkg": 11.6, + "color": "Brown", + "evos": [ + "watchog" + ], + "eggGroups": [ + "Field" + ] + }, + "watchog": { + "num": 505, + "species": "Watchog", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 60, + "atk": 85, + "def": 69, + "spa": 60, + "spd": 69, + "spe": 77 + }, + "abilities": { + "0": "Illuminate", + "1": "Keen Eye", + "H": "Analytic" + }, + "heightm": 1.1, + "weightkg": 27, + "color": "Brown", + "prevo": "patrat", + "evoLevel": 20, + "eggGroups": [ + "Field" + ] + }, + "lillipup": { + "num": 506, + "species": "Lillipup", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 45, + "atk": 60, + "def": 45, + "spa": 25, + "spd": 45, + "spe": 55 + }, + "abilities": { + "0": "Vital Spirit", + "1": "Pickup", + "H": "Run Away" + }, + "heightm": 0.4, + "weightkg": 4.1, + "color": "Brown", + "evos": [ + "herdier" + ], + "eggGroups": [ + "Field" + ] + }, + "herdier": { + "num": 507, + "species": "Herdier", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 65, + "atk": 80, + "def": 65, + "spa": 35, + "spd": 65, + "spe": 60 + }, + "abilities": { + "0": "Intimidate", + "1": "Sand Rush", + "H": "Scrappy" + }, + "heightm": 0.9, + "weightkg": 14.7, + "color": "Gray", + "prevo": "lillipup", + "evos": [ + "stoutland" + ], + "evoLevel": 16, + "eggGroups": [ + "Field" + ] + }, + "stoutland": { + "num": 508, + "species": "Stoutland", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 85, + "atk": 110, + "def": 90, + "spa": 45, + "spd": 90, + "spe": 80 + }, + "abilities": { + "0": "Intimidate", + "1": "Sand Rush", + "H": "Scrappy" + }, + "heightm": 1.2, + "weightkg": 61, + "color": "Gray", + "prevo": "herdier", + "evoLevel": 32, + "eggGroups": [ + "Field" + ] + }, + "purrloin": { + "num": 509, + "species": "Purrloin", + "types": [ + "Dark" + ], + "baseStats": { + "hp": 41, + "atk": 50, + "def": 37, + "spa": 50, + "spd": 37, + "spe": 66 + }, + "abilities": { + "0": "Limber", + "1": "Unburden", + "H": "Prankster" + }, + "heightm": 0.4, + "weightkg": 10.1, + "color": "Purple", + "evos": [ + "liepard" + ], + "eggGroups": [ + "Field" + ] + }, + "liepard": { + "num": 510, + "species": "Liepard", + "types": [ + "Dark" + ], + "baseStats": { + "hp": 64, + "atk": 88, + "def": 50, + "spa": 88, + "spd": 50, + "spe": 106 + }, + "abilities": { + "0": "Limber", + "1": "Unburden", + "H": "Prankster" + }, + "heightm": 1.1, + "weightkg": 37.5, + "color": "Purple", + "prevo": "purrloin", + "evoLevel": 20, + "eggGroups": [ + "Field" + ] + }, + "pansage": { + "num": 511, + "species": "Pansage", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 50, + "atk": 53, + "def": 48, + "spa": 53, + "spd": 48, + "spe": 64 + }, + "abilities": { + "0": "Gluttony", + "H": "Overgrow" + }, + "heightm": 0.6, + "weightkg": 10.5, + "color": "Green", + "evos": [ + "simisage" + ], + "eggGroups": [ + "Field" + ] + }, + "simisage": { + "num": 512, + "species": "Simisage", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 98, + "def": 63, + "spa": 98, + "spd": 63, + "spe": 101 + }, + "abilities": { + "0": "Gluttony", + "H": "Overgrow" + }, + "heightm": 1.1, + "weightkg": 30.5, + "color": "Green", + "prevo": "pansage", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "pansear": { + "num": 513, + "species": "Pansear", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 50, + "atk": 53, + "def": 48, + "spa": 53, + "spd": 48, + "spe": 64 + }, + "abilities": { + "0": "Gluttony", + "H": "Blaze" + }, + "heightm": 0.6, + "weightkg": 11, + "color": "Red", + "evos": [ + "simisear" + ], + "eggGroups": [ + "Field" + ] + }, + "simisear": { + "num": 514, + "species": "Simisear", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 98, + "def": 63, + "spa": 98, + "spd": 63, + "spe": 101 + }, + "abilities": { + "0": "Gluttony", + "H": "Blaze" + }, + "heightm": 1, + "weightkg": 28, + "color": "Red", + "prevo": "pansear", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "panpour": { + "num": 515, + "species": "Panpour", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 50, + "atk": 53, + "def": 48, + "spa": 53, + "spd": 48, + "spe": 64 + }, + "abilities": { + "0": "Gluttony", + "H": "Torrent" + }, + "heightm": 0.6, + "weightkg": 13.5, + "color": "Blue", + "evos": [ + "simipour" + ], + "eggGroups": [ + "Field" + ] + }, + "simipour": { + "num": 516, + "species": "Simipour", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 98, + "def": 63, + "spa": 98, + "spd": 63, + "spe": 101 + }, + "abilities": { + "0": "Gluttony", + "H": "Torrent" + }, + "heightm": 1, + "weightkg": 29, + "color": "Blue", + "prevo": "panpour", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "munna": { + "num": 517, + "species": "Munna", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 76, + "atk": 25, + "def": 45, + "spa": 67, + "spd": 55, + "spe": 24 + }, + "abilities": { + "0": "Forewarn", + "1": "Synchronize", + "H": "Telepathy" + }, + "heightm": 0.6, + "weightkg": 23.3, + "color": "Pink", + "evos": [ + "musharna" + ], + "eggGroups": [ + "Field" + ] + }, + "musharna": { + "num": 518, + "species": "Musharna", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 116, + "atk": 55, + "def": 85, + "spa": 107, + "spd": 95, + "spe": 29 + }, + "abilities": { + "0": "Forewarn", + "1": "Synchronize", + "H": "Telepathy" + }, + "heightm": 1.1, + "weightkg": 60.5, + "color": "Pink", + "prevo": "munna", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "pidove": { + "num": 519, + "species": "Pidove", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 50, + "atk": 55, + "def": 50, + "spa": 36, + "spd": 30, + "spe": 43 + }, + "abilities": { + "0": "Big Pecks", + "1": "Super Luck", + "H": "Rivalry" + }, + "heightm": 0.3, + "weightkg": 2.1, + "color": "Gray", + "evos": [ + "tranquill" + ], + "eggGroups": [ + "Flying" + ] + }, + "tranquill": { + "num": 520, + "species": "Tranquill", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 62, + "atk": 77, + "def": 62, + "spa": 50, + "spd": 42, + "spe": 65 + }, + "abilities": { + "0": "Big Pecks", + "1": "Super Luck", + "H": "Rivalry" + }, + "heightm": 0.6, + "weightkg": 15, + "color": "Gray", + "prevo": "pidove", + "evos": [ + "unfezant" + ], + "evoLevel": 21, + "eggGroups": [ + "Flying" + ] + }, + "unfezant": { + "num": 521, + "species": "Unfezant", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 80, + "atk": 115, + "def": 80, + "spa": 65, + "spd": 55, + "spe": 93 + }, + "abilities": { + "0": "Big Pecks", + "1": "Super Luck", + "H": "Rivalry" + }, + "heightm": 1.2, + "weightkg": 29, + "color": "Gray", + "prevo": "tranquill", + "evoLevel": 32, + "eggGroups": [ + "Flying" + ] + }, + "blitzle": { + "num": 522, + "species": "Blitzle", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 45, + "atk": 60, + "def": 32, + "spa": 50, + "spd": 32, + "spe": 76 + }, + "abilities": { + "0": "Lightning Rod", + "1": "Motor Drive", + "H": "Sap Sipper" + }, + "heightm": 0.8, + "weightkg": 29.8, + "color": "Black", + "evos": [ + "zebstrika" + ], + "eggGroups": [ + "Field" + ] + }, + "zebstrika": { + "num": 523, + "species": "Zebstrika", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 75, + "atk": 100, + "def": 63, + "spa": 80, + "spd": 63, + "spe": 116 + }, + "abilities": { + "0": "Lightning Rod", + "1": "Motor Drive", + "H": "Sap Sipper" + }, + "heightm": 1.6, + "weightkg": 79.5, + "color": "Black", + "prevo": "blitzle", + "evoLevel": 27, + "eggGroups": [ + "Field" + ] + }, + "roggenrola": { + "num": 524, + "species": "Roggenrola", + "types": [ + "Rock" + ], + "baseStats": { + "hp": 55, + "atk": 75, + "def": 85, + "spa": 25, + "spd": 25, + "spe": 15 + }, + "abilities": { + "0": "Sturdy", + "H": "Sand Force" + }, + "heightm": 0.4, + "weightkg": 18, + "color": "Blue", + "evos": [ + "boldore" + ], + "eggGroups": [ + "Mineral" + ] + }, + "boldore": { + "num": 525, + "species": "Boldore", + "types": [ + "Rock" + ], + "baseStats": { + "hp": 70, + "atk": 105, + "def": 105, + "spa": 50, + "spd": 40, + "spe": 20 + }, + "abilities": { + "0": "Sturdy", + "H": "Sand Force" + }, + "heightm": 0.9, + "weightkg": 102, + "color": "Blue", + "prevo": "roggenrola", + "evos": [ + "gigalith" + ], + "evoLevel": 25, + "eggGroups": [ + "Mineral" + ] + }, + "gigalith": { + "num": 526, + "species": "Gigalith", + "types": [ + "Rock" + ], + "baseStats": { + "hp": 85, + "atk": 135, + "def": 130, + "spa": 60, + "spd": 80, + "spe": 25 + }, + "abilities": { + "0": "Sturdy", + "H": "Sand Force" + }, + "heightm": 1.7, + "weightkg": 260, + "color": "Blue", + "prevo": "boldore", + "evoLevel": 25, + "eggGroups": [ + "Mineral" + ] + }, + "woobat": { + "num": 527, + "species": "Woobat", + "types": [ + "Psychic", + "Flying" + ], + "baseStats": { + "hp": 55, + "atk": 45, + "def": 43, + "spa": 55, + "spd": 43, + "spe": 72 + }, + "abilities": { + "0": "Unaware", + "1": "Klutz", + "H": "Simple" + }, + "heightm": 0.4, + "weightkg": 2.1, + "color": "Blue", + "evos": [ + "swoobat" + ], + "eggGroups": [ + "Flying", + "Field" + ] + }, + "swoobat": { + "num": 528, + "species": "Swoobat", + "types": [ + "Psychic", + "Flying" + ], + "baseStats": { + "hp": 67, + "atk": 57, + "def": 55, + "spa": 77, + "spd": 55, + "spe": 114 + }, + "abilities": { + "0": "Unaware", + "1": "Klutz", + "H": "Simple" + }, + "heightm": 0.9, + "weightkg": 10.5, + "color": "Blue", + "prevo": "woobat", + "evoLevel": 2, + "eggGroups": [ + "Flying", + "Field" + ] + }, + "drilbur": { + "num": 529, + "species": "Drilbur", + "types": [ + "Ground" + ], + "baseStats": { + "hp": 60, + "atk": 85, + "def": 40, + "spa": 30, + "spd": 45, + "spe": 68 + }, + "abilities": { + "0": "Sand Rush", + "1": "Sand Force", + "H": "Mold Breaker" + }, + "heightm": 0.3, + "weightkg": 8.5, + "color": "Gray", + "evos": [ + "excadrill" + ], + "eggGroups": [ + "Field" + ] + }, + "excadrill": { + "num": 530, + "species": "Excadrill", + "types": [ + "Ground", + "Steel" + ], + "baseStats": { + "hp": 110, + "atk": 135, + "def": 60, + "spa": 50, + "spd": 65, + "spe": 88 + }, + "abilities": { + "0": "Sand Rush", + "1": "Sand Force", + "H": "Mold Breaker" + }, + "heightm": 0.7, + "weightkg": 40.4, + "color": "Gray", + "prevo": "drilbur", + "evoLevel": 31, + "eggGroups": [ + "Field" + ] + }, + "audino": { + "num": 531, + "species": "Audino", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 103, + "atk": 60, + "def": 86, + "spa": 60, + "spd": 86, + "spe": 50 + }, + "abilities": { + "0": "Healer", + "1": "Regenerator", + "H": "Klutz" + }, + "heightm": 1.1, + "weightkg": 31, + "color": "Pink", + "eggGroups": [ + "Fairy" + ], + "otherFormes": [ + "audinomega" + ] + }, + "audinomega": { + "num": 531, + "species": "Audino-Mega", + "baseSpecies": "Audino", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Normal", + "Fairy" + ], + "baseStats": { + "hp": 103, + "atk": 60, + "def": 126, + "spa": 80, + "spd": 126, + "spe": 50 + }, + "abilities": { + "0": "Healer" + }, + "heightm": 1.5, + "weightkg": 32, + "color": "Pink", + "eggGroups": [ + "Fairy" + ] + }, + "timburr": { + "num": 532, + "species": "Timburr", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 75, + "atk": 80, + "def": 55, + "spa": 25, + "spd": 35, + "spe": 35 + }, + "abilities": { + "0": "Guts", + "1": "Sheer Force", + "H": "Iron Fist" + }, + "heightm": 0.6, + "weightkg": 12.5, + "color": "Gray", + "evos": [ + "gurdurr" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "gurdurr": { + "num": 533, + "species": "Gurdurr", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 85, + "atk": 105, + "def": 85, + "spa": 40, + "spd": 50, + "spe": 40 + }, + "abilities": { + "0": "Guts", + "1": "Sheer Force", + "H": "Iron Fist" + }, + "heightm": 1.2, + "weightkg": 40, + "color": "Gray", + "prevo": "timburr", + "evos": [ + "conkeldurr" + ], + "evoLevel": 25, + "eggGroups": [ + "Human-Like" + ] + }, + "conkeldurr": { + "num": 534, + "species": "Conkeldurr", + "types": [ + "Fighting" + ], + "genderRatio": { + "M": 0.75, + "F": 0.25 + }, + "baseStats": { + "hp": 105, + "atk": 140, + "def": 95, + "spa": 55, + "spd": 65, + "spe": 45 + }, + "abilities": { + "0": "Guts", + "1": "Sheer Force", + "H": "Iron Fist" + }, + "heightm": 1.4, + "weightkg": 87, + "color": "Brown", + "prevo": "gurdurr", + "evoLevel": 25, + "eggGroups": [ + "Human-Like" + ] + }, + "tympole": { + "num": 535, + "species": "Tympole", + "types": [ + "Water" + ], + "baseStats": { + "hp": 50, + "atk": 50, + "def": 40, + "spa": 50, + "spd": 40, + "spe": 64 + }, + "abilities": { + "0": "Swift Swim", + "1": "Hydration", + "H": "Water Absorb" + }, + "heightm": 0.5, + "weightkg": 4.5, + "color": "Blue", + "evos": [ + "palpitoad" + ], + "eggGroups": [ + "Water 1" + ] + }, + "palpitoad": { + "num": 536, + "species": "Palpitoad", + "types": [ + "Water", + "Ground" + ], + "baseStats": { + "hp": 75, + "atk": 65, + "def": 55, + "spa": 65, + "spd": 55, + "spe": 69 + }, + "abilities": { + "0": "Swift Swim", + "1": "Hydration", + "H": "Water Absorb" + }, + "heightm": 0.8, + "weightkg": 17, + "color": "Blue", + "prevo": "tympole", + "evos": [ + "seismitoad" + ], + "evoLevel": 25, + "eggGroups": [ + "Water 1" + ] + }, + "seismitoad": { + "num": 537, + "species": "Seismitoad", + "types": [ + "Water", + "Ground" + ], + "baseStats": { + "hp": 105, + "atk": 95, + "def": 75, + "spa": 85, + "spd": 75, + "spe": 74 + }, + "abilities": { + "0": "Swift Swim", + "1": "Poison Touch", + "H": "Water Absorb" + }, + "heightm": 1.5, + "weightkg": 62, + "color": "Blue", + "prevo": "palpitoad", + "evoLevel": 36, + "eggGroups": [ + "Water 1" + ] + }, + "throh": { + "num": 538, + "species": "Throh", + "types": [ + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 120, + "atk": 100, + "def": 85, + "spa": 30, + "spd": 85, + "spe": 45 + }, + "abilities": { + "0": "Guts", + "1": "Inner Focus", + "H": "Mold Breaker" + }, + "heightm": 1.3, + "weightkg": 55.5, + "color": "Red", + "eggGroups": [ + "Human-Like" + ] + }, + "sawk": { + "num": 539, + "species": "Sawk", + "types": [ + "Fighting" + ], + "gender": "M", + "baseStats": { + "hp": 75, + "atk": 125, + "def": 75, + "spa": 30, + "spd": 75, + "spe": 85 + }, + "abilities": { + "0": "Sturdy", + "1": "Inner Focus", + "H": "Mold Breaker" + }, + "heightm": 1.4, + "weightkg": 51, + "color": "Blue", + "eggGroups": [ + "Human-Like" + ] + }, + "sewaddle": { + "num": 540, + "species": "Sewaddle", + "types": [ + "Bug", + "Grass" + ], + "baseStats": { + "hp": 45, + "atk": 53, + "def": 70, + "spa": 40, + "spd": 60, + "spe": 42 + }, + "abilities": { + "0": "Swarm", + "1": "Chlorophyll", + "H": "Overcoat" + }, + "heightm": 0.3, + "weightkg": 2.5, + "color": "Yellow", + "evos": [ + "swadloon" + ], + "eggGroups": [ + "Bug" + ] + }, + "swadloon": { + "num": 541, + "species": "Swadloon", + "types": [ + "Bug", + "Grass" + ], + "baseStats": { + "hp": 55, + "atk": 63, + "def": 90, + "spa": 50, + "spd": 80, + "spe": 42 + }, + "abilities": { + "0": "Leaf Guard", + "1": "Chlorophyll", + "H": "Overcoat" + }, + "heightm": 0.5, + "weightkg": 7.3, + "color": "Green", + "prevo": "sewaddle", + "evos": [ + "leavanny" + ], + "evoLevel": 20, + "eggGroups": [ + "Bug" + ] + }, + "leavanny": { + "num": 542, + "species": "Leavanny", + "types": [ + "Bug", + "Grass" + ], + "baseStats": { + "hp": 75, + "atk": 103, + "def": 80, + "spa": 70, + "spd": 80, + "spe": 92 + }, + "abilities": { + "0": "Swarm", + "1": "Chlorophyll", + "H": "Overcoat" + }, + "heightm": 1.2, + "weightkg": 20.5, + "color": "Yellow", + "prevo": "swadloon", + "evoLevel": 21, + "eggGroups": [ + "Bug" + ] + }, + "venipede": { + "num": 543, + "species": "Venipede", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 30, + "atk": 45, + "def": 59, + "spa": 30, + "spd": 39, + "spe": 57 + }, + "abilities": { + "0": "Poison Point", + "1": "Swarm", + "H": "Speed Boost" + }, + "heightm": 0.4, + "weightkg": 5.3, + "color": "Red", + "evos": [ + "whirlipede" + ], + "eggGroups": [ + "Bug" + ] + }, + "whirlipede": { + "num": 544, + "species": "Whirlipede", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 40, + "atk": 55, + "def": 99, + "spa": 40, + "spd": 79, + "spe": 47 + }, + "abilities": { + "0": "Poison Point", + "1": "Swarm", + "H": "Speed Boost" + }, + "heightm": 1.2, + "weightkg": 58.5, + "color": "Gray", + "prevo": "venipede", + "evos": [ + "scolipede" + ], + "evoLevel": 22, + "eggGroups": [ + "Bug" + ] + }, + "scolipede": { + "num": 545, + "species": "Scolipede", + "types": [ + "Bug", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 100, + "def": 89, + "spa": 55, + "spd": 69, + "spe": 112 + }, + "abilities": { + "0": "Poison Point", + "1": "Swarm", + "H": "Speed Boost" + }, + "heightm": 2.5, + "weightkg": 200.5, + "color": "Red", + "prevo": "whirlipede", + "evoLevel": 30, + "eggGroups": [ + "Bug" + ] + }, + "cottonee": { + "num": 546, + "species": "Cottonee", + "types": [ + "Grass", + "Fairy" + ], + "baseStats": { + "hp": 40, + "atk": 27, + "def": 60, + "spa": 37, + "spd": 50, + "spe": 66 + }, + "abilities": { + "0": "Prankster", + "1": "Infiltrator", + "H": "Chlorophyll" + }, + "heightm": 0.3, + "weightkg": 0.6, + "color": "Green", + "evos": [ + "whimsicott" + ], + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "whimsicott": { + "num": 547, + "species": "Whimsicott", + "types": [ + "Grass", + "Fairy" + ], + "baseStats": { + "hp": 60, + "atk": 67, + "def": 85, + "spa": 77, + "spd": 75, + "spe": 116 + }, + "abilities": { + "0": "Prankster", + "1": "Infiltrator", + "H": "Chlorophyll" + }, + "heightm": 0.7, + "weightkg": 6.6, + "color": "Green", + "prevo": "cottonee", + "evoLevel": 1, + "eggGroups": [ + "Fairy", + "Grass" + ] + }, + "petilil": { + "num": 548, + "species": "Petilil", + "types": [ + "Grass" + ], + "gender": "F", + "baseStats": { + "hp": 45, + "atk": 35, + "def": 50, + "spa": 70, + "spd": 50, + "spe": 30 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Own Tempo", + "H": "Leaf Guard" + }, + "heightm": 0.5, + "weightkg": 6.6, + "color": "Green", + "evos": [ + "lilligant" + ], + "eggGroups": [ + "Grass" + ] + }, + "lilligant": { + "num": 549, + "species": "Lilligant", + "types": [ + "Grass" + ], + "gender": "F", + "baseStats": { + "hp": 70, + "atk": 60, + "def": 75, + "spa": 110, + "spd": 75, + "spe": 90 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Own Tempo", + "H": "Leaf Guard" + }, + "heightm": 1.1, + "weightkg": 16.3, + "color": "Green", + "prevo": "petilil", + "evoLevel": 1, + "eggGroups": [ + "Grass" + ] + }, + "basculin": { + "num": 550, + "species": "Basculin", + "baseForme": "Red-Striped", + "types": [ + "Water" + ], + "baseStats": { + "hp": 70, + "atk": 92, + "def": 65, + "spa": 80, + "spd": 55, + "spe": 98 + }, + "abilities": { + "0": "Reckless", + "1": "Adaptability", + "H": "Mold Breaker" + }, + "heightm": 1, + "weightkg": 18, + "color": "Green", + "eggGroups": [ + "Water 2" + ], + "otherFormes": [ + "basculinbluestriped" + ] + }, + "basculinbluestriped": { + "num": 550, + "species": "Basculin-Blue-Striped", + "baseSpecies": "Basculin", + "forme": "Blue-Striped", + "formeLetter": "B", + "types": [ + "Water" + ], + "baseStats": { + "hp": 70, + "atk": 92, + "def": 65, + "spa": 80, + "spd": 55, + "spe": 98 + }, + "abilities": { + "0": "Rock Head", + "1": "Adaptability", + "H": "Mold Breaker" + }, + "heightm": 1, + "weightkg": 18, + "color": "Green", + "eggGroups": [ + "Water 2" + ] + }, + "sandile": { + "num": 551, + "species": "Sandile", + "types": [ + "Ground", + "Dark" + ], + "baseStats": { + "hp": 50, + "atk": 72, + "def": 35, + "spa": 35, + "spd": 35, + "spe": 65 + }, + "abilities": { + "0": "Intimidate", + "1": "Moxie", + "H": "Anger Point" + }, + "heightm": 0.7, + "weightkg": 15.2, + "color": "Brown", + "evos": [ + "krokorok" + ], + "eggGroups": [ + "Field" + ] + }, + "krokorok": { + "num": 552, + "species": "Krokorok", + "types": [ + "Ground", + "Dark" + ], + "baseStats": { + "hp": 60, + "atk": 82, + "def": 45, + "spa": 45, + "spd": 45, + "spe": 74 + }, + "abilities": { + "0": "Intimidate", + "1": "Moxie", + "H": "Anger Point" + }, + "heightm": 1, + "weightkg": 33.4, + "color": "Brown", + "prevo": "sandile", + "evos": [ + "krookodile" + ], + "evoLevel": 29, + "eggGroups": [ + "Field" + ] + }, + "krookodile": { + "num": 553, + "species": "Krookodile", + "types": [ + "Ground", + "Dark" + ], + "baseStats": { + "hp": 95, + "atk": 117, + "def": 80, + "spa": 65, + "spd": 70, + "spe": 92 + }, + "abilities": { + "0": "Intimidate", + "1": "Moxie", + "H": "Anger Point" + }, + "heightm": 1.5, + "weightkg": 96.3, + "color": "Red", + "prevo": "krokorok", + "evoLevel": 40, + "eggGroups": [ + "Field" + ] + }, + "darumaka": { + "num": 554, + "species": "Darumaka", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 70, + "atk": 90, + "def": 45, + "spa": 15, + "spd": 45, + "spe": 50 + }, + "abilities": { + "0": "Hustle", + "H": "Inner Focus" + }, + "heightm": 0.6, + "weightkg": 37.5, + "color": "Red", + "evos": [ + "darmanitan" + ], + "eggGroups": [ + "Field" + ] + }, + "darmanitan": { + "num": 555, + "species": "Darmanitan", + "baseForme": "Standard", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 105, + "atk": 140, + "def": 55, + "spa": 30, + "spd": 55, + "spe": 95 + }, + "abilities": { + "0": "Sheer Force", + "H": "Zen Mode" + }, + "heightm": 1.3, + "weightkg": 92.9, + "color": "Red", + "prevo": "darumaka", + "evoLevel": 35, + "eggGroups": [ + "Field" + ], + "otherFormes": [ + "darmanitanzen" + ] + }, + "darmanitanzen": { + "num": 555, + "species": "Darmanitan-Zen", + "baseSpecies": "Darmanitan", + "forme": "Zen", + "formeLetter": "Z", + "types": [ + "Fire", + "Psychic" + ], + "baseStats": { + "hp": 105, + "atk": 30, + "def": 105, + "spa": 140, + "spd": 105, + "spe": 55 + }, + "abilities": { + "0": "Zen Mode" + }, + "heightm": 1.3, + "weightkg": 92.9, + "color": "Red", + "prevo": "darumaka", + "evoLevel": 35, + "eggGroups": [ + "Field" + ] + }, + "maractus": { + "num": 556, + "species": "Maractus", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 75, + "atk": 86, + "def": 67, + "spa": 106, + "spd": 67, + "spe": 60 + }, + "abilities": { + "0": "Water Absorb", + "1": "Chlorophyll", + "H": "Storm Drain" + }, + "heightm": 1, + "weightkg": 28, + "color": "Green", + "eggGroups": [ + "Grass" + ] + }, + "dwebble": { + "num": 557, + "species": "Dwebble", + "types": [ + "Bug", + "Rock" + ], + "baseStats": { + "hp": 50, + "atk": 65, + "def": 85, + "spa": 35, + "spd": 35, + "spe": 55 + }, + "abilities": { + "0": "Sturdy", + "1": "Shell Armor", + "H": "Weak Armor" + }, + "heightm": 0.3, + "weightkg": 14.5, + "color": "Red", + "evos": [ + "crustle" + ], + "eggGroups": [ + "Bug", + "Mineral" + ] + }, + "crustle": { + "num": 558, + "species": "Crustle", + "types": [ + "Bug", + "Rock" + ], + "baseStats": { + "hp": 70, + "atk": 95, + "def": 125, + "spa": 65, + "spd": 75, + "spe": 45 + }, + "abilities": { + "0": "Sturdy", + "1": "Shell Armor", + "H": "Weak Armor" + }, + "heightm": 1.4, + "weightkg": 200, + "color": "Red", + "prevo": "dwebble", + "evoLevel": 34, + "eggGroups": [ + "Bug", + "Mineral" + ] + }, + "scraggy": { + "num": 559, + "species": "Scraggy", + "types": [ + "Dark", + "Fighting" + ], + "baseStats": { + "hp": 50, + "atk": 75, + "def": 70, + "spa": 35, + "spd": 70, + "spe": 48 + }, + "abilities": { + "0": "Shed Skin", + "1": "Moxie", + "H": "Intimidate" + }, + "heightm": 0.6, + "weightkg": 11.8, + "color": "Yellow", + "evos": [ + "scrafty" + ], + "eggGroups": [ + "Field", + "Dragon" + ] + }, + "scrafty": { + "num": 560, + "species": "Scrafty", + "types": [ + "Dark", + "Fighting" + ], + "baseStats": { + "hp": 65, + "atk": 90, + "def": 115, + "spa": 45, + "spd": 115, + "spe": 58 + }, + "abilities": { + "0": "Shed Skin", + "1": "Moxie", + "H": "Intimidate" + }, + "heightm": 1.1, + "weightkg": 30, + "color": "Red", + "prevo": "scraggy", + "evoLevel": 39, + "eggGroups": [ + "Field", + "Dragon" + ] + }, + "sigilyph": { + "num": 561, + "species": "Sigilyph", + "types": [ + "Psychic", + "Flying" + ], + "baseStats": { + "hp": 72, + "atk": 58, + "def": 80, + "spa": 103, + "spd": 80, + "spe": 97 + }, + "abilities": { + "0": "Wonder Skin", + "1": "Magic Guard", + "H": "Tinted Lens" + }, + "heightm": 1.4, + "weightkg": 14, + "color": "Black", + "eggGroups": [ + "Flying" + ] + }, + "yamask": { + "num": 562, + "species": "Yamask", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 38, + "atk": 30, + "def": 85, + "spa": 55, + "spd": 65, + "spe": 30 + }, + "abilities": { + "0": "Mummy" + }, + "heightm": 0.5, + "weightkg": 1.5, + "color": "Black", + "evos": [ + "cofagrigus" + ], + "eggGroups": [ + "Mineral", + "Amorphous" + ] + }, + "cofagrigus": { + "num": 563, + "species": "Cofagrigus", + "types": [ + "Ghost" + ], + "baseStats": { + "hp": 58, + "atk": 50, + "def": 145, + "spa": 95, + "spd": 105, + "spe": 30 + }, + "abilities": { + "0": "Mummy" + }, + "heightm": 1.7, + "weightkg": 76.5, + "color": "Yellow", + "prevo": "yamask", + "evoLevel": 34, + "eggGroups": [ + "Mineral", + "Amorphous" + ] + }, + "tirtouga": { + "num": 564, + "species": "Tirtouga", + "types": [ + "Water", + "Rock" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 54, + "atk": 78, + "def": 103, + "spa": 53, + "spd": 45, + "spe": 22 + }, + "abilities": { + "0": "Solid Rock", + "1": "Sturdy", + "H": "Swift Swim" + }, + "heightm": 0.7, + "weightkg": 16.5, + "color": "Blue", + "evos": [ + "carracosta" + ], + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "carracosta": { + "num": 565, + "species": "Carracosta", + "types": [ + "Water", + "Rock" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 74, + "atk": 108, + "def": 133, + "spa": 83, + "spd": 65, + "spe": 32 + }, + "abilities": { + "0": "Solid Rock", + "1": "Sturdy", + "H": "Swift Swim" + }, + "heightm": 1.2, + "weightkg": 81, + "color": "Blue", + "prevo": "tirtouga", + "evoLevel": 37, + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "archen": { + "num": 566, + "species": "Archen", + "types": [ + "Rock", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 55, + "atk": 112, + "def": 45, + "spa": 74, + "spd": 45, + "spe": 70 + }, + "abilities": { + "0": "Defeatist" + }, + "heightm": 0.5, + "weightkg": 9.5, + "color": "Yellow", + "evos": [ + "archeops" + ], + "eggGroups": [ + "Flying", + "Water 3" + ] + }, + "archeops": { + "num": 567, + "species": "Archeops", + "types": [ + "Rock", + "Flying" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 140, + "def": 65, + "spa": 112, + "spd": 65, + "spe": 110 + }, + "abilities": { + "0": "Defeatist" + }, + "heightm": 1.4, + "weightkg": 32, + "color": "Yellow", + "prevo": "archen", + "evoLevel": 37, + "eggGroups": [ + "Flying", + "Water 3" + ] + }, + "trubbish": { + "num": 568, + "species": "Trubbish", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 50, + "atk": 50, + "def": 62, + "spa": 40, + "spd": 62, + "spe": 65 + }, + "abilities": { + "0": "Stench", + "1": "Sticky Hold", + "H": "Aftermath" + }, + "heightm": 0.6, + "weightkg": 31, + "color": "Green", + "evos": [ + "garbodor" + ], + "eggGroups": [ + "Mineral" + ] + }, + "garbodor": { + "num": 569, + "species": "Garbodor", + "types": [ + "Poison" + ], + "baseStats": { + "hp": 80, + "atk": 95, + "def": 82, + "spa": 60, + "spd": 82, + "spe": 75 + }, + "abilities": { + "0": "Stench", + "1": "Weak Armor", + "H": "Aftermath" + }, + "heightm": 1.9, + "weightkg": 107.3, + "color": "Green", + "prevo": "trubbish", + "evoLevel": 36, + "eggGroups": [ + "Mineral" + ] + }, + "zorua": { + "num": 570, + "species": "Zorua", + "types": [ + "Dark" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 40, + "atk": 65, + "def": 40, + "spa": 80, + "spd": 40, + "spe": 65 + }, + "abilities": { + "0": "Illusion" + }, + "heightm": 0.7, + "weightkg": 12.5, + "color": "Gray", + "evos": [ + "zoroark" + ], + "eggGroups": [ + "Field" + ] + }, + "zoroark": { + "num": 571, + "species": "Zoroark", + "types": [ + "Dark" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 60, + "atk": 105, + "def": 60, + "spa": 120, + "spd": 60, + "spe": 105 + }, + "abilities": { + "0": "Illusion" + }, + "heightm": 1.6, + "weightkg": 81.1, + "color": "Gray", + "prevo": "zorua", + "evoLevel": 30, + "eggGroups": [ + "Field" + ] + }, + "minccino": { + "num": 572, + "species": "Minccino", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 55, + "atk": 50, + "def": 40, + "spa": 40, + "spd": 40, + "spe": 75 + }, + "abilities": { + "0": "Cute Charm", + "1": "Technician", + "H": "Skill Link" + }, + "heightm": 0.4, + "weightkg": 5.8, + "color": "Gray", + "evos": [ + "cinccino" + ], + "eggGroups": [ + "Field" + ] + }, + "cinccino": { + "num": 573, + "species": "Cinccino", + "types": [ + "Normal" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 75, + "atk": 95, + "def": 60, + "spa": 65, + "spd": 60, + "spe": 115 + }, + "abilities": { + "0": "Cute Charm", + "1": "Technician", + "H": "Skill Link" + }, + "heightm": 0.5, + "weightkg": 7.5, + "color": "Gray", + "prevo": "minccino", + "evoLevel": 1, + "eggGroups": [ + "Field" + ] + }, + "gothita": { + "num": 574, + "species": "Gothita", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 45, + "atk": 30, + "def": 50, + "spa": 55, + "spd": 65, + "spe": 45 + }, + "abilities": { + "0": "Frisk", + "1": "Competitive", + "H": "Shadow Tag" + }, + "heightm": 0.4, + "weightkg": 5.8, + "color": "Purple", + "evos": [ + "gothorita" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "gothorita": { + "num": 575, + "species": "Gothorita", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 60, + "atk": 45, + "def": 70, + "spa": 75, + "spd": 85, + "spe": 55 + }, + "abilities": { + "0": "Frisk", + "1": "Competitive", + "H": "Shadow Tag" + }, + "heightm": 0.7, + "weightkg": 18, + "color": "Purple", + "prevo": "gothita", + "evos": [ + "gothitelle" + ], + "evoLevel": 32, + "eggGroups": [ + "Human-Like" + ] + }, + "gothitelle": { + "num": 576, + "species": "Gothitelle", + "types": [ + "Psychic" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 70, + "atk": 55, + "def": 95, + "spa": 95, + "spd": 110, + "spe": 65 + }, + "abilities": { + "0": "Frisk", + "1": "Competitive", + "H": "Shadow Tag" + }, + "heightm": 1.5, + "weightkg": 44, + "color": "Purple", + "prevo": "gothorita", + "evoLevel": 41, + "eggGroups": [ + "Human-Like" + ] + }, + "solosis": { + "num": 577, + "species": "Solosis", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 45, + "atk": 30, + "def": 40, + "spa": 105, + "spd": 50, + "spe": 20 + }, + "abilities": { + "0": "Overcoat", + "1": "Magic Guard", + "H": "Regenerator" + }, + "heightm": 0.3, + "weightkg": 1, + "color": "Green", + "evos": [ + "duosion" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "duosion": { + "num": 578, + "species": "Duosion", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 65, + "atk": 40, + "def": 50, + "spa": 125, + "spd": 60, + "spe": 30 + }, + "abilities": { + "0": "Overcoat", + "1": "Magic Guard", + "H": "Regenerator" + }, + "heightm": 0.6, + "weightkg": 8, + "color": "Green", + "prevo": "solosis", + "evos": [ + "reuniclus" + ], + "evoLevel": 32, + "eggGroups": [ + "Amorphous" + ] + }, + "reuniclus": { + "num": 579, + "species": "Reuniclus", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 110, + "atk": 65, + "def": 75, + "spa": 125, + "spd": 85, + "spe": 30 + }, + "abilities": { + "0": "Overcoat", + "1": "Magic Guard", + "H": "Regenerator" + }, + "heightm": 1, + "weightkg": 20.1, + "color": "Green", + "prevo": "duosion", + "evoLevel": 41, + "eggGroups": [ + "Amorphous" + ] + }, + "ducklett": { + "num": 580, + "species": "Ducklett", + "types": [ + "Water", + "Flying" + ], + "baseStats": { + "hp": 62, + "atk": 44, + "def": 50, + "spa": 44, + "spd": 50, + "spe": 55 + }, + "abilities": { + "0": "Keen Eye", + "1": "Big Pecks", + "H": "Hydration" + }, + "heightm": 0.5, + "weightkg": 5.5, + "color": "Blue", + "evos": [ + "swanna" + ], + "eggGroups": [ + "Water 1", + "Flying" + ] + }, + "swanna": { + "num": 581, + "species": "Swanna", + "types": [ + "Water", + "Flying" + ], + "baseStats": { + "hp": 75, + "atk": 87, + "def": 63, + "spa": 87, + "spd": 63, + "spe": 98 + }, + "abilities": { + "0": "Keen Eye", + "1": "Big Pecks", + "H": "Hydration" + }, + "heightm": 1.3, + "weightkg": 24.2, + "color": "White", + "prevo": "ducklett", + "evoLevel": 35, + "eggGroups": [ + "Water 1", + "Flying" + ] + }, + "vanillite": { + "num": 582, + "species": "Vanillite", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 36, + "atk": 50, + "def": 50, + "spa": 65, + "spd": 60, + "spe": 44 + }, + "abilities": { + "0": "Ice Body", + "H": "Weak Armor" + }, + "heightm": 0.4, + "weightkg": 5.7, + "color": "White", + "evos": [ + "vanillish" + ], + "eggGroups": [ + "Mineral" + ] + }, + "vanillish": { + "num": 583, + "species": "Vanillish", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 51, + "atk": 65, + "def": 65, + "spa": 80, + "spd": 75, + "spe": 59 + }, + "abilities": { + "0": "Ice Body", + "H": "Weak Armor" + }, + "heightm": 1.1, + "weightkg": 41, + "color": "White", + "prevo": "vanillite", + "evos": [ + "vanilluxe" + ], + "evoLevel": 35, + "eggGroups": [ + "Mineral" + ] + }, + "vanilluxe": { + "num": 584, + "species": "Vanilluxe", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 71, + "atk": 95, + "def": 85, + "spa": 110, + "spd": 95, + "spe": 79 + }, + "abilities": { + "0": "Ice Body", + "H": "Weak Armor" + }, + "heightm": 1.3, + "weightkg": 57.5, + "color": "White", + "prevo": "vanillish", + "evoLevel": 47, + "eggGroups": [ + "Mineral" + ] + }, + "deerling": { + "num": 585, + "species": "Deerling", + "baseForme": "Spring", + "types": [ + "Normal", + "Grass" + ], + "baseStats": { + "hp": 60, + "atk": 60, + "def": 50, + "spa": 40, + "spd": 50, + "spe": 75 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Sap Sipper", + "H": "Serene Grace" + }, + "heightm": 0.6, + "weightkg": 19.5, + "color": "Yellow", + "evos": [ + "sawsbuck" + ], + "eggGroups": [ + "Field" + ], + "otherForms": [ + "deerlingsummer", + "deerlingautumn", + "deerlingwinter" + ] + }, + "sawsbuck": { + "num": 586, + "species": "Sawsbuck", + "baseForme": "Spring", + "types": [ + "Normal", + "Grass" + ], + "baseStats": { + "hp": 80, + "atk": 100, + "def": 70, + "spa": 60, + "spd": 70, + "spe": 95 + }, + "abilities": { + "0": "Chlorophyll", + "1": "Sap Sipper", + "H": "Serene Grace" + }, + "heightm": 1.9, + "weightkg": 92.5, + "color": "Brown", + "prevo": "deerling", + "evoLevel": 34, + "eggGroups": [ + "Field" + ], + "otherForms": [ + "sawsbucksummer", + "sawsbuckautumn", + "sawsbuckwinter" + ] + }, + "emolga": { + "num": 587, + "species": "Emolga", + "types": [ + "Electric", + "Flying" + ], + "baseStats": { + "hp": 55, + "atk": 75, + "def": 60, + "spa": 75, + "spd": 60, + "spe": 103 + }, + "abilities": { + "0": "Static", + "H": "Motor Drive" + }, + "heightm": 0.4, + "weightkg": 5, + "color": "White", + "eggGroups": [ + "Field" + ] + }, + "karrablast": { + "num": 588, + "species": "Karrablast", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 50, + "atk": 75, + "def": 45, + "spa": 40, + "spd": 45, + "spe": 60 + }, + "abilities": { + "0": "Swarm", + "1": "Shed Skin", + "H": "No Guard" + }, + "heightm": 0.5, + "weightkg": 5.9, + "color": "Blue", + "evos": [ + "escavalier" + ], + "eggGroups": [ + "Bug" + ] + }, + "escavalier": { + "num": 589, + "species": "Escavalier", + "types": [ + "Bug", + "Steel" + ], + "baseStats": { + "hp": 70, + "atk": 135, + "def": 105, + "spa": 60, + "spd": 105, + "spe": 20 + }, + "abilities": { + "0": "Swarm", + "1": "Shell Armor", + "H": "Overcoat" + }, + "heightm": 1, + "weightkg": 33, + "color": "Gray", + "prevo": "karrablast", + "evoLevel": 1, + "eggGroups": [ + "Bug" + ] + }, + "foongus": { + "num": 590, + "species": "Foongus", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 69, + "atk": 55, + "def": 45, + "spa": 55, + "spd": 55, + "spe": 15 + }, + "abilities": { + "0": "Effect Spore", + "H": "Regenerator" + }, + "heightm": 0.2, + "weightkg": 1, + "color": "White", + "evos": [ + "amoonguss" + ], + "eggGroups": [ + "Grass" + ] + }, + "amoonguss": { + "num": 591, + "species": "Amoonguss", + "types": [ + "Grass", + "Poison" + ], + "baseStats": { + "hp": 114, + "atk": 85, + "def": 70, + "spa": 85, + "spd": 80, + "spe": 30 + }, + "abilities": { + "0": "Effect Spore", + "H": "Regenerator" + }, + "heightm": 0.6, + "weightkg": 10.5, + "color": "White", + "prevo": "foongus", + "evoLevel": 39, + "eggGroups": [ + "Grass" + ] + }, + "frillish": { + "num": 592, + "species": "Frillish", + "types": [ + "Water", + "Ghost" + ], + "baseStats": { + "hp": 55, + "atk": 40, + "def": 50, + "spa": 65, + "spd": 85, + "spe": 40 + }, + "abilities": { + "0": "Water Absorb", + "1": "Cursed Body", + "H": "Damp" + }, + "heightm": 1.2, + "weightkg": 33, + "color": "White", + "evos": [ + "jellicent" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "jellicent": { + "num": 593, + "species": "Jellicent", + "types": [ + "Water", + "Ghost" + ], + "baseStats": { + "hp": 100, + "atk": 60, + "def": 70, + "spa": 85, + "spd": 105, + "spe": 60 + }, + "abilities": { + "0": "Water Absorb", + "1": "Cursed Body", + "H": "Damp" + }, + "heightm": 2.2, + "weightkg": 135, + "color": "White", + "prevo": "frillish", + "evoLevel": 40, + "eggGroups": [ + "Amorphous" + ] + }, + "alomomola": { + "num": 594, + "species": "Alomomola", + "types": [ + "Water" + ], + "baseStats": { + "hp": 165, + "atk": 75, + "def": 80, + "spa": 40, + "spd": 45, + "spe": 65 + }, + "abilities": { + "0": "Healer", + "1": "Hydration", + "H": "Regenerator" + }, + "heightm": 1.2, + "weightkg": 31.6, + "color": "Pink", + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "joltik": { + "num": 595, + "species": "Joltik", + "types": [ + "Bug", + "Electric" + ], + "baseStats": { + "hp": 50, + "atk": 47, + "def": 50, + "spa": 57, + "spd": 50, + "spe": 65 + }, + "abilities": { + "0": "Compound Eyes", + "1": "Unnerve", + "H": "Swarm" + }, + "heightm": 0.1, + "weightkg": 0.6, + "color": "Yellow", + "evos": [ + "galvantula" + ], + "eggGroups": [ + "Bug" + ] + }, + "galvantula": { + "num": 596, + "species": "Galvantula", + "types": [ + "Bug", + "Electric" + ], + "baseStats": { + "hp": 70, + "atk": 77, + "def": 60, + "spa": 97, + "spd": 60, + "spe": 108 + }, + "abilities": { + "0": "Compound Eyes", + "1": "Unnerve", + "H": "Swarm" + }, + "heightm": 0.8, + "weightkg": 14.3, + "color": "Yellow", + "prevo": "joltik", + "evoLevel": 36, + "eggGroups": [ + "Bug" + ] + }, + "ferroseed": { + "num": 597, + "species": "Ferroseed", + "types": [ + "Grass", + "Steel" + ], + "baseStats": { + "hp": 44, + "atk": 50, + "def": 91, + "spa": 24, + "spd": 86, + "spe": 10 + }, + "abilities": { + "0": "Iron Barbs" + }, + "heightm": 0.6, + "weightkg": 18.8, + "color": "Gray", + "evos": [ + "ferrothorn" + ], + "eggGroups": [ + "Grass", + "Mineral" + ] + }, + "ferrothorn": { + "num": 598, + "species": "Ferrothorn", + "types": [ + "Grass", + "Steel" + ], + "baseStats": { + "hp": 74, + "atk": 94, + "def": 131, + "spa": 54, + "spd": 116, + "spe": 20 + }, + "abilities": { + "0": "Iron Barbs", + "H": "Anticipation" + }, + "heightm": 1, + "weightkg": 110, + "color": "Gray", + "prevo": "ferroseed", + "evoLevel": 40, + "eggGroups": [ + "Grass", + "Mineral" + ] + }, + "klink": { + "num": 599, + "species": "Klink", + "types": [ + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 40, + "atk": 55, + "def": 70, + "spa": 45, + "spd": 60, + "spe": 30 + }, + "abilities": { + "0": "Plus", + "1": "Minus", + "H": "Clear Body" + }, + "heightm": 0.3, + "weightkg": 21, + "color": "Gray", + "evos": [ + "klang" + ], + "eggGroups": [ + "Mineral" + ] + }, + "klang": { + "num": 600, + "species": "Klang", + "types": [ + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 60, + "atk": 80, + "def": 95, + "spa": 70, + "spd": 85, + "spe": 50 + }, + "abilities": { + "0": "Plus", + "1": "Minus", + "H": "Clear Body" + }, + "heightm": 0.6, + "weightkg": 51, + "color": "Gray", + "prevo": "klink", + "evos": [ + "klinklang" + ], + "evoLevel": 38, + "eggGroups": [ + "Mineral" + ] + }, + "klinklang": { + "num": 601, + "species": "Klinklang", + "types": [ + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 60, + "atk": 100, + "def": 115, + "spa": 70, + "spd": 85, + "spe": 90 + }, + "abilities": { + "0": "Plus", + "1": "Minus", + "H": "Clear Body" + }, + "heightm": 0.6, + "weightkg": 81, + "color": "Gray", + "prevo": "klang", + "evoLevel": 49, + "eggGroups": [ + "Mineral" + ] + }, + "tynamo": { + "num": 602, + "species": "Tynamo", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 35, + "atk": 55, + "def": 40, + "spa": 45, + "spd": 40, + "spe": 60 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 0.2, + "weightkg": 0.3, + "color": "White", + "evos": [ + "eelektrik" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "eelektrik": { + "num": 603, + "species": "Eelektrik", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 65, + "atk": 85, + "def": 70, + "spa": 75, + "spd": 70, + "spe": 40 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.2, + "weightkg": 22, + "color": "Blue", + "prevo": "tynamo", + "evos": [ + "eelektross" + ], + "evoLevel": 39, + "eggGroups": [ + "Amorphous" + ] + }, + "eelektross": { + "num": 604, + "species": "Eelektross", + "types": [ + "Electric" + ], + "baseStats": { + "hp": 85, + "atk": 115, + "def": 80, + "spa": 105, + "spd": 80, + "spe": 50 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 2.1, + "weightkg": 80.5, + "color": "Blue", + "prevo": "eelektrik", + "evoLevel": 39, + "eggGroups": [ + "Amorphous" + ] + }, + "elgyem": { + "num": 605, + "species": "Elgyem", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 55, + "atk": 55, + "def": 55, + "spa": 85, + "spd": 55, + "spe": 30 + }, + "abilities": { + "0": "Telepathy", + "1": "Synchronize", + "H": "Analytic" + }, + "heightm": 0.5, + "weightkg": 9, + "color": "Blue", + "evos": [ + "beheeyem" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "beheeyem": { + "num": 606, + "species": "Beheeyem", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 75, + "atk": 75, + "def": 75, + "spa": 125, + "spd": 95, + "spe": 40 + }, + "abilities": { + "0": "Telepathy", + "1": "Synchronize", + "H": "Analytic" + }, + "heightm": 1, + "weightkg": 34.5, + "color": "Brown", + "prevo": "elgyem", + "evoLevel": 42, + "eggGroups": [ + "Human-Like" + ] + }, + "litwick": { + "num": 607, + "species": "Litwick", + "types": [ + "Ghost", + "Fire" + ], + "baseStats": { + "hp": 50, + "atk": 30, + "def": 55, + "spa": 65, + "spd": 55, + "spe": 20 + }, + "abilities": { + "0": "Flash Fire", + "1": "Flame Body", + "H": "Infiltrator" + }, + "heightm": 0.3, + "weightkg": 3.1, + "color": "White", + "evos": [ + "lampent" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "lampent": { + "num": 608, + "species": "Lampent", + "types": [ + "Ghost", + "Fire" + ], + "baseStats": { + "hp": 60, + "atk": 40, + "def": 60, + "spa": 95, + "spd": 60, + "spe": 55 + }, + "abilities": { + "0": "Flash Fire", + "1": "Flame Body", + "H": "Infiltrator" + }, + "heightm": 0.6, + "weightkg": 13, + "color": "Black", + "prevo": "litwick", + "evos": [ + "chandelure" + ], + "evoLevel": 41, + "eggGroups": [ + "Amorphous" + ] + }, + "chandelure": { + "num": 609, + "species": "Chandelure", + "types": [ + "Ghost", + "Fire" + ], + "baseStats": { + "hp": 60, + "atk": 55, + "def": 90, + "spa": 145, + "spd": 90, + "spe": 80 + }, + "abilities": { + "0": "Flash Fire", + "1": "Flame Body", + "H": "Infiltrator" + }, + "heightm": 1, + "weightkg": 34.3, + "color": "Black", + "prevo": "lampent", + "evoLevel": 41, + "eggGroups": [ + "Amorphous" + ] + }, + "axew": { + "num": 610, + "species": "Axew", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 46, + "atk": 87, + "def": 60, + "spa": 30, + "spd": 40, + "spe": 57 + }, + "abilities": { + "0": "Rivalry", + "1": "Mold Breaker", + "H": "Unnerve" + }, + "heightm": 0.6, + "weightkg": 18, + "color": "Green", + "evos": [ + "fraxure" + ], + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "fraxure": { + "num": 611, + "species": "Fraxure", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 66, + "atk": 117, + "def": 70, + "spa": 40, + "spd": 50, + "spe": 67 + }, + "abilities": { + "0": "Rivalry", + "1": "Mold Breaker", + "H": "Unnerve" + }, + "heightm": 1, + "weightkg": 36, + "color": "Green", + "prevo": "axew", + "evos": [ + "haxorus" + ], + "evoLevel": 38, + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "haxorus": { + "num": 612, + "species": "Haxorus", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 76, + "atk": 147, + "def": 90, + "spa": 60, + "spd": 70, + "spe": 97 + }, + "abilities": { + "0": "Rivalry", + "1": "Mold Breaker", + "H": "Unnerve" + }, + "heightm": 1.8, + "weightkg": 105.5, + "color": "Yellow", + "prevo": "fraxure", + "evoLevel": 48, + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "cubchoo": { + "num": 613, + "species": "Cubchoo", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 55, + "atk": 70, + "def": 40, + "spa": 60, + "spd": 40, + "spe": 40 + }, + "abilities": { + "0": "Snow Cloak", + "H": "Rattled" + }, + "heightm": 0.5, + "weightkg": 8.5, + "color": "White", + "evos": [ + "beartic" + ], + "eggGroups": [ + "Field" + ] + }, + "beartic": { + "num": 614, + "species": "Beartic", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 95, + "atk": 110, + "def": 80, + "spa": 70, + "spd": 80, + "spe": 50 + }, + "abilities": { + "0": "Snow Cloak", + "H": "Swift Swim" + }, + "heightm": 2.6, + "weightkg": 260, + "color": "White", + "prevo": "cubchoo", + "evoLevel": 37, + "eggGroups": [ + "Field" + ] + }, + "cryogonal": { + "num": 615, + "species": "Cryogonal", + "types": [ + "Ice" + ], + "gender": "N", + "baseStats": { + "hp": 70, + "atk": 50, + "def": 30, + "spa": 95, + "spd": 135, + "spe": 105 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.1, + "weightkg": 148, + "color": "Blue", + "eggGroups": [ + "Mineral" + ] + }, + "shelmet": { + "num": 616, + "species": "Shelmet", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 50, + "atk": 40, + "def": 85, + "spa": 40, + "spd": 65, + "spe": 25 + }, + "abilities": { + "0": "Hydration", + "1": "Shell Armor", + "H": "Overcoat" + }, + "heightm": 0.4, + "weightkg": 7.7, + "color": "Red", + "evos": [ + "accelgor" + ], + "eggGroups": [ + "Bug" + ] + }, + "accelgor": { + "num": 617, + "species": "Accelgor", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 80, + "atk": 70, + "def": 40, + "spa": 100, + "spd": 60, + "spe": 145 + }, + "abilities": { + "0": "Hydration", + "1": "Sticky Hold", + "H": "Unburden" + }, + "heightm": 0.8, + "weightkg": 25.3, + "color": "Red", + "prevo": "shelmet", + "evoLevel": 1, + "eggGroups": [ + "Bug" + ] + }, + "stunfisk": { + "num": 618, + "species": "Stunfisk", + "types": [ + "Ground", + "Electric" + ], + "baseStats": { + "hp": 109, + "atk": 66, + "def": 84, + "spa": 81, + "spd": 99, + "spe": 32 + }, + "abilities": { + "0": "Static", + "1": "Limber", + "H": "Sand Veil" + }, + "heightm": 0.7, + "weightkg": 11, + "color": "Brown", + "eggGroups": [ + "Water 1", + "Amorphous" + ] + }, + "mienfoo": { + "num": 619, + "species": "Mienfoo", + "types": [ + "Fighting" + ], + "baseStats": { + "hp": 45, + "atk": 85, + "def": 50, + "spa": 55, + "spd": 50, + "spe": 65 + }, + "abilities": { + "0": "Inner Focus", + "1": "Regenerator", + "H": "Reckless" + }, + "heightm": 0.9, + "weightkg": 20, + "color": "Yellow", + "evos": [ + "mienshao" + ], + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "mienshao": { + "num": 620, + "species": "Mienshao", + "types": [ + "Fighting" + ], + "baseStats": { + "hp": 65, + "atk": 125, + "def": 60, + "spa": 95, + "spd": 60, + "spe": 105 + }, + "abilities": { + "0": "Inner Focus", + "1": "Regenerator", + "H": "Reckless" + }, + "heightm": 1.4, + "weightkg": 35.5, + "color": "Purple", + "prevo": "mienfoo", + "evoLevel": 50, + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "druddigon": { + "num": 621, + "species": "Druddigon", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 77, + "atk": 120, + "def": 90, + "spa": 60, + "spd": 90, + "spe": 48 + }, + "abilities": { + "0": "Rough Skin", + "1": "Sheer Force", + "H": "Mold Breaker" + }, + "heightm": 1.6, + "weightkg": 139, + "color": "Red", + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "golett": { + "num": 622, + "species": "Golett", + "types": [ + "Ground", + "Ghost" + ], + "gender": "N", + "baseStats": { + "hp": 59, + "atk": 74, + "def": 50, + "spa": 35, + "spd": 50, + "spe": 35 + }, + "abilities": { + "0": "Iron Fist", + "1": "Klutz", + "H": "No Guard" + }, + "heightm": 1, + "weightkg": 92, + "color": "Green", + "evos": [ + "golurk" + ], + "eggGroups": [ + "Mineral" + ] + }, + "golurk": { + "num": 623, + "species": "Golurk", + "types": [ + "Ground", + "Ghost" + ], + "gender": "N", + "baseStats": { + "hp": 89, + "atk": 124, + "def": 80, + "spa": 55, + "spd": 80, + "spe": 55 + }, + "abilities": { + "0": "Iron Fist", + "1": "Klutz", + "H": "No Guard" + }, + "heightm": 2.8, + "weightkg": 330, + "color": "Green", + "prevo": "golett", + "evoLevel": 43, + "eggGroups": [ + "Mineral" + ] + }, + "pawniard": { + "num": 624, + "species": "Pawniard", + "types": [ + "Dark", + "Steel" + ], + "baseStats": { + "hp": 45, + "atk": 85, + "def": 70, + "spa": 40, + "spd": 40, + "spe": 60 + }, + "abilities": { + "0": "Defiant", + "1": "Inner Focus", + "H": "Pressure" + }, + "heightm": 0.5, + "weightkg": 10.2, + "color": "Red", + "evos": [ + "bisharp" + ], + "eggGroups": [ + "Human-Like" + ] + }, + "bisharp": { + "num": 625, + "species": "Bisharp", + "types": [ + "Dark", + "Steel" + ], + "baseStats": { + "hp": 65, + "atk": 125, + "def": 100, + "spa": 60, + "spd": 70, + "spe": 70 + }, + "abilities": { + "0": "Defiant", + "1": "Inner Focus", + "H": "Pressure" + }, + "heightm": 1.6, + "weightkg": 70, + "color": "Red", + "prevo": "pawniard", + "evoLevel": 52, + "eggGroups": [ + "Human-Like" + ] + }, + "bouffalant": { + "num": 626, + "species": "Bouffalant", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 95, + "atk": 110, + "def": 95, + "spa": 40, + "spd": 95, + "spe": 55 + }, + "abilities": { + "0": "Reckless", + "1": "Sap Sipper", + "H": "Soundproof" + }, + "heightm": 1.6, + "weightkg": 94.6, + "color": "Brown", + "eggGroups": [ + "Field" + ] + }, + "rufflet": { + "num": 627, + "species": "Rufflet", + "types": [ + "Normal", + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 70, + "atk": 83, + "def": 50, + "spa": 37, + "spd": 50, + "spe": 60 + }, + "abilities": { + "0": "Keen Eye", + "1": "Sheer Force", + "H": "Hustle" + }, + "heightm": 0.5, + "weightkg": 10.5, + "color": "White", + "evos": [ + "braviary" + ], + "eggGroups": [ + "Flying" + ] + }, + "braviary": { + "num": 628, + "species": "Braviary", + "types": [ + "Normal", + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 100, + "atk": 123, + "def": 75, + "spa": 57, + "spd": 75, + "spe": 80 + }, + "abilities": { + "0": "Keen Eye", + "1": "Sheer Force", + "H": "Defiant" + }, + "heightm": 1.5, + "weightkg": 41, + "color": "Red", + "prevo": "rufflet", + "evoLevel": 54, + "eggGroups": [ + "Flying" + ] + }, + "vullaby": { + "num": 629, + "species": "Vullaby", + "types": [ + "Dark", + "Flying" + ], + "gender": "F", + "baseStats": { + "hp": 70, + "atk": 55, + "def": 75, + "spa": 45, + "spd": 65, + "spe": 60 + }, + "abilities": { + "0": "Big Pecks", + "1": "Overcoat", + "H": "Weak Armor" + }, + "heightm": 0.5, + "weightkg": 9, + "color": "Brown", + "evos": [ + "mandibuzz" + ], + "eggGroups": [ + "Flying" + ] + }, + "mandibuzz": { + "num": 630, + "species": "Mandibuzz", + "types": [ + "Dark", + "Flying" + ], + "gender": "F", + "baseStats": { + "hp": 110, + "atk": 65, + "def": 105, + "spa": 55, + "spd": 95, + "spe": 80 + }, + "abilities": { + "0": "Big Pecks", + "1": "Overcoat", + "H": "Weak Armor" + }, + "heightm": 1.2, + "weightkg": 39.5, + "color": "Brown", + "prevo": "vullaby", + "evoLevel": 54, + "eggGroups": [ + "Flying" + ] + }, + "heatmor": { + "num": 631, + "species": "Heatmor", + "types": [ + "Fire" + ], + "baseStats": { + "hp": 85, + "atk": 97, + "def": 66, + "spa": 105, + "spd": 66, + "spe": 65 + }, + "abilities": { + "0": "Gluttony", + "1": "Flash Fire", + "H": "White Smoke" + }, + "heightm": 1.4, + "weightkg": 58, + "color": "Red", + "eggGroups": [ + "Field" + ] + }, + "durant": { + "num": 632, + "species": "Durant", + "types": [ + "Bug", + "Steel" + ], + "baseStats": { + "hp": 58, + "atk": 109, + "def": 112, + "spa": 48, + "spd": 48, + "spe": 109 + }, + "abilities": { + "0": "Swarm", + "1": "Hustle", + "H": "Truant" + }, + "heightm": 0.3, + "weightkg": 33, + "color": "Gray", + "eggGroups": [ + "Bug" + ] + }, + "deino": { + "num": 633, + "species": "Deino", + "types": [ + "Dark", + "Dragon" + ], + "baseStats": { + "hp": 52, + "atk": 65, + "def": 50, + "spa": 45, + "spd": 50, + "spe": 38 + }, + "abilities": { + "0": "Hustle" + }, + "heightm": 0.8, + "weightkg": 17.3, + "color": "Blue", + "evos": [ + "zweilous" + ], + "eggGroups": [ + "Dragon" + ] + }, + "zweilous": { + "num": 634, + "species": "Zweilous", + "types": [ + "Dark", + "Dragon" + ], + "baseStats": { + "hp": 72, + "atk": 85, + "def": 70, + "spa": 65, + "spd": 70, + "spe": 58 + }, + "abilities": { + "0": "Hustle" + }, + "heightm": 1.4, + "weightkg": 50, + "color": "Blue", + "prevo": "deino", + "evos": [ + "hydreigon" + ], + "evoLevel": 50, + "eggGroups": [ + "Dragon" + ] + }, + "hydreigon": { + "num": 635, + "species": "Hydreigon", + "types": [ + "Dark", + "Dragon" + ], + "baseStats": { + "hp": 92, + "atk": 105, + "def": 90, + "spa": 125, + "spd": 90, + "spe": 98 + }, + "abilities": { + "0": "Levitate" + }, + "heightm": 1.8, + "weightkg": 160, + "color": "Blue", + "prevo": "zweilous", + "evoLevel": 64, + "eggGroups": [ + "Dragon" + ] + }, + "larvesta": { + "num": 636, + "species": "Larvesta", + "types": [ + "Bug", + "Fire" + ], + "baseStats": { + "hp": 55, + "atk": 85, + "def": 55, + "spa": 50, + "spd": 55, + "spe": 60 + }, + "abilities": { + "0": "Flame Body", + "H": "Swarm" + }, + "heightm": 1.1, + "weightkg": 28.8, + "color": "White", + "evos": [ + "volcarona" + ], + "eggGroups": [ + "Bug" + ] + }, + "volcarona": { + "num": 637, + "species": "Volcarona", + "types": [ + "Bug", + "Fire" + ], + "baseStats": { + "hp": 85, + "atk": 60, + "def": 65, + "spa": 135, + "spd": 105, + "spe": 100 + }, + "abilities": { + "0": "Flame Body", + "H": "Swarm" + }, + "heightm": 1.6, + "weightkg": 46, + "color": "White", + "prevo": "larvesta", + "evoLevel": 59, + "eggGroups": [ + "Bug" + ] + }, + "cobalion": { + "num": 638, + "species": "Cobalion", + "types": [ + "Steel", + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 91, + "atk": 90, + "def": 129, + "spa": 90, + "spd": 72, + "spe": 108 + }, + "abilities": { + "0": "Justified" + }, + "heightm": 2.1, + "weightkg": 250, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "terrakion": { + "num": 639, + "species": "Terrakion", + "types": [ + "Rock", + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 91, + "atk": 129, + "def": 90, + "spa": 72, + "spd": 90, + "spe": 108 + }, + "abilities": { + "0": "Justified" + }, + "heightm": 1.9, + "weightkg": 260, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "virizion": { + "num": 640, + "species": "Virizion", + "types": [ + "Grass", + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 91, + "atk": 90, + "def": 72, + "spa": 90, + "spd": 129, + "spe": 108 + }, + "abilities": { + "0": "Justified" + }, + "heightm": 2, + "weightkg": 200, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ] + }, + "tornadus": { + "num": 641, + "species": "Tornadus", + "baseForme": "Incarnate", + "types": [ + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 79, + "atk": 115, + "def": 70, + "spa": 125, + "spd": 80, + "spe": 111 + }, + "abilities": { + "0": "Prankster", + "H": "Defiant" + }, + "heightm": 1.5, + "weightkg": 63, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "tornadustherian" + ] + }, + "tornadustherian": { + "num": 641, + "species": "Tornadus-Therian", + "baseSpecies": "Tornadus", + "forme": "Therian", + "formeLetter": "T", + "types": [ + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 79, + "atk": 100, + "def": 80, + "spa": 110, + "spd": 90, + "spe": 121 + }, + "abilities": { + "0": "Regenerator" + }, + "heightm": 1.4, + "weightkg": 63, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ] + }, + "thundurus": { + "num": 642, + "species": "Thundurus", + "baseForme": "Incarnate", + "types": [ + "Electric", + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 79, + "atk": 115, + "def": 70, + "spa": 125, + "spd": 80, + "spe": 111 + }, + "abilities": { + "0": "Prankster", + "H": "Defiant" + }, + "heightm": 1.5, + "weightkg": 61, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "thundurustherian" + ] + }, + "thundurustherian": { + "num": 642, + "species": "Thundurus-Therian", + "baseSpecies": "Thundurus", + "forme": "Therian", + "formeLetter": "T", + "types": [ + "Electric", + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 79, + "atk": 105, + "def": 70, + "spa": 145, + "spd": 80, + "spe": 101 + }, + "abilities": { + "0": "Volt Absorb" + }, + "heightm": 3, + "weightkg": 61, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "reshiram": { + "num": 643, + "species": "Reshiram", + "types": [ + "Dragon", + "Fire" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 120, + "def": 100, + "spa": 150, + "spd": 120, + "spe": 90 + }, + "abilities": { + "0": "Turboblaze" + }, + "heightm": 3.2, + "weightkg": 330, + "color": "White", + "eggGroups": [ + "Undiscovered" + ] + }, + "zekrom": { + "num": 644, + "species": "Zekrom", + "types": [ + "Dragon", + "Electric" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 150, + "def": 120, + "spa": 120, + "spd": 100, + "spe": 90 + }, + "abilities": { + "0": "Teravolt" + }, + "heightm": 2.9, + "weightkg": 345, + "color": "Black", + "eggGroups": [ + "Undiscovered" + ] + }, + "landorus": { + "num": 645, + "species": "Landorus", + "baseForme": "Incarnate", + "types": [ + "Ground", + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 89, + "atk": 125, + "def": 90, + "spa": 115, + "spd": 80, + "spe": 101 + }, + "abilities": { + "0": "Sand Force", + "H": "Sheer Force" + }, + "heightm": 1.5, + "weightkg": 68, + "color": "Brown", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "landorustherian" + ] + }, + "landorustherian": { + "num": 645, + "species": "Landorus-Therian", + "baseSpecies": "Landorus", + "forme": "Therian", + "formeLetter": "T", + "types": [ + "Ground", + "Flying" + ], + "gender": "M", + "baseStats": { + "hp": 89, + "atk": 145, + "def": 90, + "spa": 105, + "spd": 80, + "spe": 91 + }, + "abilities": { + "0": "Intimidate" + }, + "heightm": 1.3, + "weightkg": 68, + "color": "Brown", + "eggGroups": [ + "Undiscovered" + ] + }, + "kyurem": { + "num": 646, + "species": "Kyurem", + "types": [ + "Dragon", + "Ice" + ], + "gender": "N", + "baseStats": { + "hp": 125, + "atk": 130, + "def": 90, + "spa": 130, + "spd": 90, + "spe": 95 + }, + "abilities": { + "0": "Pressure" + }, + "heightm": 3, + "weightkg": 325, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "kyuremblack", + "kyuremwhite" + ] + }, + "kyuremblack": { + "num": 646, + "species": "Kyurem-Black", + "baseSpecies": "Kyurem", + "forme": "Black", + "formeLetter": "B", + "types": [ + "Dragon", + "Ice" + ], + "gender": "N", + "baseStats": { + "hp": 125, + "atk": 170, + "def": 100, + "spa": 120, + "spd": 90, + "spe": 95 + }, + "abilities": { + "0": "Teravolt" + }, + "heightm": 3.3, + "weightkg": 325, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "kyuremwhite": { + "num": 646, + "species": "Kyurem-White", + "baseSpecies": "Kyurem", + "forme": "White", + "formeLetter": "W", + "types": [ + "Dragon", + "Ice" + ], + "gender": "N", + "baseStats": { + "hp": 125, + "atk": 120, + "def": 90, + "spa": 170, + "spd": 100, + "spe": 95 + }, + "abilities": { + "0": "Turboblaze" + }, + "heightm": 3.6, + "weightkg": 325, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "keldeo": { + "num": 647, + "species": "Keldeo", + "baseForme": "Ordinary", + "types": [ + "Water", + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 91, + "atk": 72, + "def": 90, + "spa": 129, + "spd": 90, + "spe": 108 + }, + "abilities": { + "0": "Justified" + }, + "heightm": 1.4, + "weightkg": 48.5, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "keldeoresolute" + ] + }, + "keldeoresolute": { + "num": 647, + "species": "Keldeo-Resolute", + "baseSpecies": "Keldeo", + "forme": "Resolute", + "formeLetter": "R", + "types": [ + "Water", + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 91, + "atk": 72, + "def": 90, + "spa": 129, + "spd": 90, + "spe": 108 + }, + "abilities": { + "0": "Justified" + }, + "heightm": 1.4, + "weightkg": 48.5, + "color": "Yellow", + "eggGroups": [ + "Undiscovered" + ] + }, + "meloetta": { + "num": 648, + "species": "Meloetta", + "baseForme": "Aria", + "types": [ + "Normal", + "Psychic" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 77, + "def": 77, + "spa": 128, + "spd": 128, + "spe": 90 + }, + "abilities": { + "0": "Serene Grace" + }, + "heightm": 0.6, + "weightkg": 6.5, + "color": "White", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "meloettapirouette" + ] + }, + "meloettapirouette": { + "num": 648, + "species": "Meloetta-Pirouette", + "baseSpecies": "Meloetta", + "forme": "Pirouette", + "formeLetter": "P", + "types": [ + "Normal", + "Fighting" + ], + "gender": "N", + "baseStats": { + "hp": 100, + "atk": 128, + "def": 90, + "spa": 77, + "spd": 77, + "spe": 128 + }, + "abilities": { + "0": "Serene Grace" + }, + "heightm": 0.6, + "weightkg": 6.5, + "color": "White", + "eggGroups": [ + "Undiscovered" + ] + }, + "genesect": { + "num": 649, + "species": "Genesect", + "types": [ + "Bug", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 71, + "atk": 120, + "def": 95, + "spa": 120, + "spd": 95, + "spe": 99 + }, + "abilities": { + "0": "Download" + }, + "heightm": 1.5, + "weightkg": 82.5, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "genesectdouse", + "genesectshock", + "genesectburn", + "genesectchill" + ] + }, + "genesectdouse": { + "num": 649, + "species": "Genesect-Douse", + "baseSpecies": "Genesect", + "forme": "Douse", + "formeLetter": "D", + "types": [ + "Bug", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 71, + "atk": 120, + "def": 95, + "spa": 120, + "spd": 95, + "spe": 99 + }, + "abilities": { + "0": "Download" + }, + "heightm": 1.5, + "weightkg": 82.5, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "genesectshock": { + "num": 649, + "species": "Genesect-Shock", + "baseSpecies": "Genesect", + "forme": "Shock", + "formeLetter": "S", + "types": [ + "Bug", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 71, + "atk": 120, + "def": 95, + "spa": 120, + "spd": 95, + "spe": 99 + }, + "abilities": { + "0": "Download" + }, + "heightm": 1.5, + "weightkg": 82.5, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "genesectburn": { + "num": 649, + "species": "Genesect-Burn", + "baseSpecies": "Genesect", + "forme": "Burn", + "formeLetter": "B", + "types": [ + "Bug", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 71, + "atk": 120, + "def": 95, + "spa": 120, + "spd": 95, + "spe": 99 + }, + "abilities": { + "0": "Download" + }, + "heightm": 1.5, + "weightkg": 82.5, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "genesectchill": { + "num": 649, + "species": "Genesect-Chill", + "baseSpecies": "Genesect", + "forme": "Chill", + "formeLetter": "C", + "types": [ + "Bug", + "Steel" + ], + "gender": "N", + "baseStats": { + "hp": 71, + "atk": 120, + "def": 95, + "spa": 120, + "spd": 95, + "spe": 99 + }, + "abilities": { + "0": "Download" + }, + "heightm": 1.5, + "weightkg": 82.5, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "chespin": { + "num": 650, + "species": "Chespin", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 56, + "atk": 61, + "def": 65, + "spa": 48, + "spd": 45, + "spe": 38 + }, + "abilities": { + "0": "Overgrow", + "H": "Bulletproof" + }, + "heightm": 0.4, + "weightkg": 9, + "color": "Green", + "evos": [ + "quilladin" + ], + "eggGroups": [ + "Field" + ] + }, + "quilladin": { + "num": 651, + "species": "Quilladin", + "types": [ + "Grass" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 61, + "atk": 78, + "def": 95, + "spa": 56, + "spd": 58, + "spe": 57 + }, + "abilities": { + "0": "Overgrow", + "H": "Bulletproof" + }, + "heightm": 0.7, + "weightkg": 29, + "color": "Green", + "prevo": "chespin", + "evos": [ + "chesnaught" + ], + "evoLevel": 16, + "eggGroups": [ + "Field" + ] + }, + "chesnaught": { + "num": 652, + "species": "Chesnaught", + "types": [ + "Grass", + "Fighting" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 88, + "atk": 107, + "def": 122, + "spa": 74, + "spd": 75, + "spe": 64 + }, + "abilities": { + "0": "Overgrow", + "H": "Bulletproof" + }, + "heightm": 1.6, + "weightkg": 90, + "color": "Green", + "prevo": "quilladin", + "evoLevel": 36, + "eggGroups": [ + "Field" + ] + }, + "fennekin": { + "num": 653, + "species": "Fennekin", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 40, + "atk": 45, + "def": 40, + "spa": 62, + "spd": 60, + "spe": 60 + }, + "abilities": { + "0": "Blaze", + "H": "Magician" + }, + "heightm": 0.4, + "weightkg": 9.4, + "color": "Red", + "evos": [ + "braixen" + ], + "eggGroups": [ + "Field" + ] + }, + "braixen": { + "num": 654, + "species": "Braixen", + "types": [ + "Fire" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 59, + "atk": 59, + "def": 58, + "spa": 90, + "spd": 70, + "spe": 73 + }, + "abilities": { + "0": "Blaze", + "H": "Magician" + }, + "heightm": 1, + "weightkg": 14.5, + "color": "Red", + "prevo": "fennekin", + "evos": [ + "delphox" + ], + "evoLevel": 16, + "eggGroups": [ + "Field" + ] + }, + "delphox": { + "num": 655, + "species": "Delphox", + "types": [ + "Fire", + "Psychic" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 75, + "atk": 69, + "def": 72, + "spa": 114, + "spd": 100, + "spe": 104 + }, + "abilities": { + "0": "Blaze", + "H": "Magician" + }, + "heightm": 1.5, + "weightkg": 39, + "color": "Red", + "prevo": "braixen", + "evoLevel": 36, + "eggGroups": [ + "Field" + ] + }, + "froakie": { + "num": 656, + "species": "Froakie", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 41, + "atk": 56, + "def": 40, + "spa": 62, + "spd": 44, + "spe": 71 + }, + "abilities": { + "0": "Torrent", + "H": "Protean" + }, + "heightm": 0.3, + "weightkg": 7, + "color": "Blue", + "evos": [ + "frogadier" + ], + "eggGroups": [ + "Water 1" + ] + }, + "frogadier": { + "num": 657, + "species": "Frogadier", + "types": [ + "Water" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 54, + "atk": 63, + "def": 52, + "spa": 83, + "spd": 56, + "spe": 97 + }, + "abilities": { + "0": "Torrent", + "H": "Protean" + }, + "heightm": 0.6, + "weightkg": 10.9, + "color": "Blue", + "prevo": "froakie", + "evos": [ + "greninja" + ], + "evoLevel": 16, + "eggGroups": [ + "Water 1" + ] + }, + "greninja": { + "num": 658, + "species": "Greninja", + "types": [ + "Water", + "Dark" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 72, + "atk": 95, + "def": 67, + "spa": 103, + "spd": 71, + "spe": 122 + }, + "abilities": { + "0": "Torrent", + "H": "Protean" + }, + "heightm": 1.5, + "weightkg": 40, + "color": "Blue", + "prevo": "frogadier", + "evoLevel": 36, + "eggGroups": [ + "Water 1" + ] + }, + "bunnelby": { + "num": 659, + "species": "Bunnelby", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 38, + "atk": 36, + "def": 38, + "spa": 32, + "spd": 36, + "spe": 57 + }, + "abilities": { + "0": "Pickup", + "1": "Cheek Pouch", + "H": "Huge Power" + }, + "heightm": 0.4, + "weightkg": 5, + "color": "Brown", + "evos": [ + "diggersby" + ], + "eggGroups": [ + "Field" + ] + }, + "diggersby": { + "num": 660, + "species": "Diggersby", + "types": [ + "Normal", + "Ground" + ], + "baseStats": { + "hp": 85, + "atk": 56, + "def": 77, + "spa": 50, + "spd": 77, + "spe": 78 + }, + "abilities": { + "0": "Pickup", + "1": "Cheek Pouch", + "H": "Huge Power" + }, + "heightm": 1, + "weightkg": 42.4, + "color": "Brown", + "prevo": "bunnelby", + "evoLevel": 20, + "eggGroups": [ + "Field" + ] + }, + "fletchling": { + "num": 661, + "species": "Fletchling", + "types": [ + "Normal", + "Flying" + ], + "baseStats": { + "hp": 45, + "atk": 50, + "def": 43, + "spa": 40, + "spd": 38, + "spe": 62 + }, + "abilities": { + "0": "Big Pecks", + "H": "Gale Wings" + }, + "heightm": 0.3, + "weightkg": 1.7, + "color": "Red", + "evos": [ + "fletchinder" + ], + "eggGroups": [ + "Flying" + ] + }, + "fletchinder": { + "num": 662, + "species": "Fletchinder", + "types": [ + "Fire", + "Flying" + ], + "baseStats": { + "hp": 62, + "atk": 73, + "def": 55, + "spa": 56, + "spd": 52, + "spe": 84 + }, + "abilities": { + "0": "Flame Body", + "H": "Gale Wings" + }, + "heightm": 0.7, + "weightkg": 16, + "color": "Red", + "prevo": "fletchling", + "evos": [ + "talonflame" + ], + "evoLevel": 17, + "eggGroups": [ + "Flying" + ] + }, + "talonflame": { + "num": 663, + "species": "Talonflame", + "types": [ + "Fire", + "Flying" + ], + "baseStats": { + "hp": 78, + "atk": 81, + "def": 71, + "spa": 74, + "spd": 69, + "spe": 126 + }, + "abilities": { + "0": "Flame Body", + "H": "Gale Wings" + }, + "heightm": 1.2, + "weightkg": 24.5, + "color": "Red", + "prevo": "fletchinder", + "evoLevel": 35, + "eggGroups": [ + "Flying" + ] + }, + "scatterbug": { + "num": 664, + "species": "Scatterbug", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 38, + "atk": 35, + "def": 40, + "spa": 27, + "spd": 25, + "spe": 35 + }, + "abilities": { + "0": "Shield Dust", + "1": "Compound Eyes", + "H": "Friend Guard" + }, + "heightm": 0.3, + "weightkg": 2.5, + "color": "Black", + "evos": [ + "spewpa" + ], + "eggGroups": [ + "Bug" + ] + }, + "spewpa": { + "num": 665, + "species": "Spewpa", + "types": [ + "Bug" + ], + "baseStats": { + "hp": 45, + "atk": 22, + "def": 60, + "spa": 27, + "spd": 30, + "spe": 29 + }, + "abilities": { + "0": "Shed Skin", + "H": "Friend Guard" + }, + "heightm": 0.3, + "weightkg": 8.4, + "color": "Black", + "prevo": "scatterbug", + "evos": [ + "vivillon" + ], + "evoLevel": 9, + "eggGroups": [ + "Bug" + ] + }, + "vivillon": { + "num": 666, + "species": "Vivillon", + "types": [ + "Bug", + "Flying" + ], + "baseStats": { + "hp": 80, + "atk": 52, + "def": 50, + "spa": 90, + "spd": 50, + "spe": 89 + }, + "abilities": { + "0": "Shield Dust", + "1": "Compound Eyes", + "H": "Friend Guard" + }, + "heightm": 1.2, + "weightkg": 17, + "color": "Black", + "prevo": "spewpa", + "evoLevel": 12, + "eggGroups": [ + "Bug" + ], + "otherForms": [ + "vivillonarchipelago", + "vivilloncontinental", + "vivillonelegant", + "vivillongarden", + "vivillonhighplains", + "vivillonicysnow", + "vivillonjungle", + "vivillonmarine", + "vivillonmodern", + "vivillonmonsoon", + "vivillonocean", + "vivillonpolar", + "vivillonriver", + "vivillonsandstorm", + "vivillonsavanna", + "vivillonsun", + "vivillontundra" + ] + }, + "litleo": { + "num": 667, + "species": "Litleo", + "types": [ + "Fire", + "Normal" + ], + "baseStats": { + "hp": 62, + "atk": 50, + "def": 58, + "spa": 73, + "spd": 54, + "spe": 72 + }, + "abilities": { + "0": "Rivalry", + "1": "Unnerve", + "H": "Moxie" + }, + "heightm": 0.6, + "weightkg": 13.5, + "color": "Brown", + "evos": [ + "pyroar" + ], + "eggGroups": [ + "Field" + ] + }, + "pyroar": { + "num": 668, + "species": "Pyroar", + "types": [ + "Fire", + "Normal" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 86, + "atk": 68, + "def": 72, + "spa": 109, + "spd": 66, + "spe": 106 + }, + "abilities": { + "0": "Rivalry", + "1": "Unnerve", + "H": "Moxie" + }, + "heightm": 1.5, + "weightkg": 81.5, + "color": "Brown", + "prevo": "litleo", + "evoLevel": 35, + "eggGroups": [ + "Field" + ] + }, + "flabebe": { + "num": 669, + "species": "Flabebe", + "types": [ + "Fairy" + ], + "gender": "F", + "baseStats": { + "hp": 44, + "atk": 38, + "def": 39, + "spa": 61, + "spd": 79, + "spe": 42 + }, + "abilities": { + "0": "Flower Veil", + "H": "Symbiosis" + }, + "heightm": 0.1, + "weightkg": 0.1, + "color": "White", + "evos": [ + "floette" + ], + "eggGroups": [ + "Fairy" + ], + "otherForms": [ + "flabebeblue", + "flabebeorange", + "flabebewhite", + "flabebeyellow" + ] + }, + "floette": { + "num": 670, + "species": "Floette", + "baseForme": "Red-Flower", + "types": [ + "Fairy" + ], + "gender": "F", + "baseStats": { + "hp": 54, + "atk": 45, + "def": 47, + "spa": 75, + "spd": 98, + "spe": 52 + }, + "abilities": { + "0": "Flower Veil", + "H": "Symbiosis" + }, + "heightm": 0.2, + "weightkg": 0.9, + "color": "White", + "prevo": "flabebe", + "evos": [ + "florges" + ], + "evoLevel": 19, + "eggGroups": [ + "Fairy" + ], + "otherForms": [ + "floetteblue", + "floetteorange", + "floettewhite", + "floetteyellow" + ], + "otherFormes": [ + "floetteeternal" + ] + }, + "floetteeternal": { + "num": 670, + "species": "Floette-Eternal", + "baseSpecies": "Floette", + "forme": "Eternal", + "formeLetter": "E", + "types": [ + "Fairy" + ], + "gender": "F", + "baseStats": { + "hp": 74, + "atk": 65, + "def": 67, + "spa": 125, + "spd": 128, + "spe": 92 + }, + "abilities": { + "0": "Flower Veil" + }, + "heightm": 0.2, + "weightkg": 0.9, + "color": "White", + "eggGroups": [ + "Undiscovered" + ] + }, + "florges": { + "num": 671, + "species": "Florges", + "types": [ + "Fairy" + ], + "gender": "F", + "baseStats": { + "hp": 78, + "atk": 65, + "def": 68, + "spa": 112, + "spd": 154, + "spe": 75 + }, + "abilities": { + "0": "Flower Veil", + "H": "Symbiosis" + }, + "heightm": 1.1, + "weightkg": 10, + "color": "White", + "prevo": "floette", + "evoLevel": 19, + "eggGroups": [ + "Fairy" + ], + "otherForms": [ + "florgesblue", + "florgesorange", + "florgeswhite", + "florgesyellow" + ] + }, + "skiddo": { + "num": 672, + "species": "Skiddo", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 66, + "atk": 65, + "def": 48, + "spa": 62, + "spd": 57, + "spe": 52 + }, + "abilities": { + "0": "Sap Sipper", + "H": "Grass Pelt" + }, + "heightm": 0.9, + "weightkg": 31, + "color": "Brown", + "evos": [ + "gogoat" + ], + "eggGroups": [ + "Field" + ] + }, + "gogoat": { + "num": 673, + "species": "Gogoat", + "types": [ + "Grass" + ], + "baseStats": { + "hp": 123, + "atk": 100, + "def": 62, + "spa": 97, + "spd": 81, + "spe": 68 + }, + "abilities": { + "0": "Sap Sipper", + "H": "Grass Pelt" + }, + "heightm": 1.7, + "weightkg": 91, + "color": "Brown", + "prevo": "skiddo", + "evoLevel": 32, + "eggGroups": [ + "Field" + ] + }, + "pancham": { + "num": 674, + "species": "Pancham", + "types": [ + "Fighting" + ], + "baseStats": { + "hp": 67, + "atk": 82, + "def": 62, + "spa": 46, + "spd": 48, + "spe": 43 + }, + "abilities": { + "0": "Iron Fist", + "1": "Mold Breaker", + "H": "Scrappy" + }, + "heightm": 0.6, + "weightkg": 8, + "color": "White", + "evos": [ + "pangoro" + ], + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "pangoro": { + "num": 675, + "species": "Pangoro", + "types": [ + "Fighting", + "Dark" + ], + "baseStats": { + "hp": 95, + "atk": 124, + "def": 78, + "spa": 69, + "spd": 71, + "spe": 58 + }, + "abilities": { + "0": "Iron Fist", + "1": "Mold Breaker", + "H": "Scrappy" + }, + "heightm": 2.1, + "weightkg": 136, + "color": "White", + "prevo": "pancham", + "evoLevel": 32, + "eggGroups": [ + "Field", + "Human-Like" + ] + }, + "furfrou": { + "num": 676, + "species": "Furfrou", + "types": [ + "Normal" + ], + "baseStats": { + "hp": 75, + "atk": 80, + "def": 60, + "spa": 65, + "spd": 90, + "spe": 102 + }, + "abilities": { + "0": "Fur Coat" + }, + "heightm": 1.2, + "weightkg": 28, + "color": "White", + "eggGroups": [ + "Field" + ] + }, + "espurr": { + "num": 677, + "species": "Espurr", + "types": [ + "Psychic" + ], + "baseStats": { + "hp": 62, + "atk": 48, + "def": 54, + "spa": 63, + "spd": 60, + "spe": 68 + }, + "abilities": { + "0": "Keen Eye", + "1": "Infiltrator", + "H": "Own Tempo" + }, + "heightm": 0.3, + "weightkg": 3.5, + "color": "Gray", + "evos": [ + "meowstic" + ], + "eggGroups": [ + "Field" + ] + }, + "meowstic": { + "num": 678, + "species": "Meowstic", + "baseForme": "M", + "types": [ + "Psychic" + ], + "gender": "M", + "baseStats": { + "hp": 74, + "atk": 48, + "def": 76, + "spa": 83, + "spd": 81, + "spe": 104 + }, + "abilities": { + "0": "Keen Eye", + "1": "Infiltrator", + "H": "Prankster" + }, + "heightm": 0.6, + "weightkg": 8.5, + "color": "White", + "prevo": "espurr", + "evoLevel": 25, + "eggGroups": [ + "Field" + ], + "otherFormes": [ + "meowsticf" + ] + }, + "meowsticf": { + "num": 678, + "species": "Meowstic-F", + "baseSpecies": "Meowstic", + "forme": "F", + "formeLetter": "F", + "types": [ + "Psychic" + ], + "gender": "F", + "baseStats": { + "hp": 74, + "atk": 48, + "def": 76, + "spa": 83, + "spd": 81, + "spe": 104 + }, + "abilities": { + "0": "Keen Eye", + "1": "Infiltrator", + "H": "Competitive" + }, + "heightm": 0.6, + "weightkg": 8.5, + "color": "White", + "prevo": "espurr", + "evoLevel": 25, + "eggGroups": [ + "Field" + ] + }, + "honedge": { + "num": 679, + "species": "Honedge", + "types": [ + "Steel", + "Ghost" + ], + "baseStats": { + "hp": 45, + "atk": 80, + "def": 100, + "spa": 35, + "spd": 37, + "spe": 28 + }, + "abilities": { + "0": "No Guard" + }, + "heightm": 0.8, + "weightkg": 2, + "color": "Brown", + "evos": [ + "doublade" + ], + "eggGroups": [ + "Mineral" + ] + }, + "doublade": { + "num": 680, + "species": "Doublade", + "types": [ + "Steel", + "Ghost" + ], + "baseStats": { + "hp": 59, + "atk": 110, + "def": 150, + "spa": 45, + "spd": 49, + "spe": 35 + }, + "abilities": { + "0": "No Guard" + }, + "heightm": 0.8, + "weightkg": 4.5, + "color": "Brown", + "prevo": "honedge", + "evos": [ + "aegislash" + ], + "evoLevel": 35, + "eggGroups": [ + "Mineral" + ] + }, + "aegislash": { + "num": 681, + "species": "Aegislash", + "baseForme": "Shield", + "types": [ + "Steel", + "Ghost" + ], + "baseStats": { + "hp": 60, + "atk": 50, + "def": 150, + "spa": 50, + "spd": 150, + "spe": 60 + }, + "abilities": { + "0": "Stance Change" + }, + "heightm": 1.7, + "weightkg": 53, + "color": "Brown", + "prevo": "doublade", + "evoLevel": 35, + "eggGroups": [ + "Mineral" + ], + "otherFormes": [ + "aegislashblade" + ] + }, + "aegislashblade": { + "num": 681, + "species": "Aegislash-Blade", + "baseSpecies": "Aegislash", + "forme": "Blade", + "formeLetter": "B", + "types": [ + "Steel", + "Ghost" + ], + "baseStats": { + "hp": 60, + "atk": 150, + "def": 50, + "spa": 150, + "spd": 50, + "spe": 60 + }, + "abilities": { + "0": "Stance Change" + }, + "heightm": 1.7, + "weightkg": 53, + "color": "Brown", + "prevo": "doublade", + "evoLevel": 35, + "eggGroups": [ + "Mineral" + ] + }, + "spritzee": { + "num": 682, + "species": "Spritzee", + "types": [ + "Fairy" + ], + "baseStats": { + "hp": 78, + "atk": 52, + "def": 60, + "spa": 63, + "spd": 65, + "spe": 23 + }, + "abilities": { + "0": "Healer", + "H": "Aroma Veil" + }, + "heightm": 0.2, + "weightkg": 0.5, + "color": "Pink", + "evos": [ + "aromatisse" + ], + "eggGroups": [ + "Fairy" + ] + }, + "aromatisse": { + "num": 683, + "species": "Aromatisse", + "types": [ + "Fairy" + ], + "baseStats": { + "hp": 101, + "atk": 72, + "def": 72, + "spa": 99, + "spd": 89, + "spe": 29 + }, + "abilities": { + "0": "Healer", + "H": "Aroma Veil" + }, + "heightm": 0.8, + "weightkg": 15.5, + "color": "Pink", + "prevo": "spritzee", + "evoLevel": 1, + "eggGroups": [ + "Fairy" + ] + }, + "swirlix": { + "num": 684, + "species": "Swirlix", + "types": [ + "Fairy" + ], + "baseStats": { + "hp": 62, + "atk": 48, + "def": 66, + "spa": 59, + "spd": 57, + "spe": 49 + }, + "abilities": { + "0": "Sweet Veil", + "H": "Unburden" + }, + "heightm": 0.4, + "weightkg": 3.5, + "color": "White", + "evos": [ + "slurpuff" + ], + "eggGroups": [ + "Fairy" + ] + }, + "slurpuff": { + "num": 685, + "species": "Slurpuff", + "types": [ + "Fairy" + ], + "baseStats": { + "hp": 82, + "atk": 80, + "def": 86, + "spa": 85, + "spd": 75, + "spe": 72 + }, + "abilities": { + "0": "Sweet Veil", + "H": "Unburden" + }, + "heightm": 0.8, + "weightkg": 5, + "color": "White", + "prevo": "swirlix", + "evoLevel": 1, + "eggGroups": [ + "Fairy" + ] + }, + "inkay": { + "num": 686, + "species": "Inkay", + "types": [ + "Dark", + "Psychic" + ], + "baseStats": { + "hp": 53, + "atk": 54, + "def": 53, + "spa": 37, + "spd": 46, + "spe": 45 + }, + "abilities": { + "0": "Contrary", + "1": "Suction Cups", + "H": "Infiltrator" + }, + "heightm": 0.4, + "weightkg": 3.5, + "color": "Blue", + "evos": [ + "malamar" + ], + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "malamar": { + "num": 687, + "species": "Malamar", + "types": [ + "Dark", + "Psychic" + ], + "baseStats": { + "hp": 86, + "atk": 92, + "def": 88, + "spa": 68, + "spd": 75, + "spe": 73 + }, + "abilities": { + "0": "Contrary", + "1": "Suction Cups", + "H": "Infiltrator" + }, + "heightm": 1.5, + "weightkg": 47, + "color": "Blue", + "prevo": "inkay", + "evoLevel": 30, + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "binacle": { + "num": 688, + "species": "Binacle", + "types": [ + "Rock", + "Water" + ], + "baseStats": { + "hp": 42, + "atk": 52, + "def": 67, + "spa": 39, + "spd": 56, + "spe": 50 + }, + "abilities": { + "0": "Tough Claws", + "1": "Sniper", + "H": "Pickpocket" + }, + "heightm": 0.5, + "weightkg": 31, + "color": "Brown", + "evos": [ + "barbaracle" + ], + "eggGroups": [ + "Water 3" + ] + }, + "barbaracle": { + "num": 689, + "species": "Barbaracle", + "types": [ + "Rock", + "Water" + ], + "baseStats": { + "hp": 72, + "atk": 105, + "def": 115, + "spa": 54, + "spd": 86, + "spe": 68 + }, + "abilities": { + "0": "Tough Claws", + "1": "Sniper", + "H": "Pickpocket" + }, + "heightm": 1.3, + "weightkg": 96, + "color": "Brown", + "prevo": "binacle", + "evoLevel": 39, + "eggGroups": [ + "Water 3" + ] + }, + "skrelp": { + "num": 690, + "species": "Skrelp", + "types": [ + "Poison", + "Water" + ], + "baseStats": { + "hp": 50, + "atk": 60, + "def": 60, + "spa": 60, + "spd": 60, + "spe": 30 + }, + "abilities": { + "0": "Poison Point", + "1": "Poison Touch", + "H": "Adaptability" + }, + "heightm": 0.5, + "weightkg": 7.3, + "color": "Brown", + "evos": [ + "dragalge" + ], + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "dragalge": { + "num": 691, + "species": "Dragalge", + "types": [ + "Poison", + "Dragon" + ], + "baseStats": { + "hp": 65, + "atk": 75, + "def": 90, + "spa": 97, + "spd": 123, + "spe": 44 + }, + "abilities": { + "0": "Poison Point", + "1": "Poison Touch", + "H": "Adaptability" + }, + "heightm": 1.8, + "weightkg": 81.5, + "color": "Brown", + "prevo": "skrelp", + "evoLevel": 48, + "eggGroups": [ + "Water 1", + "Dragon" + ] + }, + "clauncher": { + "num": 692, + "species": "Clauncher", + "types": [ + "Water" + ], + "baseStats": { + "hp": 50, + "atk": 53, + "def": 62, + "spa": 58, + "spd": 63, + "spe": 44 + }, + "abilities": { + "0": "Mega Launcher" + }, + "heightm": 0.5, + "weightkg": 8.3, + "color": "Blue", + "evos": [ + "clawitzer" + ], + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "clawitzer": { + "num": 693, + "species": "Clawitzer", + "types": [ + "Water" + ], + "baseStats": { + "hp": 71, + "atk": 73, + "def": 88, + "spa": 120, + "spd": 89, + "spe": 59 + }, + "abilities": { + "0": "Mega Launcher" + }, + "heightm": 1.3, + "weightkg": 35.3, + "color": "Blue", + "prevo": "clauncher", + "evoLevel": 37, + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "helioptile": { + "num": 694, + "species": "Helioptile", + "types": [ + "Electric", + "Normal" + ], + "baseStats": { + "hp": 44, + "atk": 38, + "def": 33, + "spa": 61, + "spd": 43, + "spe": 70 + }, + "abilities": { + "0": "Dry Skin", + "1": "Sand Veil", + "H": "Solar Power" + }, + "heightm": 0.5, + "weightkg": 6, + "color": "Yellow", + "evos": [ + "heliolisk" + ], + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "heliolisk": { + "num": 695, + "species": "Heliolisk", + "types": [ + "Electric", + "Normal" + ], + "baseStats": { + "hp": 62, + "atk": 55, + "def": 52, + "spa": 109, + "spd": 94, + "spe": 109 + }, + "abilities": { + "0": "Dry Skin", + "1": "Sand Veil", + "H": "Solar Power" + }, + "heightm": 1, + "weightkg": 21, + "color": "Yellow", + "prevo": "helioptile", + "evoLevel": 1, + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "tyrunt": { + "num": 696, + "species": "Tyrunt", + "types": [ + "Rock", + "Dragon" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 58, + "atk": 89, + "def": 77, + "spa": 45, + "spd": 45, + "spe": 48 + }, + "abilities": { + "0": "Strong Jaw", + "H": "Sturdy" + }, + "heightm": 0.8, + "weightkg": 26, + "color": "Brown", + "evos": [ + "tyrantrum" + ], + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "tyrantrum": { + "num": 697, + "species": "Tyrantrum", + "types": [ + "Rock", + "Dragon" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 82, + "atk": 121, + "def": 119, + "spa": 69, + "spd": 59, + "spe": 71 + }, + "abilities": { + "0": "Strong Jaw", + "H": "Rock Head" + }, + "heightm": 2.5, + "weightkg": 270, + "color": "Red", + "prevo": "tyrunt", + "evoLevel": 39, + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "amaura": { + "num": 698, + "species": "Amaura", + "types": [ + "Rock", + "Ice" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 77, + "atk": 59, + "def": 50, + "spa": 67, + "spd": 63, + "spe": 46 + }, + "abilities": { + "0": "Refrigerate", + "H": "Snow Warning" + }, + "heightm": 1.3, + "weightkg": 25.2, + "color": "Blue", + "evos": [ + "aurorus" + ], + "eggGroups": [ + "Monster" + ] + }, + "aurorus": { + "num": 699, + "species": "Aurorus", + "types": [ + "Rock", + "Ice" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 123, + "atk": 77, + "def": 72, + "spa": 99, + "spd": 92, + "spe": 58 + }, + "abilities": { + "0": "Refrigerate", + "H": "Snow Warning" + }, + "heightm": 2.7, + "weightkg": 225, + "color": "Blue", + "prevo": "amaura", + "evoLevel": 39, + "eggGroups": [ + "Monster" + ] + }, + "sylveon": { + "num": 700, + "species": "Sylveon", + "types": [ + "Fairy" + ], + "genderRatio": { + "M": 0.875, + "F": 0.125 + }, + "baseStats": { + "hp": 95, + "atk": 65, + "def": 65, + "spa": 110, + "spd": 130, + "spe": 60 + }, + "abilities": { + "0": "Cute Charm", + "H": "Pixilate" + }, + "heightm": 1, + "weightkg": 23.5, + "color": "Pink", + "prevo": "eevee", + "evoLevel": 2, + "eggGroups": [ + "Field" + ] + }, + "hawlucha": { + "num": 701, + "species": "Hawlucha", + "types": [ + "Fighting", + "Flying" + ], + "baseStats": { + "hp": 78, + "atk": 92, + "def": 75, + "spa": 74, + "spd": 63, + "spe": 118 + }, + "abilities": { + "0": "Limber", + "1": "Unburden", + "H": "Mold Breaker" + }, + "heightm": 0.8, + "weightkg": 21.5, + "color": "Green", + "eggGroups": [ + "Human-Like" + ] + }, + "dedenne": { + "num": 702, + "species": "Dedenne", + "types": [ + "Electric", + "Fairy" + ], + "baseStats": { + "hp": 67, + "atk": 58, + "def": 57, + "spa": 81, + "spd": 67, + "spe": 101 + }, + "abilities": { + "0": "Cheek Pouch", + "1": "Pickup", + "H": "Plus" + }, + "heightm": 0.2, + "weightkg": 2.2, + "color": "Yellow", + "eggGroups": [ + "Field", + "Fairy" + ] + }, + "carbink": { + "num": 703, + "species": "Carbink", + "types": [ + "Rock", + "Fairy" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 50, + "def": 150, + "spa": 50, + "spd": 150, + "spe": 50 + }, + "abilities": { + "0": "Clear Body", + "H": "Sturdy" + }, + "heightm": 0.3, + "weightkg": 5.7, + "color": "Gray", + "eggGroups": [ + "Fairy", + "Mineral" + ] + }, + "goomy": { + "num": 704, + "species": "Goomy", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 45, + "atk": 50, + "def": 35, + "spa": 55, + "spd": 75, + "spe": 40 + }, + "abilities": { + "0": "Sap Sipper", + "1": "Hydration", + "H": "Gooey" + }, + "heightm": 0.3, + "weightkg": 2.8, + "color": "Purple", + "evos": [ + "sliggoo" + ], + "eggGroups": [ + "Dragon" + ] + }, + "sliggoo": { + "num": 705, + "species": "Sliggoo", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 68, + "atk": 75, + "def": 53, + "spa": 83, + "spd": 113, + "spe": 60 + }, + "abilities": { + "0": "Sap Sipper", + "1": "Hydration", + "H": "Gooey" + }, + "heightm": 0.8, + "weightkg": 17.5, + "color": "Purple", + "prevo": "goomy", + "evos": [ + "goodra" + ], + "evoLevel": 40, + "eggGroups": [ + "Dragon" + ] + }, + "goodra": { + "num": 706, + "species": "Goodra", + "types": [ + "Dragon" + ], + "baseStats": { + "hp": 90, + "atk": 100, + "def": 70, + "spa": 110, + "spd": 150, + "spe": 80 + }, + "abilities": { + "0": "Sap Sipper", + "1": "Hydration", + "H": "Gooey" + }, + "heightm": 2, + "weightkg": 150.5, + "color": "Purple", + "prevo": "sliggoo", + "evoLevel": 50, + "eggGroups": [ + "Dragon" + ] + }, + "klefki": { + "num": 707, + "species": "Klefki", + "types": [ + "Steel", + "Fairy" + ], + "baseStats": { + "hp": 57, + "atk": 80, + "def": 91, + "spa": 80, + "spd": 87, + "spe": 75 + }, + "abilities": { + "0": "Prankster", + "H": "Magician" + }, + "heightm": 0.2, + "weightkg": 3, + "color": "Gray", + "eggGroups": [ + "Mineral" + ] + }, + "phantump": { + "num": 708, + "species": "Phantump", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 43, + "atk": 70, + "def": 48, + "spa": 50, + "spd": 60, + "spe": 38 + }, + "abilities": { + "0": "Natural Cure", + "1": "Frisk", + "H": "Harvest" + }, + "heightm": 0.4, + "weightkg": 7, + "color": "Brown", + "evos": [ + "trevenant" + ], + "eggGroups": [ + "Grass", + "Amorphous" + ] + }, + "trevenant": { + "num": 709, + "species": "Trevenant", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 85, + "atk": 110, + "def": 76, + "spa": 65, + "spd": 82, + "spe": 56 + }, + "abilities": { + "0": "Natural Cure", + "1": "Frisk", + "H": "Harvest" + }, + "heightm": 1.5, + "weightkg": 71, + "color": "Brown", + "prevo": "phantump", + "evoLevel": 1, + "eggGroups": [ + "Grass", + "Amorphous" + ] + }, + "pumpkaboo": { + "num": 710, + "species": "Pumpkaboo", + "baseForme": "Average", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 49, + "atk": 66, + "def": 70, + "spa": 44, + "spd": 55, + "spe": 51 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 0.4, + "weightkg": 5, + "color": "Brown", + "evos": [ + "gourgeist" + ], + "eggGroups": [ + "Amorphous" + ], + "otherFormes": [ + "pumpkaboosmall", + "pumpkaboolarge", + "pumpkaboosuper" + ] + }, + "pumpkaboosmall": { + "num": 710, + "species": "Pumpkaboo-Small", + "baseSpecies": "Pumpkaboo", + "forme": "Small", + "formeLetter": "S", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 44, + "atk": 66, + "def": 70, + "spa": 44, + "spd": 55, + "spe": 56 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 0.3, + "weightkg": 3.5, + "color": "Brown", + "evos": [ + "gourgeistsmall" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "pumpkaboolarge": { + "num": 710, + "species": "Pumpkaboo-Large", + "baseSpecies": "Pumpkaboo", + "forme": "Large", + "formeLetter": "L", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 54, + "atk": 66, + "def": 70, + "spa": 44, + "spd": 55, + "spe": 46 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 0.5, + "weightkg": 7.5, + "color": "Brown", + "evos": [ + "gourgeistlarge" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "pumpkaboosuper": { + "num": 710, + "species": "Pumpkaboo-Super", + "baseSpecies": "Pumpkaboo", + "forme": "Super", + "formeLetter": "S", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 59, + "atk": 66, + "def": 70, + "spa": 44, + "spd": 55, + "spe": 41 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 0.8, + "weightkg": 15, + "color": "Brown", + "evos": [ + "gourgeistsuper" + ], + "eggGroups": [ + "Amorphous" + ] + }, + "gourgeist": { + "num": 711, + "species": "Gourgeist", + "baseForme": "Average", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 65, + "atk": 90, + "def": 122, + "spa": 58, + "spd": 75, + "spe": 84 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 0.9, + "weightkg": 12.5, + "color": "Brown", + "prevo": "pumpkaboo", + "evoLevel": 1, + "eggGroups": [ + "Amorphous" + ], + "otherFormes": [ + "gourgeistsmall", + "gourgeistlarge", + "gourgeistsuper" + ] + }, + "gourgeistsmall": { + "num": 711, + "species": "Gourgeist-Small", + "baseSpecies": "Gourgeist", + "forme": "Small", + "formeLetter": "S", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 55, + "atk": 85, + "def": 122, + "spa": 58, + "spd": 75, + "spe": 99 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 0.7, + "weightkg": 9.5, + "color": "Brown", + "prevo": "pumpkaboosmall", + "evoLevel": 1, + "eggGroups": [ + "Amorphous" + ] + }, + "gourgeistlarge": { + "num": 711, + "species": "Gourgeist-Large", + "baseSpecies": "Gourgeist", + "forme": "Large", + "formeLetter": "L", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 75, + "atk": 95, + "def": 122, + "spa": 58, + "spd": 75, + "spe": 69 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 1.1, + "weightkg": 14, + "color": "Brown", + "prevo": "pumpkaboolarge", + "evoLevel": 1, + "eggGroups": [ + "Amorphous" + ] + }, + "gourgeistsuper": { + "num": 711, + "species": "Gourgeist-Super", + "baseSpecies": "Gourgeist", + "forme": "Super", + "formeLetter": "S", + "types": [ + "Ghost", + "Grass" + ], + "baseStats": { + "hp": 85, + "atk": 100, + "def": 122, + "spa": 58, + "spd": 75, + "spe": 54 + }, + "abilities": { + "0": "Pickup", + "1": "Frisk", + "H": "Insomnia" + }, + "heightm": 1.7, + "weightkg": 39, + "color": "Brown", + "prevo": "pumpkaboosuper", + "evoLevel": 1, + "eggGroups": [ + "Amorphous" + ] + }, + "bergmite": { + "num": 712, + "species": "Bergmite", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 55, + "atk": 69, + "def": 85, + "spa": 32, + "spd": 35, + "spe": 28 + }, + "abilities": { + "0": "Own Tempo", + "1": "Ice Body", + "H": "Sturdy" + }, + "heightm": 1, + "weightkg": 99.5, + "color": "Blue", + "evos": [ + "avalugg" + ], + "eggGroups": [ + "Monster" + ] + }, + "avalugg": { + "num": 713, + "species": "Avalugg", + "types": [ + "Ice" + ], + "baseStats": { + "hp": 95, + "atk": 117, + "def": 184, + "spa": 44, + "spd": 46, + "spe": 28 + }, + "abilities": { + "0": "Own Tempo", + "1": "Ice Body", + "H": "Sturdy" + }, + "heightm": 2, + "weightkg": 505, + "color": "Blue", + "prevo": "bergmite", + "evoLevel": 37, + "eggGroups": [ + "Monster" + ] + }, + "noibat": { + "num": 714, + "species": "Noibat", + "types": [ + "Flying", + "Dragon" + ], + "baseStats": { + "hp": 40, + "atk": 30, + "def": 35, + "spa": 45, + "spd": 40, + "spe": 55 + }, + "abilities": { + "0": "Frisk", + "1": "Infiltrator", + "H": "Telepathy" + }, + "heightm": 0.5, + "weightkg": 8, + "color": "Purple", + "evos": [ + "noivern" + ], + "eggGroups": [ + "Flying" + ] + }, + "noivern": { + "num": 715, + "species": "Noivern", + "types": [ + "Flying", + "Dragon" + ], + "baseStats": { + "hp": 85, + "atk": 70, + "def": 80, + "spa": 97, + "spd": 80, + "spe": 123 + }, + "abilities": { + "0": "Frisk", + "1": "Infiltrator", + "H": "Telepathy" + }, + "heightm": 1.5, + "weightkg": 85, + "color": "Purple", + "prevo": "noibat", + "evoLevel": 48, + "eggGroups": [ + "Flying" + ] + }, + "xerneas": { + "num": 716, + "species": "Xerneas", + "types": [ + "Fairy" + ], + "gender": "N", + "baseStats": { + "hp": 126, + "atk": 131, + "def": 95, + "spa": 131, + "spd": 98, + "spe": 99 + }, + "abilities": { + "0": "Fairy Aura" + }, + "heightm": 3, + "weightkg": 215, + "color": "Blue", + "eggGroups": [ + "Undiscovered" + ] + }, + "yveltal": { + "num": 717, + "species": "Yveltal", + "types": [ + "Dark", + "Flying" + ], + "gender": "N", + "baseStats": { + "hp": 126, + "atk": 131, + "def": 95, + "spa": 131, + "spd": 98, + "spe": 99 + }, + "abilities": { + "0": "Dark Aura" + }, + "heightm": 5.8, + "weightkg": 203, + "color": "Red", + "eggGroups": [ + "Undiscovered" + ] + }, + "zygarde": { + "num": 718, + "species": "Zygarde", + "types": [ + "Dragon", + "Ground" + ], + "gender": "N", + "baseStats": { + "hp": 108, + "atk": 100, + "def": 121, + "spa": 81, + "spd": 95, + "spe": 95 + }, + "abilities": { + "0": "Aura Break" + }, + "heightm": 5, + "weightkg": 305, + "color": "Green", + "eggGroups": [ + "Undiscovered" + ] + }, + "diancie": { + "num": 719, + "species": "Diancie", + "types": [ + "Rock", + "Fairy" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 100, + "def": 150, + "spa": 100, + "spd": 150, + "spe": 50 + }, + "abilities": { + "0": "Clear Body" + }, + "heightm": 0.7, + "weightkg": 8.8, + "color": "Pink", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "dianciemega" + ] + }, + "dianciemega": { + "num": 719, + "species": "Diancie-Mega", + "baseSpecies": "Diancie", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Rock", + "Fairy" + ], + "gender": "N", + "baseStats": { + "hp": 50, + "atk": 160, + "def": 110, + "spa": 160, + "spd": 110, + "spe": 110 + }, + "abilities": { + "0": "Magic Bounce" + }, + "heightm": 1.1, + "weightkg": 27.8, + "color": "Pink", + "eggGroups": [ + "Undiscovered" + ] + }, + "hoopa": { + "num": 720, + "species": "Hoopa", + "baseForme": "Confined", + "types": [ + "Psychic", + "Ghost" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 110, + "def": 60, + "spa": 150, + "spd": 130, + "spe": 70 + }, + "abilities": { + "0": "Magician" + }, + "heightm": 0.5, + "weightkg": 9, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ], + "otherFormes": [ + "hoopaunbound" + ] + }, + "hoopaunbound": { + "num": 720, + "species": "Hoopa-Unbound", + "baseSpecies": "Hoopa", + "forme": "Unbound", + "formeLetter": "U", + "types": [ + "Psychic", + "Dark" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 160, + "def": 60, + "spa": 170, + "spd": 130, + "spe": 80 + }, + "abilities": { + "0": "Magician" + }, + "heightm": 6.5, + "weightkg": 490, + "color": "Purple", + "eggGroups": [ + "Undiscovered" + ] + }, + "volcanion": { + "num": 721, + "species": "Volcanion", + "types": [ + "Fire", + "Water" + ], + "gender": "N", + "baseStats": { + "hp": 80, + "atk": 110, + "def": 120, + "spa": 130, + "spd": 90, + "spe": 70 + }, + "abilities": { + "0": "Water Absorb" + }, + "heightm": 1.7, + "weightkg": 195, + "color": "Brown", + "eggGroups": [ + "Undiscovered" + ] + }, + "missingno": { + "num": 0, + "species": "Missingno.", + "types": [ + "Bird", + "Normal" + ], + "baseStats": { + "hp": 33, + "atk": 136, + "def": 0, + "spa": 6, + "spd": 6, + "spe": 29 + }, + "abilities": { + "0": "", + "H": "" + }, + "heightm": 3, + "weightkg": 1590.8, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "tomohawk": { + "num": -1, + "species": "Tomohawk", + "types": [ + "Flying", + "Fighting" + ], + "baseStats": { + "hp": 105, + "atk": 60, + "def": 90, + "spa": 115, + "spd": 80, + "spe": 85 + }, + "abilities": { + "0": "Intimidate", + "1": "Prankster", + "H": "Justified" + }, + "heightm": 1.27, + "weightkg": 37.2, + "color": "Red", + "eggGroups": [ + "Field", + "Flying" + ] + }, + "necturna": { + "num": -2, + "species": "Necturna", + "types": [ + "Grass", + "Ghost" + ], + "gender": "F", + "baseStats": { + "hp": 64, + "atk": 120, + "def": 100, + "spa": 85, + "spd": 120, + "spe": 81 + }, + "abilities": { + "0": "Forewarn", + "H": "Telepathy" + }, + "heightm": 1.65, + "weightkg": 49.6, + "color": "Black", + "eggGroups": [ + "Grass", + "Field" + ] + }, + "mollux": { + "num": -3, + "species": "Mollux", + "types": [ + "Fire", + "Poison" + ], + "baseStats": { + "hp": 95, + "atk": 45, + "def": 83, + "spa": 131, + "spd": 105, + "spe": 76 + }, + "abilities": { + "0": "Dry Skin", + "H": "Illuminate" + }, + "heightm": 1.2, + "weightkg": 41, + "color": "Pink", + "eggGroups": [ + "Fairy", + "Field" + ] + }, + "aurumoth": { + "num": -4, + "species": "Aurumoth", + "types": [ + "Bug", + "Psychic" + ], + "baseStats": { + "hp": 110, + "atk": 120, + "def": 99, + "spa": 117, + "spd": 60, + "spe": 94 + }, + "abilities": { + "0": "Weak Armor", + "1": "No Guard", + "H": "Illusion" + }, + "heightm": 2.1, + "weightkg": 193, + "color": "Purple", + "eggGroups": [ + "Bug" + ] + }, + "malaconda": { + "num": -5, + "species": "Malaconda", + "types": [ + "Dark", + "Grass" + ], + "baseStats": { + "hp": 115, + "atk": 100, + "def": 60, + "spa": 40, + "spd": 130, + "spe": 55 + }, + "abilities": { + "0": "Harvest", + "1": "Infiltrator" + }, + "heightm": 5.5, + "weightkg": 108.8, + "color": "Brown", + "eggGroups": [ + "Grass", + "Dragon" + ] + }, + "cawmodore": { + "num": -6, + "species": "Cawmodore", + "types": [ + "Steel", + "Flying" + ], + "baseStats": { + "hp": 50, + "atk": 92, + "def": 130, + "spa": 65, + "spd": 75, + "spe": 118 + }, + "abilities": { + "0": "Intimidate", + "1": "Volt Absorb", + "H": "Big Pecks" + }, + "heightm": 1.7, + "weightkg": 37, + "color": "Black", + "eggGroups": [ + "Flying" + ] + }, + "volkraken": { + "num": -7, + "species": "Volkraken", + "types": [ + "Water", + "Fire" + ], + "baseStats": { + "hp": 100, + "atk": 45, + "def": 80, + "spa": 135, + "spd": 100, + "spe": 95 + }, + "abilities": { + "0": "Analytic", + "1": "Infiltrator", + "H": "Pressure" + }, + "heightm": 1.3, + "weightkg": 44.5, + "color": "Red", + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "plasmanta": { + "num": -8, + "species": "Plasmanta", + "types": [ + "Electric", + "Poison" + ], + "baseStats": { + "hp": 60, + "atk": 57, + "def": 119, + "spa": 131, + "spd": 98, + "spe": 100 + }, + "abilities": { + "0": "Storm Drain", + "1": "Vital Spirit", + "H": "Telepathy" + }, + "heightm": 7, + "weightkg": 460, + "color": "Purple", + "eggGroups": [ + "Water 1", + "Water 2" + ] + }, + "naviathan": { + "num": -9, + "species": "Naviathan", + "types": [ + "Water", + "Steel" + ], + "baseStats": { + "hp": 103, + "atk": 110, + "def": 90, + "spa": 95, + "spd": 65, + "spe": 97 + }, + "abilities": { + "0": "Water Veil", + "1": "Heatproof", + "H": "Light Metal" + }, + "heightm": 3, + "weightkg": 510, + "color": "Gray", + "eggGroups": [ + "Water 1", + "Field" + ] + }, + "crucibelle": { + "num": -10, + "species": "Crucibelle", + "types": [ + "Rock", + "Poison" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 106, + "atk": 105, + "def": 65, + "spa": 75, + "spd": 85, + "spe": 104 + }, + "abilities": { + "0": "Regenerator", + "1": "Mold Breaker", + "H": "Liquid Ooze" + }, + "heightm": 1.3, + "weightkg": 23.6, + "color": "Purple", + "eggGroups": [ + "Amorphous", + "Mineral" + ], + "otherFormes": [ + "crucibellemega" + ] + }, + "crucibellemega": { + "num": -10, + "species": "Crucibelle-Mega", + "baseSpecies": "Crucibelle", + "forme": "Mega", + "formeLetter": "M", + "types": [ + "Rock", + "Poison" + ], + "genderRatio": { + "M": 0.25, + "F": 0.75 + }, + "baseStats": { + "hp": 106, + "atk": 135, + "def": 75, + "spa": 85, + "spd": 125, + "spe": 114 + }, + "abilities": { + "0": "Magic Guard" + }, + "heightm": 1.4, + "weightkg": 22.5, + "color": "Purple", + "eggGroups": [ + "Amorphous", + "Mineral" + ] + }, + "syclant": { + "num": -51, + "species": "Syclant", + "types": [ + "Ice", + "Bug" + ], + "baseStats": { + "hp": 70, + "atk": 116, + "def": 70, + "spa": 114, + "spd": 64, + "spe": 121 + }, + "abilities": { + "0": "Compound Eyes", + "1": "Mountaineer" + }, + "heightm": 1.7, + "weightkg": 52, + "color": "Blue", + "eggGroups": [ + "Bug" + ] + }, + "revenankh": { + "num": -52, + "species": "Revenankh", + "types": [ + "Ghost", + "Fighting" + ], + "baseStats": { + "hp": 90, + "atk": 105, + "def": 90, + "spa": 65, + "spd": 110, + "spe": 65 + }, + "abilities": { + "0": "Shed Skin", + "1": "Air Lock" + }, + "heightm": 1.8, + "weightkg": 44, + "color": "White", + "eggGroups": [ + "Amorphous", + "Human-Like" + ] + }, + "pyroak": { + "num": -53, + "species": "Pyroak", + "types": [ + "Fire", + "Grass" + ], + "baseStats": { + "hp": 120, + "atk": 70, + "def": 105, + "spa": 95, + "spd": 90, + "spe": 60 + }, + "abilities": { + "0": "Rock Head", + "1": "Battle Armor" + }, + "heightm": 2.1, + "weightkg": 168, + "color": "Brown", + "eggGroups": [ + "Monster", + "Dragon" + ] + }, + "fidgit": { + "num": -54, + "species": "Fidgit", + "types": [ + "Poison", + "Ground" + ], + "baseStats": { + "hp": 95, + "atk": 76, + "def": 109, + "spa": 90, + "spd": 80, + "spe": 105 + }, + "abilities": { + "0": "Persistent", + "1": "Vital Spirit" + }, + "heightm": 0.9, + "weightkg": 53, + "color": "Purple", + "eggGroups": [ + "Field" + ] + }, + "stratagem": { + "num": -55, + "species": "Stratagem", + "types": [ + "Rock" + ], + "gender": "N", + "baseStats": { + "hp": 90, + "atk": 60, + "def": 65, + "spa": 120, + "spd": 70, + "spe": 130 + }, + "abilities": { + "0": "Levitate", + "1": "Technician" + }, + "heightm": 0.9, + "weightkg": 45, + "color": "Gray", + "eggGroups": [ + "Undiscovered" + ] + }, + "arghonaut": { + "num": -56, + "species": "Arghonaut", + "types": [ + "Water", + "Fighting" + ], + "baseStats": { + "hp": 105, + "atk": 110, + "def": 95, + "spa": 70, + "spd": 100, + "spe": 75 + }, + "abilities": { + "0": "Unaware" + }, + "heightm": 1.7, + "weightkg": 151, + "color": "Green", + "eggGroups": [ + "Water 1", + "Water 3" + ] + }, + "kitsunoh": { + "num": -57, + "species": "Kitsunoh", + "types": [ + "Steel", + "Ghost" + ], + "baseStats": { + "hp": 80, + "atk": 103, + "def": 85, + "spa": 55, + "spd": 80, + "spe": 110 + }, + "abilities": { + "0": "Frisk", + "1": "Limber" + }, + "heightm": 1.1, + "weightkg": 51, + "color": "Gray", + "eggGroups": [ + "Field" + ] + }, + "cyclohm": { + "num": -58, + "species": "Cyclohm", + "types": [ + "Electric", + "Dragon" + ], + "baseStats": { + "hp": 108, + "atk": 60, + "def": 118, + "spa": 112, + "spd": 70, + "spe": 80 + }, + "abilities": { + "0": "Shield Dust", + "1": "Static" + }, + "heightm": 1.6, + "weightkg": 59, + "color": "Yellow", + "eggGroups": [ + "Dragon", + "Monster" + ] + }, + "colossoil": { + "num": -59, + "species": "Colossoil", + "types": [ + "Dark", + "Ground" + ], + "baseStats": { + "hp": 133, + "atk": 122, + "def": 72, + "spa": 71, + "spd": 72, + "spe": 95 + }, + "abilities": { + "0": "Rebound", + "1": "Guts" + }, + "heightm": 2.6, + "weightkg": 683.6, + "color": "Brown", + "eggGroups": [ + "Water 2", + "Field" + ] + }, + "krilowatt": { + "num": -60, + "species": "Krilowatt", + "types": [ + "Electric", + "Water" + ], + "baseStats": { + "hp": 151, + "atk": 84, + "def": 73, + "spa": 83, + "spd": 74, + "spe": 105 + }, + "abilities": { + "0": "Trace", + "1": "Magic Guard" + }, + "heightm": 0.7, + "weightkg": 10.6, + "color": "Red", + "eggGroups": [ + "Water 1", + "Fairy" + ] + }, + "voodoom": { + "num": -61, + "species": "Voodoom", + "types": [ + "Fighting", + "Dark" + ], + "baseStats": { + "hp": 90, + "atk": 85, + "def": 80, + "spa": 105, + "spd": 80, + "spe": 110 + }, + "abilities": { + "0": "Volt Absorb", + "1": "Lightning Rod" + }, + "heightm": 2, + "weightkg": 75.5, + "color": "Brown", + "eggGroups": [ + "Human-Like", + "Ground" + ] + } +} \ No newline at end of file diff --git a/src/NadekoBot/data/triviaquestions.json b/src/NadekoBot/data/questions.json similarity index 100% rename from src/NadekoBot/data/triviaquestions.json rename to src/NadekoBot/data/questions.json diff --git a/src/NadekoBot/data/typing_articles.json b/src/NadekoBot/data/typing_articles.json new file mode 100644 index 00000000..9cdf745b --- /dev/null +++ b/src/NadekoBot/data/typing_articles.json @@ -0,0 +1,361 @@ +[ + { + "Title":"The Gender of Psychology", + "Description":"This book addresses the diversity of psychological knowledge and practice through the lens of gender." + }, + { + "Title":"Unto Others: The Evolution and Psychology of Unselfish", + "Description":"In Unto Others philosopher Elliott Sober and biologist David Sloan Wilson demonstrate once and for all that unselfish behavior is in fact an important feature of both biological and human nature." + }, + { + "Title":"Forensic and Legal Psychology", + "Description":"Using research in clinical, cognitive, developmental, and social psychology, Forensic and Legal Psychology shows how psychological science can enhance the gathering and presentation of evidence, improve legal decision-making, prevent crime," + }, + { + "Title":"International Handbook of Psychology in Education", + "Description":"Suitable for researchers, practitioners and advisers working in the fields of psychology and education, this title presents an overview of the research within the domain of psychology of education." + }, + { + "Title":"Handbook of Personality Psychology", + "Description":"This comprehensive reference work on personality psychology discusses the development and measurement of personality, biological and social determinants, dynamic personality processes, the personality's relation to the self, and personality" + }, + { + "Title":"Dictionary of Theories, Laws, and Concepts in Psychology", + "Description":"A fully cross-referenced and source-referenced dictionary which gives definitions of psychological terms as well as the history, critique, and relevant references for the terms." + }, + { + "Title":"Essays on Plato's Psychology", + "Description":"With a comprehensive introduction to the major issues of Plato's psychology and an up-to-date bibliography of work on the relevant issues, this much-needed text makes the study of Plato's psychology accessible to scholars in ancient Greek" + }, + { + "Title":"Psychology Statistics For Dummies", + "Description":"As an alternative to typical, lead-heavy statistics texts or supplements to assigned course reading, this is one book psychology students won't want to be without." + }, + { + "Title":"Doing Psychology Experiments", + "Description":"David W. Martin’s unique blend of informality, humor, clear instruction, and solid scholarship make this concise text a popular choice for research methods courses in psychology." + }, + { + "Title":"A Handbook of Research Methods for Clinical and Health", + "Description":"For both undergraduate and postgraduate students, the book will be essential in making them aware of the full range of techniques available to them, helping them to design scientifically rigorous experiments." + }, + { + "Title":"A History of Psychology", + "Description":"First published in 2002. Routledge is an imprint of Taylor & Francis, an informa company." + }, + { + "Title":"An Introduction to the Psychology of Religion", + "Description":"The third edition of this successful book, which applies the science of psychology to problems of religion. Dr Thouless explores such questions as: why do people believe? Why are their beliefs often held with irrational strength?" + }, + { + "Title":"Psychology of Champions: How to Win at Sports and Life", + "Description":"In this unprecedented book, two psychologist researchers interview sports legends and super-athletes across sports to explain the thinking that powers stellar performers, pushing them to amazing and historic successes." + }, + { + "Title":"The Psychology of Humor: An Integrative Approach", + "Description":"This is a singly authored monograph that provides in one source, a summary of information researchers might wish to know about research into the psychology of humor." + }, + { + "Title":"Psychology and Deterrence", + "Description":"Now available in paperback, Psychology and Deterrence reveals deterrence strategy's hidden and generally simplistic assumptions about the nature of power and aggression, threat and response, and calculation and behavior in the international" + }, + { + "Title":"Psychology: An International Perspective", + "Description":"Unlike typical American texts, this book provides an international approach to introductory psychology, providing comprehensive and lively coverage of current research from a global perspective, including the UK, Germany, Scandinavia," + }, + { + "Title":"Psychology, Briefer Course", + "Description":"Despite its title, 'Psychology: Briefer Course' is more than a simple condensation of the great 'Principles of Psychology." + }, + { + "Title":"Psychology, Seventh Edition (High School)", + "Description":"This new edition continues the story of psychology with added research and enhanced content from the most dynamic areas of the field—cognition, gender and diversity studies, neuroscience and more, while at the same time using the most" + }, + { + "Title":"Psychology of Russia: Past, Present, Future", + "Description":"This book is for all psychologists and for readers whose interest in Russia exceeds their interest in psychology. Readers of this book will quickly discover a new world of thought." + }, + { + "Title":"Barron's AP Psychology", + "Description":"Provides information on scoring and structure of the test, offers tips on test-taking strategies, and includes practice examinations and subject review." + }, + { + "Title":"Psychology for Inclusive Education: New Directions in", + "Description":"International in focus and at the very cutting edge of the field, this is essential reading for all those interested in the development of inclusive education." + }, + { + "Title":"Applied Psychology: Putting Theory Into Practice", + "Description":"Applied Psychology: Putting theory into practice demonstrates how psychology theory is applied in the real world." + }, + { + "Title":"The Psychology of Science: A Reconnaissance", + "Description":"' This eBook edition contains the complete 168 page text of the original 1966 hardcover edition. Contents: Preface by Abraham H. Maslow Acknowledgments 1. Mechanistic and Humanistic Science 2." + }, + { + "Title":"Filipino American Psychology: A Handbook of Theory,", + "Description":"This book is the first of its kind and aims to promote visibility of this invisible group, so that 2.4 million Filipino Americans will have their voices heard." + }, + { + "Title":"The Psychology of Visual Illusion", + "Description":"Well-rounded perspective on the ambiguities of visual display emphasizes geometrical optical illusions: framing and contrast effects, distortion of angles and direction, and apparent 'movement' of images. 240 drawings. 1972 edition." + }, + { + "Title":"The Psychology of Women", + "Description":"This highly respected text offers students an enjoyable, extraordinarily well-written introduction to the psychology of women with an up-to-date examination of the field and comprehensive coverage of topics." + }, + { + "Title":"Psychology and Race", + "Description":"' Psychology and Race is divided into two major parts. The first half of the book looks at the interracial situation itself." + }, + { + "Title":"Psychology for A-Level", + "Description":"'Precisely targeted at AQA A Level Psychology, specification A. It will also be of interest to those who are new to psychology, and who want to get a flavour of the kinds of topics in which psychologists are interested'--Preface, p. vii." + }, + { + "Title":"Biological Psychology", + "Description":"Updated with new topics, examples, and recent research findings--and supported by new online bio-labs, part of the strongest media package yet--this text speaks to today’s students and instructors." + }, + { + "Title":"Psychology: Concepts & Connections", + "Description":"The theme of this book is applying theories and research to learning and to contemporary life." + }, + { + "Title":"The Psychology of Adoption", + "Description":"In this volume David Brodzinsky, who has conducted one of the nation's largest studies of adopted children, and Marshall Schechter, a noted child psychiatrist who has been involved with adoption related issues for over forty years, have" + }, + { + "Title":"Psychology and Adult Learning", + "Description":"This new edition is thoroughly revised and updated in light of the impact of globalising processes and the application of new information technologies, and the influence of postmodernism on psychology." + }, + { + "Title":"Gestalt Psychology: An Introduction to New Concepts in", + "Description":"The general reader, if he looks to psychology for something more than entertainment or practical advice, will discover in this book a storehouse of searching criticism and brilliant suggestions from the pen of a rare thinker, and one who" + }, + { + "Title":"The Psychology of Goals", + "Description":"Bringing together leading authorities, this tightly edited volume reviews the breadth of current knowledge about goals and their key role in human behavior." + }, + { + "Title":"Metaphors in the History of Psychology", + "Description":"Through the identification of these metaphors, the contributors to this volume have provided a remarkably useful guide to the history, current orientations, and future prospects of modern psychology." + }, + { + "Title":"Abnormal Psychology: An Integrative Approach", + "Description":"ABNORMAL PSYCHOLOGY: AN INTEGRATIVE APPROACH, Seventh Edition, is the perfect book to help you succeed in your abnormal psychology course!" + }, + { + "Title":"Art and Visual Perception: A Psychology of the Creative Eye", + "Description":"Gestalt theory and the psychology of visual perception form the basis for an analysis of art and its basic elements" + }, + { + "Title":"Psychology & Christianity: Five Views", + "Description":"This revised edition of a widely appreciated text now presents five models for understanding the relationship between psychology and Christianity." + }, + { + "Title":"The Psychology of Hope: You Can Get There from Here", + "Description":"Why do some people lead positive, hope-filled lives, while others wallow in pessimism? In The Psychology of Hope, a professor of psychology reveals the specific character traits that produce highly hopeful individuals." + }, + { + "Title":"Perspectives on Psychology", + "Description":"This is a title in the modular 'Principles in Psychology Series', designed for A-level and other introductory courses, aiming to provide students embarking on psychology courses with the necessary background and context." + }, + { + "Title":"Psychology the Easy Way", + "Description":"Material is presented in a way that makes these books ideal as self-teaching guides, but Easy Way titles are also preferred by many teachers as supplements to classroom textbooks." + }, + { + "Title":"Ethics in Psychology: Professional Standards and Cases", + "Description":"In this book, their main intent is to present the full range of contemporary ethical issues in psychology as not only relevant and intriguing, but also as integral and unavoidable aspects of the profession." + }, + { + "Title":"Psychology Gets in the Game: Sport, Mind, and Behavior,", + "Description":"The essays collected in this volume tell the stories not only of these psychologists and their subjects but of the social and academic context that surrounded them, shaping and being shaped by their ideas'--Provided by publisher." + }, + { + "Title":"Psychology for Physical Educators: Student in Focus", + "Description":"This updated edition focuses on attitude and motivation as important aspects of the physical education curriculum, illustrating practical ideas and pedagogical solutions for any PE setting." + }, + { + "Title":"The Psychology of Leadership: New Perspectives and Research", + "Description":"In this book, some of the world's leading scholars come together to describe their thinking and research on the topic of the psychology of leadership." + }, + { + "Title":"The Psychology of Interpersonal Relations", + "Description":"As the title suggests, this book examines the psychology of interpersonal relations. In the context of this book, the term 'interpersonal relations' denotes relations between a few, usually between two, people." + }, + { + "Title":"Applied Psychology", + "Description":"The chapters on Counselling Psychology and Teaching Psychology are available online via the Student Companion Site at: http://tinyurl.com/c3ztvtj The text is written to be accessible to Level 1 Introductory Psychology students, and also to" + }, + { + "Title":"Psychology", + "Description":"An exciting read for anyone interested in psychology and research; because of its comprehensive appendix, glossary, and reference section, this book is a must-have desk reference for psychologists and others in the field." + }, + { + "Title":"The Psychology of Music", + "Description":"On interpreting musical phenomena in terms of mental function" + }, + { + "Title":"Abnormal Psychology", + "Description":"Ron Comer's Abnormal Psychology continues to captivate students with its integrated coverage of theory, diagnosis, and treatment, its inclusive wide-ranging cross-cultural perspective, and its compassionate emphasis on the real impact of" + }, + { + "Title":"The Psychology of Food Choice", + "Description":"This book brings together theory, research and applications from psychology and behavioural sciences applied to dietary behaviour." + }, + { + "Title":"Psychology: brain, behavior, & culture", + "Description":"Rather than present psychological science as a series of facts for memorization, this book takes readers on a psychological journey that uncovers things they didn't know or new ways of thinking about things they did know." + }, + { + "Title":"A Brief History of Psychology", + "Description":"Due to its brevity and engaging style, the book is often used in introductory courses to introduce students to the field. The enormous index and substantial glossary make this volume a useful desk reference for the entire field." + }, + { + "Title":"Psychology AS: The Complete Companion", + "Description":"Presented in double-page spreads this book written to the average AS ability level, provides information on psychology in bite-sized chunks with learning and revision features." + }, + { + "Title":"The Psychology Book: From Shamanism to Cutting-Edge", + "Description":"Lavishly illustrated, this new addition in the Sterling's Milestones series chronicles the history of psychology through 250 groundbreaking events, theories, publications, experiments and discoveries." + }, + { + "Title":"The Psychology Book", + "Description":"All the big ideas, simply explained - an innovative and accessible guide to the study of human nature The Psychology Book clearly explains more than 100 groundbreaking ideas in this fascinating field of science." + }, + { + "Title":"Handbook of Positive Psychology", + "Description":"' The Handbook of Positive Psychology provides a forum for a more positive view of the human condition. In its pages, readers are treated to an analysis of what the foremost experts believe to be the fundamental strengths of humankind." + }, + { + "Title":"Psychology of Sustainable Development", + "Description":"With contributions from an international team of policy shapers and makers, the book will be an important reference for environmental, developmental, social, and organizational psychologists, in addition to other social scientists concerned" + }, + { + "Title":"An Introduction to the History of Psychology", + "Description":"In this Fifth Edition, B.R. Hergenhahn demonstrates that most of the concerns of contemporary psychologists are manifestations of themes that have been part of psychology for hundreds-or even thousands-of years." + }, + { + "Title":"Careers in Psychology: Opportunities in a Changing World", + "Description":"This text addresses the growing need among students and faculty for information about the careers available in psychology at the bachelor’s and graduate level." + }, + { + "Title":"Philosophy of Psychology", + "Description":"This is the story of the clattering of elevated subways and the cacophony of crowded neighborhoods, the heady optimism of industrial progress and the despair of economic recession, and the vibrancy of ethnic cultures and the resilience of" + }, + { + "Title":"The Psychology of Risk Taking Behavior", + "Description":"This book aims to help the reader to understand what motivates people to engage in risk taking behavior, such as participating in traffic, sports, financial investments, or courtship." + }, + { + "Title":"The Nazi Doctors: Medical Killing and the Psychology of", + "Description":"This book explores the psychological conditions that promote the human potential for evil, relating medical killing to broader principles of doubling and genocide" + }, + { + "Title":"The Body and Psychology", + "Description":"The material in this volume was previously published as a Special Issue of th" + }, + { + "Title":"Introduction to Psychology: Gateways to Mind and Behavior", + "Description":"Important Notice: Media content referenced within the product description or the product text may not be available in the ebook version." + }, + { + "Title":"Psychology of Time", + "Description":"Basic Structure The book would contain 14 or 15 chapters of roughly 12 000 words. The exact final number of chapters would depend on further discussions with you about the book's basic structure." + }, + { + "Title":"Handbook of Psychology, Experimental Psychology", + "Description":"Includes established theories and cutting-edge developments. Presents the work of an international group of experts. Presents the nature, origin, implications, and future course of major unresolved issues in the area." + }, + { + "Title":"Study Guide for Psychology, Seventh Edition", + "Description":"This new edition continues the story of psychology with added research and enhanced content from the most dynamic areas of the field--cognition, gender and diversity studies, neuroscience and more, while at the same time using the most" + }, + { + "Title":"Culture and Psychology", + "Description":"In addition, the text encourages students to question traditionally held beliefs and theories as and their relevance to different cultural groups today." + }, + { + "Title":"Exploring the Psychology of Interest", + "Description":"The most comprehensive work of its kind, Exploring the Psychology of Interest will be a valuable resource for student and professional researchers in cognitive, social, and developmental psychology." + }, + { + "Title":"Handbook of Adolescent Psychology", + "Description":"The study of adolescence in the field of psychology has grown tremendously over the last two decades, necessitating a comprehensive and up-to-date revision of this seminal work." + }, + { + "Title":"The Psychology of Diplomacy", + "Description":"World class clinicians, researchers, and activists present the psychological dimensions to diplomacy drawn from examples set in the United Nations, Camp David, the Middle East, Japan, South Africa, and elsewhere." + }, + { + "Title":"The Psychology of Social Class", + "Description":"By addressing differences in social class, the book broadens the perspective of social psychological research to examine such topics as the effect of achievement motivation and other personality variables on social mobility and the effect" + }, + { + "Title":"Applied Psychology: Current Issues and New Directions", + "Description":"Key features of this book: - Consistently pedagogical throughout - chapter summaries, questions for reflection and discussion and annotated further reading in every chapter - Comprehensive coverage - all areas of applied psychology included" + }, + { + "Title":"Popular Psychology: An Encyclopedia", + "Description":"Entries cover a variety of topics in the field of popular psychology, including acupuncture, emotional intelligence, brainwashing, chemical inbalance, and seasonal affective disorder." + }, + { + "Title":"Advanced Psychology: Applications, Issues and Perspectives", + "Description":"The second of two books, Advanced Psychology covers units 4 to 6 for the second year at Advanced Level." + }, + { + "Title":"Mindset: The New Psychology of Success", + "Description":"This is a book that can change your life, as its ideas have changed mine.”—Robert J. Sternberg, IBM Professor of Education and Psychology at Yale University, director of the PACE Center of Yale University, and author of Successful" + }, + { + "Title":"E-Z Psychology", + "Description":"This book covers material as it is taught on a college-101 level." + }, + { + "Title":"Myers' Psychology for AP*", + "Description":"Already The Bestselling AP* Psychology Author, Myers Writes His First Exclusive AP* Psych Text Watch Dave G. Myers introduce this new text here." + }, + { + "Title":"Psychology and Health", + "Description":"Part of a series of textbooks which have been written to support A levels in psychology. The books use real life applications to make theories come alive for students and teach them what they need to know." + }, + { + "Title":"Applying Psychology in Business: The Handbook for Managers", + "Description":"To learn more about Rowman & Littlefield titles please visit us at www.rowmanlittlefield.com." + }, + { + "Title":"Influence", + "Description":"Influence, the classic book on persuasion, explains the psychology of why people say 'yes'—and how to apply these understandings. Dr. Robert Cialdini is the seminal expert in the rapidly expanding field of influence and persuasion." + }, + { + "Title":"Psychology and Policing", + "Description":"The book should draw attention to the often unrecognized and valuable contribution that mainstream psychology can make to the knowledge base underpinning a wide variety of policing practices." + }, + { + "Title":"Applied Psychology: New Frontiers and Rewarding Careers", + "Description":"This book examines how psychological science is, and can be, used to prevent and ameliorate pressing human problems to promote positive social change." + }, + { + "Title":"Psychology: Concepts and Applications", + "Description":"Nevid developed the effective teaching devices in this text based on a comprehensive system derived from research on learning and memory as well as his own research on textbook pedagogy." + }, + { + "Title":"Foundations of Sport and Exercise Psychology, 6E: ", + "Description":"This text offers both students and new practitioners a comprehensive view of sport and exercise psychology, drawing connections between research and practice and capturing the excitement of the world of sport and exercise." + }, + { + "Title":"Biographical Dictionary of Psychology", + "Description":"This Dictionary provides biographical and bibliographical information on over 500 psychologists from all over the world from 1850 to the present day. All branches of psychology and its related disciplines are featured." + }, + { + "Title":"Psychology: A Self-Teaching Guide", + "Description":"Frank Bruno explains all the major psychological theories and terms in this book, covering perception, motivation, thinking, personality, sensation, intelligence, research methods, and much more." + }, + { + "Title":"A Dictionary of Psychology", + "Description":"Entries are extensively cross-referenced for ease of use, and cover word origins and derivations as well as definitions. Over 80 illustrations complement the text." + }, + { + "Title":"An Intellectual History of Psychology", + "Description":"Invaluable as a text for students and as a stimulating and insightful overview for scholars and practicing psychologists, this volume can be read either as a history of psychology in both its philosophical and aspiring scientific periods or" + }] \ No newline at end of file diff --git a/src/NadekoBot/data/wowjokes.json b/src/NadekoBot/data/wowjokes.json new file mode 100644 index 00000000..464b56d6 --- /dev/null +++ b/src/NadekoBot/data/wowjokes.json @@ -0,0 +1,302 @@ +[ + { + "Question": "What do you call a gnome priest", + "Answer": "A compact disc" + }, + { + "Question": "Why does the best raiding guild smell so bad?", + "Answer": "because they never wipe" + }, + { + "Question": "Why are boomkins neither overpowered or underpowered?", + "Answer": "Because they're Balanced" + }, + { + "Question": "Who is George of the Jungle's other brother?", + "Answer": "Mark of the Wild." + }, + { + "Question": "What do you call a masturbating Tauren?", + "Answer": "Beef Stroganoff." + }, + { + "Question": "What's a rogue's favourite drink?", + "Answer": "Subtle Tea" + }, + { + "Question": "Classic: What to noobs and Rogues have in common?", + "Answer": "They both pick locks!" + }, + { + "Question": "What did Gul'dan do when he tripped?", + "Answer": "He fel" + }, + { + "Question": "Why didn't the warrior cross the road?", + "Answer": "No Path Available." + }, + { + "Question": "What are the chances we have gotten the last content patch before a new expansion?", + "Answer": "Slim Tanaan" + }, + { + "Question": "A trolls greeting is usually \"Eyy mon\" but what is a goblins?", + "Answer": "\"\"Mon-eyy\"\n\n^^^^^I'm ^^^^^so ^^^^^sorry..." + }, + { + "Question": "What musician is from ICC?", + "Answer": "What musician is from ICC?\n\nAn Arthas formally known as Prince." + }, + { + "Question": "How do you know if someone's been playing since Vanilla?", + "Answer": "Don't worry, they'll tell you" + }, + { + "Question": "What happens when a demon forgets his sunscreen?", + "Answer": "He ends up with a Burning Region" + }, + { + "Question": "Why are raid guilds recruiting rogues for the illidan fight?", + "Answer": "Because they are the only ones that have the required [preparation](http://www.wowhead.com/spell=14185/preparation) " + }, + { + "Question": "How does Naxxramas fly?", + "Answer": "with it's four wings" + }, + { + "Question": "Why is the Cenarion Circle neutral?", + "Answer": "Circles have no sides." + }, + { + "Question": "Why are rogues the best bar tenders?", + "Answer": "Because they always have cheap shots " + }, + { + "Question": "What does Gul'dan like on his hotdogs?", + "Answer": "EVERYTHIIING" + }, + { + "Question": "Why did a Felhunter win the spelling competition?", + "Answer": "Nobody else could Spell Lock." + }, + { + "Question": "What do you call it when Illidan teaches demon hunters in Legion?", + "Answer": "a 'demon-stration\"" + }, + { + "Question": "Why can't Paladins work out at Planet Fitness?", + "Answer": "Because it's a Judgement-free zone. " + }, + { + "Question": "Why didn't the rogue like his dagger upgrade?", + "Answer": "He wasn't a fan of knives." + }, + { + "Question": "What do you call a Gilnean church?", + "Answer": "Worgenized religion" + }, + { + "Question": "Why were night elves chosen to be Azeroth's first astronauts?", + "Answer": "Because they know the moon well." + }, + { + "Question": "Why are gnomes unable to be paladins?", + "Answer": "Because they cannot reach the Light." + }, + { + "Question": "Did you hear about the resto druid who never plays guardian?", + "Answer": "You could say he's all bark, no bite." + }, + { + "Question": "What's a dwarf rogue's favorite car?", + "Answer": "Dodge Ram" + }, + { + "Question": "Why can you only wear 1 shoe in the Emerald nightmare?", + "Answer": "Because they'll steal Ursoc." + }, + { + "Question": "Why is it impossible for a paladin and a rogue to make a baby?", + "Answer": "Because paladins use protection and rogues do it from behind.\n\n\nTaken from Sodapoppin's stream on December 1st. " + }, + { + "Question": "Do you know how Illidan hurt his knee?", + "Answer": "(this one came through in a GM ticket response today)\n\nDo you know how Illidan hurt his knee?\nIt's simple really...\nHe fel." + }, + { + "Question": "Icecrown Citadel was a pretty cool raid.", + "Answer": "Even thinking about it gives me the chills." + }, + { + "Question": "Why do Blood Elves tan so quickly?", + "Answer": "They use the Sun Well." + }, + { + "Question": "What is Bolvar doing lately?", + "Answer": "Just chillin." + }, + { + "Question": "What do you call 4 Mogu rolling down a hill?", + "Answer": "The Rolling Stones." + }, + { + "Question": "What is Taran Zhu's favorite cooking utensil?", + "Answer": "The Shado-Pan" + }, + { + "Question": "What do you call a vapid celebrity female night elf?", + "Answer": "Kim Darnassian" + }, + { + "Question": "Warlords of Draenor was an emotional expansion.", + "Answer": "Even the raids were in tiers." + }, + { + "Question": "Why do hunters never get married?", + "Answer": "Because they're always dis-engaging." + }, + { + "Question": "What do you call a kind warlock", + "Answer": "Affection lock" + }, + { + "Question": "Which dragon has the dream job?", + "Answer": "Ysera" + }, + { + "Question": "Healers are like artists", + "Answer": "No one appreciates them until they are dead" + }, + { + "Question": "What did Illidan say when one of his group mates' gear was broken?", + "Answer": "\"YOU ARE NOT REPAIRED!\"" + }, + { + "Question": "Why do bars hate rogues?", + "Answer": "Because they only want cheap shots." + }, + { + "Question": "What did the game tell the hunter when he dinged 40?", + "Answer": "You've got mail." + }, + { + "Question": "What do you call a Blood Elf who eats his vegetables?", + "Answer": "Kale'Thas" + }, + { + "Question": "Where do murlocs store their gold and treasure?", + "Answer": "At the River Bank!" + }, + { + "Question": "Why did the undead smell bad?", + "Answer": "He had no nose." + }, + { + "Question": "How did the Rogue one-shot Illidan?", + "Answer": "By using Preparation." + }, + { + "Question": "What's the first thing Illidan sees when he wakes up?", + "Answer": "NOTHING" + }, + { + "Question": "Why are all paladins so clean?", + "Answer": "...Because they are always taking Bubble baths!" + }, + { + "Question": "did you hear about the monk serial killer", + "Answer": "the murders were pre-meditated" + }, + { + "Question": "How much does a serving of Pandaren Cuisine weigh?", + "Answer": "About wonton." + }, + { + "Question": "What injury did Gul'Dan get from playing Tennis.", + "Answer": "Twisted Nethers." + }, + { + "Question": "A patch day joke...", + "Answer": "" + }, + { + "Question": "Yo mamma so fat....", + "Answer": "I tried to shadowstep her and I got a loading screen!" + }, + { + "Question": "What do you call it when the Argent Tournament catches on fire?", + "Answer": "Burning Crusade." + }, + { + "Question": "Why can you never take a good photo of a hunter?", + "Answer": "They are always out of focus" + }, + { + "Question": "How do impoverished Warriors get their weapons?", + "Answer": "They Rend-to-own." + }, + { + "Question": "What is Arthas' favorite camping snack?", + "Answer": "Frostsmores" + }, + { + "Question": "Why are warlocks faster after drinking vodka?", + "Answer": "Because it gives them a Burning Rush!" + }, + { + "Question": "How did the druid catch a fish?", + "Answer": "With his bear hands" + }, + { + "Question": "I really want the new Grove Warden moose mount...", + "Answer": "...you could say, I consider it a moost-have." + }, + { + "Question": "Heard about the time Millhouse Manastorm went to Blackrock Foundry to visit Oregorger?", + "Answer": "Me neither, but I've been assured there will be gnome ore puns." + }, + { + "Question": "So my new maid is a rogue...", + "Answer": "... And she keeps on using [Vanish](http://www.brockaghltd.com/wp/wp-content/uploads/2014/11/31900_4.1405683094.jpg) even when I told her I prefer [Resolve](http://ecx.images-amazon.com/images/I/81a1jTSQzbL._SY355_.jpg). I'm so fed up with her!" + }, + { + "Question": "What do fire elementals eat for breakfast?", + "Answer": "Ragnar-Os" + }, + { + "Question": "Why do mages share cane's?", + "Answer": "Because it's not his cane, it's R Cane!" + }, + { + "Question": "Why do sneaky rogues prefer leather armor?", + "Answer": "because it's made of hide" + }, + { + "Question": "What's it called when an animal spirit crashes your UI?", + "Answer": "A LOA error." + }, + { + "Question": "Man the 90s take so long", + "Answer": "" + }, + { + "Question": "What is Shadow-Lord Iskar's problem?", + "Answer": "Every time we get to him in Hellfire Citadel, he always seems to be in a Fowl mood." + }, + { + "Question": "Why are hunters bad at photography?", + "Answer": "They have no focus." + }, + { + "Question": "Why are paladins good at photography?", + "Answer": "They use the Light" + }, + { + "Question": "How did the paladins get clean?", + "Answer": "They had a bubble bath!" + }, + { + "Question": "You need to be careful of the trees in this game.", + "Answer": "Some of them are shady." + } +] \ No newline at end of file diff --git a/src/NadekoBot/project.json b/src/NadekoBot/project.json index a795d571..c3a8b3b9 100644 --- a/src/NadekoBot/project.json +++ b/src/NadekoBot/project.json @@ -7,7 +7,7 @@ "emitEntryPoint": true, "allowUnsafe": true, "compile": { - "exclude": [ "_Models", "_Classes", "_Modules" ], + "exclude": [ ], }, "copyToOutput": { "include": [ "data" ], @@ -23,7 +23,6 @@ "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "Newtonsoft.Json": "9.0.1", "Microsoft.Extensions.DependencyInjection": "1.0.0", - "Discord.Net.Commands": "1.0.0-dev", "System.Resources.ResourceWriter": "4.0.0-beta-22816", "Google.Apis.YouTube.v3": "1.15.0.582", "Google.Apis.Urlshortener.v1": "1.15.0.138", @@ -35,7 +34,9 @@ "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final", "Microsoft.EntityFrameworkCore.Sqlite": "1.0.0", "CoreCLR-NCalc": "2.1.0", - "ImageProcessorCore": "1.0.0-alpha1045" + "ImageProcessorCore": "1.0.0-alpha1045", + "Discord.Net.Commands": "1.0.0-beta-*", + "Discord.Net": "1.0.0-beta-*" }, "tools": { "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" diff --git a/src/NadekoBot/project.lock.json b/src/NadekoBot/project.lock.json deleted file mode 100644 index 9c9ca106..00000000 --- a/src/NadekoBot/project.lock.json +++ /dev/null @@ -1,9145 +0,0 @@ -{ - "locked": false, - "version": 2, - "targets": { - ".NETCoreApp,Version=v1.0": { - "CoreCLR-NCalc/2.1.0": { - "type": "package", - "dependencies": { - "NETStandard.Library": "1.6.0", - "System.Diagnostics.Debug": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Serialization.Xml": "4.1.1", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading.Thread": "4.0.0" - }, - "compile": { - "lib/netstandard1.3/NCalc.dll": {} - }, - "runtime": { - "lib/netstandard1.3/NCalc.dll": {} - } - }, - "Google.Apis/1.16.0": { - "type": "package", - "dependencies": { - "Google.Apis.Core": "1.16.0", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.IO": "4.1.0", - "System.IO.Compression": "4.1.0", - "System.Linq": "4.1.0", - "System.Net.Http": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Reflection": "4.1.0", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/Google.Apis.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Google.Apis.dll": {} - } - }, - "Google.Apis.Auth/1.15.0": { - "type": "package", - "dependencies": { - "Google.Apis.Core": "1.15.0", - "Newtonsoft.Json": "9.0.1", - "Portable.BouncyCastle": "1.8.1.1", - "System.Collections": "4.0.11", - "System.Console": "4.0.0", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Process": "4.1.0", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Linq": "4.1.0", - "System.Net.Http": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Net.Requests": "4.0.11", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/Google.Apis.Auth.PlatformServices.dll": {}, - "lib/netstandard1.3/Google.Apis.Auth.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Google.Apis.Auth.PlatformServices.dll": {}, - "lib/netstandard1.3/Google.Apis.Auth.dll": {} - } - }, - "Google.Apis.Core/1.16.0": { - "type": "package", - "dependencies": { - "Newtonsoft.Json": "9.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.Net.Http": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/Google.Apis.Core.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Google.Apis.Core.dll": {} - } - }, - "Google.Apis.Customsearch.v1/1.16.0.466": { - "type": "package", - "dependencies": { - "Google.Apis": "1.16.0" - }, - "compile": { - "lib/netstandard1.3/Google.Apis.Customsearch.v1.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Google.Apis.Customsearch.v1.dll": {} - } - }, - "Google.Apis.Urlshortener.v1/1.15.0.138": { - "type": "package", - "dependencies": { - "Google.Apis": "1.15.0", - "Google.Apis.Auth": "1.15.0" - }, - "compile": { - "lib/netstandard1.3/Google.Apis.Urlshortener.v1.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Google.Apis.Urlshortener.v1.dll": {} - } - }, - "Google.Apis.YouTube.v3/1.15.0.582": { - "type": "package", - "dependencies": { - "Google.Apis": "1.15.0", - "Google.Apis.Auth": "1.15.0" - }, - "compile": { - "lib/netstandard1.3/Google.Apis.YouTube.v3.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Google.Apis.YouTube.v3.dll": {} - } - }, - "ImageProcessorCore/1.0.0-alpha1045": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tools": "4.0.1", - "System.IO": "4.1.0", - "System.IO.Compression": "4.1.0", - "System.Linq": "4.1.0", - "System.Numerics.Vectors": "4.1.1", - "System.ObjectModel": "4.0.12", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime.CompilerServices.Unsafe": "4.0.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.Numerics": "4.0.1", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Tasks.Parallel": "4.0.1" - }, - "compile": { - "lib/netstandard1.1/ImageProcessorCore.dll": {} - }, - "runtime": { - "lib/netstandard1.1/ImageProcessorCore.dll": {} - } - }, - "Libuv/1.9.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1" - }, - "runtimeTargets": { - "runtimes/debian-x64/native/libuv.so": { - "assetType": "native", - "rid": "debian-x64" - }, - "runtimes/fedora-x64/native/libuv.so": { - "assetType": "native", - "rid": "fedora-x64" - }, - "runtimes/opensuse-x64/native/libuv.so": { - "assetType": "native", - "rid": "opensuse-x64" - }, - "runtimes/osx/native/libuv.dylib": { - "assetType": "native", - "rid": "osx" - }, - "runtimes/rhel-x64/native/libuv.so": { - "assetType": "native", - "rid": "rhel-x64" - }, - "runtimes/win7-arm/native/libuv.dll": { - "assetType": "native", - "rid": "win7-arm" - }, - "runtimes/win7-x64/native/libuv.dll": { - "assetType": "native", - "rid": "win7-x64" - }, - "runtimes/win7-x86/native/libuv.dll": { - "assetType": "native", - "rid": "win7-x86" - } - } - }, - "Microsoft.AspNetCore.Hosting.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.AspNetCore.Hosting.Server.Abstractions": "1.0.0", - "Microsoft.AspNetCore.Http.Abstractions": "1.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "1.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "1.0.0", - "Microsoft.Extensions.Logging.Abstractions": "1.0.0" - }, - "compile": { - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Abstractions.dll": {} - } - }, - "Microsoft.AspNetCore.Hosting.Server.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.AspNetCore.Http.Features": "1.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "1.0.0" - }, - "compile": { - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll": {} - } - }, - "Microsoft.AspNetCore.Http.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.AspNetCore.Http.Features": "1.0.0", - "System.Globalization.Extensions": "4.0.1", - "System.Linq.Expressions": "4.1.0", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encodings.Web": "4.0.0" - }, - "compile": { - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Abstractions.dll": {} - } - }, - "Microsoft.AspNetCore.Http.Features/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0", - "System.Collections": "4.0.11", - "System.ComponentModel": "4.0.1", - "System.Linq": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Net.WebSockets": "4.0.0", - "System.Runtime.Extensions": "4.1.0", - "System.Security.Claims": "4.0.1", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Security.Principal": "4.0.1" - }, - "compile": { - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Features.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Features.dll": {} - } - }, - "Microsoft.CodeAnalysis.Analyzers/1.1.0": { - "type": "package" - }, - "Microsoft.CodeAnalysis.Common/1.3.0": { - "type": "package", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "1.1.0", - "System.AppContext": "4.1.0", - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Collections.Immutable": "1.2.0", - "System.Console": "4.0.0", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.FileVersionInfo": "4.0.0", - "System.Diagnostics.StackTrace": "4.0.1", - "System.Diagnostics.Tools": "4.0.1", - "System.Dynamic.Runtime": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Metadata": "1.3.0", - "System.Reflection.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.Numerics": "4.0.1", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.CodePages": "4.0.1", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Tasks.Parallel": "4.0.1", - "System.Threading.Thread": "4.0.0", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XDocument": "4.0.11", - "System.Xml.XPath.XDocument": "4.0.1", - "System.Xml.XmlDocument": "4.0.1" - }, - "compile": { - "lib/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.CodeAnalysis.dll": {} - } - }, - "Microsoft.CodeAnalysis.CSharp/1.3.0": { - "type": "package", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[1.3.0]" - }, - "compile": { - "lib/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.CodeAnalysis.CSharp.dll": {} - } - }, - "Microsoft.CodeAnalysis.VisualBasic/1.3.0": { - "type": "package", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "1.3.0" - }, - "compile": { - "lib/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.CodeAnalysis.VisualBasic.dll": {} - } - }, - "Microsoft.CSharp/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Dynamic.Runtime": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.0/Microsoft.CSharp.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.CSharp.dll": {} - } - }, - "Microsoft.Data.Sqlite/1.0.0": { - "type": "package", - "dependencies": { - "SQLite": "3.12.2", - "System.AppContext": "4.1.0", - "System.Data.Common": "4.1.0", - "System.Diagnostics.Debug": "4.0.11", - "System.Linq": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/Microsoft.Data.Sqlite.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.Data.Sqlite.dll": {} - } - }, - "Microsoft.EntityFrameworkCore/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Caching.Memory": "1.0.0", - "Microsoft.Extensions.DependencyInjection": "1.0.0", - "Microsoft.Extensions.Logging": "1.0.0", - "Remotion.Linq": "2.1.1", - "System.Collections.Concurrent": "4.0.12", - "System.Collections.Immutable": "1.2.0", - "System.ComponentModel.Annotations": "4.1.0", - "System.Interactive.Async": "3.0.0", - "System.Linq.Queryable": "4.0.1", - "System.ObjectModel": "4.0.12", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0" - }, - "compile": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.dll": {} - } - }, - "Microsoft.EntityFrameworkCore.Design/1.0.0-preview2-final": { - "type": "package", - "dependencies": { - "Microsoft.EntityFrameworkCore.Design.Core": "1.0.0-preview2-final", - "Microsoft.Extensions.CommandLineUtils": "1.0.0", - "Microsoft.NETCore.App": "1.0.0" - }, - "compile": { - "lib/netcoreapp1.0/Microsoft.EntityFrameworkCore.Design.dll": {} - }, - "runtime": { - "lib/netcoreapp1.0/Microsoft.EntityFrameworkCore.Design.dll": {} - } - }, - "Microsoft.EntityFrameworkCore.Design.Core/1.0.0-preview2-final": { - "type": "package", - "dependencies": { - "Microsoft.AspNetCore.Hosting.Abstractions": "1.0.0", - "Microsoft.EntityFrameworkCore.Relational.Design": "1.0.0", - "System.AppContext": "4.1.0", - "System.Collections.NonGeneric": "4.0.1", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1" - }, - "compile": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Design.Core.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Design.Core.dll": {} - } - }, - "Microsoft.EntityFrameworkCore.Relational/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.CSharp": "4.0.1", - "Microsoft.EntityFrameworkCore": "1.0.0", - "System.Data.Common": "4.1.0", - "System.Diagnostics.DiagnosticSource": "4.0.0", - "System.Text.RegularExpressions": "4.1.0" - }, - "compile": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.dll": {} - } - }, - "Microsoft.EntityFrameworkCore.Relational.Design/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.EntityFrameworkCore.Relational": "1.0.0" - }, - "compile": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.Design.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.Design.dll": {} - } - }, - "Microsoft.EntityFrameworkCore.Sqlite/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Data.Sqlite": "1.0.0", - "Microsoft.EntityFrameworkCore.Relational": "1.0.0", - "System.IO.FileSystem": "4.0.1" - }, - "compile": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Sqlite.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Sqlite.dll": {} - } - }, - "Microsoft.Extensions.Caching.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0", - "System.Collections": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/Microsoft.Extensions.Caching.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Microsoft.Extensions.Caching.Abstractions.dll": {} - } - }, - "Microsoft.Extensions.Caching.Memory/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "1.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0", - "Microsoft.Extensions.Options": "1.0.0", - "System.Linq": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/Microsoft.Extensions.Caching.Memory.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.Extensions.Caching.Memory.dll": {} - } - }, - "Microsoft.Extensions.CommandLineUtils/1.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Console": "4.0.0", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1" - }, - "compile": { - "lib/netstandard1.3/Microsoft.Extensions.CommandLineUtils.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.Extensions.CommandLineUtils.dll": {} - } - }, - "Microsoft.Extensions.Configuration.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0", - "System.Linq": "4.1.0" - }, - "compile": { - "lib/netstandard1.0/Microsoft.Extensions.Configuration.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Microsoft.Extensions.Configuration.Abstractions.dll": {} - } - }, - "Microsoft.Extensions.DependencyInjection/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0", - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.1/Microsoft.Extensions.DependencyInjection.dll": {} - }, - "runtime": { - "lib/netstandard1.1/Microsoft.Extensions.DependencyInjection.dll": {} - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "System.ComponentModel": "4.0.1", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1" - }, - "compile": { - "lib/netstandard1.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {} - } - }, - "Microsoft.Extensions.FileProviders.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1" - }, - "compile": { - "lib/netstandard1.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Microsoft.Extensions.FileProviders.Abstractions.dll": {} - } - }, - "Microsoft.Extensions.Logging/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0", - "Microsoft.Extensions.Logging.Abstractions": "1.0.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.1/Microsoft.Extensions.Logging.dll": {} - }, - "runtime": { - "lib/netstandard1.1/Microsoft.Extensions.Logging.dll": {} - } - }, - "Microsoft.Extensions.Logging.Abstractions/1.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0" - }, - "compile": { - "lib/netstandard1.1/Microsoft.Extensions.Logging.Abstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.1/Microsoft.Extensions.Logging.Abstractions.dll": {} - } - }, - "Microsoft.Extensions.Options/1.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0", - "Microsoft.Extensions.Primitives": "1.0.0", - "System.ComponentModel": "4.0.1", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/Microsoft.Extensions.Options.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Microsoft.Extensions.Options.dll": {} - } - }, - "Microsoft.Extensions.PlatformAbstractions/1.0.0": { - "type": "package", - "dependencies": { - "System.AppContext": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime.Extensions": "4.1.0" - }, - "compile": { - "lib/netstandard1.3/Microsoft.Extensions.PlatformAbstractions.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.Extensions.PlatformAbstractions.dll": {} - } - }, - "Microsoft.Extensions.Primitives/1.0.0": { - "type": "package", - "dependencies": { - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "lib/netstandard1.0/Microsoft.Extensions.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Microsoft.Extensions.Primitives.dll": {} - } - }, - "Microsoft.NETCore.App/1.0.0": { - "type": "package", - "dependencies": { - "Libuv": "1.9.0", - "Microsoft.CSharp": "4.0.1", - "Microsoft.CodeAnalysis.CSharp": "1.3.0", - "Microsoft.CodeAnalysis.VisualBasic": "1.3.0", - "Microsoft.NETCore.DotNetHostPolicy": "1.0.1", - "Microsoft.NETCore.Runtime.CoreCLR": "1.0.2", - "Microsoft.VisualBasic": "10.0.1", - "NETStandard.Library": "1.6.0", - "System.Buffers": "4.0.0", - "System.Collections.Immutable": "1.2.0", - "System.ComponentModel": "4.0.1", - "System.ComponentModel.Annotations": "4.1.0", - "System.Diagnostics.DiagnosticSource": "4.0.0", - "System.Diagnostics.Process": "4.1.0", - "System.Dynamic.Runtime": "4.0.11", - "System.Globalization.Extensions": "4.0.1", - "System.IO.FileSystem.Watcher": "4.0.0", - "System.IO.MemoryMappedFiles": "4.0.0", - "System.IO.UnmanagedMemoryStream": "4.0.1", - "System.Linq.Expressions": "4.1.0", - "System.Linq.Parallel": "4.0.1", - "System.Linq.Queryable": "4.0.1", - "System.Net.NameResolution": "4.0.0", - "System.Net.Requests": "4.0.11", - "System.Net.Security": "4.0.0", - "System.Net.WebHeaderCollection": "4.0.1", - "System.Numerics.Vectors": "4.1.1", - "System.Reflection.DispatchProxy": "4.0.1", - "System.Reflection.Metadata": "1.3.0", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.Reader": "4.0.0", - "System.Runtime.Loader": "4.0.0", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Threading.Tasks.Dataflow": "4.6.0", - "System.Threading.Tasks.Extensions": "4.0.0", - "System.Threading.Tasks.Parallel": "4.0.1", - "System.Threading.Thread": "4.0.0", - "System.Threading.ThreadPool": "4.0.10" - }, - "compile": { - "lib/netcoreapp1.0/_._": {} - }, - "runtime": { - "lib/netcoreapp1.0/_._": {} - } - }, - "Microsoft.NETCore.DotNetHost/1.0.1": { - "type": "package" - }, - "Microsoft.NETCore.DotNetHostPolicy/1.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.DotNetHostResolver": "1.0.1" - } - }, - "Microsoft.NETCore.DotNetHostResolver/1.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.DotNetHost": "1.0.1" - } - }, - "Microsoft.NETCore.Jit/1.0.2": { - "type": "package" - }, - "Microsoft.NETCore.Platforms/1.0.1": { - "type": "package", - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "Microsoft.NETCore.Runtime.CoreCLR/1.0.2": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Jit": "1.0.2", - "Microsoft.NETCore.Windows.ApiSets": "1.0.1" - } - }, - "Microsoft.NETCore.Targets/1.0.1": { - "type": "package", - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "Microsoft.NETCore.Windows.ApiSets/1.0.1": { - "type": "package" - }, - "Microsoft.VisualBasic/10.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Dynamic.Runtime": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.1/Microsoft.VisualBasic.dll": {} - }, - "runtime": { - "lib/netstandard1.3/Microsoft.VisualBasic.dll": {} - } - }, - "Microsoft.Win32.Primitives/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/Microsoft.Win32.Primitives.dll": {} - } - }, - "Microsoft.Win32.Registry/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Registry.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "NETStandard.Library/1.6.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "System.AppContext": "4.1.0", - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Console": "4.0.0", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tools": "4.0.1", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Globalization.Calendars": "4.0.1", - "System.IO": "4.1.0", - "System.IO.Compression": "4.1.0", - "System.IO.Compression.ZipFile": "4.0.1", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Net.Http": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Net.Sockets": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", - "System.Runtime.Numerics": "4.0.1", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Timer": "4.0.1", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XDocument": "4.0.11" - } - }, - "Newtonsoft.Json/9.0.1": { - "type": "package", - "dependencies": { - "Microsoft.CSharp": "4.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Dynamic.Runtime": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Serialization.Primitives": "4.1.1", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XDocument": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/Newtonsoft.Json.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Newtonsoft.Json.dll": {} - } - }, - "NLog/4.4.0-betav15": { - "type": "package", - "dependencies": { - "Microsoft.Extensions.PlatformAbstractions": "1.0.0", - "NETStandard.Library": "1.6.0", - "System.Collections.NonGeneric": "4.0.1", - "System.ComponentModel.TypeConverter": "4.1.0", - "System.Data.Common": "4.1.0", - "System.Diagnostics.Contracts": "4.0.1", - "System.Diagnostics.StackTrace": "4.0.1", - "System.Diagnostics.TraceSource": "4.0.0", - "System.IO.FileSystem.Watcher": "4.0.0", - "System.Net.NameResolution": "4.0.0", - "System.Net.Requests": "4.0.11", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Runtime.Serialization.Primitives": "4.1.1", - "System.Threading.Thread": "4.0.0", - "System.Threading.ThreadPool": "4.0.10", - "System.Xml.XmlDocument": "4.0.1" - }, - "compile": { - "lib/netstandard1.5/NLog.dll": {} - }, - "runtime": { - "lib/netstandard1.5/NLog.dll": {} - } - }, - "Portable.BouncyCastle/1.8.1.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/crypto.dll": {} - }, - "runtime": { - "lib/netstandard1.3/crypto.dll": {} - } - }, - "Remotion.Linq/2.1.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Linq.Queryable": "4.0.1", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/Remotion.Linq.dll": {} - }, - "runtime": { - "lib/netstandard1.0/Remotion.Linq.dll": {} - } - }, - "runtime.native.System/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "runtime.native.System.IO.Compression/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "runtime.native.System.Net.Http/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "runtime.native.System.Net.Security/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "runtime.native.System.Security.Cryptography/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "lib/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.0/_._": {} - } - }, - "SQLite/3.12.2": { - "type": "package", - "dependencies": { - "SQLite.Native": "3.12.2" - } - }, - "SQLite.Native/3.12.2": { - "type": "package", - "runtimeTargets": { - "runtimes/linux-x64/native/libsqlite3.so": { - "assetType": "native", - "rid": "linux-x64" - }, - "runtimes/osx-x64/native/libsqlite3.dylib": { - "assetType": "native", - "rid": "osx-x64" - }, - "runtimes/win7-x64/native/sqlite3.dll": { - "assetType": "native", - "rid": "win7-x64" - }, - "runtimes/win7-x86/native/sqlite3.dll": { - "assetType": "native", - "rid": "win7-x86" - } - } - }, - "System.AppContext/4.1.0": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.6/System.AppContext.dll": {} - }, - "runtime": { - "lib/netstandard1.6/System.AppContext.dll": {} - } - }, - "System.Buffers/4.0.0": { - "type": "package", - "dependencies": { - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.1/System.Buffers.dll": {} - }, - "runtime": { - "lib/netstandard1.1/System.Buffers.dll": {} - } - }, - "System.Collections/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Collections.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Collections.Concurrent/4.0.12": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Collections.Concurrent.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Collections.Concurrent.dll": {} - } - }, - "System.Collections.Immutable/1.2.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/System.Collections.Immutable.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Collections.Immutable.dll": {} - } - }, - "System.Collections.NonGeneric/4.0.1": { - "type": "package", - "dependencies": { - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Collections.NonGeneric.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Collections.NonGeneric.dll": {} - } - }, - "System.Collections.Specialized/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections.NonGeneric": "4.0.1", - "System.Globalization": "4.0.11", - "System.Globalization.Extensions": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Collections.Specialized.dll": {} - } - }, - "System.ComponentModel/4.0.1": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.ComponentModel.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.ComponentModel.dll": {} - } - }, - "System.ComponentModel.Annotations/4.1.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.ComponentModel": "4.0.1", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.4/System.ComponentModel.Annotations.dll": {} - }, - "runtime": { - "lib/netstandard1.4/System.ComponentModel.Annotations.dll": {} - } - }, - "System.ComponentModel.Primitives/4.1.0": { - "type": "package", - "dependencies": { - "System.ComponentModel": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.ComponentModel.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.ComponentModel.Primitives.dll": {} - } - }, - "System.ComponentModel.TypeConverter/4.1.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Collections.NonGeneric": "4.0.1", - "System.Collections.Specialized": "4.0.1", - "System.ComponentModel": "4.0.1", - "System.ComponentModel.Primitives": "4.1.0", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.5/System.ComponentModel.TypeConverter.dll": {} - }, - "runtime": { - "lib/netstandard1.5/System.ComponentModel.TypeConverter.dll": {} - } - }, - "System.Console/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.Runtime": "4.1.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Console.dll": {} - } - }, - "System.Data.Common/4.1.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.2/System.Data.Common.dll": {} - }, - "runtime": { - "lib/netstandard1.2/System.Data.Common.dll": {} - } - }, - "System.Diagnostics.Contracts/4.0.1": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Diagnostics.Contracts.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Diagnostics.Contracts.dll": {} - } - }, - "System.Diagnostics.Debug/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Diagnostics.Debug.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Diagnostics.DiagnosticSource/4.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll": {} - } - }, - "System.Diagnostics.FileVersionInfo/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Reflection.Metadata": "1.3.0", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Diagnostics.FileVersionInfo.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Diagnostics.FileVersionInfo.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Diagnostics.Process/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "Microsoft.Win32.Registry": "4.0.0", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Thread": "4.0.0", - "System.Threading.ThreadPool": "4.0.10", - "runtime.native.System": "4.0.0" - }, - "compile": { - "ref/netstandard1.4/System.Diagnostics.Process.dll": {} - }, - "runtimeTargets": { - "runtimes/linux/lib/netstandard1.4/System.Diagnostics.Process.dll": { - "assetType": "runtime", - "rid": "linux" - }, - "runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll": { - "assetType": "runtime", - "rid": "osx" - }, - "runtimes/win/lib/netstandard1.4/System.Diagnostics.Process.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Diagnostics.StackTrace/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections.Immutable": "1.2.0", - "System.IO.FileSystem": "4.0.1", - "System.Reflection": "4.1.0", - "System.Reflection.Metadata": "1.3.0", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Diagnostics.StackTrace.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Diagnostics.StackTrace.dll": {} - } - }, - "System.Diagnostics.Tools/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Diagnostics.Tools.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Diagnostics.TraceSource/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "runtime.native.System": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Diagnostics.TraceSource.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Diagnostics.TraceSource.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Diagnostics.TraceSource.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Diagnostics.Tracing/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.5/System.Diagnostics.Tracing.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wpa81/_._": {} - } - }, - "System.Dynamic.Runtime/4.0.11": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Emit": "4.0.1", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Dynamic.Runtime.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Dynamic.Runtime.dll": {} - } - }, - "System.Globalization/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Globalization.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Globalization.Calendars/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Globalization": "4.0.11", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Globalization.Calendars.dll": {} - } - }, - "System.Globalization.Extensions/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Globalization.Extensions.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Globalization.Extensions.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Globalization.Extensions.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Interactive.Async/3.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/System.Interactive.Async.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Interactive.Async.dll": {} - } - }, - "System.IO/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.5/System.IO.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.IO.Compression/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "runtime.native.System": "4.0.0", - "runtime.native.System.IO.Compression": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.IO.Compression.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wpa81/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.IO.Compression.ZipFile/4.0.1": { - "type": "package", - "dependencies": { - "System.Buffers": "4.0.0", - "System.IO": "4.1.0", - "System.IO.Compression": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.IO.Compression.ZipFile.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.IO.Compression.ZipFile.dll": {} - } - }, - "System.IO.FileSystem/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Text.Encoding": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.IO.FileSystem.dll": {} - } - }, - "System.IO.FileSystem.Primitives/4.0.1": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll": {} - } - }, - "System.IO.FileSystem.Watcher/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "System.Collections": "4.0.11", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Overlapped": "4.0.1", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Thread": "4.0.0", - "runtime.native.System": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.IO.FileSystem.Watcher.dll": {} - }, - "runtimeTargets": { - "runtimes/linux/lib/netstandard1.3/System.IO.FileSystem.Watcher.dll": { - "assetType": "runtime", - "rid": "linux" - }, - "runtimes/osx/lib/netstandard1.3/System.IO.FileSystem.Watcher.dll": { - "assetType": "runtime", - "rid": "osx" - }, - "runtimes/win/lib/netstandard1.3/System.IO.FileSystem.Watcher.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.IO.MemoryMappedFiles/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.IO.UnmanagedMemoryStream": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "runtime.native.System": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.IO.MemoryMappedFiles.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.IO.MemoryMappedFiles.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.IO.MemoryMappedFiles.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.IO.UnmanagedMemoryStream/4.0.1": { - "type": "package", - "dependencies": { - "System.IO": "4.1.0", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.IO.UnmanagedMemoryStream.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.IO.UnmanagedMemoryStream.dll": {} - } - }, - "System.Linq/4.1.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0" - }, - "compile": { - "ref/netstandard1.6/System.Linq.dll": {} - }, - "runtime": { - "lib/netstandard1.6/System.Linq.dll": {} - } - }, - "System.Linq.Expressions/4.1.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.ObjectModel": "4.0.12", - "System.Reflection": "4.1.0", - "System.Reflection.Emit": "4.0.1", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Emit.Lightweight": "4.0.1", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.6/System.Linq.Expressions.dll": {} - }, - "runtime": { - "lib/netstandard1.6/System.Linq.Expressions.dll": {} - } - }, - "System.Linq.Parallel/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.1/System.Linq.Parallel.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Linq.Parallel.dll": {} - } - }, - "System.Linq.Queryable/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Linq": "4.1.0", - "System.Linq.Expressions": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Linq.Queryable.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Linq.Queryable.dll": {} - } - }, - "System.Net.Http/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.DiagnosticSource": "4.0.0", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Globalization.Extensions": "4.0.1", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.Net.Primitives": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.OpenSsl": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "runtime.native.System": "4.0.0", - "runtime.native.System.Net.Http": "4.0.1", - "runtime.native.System.Security.Cryptography": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Net.Http.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wpa81/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Net.Http.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Net.NameResolution/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Net.Primitives": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Principal.Windows": "4.0.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "runtime.native.System": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Net.NameResolution.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Net.Primitives/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/System.Net.Primitives.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Net.Requests/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Net.Http": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Net.WebHeaderCollection": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Net.Requests.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Net.Requests.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Net.Requests.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Net.Security/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Globalization.Extensions": "4.0.1", - "System.IO": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Claims": "4.0.1", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.OpenSsl": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Security.Principal": "4.0.1", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Threading.ThreadPool": "4.0.10", - "runtime.native.System": "4.0.0", - "runtime.native.System.Net.Security": "4.0.1", - "runtime.native.System.Security.Cryptography": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Net.Security.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Net.Security.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Net.Security.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Net.Sockets/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.Net.Primitives": "4.0.11", - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Net.Sockets.dll": {} - } - }, - "System.Net.WebHeaderCollection/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Net.WebHeaderCollection.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Net.WebHeaderCollection.dll": {} - } - }, - "System.Net.WebSockets/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.Win32.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Net.WebSockets.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Net.WebSockets.dll": {} - } - }, - "System.Net.WebSockets.Client/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Globalization": "4.0.11", - "System.Net.Primitives": "4.0.11", - "System.Net.WebHeaderCollection": "4.0.1", - "System.Net.WebSockets": "4.0.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Cryptography.X509Certificates": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Net.WebSockets.Client.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Net.WebSockets.Client.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Net.WebSockets.Client.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Numerics.Vectors/4.1.1": { - "type": "package", - "dependencies": { - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Numerics.Vectors.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Numerics.Vectors.dll": {} - } - }, - "System.ObjectModel/4.0.12": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.ObjectModel.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.ObjectModel.dll": {} - } - }, - "System.Private.DataContractSerialization/4.1.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Emit.Lightweight": "4.0.1", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Serialization.Primitives": "4.1.1", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XmlDocument": "4.0.1", - "System.Xml.XmlSerializer": "4.0.11" - }, - "compile": { - "ref/netstandard/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Private.DataContractSerialization.dll": {} - } - }, - "System.Reflection/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.IO": "4.1.0", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.5/System.Reflection.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Reflection.DispatchProxy/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Emit": "4.0.1", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Reflection.DispatchProxy.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Reflection.DispatchProxy.dll": {} - } - }, - "System.Reflection.Emit/4.0.1": { - "type": "package", - "dependencies": { - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.1/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Reflection.Emit.dll": {} - } - }, - "System.Reflection.Emit.ILGeneration/4.0.1": { - "type": "package", - "dependencies": { - "System.Reflection": "4.1.0", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll": {} - } - }, - "System.Reflection.Emit.Lightweight/4.0.1": { - "type": "package", - "dependencies": { - "System.Reflection": "4.1.0", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll": {} - } - }, - "System.Reflection.Extensions/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Reflection.Extensions.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Reflection.Metadata/1.3.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Collections.Immutable": "1.2.0", - "System.Diagnostics.Debug": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.1/System.Reflection.Metadata.dll": {} - }, - "runtime": { - "lib/netstandard1.1/System.Reflection.Metadata.dll": {} - } - }, - "System.Reflection.Primitives/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Reflection.Primitives.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Reflection.TypeExtensions/4.1.0": { - "type": "package", - "dependencies": { - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.5/System.Reflection.TypeExtensions.dll": {} - }, - "runtime": { - "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": {} - } - }, - "System.Resources.Reader/4.0.0": { - "type": "package", - "dependencies": { - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/System.Resources.Reader.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Resources.Reader.dll": {} - } - }, - "System.Resources.ResourceManager/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Globalization": "4.0.11", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Resources.ResourceManager.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Resources.ResourceWriter/4.0.0-beta-22816": { - "type": "package", - "dependencies": { - "System.IO": "4.0.10-beta-22816", - "System.Runtime": "4.0.20-beta-22816" - }, - "compile": { - "lib/contract/System.Resources.ResourceWriter.dll": {} - }, - "runtime": { - "lib/aspnetcore50/System.Resources.ResourceWriter.dll": {} - } - }, - "System.Runtime/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1" - }, - "compile": { - "ref/netstandard1.5/System.Runtime.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp80+wpa81/_._": {} - } - }, - "System.Runtime.CompilerServices.Unsafe/4.0.0": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll": {} - } - }, - "System.Runtime.Extensions/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.5/System.Runtime.Extensions.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Runtime.Handles/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.Handles.dll": {} - } - }, - "System.Runtime.InteropServices/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Reflection": "4.1.0", - "System.Reflection.Primitives": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1" - }, - "compile": { - "ref/netstandard1.5/System.Runtime.InteropServices.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wpa81/_._": {} - } - }, - "System.Runtime.InteropServices.RuntimeInformation/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Threading": "4.0.11", - "runtime.native.System": "4.0.0" - }, - "compile": { - "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Runtime.Loader/4.0.0": { - "type": "package", - "dependencies": { - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.5/_._": {} - }, - "runtime": { - "lib/netstandard1.5/System.Runtime.Loader.dll": {} - } - }, - "System.Runtime.Numerics/4.0.1": { - "type": "package", - "dependencies": { - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0" - }, - "compile": { - "ref/netstandard1.1/System.Runtime.Numerics.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Runtime.Numerics.dll": {} - } - }, - "System.Runtime.Serialization.Primitives/4.1.1": { - "type": "package", - "dependencies": { - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll": {} - } - }, - "System.Runtime.Serialization.Xml/4.1.1": { - "type": "package", - "dependencies": { - "System.IO": "4.1.0", - "System.Private.DataContractSerialization": "4.1.1", - "System.Runtime": "4.1.0", - "System.Runtime.Serialization.Primitives": "4.1.1", - "System.Text.Encoding": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Runtime.Serialization.Xml.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Runtime.Serialization.Xml.dll": {} - } - }, - "System.Security.Claims/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Security.Principal": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/System.Security.Claims.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Security.Claims.dll": {} - } - }, - "System.Security.Cryptography.Algorithms/4.2.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.Numerics": "4.0.1", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Text.Encoding": "4.0.11", - "runtime.native.System.Security.Cryptography": "4.0.0" - }, - "compile": { - "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Security.Cryptography.Cng/4.2.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "ref/netstandard1.6/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Security.Cryptography.Csp/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Csp.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Csp.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Security.Cryptography.Encoding/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Text.Encoding": "4.0.11", - "runtime.native.System.Security.Cryptography": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Security.Cryptography.OpenSsl/4.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.Numerics": "4.0.1", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Text.Encoding": "4.0.11", - "runtime.native.System.Security.Cryptography": "4.0.0" - }, - "compile": { - "ref/netstandard1.6/_._": {} - }, - "runtime": { - "lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll": { - "assetType": "runtime", - "rid": "unix" - } - } - }, - "System.Security.Cryptography.Primitives/4.0.0": { - "type": "package", - "dependencies": { - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll": {} - } - }, - "System.Security.Cryptography.X509Certificates/4.1.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.Globalization.Calendars": "4.0.1", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.Numerics": "4.0.1", - "System.Security.Cryptography.Algorithms": "4.2.0", - "System.Security.Cryptography.Cng": "4.2.0", - "System.Security.Cryptography.Csp": "4.0.0", - "System.Security.Cryptography.Encoding": "4.0.0", - "System.Security.Cryptography.OpenSsl": "4.0.0", - "System.Security.Cryptography.Primitives": "4.0.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "runtime.native.System": "4.0.0", - "runtime.native.System.Net.Http": "4.0.1", - "runtime.native.System.Security.Cryptography": "4.0.0" - }, - "compile": { - "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Security.Principal/4.0.1": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.0/System.Security.Principal.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Security.Principal.dll": {} - } - }, - "System.Security.Principal.Windows/4.0.0": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.Win32.Primitives": "4.0.1", - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Security.Claims": "4.0.1", - "System.Security.Principal": "4.0.1", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Text.Encoding/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Text.Encoding.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Text.Encoding.CodePages/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Collections": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.Handles": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Text.Encoding.CodePages.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Text.Encoding.Extensions/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0", - "System.Text.Encoding": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Text.Encoding.Extensions.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Text.Encodings.Web/4.0.0": { - "type": "package", - "dependencies": { - "System.Diagnostics.Debug": "4.0.11", - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/System.Text.Encodings.Web.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Text.Encodings.Web.dll": {} - } - }, - "System.Text.RegularExpressions/4.1.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Globalization": "4.0.11", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11" - }, - "compile": { - "ref/netstandard1.6/System.Text.RegularExpressions.dll": {} - }, - "runtime": { - "lib/netstandard1.6/System.Text.RegularExpressions.dll": {} - } - }, - "System.Threading/4.0.11": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Threading.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Threading.dll": {} - } - }, - "System.Threading.Overlapped/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtimeTargets": { - "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll": { - "assetType": "runtime", - "rid": "unix" - }, - "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll": { - "assetType": "runtime", - "rid": "win" - } - } - }, - "System.Threading.Tasks/4.0.11": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Threading.Tasks.dll": {} - }, - "runtime": { - "lib/portable-net45+win8+wp8+wpa81/_._": {} - } - }, - "System.Threading.Tasks.Dataflow/4.6.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Collections.Concurrent": "4.0.12", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Dynamic.Runtime": "4.0.11", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.1/System.Threading.Tasks.Dataflow.dll": {} - }, - "runtime": { - "lib/netstandard1.1/System.Threading.Tasks.Dataflow.dll": {} - } - }, - "System.Threading.Tasks.Extensions/4.0.0": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Runtime": "4.1.0", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll": {} - }, - "runtime": { - "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll": {} - } - }, - "System.Threading.Tasks.Parallel/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections.Concurrent": "4.0.12", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tracing": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Threading.Tasks": "4.0.11" - }, - "compile": { - "ref/netstandard1.1/System.Threading.Tasks.Parallel.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Threading.Tasks.Parallel.dll": {} - } - }, - "System.Threading.Thread/4.0.0": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.3/System.Threading.Thread.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Threading.Thread.dll": {} - } - }, - "System.Threading.ThreadPool/4.0.10": { - "type": "package", - "dependencies": { - "System.Runtime": "4.1.0", - "System.Runtime.Handles": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/System.Threading.ThreadPool.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Threading.ThreadPool.dll": {} - } - }, - "System.Threading.Timer/4.0.1": { - "type": "package", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1", - "Microsoft.NETCore.Targets": "1.0.1", - "System.Runtime": "4.1.0" - }, - "compile": { - "ref/netstandard1.2/System.Threading.Timer.dll": {} - } - }, - "System.Xml.ReaderWriter/4.0.11": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Runtime.InteropServices": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Text.Encoding.Extensions": "4.0.11", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading.Tasks": "4.0.11", - "System.Threading.Tasks.Extensions": "4.0.0" - }, - "compile": { - "ref/netstandard1.3/System.Xml.ReaderWriter.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.ReaderWriter.dll": {} - } - }, - "System.Xml.XDocument/4.0.11": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Diagnostics.Tools": "4.0.1", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Reflection": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Xml.XDocument.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.XDocument.dll": {} - } - }, - "System.Xml.XmlDocument/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.Encoding": "4.0.11", - "System.Threading": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/System.Xml.XmlDocument.dll": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.XmlDocument.dll": {} - } - }, - "System.Xml.XmlSerializer/4.0.11": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Linq": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.Emit": "4.0.1", - "System.Reflection.Emit.ILGeneration": "4.0.1", - "System.Reflection.Extensions": "4.0.1", - "System.Reflection.Primitives": "4.0.1", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XmlDocument": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.XmlSerializer.dll": {} - } - }, - "System.Xml.XPath/4.0.1": { - "type": "package", - "dependencies": { - "System.Collections": "4.0.11", - "System.Diagnostics.Debug": "4.0.11", - "System.Globalization": "4.0.11", - "System.IO": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.XPath.dll": {} - } - }, - "System.Xml.XPath.XDocument/4.0.1": { - "type": "package", - "dependencies": { - "System.Diagnostics.Debug": "4.0.11", - "System.Linq": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Runtime": "4.1.0", - "System.Runtime.Extensions": "4.1.0", - "System.Threading": "4.0.11", - "System.Xml.ReaderWriter": "4.0.11", - "System.Xml.XDocument": "4.0.11", - "System.Xml.XPath": "4.0.1" - }, - "compile": { - "ref/netstandard1.3/_._": {} - }, - "runtime": { - "lib/netstandard1.3/System.Xml.XPath.XDocument.dll": {} - } - }, - "VideoLibrary/1.3.4": { - "type": "package", - "compile": { - "lib/portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10/libvideo.dll": {} - }, - "runtime": { - "lib/portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10/libvideo.dll": {} - } - }, - "Discord.Net/1.0.0-beta": { - "type": "project", - "framework": ".NETStandard,Version=v1.3", - "dependencies": { - "Microsoft.Win32.Primitives": "4.0.1", - "Newtonsoft.Json": "8.0.3", - "System.Collections.Concurrent": "4.0.12", - "System.Collections.Immutable": "1.2.0", - "System.IO.Compression": "4.1.0", - "System.IO.FileSystem": "4.0.1", - "System.Net.Http": "4.1.0", - "System.Net.NameResolution": "4.0.0", - "System.Net.Sockets": "4.1.0", - "System.Net.WebSockets.Client": "4.0.0", - "System.Reflection.Extensions": "4.0.1", - "System.Runtime.InteropServices": "4.1.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", - "System.Runtime.Serialization.Primitives": "4.1.1", - "System.Text.RegularExpressions": "4.1.0" - }, - "compile": { - "netstandard1.3/Discord.Net.dll": {} - }, - "runtime": { - "netstandard1.3/Discord.Net.dll": {} - } - }, - "Discord.Net.Commands/1.0.0-beta": { - "type": "project", - "framework": ".NETStandard,Version=v1.3", - "dependencies": { - "Discord.Net": "1.0.0" - }, - "compile": { - "netstandard1.3/Discord.Net.Commands.dll": {} - }, - "runtime": { - "netstandard1.3/Discord.Net.Commands.dll": {} - } - } - } - }, - "libraries": { - "CoreCLR-NCalc/2.1.0": { - "sha512": "GUPPo99NUeAgLR5oIOLrApJx3Mx5BZEaKkK9OlDd/CmAYaACLHo68FnO+kCamsLH2+rvr6Rw3hAwzap4GVFV8Q==", - "type": "package", - "path": "CoreCLR-NCalc/2.1.0", - "files": [ - "CoreCLR-NCalc.2.1.0.nupkg.sha512", - "CoreCLR-NCalc.nuspec", - "lib/net451/NCalc.dll", - "lib/netstandard1.3/NCalc.dll" - ] - }, - "Google.Apis/1.16.0": { - "sha512": "/p657K7J7p9aRl6QxUjQfNK0AobxnLHwDWdSqAr/17lZeQR+XMuEbIy7No80+zDeS39kKrRVWFlu1vHiws7gRQ==", - "type": "package", - "path": "Google.Apis/1.16.0", - "files": [ - "Google.Apis.1.16.0.nupkg.sha512", - "Google.Apis.nuspec", - "License.txt", - "lib/net45/Google.Apis.PlatformServices.dll", - "lib/net45/Google.Apis.PlatformServices.pdb", - "lib/net45/Google.Apis.PlatformServices.xml", - "lib/net45/Google.Apis.dll", - "lib/net45/Google.Apis.pdb", - "lib/net45/Google.Apis.xml", - "lib/netstandard1.3/Google.Apis.dll", - "lib/netstandard1.3/Google.Apis.pdb", - "lib/netstandard1.3/Google.Apis.xml", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.dll", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.pdb", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.xml", - "lib/win81/Google.Apis.PlatformServices.dll", - "lib/win81/Google.Apis.PlatformServices.pdb", - "lib/win81/Google.Apis.PlatformServices.xml", - "lib/win81/Google.Apis.dll", - "lib/win81/Google.Apis.pdb", - "lib/win81/Google.Apis.xml", - "lib/wp8/Google.Apis.PlatformServices.dll", - "lib/wp8/Google.Apis.PlatformServices.pdb", - "lib/wp8/Google.Apis.PlatformServices.xml", - "lib/wp8/Google.Apis.dll", - "lib/wp8/Google.Apis.pdb", - "lib/wp8/Google.Apis.xml", - "lib/wpa81/Google.Apis.PlatformServices.dll", - "lib/wpa81/Google.Apis.PlatformServices.pdb", - "lib/wpa81/Google.Apis.PlatformServices.xml", - "lib/wpa81/Google.Apis.dll", - "lib/wpa81/Google.Apis.pdb", - "lib/wpa81/Google.Apis.xml" - ] - }, - "Google.Apis.Auth/1.15.0": { - "sha512": "gBMi03/CjodxVVjByVvvaE4To9905Oe6o59oxzP6AI5uZaab9zNclR+2cu6OcnS5wOIpf5DKAWd+jlSshuZ/cw==", - "type": "package", - "path": "Google.Apis.Auth/1.15.0", - "files": [ - "Google.Apis.Auth.1.15.0.nupkg.sha512", - "Google.Apis.Auth.nuspec", - "License.txt", - "lib/net45/Google.Apis.Auth.PlatformServices.dll", - "lib/net45/Google.Apis.Auth.PlatformServices.pdb", - "lib/net45/Google.Apis.Auth.PlatformServices.xml", - "lib/net45/Google.Apis.Auth.dll", - "lib/net45/Google.Apis.Auth.pdb", - "lib/net45/Google.Apis.Auth.xml", - "lib/netstandard1.3/Google.Apis.Auth.PlatformServices.dll", - "lib/netstandard1.3/Google.Apis.Auth.PlatformServices.pdb", - "lib/netstandard1.3/Google.Apis.Auth.PlatformServices.xml", - "lib/netstandard1.3/Google.Apis.Auth.dll", - "lib/netstandard1.3/Google.Apis.Auth.pdb", - "lib/netstandard1.3/Google.Apis.Auth.xml", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.Auth.dll", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.Auth.pdb", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.Auth.xml", - "lib/win81/Google.Apis.Auth.PlatformServices.dll", - "lib/win81/Google.Apis.Auth.PlatformServices.pdb", - "lib/win81/Google.Apis.Auth.PlatformServices.xml", - "lib/win81/Google.Apis.Auth.dll", - "lib/win81/Google.Apis.Auth.pdb", - "lib/win81/Google.Apis.Auth.xml", - "lib/wp8/Google.Apis.Auth.PlatformServices.dll", - "lib/wp8/Google.Apis.Auth.PlatformServices.pdb", - "lib/wp8/Google.Apis.Auth.PlatformServices.xml", - "lib/wp8/Google.Apis.Auth.dll", - "lib/wp8/Google.Apis.Auth.pdb", - "lib/wp8/Google.Apis.Auth.xml", - "lib/wpa81/Google.Apis.Auth.PlatformServices.dll", - "lib/wpa81/Google.Apis.Auth.PlatformServices.pdb", - "lib/wpa81/Google.Apis.Auth.PlatformServices.xml", - "lib/wpa81/Google.Apis.Auth.dll", - "lib/wpa81/Google.Apis.Auth.pdb", - "lib/wpa81/Google.Apis.Auth.xml" - ] - }, - "Google.Apis.Core/1.16.0": { - "sha512": "uATqVAsPHlpOf+3VV51xFEIghAMSLJyh1hqoVpnPOlkXBx7fkOcs0qP3tKXtmsaeuyC/7BYM1Tt42lyIyhY2lQ==", - "type": "package", - "path": "Google.Apis.Core/1.16.0", - "files": [ - "Google.Apis.Core.1.16.0.nupkg.sha512", - "Google.Apis.Core.nuspec", - "License.txt", - "lib/net45/Google.Apis.Core.dll", - "lib/net45/Google.Apis.Core.pdb", - "lib/net45/Google.Apis.Core.xml", - "lib/netstandard1.3/Google.Apis.Core.dll", - "lib/netstandard1.3/Google.Apis.Core.pdb", - "lib/netstandard1.3/Google.Apis.Core.xml", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.Core.dll", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.Core.pdb", - "lib/portable-net45+sl50+netcore45+wpa81+wp8/Google.Apis.Core.xml" - ] - }, - "Google.Apis.Customsearch.v1/1.16.0.466": { - "sha512": "uZ5VP/xKgTZCMJXgEfwHYEIR/7FsbtvL+bncm08a07RhWLFZTdRpCAkNL4b5wADHkblpkBe1VWKv43W77I4tJw==", - "type": "package", - "path": "Google.Apis.Customsearch.v1/1.16.0.466", - "files": [ - "Google.Apis.Customsearch.v1.1.16.0.466.nupkg.sha512", - "Google.Apis.Customsearch.v1.nuspec", - "lib/netstandard1.3/Google.Apis.Customsearch.v1.dll", - "lib/netstandard1.3/Google.Apis.Customsearch.v1.pdb", - "lib/netstandard1.3/Google.Apis.Customsearch.v1.xml", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.Customsearch.v1.dll", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.Customsearch.v1.pdb", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.Customsearch.v1.xml", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.Customsearch.v1.dll", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.Customsearch.v1.pdb", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.Customsearch.v1.xml" - ] - }, - "Google.Apis.Urlshortener.v1/1.15.0.138": { - "sha512": "67USnpqrk8tWO3LAgaK9qDQT6h8A7i7eUIOKm+OISThZoQuHiLCn6dbg46FVb597LUh57AxClSSbhnweYcYC3Q==", - "type": "package", - "path": "Google.Apis.Urlshortener.v1/1.15.0.138", - "files": [ - "Google.Apis.Urlshortener.v1.1.15.0.138.nupkg.sha512", - "Google.Apis.Urlshortener.v1.nuspec", - "lib/netstandard1.3/Google.Apis.Urlshortener.v1.dll", - "lib/netstandard1.3/Google.Apis.Urlshortener.v1.pdb", - "lib/netstandard1.3/Google.Apis.Urlshortener.v1.xml", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.Urlshortener.v1.dll", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.Urlshortener.v1.pdb", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.Urlshortener.v1.xml", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.Urlshortener.v1.dll", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.Urlshortener.v1.pdb", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.Urlshortener.v1.xml" - ] - }, - "Google.Apis.YouTube.v3/1.15.0.582": { - "sha512": "isR8FdI417PKLgLlNdOVDhduO+8yqPJ+vfID1Zx0MjAa/y3q655Plk2E/KNmsrjvXkqSSWwDCQHPz/Q1fat4tA==", - "type": "package", - "path": "Google.Apis.YouTube.v3/1.15.0.582", - "files": [ - "Google.Apis.YouTube.v3.1.15.0.582.nupkg.sha512", - "Google.Apis.YouTube.v3.nuspec", - "lib/netstandard1.3/Google.Apis.YouTube.v3.dll", - "lib/netstandard1.3/Google.Apis.YouTube.v3.pdb", - "lib/netstandard1.3/Google.Apis.YouTube.v3.xml", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.YouTube.v3.dll", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.YouTube.v3.pdb", - "lib/portable-net40+sl50+netcore45+wpa81+wp8/Google.Apis.YouTube.v3.xml", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.YouTube.v3.dll", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.YouTube.v3.pdb", - "lib/portable-net45+netcore45+wpa81+wp8/Google.Apis.YouTube.v3.xml" - ] - }, - "ImageProcessorCore/1.0.0-alpha1045": { - "sha512": "A5oL7SwFnzcu5eF26u49nf73joQghpEpCGwLb54dm6VI6ZGpjBJpKAyNKtJP30HtXy1VngiGJn/EcvCl8+JGcg==", - "type": "package", - "path": "ImageProcessorCore/1.0.0-alpha1045", - "files": [ - "ImageProcessorCore.1.0.0-alpha1045.nupkg.sha512", - "ImageProcessorCore.nuspec", - "lib/netstandard1.1/ImageProcessorCore.dll" - ] - }, - "Libuv/1.9.0": { - "sha512": "9Q7AaqtQhS8JDSIvRBt6ODSLWDBI4c8YxNxyCQemWebBFUtBbc6M5Vi5Gz1ZyIUlTW3rZK9bIr5gnVyv0z7a2Q==", - "type": "package", - "path": "Libuv/1.9.0", - "files": [ - "Libuv.1.9.0.nupkg.sha512", - "Libuv.nuspec", - "License.txt", - "runtimes/debian-x64/native/libuv.so", - "runtimes/fedora-x64/native/libuv.so", - "runtimes/opensuse-x64/native/libuv.so", - "runtimes/osx/native/libuv.dylib", - "runtimes/rhel-x64/native/libuv.so", - "runtimes/win7-arm/native/libuv.dll", - "runtimes/win7-x64/native/libuv.dll", - "runtimes/win7-x86/native/libuv.dll" - ] - }, - "Microsoft.AspNetCore.Hosting.Abstractions/1.0.0": { - "sha512": "8r6qOl1jYyC523ZKM1QNl+6ijIoYWELWm0tpEWqtTIOg9DytHJWshB7usgqiuRmfHXM0EUziR6ouFY7iP7Tuzw==", - "type": "package", - "path": "Microsoft.AspNetCore.Hosting.Abstractions/1.0.0", - "files": [ - "Microsoft.AspNetCore.Hosting.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.AspNetCore.Hosting.Abstractions.nuspec", - "lib/net451/Microsoft.AspNetCore.Hosting.Abstractions.dll", - "lib/net451/Microsoft.AspNetCore.Hosting.Abstractions.xml", - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Abstractions.dll", - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Abstractions.xml" - ] - }, - "Microsoft.AspNetCore.Hosting.Server.Abstractions/1.0.0": { - "sha512": "sHZyhQEoW15T9E36rfdm5Ux6a6RZB0KNM79ccf2IplWASqmlRGhX4ydU3dzQRLhkHpLx16fnWOL0KScsO6BevQ==", - "type": "package", - "path": "Microsoft.AspNetCore.Hosting.Server.Abstractions/1.0.0", - "files": [ - "Microsoft.AspNetCore.Hosting.Server.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.AspNetCore.Hosting.Server.Abstractions.nuspec", - "lib/net451/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll", - "lib/net451/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml", - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll", - "lib/netstandard1.3/Microsoft.AspNetCore.Hosting.Server.Abstractions.xml" - ] - }, - "Microsoft.AspNetCore.Http.Abstractions/1.0.0": { - "sha512": "OJHlqdJOWKKBfsiVdX4Z4KCNuqvBIu6+1MVKuejRDyHnGyMkNHNoP/dtVzhPqvJXaJg9N4HlD0XNc6GDCFVffg==", - "type": "package", - "path": "Microsoft.AspNetCore.Http.Abstractions/1.0.0", - "files": [ - "Microsoft.AspNetCore.Http.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.AspNetCore.Http.Abstractions.nuspec", - "lib/net451/Microsoft.AspNetCore.Http.Abstractions.dll", - "lib/net451/Microsoft.AspNetCore.Http.Abstractions.xml", - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Abstractions.dll", - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Abstractions.xml" - ] - }, - "Microsoft.AspNetCore.Http.Features/1.0.0": { - "sha512": "6x7zgfbTo1gL9xMEb7EMO2ES/48bqwnWyfH09z+ubWhnzxdhHls8rtqstPylu5FPD9nid6Vo2pgDm5vufRAy5Q==", - "type": "package", - "path": "Microsoft.AspNetCore.Http.Features/1.0.0", - "files": [ - "Microsoft.AspNetCore.Http.Features.1.0.0.nupkg.sha512", - "Microsoft.AspNetCore.Http.Features.nuspec", - "lib/net451/Microsoft.AspNetCore.Http.Features.dll", - "lib/net451/Microsoft.AspNetCore.Http.Features.xml", - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Features.dll", - "lib/netstandard1.3/Microsoft.AspNetCore.Http.Features.xml" - ] - }, - "Microsoft.CodeAnalysis.Analyzers/1.1.0": { - "sha512": "HS3iRWZKcUw/8eZ/08GXKY2Bn7xNzQPzf8gRPHGSowX7u7XXu9i9YEaBeBNKUXWfI7qjvT2zXtLUvbN0hds8vg==", - "type": "package", - "path": "Microsoft.CodeAnalysis.Analyzers/1.1.0", - "files": [ - "Microsoft.CodeAnalysis.Analyzers.1.1.0.nupkg.sha512", - "Microsoft.CodeAnalysis.Analyzers.nuspec", - "ThirdPartyNotices.rtf", - "analyzers/dotnet/cs/Microsoft.CodeAnalysis.Analyzers.dll", - "analyzers/dotnet/cs/Microsoft.CodeAnalysis.CSharp.Analyzers.dll", - "analyzers/dotnet/vb/Microsoft.CodeAnalysis.Analyzers.dll", - "analyzers/dotnet/vb/Microsoft.CodeAnalysis.VisualBasic.Analyzers.dll", - "tools/install.ps1", - "tools/uninstall.ps1" - ] - }, - "Microsoft.CodeAnalysis.Common/1.3.0": { - "sha512": "V09G35cs0CT1C4Dr1IEOh8IGfnWALEVAOO5JXsqagxXwmYR012TlorQ+vx2eXxfZRKs3gAS/r92gN9kRBLba5A==", - "type": "package", - "path": "Microsoft.CodeAnalysis.Common/1.3.0", - "files": [ - "Microsoft.CodeAnalysis.Common.1.3.0.nupkg.sha512", - "Microsoft.CodeAnalysis.Common.nuspec", - "ThirdPartyNotices.rtf", - "lib/net45/Microsoft.CodeAnalysis.dll", - "lib/net45/Microsoft.CodeAnalysis.xml", - "lib/netstandard1.3/Microsoft.CodeAnalysis.dll", - "lib/netstandard1.3/Microsoft.CodeAnalysis.xml", - "lib/portable-net45+win8/Microsoft.CodeAnalysis.dll", - "lib/portable-net45+win8/Microsoft.CodeAnalysis.xml" - ] - }, - "Microsoft.CodeAnalysis.CSharp/1.3.0": { - "sha512": "BgWDIAbSFsHuGeLSn/rljLi51nXqkSo4DZ0qEIrHyPVasrhxEVq7aV8KKZ3HEfSFB+GIhBmOogE+mlOLYg19eg==", - "type": "package", - "path": "Microsoft.CodeAnalysis.CSharp/1.3.0", - "files": [ - "Microsoft.CodeAnalysis.CSharp.1.3.0.nupkg.sha512", - "Microsoft.CodeAnalysis.CSharp.nuspec", - "ThirdPartyNotices.rtf", - "lib/net45/Microsoft.CodeAnalysis.CSharp.dll", - "lib/net45/Microsoft.CodeAnalysis.CSharp.xml", - "lib/netstandard1.3/Microsoft.CodeAnalysis.CSharp.dll", - "lib/netstandard1.3/Microsoft.CodeAnalysis.CSharp.xml", - "lib/portable-net45+win8/Microsoft.CodeAnalysis.CSharp.dll", - "lib/portable-net45+win8/Microsoft.CodeAnalysis.CSharp.xml" - ] - }, - "Microsoft.CodeAnalysis.VisualBasic/1.3.0": { - "sha512": "Sf3k8PkTkWqBmXnnblJbvb7ewO6mJzX6WO2t7m04BmOY5qBq6yhhyXnn/BMM+QCec3Arw3X35Zd8f9eBql0qgg==", - "type": "package", - "path": "Microsoft.CodeAnalysis.VisualBasic/1.3.0", - "files": [ - "Microsoft.CodeAnalysis.VisualBasic.1.3.0.nupkg.sha512", - "Microsoft.CodeAnalysis.VisualBasic.nuspec", - "ThirdPartyNotices.rtf", - "lib/net45/Microsoft.CodeAnalysis.VisualBasic.dll", - "lib/net45/Microsoft.CodeAnalysis.VisualBasic.xml", - "lib/netstandard1.3/Microsoft.CodeAnalysis.VisualBasic.dll", - "lib/netstandard1.3/Microsoft.CodeAnalysis.VisualBasic.xml", - "lib/portable-net45+win8/Microsoft.CodeAnalysis.VisualBasic.dll", - "lib/portable-net45+win8/Microsoft.CodeAnalysis.VisualBasic.xml" - ] - }, - "Microsoft.CSharp/4.0.1": { - "sha512": "17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==", - "type": "package", - "path": "Microsoft.CSharp/4.0.1", - "files": [ - "Microsoft.CSharp.4.0.1.nupkg.sha512", - "Microsoft.CSharp.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/Microsoft.CSharp.dll", - "lib/netstandard1.3/Microsoft.CSharp.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/Microsoft.CSharp.dll", - "ref/netcore50/Microsoft.CSharp.xml", - "ref/netcore50/de/Microsoft.CSharp.xml", - "ref/netcore50/es/Microsoft.CSharp.xml", - "ref/netcore50/fr/Microsoft.CSharp.xml", - "ref/netcore50/it/Microsoft.CSharp.xml", - "ref/netcore50/ja/Microsoft.CSharp.xml", - "ref/netcore50/ko/Microsoft.CSharp.xml", - "ref/netcore50/ru/Microsoft.CSharp.xml", - "ref/netcore50/zh-hans/Microsoft.CSharp.xml", - "ref/netcore50/zh-hant/Microsoft.CSharp.xml", - "ref/netstandard1.0/Microsoft.CSharp.dll", - "ref/netstandard1.0/Microsoft.CSharp.xml", - "ref/netstandard1.0/de/Microsoft.CSharp.xml", - "ref/netstandard1.0/es/Microsoft.CSharp.xml", - "ref/netstandard1.0/fr/Microsoft.CSharp.xml", - "ref/netstandard1.0/it/Microsoft.CSharp.xml", - "ref/netstandard1.0/ja/Microsoft.CSharp.xml", - "ref/netstandard1.0/ko/Microsoft.CSharp.xml", - "ref/netstandard1.0/ru/Microsoft.CSharp.xml", - "ref/netstandard1.0/zh-hans/Microsoft.CSharp.xml", - "ref/netstandard1.0/zh-hant/Microsoft.CSharp.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "Microsoft.Data.Sqlite/1.0.0": { - "sha512": "dezlCGK9zVrPNfoX1SL50GmWDdRQNcV1SBy3wuCn/a0g7Gc26PyvlA4BKapjnCK5N8LSQ2+1PdW2imiRr+YvxA==", - "type": "package", - "path": "Microsoft.Data.Sqlite/1.0.0", - "files": [ - "Microsoft.Data.Sqlite.1.0.0.nupkg.sha512", - "Microsoft.Data.Sqlite.nuspec", - "lib/net451/Microsoft.Data.Sqlite.dll", - "lib/net451/Microsoft.Data.Sqlite.xml", - "lib/netstandard1.3/Microsoft.Data.Sqlite.dll", - "lib/netstandard1.3/Microsoft.Data.Sqlite.xml" - ] - }, - "Microsoft.EntityFrameworkCore/1.0.0": { - "sha512": "Vqg/v0cXRQZQH0gY3VHHqt0Bt5WZEkDReVpI1sNYKHVbVtnMYFKPp5SiNygosUJYrJk1rSGb8UVkplDNNUkEgg==", - "type": "package", - "path": "Microsoft.EntityFrameworkCore/1.0.0", - "files": [ - "Microsoft.EntityFrameworkCore.1.0.0.nupkg.sha512", - "Microsoft.EntityFrameworkCore.nuspec", - "lib/net451/Microsoft.EntityFrameworkCore.dll", - "lib/net451/Microsoft.EntityFrameworkCore.xml", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.dll", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.xml" - ] - }, - "Microsoft.EntityFrameworkCore.Design/1.0.0-preview2-final": { - "sha512": "RhyjntECuOVsrKjgFog9rv+V7oBsxBNxz5NviF7uHvDDQXLyHH3os/CewQxRNsve114AQH5RX/Bww6qAXlSORQ==", - "type": "package", - "path": "Microsoft.EntityFrameworkCore.Design/1.0.0-preview2-final", - "files": [ - "Microsoft.EntityFrameworkCore.Design.1.0.0-preview2-final.nupkg.sha512", - "Microsoft.EntityFrameworkCore.Design.nuspec", - "lib/net451/_._", - "lib/netcore50/_._", - "lib/netcoreapp1.0/Microsoft.EntityFrameworkCore.Design.dll", - "lib/netcoreapp1.0/Microsoft.EntityFrameworkCore.Design.runtimeconfig.json", - "lib/netcoreapp1.0/Microsoft.EntityFrameworkCore.Design.xml", - "runtimes/win7-x64/lib/net451/Microsoft.EntityFrameworkCore.Design.exe", - "runtimes/win7-x86/lib/net451/Microsoft.EntityFrameworkCore.Design.exe" - ] - }, - "Microsoft.EntityFrameworkCore.Design.Core/1.0.0-preview2-final": { - "sha512": "H3pHksGErQSEwWyvISlDYMslIXftS4XB2m0AvqBS08ECGHagh27mqm/oIyUetzzRad+C2V0zpguJmR14eMiRaA==", - "type": "package", - "path": "Microsoft.EntityFrameworkCore.Design.Core/1.0.0-preview2-final", - "files": [ - "Microsoft.EntityFrameworkCore.Design.Core.1.0.0-preview2-final.nupkg.sha512", - "Microsoft.EntityFrameworkCore.Design.Core.nuspec", - "lib/net451/Microsoft.EntityFrameworkCore.Design.Core.dll", - "lib/net451/Microsoft.EntityFrameworkCore.Design.Core.xml", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Design.Core.dll", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Design.Core.xml" - ] - }, - "Microsoft.EntityFrameworkCore.Relational/1.0.0": { - "sha512": "LGBab+7o0eq4C3YtvkAxK8W7Ia57eO0Ue0viQgt0STptQ2bUpLzV7q5LfbNl475rt6yTWa/vDQlYVaI64fwqdw==", - "type": "package", - "path": "Microsoft.EntityFrameworkCore.Relational/1.0.0", - "files": [ - "Microsoft.EntityFrameworkCore.Relational.1.0.0.nupkg.sha512", - "Microsoft.EntityFrameworkCore.Relational.nuspec", - "lib/net451/Microsoft.EntityFrameworkCore.Relational.dll", - "lib/net451/Microsoft.EntityFrameworkCore.Relational.xml", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.dll", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.xml" - ] - }, - "Microsoft.EntityFrameworkCore.Relational.Design/1.0.0": { - "sha512": "pw4EmGTp5U645is0Lyf0C6yU1uQGHVIZiRyxlDNNrRllL0ZjSFKTShv9qbE+fBpvvvArNp2HhDmP7d6vJAt0Dw==", - "type": "package", - "path": "Microsoft.EntityFrameworkCore.Relational.Design/1.0.0", - "files": [ - "Microsoft.EntityFrameworkCore.Relational.Design.1.0.0.nupkg.sha512", - "Microsoft.EntityFrameworkCore.Relational.Design.nuspec", - "lib/net451/Microsoft.EntityFrameworkCore.Relational.Design.dll", - "lib/net451/Microsoft.EntityFrameworkCore.Relational.Design.xml", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.Design.dll", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Relational.Design.xml" - ] - }, - "Microsoft.EntityFrameworkCore.Sqlite/1.0.0": { - "sha512": "GF5xfn90zVKbnCdNrjeH4j1IaAQ7FsHCWkTrdUKISzrPxG3LIizJaU2iu8YMfNhMYd5N1Y7R7SxF2dBh+5A+Ew==", - "type": "package", - "path": "Microsoft.EntityFrameworkCore.Sqlite/1.0.0", - "files": [ - "Microsoft.EntityFrameworkCore.Sqlite.1.0.0.nupkg.sha512", - "Microsoft.EntityFrameworkCore.Sqlite.nuspec", - "lib/net451/Microsoft.EntityFrameworkCore.Sqlite.dll", - "lib/net451/Microsoft.EntityFrameworkCore.Sqlite.xml", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Sqlite.dll", - "lib/netstandard1.3/Microsoft.EntityFrameworkCore.Sqlite.xml" - ] - }, - "Microsoft.Extensions.Caching.Abstractions/1.0.0": { - "sha512": "IxlFDVOchL6tdR05bk7EiJvMtvZrVkZXBhkbXqc3GxOHOrHFGcN+92WoWFPeBpdpy8ot/Px5ZdXzt7k+2n1Bdg==", - "type": "package", - "path": "Microsoft.Extensions.Caching.Abstractions/1.0.0", - "files": [ - "Microsoft.Extensions.Caching.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.Extensions.Caching.Abstractions.nuspec", - "lib/netstandard1.0/Microsoft.Extensions.Caching.Abstractions.dll", - "lib/netstandard1.0/Microsoft.Extensions.Caching.Abstractions.xml" - ] - }, - "Microsoft.Extensions.Caching.Memory/1.0.0": { - "sha512": "6+7zTufCnZ+tfrUo7RbIRR3LB0BxwOwxfXuo0IbLyIvgoToGpWuz5wYEDfCYNOvpig9tY8FA0I1uRHYmITMXMQ==", - "type": "package", - "path": "Microsoft.Extensions.Caching.Memory/1.0.0", - "files": [ - "Microsoft.Extensions.Caching.Memory.1.0.0.nupkg.sha512", - "Microsoft.Extensions.Caching.Memory.nuspec", - "lib/net451/Microsoft.Extensions.Caching.Memory.dll", - "lib/net451/Microsoft.Extensions.Caching.Memory.xml", - "lib/netstandard1.3/Microsoft.Extensions.Caching.Memory.dll", - "lib/netstandard1.3/Microsoft.Extensions.Caching.Memory.xml" - ] - }, - "Microsoft.Extensions.CommandLineUtils/1.0.0": { - "sha512": "kXJ8+YvEjp1j7ezJ7yvQMLYbRL6QlpBUjRoBfqghoe80yqZ5azYB90lL4iNeyRCznWF+cGm41aaIoFU0aOq7TQ==", - "type": "package", - "path": "Microsoft.Extensions.CommandLineUtils/1.0.0", - "files": [ - "Microsoft.Extensions.CommandLineUtils.1.0.0.nupkg.sha512", - "Microsoft.Extensions.CommandLineUtils.nuspec", - "lib/net451/Microsoft.Extensions.CommandLineUtils.dll", - "lib/net451/Microsoft.Extensions.CommandLineUtils.xml", - "lib/netstandard1.3/Microsoft.Extensions.CommandLineUtils.dll", - "lib/netstandard1.3/Microsoft.Extensions.CommandLineUtils.xml" - ] - }, - "Microsoft.Extensions.Configuration.Abstractions/1.0.0": { - "sha512": "nJ+Et/rnDMDmGhxvFAKdN3va7y+YDPICv1nUEP8I4IKgOkWwr/dCZHMqxVhJFrkbW9ux8Kd7erC4mvxfZh0WnA==", - "type": "package", - "path": "Microsoft.Extensions.Configuration.Abstractions/1.0.0", - "files": [ - "Microsoft.Extensions.Configuration.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.Extensions.Configuration.Abstractions.nuspec", - "lib/netstandard1.0/Microsoft.Extensions.Configuration.Abstractions.dll", - "lib/netstandard1.0/Microsoft.Extensions.Configuration.Abstractions.xml" - ] - }, - "Microsoft.Extensions.DependencyInjection/1.0.0": { - "sha512": "zdtkiZNV6LB8xtpmfyUjP/9N9ZCL/ydQ+0bfjun38fbrk+MDEm9M2yeLzRdq+OIt5xExw/KU04wFaVwJ1bhQPg==", - "type": "package", - "path": "Microsoft.Extensions.DependencyInjection/1.0.0", - "files": [ - "Microsoft.Extensions.DependencyInjection.1.0.0.nupkg.sha512", - "Microsoft.Extensions.DependencyInjection.nuspec", - "lib/netstandard1.1/Microsoft.Extensions.DependencyInjection.dll", - "lib/netstandard1.1/Microsoft.Extensions.DependencyInjection.xml" - ] - }, - "Microsoft.Extensions.DependencyInjection.Abstractions/1.0.0": { - "sha512": "+XwaNo3o9RhLQhUnnOBCaukeRi1X9yYc0Fzye9RlErSflKZdw0VgHtn6rvKo0FTionsW0x8QVULhKH+nkqVjQA==", - "type": "package", - "path": "Microsoft.Extensions.DependencyInjection.Abstractions/1.0.0", - "files": [ - "Microsoft.Extensions.DependencyInjection.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.Extensions.DependencyInjection.Abstractions.nuspec", - "lib/netstandard1.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll", - "lib/netstandard1.0/Microsoft.Extensions.DependencyInjection.Abstractions.xml" - ] - }, - "Microsoft.Extensions.FileProviders.Abstractions/1.0.0": { - "sha512": "4jsqTxG3py/hYSsOtZMkNJ2/CQqPdpwyK7bDUkrwHgqowCFSmx/C+R4IzQ+2AK2Up1fVcu+ldC0gktwidL828A==", - "type": "package", - "path": "Microsoft.Extensions.FileProviders.Abstractions/1.0.0", - "files": [ - "Microsoft.Extensions.FileProviders.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.Extensions.FileProviders.Abstractions.nuspec", - "lib/netstandard1.0/Microsoft.Extensions.FileProviders.Abstractions.dll", - "lib/netstandard1.0/Microsoft.Extensions.FileProviders.Abstractions.xml" - ] - }, - "Microsoft.Extensions.Logging/1.0.0": { - "sha512": "0mDuASVrd/nMeBYIJSK+9lT3TSmWxUXP/ipVB1pF1ApMN5fqGCckPTNwmOfT4Z9wPkXGnhbwFTGrxZvbzTWxOg==", - "type": "package", - "path": "Microsoft.Extensions.Logging/1.0.0", - "files": [ - "Microsoft.Extensions.Logging.1.0.0.nupkg.sha512", - "Microsoft.Extensions.Logging.nuspec", - "lib/netstandard1.1/Microsoft.Extensions.Logging.dll", - "lib/netstandard1.1/Microsoft.Extensions.Logging.xml" - ] - }, - "Microsoft.Extensions.Logging.Abstractions/1.0.0": { - "sha512": "wHT6oY50q36mAXBRKtFaB7u07WxKC5u2M8fi3PqHOOnHyUo9gD0u1TlCNR8UObHQxKMYwqlgI8TLcErpt29n8A==", - "type": "package", - "path": "Microsoft.Extensions.Logging.Abstractions/1.0.0", - "files": [ - "Microsoft.Extensions.Logging.Abstractions.1.0.0.nupkg.sha512", - "Microsoft.Extensions.Logging.Abstractions.nuspec", - "lib/netstandard1.1/Microsoft.Extensions.Logging.Abstractions.dll", - "lib/netstandard1.1/Microsoft.Extensions.Logging.Abstractions.xml" - ] - }, - "Microsoft.Extensions.Options/1.0.0": { - "sha512": "SdP3yPKF++JTkoa91pBDiE70uQkR/gdXWzOnMPbSj+eOqY1vgY+b8RVl+gh7TrJ2wlCK2QqnQtvCQlPPZRK36w==", - "type": "package", - "path": "Microsoft.Extensions.Options/1.0.0", - "files": [ - "Microsoft.Extensions.Options.1.0.0.nupkg.sha512", - "Microsoft.Extensions.Options.nuspec", - "lib/netstandard1.0/Microsoft.Extensions.Options.dll", - "lib/netstandard1.0/Microsoft.Extensions.Options.xml" - ] - }, - "Microsoft.Extensions.PlatformAbstractions/1.0.0": { - "sha512": "zyjUzrOmuevOAJpIo3Mt5GmpALVYCVdLZ99keMbmCxxgQH7oxzU58kGHzE6hAgYEiWsdfMJLjVR7r+vSmaJmtg==", - "type": "package", - "path": "Microsoft.Extensions.PlatformAbstractions/1.0.0", - "files": [ - "Microsoft.Extensions.PlatformAbstractions.1.0.0.nupkg.sha512", - "Microsoft.Extensions.PlatformAbstractions.nuspec", - "lib/net451/Microsoft.Extensions.PlatformAbstractions.dll", - "lib/net451/Microsoft.Extensions.PlatformAbstractions.xml", - "lib/netstandard1.3/Microsoft.Extensions.PlatformAbstractions.dll", - "lib/netstandard1.3/Microsoft.Extensions.PlatformAbstractions.xml" - ] - }, - "Microsoft.Extensions.Primitives/1.0.0": { - "sha512": "3q2vzfKEDjL6JFkRpk5SFA3zarYsO6+ZYgoucNImrUMzDn0mFbEOL5p9oPoWiypwypbJVVjWTf557bXZ0YFLig==", - "type": "package", - "path": "Microsoft.Extensions.Primitives/1.0.0", - "files": [ - "Microsoft.Extensions.Primitives.1.0.0.nupkg.sha512", - "Microsoft.Extensions.Primitives.nuspec", - "lib/netstandard1.0/Microsoft.Extensions.Primitives.dll", - "lib/netstandard1.0/Microsoft.Extensions.Primitives.xml" - ] - }, - "Microsoft.NETCore.App/1.0.0": { - "sha512": "Bv40dLDrT+Igcg1e6otW3D8voeJCfcAxOlsxSVlDz+J+cdWls5kblZvPHHvx7gX3/oJoQVIkEeO3sMyv5PSVJA==", - "type": "package", - "path": "Microsoft.NETCore.App/1.0.0", - "files": [ - "Microsoft.NETCore.App.1.0.0.nupkg.sha512", - "Microsoft.NETCore.App.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netcoreapp1.0/_._" - ] - }, - "Microsoft.NETCore.DotNetHost/1.0.1": { - "sha512": "uaMgykq6AckP3hZW4dsD6zjocxyXPz0tcTl8OX7mlSUWsyFXdtf45sjdwI0JIHxt3gnI6GihAlOAwYK8HE4niQ==", - "type": "package", - "path": "Microsoft.NETCore.DotNetHost/1.0.1", - "files": [ - "Microsoft.NETCore.DotNetHost.1.0.1.nupkg.sha512", - "Microsoft.NETCore.DotNetHost.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "runtime.json" - ] - }, - "Microsoft.NETCore.DotNetHostPolicy/1.0.1": { - "sha512": "d8AQ+ZVj2iK9sbgl3IEsshCSaumhM1PNTPHxldZAQLOoI1BKF8QZ1zPCNqwBGisPiWOE3f/1SHDbQi1BTRBxuA==", - "type": "package", - "path": "Microsoft.NETCore.DotNetHostPolicy/1.0.1", - "files": [ - "Microsoft.NETCore.DotNetHostPolicy.1.0.1.nupkg.sha512", - "Microsoft.NETCore.DotNetHostPolicy.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "runtime.json" - ] - }, - "Microsoft.NETCore.DotNetHostResolver/1.0.1": { - "sha512": "GEXgpAHB9E0OhfcmNJ664Xcd2bJkz2qkGIAFmCgEI5ANlQy4qEEmBVfUqA+Z9HB85ZwWxZc1eIJ6fxdxcjrctg==", - "type": "package", - "path": "Microsoft.NETCore.DotNetHostResolver/1.0.1", - "files": [ - "Microsoft.NETCore.DotNetHostResolver.1.0.1.nupkg.sha512", - "Microsoft.NETCore.DotNetHostResolver.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "runtime.json" - ] - }, - "Microsoft.NETCore.Jit/1.0.2": { - "sha512": "Ok2vWofa6X8WD9vc4pfLHwvJz1/B6t3gOAoZcjrjrQf7lQOlNIuZIZtLn3wnWX28DuQGpPJkRlBxFj7Z5txNqw==", - "type": "package", - "path": "Microsoft.NETCore.Jit/1.0.2", - "files": [ - "Microsoft.NETCore.Jit.1.0.2.nupkg.sha512", - "Microsoft.NETCore.Jit.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "runtime.json" - ] - }, - "Microsoft.NETCore.Platforms/1.0.1": { - "sha512": "2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==", - "type": "package", - "path": "Microsoft.NETCore.Platforms/1.0.1", - "files": [ - "Microsoft.NETCore.Platforms.1.0.1.nupkg.sha512", - "Microsoft.NETCore.Platforms.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.json" - ] - }, - "Microsoft.NETCore.Runtime.CoreCLR/1.0.2": { - "sha512": "A0x1xtTjYJWZr2DRzgfCOXgB0JkQg8twnmtTJ79wFje+IihlLbXtx6Z2AxyVokBM5ruwTedR6YdCmHk39QJdtQ==", - "type": "package", - "path": "Microsoft.NETCore.Runtime.CoreCLR/1.0.2", - "files": [ - "Microsoft.NETCore.Runtime.CoreCLR.1.0.2.nupkg.sha512", - "Microsoft.NETCore.Runtime.CoreCLR.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "runtime.json" - ] - }, - "Microsoft.NETCore.Targets/1.0.1": { - "sha512": "rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==", - "type": "package", - "path": "Microsoft.NETCore.Targets/1.0.1", - "files": [ - "Microsoft.NETCore.Targets.1.0.1.nupkg.sha512", - "Microsoft.NETCore.Targets.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.json" - ] - }, - "Microsoft.NETCore.Windows.ApiSets/1.0.1": { - "sha512": "SaToCvvsGMxTgtLv/BrFQ5IFMPRE1zpWbnqbpwykJa8W5XiX82CXI6K2o7yf5xS7EP6t/JzFLV0SIDuWpvBZVw==", - "type": "package", - "path": "Microsoft.NETCore.Windows.ApiSets/1.0.1", - "files": [ - "Microsoft.NETCore.Windows.ApiSets.1.0.1.nupkg.sha512", - "Microsoft.NETCore.Windows.ApiSets.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "runtime.json" - ] - }, - "Microsoft.VisualBasic/10.0.1": { - "sha512": "HpNyOf/4Tp2lh4FyywB55VITk0SqVxEjDzsVDDyF1yafDN6Bq18xcHowzCPINyYHUTgGcEtmpYiRsFdSo0KKdQ==", - "type": "package", - "path": "Microsoft.VisualBasic/10.0.1", - "files": [ - "Microsoft.VisualBasic.10.0.1.nupkg.sha512", - "Microsoft.VisualBasic.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net45/_._", - "lib/netcore50/Microsoft.VisualBasic.dll", - "lib/netstandard1.3/Microsoft.VisualBasic.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "ref/net45/_._", - "ref/netcore50/Microsoft.VisualBasic.dll", - "ref/netcore50/Microsoft.VisualBasic.xml", - "ref/netcore50/de/Microsoft.VisualBasic.xml", - "ref/netcore50/es/Microsoft.VisualBasic.xml", - "ref/netcore50/fr/Microsoft.VisualBasic.xml", - "ref/netcore50/it/Microsoft.VisualBasic.xml", - "ref/netcore50/ja/Microsoft.VisualBasic.xml", - "ref/netcore50/ko/Microsoft.VisualBasic.xml", - "ref/netcore50/ru/Microsoft.VisualBasic.xml", - "ref/netcore50/zh-hans/Microsoft.VisualBasic.xml", - "ref/netcore50/zh-hant/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/Microsoft.VisualBasic.dll", - "ref/netstandard1.1/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/de/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/es/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/fr/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/it/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/ja/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/ko/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/ru/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/zh-hans/Microsoft.VisualBasic.xml", - "ref/netstandard1.1/zh-hant/Microsoft.VisualBasic.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._" - ] - }, - "Microsoft.Win32.Primitives/4.0.1": { - "sha512": "fQnBHO9DgcmkC9dYSJoBqo6sH1VJwJprUHh8F3hbcRlxiQiBUuTntdk8tUwV490OqC2kQUrinGwZyQHTieuXRA==", - "type": "package", - "path": "Microsoft.Win32.Primitives/4.0.1", - "files": [ - "Microsoft.Win32.Primitives.4.0.1.nupkg.sha512", - "Microsoft.Win32.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/Microsoft.Win32.Primitives.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/Microsoft.Win32.Primitives.dll", - "ref/netstandard1.3/Microsoft.Win32.Primitives.dll", - "ref/netstandard1.3/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/de/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/es/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/fr/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/it/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/ja/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/ko/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/ru/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/zh-hans/Microsoft.Win32.Primitives.xml", - "ref/netstandard1.3/zh-hant/Microsoft.Win32.Primitives.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "Microsoft.Win32.Registry/4.0.0": { - "sha512": "q+eLtROUAQ3OxYA5mpQrgyFgzLQxIyrfT2eLpYX5IEPlHmIio2nh4F5bgOaQoGOV865kFKZZso9Oq9RlazvXtg==", - "type": "package", - "path": "Microsoft.Win32.Registry/4.0.0", - "files": [ - "Microsoft.Win32.Registry.4.0.0.nupkg.sha512", - "Microsoft.Win32.Registry.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net46/Microsoft.Win32.Registry.dll", - "ref/net46/Microsoft.Win32.Registry.dll", - "ref/netstandard1.3/Microsoft.Win32.Registry.dll", - "ref/netstandard1.3/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/de/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/es/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/fr/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/it/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/ja/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/ko/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/ru/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/zh-hans/Microsoft.Win32.Registry.xml", - "ref/netstandard1.3/zh-hant/Microsoft.Win32.Registry.xml", - "runtimes/unix/lib/netstandard1.3/Microsoft.Win32.Registry.dll", - "runtimes/win/lib/net46/Microsoft.Win32.Registry.dll", - "runtimes/win/lib/netcore50/_._", - "runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll" - ] - }, - "NETStandard.Library/1.6.0": { - "sha512": "ypsCvIdCZ4IoYASJHt6tF2fMo7N30NLgV1EbmC+snO490OMl9FvVxmumw14rhReWU3j3g7BYudG6YCrchwHJlA==", - "type": "package", - "path": "NETStandard.Library/1.6.0", - "files": [ - "NETStandard.Library.1.6.0.nupkg.sha512", - "NETStandard.Library.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt" - ] - }, - "Newtonsoft.Json/9.0.1": { - "sha512": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", - "type": "package", - "path": "Newtonsoft.Json/9.0.1", - "files": [ - "Newtonsoft.Json.9.0.1.nupkg.sha512", - "Newtonsoft.Json.nuspec", - "lib/net20/Newtonsoft.Json.dll", - "lib/net20/Newtonsoft.Json.xml", - "lib/net35/Newtonsoft.Json.dll", - "lib/net35/Newtonsoft.Json.xml", - "lib/net40/Newtonsoft.Json.dll", - "lib/net40/Newtonsoft.Json.xml", - "lib/net45/Newtonsoft.Json.dll", - "lib/net45/Newtonsoft.Json.xml", - "lib/netstandard1.0/Newtonsoft.Json.dll", - "lib/netstandard1.0/Newtonsoft.Json.xml", - "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.dll", - "lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.xml", - "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.dll", - "lib/portable-net45+wp80+win8+wpa81/Newtonsoft.Json.xml", - "tools/install.ps1" - ] - }, - "NLog/4.4.0-betav15": { - "sha512": "LDRcdjv5VG9EWz+mnFqdSolUci+j+DBPIPjm7Xdam3xa1F9Rt7o0UpYoCnNRulqHzpKbU704o7Ad4ck9WxDhnw==", - "type": "package", - "path": "NLog/4.4.0-betav15", - "files": [ - "NLog.4.4.0-betav15.nupkg.sha512", - "NLog.nuspec", - "lib/monoandroid23/NLog.dll", - "lib/monoandroid23/NLog.xml", - "lib/net35/NLog.dll", - "lib/net35/NLog.xml", - "lib/net40/NLog.dll", - "lib/net40/NLog.xml", - "lib/net45/NLog.dll", - "lib/net45/NLog.xml", - "lib/netstandard1.3/NLog.dll", - "lib/netstandard1.3/NLog.xml", - "lib/netstandard1.5/NLog.dll", - "lib/netstandard1.5/NLog.xml", - "lib/sl40/NLog.dll", - "lib/sl40/NLog.xml", - "lib/sl50/NLog.dll", - "lib/sl50/NLog.xml", - "lib/wp80/NLog.dll", - "lib/wp80/NLog.xml", - "lib/xamarinios10/NLog.dll", - "lib/xamarinios10/NLog.xml" - ] - }, - "Portable.BouncyCastle/1.8.1.1": { - "sha512": "bKqC2Me9ukybNYTBhlYd2sJ6j2kRV7SgB+JfiP2GueYq6QdM4Ym6PYV5eyrqb6KViOyd3zqQfJp0o6UW5ZG+GQ==", - "type": "package", - "path": "Portable.BouncyCastle/1.8.1.1", - "files": [ - "Portable.BouncyCastle.1.8.1.1.nupkg.sha512", - "Portable.BouncyCastle.nuspec", - "Readme.html", - "lib/netstandard1.0/crypto.dll", - "lib/netstandard1.0/crypto.pdb", - "lib/netstandard1.0/crypto.xml", - "lib/netstandard1.3/crypto.dll", - "lib/netstandard1.3/crypto.pdb", - "lib/netstandard1.3/crypto.xml", - "lib/portable-net4+sl5+wp8+win8+wpa81/crypto.dll", - "lib/portable-net4+sl5+wp8+win8+wpa81/crypto.pdb", - "lib/portable-net4+sl5+wp8+win8+wpa81/crypto.xml" - ] - }, - "Remotion.Linq/2.1.1": { - "sha512": "IJn0BqkvwEDpP+2qjvci7n4/a9f7DhKESLWb2/uG4xQh3rTkGTBUz69bI4IivCoKkTFAqjXxYDZw2K/npohjsw==", - "type": "package", - "path": "Remotion.Linq/2.1.1", - "files": [ - "Remotion.Linq.2.1.1.nupkg.sha512", - "Remotion.Linq.nuspec", - "lib/net35/Remotion.Linq.XML", - "lib/net35/Remotion.Linq.dll", - "lib/net40/Remotion.Linq.XML", - "lib/net40/Remotion.Linq.dll", - "lib/net45/Remotion.Linq.XML", - "lib/net45/Remotion.Linq.dll", - "lib/netstandard1.0/Remotion.Linq.dll", - "lib/netstandard1.0/Remotion.Linq.xml", - "lib/portable-net45+win+wpa81+wp80/Remotion.Linq.dll", - "lib/portable-net45+win+wpa81+wp80/Remotion.Linq.xml" - ] - }, - "runtime.native.System/4.0.0": { - "sha512": "QfS/nQI7k/BLgmLrw7qm7YBoULEvgWnPI+cYsbfCVFTW8Aj+i8JhccxcFMu1RWms0YZzF+UHguNBK4Qn89e2Sg==", - "type": "package", - "path": "runtime.native.System/4.0.0", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.4.0.0.nupkg.sha512", - "runtime.native.System.nuspec" - ] - }, - "runtime.native.System.IO.Compression/4.1.0": { - "sha512": "Ob7nvnJBox1aaB222zSVZSkf4WrebPG4qFscfK7vmD7P7NxoSxACQLtO7ytWpqXDn2wcd/+45+EAZ7xjaPip8A==", - "type": "package", - "path": "runtime.native.System.IO.Compression/4.1.0", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.IO.Compression.4.1.0.nupkg.sha512", - "runtime.native.System.IO.Compression.nuspec" - ] - }, - "runtime.native.System.Net.Http/4.0.1": { - "sha512": "Nh0UPZx2Vifh8r+J+H2jxifZUD3sBrmolgiFWJd2yiNrxO0xTa6bAw3YwRn1VOiSen/tUXMS31ttNItCZ6lKuA==", - "type": "package", - "path": "runtime.native.System.Net.Http/4.0.1", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.Net.Http.4.0.1.nupkg.sha512", - "runtime.native.System.Net.Http.nuspec" - ] - }, - "runtime.native.System.Net.Security/4.0.1": { - "sha512": "Az6Ff6rZFb8nYGAaejFR6jr8ktt9f3e1Q/yKdw0pwHNTLaO/1eCAC9vzBoR9YAb0QeZD6fZXl1A9tRB5stpzXA==", - "type": "package", - "path": "runtime.native.System.Net.Security/4.0.1", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.Net.Security.4.0.1.nupkg.sha512", - "runtime.native.System.Net.Security.nuspec" - ] - }, - "runtime.native.System.Security.Cryptography/4.0.0": { - "sha512": "2CQK0jmO6Eu7ZeMgD+LOFbNJSXHFVQbCJJkEyEwowh1SCgYnrn9W9RykMfpeeVGw7h4IBvYikzpGUlmZTUafJw==", - "type": "package", - "path": "runtime.native.System.Security.Cryptography/4.0.0", - "files": [ - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/_._", - "runtime.native.System.Security.Cryptography.4.0.0.nupkg.sha512", - "runtime.native.System.Security.Cryptography.nuspec" - ] - }, - "SQLite/3.12.2": { - "sha512": "XYNQJt2eFqGluWP+fDaiNrV1v3kA+VsU2ygUjLx7zqzhIZKlAjSYMZLldmbGNnlNC5rKR+0LTrN0IA9dZkDyFw==", - "type": "package", - "path": "SQLite/3.12.2", - "files": [ - "SQLite.3.12.2.nupkg.sha512", - "SQLite.nuspec" - ] - }, - "SQLite.Native/3.12.2": { - "sha512": "/5BdEFTaCziE6K5OG0bjSUhPo+LRmFcmyriFWEZNSuHaiqSp69sVngTb/Yo8mH6JykMA79BFdCBLMW+2E3pnuA==", - "type": "package", - "path": "SQLite.Native/3.12.2", - "files": [ - "SQLite.Native.3.12.2.nupkg.sha512", - "SQLite.Native.nuspec", - "build/net45/SQLite.Native.props", - "runtimes/linux-x64/native/libsqlite3.so", - "runtimes/osx-x64/native/libsqlite3.dylib", - "runtimes/win7-x64/native/sqlite3.dll", - "runtimes/win7-x86/native/sqlite3.dll" - ] - }, - "System.AppContext/4.1.0": { - "sha512": "3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==", - "type": "package", - "path": "System.AppContext/4.1.0", - "files": [ - "System.AppContext.4.1.0.nupkg.sha512", - "System.AppContext.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.AppContext.dll", - "lib/net463/System.AppContext.dll", - "lib/netcore50/System.AppContext.dll", - "lib/netstandard1.6/System.AppContext.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.AppContext.dll", - "ref/net463/System.AppContext.dll", - "ref/netstandard/_._", - "ref/netstandard1.3/System.AppContext.dll", - "ref/netstandard1.3/System.AppContext.xml", - "ref/netstandard1.3/de/System.AppContext.xml", - "ref/netstandard1.3/es/System.AppContext.xml", - "ref/netstandard1.3/fr/System.AppContext.xml", - "ref/netstandard1.3/it/System.AppContext.xml", - "ref/netstandard1.3/ja/System.AppContext.xml", - "ref/netstandard1.3/ko/System.AppContext.xml", - "ref/netstandard1.3/ru/System.AppContext.xml", - "ref/netstandard1.3/zh-hans/System.AppContext.xml", - "ref/netstandard1.3/zh-hant/System.AppContext.xml", - "ref/netstandard1.6/System.AppContext.dll", - "ref/netstandard1.6/System.AppContext.xml", - "ref/netstandard1.6/de/System.AppContext.xml", - "ref/netstandard1.6/es/System.AppContext.xml", - "ref/netstandard1.6/fr/System.AppContext.xml", - "ref/netstandard1.6/it/System.AppContext.xml", - "ref/netstandard1.6/ja/System.AppContext.xml", - "ref/netstandard1.6/ko/System.AppContext.xml", - "ref/netstandard1.6/ru/System.AppContext.xml", - "ref/netstandard1.6/zh-hans/System.AppContext.xml", - "ref/netstandard1.6/zh-hant/System.AppContext.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.AppContext.dll" - ] - }, - "System.Buffers/4.0.0": { - "sha512": "msXumHfjjURSkvxUjYuq4N2ghHoRi2VpXcKMA7gK6ujQfU3vGpl+B6ld0ATRg+FZFpRyA6PgEPA+VlIkTeNf2w==", - "type": "package", - "path": "System.Buffers/4.0.0", - "files": [ - "System.Buffers.4.0.0.nupkg.sha512", - "System.Buffers.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.1/.xml", - "lib/netstandard1.1/System.Buffers.dll" - ] - }, - "System.Collections/4.0.11": { - "sha512": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", - "type": "package", - "path": "System.Collections/4.0.11", - "files": [ - "System.Collections.4.0.11.nupkg.sha512", - "System.Collections.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Collections.dll", - "ref/netcore50/System.Collections.xml", - "ref/netcore50/de/System.Collections.xml", - "ref/netcore50/es/System.Collections.xml", - "ref/netcore50/fr/System.Collections.xml", - "ref/netcore50/it/System.Collections.xml", - "ref/netcore50/ja/System.Collections.xml", - "ref/netcore50/ko/System.Collections.xml", - "ref/netcore50/ru/System.Collections.xml", - "ref/netcore50/zh-hans/System.Collections.xml", - "ref/netcore50/zh-hant/System.Collections.xml", - "ref/netstandard1.0/System.Collections.dll", - "ref/netstandard1.0/System.Collections.xml", - "ref/netstandard1.0/de/System.Collections.xml", - "ref/netstandard1.0/es/System.Collections.xml", - "ref/netstandard1.0/fr/System.Collections.xml", - "ref/netstandard1.0/it/System.Collections.xml", - "ref/netstandard1.0/ja/System.Collections.xml", - "ref/netstandard1.0/ko/System.Collections.xml", - "ref/netstandard1.0/ru/System.Collections.xml", - "ref/netstandard1.0/zh-hans/System.Collections.xml", - "ref/netstandard1.0/zh-hant/System.Collections.xml", - "ref/netstandard1.3/System.Collections.dll", - "ref/netstandard1.3/System.Collections.xml", - "ref/netstandard1.3/de/System.Collections.xml", - "ref/netstandard1.3/es/System.Collections.xml", - "ref/netstandard1.3/fr/System.Collections.xml", - "ref/netstandard1.3/it/System.Collections.xml", - "ref/netstandard1.3/ja/System.Collections.xml", - "ref/netstandard1.3/ko/System.Collections.xml", - "ref/netstandard1.3/ru/System.Collections.xml", - "ref/netstandard1.3/zh-hans/System.Collections.xml", - "ref/netstandard1.3/zh-hant/System.Collections.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Collections.Concurrent/4.0.12": { - "sha512": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", - "type": "package", - "path": "System.Collections.Concurrent/4.0.12", - "files": [ - "System.Collections.Concurrent.4.0.12.nupkg.sha512", - "System.Collections.Concurrent.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Collections.Concurrent.dll", - "lib/netstandard1.3/System.Collections.Concurrent.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Collections.Concurrent.dll", - "ref/netcore50/System.Collections.Concurrent.xml", - "ref/netcore50/de/System.Collections.Concurrent.xml", - "ref/netcore50/es/System.Collections.Concurrent.xml", - "ref/netcore50/fr/System.Collections.Concurrent.xml", - "ref/netcore50/it/System.Collections.Concurrent.xml", - "ref/netcore50/ja/System.Collections.Concurrent.xml", - "ref/netcore50/ko/System.Collections.Concurrent.xml", - "ref/netcore50/ru/System.Collections.Concurrent.xml", - "ref/netcore50/zh-hans/System.Collections.Concurrent.xml", - "ref/netcore50/zh-hant/System.Collections.Concurrent.xml", - "ref/netstandard1.1/System.Collections.Concurrent.dll", - "ref/netstandard1.1/System.Collections.Concurrent.xml", - "ref/netstandard1.1/de/System.Collections.Concurrent.xml", - "ref/netstandard1.1/es/System.Collections.Concurrent.xml", - "ref/netstandard1.1/fr/System.Collections.Concurrent.xml", - "ref/netstandard1.1/it/System.Collections.Concurrent.xml", - "ref/netstandard1.1/ja/System.Collections.Concurrent.xml", - "ref/netstandard1.1/ko/System.Collections.Concurrent.xml", - "ref/netstandard1.1/ru/System.Collections.Concurrent.xml", - "ref/netstandard1.1/zh-hans/System.Collections.Concurrent.xml", - "ref/netstandard1.1/zh-hant/System.Collections.Concurrent.xml", - "ref/netstandard1.3/System.Collections.Concurrent.dll", - "ref/netstandard1.3/System.Collections.Concurrent.xml", - "ref/netstandard1.3/de/System.Collections.Concurrent.xml", - "ref/netstandard1.3/es/System.Collections.Concurrent.xml", - "ref/netstandard1.3/fr/System.Collections.Concurrent.xml", - "ref/netstandard1.3/it/System.Collections.Concurrent.xml", - "ref/netstandard1.3/ja/System.Collections.Concurrent.xml", - "ref/netstandard1.3/ko/System.Collections.Concurrent.xml", - "ref/netstandard1.3/ru/System.Collections.Concurrent.xml", - "ref/netstandard1.3/zh-hans/System.Collections.Concurrent.xml", - "ref/netstandard1.3/zh-hant/System.Collections.Concurrent.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Collections.Immutable/1.2.0": { - "sha512": "Cma8cBW6di16ZLibL8LYQ+cLjGzoKxpOTu/faZfDcx94ZjAGq6Nv5RO7+T1YZXqEXTZP9rt1wLVEONVpURtUqw==", - "type": "package", - "path": "System.Collections.Immutable/1.2.0", - "files": [ - "System.Collections.Immutable.1.2.0.nupkg.sha512", - "System.Collections.Immutable.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/System.Collections.Immutable.dll", - "lib/netstandard1.0/System.Collections.Immutable.xml", - "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.dll", - "lib/portable-net45+win8+wp8+wpa81/System.Collections.Immutable.xml" - ] - }, - "System.Collections.NonGeneric/4.0.1": { - "sha512": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", - "type": "package", - "path": "System.Collections.NonGeneric/4.0.1", - "files": [ - "System.Collections.NonGeneric.4.0.1.nupkg.sha512", - "System.Collections.NonGeneric.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Collections.NonGeneric.dll", - "lib/netstandard1.3/System.Collections.NonGeneric.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Collections.NonGeneric.dll", - "ref/netstandard1.3/System.Collections.NonGeneric.dll", - "ref/netstandard1.3/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/de/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/es/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/fr/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/it/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/ja/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/ko/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/ru/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/zh-hans/System.Collections.NonGeneric.xml", - "ref/netstandard1.3/zh-hant/System.Collections.NonGeneric.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Collections.Specialized/4.0.1": { - "sha512": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", - "type": "package", - "path": "System.Collections.Specialized/4.0.1", - "files": [ - "System.Collections.Specialized.4.0.1.nupkg.sha512", - "System.Collections.Specialized.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Collections.Specialized.dll", - "lib/netstandard1.3/System.Collections.Specialized.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Collections.Specialized.dll", - "ref/netstandard1.3/System.Collections.Specialized.dll", - "ref/netstandard1.3/System.Collections.Specialized.xml", - "ref/netstandard1.3/de/System.Collections.Specialized.xml", - "ref/netstandard1.3/es/System.Collections.Specialized.xml", - "ref/netstandard1.3/fr/System.Collections.Specialized.xml", - "ref/netstandard1.3/it/System.Collections.Specialized.xml", - "ref/netstandard1.3/ja/System.Collections.Specialized.xml", - "ref/netstandard1.3/ko/System.Collections.Specialized.xml", - "ref/netstandard1.3/ru/System.Collections.Specialized.xml", - "ref/netstandard1.3/zh-hans/System.Collections.Specialized.xml", - "ref/netstandard1.3/zh-hant/System.Collections.Specialized.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.ComponentModel/4.0.1": { - "sha512": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", - "type": "package", - "path": "System.ComponentModel/4.0.1", - "files": [ - "System.ComponentModel.4.0.1.nupkg.sha512", - "System.ComponentModel.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.ComponentModel.dll", - "lib/netstandard1.3/System.ComponentModel.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.ComponentModel.dll", - "ref/netcore50/System.ComponentModel.xml", - "ref/netcore50/de/System.ComponentModel.xml", - "ref/netcore50/es/System.ComponentModel.xml", - "ref/netcore50/fr/System.ComponentModel.xml", - "ref/netcore50/it/System.ComponentModel.xml", - "ref/netcore50/ja/System.ComponentModel.xml", - "ref/netcore50/ko/System.ComponentModel.xml", - "ref/netcore50/ru/System.ComponentModel.xml", - "ref/netcore50/zh-hans/System.ComponentModel.xml", - "ref/netcore50/zh-hant/System.ComponentModel.xml", - "ref/netstandard1.0/System.ComponentModel.dll", - "ref/netstandard1.0/System.ComponentModel.xml", - "ref/netstandard1.0/de/System.ComponentModel.xml", - "ref/netstandard1.0/es/System.ComponentModel.xml", - "ref/netstandard1.0/fr/System.ComponentModel.xml", - "ref/netstandard1.0/it/System.ComponentModel.xml", - "ref/netstandard1.0/ja/System.ComponentModel.xml", - "ref/netstandard1.0/ko/System.ComponentModel.xml", - "ref/netstandard1.0/ru/System.ComponentModel.xml", - "ref/netstandard1.0/zh-hans/System.ComponentModel.xml", - "ref/netstandard1.0/zh-hant/System.ComponentModel.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.ComponentModel.Annotations/4.1.0": { - "sha512": "rhnz80h8NnHJzoi0nbQJLRR2cJznyqG168q1bgoSpe5qpaME2SguXzuEzpY68nFCi2kBgHpbU4bRN2cP3unYRA==", - "type": "package", - "path": "System.ComponentModel.Annotations/4.1.0", - "files": [ - "System.ComponentModel.Annotations.4.1.0.nupkg.sha512", - "System.ComponentModel.Annotations.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net461/System.ComponentModel.Annotations.dll", - "lib/netcore50/System.ComponentModel.Annotations.dll", - "lib/netstandard1.4/System.ComponentModel.Annotations.dll", - "lib/portable-net45+win8/_._", - "lib/win8/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net461/System.ComponentModel.Annotations.dll", - "ref/netcore50/System.ComponentModel.Annotations.dll", - "ref/netcore50/System.ComponentModel.Annotations.xml", - "ref/netcore50/de/System.ComponentModel.Annotations.xml", - "ref/netcore50/es/System.ComponentModel.Annotations.xml", - "ref/netcore50/fr/System.ComponentModel.Annotations.xml", - "ref/netcore50/it/System.ComponentModel.Annotations.xml", - "ref/netcore50/ja/System.ComponentModel.Annotations.xml", - "ref/netcore50/ko/System.ComponentModel.Annotations.xml", - "ref/netcore50/ru/System.ComponentModel.Annotations.xml", - "ref/netcore50/zh-hans/System.ComponentModel.Annotations.xml", - "ref/netcore50/zh-hant/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/System.ComponentModel.Annotations.dll", - "ref/netstandard1.1/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/de/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/es/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/fr/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/it/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/ja/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/ko/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/ru/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/zh-hans/System.ComponentModel.Annotations.xml", - "ref/netstandard1.1/zh-hant/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/System.ComponentModel.Annotations.dll", - "ref/netstandard1.3/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/de/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/es/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/fr/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/it/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/ja/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/ko/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/ru/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/zh-hans/System.ComponentModel.Annotations.xml", - "ref/netstandard1.3/zh-hant/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/System.ComponentModel.Annotations.dll", - "ref/netstandard1.4/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/de/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/es/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/fr/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/it/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/ja/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/ko/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/ru/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/zh-hans/System.ComponentModel.Annotations.xml", - "ref/netstandard1.4/zh-hant/System.ComponentModel.Annotations.xml", - "ref/portable-net45+win8/_._", - "ref/win8/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.ComponentModel.Primitives/4.1.0": { - "sha512": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", - "type": "package", - "path": "System.ComponentModel.Primitives/4.1.0", - "files": [ - "System.ComponentModel.Primitives.4.1.0.nupkg.sha512", - "System.ComponentModel.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/System.ComponentModel.Primitives.dll", - "lib/netstandard1.0/System.ComponentModel.Primitives.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/System.ComponentModel.Primitives.dll", - "ref/netstandard1.0/System.ComponentModel.Primitives.dll", - "ref/netstandard1.0/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/de/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/es/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/fr/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/it/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/ja/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/ko/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/ru/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.ComponentModel.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.ComponentModel.Primitives.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.ComponentModel.TypeConverter/4.1.0": { - "sha512": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", - "type": "package", - "path": "System.ComponentModel.TypeConverter/4.1.0", - "files": [ - "System.ComponentModel.TypeConverter.4.1.0.nupkg.sha512", - "System.ComponentModel.TypeConverter.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/System.ComponentModel.TypeConverter.dll", - "lib/net462/System.ComponentModel.TypeConverter.dll", - "lib/netstandard1.0/System.ComponentModel.TypeConverter.dll", - "lib/netstandard1.5/System.ComponentModel.TypeConverter.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/System.ComponentModel.TypeConverter.dll", - "ref/net462/System.ComponentModel.TypeConverter.dll", - "ref/netstandard1.0/System.ComponentModel.TypeConverter.dll", - "ref/netstandard1.0/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/de/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/es/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/fr/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/it/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/ja/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/ko/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/ru/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/zh-hans/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.0/zh-hant/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/System.ComponentModel.TypeConverter.dll", - "ref/netstandard1.5/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/de/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/es/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/fr/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/it/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/ja/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/ko/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/ru/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/zh-hans/System.ComponentModel.TypeConverter.xml", - "ref/netstandard1.5/zh-hant/System.ComponentModel.TypeConverter.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Console/4.0.0": { - "sha512": "qSKUSOIiYA/a0g5XXdxFcUFmv1hNICBD7QZ0QhGYVipPIhvpiydY8VZqr1thmCXvmn8aipMg64zuanB4eotK9A==", - "type": "package", - "path": "System.Console/4.0.0", - "files": [ - "System.Console.4.0.0.nupkg.sha512", - "System.Console.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Console.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Console.dll", - "ref/netstandard1.3/System.Console.dll", - "ref/netstandard1.3/System.Console.xml", - "ref/netstandard1.3/de/System.Console.xml", - "ref/netstandard1.3/es/System.Console.xml", - "ref/netstandard1.3/fr/System.Console.xml", - "ref/netstandard1.3/it/System.Console.xml", - "ref/netstandard1.3/ja/System.Console.xml", - "ref/netstandard1.3/ko/System.Console.xml", - "ref/netstandard1.3/ru/System.Console.xml", - "ref/netstandard1.3/zh-hans/System.Console.xml", - "ref/netstandard1.3/zh-hant/System.Console.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Data.Common/4.1.0": { - "sha512": "epU8jeTe7aE7RqGHq9rZ8b0Q4Ah7DgubzHQblgZMSqgW1saW868WmooSyC5ywf8upLBkcVLDu93W9GPWUYsU2Q==", - "type": "package", - "path": "System.Data.Common/4.1.0", - "files": [ - "System.Data.Common.4.1.0.nupkg.sha512", - "System.Data.Common.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net451/System.Data.Common.dll", - "lib/netstandard1.2/System.Data.Common.dll", - "lib/portable-net451+win8+wp8+wpa81/System.Data.Common.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net451/System.Data.Common.dll", - "ref/netstandard1.2/System.Data.Common.dll", - "ref/netstandard1.2/System.Data.Common.xml", - "ref/netstandard1.2/de/System.Data.Common.xml", - "ref/netstandard1.2/es/System.Data.Common.xml", - "ref/netstandard1.2/fr/System.Data.Common.xml", - "ref/netstandard1.2/it/System.Data.Common.xml", - "ref/netstandard1.2/ja/System.Data.Common.xml", - "ref/netstandard1.2/ko/System.Data.Common.xml", - "ref/netstandard1.2/ru/System.Data.Common.xml", - "ref/netstandard1.2/zh-hans/System.Data.Common.xml", - "ref/netstandard1.2/zh-hant/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/System.Data.Common.dll", - "ref/portable-net451+win8+wp8+wpa81/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/de/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/es/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/fr/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/it/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/ja/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/ko/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/ru/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/zh-hans/System.Data.Common.xml", - "ref/portable-net451+win8+wp8+wpa81/zh-hant/System.Data.Common.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Diagnostics.Contracts/4.0.1": { - "sha512": "HvQQjy712vnlpPxaloZYkuE78Gn353L0SJLJVeLcNASeg9c4qla2a1Xq8I7B3jZoDzKPtHTkyVO7AZ5tpeQGuA==", - "type": "package", - "path": "System.Diagnostics.Contracts/4.0.1", - "files": [ - "System.Diagnostics.Contracts.4.0.1.nupkg.sha512", - "System.Diagnostics.Contracts.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Diagnostics.Contracts.dll", - "lib/netstandard1.0/System.Diagnostics.Contracts.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Diagnostics.Contracts.dll", - "ref/netcore50/System.Diagnostics.Contracts.xml", - "ref/netcore50/de/System.Diagnostics.Contracts.xml", - "ref/netcore50/es/System.Diagnostics.Contracts.xml", - "ref/netcore50/fr/System.Diagnostics.Contracts.xml", - "ref/netcore50/it/System.Diagnostics.Contracts.xml", - "ref/netcore50/ja/System.Diagnostics.Contracts.xml", - "ref/netcore50/ko/System.Diagnostics.Contracts.xml", - "ref/netcore50/ru/System.Diagnostics.Contracts.xml", - "ref/netcore50/zh-hans/System.Diagnostics.Contracts.xml", - "ref/netcore50/zh-hant/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/System.Diagnostics.Contracts.dll", - "ref/netstandard1.0/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/de/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/es/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/fr/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/it/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/ja/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/ko/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/ru/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/zh-hans/System.Diagnostics.Contracts.xml", - "ref/netstandard1.0/zh-hant/System.Diagnostics.Contracts.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Diagnostics.Contracts.dll" - ] - }, - "System.Diagnostics.Debug/4.0.11": { - "sha512": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", - "type": "package", - "path": "System.Diagnostics.Debug/4.0.11", - "files": [ - "System.Diagnostics.Debug.4.0.11.nupkg.sha512", - "System.Diagnostics.Debug.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Diagnostics.Debug.dll", - "ref/netcore50/System.Diagnostics.Debug.xml", - "ref/netcore50/de/System.Diagnostics.Debug.xml", - "ref/netcore50/es/System.Diagnostics.Debug.xml", - "ref/netcore50/fr/System.Diagnostics.Debug.xml", - "ref/netcore50/it/System.Diagnostics.Debug.xml", - "ref/netcore50/ja/System.Diagnostics.Debug.xml", - "ref/netcore50/ko/System.Diagnostics.Debug.xml", - "ref/netcore50/ru/System.Diagnostics.Debug.xml", - "ref/netcore50/zh-hans/System.Diagnostics.Debug.xml", - "ref/netcore50/zh-hant/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/System.Diagnostics.Debug.dll", - "ref/netstandard1.0/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/de/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/es/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/fr/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/it/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/ja/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/ko/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/ru/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/zh-hans/System.Diagnostics.Debug.xml", - "ref/netstandard1.0/zh-hant/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/System.Diagnostics.Debug.dll", - "ref/netstandard1.3/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/de/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/es/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/fr/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/it/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/ja/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/ko/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/ru/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.Debug.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.Debug.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Diagnostics.DiagnosticSource/4.0.0": { - "sha512": "YKglnq4BMTJxfcr6nuT08g+yJ0UxdePIHxosiLuljuHIUR6t4KhFsyaHOaOc1Ofqp0PUvJ0EmcgiEz6T7vEx3w==", - "type": "package", - "path": "System.Diagnostics.DiagnosticSource/4.0.0", - "files": [ - "System.Diagnostics.DiagnosticSource.4.0.0.nupkg.sha512", - "System.Diagnostics.DiagnosticSource.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net46/System.Diagnostics.DiagnosticSource.dll", - "lib/net46/System.Diagnostics.DiagnosticSource.xml", - "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.dll", - "lib/netstandard1.1/System.Diagnostics.DiagnosticSource.xml", - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.dll", - "lib/netstandard1.3/System.Diagnostics.DiagnosticSource.xml", - "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.dll", - "lib/portable-net45+win8+wpa81/System.Diagnostics.DiagnosticSource.xml" - ] - }, - "System.Diagnostics.FileVersionInfo/4.0.0": { - "sha512": "qjF74OTAU+mRhLaL4YSfiWy3vj6T3AOz8AW37l5zCwfbBfj0k7E94XnEsRaf2TnhE/7QaV6Hvqakoy2LoV8MVg==", - "type": "package", - "path": "System.Diagnostics.FileVersionInfo/4.0.0", - "files": [ - "System.Diagnostics.FileVersionInfo.4.0.0.nupkg.sha512", - "System.Diagnostics.FileVersionInfo.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Diagnostics.FileVersionInfo.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Diagnostics.FileVersionInfo.dll", - "ref/netstandard1.3/System.Diagnostics.FileVersionInfo.dll", - "ref/netstandard1.3/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/de/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/es/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/fr/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/it/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/ja/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/ko/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/ru/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.FileVersionInfo.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.FileVersionInfo.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Diagnostics.FileVersionInfo.dll", - "runtimes/win/lib/net46/System.Diagnostics.FileVersionInfo.dll", - "runtimes/win/lib/netcore50/System.Diagnostics.FileVersionInfo.dll", - "runtimes/win/lib/netstandard1.3/System.Diagnostics.FileVersionInfo.dll" - ] - }, - "System.Diagnostics.Process/4.1.0": { - "sha512": "mpVZ5bnlSs3tTeJ6jYyDJEIa6tavhAd88lxq1zbYhkkCu0Pno2+gHXcvZcoygq2d8JxW3gojXqNJMTAshduqZA==", - "type": "package", - "path": "System.Diagnostics.Process/4.1.0", - "files": [ - "System.Diagnostics.Process.4.1.0.nupkg.sha512", - "System.Diagnostics.Process.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Diagnostics.Process.dll", - "lib/net461/System.Diagnostics.Process.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Diagnostics.Process.dll", - "ref/net461/System.Diagnostics.Process.dll", - "ref/netstandard1.3/System.Diagnostics.Process.dll", - "ref/netstandard1.3/System.Diagnostics.Process.xml", - "ref/netstandard1.3/de/System.Diagnostics.Process.xml", - "ref/netstandard1.3/es/System.Diagnostics.Process.xml", - "ref/netstandard1.3/fr/System.Diagnostics.Process.xml", - "ref/netstandard1.3/it/System.Diagnostics.Process.xml", - "ref/netstandard1.3/ja/System.Diagnostics.Process.xml", - "ref/netstandard1.3/ko/System.Diagnostics.Process.xml", - "ref/netstandard1.3/ru/System.Diagnostics.Process.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.Process.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.Process.xml", - "ref/netstandard1.4/System.Diagnostics.Process.dll", - "ref/netstandard1.4/System.Diagnostics.Process.xml", - "ref/netstandard1.4/de/System.Diagnostics.Process.xml", - "ref/netstandard1.4/es/System.Diagnostics.Process.xml", - "ref/netstandard1.4/fr/System.Diagnostics.Process.xml", - "ref/netstandard1.4/it/System.Diagnostics.Process.xml", - "ref/netstandard1.4/ja/System.Diagnostics.Process.xml", - "ref/netstandard1.4/ko/System.Diagnostics.Process.xml", - "ref/netstandard1.4/ru/System.Diagnostics.Process.xml", - "ref/netstandard1.4/zh-hans/System.Diagnostics.Process.xml", - "ref/netstandard1.4/zh-hant/System.Diagnostics.Process.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/linux/lib/netstandard1.4/System.Diagnostics.Process.dll", - "runtimes/osx/lib/netstandard1.4/System.Diagnostics.Process.dll", - "runtimes/win/lib/net46/System.Diagnostics.Process.dll", - "runtimes/win/lib/net461/System.Diagnostics.Process.dll", - "runtimes/win/lib/netstandard1.4/System.Diagnostics.Process.dll", - "runtimes/win7/lib/netcore50/_._" - ] - }, - "System.Diagnostics.StackTrace/4.0.1": { - "sha512": "6i2EbRq0lgGfiZ+FDf0gVaw9qeEU+7IS2+wbZJmFVpvVzVOgZEt0ScZtyenuBvs6iDYbGiF51bMAa0oDP/tujQ==", - "type": "package", - "path": "System.Diagnostics.StackTrace/4.0.1", - "files": [ - "System.Diagnostics.StackTrace.4.0.1.nupkg.sha512", - "System.Diagnostics.StackTrace.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Diagnostics.StackTrace.dll", - "lib/netstandard1.3/System.Diagnostics.StackTrace.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Diagnostics.StackTrace.dll", - "ref/netstandard1.3/System.Diagnostics.StackTrace.dll", - "ref/netstandard1.3/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/de/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/es/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/fr/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/it/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/ja/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/ko/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/ru/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.StackTrace.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.StackTrace.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Diagnostics.StackTrace.dll" - ] - }, - "System.Diagnostics.Tools/4.0.1": { - "sha512": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==", - "type": "package", - "path": "System.Diagnostics.Tools/4.0.1", - "files": [ - "System.Diagnostics.Tools.4.0.1.nupkg.sha512", - "System.Diagnostics.Tools.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Diagnostics.Tools.dll", - "ref/netcore50/System.Diagnostics.Tools.xml", - "ref/netcore50/de/System.Diagnostics.Tools.xml", - "ref/netcore50/es/System.Diagnostics.Tools.xml", - "ref/netcore50/fr/System.Diagnostics.Tools.xml", - "ref/netcore50/it/System.Diagnostics.Tools.xml", - "ref/netcore50/ja/System.Diagnostics.Tools.xml", - "ref/netcore50/ko/System.Diagnostics.Tools.xml", - "ref/netcore50/ru/System.Diagnostics.Tools.xml", - "ref/netcore50/zh-hans/System.Diagnostics.Tools.xml", - "ref/netcore50/zh-hant/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/System.Diagnostics.Tools.dll", - "ref/netstandard1.0/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/de/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/es/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/fr/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/it/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/ja/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/ko/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/ru/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/zh-hans/System.Diagnostics.Tools.xml", - "ref/netstandard1.0/zh-hant/System.Diagnostics.Tools.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Diagnostics.TraceSource/4.0.0": { - "sha512": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", - "type": "package", - "path": "System.Diagnostics.TraceSource/4.0.0", - "files": [ - "System.Diagnostics.TraceSource.4.0.0.nupkg.sha512", - "System.Diagnostics.TraceSource.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Diagnostics.TraceSource.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Diagnostics.TraceSource.dll", - "ref/netstandard1.3/System.Diagnostics.TraceSource.dll", - "ref/netstandard1.3/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/de/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/es/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/fr/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/it/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/ja/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/ko/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/ru/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.TraceSource.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.TraceSource.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Diagnostics.TraceSource.dll", - "runtimes/win/lib/net46/System.Diagnostics.TraceSource.dll", - "runtimes/win/lib/netstandard1.3/System.Diagnostics.TraceSource.dll" - ] - }, - "System.Diagnostics.Tracing/4.1.0": { - "sha512": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", - "type": "package", - "path": "System.Diagnostics.Tracing/4.1.0", - "files": [ - "System.Diagnostics.Tracing.4.1.0.nupkg.sha512", - "System.Diagnostics.Tracing.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Diagnostics.Tracing.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Diagnostics.Tracing.dll", - "ref/netcore50/System.Diagnostics.Tracing.dll", - "ref/netcore50/System.Diagnostics.Tracing.xml", - "ref/netcore50/de/System.Diagnostics.Tracing.xml", - "ref/netcore50/es/System.Diagnostics.Tracing.xml", - "ref/netcore50/fr/System.Diagnostics.Tracing.xml", - "ref/netcore50/it/System.Diagnostics.Tracing.xml", - "ref/netcore50/ja/System.Diagnostics.Tracing.xml", - "ref/netcore50/ko/System.Diagnostics.Tracing.xml", - "ref/netcore50/ru/System.Diagnostics.Tracing.xml", - "ref/netcore50/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netcore50/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/System.Diagnostics.Tracing.dll", - "ref/netstandard1.1/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.1/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/System.Diagnostics.Tracing.dll", - "ref/netstandard1.2/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.2/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/System.Diagnostics.Tracing.dll", - "ref/netstandard1.3/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.3/zh-hant/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/System.Diagnostics.Tracing.dll", - "ref/netstandard1.5/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/de/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/es/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/fr/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/it/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/ja/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/ko/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/ru/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/zh-hans/System.Diagnostics.Tracing.xml", - "ref/netstandard1.5/zh-hant/System.Diagnostics.Tracing.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Dynamic.Runtime/4.0.11": { - "sha512": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", - "type": "package", - "path": "System.Dynamic.Runtime/4.0.11", - "files": [ - "System.Dynamic.Runtime.4.0.11.nupkg.sha512", - "System.Dynamic.Runtime.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Dynamic.Runtime.dll", - "lib/netstandard1.3/System.Dynamic.Runtime.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Dynamic.Runtime.dll", - "ref/netcore50/System.Dynamic.Runtime.xml", - "ref/netcore50/de/System.Dynamic.Runtime.xml", - "ref/netcore50/es/System.Dynamic.Runtime.xml", - "ref/netcore50/fr/System.Dynamic.Runtime.xml", - "ref/netcore50/it/System.Dynamic.Runtime.xml", - "ref/netcore50/ja/System.Dynamic.Runtime.xml", - "ref/netcore50/ko/System.Dynamic.Runtime.xml", - "ref/netcore50/ru/System.Dynamic.Runtime.xml", - "ref/netcore50/zh-hans/System.Dynamic.Runtime.xml", - "ref/netcore50/zh-hant/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/System.Dynamic.Runtime.dll", - "ref/netstandard1.0/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/de/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/es/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/fr/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/it/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/ja/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/ko/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/ru/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/zh-hans/System.Dynamic.Runtime.xml", - "ref/netstandard1.0/zh-hant/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/System.Dynamic.Runtime.dll", - "ref/netstandard1.3/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/de/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/es/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/fr/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/it/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/ja/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/ko/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/ru/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/zh-hans/System.Dynamic.Runtime.xml", - "ref/netstandard1.3/zh-hant/System.Dynamic.Runtime.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Dynamic.Runtime.dll" - ] - }, - "System.Globalization/4.0.11": { - "sha512": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", - "type": "package", - "path": "System.Globalization/4.0.11", - "files": [ - "System.Globalization.4.0.11.nupkg.sha512", - "System.Globalization.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Globalization.dll", - "ref/netcore50/System.Globalization.xml", - "ref/netcore50/de/System.Globalization.xml", - "ref/netcore50/es/System.Globalization.xml", - "ref/netcore50/fr/System.Globalization.xml", - "ref/netcore50/it/System.Globalization.xml", - "ref/netcore50/ja/System.Globalization.xml", - "ref/netcore50/ko/System.Globalization.xml", - "ref/netcore50/ru/System.Globalization.xml", - "ref/netcore50/zh-hans/System.Globalization.xml", - "ref/netcore50/zh-hant/System.Globalization.xml", - "ref/netstandard1.0/System.Globalization.dll", - "ref/netstandard1.0/System.Globalization.xml", - "ref/netstandard1.0/de/System.Globalization.xml", - "ref/netstandard1.0/es/System.Globalization.xml", - "ref/netstandard1.0/fr/System.Globalization.xml", - "ref/netstandard1.0/it/System.Globalization.xml", - "ref/netstandard1.0/ja/System.Globalization.xml", - "ref/netstandard1.0/ko/System.Globalization.xml", - "ref/netstandard1.0/ru/System.Globalization.xml", - "ref/netstandard1.0/zh-hans/System.Globalization.xml", - "ref/netstandard1.0/zh-hant/System.Globalization.xml", - "ref/netstandard1.3/System.Globalization.dll", - "ref/netstandard1.3/System.Globalization.xml", - "ref/netstandard1.3/de/System.Globalization.xml", - "ref/netstandard1.3/es/System.Globalization.xml", - "ref/netstandard1.3/fr/System.Globalization.xml", - "ref/netstandard1.3/it/System.Globalization.xml", - "ref/netstandard1.3/ja/System.Globalization.xml", - "ref/netstandard1.3/ko/System.Globalization.xml", - "ref/netstandard1.3/ru/System.Globalization.xml", - "ref/netstandard1.3/zh-hans/System.Globalization.xml", - "ref/netstandard1.3/zh-hant/System.Globalization.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Globalization.Calendars/4.0.1": { - "sha512": "L1c6IqeQ88vuzC1P81JeHmHA8mxq8a18NUBNXnIY/BVb+TCyAaGIFbhpZt60h9FJNmisymoQkHEFSE9Vslja1Q==", - "type": "package", - "path": "System.Globalization.Calendars/4.0.1", - "files": [ - "System.Globalization.Calendars.4.0.1.nupkg.sha512", - "System.Globalization.Calendars.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Globalization.Calendars.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Globalization.Calendars.dll", - "ref/netstandard1.3/System.Globalization.Calendars.dll", - "ref/netstandard1.3/System.Globalization.Calendars.xml", - "ref/netstandard1.3/de/System.Globalization.Calendars.xml", - "ref/netstandard1.3/es/System.Globalization.Calendars.xml", - "ref/netstandard1.3/fr/System.Globalization.Calendars.xml", - "ref/netstandard1.3/it/System.Globalization.Calendars.xml", - "ref/netstandard1.3/ja/System.Globalization.Calendars.xml", - "ref/netstandard1.3/ko/System.Globalization.Calendars.xml", - "ref/netstandard1.3/ru/System.Globalization.Calendars.xml", - "ref/netstandard1.3/zh-hans/System.Globalization.Calendars.xml", - "ref/netstandard1.3/zh-hant/System.Globalization.Calendars.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Globalization.Extensions/4.0.1": { - "sha512": "KKo23iKeOaIg61SSXwjANN7QYDr/3op3OWGGzDzz7mypx0Za0fZSeG0l6cco8Ntp8YMYkIQcAqlk8yhm5/Uhcg==", - "type": "package", - "path": "System.Globalization.Extensions/4.0.1", - "files": [ - "System.Globalization.Extensions.4.0.1.nupkg.sha512", - "System.Globalization.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Globalization.Extensions.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Globalization.Extensions.dll", - "ref/netstandard1.3/System.Globalization.Extensions.dll", - "ref/netstandard1.3/System.Globalization.Extensions.xml", - "ref/netstandard1.3/de/System.Globalization.Extensions.xml", - "ref/netstandard1.3/es/System.Globalization.Extensions.xml", - "ref/netstandard1.3/fr/System.Globalization.Extensions.xml", - "ref/netstandard1.3/it/System.Globalization.Extensions.xml", - "ref/netstandard1.3/ja/System.Globalization.Extensions.xml", - "ref/netstandard1.3/ko/System.Globalization.Extensions.xml", - "ref/netstandard1.3/ru/System.Globalization.Extensions.xml", - "ref/netstandard1.3/zh-hans/System.Globalization.Extensions.xml", - "ref/netstandard1.3/zh-hant/System.Globalization.Extensions.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Globalization.Extensions.dll", - "runtimes/win/lib/net46/System.Globalization.Extensions.dll", - "runtimes/win/lib/netstandard1.3/System.Globalization.Extensions.dll" - ] - }, - "System.Interactive.Async/3.0.0": { - "sha512": "UEM+WmG1Oq0bNbPx/E1jaIQ83QOrPfVDUyuYBtG6D6DpB77ytv9flPterMujumpHuoRjSc0ilSB8w41fQc05dw==", - "type": "package", - "path": "System.Interactive.Async/3.0.0", - "files": [ - "System.Interactive.Async.3.0.0.nupkg.sha512", - "System.Interactive.Async.nuspec", - "lib/net45/System.Interactive.Async.dll", - "lib/net45/System.Interactive.Async.xml", - "lib/netstandard1.0/System.Interactive.Async.dll", - "lib/netstandard1.0/System.Interactive.Async.xml" - ] - }, - "System.IO/4.1.0": { - "sha512": "3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==", - "type": "package", - "path": "System.IO/4.1.0", - "files": [ - "System.IO.4.1.0.nupkg.sha512", - "System.IO.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.IO.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.IO.dll", - "ref/netcore50/System.IO.dll", - "ref/netcore50/System.IO.xml", - "ref/netcore50/de/System.IO.xml", - "ref/netcore50/es/System.IO.xml", - "ref/netcore50/fr/System.IO.xml", - "ref/netcore50/it/System.IO.xml", - "ref/netcore50/ja/System.IO.xml", - "ref/netcore50/ko/System.IO.xml", - "ref/netcore50/ru/System.IO.xml", - "ref/netcore50/zh-hans/System.IO.xml", - "ref/netcore50/zh-hant/System.IO.xml", - "ref/netstandard1.0/System.IO.dll", - "ref/netstandard1.0/System.IO.xml", - "ref/netstandard1.0/de/System.IO.xml", - "ref/netstandard1.0/es/System.IO.xml", - "ref/netstandard1.0/fr/System.IO.xml", - "ref/netstandard1.0/it/System.IO.xml", - "ref/netstandard1.0/ja/System.IO.xml", - "ref/netstandard1.0/ko/System.IO.xml", - "ref/netstandard1.0/ru/System.IO.xml", - "ref/netstandard1.0/zh-hans/System.IO.xml", - "ref/netstandard1.0/zh-hant/System.IO.xml", - "ref/netstandard1.3/System.IO.dll", - "ref/netstandard1.3/System.IO.xml", - "ref/netstandard1.3/de/System.IO.xml", - "ref/netstandard1.3/es/System.IO.xml", - "ref/netstandard1.3/fr/System.IO.xml", - "ref/netstandard1.3/it/System.IO.xml", - "ref/netstandard1.3/ja/System.IO.xml", - "ref/netstandard1.3/ko/System.IO.xml", - "ref/netstandard1.3/ru/System.IO.xml", - "ref/netstandard1.3/zh-hans/System.IO.xml", - "ref/netstandard1.3/zh-hant/System.IO.xml", - "ref/netstandard1.5/System.IO.dll", - "ref/netstandard1.5/System.IO.xml", - "ref/netstandard1.5/de/System.IO.xml", - "ref/netstandard1.5/es/System.IO.xml", - "ref/netstandard1.5/fr/System.IO.xml", - "ref/netstandard1.5/it/System.IO.xml", - "ref/netstandard1.5/ja/System.IO.xml", - "ref/netstandard1.5/ko/System.IO.xml", - "ref/netstandard1.5/ru/System.IO.xml", - "ref/netstandard1.5/zh-hans/System.IO.xml", - "ref/netstandard1.5/zh-hant/System.IO.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO.Compression/4.1.0": { - "sha512": "TjnBS6eztThSzeSib+WyVbLzEdLKUcEHN69VtS3u8aAsSc18FU6xCZlNWWsEd8SKcXAE+y1sOu7VbU8sUeM0sg==", - "type": "package", - "path": "System.IO.Compression/4.1.0", - "files": [ - "System.IO.Compression.4.1.0.nupkg.sha512", - "System.IO.Compression.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net46/System.IO.Compression.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net46/System.IO.Compression.dll", - "ref/netcore50/System.IO.Compression.dll", - "ref/netcore50/System.IO.Compression.xml", - "ref/netcore50/de/System.IO.Compression.xml", - "ref/netcore50/es/System.IO.Compression.xml", - "ref/netcore50/fr/System.IO.Compression.xml", - "ref/netcore50/it/System.IO.Compression.xml", - "ref/netcore50/ja/System.IO.Compression.xml", - "ref/netcore50/ko/System.IO.Compression.xml", - "ref/netcore50/ru/System.IO.Compression.xml", - "ref/netcore50/zh-hans/System.IO.Compression.xml", - "ref/netcore50/zh-hant/System.IO.Compression.xml", - "ref/netstandard1.1/System.IO.Compression.dll", - "ref/netstandard1.1/System.IO.Compression.xml", - "ref/netstandard1.1/de/System.IO.Compression.xml", - "ref/netstandard1.1/es/System.IO.Compression.xml", - "ref/netstandard1.1/fr/System.IO.Compression.xml", - "ref/netstandard1.1/it/System.IO.Compression.xml", - "ref/netstandard1.1/ja/System.IO.Compression.xml", - "ref/netstandard1.1/ko/System.IO.Compression.xml", - "ref/netstandard1.1/ru/System.IO.Compression.xml", - "ref/netstandard1.1/zh-hans/System.IO.Compression.xml", - "ref/netstandard1.1/zh-hant/System.IO.Compression.xml", - "ref/netstandard1.3/System.IO.Compression.dll", - "ref/netstandard1.3/System.IO.Compression.xml", - "ref/netstandard1.3/de/System.IO.Compression.xml", - "ref/netstandard1.3/es/System.IO.Compression.xml", - "ref/netstandard1.3/fr/System.IO.Compression.xml", - "ref/netstandard1.3/it/System.IO.Compression.xml", - "ref/netstandard1.3/ja/System.IO.Compression.xml", - "ref/netstandard1.3/ko/System.IO.Compression.xml", - "ref/netstandard1.3/ru/System.IO.Compression.xml", - "ref/netstandard1.3/zh-hans/System.IO.Compression.xml", - "ref/netstandard1.3/zh-hant/System.IO.Compression.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.IO.Compression.dll", - "runtimes/win/lib/net46/System.IO.Compression.dll", - "runtimes/win/lib/netstandard1.3/System.IO.Compression.dll" - ] - }, - "System.IO.Compression.ZipFile/4.0.1": { - "sha512": "hBQYJzfTbQURF10nLhd+az2NHxsU6MU7AB8RUf4IolBP5lOAm4Luho851xl+CqslmhI5ZH/el8BlngEk4lBkaQ==", - "type": "package", - "path": "System.IO.Compression.ZipFile/4.0.1", - "files": [ - "System.IO.Compression.ZipFile.4.0.1.nupkg.sha512", - "System.IO.Compression.ZipFile.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.Compression.ZipFile.dll", - "lib/netstandard1.3/System.IO.Compression.ZipFile.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.Compression.ZipFile.dll", - "ref/netstandard1.3/System.IO.Compression.ZipFile.dll", - "ref/netstandard1.3/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/de/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/es/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/fr/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/it/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/ja/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/ko/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/ru/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/zh-hans/System.IO.Compression.ZipFile.xml", - "ref/netstandard1.3/zh-hant/System.IO.Compression.ZipFile.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO.FileSystem/4.0.1": { - "sha512": "IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==", - "type": "package", - "path": "System.IO.FileSystem/4.0.1", - "files": [ - "System.IO.FileSystem.4.0.1.nupkg.sha512", - "System.IO.FileSystem.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.FileSystem.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.FileSystem.dll", - "ref/netstandard1.3/System.IO.FileSystem.dll", - "ref/netstandard1.3/System.IO.FileSystem.xml", - "ref/netstandard1.3/de/System.IO.FileSystem.xml", - "ref/netstandard1.3/es/System.IO.FileSystem.xml", - "ref/netstandard1.3/fr/System.IO.FileSystem.xml", - "ref/netstandard1.3/it/System.IO.FileSystem.xml", - "ref/netstandard1.3/ja/System.IO.FileSystem.xml", - "ref/netstandard1.3/ko/System.IO.FileSystem.xml", - "ref/netstandard1.3/ru/System.IO.FileSystem.xml", - "ref/netstandard1.3/zh-hans/System.IO.FileSystem.xml", - "ref/netstandard1.3/zh-hant/System.IO.FileSystem.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO.FileSystem.Primitives/4.0.1": { - "sha512": "kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==", - "type": "package", - "path": "System.IO.FileSystem.Primitives/4.0.1", - "files": [ - "System.IO.FileSystem.Primitives.4.0.1.nupkg.sha512", - "System.IO.FileSystem.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.FileSystem.Primitives.dll", - "lib/netstandard1.3/System.IO.FileSystem.Primitives.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.FileSystem.Primitives.dll", - "ref/netstandard1.3/System.IO.FileSystem.Primitives.dll", - "ref/netstandard1.3/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/de/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/es/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/fr/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/it/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/ja/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/ko/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/ru/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Primitives.xml", - "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Primitives.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.IO.FileSystem.Watcher/4.0.0": { - "sha512": "qM4Wr3La+RYb/03B0mZZjbA7tHsGzDffnuXP8Sl48HW2JwCjn3kfD5qdw0sqyNNowUipcJMi9/q6sMUrOIJ6UQ==", - "type": "package", - "path": "System.IO.FileSystem.Watcher/4.0.0", - "files": [ - "System.IO.FileSystem.Watcher.4.0.0.nupkg.sha512", - "System.IO.FileSystem.Watcher.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.FileSystem.Watcher.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.FileSystem.Watcher.dll", - "ref/netstandard1.3/System.IO.FileSystem.Watcher.dll", - "ref/netstandard1.3/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/de/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/es/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/fr/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/it/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/ja/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/ko/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/ru/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/zh-hans/System.IO.FileSystem.Watcher.xml", - "ref/netstandard1.3/zh-hant/System.IO.FileSystem.Watcher.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/linux/lib/netstandard1.3/System.IO.FileSystem.Watcher.dll", - "runtimes/osx/lib/netstandard1.3/System.IO.FileSystem.Watcher.dll", - "runtimes/win/lib/net46/System.IO.FileSystem.Watcher.dll", - "runtimes/win/lib/netstandard1.3/System.IO.FileSystem.Watcher.dll", - "runtimes/win7/lib/netcore50/_._" - ] - }, - "System.IO.MemoryMappedFiles/4.0.0": { - "sha512": "Xqj4xaFAnLVpss9ZSUIvB/VdJAA7GxZDnFGDKJfiGAnZ5VnFROn6eOHWepFpujCYTsh6wlZ3B33bqYkF0QJ7Eg==", - "type": "package", - "path": "System.IO.MemoryMappedFiles/4.0.0", - "files": [ - "System.IO.MemoryMappedFiles.4.0.0.nupkg.sha512", - "System.IO.MemoryMappedFiles.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.MemoryMappedFiles.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.MemoryMappedFiles.dll", - "ref/netstandard1.3/System.IO.MemoryMappedFiles.dll", - "ref/netstandard1.3/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/de/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/es/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/fr/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/it/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/ja/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/ko/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/ru/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/zh-hans/System.IO.MemoryMappedFiles.xml", - "ref/netstandard1.3/zh-hant/System.IO.MemoryMappedFiles.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.IO.MemoryMappedFiles.dll", - "runtimes/win/lib/net46/System.IO.MemoryMappedFiles.dll", - "runtimes/win/lib/netcore50/System.IO.MemoryMappedFiles.dll", - "runtimes/win/lib/netstandard1.3/System.IO.MemoryMappedFiles.dll" - ] - }, - "System.IO.UnmanagedMemoryStream/4.0.1": { - "sha512": "wcq0kXcpfJwdl1Y4/ZjDk7Dhx5HdLyRYYWYmD8Nn8skoGYYQd2BQWbXwjWSczip8AL4Z57o2dWWXAl4aABAKiQ==", - "type": "package", - "path": "System.IO.UnmanagedMemoryStream/4.0.1", - "files": [ - "System.IO.UnmanagedMemoryStream.4.0.1.nupkg.sha512", - "System.IO.UnmanagedMemoryStream.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.IO.UnmanagedMemoryStream.dll", - "lib/netstandard1.3/System.IO.UnmanagedMemoryStream.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.IO.UnmanagedMemoryStream.dll", - "ref/netstandard1.3/System.IO.UnmanagedMemoryStream.dll", - "ref/netstandard1.3/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/de/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/es/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/fr/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/it/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/ja/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/ko/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/ru/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/zh-hans/System.IO.UnmanagedMemoryStream.xml", - "ref/netstandard1.3/zh-hant/System.IO.UnmanagedMemoryStream.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Linq/4.1.0": { - "sha512": "bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==", - "type": "package", - "path": "System.Linq/4.1.0", - "files": [ - "System.Linq.4.1.0.nupkg.sha512", - "System.Linq.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net463/System.Linq.dll", - "lib/netcore50/System.Linq.dll", - "lib/netstandard1.6/System.Linq.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net463/System.Linq.dll", - "ref/netcore50/System.Linq.dll", - "ref/netcore50/System.Linq.xml", - "ref/netcore50/de/System.Linq.xml", - "ref/netcore50/es/System.Linq.xml", - "ref/netcore50/fr/System.Linq.xml", - "ref/netcore50/it/System.Linq.xml", - "ref/netcore50/ja/System.Linq.xml", - "ref/netcore50/ko/System.Linq.xml", - "ref/netcore50/ru/System.Linq.xml", - "ref/netcore50/zh-hans/System.Linq.xml", - "ref/netcore50/zh-hant/System.Linq.xml", - "ref/netstandard1.0/System.Linq.dll", - "ref/netstandard1.0/System.Linq.xml", - "ref/netstandard1.0/de/System.Linq.xml", - "ref/netstandard1.0/es/System.Linq.xml", - "ref/netstandard1.0/fr/System.Linq.xml", - "ref/netstandard1.0/it/System.Linq.xml", - "ref/netstandard1.0/ja/System.Linq.xml", - "ref/netstandard1.0/ko/System.Linq.xml", - "ref/netstandard1.0/ru/System.Linq.xml", - "ref/netstandard1.0/zh-hans/System.Linq.xml", - "ref/netstandard1.0/zh-hant/System.Linq.xml", - "ref/netstandard1.6/System.Linq.dll", - "ref/netstandard1.6/System.Linq.xml", - "ref/netstandard1.6/de/System.Linq.xml", - "ref/netstandard1.6/es/System.Linq.xml", - "ref/netstandard1.6/fr/System.Linq.xml", - "ref/netstandard1.6/it/System.Linq.xml", - "ref/netstandard1.6/ja/System.Linq.xml", - "ref/netstandard1.6/ko/System.Linq.xml", - "ref/netstandard1.6/ru/System.Linq.xml", - "ref/netstandard1.6/zh-hans/System.Linq.xml", - "ref/netstandard1.6/zh-hant/System.Linq.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Linq.Expressions/4.1.0": { - "sha512": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", - "type": "package", - "path": "System.Linq.Expressions/4.1.0", - "files": [ - "System.Linq.Expressions.4.1.0.nupkg.sha512", - "System.Linq.Expressions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net463/System.Linq.Expressions.dll", - "lib/netcore50/System.Linq.Expressions.dll", - "lib/netstandard1.6/System.Linq.Expressions.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net463/System.Linq.Expressions.dll", - "ref/netcore50/System.Linq.Expressions.dll", - "ref/netcore50/System.Linq.Expressions.xml", - "ref/netcore50/de/System.Linq.Expressions.xml", - "ref/netcore50/es/System.Linq.Expressions.xml", - "ref/netcore50/fr/System.Linq.Expressions.xml", - "ref/netcore50/it/System.Linq.Expressions.xml", - "ref/netcore50/ja/System.Linq.Expressions.xml", - "ref/netcore50/ko/System.Linq.Expressions.xml", - "ref/netcore50/ru/System.Linq.Expressions.xml", - "ref/netcore50/zh-hans/System.Linq.Expressions.xml", - "ref/netcore50/zh-hant/System.Linq.Expressions.xml", - "ref/netstandard1.0/System.Linq.Expressions.dll", - "ref/netstandard1.0/System.Linq.Expressions.xml", - "ref/netstandard1.0/de/System.Linq.Expressions.xml", - "ref/netstandard1.0/es/System.Linq.Expressions.xml", - "ref/netstandard1.0/fr/System.Linq.Expressions.xml", - "ref/netstandard1.0/it/System.Linq.Expressions.xml", - "ref/netstandard1.0/ja/System.Linq.Expressions.xml", - "ref/netstandard1.0/ko/System.Linq.Expressions.xml", - "ref/netstandard1.0/ru/System.Linq.Expressions.xml", - "ref/netstandard1.0/zh-hans/System.Linq.Expressions.xml", - "ref/netstandard1.0/zh-hant/System.Linq.Expressions.xml", - "ref/netstandard1.3/System.Linq.Expressions.dll", - "ref/netstandard1.3/System.Linq.Expressions.xml", - "ref/netstandard1.3/de/System.Linq.Expressions.xml", - "ref/netstandard1.3/es/System.Linq.Expressions.xml", - "ref/netstandard1.3/fr/System.Linq.Expressions.xml", - "ref/netstandard1.3/it/System.Linq.Expressions.xml", - "ref/netstandard1.3/ja/System.Linq.Expressions.xml", - "ref/netstandard1.3/ko/System.Linq.Expressions.xml", - "ref/netstandard1.3/ru/System.Linq.Expressions.xml", - "ref/netstandard1.3/zh-hans/System.Linq.Expressions.xml", - "ref/netstandard1.3/zh-hant/System.Linq.Expressions.xml", - "ref/netstandard1.6/System.Linq.Expressions.dll", - "ref/netstandard1.6/System.Linq.Expressions.xml", - "ref/netstandard1.6/de/System.Linq.Expressions.xml", - "ref/netstandard1.6/es/System.Linq.Expressions.xml", - "ref/netstandard1.6/fr/System.Linq.Expressions.xml", - "ref/netstandard1.6/it/System.Linq.Expressions.xml", - "ref/netstandard1.6/ja/System.Linq.Expressions.xml", - "ref/netstandard1.6/ko/System.Linq.Expressions.xml", - "ref/netstandard1.6/ru/System.Linq.Expressions.xml", - "ref/netstandard1.6/zh-hans/System.Linq.Expressions.xml", - "ref/netstandard1.6/zh-hant/System.Linq.Expressions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Linq.Expressions.dll" - ] - }, - "System.Linq.Parallel/4.0.1": { - "sha512": "J7XCa7n2cFn32uLbtceXfBFhgCk5M++50lylHKNbqTiJkw5y4Tglpi6amuJNPCvj9bLzNSI7rs1fi4joLMNRgg==", - "type": "package", - "path": "System.Linq.Parallel/4.0.1", - "files": [ - "System.Linq.Parallel.4.0.1.nupkg.sha512", - "System.Linq.Parallel.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Linq.Parallel.dll", - "lib/netstandard1.3/System.Linq.Parallel.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Linq.Parallel.dll", - "ref/netcore50/System.Linq.Parallel.xml", - "ref/netcore50/de/System.Linq.Parallel.xml", - "ref/netcore50/es/System.Linq.Parallel.xml", - "ref/netcore50/fr/System.Linq.Parallel.xml", - "ref/netcore50/it/System.Linq.Parallel.xml", - "ref/netcore50/ja/System.Linq.Parallel.xml", - "ref/netcore50/ko/System.Linq.Parallel.xml", - "ref/netcore50/ru/System.Linq.Parallel.xml", - "ref/netcore50/zh-hans/System.Linq.Parallel.xml", - "ref/netcore50/zh-hant/System.Linq.Parallel.xml", - "ref/netstandard1.1/System.Linq.Parallel.dll", - "ref/netstandard1.1/System.Linq.Parallel.xml", - "ref/netstandard1.1/de/System.Linq.Parallel.xml", - "ref/netstandard1.1/es/System.Linq.Parallel.xml", - "ref/netstandard1.1/fr/System.Linq.Parallel.xml", - "ref/netstandard1.1/it/System.Linq.Parallel.xml", - "ref/netstandard1.1/ja/System.Linq.Parallel.xml", - "ref/netstandard1.1/ko/System.Linq.Parallel.xml", - "ref/netstandard1.1/ru/System.Linq.Parallel.xml", - "ref/netstandard1.1/zh-hans/System.Linq.Parallel.xml", - "ref/netstandard1.1/zh-hant/System.Linq.Parallel.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Linq.Queryable/4.0.1": { - "sha512": "Yn/WfYe9RoRfmSLvUt2JerP0BTGGykCZkQPgojaxgzF2N0oPo+/AhB8TXOpdCcNlrG3VRtsamtK2uzsp3cqRVw==", - "type": "package", - "path": "System.Linq.Queryable/4.0.1", - "files": [ - "System.Linq.Queryable.4.0.1.nupkg.sha512", - "System.Linq.Queryable.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/monoandroid10/_._", - "lib/monotouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Linq.Queryable.dll", - "lib/netstandard1.3/System.Linq.Queryable.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/monoandroid10/_._", - "ref/monotouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Linq.Queryable.dll", - "ref/netcore50/System.Linq.Queryable.xml", - "ref/netcore50/de/System.Linq.Queryable.xml", - "ref/netcore50/es/System.Linq.Queryable.xml", - "ref/netcore50/fr/System.Linq.Queryable.xml", - "ref/netcore50/it/System.Linq.Queryable.xml", - "ref/netcore50/ja/System.Linq.Queryable.xml", - "ref/netcore50/ko/System.Linq.Queryable.xml", - "ref/netcore50/ru/System.Linq.Queryable.xml", - "ref/netcore50/zh-hans/System.Linq.Queryable.xml", - "ref/netcore50/zh-hant/System.Linq.Queryable.xml", - "ref/netstandard1.0/System.Linq.Queryable.dll", - "ref/netstandard1.0/System.Linq.Queryable.xml", - "ref/netstandard1.0/de/System.Linq.Queryable.xml", - "ref/netstandard1.0/es/System.Linq.Queryable.xml", - "ref/netstandard1.0/fr/System.Linq.Queryable.xml", - "ref/netstandard1.0/it/System.Linq.Queryable.xml", - "ref/netstandard1.0/ja/System.Linq.Queryable.xml", - "ref/netstandard1.0/ko/System.Linq.Queryable.xml", - "ref/netstandard1.0/ru/System.Linq.Queryable.xml", - "ref/netstandard1.0/zh-hans/System.Linq.Queryable.xml", - "ref/netstandard1.0/zh-hant/System.Linq.Queryable.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Net.Http/4.1.0": { - "sha512": "ULq9g3SOPVuupt+Y3U+A37coXzdNisB1neFCSKzBwo182u0RDddKJF8I5+HfyXqK6OhJPgeoAwWXrbiUXuRDsg==", - "type": "package", - "path": "System.Net.Http/4.1.0", - "files": [ - "System.Net.Http.4.1.0.nupkg.sha512", - "System.Net.Http.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/Xamarinmac20/_._", - "lib/monoandroid10/_._", - "lib/monotouch10/_._", - "lib/net45/_._", - "lib/net46/System.Net.Http.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/Xamarinmac20/_._", - "ref/monoandroid10/_._", - "ref/monotouch10/_._", - "ref/net45/_._", - "ref/net46/System.Net.Http.dll", - "ref/net46/System.Net.Http.xml", - "ref/net46/de/System.Net.Http.xml", - "ref/net46/es/System.Net.Http.xml", - "ref/net46/fr/System.Net.Http.xml", - "ref/net46/it/System.Net.Http.xml", - "ref/net46/ja/System.Net.Http.xml", - "ref/net46/ko/System.Net.Http.xml", - "ref/net46/ru/System.Net.Http.xml", - "ref/net46/zh-hans/System.Net.Http.xml", - "ref/net46/zh-hant/System.Net.Http.xml", - "ref/netcore50/System.Net.Http.dll", - "ref/netcore50/System.Net.Http.xml", - "ref/netcore50/de/System.Net.Http.xml", - "ref/netcore50/es/System.Net.Http.xml", - "ref/netcore50/fr/System.Net.Http.xml", - "ref/netcore50/it/System.Net.Http.xml", - "ref/netcore50/ja/System.Net.Http.xml", - "ref/netcore50/ko/System.Net.Http.xml", - "ref/netcore50/ru/System.Net.Http.xml", - "ref/netcore50/zh-hans/System.Net.Http.xml", - "ref/netcore50/zh-hant/System.Net.Http.xml", - "ref/netstandard1.1/System.Net.Http.dll", - "ref/netstandard1.1/System.Net.Http.xml", - "ref/netstandard1.1/de/System.Net.Http.xml", - "ref/netstandard1.1/es/System.Net.Http.xml", - "ref/netstandard1.1/fr/System.Net.Http.xml", - "ref/netstandard1.1/it/System.Net.Http.xml", - "ref/netstandard1.1/ja/System.Net.Http.xml", - "ref/netstandard1.1/ko/System.Net.Http.xml", - "ref/netstandard1.1/ru/System.Net.Http.xml", - "ref/netstandard1.1/zh-hans/System.Net.Http.xml", - "ref/netstandard1.1/zh-hant/System.Net.Http.xml", - "ref/netstandard1.3/System.Net.Http.dll", - "ref/netstandard1.3/System.Net.Http.xml", - "ref/netstandard1.3/de/System.Net.Http.xml", - "ref/netstandard1.3/es/System.Net.Http.xml", - "ref/netstandard1.3/fr/System.Net.Http.xml", - "ref/netstandard1.3/it/System.Net.Http.xml", - "ref/netstandard1.3/ja/System.Net.Http.xml", - "ref/netstandard1.3/ko/System.Net.Http.xml", - "ref/netstandard1.3/ru/System.Net.Http.xml", - "ref/netstandard1.3/zh-hans/System.Net.Http.xml", - "ref/netstandard1.3/zh-hant/System.Net.Http.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.6/System.Net.Http.dll", - "runtimes/win/lib/net46/System.Net.Http.dll", - "runtimes/win/lib/netcore50/System.Net.Http.dll", - "runtimes/win/lib/netstandard1.3/System.Net.Http.dll" - ] - }, - "System.Net.NameResolution/4.0.0": { - "sha512": "JdqRdM1Qym3YehqdKIi5LHrpypP4JMfxKQSNCJ2z4WawkG0il+N3XfNeJOxll2XrTnG7WgYYPoeiu/KOwg0DQw==", - "type": "package", - "path": "System.Net.NameResolution/4.0.0", - "files": [ - "System.Net.NameResolution.4.0.0.nupkg.sha512", - "System.Net.NameResolution.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Net.NameResolution.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Net.NameResolution.dll", - "ref/netstandard1.3/System.Net.NameResolution.dll", - "ref/netstandard1.3/System.Net.NameResolution.xml", - "ref/netstandard1.3/de/System.Net.NameResolution.xml", - "ref/netstandard1.3/es/System.Net.NameResolution.xml", - "ref/netstandard1.3/fr/System.Net.NameResolution.xml", - "ref/netstandard1.3/it/System.Net.NameResolution.xml", - "ref/netstandard1.3/ja/System.Net.NameResolution.xml", - "ref/netstandard1.3/ko/System.Net.NameResolution.xml", - "ref/netstandard1.3/ru/System.Net.NameResolution.xml", - "ref/netstandard1.3/zh-hans/System.Net.NameResolution.xml", - "ref/netstandard1.3/zh-hant/System.Net.NameResolution.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Net.NameResolution.dll", - "runtimes/win/lib/net46/System.Net.NameResolution.dll", - "runtimes/win/lib/netcore50/System.Net.NameResolution.dll", - "runtimes/win/lib/netstandard1.3/System.Net.NameResolution.dll" - ] - }, - "System.Net.Primitives/4.0.11": { - "sha512": "hVvfl4405DRjA2408luZekbPhplJK03j2Y2lSfMlny7GHXlkByw1iLnc9mgKW0GdQn73vvMcWrWewAhylXA4Nw==", - "type": "package", - "path": "System.Net.Primitives/4.0.11", - "files": [ - "System.Net.Primitives.4.0.11.nupkg.sha512", - "System.Net.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Net.Primitives.dll", - "ref/netcore50/System.Net.Primitives.xml", - "ref/netcore50/de/System.Net.Primitives.xml", - "ref/netcore50/es/System.Net.Primitives.xml", - "ref/netcore50/fr/System.Net.Primitives.xml", - "ref/netcore50/it/System.Net.Primitives.xml", - "ref/netcore50/ja/System.Net.Primitives.xml", - "ref/netcore50/ko/System.Net.Primitives.xml", - "ref/netcore50/ru/System.Net.Primitives.xml", - "ref/netcore50/zh-hans/System.Net.Primitives.xml", - "ref/netcore50/zh-hant/System.Net.Primitives.xml", - "ref/netstandard1.0/System.Net.Primitives.dll", - "ref/netstandard1.0/System.Net.Primitives.xml", - "ref/netstandard1.0/de/System.Net.Primitives.xml", - "ref/netstandard1.0/es/System.Net.Primitives.xml", - "ref/netstandard1.0/fr/System.Net.Primitives.xml", - "ref/netstandard1.0/it/System.Net.Primitives.xml", - "ref/netstandard1.0/ja/System.Net.Primitives.xml", - "ref/netstandard1.0/ko/System.Net.Primitives.xml", - "ref/netstandard1.0/ru/System.Net.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.Net.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.Net.Primitives.xml", - "ref/netstandard1.1/System.Net.Primitives.dll", - "ref/netstandard1.1/System.Net.Primitives.xml", - "ref/netstandard1.1/de/System.Net.Primitives.xml", - "ref/netstandard1.1/es/System.Net.Primitives.xml", - "ref/netstandard1.1/fr/System.Net.Primitives.xml", - "ref/netstandard1.1/it/System.Net.Primitives.xml", - "ref/netstandard1.1/ja/System.Net.Primitives.xml", - "ref/netstandard1.1/ko/System.Net.Primitives.xml", - "ref/netstandard1.1/ru/System.Net.Primitives.xml", - "ref/netstandard1.1/zh-hans/System.Net.Primitives.xml", - "ref/netstandard1.1/zh-hant/System.Net.Primitives.xml", - "ref/netstandard1.3/System.Net.Primitives.dll", - "ref/netstandard1.3/System.Net.Primitives.xml", - "ref/netstandard1.3/de/System.Net.Primitives.xml", - "ref/netstandard1.3/es/System.Net.Primitives.xml", - "ref/netstandard1.3/fr/System.Net.Primitives.xml", - "ref/netstandard1.3/it/System.Net.Primitives.xml", - "ref/netstandard1.3/ja/System.Net.Primitives.xml", - "ref/netstandard1.3/ko/System.Net.Primitives.xml", - "ref/netstandard1.3/ru/System.Net.Primitives.xml", - "ref/netstandard1.3/zh-hans/System.Net.Primitives.xml", - "ref/netstandard1.3/zh-hant/System.Net.Primitives.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Net.Requests/4.0.11": { - "sha512": "vxGt7C0cZixN+VqoSW4Yakc1Y9WknmxauDqzxgpw/FnBdz4kQNN51l4wxdXX5VY1xjqy//+G+4CvJWp1+f+y6Q==", - "type": "package", - "path": "System.Net.Requests/4.0.11", - "files": [ - "System.Net.Requests.4.0.11.nupkg.sha512", - "System.Net.Requests.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net46/_._", - "ref/netcore50/System.Net.Requests.dll", - "ref/netcore50/System.Net.Requests.xml", - "ref/netcore50/de/System.Net.Requests.xml", - "ref/netcore50/es/System.Net.Requests.xml", - "ref/netcore50/fr/System.Net.Requests.xml", - "ref/netcore50/it/System.Net.Requests.xml", - "ref/netcore50/ja/System.Net.Requests.xml", - "ref/netcore50/ko/System.Net.Requests.xml", - "ref/netcore50/ru/System.Net.Requests.xml", - "ref/netcore50/zh-hans/System.Net.Requests.xml", - "ref/netcore50/zh-hant/System.Net.Requests.xml", - "ref/netstandard1.0/System.Net.Requests.dll", - "ref/netstandard1.0/System.Net.Requests.xml", - "ref/netstandard1.0/de/System.Net.Requests.xml", - "ref/netstandard1.0/es/System.Net.Requests.xml", - "ref/netstandard1.0/fr/System.Net.Requests.xml", - "ref/netstandard1.0/it/System.Net.Requests.xml", - "ref/netstandard1.0/ja/System.Net.Requests.xml", - "ref/netstandard1.0/ko/System.Net.Requests.xml", - "ref/netstandard1.0/ru/System.Net.Requests.xml", - "ref/netstandard1.0/zh-hans/System.Net.Requests.xml", - "ref/netstandard1.0/zh-hant/System.Net.Requests.xml", - "ref/netstandard1.1/System.Net.Requests.dll", - "ref/netstandard1.1/System.Net.Requests.xml", - "ref/netstandard1.1/de/System.Net.Requests.xml", - "ref/netstandard1.1/es/System.Net.Requests.xml", - "ref/netstandard1.1/fr/System.Net.Requests.xml", - "ref/netstandard1.1/it/System.Net.Requests.xml", - "ref/netstandard1.1/ja/System.Net.Requests.xml", - "ref/netstandard1.1/ko/System.Net.Requests.xml", - "ref/netstandard1.1/ru/System.Net.Requests.xml", - "ref/netstandard1.1/zh-hans/System.Net.Requests.xml", - "ref/netstandard1.1/zh-hant/System.Net.Requests.xml", - "ref/netstandard1.3/System.Net.Requests.dll", - "ref/netstandard1.3/System.Net.Requests.xml", - "ref/netstandard1.3/de/System.Net.Requests.xml", - "ref/netstandard1.3/es/System.Net.Requests.xml", - "ref/netstandard1.3/fr/System.Net.Requests.xml", - "ref/netstandard1.3/it/System.Net.Requests.xml", - "ref/netstandard1.3/ja/System.Net.Requests.xml", - "ref/netstandard1.3/ko/System.Net.Requests.xml", - "ref/netstandard1.3/ru/System.Net.Requests.xml", - "ref/netstandard1.3/zh-hans/System.Net.Requests.xml", - "ref/netstandard1.3/zh-hant/System.Net.Requests.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Net.Requests.dll", - "runtimes/win/lib/net46/_._", - "runtimes/win/lib/netstandard1.3/System.Net.Requests.dll" - ] - }, - "System.Net.Security/4.0.0": { - "sha512": "uM1JaYJciCc2w7efD6du0EpQ1n5ZQqE6/P43/aI4H5E59qvP+wt3l70KIUF/Ha7NaeXGoGNFPVO0MB80pVHk2g==", - "type": "package", - "path": "System.Net.Security/4.0.0", - "files": [ - "System.Net.Security.4.0.0.nupkg.sha512", - "System.Net.Security.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Net.Security.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Net.Security.dll", - "ref/netstandard1.3/System.Net.Security.dll", - "ref/netstandard1.3/System.Net.Security.xml", - "ref/netstandard1.3/de/System.Net.Security.xml", - "ref/netstandard1.3/es/System.Net.Security.xml", - "ref/netstandard1.3/fr/System.Net.Security.xml", - "ref/netstandard1.3/it/System.Net.Security.xml", - "ref/netstandard1.3/ja/System.Net.Security.xml", - "ref/netstandard1.3/ko/System.Net.Security.xml", - "ref/netstandard1.3/ru/System.Net.Security.xml", - "ref/netstandard1.3/zh-hans/System.Net.Security.xml", - "ref/netstandard1.3/zh-hant/System.Net.Security.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.6/System.Net.Security.dll", - "runtimes/win/lib/net46/System.Net.Security.dll", - "runtimes/win/lib/netstandard1.3/System.Net.Security.dll", - "runtimes/win7/lib/netcore50/_._" - ] - }, - "System.Net.Sockets/4.1.0": { - "sha512": "xAz0N3dAV/aR/9g8r0Y5oEqU1JRsz29F5EGb/WVHmX3jVSLqi2/92M5hTad2aNWovruXrJpJtgZ9fccPMG9uSw==", - "type": "package", - "path": "System.Net.Sockets/4.1.0", - "files": [ - "System.Net.Sockets.4.1.0.nupkg.sha512", - "System.Net.Sockets.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Net.Sockets.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Net.Sockets.dll", - "ref/netstandard1.3/System.Net.Sockets.dll", - "ref/netstandard1.3/System.Net.Sockets.xml", - "ref/netstandard1.3/de/System.Net.Sockets.xml", - "ref/netstandard1.3/es/System.Net.Sockets.xml", - "ref/netstandard1.3/fr/System.Net.Sockets.xml", - "ref/netstandard1.3/it/System.Net.Sockets.xml", - "ref/netstandard1.3/ja/System.Net.Sockets.xml", - "ref/netstandard1.3/ko/System.Net.Sockets.xml", - "ref/netstandard1.3/ru/System.Net.Sockets.xml", - "ref/netstandard1.3/zh-hans/System.Net.Sockets.xml", - "ref/netstandard1.3/zh-hant/System.Net.Sockets.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Net.WebHeaderCollection/4.0.1": { - "sha512": "XX2TIAN+wBSAIV51BU2FvvXMdstUa8b0FBSZmDWjZdwUMmggQSifpTOZ5fNH20z9ZCg2fkV1L5SsZnpO2RQDRQ==", - "type": "package", - "path": "System.Net.WebHeaderCollection/4.0.1", - "files": [ - "System.Net.WebHeaderCollection.4.0.1.nupkg.sha512", - "System.Net.WebHeaderCollection.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/_._", - "lib/netstandard1.3/System.Net.WebHeaderCollection.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/_._", - "ref/netstandard1.3/System.Net.WebHeaderCollection.dll", - "ref/netstandard1.3/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/de/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/es/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/fr/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/it/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/ja/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/ko/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/ru/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/zh-hans/System.Net.WebHeaderCollection.xml", - "ref/netstandard1.3/zh-hant/System.Net.WebHeaderCollection.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Net.WebSockets/4.0.0": { - "sha512": "2KJo8hir6Edi9jnMDAMhiJoI691xRBmKcbNpwjrvpIMOCTYOtBpSsSEGBxBDV7PKbasJNaFp1+PZz1D7xS41Hg==", - "type": "package", - "path": "System.Net.WebSockets/4.0.0", - "files": [ - "System.Net.WebSockets.4.0.0.nupkg.sha512", - "System.Net.WebSockets.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Net.WebSockets.dll", - "lib/netstandard1.3/System.Net.WebSockets.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Net.WebSockets.dll", - "ref/netstandard1.3/System.Net.WebSockets.dll", - "ref/netstandard1.3/System.Net.WebSockets.xml", - "ref/netstandard1.3/de/System.Net.WebSockets.xml", - "ref/netstandard1.3/es/System.Net.WebSockets.xml", - "ref/netstandard1.3/fr/System.Net.WebSockets.xml", - "ref/netstandard1.3/it/System.Net.WebSockets.xml", - "ref/netstandard1.3/ja/System.Net.WebSockets.xml", - "ref/netstandard1.3/ko/System.Net.WebSockets.xml", - "ref/netstandard1.3/ru/System.Net.WebSockets.xml", - "ref/netstandard1.3/zh-hans/System.Net.WebSockets.xml", - "ref/netstandard1.3/zh-hant/System.Net.WebSockets.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Net.WebSockets.Client/4.0.0": { - "sha512": "GY5h9cn0ZVsG4ORQqMytTldrqxet2RC2CSEsgWGf4XNW5jhL5SxzcUZph03xbZsgn7K3qMr+Rq+gkbJNI+FEXg==", - "type": "package", - "path": "System.Net.WebSockets.Client/4.0.0", - "files": [ - "System.Net.WebSockets.Client.4.0.0.nupkg.sha512", - "System.Net.WebSockets.Client.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Net.WebSockets.Client.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Net.WebSockets.Client.dll", - "ref/netstandard1.3/System.Net.WebSockets.Client.dll", - "ref/netstandard1.3/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/de/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/es/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/fr/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/it/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/ja/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/ko/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/ru/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/zh-hans/System.Net.WebSockets.Client.xml", - "ref/netstandard1.3/zh-hant/System.Net.WebSockets.Client.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Net.WebSockets.Client.dll", - "runtimes/win/lib/net46/System.Net.WebSockets.Client.dll", - "runtimes/win/lib/netcore50/System.Net.WebSockets.Client.dll", - "runtimes/win/lib/netstandard1.3/System.Net.WebSockets.Client.dll" - ] - }, - "System.Numerics.Vectors/4.1.1": { - "sha512": "Ex1NSKycC2wi5XBMWUGWPc3lumh6OQWFFmmpZFZz0oLht5lQ+wWPHVZumOrMJuckfUiVMd4p67BrkBos8lcF+Q==", - "type": "package", - "path": "System.Numerics.Vectors/4.1.1", - "files": [ - "System.Numerics.Vectors.4.1.1.nupkg.sha512", - "System.Numerics.Vectors.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Numerics.Vectors.dll", - "lib/net46/System.Numerics.Vectors.xml", - "lib/netstandard1.0/System.Numerics.Vectors.dll", - "lib/netstandard1.0/System.Numerics.Vectors.xml", - "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.dll", - "lib/portable-net45+win8+wp8+wpa81/System.Numerics.Vectors.xml", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Numerics.Vectors.dll", - "ref/net46/System.Numerics.Vectors.xml", - "ref/netstandard1.0/System.Numerics.Vectors.dll", - "ref/netstandard1.0/System.Numerics.Vectors.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.ObjectModel/4.0.12": { - "sha512": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", - "type": "package", - "path": "System.ObjectModel/4.0.12", - "files": [ - "System.ObjectModel.4.0.12.nupkg.sha512", - "System.ObjectModel.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.ObjectModel.dll", - "lib/netstandard1.3/System.ObjectModel.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.ObjectModel.dll", - "ref/netcore50/System.ObjectModel.xml", - "ref/netcore50/de/System.ObjectModel.xml", - "ref/netcore50/es/System.ObjectModel.xml", - "ref/netcore50/fr/System.ObjectModel.xml", - "ref/netcore50/it/System.ObjectModel.xml", - "ref/netcore50/ja/System.ObjectModel.xml", - "ref/netcore50/ko/System.ObjectModel.xml", - "ref/netcore50/ru/System.ObjectModel.xml", - "ref/netcore50/zh-hans/System.ObjectModel.xml", - "ref/netcore50/zh-hant/System.ObjectModel.xml", - "ref/netstandard1.0/System.ObjectModel.dll", - "ref/netstandard1.0/System.ObjectModel.xml", - "ref/netstandard1.0/de/System.ObjectModel.xml", - "ref/netstandard1.0/es/System.ObjectModel.xml", - "ref/netstandard1.0/fr/System.ObjectModel.xml", - "ref/netstandard1.0/it/System.ObjectModel.xml", - "ref/netstandard1.0/ja/System.ObjectModel.xml", - "ref/netstandard1.0/ko/System.ObjectModel.xml", - "ref/netstandard1.0/ru/System.ObjectModel.xml", - "ref/netstandard1.0/zh-hans/System.ObjectModel.xml", - "ref/netstandard1.0/zh-hant/System.ObjectModel.xml", - "ref/netstandard1.3/System.ObjectModel.dll", - "ref/netstandard1.3/System.ObjectModel.xml", - "ref/netstandard1.3/de/System.ObjectModel.xml", - "ref/netstandard1.3/es/System.ObjectModel.xml", - "ref/netstandard1.3/fr/System.ObjectModel.xml", - "ref/netstandard1.3/it/System.ObjectModel.xml", - "ref/netstandard1.3/ja/System.ObjectModel.xml", - "ref/netstandard1.3/ko/System.ObjectModel.xml", - "ref/netstandard1.3/ru/System.ObjectModel.xml", - "ref/netstandard1.3/zh-hans/System.ObjectModel.xml", - "ref/netstandard1.3/zh-hant/System.ObjectModel.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Private.DataContractSerialization/4.1.1": { - "sha512": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", - "type": "package", - "path": "System.Private.DataContractSerialization/4.1.1", - "files": [ - "System.Private.DataContractSerialization.4.1.1.nupkg.sha512", - "System.Private.DataContractSerialization.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.3/System.Private.DataContractSerialization.dll", - "ref/netstandard/_._", - "runtimes/aot/lib/netcore50/System.Private.DataContractSerialization.dll" - ] - }, - "System.Reflection/4.1.0": { - "sha512": "JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==", - "type": "package", - "path": "System.Reflection/4.1.0", - "files": [ - "System.Reflection.4.1.0.nupkg.sha512", - "System.Reflection.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Reflection.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Reflection.dll", - "ref/netcore50/System.Reflection.dll", - "ref/netcore50/System.Reflection.xml", - "ref/netcore50/de/System.Reflection.xml", - "ref/netcore50/es/System.Reflection.xml", - "ref/netcore50/fr/System.Reflection.xml", - "ref/netcore50/it/System.Reflection.xml", - "ref/netcore50/ja/System.Reflection.xml", - "ref/netcore50/ko/System.Reflection.xml", - "ref/netcore50/ru/System.Reflection.xml", - "ref/netcore50/zh-hans/System.Reflection.xml", - "ref/netcore50/zh-hant/System.Reflection.xml", - "ref/netstandard1.0/System.Reflection.dll", - "ref/netstandard1.0/System.Reflection.xml", - "ref/netstandard1.0/de/System.Reflection.xml", - "ref/netstandard1.0/es/System.Reflection.xml", - "ref/netstandard1.0/fr/System.Reflection.xml", - "ref/netstandard1.0/it/System.Reflection.xml", - "ref/netstandard1.0/ja/System.Reflection.xml", - "ref/netstandard1.0/ko/System.Reflection.xml", - "ref/netstandard1.0/ru/System.Reflection.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.xml", - "ref/netstandard1.3/System.Reflection.dll", - "ref/netstandard1.3/System.Reflection.xml", - "ref/netstandard1.3/de/System.Reflection.xml", - "ref/netstandard1.3/es/System.Reflection.xml", - "ref/netstandard1.3/fr/System.Reflection.xml", - "ref/netstandard1.3/it/System.Reflection.xml", - "ref/netstandard1.3/ja/System.Reflection.xml", - "ref/netstandard1.3/ko/System.Reflection.xml", - "ref/netstandard1.3/ru/System.Reflection.xml", - "ref/netstandard1.3/zh-hans/System.Reflection.xml", - "ref/netstandard1.3/zh-hant/System.Reflection.xml", - "ref/netstandard1.5/System.Reflection.dll", - "ref/netstandard1.5/System.Reflection.xml", - "ref/netstandard1.5/de/System.Reflection.xml", - "ref/netstandard1.5/es/System.Reflection.xml", - "ref/netstandard1.5/fr/System.Reflection.xml", - "ref/netstandard1.5/it/System.Reflection.xml", - "ref/netstandard1.5/ja/System.Reflection.xml", - "ref/netstandard1.5/ko/System.Reflection.xml", - "ref/netstandard1.5/ru/System.Reflection.xml", - "ref/netstandard1.5/zh-hans/System.Reflection.xml", - "ref/netstandard1.5/zh-hant/System.Reflection.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Reflection.DispatchProxy/4.0.1": { - "sha512": "GPPgWoSxQEU3aCKSOvsAc1dhTTi4iq92PUVEVfnGPGwqCf6synaAJGYLKMs5E3CuRfel8ufACWUijXqDpOlGrA==", - "type": "package", - "path": "System.Reflection.DispatchProxy/4.0.1", - "files": [ - "System.Reflection.DispatchProxy.4.0.1.nupkg.sha512", - "System.Reflection.DispatchProxy.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/netstandard1.3/System.Reflection.DispatchProxy.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/netstandard1.3/System.Reflection.DispatchProxy.dll", - "ref/netstandard1.3/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/de/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/es/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/fr/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/it/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/ja/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/ko/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/ru/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/zh-hans/System.Reflection.DispatchProxy.xml", - "ref/netstandard1.3/zh-hant/System.Reflection.DispatchProxy.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Reflection.DispatchProxy.dll" - ] - }, - "System.Reflection.Emit/4.0.1": { - "sha512": "P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==", - "type": "package", - "path": "System.Reflection.Emit/4.0.1", - "files": [ - "System.Reflection.Emit.4.0.1.nupkg.sha512", - "System.Reflection.Emit.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/net45/_._", - "lib/netcore50/System.Reflection.Emit.dll", - "lib/netstandard1.3/System.Reflection.Emit.dll", - "lib/xamarinmac20/_._", - "ref/MonoAndroid10/_._", - "ref/net45/_._", - "ref/netstandard1.1/System.Reflection.Emit.dll", - "ref/netstandard1.1/System.Reflection.Emit.xml", - "ref/netstandard1.1/de/System.Reflection.Emit.xml", - "ref/netstandard1.1/es/System.Reflection.Emit.xml", - "ref/netstandard1.1/fr/System.Reflection.Emit.xml", - "ref/netstandard1.1/it/System.Reflection.Emit.xml", - "ref/netstandard1.1/ja/System.Reflection.Emit.xml", - "ref/netstandard1.1/ko/System.Reflection.Emit.xml", - "ref/netstandard1.1/ru/System.Reflection.Emit.xml", - "ref/netstandard1.1/zh-hans/System.Reflection.Emit.xml", - "ref/netstandard1.1/zh-hant/System.Reflection.Emit.xml", - "ref/xamarinmac20/_._" - ] - }, - "System.Reflection.Emit.ILGeneration/4.0.1": { - "sha512": "Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==", - "type": "package", - "path": "System.Reflection.Emit.ILGeneration/4.0.1", - "files": [ - "System.Reflection.Emit.ILGeneration.4.0.1.nupkg.sha512", - "System.Reflection.Emit.ILGeneration.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net45/_._", - "lib/netcore50/System.Reflection.Emit.ILGeneration.dll", - "lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll", - "lib/portable-net45+wp8/_._", - "lib/wp80/_._", - "ref/net45/_._", - "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.dll", - "ref/netstandard1.0/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/de/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/es/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/fr/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/it/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/ja/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/ko/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/ru/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Emit.ILGeneration.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Emit.ILGeneration.xml", - "ref/portable-net45+wp8/_._", - "ref/wp80/_._", - "runtimes/aot/lib/netcore50/_._" - ] - }, - "System.Reflection.Emit.Lightweight/4.0.1": { - "sha512": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", - "type": "package", - "path": "System.Reflection.Emit.Lightweight/4.0.1", - "files": [ - "System.Reflection.Emit.Lightweight.4.0.1.nupkg.sha512", - "System.Reflection.Emit.Lightweight.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net45/_._", - "lib/netcore50/System.Reflection.Emit.Lightweight.dll", - "lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll", - "lib/portable-net45+wp8/_._", - "lib/wp80/_._", - "ref/net45/_._", - "ref/netstandard1.0/System.Reflection.Emit.Lightweight.dll", - "ref/netstandard1.0/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/de/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/es/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/fr/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/it/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/ja/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/ko/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/ru/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Emit.Lightweight.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Emit.Lightweight.xml", - "ref/portable-net45+wp8/_._", - "ref/wp80/_._", - "runtimes/aot/lib/netcore50/_._" - ] - }, - "System.Reflection.Extensions/4.0.1": { - "sha512": "GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==", - "type": "package", - "path": "System.Reflection.Extensions/4.0.1", - "files": [ - "System.Reflection.Extensions.4.0.1.nupkg.sha512", - "System.Reflection.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Reflection.Extensions.dll", - "ref/netcore50/System.Reflection.Extensions.xml", - "ref/netcore50/de/System.Reflection.Extensions.xml", - "ref/netcore50/es/System.Reflection.Extensions.xml", - "ref/netcore50/fr/System.Reflection.Extensions.xml", - "ref/netcore50/it/System.Reflection.Extensions.xml", - "ref/netcore50/ja/System.Reflection.Extensions.xml", - "ref/netcore50/ko/System.Reflection.Extensions.xml", - "ref/netcore50/ru/System.Reflection.Extensions.xml", - "ref/netcore50/zh-hans/System.Reflection.Extensions.xml", - "ref/netcore50/zh-hant/System.Reflection.Extensions.xml", - "ref/netstandard1.0/System.Reflection.Extensions.dll", - "ref/netstandard1.0/System.Reflection.Extensions.xml", - "ref/netstandard1.0/de/System.Reflection.Extensions.xml", - "ref/netstandard1.0/es/System.Reflection.Extensions.xml", - "ref/netstandard1.0/fr/System.Reflection.Extensions.xml", - "ref/netstandard1.0/it/System.Reflection.Extensions.xml", - "ref/netstandard1.0/ja/System.Reflection.Extensions.xml", - "ref/netstandard1.0/ko/System.Reflection.Extensions.xml", - "ref/netstandard1.0/ru/System.Reflection.Extensions.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Extensions.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Extensions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Reflection.Metadata/1.3.0": { - "sha512": "jMSCxA4LSyKBGRDm/WtfkO03FkcgRzHxwvQRib1bm2GZ8ifKM1MX1al6breGCEQK280mdl9uQS7JNPXRYk90jw==", - "type": "package", - "path": "System.Reflection.Metadata/1.3.0", - "files": [ - "System.Reflection.Metadata.1.3.0.nupkg.sha512", - "System.Reflection.Metadata.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.1/System.Reflection.Metadata.dll", - "lib/netstandard1.1/System.Reflection.Metadata.xml", - "lib/portable-net45+win8/System.Reflection.Metadata.dll", - "lib/portable-net45+win8/System.Reflection.Metadata.xml" - ] - }, - "System.Reflection.Primitives/4.0.1": { - "sha512": "4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==", - "type": "package", - "path": "System.Reflection.Primitives/4.0.1", - "files": [ - "System.Reflection.Primitives.4.0.1.nupkg.sha512", - "System.Reflection.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Reflection.Primitives.dll", - "ref/netcore50/System.Reflection.Primitives.xml", - "ref/netcore50/de/System.Reflection.Primitives.xml", - "ref/netcore50/es/System.Reflection.Primitives.xml", - "ref/netcore50/fr/System.Reflection.Primitives.xml", - "ref/netcore50/it/System.Reflection.Primitives.xml", - "ref/netcore50/ja/System.Reflection.Primitives.xml", - "ref/netcore50/ko/System.Reflection.Primitives.xml", - "ref/netcore50/ru/System.Reflection.Primitives.xml", - "ref/netcore50/zh-hans/System.Reflection.Primitives.xml", - "ref/netcore50/zh-hant/System.Reflection.Primitives.xml", - "ref/netstandard1.0/System.Reflection.Primitives.dll", - "ref/netstandard1.0/System.Reflection.Primitives.xml", - "ref/netstandard1.0/de/System.Reflection.Primitives.xml", - "ref/netstandard1.0/es/System.Reflection.Primitives.xml", - "ref/netstandard1.0/fr/System.Reflection.Primitives.xml", - "ref/netstandard1.0/it/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ja/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ko/System.Reflection.Primitives.xml", - "ref/netstandard1.0/ru/System.Reflection.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.Reflection.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.Reflection.Primitives.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Reflection.TypeExtensions/4.1.0": { - "sha512": "tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==", - "type": "package", - "path": "System.Reflection.TypeExtensions/4.1.0", - "files": [ - "System.Reflection.TypeExtensions.4.1.0.nupkg.sha512", - "System.Reflection.TypeExtensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Reflection.TypeExtensions.dll", - "lib/net462/System.Reflection.TypeExtensions.dll", - "lib/netcore50/System.Reflection.TypeExtensions.dll", - "lib/netstandard1.5/System.Reflection.TypeExtensions.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Reflection.TypeExtensions.dll", - "ref/net462/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.3/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.3/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/de/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/es/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/fr/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/it/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ja/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ko/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/ru/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/zh-hans/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.3/zh-hant/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/System.Reflection.TypeExtensions.dll", - "ref/netstandard1.5/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/de/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/es/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/fr/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/it/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ja/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ko/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/ru/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/zh-hans/System.Reflection.TypeExtensions.xml", - "ref/netstandard1.5/zh-hant/System.Reflection.TypeExtensions.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Reflection.TypeExtensions.dll" - ] - }, - "System.Resources.Reader/4.0.0": { - "sha512": "VX1iHAoHxgrLZv+nq/9drCZI6Q4SSCzSVyUm1e0U60sqWdj6XhY7wvKmy3RvsSal9h+/vqSWwxxJsm0J4vn/jA==", - "type": "package", - "path": "System.Resources.Reader/4.0.0", - "files": [ - "System.Resources.Reader.4.0.0.nupkg.sha512", - "System.Resources.Reader.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/System.Resources.Reader.dll" - ] - }, - "System.Resources.ResourceManager/4.0.1": { - "sha512": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", - "type": "package", - "path": "System.Resources.ResourceManager/4.0.1", - "files": [ - "System.Resources.ResourceManager.4.0.1.nupkg.sha512", - "System.Resources.ResourceManager.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Resources.ResourceManager.dll", - "ref/netcore50/System.Resources.ResourceManager.xml", - "ref/netcore50/de/System.Resources.ResourceManager.xml", - "ref/netcore50/es/System.Resources.ResourceManager.xml", - "ref/netcore50/fr/System.Resources.ResourceManager.xml", - "ref/netcore50/it/System.Resources.ResourceManager.xml", - "ref/netcore50/ja/System.Resources.ResourceManager.xml", - "ref/netcore50/ko/System.Resources.ResourceManager.xml", - "ref/netcore50/ru/System.Resources.ResourceManager.xml", - "ref/netcore50/zh-hans/System.Resources.ResourceManager.xml", - "ref/netcore50/zh-hant/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/System.Resources.ResourceManager.dll", - "ref/netstandard1.0/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/de/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/es/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/fr/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/it/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/ja/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/ko/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/ru/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/zh-hans/System.Resources.ResourceManager.xml", - "ref/netstandard1.0/zh-hant/System.Resources.ResourceManager.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Resources.ResourceWriter/4.0.0-beta-22816": { - "sha512": "Q6wpzkZjop1J+WJXl9H0OgXQvxDQxMkqA43AVENNW4SlTzIT8rFW7tum54xYZy3QCMKK8gIfOnVqA6VbgXRq1Q==", - "type": "package", - "path": "System.Resources.ResourceWriter/4.0.0-beta-22816", - "files": [ - "License.rtf", - "System.Resources.ResourceWriter.4.0.0-beta-22816.nupkg.sha512", - "System.Resources.ResourceWriter.nuspec", - "lib/aspnetcore50/System.Resources.ResourceWriter.dll", - "lib/contract/System.Resources.ResourceWriter.dll", - "lib/net45/System.Resources.ResourceWriter.dll", - "lib/portable-wpa81+wp80+win80+net45+aspnetcore50/System.Resources.ResourceWriter.dll" - ] - }, - "System.Runtime/4.1.0": { - "sha512": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==", - "type": "package", - "path": "System.Runtime/4.1.0", - "files": [ - "System.Runtime.4.1.0.nupkg.sha512", - "System.Runtime.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Runtime.dll", - "lib/portable-net45+win8+wp80+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Runtime.dll", - "ref/netcore50/System.Runtime.dll", - "ref/netcore50/System.Runtime.xml", - "ref/netcore50/de/System.Runtime.xml", - "ref/netcore50/es/System.Runtime.xml", - "ref/netcore50/fr/System.Runtime.xml", - "ref/netcore50/it/System.Runtime.xml", - "ref/netcore50/ja/System.Runtime.xml", - "ref/netcore50/ko/System.Runtime.xml", - "ref/netcore50/ru/System.Runtime.xml", - "ref/netcore50/zh-hans/System.Runtime.xml", - "ref/netcore50/zh-hant/System.Runtime.xml", - "ref/netstandard1.0/System.Runtime.dll", - "ref/netstandard1.0/System.Runtime.xml", - "ref/netstandard1.0/de/System.Runtime.xml", - "ref/netstandard1.0/es/System.Runtime.xml", - "ref/netstandard1.0/fr/System.Runtime.xml", - "ref/netstandard1.0/it/System.Runtime.xml", - "ref/netstandard1.0/ja/System.Runtime.xml", - "ref/netstandard1.0/ko/System.Runtime.xml", - "ref/netstandard1.0/ru/System.Runtime.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.xml", - "ref/netstandard1.2/System.Runtime.dll", - "ref/netstandard1.2/System.Runtime.xml", - "ref/netstandard1.2/de/System.Runtime.xml", - "ref/netstandard1.2/es/System.Runtime.xml", - "ref/netstandard1.2/fr/System.Runtime.xml", - "ref/netstandard1.2/it/System.Runtime.xml", - "ref/netstandard1.2/ja/System.Runtime.xml", - "ref/netstandard1.2/ko/System.Runtime.xml", - "ref/netstandard1.2/ru/System.Runtime.xml", - "ref/netstandard1.2/zh-hans/System.Runtime.xml", - "ref/netstandard1.2/zh-hant/System.Runtime.xml", - "ref/netstandard1.3/System.Runtime.dll", - "ref/netstandard1.3/System.Runtime.xml", - "ref/netstandard1.3/de/System.Runtime.xml", - "ref/netstandard1.3/es/System.Runtime.xml", - "ref/netstandard1.3/fr/System.Runtime.xml", - "ref/netstandard1.3/it/System.Runtime.xml", - "ref/netstandard1.3/ja/System.Runtime.xml", - "ref/netstandard1.3/ko/System.Runtime.xml", - "ref/netstandard1.3/ru/System.Runtime.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.xml", - "ref/netstandard1.5/System.Runtime.dll", - "ref/netstandard1.5/System.Runtime.xml", - "ref/netstandard1.5/de/System.Runtime.xml", - "ref/netstandard1.5/es/System.Runtime.xml", - "ref/netstandard1.5/fr/System.Runtime.xml", - "ref/netstandard1.5/it/System.Runtime.xml", - "ref/netstandard1.5/ja/System.Runtime.xml", - "ref/netstandard1.5/ko/System.Runtime.xml", - "ref/netstandard1.5/ru/System.Runtime.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.xml", - "ref/portable-net45+win8+wp80+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.CompilerServices.Unsafe/4.0.0": { - "sha512": "LDvjxLx2fkThOFo/SC+901fJrh5artALmgzeSqnVxzvFp4q3HO8BkeLyshPdcbs5zpN7Xh9G23M6sDhgIPbG9A==", - "type": "package", - "path": "System.Runtime.CompilerServices.Unsafe/4.0.0", - "files": [ - "System.Runtime.CompilerServices.Unsafe.4.0.0.nupkg.sha512", - "System.Runtime.CompilerServices.Unsafe.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll", - "lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml" - ] - }, - "System.Runtime.Extensions/4.1.0": { - "sha512": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", - "type": "package", - "path": "System.Runtime.Extensions/4.1.0", - "files": [ - "System.Runtime.Extensions.4.1.0.nupkg.sha512", - "System.Runtime.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Runtime.Extensions.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Runtime.Extensions.dll", - "ref/netcore50/System.Runtime.Extensions.dll", - "ref/netcore50/System.Runtime.Extensions.xml", - "ref/netcore50/de/System.Runtime.Extensions.xml", - "ref/netcore50/es/System.Runtime.Extensions.xml", - "ref/netcore50/fr/System.Runtime.Extensions.xml", - "ref/netcore50/it/System.Runtime.Extensions.xml", - "ref/netcore50/ja/System.Runtime.Extensions.xml", - "ref/netcore50/ko/System.Runtime.Extensions.xml", - "ref/netcore50/ru/System.Runtime.Extensions.xml", - "ref/netcore50/zh-hans/System.Runtime.Extensions.xml", - "ref/netcore50/zh-hant/System.Runtime.Extensions.xml", - "ref/netstandard1.0/System.Runtime.Extensions.dll", - "ref/netstandard1.0/System.Runtime.Extensions.xml", - "ref/netstandard1.0/de/System.Runtime.Extensions.xml", - "ref/netstandard1.0/es/System.Runtime.Extensions.xml", - "ref/netstandard1.0/fr/System.Runtime.Extensions.xml", - "ref/netstandard1.0/it/System.Runtime.Extensions.xml", - "ref/netstandard1.0/ja/System.Runtime.Extensions.xml", - "ref/netstandard1.0/ko/System.Runtime.Extensions.xml", - "ref/netstandard1.0/ru/System.Runtime.Extensions.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.Extensions.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.Extensions.xml", - "ref/netstandard1.3/System.Runtime.Extensions.dll", - "ref/netstandard1.3/System.Runtime.Extensions.xml", - "ref/netstandard1.3/de/System.Runtime.Extensions.xml", - "ref/netstandard1.3/es/System.Runtime.Extensions.xml", - "ref/netstandard1.3/fr/System.Runtime.Extensions.xml", - "ref/netstandard1.3/it/System.Runtime.Extensions.xml", - "ref/netstandard1.3/ja/System.Runtime.Extensions.xml", - "ref/netstandard1.3/ko/System.Runtime.Extensions.xml", - "ref/netstandard1.3/ru/System.Runtime.Extensions.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.Extensions.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.Extensions.xml", - "ref/netstandard1.5/System.Runtime.Extensions.dll", - "ref/netstandard1.5/System.Runtime.Extensions.xml", - "ref/netstandard1.5/de/System.Runtime.Extensions.xml", - "ref/netstandard1.5/es/System.Runtime.Extensions.xml", - "ref/netstandard1.5/fr/System.Runtime.Extensions.xml", - "ref/netstandard1.5/it/System.Runtime.Extensions.xml", - "ref/netstandard1.5/ja/System.Runtime.Extensions.xml", - "ref/netstandard1.5/ko/System.Runtime.Extensions.xml", - "ref/netstandard1.5/ru/System.Runtime.Extensions.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.Extensions.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.Extensions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.Handles/4.0.1": { - "sha512": "nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==", - "type": "package", - "path": "System.Runtime.Handles/4.0.1", - "files": [ - "System.Runtime.Handles.4.0.1.nupkg.sha512", - "System.Runtime.Handles.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/_._", - "ref/netstandard1.3/System.Runtime.Handles.dll", - "ref/netstandard1.3/System.Runtime.Handles.xml", - "ref/netstandard1.3/de/System.Runtime.Handles.xml", - "ref/netstandard1.3/es/System.Runtime.Handles.xml", - "ref/netstandard1.3/fr/System.Runtime.Handles.xml", - "ref/netstandard1.3/it/System.Runtime.Handles.xml", - "ref/netstandard1.3/ja/System.Runtime.Handles.xml", - "ref/netstandard1.3/ko/System.Runtime.Handles.xml", - "ref/netstandard1.3/ru/System.Runtime.Handles.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.Handles.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.Handles.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.InteropServices/4.1.0": { - "sha512": "16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==", - "type": "package", - "path": "System.Runtime.InteropServices/4.1.0", - "files": [ - "System.Runtime.InteropServices.4.1.0.nupkg.sha512", - "System.Runtime.InteropServices.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net462/System.Runtime.InteropServices.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net462/System.Runtime.InteropServices.dll", - "ref/netcore50/System.Runtime.InteropServices.dll", - "ref/netcore50/System.Runtime.InteropServices.xml", - "ref/netcore50/de/System.Runtime.InteropServices.xml", - "ref/netcore50/es/System.Runtime.InteropServices.xml", - "ref/netcore50/fr/System.Runtime.InteropServices.xml", - "ref/netcore50/it/System.Runtime.InteropServices.xml", - "ref/netcore50/ja/System.Runtime.InteropServices.xml", - "ref/netcore50/ko/System.Runtime.InteropServices.xml", - "ref/netcore50/ru/System.Runtime.InteropServices.xml", - "ref/netcore50/zh-hans/System.Runtime.InteropServices.xml", - "ref/netcore50/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/System.Runtime.InteropServices.dll", - "ref/netstandard1.1/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.1/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/System.Runtime.InteropServices.dll", - "ref/netstandard1.2/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.2/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/System.Runtime.InteropServices.dll", - "ref/netstandard1.3/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/System.Runtime.InteropServices.dll", - "ref/netstandard1.5/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/de/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/es/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/fr/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/it/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/ja/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/ko/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/ru/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.InteropServices.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.InteropServices.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.InteropServices.RuntimeInformation/4.0.0": { - "sha512": "hWPhJxc453RCa8Z29O91EmfGeZIHX1ZH2A8L6lYQVSaKzku2DfArSfMEb1/MYYzPQRJZeu0c9dmYeJKxW5Fgng==", - "type": "package", - "path": "System.Runtime.InteropServices.RuntimeInformation/4.0.0", - "files": [ - "System.Runtime.InteropServices.RuntimeInformation.4.0.0.nupkg.sha512", - "System.Runtime.InteropServices.RuntimeInformation.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll", - "lib/win8/System.Runtime.InteropServices.RuntimeInformation.dll", - "lib/wpa81/System.Runtime.InteropServices.RuntimeInformation.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/unix/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/win/lib/net45/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/win/lib/netcore50/System.Runtime.InteropServices.RuntimeInformation.dll", - "runtimes/win/lib/netstandard1.1/System.Runtime.InteropServices.RuntimeInformation.dll" - ] - }, - "System.Runtime.Loader/4.0.0": { - "sha512": "4UN78GOVU/mbDFcXkEWtetJT/sJ0yic2gGk1HSlSpWI0TDf421xnrZTDZnwNBapk1GQeYN7U1lTj/aQB1by6ow==", - "type": "package", - "path": "System.Runtime.Loader/4.0.0", - "files": [ - "System.Runtime.Loader.4.0.0.nupkg.sha512", - "System.Runtime.Loader.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net462/_._", - "lib/netstandard1.5/System.Runtime.Loader.dll", - "ref/netstandard1.5/System.Runtime.Loader.dll", - "ref/netstandard1.5/System.Runtime.Loader.xml", - "ref/netstandard1.5/de/System.Runtime.Loader.xml", - "ref/netstandard1.5/es/System.Runtime.Loader.xml", - "ref/netstandard1.5/fr/System.Runtime.Loader.xml", - "ref/netstandard1.5/it/System.Runtime.Loader.xml", - "ref/netstandard1.5/ja/System.Runtime.Loader.xml", - "ref/netstandard1.5/ko/System.Runtime.Loader.xml", - "ref/netstandard1.5/ru/System.Runtime.Loader.xml", - "ref/netstandard1.5/zh-hans/System.Runtime.Loader.xml", - "ref/netstandard1.5/zh-hant/System.Runtime.Loader.xml" - ] - }, - "System.Runtime.Numerics/4.0.1": { - "sha512": "+XbKFuzdmLP3d1o9pdHu2nxjNr2OEPqGzKeegPLCUMM71a0t50A/rOcIRmGs9wR7a8KuHX6hYs/7/TymIGLNqg==", - "type": "package", - "path": "System.Runtime.Numerics/4.0.1", - "files": [ - "System.Runtime.Numerics.4.0.1.nupkg.sha512", - "System.Runtime.Numerics.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Runtime.Numerics.dll", - "lib/netstandard1.3/System.Runtime.Numerics.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Runtime.Numerics.dll", - "ref/netcore50/System.Runtime.Numerics.xml", - "ref/netcore50/de/System.Runtime.Numerics.xml", - "ref/netcore50/es/System.Runtime.Numerics.xml", - "ref/netcore50/fr/System.Runtime.Numerics.xml", - "ref/netcore50/it/System.Runtime.Numerics.xml", - "ref/netcore50/ja/System.Runtime.Numerics.xml", - "ref/netcore50/ko/System.Runtime.Numerics.xml", - "ref/netcore50/ru/System.Runtime.Numerics.xml", - "ref/netcore50/zh-hans/System.Runtime.Numerics.xml", - "ref/netcore50/zh-hant/System.Runtime.Numerics.xml", - "ref/netstandard1.1/System.Runtime.Numerics.dll", - "ref/netstandard1.1/System.Runtime.Numerics.xml", - "ref/netstandard1.1/de/System.Runtime.Numerics.xml", - "ref/netstandard1.1/es/System.Runtime.Numerics.xml", - "ref/netstandard1.1/fr/System.Runtime.Numerics.xml", - "ref/netstandard1.1/it/System.Runtime.Numerics.xml", - "ref/netstandard1.1/ja/System.Runtime.Numerics.xml", - "ref/netstandard1.1/ko/System.Runtime.Numerics.xml", - "ref/netstandard1.1/ru/System.Runtime.Numerics.xml", - "ref/netstandard1.1/zh-hans/System.Runtime.Numerics.xml", - "ref/netstandard1.1/zh-hant/System.Runtime.Numerics.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Runtime.Serialization.Primitives/4.1.1": { - "sha512": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", - "type": "package", - "path": "System.Runtime.Serialization.Primitives/4.1.1", - "files": [ - "System.Runtime.Serialization.Primitives.4.1.1.nupkg.sha512", - "System.Runtime.Serialization.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net46/System.Runtime.Serialization.Primitives.dll", - "lib/netcore50/System.Runtime.Serialization.Primitives.dll", - "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net46/System.Runtime.Serialization.Primitives.dll", - "ref/netcore50/System.Runtime.Serialization.Primitives.dll", - "ref/netcore50/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/de/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/es/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/fr/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/it/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/ja/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/ko/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/ru/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/zh-hans/System.Runtime.Serialization.Primitives.xml", - "ref/netcore50/zh-hant/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/System.Runtime.Serialization.Primitives.dll", - "ref/netstandard1.0/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/de/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/es/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/fr/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/it/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/ja/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/ko/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/ru/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/System.Runtime.Serialization.Primitives.dll", - "ref/netstandard1.3/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/de/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/es/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/fr/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/it/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/ja/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/ko/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/ru/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.Serialization.Primitives.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.Serialization.Primitives.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Runtime.Serialization.Primitives.dll" - ] - }, - "System.Runtime.Serialization.Xml/4.1.1": { - "sha512": "yqfKHkWUAdI0hdDIdD9KDzluKtZ8IIqLF3O7xIZlt6UTs1bOvFRpCvRTvGQva3Ak/ZM9/nq9IHBJ1tC4Ybcrjg==", - "type": "package", - "path": "System.Runtime.Serialization.Xml/4.1.1", - "files": [ - "System.Runtime.Serialization.Xml.4.1.1.nupkg.sha512", - "System.Runtime.Serialization.Xml.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net46/System.Runtime.Serialization.Xml.dll", - "lib/netcore50/System.Runtime.Serialization.Xml.dll", - "lib/netstandard1.3/System.Runtime.Serialization.Xml.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net46/System.Runtime.Serialization.Xml.dll", - "ref/netcore50/System.Runtime.Serialization.Xml.dll", - "ref/netcore50/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/de/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/es/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/fr/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/it/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/ja/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/ko/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/ru/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/zh-hans/System.Runtime.Serialization.Xml.xml", - "ref/netcore50/zh-hant/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/System.Runtime.Serialization.Xml.dll", - "ref/netstandard1.0/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/de/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/es/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/fr/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/it/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/ja/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/ko/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/ru/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/zh-hans/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.0/zh-hant/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/System.Runtime.Serialization.Xml.dll", - "ref/netstandard1.3/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/de/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/es/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/fr/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/it/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/ja/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/ko/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/ru/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/zh-hans/System.Runtime.Serialization.Xml.xml", - "ref/netstandard1.3/zh-hant/System.Runtime.Serialization.Xml.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Security.Claims/4.0.1": { - "sha512": "4Jlp0OgJLS/Voj1kyFP6MJlIYp3crgfH8kNQk2p7+4JYfc1aAmh9PZyAMMbDhuoolGNtux9HqSOazsioRiDvCw==", - "type": "package", - "path": "System.Security.Claims/4.0.1", - "files": [ - "System.Security.Claims.4.0.1.nupkg.sha512", - "System.Security.Claims.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Claims.dll", - "lib/netstandard1.3/System.Security.Claims.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Claims.dll", - "ref/netstandard1.3/System.Security.Claims.dll", - "ref/netstandard1.3/System.Security.Claims.xml", - "ref/netstandard1.3/de/System.Security.Claims.xml", - "ref/netstandard1.3/es/System.Security.Claims.xml", - "ref/netstandard1.3/fr/System.Security.Claims.xml", - "ref/netstandard1.3/it/System.Security.Claims.xml", - "ref/netstandard1.3/ja/System.Security.Claims.xml", - "ref/netstandard1.3/ko/System.Security.Claims.xml", - "ref/netstandard1.3/ru/System.Security.Claims.xml", - "ref/netstandard1.3/zh-hans/System.Security.Claims.xml", - "ref/netstandard1.3/zh-hant/System.Security.Claims.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Security.Cryptography.Algorithms/4.2.0": { - "sha512": "8JQFxbLVdrtIOKMDN38Fn0GWnqYZw/oMlwOUG/qz1jqChvyZlnUmu+0s7wLx7JYua/nAXoESpHA3iw11QFWhXg==", - "type": "package", - "path": "System.Security.Cryptography.Algorithms/4.2.0", - "files": [ - "System.Security.Cryptography.Algorithms.4.2.0.nupkg.sha512", - "System.Security.Cryptography.Algorithms.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.Algorithms.dll", - "lib/net461/System.Security.Cryptography.Algorithms.dll", - "lib/net463/System.Security.Cryptography.Algorithms.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.Algorithms.dll", - "ref/net461/System.Security.Cryptography.Algorithms.dll", - "ref/net463/System.Security.Cryptography.Algorithms.dll", - "ref/netstandard1.3/System.Security.Cryptography.Algorithms.dll", - "ref/netstandard1.4/System.Security.Cryptography.Algorithms.dll", - "ref/netstandard1.6/System.Security.Cryptography.Algorithms.dll", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net461/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/net463/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/netcore50/System.Security.Cryptography.Algorithms.dll", - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Algorithms.dll" - ] - }, - "System.Security.Cryptography.Cng/4.2.0": { - "sha512": "cUJ2h+ZvONDe28Szw3st5dOHdjndhJzQ2WObDEXAWRPEQBtVItVoxbXM/OEsTthl3cNn2dk2k0I3y45igCQcLw==", - "type": "package", - "path": "System.Security.Cryptography.Cng/4.2.0", - "files": [ - "System.Security.Cryptography.Cng.4.2.0.nupkg.sha512", - "System.Security.Cryptography.Cng.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net46/System.Security.Cryptography.Cng.dll", - "lib/net461/System.Security.Cryptography.Cng.dll", - "lib/net463/System.Security.Cryptography.Cng.dll", - "ref/net46/System.Security.Cryptography.Cng.dll", - "ref/net461/System.Security.Cryptography.Cng.dll", - "ref/net463/System.Security.Cryptography.Cng.dll", - "ref/netstandard1.3/System.Security.Cryptography.Cng.dll", - "ref/netstandard1.4/System.Security.Cryptography.Cng.dll", - "ref/netstandard1.6/System.Security.Cryptography.Cng.dll", - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.Cng.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.Cng.dll", - "runtimes/win/lib/net461/System.Security.Cryptography.Cng.dll", - "runtimes/win/lib/net463/System.Security.Cryptography.Cng.dll", - "runtimes/win/lib/netstandard1.4/System.Security.Cryptography.Cng.dll", - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.Cng.dll" - ] - }, - "System.Security.Cryptography.Csp/4.0.0": { - "sha512": "/i1Usuo4PgAqgbPNC0NjbO3jPW//BoBlTpcWFD1EHVbidH21y4c1ap5bbEMSGAXjAShhMH4abi/K8fILrnu4BQ==", - "type": "package", - "path": "System.Security.Cryptography.Csp/4.0.0", - "files": [ - "System.Security.Cryptography.Csp.4.0.0.nupkg.sha512", - "System.Security.Cryptography.Csp.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.Csp.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.Csp.dll", - "ref/netstandard1.3/System.Security.Cryptography.Csp.dll", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Csp.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.Csp.dll", - "runtimes/win/lib/netcore50/_._", - "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Csp.dll" - ] - }, - "System.Security.Cryptography.Encoding/4.0.0": { - "sha512": "FbKgE5MbxSQMPcSVRgwM6bXN3GtyAh04NkV8E5zKCBE26X0vYW0UtTa2FIgkH33WVqBVxRgxljlVYumWtU+HcQ==", - "type": "package", - "path": "System.Security.Cryptography.Encoding/4.0.0", - "files": [ - "System.Security.Cryptography.Encoding.4.0.0.nupkg.sha512", - "System.Security.Cryptography.Encoding.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.Encoding.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.Encoding.dll", - "ref/netstandard1.3/System.Security.Cryptography.Encoding.dll", - "ref/netstandard1.3/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/de/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/es/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/fr/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/it/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/ja/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/ko/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/ru/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/zh-hans/System.Security.Cryptography.Encoding.xml", - "ref/netstandard1.3/zh-hant/System.Security.Cryptography.Encoding.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.Encoding.dll", - "runtimes/win/lib/netstandard1.3/System.Security.Cryptography.Encoding.dll" - ] - }, - "System.Security.Cryptography.OpenSsl/4.0.0": { - "sha512": "HUG/zNUJwEiLkoURDixzkzZdB5yGA5pQhDP93ArOpDPQMteURIGERRNzzoJlmTreLBWr5lkFSjjMSk8ySEpQMw==", - "type": "package", - "path": "System.Security.Cryptography.OpenSsl/4.0.0", - "files": [ - "System.Security.Cryptography.OpenSsl.4.0.0.nupkg.sha512", - "System.Security.Cryptography.OpenSsl.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll", - "ref/netstandard1.6/System.Security.Cryptography.OpenSsl.dll", - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.OpenSsl.dll" - ] - }, - "System.Security.Cryptography.Primitives/4.0.0": { - "sha512": "Wkd7QryWYjkQclX0bngpntW5HSlMzeJU24UaLJQ7YTfI8ydAVAaU2J+HXLLABOVJlKTVvAeL0Aj39VeTe7L+oA==", - "type": "package", - "path": "System.Security.Cryptography.Primitives/4.0.0", - "files": [ - "System.Security.Cryptography.Primitives.4.0.0.nupkg.sha512", - "System.Security.Cryptography.Primitives.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.Primitives.dll", - "lib/netstandard1.3/System.Security.Cryptography.Primitives.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.Primitives.dll", - "ref/netstandard1.3/System.Security.Cryptography.Primitives.dll", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Security.Cryptography.X509Certificates/4.1.0": { - "sha512": "4HEfsQIKAhA1+ApNn729Gi09zh+lYWwyIuViihoMDWp1vQnEkL2ct7mAbhBlLYm+x/L4Rr/pyGge1lIY635e0w==", - "type": "package", - "path": "System.Security.Cryptography.X509Certificates/4.1.0", - "files": [ - "System.Security.Cryptography.X509Certificates.4.1.0.nupkg.sha512", - "System.Security.Cryptography.X509Certificates.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Security.Cryptography.X509Certificates.dll", - "lib/net461/System.Security.Cryptography.X509Certificates.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Security.Cryptography.X509Certificates.dll", - "ref/net461/System.Security.Cryptography.X509Certificates.dll", - "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.dll", - "ref/netstandard1.3/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/de/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/es/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/fr/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/it/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/ja/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/ko/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/ru/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/zh-hans/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.3/zh-hant/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.dll", - "ref/netstandard1.4/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/de/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/es/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/fr/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/it/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/ja/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/ko/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/ru/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/zh-hans/System.Security.Cryptography.X509Certificates.xml", - "ref/netstandard1.4/zh-hant/System.Security.Cryptography.X509Certificates.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/net46/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/net461/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/netcore50/System.Security.Cryptography.X509Certificates.dll", - "runtimes/win/lib/netstandard1.6/System.Security.Cryptography.X509Certificates.dll" - ] - }, - "System.Security.Principal/4.0.1": { - "sha512": "On+SKhXY5rzxh/S8wlH1Rm0ogBlu7zyHNxeNBiXauNrhHRXAe9EuX8Yl5IOzLPGU5Z4kLWHMvORDOCG8iu9hww==", - "type": "package", - "path": "System.Security.Principal/4.0.1", - "files": [ - "System.Security.Principal.4.0.1.nupkg.sha512", - "System.Security.Principal.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Security.Principal.dll", - "lib/netstandard1.0/System.Security.Principal.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Security.Principal.dll", - "ref/netcore50/System.Security.Principal.xml", - "ref/netcore50/de/System.Security.Principal.xml", - "ref/netcore50/es/System.Security.Principal.xml", - "ref/netcore50/fr/System.Security.Principal.xml", - "ref/netcore50/it/System.Security.Principal.xml", - "ref/netcore50/ja/System.Security.Principal.xml", - "ref/netcore50/ko/System.Security.Principal.xml", - "ref/netcore50/ru/System.Security.Principal.xml", - "ref/netcore50/zh-hans/System.Security.Principal.xml", - "ref/netcore50/zh-hant/System.Security.Principal.xml", - "ref/netstandard1.0/System.Security.Principal.dll", - "ref/netstandard1.0/System.Security.Principal.xml", - "ref/netstandard1.0/de/System.Security.Principal.xml", - "ref/netstandard1.0/es/System.Security.Principal.xml", - "ref/netstandard1.0/fr/System.Security.Principal.xml", - "ref/netstandard1.0/it/System.Security.Principal.xml", - "ref/netstandard1.0/ja/System.Security.Principal.xml", - "ref/netstandard1.0/ko/System.Security.Principal.xml", - "ref/netstandard1.0/ru/System.Security.Principal.xml", - "ref/netstandard1.0/zh-hans/System.Security.Principal.xml", - "ref/netstandard1.0/zh-hant/System.Security.Principal.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Security.Principal.Windows/4.0.0": { - "sha512": "iFx15AF3RMEPZn3COh8+Bb2Thv2zsmLd93RchS1b8Mj5SNYeGqbYNCSn5AES1+gq56p4ujGZPrl0xN7ngkXOHg==", - "type": "package", - "path": "System.Security.Principal.Windows/4.0.0", - "files": [ - "System.Security.Principal.Windows.4.0.0.nupkg.sha512", - "System.Security.Principal.Windows.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net46/System.Security.Principal.Windows.dll", - "ref/net46/System.Security.Principal.Windows.dll", - "ref/netstandard1.3/System.Security.Principal.Windows.dll", - "ref/netstandard1.3/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/de/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/es/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/fr/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/it/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ja/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ko/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/ru/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml", - "ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml", - "runtimes/unix/lib/netstandard1.3/System.Security.Principal.Windows.dll", - "runtimes/win/lib/net46/System.Security.Principal.Windows.dll", - "runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll" - ] - }, - "System.Text.Encoding/4.0.11": { - "sha512": "U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==", - "type": "package", - "path": "System.Text.Encoding/4.0.11", - "files": [ - "System.Text.Encoding.4.0.11.nupkg.sha512", - "System.Text.Encoding.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Text.Encoding.dll", - "ref/netcore50/System.Text.Encoding.xml", - "ref/netcore50/de/System.Text.Encoding.xml", - "ref/netcore50/es/System.Text.Encoding.xml", - "ref/netcore50/fr/System.Text.Encoding.xml", - "ref/netcore50/it/System.Text.Encoding.xml", - "ref/netcore50/ja/System.Text.Encoding.xml", - "ref/netcore50/ko/System.Text.Encoding.xml", - "ref/netcore50/ru/System.Text.Encoding.xml", - "ref/netcore50/zh-hans/System.Text.Encoding.xml", - "ref/netcore50/zh-hant/System.Text.Encoding.xml", - "ref/netstandard1.0/System.Text.Encoding.dll", - "ref/netstandard1.0/System.Text.Encoding.xml", - "ref/netstandard1.0/de/System.Text.Encoding.xml", - "ref/netstandard1.0/es/System.Text.Encoding.xml", - "ref/netstandard1.0/fr/System.Text.Encoding.xml", - "ref/netstandard1.0/it/System.Text.Encoding.xml", - "ref/netstandard1.0/ja/System.Text.Encoding.xml", - "ref/netstandard1.0/ko/System.Text.Encoding.xml", - "ref/netstandard1.0/ru/System.Text.Encoding.xml", - "ref/netstandard1.0/zh-hans/System.Text.Encoding.xml", - "ref/netstandard1.0/zh-hant/System.Text.Encoding.xml", - "ref/netstandard1.3/System.Text.Encoding.dll", - "ref/netstandard1.3/System.Text.Encoding.xml", - "ref/netstandard1.3/de/System.Text.Encoding.xml", - "ref/netstandard1.3/es/System.Text.Encoding.xml", - "ref/netstandard1.3/fr/System.Text.Encoding.xml", - "ref/netstandard1.3/it/System.Text.Encoding.xml", - "ref/netstandard1.3/ja/System.Text.Encoding.xml", - "ref/netstandard1.3/ko/System.Text.Encoding.xml", - "ref/netstandard1.3/ru/System.Text.Encoding.xml", - "ref/netstandard1.3/zh-hans/System.Text.Encoding.xml", - "ref/netstandard1.3/zh-hant/System.Text.Encoding.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Text.Encoding.CodePages/4.0.1": { - "sha512": "h4z6rrA/hxWf4655D18IIZ0eaLRa3tQC/j+e26W+VinIHY0l07iEXaAvO0YSYq3MvCjMYy8Zs5AdC1sxNQOB7Q==", - "type": "package", - "path": "System.Text.Encoding.CodePages/4.0.1", - "files": [ - "System.Text.Encoding.CodePages.4.0.1.nupkg.sha512", - "System.Text.Encoding.CodePages.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Text.Encoding.CodePages.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/netstandard1.3/System.Text.Encoding.CodePages.dll", - "ref/netstandard1.3/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/de/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/es/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/fr/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/it/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/ja/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/ko/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/ru/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/zh-hans/System.Text.Encoding.CodePages.xml", - "ref/netstandard1.3/zh-hant/System.Text.Encoding.CodePages.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/unix/lib/netstandard1.3/System.Text.Encoding.CodePages.dll", - "runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll" - ] - }, - "System.Text.Encoding.Extensions/4.0.11": { - "sha512": "jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==", - "type": "package", - "path": "System.Text.Encoding.Extensions/4.0.11", - "files": [ - "System.Text.Encoding.Extensions.4.0.11.nupkg.sha512", - "System.Text.Encoding.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Text.Encoding.Extensions.dll", - "ref/netcore50/System.Text.Encoding.Extensions.xml", - "ref/netcore50/de/System.Text.Encoding.Extensions.xml", - "ref/netcore50/es/System.Text.Encoding.Extensions.xml", - "ref/netcore50/fr/System.Text.Encoding.Extensions.xml", - "ref/netcore50/it/System.Text.Encoding.Extensions.xml", - "ref/netcore50/ja/System.Text.Encoding.Extensions.xml", - "ref/netcore50/ko/System.Text.Encoding.Extensions.xml", - "ref/netcore50/ru/System.Text.Encoding.Extensions.xml", - "ref/netcore50/zh-hans/System.Text.Encoding.Extensions.xml", - "ref/netcore50/zh-hant/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/System.Text.Encoding.Extensions.dll", - "ref/netstandard1.0/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/de/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/es/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/fr/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/it/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/ja/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/ko/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/ru/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/zh-hans/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.0/zh-hant/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/System.Text.Encoding.Extensions.dll", - "ref/netstandard1.3/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/de/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/es/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/fr/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/it/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/ja/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/ko/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/ru/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/zh-hans/System.Text.Encoding.Extensions.xml", - "ref/netstandard1.3/zh-hant/System.Text.Encoding.Extensions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Text.Encodings.Web/4.0.0": { - "sha512": "TWZnuiJgPDAEEUfobD7njXvSVR2Toz+jvKWds6yL4oSztmKQfnWzucczjzA+6Dv1bktBdY71sZW1YN0X6m9chQ==", - "type": "package", - "path": "System.Text.Encodings.Web/4.0.0", - "files": [ - "System.Text.Encodings.Web.4.0.0.nupkg.sha512", - "System.Text.Encodings.Web.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/System.Text.Encodings.Web.dll", - "lib/netstandard1.0/System.Text.Encodings.Web.xml" - ] - }, - "System.Text.RegularExpressions/4.1.0": { - "sha512": "i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==", - "type": "package", - "path": "System.Text.RegularExpressions/4.1.0", - "files": [ - "System.Text.RegularExpressions.4.1.0.nupkg.sha512", - "System.Text.RegularExpressions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/net463/System.Text.RegularExpressions.dll", - "lib/netcore50/System.Text.RegularExpressions.dll", - "lib/netstandard1.6/System.Text.RegularExpressions.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/net463/System.Text.RegularExpressions.dll", - "ref/netcore50/System.Text.RegularExpressions.dll", - "ref/netcore50/System.Text.RegularExpressions.xml", - "ref/netcore50/de/System.Text.RegularExpressions.xml", - "ref/netcore50/es/System.Text.RegularExpressions.xml", - "ref/netcore50/fr/System.Text.RegularExpressions.xml", - "ref/netcore50/it/System.Text.RegularExpressions.xml", - "ref/netcore50/ja/System.Text.RegularExpressions.xml", - "ref/netcore50/ko/System.Text.RegularExpressions.xml", - "ref/netcore50/ru/System.Text.RegularExpressions.xml", - "ref/netcore50/zh-hans/System.Text.RegularExpressions.xml", - "ref/netcore50/zh-hant/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/System.Text.RegularExpressions.dll", - "ref/netstandard1.0/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/de/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/es/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/fr/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/it/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/ja/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/ko/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/ru/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/zh-hans/System.Text.RegularExpressions.xml", - "ref/netstandard1.0/zh-hant/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/System.Text.RegularExpressions.dll", - "ref/netstandard1.3/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/de/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/es/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/fr/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/it/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/ja/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/ko/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/ru/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/zh-hans/System.Text.RegularExpressions.xml", - "ref/netstandard1.3/zh-hant/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/System.Text.RegularExpressions.dll", - "ref/netstandard1.6/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/de/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/es/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/fr/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/it/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/ja/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/ko/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/ru/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/zh-hans/System.Text.RegularExpressions.xml", - "ref/netstandard1.6/zh-hant/System.Text.RegularExpressions.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Threading/4.0.11": { - "sha512": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", - "type": "package", - "path": "System.Threading/4.0.11", - "files": [ - "System.Threading.4.0.11.nupkg.sha512", - "System.Threading.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Threading.dll", - "lib/netstandard1.3/System.Threading.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Threading.dll", - "ref/netcore50/System.Threading.xml", - "ref/netcore50/de/System.Threading.xml", - "ref/netcore50/es/System.Threading.xml", - "ref/netcore50/fr/System.Threading.xml", - "ref/netcore50/it/System.Threading.xml", - "ref/netcore50/ja/System.Threading.xml", - "ref/netcore50/ko/System.Threading.xml", - "ref/netcore50/ru/System.Threading.xml", - "ref/netcore50/zh-hans/System.Threading.xml", - "ref/netcore50/zh-hant/System.Threading.xml", - "ref/netstandard1.0/System.Threading.dll", - "ref/netstandard1.0/System.Threading.xml", - "ref/netstandard1.0/de/System.Threading.xml", - "ref/netstandard1.0/es/System.Threading.xml", - "ref/netstandard1.0/fr/System.Threading.xml", - "ref/netstandard1.0/it/System.Threading.xml", - "ref/netstandard1.0/ja/System.Threading.xml", - "ref/netstandard1.0/ko/System.Threading.xml", - "ref/netstandard1.0/ru/System.Threading.xml", - "ref/netstandard1.0/zh-hans/System.Threading.xml", - "ref/netstandard1.0/zh-hant/System.Threading.xml", - "ref/netstandard1.3/System.Threading.dll", - "ref/netstandard1.3/System.Threading.xml", - "ref/netstandard1.3/de/System.Threading.xml", - "ref/netstandard1.3/es/System.Threading.xml", - "ref/netstandard1.3/fr/System.Threading.xml", - "ref/netstandard1.3/it/System.Threading.xml", - "ref/netstandard1.3/ja/System.Threading.xml", - "ref/netstandard1.3/ko/System.Threading.xml", - "ref/netstandard1.3/ru/System.Threading.xml", - "ref/netstandard1.3/zh-hans/System.Threading.xml", - "ref/netstandard1.3/zh-hant/System.Threading.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Threading.dll" - ] - }, - "System.Threading.Overlapped/4.0.1": { - "sha512": "f7aLuLkBoCQM2kng7zqLFBXz9Gk48gDK8lk1ih9rH/1arJJzZK9gJwNvPDhL6Ps/l6rwOr8jw+4FCHL0KKWiEg==", - "type": "package", - "path": "System.Threading.Overlapped/4.0.1", - "files": [ - "System.Threading.Overlapped.4.0.1.nupkg.sha512", - "System.Threading.Overlapped.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/net46/System.Threading.Overlapped.dll", - "ref/net46/System.Threading.Overlapped.dll", - "ref/netstandard1.3/System.Threading.Overlapped.dll", - "ref/netstandard1.3/System.Threading.Overlapped.xml", - "ref/netstandard1.3/de/System.Threading.Overlapped.xml", - "ref/netstandard1.3/es/System.Threading.Overlapped.xml", - "ref/netstandard1.3/fr/System.Threading.Overlapped.xml", - "ref/netstandard1.3/it/System.Threading.Overlapped.xml", - "ref/netstandard1.3/ja/System.Threading.Overlapped.xml", - "ref/netstandard1.3/ko/System.Threading.Overlapped.xml", - "ref/netstandard1.3/ru/System.Threading.Overlapped.xml", - "ref/netstandard1.3/zh-hans/System.Threading.Overlapped.xml", - "ref/netstandard1.3/zh-hant/System.Threading.Overlapped.xml", - "runtimes/unix/lib/netstandard1.3/System.Threading.Overlapped.dll", - "runtimes/win/lib/net46/System.Threading.Overlapped.dll", - "runtimes/win/lib/netcore50/System.Threading.Overlapped.dll", - "runtimes/win/lib/netstandard1.3/System.Threading.Overlapped.dll" - ] - }, - "System.Threading.Tasks/4.0.11": { - "sha512": "k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==", - "type": "package", - "path": "System.Threading.Tasks/4.0.11", - "files": [ - "System.Threading.Tasks.4.0.11.nupkg.sha512", - "System.Threading.Tasks.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Threading.Tasks.dll", - "ref/netcore50/System.Threading.Tasks.xml", - "ref/netcore50/de/System.Threading.Tasks.xml", - "ref/netcore50/es/System.Threading.Tasks.xml", - "ref/netcore50/fr/System.Threading.Tasks.xml", - "ref/netcore50/it/System.Threading.Tasks.xml", - "ref/netcore50/ja/System.Threading.Tasks.xml", - "ref/netcore50/ko/System.Threading.Tasks.xml", - "ref/netcore50/ru/System.Threading.Tasks.xml", - "ref/netcore50/zh-hans/System.Threading.Tasks.xml", - "ref/netcore50/zh-hant/System.Threading.Tasks.xml", - "ref/netstandard1.0/System.Threading.Tasks.dll", - "ref/netstandard1.0/System.Threading.Tasks.xml", - "ref/netstandard1.0/de/System.Threading.Tasks.xml", - "ref/netstandard1.0/es/System.Threading.Tasks.xml", - "ref/netstandard1.0/fr/System.Threading.Tasks.xml", - "ref/netstandard1.0/it/System.Threading.Tasks.xml", - "ref/netstandard1.0/ja/System.Threading.Tasks.xml", - "ref/netstandard1.0/ko/System.Threading.Tasks.xml", - "ref/netstandard1.0/ru/System.Threading.Tasks.xml", - "ref/netstandard1.0/zh-hans/System.Threading.Tasks.xml", - "ref/netstandard1.0/zh-hant/System.Threading.Tasks.xml", - "ref/netstandard1.3/System.Threading.Tasks.dll", - "ref/netstandard1.3/System.Threading.Tasks.xml", - "ref/netstandard1.3/de/System.Threading.Tasks.xml", - "ref/netstandard1.3/es/System.Threading.Tasks.xml", - "ref/netstandard1.3/fr/System.Threading.Tasks.xml", - "ref/netstandard1.3/it/System.Threading.Tasks.xml", - "ref/netstandard1.3/ja/System.Threading.Tasks.xml", - "ref/netstandard1.3/ko/System.Threading.Tasks.xml", - "ref/netstandard1.3/ru/System.Threading.Tasks.xml", - "ref/netstandard1.3/zh-hans/System.Threading.Tasks.xml", - "ref/netstandard1.3/zh-hant/System.Threading.Tasks.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Threading.Tasks.Dataflow/4.6.0": { - "sha512": "2hRjGu2r2jxRZ55wmcHO/WbdX+YAOz9x6FE8xqkHZgPaoFMKQZRe9dk8xTZIas8fRjxRmzawnTEWIrhlM+Un7w==", - "type": "package", - "path": "System.Threading.Tasks.Dataflow/4.6.0", - "files": [ - "System.Threading.Tasks.Dataflow.4.6.0.nupkg.sha512", - "System.Threading.Tasks.Dataflow.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/System.Threading.Tasks.Dataflow.XML", - "lib/netstandard1.0/System.Threading.Tasks.Dataflow.dll", - "lib/netstandard1.1/System.Threading.Tasks.Dataflow.XML", - "lib/netstandard1.1/System.Threading.Tasks.Dataflow.dll" - ] - }, - "System.Threading.Tasks.Extensions/4.0.0": { - "sha512": "pH4FZDsZQ/WmgJtN4LWYmRdJAEeVkyriSwrv2Teoe5FOU0Yxlb6II6GL8dBPOfRmutHGATduj3ooMt7dJ2+i+w==", - "type": "package", - "path": "System.Threading.Tasks.Extensions/4.0.0", - "files": [ - "System.Threading.Tasks.Extensions.4.0.0.nupkg.sha512", - "System.Threading.Tasks.Extensions.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/netstandard1.0/System.Threading.Tasks.Extensions.dll", - "lib/netstandard1.0/System.Threading.Tasks.Extensions.xml", - "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.dll", - "lib/portable-net45+win8+wp8+wpa81/System.Threading.Tasks.Extensions.xml" - ] - }, - "System.Threading.Tasks.Parallel/4.0.1": { - "sha512": "7Pc9t25bcynT9FpMvkUw4ZjYwUiGup/5cJFW72/5MgCG+np2cfVUMdh29u8d7onxX7d8PS3J+wL73zQRqkdrSA==", - "type": "package", - "path": "System.Threading.Tasks.Parallel/4.0.1", - "files": [ - "System.Threading.Tasks.Parallel.4.0.1.nupkg.sha512", - "System.Threading.Tasks.Parallel.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Threading.Tasks.Parallel.dll", - "lib/netstandard1.3/System.Threading.Tasks.Parallel.dll", - "lib/portable-net45+win8+wpa81/_._", - "lib/win8/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Threading.Tasks.Parallel.dll", - "ref/netcore50/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/de/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/es/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/fr/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/it/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/ja/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/ko/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/ru/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/zh-hans/System.Threading.Tasks.Parallel.xml", - "ref/netcore50/zh-hant/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/System.Threading.Tasks.Parallel.dll", - "ref/netstandard1.1/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/de/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/es/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/fr/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/it/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/ja/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/ko/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/ru/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/zh-hans/System.Threading.Tasks.Parallel.xml", - "ref/netstandard1.1/zh-hant/System.Threading.Tasks.Parallel.xml", - "ref/portable-net45+win8+wpa81/_._", - "ref/win8/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Threading.Thread/4.0.0": { - "sha512": "gIdJqDXlOr5W9zeqFErLw3dsOsiShSCYtF9SEHitACycmvNvY8odf9kiKvp6V7aibc8C4HzzNBkWXjyfn7plbQ==", - "type": "package", - "path": "System.Threading.Thread/4.0.0", - "files": [ - "System.Threading.Thread.4.0.0.nupkg.sha512", - "System.Threading.Thread.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Threading.Thread.dll", - "lib/netcore50/_._", - "lib/netstandard1.3/System.Threading.Thread.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Threading.Thread.dll", - "ref/netstandard1.3/System.Threading.Thread.dll", - "ref/netstandard1.3/System.Threading.Thread.xml", - "ref/netstandard1.3/de/System.Threading.Thread.xml", - "ref/netstandard1.3/es/System.Threading.Thread.xml", - "ref/netstandard1.3/fr/System.Threading.Thread.xml", - "ref/netstandard1.3/it/System.Threading.Thread.xml", - "ref/netstandard1.3/ja/System.Threading.Thread.xml", - "ref/netstandard1.3/ko/System.Threading.Thread.xml", - "ref/netstandard1.3/ru/System.Threading.Thread.xml", - "ref/netstandard1.3/zh-hans/System.Threading.Thread.xml", - "ref/netstandard1.3/zh-hant/System.Threading.Thread.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Threading.ThreadPool/4.0.10": { - "sha512": "IMXgB5Vf/5Qw1kpoVgJMOvUO1l32aC+qC3OaIZjWJOjvcxuxNWOK2ZTWWYXfij22NHxT2j1yWX5vlAeQWld9vA==", - "type": "package", - "path": "System.Threading.ThreadPool/4.0.10", - "files": [ - "System.Threading.ThreadPool.4.0.10.nupkg.sha512", - "System.Threading.ThreadPool.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Threading.ThreadPool.dll", - "lib/netcore50/_._", - "lib/netstandard1.3/System.Threading.ThreadPool.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Threading.ThreadPool.dll", - "ref/netstandard1.3/System.Threading.ThreadPool.dll", - "ref/netstandard1.3/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/de/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/es/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/fr/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/it/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/ja/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/ko/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/ru/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/zh-hans/System.Threading.ThreadPool.xml", - "ref/netstandard1.3/zh-hant/System.Threading.ThreadPool.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Threading.Timer/4.0.1": { - "sha512": "saGfUV8uqVW6LeURiqxcGhZ24PzuRNaUBtbhVeuUAvky1naH395A/1nY0P2bWvrw/BreRtIB/EzTDkGBpqCwEw==", - "type": "package", - "path": "System.Threading.Timer/4.0.1", - "files": [ - "System.Threading.Timer.4.0.1.nupkg.sha512", - "System.Threading.Timer.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net451/_._", - "lib/portable-net451+win81+wpa81/_._", - "lib/win81/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net451/_._", - "ref/netcore50/System.Threading.Timer.dll", - "ref/netcore50/System.Threading.Timer.xml", - "ref/netcore50/de/System.Threading.Timer.xml", - "ref/netcore50/es/System.Threading.Timer.xml", - "ref/netcore50/fr/System.Threading.Timer.xml", - "ref/netcore50/it/System.Threading.Timer.xml", - "ref/netcore50/ja/System.Threading.Timer.xml", - "ref/netcore50/ko/System.Threading.Timer.xml", - "ref/netcore50/ru/System.Threading.Timer.xml", - "ref/netcore50/zh-hans/System.Threading.Timer.xml", - "ref/netcore50/zh-hant/System.Threading.Timer.xml", - "ref/netstandard1.2/System.Threading.Timer.dll", - "ref/netstandard1.2/System.Threading.Timer.xml", - "ref/netstandard1.2/de/System.Threading.Timer.xml", - "ref/netstandard1.2/es/System.Threading.Timer.xml", - "ref/netstandard1.2/fr/System.Threading.Timer.xml", - "ref/netstandard1.2/it/System.Threading.Timer.xml", - "ref/netstandard1.2/ja/System.Threading.Timer.xml", - "ref/netstandard1.2/ko/System.Threading.Timer.xml", - "ref/netstandard1.2/ru/System.Threading.Timer.xml", - "ref/netstandard1.2/zh-hans/System.Threading.Timer.xml", - "ref/netstandard1.2/zh-hant/System.Threading.Timer.xml", - "ref/portable-net451+win81+wpa81/_._", - "ref/win81/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Xml.ReaderWriter/4.0.11": { - "sha512": "ZIiLPsf67YZ9zgr31vzrFaYQqxRPX9cVHjtPSnmx4eN6lbS/yEyYNr2vs1doGDEscF0tjCZFsk9yUg1sC9e8tg==", - "type": "package", - "path": "System.Xml.ReaderWriter/4.0.11", - "files": [ - "System.Xml.ReaderWriter.4.0.11.nupkg.sha512", - "System.Xml.ReaderWriter.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Xml.ReaderWriter.dll", - "lib/netstandard1.3/System.Xml.ReaderWriter.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Xml.ReaderWriter.dll", - "ref/netcore50/System.Xml.ReaderWriter.xml", - "ref/netcore50/de/System.Xml.ReaderWriter.xml", - "ref/netcore50/es/System.Xml.ReaderWriter.xml", - "ref/netcore50/fr/System.Xml.ReaderWriter.xml", - "ref/netcore50/it/System.Xml.ReaderWriter.xml", - "ref/netcore50/ja/System.Xml.ReaderWriter.xml", - "ref/netcore50/ko/System.Xml.ReaderWriter.xml", - "ref/netcore50/ru/System.Xml.ReaderWriter.xml", - "ref/netcore50/zh-hans/System.Xml.ReaderWriter.xml", - "ref/netcore50/zh-hant/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/System.Xml.ReaderWriter.dll", - "ref/netstandard1.0/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/de/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/es/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/fr/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/it/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/ja/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/ko/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/ru/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/zh-hans/System.Xml.ReaderWriter.xml", - "ref/netstandard1.0/zh-hant/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/System.Xml.ReaderWriter.dll", - "ref/netstandard1.3/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/de/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/es/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/fr/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/it/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/ja/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/ko/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/ru/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/zh-hans/System.Xml.ReaderWriter.xml", - "ref/netstandard1.3/zh-hant/System.Xml.ReaderWriter.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Xml.XDocument/4.0.11": { - "sha512": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==", - "type": "package", - "path": "System.Xml.XDocument/4.0.11", - "files": [ - "System.Xml.XDocument.4.0.11.nupkg.sha512", - "System.Xml.XDocument.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Xml.XDocument.dll", - "lib/netstandard1.3/System.Xml.XDocument.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Xml.XDocument.dll", - "ref/netcore50/System.Xml.XDocument.xml", - "ref/netcore50/de/System.Xml.XDocument.xml", - "ref/netcore50/es/System.Xml.XDocument.xml", - "ref/netcore50/fr/System.Xml.XDocument.xml", - "ref/netcore50/it/System.Xml.XDocument.xml", - "ref/netcore50/ja/System.Xml.XDocument.xml", - "ref/netcore50/ko/System.Xml.XDocument.xml", - "ref/netcore50/ru/System.Xml.XDocument.xml", - "ref/netcore50/zh-hans/System.Xml.XDocument.xml", - "ref/netcore50/zh-hant/System.Xml.XDocument.xml", - "ref/netstandard1.0/System.Xml.XDocument.dll", - "ref/netstandard1.0/System.Xml.XDocument.xml", - "ref/netstandard1.0/de/System.Xml.XDocument.xml", - "ref/netstandard1.0/es/System.Xml.XDocument.xml", - "ref/netstandard1.0/fr/System.Xml.XDocument.xml", - "ref/netstandard1.0/it/System.Xml.XDocument.xml", - "ref/netstandard1.0/ja/System.Xml.XDocument.xml", - "ref/netstandard1.0/ko/System.Xml.XDocument.xml", - "ref/netstandard1.0/ru/System.Xml.XDocument.xml", - "ref/netstandard1.0/zh-hans/System.Xml.XDocument.xml", - "ref/netstandard1.0/zh-hant/System.Xml.XDocument.xml", - "ref/netstandard1.3/System.Xml.XDocument.dll", - "ref/netstandard1.3/System.Xml.XDocument.xml", - "ref/netstandard1.3/de/System.Xml.XDocument.xml", - "ref/netstandard1.3/es/System.Xml.XDocument.xml", - "ref/netstandard1.3/fr/System.Xml.XDocument.xml", - "ref/netstandard1.3/it/System.Xml.XDocument.xml", - "ref/netstandard1.3/ja/System.Xml.XDocument.xml", - "ref/netstandard1.3/ko/System.Xml.XDocument.xml", - "ref/netstandard1.3/ru/System.Xml.XDocument.xml", - "ref/netstandard1.3/zh-hans/System.Xml.XDocument.xml", - "ref/netstandard1.3/zh-hant/System.Xml.XDocument.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Xml.XmlDocument/4.0.1": { - "sha512": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", - "type": "package", - "path": "System.Xml.XmlDocument/4.0.1", - "files": [ - "System.Xml.XmlDocument.4.0.1.nupkg.sha512", - "System.Xml.XmlDocument.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Xml.XmlDocument.dll", - "lib/netstandard1.3/System.Xml.XmlDocument.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Xml.XmlDocument.dll", - "ref/netstandard1.3/System.Xml.XmlDocument.dll", - "ref/netstandard1.3/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/de/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/es/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/fr/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/it/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/ja/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/ko/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/ru/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/zh-hans/System.Xml.XmlDocument.xml", - "ref/netstandard1.3/zh-hant/System.Xml.XmlDocument.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Xml.XmlSerializer/4.0.11": { - "sha512": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", - "type": "package", - "path": "System.Xml.XmlSerializer/4.0.11", - "files": [ - "System.Xml.XmlSerializer.4.0.11.nupkg.sha512", - "System.Xml.XmlSerializer.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net45/_._", - "lib/netcore50/System.Xml.XmlSerializer.dll", - "lib/netstandard1.3/System.Xml.XmlSerializer.dll", - "lib/portable-net45+win8+wp8+wpa81/_._", - "lib/win8/_._", - "lib/wp80/_._", - "lib/wpa81/_._", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net45/_._", - "ref/netcore50/System.Xml.XmlSerializer.dll", - "ref/netcore50/System.Xml.XmlSerializer.xml", - "ref/netcore50/de/System.Xml.XmlSerializer.xml", - "ref/netcore50/es/System.Xml.XmlSerializer.xml", - "ref/netcore50/fr/System.Xml.XmlSerializer.xml", - "ref/netcore50/it/System.Xml.XmlSerializer.xml", - "ref/netcore50/ja/System.Xml.XmlSerializer.xml", - "ref/netcore50/ko/System.Xml.XmlSerializer.xml", - "ref/netcore50/ru/System.Xml.XmlSerializer.xml", - "ref/netcore50/zh-hans/System.Xml.XmlSerializer.xml", - "ref/netcore50/zh-hant/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/System.Xml.XmlSerializer.dll", - "ref/netstandard1.0/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/de/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/es/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/fr/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/it/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/ja/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/ko/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/ru/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/zh-hans/System.Xml.XmlSerializer.xml", - "ref/netstandard1.0/zh-hant/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/System.Xml.XmlSerializer.dll", - "ref/netstandard1.3/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/de/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/es/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/fr/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/it/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/ja/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/ko/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/ru/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/zh-hans/System.Xml.XmlSerializer.xml", - "ref/netstandard1.3/zh-hant/System.Xml.XmlSerializer.xml", - "ref/portable-net45+win8+wp8+wpa81/_._", - "ref/win8/_._", - "ref/wp80/_._", - "ref/wpa81/_._", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._", - "runtimes/aot/lib/netcore50/System.Xml.XmlSerializer.dll" - ] - }, - "System.Xml.XPath/4.0.1": { - "sha512": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", - "type": "package", - "path": "System.Xml.XPath/4.0.1", - "files": [ - "System.Xml.XPath.4.0.1.nupkg.sha512", - "System.Xml.XPath.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Xml.XPath.dll", - "lib/netstandard1.3/System.Xml.XPath.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Xml.XPath.dll", - "ref/netstandard1.3/System.Xml.XPath.dll", - "ref/netstandard1.3/System.Xml.XPath.xml", - "ref/netstandard1.3/de/System.Xml.XPath.xml", - "ref/netstandard1.3/es/System.Xml.XPath.xml", - "ref/netstandard1.3/fr/System.Xml.XPath.xml", - "ref/netstandard1.3/it/System.Xml.XPath.xml", - "ref/netstandard1.3/ja/System.Xml.XPath.xml", - "ref/netstandard1.3/ko/System.Xml.XPath.xml", - "ref/netstandard1.3/ru/System.Xml.XPath.xml", - "ref/netstandard1.3/zh-hans/System.Xml.XPath.xml", - "ref/netstandard1.3/zh-hant/System.Xml.XPath.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "System.Xml.XPath.XDocument/4.0.1": { - "sha512": "FLhdYJx4331oGovQypQ8JIw2kEmNzCsjVOVYY/16kZTUoquZG85oVn7yUhBE2OZt1yGPSXAL0HTEfzjlbNpM7Q==", - "type": "package", - "path": "System.Xml.XPath.XDocument/4.0.1", - "files": [ - "System.Xml.XPath.XDocument.4.0.1.nupkg.sha512", - "System.Xml.XPath.XDocument.nuspec", - "ThirdPartyNotices.txt", - "dotnet_library_license.txt", - "lib/MonoAndroid10/_._", - "lib/MonoTouch10/_._", - "lib/net46/System.Xml.XPath.XDocument.dll", - "lib/netstandard1.3/System.Xml.XPath.XDocument.dll", - "lib/xamarinios10/_._", - "lib/xamarinmac20/_._", - "lib/xamarintvos10/_._", - "lib/xamarinwatchos10/_._", - "ref/MonoAndroid10/_._", - "ref/MonoTouch10/_._", - "ref/net46/System.Xml.XPath.XDocument.dll", - "ref/netstandard1.3/System.Xml.XPath.XDocument.dll", - "ref/netstandard1.3/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/de/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/es/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/fr/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/it/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/ja/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/ko/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/ru/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/zh-hans/System.Xml.XPath.XDocument.xml", - "ref/netstandard1.3/zh-hant/System.Xml.XPath.XDocument.xml", - "ref/xamarinios10/_._", - "ref/xamarinmac20/_._", - "ref/xamarintvos10/_._", - "ref/xamarinwatchos10/_._" - ] - }, - "VideoLibrary/1.3.4": { - "sha512": "HZ2RAE9xx/sjJGnwm8etawoJXYluaYGas4bAFpE14S62NFodNKzUf7Cm9TQ+JFJxAdY+1g1FEKk1b6FPSv9aMg==", - "type": "package", - "path": "VideoLibrary/1.3.4", - "files": [ - "VideoLibrary.1.3.4.nupkg.sha512", - "VideoLibrary.nuspec", - "lib/portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10/libvideo.dll" - ] - }, - "Discord.Net/1.0.0-beta": { - "type": "project", - "path": "../../discord.net/src/Discord.Net/project.json", - "msbuildProject": "../../discord.net/src/Discord.Net/Discord.Net.xproj" - }, - "Discord.Net.Commands/1.0.0-beta": { - "type": "project", - "path": "../../discord.net/src/Discord.Net.Commands/project.json", - "msbuildProject": "../../discord.net/src/Discord.Net.Commands/Discord.Net.Commands.xproj" - } - }, - "projectFileDependencyGroups": { - "": [ - "CoreCLR-NCalc >= 2.1.0", - "Discord.Net.Commands >= 1.0.0-dev", - "Google.Apis.Customsearch.v1 >= 1.16.0.466", - "Google.Apis.Urlshortener.v1 >= 1.15.0.138", - "Google.Apis.YouTube.v3 >= 1.15.0.582", - "ImageProcessorCore >= 1.0.0-alpha1045", - "Microsoft.EntityFrameworkCore >= 1.0.0", - "Microsoft.EntityFrameworkCore.Design >= 1.0.0-preview2-final", - "Microsoft.EntityFrameworkCore.Sqlite >= 1.0.0", - "Microsoft.Extensions.DependencyInjection >= 1.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions >= 1.0.0", - "Microsoft.Extensions.PlatformAbstractions >= 1.0.0", - "Microsoft.NETCore.App >= 1.0.0", - "NLog >= 4.4.0-betaV15", - "Newtonsoft.Json >= 9.0.1", - "System.Diagnostics.Contracts >= 4.0.1", - "System.Resources.ResourceWriter >= 4.0.0-beta-22816", - "VideoLibrary >= 1.3.4" - ], - ".NETCoreApp,Version=v1.0": [] - }, - "tools": { - ".NETCoreApp,Version=v1.0": { - "Microsoft.EntityFrameworkCore.Tools/1.0.0-preview2-final": { - "type": "package", - "dependencies": { - "Microsoft.DotNet.Cli.Utils": "1.0.0-preview2-003121", - "Microsoft.DotNet.ProjectModel": "1.0.0-rc3-003121", - "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final", - "Microsoft.Extensions.CommandLineUtils": "1.0.0", - "Microsoft.NETCore.App": "1.0.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.0.0" - }, - "compile": { - "lib/netcoreapp1.0/dotnet-ef.dll": {} - }, - "runtime": { - "lib/netcoreapp1.0/dotnet-ef.dll": {} - } - } - } - }, - "projectFileToolGroups": { - ".NETCoreApp,Version=v1.0": [ - "Microsoft.EntityFrameworkCore.Tools >= 1.0.0-preview2-final" - ] - } -} \ No newline at end of file diff --git a/src/tests/Tests.cs b/src/tests/Tests.cs new file mode 100644 index 00000000..520b5fbf --- /dev/null +++ b/src/tests/Tests.cs @@ -0,0 +1,107 @@ +using NadekoBot.Modules.Permissions; +using NadekoBot.Services.Database.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Tests +{ + public class Tests + { + + private Permission GetRoot() + { + Permission root = new Permission(); + root.SecondaryTargetName = "Root"; + var cur = root; + for (var i = 1; i < 10; i++) + { + var p = new Permission(); + p.SecondaryTargetName = i.ToString(); + p.Previous = cur; + cur.Next = p; + cur = p; + } + return root; + } + [Fact] + public void CountTest() + { + var root = GetRoot(); + + Assert.Equal(10, root.Count()); + } + + [Fact] + public void AddTest() + { + var root = GetRoot(); + + root.Prepend(new Permission() { SecondaryTargetName = "Added" }); + + root = root.GetRoot(); + + Assert.Equal(11, root.Count()); + + Assert.Equal("Added", root.AsEnumerable().First().SecondaryTargetName); + } + + [Fact] + public void GetAtTest() + { + var root = GetRoot(); + Assert.Equal("Root", root.GetAt(0).SecondaryTargetName); + Assert.Equal("1", root.GetAt(1).SecondaryTargetName); + Assert.Equal("5", root.GetAt(5).SecondaryTargetName); + Assert.Equal("9", root.GetAt(9).SecondaryTargetName); + + Assert.Throws(typeof(IndexOutOfRangeException), () => { root.GetAt(-5); }); + Assert.Throws(typeof(IndexOutOfRangeException), () => { root.GetAt(10); }); + } + + //[Fact] + //public void InsertTest() { + + // var root = GetRoot(); + + // root.Insert(5, new Permission() { SecondaryTargetName = "in2" }); + + // Assert.Equal(11, root.Count()); + // Assert.Equal("in2", root.GetAt(5).SecondaryTargetName); + + // root.Insert(0, new Permission() { SecondaryTargetName = "Inserted" }); + + // root = root.Previous; + // Assert.Equal("Inserted", root.SecondaryTargetName); + // Assert.Equal(12, root.Count()); + // Assert.Equal("Root", root.GetAt(1).SecondaryTargetName); + + // Assert.Throws(typeof(IndexOutOfRangeException), () => { root.GetAt(12); }); + //} + + [Fact] + public void RemoveAtTest() + { + var root = GetRoot(); + + var removed = root.RemoveAt(3); + + Assert.Equal("3", removed.SecondaryTargetName); + Assert.Equal(9, root.Count()); + Assert.Throws(typeof(IndexOutOfRangeException), () => { root.RemoveAt(0); }); + Assert.Throws(typeof(IndexOutOfRangeException), () => { root.RemoveAt(9); }); + Assert.Throws(typeof(IndexOutOfRangeException), () => { root.RemoveAt(-1); }); + } + + [Fact] + public void TestGetRoot() + { + var root = GetRoot(); + + var random = root.GetAt(5).GetRoot(); + + Assert.Equal("Root", random.SecondaryTargetName); + } + } +} diff --git a/src/tests/project.json b/src/tests/project.json new file mode 100644 index 00000000..4408273b --- /dev/null +++ b/src/tests/project.json @@ -0,0 +1,27 @@ +{ + "version": "1.0.0-*", + "buildOptions": { + "debugType": "portable" + }, + "dependencies": { + "System.Runtime.Serialization.Primitives": "4.1.1", + "xunit": "2.1.0", + "dotnet-test-xunit": "1.0.0-rc2-192208-24", + "NadekoBot": "1.0.0-*" + }, + "testRunner": "xunit", + "frameworks": { + "netcoreapp1.0": { + "dependencies": { + "Microsoft.NETCore.App": { + "type": "platform", + "version": "1.0.0" + } + }, + "imports": [ + "dotnet5.4", + "portable-net451+win8" + ] + } + } +} diff --git a/src/tests/tests.xproj b/src/tests/tests.xproj new file mode 100644 index 00000000..eaf88e51 --- /dev/null +++ b/src/tests/tests.xproj @@ -0,0 +1,21 @@ + + + + 14.0.25420 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 14cbada0-971c-44e3-b331-c7d01dd74f0b + tests + .\obj + .\bin\ + + + 2.0 + + + + + + \ No newline at end of file