diff --git a/docs/Commands List.md b/docs/Commands List.md index d73852f3..1317f263 100644 --- a/docs/Commands List.md +++ b/docs/Commands List.md @@ -1,4 +1,4 @@ -You can support the project on patreon: or paypal: +You can support the project on patreon: or paypal: ##Table Of Contents - [Help](#help) @@ -18,11 +18,11 @@ You can support the project on patreon: or paypa ### Administration Command and aliases | Description | Usage ----------------|--------------|------- -`.resetperms` | Resets BOT's permissions module on this server to the default value. **Requires Administrator server permission.** | `.resetperms` -`.delmsgoncmd` | Toggles the automatic deletion of user's successful command message to prevent chat flood. **Requires Administrator server permission.** | `.delmsgoncmd` +`.resetperms` | Resets the bot's permissions module on this server to the default value. **Requires Administrator server permission.** | `.resetperms` +`.delmsgoncmd` | Toggles the automatic deletion of the user's successful command message to prevent chat flood. **Requires Administrator server permission.** | `.delmsgoncmd` `.setrole` `.sr` | Sets a role for a given user. **Requires ManageRoles server permission.** | `.sr @User Guest` `.removerole` `.rr` | Removes a role from a given user. **Requires ManageRoles server permission.** | `.rr @User Admin` -`.renamerole` `.renr` | Renames a role. Roles you are renaming must be lower than bot's highest role. **Requires ManageRoles server permission.** | `.renr "First role" SecondRole` +`.renamerole` `.renr` | Renames a role. The role you are renaming must be lower than bot's highest role. **Requires ManageRoles server permission.** | `.renr "First role" SecondRole` `.removeallroles` `.rar` | Removes all roles from a mentioned user. **Requires ManageRoles server permission.** | `.rar @User` `.createrole` `.cr` | Creates a role with a given name. **Requires ManageRoles server permission.** | `.cr Awesome Role` `.rolecolor` `.rc` | Set a role's color to the hex or 0-255 rgb color value provided. **Requires ManageRoles server permission.** | `.rc Admin 255 200 100` or `.rc Admin ffba55` @@ -37,18 +37,19 @@ Command and aliases | Description | Usage `.creatxtchanl` `.ctch` | Creates a new text channel with a given name. **Requires ManageChannels server permission.** | `.ctch TextChannelName` `.settopic` `.st` | Sets a topic on the current channel. **Requires ManageChannels server permission.** | `.st My new topic` `.setchanlname` `.schn` | Changes the name of the current channel. **Requires ManageChannels server permission.** | `.schn NewName` -`.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` -`.mentionrole` `.menro` | 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.** | `.menro RoleName` -`.donators` | List of lovely people who donated to keep this project alive. | `.donators` -`.donadd` | Add a donator to the database. **Bot Owner only.** | `.donadd Donate Amount` +`.prune` `.clr` | `.prune` removes all Nadeko's messages in the last 100 messages. `.prune X` removes last `X` number of 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` number of 'Someone's' messages in the channel. | `.prune` or `.prune 5` or `.prune @Someone` or `.prune @Someone X` +`.mentionrole` `.menro` | Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have the mention everyone permission. **Requires MentionEveryone server permission.** | `.menro RoleName` +`.donators` | List of the lovely people who donated to keep this project alive. | `.donators` +`.donadd` | Add a donator to the database. **Bot Owner Only** | `.donadd Donate Amount` `.autoassignrole` `.aar` | Automaticaly assigns a specified role to every user who joins the server. **Requires ManageRoles server permission.** | `.aar` to disable, `.aar Role Name` to enable -`.fwmsgs` | Toggles forwarding of non-command messages sent to bot's DM to the bot owners **Bot Owner only.** | `.fwmsgs` -`.fwtoall` | Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json **Bot Owner only.** | `.fwtoall` -`.logserver` | Enables or Disables ALL log events. If enabled, all log events will log to this channel. **Requires Administrator server permission.** **Bot Owner only.** | `.logserver enable` or `.logserver disable` -`.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.** | `.logignore` -`.logevents` | Shows a list of all events you can subscribe to with `.log` **Requires Administrator server permission.** **Bot Owner only.** | `.logevents` -`.log` | Toggles logging event. Disables it if it's active anywhere on the server. Enables if it's not active. Use `.logevents` to see a list of all events you can subscribe to. **Requires Administrator server permission.** **Bot Owner only.** | `.log userpresence` or `.log userbanned` -`.migratedata` | Migrate data from old bot configuration **Bot Owner only.** | `.migratedata` +`.languageset` `.langset` | Sets this server's response language. If bot's response strings have been translated to that language, bot will use that language in this server. Reset by using `default` as the locale name. Provide no arguments to see currently set language. | `.langset de-DE ` or `.langset default` +`.langsetdefault` `.langsetd` | Sets the bot's default response language. All servers which use a default locale will use this one. Setting to `default` will use the host's current culture. Provide no arguments to see currently set language. | `.langsetd en-US` or `.langsetd default` +`.languageslist` `.langli` | List of languages for which translation (or part of it) exist atm. | `.langli` +`.logserver` | Enables or Disables ALL log events. If enabled, all log events will log to this channel. **Requires Administrator server permission.** **Bot Owner Only** | `.logserver enable` or `.logserver disable` +`.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** | `.logignore` +`.logevents` | Shows a list of all events you can subscribe to with `.log` **Requires Administrator server permission.** **Bot Owner Only** | `.logevents` +`.log` | Toggles logging event. Disables it if it is active anywhere on the server. Enables if it isn't active. Use `.logevents` to see a list of all events you can subscribe to. **Requires Administrator server permission.** **Bot Owner Only** | `.log userpresence` or `.log userbanned` +`.migratedata` | Migrate data from old bot configuration **Bot Owner Only** | `.migratedata` `.setmuterole` | Sets a name of the role which will be assigned to people who should be muted. Default is nadeko-mute. **Requires ManageRoles server permission.** | `.setmuterole Silenced` `.mute` | Mutes a mentioned user both from speaking and chatting. **Requires ManageRoles server permission.** **Requires MuteMembers server permission.** | `.mute @Someone` `.unmute` | Unmutes a mentioned user previously muted with `.mute` command. **Requires ManageRoles server permission.** **Requires MuteMembers server permission.** | `.unmute @Someone` @@ -56,51 +57,54 @@ Command and aliases | Description | Usage `.chatunmute` | Removes a mute role previously set on a mentioned user with `.chatmute` which prevented him from chatting in text channels. **Requires ManageRoles server permission.** | `.chatunmute @Someone` `.voicemute` | Prevents a mentioned user from speaking in voice channels. **Requires MuteMembers server permission.** | `.voicemute @Someone` `.voiceunmute` | Gives a previously voice-muted user a permission to speak. **Requires MuteMembers server permission.** | `.voiceunmute @Someguy` -`.rotateplaying` `.ropl` | Toggles rotation of playing status of the dynamic strings you previously specified. **Bot Owner only.** | `.ropl` -`.addplaying` `.adpl` | Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%, %time%,%shardid%,%shardcount%, %shardguilds% **Bot Owner only.** | `.adpl` -`.listplaying` `.lipl` | Lists all playing statuses with their corresponding number. **Bot Owner only.** | `.lipl` -`.removeplaying` `.rmpl` `.repl` | Removes a playing string on a given number. **Bot Owner only.** | `.rmpl` +`.rotateplaying` `.ropl` | Toggles rotation of playing status of the dynamic strings you previously specified. **Bot Owner Only** | `.ropl` +`.addplaying` `.adpl` | Adds a specified string to the list of playing strings to rotate. Supported placeholders: `%servers%`, `%users%`, `%playing%`, `%queued%`, `%time%`, `%shardid%`, `%shardcount%`, `%shardguilds%`. **Bot Owner Only** | `.adpl` +`.listplaying` `.lipl` | Lists all playing statuses with their corresponding number. **Bot Owner Only** | `.lipl` +`.removeplaying` `.rmpl` `.repl` | Removes a playing string on a given number. **Bot Owner Only** | `.rmpl` `.antiraid` | Sets an anti-raid protection on the server. First argument is number of people which will trigger the protection. Second one is a time interval in which that number of people needs to join in order to trigger the protection, and third argument is punishment for those people (Kick, Ban, Mute) **Requires Administrator server permission.** | `.antiraid 5 20 Kick` -`.antispam` | Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. **Requires Administrator server permission.** | `.antispam 3 Mute` or `.antispam 4 Kick` or `.antispam 6 Ban` +`.antispam` | Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. Max message count is 10. **Requires Administrator server permission.** | `.antispam 3 Mute` or `.antispam 4 Kick` or `.antispam 6 Ban` `.antispamignore` | Toggles whether antispam ignores current channel. Antispam must be enabled. | `.antispamignore` `.antilist` `.antilst` | Shows currently enabled protection features. | `.antilist` `.slowmode` | Toggles slowmode. Disable by specifying no parameters. To enable, specify a number of messages each user can send, and an interval in seconds. For example 1 message every 5 seconds. **Requires ManageMessages server permission.** | `.slowmode 1 5` or `.slowmode` -`.adsarm` | Toggles the automatic deletion of confirmations for .iam and .iamn commands. **Requires ManageMessages server permission.** | `.adsarm` +`.adsarm` | Toggles the automatic deletion of confirmations for `.iam` and `.iamn` commands. **Requires ManageMessages server permission.** | `.adsarm` `.asar` | Adds a role to the list of self-assignable roles. **Requires ManageRoles server permission.** | `.asar Gamer` `.rsar` | Removes a specified role from the list of self-assignable roles. **Requires ManageRoles server permission.** | `.rsar` `.lsar` | Lists all self-assignable roles. | `.lsar` `.togglexclsar` `.tesar` | Toggles whether the self-assigned roles are exclusive. (So that any person can have only one of the self assignable roles) **Requires ManageRoles server permission.** | `.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` -`.leave` | Makes Nadeko leave the server. Either name or id required. **Bot Owner only.** | `.leave 123123123331` -`.die` | Shuts the bot down. **Bot Owner only.** | `.die` -`.setname` `.newnm` | Gives the bot a new name. **Bot Owner only.** | `.newnm BotName` -`.setstatus` | Sets the bot's status. (Online/Idle/Dnd/Invisible) **Bot Owner only.** | `.setstatus Idle` -`.setavatar` `.setav` | Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner only.** | `.setav http://i.imgur.com/xTG3a1I.jpg` -`.setgame` | Sets the bots game. **Bot Owner only.** | `.setgame with snakes` -`.setstream` | Sets the bots stream. First argument is the twitch link, second argument is stream name. **Bot Owner only.** | `.setstream TWITCHLINK Hello` -`.send` | 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:`. **Bot Owner only.** | `.send serverid|c:channelid message` or `.send serverid|u:userid message` -`.announce` | Sends a message to all servers' general channel bot is connected to. **Bot Owner only.** | `.announce Useless spam` -`.reloadimages` | Reloads images bot is using. Safe to use even when bot is being used heavily. **Bot Owner only.** | `.reloadimages` -`.greetdel` `.grdel` | Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set 0 to disable automatic deletion. **Requires ManageServer server permission.** | `.greetdel 0` or `.greetdel 30` +`.fwmsgs` | Toggles forwarding of non-command messages sent to bot's DM to the bot owners **Bot Owner Only** | `.fwmsgs` +`.fwtoall` | Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json file **Bot Owner Only** | `.fwtoall` +`.connectshard` | Try (re)connecting a shard with a certain shardid when it dies. No one knows will it work. Keep an eye on the console for errors. **Bot Owner Only** | `.connectshard 2` +`.leave` | Makes Nadeko leave the server. Either server name or server ID is required. **Bot Owner Only** | `.leave 123123123331` +`.die` | Shuts the bot down. **Bot Owner Only** | `.die` +`.setname` `.newnm` | Gives the bot a new name. **Bot Owner Only** | `.newnm BotName` +`.setstatus` | Sets the bot's status. (Online/Idle/Dnd/Invisible) **Bot Owner Only** | `.setstatus Idle` +`.setavatar` `.setav` | Sets a new avatar image for the NadekoBot. Argument is a direct link to an image. **Bot Owner Only** | `.setav http://i.imgur.com/xTG3a1I.jpg` +`.setgame` | Sets the bots game. **Bot Owner Only** | `.setgame with snakes` +`.setstream` | Sets the bots stream. First argument is the twitch link, second argument is stream name. **Bot Owner Only** | `.setstream TWITCHLINK Hello` +`.send` | Sends a message to someone on a different server through the bot. Separate server and channel/user ids with `|` and prefix the channel id with `c:` and the user id with `u:`. **Bot Owner Only** | `.send serverid|c:channelid message` or `.send serverid|u:userid message` +`.announce` | Sends a message to all servers' default channel that bot is connected to. **Bot Owner Only** | `.announce Useless spam` +`.reloadimages` | Reloads images bot is using. Safe to use even when bot is being used heavily. **Bot Owner Only** | `.reloadimages` +`.greetdel` `.grdel` | Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set it to 0 to disable automatic deletion. **Requires ManageServer server permission.** | `.greetdel 0` or `.greetdel 30` `.greet` | Toggles anouncements on the current channel when someone joins the server. **Requires ManageServer server permission.** | `.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. **Requires ManageServer server permission.** | `.greetmsg Welcome, %user%.` +`.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. You can use embed json from instead of a regular text, if you want the message to be embedded. **Requires ManageServer server permission.** | `.greetmsg Welcome, %user%.` `.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.** | `.greetdm` -`.greetdmmsg` | 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.** | `.greetdmmsg Welcome to the server, %user%`. +`.greetdmmsg` | 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. You can use embed json from instead of a regular text, if you want the message to be embedded. **Requires ManageServer server permission.** | `.greetdmmsg Welcome to the server, %user%`. `.bye` | Toggles anouncements on the current channel when someone leaves the server. **Requires ManageServer server permission.** | `.bye` -`.byemsg` | Sets a new leave announcement message. Type %user% if you want to show the name the user who left. Type %id% to show id. Using this command with no message will show the current bye message. **Requires ManageServer server permission.** | `.byemsg %user% has left.` -`.byedel` | Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set 0 to disable automatic deletion. **Requires ManageServer server permission.** | `.byedel 0` or `.byedel 30` -`.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. **Requires ManageRoles server permission.** **Requires ManageChannels server permission.** | `.v+t` +`.byemsg` | Sets a new leave announcement message. Type `%user%` if you want to show the name the user who left. Type `%id%` to show id. Using this command with no message will show the current bye message. You can use embed json from instead of a regular text, if you want the message to be embedded. **Requires ManageServer server permission.** | `.byemsg %user% has left.` +`.byedel` | Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set it to `0` to disable automatic deletion. **Requires ManageServer server permission.** | `.byedel 0` or `.byedel 30` +`.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. **Requires ManageRoles server permission.** **Requires ManageChannels server permission.** | `.v+t` `.cleanvplust` `.cv+t` | Deletes all text channels ending in `-voice` for which voicechannels are not found. Use at your own risk. **Requires ManageChannels server permission.** **Requires ManageRoles server permission.** | `.cleanv+t` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### 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` +`,createwar` `,cw` | Creates a new war by specifying a size (>10 and multiple of 5) and enemy clan name. **Requires ManageMessages server permission.** | `,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` +`,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]` `,claimfinish1` `,cf1` | Finish your claim with 1 star if you destroyed a base. First argument is the war number, optional second argument is a base number if you want to finish for someone else. | `,cf1 1` or `,cf1 1 5` `,claimfinish2` `,cf2` | Finish your claim with 2 stars if you destroyed a base. First argument is the war number, optional second argument is a base number if you want to finish for someone else. | `,cf2 1` or `,cf2 1 5` @@ -108,20 +112,20 @@ Command and aliases | Description | Usage `,endwar` `,ew` | Ends the war with a given index. | `,ew [war_number]` `,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]` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### CustomReactions Command and aliases | Description | Usage ----------------|--------------|------- -`.addcustreact` `.acr` | 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: | `.acr "hello" Hi there %user%` +`.addcustreact` `.acr` | Add a custom reaction with a trigger and a response. Running this command in server requires the Administration permission. Running this command in DM is Bot Owner only and adds a new global custom reaction. Guide here: | `.acr "hello" Hi there %user%` `.listcustreact` `.lcr` | Lists global or server custom reactions (20 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. Specifying `all` argument instead of the number will DM you a text file with a list of all custom reactions. | `.lcr 1` or `.lcr all` `.listcustreactg` `.lcrg` | Lists global or server custom reactions (20 commands per page) grouped by trigger, and show a number of responses for each. Running the command in DM will list global custom reactions, while running it in server will list that server's custom reactions. | `.lcrg 1` `.showcustreact` `.scr` | Shows a custom reaction's response on a given ID. | `.scr 1` -`.delcustreact` `.dcr` | 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 5` -`.crstatsclear` | Resets the counters on `.crstats`. You can specify a trigger to clear stats only for that trigger. **Bot Owner only.** | `.crstatsclear` or `.crstatsclear rng` +`.delcustreact` `.dcr` | 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 privileges and removes server custom reaction. | `.dcr 5` +`.crstatsclear` | Resets the counters on `.crstats`. You can specify a trigger to clear stats only for that trigger. **Bot Owner Only** | `.crstatsclear` or `.crstatsclear rng` `.crstats` | Shows a list of custom reactions and the number of times they have been executed. Paginated with 10 per page. Use `.crstatsclear` to reset the counters. | `.crstats` or `.crstats 3` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Gambling Command and aliases | Description | Usage @@ -129,22 +133,22 @@ Command and aliases | Description | Usage `$raffle` | Prints a name and ID of a random user from the online list from the (optional) role. | `$raffle` or `$raffle RoleName` `$cash` `$$$` | Check how much currency a person has. (Defaults to yourself) | `$$$` or `$$$ @SomeGuy` `$give` | Give someone a certain amount of currency. | `$give 1 "@SomeGuy"` -`$award` | Awards someone a certain amount of currency. You can also specify a role name to award currency to all users in a role. **Bot Owner only.** | `$award 100 @person` or `$award 5 Role Of Gamblers` -`$take` | Takes a certain amount of currency from someone. **Bot Owner only.** | `$take 1 "@someguy"` -`$betroll` `$br` | Bets a certain amount of currency and rolls a dice. Rolling over 66 yields x2 of your currency, over 90 - x3 and 100 x10. | `$br 5` -`$leaderboard` `$lb` | Displays bot currency leaderboard. | `$lb` +`$award` | Awards someone a certain amount of currency. You can also specify a role name to award currency to all users in a role. **Bot Owner Only** | `$award 100 @person` or `$award 5 Role Of Gamblers` +`$take` | Takes a certain amount of currency from someone. **Bot Owner Only** | `$take 1 "@someguy"` +`$betroll` `$br` | Bets a certain amount of currency and rolls a dice. Rolling over 66 yields x2 of your currency, over 90 - x4 and 100 x10. | `$br 5` +`$leaderboard` `$lb` | Displays the bot's currency leaderboard. | `$lb` `$race` | Starts a new animal race. | `$race` `$joinrace` `$jr` | Joins a new race. You can specify an amount of currency for betting (optional). You will get YourBet*(participants-1) back if you win. | `$jr` or `$jr 5` -`$startevent` | Starts one of the events seen on public nadeko. **Bot Owner only.** | `$startevent flowerreaction` -`$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. Y can be a letter 'F' if you want to roll fate dice instead of dnd. | `$roll` or `$roll 7` or `$roll 3d5` or `$roll 5dF` -`$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` +`$startevent` | Starts one of the events seen on public nadeko. **Bot Owner Only** | `$startevent flowerreaction` +`$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`. `Y` can be a letter 'F' if you want to roll fate dice instead of dnd. | `$roll` or `$roll 7` or `$roll 3d5` or `$roll 5dF` +`$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` `$draw` | Draws a card from the deck.If you supply number X, she draws up to 5 cards from the deck. | `$draw` or `$draw 5` `$shuffle` `$sh` | Reshuffles all cards back into the deck. | `$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 awards you 1.95x the currency you've bet (rounded up). Multiplier can be changed by the bot owner. | `$bf 5 heads` or `$bf 3 t` -`$slotstats` | Shows the total stats of the slot command for this bot's session. **Bot Owner only.** | `$slotstats` -`$slottest` | Tests to see how much slots payout for X number of plays. **Bot Owner only.** | `$slottest 1000` +`$slotstats` | Shows the total stats of the slot command for this bot's session. **Bot Owner Only** | `$slotstats` +`$slottest` | Tests to see how much slots payout for X number of plays. **Bot Owner Only** | `$slottest 1000` `$slot` | Play Nadeko slots. Max bet is 999. 3 seconds cooldown per user. | `$slot 5` `$claimwaifu` `$claim` | Claim a waifu for yourself by spending currency. You must spend atleast 10% more than her current value unless she set `$affinity` towards you. | `$claim 50 @Himesama` `$divorce` | Releases your claim on a specific waifu. You will get some of the money you've spent back unless that waifu has an affinity towards you. 6 hours cooldown. | `$divorce @CheatingSloot` @@ -152,14 +156,15 @@ Command and aliases | Description | Usage `$waifus` `$waifulb` | Shows top 9 waifus. | `$waifus` `$waifuinfo` `$waifustats` | Shows waifu stats for a target person. Defaults to you if no user is provided. | `$waifuinfo @MyCrush` or `$waifuinfo` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Games Command and aliases | Description | Usage ----------------|--------------|------- `>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` +`>rps` | Play a game of Rocket-Paperclip-Scissors with Nadeko. | `>rps scissors` +`>rategirl` | Use the universal hot-crazy wife zone matrix to determine the girl's worth. It is everything young men need to know about women. At any moment in time, any woman you have previously located on this chart can vanish from that location and appear anywhere else on the chart. | `>rategirl @SomeGurl` `>linux` | Prints a customizable Linux interjection | `>linux Spyware Windows` `>leet` | Converts a text to leetspeak with 6 (1-6) severity levels | `>leet 3 Hello` `>acrophobia` `>acro` | Starts an Acrophobia game. Second argment is optional round length in seconds. (default is 60) | `>acro` or `>acro 30` @@ -175,26 +180,27 @@ Command and aliases | Description | Usage `>pollend` | Stops active poll on this server and prints the results in this channel. **Requires ManageMessages server permission.** | `>pollend` `>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. **Bot Owner only.** | `>typeadd wordswords` +`>typeadd` | Adds a new article to the typing contest. **Bot Owner Only** | `>typeadd wordswords` `>typelist` | Lists added typing articles with their IDs. 15 per page. | `>typelist` or `>typelist 3` -`>typedel` | Deletes a typing article given the ID. **Bot Owner only.** | `>typedel 3` -`>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` or `>t 5 nohint` +`>typedel` | Deletes a typing article given the ID. **Bot Owner Only** | `>typedel 3` +`>tictactoe` `>ttt` | Starts a game of tic tac toe. Another user must run the command in the same channel in order to accept the challenge. Use numbers 1-9 to play. 15 seconds per move. | >ttt +`>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` or `>t 5 nohint` `>tl` | Shows a current trivia leaderboard. | `>tl` `>tq` | Quits current trivia after current question. | `>tq` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Help Command and aliases | Description | Usage ----------------|--------------|------- `-modules` `-mdls` | Lists all bot modules. | `-modules` -`-commands` `-cmds` | 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 Administration` or `-cmds Admin` -`-help` `-h` | Either shows a help for a single command, or DMs you help link if no arguments are specified. | `-h !!q` or `-h` -`-hgit` | Generates the commandlist.md file. **Bot Owner only.** | `-hgit` +`-commands` `-cmds` | List all of the bot's commands from a certain module. You can either specify the full name or only the first few letters of the module name. | `-commands Administration` or `-cmds Admin` +`-help` `-h` | Either shows a help for a single command, or DMs you help link if no arguments are specified. | `-h -cmds` or `-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` | Instructions for helping the project financially. | `-donate` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Music Command and aliases | Description | Usage @@ -203,34 +209,34 @@ Command and aliases | Description | Usage `!!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` -`!!fairplay` `!!fp` | Toggles fairplay. While enabled, music player will prioritize songs from users who didn't have their song recently played instead of the song's position in the queue. | `!!fp` -`!!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` +`!!fairplay` `!!fp` | Toggles fairplay. While enabled, the bot will prioritize songs from users who didn't have their song recently played instead of the song's position in the queue. | `!!fp` +`!!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` +`!!nowplaying` `!!np` | Shows the song that the bot is currently playing. | `!!np` +`!!volume` `!!vol` | Sets the music playback volume (0-100%) | `!!vol 50` `!!defvol` `!!dv` | Sets the default music volume when music playback is started (0-100). Persists through restarts. | `!!dv 80` `!!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 soundcloudseturl` -`!!localplaylst` `!!lopl` | Queues all songs from a directory. **Bot Owner only.** | `!!lopl C:/music/classical` +`!!soundcloudpl` `!!scpl` | Queue a Soundcloud playlist using a link. | `!!scpl soundcloudseturl` +`!!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` +`!!local` `!!lo` | Queues a local file by specifying a full path. **Bot Owner Only** | `!!lo C:/music/mysong.mp3` `!!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` `!!setmaxplaytime` `!!smp` | Sets a maximum number of seconds (>14) a song can run before being skipped automatically. Set 0 to have no limit. | `!!smp 0` or `!!smp 270` `!!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 saved playlist using it's ID. Use `!!pls` to list all saved playlists and !!save to save new ones. | `!!load 5` -`!!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` +`!!save` | Saves a playlist under a certain name. Playlist name must be no longer than 20 characters and must not contain dashes. | `!!save classical1` +`!!load` | Loads a saved playlist using its ID. Use `!!pls` to list all saved playlists and `!!save` to save new ones. | `!!load 5` +`!!playlists` `!!pls` | Lists all playlists. Paginated, 20 per page. Default page is 0. | `!!pls 1` +`!!deleteplaylist` `!!delpls` | Deletes a saved playlist. Works 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` -`!!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` +`!!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` `!!setmusicchannel` `!!smch` | Sets the current channel as the default music output channel. This will output playing, finished, paused and removed songs to that channel instead of the channel where the first song was queued in. **Requires ManageMessages server permission.** | `!!smch` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### NSFW Command and aliases | Description | Usage @@ -240,24 +246,24 @@ Command and aliases | Description | Usage `~hentaibomb` | Shows a total 5 images (from gelbooru, danbooru, konachan, yandere and atfbooru). Tag is optional but preferred. | `~hentaibomb yuri` `~yandere` | Shows a random image from yandere with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~yandere tag1+tag2` `~konachan` | Shows a random hentai image from konachan with a given tag. Tag is optional but preferred. | `~konachan yuri` -`~rule34` | Shows a random image from rule34.xx with a given tag. Tag is optional but preferred. (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 preferred. Use spaces for multiple tags. | `~e621 yuri kissing` +`~rule34` | Shows a random image from rule34.xx with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~rule34 yuri+kissing` `~danbooru` | Shows a random hentai image from danbooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~danbooru yuri+kissing` `~gelbooru` | Shows a random hentai image from gelbooru with a given tag. Tag is optional but preferred. (multiple tags are appended with +) | `~gelbooru 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` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Permissions Command and aliases | Description | Usage ----------------|--------------|------- `;verbose` `;v` | Sets whether to show when a command/module is blocked. | `;verbose true` -`;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` +`;permrole` `;pr` | Sets a role which can change permissions. Supply no parameters to see the current one. Default is 'Nadeko'. | `;pr role` `;listperms` `;lp` | 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` -`;removeperm` `;rp` | Removes a permission from a given position in Permissions list. | `;rp 1` -`;moveperm` `;mp` | Moves permission from one position to another in Permissions list. | `;mp 2 4` +`;removeperm` `;rp` | Removes a permission from a given position in the Permissions list. | `;rp 1` +`;moveperm` `;mp` | Moves permission from one position to another in the Permissions list. | `;mp 2 4` `;srvrcmd` `;sc` | Sets a command's permission at the server level. | `;sc "command name" disable` `;srvrmdl` `;sm` | Sets a module's permission at the server level. | `;sm ModuleName enable` `;usrcmd` `;uc` | Sets a command's permission at the user level. | `;uc "command name" enable SomeUsername` @@ -270,31 +276,30 @@ Command and aliases | Description | Usage `;allrolemdls` `;arm` | Enable or disable all modules for a specific role. | `;arm [enable/disable] MyRole` `;allusrmdls` `;aum` | Enable or disable all modules for a specific user. | `;aum enable @someone` `;allsrvrmdls` `;asm` | Enable or disable all modules for your server. | `;asm [enable/disable]` -`;ubl` | Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. **Bot Owner only.** | `;ubl add @SomeUser` or `;ubl rem 12312312313` -`;cbl` | Either [add]s or [rem]oves a channel specified by an ID from a blacklist. **Bot Owner only.** | `;cbl rem 12312312312` -`;sbl` | Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist. **Bot Owner only.** | `;sbl add 12312321312` or `;sbl rem SomeTrashServer` -`;cmdcooldown` `;cmdcd` | Sets a cooldown per user for a command. Set to 0 to remove the cooldown. | `;cmdcd "some cmd" 5` +`;ubl` | Either [add]s or [rem]oves a user specified by a Mention or an ID from a blacklist. **Bot Owner Only** | `;ubl add @SomeUser` or `;ubl rem 12312312313` +`;cbl` | Either [add]s or [rem]oves a channel specified by an ID from a blacklist. **Bot Owner Only** | `;cbl rem 12312312312` +`;sbl` | Either [add]s or [rem]oves a server specified by a Name or an ID from a blacklist. **Bot Owner Only** | `;sbl add 12312321312` or `;sbl rem SomeTrashServer` +`;cmdcooldown` `;cmdcd` | Sets a cooldown per user for a command. Set it to 0 to remove the cooldown. | `;cmdcd "some cmd" 5` `;allcmdcooldowns` `;acmdcds` | Shows a list of all commands and their respective cooldowns. | `;acmdcds` -`;cmdcosts` | Shows a list of command costs. Paginated with 9 command per page. | `;cmdcosts` or `;cmdcosts 2` -`;srvrfilterinv` `;sfi` | Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner. | `;sfi` -`;chnlfilterinv` `;cfi` | Toggles automatic deleting of invites posted in the channel. Does not negate the ;srvrfilterinv enabled setting. Does not affect Bot Owner. | `;cfi` -`;srvrfilterwords` `;sfw` | Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner. | `;sfw` -`;chnlfilterwords` `;cfw` | Toggles automatic deleting of messages containing banned words on the channel. Does not negate the ;srvrfilterwords enabled setting. Does not affect bot owner. | `;cfw` +`;srvrfilterinv` `;sfi` | Toggles automatic deletion of invites posted in the server. Does not affect the Bot Owner. | `;sfi` +`;chnlfilterinv` `;cfi` | Toggles automatic deletion of invites posted in the channel. Does not negate the `;srvrfilterinv` enabled setting. Does not affect the Bot Owner. | `;cfi` +`;srvrfilterwords` `;sfw` | Toggles automatic deletion of messages containing filtered words on the server. Does not affect the Bot Owner. | `;sfw` +`;chnlfilterwords` `;cfw` | Toggles automatic deletion of messages containing filtered words on the channel. Does not negate the `;srvrfilterwords` enabled setting. Does not affect the Bot Owner. | `;cfw` `;fw` | Adds or removes (if it exists) a word from the list of filtered words. Use`;sfw` or `;cfw` to toggle filtering. | `;fw poop` `;lstfilterwords` `;lfw` | Shows a list of filtered words. | `;lfw` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Pokemon 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` +`>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. Provide no arguments to see a list of available types. | `>settype fire` or `>settype` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Searches Command and aliases | Description | Usage @@ -304,39 +309,37 @@ Command and aliases | Description | Usage `~imdb` `~omdb` | Queries omdb for movies or series, show first result. | `~imdb Batman vs Superman` `~randomcat` `~meow` | Shows a random cat image. | `~meow` `~randomdog` `~woof` | Shows a random dog image. | `~woof` -`~image` `~img` | Pulls the first image found using a search parameter. Use ~rimg for different results. | `~img cute kitten` +`~image` `~img` | Pulls the first image found using a search parameter. Use `~rimg` for different results. | `~img cute kitten` `~randomimage` `~rimg` | Pulls a random image using a search parameter. | `~rimg cute kitten` `~lmgtfy` | Google something for an idiot. | `~lmgtfy query` `~shorten` | Attempts to shorten an URL, if it fails, returns the input URL. | `~shorten https://google.com` -`~google` `~g` | Get a google search link for some terms. | `~google query` +`~google` `~g` | Get a Google search link for some terms. | `~google query` `~magicthegathering` `~mtg` | Searches for a Magic The Gathering card. | `~magicthegathering about face` or `~mtg about face` `~hearthstone` `~hs` | Searches for a Hearthstone card and shows its image. Takes a while to complete. | `~hs Ysera` -`~yodify` `~yoda` | Translates your normal sentences into Yoda styled sentences! | ~yodify I was once an adventurer like you` or `~yoda my feelings hurt` +`~yodify` `~yoda` | Translates your normal sentences into Yoda styled sentences! | `~yoda my feelings hurt` `~urbandict` `~ud` | Searches Urban Dictionary for a word. | `~ud Pineapple` `~define` `~def` | Finds a definition of a word. | `~def heresy` `~#` | Searches Tagdef.com for a hashtag. | `~# ff` `~catfact` | Shows a random catfact from | `~catfact` -`~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` +`~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 preferred. (multiple tags are appended with +) | `~safebooru yuri+kissing` `~wikipedia` `~wiki` | Gives you back a wikipedia link | `~wiki query` `~color` `~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"` `~avatar` `~av` | Shows a mentioned person's avatar. | `~av "@SomeGuy"` `~wikia` | Gives you back a wikia link | `~wikia mtg Vigilance` or `~wikia mlp Dashy` -`~minecraftping` `~mcping` | Pings a minecraft server. | `~mcping 127.0.0.1:25565` -`~minecraftquery` `~mcq` | Finds information about a minecraft server. | `~mcq server:ip` `~lolban` | Shows top banned champions ordered by ban rate. | `~lolban` -`~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"` -`~mal` | Shows basic info from myanimelist profile. | `~mal straysocks` +`~mal` | Shows basic info from a MyAnimeList profile. | `~mal straysocks` `~anime` `~ani` `~aq` | Queries anilist for an anime and shows the first result. | `~ani aquarion evol` `~manga` `~mang` `~mq` | Queries anilist for a manga and shows the first result. | `~mq Shingeki no kyojin` `~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` +`~chucknorris` `~cn` | Shows a random Chuck Norris joke from | `~cn` `~wowjoke` | Get one of Kwoth's penultimate WoW jokes. | `~wowjoke` -`~magicitem` `~mi` | Shows a random magicitem from | `~mi` +`~magicitem` `~mi` | Shows a random magic item from | `~mi` +`~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"` `~osu` | Shows osu stats for a player. | `~osu Name` or `~osu Name taiko` `~osub` | Shows information about an osu beatmap. | `~osub https://osu.ppy.sh/s/127712` `~osu5` | Displays a user's top 5 plays. | `~osu5 Name` @@ -352,50 +355,53 @@ Command and aliases | Description | Usage `~removestream` `~rms` | Removes notifications of a certain streamer from a certain platform on this channel. **Requires ManageMessages server permission.** | `~rms Twitch SomeGuy` or `~rms Beam SomeOtherGuy` `~checkstream` `~cs` | Checks if a user is online on a certain streaming platform. | `~cs twitch MyFavStreamer` `~translate` `~trans` | Translates from>to text. From the given language to the destination language. | `~trans en>fr Hello` -`~autotrans` `~at` | Starts automatic translation of all messages by users who set their `~atl` in this channel. You can set "del" argument to automatically delete all translated user messages. **Requires Administrator server permission.** **Bot Owner only.** | `~at` or `~at del` -`~autotranslang` `~atl` | `~atl en>fr` | Sets your source and target language to be used with `~at`. Specify no arguments to remove previously set value. +`~autotrans` `~at` | Starts automatic translation of all messages by users who set their `~atl` in this channel. You can set "del" argument to automatically delete all translated user messages. **Requires Administrator server permission.** **Bot Owner Only** | `~at` or `~at del` +`~autotranslang` `~atl` | Sets your source and target language to be used with `~at`. Specify no arguments to remove previously set value. | `~atl en>fr` `~translangs` | Lists the valid languages for translation. | `~translangs` `~xkcd` | Shows a XKCD comic. No arguments will retrieve random one. Number argument will retrieve a specific comic, and "latest" will get the latest one. | `~xkcd` or `~xkcd 1400` or `~xkcd latest` -###### [Back to TOC](#table-of-contents) +###### [Back to ToC](#table-of-contents) ### Utility Command and aliases | Description | Usage ----------------|--------------|------- -`.rotaterolecolor` `.rrc` | Rotates a roles color on an interval with a list of supplied colors. First argument is interval in seconds (Minimum 60). Second argument is a role, followed by a space-separated list of colors in hex. Provide a rolename with a 0 interval to disable. **Requires ManageRoles server permission.** **Bot Owner only.** | `.rrc 60 MyLsdRole #ff0000 #00ff00 #0000ff` or `.rrc 0 MyLsdRole` +`.rotaterolecolor` `.rrc` | Rotates a roles color on an interval with a list of supplied colors. First argument is interval in seconds (Minimum 60). Second argument is a role, followed by a space-separated list of colors in hex. Provide a rolename with a 0 interval to disable. **Requires ManageRoles server permission.** **Bot Owner Only** | `.rrc 60 MyLsdRole #ff0000 #00ff00 #0000ff` or `.rrc 0 MyLsdRole` `.togethertube` `.totube` | Creates a new room on and shows the link in the chat. | `.totube` `.whosplaying` `.whpl` | Shows a list of users who are playing the specified game. | `.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` +`.inrole` | Lists every person from the provided role or roles, separated with space, on this server. You can use role IDs, role names (in quotes if it has multiple words), or role mention If the list is too long for 1 message, you must have Manage Messages permission. | `.inrole Role` or `.inrole Role1 "Role 2" @role3` `.checkmyperms` | Checks your user-specific permissions on this channel. | `.checkmyperms` `.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 roles on this server or a roles of a specific user if specified. Paginated. 20 roles per page. | `.roles 2` or `.roles @Someone` +`.roles` | List roles on this server or a roles of a specific user if specified. Paginated, 20 roles per page. | `.roles 2` or `.roles @Someone` `.channeltopic` `.ct` | Sends current channel's topic as a message. | `.ct` `.createinvite` `.crinv` | Creates a new invite which has infinite max uses and never expires. **Requires CreateInstantInvite channel permission.** | `.crinv` +`.shardstats` | Stats for shards. Paginated with 25 shards per page. | `.shardstats` or `.shardstats 2` +`.shardid` | Shows which shard is a certain guild on, by guildid. | `.shardid 117523346618318850` `.stats` | Shows some basic stats for Nadeko. | `.stats` `.showemojis` `.se` | Shows a name and a link to every SPECIAL emoji in the message. | `.se A message full of SPECIAL emojis` -`.listservers` | Lists servers the bot is on with some basic info. 15 per page. **Bot Owner only.** | `.listservers 3` -`.savechat` | Saves a number of messages to a text file and sends it to you. **Bot Owner only.** | `.savechat 150` -`.activity` | Checks for spammers. **Bot Owner only.** | `.activity` +`.listservers` | Lists servers the bot is on with some basic info. 15 per page. **Bot Owner Only** | `.listservers 3` +`.savechat` | Saves a number of messages to a text file and sends it to you. **Bot Owner Only** | `.savechat 150` +`.activity` | Checks for spammers. **Bot Owner Only** | `.activity` `.calculate` `.calc` | Evaluate a mathematical expression. | `.calc 1+1` -`.calcops` | Shows all available operations in .calc command | `.calcops` -`.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.** | `.scsc` +`.calcops` | Shows all available operations in the `.calc` command | `.calcops` +`.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** | `.scsc` `.jcsc` | Joins current channel to an instance of cross server channel using the token. **Requires ManageServer server permission.** | `.jcsc TokenHere` -`.lcsc` | Leaves Cross server channel instance from this channel. **Requires ManageServer server permission.** | `.lcsc` +`.lcsc` | Leaves a cross server channel instance from this channel. **Requires ManageServer server permission.** | `.lcsc` `.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` `.repeatinvoke` `.repinv` | Immediately shows the repeat message on a certain index and restarts its timer. **Requires ManageMessages server permission.** | `.repinv 1` `.repeatremove` `.reprm` | Removes a repeating message on a specified index. Use `.repeatlist` to see indexes. **Requires ManageMessages server permission.** | `.reprm 2` -`.repeat` | Repeat a message every X minutes in the current channel. You can have up to 5 repeating messages on the server in total. **Requires ManageMessages server permission.** | `.repeat 5 Hello there` +`.repeat` | Repeat a message every `X` minutes in the current channel. You can have up to 5 repeating messages on the server in total. **Requires ManageMessages server permission.** | `.repeat 5 Hello there` `.repeatlist` `.replst` | Shows currently repeating messages and their indexes. **Requires ManageMessages server permission.** | `.repeatlist` `.listquotes` `.liqu` | `.liqu` or `.liqu 3` | Lists all quotes on the server ordered alphabetically. 15 Per page. `...` | Shows a random quote with a specified name. | `... abc` +`.qsearch` | Shows a random quote for a keyword that contains any text specified in the search. | `.qsearch keyword text` `..` | Adds a new quote with the specified name and message. | `.. sayhi Hi` `.deletequote` `.delq` | 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` `.delallq` `.daq` | Deletes all quotes on a specified keyword. **Requires Administrator server permission.** | `.delallq kek` -`.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 1m Start now!` -`.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.** | `.remindtemplate %user%, do %message%!` +`.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 1m Start now!` +`.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** | `.remindtemplate %user%, do %message%!` `.convertlist` | List of the convertible dimensions and currencies. | `.convertlist` `.convert` | Convert quantities. Use `.convertlist` to see supported dimensions and currencies. | `.convert m km 1000` diff --git a/docs/guides/Linux Guide.md b/docs/guides/Linux Guide.md index 1997407b..4e168cf4 100644 --- a/docs/guides/Linux Guide.md +++ b/docs/guides/Linux Guide.md @@ -198,17 +198,49 @@ CentOS: ![img2](https://cdn.discordapp.com/attachments/251504306010849280/251504746987388938/dotnet.gif) Go to [this link](https://www.microsoft.com/net/core#ubuntu) (for Ubuntu) or to [this link](https://www.microsoft.com/net/core#linuxcentos) (for CentOS) provided by microsoft for instructions on how to get the most up to date version of the dotnet core sdk! -Make sure that you're on the correct page for your distribution of linux as the guides are different for the various distributions +Make sure that you're on the correct page for your distribution of linux as the guides are different for the various distributions. +Install the **currently supported version** `1.0.0-preview2-1-003177`. +You can find it [here](https://github.com/dotnet/core/blob/master/release-notes/download-archives/1.1-preview2.1-download.md) if you prefer manual installing `dpkg` files. -We'll go over the steps here for Ubuntu 16.04 anyway (these will **only** work on Ubuntu 16.04), accurate as of 3/2/2017 +We'll go over the steps here for few linux distributions, accurate as of March 08, 2017: +**NOTE:** .NET CORE SDK only supports 64-bit Linux Operating Systems (Raspberry Pis are not supported because of this) +**Ubuntu x64 17.04 & 16.10** +```sh +sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ yakkety main" > /etc/apt/sources.list.d/dotnetdev.list' +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893 +sudo apt-get update && sudo apt-get install dotnet-dev-1.0.0-preview2.1-003177 -y ``` + +**Ubuntu x64 16.04** +```sh sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list' sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893 sudo apt-get update && sudo apt-get install dotnet-dev-1.0.0-preview2.1-003177 -y ``` -**NOTE:** .NET CORE SDK only supports 64-bit Linux Operating Systems (Raspberry Pis are not supported because of this) +**Ubuntu x64 14.04** +```sh +sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list' +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893 +sudo apt-get update && sudo apt-get install dotnet-dev-1.0.0-preview2.1-003177 -y +``` + +**Debian 8 x64** +```sh +sudo apt-get install curl libunwind8 gettext -y +curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=835021 +sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet +sudo ln -s /opt/dotnet/dotnet /usr/local/bin +``` + +**CentOS 7 x64** +```sh +sudo yum install libunwind libicu -y +curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=835019 +sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet +sudo ln -s /opt/dotnet/dotnet /usr/local/bin +``` #####Installing Opus Voice Codec and libsodium @@ -232,14 +264,14 @@ Ubuntu: Centos: -``` +```sh yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm epel-release yum -y install ffmpeg ``` **NOTE:** If you are running **UBUNTU 14.04**, you must run these first: -``` +```sh sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get dist-upgrade @@ -250,7 +282,7 @@ sudo apt-get dist-upgrade **NOTE:** If you are running **Debian 8 Jessie**, please, follow these steps: -``` +```sh 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 @@ -330,14 +362,14 @@ If the [Nadeko installer](http://nadekobot.readthedocs.io/en/latest/guides/Linux **OR** -``` +```sh cd ~ && git clone -b dev --recursive --depth 1 https://github.com/Kwoth/NadekoBot.git cd ~/NadekoBot/discord.net/src/Discord.Net && dotnet restore && cd ../Discord.Net.Commands && dotnet restore && cd ../../../src/NadekoBot/ && dotnet restore && dotnet build --configuration Release ``` If you are getting error using the above steps try: -``` +```sh cd ~/NadekoBot/discord.net && dotnet restore -s https://dotnet.myget.org/F/dotnet-core/api/v3/index.json && dotnet restore cd ~/NadekoBot/src/NadekoBot/ && dotnet restore && dotnet build --configuration Release ``` diff --git a/docs/guides/OSX Guide.md b/docs/guides/OSX Guide.md index 7475a911..366a5319 100644 --- a/docs/guides/OSX Guide.md +++ b/docs/guides/OSX Guide.md @@ -30,7 +30,7 @@ brew install tmux - `ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/` - `ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/` -- Download the [.NET Core SDK](https://www.microsoft.com/net/core#macos), found [here.](https://go.microsoft.com/fwlink/?LinkID=835011) +- Download the [.NET Core SDK][.NET Core SDK] - Open the `.pkg` file you downloaded and install it. - `ln -s /usr/local/share/dotnet/dotnet /usr/local/bin` @@ -166,6 +166,7 @@ If you used Screen press CTRL+A+D (this will detach the nadeko screen) - `dotnet build --configuration Release` [Homebrew]: http://brew.sh/ +[.NET Core SDK]: https://github.com/dotnet/core/blob/master/release-notes/download-archives/1.1-preview2.1-download.md [DiscordApp]: https://discordapp.com/developers/applications/me [Atom]: https://atom.io/ [Invite Guide]: http://discord.kongslien.net/guide.html diff --git a/docs/guides/Windows Guide.md b/docs/guides/Windows Guide.md index 0d569909..c0e62c76 100644 --- a/docs/guides/Windows Guide.md +++ b/docs/guides/Windows Guide.md @@ -120,7 +120,7 @@ In order to have a functioning music module, you need to install ffmpeg and setu -[.NET Core SDK]: https://www.microsoft.com/net/core#windowscmd +[.NET Core SDK]: https://github.com/dotnet/core/blob/master/release-notes/download-archives/1.1-preview2.1-download.md [Git]: https://git-scm.com/download/win [7zip]: http://www.7-zip.org/download.html [DiscordApp]: https://discordapp.com/developers/applications/me diff --git a/scripts/Latest.bat b/scripts/Latest.bat index a4f9e15b..13248a96 100644 --- a/scripts/Latest.bat +++ b/scripts/Latest.bat @@ -1,24 +1,25 @@ @ECHO off TITLE Downloading Latest Build of NadekoBot... ::Setting convenient to read variables which don't delete the windows temp folder -SET root=%~dp0 -CD /D %root% -SET rootdir=%cd% -SET build1=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Core\ -SET build2=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Rest\ -SET build3=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.WebSocket\ -SET build4=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Commands\ -SET build5=%root%NadekoInstall_Temp\NadekoBot\src\NadekoBot\ -SET installtemp=%root%NadekoInstall_Temp\ +SET "root=%~dp0" +CD /D "%root%" +SET "rootdir=%cd%" +SET "build1=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Core\" +SET "build2=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Rest\" +SET "build3=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.WebSocket\" +SET "build4=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Commands\" +SET "build5=%root%NadekoInstall_Temp\NadekoBot\src\NadekoBot\" +SET "installtemp=%root%NadekoInstall_Temp\" ::Deleting traces of last setup for the sake of clean folders, if by some miracle it still exists -IF EXIST %installtemp% ( RMDIR %installtemp% /S /Q >nul 2>&1) +IF EXIST "%installtemp%" ( RMDIR "%installtemp%" /S /Q >nul 2>&1) +timeout /t 5 ::Checks that both git and dotnet are installed dotnet --version >nul 2>&1 || GOTO :dotnet git --version >nul 2>&1 || GOTO :git ::Creates the install directory to work in and get the current directory because spaces ruins everything otherwise :start -MKDIR NadekoInstall_Temp -CD /D %installtemp% +MKDIR "%root%NadekoInstall_Temp" +CD /D "%installtemp%" ::Downloads the latest version of Nadeko ECHO Downloading Nadeko... ECHO. @@ -28,28 +29,28 @@ TITLE Installing NadekoBot, please wait... ECHO. ECHO Installing Discord.Net(1/4)... ::Building Nadeko -CD /D %build1% +CD /D "%build1%" dotnet restore >nul 2>&1 ECHO Installing Discord.Net(2/4)... -CD /D %build2% +CD /D "%build2%" dotnet restore >nul 2>&1 ECHO Installing Discord.Net(3/4)... -CD /D %build3% +CD /D "%build3%" dotnet restore >nul 2>&1 ECHO Installing Discord.Net(4/4)... -CD /D %build4% +CD /D "%build4%" dotnet restore >nul 2>&1 ECHO. ECHO Discord.Net installation completed successfully... ECHO. ECHO Installing NadekoBot... -CD /D %build5% +CD /D "%build5%" dotnet restore >nul 2>&1 dotnet build --configuration Release >nul 2>&1 ECHO. ECHO NadekoBot installation completed successfully... ::Attempts to backup old files if they currently exist in the same folder as the batch file -IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) +IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) ELSE (GOTO :freshinstall) :freshinstall ::Moves the NadekoBot folder to keep things tidy ECHO. @@ -65,20 +66,23 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) ROBOCOPY "%root%NadekoBot" "%root%NadekoBot_Old" /MIR >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO Old files backed up to NadekoBot_Old + ECHO Old files backed up to NadekoBot_Old... ::Copies the credentials and database from the backed up data to the new folder COPY "%root%NadekoBot_Old\src\NadekoBot\credentials.json" "%installtemp%NadekoBot\src\NadekoBot\credentials.json" >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO credentials.json copied to new folder + ECHO credentials.json copied... ROBOCOPY "%root%NadekoBot_Old\src\NadekoBot\bin" "%installtemp%NadekoBot\src\NadekoBot\bin" /E >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO Old bin folder copied to new folder + ECHO bin folder copied... + RD /S /Q "%root%NadekoBot_Old\src\NadekoBot\data\musicdata" + ECHO. + ECHO music cache cleared... ROBOCOPY "%root%NadekoBot_Old\src\NadekoBot\data" "%installtemp%NadekoBot\src\NadekoBot\data" /E >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO Old data folder copied to new folder + ECHO Old data folder copied... ::Moves the setup Nadeko folder RMDIR "%root%NadekoBot\" /S /Q >nul 2>&1 ROBOCOPY "%root%NadekoInstall_Temp" "%rootdir%" /E /MOVE >nul 2>&1 @@ -103,7 +107,7 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) :giterror ECHO. ECHO Git clone failed, trying again - RMDIR %installtemp% /S /Q >nul 2>&1 + RMDIR "%installtemp%" /S /Q >nul 2>&1 GOTO :start :copyerror ::If at any point a copy error is encountered @@ -124,22 +128,39 @@ ECHO. ECHO Your System Architecture is 32bit... timeout /t 5 ECHO. -ECHO Downloading libsodium.dll and opus.dll... +ECHO Getting 32bit libsodium.dll and opus.dll... +IF EXIST "%root%NadekoBot\src\NadekoBot\_libs\32\libsodium.dll" (GOTO copysodium) ELSE (GOTO downloadsodium) +:copysodium +del "%root%NadekoBot\src\NadekoBot\libsodium.dll" +copy "%root%NadekoBot\src\NadekoBot\_libs\32\libsodium.dll" "%root%NadekoBot\src\NadekoBot\libsodium.dll" +ECHO libsodium.dll copied. +ECHO. +timeout /t 5 +IF EXIST "%root%NadekoBot\src\NadekoBot\_libs\32\opus.dll" (GOTO copyopus) ELSE (GOTO downloadopus) +:downloadsodium SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\libsodium.dll" -bitsadmin.exe /transfer "Downloading libsodium.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/libsodium.dll "%FILENAME%" +powershell -Command "Invoke-WebRequest https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/libsodium.dll -OutFile '%FILENAME%'" ECHO libsodium.dll downloaded. ECHO. timeout /t 5 +IF EXIST "%root%NadekoBot\src\NadekoBot\_libs\32\opus.dll" (GOTO copyopus) ELSE (GOTO downloadopus) +:copyopus +del "%root%NadekoBot\src\NadekoBot\opus.dll" +copy "%root%NadekoBot\src\NadekoBot\_libs\32\opus.dll" "%root%NadekoBot\src\NadekoBot\opus.dll" +ECHO opus.dll copied. +GOTO end +:downloadopus SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\opus.dll" -bitsadmin.exe /transfer "Downloading opus.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/opus.dll "%FILENAME%" +powershell -Command "Invoke-WebRequest https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/opus.dll -OutFile '%FILENAME%'" ECHO opus.dll downloaded. GOTO end :end ::Normal execution of end of script - TITLE Installation complete! + TITLE NadekoBot Installation complete! CD /D "%root%" RMDIR /S /Q "%installtemp%" >nul 2>&1 ECHO. - ECHO Installation complete, press any key to close this window! - timeout /t 5 - del Latest.bat + ECHO Installation complete! + ECHO. + PAUSE + del Latest.bat \ No newline at end of file diff --git a/scripts/NadekoAutoRun.bat b/scripts/NadekoAutoRun.bat index 90d88f4a..4441e25b 100644 --- a/scripts/NadekoAutoRun.bat +++ b/scripts/NadekoAutoRun.bat @@ -2,8 +2,8 @@ @TITLE NadekoBot -SET root=%~dp0 -CD /D %root% +SET "root=%~dp0" +CD /D "%root%" CLS ECHO Welcome to NadekoBot Auto Restart and Update! @@ -25,32 +25,28 @@ IF ERRORLEVEL 1 GOTO latestar :latestar ECHO Auto Restart and Update with Dev Build (latest) ECHO Bot will auto update on every restart! -timeout /t 3 -CD /D %~dp0NadekoBot\src\NadekoBot +CD /D "%~dp0NadekoBot\src\NadekoBot" dotnet run --configuration Release ECHO Updating... -timeout /t 3 SET "FILENAME=%~dp0\Latest.bat" -bitsadmin.exe /transfer "Downloading Nadeko (Latest)" /priority high https://github.com/Kwoth/NadekoBot/raw/master/scripts/Latest.bat "%FILENAME%" +powershell -Command "Invoke-WebRequest https://github.com/Kwoth/NadekoBot/raw/dev/scripts/Latest.bat -OutFile '%FILENAME%'" ECHO NadekoBot Dev Build (latest) downloaded. -SET root=%~dp0 -CD /D %root% +SET "root=%~dp0" +CD /D "%root%" CALL Latest.bat GOTO latestar :stablear ECHO Auto Restart and Update with Stable Build ECHO Bot will auto update on every restart! -timeout /t 3 -CD /D %~dp0NadekoBot\src\NadekoBot +CD /D "%~dp0NadekoBot\src\NadekoBot" dotnet run --configuration Release ECHO Updating... -timeout /t 3 SET "FILENAME=%~dp0\Stable.bat" -bitsadmin.exe /transfer "Downloading Nadeko (Stable)" /priority high https://github.com/Kwoth/NadekoBot/raw/master/scripts/Stable.bat "%FILENAME%" +powershell -Command "Invoke-WebRequest https://github.com/Kwoth/NadekoBot/raw/dev/scripts/Stable.bat -OutFile '%FILENAME%'" ECHO NadekoBot Stable build downloaded. -SET root=%~dp0 -CD /D %root% +SET "root=%~dp0" +CD /D "%root%" CALL Stable.bat GOTO stablear @@ -58,12 +54,12 @@ GOTO stablear ECHO Normal Auto Restart ECHO Bot will not auto update on every restart! timeout /t 3 -CD /D %~dp0NadekoBot\src\NadekoBot +CD /D "%~dp0NadekoBot\src\NadekoBot" dotnet run --configuration Release goto autorun :Exit -SET root=%~dp0 -CD /D %root% +SET "root=%~dp0" +CD /D "%root%" del NadekoAutoRun.bat CALL NadekoInstaller.bat diff --git a/scripts/NadekoRun.bat b/scripts/NadekoRun.bat index 207fb278..73c66b17 100644 --- a/scripts/NadekoRun.bat +++ b/scripts/NadekoRun.bat @@ -1,9 +1,9 @@ @ECHO off @TITLE NadekoBot -CD /D %~dp0NadekoBot\src\NadekoBot +CD /D "%~dp0NadekoBot\src\NadekoBot" dotnet run --configuration Release ECHO NadekoBot has been succesfully stopped, press any key to close this window. TITLE NadekoBot - Stopped -CD /D %~dp0 +CD /D "%~dp0" PAUSE >nul 2>&1 del NadekoRunNormal.bat diff --git a/scripts/Stable.bat b/scripts/Stable.bat index f55fc958..a3ffb6f4 100644 --- a/scripts/Stable.bat +++ b/scripts/Stable.bat @@ -1,24 +1,25 @@ @ECHO off TITLE Downloading Stable Build of NadekoBot... ::Setting convenient to read variables which don't delete the windows temp folder -SET root=%~dp0 -CD /D %root% -SET rootdir=%cd% -SET build1=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Core\ -SET build2=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Rest\ -SET build3=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.WebSocket\ -SET build4=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Commands\ -SET build5=%root%NadekoInstall_Temp\NadekoBot\src\NadekoBot\ -SET installtemp=%root%NadekoInstall_Temp\ +SET "root=%~dp0" +CD /D "%root%" +SET "rootdir=%cd%" +SET "build1=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Core\" +SET "build2=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Rest\" +SET "build3=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.WebSocket\" +SET "build4=%root%NadekoInstall_Temp\NadekoBot\Discord.Net\src\Discord.Net.Commands\" +SET "build5=%root%NadekoInstall_Temp\NadekoBot\src\NadekoBot\" +SET "installtemp=%root%NadekoInstall_Temp\" ::Deleting traces of last setup for the sake of clean folders, if by some miracle it still exists -IF EXIST %installtemp% ( RMDIR %installtemp% /S /Q >nul 2>&1) +IF EXIST "%installtemp%" ( RMDIR "%installtemp%" /S /Q >nul 2>&1) +timeout /t 5 ::Checks that both git and dotnet are installed dotnet --version >nul 2>&1 || GOTO :dotnet git --version >nul 2>&1 || GOTO :git ::Creates the install directory to work in and get the current directory because spaces ruins everything otherwise :start -MKDIR NadekoInstall_Temp -CD /D %installtemp% +MKDIR "%root%NadekoInstall_Temp" +CD /D "%installtemp%" ::Downloads the latest version of Nadeko ECHO Downloading Nadeko... ECHO. @@ -28,28 +29,28 @@ TITLE Installing NadekoBot, please wait... ECHO. ECHO Installing Discord.Net(1/4)... ::Building Nadeko -CD /D %build1% +CD /D "%build1%" dotnet restore >nul 2>&1 ECHO Installing Discord.Net(2/4)... -CD /D %build2% +CD /D "%build2%" dotnet restore >nul 2>&1 ECHO Installing Discord.Net(3/4)... -CD /D %build3% +CD /D "%build3%" dotnet restore >nul 2>&1 ECHO Installing Discord.Net(4/4)... -CD /D %build4% +CD /D "%build4%" dotnet restore >nul 2>&1 ECHO. ECHO Discord.Net installation completed successfully... ECHO. ECHO Installing NadekoBot... -CD /D %build5% +CD /D "%build5%" dotnet restore >nul 2>&1 dotnet build --configuration Release >nul 2>&1 ECHO. ECHO NadekoBot installation completed successfully... ::Attempts to backup old files if they currently exist in the same folder as the batch file -IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) +IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) ELSE (GOTO :freshinstall) :freshinstall ::Moves the NadekoBot folder to keep things tidy ECHO. @@ -65,20 +66,23 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) ROBOCOPY "%root%NadekoBot" "%root%NadekoBot_Old" /MIR >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO Old files backed up to NadekoBot_Old + ECHO Old files backed up to NadekoBot_Old... ::Copies the credentials and database from the backed up data to the new folder COPY "%root%NadekoBot_Old\src\NadekoBot\credentials.json" "%installtemp%NadekoBot\src\NadekoBot\credentials.json" >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO credentials.json copied to new folder + ECHO credentials.json copied... ROBOCOPY "%root%NadekoBot_Old\src\NadekoBot\bin" "%installtemp%NadekoBot\src\NadekoBot\bin" /E >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO Old bin folder copied to new folder + ECHO bin folder copied... + RD /S /Q "%root%NadekoBot_Old\src\NadekoBot\data\musicdata" + ECHO. + ECHO music cache cleared... ROBOCOPY "%root%NadekoBot_Old\src\NadekoBot\data" "%installtemp%NadekoBot\src\NadekoBot\data" /E >nul 2>&1 IF %ERRORLEVEL% GEQ 8 (GOTO :copyerror) ECHO. - ECHO Old data folder copied to new folder + ECHO Old data folder copied... ::Moves the setup Nadeko folder RMDIR "%root%NadekoBot\" /S /Q >nul 2>&1 ROBOCOPY "%root%NadekoInstall_Temp" "%rootdir%" /E /MOVE >nul 2>&1 @@ -103,7 +107,7 @@ IF EXIST "%root%NadekoBot\" (GOTO :backupinstall) :giterror ECHO. ECHO Git clone failed, trying again - RMDIR %installtemp% /S /Q >nul 2>&1 + RMDIR "%installtemp%" /S /Q >nul 2>&1 GOTO :start :copyerror ::If at any point a copy error is encountered @@ -124,22 +128,39 @@ ECHO. ECHO Your System Architecture is 32bit... timeout /t 5 ECHO. -ECHO Downloading libsodium.dll and opus.dll... +ECHO Getting 32bit libsodium.dll and opus.dll... +IF EXIST "%root%NadekoBot\src\NadekoBot\_libs\32\libsodium.dll" (GOTO copysodium) ELSE (GOTO downloadsodium) +:copysodium +del "%root%NadekoBot\src\NadekoBot\libsodium.dll" +copy "%root%NadekoBot\src\NadekoBot\_libs\32\libsodium.dll" "%root%NadekoBot\src\NadekoBot\libsodium.dll" +ECHO libsodium.dll copied. +ECHO. +timeout /t 5 +IF EXIST "%root%NadekoBot\src\NadekoBot\_libs\32\opus.dll" (GOTO copyopus) ELSE (GOTO downloadopus) +:downloadsodium SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\libsodium.dll" -bitsadmin.exe /transfer "Downloading libsodium.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/libsodium.dll "%FILENAME%" +powershell -Command "Invoke-WebRequest https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/libsodium.dll -OutFile '%FILENAME%'" ECHO libsodium.dll downloaded. ECHO. timeout /t 5 +IF EXIST "%root%NadekoBot\src\NadekoBot\_libs\32\opus.dll" (GOTO copyopus) ELSE (GOTO downloadopus) +:copyopus +del "%root%NadekoBot\src\NadekoBot\opus.dll" +copy "%root%NadekoBot\src\NadekoBot\_libs\32\opus.dll" "%root%NadekoBot\src\NadekoBot\opus.dll" +ECHO opus.dll copied. +GOTO end +:downloadopus SET "FILENAME=%~dp0\NadekoBot\src\NadekoBot\opus.dll" -bitsadmin.exe /transfer "Downloading opus.dll" /priority high https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/opus.dll "%FILENAME%" +powershell -Command "Invoke-WebRequest https://github.com/Kwoth/NadekoBot/raw/dev/src/NadekoBot/_libs/32/opus.dll -OutFile '%FILENAME%'" ECHO opus.dll downloaded. GOTO end :end ::Normal execution of end of script - TITLE Installation complete! + TITLE NadekoBot Installation complete! CD /D "%root%" RMDIR /S /Q "%installtemp%" >nul 2>&1 ECHO. - ECHO Installation complete, press any key to close this window! - timeout /t 5 - del Stable.bat + ECHO Installation complete! + ECHO. + PAUSE + del Stable.bat \ No newline at end of file diff --git a/src/NadekoBot/DataStructures/PermissionsCollection.cs b/src/NadekoBot/DataStructures/PermissionsCollection.cs new file mode 100644 index 00000000..e7963e64 --- /dev/null +++ b/src/NadekoBot/DataStructures/PermissionsCollection.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using NadekoBot.Services.Database.Models; + +namespace NadekoBot.DataStructures +{ + public class PermissionsCollection : IList where T : IIndexed + { + public List Source { get; } + private readonly object _locker = new object(); + + public PermissionsCollection(IEnumerable source) + { + lock (_locker) + { + Source = source.OrderBy(x => x.Index).ToList(); + for (var i = 0; i < Source.Count; i++) + { + if(Source[i].Index != i) + Source[i].Index = i; + } + } + } + + public static implicit operator List(PermissionsCollection x) => + x.Source; + + public IEnumerator GetEnumerator() => + Source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => + Source.GetEnumerator(); + + public void Add(T item) + { + lock (_locker) + { + item.Index = Source.Count; + Source.Add(item); + } + } + + public void Clear() + { + lock (_locker) + { + var first = Source[0]; + Source.Clear(); + Source[0] = first; + } + } + + public bool Contains(T item) + { + lock (_locker) + { + return Source.Contains(item); + } + } + + public void CopyTo(T[] array, int arrayIndex) + { + lock (_locker) + { + Source.CopyTo(array, arrayIndex); + } + } + + public bool Remove(T item) + { + bool removed; + lock (_locker) + { + if(Source.IndexOf(item) == 0) + throw new ArgumentException("You can't remove first permsission (allow all)"); + if (removed = Source.Remove(item)) + { + for (int i = 0; i < Source.Count; i++) + { + // hm, no idea how ef works, so I don't want to set if it's not changed, + // maybe it will try to update db? + // But most likely it just compares old to new values, meh. + if (Source[i].Index != i) + Source[i].Index = i; + } + } + } + return removed; + } + + public int Count => Source.Count; + public bool IsReadOnly => false; + public int IndexOf(T item) => item.Index; + + public void Insert(int index, T item) + { + lock (_locker) + { + if(index == 0) // can't insert on first place. Last item is always allow all. + throw new IndexOutOfRangeException(nameof(index)); + Source.Insert(index, item); + for (int i = index; i < Source.Count; i++) + { + Source[i].Index = i; + } + } + } + + public void RemoveAt(int index) + { + lock (_locker) + { + if(index == 0) // you can't remove first permission (allow all) + throw new IndexOutOfRangeException(nameof(index)); + + Source.RemoveAt(index); + for (int i = index; i < Source.Count; i++) + { + Source[i].Index = i; + } + } + } + + public T this[int index] { + get { return Source[index]; } + set { + lock (_locker) + { + if(index == 0) // can't set first element. It's always allow all + throw new IndexOutOfRangeException(nameof(index)); + value.Index = index; + Source[index] = value; + } + } + } + } + +} diff --git a/src/NadekoBot/Migrations/20170308033058_permsv2.Designer.cs b/src/NadekoBot/Migrations/20170308033058_permsv2.Designer.cs new file mode 100644 index 00000000..ea8eaee1 --- /dev/null +++ b/src/NadekoBot/Migrations/20170308033058_permsv2.Designer.cs @@ -0,0 +1,1206 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using NadekoBot.Modules.Music.Classes; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoContext))] + [Migration("20170308033058_permsv2")] + partial class permsv2 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.0-rtm-22752"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.Property("UserThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiRaidSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AntiSpamSettingId"); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.HasKey("Id"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("MessageThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("BetflipMultiplier"); + + b.Property("Betroll100Multiplier"); + + b.Property("Betroll67Multiplier"); + + b.Property("Betroll91Multiplier"); + + b.Property("BufferSize"); + + b.Property("CurrencyDropAmount"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DateAdded"); + + b.Property("ErrorColor"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("Locale"); + + b.Property("MigrationVersion"); + + b.Property("MinimumBetAmount"); + + b.Property("OkColor"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.Property("TriviaCurrencyReward"); + + 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("DateAdded"); + + b.Property("SequenceNumber"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.HasIndex("Price") + .IsUnique(); + + b.ToTable("CommandPrice"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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("DateAdded"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("Reason"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.ToTable("CurrencyTransactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AvatarId"); + + b.Property("DateAdded"); + + b.Property("Discriminator"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GCChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteByeMessagesTimer"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("CleverbotEnabled"); + + b.Property("DateAdded"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("Locale"); + + b.Property("LogSettingId"); + + b.Property("MuteRoleName"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("TimeZoneId"); + + 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.GuildRepeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("ChannelCreatedId"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelDestroyedId"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("ChannelUpdatedId"); + + b.Property("DateAdded"); + + b.Property("IsLogging"); + + b.Property("LogOtherId"); + + b.Property("LogUserPresence"); + + b.Property("LogUserPresenceId"); + + b.Property("LogVoicePresence"); + + b.Property("LogVoicePresenceId"); + + b.Property("LogVoicePresenceTTSId"); + + b.Property("MessageDeleted"); + + b.Property("MessageDeletedId"); + + b.Property("MessageUpdated"); + + b.Property("MessageUpdatedId"); + + b.Property("UserBanned"); + + b.Property("UserBannedId"); + + b.Property("UserJoined"); + + b.Property("UserJoinedId"); + + b.Property("UserLeft"); + + b.Property("UserLeftId"); + + b.Property("UserMutedId"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUnbannedId"); + + b.Property("UserUpdated"); + + b.Property("UserUpdatedId"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("UserId"); + + b.Property("type"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("PokeGame"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AffinityId"); + + b.Property("ClaimerId"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.Property("WaifuId"); + + b.HasKey("Id"); + + b.HasIndex("AffinityId"); + + b.HasIndex("ClaimerId"); + + b.HasIndex("WaifuId") + .IsUnique(); + + b.ToTable("WaifuInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("NewId"); + + b.Property("OldId"); + + b.Property("UpdateType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("NewId"); + + b.HasIndex("OldId"); + + b.HasIndex("UserId"); + + b.ToTable("WaifuUpdates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiRaidSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiSpamSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + 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.CommandPrice", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("CommandPrices") + .HasForeignKey("BotConfigId"); + }); + + 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.GCChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GenerateCurrencyChannelIds") + .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.GuildRepeater", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId"); + }); + + 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") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId"); + }); + + 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.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + 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"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") + .WithMany() + .HasForeignKey("AffinityId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Claimer") + .WithMany() + .HasForeignKey("ClaimerId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Waifu") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "New") + .WithMany() + .HasForeignKey("NewId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Old") + .WithMany() + .HasForeignKey("OldId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20170308033058_permsv2.cs b/src/NadekoBot/Migrations/20170308033058_permsv2.cs new file mode 100644 index 00000000..c40879ed --- /dev/null +++ b/src/NadekoBot/Migrations/20170308033058_permsv2.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class permsv2 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Permissionv2", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + GuildConfigId = table.Column(nullable: true), + Index = table.Column(nullable: false), + 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_Permissionv2", x => x.Id); + table.ForeignKey( + name: "FK_Permissionv2_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_Permissionv2_GuildConfigId", + table: "Permissionv2", + column: "GuildConfigId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Permissionv2"); + } + } +} diff --git a/src/NadekoBot/Migrations/20170310210952_unmute-timers.Designer.cs b/src/NadekoBot/Migrations/20170310210952_unmute-timers.Designer.cs new file mode 100644 index 00000000..96d944e6 --- /dev/null +++ b/src/NadekoBot/Migrations/20170310210952_unmute-timers.Designer.cs @@ -0,0 +1,1233 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using NadekoBot.Modules.Music.Classes; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoContext))] + [Migration("20170310210952_unmute-timers")] + partial class unmutetimers + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.0-rtm-22752"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.Property("UserThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiRaidSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AntiSpamSettingId"); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.HasKey("Id"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("MessageThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("BetflipMultiplier"); + + b.Property("Betroll100Multiplier"); + + b.Property("Betroll67Multiplier"); + + b.Property("Betroll91Multiplier"); + + b.Property("BufferSize"); + + b.Property("CurrencyDropAmount"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DateAdded"); + + b.Property("ErrorColor"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("Locale"); + + b.Property("MigrationVersion"); + + b.Property("MinimumBetAmount"); + + b.Property("OkColor"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.Property("TriviaCurrencyReward"); + + 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("DateAdded"); + + b.Property("SequenceNumber"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.HasIndex("Price") + .IsUnique(); + + b.ToTable("CommandPrice"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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("DateAdded"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("Reason"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.ToTable("CurrencyTransactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AvatarId"); + + b.Property("DateAdded"); + + b.Property("Discriminator"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GCChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteByeMessagesTimer"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("CleverbotEnabled"); + + b.Property("DateAdded"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("Locale"); + + b.Property("LogSettingId"); + + b.Property("MuteRoleName"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("TimeZoneId"); + + 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.GuildRepeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("ChannelCreatedId"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelDestroyedId"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("ChannelUpdatedId"); + + b.Property("DateAdded"); + + b.Property("IsLogging"); + + b.Property("LogOtherId"); + + b.Property("LogUserPresence"); + + b.Property("LogUserPresenceId"); + + b.Property("LogVoicePresence"); + + b.Property("LogVoicePresenceId"); + + b.Property("LogVoicePresenceTTSId"); + + b.Property("MessageDeleted"); + + b.Property("MessageDeletedId"); + + b.Property("MessageUpdated"); + + b.Property("MessageUpdatedId"); + + b.Property("UserBanned"); + + b.Property("UserBannedId"); + + b.Property("UserJoined"); + + b.Property("UserJoinedId"); + + b.Property("UserLeft"); + + b.Property("UserLeftId"); + + b.Property("UserMutedId"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUnbannedId"); + + b.Property("UserUpdated"); + + b.Property("UserUpdatedId"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UnmuteAt"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("UserId"); + + b.Property("type"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("PokeGame"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AffinityId"); + + b.Property("ClaimerId"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.Property("WaifuId"); + + b.HasKey("Id"); + + b.HasIndex("AffinityId"); + + b.HasIndex("ClaimerId"); + + b.HasIndex("WaifuId") + .IsUnique(); + + b.ToTable("WaifuInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("NewId"); + + b.Property("OldId"); + + b.Property("UpdateType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("NewId"); + + b.HasIndex("OldId"); + + b.HasIndex("UserId"); + + b.ToTable("WaifuUpdates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiRaidSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiSpamSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + 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.CommandPrice", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("CommandPrices") + .HasForeignKey("BotConfigId"); + }); + + 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.GCChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GenerateCurrencyChannelIds") + .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.GuildRepeater", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId"); + }); + + 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") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId"); + }); + + 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.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + 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"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") + .WithMany() + .HasForeignKey("AffinityId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Claimer") + .WithMany() + .HasForeignKey("ClaimerId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Waifu") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "New") + .WithMany() + .HasForeignKey("NewId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Old") + .WithMany() + .HasForeignKey("OldId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20170310210952_unmute-timers.cs b/src/NadekoBot/Migrations/20170310210952_unmute-timers.cs new file mode 100644 index 00000000..d76e96a6 --- /dev/null +++ b/src/NadekoBot/Migrations/20170310210952_unmute-timers.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class unmutetimers : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "UnmuteTimer", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + GuildConfigId = table.Column(nullable: true), + UnmuteAt = table.Column(nullable: false), + UserId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UnmuteTimer", x => x.Id); + table.ForeignKey( + name: "FK_UnmuteTimer_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_UnmuteTimer_GuildConfigId", + table: "UnmuteTimer", + column: "GuildConfigId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "UnmuteTimer"); + } + } +} diff --git a/src/NadekoBot/Migrations/20170311054632_vcrole.Designer.cs b/src/NadekoBot/Migrations/20170311054632_vcrole.Designer.cs new file mode 100644 index 00000000..a4cd628d --- /dev/null +++ b/src/NadekoBot/Migrations/20170311054632_vcrole.Designer.cs @@ -0,0 +1,1260 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using NadekoBot.Modules.Music.Classes; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoContext))] + [Migration("20170311054632_vcrole")] + partial class vcrole + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.0-rtm-22752"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.Property("UserThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiRaidSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AntiSpamSettingId"); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.HasKey("Id"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("MessageThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("BetflipMultiplier"); + + b.Property("Betroll100Multiplier"); + + b.Property("Betroll67Multiplier"); + + b.Property("Betroll91Multiplier"); + + b.Property("BufferSize"); + + b.Property("CurrencyDropAmount"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DateAdded"); + + b.Property("ErrorColor"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("Locale"); + + b.Property("MigrationVersion"); + + b.Property("MinimumBetAmount"); + + b.Property("OkColor"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.Property("TriviaCurrencyReward"); + + 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("DateAdded"); + + b.Property("SequenceNumber"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.HasIndex("Price") + .IsUnique(); + + b.ToTable("CommandPrice"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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("DateAdded"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("Reason"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.ToTable("CurrencyTransactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AvatarId"); + + b.Property("DateAdded"); + + b.Property("Discriminator"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GCChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteByeMessagesTimer"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("CleverbotEnabled"); + + b.Property("DateAdded"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("Locale"); + + b.Property("LogSettingId"); + + b.Property("MuteRoleName"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("TimeZoneId"); + + 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.GuildRepeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("ChannelCreatedId"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelDestroyedId"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("ChannelUpdatedId"); + + b.Property("DateAdded"); + + b.Property("IsLogging"); + + b.Property("LogOtherId"); + + b.Property("LogUserPresence"); + + b.Property("LogUserPresenceId"); + + b.Property("LogVoicePresence"); + + b.Property("LogVoicePresenceId"); + + b.Property("LogVoicePresenceTTSId"); + + b.Property("MessageDeleted"); + + b.Property("MessageDeletedId"); + + b.Property("MessageUpdated"); + + b.Property("MessageUpdatedId"); + + b.Property("UserBanned"); + + b.Property("UserBannedId"); + + b.Property("UserJoined"); + + b.Property("UserJoinedId"); + + b.Property("UserLeft"); + + b.Property("UserLeftId"); + + b.Property("UserMutedId"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUnbannedId"); + + b.Property("UserUpdated"); + + b.Property("UserUpdatedId"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UnmuteAt"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("UserId"); + + b.Property("type"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("PokeGame"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("RoleId"); + + b.Property("VoiceChannelId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AffinityId"); + + b.Property("ClaimerId"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.Property("WaifuId"); + + b.HasKey("Id"); + + b.HasIndex("AffinityId"); + + b.HasIndex("ClaimerId"); + + b.HasIndex("WaifuId") + .IsUnique(); + + b.ToTable("WaifuInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("NewId"); + + b.Property("OldId"); + + b.Property("UpdateType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("NewId"); + + b.HasIndex("OldId"); + + b.HasIndex("UserId"); + + b.ToTable("WaifuUpdates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiRaidSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiSpamSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + 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.CommandPrice", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("CommandPrices") + .HasForeignKey("BotConfigId"); + }); + + 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.GCChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GenerateCurrencyChannelIds") + .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.GuildRepeater", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId"); + }); + + 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") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId"); + }); + + 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.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + 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"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") + .WithMany() + .HasForeignKey("AffinityId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Claimer") + .WithMany() + .HasForeignKey("ClaimerId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Waifu") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "New") + .WithMany() + .HasForeignKey("NewId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Old") + .WithMany() + .HasForeignKey("OldId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20170311054632_vcrole.cs b/src/NadekoBot/Migrations/20170311054632_vcrole.cs new file mode 100644 index 00000000..363f88f5 --- /dev/null +++ b/src/NadekoBot/Migrations/20170311054632_vcrole.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class vcrole : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "VcRoleInfo", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + GuildConfigId = table.Column(nullable: true), + RoleId = table.Column(nullable: false), + VoiceChannelId = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_VcRoleInfo", x => x.Id); + table.ForeignKey( + name: "FK_VcRoleInfo_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_VcRoleInfo_GuildConfigId", + table: "VcRoleInfo", + column: "GuildConfigId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "VcRoleInfo"); + } + } +} diff --git a/src/NadekoBot/Migrations/20170318190018_crad-and-crdm.Designer.cs b/src/NadekoBot/Migrations/20170318190018_crad-and-crdm.Designer.cs new file mode 100644 index 00000000..1bfcd350 --- /dev/null +++ b/src/NadekoBot/Migrations/20170318190018_crad-and-crdm.Designer.cs @@ -0,0 +1,1264 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using NadekoBot.Modules.Music.Classes; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoContext))] + [Migration("20170318190018_crad-and-crdm")] + partial class cradandcrdm + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.0-rtm-22752"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.Property("UserThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiRaidSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AntiSpamSettingId"); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.HasKey("Id"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("MessageThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("BetflipMultiplier"); + + b.Property("Betroll100Multiplier"); + + b.Property("Betroll67Multiplier"); + + b.Property("Betroll91Multiplier"); + + b.Property("BufferSize"); + + b.Property("CurrencyDropAmount"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DateAdded"); + + b.Property("ErrorColor"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("Locale"); + + b.Property("MigrationVersion"); + + b.Property("MinimumBetAmount"); + + b.Property("OkColor"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.Property("TriviaCurrencyReward"); + + 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("DateAdded"); + + b.Property("SequenceNumber"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.HasIndex("Price") + .IsUnique(); + + b.ToTable("CommandPrice"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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("DateAdded"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("Reason"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.ToTable("CurrencyTransactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoDeleteTrigger"); + + b.Property("DateAdded"); + + b.Property("DmResponse"); + + 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.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AvatarId"); + + b.Property("DateAdded"); + + b.Property("Discriminator"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GCChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteByeMessagesTimer"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("CleverbotEnabled"); + + b.Property("DateAdded"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("Locale"); + + b.Property("LogSettingId"); + + b.Property("MuteRoleName"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("TimeZoneId"); + + 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.GuildRepeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("ChannelCreatedId"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelDestroyedId"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("ChannelUpdatedId"); + + b.Property("DateAdded"); + + b.Property("IsLogging"); + + b.Property("LogOtherId"); + + b.Property("LogUserPresence"); + + b.Property("LogUserPresenceId"); + + b.Property("LogVoicePresence"); + + b.Property("LogVoicePresenceId"); + + b.Property("LogVoicePresenceTTSId"); + + b.Property("MessageDeleted"); + + b.Property("MessageDeletedId"); + + b.Property("MessageUpdated"); + + b.Property("MessageUpdatedId"); + + b.Property("UserBanned"); + + b.Property("UserBannedId"); + + b.Property("UserJoined"); + + b.Property("UserJoinedId"); + + b.Property("UserLeft"); + + b.Property("UserLeftId"); + + b.Property("UserMutedId"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUnbannedId"); + + b.Property("UserUpdated"); + + b.Property("UserUpdatedId"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UnmuteAt"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("UserId"); + + b.Property("type"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("PokeGame"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("RoleId"); + + b.Property("VoiceChannelId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AffinityId"); + + b.Property("ClaimerId"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.Property("WaifuId"); + + b.HasKey("Id"); + + b.HasIndex("AffinityId"); + + b.HasIndex("ClaimerId"); + + b.HasIndex("WaifuId") + .IsUnique(); + + b.ToTable("WaifuInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("NewId"); + + b.Property("OldId"); + + b.Property("UpdateType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("NewId"); + + b.HasIndex("OldId"); + + b.HasIndex("UserId"); + + b.ToTable("WaifuUpdates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiRaidSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiSpamSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + 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.CommandPrice", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("CommandPrices") + .HasForeignKey("BotConfigId"); + }); + + 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.GCChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GenerateCurrencyChannelIds") + .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.GuildRepeater", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId"); + }); + + 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") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId"); + }); + + 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.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + 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"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") + .WithMany() + .HasForeignKey("AffinityId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Claimer") + .WithMany() + .HasForeignKey("ClaimerId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Waifu") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "New") + .WithMany() + .HasForeignKey("NewId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Old") + .WithMany() + .HasForeignKey("OldId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20170318190018_crad-and-crdm.cs b/src/NadekoBot/Migrations/20170318190018_crad-and-crdm.cs new file mode 100644 index 00000000..898a19ca --- /dev/null +++ b/src/NadekoBot/Migrations/20170318190018_crad-and-crdm.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class cradandcrdm : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AutoDeleteTrigger", + table: "CustomReactions", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "DmResponse", + table: "CustomReactions", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AutoDeleteTrigger", + table: "CustomReactions"); + + migrationBuilder.DropColumn( + name: "DmResponse", + table: "CustomReactions"); + } + } +} diff --git a/src/NadekoBot/Migrations/20170320090138_command-aliasing.Designer.cs b/src/NadekoBot/Migrations/20170320090138_command-aliasing.Designer.cs new file mode 100644 index 00000000..0017cd76 --- /dev/null +++ b/src/NadekoBot/Migrations/20170320090138_command-aliasing.Designer.cs @@ -0,0 +1,1291 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using NadekoBot.Modules.Music.Classes; + +namespace NadekoBot.Migrations +{ + [DbContext(typeof(NadekoContext))] + [Migration("20170320090138_command-aliasing")] + partial class commandaliasing + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.1.0-rtm-22752"); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.Property("UserThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiRaidSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AntiSpamSettingId"); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.HasKey("Id"); + + b.HasIndex("AntiSpamSettingId"); + + b.ToTable("AntiSpamIgnore"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Action"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("MessageThreshold"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId") + .IsUnique(); + + b.ToTable("AntiSpamSetting"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.BlacklistItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("BetflipMultiplier"); + + b.Property("Betroll100Multiplier"); + + b.Property("Betroll67Multiplier"); + + b.Property("Betroll91Multiplier"); + + b.Property("BufferSize"); + + b.Property("CurrencyDropAmount"); + + b.Property("CurrencyGenerationChance"); + + b.Property("CurrencyGenerationCooldown"); + + b.Property("CurrencyName"); + + b.Property("CurrencyPluralName"); + + b.Property("CurrencySign"); + + b.Property("DMHelpString"); + + b.Property("DateAdded"); + + b.Property("ErrorColor"); + + b.Property("ForwardMessages"); + + b.Property("ForwardToAllOwners"); + + b.Property("HelpString"); + + b.Property("Locale"); + + b.Property("MigrationVersion"); + + b.Property("MinimumBetAmount"); + + b.Property("OkColor"); + + b.Property("RemindMessageFormat"); + + b.Property("RotatingStatuses"); + + b.Property("TriviaCurrencyReward"); + + 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("DateAdded"); + + b.Property("SequenceNumber"); + + 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("DateAdded"); + + 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.CommandAlias", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Mapping"); + + b.Property("Trigger"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandAlias"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Seconds"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandCooldown"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandPrice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("CommandName"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.HasKey("Id"); + + b.HasIndex("BotConfigId"); + + b.HasIndex("Price") + .IsUnique(); + + b.ToTable("CommandPrice"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.ConvertUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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("DateAdded"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Currency"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CurrencyTransaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + b.Property("Reason"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.ToTable("CurrencyTransactions"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.CustomReaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoDeleteTrigger"); + + b.Property("DateAdded"); + + b.Property("DmResponse"); + + 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.DiscordUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AvatarId"); + + b.Property("DateAdded"); + + b.Property("Discriminator"); + + b.Property("UserId"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasAlternateKey("UserId"); + + b.ToTable("DiscordUser"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Donator", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Amount"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Type"); + + b.Property("Username"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("FollowedStream"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GCChannelId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GCChannelId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.GuildConfig", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AutoAssignRoleId"); + + b.Property("AutoDeleteByeMessages"); + + b.Property("AutoDeleteByeMessagesTimer"); + + b.Property("AutoDeleteGreetMessages"); + + b.Property("AutoDeleteGreetMessagesTimer"); + + b.Property("AutoDeleteSelfAssignedRoleMessages"); + + b.Property("ByeMessageChannelId"); + + b.Property("ChannelByeMessageText"); + + b.Property("ChannelGreetMessageText"); + + b.Property("CleverbotEnabled"); + + b.Property("DateAdded"); + + b.Property("DefaultMusicVolume"); + + b.Property("DeleteMessageOnCommand"); + + b.Property("DmGreetMessageText"); + + b.Property("ExclusiveSelfAssignedRoles"); + + b.Property("FilterInvites"); + + b.Property("FilterWords"); + + b.Property("GreetMessageChannelId"); + + b.Property("GuildId"); + + b.Property("Locale"); + + b.Property("LogSettingId"); + + b.Property("MuteRoleName"); + + b.Property("PermissionRole"); + + b.Property("RootPermissionId"); + + b.Property("SendChannelByeMessage"); + + b.Property("SendChannelGreetMessage"); + + b.Property("SendDmGreetMessage"); + + b.Property("TimeZoneId"); + + 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.GuildRepeater", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("GuildId"); + + b.Property("Interval"); + + b.Property("Message"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("GuildRepeater"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.IgnoredLogChannel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ChannelId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("ChannelCreatedId"); + + b.Property("ChannelDestroyed"); + + b.Property("ChannelDestroyedId"); + + b.Property("ChannelId"); + + b.Property("ChannelUpdated"); + + b.Property("ChannelUpdatedId"); + + b.Property("DateAdded"); + + b.Property("IsLogging"); + + b.Property("LogOtherId"); + + b.Property("LogUserPresence"); + + b.Property("LogUserPresenceId"); + + b.Property("LogVoicePresence"); + + b.Property("LogVoicePresenceId"); + + b.Property("LogVoicePresenceTTSId"); + + b.Property("MessageDeleted"); + + b.Property("MessageDeletedId"); + + b.Property("MessageUpdated"); + + b.Property("MessageUpdatedId"); + + b.Property("UserBanned"); + + b.Property("UserBannedId"); + + b.Property("UserJoined"); + + b.Property("UserJoinedId"); + + b.Property("UserLeft"); + + b.Property("UserLeftId"); + + b.Property("UserMutedId"); + + b.Property("UserPresenceChannelId"); + + b.Property("UserUnbanned"); + + b.Property("UserUnbannedId"); + + b.Property("UserUpdated"); + + b.Property("UserUpdatedId"); + + 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("DateAdded"); + + 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("DateAdded"); + + b.Property("Name"); + + b.HasKey("Id"); + + b.ToTable("MusicPlaylists"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("MutedUserId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + 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.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BotConfigId"); + + b.Property("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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("DateAdded"); + + 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.SelfAssignedRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildId"); + + b.Property("RoleId"); + + b.HasKey("Id"); + + b.HasIndex("GuildId", "RoleId") + .IsUnique(); + + b.ToTable("SelfAssignableRoles"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UnmuteAt"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("UserId"); + + b.Property("type"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("PokeGame"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("RoleId"); + + b.Property("VoiceChannelId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AffinityId"); + + b.Property("ClaimerId"); + + b.Property("DateAdded"); + + b.Property("Price"); + + b.Property("WaifuId"); + + b.HasKey("Id"); + + b.HasIndex("AffinityId"); + + b.HasIndex("ClaimerId"); + + b.HasIndex("WaifuId") + .IsUnique(); + + b.ToTable("WaifuInfo"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("NewId"); + + b.Property("OldId"); + + b.Property("UpdateType"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("NewId"); + + b.HasIndex("OldId"); + + b.HasIndex("UserId"); + + b.ToTable("WaifuUpdates"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiRaidSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiRaidSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamIgnore", b => + { + b.HasOne("NadekoBot.Services.Database.Models.AntiSpamSetting") + .WithMany("IgnoredChannels") + .HasForeignKey("AntiSpamSettingId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiSpamSetting", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") + .WithOne("AntiSpamSetting") + .HasForeignKey("NadekoBot.Services.Database.Models.AntiSpamSetting", "GuildConfigId") + .OnDelete(DeleteBehavior.Cascade); + }); + + 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.CommandAlias", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandAliases") + .HasForeignKey("GuildConfigId"); + }); + + 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.CommandPrice", b => + { + b.HasOne("NadekoBot.Services.Database.Models.BotConfig") + .WithMany("CommandPrices") + .HasForeignKey("BotConfigId"); + }); + + 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.GCChannelId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GenerateCurrencyChannelIds") + .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.GuildRepeater", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("GuildRepeaters") + .HasForeignKey("GuildConfigId"); + }); + + 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") + .WithMany("ModulePrefixes") + .HasForeignKey("BotConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.MutedUserId", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("MutedUsers") + .HasForeignKey("GuildConfigId"); + }); + + 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.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + + 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"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") + .WithMany() + .HasForeignKey("AffinityId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Claimer") + .WithMany() + .HasForeignKey("ClaimerId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Waifu") + .WithOne() + .HasForeignKey("NadekoBot.Services.Database.Models.WaifuInfo", "WaifuId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuUpdate", b => + { + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "New") + .WithMany() + .HasForeignKey("NewId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Old") + .WithMany() + .HasForeignKey("OldId"); + + b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/NadekoBot/Migrations/20170320090138_command-aliasing.cs b/src/NadekoBot/Migrations/20170320090138_command-aliasing.cs new file mode 100644 index 00000000..d3ee3411 --- /dev/null +++ b/src/NadekoBot/Migrations/20170320090138_command-aliasing.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace NadekoBot.Migrations +{ + public partial class commandaliasing : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CommandAlias", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + DateAdded = table.Column(nullable: true), + GuildConfigId = table.Column(nullable: true), + Mapping = table.Column(nullable: true), + Trigger = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CommandAlias", x => x.Id); + table.ForeignKey( + name: "FK_CommandAlias_GuildConfigs_GuildConfigId", + column: x => x.GuildConfigId, + principalTable: "GuildConfigs", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_CommandAlias_GuildConfigId", + table: "CommandAlias", + column: "GuildConfigId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CommandAlias"); + } + } +} diff --git a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs index 981d53cf..18195d44 100644 --- a/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs +++ b/src/NadekoBot/Migrations/NadekoSqliteContextModelSnapshot.cs @@ -207,6 +207,26 @@ namespace NadekoBot.Migrations b.ToTable("ClashOfClans"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Mapping"); + + b.Property("Trigger"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("CommandAlias"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => { b.Property("Id") @@ -310,8 +330,12 @@ namespace NadekoBot.Migrations b.Property("Id") .ValueGeneratedOnAdd(); + b.Property("AutoDeleteTrigger"); + b.Property("DateAdded"); + b.Property("DmResponse"); + b.Property("GuildId"); b.Property("IsRegex"); @@ -764,6 +788,34 @@ namespace NadekoBot.Migrations b.ToTable("Permission"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permissionv2", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("Index"); + + b.Property("PrimaryTarget"); + + b.Property("PrimaryTargetId"); + + b.Property("SecondaryTarget"); + + b.Property("SecondaryTargetName"); + + b.Property("State"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("Permissionv2"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => { b.Property("Id") @@ -896,6 +948,26 @@ namespace NadekoBot.Migrations b.ToTable("SelfAssignableRoles"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("UnmuteAt"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("UnmuteTimer"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.UserPokeTypes", b => { b.Property("Id") @@ -915,6 +987,26 @@ namespace NadekoBot.Migrations b.ToTable("PokeGame"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateAdded"); + + b.Property("GuildConfigId"); + + b.Property("RoleId"); + + b.Property("VoiceChannelId"); + + b.HasKey("Id"); + + b.HasIndex("GuildConfigId"); + + b.ToTable("VcRoleInfo"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => { b.Property("Id") @@ -1006,6 +1098,13 @@ namespace NadekoBot.Migrations .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandAlias", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("CommandAliases") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.CommandCooldown", b => { b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") @@ -1112,6 +1211,13 @@ namespace NadekoBot.Migrations .HasForeignKey("NadekoBot.Services.Database.Models.Permission", "NextId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.Permissionv2", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("Permissions") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.PlayingStatus", b => { b.HasOne("NadekoBot.Services.Database.Models.BotConfig") @@ -1134,6 +1240,20 @@ namespace NadekoBot.Migrations .HasForeignKey("BotConfigId"); }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("UnmuteTimers") + .HasForeignKey("GuildConfigId"); + }); + + modelBuilder.Entity("NadekoBot.Services.Database.Models.VcRoleInfo", b => + { + b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") + .WithMany("VcRoleInfos") + .HasForeignKey("GuildConfigId"); + }); + modelBuilder.Entity("NadekoBot.Services.Database.Models.WaifuInfo", b => { b.HasOne("NadekoBot.Services.Database.Models.DiscordUser", "Affinity") diff --git a/src/NadekoBot/Modules/Administration/Administration.cs b/src/NadekoBot/Modules/Administration/Administration.cs index f779a751..4eb9d28c 100644 --- a/src/NadekoBot/Modules/Administration/Administration.cs +++ b/src/NadekoBot/Modules/Administration/Administration.cs @@ -11,6 +11,7 @@ using Discord.WebSocket; using NadekoBot.Services.Database.Models; using static NadekoBot.Modules.Permissions.Permissions; using System.Collections.Concurrent; +using Microsoft.EntityFrameworkCore; using NLog; namespace NadekoBot.Modules.Administration @@ -56,20 +57,12 @@ namespace NadekoBot.Modules.Administration [RequireUserPermission(GuildPermission.Administrator)] public async Task ResetPermissions() { - var channel = (ITextChannel)Context.Channel; using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.PermissionsFor(Context.Guild.Id); - config.RootPermission = Permission.GetDefaultRoot(); - var toAdd = new PermissionCache() - { - RootPermission = config.RootPermission, - PermRole = config.PermissionRole, - Verbose = config.VerbosePermissions, - }; - Cache.AddOrUpdate(channel.Guild.Id, - toAdd, (id, old) => toAdd); + var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); + config.Permissions = Permissionv2.GetDefaultPermlist; await uow.CompleteAsync(); + UpdateCache(config); } await ReplyConfirmLocalized("perms_reset").ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Administration/Commands/LocalizationCommands.cs b/src/NadekoBot/Modules/Administration/Commands/LocalizationCommands.cs index 5707429b..c8c07fe2 100644 --- a/src/NadekoBot/Modules/Administration/Commands/LocalizationCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/LocalizationCommands.cs @@ -18,14 +18,21 @@ namespace NadekoBot.Modules.Administration { private ImmutableDictionary supportedLocales { get; } = new Dictionary() { + {"zh-TW", "Chinese (Traditional), China" }, + {"zh-CN", "Chinese (Simplified), China"}, + {"nl-NL", "Dutch, Netherlands"}, {"en-US", "English, United States"}, {"fr-FR", "French, France"}, - {"ru-RU", "Russian, Russia"}, {"de-DE", "German, Germany"}, - //{"nl-NL", "Dutch, Netherlands"}, //{"ja-JP", "Japanese, Japan"}, + {"nb-NO", "Norwegian (bokmål), Norway"}, + {"pl-PL", "Polish, Poland" }, {"pt-BR", "Portuguese, Brazil"}, - //{"sr-Cyrl-RS", "Serbian, Serbia - Cyrillic"} + {"ru-RU", "Russian, Russia"}, + {"sr-Cyrl-RS", "Serbian, Serbia - Cyrillic"}, + {"es-ES", "Spanish, Spain"}, + {"sv-SE", "Swedish, Sweden"}, + {"tr-TR", "Turkish, Turkey" } }.ToImmutableDictionary(); [NadekoCommand, Usage, Description, Aliases] @@ -97,11 +104,10 @@ namespace NadekoBot.Modules.Administration } [NadekoCommand, Usage, Description, Aliases] - [OwnerOnly] public async Task LanguagesList() { await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() - .WithTitle(GetText("lang_list", "")) + .WithTitle(GetText("lang_list")) .WithDescription(string.Join("\n", supportedLocales.Select(x => $"{Format.Code(x.Key), -10} => {x.Value}")))); } diff --git a/src/NadekoBot/Modules/Administration/Commands/MuteCommands.cs b/src/NadekoBot/Modules/Administration/Commands/MuteCommands.cs index 5f67b3dd..0a130383 100644 --- a/src/NadekoBot/Modules/Administration/Commands/MuteCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/MuteCommands.cs @@ -2,13 +2,13 @@ using Discord.Commands; using Microsoft.EntityFrameworkCore; 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; using System.Threading.Tasks; namespace NadekoBot.Modules.Administration @@ -20,6 +20,8 @@ namespace NadekoBot.Modules.Administration { private static ConcurrentDictionary guildMuteRoles { get; } private static ConcurrentDictionary> mutedUsers { get; } + private static ConcurrentDictionary> unmuteTimers { get; } + = new ConcurrentDictionary>(); public static event Action UserMuted = delegate { }; public static event Action UserUnmuted = delegate { }; @@ -43,6 +45,23 @@ namespace NadekoBot.Modules.Administration v => new ConcurrentHashSet(v.MutedUsers.Select(m => m.UserId)) )); + foreach (var conf in configs) + { + foreach (var x in conf.UnmuteTimers) + { + TimeSpan after; + if (x.UnmuteAt - TimeSpan.FromMinutes(2) <= DateTime.UtcNow) + { + after = TimeSpan.FromMinutes(2); + } + else + { + after = x.UnmuteAt - DateTime.UtcNow; + } + StartUnmuteTimer(conf.GuildId, x.UserId, after); + } + } + NadekoBot.Client.UserJoined += Client_UserJoined; } @@ -67,10 +86,15 @@ namespace NadekoBot.Modules.Administration public static async Task MuteUser(IGuildUser usr) { await usr.ModifyAsync(x => x.Mute = true).ConfigureAwait(false); - await usr.AddRolesAsync(await GetMuteRole(usr.Guild)).ConfigureAwait(false); + var muteRole = await GetMuteRole(usr.Guild); + if (!usr.RoleIds.Contains(muteRole.Id)) + await usr.AddRolesAsync(muteRole).ConfigureAwait(false); + StopUnmuteTimer(usr.GuildId, usr.Id); using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.For(usr.Guild.Id, set => set.Include(gc => gc.MutedUsers)); + var config = uow.GuildConfigs.For(usr.Guild.Id, + set => set.Include(gc => gc.MutedUsers) + .Include(gc => gc.UnmuteTimers)); config.MutedUsers.Add(new MutedUserId() { UserId = usr.Id @@ -78,7 +102,9 @@ namespace NadekoBot.Modules.Administration ConcurrentHashSet muted; if (mutedUsers.TryGetValue(usr.Guild.Id, out muted)) muted.Add(usr.Id); - + + config.UnmuteTimers.RemoveWhere(x => x.UserId == usr.Id); + await uow.CompleteAsync().ConfigureAwait(false); } UserMuted(usr, MuteType.All); @@ -86,11 +112,13 @@ namespace NadekoBot.Modules.Administration public static async Task UnmuteUser(IGuildUser usr) { - await usr.ModifyAsync(x => x.Mute = false).ConfigureAwait(false); - await usr.RemoveRolesAsync(await GetMuteRole(usr.Guild)).ConfigureAwait(false); + StopUnmuteTimer(usr.GuildId, usr.Id); + try { await usr.ModifyAsync(x => x.Mute = false).ConfigureAwait(false); } catch { } + try { await usr.RemoveRolesAsync(await GetMuteRole(usr.Guild)).ConfigureAwait(false); } catch { /*ignore*/ } using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.For(usr.Guild.Id, set => set.Include(gc => gc.MutedUsers)); + var config = uow.GuildConfigs.For(usr.Guild.Id, set => set.Include(gc => gc.MutedUsers) + .Include(gc => gc.UnmuteTimers)); config.MutedUsers.Remove(new MutedUserId() { UserId = usr.Id @@ -98,6 +126,9 @@ namespace NadekoBot.Modules.Administration ConcurrentHashSet muted; if (mutedUsers.TryGetValue(usr.Guild.Id, out muted)) muted.TryRemove(usr.Id); + + config.UnmuteTimers.RemoveWhere(x => x.UserId == usr.Id); + await uow.CompleteAsync().ConfigureAwait(false); } UserUnmuted(usr, MuteType.All); @@ -139,6 +170,79 @@ namespace NadekoBot.Modules.Administration return muteRole; } + public static async Task TimedMute(IGuildUser user, TimeSpan after) + { + await MuteUser(user).ConfigureAwait(false); // mute the user. This will also remove any previous unmute timers + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(user.GuildId, set => set.Include(x => x.UnmuteTimers)); + config.UnmuteTimers.Add(new UnmuteTimer() + { + UserId = user.Id, + UnmuteAt = DateTime.UtcNow + after, + }); // add teh unmute timer to the database + uow.Complete(); + } + StartUnmuteTimer(user.GuildId, user.Id, after); // start the timer + } + + public static void StartUnmuteTimer(ulong guildId, ulong userId, TimeSpan after) + { + //load the unmute timers for this guild + var userUnmuteTimers = unmuteTimers.GetOrAdd(guildId, new ConcurrentDictionary()); + + //unmute timer to be added + var toAdd = new Timer(async _ => + { + try + { + var guild = NadekoBot.Client.GetGuild(guildId); // load the guild + if (guild == null) + { + RemoveUnmuteTimerFromDb(guildId, userId); + return; // if guild can't be found, just remove the timer from db + } + // unmute the user, this will also remove the timer from the db + await UnmuteUser(guild.GetUser(userId)).ConfigureAwait(false); + } + catch (Exception ex) + { + RemoveUnmuteTimerFromDb(guildId, userId); // if unmute errored, just remove unmute from db + Administration._log.Warn("Couldn't unmute user {0} in guild {1}", userId, guildId); + Administration._log.Warn(ex); + } + }, null, after, Timeout.InfiniteTimeSpan); + + //add it, or stop the old one and add this one + userUnmuteTimers.AddOrUpdate(userId, (key) => toAdd, (key, old) => + { + old.Change(Timeout.Infinite, Timeout.Infinite); + return toAdd; + }); + } + + public static void StopUnmuteTimer(ulong guildId, ulong userId) + { + ConcurrentDictionary userUnmuteTimers; + if (!unmuteTimers.TryGetValue(guildId, out userUnmuteTimers)) return; + + Timer removed; + if(userUnmuteTimers.TryRemove(userId, out removed)) + { + removed.Change(Timeout.Infinite, Timeout.Infinite); + } + } + + private static void RemoveUnmuteTimerFromDb(ulong guildId, ulong userId) + { + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(guildId, set => set.Include(x => x.UnmuteTimers)); + config.UnmuteTimers.RemoveWhere(x => x.UserId == userId); + uow.Complete(); + } + } + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] @@ -170,6 +274,7 @@ namespace NadekoBot.Modules.Administration [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.MuteMembers)] + [Priority(1)] public async Task Mute(IGuildUser user) { try @@ -183,6 +288,27 @@ namespace NadekoBot.Modules.Administration } } + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + [RequireUserPermission(GuildPermission.ManageRoles)] + [RequireUserPermission(GuildPermission.MuteMembers)] + [Priority(0)] + public async Task Mute(int minutes, IGuildUser user) + { + if (minutes < 1 || minutes > 1440) + return; + try + { + await TimedMute(user, TimeSpan.FromMinutes(minutes)).ConfigureAwait(false); + await ReplyConfirmLocalized("user_muted_time", Format.Bold(user.ToString()), minutes).ConfigureAwait(false); + } + catch (Exception ex) + { + _log.Warn(ex); + await ReplyErrorLocalized("mute_error").ConfigureAwait(false); + } + } + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] [RequireUserPermission(GuildPermission.ManageRoles)] diff --git a/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs b/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs index 8e2bd691..af7269c9 100644 --- a/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/ProtectionCommands.cs @@ -46,16 +46,18 @@ namespace NadekoBot.Modules.Administration LastMessage = msg.ToUpperInvariant(); } - public void ApplyNextMessage(string message) + public void ApplyNextMessage(IUserMessage message) { - var upperMsg = message.ToUpperInvariant(); - if (upperMsg == LastMessage) - Count++; - else + var upperMsg = message.Content.ToUpperInvariant(); + if (upperMsg != LastMessage || (string.IsNullOrWhiteSpace(upperMsg) && message.Attachments.Any())) { LastMessage = upperMsg; Count = 0; } + else + { + Count++; + } } } @@ -113,7 +115,7 @@ namespace NadekoBot.Modules.Administration var stats = spamSettings.UserStats.AddOrUpdate(msg.Author.Id, new UserSpamStats(msg.Content), (id, old) => { - old.ApplyNextMessage(msg.Content); return old; + old.ApplyNextMessage(msg); return old; }); if (stats.Count >= spamSettings.AntiSpamSettings.MessageThreshold) diff --git a/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs b/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs index 7fd35dfc..6ac60f21 100644 --- a/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/SelfAssignedRolesCommand.cs @@ -150,11 +150,11 @@ namespace NadekoBot.Modules.Administration var guildUser = (IGuildUser)Context.User; GuildConfig conf; - IEnumerable roles; + SelfAssignedRole[] roles; using (var uow = DbHandler.UnitOfWork()) { conf = uow.GuildConfigs.For(Context.Guild.Id, set => set); - roles = uow.SelfAssignedRoles.GetFromGuild(Context.Guild.Id); + roles = uow.SelfAssignedRoles.GetFromGuild(Context.Guild.Id).ToArray(); } if (roles.FirstOrDefault(r=>r.RoleId == role.Id) == null) { @@ -167,14 +167,21 @@ namespace NadekoBot.Modules.Administration return; } + var roleIds = roles.Select(x => x.RoleId).ToArray(); if (conf.ExclusiveSelfAssignedRoles) { - var sameRoleId = guildUser.RoleIds.FirstOrDefault(r => roles.Select(sar => sar.RoleId).Contains(r)); - var sameRole = Context.Guild.GetRole(sameRoleId); + var sameRoleId = guildUser.RoleIds.FirstOrDefault(r => roleIds.Contains(r)); + if (sameRoleId != default(ulong)) { - await ReplyErrorLocalized("self_assign_already_excl", Format.Bold(sameRole?.Name)).ConfigureAwait(false); - return; + var sameRole = Context.Guild.GetRole(sameRoleId); + if (sameRole != null) + { + await guildUser.RemoveRolesAsync(sameRole).ConfigureAwait(false); + await Task.Delay(500).ConfigureAwait(false); + } + //await ReplyErrorLocalized("self_assign_already_excl", Format.Bold(sameRole?.Name)).ConfigureAwait(false); + //return; } } try diff --git a/src/NadekoBot/Modules/Administration/Commands/VcRoleCommands.cs b/src/NadekoBot/Modules/Administration/Commands/VcRoleCommands.cs new file mode 100644 index 00000000..672d85f9 --- /dev/null +++ b/src/NadekoBot/Modules/Administration/Commands/VcRoleCommands.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using Discord; +using Discord.Commands; +using NadekoBot.Attributes; +using System.Threading.Tasks; +using Discord.WebSocket; +using Microsoft.EntityFrameworkCore; +using NadekoBot.Extensions; +using NadekoBot.Services; +using NadekoBot.Services.Database.Models; + +namespace NadekoBot.Modules.Administration +{ + public partial class Administration + { + [Group] + public class VcRoleCommands : NadekoSubmodule + { + private static ConcurrentDictionary> vcRoles { get; } + + static VcRoleCommands() + { + NadekoBot.Client.UserVoiceStateUpdated += ClientOnUserVoiceStateUpdated; + vcRoles = new ConcurrentDictionary>(); + foreach (var gconf in NadekoBot.AllGuildConfigs) + { + var g = NadekoBot.Client.GetGuild(gconf.GuildId); + if (g == null) + continue; //todo delete everything from db if guild doesn't exist? + + var infos = new ConcurrentDictionary(); + vcRoles.TryAdd(gconf.GuildId, infos); + foreach (var ri in gconf.VcRoleInfos) + { + var role = g.GetRole(ri.RoleId); + if (role == null) + continue; //todo remove this entry from db + + infos.TryAdd(ri.VoiceChannelId, role); + } + } + } + + private static Task ClientOnUserVoiceStateUpdated(SocketUser usr, SocketVoiceState oldState, + SocketVoiceState newState) + { + + var gusr = usr as SocketGuildUser; + if (gusr == null) + return Task.CompletedTask; + + var oldVc = oldState.VoiceChannel; + var newVc = newState.VoiceChannel; + var _ = Task.Run(async () => + { + try + { + if (oldVc != newVc) + { + ulong guildId; + guildId = newVc?.Guild.Id ?? oldVc.Guild.Id; + + ConcurrentDictionary guildVcRoles; + if (vcRoles.TryGetValue(guildId, out guildVcRoles)) + { + IRole role; + //remove old + if (oldVc != null && guildVcRoles.TryGetValue(oldVc.Id, out role)) + { + if (gusr.RoleIds.Contains(role.Id)) + { + try + { + await gusr.RemoveRolesAsync(role).ConfigureAwait(false); + await Task.Delay(500).ConfigureAwait(false); + } + catch + { + await Task.Delay(200).ConfigureAwait(false); + await gusr.RemoveRolesAsync(role).ConfigureAwait(false); + await Task.Delay(500).ConfigureAwait(false); + } + } + } + //add new + if (newVc != null && guildVcRoles.TryGetValue(newVc.Id, out role)) + { + if (!gusr.RoleIds.Contains(role.Id)) + await gusr.AddRolesAsync(role).ConfigureAwait(false); + } + + } + } + } + catch (Exception ex) + { + Administration._log.Warn(ex); + } + }); + return Task.CompletedTask; + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireUserPermission(GuildPermission.ManageRoles)] + [RequireUserPermission(GuildPermission.ManageChannels)] + [RequireBotPermission(GuildPermission.ManageRoles)] + // todo wait for the fix [RequireBotPermission(GuildPermission.ManageChannels)] + [RequireContext(ContextType.Guild)] + public async Task VcRole([Remainder]IRole role = null) + { + var user = (IGuildUser) Context.User; + + var vc = user.VoiceChannel; + + if (vc == null || vc.GuildId != user.GuildId) + { + await ReplyErrorLocalized("must_be_in_voice").ConfigureAwait(false); + return; + } + + var guildVcRoles = vcRoles.GetOrAdd(user.GuildId, new ConcurrentDictionary()); + + if (role == null) + { + if (guildVcRoles.TryRemove(vc.Id, out role)) + { + await ReplyConfirmLocalized("vcrole_removed", Format.Bold(vc.Name)).ConfigureAwait(false); + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.VcRoleInfos)); + conf.VcRoleInfos.RemoveWhere(x => x.VoiceChannelId == vc.Id); + uow.Complete(); + } + } + } + else + { + guildVcRoles.AddOrUpdate(vc.Id, role, (key, old) => role); + using (var uow = DbHandler.UnitOfWork()) + { + var conf = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.VcRoleInfos)); + conf.VcRoleInfos.RemoveWhere(x => x.VoiceChannelId == vc.Id); // remove old one + conf.VcRoleInfos.Add(new VcRoleInfo() + { + VoiceChannelId = vc.Id, + RoleId = role.Id, + }); // add new one + uow.Complete(); + } + await ReplyConfirmLocalized("vcrole_added", Format.Bold(vc.Name), Format.Bold(role.Name)).ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task VcRoleList() + { + var guild = (SocketGuild) Context.Guild; + string text; + ConcurrentDictionary roles; + if (vcRoles.TryGetValue(Context.Guild.Id, out roles)) + { + if (!roles.Any()) + { + text = GetText("no_vcroles"); + } + else + { + text = string.Join("\n", roles.Select(x => + $"{Format.Bold(guild.GetVoiceChannel(x.Key)?.Name ?? x.Key.ToString())} => {x.Value}")); + } + } + else + { + text = GetText("no_vcroles"); + } + await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() + .WithTitle(GetText("vc_role_list")) + .WithDescription(text)) + .ConfigureAwait(false); + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs index 7302b09d..b7a7b326 100644 --- a/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/VoicePlusTextCommands.cs @@ -166,7 +166,7 @@ namespace NadekoBot.Modules.Administration var botUser = await guild.GetCurrentUserAsync().ConfigureAwait(false); if (!botUser.GuildPermissions.ManageRoles || !botUser.GuildPermissions.ManageChannels) { - await ReplyErrorLocalized("vt_no_perms").ConfigureAwait(false); + await ReplyErrorLocalized("vt_perms").ConfigureAwait(false); return; } diff --git a/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs index efd3717e..024e79b5 100644 --- a/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs +++ b/src/NadekoBot/Modules/CustomReactions/CustomReactions.cs @@ -11,11 +11,27 @@ using NLog; using System.Diagnostics; using Discord.WebSocket; using System; -using Newtonsoft.Json; using NadekoBot.DataStructures; namespace NadekoBot.Modules.CustomReactions { + public static class CustomReactionExtensions + { + public static async Task Send(this CustomReaction cr, IUserMessage context) + { + var channel = cr.DmResponse ? await context.Author.CreateDMChannelAsync() : context.Channel; + + CustomReactions.ReactionStats.AddOrUpdate(cr.Trigger, 1, (k, old) => ++old); + + CREmbed crembed; + if (CREmbed.TryParse(cr.Response, out crembed)) + { + return await channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? ""); + } + return await channel.SendMessageAsync(cr.ResponseWithContext(context)); + } + } + [NadekoModule("CustomReactions", ".")] public class CustomReactions : NadekoTopLevelModule { @@ -25,7 +41,7 @@ namespace NadekoBot.Modules.CustomReactions public static ConcurrentDictionary ReactionStats { get; } = new ConcurrentDictionary(); - private static new readonly Logger _log; + private new static readonly Logger _log; static CustomReactions() { @@ -43,11 +59,11 @@ namespace NadekoBot.Modules.CustomReactions public void ClearStats() => ReactionStats.Clear(); - public static async Task TryExecuteCustomReaction(SocketUserMessage umsg) + public static CustomReaction TryGetCustomReaction(SocketUserMessage umsg) { var channel = umsg.Channel as SocketTextChannel; if (channel == null) - return false; + return null; var content = umsg.Content.Trim().ToLowerInvariant(); CustomReaction[] reactions; @@ -70,26 +86,9 @@ namespace NadekoBot.Modules.CustomReactions var reaction = rs[new NadekoRandom().Next(0, rs.Length)]; if (reaction != null) { - if (reaction.Response != "-") - { - CREmbed crembed; - if (CREmbed.TryParse(reaction.Response, out crembed)) - { - try { await channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? "").ConfigureAwait(false); } - catch (Exception ex) - { - _log.Warn("Sending CREmbed failed"); - _log.Warn(ex); - } - } - else - { - try { await channel.SendMessageAsync(reaction.ResponseWithContext(umsg)).ConfigureAwait(false); } catch { } - } - } - - ReactionStats.AddOrUpdate(reaction.Trigger, 1, (k, old) => ++old); - return true; + if (reaction.Response == "-") + return null; + return reaction; } } } @@ -103,29 +102,10 @@ namespace NadekoBot.Modules.CustomReactions return ((hasTarget && content.StartsWith(trigger + " ")) || content == trigger); }).ToArray(); if (grs.Length == 0) - return false; + return null; var greaction = grs[new NadekoRandom().Next(0, grs.Length)]; - if (greaction != null) - { - CREmbed crembed; - if (CREmbed.TryParse(greaction.Response, out crembed)) - { - try { await channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? "").ConfigureAwait(false); } - catch (Exception ex) - { - _log.Warn("Sending CREmbed failed"); - _log.Warn(ex); - } - } - else - { - try { await channel.SendMessageAsync(greaction.ResponseWithContext(umsg)).ConfigureAwait(false); } catch { } - } - ReactionStats.AddOrUpdate(greaction.Trigger, 1, (k, old) => ++old); - return true; - } - return false; + return greaction; } [NadekoCommand, Usage, Description, Aliases] @@ -359,6 +339,108 @@ namespace NadekoBot.Modules.CustomReactions } } + [NadekoCommand, Usage, Description, Aliases] + public async Task CrDm(int id) + { + if ((Context.Guild == null && !NadekoBot.Credentials.IsOwner(Context.User)) || + (Context.Guild != null && !((IGuildUser)Context.User).GuildPermissions.Administrator)) + { + await ReplyErrorLocalized("insuff_perms").ConfigureAwait(false); + return; + } + + CustomReaction[] reactions = new CustomReaction[0]; + + if (Context.Guild == null) + reactions = GlobalReactions; + else + { + GuildReactions.TryGetValue(Context.Guild.Id, out reactions); + } + if (reactions.Any()) + { + var reaction = reactions.FirstOrDefault(x => x.Id == id); + + if (reaction == null) + { + await ReplyErrorLocalized("no_found_id").ConfigureAwait(false); + return; + } + + var setValue = reaction.DmResponse = !reaction.DmResponse; + + using (var uow = DbHandler.UnitOfWork()) + { + uow.CustomReactions.Get(id).DmResponse = setValue; + uow.Complete(); + } + + if (setValue) + { + await ReplyConfirmLocalized("crdm_enabled", Format.Code(reaction.Id.ToString())).ConfigureAwait(false); + } + else + { + await ReplyConfirmLocalized("crdm_disabled", Format.Code(reaction.Id.ToString())).ConfigureAwait(false); + } + } + else + { + await ReplyErrorLocalized("no_found").ConfigureAwait(false); + } + } + + [NadekoCommand, Usage, Description, Aliases] + public async Task CrAd(int id) + { + if ((Context.Guild == null && !NadekoBot.Credentials.IsOwner(Context.User)) || + (Context.Guild != null && !((IGuildUser)Context.User).GuildPermissions.Administrator)) + { + await ReplyErrorLocalized("insuff_perms").ConfigureAwait(false); + return; + } + + CustomReaction[] reactions = new CustomReaction[0]; + + if (Context.Guild == null) + reactions = GlobalReactions; + else + { + GuildReactions.TryGetValue(Context.Guild.Id, out reactions); + } + if (reactions.Any()) + { + var reaction = reactions.FirstOrDefault(x => x.Id == id); + + if (reaction == null) + { + await ReplyErrorLocalized("no_found_id").ConfigureAwait(false); + return; + } + + var setValue = reaction.AutoDeleteTrigger = !reaction.AutoDeleteTrigger; + + using (var uow = DbHandler.UnitOfWork()) + { + uow.CustomReactions.Get(id).AutoDeleteTrigger = setValue; + uow.Complete(); + } + + if (setValue) + { + await ReplyConfirmLocalized("crad_enabled", Format.Code(reaction.Id.ToString())).ConfigureAwait(false); + } + else + { + await ReplyConfirmLocalized("crad_disabled", Format.Code(reaction.Id.ToString())).ConfigureAwait(false); + } + } + else + { + await ReplyErrorLocalized("no_found").ConfigureAwait(false); + } + } + [NadekoCommand, Usage, Description, Aliases] [OwnerOnly] public async Task CrStatsClear(string trigger = null) diff --git a/src/NadekoBot/Modules/Gambling/Commands/Lucky7Commands.cs b/src/NadekoBot/Modules/Gambling/Commands/Lucky7Commands.cs new file mode 100644 index 00000000..04120aa6 --- /dev/null +++ b/src/NadekoBot/Modules/Gambling/Commands/Lucky7Commands.cs @@ -0,0 +1,197 @@ +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord.Commands; +using Discord; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Services; + +namespace NadekoBot.Modules.Gambling +{ + //public partial class Gambling + //{ + // [Group] + // public class Lucky7Commands : NadekoSubmodule + // { + // [NadekoCommand, Usage, Description, Aliases] + // [RequireContext(ContextType.Guild)] + // [OwnerOnly] + // public async Task Lucky7Test(uint tests) + // { + // if (tests <= 0) + // return; + + // var dict = new Dictionary(); + // var totalWon = 0; + // for (var i = 0; i < tests; i++) + // { + // var g = new Lucky7Game(10); + // while (!g.Ended) + // { + // if (g.CurrentPosition == 0) + // g.Stay(); + // else + // g.Move(); + // } + // totalWon += (int)(g.CurrentMultiplier * g.Bet); + // if (!dict.ContainsKey(g.CurrentMultiplier)) + // dict.Add(g.CurrentMultiplier, 0); + + // dict[g.CurrentMultiplier] ++; + + // } + + // await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() + // .WithTitle("Move Or Stay test") + // .WithDescription(string.Join("\n", + // dict.Select(x => $"x{x.Key} occured {x.Value} times {x.Value * 1.0f / tests * 100:F2}%"))) + // .WithFooter( + // efb => efb.WithText($"Total Bet: {tests * 10} | Payout: {totalWon} | {totalWon *1.0f / tests * 10}%"))); + // } + + // private static readonly ConcurrentDictionary _games = + // new ConcurrentDictionary(); + + // [NadekoCommand, Usage, Description, Aliases] + // [RequireContext(ContextType.Guild)] + // public async Task Lucky7(int bet) + // { + // if (bet < 4) + // return; + // var game = new Lucky7Game(bet); + // if (!_games.TryAdd(Context.User.Id, game)) + // { + // await ReplyAsync("You're already betting on move or stay.").ConfigureAwait(false); + // return; + // } + + // if (!await CurrencyHandler.RemoveCurrencyAsync(Context.User, "MoveOrStay bet", bet, false)) + // { + // _games.TryRemove(Context.User.Id, out game); + // await ReplyConfirmLocalized("not_enough", CurrencySign).ConfigureAwait(false); + // return; + // } + // await Context.Channel.EmbedAsync(GetGameState(game), + // string.Format("{0} rolled {1}.", Context.User, game.Rolled)).ConfigureAwait(false); + // } + + // public enum MoveOrStay + // { + // Move = 1, + // M = 1, + // Stay = 2, + // S = 2 + // } + + // [NadekoCommand, Usage, Description, Aliases] + // [RequireContext(ContextType.Guild)] + // public async Task Lucky7(MoveOrStay action) + // { + // Lucky7Game game; + // if (!_games.TryGetValue(Context.User.Id, out game)) + // { + // await ReplyAsync("You're not betting on move or stay.").ConfigureAwait(false); + // return; + // } + + // if (action == MoveOrStay.Move) + // { + // game.Move(); + // await Context.Channel.EmbedAsync(GetGameState(game), + // string.Format("{0} rolled {1}.", Context.User, game.Rolled)).ConfigureAwait(false); + // if (game.Ended) + // _games.TryRemove(Context.User.Id, out game); + // } + // else if (action == MoveOrStay.Stay) + // { + // var won = game.Stay(); + // await CurrencyHandler.AddCurrencyAsync(Context.User, "MoveOrStay stay", won, false) + // .ConfigureAwait(false); + // _games.TryRemove(Context.User.Id, out game); + // await ReplyAsync(string.Format("You've finished with {0}", + // won + CurrencySign)) + // .ConfigureAwait(false); + // } + + + // } + + // private EmbedBuilder GetGameState(Lucky7Game game) + // { + // var arr = Lucky7Game.Winnings.ToArray(); + // var sb = new StringBuilder(); + // for (var i = 0; i < arr.Length; i++) + // { + // if (i == game.CurrentPosition) + // { + // sb.Append("[" + arr[i] + "]"); + // } + // else + // { + // sb.Append(arr[i].ToString()); + // } + + // if (i != arr.Length - 1) + // sb.Append(' '); + // } + + // return new EmbedBuilder().WithOkColor() + // .WithTitle("Lucky7") + // .WithDescription(sb.ToString()) + // .AddField(efb => efb.WithName("Bet") + // .WithValue(game.Bet.ToString()) + // .WithIsInline(true)) + // .AddField(efb => efb.WithName("Current Value") + // .WithValue((game.CurrentMultiplier * game.Bet).ToString(_cultureInfo)) + // .WithIsInline(true)); + // } + // } + + // public class Lucky7Game + // { + // public int Bet { get; } + // public bool Ended { get; private set; } + // public int PreviousPosition { get; private set; } + // public int CurrentPosition { get; private set; } = -1; + // public int Rolled { get; private set; } + // public float CurrentMultiplier => Winnings[CurrentPosition]; + // private readonly NadekoRandom _rng = new NadekoRandom(); + + // public static readonly ImmutableArray Winnings = new[] + // { + // 1.2f, 0.8f, 0.75f, 0.90f, 0.7f, 0.5f, 1.8f, 0f, 0f + // }.ToImmutableArray(); + + // public Lucky7Game(int bet) + // { + // Bet = bet; + // Move(); + // } + + // public void Move() + // { + // if (Ended) + // return; + // PreviousPosition = CurrentPosition; + // Rolled = _rng.Next(1, 4); + // CurrentPosition += Rolled; + + // if (CurrentPosition >= 6) + // Ended = true; + // } + + // public int Stay() + // { + // if (Ended) + // return 0; + + // Ended = true; + // return (int) (CurrentMultiplier * Bet); + // } + // } + //} +} diff --git a/src/NadekoBot/Modules/Gambling/Commands/Slots.cs b/src/NadekoBot/Modules/Gambling/Commands/Slots.cs index ea20b4b1..79dbe75a 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/Slots.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/Slots.cs @@ -223,7 +223,7 @@ namespace NadekoBot.Modules.Gambling { var _ = Task.Run(async () => { - await Task.Delay(2000); + await Task.Delay(1500); _runningUsers.Remove(Context.User.Id); }); } diff --git a/src/NadekoBot/Modules/Gambling/Commands/WaifuClaimCommands.cs b/src/NadekoBot/Modules/Gambling/Commands/WaifuClaimCommands.cs index 7f3e4b03..c1d16578 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/WaifuClaimCommands.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/WaifuClaimCommands.cs @@ -395,7 +395,7 @@ namespace NadekoBot.Modules.Gambling target = Context.User; WaifuInfo w; IList claims; - int divorces = 0; + int divorces; using (var uow = DbHandler.UnitOfWork()) { w = uow.Waifus.ByWaifuUserId(target.Id); @@ -434,7 +434,7 @@ namespace NadekoBot.Modules.Gambling .AddField(efb => efb.WithName(GetText("likes")).WithValue(w.Affinity?.ToString() ?? nobody).WithIsInline(true)) .AddField(efb => efb.WithName(GetText("changes_of_heart")).WithValue($"{affInfo.Count} - \"the {affInfo.Title}\"").WithIsInline(true)) .AddField(efb => efb.WithName(GetText("divorces")).WithValue(divorces.ToString()).WithIsInline(true)) - .AddField(efb => efb.WithName($"Waifus ({claims.Count})").WithValue(claims.Count == 0 ? nobody : string.Join("\n", claims.OrderBy(x => rng.Next()).Take(40).Select(x => x.Waifu))).WithIsInline(true)); + .AddField(efb => efb.WithName($"Waifus ({claims.Count})").WithValue(claims.Count == 0 ? nobody : string.Join("\n", claims.OrderBy(x => rng.Next()).Take(30).Select(x => x.Waifu))).WithIsInline(true)); await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); } @@ -494,7 +494,10 @@ namespace NadekoBot.Modules.Gambling int count; using (var uow = DbHandler.UnitOfWork()) { - count = uow._context.WaifuUpdates.Count(w => w.User.UserId == userId && w.UpdateType == WaifuUpdateType.AffinityChanged); + count = uow._context.WaifuUpdates + .Where(w => w.User.UserId == userId && w.UpdateType == WaifuUpdateType.AffinityChanged && w.New != null) + .GroupBy(x => x.New) + .Count(); } AffinityTitles title; diff --git a/src/NadekoBot/Modules/Gambling/Gambling.cs b/src/NadekoBot/Modules/Gambling/Gambling.cs index 0db8e198..760f8156 100644 --- a/src/NadekoBot/Modules/Gambling/Gambling.cs +++ b/src/NadekoBot/Modules/Gambling/Gambling.cs @@ -244,19 +244,26 @@ namespace NadekoBot.Modules.Gambling } [NadekoCommand, Usage, Description, Aliases] - public async Task Leaderboard() + public async Task Leaderboard(int page = 1) { List richest; using (var uow = DbHandler.UnitOfWork()) { - richest = uow.Currency.GetTopRichest(9).ToList(); + richest = uow.Currency.GetTopRichest(9, 9 * (page - 1)).ToList(); } - if (!richest.Any()) - return; var embed = new EmbedBuilder() .WithOkColor() - .WithTitle(NadekoBot.BotConfig.CurrencySign + " " + GetText("leaderboard")); + .WithTitle(NadekoBot.BotConfig.CurrencySign + + " " + GetText("leaderboard")) + .WithFooter(efb => efb.WithText(GetText("page", page))); + + if (!richest.Any()) + { + embed.WithDescription(GetText("no_users_found")); + await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); + return; + } for (var i = 0; i < richest.Count; i++) { @@ -267,7 +274,7 @@ namespace NadekoBot.Modules.Gambling : usr.Username?.TrimTo(20, true); var j = i; - embed.AddField(efb => efb.WithName("#" + (j + 1) + " " + usrStr) + embed.AddField(efb => efb.WithName("#" + (9 * (page - 1) + j + 1) + " " + usrStr) .WithValue(x.Amount.ToString() + " " + NadekoBot.BotConfig.CurrencySign) .WithIsInline(true)); } diff --git a/src/NadekoBot/Modules/Games/Commands/CleverBotCommands.cs b/src/NadekoBot/Modules/Games/Commands/CleverBotCommands.cs index fa04a2c6..0e85e4b0 100644 --- a/src/NadekoBot/Modules/Games/Commands/CleverBotCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/CleverBotCommands.cs @@ -5,12 +5,15 @@ using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Services; using NLog; -using Services.CleverBotApi; +//using Services.CleverBotApi; using System; using System.Collections.Concurrent; using System.Diagnostics; using System.Linq; +using System.Net.Http; using System.Threading.Tasks; +using Newtonsoft.Json; +using Services.CleverBotApi; namespace NadekoBot.Modules.Games { @@ -27,13 +30,11 @@ namespace NadekoBot.Modules.Games { _log = LogManager.GetCurrentClassLogger(); var sw = Stopwatch.StartNew(); - - var bot = ChatterBotFactory.Create(ChatterBotType.CLEVERBOT); CleverbotGuilds = new ConcurrentDictionary>( NadekoBot.AllGuildConfigs .Where(gc => gc.CleverbotEnabled) - .ToDictionary(gc => gc.GuildId, gc => new Lazy(() => bot.CreateSession(), true))); + .ToDictionary(gc => gc.GuildId, gc => new Lazy(() => new ChatterBotSession(gc.GuildId), true))); sw.Stop(); _log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s"); @@ -100,9 +101,7 @@ namespace NadekoBot.Modules.Games return; } - var cleverbot = ChatterBotFactory.Create(ChatterBotType.CLEVERBOT); - - CleverbotGuilds.TryAdd(channel.Guild.Id, new Lazy(() => cleverbot.CreateSession(), true)); + CleverbotGuilds.TryAdd(channel.Guild.Id, new Lazy(() => new ChatterBotSession(Context.Guild.Id), true)); using (var uow = DbHandler.UnitOfWork()) { @@ -113,5 +112,42 @@ namespace NadekoBot.Modules.Games await ReplyConfirmLocalized("cleverbot_enabled").ConfigureAwait(false); } } + + public class ChatterBotSession + { + private static NadekoRandom rng { get; } = new NadekoRandom(); + public string ChatterbotId { get; } + public string ChannelId { get; } + private int _botId = 6; + + public ChatterBotSession(ulong channelId) + { + ChannelId = channelId.ToString().ToBase64(); + ChatterbotId = rng.Next(0, 1000000).ToString().ToBase64(); + } + + private string apiEndpoint => "http://api.program-o.com/v2/chatbot/" + + $"?bot_id={_botId}&" + + "say={0}&" + + $"convo_id=nadekobot_{ChatterbotId}_{ChannelId}&" + + "format=json"; + + public async Task Think(string message) + { + using (var http = new HttpClient()) + { + var res = await http.GetStringAsync(string.Format(apiEndpoint, message)).ConfigureAwait(false); + var cbr = JsonConvert.DeserializeObject(res); + //Console.WriteLine(cbr.Convo_id); + return cbr.BotSay.Replace("
", "\n"); + } + } + } + + public class ChatterBotResponse + { + public string Convo_id { get; set; } + public string BotSay { get; set; } + } } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs index 42fea1a4..7c081289 100644 --- a/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PlantAndPickCommands.cs @@ -81,8 +81,10 @@ namespace NadekoBot.Modules.Games var msgs = new IUserMessage[dropAmount]; var prefix = NadekoBot.ModulePrefixes[typeof(Games).Name]; var toSend = dropAmount == 1 - ? GetLocalText(channel, "curgen_sn", NadekoBot.BotConfig.CurrencySign, prefix) - : GetLocalText(channel, "curgen_pl", dropAmount, NadekoBot.BotConfig.CurrencySign, prefix); + ? GetLocalText(channel, "curgen_sn", NadekoBot.BotConfig.CurrencySign) + + GetLocalText(channel, "pick_sn", prefix) + : GetLocalText(channel, "curgen_pl", dropAmount, NadekoBot.BotConfig.CurrencySign) + + GetLocalText(channel, "pick_pl", prefix); var file = GetRandomCurrencyImage(); using (var fileStream = file.Value.ToStream()) { @@ -155,10 +157,15 @@ namespace NadekoBot.Modules.Games //and then var msgToSend = GetText("planted", - Format.Bold(Context.User.ToString()), - amount + NadekoBot.BotConfig.CurrencySign, + Format.Bold(Context.User.ToString()), + amount + NadekoBot.BotConfig.CurrencySign, Prefix); + if (amount > 1) + msgToSend += " " + GetText("pick_pl", Prefix); + else + msgToSend += " " + GetText("pick_sn", Prefix); + IUserMessage msg; using (var toSend = imgData.Value.ToStream()) { diff --git a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs index de81fdec..5e18ff44 100644 --- a/src/NadekoBot/Modules/Games/Commands/PollCommands.cs +++ b/src/NadekoBot/Modules/Games/Commands/PollCommands.cs @@ -1,4 +1,5 @@ -using Discord; +using System; +using Discord; using Discord.Commands; using Discord.WebSocket; using NadekoBot.Attributes; @@ -8,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using ImageSharp.Processing; namespace NadekoBot.Modules.Games { @@ -39,7 +41,7 @@ namespace NadekoBot.Modules.Games if (!ActivePolls.TryGetValue(Context.Guild.Id, out poll)) return; - await Context.Channel.EmbedAsync(poll.GetStats("Current Poll Results")); + await Context.Channel.EmbedAsync(poll.GetStats(GetText("current_poll_results"))); } private async Task InternalStartPoll(string arg, bool isPublic = false) @@ -58,7 +60,7 @@ namespace NadekoBot.Modules.Games await poll.StartPoll().ConfigureAwait(false); } else - await channel.SendErrorAsync("Poll is already running on this server.").ConfigureAwait(false); + await ReplyErrorLocalized("poll_already_running").ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] @@ -108,21 +110,24 @@ namespace NadekoBot.Modules.Games var totalVotesCast = 0; if (results.Length == 0) { - sb.AppendLine("No votes cast."); + sb.AppendLine(GetText("no_votes_cast")); } else { for (int i = 0; i < results.Length; i++) { var result = results[i]; - sb.AppendLine($"`{i + 1}.` {Format.Bold(answers[result.Key - 1])} with {Format.Bold(result.Value.ToString())} votes."); + sb.AppendLine(GetText("poll_result", + result.Key, + Format.Bold(answers[result.Key - 1]), + Format.Bold(result.Value.ToString()))); totalVotesCast += result.Value; } } eb.WithDescription(sb.ToString()) - .WithFooter(efb => efb.WithText(totalVotesCast + " total votes cast.")); + .WithFooter(efb => efb.WithText(GetText("x_votes_cast", totalVotesCast))); return eb; } @@ -130,13 +135,13 @@ namespace NadekoBot.Modules.Games public async Task StartPoll() { NadekoBot.Client.MessageReceived += Vote; - var msgToSend = $"📃**{_originalMessage.Author.Username}** has created a poll which requires your attention:\n\n**{_question}**\n"; + var msgToSend = GetText("poll_created", Format.Bold(_originalMessage.Author.Username)) + "\n\n" + Format.Bold(_question) + "\n"; var num = 1; msgToSend = answers.Aggregate(msgToSend, (current, answ) => current + $"`{num++}.` **{answ}**\n"); if (!IsPublic) - msgToSend += "\n**Private Message me with the corresponding number of the answer.**"; + msgToSend += "\n" + Format.Bold(GetText("poll_vote_private")); else - msgToSend += "\n**Send a Message here with the corresponding number of the answer.**"; + msgToSend += "\n" + Format.Bold(GetText("poll_vote_public")); await _originalMessage.Channel.SendConfirmAsync(msgToSend).ConfigureAwait(false); } @@ -187,17 +192,23 @@ namespace NadekoBot.Modules.Games { if (!IsPublic) { - await ch.SendConfirmAsync($"Thanks for voting **{msg.Author.Username}**.").ConfigureAwait(false); + await ch.SendConfirmAsync(GetText("thanks_for_voting", Format.Bold(msg.Author.Username))).ConfigureAwait(false); } else { - var toDelete = await ch.SendConfirmAsync($"{msg.Author.Mention} cast their vote.").ConfigureAwait(false); + var toDelete = await ch.SendConfirmAsync(GetText("poll_voted", Format.Bold(msg.Author.ToString()))).ConfigureAwait(false); toDelete.DeleteAfter(5); } } } catch { } } + + private string GetText(string key, params object[] replacements) + => NadekoTopLevelModule.GetTextStatic(key, + NadekoBot.Localization.GetCultureInfo(_guild.Id), + typeof(Games).Name.ToLowerInvariant(), + replacements); } } } \ No newline at end of file diff --git a/src/NadekoBot/Modules/Games/Games.cs b/src/NadekoBot/Modules/Games/Games.cs index 2acd06dd..5552dbf4 100644 --- a/src/NadekoBot/Modules/Games/Games.cs +++ b/src/NadekoBot/Modules/Games/Games.cs @@ -236,7 +236,7 @@ namespace NadekoBot.Modules.Games { hot = NextDouble(8, 10); crazy = NextDouble(5, 7); - advice = "Above an 8 hot, and between about 7 and a 5 crazy - this is WIFE ZONE. You you meet this girl, you should consider long-term " + + advice = "Above an 8 hot, and between about 7 and a 5 crazy - this is WIFE ZONE. If you meet this girl, you should consider long-term " + "relationship. Rare."; } else if (roll < 999) @@ -244,7 +244,7 @@ namespace NadekoBot.Modules.Games hot = NextDouble(8, 10); crazy = NextDouble(2, 3.99d); advice = "You've met a girl she's above 8 hot, and not crazy at all (below 4)... totally cool?" + - " You should be careful. That's a dude. It's a tranny."; + " You should be careful. That's a dude. You're talking to a tranny!"; } else { diff --git a/src/NadekoBot/Modules/Music/Music.cs b/src/NadekoBot/Modules/Music/Music.cs index eb4cbbdf..315ddb52 100644 --- a/src/NadekoBot/Modules/Music/Music.cs +++ b/src/NadekoBot/Modules/Music/Music.cs @@ -347,10 +347,8 @@ namespace NadekoBot.Modules.Music return; } var count = ids.Count(); - - var msg = await Context.Channel.SendMessageAsync(GetText("attempting_to_queue", - Format.Bold(count.ToString()))) - .ConfigureAwait(false); + var msg = await Context.Channel.SendMessageAsync("🎵 " + GetText("attempting_to_queue", + Format.Bold(count.ToString()))).ConfigureAwait(false); var cancelSource = new CancellationTokenSource(); @@ -374,7 +372,7 @@ namespace NadekoBot.Modules.Music ids = ids.Skip(5); } - await msg.ModifyAsync(m => m.Content = GetText("playlist_queue_complete")).ConfigureAwait(false); + await msg.ModifyAsync(m => m.Content = "✅ " + Format.Bold(GetText("playlist_queue_complete"))).ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] @@ -722,7 +720,7 @@ namespace NadekoBot.Modules.Music var embed = new EmbedBuilder() .WithAuthor(eab => eab.WithName(GetText("playlists_page", num)).WithMusicIcon()) .WithDescription(string.Join("\n", playlists.Select(r => - GetText("playlists", "#" + r.Id, r.Name, r.Author, r.Songs.Count)))) + GetText("playlists", r.Id, r.Name, r.Author, r.Songs.Count)))) .WithOkColor(); await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); diff --git a/src/NadekoBot/Modules/NSFW/NSFW.cs b/src/NadekoBot/Modules/NSFW/NSFW.cs index 6e72aefc..5f45af24 100644 --- a/src/NadekoBot/Modules/NSFW/NSFW.cs +++ b/src/NadekoBot/Modules/NSFW/NSFW.cs @@ -142,11 +142,11 @@ namespace NadekoBot.Modules.NSFW #endif [NadekoCommand, Usage, Description, Aliases] public Task Yandere([Remainder] string tag = null) - => InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Yandere); + => InternalDapiCommand(tag, Searches.Searches.DapiSearchType.Yandere); [NadekoCommand, Usage, Description, Aliases] public Task Konachan([Remainder] string tag = null) - => InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Konachan); + => InternalDapiCommand(tag, Searches.Searches.DapiSearchType.Konachan); [NadekoCommand, Usage, Description, Aliases] public async Task E621([Remainder] string tag = null) @@ -167,7 +167,7 @@ namespace NadekoBot.Modules.NSFW [NadekoCommand, Usage, Description, Aliases] public Task Rule34([Remainder] string tag = null) - => InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Rule34); + => InternalDapiCommand(tag, Searches.Searches.DapiSearchType.Rule34); [NadekoCommand, Usage, Description, Aliases] public async Task Danbooru([Remainder] string tag = null) @@ -210,7 +210,7 @@ namespace NadekoBot.Modules.NSFW [NadekoCommand, Usage, Description, Aliases] public Task Gelbooru([Remainder] string tag = null) - => InternalDapiCommand(Context.Message, tag, Searches.Searches.DapiSearchType.Gelbooru); + => InternalDapiCommand(tag, Searches.Searches.DapiSearchType.Gelbooru); [NadekoCommand, Usage, Description, Aliases] public async Task Cp() @@ -288,19 +288,17 @@ namespace NadekoBot.Modules.NSFW public static Task GetGelbooruImageLink(string tag) => Searches.Searches.InternalDapiSearch(tag, Searches.Searches.DapiSearchType.Gelbooru); - public async Task InternalDapiCommand(IUserMessage umsg, string tag, Searches.Searches.DapiSearchType type) + public async Task InternalDapiCommand(string tag, Searches.Searches.DapiSearchType type) { - var channel = umsg.Channel; - tag = tag?.Trim() ?? ""; var url = await Searches.Searches.InternalDapiSearch(tag, type).ConfigureAwait(false); if (url == null) - await channel.SendErrorAsync(umsg.Author.Mention + " " + GetText("no_results")); + await ReplyErrorLocalized("not_found").ConfigureAwait(false); else - await channel.EmbedAsync(new EmbedBuilder().WithOkColor() - .WithDescription(umsg.Author.Mention + " " + tag) + await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor() + .WithDescription(Context.User + " " + tag) .WithImageUrl(url) .WithFooter(efb => efb.WithText(type.ToString()))).ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Permissions/PermissionExtensions.cs b/src/NadekoBot/Modules/Permissions/PermissionExtensions.cs index cf8f0ed3..d9afcc1f 100644 --- a/src/NadekoBot/Modules/Permissions/PermissionExtensions.cs +++ b/src/NadekoBot/Modules/Permissions/PermissionExtensions.cs @@ -10,25 +10,12 @@ namespace NadekoBot.Modules.Permissions { public static class PermissionExtensions { - public static bool CheckPermissions(this IEnumerable permsEnumerable, IUserMessage message, CommandInfo command) + public static bool CheckPermissions(this IEnumerable permsEnumerable, IUserMessage message, + string commandName, string moduleName, out int permIndex) { - var perms = permsEnumerable as List ?? permsEnumerable.ToList(); - int throwaway; - return perms.CheckPermissions(message, command.Name, command.Module.Name, out throwaway); - } + var perms = permsEnumerable as List ?? permsEnumerable.ToList(); - 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++) + for (int i = perms.Count - 1; i >= 0; i--) { var perm = perms[i]; @@ -38,11 +25,8 @@ namespace NadekoBot.Modules.Permissions { continue; } - else - { - permIndex = i; - return result.Value; - } + permIndex = i; + return result.Value; } permIndex = -1; //defaut behaviour return true; @@ -51,7 +35,7 @@ namespace NadekoBot.Modules.Permissions //null = not applicable //true = applicable, allowed //false = applicable, not allowed - public static bool? CheckPermission(this Permission perm, IUserMessage message, string commandName, string moduleName) + public static bool? CheckPermission(this Permissionv2 perm, IUserMessage message, string commandName, string moduleName) { if (!((perm.SecondaryTarget == SecondaryPermissionType.Command && perm.SecondaryTargetName.ToLowerInvariant() == commandName.ToLowerInvariant()) || @@ -86,7 +70,7 @@ namespace NadekoBot.Modules.Permissions return null; } - public static string GetCommand(this Permission perm, SocketGuild guild = null) + public static string GetCommand(this Permissionv2 perm, SocketGuild guild = null) { var com = ""; switch (perm.PrimaryTarget) @@ -143,98 +127,10 @@ namespace NadekoBot.Modules.Permissions 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 04d1352d..2d21630d 100644 --- a/src/NadekoBot/Modules/Permissions/Permissions.cs +++ b/src/NadekoBot/Modules/Permissions/Permissions.cs @@ -7,9 +7,12 @@ using NadekoBot.Services; using Discord; using NadekoBot.Services.Database.Models; using System.Collections.Concurrent; -using NadekoBot.Extensions; +using System.Collections.Generic; using Discord.WebSocket; using System.Diagnostics; +using Microsoft.EntityFrameworkCore; +using NadekoBot.DataStructures; +using NadekoBot.TypeReaders; using NLog; namespace NadekoBot.Modules.Permissions @@ -17,53 +20,151 @@ namespace NadekoBot.Modules.Permissions [NadekoModule("Permissions", ";")] public partial class Permissions : NadekoTopLevelModule { - public class PermissionCache + public class OldPermissionCache { public string PermRole { get; set; } public bool Verbose { get; set; } = true; public Permission RootPermission { get; set; } } + public class PermissionCache + { + public string PermRole { get; set; } + public bool Verbose { get; set; } = true; + public PermissionsCollection Permissions { get; set; } + } + //guildid, root permission - public static ConcurrentDictionary Cache { get; } + public static ConcurrentDictionary Cache { get; } = + new ConcurrentDictionary(); static Permissions() { var log = LogManager.GetCurrentClassLogger(); var sw = Stopwatch.StartNew(); + TryMigratePermissions(); + using (var uow = DbHandler.UnitOfWork()) { - Cache = new ConcurrentDictionary(uow.GuildConfigs - .PermissionsForAll() - .ToDictionary(k => k.GuildId, - v => new PermissionCache() - { - RootPermission = v.RootPermission, - Verbose = v.VerbosePermissions, - PermRole = v.PermissionRole - })); + foreach (var x in uow.GuildConfigs.Permissionsv2ForAll()) + { + Cache.TryAdd(x.GuildId, new PermissionCache() + { + Verbose = x.VerbosePermissions, + PermRole = x.PermissionRole, + Permissions = new PermissionsCollection(x.Permissions) + }); + } } sw.Stop(); log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s"); } + private static void TryMigratePermissions() + { + var log = LogManager.GetCurrentClassLogger(); + using (var uow = DbHandler.UnitOfWork()) + { + var oldCache = new ConcurrentDictionary(uow.GuildConfigs + .OldPermissionsForAll() + .Where(x => x.RootPermission != null) // there is a check inside already, but just in case + .ToDictionary(k => k.GuildId, + v => new OldPermissionCache() + { + RootPermission = v.RootPermission, + Verbose = v.VerbosePermissions, + PermRole = v.PermissionRole + })); + + if (oldCache.Any()) + { + log.Info("Old permissions found. Performing one-time migration to v2."); + var i = 0; + foreach (var oc in oldCache) + { + if (i % 3 == 0) + log.Info("Migrating Permissions #" + i + " - GuildId: " + oc.Key); + i++; + var gc = uow.GuildConfigs.GcWithPermissionsv2For(oc.Key); + + var oldPerms = oc.Value.RootPermission.AsEnumerable().Reverse().ToList(); + uow._context.Set().RemoveRange(oldPerms); + gc.RootPermission = null; + if (oldPerms.Count > 2) + { + + var newPerms = oldPerms.Take(oldPerms.Count - 1) + .Select(x => x.Tov2()) + .ToList(); + + var allowPerm = Permissionv2.AllowAllPerm; + var firstPerm = newPerms[0]; + if (allowPerm.State != firstPerm.State || + allowPerm.PrimaryTarget != firstPerm.PrimaryTarget || + allowPerm.SecondaryTarget != firstPerm.SecondaryTarget || + allowPerm.PrimaryTargetId != firstPerm.PrimaryTargetId || + allowPerm.SecondaryTargetName != firstPerm.SecondaryTargetName) + newPerms.Insert(0, Permissionv2.AllowAllPerm); + Cache.TryAdd(oc.Key, new PermissionCache + { + Permissions = new PermissionsCollection(newPerms), + Verbose = gc.VerbosePermissions, + PermRole = gc.PermissionRole, + }); + gc.Permissions = newPerms; + } + } + log.Info("Permission migration to v2 is done."); + uow.Complete(); + } + } + } + + private static async Task AddPermissions(ulong guildId, params Permissionv2[] perms) + { + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.GcWithPermissionsv2For(guildId); + //var orderedPerms = new PermissionsCollection(config.Permissions); + var max = config.Permissions.Max(x => x.Index); //have to set its index to be the highest + foreach (var perm in perms) + { + perm.Index = ++max; + config.Permissions.Add(perm); + } + await uow.CompleteAsync().ConfigureAwait(false); + UpdateCache(config); + } + } + + public static void UpdateCache(GuildConfig config) + { + Cache.AddOrUpdate(config.GuildId, new PermissionCache() + { + Permissions = new PermissionsCollection(config.Permissions), + PermRole = config.PermissionRole, + Verbose = config.VerbosePermissions + }, (id, old) => + { + old.Permissions = new PermissionsCollection(config.Permissions); + old.PermRole = config.PermissionRole; + old.Verbose = config.VerbosePermissions; + return old; + }); + } + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] public async Task Verbose(PermissionAction action) { using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.For(Context.Guild.Id, set => set); + var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); config.VerbosePermissions = action.Value; - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = Permission.GetDefaultRoot(), - Verbose = config.VerbosePermissions - }, (id, old) => { old.Verbose = config.VerbosePermissions; return old; }); await uow.CompleteAsync().ConfigureAwait(false); + UpdateCache(config); } if (action.Value) { @@ -84,20 +185,15 @@ namespace NadekoBot.Modules.Permissions using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.For(Context.Guild.Id, set => set); + var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); if (role == null) { await ReplyConfirmLocalized("permrole", Format.Bold(config.PermissionRole)).ConfigureAwait(false); return; } config.PermissionRole = role.Name.Trim(); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = Permission.GetDefaultRoot(), - Verbose = config.VerbosePermissions - }, (id, old) => { old.PermRole = role.Name.Trim(); return old; }); await uow.CompleteAsync().ConfigureAwait(false); + UpdateCache(config); } await ReplyConfirmLocalized("permrole_changed", Format.Bold(role.Name)).ConfigureAwait(false); @@ -109,19 +205,32 @@ namespace NadekoBot.Modules.Permissions { if (page < 1 || page > 4) return; - string toSend; - using (var uow = DbHandler.UnitOfWork()) + + PermissionCache permCache; + IList perms; + + if (Cache.TryGetValue(Context.Guild.Id, out permCache)) { - var perms = uow.GuildConfigs.PermissionsFor(Context.Guild.Id).RootPermission; - var i = 1 + 20 * (page - 1); - toSend = Format.Bold(GetText("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((SocketGuild) Context.Guild) + $" [{GetText("uneditable")}]") : (p.GetCommand((SocketGuild) Context.Guild)))}")); + perms = permCache.Permissions.Source.ToList(); } + else + { + perms = Permissionv2.GetDefaultPermlist; + } + + var startPos = 20 * (page - 1); + var toSend = Format.Bold(GetText("page", page)) + "\n\n" + string.Join("\n", + perms.Reverse() + .Skip(startPos) + .Take(20) + .Select(p => + { + var str = + $"`{p.Index + 1}.` {Format.Bold(p.GetCommand((SocketGuild) Context.Guild))}"; + if (p.Index == 0) + str += $" [{GetText("uneditable")}]"; + return str; + })); await Context.Channel.SendMessageAsync(toSend).ConfigureAwait(false); } @@ -131,43 +240,24 @@ namespace NadekoBot.Modules.Permissions public async Task RemovePerm(int index) { index -= 1; + if (index < 0) + return; try { - Permission p; + Permissionv2 p; using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.PermissionsFor(Context.Guild.Id); - var perms = config.RootPermission; - if (index == perms.Count() - 1) - { - return; - } - if (index == 0) - { - p = perms; - config.RootPermission = perms.Next; - } - else - { - p = perms.RemoveAt(index); - } - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); + var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); + var permsCol = new PermissionsCollection(config.Permissions); + p = permsCol[index]; + permsCol.RemoveAt(index); + uow._context.Remove(p); await uow.CompleteAsync().ConfigureAwait(false); + UpdateCache(config); } - - using (var uow2 = DbHandler.UnitOfWork()) - { - uow2._context.Remove(p); - uow2._context.SaveChanges(); - } - await ReplyConfirmLocalized("removed", - index+1, - Format.Code(p.GetCommand((SocketGuild)Context.Guild))).ConfigureAwait(false); + await ReplyConfirmLocalized("removed", + index + 1, + Format.Code(p.GetCommand((SocketGuild) Context.Guild))).ConfigureAwait(false); } catch (IndexOutOfRangeException) { @@ -185,96 +275,36 @@ namespace NadekoBot.Modules.Permissions { try { - Permission fromPerm = null; - Permission toPerm = null; + Permissionv2 fromPerm; using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.PermissionsFor(Context.Guild.Id); - var perms = config.RootPermission; - 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 ReplyErrorLocalized("not_found", ++from).ConfigureAwait(false); - return; - } + var config = uow.GuildConfigs.GcWithPermissionsv2For(Context.Guild.Id); + var permsCol = new PermissionsCollection(config.Permissions); - if (!toFound) - { - await ReplyErrorLocalized("not_found", ++to).ConfigureAwait(false); - return; - } + var fromFound = from < permsCol.Count; + var toFound = to < permsCol.Count; + + if (!fromFound) + { + await ReplyErrorLocalized("not_found", ++from).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) + if (!toFound) { + await ReplyErrorLocalized("not_found", ++to).ConfigureAwait(false); + return; } + fromPerm = permsCol[from]; + + permsCol.RemoveAt(from); + permsCol.Insert(to, fromPerm); 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(); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); + UpdateCache(config); } await ReplyConfirmLocalized("moved_permission", - Format.Code(fromPerm.GetCommand((SocketGuild) Context.Guild)), - ++from, + Format.Code(fromPerm.GetCommand((SocketGuild) Context.Guild)), + ++from, ++to) .ConfigureAwait(false); return; @@ -288,39 +318,27 @@ namespace NadekoBot.Modules.Permissions [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task SrvrCmd(CommandInfo command, PermissionAction action) + public async Task SrvrCmd(CommandOrCrInfo command, PermissionAction action) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Server, - PrimaryTargetId = 0, - SecondaryTarget = SecondaryPermissionType.Command, - SecondaryTargetName = command.Aliases.First().ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) { - await ReplyConfirmLocalized("sx_enable", - Format.Code(command.Aliases.First()), + await ReplyConfirmLocalized("sx_enable", + Format.Code(command.Name), GetText("of_command")).ConfigureAwait(false); } else { - await ReplyConfirmLocalized("sx_disable", - Format.Code(command.Aliases.First()), + await ReplyConfirmLocalized("sx_disable", + Format.Code(command.Name), GetText("of_command")).ConfigureAwait(false); } } @@ -329,25 +347,14 @@ namespace NadekoBot.Modules.Permissions [RequireContext(ContextType.Guild)] public async Task SrvrMdl(ModuleInfo module, PermissionAction action) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Server, - PrimaryTargetId = 0, - SecondaryTarget = SecondaryPermissionType.Module, - SecondaryTargetName = module.Name.ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) { @@ -365,39 +372,28 @@ namespace NadekoBot.Modules.Permissions [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task UsrCmd(CommandInfo command, PermissionAction action, [Remainder] IGuildUser user) + public async Task UsrCmd(CommandOrCrInfo command, PermissionAction action, [Remainder] IGuildUser user) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.User, - PrimaryTargetId = user.Id, - SecondaryTarget = SecondaryPermissionType.Command, - SecondaryTargetName = command.Aliases.First().ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = user.Id, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) { - await ReplyConfirmLocalized("ux_enable", - Format.Code(command.Aliases.First()), + await ReplyConfirmLocalized("ux_enable", + Format.Code(command.Name), GetText("of_command"), Format.Code(user.ToString())).ConfigureAwait(false); } else { - await ReplyConfirmLocalized("ux_disable", - Format.Code(command.Aliases.First()), + await ReplyConfirmLocalized("ux_disable", + Format.Code(command.Name), GetText("of_command"), Format.Code(user.ToString())).ConfigureAwait(false); } @@ -407,25 +403,14 @@ namespace NadekoBot.Modules.Permissions [RequireContext(ContextType.Guild)] public async Task UsrMdl(ModuleInfo module, PermissionAction action, [Remainder] IGuildUser user) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.User, - PrimaryTargetId = user.Id, - SecondaryTarget = SecondaryPermissionType.Module, - SecondaryTargetName = module.Name.ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = user.Id, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) { @@ -445,42 +430,31 @@ namespace NadekoBot.Modules.Permissions [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task RoleCmd(CommandInfo command, PermissionAction action, [Remainder] IRole role) + public async Task RoleCmd(CommandOrCrInfo command, PermissionAction action, [Remainder] IRole role) { if (role == role.Guild.EveryoneRole) return; - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Role, - PrimaryTargetId = role.Id, - SecondaryTarget = SecondaryPermissionType.Command, - SecondaryTargetName = command.Aliases.First().ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Role, + PrimaryTargetId = role.Id, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) { await ReplyConfirmLocalized("rx_enable", - Format.Code(command.Aliases.First()), + Format.Code(command.Name), GetText("of_command"), Format.Code(role.Name)).ConfigureAwait(false); } else { await ReplyConfirmLocalized("rx_disable", - Format.Code(command.Aliases.First()), + Format.Code(command.Name), GetText("of_command"), Format.Code(role.Name)).ConfigureAwait(false); } @@ -493,25 +467,14 @@ namespace NadekoBot.Modules.Permissions if (role == role.Guild.EveryoneRole) return; - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Role, - PrimaryTargetId = role.Id, - SecondaryTarget = SecondaryPermissionType.Module, - SecondaryTargetName = module.Name.ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Role, + PrimaryTargetId = role.Id, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) @@ -532,39 +495,28 @@ namespace NadekoBot.Modules.Permissions [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task ChnlCmd(CommandInfo command, PermissionAction action, [Remainder] ITextChannel chnl) + public async Task ChnlCmd(CommandOrCrInfo command, PermissionAction action, [Remainder] ITextChannel chnl) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Channel, - PrimaryTargetId = chnl.Id, - SecondaryTarget = SecondaryPermissionType.Command, - SecondaryTargetName = command.Aliases.First().ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Channel, + PrimaryTargetId = chnl.Id, + SecondaryTarget = SecondaryPermissionType.Command, + SecondaryTargetName = command.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) { await ReplyConfirmLocalized("cx_enable", - Format.Code(command.Aliases.First()), + Format.Code(command.Name), GetText("of_command"), Format.Code(chnl.Name)).ConfigureAwait(false); } else { await ReplyConfirmLocalized("cx_disable", - Format.Code(command.Aliases.First()), + Format.Code(command.Name), GetText("of_command"), Format.Code(chnl.Name)).ConfigureAwait(false); } @@ -574,25 +526,14 @@ namespace NadekoBot.Modules.Permissions [RequireContext(ContextType.Guild)] public async Task ChnlMdl(ModuleInfo module, PermissionAction action, [Remainder] ITextChannel chnl) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Channel, - PrimaryTargetId = chnl.Id, - SecondaryTarget = SecondaryPermissionType.Module, - SecondaryTargetName = module.Name.ToLowerInvariant(), - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Channel, + PrimaryTargetId = chnl.Id, + SecondaryTarget = SecondaryPermissionType.Module, + SecondaryTargetName = module.Name.ToLowerInvariant(), + State = action.Value, + }); if (action.Value) { @@ -614,25 +555,14 @@ namespace NadekoBot.Modules.Permissions [RequireContext(ContextType.Guild)] public async Task AllChnlMdls(PermissionAction action, [Remainder] ITextChannel chnl) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Channel, - PrimaryTargetId = chnl.Id, - SecondaryTarget = SecondaryPermissionType.AllModules, - SecondaryTargetName = "*", - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Channel, + PrimaryTargetId = chnl.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }); if (action.Value) { @@ -653,25 +583,14 @@ namespace NadekoBot.Modules.Permissions if (role == role.Guild.EveryoneRole) return; - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Role, - PrimaryTargetId = role.Id, - SecondaryTarget = SecondaryPermissionType.AllModules, - SecondaryTargetName = "*", - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.Role, + PrimaryTargetId = role.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }); if (action.Value) { @@ -689,25 +608,14 @@ namespace NadekoBot.Modules.Permissions [RequireContext(ContextType.Guild)] public async Task AllUsrMdls(PermissionAction action, [Remainder] IUser user) { - using (var uow = DbHandler.UnitOfWork()) + await AddPermissions(Context.Guild.Id, new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.User, - PrimaryTargetId = user.Id, - SecondaryTarget = SecondaryPermissionType.AllModules, - SecondaryTargetName = "*", - State = action.Value, - }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = user.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }); if (action.Value) { @@ -725,36 +633,27 @@ namespace NadekoBot.Modules.Permissions [RequireContext(ContextType.Guild)] public async Task AllSrvrMdls(PermissionAction action) { - using (var uow = DbHandler.UnitOfWork()) + var newPerm = new Permissionv2 { - var newPerm = new Permission - { - PrimaryTarget = PrimaryPermissionType.Server, - PrimaryTargetId = 0, - SecondaryTarget = SecondaryPermissionType.AllModules, - SecondaryTargetName = "*", - State = action.Value, - }; - uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, newPerm); + PrimaryTarget = PrimaryPermissionType.Server, + PrimaryTargetId = 0, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = action.Value, + }; - var allowUser = new Permission - { - PrimaryTarget = PrimaryPermissionType.User, - PrimaryTargetId = Context.User.Id, - SecondaryTarget = SecondaryPermissionType.AllModules, - SecondaryTargetName = "*", - State = true, - }; + var allowUser = new Permissionv2 + { + PrimaryTarget = PrimaryPermissionType.User, + PrimaryTargetId = Context.User.Id, + SecondaryTarget = SecondaryPermissionType.AllModules, + SecondaryTargetName = "*", + State = true, + }; - var config = uow.GuildConfigs.SetNewRootPermission(Context.Guild.Id, allowUser); - Cache.AddOrUpdate(Context.Guild.Id, new PermissionCache() - { - PermRole = config.PermissionRole, - RootPermission = config.RootPermission, - Verbose = config.VerbosePermissions - }, (id, old) => { old.RootPermission = config.RootPermission; return old; }); - await uow.CompleteAsync().ConfigureAwait(false); - } + await AddPermissions(Context.Guild.Id, + newPerm, + allowUser); if (action.Value) { @@ -766,4 +665,4 @@ namespace NadekoBot.Modules.Permissions } } } -} +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Pokemon/PokeStats.cs b/src/NadekoBot/Modules/Permissions/Pokemon/PokeStats.cs similarity index 100% rename from src/NadekoBot/Modules/Pokemon/PokeStats.cs rename to src/NadekoBot/Modules/Permissions/Pokemon/PokeStats.cs diff --git a/src/NadekoBot/Modules/Pokemon/Pokemon.cs b/src/NadekoBot/Modules/Permissions/Pokemon/Pokemon.cs similarity index 100% rename from src/NadekoBot/Modules/Pokemon/Pokemon.cs rename to src/NadekoBot/Modules/Permissions/Pokemon/Pokemon.cs diff --git a/src/NadekoBot/Modules/Pokemon/PokemonType.cs b/src/NadekoBot/Modules/Permissions/Pokemon/PokemonType.cs similarity index 100% rename from src/NadekoBot/Modules/Pokemon/PokemonType.cs rename to src/NadekoBot/Modules/Permissions/Pokemon/PokemonType.cs diff --git a/src/NadekoBot/Modules/Searches/Commands/OverwatchCommands.cs b/src/NadekoBot/Modules/Searches/Commands/OverwatchCommands.cs index 65574849..99ce317d 100644 --- a/src/NadekoBot/Modules/Searches/Commands/OverwatchCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/OverwatchCommands.cs @@ -1,11 +1,11 @@ -using Discord; +using System; +using Discord; using Discord.Commands; using NadekoBot.Attributes; using NadekoBot.Extensions; using NadekoBot.Modules.Searches.Models; using Newtonsoft.Json; using System.Net.Http; -using System.Text.RegularExpressions; using System.Threading.Tasks; namespace NadekoBot.Modules.Searches @@ -20,7 +20,7 @@ namespace NadekoBot.Modules.Searches { if (string.IsNullOrWhiteSpace(query)) return; - var battletag = Regex.Replace(query, "#", "-", RegexOptions.IgnoreCase); + var battletag = query.Replace("#", "-"); await Context.Channel.TriggerTypingAsync().ConfigureAwait(false); try @@ -55,10 +55,10 @@ namespace NadekoBot.Modules.Searches .AddField(fb => fb.WithName(GetText("level")).WithValue($"{model.level}").WithIsInline(true)) .AddField(fb => fb.WithName(GetText("quick_wins")).WithValue($"{model.Games.Quick.wins}").WithIsInline(true)) .AddField(fb => fb.WithName(GetText("compet_wins")).WithValue($"{model.Games.Competitive.wins}").WithIsInline(true)) - .AddField(fb => fb.WithName(GetText("compet_losses")).WithValue($"{model.Games.Competitive.lost}").WithIsInline(true)) + .AddField(fb => fb.WithName(GetText("compet_loses")).WithValue($"{model.Games.Competitive.lost}").WithIsInline(true)) .AddField(fb => fb.WithName(GetText("compet_played")).WithValue($"{model.Games.Competitive.played}").WithIsInline(true)) .AddField(fb => fb.WithName(GetText("compet_rank")).WithValue(rank).WithIsInline(true)) - .AddField(fb => fb.WithName(GetText("compet_played")).WithValue($"{model.Playtime.competitive}").WithIsInline(true)) + .AddField(fb => fb.WithName(GetText("compet_playtime")).WithValue($"{model.Playtime.competitive}").WithIsInline(true)) .AddField(fb => fb.WithName(GetText("quick_playtime")).WithValue($"{model.Playtime.quick}").WithIsInline(true)) .WithColor(NadekoBot.OkColor); await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); @@ -73,15 +73,22 @@ namespace NadekoBot.Modules.Searches { try { - using (var http = new HttpClient()) + using (var handler = new HttpClientHandler()) { - var url = await http.GetStringAsync($"https://api.lootbox.eu/pc/{region.ToLower()}/{battletag}/profile"); - var model = JsonConvert.DeserializeObject(url); - return model.data; + handler.ServerCertificateCustomValidationCallback = (x, y, z, e) => true; + using (var http = new HttpClient(handler)) + { + var url = + await http.GetStringAsync( + $"https://api.lootbox.eu/pc/{region.ToLower()}/{battletag}/profile"); + var model = JsonConvert.DeserializeObject(url); + return model.data; + } } } - catch + catch (Exception ex) { + _log.Warn(ex); return null; } } diff --git a/src/NadekoBot/Modules/Searches/Commands/XkcdCommands.cs b/src/NadekoBot/Modules/Searches/Commands/XkcdCommands.cs index b747f2bd..a4b031a3 100644 --- a/src/NadekoBot/Modules/Searches/Commands/XkcdCommands.cs +++ b/src/NadekoBot/Modules/Searches/Commands/XkcdCommands.cs @@ -26,12 +26,17 @@ namespace NadekoBot.Modules.Searches { var res = await http.GetStringAsync($"{_xkcdUrl}/info.0.json").ConfigureAwait(false); var comic = JsonConvert.DeserializeObject(res); - var sent = await Context.Channel.SendMessageAsync($"{Context.User.Mention} " + comic) + var embed = new EmbedBuilder().WithColor(NadekoBot.OkColor) + .WithImageUrl(comic.ImageLink) + .WithAuthor(eab => eab.WithName(comic.Title).WithUrl($"{_xkcdUrl}/{comic.Num}").WithIconUrl("http://xkcd.com/s/919f27.ico")) + .AddField(efb => efb.WithName(GetText("comic_number")).WithValue(comic.Num.ToString()).WithIsInline(true)) + .AddField(efb => efb.WithName(GetText("date")).WithValue($"{comic.Month}/{comic.Year}").WithIsInline(true)); + var sent = await Context.Channel.EmbedAsync(embed) .ConfigureAwait(false); await Task.Delay(10000).ConfigureAwait(false); - await sent.ModifyAsync(m => m.Content = sent.Content + $"\n`Alt:` {comic.Alt}"); + await sent.ModifyAsync(m => m.Embed = embed.AddField(efb => efb.WithName("Alt").WithValue(comic.Alt.ToString()).WithIsInline(false)).Build()); } return; } diff --git a/src/NadekoBot/Modules/Searches/Searches.cs b/src/NadekoBot/Modules/Searches/Searches.cs index 7ed4dae9..472a17d5 100644 --- a/src/NadekoBot/Modules/Searches/Searches.cs +++ b/src/NadekoBot/Modules/Searches/Searches.cs @@ -22,6 +22,7 @@ using Configuration = AngleSharp.Configuration; using NadekoBot.Attributes; using Discord.Commands; using ImageSharp.Processing.Processors; +using ImageSharp; namespace NadekoBot.Modules.Searches { @@ -41,17 +42,17 @@ namespace NadekoBot.Modules.Searches var data = JsonConvert.DeserializeObject(response); var embed = new EmbedBuilder() - .AddField(fb => fb.WithName("🌍 " + GetText("location")).WithValue(data.name + ", " + data.sys.country).WithIsInline(true)) - .AddField(fb => fb.WithName("📏 " + GetText("latlong")).WithValue($"{data.coord.lat}, {data.coord.lon}").WithIsInline(true)) - .AddField(fb => fb.WithName("☁ " + GetText("condition")).WithValue(string.Join(", ", data.weather.Select(w => w.main))).WithIsInline(true)) - .AddField(fb => fb.WithName("😓 " + GetText("humidity")).WithValue($"{data.main.humidity}%").WithIsInline(true)) - .AddField(fb => fb.WithName("💨 " + GetText("wind_speed")).WithValue(data.wind.speed + " km/h").WithIsInline(true)) - .AddField(fb => fb.WithName("🌡 " + GetText("temperature")).WithValue(data.main.temp + "°C").WithIsInline(true)) - .AddField(fb => fb.WithName("🔆 " + GetText("min_max")).WithValue($"{data.main.temp_min}°C - {data.main.temp_max}°C").WithIsInline(true)) - .AddField(fb => fb.WithName("🌄 " + GetText("sunrise")).WithValue($"{data.sys.sunrise.ToUnixTimestamp():HH:mm}").WithIsInline(true)) - .AddField(fb => fb.WithName("🌇 " + GetText("sunset")).WithValue($"{data.sys.sunset.ToUnixTimestamp():HH:mm}").WithIsInline(true)) + .AddField(fb => fb.WithName("🌍 " + Format.Bold(GetText("location"))).WithValue($"[{data.name + ", " + data.sys.country}](https://openweathermap.org/city/{data.id})").WithIsInline(true)) + .AddField(fb => fb.WithName("📏 " + Format.Bold(GetText("latlong"))).WithValue($"{data.coord.lat}, {data.coord.lon}").WithIsInline(true)) + .AddField(fb => fb.WithName("☁ " + Format.Bold(GetText("condition"))).WithValue(string.Join(", ", data.weather.Select(w => w.main))).WithIsInline(true)) + .AddField(fb => fb.WithName("😓 " + Format.Bold(GetText("humidity"))).WithValue($"{data.main.humidity}%").WithIsInline(true)) + .AddField(fb => fb.WithName("💨 " + Format.Bold(GetText("wind_speed"))).WithValue(data.wind.speed + " m/s").WithIsInline(true)) + .AddField(fb => fb.WithName("🌡 " + Format.Bold(GetText("temperature"))).WithValue(data.main.temp + "°C").WithIsInline(true)) + .AddField(fb => fb.WithName("🔆 " + Format.Bold(GetText("min_max"))).WithValue($"{data.main.temp_min}°C - {data.main.temp_max}°C").WithIsInline(true)) + .AddField(fb => fb.WithName("🌄 " + Format.Bold(GetText("sunrise"))).WithValue($"{data.sys.sunrise.ToUnixTimestamp():HH:mm} UTC").WithIsInline(true)) + .AddField(fb => fb.WithName("🌇 " + Format.Bold(GetText("sunset"))).WithValue($"{data.sys.sunset.ToUnixTimestamp():HH:mm} UTC").WithIsInline(true)) .WithOkColor() - .WithFooter(efb => efb.WithText("Powered by http://openweathermap.org")); + .WithFooter(efb => efb.WithText("Powered by openweathermap.org").WithIconUrl($"http://openweathermap.org/img/w/{data.weather[0].icon}.png")); await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); } @@ -217,7 +218,7 @@ namespace NadekoBot.Modules.Searches if (string.IsNullOrWhiteSpace(ffs)) return; - await Context.Channel.SendConfirmAsync(await NadekoBot.Google.ShortenUrl($"")) + await Context.Channel.SendConfirmAsync("<" + await NadekoBot.Google.ShortenUrl($"http://lmgtfy.com/?q={ Uri.EscapeUriString(ffs) }") + ">") .ConfigureAwait(false); } @@ -605,7 +606,7 @@ namespace NadekoBot.Modules.Searches return; var img = new ImageSharp.Image(50, 50); - img.ApplyProcessor(new BackgroundColorProcessor(ImageSharp.Color.FromHex(color)), img.Bounds); + img.BackgroundColor(ImageSharp.Color.FromHex(color)); await Context.Channel.SendFileAsync(img.ToStream(), $"{color}.png").ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs b/src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs index 8eccc500..7617cdc9 100644 --- a/src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs +++ b/src/NadekoBot/Modules/Utility/Commands/CalcCommand.cs @@ -53,7 +53,7 @@ namespace NadekoBot.Modules.Utility "GetHashCode", "GetType" }); - await Context.Channel.SendConfirmAsync(GetText("utility_calcops", Prefix), string.Join(", ", selection)); + await Context.Channel.SendConfirmAsync(GetText("calcops", Prefix), string.Join(", ", selection)); } } diff --git a/src/NadekoBot/Modules/Utility/Commands/CommandMapCommands.cs b/src/NadekoBot/Modules/Utility/Commands/CommandMapCommands.cs new file mode 100644 index 00000000..51fa03d1 --- /dev/null +++ b/src/NadekoBot/Modules/Utility/Commands/CommandMapCommands.cs @@ -0,0 +1,149 @@ +using Discord; +using Discord.Commands; +using Microsoft.EntityFrameworkCore; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Services; +using NadekoBot.Services.Database; +using NadekoBot.Services.Database.Models; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System; + +namespace NadekoBot.Modules.Utility +{ + public partial class Utility + { + + public class CommandAliasEqualityComparer : IEqualityComparer + { + public bool Equals(CommandAlias x, CommandAlias y) => x.Trigger == y.Trigger; + + public int GetHashCode(CommandAlias obj) => obj.Trigger.GetHashCode(); + } + + [Group] + public class CommandMapCommands : NadekoSubmodule + { + //guildId, (trigger, mapping) + public static ConcurrentDictionary> AliasMaps { get; } = new ConcurrentDictionary>(); + + static CommandMapCommands() + { + var eq = new CommandAliasEqualityComparer(); + AliasMaps = new ConcurrentDictionary>( + NadekoBot.AllGuildConfigs.ToDictionary( + x => x.GuildId, + x => new ConcurrentDictionary(x.CommandAliases + .Distinct(eq) + .ToDictionary(ca => ca.Trigger, ca => ca.Mapping)))); + } + + [NadekoCommand, Usage, Description, Aliases] + [RequireUserPermission(GuildPermission.Administrator)] + [RequireContext(ContextType.Guild)] + public async Task Alias(string trigger, [Remainder] string mapping = null) + { + var channel = (ITextChannel)Context.Channel; + + if (string.IsNullOrWhiteSpace(trigger)) + return; + + trigger = trigger.Trim().ToLowerInvariant(); + + if (string.IsNullOrWhiteSpace(mapping)) + { + ConcurrentDictionary maps; + string throwaway; + if (!AliasMaps.TryGetValue(Context.Guild.Id, out maps) || + !maps.TryRemove(trigger, out throwaway)) + { + await ReplyErrorLocalized("alias_remove_fail", Format.Code(trigger)).ConfigureAwait(false); + return; + } + + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.CommandAliases)); + var toAdd = new CommandAlias() + { + Mapping = mapping, + Trigger = trigger + }; + config.CommandAliases.RemoveWhere(x => x.Trigger == trigger); + uow.Complete(); + } + + await ReplyConfirmLocalized("alias_removed", Format.Code(trigger)).ConfigureAwait(false); + return; + } + AliasMaps.AddOrUpdate(Context.Guild.Id, (_) => + { + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.CommandAliases)); + config.CommandAliases.Add(new CommandAlias() + { + Mapping = mapping, + Trigger = trigger + }); + uow.Complete(); + } + return new ConcurrentDictionary(new Dictionary() { + {trigger.Trim().ToLowerInvariant(), mapping.ToLowerInvariant() }, + }); + }, (_, map) => + { + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.CommandAliases)); + var toAdd = new CommandAlias() + { + Mapping = mapping, + Trigger = trigger + }; + config.CommandAliases.RemoveWhere(x => x.Trigger == trigger); + config.CommandAliases.Add(toAdd); + uow.Complete(); + } + map.AddOrUpdate(trigger, mapping, (key, old) => mapping); + return map; + }); + + await ReplyConfirmLocalized("alias_added", Format.Code(trigger), Format.Code(mapping)).ConfigureAwait(false); + } + + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task AliasList(int page = 1) + { + var channel = (ITextChannel)Context.Channel; + page -= 1; + + if (page < 0) + return; + + ConcurrentDictionary maps; + if (!AliasMaps.TryGetValue(Context.Guild.Id, out maps) || !maps.Any()) + { + await ReplyErrorLocalized("aliases_none").ConfigureAwait(false); + return; + } + + var arr = maps.ToArray(); + + await Context.Channel.SendPaginatedConfirmAsync(page + 1, (curPage) => + { + return new EmbedBuilder().WithOkColor() + .WithTitle(GetText("alias_list")) + .WithDescription(string.Join("\n", + arr.Skip((curPage - 1) * 10).Take(10).Select(x => $"`{x.Key}` => `{x.Value}`"))); + + }, arr.Length / 10).ConfigureAwait(false); + } + } + } +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Utility/Commands/MessageRepeater.cs b/src/NadekoBot/Modules/Utility/Commands/MessageRepeater.cs index c615ef1e..58752c28 100644 --- a/src/NadekoBot/Modules/Utility/Commands/MessageRepeater.cs +++ b/src/NadekoBot/Modules/Utility/Commands/MessageRepeater.cs @@ -114,11 +114,10 @@ namespace NadekoBot.Modules.Utility source.Cancel(); } - public override string ToString() - { - return - $"{Channel.Mention} | {(int) Repeater.Interval.TotalHours}:{Repeater.Interval:mm} | {Repeater.Message.TrimTo(33)}"; - } + public override string ToString() => + $"{Channel?.Mention ?? $"⚠<#{Repeater.ChannelId}>" } " + + $"| {(int) Repeater.Interval.TotalHours}:{Repeater.Interval:mm} " + + $"| {Repeater.Message.TrimTo(33)}"; } static RepeatCommands() @@ -247,7 +246,7 @@ namespace NadekoBot.Modules.Utility await Context.Channel.SendConfirmAsync( "🔁 " + GetText("repeater", - Format.Bold(rep.Repeater.Message), + Format.Bold(((IGuildUser)Context.User).GuildPermissions.MentionEveryone ? rep.Repeater.Message : rep.Repeater.Message.SanitizeMentions()), Format.Bold(rep.Repeater.Interval.Days.ToString()), Format.Bold(rep.Repeater.Interval.Hours.ToString()), Format.Bold(rep.Repeater.Interval.Minutes.ToString()))).ConfigureAwait(false); diff --git a/src/NadekoBot/Modules/Utility/Commands/PatreonCommands.cs b/src/NadekoBot/Modules/Utility/Commands/PatreonCommands.cs new file mode 100644 index 00000000..b347330f --- /dev/null +++ b/src/NadekoBot/Modules/Utility/Commands/PatreonCommands.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using Discord.Commands; +using Discord; +using NadekoBot.Attributes; +using NadekoBot.Modules.Utility.Models; +using Newtonsoft.Json; + +namespace NadekoBot.Modules.Utility +{ + public partial class Utility + { + //[Group] + //public class PatreonCommands : NadekoSubmodule + //{ + // [NadekoCommand, Usage, Description, Aliases] + // [RequireContext(ContextType.Guild)] + // public async Task ClaimPatreonRewards([Remainder] string arg) + // { + // var pledges = await GetPledges2(); + // } + + // private static async Task GetPledges() + // { + // var pledges = new List(); + // using (var http = new HttpClient()) + // { + // http.DefaultRequestHeaders.Clear(); + // http.DefaultRequestHeaders.Add("Authorization", "Bearer " + NadekoBot.Credentials.PatreonAccessToken); + // var data = new PatreonData() + // { + // Links = new Links() + // { + // Next = "https://api.patreon.com/oauth2/api/campaigns/334038/pledges" + // } + // }; + // do + // { + // var res = + // await http.GetStringAsync(data.Links.Next) + // .ConfigureAwait(false); + // data = JsonConvert.DeserializeObject(res); + // pledges.AddRange(data.Data); + // } while (!string.IsNullOrWhiteSpace(data.Links.Next)); + // } + // return pledges.Where(x => string.IsNullOrWhiteSpace(x.Attributes.declined_since)).ToArray(); + // } + + // private static async Task GetPledges2() + // { + // var pledges = new List(); + // using (var http = new HttpClient()) + // { + // http.DefaultRequestHeaders.Clear(); + // http.DefaultRequestHeaders.Add("Authorization", "Bearer " + NadekoBot.Credentials.PatreonAccessToken); + // var data = new PatreonData() + // { + // Links = new Links() + // { + // Next = "https://api.patreon.com/oauth2/api/current_user/campaigns?include=pledges" + // } + // }; + // do + // { + // var res = + // await http.GetStringAsync(data.Links.Next) + // .ConfigureAwait(false); + // data = JsonConvert.DeserializeObject(res); + // pledges.AddRange(data.Data); + // } while (!string.IsNullOrWhiteSpace(data.Links.Next)); + // } + // return pledges.Where(x => string.IsNullOrWhiteSpace(x.Attributes.declined_since)).ToArray(); + // } + //} + } +} diff --git a/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs b/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs index 5a7fc983..41c29a44 100644 --- a/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs +++ b/src/NadekoBot/Modules/Utility/Commands/QuoteCommands.cs @@ -33,9 +33,9 @@ namespace NadekoBot.Modules.Utility } if (quotes.Any()) - await Context.Channel.SendConfirmAsync(GetText("quotes_page", page + 1), - string.Join("\n", quotes.Select(q => $"{q.Keyword,-20} by {q.AuthorName}"))) - .ConfigureAwait(false); + await Context.Channel.SendConfirmAsync(GetText("quotes_page", page + 1), + string.Join("\n", quotes.Select(q => $"`#{q.Id}` {Format.Bold(q.Keyword),-20} by {q.AuthorName}"))) + .ConfigureAwait(false); else await ReplyErrorLocalized("quotes_page_none").ConfigureAwait(false); } @@ -52,7 +52,8 @@ namespace NadekoBot.Modules.Utility Quote quote; using (var uow = DbHandler.UnitOfWork()) { - quote = await uow.Quotes.GetRandomQuoteByKeywordAsync(Context.Guild.Id, keyword).ConfigureAwait(false); + quote = + await uow.Quotes.GetRandomQuoteByKeywordAsync(Context.Guild.Id, keyword).ConfigureAwait(false); } if (quote == null) @@ -61,7 +62,11 @@ namespace NadekoBot.Modules.Utility CREmbed crembed; if (CREmbed.TryParse(quote.Text, out crembed)) { - try { await Context.Channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? "").ConfigureAwait(false); } + try + { + await Context.Channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? "") + .ConfigureAwait(false); + } catch (Exception ex) { _log.Warn("Sending CREmbed failed"); @@ -69,28 +74,31 @@ namespace NadekoBot.Modules.Utility } return; } - await Context.Channel.SendMessageAsync("📣 " + quote.Text.SanitizeMentions()); + await Context.Channel.SendMessageAsync($"`#{quote.Id}` 📣 " + quote.Text.SanitizeMentions()); } - - [NadekoCommand, Usage, Description, Aliases] - [RequireContext(ContextType.Guild)] + + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] public async Task SearchQuote(string keyword, [Remainder] string text) { - if (string.IsNullOrWhiteSpace(keyword) || string.IsNullOrWhiteSpace(text)) - return; + if (string.IsNullOrWhiteSpace(keyword) || string.IsNullOrWhiteSpace(text)) + return; keyword = keyword.ToUpperInvariant(); Quote keywordquote; using (var uow = DbHandler.UnitOfWork()) - { - keywordquote = await uow.Quotes.SearchQuoteKeywordTextAsync(Context.Guild.Id, keyword, text).ConfigureAwait(false); - } + { + keywordquote = + await uow.Quotes.SearchQuoteKeywordTextAsync(Context.Guild.Id, keyword, text) + .ConfigureAwait(false); + } if (keywordquote == null) return; - await Context.Channel.SendMessageAsync("💬 " + keyword + ": " + keywordquote.Text.SanitizeMentions()); + await Context.Channel.SendMessageAsync("💬 " + keyword.ToLowerInvariant() + ": " + + keywordquote.Text.SanitizeMentions()); } [NadekoCommand, Usage, Description, Aliases] @@ -119,36 +127,29 @@ namespace NadekoBot.Modules.Utility [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task DeleteQuote([Remainder] string keyword) + public async Task DeleteQuote(int id) { - if (string.IsNullOrWhiteSpace(keyword)) - return; + var isAdmin = ((IGuildUser) Context.Message.Author).GuildPermissions.Administrator; - var isAdmin = ((IGuildUser)Context.Message.Author).GuildPermissions.Administrator; - - keyword = keyword.ToUpperInvariant(); var sucess = false; string response; using (var uow = DbHandler.UnitOfWork()) { - var qs = uow.Quotes.GetAllQuotesByKeyword(Context.Guild.Id, keyword)?.Where(elem => isAdmin || elem.AuthorId == Context.Message.Author.Id).ToArray(); + var q = uow.Quotes.Get(id); - if (qs == null || !qs.Any()) + if (q == null || (!isAdmin && q.AuthorId != Context.Message.Author.Id)) { - sucess = false; response = GetText("quotes_remove_none"); } else { - var q = qs[new NadekoRandom().Next(0, qs.Length)]; - uow.Quotes.Remove(q); await uow.CompleteAsync().ConfigureAwait(false); sucess = true; - response = GetText("quote_deleted"); + response = GetText("quote_deleted", id); } } - if(sucess) + if (sucess) await Context.Channel.SendConfirmAsync(response); else await Context.Channel.SendErrorAsync(response); @@ -166,9 +167,7 @@ namespace NadekoBot.Modules.Utility using (var uow = DbHandler.UnitOfWork()) { - var quotes = uow.Quotes.GetAllQuotesByKeyword(Context.Guild.Id, keyword); - //todo kwoth please don't be complete retard - uow.Quotes.RemoveRange(quotes.ToArray());//wtf?! + uow.Quotes.RemoveAllByKeyword(Context.Guild.Id, keyword.ToUpperInvariant()); await uow.CompleteAsync(); } @@ -177,4 +176,4 @@ namespace NadekoBot.Modules.Utility } } } -} +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Utility/Commands/Remind.cs b/src/NadekoBot/Modules/Utility/Commands/Remind.cs index 572a7afc..8d490563 100644 --- a/src/NadekoBot/Modules/Utility/Commands/Remind.cs +++ b/src/NadekoBot/Modules/Utility/Commands/Remind.cs @@ -64,7 +64,10 @@ namespace NadekoBot.Modules.Utility IMessageChannel ch; if (r.IsPrivate) { - ch = await NadekoBot.Client.GetDMChannelAsync(r.ChannelId).ConfigureAwait(false); + var user = NadekoBot.Client.GetGuild(r.ServerId).GetUser(r.ChannelId); + if(user == null) + return; + ch = await user.CreateDMChannelAsync().ConfigureAwait(false); } else { @@ -100,25 +103,20 @@ namespace NadekoBot.Modules.Utility [Priority(1)] public async Task Remind(MeOrHere meorhere, string timeStr, [Remainder] string message) { - IMessageChannel target; - if (meorhere == MeOrHere.Me) - { - target = await ((IGuildUser)Context.User).CreateDMChannelAsync().ConfigureAwait(false); - } - else - { - target = Context.Channel; - } - await Remind(target, timeStr, message).ConfigureAwait(false); + ulong target; + target = meorhere == MeOrHere.Me ? Context.User.Id : Context.Channel.Id; + await RemindInternal(target, meorhere == MeOrHere.Me, timeStr, message).ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + [RequireUserPermission(GuildPermission.ManageMessages)] [Priority(0)] - public async Task Remind(IMessageChannel ch, string timeStr, [Remainder] string message) - { - var channel = (ITextChannel)Context.Channel; + public Task Remind(ITextChannel channel, string timeStr, [Remainder] string message) => + RemindInternal(channel.Id, false, timeStr, message); + public async Task RemindInternal(ulong targetId, bool isPrivate, string timeStr, [Remainder] string message) + { var m = _regex.Match(timeStr); if (m.Length == 0) @@ -148,7 +146,7 @@ namespace NadekoBot.Modules.Utility (groupName == "hours" && value > 23) || (groupName == "minutes" && value > 59)) { - await channel.SendErrorAsync($"Invalid {groupName} value.").ConfigureAwait(false); + await Context.Channel.SendErrorAsync($"Invalid {groupName} value.").ConfigureAwait(false); return; } namesAndValues[groupName] = value; @@ -163,12 +161,12 @@ namespace NadekoBot.Modules.Utility var rem = new Reminder { - ChannelId = ch.Id, - IsPrivate = ch is IDMChannel, + ChannelId = targetId, + IsPrivate = isPrivate, When = time, Message = message, UserId = Context.User.Id, - ServerId = channel.Guild.Id + ServerId = Context.Guild.Id }; using (var uow = DbHandler.UnitOfWork()) @@ -179,9 +177,9 @@ namespace NadekoBot.Modules.Utility try { - await channel.SendConfirmAsync( + await Context.Channel.SendConfirmAsync( "⏰ " + GetText("remind", - Format.Bold(ch is ITextChannel ? ((ITextChannel) ch).Name : Context.User.Username), + Format.Bold(!isPrivate ? $"<#{targetId}>" : Context.User.Username), Format.Bold(message.SanitizeMentions()), Format.Bold(output), time, time)).ConfigureAwait(false); diff --git a/src/NadekoBot/Modules/Utility/Models/PatreonData.cs b/src/NadekoBot/Modules/Utility/Models/PatreonData.cs new file mode 100644 index 00000000..381666e8 --- /dev/null +++ b/src/NadekoBot/Modules/Utility/Models/PatreonData.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NadekoBot.Modules.Utility.Models +{ + + public class PatreonData + { + public Pledge[] Data { get; set; } + public Links Links { get; set; } + } + + public class Attributes + { + public int amount_cents { get; set; } + public string created_at { get; set; } + public string declined_since { get; set; } + public bool is_twitch_pledge { get; set; } + public bool patron_pays_fees { get; set; } + public int pledge_cap_cents { get; set; } + } + + public class Pledge + { + public Attributes Attributes { get; set; } + public int Id { get; set; } + } + + public class Links + { + public string First { get; set; } + public string Next { get; set; } + } +} diff --git a/src/NadekoBot/Modules/Utility/Utility.cs b/src/NadekoBot/Modules/Utility/Utility.cs index 0452dab6..ee92b771 100644 --- a/src/NadekoBot/Modules/Utility/Utility.cs +++ b/src/NadekoBot/Modules/Utility/Utility.cs @@ -22,7 +22,7 @@ namespace NadekoBot.Modules.Utility [NadekoModule("Utility", ".")] public partial class Utility : NadekoTopLevelModule { - private static ConcurrentDictionary rotatingRoleColors = new ConcurrentDictionary(); + private static ConcurrentDictionary _rotatingRoleColors = new ConcurrentDictionary(); //[NadekoCommand, Usage, Description, Aliases] //[RequireContext(ContextType.Guild)] @@ -114,7 +114,7 @@ namespace NadekoBot.Modules.Utility Timer t; if (timeout == 0 || hexes.Length == 0) { - if (rotatingRoleColors.TryRemove(role.Id, out t)) + if (_rotatingRoleColors.TryRemove(role.Id, out t)) { t.Change(Timeout.Infinite, Timeout.Infinite); await ReplyConfirmLocalized("rrc_stop", Format.Bold(role.Name)).ConfigureAwait(false); @@ -157,7 +157,7 @@ namespace NadekoBot.Modules.Utility catch { } }, null, 0, timeout * 1000); - rotatingRoleColors.AddOrUpdate(role.Id, t, (key, old) => + _rotatingRoleColors.AddOrUpdate(role.Id, t, (key, old) => { old.Change(Timeout.Infinite, Timeout.Infinite); return t; @@ -217,33 +217,18 @@ namespace NadekoBot.Modules.Utility [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] - public async Task InRole(params IRole[] roles) + public async Task InRole([Remainder] IRole role) { - if (roles.Length == 0) - return; - var send = "ℹ️ " + Format.Bold(GetText("inrole_list")); + var rng = new NadekoRandom(); var usrs = (await Context.Guild.GetUsersAsync()).ToArray(); - foreach (var role in roles.Where(r => r.Id != Context.Guild.Id)) - { - send += $"```css\n[{role.Name}]\n"; - send += string.Join(", ", usrs.Where(u => u.RoleIds.Contains(role.Id)).Select(u => u.ToString())); - send += "\n```"; - } - var usr = (IGuildUser)Context.User; - while (send.Length > 2000) - { - if (!usr.GetPermissions((ITextChannel)Context.Channel).ManageMessages) - { - await ReplyErrorLocalized("inrole_not_allowed").ConfigureAwait(false); - return; - } - var curstr = send.Substring(0, 2000); - await Context.Channel.SendConfirmAsync(curstr.Substring(0, - curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1)).ConfigureAwait(false); - send = curstr.Substring(curstr.LastIndexOf(", ", StringComparison.Ordinal) + 1) + - send.Substring(2000); - } - await Context.Channel.SendConfirmAsync(send).ConfigureAwait(false); + var roleUsers = usrs.Where(u => u.RoleIds.Contains(role.Id)).Select(u => u.ToString()) + .ToArray(); + var embed = new EmbedBuilder().WithOkColor() + .WithTitle("ℹ️ " + Format.Bold(GetText("inrole_list", Format.Bold(role.Name))) + $" - {roleUsers.Length}") + .WithDescription(string.Join(", ", roleUsers + .OrderBy(x => rng.Next()) + .Take(50))); + await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); } [NadekoCommand, Usage, Description, Aliases] @@ -481,7 +466,31 @@ namespace NadekoBot.Modules.Utility var title = $"Chatlog-{Context.Guild.Name}/#{Context.Channel.Name}-{DateTime.Now}.txt"; var grouping = msgs.GroupBy(x => $"{x.CreatedAt.Date:dd.MM.yyyy}") - .Select(g => new { date = g.Key, messages = g.OrderBy(x => x.CreatedAt).Select(s => $"【{s.Timestamp:HH:mm:ss}】{s.Author}:" + s.ToString()) }); + .Select(g => new + { + date = g.Key, + messages = g.OrderBy(x => x.CreatedAt).Select(s => + { + var msg = $"【{s.Timestamp:HH:mm:ss}】{s.Author}:"; + if (string.IsNullOrWhiteSpace(s.ToString())) + { + if (s.Attachments.Any()) + { + msg += "FILES_UPLOADED: " + string.Join("\n", s.Attachments.Select(x => x.Url)); + } + else if (s.Embeds.Any()) + { + //todo probably just go through all properties and check if they are set, if they are, add them + msg += "EMBEDS: " + string.Join("\n--------\n", s.Embeds.Select(x => $"Description: {x.Description}")); + } + } + else + { + msg += s.ToString(); + } + return msg; + }) + }); await Context.User.SendFileAsync( await JsonConvert.SerializeObject(grouping, Formatting.Indented).ToStream().ConfigureAwait(false), title, title).ConfigureAwait(false); } diff --git a/src/NadekoBot/NadekoBot.cs b/src/NadekoBot/NadekoBot.cs index 7da895d6..6673cacb 100644 --- a/src/NadekoBot/NadekoBot.cs +++ b/src/NadekoBot/NadekoBot.cs @@ -110,6 +110,7 @@ namespace NadekoBot //setup typereaders CommandService.AddTypeReader(new PermissionActionTypeReader()); CommandService.AddTypeReader(new CommandTypeReader()); + CommandService.AddTypeReader(new CommandOrCrTypeReader()); CommandService.AddTypeReader(new ModuleTypeReader()); CommandService.AddTypeReader(new GuildTypeReader()); diff --git a/src/NadekoBot/Resources/CommandStrings.Designer.cs b/src/NadekoBot/Resources/CommandStrings.Designer.cs index 2ea37420..045f5885 100644 --- a/src/NadekoBot/Resources/CommandStrings.Designer.cs +++ b/src/NadekoBot/Resources/CommandStrings.Designer.cs @@ -96,7 +96,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Starts an Acrophobia game. Second argment is optional round length in seconds. (default is 60). + /// Looks up a localized string similar to Starts an Acrophobia game. Second argument is optional round length in seconds. (default is 60). /// public static string acro_desc { get { @@ -150,7 +150,7 @@ namespace NadekoBot.Resources { } /// - /// 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/latest/Custom%20Reactions/>. + /// Looks up a localized string similar to Add a custom reaction with a trigger and a response. Running this command in server requires the 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/latest/Custom%20Reactions/>. /// public static string addcustreact_desc { get { @@ -177,7 +177,7 @@ namespace NadekoBot.Resources { } /// - /// 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%, %time%,%shardid%,%shardcount%, %shardguilds%. + /// 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%`, `%time%`, `%shardid%`, `%shardcount%`, `%shardguilds%`.. /// public static string addplaying_desc { get { @@ -231,7 +231,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles the automatic deletion of confirmations for {0}iam and {0}iamn commands.. + /// Looks up a localized string similar to Toggles the automatic deletion of confirmations for `{0}iam` and `{0}iamn` commands.. /// public static string adsarm_desc { get { @@ -248,6 +248,60 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to alias cmdmap. + /// + public static string alias_cmd { + get { + return ResourceManager.GetString("alias_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create a custom alias for a certain Nadeko command. Provide no alias to remove the existing one.. + /// + public static string alias_desc { + get { + return ResourceManager.GetString("alias_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}alias allin $bf 100 h` or `{0}alias "linux thingy" >loonix Spyware Windows`. + /// + public static string alias_usage { + get { + return ResourceManager.GetString("alias_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to aliaslist cmdmaplist aliases. + /// + public static string aliaslist_cmd { + get { + return ResourceManager.GetString("aliaslist_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shows the list of currently set aliases. Paginated.. + /// + public static string aliaslist_desc { + get { + return ResourceManager.GetString("aliaslist_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}aliaslist` or `{0}aliaslist 3`. + /// + public static string aliaslist_usage { + get { + return ResourceManager.GetString("aliaslist_usage", resourceCulture); + } + } + /// /// Looks up a localized string similar to allchnlmdls acm. /// @@ -420,7 +474,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sends a message to all servers' general channel bot is connected to.. + /// Looks up a localized string similar to Sends a message to all servers' default channel that bot is connected to.. /// public static string announce_desc { get { @@ -501,7 +555,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. Max message count is 10.. + /// Looks up a localized string similar to Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. Max message count is 10.. /// public static string antispam_desc { get { @@ -690,7 +744,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles autoplay - When the song is finished, automatically queue a related youtube song. (Works only for youtube songs and when queue is empty). + /// Looks up a localized string similar to Toggles autoplay - When the song is finished, automatically queue a related Youtube song. (Works only for Youtube songs and when queue is empty). /// public static string autoplay_desc { get { @@ -1014,7 +1068,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set 0 to disable automatic deletion.. + /// Looks up a localized string similar to Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set it to `0` to disable automatic deletion.. /// public static string byedel_desc { get { @@ -1041,7 +1095,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets a new leave announcement message. Type %user% if you want to show the name the user who left. Type %id% to show id. Using this command with no message will show the current bye message. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded.. + /// Looks up a localized string similar to Sets a new leave announcement message. Type `%user%` if you want to show the name the user who left. Type `%id%` to show id. Using this command with no message will show the current bye message. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded.. /// public static string byemsg_desc { get { @@ -1068,7 +1122,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Shows all available operations in {0}calc command. + /// Looks up a localized string similar to Shows all available operations in the `{0}calc` command. /// public static string calcops_desc { get { @@ -1419,7 +1473,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles automatic deleting of invites posted in the channel. Does not negate the {0}srvrfilterinv enabled setting. Does not affect Bot Owner.. + /// Looks up a localized string similar to Toggles automatic deletion of invites posted in the channel. Does not negate the `{0}srvrfilterinv` enabled setting. Does not affect the Bot Owner.. /// public static string chnlfilterinv_desc { get { @@ -1446,7 +1500,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles automatic deleting of messages containing banned words on the channel. Does not negate the {0}srvrfilterwords enabled setting. Does not affect bot owner.. + /// Looks up a localized string similar to Toggles automatic deletion of messages containing filtered words on the channel. Does not negate the `{0}srvrfilterwords` enabled setting. Does not affect the Bot Owner.. /// public static string chnlfilterwords_desc { get { @@ -1527,7 +1581,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Shows a random chucknorris joke from <http://tambal.azurewebsites.net/joke/random>. + /// Looks up a localized string similar to Shows a random Chuck Norris joke from <http://tambal.azurewebsites.net/joke/random>. /// public static string chucknorris_desc { get { @@ -1743,7 +1797,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets a cooldown per user for a command. Set to 0 to remove the cooldown.. + /// Looks up a localized string similar to Sets a cooldown per user for a command. Set it to 0 to remove the cooldown.. /// public static string cmdcooldown_desc { get { @@ -1770,7 +1824,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Shows a list of command costs. Paginated with 9 command per page.. + /// Looks up a localized string similar to Shows a list of command costs. Paginated with 9 commands per page.. /// public static string cmdcosts_desc { get { @@ -1851,7 +1905,7 @@ namespace NadekoBot.Resources { } /// - /// 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.. + /// Looks up a localized string similar to List all of the bot's commands from a certain module. You can either specify the full name or only the first few letters of the module name.. /// public static string commands_desc { get { @@ -1976,6 +2030,60 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to crad. + /// + public static string crad_cmd { + get { + return ResourceManager.GetString("crad_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toggles whether the message triggering the custom reaction will be automatically deleted.. + /// + public static string crad_desc { + get { + return ResourceManager.GetString("crad_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}crad 59`. + /// + public static string crad_usage { + get { + return ResourceManager.GetString("crad_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to crdm. + /// + public static string crdm_cmd { + get { + return ResourceManager.GetString("crdm_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toggles whether the response message of the custom reaction will be sent as a direct message.. + /// + public static string crdm_desc { + get { + return ResourceManager.GetString("crdm_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}crad 44`. + /// + public static string crdm_usage { + get { + return ResourceManager.GetString("crdm_usage", resourceCulture); + } + } + /// /// Looks up a localized string similar to createinvite crinv. /// @@ -2310,7 +2418,7 @@ namespace NadekoBot.Resources { } /// - /// 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.. + /// 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 privileges and removes server custom reaction.. /// public static string delcustreact_desc { get { @@ -2337,7 +2445,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Deletes a saved playlist. Only if you made it or if you are the bot owner.. + /// Looks up a localized string similar to Deletes a saved playlist. Works only if you made it or if you are the bot owner.. /// public static string deleteplaylist_desc { get { @@ -2364,7 +2472,7 @@ namespace NadekoBot.Resources { } /// - /// 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.. + /// Looks up a localized string similar to Deletes a quote with the specified ID. You have to be either server Administrator or the creator of the quote to delete it.. /// public static string deletequote_desc { get { @@ -2373,7 +2481,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `{0}delq abc`. + /// Looks up a localized string similar to `{0}delq 123456`. /// public static string deletequote_usage { get { @@ -2391,7 +2499,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles the automatic deletion of user's successful command message to prevent chat flood.. + /// Looks up a localized string similar to Toggles the automatic deletion of the user's successful command message to prevent chat flood.. /// public static string delmsgoncmd_desc { get { @@ -2607,7 +2715,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List of lovely people who donated to keep this project alive.. + /// Looks up a localized string similar to List of the lovely people who donated to keep this project alive.. /// public static string donators_desc { get { @@ -2715,7 +2823,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles fairplay. While enabled, music player will prioritize songs from users who didn't have their song recently played instead of the song's position in the queue.. + /// Looks up a localized string similar to Toggles fairplay. While enabled, the bot will prioritize songs from users who didn't have their song recently played instead of the song's position in the queue.. /// public static string fairplay_desc { get { @@ -2823,7 +2931,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json. + /// Looks up a localized string similar to Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json file. /// public static string forwardtoall_desc { get { @@ -2931,7 +3039,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Get a google search link for some terms.. + /// Looks up a localized string similar to Get a Google search link for some terms.. /// public static string google_desc { get { @@ -3012,7 +3120,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set 0 to disable automatic deletion.. + /// Looks up a localized string similar to Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set it to 0 to disable automatic deletion.. /// public static string greetdel_desc { get { @@ -3066,7 +3174,7 @@ namespace NadekoBot.Resources { } /// - /// 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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded.. + /// 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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded.. /// public static string greetdmmsg_desc { get { @@ -3093,7 +3201,7 @@ namespace NadekoBot.Resources { } /// - /// 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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded.. + /// 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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded.. /// public static string greetmsg_desc { get { @@ -3156,7 +3264,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `{0}h !!q` or `{0}h`. + /// Looks up a localized string similar to `{0}h {0}cmds` or `{0}h`. /// public static string h_usage { get { @@ -3174,7 +3282,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets the music volume to 50%.. + /// Looks up a localized string similar to Sets the music playback volume to 50%.. /// public static string half_desc { get { @@ -3282,7 +3390,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Heals someone. Revives those who fainted. Costs a NadekoFlower. + /// Looks up a localized string similar to Heals someone. Revives those who fainted. Costs a NadekoFlower. . /// public static string heal_desc { get { @@ -3498,7 +3606,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Pulls the first image found using a search parameter. Use {0}rimg for different results.. + /// Looks up a localized string similar to Pulls the first image found using a search parameter. Use `{0}rimg` for different results.. /// public static string image_desc { get { @@ -3552,7 +3660,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Lists every person from the provided role or roles, separated with space, on this server. You can use role IDs, role names (in quotes if it has multiple words), or role mention If the list is too long for 1 message, you must have Manage Messages permission.. + /// Looks up a localized string similar to Lists every person from the specified role on this server. You can use role ID, role name.. /// public static string inrole_desc { get { @@ -3561,7 +3669,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `{0}inrole Role` or `{0}inrole Role1 "Role 2" @role3`. + /// Looks up a localized string similar to `{0}inrole Some Role`. /// public static string inrole_usage { get { @@ -3687,7 +3795,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets this server's response language If bot's response strings have been translated to that language, bot will use that language in this server. Reset by using `default` as the locale name. Provide no arguments to see currently set language.. + /// Looks up a localized string similar to Sets this server's response language. If bot's response strings have been translated to that language, bot will use that language in this server. Reset by using `default` as the locale name. Provide no arguments to see currently set language.. /// public static string languageset_desc { get { @@ -3768,7 +3876,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Leaves Cross server channel instance from this channel.. + /// Looks up a localized string similar to Leaves a cross server channel instance from this channel.. /// public static string lcsc_desc { get { @@ -3795,7 +3903,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Displays bot currency leaderboard.. + /// Looks up a localized string similar to Displays the bot's currency leaderboard.. /// public static string leaderboard_desc { get { @@ -3822,7 +3930,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Makes Nadeko leave the server. Either name or id required.. + /// Looks up a localized string similar to Makes Nadeko leave the server. Either server name or server ID is required.. /// public static string leave_desc { get { @@ -4128,7 +4236,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `{0}lw [war_number] or {0}lw`. + /// Looks up a localized string similar to `{0}lw [war_number]` or `{0}lw`. /// public static string listwar_usage { get { @@ -4173,7 +4281,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Loads a saved playlist using it's ID. Use `{0}pls` to list all saved playlists and {0}save to save new ones.. + /// Looks up a localized string similar to Loads a saved playlist using its ID. Use `{0}pls` to list all saved playlists and `{0}save` to save new ones.. /// public static string load_desc { get { @@ -4254,7 +4362,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles logging event. Disables it if it's active anywhere on the server. Enables if it's not active. Use `{0}logevents` to see a list of all events you can subscribe to.. + /// Looks up a localized string similar to Toggles logging event. Disables it if it is active anywhere on the server. Enables if it isn't active. Use `{0}logevents` to see a list of all events you can subscribe to.. /// public static string log_desc { get { @@ -4308,7 +4416,7 @@ namespace NadekoBot.Resources { } /// - /// 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.. + /// 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 { @@ -4460,6 +4568,60 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to lucky7 l7. + /// + public static string lucky7_cmd { + get { + return ResourceManager.GetString("lucky7_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bet currency on the game and start rolling 3 sided dice. At any point you can choose to [m]ove (roll again) or [s]tay (get the amount bet times the current multiplier).. + /// + public static string lucky7_desc { + get { + return ResourceManager.GetString("lucky7_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}l7 10` or `{0}l7 move` or `{0}l7 s`. + /// + public static string lucky7_usage { + get { + return ResourceManager.GetString("lucky7_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to lucky7test l7t. + /// + public static string lucky7test_cmd { + get { + return ResourceManager.GetString("lucky7test_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tests the l7 command.. + /// + public static string lucky7test_desc { + get { + return ResourceManager.GetString("lucky7test_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}l7t 10000`. + /// + public static string lucky7test_usage { + get { + return ResourceManager.GetString("lucky7test_usage", resourceCulture); + } + } + /// /// Looks up a localized string similar to magicitem mi. /// @@ -4470,7 +4632,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Shows a random magicitem from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items>. + /// Looks up a localized string similar to Shows a random magic item from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items>. /// public static string magicitem_desc { get { @@ -4524,7 +4686,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Shows basic info from myanimelist profile.. + /// Looks up a localized string similar to Shows basic info from a MyAnimeList profile.. /// public static string mal_desc { get { @@ -4578,7 +4740,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets the music volume to 100%.. + /// Looks up a localized string similar to Sets the music playback volume to 100%.. /// public static string max_desc { get { @@ -4713,7 +4875,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission.. + /// Looks up a localized string similar to Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have the mention everyone permission.. /// public static string mentionrole_desc { get { @@ -4848,7 +5010,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Moves permission from one position to another in Permissions list.. + /// Looks up a localized string similar to Moves permission from one position to another in the Permissions list.. /// public static string moveperm_desc { get { @@ -4902,7 +5064,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Mutes a mentioned user both from speaking and chatting.. + /// Looks up a localized string similar to Mutes a mentioned user both from speaking and chatting. You can also specify time in minutes (up to 1440) for how long the user should be muted.. /// public static string mute_desc { get { @@ -4911,7 +5073,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `{0}mute @Someone`. + /// Looks up a localized string similar to `{0}mute @Someone` or `{0}mute 30 @Someone`. /// public static string mute_usage { get { @@ -4956,7 +5118,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Shows the song currently playing.. + /// Looks up a localized string similar to Shows the song that the bot is currently playing.. /// public static string nowplaying_desc { get { @@ -5145,7 +5307,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'.. + /// Looks up a localized string similar to Sets a role which can change permissions. Supply no parameters to see the current one. Default is 'Nadeko'.. /// public static string permrole_desc { get { @@ -5307,7 +5469,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Lists all playlists. Paginated. 20 per page. Default page is 0.. + /// Looks up a localized string similar to Lists all playlists. Paginated, 20 per page. Default page is 0.. /// public static string playlists_desc { get { @@ -5469,7 +5631,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to `{0}prune` removes all nadeko's messages in the last 100 messages.`{0}prune X` removes last X messages from the channel (up to 100)`{0}prune @Someone` removes all Someone's messages in the last 100 messages.`{0}prune @Someone X` removes last X 'Someone's' messages in the channel.. + /// Looks up a localized string similar to `{0}prune` removes all Nadeko's messages in the last 100 messages. `{0}prune X` removes last `X` number of messages from the channel (up to 100). `{0}prune @Someone` removes all Someone's messages in the last 100 messages. `{0}prune @Someone X` removes last `X` number of 'Someone's' messages in the channel.. /// public static string prune_desc { get { @@ -5523,7 +5685,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Queue a song using keywords or a link. Bot will join your voice channel.**You must be in a voice channel**.. + /// Looks up a localized string similar to Queue a song using keywords or a link. Bot will join your voice channel. **You must be in a voice channel**.. /// public static string queue_desc { get { @@ -5793,7 +5955,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to 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.. + /// Looks up a localized string similar to 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.. /// public static string remind_desc { get { @@ -5820,7 +5982,7 @@ namespace NadekoBot.Resources { } /// - /// 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.. + /// 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 remindtemplate_desc { get { @@ -5901,7 +6063,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Removes a permission from a given position in Permissions list.. + /// Looks up a localized string similar to Removes a permission from a given position in the Permissions list.. /// public static string removeperm_desc { get { @@ -6009,7 +6171,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Renames a role. Roles you are renaming must be lower than bot's highest role.. + /// Looks up a localized string similar to Renames a role. The role you are renaming must be lower than bot's highest role.. /// public static string renamerole_desc { get { @@ -6036,7 +6198,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Repeat a message every X minutes in the current channel. You can have up to 5 repeating messages on the server in total.. + /// Looks up a localized string similar to Repeat a message every `X` minutes in the current channel. You can have up to 5 repeating messages on the server in total.. /// public static string repeat_desc { get { @@ -6198,7 +6360,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Resets BOT's permissions module on this server to the default value.. + /// Looks up a localized string similar to Resets the bot's permissions module on this server to the default value.. /// public static string resetpermissions_desc { get { @@ -6252,7 +6414,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Returns a google reverse image search for someone's avatar.. + /// Looks up a localized string similar to Returns a Google reverse image search for someone's avatar.. /// public static string revav_desc { get { @@ -6279,7 +6441,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Returns a google reverse image search for an image from a link.. + /// Looks up a localized string similar to Returns a Google reverse image search for an image from a link.. /// public static string revimg_desc { get { @@ -6387,7 +6549,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List roles on this server or a roles of a specific user if specified. Paginated. 20 roles per page.. + /// Looks up a localized string similar to List roles on this server or a roles of a specific user if specified. Paginated, 20 roles per page.. /// public static string roles_desc { get { @@ -6414,7 +6576,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to 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. Y can be a letter 'F' if you want to roll fate dice instead of dnd.. + /// Looks up a localized string similar to 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`. `Y` can be a letter 'F' if you want to roll fate dice instead of dnd.. /// public static string roll_desc { get { @@ -6441,7 +6603,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to 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.. + /// Looks up a localized string similar to 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`.. /// public static string rolluo_desc { get { @@ -6522,7 +6684,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Play a game of rocket paperclip scissors with Nadeko.. + /// Looks up a localized string similar to Play a game of Rocket-Paperclip-Scissors with Nadeko.. /// public static string rps_desc { get { @@ -6630,7 +6792,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Saves a playlist under a certain name. Name must be no longer than 20 characters and mustn't contain dashes.. + /// Looks up a localized string similar to Saves a playlist under a certain name. Playlist name must be no longer than 20 characters and must not contain dashes.. /// public static string save_desc { get { @@ -6738,7 +6900,7 @@ namespace NadekoBot.Resources { } /// - /// 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:`.. + /// 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 prefix the channel id with `c:` and the user id with `u:`.. /// public static string send_desc { get { @@ -6765,7 +6927,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist.. + /// Looks up a localized string similar to Either [add]s or [rem]oves a server specified by a Name or an ID from a blacklist.. /// public static string serverblacklist_desc { get { @@ -7548,7 +7710,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Queue a soundcloud playlist using a link.. + /// Looks up a localized string similar to Queue a Soundcloud playlist using a link.. /// public static string soundcloudpl_desc { get { @@ -7575,7 +7737,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Queue a soundcloud song using keywords. Bot will join your voice channel.**You must be in a voice channel**.. + /// Looks up a localized string similar to Queue a soundcloud song using keywords. Bot will join your voice channel. **You must be in a voice channel**.. /// public static string soundcloudqueue_desc { get { @@ -7629,7 +7791,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner.. + /// Looks up a localized string similar to Toggles automatic deletion of invites posted in the server. Does not affect the Bot Owner.. /// public static string srvrfilterinv_desc { get { @@ -7656,7 +7818,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner.. + /// Looks up a localized string similar to Toggles automatic deletion of messages containing filtered words on the server. Does not affect the Bot Owner.. /// public static string srvrfilterwords_desc { get { @@ -8088,7 +8250,7 @@ namespace NadekoBot.Resources { } /// - /// 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.. + /// 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 { @@ -8439,7 +8601,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist.. + /// Looks up a localized string similar to Either [add]s or [rem]oves a user specified by a Mention or an ID from a blacklist.. /// public static string userblacklist_desc { get { @@ -8591,6 +8753,60 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to vcrole. + /// + public static string vcrole_cmd { + get { + return ResourceManager.GetString("vcrole_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sets or resets a role which will be given to users who join the voice channel you're in when you run this command. Provide no role name to disable. You must be in a voice channel to run this command.. + /// + public static string vcrole_desc { + get { + return ResourceManager.GetString("vcrole_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}vcrole SomeRole` or `{0}vcrole`. + /// + public static string vcrole_usage { + get { + return ResourceManager.GetString("vcrole_usage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to vcrolelist. + /// + public static string vcrolelist_cmd { + get { + return ResourceManager.GetString("vcrolelist_cmd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shows a list of currently set voice channel roles.. + /// + public static string vcrolelist_desc { + get { + return ResourceManager.GetString("vcrolelist_desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}vcrolelist`. + /// + public static string vcrolelist_usage { + get { + return ResourceManager.GetString("vcrolelist_usage", resourceCulture); + } + } + /// /// Looks up a localized string similar to verbose v. /// @@ -8682,7 +8898,7 @@ namespace NadekoBot.Resources { } /// - /// 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.. + /// 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 { @@ -8763,7 +8979,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Sets the music volume 0-100%. + /// Looks up a localized string similar to Sets the music playback volume (0-100%). /// public static string volume_desc { get { diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx index 662975cf..14a6e44a 100644 --- a/src/NadekoBot/Resources/CommandStrings.resx +++ b/src/NadekoBot/Resources/CommandStrings.resx @@ -124,7 +124,7 @@ Either shows a help for a single command, or DMs you help link if no arguments are specified. - `{0}h !!q` or `{0}h` + `{0}h {0}cmds` or `{0}h` hgit @@ -157,7 +157,7 @@ commands cmds - 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. + List all of the bot's commands from a certain module. You can either specify the full name or only the first few letters of the module name. `{0}commands Administration` or `{0}cmds Admin` @@ -166,7 +166,7 @@ greetdel grdel - Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set 0 to disable automatic deletion. + Sets the time it takes (in seconds) for greet messages to be auto-deleted. Set it to 0 to disable automatic deletion. `{0}greetdel 0` or `{0}greetdel 30` @@ -184,7 +184,7 @@ 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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded. + 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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded. `{0}greetmsg Welcome, %user%.` @@ -202,7 +202,7 @@ byemsg - Sets a new leave announcement message. Type %user% if you want to show the name the user who left. Type %id% to show id. Using this command with no message will show the current bye message. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded. + Sets a new leave announcement message. Type `%user%` if you want to show the name the user who left. Type `%id%` to show id. Using this command with no message will show the current bye message. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded. `{0}byemsg %user% has left.` @@ -211,7 +211,7 @@ byedel - Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set 0 to disable automatic deletion. + Sets the time it takes (in seconds) for bye messages to be auto-deleted. Set it to `0` to disable automatic deletion. `{0}byedel 0` or `{0}byedel 30` @@ -238,7 +238,7 @@ logignore - Toggles whether the .logserver command ignores this channel. Useful if you have hidden admin channel and public log channel. + Toggles whether the `.logserver` command ignores this channel. Useful if you have hidden admin channel and public log channel. `{0}logignore` @@ -274,7 +274,7 @@ repeat - Repeat a message every X minutes in the current channel. You can have up to 5 repeating messages on the server in total. + Repeat a message every `X` minutes in the current channel. You can have up to 5 repeating messages on the server in total. `{0}repeat 5 Hello there` @@ -292,7 +292,7 @@ addplaying adpl - Adds a specified string to the list of playing strings to rotate. Supported placeholders: %servers%, %users%, %playing%, %queued%, %time%,%shardid%,%shardcount%, %shardguilds% + Adds a specified string to the list of playing strings to rotate. Supported placeholders: `%servers%`, `%users%`, `%playing%`, `%queued%`, `%time%`, `%shardid%`, `%shardcount%`, `%shardguilds%`. `{0}adpl` @@ -337,7 +337,7 @@ 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. + 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. `{0}v+t` @@ -364,7 +364,7 @@ lcsc - Leaves Cross server channel instance from this channel. + Leaves a cross server channel instance from this channel. `{0}lcsc` @@ -427,7 +427,7 @@ addcustreact acr - 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/latest/Custom%20Reactions/> + Add a custom reaction with a trigger and a response. Running this command in server requires the 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/latest/Custom%20Reactions/> `{0}acr "hello" Hi there %user%` @@ -463,7 +463,7 @@ delcustreact dcr - 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. + 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 privileges and removes server custom reaction. `{0}dcr 5` @@ -481,7 +481,7 @@ leave - Makes Nadeko leave the server. Either name or id required. + Makes Nadeko leave the server. Either server name or server ID is required. `{0}leave 123123123331` @@ -490,7 +490,7 @@ delmsgoncmd - Toggles the automatic deletion of user's successful command message to prevent chat flood. + Toggles the automatic deletion of the user's successful command message to prevent chat flood. `{0}delmsgoncmd` @@ -526,7 +526,7 @@ renamerole renr - Renames a role. Roles you are renaming must be lower than bot's highest role. + Renames a role. The role you are renaming must be lower than bot's highest role. `{0}renr "First role" SecondRole` @@ -589,10 +589,10 @@ mute - Mutes a mentioned user both from speaking and chatting. + Mutes a mentioned user both from speaking and chatting. You can also specify time in minutes (up to 1440) for how long the user should be muted. - `{0}mute @Someone` + `{0}mute @Someone` or `{0}mute 30 @Someone` voiceunmute @@ -679,7 +679,7 @@ prune clr - `{0}prune` removes all nadeko's messages in the last 100 messages.`{0}prune X` removes last X messages from the channel (up to 100)`{0}prune @Someone` removes all Someone's messages in the last 100 messages.`{0}prune @Someone X` removes last X 'Someone's' messages in the channel. + `{0}prune` removes all Nadeko's messages in the last 100 messages. `{0}prune X` removes last `X` number of messages from the channel (up to 100). `{0}prune @Someone` removes all Someone's messages in the last 100 messages. `{0}prune @Someone X` removes last `X` number of 'Someone's' messages in the channel. `{0}prune` or `{0}prune 5` or `{0}prune @Someone` or `{0}prune @Someone X` @@ -724,7 +724,7 @@ send - 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:`. + Sends a message to someone on a different server through the bot. Separate server and channel/user ids with `|` and prefix the channel id with `c:` and the user id with `u:`. `{0}send serverid|c:channelid message` or `{0}send serverid|u:userid message` @@ -733,7 +733,7 @@ mentionrole menro - Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have mention everyone permission. + Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have the mention everyone permission. `{0}menro RoleName` @@ -751,7 +751,7 @@ donators - List of lovely people who donated to keep this project alive. + List of the lovely people who donated to keep this project alive. `{0}donators` @@ -769,7 +769,7 @@ announce - Sends a message to all servers' general channel bot is connected to. + Sends a message to all servers' default channel that bot is connected to. `{0}announce Useless spam` @@ -787,7 +787,7 @@ 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. + 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. `{0}remind me 1d5h Do something` or `{0}remind #general 1m Start now!` @@ -796,7 +796,7 @@ 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. + 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. `{0}remindtemplate %user%, do %message%!` @@ -841,10 +841,10 @@ inrole - Lists every person from the provided role or roles, separated with space, on this server. You can use role IDs, role names (in quotes if it has multiple words), or role mention If the list is too long for 1 message, you must have Manage Messages permission. + Lists every person from the specified role on this server. You can use role ID, role name. - `{0}inrole Role` or `{0}inrole Role1 "Role 2" @role3` + `{0}inrole Some Role` checkmyperms @@ -895,7 +895,7 @@ roles - List roles on this server or a roles of a specific user if specified. Paginated. 20 roles per page. + List roles on this server or a roles of a specific user if specified. Paginated, 20 roles per page. `{0}roles 2` or `{0}roles @Someone` @@ -913,7 +913,7 @@ chnlfilterinv cfi - Toggles automatic deleting of invites posted in the channel. Does not negate the {0}srvrfilterinv enabled setting. Does not affect Bot Owner. + Toggles automatic deletion of invites posted in the channel. Does not negate the `{0}srvrfilterinv` enabled setting. Does not affect the Bot Owner. `{0}cfi` @@ -922,7 +922,7 @@ srvrfilterinv sfi - Toggles automatic deleting of invites posted in the server. Does not affect Bot Owner. + Toggles automatic deletion of invites posted in the server. Does not affect the Bot Owner. `{0}sfi` @@ -931,7 +931,7 @@ chnlfilterwords cfw - Toggles automatic deleting of messages containing banned words on the channel. Does not negate the {0}srvrfilterwords enabled setting. Does not affect bot owner. + Toggles automatic deletion of messages containing filtered words on the channel. Does not negate the `{0}srvrfilterwords` enabled setting. Does not affect the Bot Owner. `{0}cfw` @@ -958,7 +958,7 @@ srvrfilterwords sfw - Toggles automatic deleting of messages containing forbidden words on the server. Does not affect Bot Owner. + Toggles automatic deletion of messages containing filtered words on the server. Does not affect the Bot Owner. `{0}sfw` @@ -967,7 +967,7 @@ permrole pr - Sets a role which can change permissions. Or supply no parameters to find out the current one. Default one is 'Nadeko'. + Sets a role which can change permissions. Supply no parameters to see the current one. Default is 'Nadeko'. `{0}pr role` @@ -1084,7 +1084,7 @@ ubl - Either [add]s or [rem]oves a user specified by a mention or ID from a blacklist. + Either [add]s or [rem]oves a user specified by a Mention or an ID from a blacklist. `{0}ubl add @SomeUser` or `{0}ubl rem 12312312313` @@ -1102,7 +1102,7 @@ sbl - Either [add]s or [rem]oves a server specified by a Name or ID from a blacklist. + Either [add]s or [rem]oves a server specified by a Name or an ID from a blacklist. `{0}sbl add 12312321312` or `{0}sbl rem SomeTrashServer` @@ -1111,7 +1111,7 @@ cmdcooldown cmdcd - Sets a cooldown per user for a command. Set to 0 to remove the cooldown. + Sets a cooldown per user for a command. Set it to 0 to remove the cooldown. `{0}cmdcd "some cmd" 5` @@ -1156,10 +1156,10 @@ deletequote delq - Deletes a random quote with the specified keyword. You have to either be server Administrator or the creator of the quote to delete it. + Deletes a quote with the specified ID. You have to be either server Administrator or the creator of the quote to delete it. - `{0}delq abc` + `{0}delq 123456` draw @@ -1201,7 +1201,7 @@ 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. Y can be a letter 'F' if you want to roll fate dice instead of dnd. + 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`. `Y` can be a letter 'F' if you want to roll fate dice instead of dnd. `{0}roll` or `{0}roll 7` or `{0}roll 3d5` or `{0}roll 5dF` @@ -1210,7 +1210,7 @@ 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. + 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`. `{0}rolluo` or `{0}rolluo 7` or `{0}rolluo 3d5` @@ -1291,7 +1291,7 @@ leaderboard lb - Displays bot currency leaderboard. + Displays the bot's currency leaderboard. `{0}lb` @@ -1300,7 +1300,7 @@ 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. + 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. `{0}t` or `{0}t 5 nohint` @@ -1426,7 +1426,7 @@ rps - Play a game of rocket paperclip scissors with Nadeko. + Play a game of Rocket-Paperclip-Scissors with Nadeko. `{0}rps scissors` @@ -1480,7 +1480,7 @@ queue q yq - Queue a song using keywords or a link. Bot will join your voice channel.**You must be in a voice channel**. + Queue a song using keywords or a link. Bot will join your voice channel. **You must be in a voice channel**. `{0}q Dream Of Venice` @@ -1489,7 +1489,7 @@ soundcloudqueue sq - Queue a soundcloud song using keywords. Bot will join your voice channel.**You must be in a voice channel**. + Queue a soundcloud song using keywords. Bot will join your voice channel. **You must be in a voice channel**. `{0}sq Dream Of Venice` @@ -1507,7 +1507,7 @@ nowplaying np - Shows the song currently playing. + Shows the song that the bot is currently playing. `{0}np` @@ -1516,7 +1516,7 @@ volume vol - Sets the music volume 0-100% + Sets the music playback volume (0-100%) `{0}vol 50` @@ -1534,7 +1534,7 @@ max - Sets the music volume to 100%. + Sets the music playback volume to 100%. `{0}max` @@ -1543,7 +1543,7 @@ half - Sets the music volume to 50%. + Sets the music playback volume to 50%. `{0}half` @@ -1561,7 +1561,7 @@ soundcloudpl scpl - Queue a soundcloud playlist using a link. + Queue a Soundcloud playlist using a link. `{0}scpl soundcloudseturl` @@ -1660,7 +1660,7 @@ save - Saves a playlist under a certain name. Name must be no longer than 20 characters and mustn't contain dashes. + Saves a playlist under a certain name. Playlist name must be no longer than 20 characters and must not contain dashes. `{0}save classical1` @@ -1669,7 +1669,7 @@ load - Loads a saved playlist using it's ID. Use `{0}pls` to list all saved playlists and {0}save to save new ones. + Loads a saved playlist using its ID. Use `{0}pls` to list all saved playlists and `{0}save` to save new ones. `{0}load 5` @@ -1678,7 +1678,7 @@ playlists pls - Lists all playlists. Paginated. 20 per page. Default page is 0. + Lists all playlists. Paginated, 20 per page. Default page is 0. `{0}pls 1` @@ -1687,7 +1687,7 @@ deleteplaylist delpls - Deletes a saved playlist. Only if you made it or if you are the bot owner. + Deletes a saved playlist. Works only if you made it or if you are the bot owner. `{0}delpls animu-5` @@ -1705,7 +1705,7 @@ 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) + Toggles autoplay - When the song is finished, automatically queue a related Youtube song. (Works only for Youtube songs and when queue is empty) `{0}ap` @@ -1939,7 +1939,7 @@ image img - Pulls the first image found using a search parameter. Use {0}rimg for different results. + Pulls the first image found using a search parameter. Use `{0}rimg` for different results. `{0}img cute kitten` @@ -1966,7 +1966,7 @@ google g - Get a google search link for some terms. + Get a Google search link for some terms. `{0}google query` @@ -2029,7 +2029,7 @@ chucknorris cn - Shows a random chucknorris joke from <http://tambal.azurewebsites.net/joke/random> + Shows a random Chuck Norris joke from <http://tambal.azurewebsites.net/joke/random> `{0}cn` @@ -2038,7 +2038,7 @@ magicitem mi - Shows a random magicitem from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items> + Shows a random magic item from <https://1d4chan.org/wiki/List_of_/tg/%27s_magic_items> `{0}mi` @@ -2047,7 +2047,7 @@ revav - Returns a google reverse image search for someone's avatar. + Returns a Google reverse image search for someone's avatar. `{0}revav "@SomeGuy"` @@ -2056,7 +2056,7 @@ revimg - Returns a google reverse image search for an image from a link. + Returns a Google reverse image search for an image from a link. `{0}revimg Image link` @@ -2212,7 +2212,7 @@ Shows the active war claims by a number. Shows all wars in a short way if no number is specified. - `{0}lw [war_number] or {0}lw` + `{0}lw [war_number]` or `{0}lw` claim call c @@ -2296,7 +2296,7 @@ readme guide - Shows all available operations in {0}calc command + Shows all available operations in the `{0}calc` command `{0}calcops` @@ -2320,7 +2320,7 @@ `{0}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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded. + 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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded. Check how much currency a person has. (Defaults to yourself) @@ -2350,7 +2350,7 @@ allusrmdls aum - Moves permission from one position to another in Permissions list. + Moves permission from one position to another in the Permissions list. `{0}mp 2 4` @@ -2359,7 +2359,7 @@ moveperm mp - Removes a permission from a given position in Permissions list. + Removes a permission from a given position in the Permissions list. `{0}rp 1` @@ -2416,7 +2416,7 @@ fwtoall - Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json + Toggles whether messages will be forwarded to all bot owners or only to the first one specified in the credentials.json file `{0}fwtoall` @@ -2425,7 +2425,7 @@ resetperms - Resets BOT's permissions module on this server to the default value. + Resets the bot's permissions module on this server to the default value. `{0}resetperms` @@ -2443,7 +2443,7 @@ antispam - Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. Max message count is 10. + Stops people from repeating same message X times in a row. You can specify to either mute, kick or ban the offenders. Max message count is 10. `{0}antispam 3 Mute` or `{0}antispam 4 Kick` or `{0}antispam 6 Ban` @@ -2488,7 +2488,7 @@ adsarm - Toggles the automatic deletion of confirmations for {0}iam and {0}iamn commands. + Toggles the automatic deletion of confirmations for `{0}iam` and `{0}iamn` commands. `{0}adsarm` @@ -2713,7 +2713,7 @@ heal - Heals someone. Revives those who fainted. Costs a NadekoFlower + Heals someone. Revives those who fainted. Costs a NadekoFlower. `{0}heal @someone` @@ -2794,7 +2794,7 @@ acrophobia acro - Starts an Acrophobia game. Second argment is optional round length in seconds. (default is 60) + Starts an Acrophobia game. Second argument is optional round length in seconds. (default is 60) `{0}acro` or `{0}acro 30` @@ -2812,7 +2812,7 @@ log - Toggles logging event. Disables it if it's active anywhere on the server. Enables if it's not active. Use `{0}logevents` to see a list of all events you can subscribe to. + Toggles logging event. Disables it if it is active anywhere on the server. Enables if it isn't active. Use `{0}logevents` to see a list of all events you can subscribe to. `{0}log userpresence` or `{0}log userbanned` @@ -2821,7 +2821,7 @@ fairplay fp - Toggles fairplay. While enabled, music player will prioritize songs from users who didn't have their song recently played instead of the song's position in the queue. + Toggles fairplay. While enabled, the bot will prioritize songs from users who didn't have their song recently played instead of the song's position in the queue. `{0}fp` @@ -2938,7 +2938,7 @@ cmdcosts - Shows a list of command costs. Paginated with 9 command per page. + Shows a list of command costs. Paginated with 9 commands per page. `{0}cmdcosts` or `{0}cmdcosts 2` @@ -3037,7 +3037,7 @@ mal - Shows basic info from myanimelist profile. + Shows basic info from a MyAnimeList profile. `{0}mal straysocks` @@ -3127,7 +3127,7 @@ languageset langset - Sets this server's response language If bot's response strings have been translated to that language, bot will use that language in this server. Reset by using `default` as the locale name. Provide no arguments to see currently set language. + Sets this server's response language. If bot's response strings have been translated to that language, bot will use that language in this server. Reset by using `default` as the locale name. Provide no arguments to see currently set language. `{0}langset de-DE ` or `{0}langset default` @@ -3150,4 +3150,76 @@ `{0}rategirl @SomeGurl` + + lucky7test l7t + + + Tests the l7 command. + + + `{0}l7t 10000` + + + lucky7 l7 + + + Bet currency on the game and start rolling 3 sided dice. At any point you can choose to [m]ove (roll again) or [s]tay (get the amount bet times the current multiplier). + + + `{0}l7 10` or `{0}l7 move` or `{0}l7 s` + + + vcrolelist + + + Shows a list of currently set voice channel roles. + + + `{0}vcrolelist` + + + vcrole + + + Sets or resets a role which will be given to users who join the voice channel you're in when you run this command. Provide no role name to disable. You must be in a voice channel to run this command. + + + `{0}vcrole SomeRole` or `{0}vcrole` + + + crad + + + Toggles whether the message triggering the custom reaction will be automatically deleted. + + + `{0}crad 59` + + + crdm + + + Toggles whether the response message of the custom reaction will be sent as a direct message. + + + `{0}crad 44` + + + aliaslist cmdmaplist aliases + + + Shows the list of currently set aliases. Paginated. + + + `{0}aliaslist` or `{0}aliaslist 3` + + + alias cmdmap + + + Create a custom alias for a certain Nadeko command. Provide no alias to remove the existing one. + + + `{0}alias allin $bf 100 h` or `{0}alias "linux thingy" >loonix Spyware Windows` + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.Designer.cs b/src/NadekoBot/Resources/ResponseStrings.Designer.cs index c3d3a842..fec34b11 100644 --- a/src/NadekoBot/Resources/ResponseStrings.Designer.cs +++ b/src/NadekoBot/Resources/ResponseStrings.Designer.cs @@ -557,7 +557,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User Kicked. + /// Looks up a localized string similar to User kicked. /// public static string administration_kicked_user { get { @@ -566,8 +566,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List Of Languages - ///{0}. + /// Looks up a localized string similar to List of languages. /// public static string administration_lang_list { get { @@ -747,7 +746,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Message Deleted in #{0}. + /// Looks up a localized string similar to Message deleted in #{0}. /// public static string administration_msg_del { get { @@ -756,7 +755,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Message Updated in #{0}. + /// Looks up a localized string similar to Message updated in #{0}. /// public static string administration_msg_update { get { @@ -764,6 +763,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to You must be in a voice channel on this server.. + /// + public static string administration_must_be_in_voice { + get { + return ResourceManager.GetString("administration_must_be_in_voice", resourceCulture); + } + } + /// /// Looks up a localized string similar to I don't have the permission necessary for that most likely.. /// @@ -810,7 +818,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to New Message. + /// Looks up a localized string similar to New message. /// public static string administration_new_msg { get { @@ -819,7 +827,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to New Nickname. + /// Looks up a localized string similar to New nickname. /// public static string administration_new_nick { get { @@ -828,7 +836,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to New Topic. + /// Looks up a localized string similar to New topic. /// public static string administration_new_topic { get { @@ -837,7 +845,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Nickname Changed. + /// Looks up a localized string similar to Nickname changed. /// public static string administration_nick_change { get { @@ -864,7 +872,16 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Old Message. + /// Looks up a localized string similar to There are no voice channel roles.. + /// + public static string administration_no_vcroles { + get { + return ResourceManager.GetString("administration_no_vcroles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Old message. /// public static string administration_old_msg { get { @@ -873,7 +890,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Old Nickname. + /// Looks up a localized string similar to Old nickname. /// public static string administration_old_nick { get { @@ -882,7 +899,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Old Topic. + /// Looks up a localized string similar to Old topic. /// public static string administration_old_topic { get { @@ -909,7 +926,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Presence Updates. + /// Looks up a localized string similar to Presence updates. /// public static string administration_presence_updates { get { @@ -918,7 +935,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Active Protections. + /// Looks up a localized string similar to Active protections. /// public static string administration_prot_active { get { @@ -954,7 +971,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to No protections enabled.. + /// Looks up a localized string similar to No protection enabled.. /// public static string administration_prot_none { get { @@ -1171,7 +1188,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User Soft-Banned. + /// Looks up a localized string similar to User soft-banned. /// public static string administration_sb_user { get { @@ -1443,7 +1460,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Text Channel Created. + /// Looks up a localized string similar to Text channel created.. /// public static string administration_text_chan_created { get { @@ -1452,7 +1469,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Text Channel Destroyed . + /// Looks up a localized string similar to Text channel destroyed.. /// public static string administration_text_chan_destroyed { get { @@ -1479,7 +1496,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User Banned. + /// Looks up a localized string similar to User banned. /// public static string administration_user_banned { get { @@ -1506,7 +1523,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User Joined. + /// Looks up a localized string similar to User joined. /// public static string administration_user_joined { get { @@ -1515,7 +1532,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User Left. + /// Looks up a localized string similar to User left. /// public static string administration_user_left { get { @@ -1533,7 +1550,16 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User's Role Added. + /// Looks up a localized string similar to {0} has been **muted** from text and voice chat for {1} minutes.. + /// + public static string administration_user_muted_time { + get { + return ResourceManager.GetString("administration_user_muted_time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User's role added. /// public static string administration_user_role_add { get { @@ -1542,7 +1568,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User's Role Removed. + /// Looks up a localized string similar to User's role removed. /// public static string administration_user_role_rem { get { @@ -1560,7 +1586,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to User Unbanned. + /// Looks up a localized string similar to User unbanned. /// public static string administration_user_unbanned { get { @@ -1632,7 +1658,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Username Changed. + /// Looks up a localized string similar to Username changed. /// public static string administration_username_changed { get { @@ -1650,7 +1676,34 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Voice Channel Created. + /// Looks up a localized string similar to Voice channel roles. + /// + public static string administration_vc_role_list { + get { + return ResourceManager.GetString("administration_vc_role_list", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Users who join {0} voice channel will get {1} role.. + /// + public static string administration_vcrole_added { + get { + return ResourceManager.GetString("administration_vcrole_added", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Users who join {0} voice channel will no longer get a role.. + /// + public static string administration_vcrole_removed { + get { + return ResourceManager.GetString("administration_vcrole_removed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Voice channel created. /// public static string administration_voice_chan_created { get { @@ -1659,7 +1712,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Voice Channel Destroyed. + /// Looks up a localized string similar to Voice channel destroyed. /// public static string administration_voice_chan_destroyed { get { @@ -1794,7 +1847,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Claim from @{0} for a war against {1} has expired.. + /// Looks up a localized string similar to Claim from @{0} in a war against {1} has expired.. /// public static string clashofclans_claim_expired { get { @@ -1848,7 +1901,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Not a Valid war size.. + /// Looks up a localized string similar to Not a valid war size.. /// public static string clashofclans_invalid_size { get { @@ -1857,7 +1910,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List Of Active Wars. + /// Looks up a localized string similar to List of active wars. /// public static string clashofclans_list_active_wars { get { @@ -1866,7 +1919,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to No active wars.. + /// Looks up a localized string similar to No active war.. /// public static string clashofclans_no_active_wars { get { @@ -1964,6 +2017,42 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Message triggering the custom reaction with id {0} won't get automatically deleted.. + /// + public static string customreactions_crad_disabled { + get { + return ResourceManager.GetString("customreactions_crad_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Message triggering the custom reaction with id {0} will get automatically deleted.. + /// + public static string customreactions_crad_enabled { + get { + return ResourceManager.GetString("customreactions_crad_enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Response message for the custom reaction with id {0} won't be sent as a DM.. + /// + public static string customreactions_crdm_disabled { + get { + return ResourceManager.GetString("customreactions_crdm_disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Response message for the custom reaction with id {0} will be sent as a DM.. + /// + public static string customreactions_crdm_enabled { + get { + return ResourceManager.GetString("customreactions_crdm_enabled", resourceCulture); + } + } + /// /// Looks up a localized string similar to Custom Reaction deleted. /// @@ -2010,7 +2099,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to No custom reactions found.. + /// Looks up a localized string similar to No custom reaction found.. /// public static string customreactions_no_found { get { @@ -2073,7 +2162,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Animal Race. + /// Looks up a localized string similar to Animal race. /// public static string gambling_animal_race { get { @@ -2081,6 +2170,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to You've already joined this race!. + /// + public static string gambling_animal_race_already_in { + get { + return ResourceManager.GetString("gambling_animal_race_already_in", resourceCulture); + } + } + /// /// Looks up a localized string similar to Animal Race is already running.. /// @@ -2199,7 +2297,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Changes Of Heart. + /// Looks up a localized string similar to Changes of heart. /// public static string gambling_changes_of_heart { get { @@ -2208,7 +2306,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Claimed By. + /// Looks up a localized string similar to Claimed by. /// public static string gambling_claimed_by { get { @@ -2334,7 +2432,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Heads. + /// Looks up a localized string similar to Head. /// public static string gambling_heads { get { @@ -2396,6 +2494,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to No user found.. + /// + public static string gambling_no_users_found { + get { + return ResourceManager.GetString("gambling_no_users_found", resourceCulture); + } + } + /// /// Looks up a localized string similar to Nobody. /// @@ -2414,6 +2521,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to page {0}. + /// + public static string gambling_page { + get { + return ResourceManager.GetString("gambling_page", resourceCulture); + } + } + /// /// Looks up a localized string similar to Price. /// @@ -2442,7 +2558,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Raffled User. + /// Looks up a localized string similar to Raffled user. /// public static string gambling_raffled_user { get { @@ -2551,7 +2667,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Tails. + /// Looks up a localized string similar to Tail. /// public static string gambling_tails { get { @@ -2906,7 +3022,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to {0} random {1} appeared! Pick them up by typing `{2}pick`. + /// Looks up a localized string similar to {0} random {1} appeared!. /// public static string games_curgen_pl { get { @@ -2915,7 +3031,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to A random {0} appeared! Pick it up by typing `{1}pick`. + /// Looks up a localized string similar to A random {0} appeared!. /// public static string games_curgen_sn { get { @@ -2923,6 +3039,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Current poll results. + /// + public static string games_current_poll_results { + get { + return ResourceManager.GetString("games_current_poll_results", resourceCulture); + } + } + /// /// Looks up a localized string similar to Failed loading a question.. /// @@ -2933,7 +3058,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Game Started. + /// Looks up a localized string similar to Game started. /// public static string games_game_started { get { @@ -2995,6 +3120,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to No votes cast.. + /// + public static string games_no_votes_cast { + get { + return ResourceManager.GetString("games_no_votes_cast", resourceCulture); + } + } + /// /// Looks up a localized string similar to You don't have enough {0}. /// @@ -3004,6 +3138,24 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Pick them up by typing `{0}pick`. + /// + public static string games_pick_pl { + get { + return ResourceManager.GetString("games_pick_pl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pick it up by typing `{0}pick`. + /// + public static string games_pick_sn { + get { + return ResourceManager.GetString("games_pick_sn", resourceCulture); + } + } + /// /// Looks up a localized string similar to picked {0}. /// @@ -3022,6 +3174,60 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Poll is already running on this server.. + /// + public static string games_poll_already_running { + get { + return ResourceManager.GetString("games_poll_already_running", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 📃 {0} has created a poll which requires your attention:. + /// + public static string games_poll_created { + get { + return ResourceManager.GetString("games_poll_created", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to `{0}.` {1} with {2} votes.. + /// + public static string games_poll_result { + get { + return ResourceManager.GetString("games_poll_result", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Private Message me with the corresponding number of the answer.. + /// + public static string games_poll_vote_private { + get { + return ResourceManager.GetString("games_poll_vote_private", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send a Message here with the corresponding number of the answer.. + /// + public static string games_poll_vote_public { + get { + return ResourceManager.GetString("games_poll_vote_public", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} voted.. + /// + public static string games_poll_voted { + get { + return ResourceManager.GetString("games_poll_voted", resourceCulture); + } + } + /// /// Looks up a localized string similar to Question. /// @@ -3050,7 +3256,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Submissions Closed. + /// Looks up a localized string similar to Submissions closed. /// public static string games_submissions_closed { get { @@ -3058,6 +3264,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Thank you for voting, {0}. + /// + public static string games_thanks_for_voting { + get { + return ResourceManager.GetString("games_thanks_for_voting", resourceCulture); + } + } + /// /// Looks up a localized string similar to Trivia game is already running on this server.. /// @@ -3167,7 +3382,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to {0} has Won!. + /// Looks up a localized string similar to {0} has won!. /// public static string games_ttt_has_won { get { @@ -3176,7 +3391,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Matched Three. + /// Looks up a localized string similar to Matched three. /// public static string games_ttt_matched_three { get { @@ -3194,7 +3409,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Time Expired!. + /// Looks up a localized string similar to Time expired!. /// public static string games_ttt_time_expired { get { @@ -3220,6 +3435,15 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to {0} total votes cast.. + /// + public static string games_x_votes_cast { + get { + return ResourceManager.GetString("games_x_votes_cast", resourceCulture); + } + } + /// /// Looks up a localized string similar to Back to ToC. /// @@ -3230,7 +3454,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Bot Owner Only. + /// Looks up a localized string similar to Bot owner only. /// public static string help_bot_owner_only { get { @@ -3248,7 +3472,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Command and aliases. + /// Looks up a localized string similar to Commands and aliases. /// public static string help_cmd_and_alias { get { @@ -3275,7 +3499,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Commandlist Regenerated.. + /// Looks up a localized string similar to Commandlist regenerated.. /// public static string help_commandlist_regen { get { @@ -3316,8 +3540,8 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to **List of Commands**: <{0}> - ///**Hosting Guides and docs can be found here**: <{1}>. + /// Looks up a localized string similar to **List of commands**: <{0}> + ///**Hosting guides and docs can be found here**: <{1}>. /// public static string help_guide { get { @@ -3326,7 +3550,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List Of Commands. + /// Looks up a localized string similar to List of commands. /// public static string help_list_of_commands { get { @@ -3335,7 +3559,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List Of Modules. + /// Looks up a localized string similar to List of modules. /// public static string help_list_of_modules { get { @@ -3371,7 +3595,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Table Of Contents. + /// Looks up a localized string similar to Table of contents. /// public static string help_table_of_contents { get { @@ -3443,7 +3667,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Finished Song. + /// Looks up a localized string similar to Finished song. /// public static string music_finished_song { get { @@ -3569,7 +3793,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Now Playing. + /// Looks up a localized string similar to Now playing. /// public static string music_now_playing { get { @@ -3596,7 +3820,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Player Queue - Page {0}/{1}. + /// Looks up a localized string similar to Player queue - Page {0}/{1}. /// public static string music_player_queue { get { @@ -3605,7 +3829,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Playing Song. + /// Looks up a localized string similar to Playing song. /// public static string music_playing_song { get { @@ -3650,7 +3874,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Playlist Saved. + /// Looks up a localized string similar to Playlist saved. /// public static string music_playlist_saved { get { @@ -3668,7 +3892,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Page {0} of Saved Playlists. + /// Looks up a localized string similar to Page {0} of saved playlists. /// public static string music_playlists_page { get { @@ -3704,7 +3928,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Queued Song. + /// Looks up a localized string similar to Queued song. /// public static string music_queued_song { get { @@ -3722,7 +3946,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Repeating Current Song. + /// Looks up a localized string similar to Repeating current song. /// public static string music_repeating_cur_song { get { @@ -3731,7 +3955,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Repeating Playlist. + /// Looks up a localized string similar to Repeating playlist. /// public static string music_repeating_playlist { get { @@ -3740,7 +3964,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Repeating Track. + /// Looks up a localized string similar to Repeating track. /// public static string music_repeating_track { get { @@ -3803,7 +4027,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Song Moved. + /// Looks up a localized string similar to Song moved. /// public static string music_song_moved { get { @@ -3812,7 +4036,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Songs shuffled.. + /// Looks up a localized string similar to Songs shuffled. /// public static string music_songs_shuffled { get { @@ -3903,7 +4127,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Disabled usage of ALL MODULES on {0} channel.. + /// Looks up a localized string similar to Disabled usage of ALL MODULES on channel {0}.. /// public static string permissions_acm_disable { get { @@ -3912,7 +4136,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Enabled usage of ALL MODULES on {0} channel.. + /// Looks up a localized string similar to Enabled usage of ALL MODULES on channel {0}.. /// public static string permissions_acm_enable { get { @@ -3930,7 +4154,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Disabled usage of ALL MODULES for {0} role.. + /// Looks up a localized string similar to Disabled usage of ALL MODULES for role {0}.. /// public static string permissions_arm_disable { get { @@ -3939,7 +4163,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Enabled usage of ALL MODULES for {0} role.. + /// Looks up a localized string similar to Enabled usage of ALL MODULES for role {0}.. /// public static string permissions_arm_enable { get { @@ -3966,7 +4190,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Disabled usage of ALL MODULES for {0} user.. + /// Looks up a localized string similar to Disabled usage of ALL MODULES for user {0}.. /// public static string permissions_aum_disable { get { @@ -3975,7 +4199,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Enabled usage of ALL MODULES for {0} user.. + /// Looks up a localized string similar to Enabled usage of ALL MODULES for user {0}.. /// public static string permissions_aum_enable { get { @@ -4002,7 +4226,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Command {0} has no coooldown now and all existing cooldowns have been cleared.. + /// Looks up a localized string similar to Command {0} has no cooldown now and all existing cooldowns have been cleared.. /// public static string permissions_cmdcd_cleared { get { @@ -4020,7 +4244,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Command Costs. + /// Looks up a localized string similar to Command costs. /// public static string permissions_command_costs { get { @@ -4029,7 +4253,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Disabled usage of {0} {1} on {2} channel.. + /// Looks up a localized string similar to Disabled usage of {0} {1} on channel {2}.. /// public static string permissions_cx_disable { get { @@ -4038,7 +4262,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Enabled usage of {0} {1} on {2} channel.. + /// Looks up a localized string similar to Enabled usage of {0} {1} on channel {2}.. /// public static string permissions_cx_enable { get { @@ -4065,7 +4289,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List Of Filtered Words. + /// Looks up a localized string similar to List of filtered words. /// public static string permissions_filter_word_list { get { @@ -4659,7 +4883,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Competitive Loses. + /// Looks up a localized string similar to Competitive losses. /// public static string searches_compet_loses { get { @@ -4668,7 +4892,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Competitive Played. + /// Looks up a localized string similar to Competitive played. /// public static string searches_compet_played { get { @@ -4677,7 +4901,16 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Competitive Rank. + /// Looks up a localized string similar to Competitive playtime. + /// + public static string searches_compet_playtime { + get { + return ResourceManager.GetString("searches_compet_playtime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Competitive rank. /// public static string searches_compet_rank { get { @@ -4839,7 +5072,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Image Search For:. + /// Looks up a localized string similar to Image search for:. /// public static string searches_image_search_for { get { @@ -4965,7 +5198,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to On-Hold. + /// Looks up a localized string similar to On-hold. /// public static string searches_on_hold { get { @@ -4974,7 +5207,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Original Url. + /// Looks up a localized string similar to Original url. /// public static string searches_original_url { get { @@ -5055,7 +5288,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Profile Link:. + /// Looks up a localized string similar to Profile link:. /// public static string searches_profile_link { get { @@ -5073,7 +5306,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Quick Playtime. + /// Looks up a localized string similar to Quick playtime. /// public static string searches_quick_playtime { get { @@ -5082,7 +5315,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Quick Wins. + /// Looks up a localized string similar to Quick wins. /// public static string searches_quick_wins { get { @@ -5109,7 +5342,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Search For:. + /// Looks up a localized string similar to Search for:. /// public static string searches_search_for { get { @@ -5118,7 +5351,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Short Url. + /// Looks up a localized string similar to Short url. /// public static string searches_short_url { get { @@ -5163,7 +5396,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Store Url. + /// Looks up a localized string similar to Store url. /// public static string searches_store_url { get { @@ -5370,7 +5603,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Wind Speed. + /// Looks up a localized string similar to Wind speed. /// public static string searches_wind_speed { get { @@ -5415,7 +5648,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Activity Page #{0}. + /// Looks up a localized string similar to Activity page #{0}. /// public static string utility_activity_page { get { @@ -5432,6 +5665,51 @@ namespace NadekoBot.Resources { } } + /// + /// Looks up a localized string similar to Typing {0} will now be an alias of {1}.. + /// + public static string utility_alias_added { + get { + return ResourceManager.GetString("utility_alias_added", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to List of aliases. + /// + public static string utility_alias_list { + get { + return ResourceManager.GetString("utility_alias_list", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigger {0} didn't have an alias.. + /// + public static string utility_alias_remove_fail { + get { + return ResourceManager.GetString("utility_alias_remove_fail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigger {0} no longer has an alias.. + /// + public static string utility_alias_removed { + get { + return ResourceManager.GetString("utility_alias_removed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No alias found. + /// + public static string utility_aliases_none { + get { + return ResourceManager.GetString("utility_aliases_none", resourceCulture); + } + } + /// /// Looks up a localized string similar to Author. /// @@ -5460,7 +5738,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Channel Topic. + /// Looks up a localized string similar to Channel topic. /// public static string utility_channel_topic { get { @@ -5478,7 +5756,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Commands Ran. + /// Looks up a localized string similar to Commands ran. /// public static string utility_commands_ran { get { @@ -5523,7 +5801,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Created At. + /// Looks up a localized string similar to Created at. /// public static string utility_created_at { get { @@ -5559,7 +5837,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Custom Emojis. + /// Looks up a localized string similar to Custom emojis. /// public static string utility_custom_emojis { get { @@ -5604,7 +5882,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Here is a list of users in those roles:. + /// Looks up a localized string similar to List of users in {0} role. /// public static string utility_inrole_list { get { @@ -5613,7 +5891,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to you are not allowed to use this command on roles with a lot of users in them to prevent abuse.. + /// Looks up a localized string similar to You are not allowed to use this command on roles with a lot of users in them to prevent abuse.. /// public static string utility_inrole_not_allowed { get { @@ -5640,7 +5918,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Joined Server. + /// Looks up a localized string similar to Joined server. /// public static string utility_joined_server { get { @@ -5649,7 +5927,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List of Repeaters. + /// Looks up a localized string similar to List of repeater. /// public static string utility_list_of_repeaters { get { @@ -5660,7 +5938,7 @@ namespace NadekoBot.Resources { /// /// Looks up a localized string similar to ID: {0} ///Members: {1} - ///OwnerID: {2}. + ///Owner ID: {2}. /// public static string utility_listservers { get { @@ -5696,7 +5974,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Message Repeater. + /// Looks up a localized string similar to Message repeater. /// public static string utility_message_repeater { get { @@ -5824,7 +6102,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Deleted a random quote.. + /// Looks up a localized string similar to Quote #{0} deleted.. /// public static string utility_quote_deleted { get { @@ -5878,7 +6156,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Registered On. + /// Looks up a localized string similar to Registered on. /// public static string utility_registered_on { get { @@ -5941,7 +6219,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to List Of Repeaters. + /// Looks up a localized string similar to List of repeaters. /// public static string utility_repeaters_list { get { @@ -6022,7 +6300,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Server Info. + /// Looks up a localized string similar to Server info. /// public static string utility_server_info { get { @@ -6049,7 +6327,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Shard Stats. + /// Looks up a localized string similar to Shard stats. /// public static string utility_shard_stats { get { @@ -6094,7 +6372,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Text Channels. + /// Looks up a localized string similar to Text channels. /// public static string utility_text_channels { get { @@ -6139,7 +6417,7 @@ namespace NadekoBot.Resources { } /// - /// Looks up a localized string similar to Voice Channels. + /// Looks up a localized string similar to Voice channels. /// public static string utility_voice_channels { get { diff --git a/src/NadekoBot/Resources/ResponseStrings.de-DE.resx b/src/NadekoBot/Resources/ResponseStrings.de-DE.resx index 8b3974b3..db44d4ac 100644 --- a/src/NadekoBot/Resources/ResponseStrings.de-DE.resx +++ b/src/NadekoBot/Resources/ResponseStrings.de-DE.resx @@ -121,7 +121,7 @@ Diese Basis wurde bereits beansprucht oder zerstört. - Diese Basis ist bereits zertört. + Diese Basis ist bereits zerstört. Diese Basis ist nicht beansprucht. @@ -139,7 +139,8 @@ @{0} sie haben die Basis #{1} bereits beansprucht. Sie können keine weitere beanspruchen. - Einnahme von @{0} für den Krieg gegen {1} ist abgelaufen. + Beanspruchung von @{0} für den Krieg gegen {1} ist abgelaufen. + Fuzzy Gegner @@ -152,9 +153,11 @@ Keine gültige Kriegsgröße. + Fuzzy Liste der aktiven Kriege + Fuzzy nicht beansprucht @@ -167,6 +170,7 @@ Keine aktiven Kriege. + Fuzzy Größe @@ -193,10 +197,10 @@ Benutzerdefinierte Reaktion gelöscht. - Unzureichende Rechte. Dies erfordert das sie den Bot besitzen für globale Reaktionen, und Administratorrechte für serverseitige Reaktionen. + Unzureichende Rechte. Dies erfordert das Sie den Bot besitzen für globale Reaktionen, und Administratorrechte für serverseitige Reaktionen. - Liste aller benutzerdefinierten Reaktionen. + Liste aller benutzerdefinierten Reaktionen Benutzerdefinierte Reaktionen @@ -206,6 +210,7 @@ Keine benutzerdefinierten Reaktionen gefunden. + Fuzzy Keine benutzerdefinierte Reaktion mit dieser ID gefunden. @@ -287,7 +292,7 @@ Das ist sehr effektiv! - Sie haben zu viele Angriffe hintereinander eingesetzt, sodass sie sich nicht bewegen können! + Sie haben zu viele Angriffe hintereinander eingesetzt, sodass Sie sich nicht bewegen können! Typ von {0} ist {1} @@ -296,7 +301,7 @@ Benutzer nicht gefunden. - Sie sind ohnmächtig, daher können sie sich nicht bewegen! + Sie sind ohnmächtig, daher können Sie sich nicht bewegen! **Automatische Rollenzuteilung** wenn ein Benutzer beitritt ist nun **deaktiviert**. @@ -448,7 +453,7 @@ Grund: {1} Begrüßungsankündigungen wurden für diesen Kanal aktiviert. - Sie können diesen befehl nicht an Benutzern mit einer Rolle über oder gleich zu ihrer in der Rangordnung benutzen. + Sie können diesen befehl nicht an Benutzern mit einer Rolle über oder gleich zu Ihrer in der Rangordnung benutzen. Bilder wurden geladen nach {0} sekunden! @@ -468,25 +473,28 @@ Grund: {1} Benutzer wurde gekickt + Fuzzy Liste der Sprachen {0} + Fuzzy - Ihr Servers Sprachumgebung ist jetzt {1} - {1} + Die Sprachumgebung des Servers ist jetzt {1} - {1} - Der Bots standard Sprachumgebung ist jetzt {0} - {1} + Die Sprachumgebung des Bots ist nun {0} - {1} Die Sprache des Bots ist {0} - {1} - Setzen der Sprachumgebung fehlgeschlagen. Greifen sie auf diesen Befehls hilfe erneut auf. + Setzen der Sprachumgebung fehlgeschlagen. Greifen Sie auf diesen Befehls hilfe erneut auf. - Dieser Servers Sprache wurde zu {0} - {1} gesetzt + Diese Servers Sprache wurde zu {0} - {1} gesetzt + Fuzzy {0} verließ {1} @@ -504,7 +512,7 @@ Grund: {1} Aufzeichnungen wurden deaktiviert. - Aufzeichnungs Ereignise die sie abonnieren können: + Aufzeichnungs Ereignise die Sie abonnieren können: Aufzeichnungen werden {0} ignorieren @@ -529,16 +537,18 @@ Grund: {1} Nachricht in #{0} gelöscht + Fuzzy Nachricht in #{0} aktualisiert + Fuzzy - wurden Stumm geschalten + wurden Stummgeschalten PLURAL (users have been muted) - wurde Stumm geschalten + wurde Stummgeschalten singular "User muted." @@ -552,15 +562,19 @@ Grund: {1} Neue Nachricht + Fuzzy Neuer Nickname + Fuzzy Neues Thema + Fuzzy Nickname wurde geändert + Fuzzy Konnte den Server nicht finden @@ -570,12 +584,15 @@ Grund: {1} Alte Nachricht + Fuzzy Alter Nickname + Fuzzy Altes Thema + Fuzzy Fehler. Ich habe wahrscheinlich nicht ausreichend Rechte. @@ -585,6 +602,7 @@ Grund: {1} Aktive Schutzmechanismen + Fuzzy {0} wurde auf diesem Server **deaktiviert**. @@ -597,12 +615,13 @@ Grund: {1} Keine Schutzmechanismen aktiviert. + Fuzzy Benutzerschwelle muss zwischen {0} und {1} sein. - Wenn {0} oder mehr Benutzer innerhalb von {1} Sekunden beitreten werde ich sie {2}. + Wenn {0} oder mehr Benutzer innerhalb von {1} Sekunden beitreten werde ich Sie {2}. Zeit muss zwischen {0} und {1} sekunden sein. @@ -638,7 +657,7 @@ Grund: {1} Umbenennen der Rolle fehlgeschlagen. Ich habe nicht die erforderlichen Rechte. - Sie kännen keine Rollen bearbeiten die höher als ihre eigenen sind. + Sie kännen keine Rollen bearbeiten die höher als Ihre eigenen sind. Die Abspielnachricht wurde entfernt: {0} @@ -675,25 +694,25 @@ Grund: {1} Sie haben bereits die exklusive, selbstzugewiesene Rolle {0}. - Selbstzuweisbare Rollen sind nun exklusiv! + Selbst zugewiesene Rollen sind nun exklusiv! - Es gibt {0} selbstzuweisbare Rollen + Es gibt {0} Rollen, die man sich selbst zuweisen kann. - Diese Rolle ist nicht selbstzuweisbar. + Diese Rolle kann man sich nicht selbst zuweisen. Sie haben die Rolle {0} nicht. - Selbstzuweisbare Rollen sind nicht länger exklusiv! + Selbst zugewiesene Rollen sind nicht länger exklusiv! - Ich kann dir diese Rolle nicht zuweisen. `Ich kann keine Rollen zu Besitzern oder andere Rollen die höher als meine in der Rangordnung sind hinzufügen.` + Ich kann Ihnen diese Rolle nicht zuweisen. `Ich kann keine Rollen zu Besitzern oder andere Rollen die höher als meine in der Rangordnung sind hinzufügen.` - {0} wurde von der Liste der selbstzuweisbaren Rollen entfernt. + {0} wurde von der Liste der selbst zuweisbaren Rollen entfernt. Sie haben nicht länger die Rolle {0}. @@ -756,9 +775,11 @@ __ignoredChannels__: {2} Textkanal erstellt + Fuzzy Textkanal zerstört + Fuzzy Taubschaltung aufgehoben. @@ -772,12 +793,14 @@ __ignoredChannels__: {2} Benutzername geändert + Fuzzy Benutzer Benutzer gebannt + Fuzzy {0} wurde **stummgeschaltet** im Chat. @@ -787,18 +810,22 @@ __ignoredChannels__: {2} Benutzer ist beigetreten + Fuzzy Benutzer ist gegangen + Fuzzy {0} wurde **stummgeschaltet** im Text- und Sprachchat. Benutzerrolle hinzugefügt + Fuzzy Benutzerrolle entfernt + Fuzzy {0} ist nun {1} @@ -823,10 +850,12 @@ __ignoredChannels__: {2} Sprachkanal erstellt - Should say "Voice Channel Created" + Should say "Voice Channel Created" +Fuzzy Sprachkanal zerstört + Fuzzy Text- und Sprachfunktion deaktiviert. @@ -858,6 +887,7 @@ Grund: {1} Benutzer entbannt + Fuzzy Migration fertig! @@ -867,18 +897,20 @@ Grund: {1} Anwesenheits Änderungen + Fuzzy Nutzer wurde gekickt + Fuzzy - vegab {0} zu {1} + gab {0} an {1} - Hoffentlich haben sie beim nächsten Mal mehr Glück ^_^ + Hoffentlich haben Sie beim nächsten Mal mehr Glück ^_^ - Glückwunsch! Sie haben {0} gewonnen, weil sie über {1} gewürfelt haben + Glückwunsch! Sie haben {0} gewonnen, weil Sie über {1} gewürfelt haben Deck neu gemischt. @@ -912,6 +944,7 @@ Grund: {1} Kopf + Fuzzy Bestenliste @@ -933,6 +966,7 @@ Grund: {1} Ausgewählter Benutzer + Fuzzy Sie haben eine {0} gewürfelt. @@ -966,6 +1000,7 @@ Grund: {1} Zahl + Fuzzy hat erfolgreich {0} von {1} genommen @@ -978,6 +1013,7 @@ Grund: {1} Nur Bot-Besitzer + Fuzzy Benötigt Kanalrecht {0}. @@ -987,15 +1023,17 @@ Grund: {1} Befehle und Alias + Fuzzy Befehlsliste neu generiert. + Fuzzy Gebe `{0}h NameDesBefehls` ein, um die Hilfestellung für diesen Befehl zu sehen. Z.B. `{0}h >8ball` - Ich konnte diesen Befehl nicht finden. Bitte stelle sicher das dieser Befehl existiert bevor sie es erneut versuchen. + Ich konnte diesen Befehl nicht finden. Bitte stelle sicher das dieser Befehl existiert bevor Sie es erneut versuchen. Beschreibung @@ -1004,19 +1042,22 @@ Grund: {1} Sie können das NadekoBot-Projekt über Patreon <{0}> oder PayPal <{1}> unterstützen. -Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu hinterlassen. +Vergessen Sie bitte nicht, Ihren Discord-Namen oder Ihre ID in der Nachricht zu hinterlassen. **Vielen Dank**♥️ **Liste der Befehle**: <{0}> **Hosting Anleitungen und Dokumentationen können hier gefunden werden**: <{1}> + Fuzzy - Lister der Befehle + Liste der Befehle + Fuzzy Liste der Module + Fuzzy Schreibe `{0}cmds ModuleName` um eine Liste aller Befehle dieses Moduls zu erhalten. z.B. `{0}cmds games` @@ -1029,9 +1070,10 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Inhaltsverzeichnis + Fuzzy - Benutzweise + Verwendung Autohentai wurde gestartet. Es wird alle {0} Sekunden etwas mit einem der folgenden Stichwörtern gepostet: {1} @@ -1041,6 +1083,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Tierrennen + Fuzzy Das Rennen konnte nicht gestartet werden, da es nicht genügend Teilnehmer gibt. @@ -1091,9 +1134,11 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Sinneswandel + Fuzzy Beansprucht von + Fuzzy Scheidungen @@ -1111,7 +1156,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Top Waifus - Ihre Neigung ist bereits zu dieser Waifu gesetzt oder sie versuchsen ihre Neigung zu entfernen während sie keine gesetzt haben. + Ihre Neigung ist bereits zu dieser Waifu gesetzt oder Sie versuchsen Ihre Neigung zu entfernen während Sie keine gesetzt haben. hat seine Neigung von {0} zu {1} geändert. @@ -1120,47 +1165,47 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Make sure to get the formatting right, and leave the thinking emoji - Sie müssen {0} Stunden und {1} Minuten warten bevor sie ihre Neigung ändern können. + Sie müssen {0} Stunden und {1} Minuten warten bevor Sie Ihre Neigung ändern können. - Ihre Neigung wurde zurückgesetzt. Sie haben keine Person mehr die sie mögen. + Ihre Neigung wurde zurückgesetzt. Sie haben keine Person mehr die Sie mögen. will {0}s Waifu sein. Aww <3 - hat {0} als seine/ihre Waifu für {1} beansprucht! + hat {0} als seine/Ihre Waifu für {1} beansprucht! - Sie haben sich von ihrer Waifu die sie mochte scheiden lassen. Du herzloses Monster. {0} hat {1} als Kompensation erhalten. + Sie haben sich von Ihrer Waifu die Sie mochte scheiden lassen. Du herzloses Monster. {0} hat {1} als Kompensation erhalten. - Sie können deine Neigung nicht zu ihnen selbst setzen, sie egomanische Person. + Sie können deine Neigung nicht zu Ihnen selbst setzen, Sie egomanische Person. 🎉 Ihre Liebe ist besiegelt! 🎉 {0}'s neuer Wert ist {1}! - Keine Waifu ist so billig. Sie müssen wenigstens {0} bezahlen um diese Waifu zu beanspruchen, selbst wenn ihr tatsächlicher Wert geringer ist. + Keine Waifu ist so billig. Sie müssen wenigstens {0} bezahlen um diese Waifu zu beanspruchen, selbst wenn Ihr tatsächlicher Wert geringer ist. Sie müssen {0} oder mehr bezahlen um diese Waifu zu beanspruchen! - Diese Waifu gehört nicht dir. + Diese Waifu gehört nicht Ihnen. Sie können sich nicht selbst beanspruchen. - Sie haben sich vor kurzem scheiden lassen. Sie müssen {0} Stunden und {1} Minuten warten bevor sie sich erneut scheiden lassen können. + Sie haben sich vor kurzem scheiden lassen. Sie müssen {0} Stunden und {1} Minuten warten bevor Sie sich erneut scheiden lassen können. Niemand - Sie haben sich von einer Waifu scheiden lassen die sie nicht mochte, Du erhältst {0} zurück. + Sie haben sich von einer Waifu scheiden lassen die Sie nicht mochte, Du erhältst {0} zurück. 8ball @@ -1184,7 +1229,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Spiel gestartet. Erstelle einen Satz aus dem folgenden Akronym: {0}. - Sie haben {0} Sekunden für ihre Einsendung. + Sie haben {0} Sekunden für Ihre Einsendung. {0} hat seinen Satz eingereicht. ({1} insgesamt) @@ -1193,7 +1238,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Stimme ab indem du die Nummer der Einsendung eingibst - {0} hat seine/ihre Stimme abgegeben! + {0} hat seine/Ihre Stimme abgegeben! Der Gewinner ist {0} mit {1} Punkten. @@ -1212,6 +1257,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Einsendungen geschlossen + Fuzzy Tierrennen läuft bereits. @@ -1235,17 +1281,20 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Währungsgeneration in diesem Kanal aktiviert. - {0} zufällige {1} sind erschienen! Sammle sie indem sie `{2}pick` schreiben - plural + {0} zufällige {1} sind erschienen! Sammlen Sie sie indem Sie `{2}pick` schreiben + plural +Fuzzy - Eine zufällige {0} ist erschienen! Sammle sie indem sie `{1}pick` schreiben + Eine zufällige {0} ist erschienen! Sammlen Sie sie indem Sie `{1}pick` schreiben + Fuzzy Laden einer Frage fehlgeschlagen. Spiel gestartet + Fuzzy Hangman-Spiel gestartet @@ -1269,7 +1318,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Keine Ergebnisse - {0} aufgehoben + hat {0} aufgehoben Kwoth picked 5* @@ -1295,10 +1344,10 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Wird beendet nach dieser Frage. - Die Zeit is um! Die richtige Antwort war {0} + Die Zeit ist um! Die richtige Antwort war {0} - {0} erriet es und hat das spiel GEWONNEN! Die Antwort war: {1} + {0} erriet es und hat das Spiel GEWONNEN! Die Antwort war: {1} Sie können nicht gegen sich selber spielen. @@ -1314,15 +1363,18 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu {0} hat gewonnen! + Fuzzy Drei in einer Reihe + Fuzzy Keine Züge übrig Zeit abgelaufen + Fuzzy {0}'s Zug @@ -1350,6 +1402,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Lied beendet + Fuzzy Fairer Modus deaktiviert. @@ -1367,10 +1420,10 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Ungültige Eingabe. - Maximale Spielzeit hat kein Limit mehr. + Maximale Länge eines Liedes hat kein Limit mehr. - Maximale Spielzeit ist nun {0} Sekunden. + Maximale länge eines Liedes ist nun {0} Sekunden. Maximale Musik-Warteschlangengröße ist nun unbegrenzt. @@ -1386,6 +1439,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Aktuelles Lied: + Fuzzy Kein aktiver Musikspieler. @@ -1398,21 +1452,24 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Musik-Warteschlange - Seite {0}/{1} + Fuzzy Spiele Lied + Fuzzy `#{0}` - **{1}** by *{2}* ({3} Lieder) Seite {0} der gespeicherten Playlists + Fuzzy Playlist gelöscht. - Playlist konnte nicht gelöscht werden. Entweder sie existiert nicht oder sie gehört nicht dir. + Playlist konnte nicht gelöscht werden. Entweder es existiert nicht oder es gehört nicht Ihnen. Es gibt keine Playlist mit dieser ID. @@ -1422,6 +1479,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Playlist gespeichert + Fuzzy {0}'s Limit @@ -1431,6 +1489,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Eingereihtes Lied + Fuzzy Musik-Warteschlange geleert. @@ -1443,13 +1502,16 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu context: "removed song #5" - Aktuelle Lied wird wiederholt + Aktuelles Lied wird wiederholt + Fuzzy Playlist wird wiederholt + Fuzzy Lied wird wiederholt + Fuzzy Aktuelles Lied wird nicht mehr wiederholt. @@ -1471,9 +1533,11 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Lieder gemischt. + Fuzzy - Lieder bewegt + Lied bewegt + Fuzzy {0}h {1}m {2}s @@ -1492,18 +1556,22 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Benutzung ALLER MODULE für Kanal {0} verboten. + Fuzzy Benutzung ALLER MODULE für Kanal {0} erlaubt. + Fuzzy Erlaubt Benutzung ALLER MODULE für die Rolle {0} verboten. + Fuzzy Benutzung ALLER MODULE für die Rolle {0} erlaubt. + Fuzzy Benutzung ALLER MODULE für diesen Server verboten. @@ -1513,9 +1581,11 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Benutzung ALLER MODULE für den Benutzer {0} verboten. + Fuzzy Benutzung ALLER MODULE für den Benutzer {0} erlaubt. + Fuzzy {0} mit ID {1} wurde zur Sperrliste hinzugefügt @@ -1525,18 +1595,22 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Befehl {0} hat keine Abklingzeit mehr und alle laufenden Abklingzeiten wurden entfernt. + Fuzzy Keine Befehls Abklingzeiten gesetzt. Preis für Befehle + Fuzzy Benutzung von {0} {1} wurde für Kanal {2} verboten. + Fuzzy Benutzung von {0} {1} wurde für Kanal {2} erlaubt. + Fuzzy Verweigert @@ -1546,6 +1620,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Liste der gefilterten Wörter + Fuzzy Wort {0} von der Liste der gefilterten Wörter entfernt. @@ -1617,7 +1692,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu {0} mit ID {1} von Sperrliste entfernt - Nicht Bearbeitbar + Nicht editierbar Benutzung von {0} {1} wurde für Benutzer {2} verboten. @@ -1626,7 +1701,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Benutzung von {0} {1} wurde für Benutzer {2} erlaubt. - Ich werde nicht mehr Warnungen für Rechte anzeigen. + Ich werde keine Warnungen für Rechte mehr anzeigen. Ich werde jetzt Warnungen für Rechte anzeigen. @@ -1647,10 +1722,10 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Fähigkeiten - Keine favoritisierten anime + Keine favorisierten anime - Startete die Automatische Übersetzung der Nachrichten auf diesem kanal. Nachrichten von Benutzern werden automatisch gelöscht. + Startete die Automatische Übersetzung der Nachrichten auf diesem Kanal. Nachrichten von Benutzern werden automatisch gelöscht. Ihre Automatische-Übersetzungs Sprache wurde entfernt. @@ -1666,7 +1741,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Automatische Übersetzung der Nachrichten wurde auf diesem kanal gestoppt. - Schlechter Eingabeformat, oder etwas lief schief. + Schlechtes Eingabeformat oder etwas lief schief. Konnte diese Karte nicht finden. @@ -1682,12 +1757,15 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Verlorene Competitives + Fuzzy Gespielte Competitives + Fuzzy Competitive Rang + Fuzzy Gewonnene Competitives @@ -1742,6 +1820,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Bildersuche für: + Fuzzy Konnte diesen Film nicht finden. @@ -1785,9 +1864,11 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Pausierte + Fuzzy Ursprüngliche Url + Fuzzy Ein osu! API-Schlüssel wird benötigt. @@ -1799,31 +1880,34 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Über {0} Bilder gefunden. Zeige zufälliges {0}. - Benutzer nicht gefunden! Bitte überprüfe die Region und den BattleTag before erneuten versuchen. + Benutzer nicht gefunden! Bitte überprüfe die Region und den BattleTag bevor erneuten Versuchen. Vermerkte - Platform + Plattform Keine Fähigkeit gefunden. - Kein pokemon gefunden. + Kein Pokemon gefunden. Profil Link: + Fuzzy Qualität Quick Spielzeit + Fuzzy Gewonnene Quicks + Fuzzy Bewertung @@ -1833,24 +1917,27 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Suche nach: + Fuzzy Url konnte nicht gekürzt werden Kurze Url + Fuzzy Etwas lief schief. - Bitte spezifizieren sie die Such Parameter. + Bitte spezifizieren Sie die Such Parameter. Status Geschäfts Url + Fuzzy Streamer {0} ist jetzt offline. @@ -1859,7 +1946,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Streamer {0} ist online mit {1} Zuschauern. - Sie folgen {0} Streamer auf diesem Server. + Sie folgen {0} Streamern auf diesem Server. Sie folgen keinem Streamer auf diesem Server. @@ -1883,7 +1970,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Sonnenuntergang - Temperature + Temperatur Titel: @@ -1913,13 +2000,14 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Der Begriff konnte auf dem spezifizierten wikia nicht gefunden werden. - Bitte geben sie ein Ziel wikia ein, gefolgt bei der Suchanfrage. + Bitte geben Sie ein Ziel wikia ein, gefolgt bei der Suchanfrage. Seite konnte nicht gefunden werden. Wind Geschwindigkeit + Fuzzy Die {0} meist gebannten Champions @@ -1937,6 +2025,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Aktivitäten Liste #{0} + Fuzzy {0} totale Benutzer. @@ -1955,12 +2044,14 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Thema des Kanals + Fuzzy Befehle ausgeführt Commands ran 9 -^used like that in .stats +^used like that in .stats +Fuzzy {0} {1} ist gleich zu {2} {3} @@ -1976,6 +2067,7 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Erstellt am + Fuzzy Betritt Multi-Server-Kanal. @@ -1984,10 +2076,11 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Verließ Multi-Server-Kanal. - Dies ist ihr MSK token + Dies ist Ihr MSK token Benutzerdefinierte Emojis + Fuzzy Fehler @@ -2003,9 +2096,11 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Hier ist eine Liste mit Nutzern in diesen Rollen: + Fuzzy Sie haben keine Berechtigung diesen Befehl auf Rollen mit vielen Nutzern zu benutzen um Missbrauch zu verhindern. + Fuzzy Ungültiger {0} Wert. @@ -2016,17 +2111,20 @@ Vergessen sie bitte nicht, ihren Discord-Namen oder ihre ID in der Nachricht zu Server beigetreten + Fuzzy ID: {0} Mitglieder: {1} ID des Besitzers: {2} + Fuzzy Keine Server auf dieser Seite gefunden. Liste der Wiederholer + Fuzzy Mitglieder @@ -2039,6 +2137,7 @@ ID des Besitzers: {2} Nachrichten Wiederholer + Fuzzy Name @@ -2085,19 +2184,20 @@ ID des Besitzers: {2} Keine Zitate auf dieser Seite. - Kein Zitat das sie entfernen können gefunden. + Kein Zitat das Sie entfernen können gefunden. Zitat hinzugefügt - Zufälliges Zitat wurde gelöscht. + Zitat #{0} wurde gelöscht. Region Registriert an + Fuzzy Ich werde {0} erinnern {1} in {2} `({3:d.M.yyyy.} um {4:HH:mm})` zu tun. @@ -2113,6 +2213,7 @@ ID des Besitzers: {2} Liste der Wiederholungen + Fuzzy Auf diesem Server laufen keine Wiederholer. @@ -2149,12 +2250,14 @@ ID des Besitzers: {2} Server Info + Fuzzy Shard Shard Statistiken + Fuzzy Shard **#{0}** ist im {1} status mit {2} Servern @@ -2170,9 +2273,10 @@ ID des Besitzers: {2} Text Kanäle + Fuzzy - Hier ist ihr Raum link + Hier ist Ihr Raum link Betriebszeit @@ -2185,7 +2289,104 @@ ID des Besitzers: {2} Benutzer - Sprach Kanäle + Sprach-Kanäle + Fuzzy + + + Sie sind diesem Rennen schon beigetreten! + + + Aktuelle Umfragewerte + + + Keine Abstimmungen eingereicht. + + + Eine Umfrage läuft bereits auf diesem Server. + + + 📃 {0} hat eine Umfrage erstellt die Ihre Aufmerksamkeit benötigt: + + + `{0}.` {1} mit {2} Abstimmungen. + + + {0} stimmte ab. + Kwoth voted. + + + Senden Sie mir eine Private Nachrciht mit der entsprechenden Nummer der Antwort. + Fuzzy + + + Senden Sie hier eine Nachricht mit der entsprechenden Nummer der Antwort. + + + Danke für das Abstimmen. {0} + + + {0} totale Abstimmungen eingereicht. + Fuzzy + + + sammel sie durch das Schreiben von `{0}pick` + + + sammel sie durch das Schreiben von `{0}pick + + + Kein Benutzer gefunden. + + + Seite {0} + + + Sie müssen in einem Sprachkanal auf diesem Server sein. + + + Keine Sprachkanal Rollen gefunden. + + + {0} wurde **stummgeschaltet** im Text- und Sprachchat für {1} minuten. + + + Benutzer die dem Sprachkanal {0} beitreten werden der Rolle {1} zugeweist. + + + Benutzer die den Sprachkanal {0} beitreten werden nicht länger einer Rolle zugeweist. + + + Rollen für Sprachkanäle + + + Auslösende Nachricht der benutzerdefinierten Reaktion mit der ID {0} wird nicht automatisch gelöscht. + + + Auslösende Nachricht der benutzerdefinierten Reaktion mit der ID {0} wird automatisch gelöscht. + + + Reaktionsnachricht für die benutzerdefinierte Reaktion mit der ID {0} wird nicht als DN gesendet. + + + Reaktionsnachricht für die benutzerdefinierte Reaktion mit der ID {0} wird nicht als DN gesendet. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.fr-fr.resx b/src/NadekoBot/Resources/ResponseStrings.en-US.resx similarity index 57% rename from src/NadekoBot/Resources/ResponseStrings.fr-fr.resx rename to src/NadekoBot/Resources/ResponseStrings.en-US.resx index ac95afb6..c384f48e 100644 --- a/src/NadekoBot/Resources/ResponseStrings.fr-fr.resx +++ b/src/NadekoBot/Resources/ResponseStrings.en-US.resx @@ -118,1798 +118,1787 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Cette base a déjà été revendiquée ou détruite. + That base is already claimed or destroyed. - Cette base est déjà détruite. + That base is already destroyed. - Cette base n'est pas revendiquée. + That base is not claimed. - Base #{0} **DETRUITE** dans une guerre contre {1} + **DESTROYED** base #{0} in a war against {1} - {0} a **ABANDONNÉ** la base #{1} dans une guerre contre {2} + {0} has **UNCLAIMED** base #{1} in a war against {2} - {0} a revendiqué une base #{1} dans une guerre contre {2} + {0} claimed a base #{1} in a war against {2} - @{0} Vous avez déjà revendiqué la base #{1}. Vous ne pouvez pas en revendiquer une nouvelle. + @{0} You already claimed base #{1}. You can't claim a new one. - La demande de la part de @{0} pour une guerre contre {1} a expiré. + Claim from @{0} in a war against {1} has expired. - Ennemi + Enemy - Informations concernant la guerre contre {0} + Info about war against {0} - Numéro de base invalide. + Invalid base number. - La taille de la guerre n'est pas valide. + Not a valid war size. - Liste des guerres en cours + List of active wars - non réclamé + not claimed - Vous ne participez pas a cette guerre. + You are not participating in that war. - @{0} Vous ne participez pas à cette guerre ou la base a déjà été détruite. + @{0} You are either not participating in that war, or that base is already destroyed. - Aucune guerre en cours. + No active war. - Taille + Size - La guerre contre {0} a déjà commencé! + War against {0} has already started. - La guerre contre {0} commence! + War against {0} created. - La guerre contre {0} est terminée. + War against {0} ended. - Cette guerre n'existe pas. + That war does not exist. - La guerre contre {0} a éclaté ! + War against {0} started! - Statistiques de réactions personnalisées effacées. + All custom reaction stats cleared. - Réaction personnalisée supprimée + Custom Reaction deleted - Permissions insuffisantes. Nécessite d'être le propriétaire du Bot pour avoir les réactions personnalisées globales, et Administrateur pour les réactions personnalisées du serveur. + Insufficient permissions. Requires Bot ownership for global custom reactions, and Administrator for server custom reactions. - Liste de toutes les réactions personnalisées + List of all custom reactions - Réactions personnalisées + Custom Reactions - Nouvelle réaction personnalisée + New Custom Reaction - Aucune réaction personnalisée trouvée. + No custom reaction found. - Aucune réaction personnalisée ne correspond à cet ID. + No custom reaction found with that id. - Réponse + Response - Statistiques des Réactions Personnalisées + Custom Reaction Stats - Statistiques effacées pour {0} réaction personnalisée. + Stats cleared for {0} custom reaction. - Pas de statistiques pour ce déclencheur trouvées, aucune action effectuée. + No stats for that trigger found, no action taken. - Déclencheur + Trigger - Autohentai arrêté. + Autohentai stopped. - Aucun résultat trouvé. + No results found. - {0} est déjà inconscient. + {0} has already fainted. - {0} a tous ses PV. + {0} already has full HP. - Votre type est déjà {0} + Your type is already {0} - Vous avez utilisé {0}{1} sur {2}{3} pour {4} dégâts. + used {0}{1} on {2}{3} for {4} damage. Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. - Vous ne pouvez pas attaquer de nouveau sans représailles ! + You can't attack again without retaliation! - Vous ne pouvez pas vous attaquer vous-même. + You can't attack yourself. - {0} s'est évanoui! + {0} has fainted! - Vous avez soigné {0} avec un {1} + healed {0} with one {1} - {0} a {1} points de vie restants. + {0} has {1} HP remaining. - Vous ne pouvez pas utiliser {0}. Ecrivez `{1}ml` pour voir la liste des actions que vous pouvez effectuer. + You can't use {0}. Type `{1}ml` to see a list of moves you can use. - Liste des attaques pour le type {0} + Movelist for {0} type - Ce n'est pas très efficace. + It's not effective. - Vous n'avez pas assez de {0} + You don't have enough {0} - Vous avez ressuscité {0} avec un {1} + revived {0} with one {1} - Vous vous êtes ressuscité avec un {0} + You revived yourself with one {0} - Votre type a bien été modifié de {0} à {1} + Your type has been changed to {0} for a {1} - C'est légèrement efficace. + It's somewhat effective. - C'est très efficace ! + It's super effective! - Vous avez utilisé trop de mouvements d'affilée, vous ne pouvez donc plus bouger! + You used too many moves in a row, so you can't move! - Le type de {0} est {1} + Type of {0} is {1} - Utilisateur non trouvé. + User not found. - Vous vous êtes évanoui, vous n'êtes donc pas capable de bouger! + You fainted, so you are not able to move! - **L'affectation automatique de rôle** à l'arrivé d'un nouvel utilisateur est désormais **désactivée**. + **Auto assign role** on user join is now **disabled**. - **L'affectation automatique de rôle** à l'arrivé d'un nouvel utilisateur est désormais **activée**. + **Auto assign role** on user join is now **enabled**. - Liens + Attachments - Avatar modifié + Avatar Changed - Vous avez été banni du serveur {0}. -Raison: {1} + You have been banned from {0} server. +Reason: {1} - banni + banned PLURAL - Utilisateur banni + User Banned - Le nom du Bot a changé pour {0} + Bot name changed to {0} - Le statut du Bot a changé pour {0} + Bot status changed to {0} - La suppression automatique des annonces de départ a été désactivée. + Automatic deletion of bye messages has been disabled. - Les annonces de départ seront supprimées après {0} secondes. + Bye messages will be deleted after {0} seconds. - Annonce de départ actuelle : {0} + Current bye message: {0} - Activez les annonces de départ en entrant {0} + Enable bye messages by typing {0} - Nouvelle annonce de départ définie. + New bye message set. - Annonce de départ désactivée. + Bye announcements disabled. - Annonce de départ activée sur ce salon. + Bye announcements enabled on this channel. - Nom du salon modifié + Channel Name Changed - Ancien nom + Old Name - Sujet du salon modifié + Channel Topic Changed - Nettoyé. + Cleaned up. - Contenu + Content - Rôle {0} créé avec succès + Sucessfully created role {0} - Salon textuel {0} créé. + Text channel {0} created. - Salon vocal {0} créé. + Voice channel {0} created. - Mise en sourdine effectuée. + Deafen successful. - Serveur {0} supprimé + Deleted server {0} - Suppression automatique des commandes effectuées avec succès, désactivée. + Stopped automatic deletion of successful command invokations. - Suppression automatique des commandes effectuées avec succès, activée. + Now automatically deleting sucessful command invokations. - Le salon textuel {0} a été supprimé. + Text channel {0} deleted. - Le salon vocal {0} a été supprimé. + Voice channel {0} deleted. - MP de + DM from - Nouveau donateur ajouté avec succès. Montant total des dons de cet utilisateur : {0} 👑 + Sucessfully added a new donator.Total donated amount from this user: {0} 👑 - Merci aux personnes ci-dessous pour avoir permis à ce projet d'exister! + Thanks to the people listed below for making this project happen! - Je transmettrai désormais les MPs à tous les propriétaires. + I will forward DMs to all owners. - Je transmettrai désormais les MPs seulement au propriétaire principal. + I will forward DMs only to the first owner. - Je transmettrai désormais les MPs. + I will forward DMs from now on. - Je ne transmettrai désormais plus les MPs. + I will stop forwarding DMs from now on. - La suppression automatique des messages d'accueil a été désactivé. + Automatic deletion of greet messages has been disabled. - Les messages d'accueil seront supprimés après {0} secondes. + Greet messages will be deleted after {0} seconds. - MP de bienvenue actuel: {0} + Current DM greet message: {0} - Activez les MPs de bienvenue en écrivant {0} + Enable DM greet messages by typing {0} - Nouveau MP de bienvenue défini. + New DM greet message set. - MPs de bienvenue désactivés. + DM greet announcements disabled. - MPs de bienvenue activés. + DM greet announcements enabled. - Message de bienvenue actuel: {0} + Current greet message: {0} - Activez les messages de bienvenue en écrivant {0} + Enable greet messages by typing {0} - Nouveau message de bienvenue défini. + New greet message set. - Messages de bienvenue désactivés. + Greet announcements disabled. - Messages de bienvenue activés sur ce salon. + Greet announcements enabled on this channel. - Vous ne pouvez pas utiliser cette commande sur les utilisateurs dont le rôle est supérieur ou égal au vôtre dans la hiérarchie. + You can't use this command on users with a role higher or equal to yours in the role hierarchy. - Images chargées après {0} secondes! + Images loaded after {0} seconds! - Format d'entrée invalide. + Invalid input format. - Paramètres invalides. + Invalid parameters. - {0} a rejoint {1} + {0} has joined {1} - Vous avez été expulsé du serveur {0}. -Raison : {1} + You have been kicked from {0} server. +Reason: {1} - Utilisateur expulsé + User kicked - Listes des langues -{0} + List of languages - La langue du serveur est désormais {0} - {1} + Your server's locale is now {0} - {1} - La langue par défaut du bot est désormais {0} - {1} + Bot's default locale is now {0} - {1} - La langue du bot a été changée pour {0} - {1} + Bot's language is set to {0} - {1} - Échec dans la tentative de changement de langue. Veuillez consulter l'aide pour cette commande. + Failed setting locale. Revisit this command's help. - La langue de ce serveur est {0} - {1} + This server's language is set to {0} - {1} - {0} a quitté {1} + {0} has left {1} - Serveur {0} quitté + Left server {0} - Enregistrement de {0} événements dans ce salon. + Logging {0} event in this channel. - Enregistrement de tous les événements dans ce salon. + Logging all events in this channel. - Enregistrement désactivé. + Logging disabled. - Événements enregistrés que vous pouvez suivre : + Log events you can subscribe to: - L'enregistrement ignorera désormais {0} + Logging will ignore {0} - L'enregistrement n'ignorera pas {0} + Logging will not ignore {0} - L’événement {0} ne sera plus enregistré. + Stopped logging {0} event. - {0} a émis une notification pour les rôles suivants + {0} has invoked a mention on the following roles - Message de {0} `[Bot Owner]` : + Message from {0} `[Bot Owner]`: - Message envoyé. + Message sent. - {0} déplacé de {1} à {2} - L'utilisateur n'a pas forcément été déplacé de son plein gré. S'est déplacé - déplacé + {0} moved from {1} to {2} - Message supprimé dans #{0} + Message deleted in #{0} - Mise à jour du message dans #{0} + Message updated in #{0} - Tous les utilisateurs sont maintenant muets. + Muted PLURAL (users have been muted) - L'utilisateur est maintenant muet. + Muted singular "User muted." - Il semblerait que je n'ai pas la permission nécessaire pour effectuer cela. + I don't have the permission necessary for that most likely. - Nouveau rôle muet créé. + New mute role set. - J'ai besoin de la permission d'**Administrateur** pour effectuer cela. + I need **Administration** permission to do that. - Nouveau message + New message - Nouveau pseudonyme + New nickname - Nouveau sujet + New topic - Pseudonyme changé + Nickname changed - Impossible de trouver ce serveur + Can't find that server - Aucun Shard pour cet ID trouvée. - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. + No shard with that ID found. - Ancien message + Old message - Ancien pseudonyme + Old nickname - Ancien sujet + Old topic - Erreur. Je ne dois sûrement pas posséder les permissions suffisantes. + Error. Most likely I don't have sufficient permissions. - Les permissions pour ce serveur ont été réinitialisées. + Permissions for this server are reset. - Protections actives + Active protections - {0} a été **désactivé** sur ce serveur. + {0} has been **disabled** on this server. - {0} Activé + {0} Enabled - Erreur. J'ai besoin de la permission Gérer les rôles. + Error. I need ManageRoles permission - Aucune protection activée. + No protection enabled. - Le seuil d'utilisateurs doit être entre {0} et {1}. + User threshold must be between {0} and {1}. - Si {0} ou plus d'utilisateurs rejoignent dans les {1} secondes suivantes, je les {2}. + If {0} or more users join within {1} seconds, I will {2} them. - Le temps doit être compris entre {0} et {1} secondes. + Time must be between {0} and {1} seconds. - Vous avez retirés tous les rôles de l'utilisateur {0} avec succès + Successfully removed all roles from user {0} - Impossible de retirer des rôles. Je n'ai pas les permissions suffisantes. + Failed to remove roles. I have insufficient permissions. - La couleur du rôle {0} a été modifiée. + Color of {0} role has been changed. - Ce rôle n'existe pas. + That role does not exist. - Les paramètres spécifiés sont invalides. + The parameters specified are invalid. - Erreur due à un manque de permissions ou à une couleur invalide. + Error occured due to invalid color or insufficient permissions. - L'utilisateur {1} n'appartient plus au rôle {0}. + Successfully removed role {0} from user {1} - Impossible de supprimer ce rôle. Je ne possède pas les permissions suffisantes. + Failed to remove role. I have insufficient permissions. - Rôle renommé. + Role renamed. - Impossible de renommer ce rôle. Je ne possède pas les permissions suffisantes. + Failed to rename role. I have insufficient permissions. - Vous ne pouvez pas modifier les rôles supérieurs au votre. + You can't edit roles higher than your highest role. - La répétition du message suivant a été désactivé: {0} + Removed the playing message: {0} - Le rôle {0} a été ajouté à la liste. + Role {0} as been added to the list. - {0} introuvable. Nettoyé. + {0} not found.Cleaned up. - Le rôle {0} est déjà présent dans la liste. + Role {0} is already in the list. - Ajouté. + Added. - Rotation du statut de jeu désactivée. + Rotating playing status disabled. - Rotation du statut de jeu activée. + Rotating playing status enabled. - Voici une liste des rotations de statuts : + Here is a list of rotating statuses: {0} - Aucune rotation de statuts en place. + No rotating playing statuses set. - Vous avez déjà le rôle {0}. + You already have {0} role. - Vous avez déjà {0} rôles exclusifs auto-attribués. + You already have {0} exclusive self-assigned role. - Rôles auto-attribuables désormais exclusifs. + Self assigned roles are now exclusive! - Il y a {0} rôles auto-attribuables. + There are {0} self assignable roles - Ce rôle ne peux pas vous être attribué par vous-même. + That role is not self-assignable. - Vous ne possédez pas le rôle {0}. + You don't have {0} role. - Les rôles auto-attribuables ne sont désormais plus exclusifs! - Je ne pense pas que ce soit la bonne traduction.. self-assignable role serait plutôt rôle auto-attribuable + Self assigned roles are now not exclusive! - Je suis incapable de vous ajouter ce rôle. `Je ne peux pas ajouter de rôles aux propriétaires et aux autres rôles plus haut que le mien dans la hiérarchie.` + I am unable to add that role to you. `I can't add roles to owners or other roles higher than my role in the role hierarchy.` - {0} a été supprimé de la liste des rôles auto-attribuables. + {0} has been removed from the list of self-assignable roles. - Vous n'avez plus le rôle {0}. + You no longer have {0} role. - Vous avez désormais le rôle {0}. + You now have {0} role. - L'ajout du rôle {0} pour l'utilisateur {1} a été réalisé avec succès. + Sucessfully added role {0} to user {1} - Impossible d'ajouter un rôle. Je ne possède pas les permissions suffisantes. + Failed to add role. I have insufficient permissions. - Nouvel avatar défini! + New avatar set! - Nouveau nom de Salon défini avec succès. + New channel name set. - Nouveau jeu défini! - Pour "set", je pense que défini irait mieux que "en service" + New game set! - Nouveau stream défini! + New stream set! - Nouveau sujet du salon défini. + New channel topic set. - Shard {0} reconnectée. - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. + Shard {0} reconnected. - Shard {0} en reconnection. - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. + Shard {0} reconnecting. - Arrêt en cours. + Shutting down - Les utilisateurs ne peuvent pas envoyer plus de {0} messages toutes les {1} secondes. + Users can't send more than {0} messages every {1} seconds. - Mode ralenti désactivé. + Slow mode disabled. - Mode ralenti activé + Slow mode initiated - expulsés (kick) + soft-banned (kicked) PLURAL - {0} ignorera ce Salon. + {0} will ignore this channel. - {0} n'ignorera plus ce Salon. + {0} will no longer ignore this channel. - Si un utilisateur poste {0} le même message à la suite, je le {1}. - __SalonsIgnorés__: {2} + If a user posts {0} same messages in a row, I will {1} them. + __IgnoredChannels__: {2} - Salon textuel crée. + Text channel created. - Salon textuel détruit. + Text channel destroyed. - Son activé avec succès. + Undeafen successful. - Micro activé + Unmuted singular - Nom d'utilisateur. + Username - Nom d'utilisateur modifié. + Username changed - Utilisateurs + Users - Utilisateur banni + User banned - {0} est maintenant **muet** sur le chat. + {0} has been **muted** from chatting. - **La parole a été rétablie** sur le chat pour {0}. + {0} has been **unmuted** from chatting. - L'utilisateur a rejoint + User joined - L'utilisateur a quitté + User left - {0} est maintenant **muet** à la fois sur le salon textuel et vocal. + {0} has been **muted** from text and voice chat. - Rôle ajouté à l'utilisateur + User's role added - Rôle retiré de l'utilisateur + User's role removed - {0} est maintenant {1} + {0} is now {1} - {0} n'est maintenant **plus muet** des salons textuels et vocaux. + {0} has been **unmuted** from text and voice chat. - {0} a rejoint le salon vocal {1}. + {0} has joined {1} voice channel. - {0} a quitté le salon vocal {1}. + {0} has left {1} voice channel. - {0} est allé du salon vocal {1} au {2}. + {0} moved from {1} to {2} voice channel. - {0} est maintenant **muet**. + {0} has been **voice muted**. - {0} n'est maintenant **plus muet**. + {0} has been **voice unmuted**. - Salon vocal crée. + Voice channel created - Salon vocal détruit. + Voice channel destroyed - Fonctionnalités vocales et textuelles désactivées. + Disabled voice + text feature. - Fonctionnalités vocales et textuelles activées. + Enabled voice + text feature. - Je n'ai pas la permission **Gérer les rôles** et/ou **Gérer les salons**, je ne peux donc pas utiliser `voice+text` sur le serveur {0}. + I don't have **manage roles** and/or **manage channels** permission, so I cannot run `voice+text` on {0} server. - Vous activez/désactivez cette fonctionnalité et **je n'ai pas les permissions ADMINISTRATEURS**. Cela pourrait causer des dysfonctionnements, et vous devrez nettoyer les salons textuels vous-même après ça. + You are enabling/disabling this feature and **I do not have ADMINISTRATOR permissions**. This may cause some issues, and you will have to clean up text channels yourself afterwards. - Je nécessite au moins les permissions **Gérer les rôles** et **Gérer les salons** pour activer cette fonctionnalité. (permissions administateurs préférées) + I require atleast **manage roles** and **manage channels** permissions to enable this feature. (preffered Administration permission) - Utilisateur {0} depuis un salon textuel. + User {0} from text chat - Utilisateur {0} depuis salon textuel et vocal. + User {0} from text and voice chat - Utilisateur {0} depuis un salon vocal. + User {0} from voice chat - Vous avez été expulsé du serveur {0}. -Raison: {1} + You have been soft-banned from {0} server. +Reason: {1} - Utilisateur débanni + User unbanned - Migration effectuée! + Migration done! - Erreur lors de la migration, veuillez consulter la console pour plus d'informations. + Error while migrating, check bot's console for more information. - Présences mises à jour. + Presence updates - Utilisateur expulsé. + User soft-banned - a récompensé {0} à {1} + has awarded {0} to {1} - Meilleure chance la prochaine fois ^_^ + Better luck next time ^_^ - Félicitations! Vous avez gagné {0} pour avoir lancé au dessus de {1} + Congratulations! You won {0} for rolling above {1} - Deck remélangé. + Deck reshuffled. - Lancé {0}. + flipped {0}. User flipped tails. - Vous l'avez deviné! Vous avez gagné {0} + You guessed it! You won {0} - Nombre spécifié invalide. Vous pouvez lancer 1 à {0} pièces. + Invalid number specified. You can flip 1 to {0} coins. - Ajoute la réaction {0} à ce message pour avoir {1} + Add {0} reaction to this message to get {1} - Cet événement est actif pendant {0} heures. + This event is active for up to {0} hours. - L'événement "réactions fleuries" a démarré! + Flower reaction event started! - a donné {0} à {1} + has gifted {0} to {1} X has gifted 15 flowers to Y - {0} a {1} + {0} has {1} X has Y flowers - Face + Head - Classement + Leaderboard - {1} utilisateurs du rôle {2} ont été récompensé de {0}. + Awarded {0} to {1} users from {2} role. - Vous ne pouvez pas miser plus de {0} + You can't bet more than {0} - Vous ne pouvez pas parier moins de {0} + You can't bet less than {0} - Vous n'avez pas assez de {0} + You don't have enough {0} - Plus de carte dans le deck. + No more cards in the deck. - Utilisateur tiré au sort + Raffled user - Vous avez roulé un {0}. + You rolled {0}. - Mise + Bet - WOAAHHHHHH!!! Félicitations!!! x{0} + WOAAHHHHHH!!! Congratulations!!! x{0} - Une simple {0}, x{1} + A single {0}, x{1} - Wow! Quelle chance! Trois du même genre! x{0} + Wow! Lucky! Three of a kind! x{0} - Bon travail! Deux {0} - mise x{1} + Good job! Two {0} - bet x{1} - Gagné + Won - Les utilisateurs doivent écrire un code secret pour avoir {0}. Dure {1} secondes. Ne le dite à personne. Shhh. + Users must type a secret code to get {0}. +Lasts {1} seconds. Don't tell anyone. Shhh. - L’événement "jeu sournois" s'est fini. {0} utilisateurs ont reçu la récompense. + SneakyGame event ended. {0} users received the reward. - L'événement "jeu sournois" a démarré + SneakyGameStatus event started - Pile + Tail - Vous avez pris {0} de {1} avec succès + successfully took {0} from {1} - Impossible de prendre {0} de {1} car l'utilisateur n'a pas assez de {2}! + was unable to take {0} from{1} because the user doesn't have that much {2}! - Retour à la table des matières + Back to ToC - Propriétaire du Bot seulement + Bot owner only - Nécessite {0} permissions du salon. + Requires {0} channel permission. - Vous pouvez supporter ce projet sur Patreon <{0}> ou via Paypal <{1}> + You can support the project on patreon: <{0}> or paypal: <{1}> - Commandes et alias + Commands and aliases - Liste des commandes rafraîchie. + Commandlist regenerated. - Écrivez `{0}h NomDeLaCommande` pour voir l'aide spécifique à cette commande. Ex: `{0}h >8ball` + Type `{0}h CommandName` to see the help for that specified command. e.g. `{0}h >8ball` - Impossible de trouver cette commande. Veuillez vérifier qu'elle existe avant de réessayer. + I can't find that command. Please verify that the command exists before trying again. Description - Vous pouvez supporter le projet NadekoBot -sur Patreon <{0}> -par Paypal <{1}> -N'oubliez pas de mettre votre nom discord ou ID dans le message. + You can support the NadekoBot project on +Patreon <{0}> or +Paypal <{1}> +Don't forget to leave your discord name or id in the message. -**Merci** ♥️ +**Thank you** ♥️ - **Liste des Commandes**: <{0}> -**La liste des guides et tous les documents peuvent être trouvés ici**: <{1}> + **List of commands**: <{0}> +**Hosting guides and docs can be found here**: <{1}> - Liste des commandes + List of commands - Liste des modules + List of modules - Entrez `{0}cmds NomDuModule` pour avoir la liste des commandes de ce module. ex `{0}cmds games` + Type `{0}cmds ModuleName` to get a list of commands in that module. eg `{0}cmds games` - Ce module n'existe pas. + That module does not exist. - Permission serveur {0} requise. + Requires {0} server permission. - Table des matières + Table of contents Usage - Autohentai commencé. Publie toutes les {0}s avec l'un des tags suivants : + Autohentai started. Reposting every {0}s with one of the following tags: {1} Tag - Course d'animaux + Animal race - Pas assez de participants pour commencer. + Failed to start since there was not enough participants. - Suffisamment de participants ! La course commence. + Race is full! Starting immediately. - {0} a rejoint sous la forme d'un {1} + {0} joined as a {1} - {0} a rejoint sous la forme d'un {1} et mise sur {2} ! + {0} joined as a {1} and bet {2}! - Entrez {0}jr pour rejoindre la course. + Type {0}jr to join the race. - Début dans 20 secondes ou quand le nombre maximum de participants est atteint. + Starting in 20 seconds or when the room is full. - Début avec {0} participants. + Starting with {0} participants. - {0} sous la forme d'un {1} a gagné la course ! + {0} as {1} Won the race! - {0} sous la forme d'un {1} a gagné la course et {2}! + {0} as {1} Won the race and {2}! - Nombre spécifié invalide. Vous pouvez lancer de {0} à {1} dés à la fois. + Invalid number specified. You can roll {0}-{1} dice at once. - tiré au sort {0} + rolled {0} Someone rolled 35 - Dé tiré au sort: {0} + Dice rolled: {0} Dice Rolled: 5 - Le lancement de la course a échoué. Une autre course doit probablement être en cours. + Failed starting the race. Another race is probably running. - Aucune course n'existe sur ce serveur. + No race exists on this server - Le deuxième nombre doit être plus grand que le premier. + Second number must be larger than the first one. - Changements de Coeur + Changes of heart - Revendiquée par + Claimed by Divorces - Aime + Likes - Prix + Price - Aucune waifu n'a été revendiquée pour l'instant. + No waifus have been claimed yet. Top Waifus - votre affinité est déjà liée à cette waifu ou vous êtes en train de retirer votre affinité avec quelqu'un alors que vous n'en possédez pas. + your affinity is already set to that waifu or you're trying to remove your affinity while not having one. - Affinités changées de de {0} à {1}. + changed their affinity from {0} to {1}. -*C'est moralement discutable.* 🤔 +*This is morally questionable.*🤔 Make sure to get the formatting right, and leave the thinking emoji - Vous devez attendre {0} heures et {1} minutes avant de pouvoir changer de nouveau votre affinité. + You must wait {0} hours and {1} minutes in order to change your affinity again. - Votre affinité a été réinitialisée. Vous n'avez désormais plus la personne que vous aimez. + Your affinity is reset. You no longer have a person you like. - veut être la waifu de {0}. Aww <3 + wants to be {0}'s waifu. Aww <3 - a revendiqué {0} comme sa waifu pour {1} + claimed {0} as their waifu for {1}! - Vous avez divorcé avec une waifu qui vous aimais. Monstre sans cœur. {0} a reçu {1} en guise de compensation. + You have divorced a waifu who likes you. You heartless monster. +{0} received {1} as a compensation. - vous ne pouvez pas vous lier d'affinité avec vous-même, espèce d'égocentrique. + you can't set affinity to yourself, you egomaniac. - 🎉Leur amour est comblé !🎉 -La nouvelle valeur de {0} est {1} ! + 🎉 Their love is fulfilled! 🎉 +{0}'s new value is {1}! - Aucune waifu n'est à ce prix. Tu dois payer au moins {0} pour avoir une waifu, même si sa vraie valeur est inférieure. + No waifu is that cheap. You must pay at least {0} to get a waifu, even if their actual value is lower. - Tu dois payer {0} ou plus pour avoir cette waifu ! + You must pay {0} or more to claim that waifu! - Cette waifu ne t'appartient pas. + That waifu is not yours. - Tu ne peux pas t'acquérir toi-même. + You can't claim yourself. - Vous avez récemment divorcé. Vous devez attendre {0} heures et {1} minutes pour divorcer à nouveau. + You divorced recently. You must wait {0} hours and {1} minutes to divorce again. - Personne + Nobody - Vous avez divorcé d'une waifu qui ne vous aimait pas. Vous recevez {0} en retour. + You have divorced a waifu who doesn't like you. You received {0} back. 8ball - Acrophobie + Acrophobia - Le jeu a pris fin sans soumissions. + Game ended with no submissions. - Personne n'a voté : la partie se termine sans vainqueur. + No votes cast. Game ended with no winner. - L'acronyme était {0}. + Acronym was {0}. - Une partie d'Acrophobia est déjà en cours sur ce salon. + Acrophobia game is already running in this channel. - La partie commence. Créez une phrase avec l'acronyme suivant : {0}. + Game started. Create a sentence with the following acronym: {0}. - Vous avez {0} secondes pour faire une soumission. + You have {0} seconds to make a submission. - {0} a soumit sa phrase. ({1} au total) + {0} submitted their sentence. ({1} total) - Votez en entrant le numéro d'une soumission. + Vote by typing a number of the submission - {0} a voté! + {0} cast their vote! - Le gagnant est {0} avec {1} points! + Winner is {0} with {1} points. - {0} est le gagnant pour être le seul utilisateur à avoir fait une soumission! + {0} is the winner for being the only user who made a submission! Question - Egalité ! Vous avez choisi {0}. + It's a draw! Both picked {0} - {0} a gagné ! {1} bat {2}. + {0} won! {1} beats {2} - Inscriptions terminées. + Submissions closed - Une course d'animaux est déjà en cours. + Animal Race is already running. - Total : {0} Moyenne : {1} + Total: {0} Average: {1} - Catégorie + Category - Cleverbot désactivé sur ce serveur. + Disabled cleverbot on this server. - Cleverbot activé sur ce serveur. + Enabled cleverbot on this server. - La génération monétaire a été désactivée sur ce salon. - Currency =/= current !!! Il s'agit de monnaie. Par example: Euro is a currency. US Dollar also is. Sur Public Nadeko, il s'agit des fleurs :) + Currency generation has been disabled on this channel. - La génération monétaire a été désactivée sur ce salon. + Currency generation has been enabled on this channel. - {0} {1} aléatoires sont apparus ! Attrapez-les en entrant `{2}pick` + {0} random {1} appeared! plural - Un {0} aléatoire est apparu ! Attrapez-le en entrant `{1}pick` + A random {0} appeared! - Impossible de charger une question. + Failed loading a question. - La jeu a commencé. + Game started - Partie de pendu commencée. + Hangman game started - Une partie de pendu est déjà en cours sur ce canal. + Hangman game already running on this channel. - Initialisation du pendu erronée. + Starting hangman errored. - Liste des "{0}hangman" types de termes : + List of "{0}hangman" term types: - Classement + Leaderboard - Vous n'avez pas assez de {0} + You don't have enough {0} - Pas de résultat + No results - a cueilli {0} + picked {0} Kwoth picked 5* - {0} a planté {1} + {0} planted {1} Kwoth planted 5* - Une partie de Trivia est déjà en cours sur ce serveur. + Trivia game is already running on this server. - Partie de Trivia + Trivia Game - {0} a deviné! La réponse était: {1} + {0} guessed it! The answer was: {1} - Aucune partie de Trivia en cours sur ce serveur. + No trivia is running on this server. - {0} a {1} points + {0} has {1} points - Le jeu s'arrêtera après cette question. + Stopping after this question. - Le temps a expiré! La réponse était {0} + Time's up! The correct answer was {0} - {0} a deviné la réponse et gagne la partie! La réponse était: {1} + {0} guessed it and WON the game! The answer was: {1} - Vous ne pouvez pas jouer contre vous-même. + You can't play against yourself. - Une partie de Morpion est déjà en cours sur ce salon. + TicTacToe Game is already running in this channel. - Égalité! + A draw! - a crée une partie de Morpion. + has created a game of TicTacToe. - {0} a gagné ! + {0} has won! - Trois alignés. + Matched three - Aucun mouvement restant ! + No moves left! - Le temps a expiré ! + Time expired! - Tour de {0}. + {0}'s move - {0} contre {1} + {0} vs {1} - Tentative d'ajouter {0} à la file d'attente... + Attempting to queue {0} songs... - Lecture automatique désactivée. + Autoplay disabled. - Lecture automatique activée. + Autoplay enabled. - Volume de base défini à {0}% + Default volume set to {0}% - File d'attente complète. + Directory queue complete. - à tour de rôle + fairplay - Lecture terminée + Finished song - Système de tour de rôle désactivé. + Fair play disabled. - Système de tour de rôle activé. + Fair play enabled. - De la position + From position Id - Entrée invalide. + Invalid input. - Le temps maximum de lecture n'a désormais plus de limite. + Max playtime has no limit now. - Le temps de lecture maximum a été mis à {0} seconde(s). + Max playtime set to {0} second(s). - La taille de la file d'attente est désormais illmitée. + Max music queue size set to unlimited. - La taille de la file d'attente est désormais de {0} piste(s). + Max music queue size set to {0} track(s). - Vous avez besoin d'être dans un salon vocal sur ce serveur. + You need to be in the voice channel on this server. - Nom + Name - Vous écoutez + Now playing - Aucun lecteur de musique actif. + No active music player. - Pas de résultat. + No search results. - Lecteur mis sur pause. + Music playback paused. - Liste d'attente - Page {0}/{1} + Player queue - Page {0}/{1} - Lecture en cours: + Playing song - `#{0}` - **{1}** par *{2}* ({3} morceaux) + `#{0}` - **{1}** by *{2}* ({3} songs) - Page {0} des listes de lecture sauvegardées + Page {0} of saved playlists - Liste de lecture supprimée. + Playlist deleted. - Impossible de supprimer cette liste de lecture. Soit elle n'existe pas, soit vous n'en êtes pas le créateur. + Failed to delete that playlist. It either doesn't exist, or you are not its author. - Aucune liste de lecture ne correspond a cet ID. + Playlist with that ID doesn't exist. - File d'attente de la liste complétée. + Playlist queue complete. - Liste de lecture sauvegardée + Playlist saved - Limite à {0}s + {0}s limit - Liste d'attente + Queue - Son ajouté à la file d'attente + Queued song - Liste d'attente effacée. + Music queue cleared. - Liste d'attente complète ({0}/{0}). + Queue is full at {0}/{0}. - Son retiré + Removed song context: "removed song #5" - Répétition de la musique en cours + Repeating current song - Liste de lecture en boucle + Repeating playlist - Piste en boucle + Repeating track - La piste ne sera lue qu'une fois. + Current track repeat stopped. - Reprise de la lecture. + Music playback resumed. - Lecture en boucle désactivée. + Repeat playlist disabled. - Lecture en boucle activée. + Repeat playlist enabled. - Je vais désormais afficher les musiques en cours, en pause, terminées et supprimées sur ce salon. + I will now output playing, finished, paused and removed songs in this channel. - Saut à `{0}:{1}` + Skipped to `{0}:{1}` - Lecture aléatoire activée. + Songs shuffled - Musique déplacée + Song moved {0}h {1}m {2}s - En position + To position - Illimité + unlimited - Le volume doit être compris entre 0 et 100 + Volume must be between 0 and 100 - Volume réglé sur {0}% + Volume set to {0}% - Désactivation de l'usage de TOUS LES MODULES pour le salon {0}. + Disabled usage of ALL MODULES on channel {0}. - Activation de l'usage de TOUS LES MODULES pour le salon {0}. + Enabled usage of ALL MODULES on channel {0}. - Permis + Allowed - Désactivation de l'usage de TOUS LES MODULES pour le rôle {0}. + Disabled usage of ALL MODULES for role {0}. - Activation de l'usage de TOUS LES MODULES pour le rôle {0}. + Enabled usage of ALL MODULES for role {0}. - Désactivation de l'usage de TOUS LES MODULES sur ce serveur. + Disabled usage of ALL MODULES on this server. - Activation de l'usage de TOUS LES MODULES sur ce serveur. + Enabled usage of ALL MODULES on this server. - Désactivation de l'usage de TOUS LES MODULES pour l'utilisateur {0}. + Disabled usage of ALL MODULES for user {0}. - Activation de l'usage de TOUS LES MODULES pour l'utilisateur {0}. + Enabled usage of ALL MODULES for user {0}. - {0} sur liste noire avec l'ID {1} - Il ne s'agit pas d'un ban mais d'une blacklist interdisant l'utilisateur d'utiliser le bot. + Blacklisted {0} with ID {1} - La commande {0} a désormais {1}s de temps de recharge. + Command {0} now has a {1}s cooldown. - La commande {0} n'a pas de temps de recharge et tous les temps de recharge ont été réinitialisés. + Command {0} has no cooldown now and all existing cooldowns have been cleared. - Aucune commande n'a de temps de recharge. + No command cooldowns set. - Coût de la commande : + Command costs - Usage de {0} {1} désactivé sur le salon {2}. + Disabled usage of {0} {1} on channel {2}. - Usage de {0} {1} activé sur le salon {2}. + Enabled usage of {0} {1} on channel {2}. - Refusé + Denied - Ajout du mot {0} à la liste des mots filtrés. + Added word {0} to the list of filtered words. - Liste Des Mots Filtrés + List of filtered words - Suppression du mot {0} de la liste des mots filtrés. + Removed word {0} from the list of filtered words. - Second paramètre invalide. (nécessite un nombre entre {0} et {1}) + Invalid second parameter.(Must be a number between {0} and {1}) - Filtrage des invitations désactivé sur ce salon. + Invite filtering disabled on this channel. - Filtrage des invitations activé sur ce salon. + Invite filtering enabled on this channel. - Filtrage des invitations désactivé sur le serveur. + Invite filtering disabled on this server. - Filtrage des invitations activé sur le serveur. + Invite filtering enabled on this server. - Permission {0} déplacée de #{1} à #{2} + Moved permission {0} from #{1} to #{2} - Impossible de trouver la permission à l'index #{0} + Can't find permission at index #{0} - Aucun coût défini. + No costs set. - Commande + command Gen (of command) - Module + module Gen. (of module) - Page {0} des permissions + Permissions page {0} - Le rôle des permissions actuelles est {0}. + Current permissions role is {0}. - Il faut maintenant avoir le rôle {0} pour modifier les permissions. + Users now require {0} role in order to edit permissions. - Aucune permission trouvée à cet index. + No permission found on that index. - Supression des permissions #{0} - {1} + removed permission #{0} - {1} - Usage de {0} {1} désactivé pour le rôle {2}. + Disabled usage of {0} {1} for {2} role. - Usage de {0} {1} activé pour le rôle {2}. + Enabled usage of {0} {1} for {2} role. sec. Short of seconds. - Usage de {0} {1} désactivé pour le serveur. + Disabled usage of {0} {1} on this server. - Usage de {0} {1} activé pour le serveur. + Enabled usage of {0} {1} on this server. - Débanni {0} avec l'ID {1} + Unblacklisted {0} with ID {1} - Non modifiable + uneditable - Usage de {0} {1} désactivé pour l'utilisateur {2}. + Disabled usage of {0} {1} for {2} user. - Usage de {0} {1} activé pour l'utilisateur {2}. + Enabled usage of {0} {1} for {2} user. - Je n'afficherai plus les avertissements des permissions. + I will no longer show permission warnings. - J'afficherai désormais les avertissements des permissions. + I will now show permission warnings. - Filtrage des mots désactivé sur ce salon. + Word filtering disabled on this channel. - Filtrage des mots activé sur ce salon. + Word filtering enabled on this channel. - Filtrage des mots désactivé sur le serveur. + Word filtering disabled on this server. - Filtrage des mots activé sur le serveur. + Word filtering enabled on this server. - Capacités + Abilities - Pas encore d'anime préféré + No favorite anime yet - Traduction automatique des messages activée sur ce salon. Les messages utilisateurs vont désormais être supprimés. + Started automatic translation of messages on this channel. User messages will be auto-deleted. - Votre langue de traduction à été supprimée. + your auto-translate language has been removed. - Votre langue de traduction a été changée de {0} à {1} - Fuzzy + Your auto-translate language has been set to {0}>{1} - Traduction automatique des messages commencée sur ce salon. + Started automatic translation of messages on this channel. - Traduction automatique des messages arrêtée sur ce salon. + Stopped automatic translation of messages on this channel. - Le format est invalide ou une erreur s'est produite. + Bad input format, or something went wrong. - Impossible de trouver cette carte. + Couldn't find that card. - fait + fact - Chapitres + Chapters - Bande dessinée # + Comic # - Parties compétitives perdues + Competitive losses - Parties compétitives jouées + Competitive played - Rang en compétitif + Competitive rank - Parties compétitives gagnées + Competitive Wins - Complétés + Completed Condition - Coût + Cost Date - Définis: + Define: - Abandonnés - droppped as in, "stopped watching" referring to shows/anime + Dropped Episodes - Une erreur s'est produite. + Error occured. - Exemple + Example - Impossible de trouver cet anime. + Failed finding that animu. - Impossible de trouver ce manga. + Failed finding that mango. Genres - Impossible de trouver une définition pour ce hashtag. + Failed finding a definition for that tag. - Taille/Poid + Height/Weight {0}m/{1}kg - Humidité + Humidity - Recherche d'images pour: + Image search for: - Impossible de trouver ce film. + Failed to find that movie. - Langue d'origine ou de destination invalide. + Invalid source or target language. - Blagues non chargées. + Jokes not loaded. Lat/Long - Niveau + Level - Liste de tags pour {0}place. + List of {0}place tags Don't translate {0}place - Emplacement + Location - Les objets magiques ne sont pas chargés. + Magic Items not loaded. - Profil MAL de {0} + {0}'s MAL profile - Le propriétaire du Bot n'a pas spécifié de clé d'API Mashape (MashapeApiKey). Fonctionnalité non disponible + Bot owner didn't specify MashapeApiKey. You can't use this functionality. Min/Max - Aucun salon trouvé. + No channel found. - Aucun résultat trouvé. + No results found. - En attente + On-hold - Url originale + Original url - Une clé d'API osu! est nécessaire. + An osu! API key is required. - Impossible de récupérer la signature osu!. + Failed retrieving osu! signature. - Trouvé dans {0} images. Affichage de {0} aléatoires. + Found over {0} images. Showing random {0}. - Utilisateur non trouvé! Veuillez vérifier la région ainsi que le BattleTag avant de réessayer. + User not found! Please check the Region and BattleTag before trying again. - Prévus de regarder - Je ne pense pas que le sens de la traduction soit le bon. + Plan to watch - Plateforme + Platform - Attaque non trouvée. + No ability found. - Pokémon non trouvé. + No pokemon found. - Lien du profil : + Profile link: - Qualité + Quality: - Durée en Jeux Rapides + Quick playtime - Victoires Rapides + Quick wins - Évaluation + Rating Score: - Chercher pour: - recherche plutôt non ? + Search for: - Impossible de réduire cette Url. + Failed to shorten that url. - Url réduite + Short url - Une erreur s'est produite. + Something went wrong. - Veuillez spécifier les paramètres de recherche. + Please specify search parameters. - Statut + Status - Url stockée + Store url - Le streamer {0} est hors ligne. + Streamer {0} is offline. - Le streamer {0} est en ligne avec {1} viewers. + Streamer {0} is online with {1} viewers. - Vous suivez {0} streams sur ce serveur. + You are following {0} streams on this server. - Vous ne suivez aucun stream sur ce serveur. + You are not following any streams on this server. - Aucun stream de ce nom. + No such stream. - Ce stream n'existe probablement pas. + Stream probably doesn't exist. - Stream de {0} ({1}) retirée des notifications. + Removed {0}'s stream ({1}) from notifications. - Je préviendrai ce salon lors d'un changement de statut. + I will notify this channel when status changes. - Aube + Sunrise - Crépuscule + Sunset - Température + Temperature - Titre: + Title: - Top 3 anime favoris + Top 3 favorite anime: - Traduction: + Translation: Types - Impossible de trouver une définition pour ce terme. + Failed finding definition for that term. Url @@ -1918,28 +1907,28 @@ La nouvelle valeur de {0} est {1} ! Viewers - En écoute + Watching - Impossible de trouver ce terme sur le wikia spécifié. + Failed finding that term on the specified wikia. - Entrez un wikia cible, suivi d'une requête de recherche. + Please enter a target wikia, followed by search query. - Page non trouvée. + Page not found. - Vitesse du vent + Wind speed - Les {0} champions les plus bannis + The {0} most banned champions - Impossible de yodifier votre phrase. + Failed to yodify your sentence. - Rejoint + Joined `{0}.` {1} [{2:F2}/s] - {3} total @@ -1947,257 +1936,347 @@ La nouvelle valeur de {0} est {1} ! `1.` - Page d'activité #{0} + Activity page #{0} - {0} utilisateurs en total. + {0} users total. - Créateur + Author - ID du Bot + Bot ID - Liste des fonctions pour la commande {0}calc + List of functions in {0}calc command - {0} de ce salon est {1} + {0} of this channel is {1} - Sujet du salon + Channel topic - Commandes exécutées + Commands ran - {0} {1} est équivalent à {2} {3} + {0} {1} is equal to {2} {3} - Unités pouvant être converties : + Units which can be used by the converter - Impossible de convertir {0} en {1}: unités non trouvées + Cannot convert {0} to {1}: units not found - Impossible de convertir {0} en {1} : les types des unités ne sont pas compatibles. + Cannot convert {0} to {1}: types of unit are not equal - Créé le + Created at - Salon inter-serveur rejoint. + Joined cross server channel. - Salon inter-serveur quitté. + Left cross server channel. - Voici votre jeton CSC + This is your CSC token - Emojis personnalisées + Custom emojis - Erreur + Error - Fonctionnalités + Features ID - Index hors limites. + Index out of range. - Voici une liste des utilisateurs dans ces rôles : + List of users in {0} role - Vous ne pouvez pas utiliser cette commande sur un rôle incluant beaucoup d'utilisateurs afin d'éviter les abus. + You are not allowed to use this command on roles with a lot of users in them to prevent abuse. - Valeur {0} invalide. + Invalid {0} value. Invalid months value/ Invalid hours value - Discord rejoint + Joined Discord - Serveur rejoint + Joined server ID: {0} -Membres: {1} -OwnerID: {2} +Members: {1} +Owner ID: {2} - Aucun serveur trouvée sur cette page. + No servers found on that page. - Liste des messages répétés + List of repeater - Membres + Members - Mémoire + Memory Messages - Répéteur de messages + Message repeater - Nom + Name - Pseudonyme + Nickname - Personne ne joue à ce jeu. + Nobody is playing that game. - Aucune répétition active. + No active repeaters. - Aucun rôle sur cette page. + No roles on this page. - Aucun shard sur cette page. - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. + No shards on this page. - Aucun sujet choisi. + No topic set. - Propriétaire + Owner - ID des propriétaires + Owner IDs - Présence + Presence - {0} Serveurs -{1} Salons Textuels -{2} Salons Vocaux + {0} Servers +{1} Text Channels +{2} Voice Channels - Toutes les citations possédant le mot-clé {0} ont été supprimées. + Deleted all quotes with {0} keyword. - Page {0} des citations + Page {0} of quotes - Aucune citation sur cette page. + No quotes on this page. - Aucune citation que vous puissiez supprimer n'a été trouvé. + No quotes found which you can remove. - Citation ajoutée + Quote Added - Une citation aléatoire a été supprimée. + Quote #{0} deleted. - Région + Region - Inscrit sur + Registered on - Je vais vous rappeler {0} pour {1} dans {2} `({3:d.M.yyyy} à {4:HH:mm})` + I will remind {0} to {1} in {2} `({3:d.M.yyyy.} at {4:HH:mm})` - Format de date non valide. Vérifiez la liste des commandes. + Not a valid time format. Check the commandlist. - Nouveau modèle de rappel défini. + New remind template set. - Répétition de {0} chaque {1} jour(s), {2} heure(s) et {3} minute(s). + Repeating {0} every {1} day(s), {2} hour(s) and {3} minute(s). - Liste des répétitions + List of repeaters - Aucune répétition active sur ce serveur. + No repeaters running on this server. - #{0} arrêté. + #{0} stopped. - Pas de message répété trouvé sur ce serveur. + No repeating messages found on this server. - Résultat + Result - Rôles + Roles - Page #{0} de tout les rôles sur ce serveur. + Page #{0} of all roles on this server: - Page #{0} des rôles pour {1} + Page #{0} of roles for {1} - Aucunes couleurs ne sont dans le format correct. Utilisez `#00ff00` par exemple. + No colors are in the correct format. Use `#00ff00` for example. - Couleurs alternées pour le rôle {0} activées. + Started rotating {0} role's color. - Couleurs alternées pour le rôle {0} arrêtées + Stopped rotating colors for the {0} role - {0} de ce serveur est {1} + {0} of this server is {1} - Info du serveur + Server info Shard - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. - Statistique des shards - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. + Shard stats - Le shard **#{0}** est en état {1} avec {2} serveurs. - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. + Shard **#{0}** is in {1} state with {2} servers - **Nom:** {0} **Lien:** {1} + **Name:** {0} **Link:** {1} - Pas d'emojis spéciaux trouvés. + No special emojis found. - Joue actuellement {0} musiques, {1} en attente. + Playing {0} songs, {1} queued. - Salons textuels + Text channels - Voici le lien pour votre salon: + Here is your room link: - Durée de fonctionnement + Uptime - {0} de l'utilisateur {1} est {2} + {0} of the user {1} is {2} Id of the user kwoth#1234 is 123123123123 - Utilisateurs + Users - Salons vocaux + Voice channels + + + You've already joined this race! + + + Current poll results + + + No votes cast. + + + Poll is already running on this server. + + + 📃 {0} has created a poll which requires your attention: + + + `{0}.` {1} with {2} votes. + + + {0} voted. + Kwoth voted. + + + Private Message me with the corresponding number of the answer. + + + Send a Message here with the corresponding number of the answer. + + + Thank you for voting, {0} + + + {0} total votes cast. + + + Pick them up by typing `{0}pick` + + + Pick it up by typing `{0}pick` + + + No user found. + + + page {0} + + + You must be in a voice channel on this server. + + + There are no voice channel roles. + + + {0} has been **muted** from text and voice chat for {1} minutes. + + + Users who join {0} voice channel will get {1} role. + + + Users who join {0} voice channel will no longer get a role. + + + Voice channel roles + + + Message triggering the custom reaction with id {0} won't get automatically deleted. + + + Message triggering the custom reaction with id {0} will get automatically deleted. + + + Response message for the custom reaction with id {0} won't be sent as a DM. + + + Response message for the custom reaction with id {0} will be sent as a DM. + + + No alias found + + + Typing {0} will now be an alias of {1}. + + + List of aliases + + + Trigger {0} no longer has an alias. + + + Trigger {0} didn't have an alias. + + + Competitive playtime \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.es-ES.resx b/src/NadekoBot/Resources/ResponseStrings.es-ES.resx new file mode 100644 index 00000000..4e34bf78 --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.es-ES.resx @@ -0,0 +1,2281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Esa base ya fue reclamada o destruida. + + + Esa base ya fue destruida. + + + Esa base no ha sido reclamada. + + + **Destruida** la base #{0} en la guerrra contra {1} + + + {0} ha **liberado** la base #{1} en la guerra contra {2} + + + {0} reclamó la base #{1} en la guerra contra {2} + + + @{0} Ya has reclamado la base #{1}. No puedes reclamar otra. + + + La reclamación de @{0} en la guerra contra {1} ha expirado. + + + Enemigo + + + Información sobre la guerra contra {0} + + + Número de base inválido. + + + No es un tamaño de guerra válido. + + + Lista de guerras activas + + + no reclamada + + + No estás participando en esa guerra. + + + @{0} No estás participando en esa guerra o esa base ya fue destruida. + + + No hay guerra activa. + + + Tamaño + + + La guerra contra {0} ya ha iniciado. + + + La guerra contra {0} ha sido creada. + + + La guerra contra {0} ha terminado. + + + Esa guerra no existe. + + + ¡La guerra contra {0} ha iniciado! + + + Las estadísticas de los comandos personalizados han sido borradas. + + + Comando personalizado eliminado + + + Insuficientes permisos. Necesitas administrar propiamente el Bot para comandos globales y ser administrador del servidor para locales. + + + Lista de todos los comandos personalizados + + + Comandos personalizados + + + Nuevo comando personalizado + + + No se ha encontrado el comando. + + + No se ha encontrado ningún comando con esa ID. + + + Respuesta + + + Estadísticas de los comandos personales + + + Estadísticas borradas para el comando personalizado {0}. + + + No se encontraron estadísticas. + + + Escribe + + + Hentai automático detenido. + + + Sin resultados. + + + {0} ya ha sido derrotado. + + + {0} ya tiene todo su HP. + + + Tu tipo ya es {0} + + + usó {0}{1} en {2}{3} y le hizo {4} de daño. + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + + + ¡No puedes atacar de nuevo sin ser atacado! + + + No puedes atacarte a ti mismo. + + + ¡{0} ha sido derrotado! + + + se curó {0} con una {1} + + + {0} le queda {1} de HP. + + + No puedes usar {0}. Escribe `{1}ml` para ver la lista de movimientos que puedes usar. + + + Lista de movimientos para el tipo {0} + + + No es efectivo. + + + No tienes suficientes {0} + + + revivido {0} con una {1} + + + Te has revivido con una {0} + + + Tu tipo ha cambiado a {0} por una {1} + + + Es efectivo. + + + ¡Es superefectivo! + + + ¡Has usado muchos movimientos seguidos, así que no puedes moverte! + + + El tipo de {0} es {1} + + + No encuentro ese usuario. + + + ¡Ya no puedes continuar! + + + **Rol autoasignable** en usuarios que ingresen **desactivado**. + + + **Rol autoasignable** en usuarios que ingresen **activado**. + + + Adjuntos + + + Avatar cambiado + + + Has sido bloqueado del servidor {0}. +Razón: {1} + + + bloqueados + PLURAL + + + Usuario bloqueado + + + Cambiado el nombre del Bot a {0} + + + Cambiado el estado del bot a {0} + + + Eliminación automática de mensajes de despedida desactivada. + + + Los mensajes de despedida serán eliminados después de {0} segundos. + + + El mensaje de despedida actual es: {0} + + + Activa los mensajes de despedida escribiendo {0} + + + Nuevo mensaje de despedida configurado. + + + Anuncio de despedida desactivado. + + + Anuncio de despedida activado en este canal. + + + Nombre del canal cambiado. + + + Nombre anterior + + + Tema del canal cambiado + + + Ordenado. + + + Contenido + + + Rol creado con éxito {0} + + + Canal de texto {0} creado. + + + Canal de voz {0} creado. + + + Ensordecimiento satisfactorio. + + + Servidor {0} eliminado + + + Detenida la eliminación automática de comandos de invocación. + + + Eliminación automática de comandos de invocación activada. + + + Canal de texto {0} eliminado. + + + Canal de voz {0} eliminado. + + + MP de + + + Añadido nuevo donador satisfactoriamente. Total donado por este usuario: {0} 👑 + + + ¡Gracias a las personas enlistadas por apoyar el proyecto! + + + Redirigiré los MPs a todos los administradores. + + + Redirigiré los MPs solamente al primer administrador. + + + Redirigiré los MPs desde ahora. + + + Ya no redirigiré los MPs. + + + Eliminación automática de los mensajes de bienvenida desactivada. + + + Los mensajes de bienvenida serán eliminados después de {0} segundos. + + + Actual mensaje de bienvenida por MP: {0} + + + Activa los mensajes de bienvenida por MP escribiendo {0} + + + Nuevo mensaje de bienvenida por MP configurado. + + + Anuncio de bienvenida por MP desactivado. + + + Anuncio de bienvenida por MP activado. + + + Mensaje de bienvenida actual: {0} + + + Activa los mensajes de bienvenida escribiendo {0} + + + Nuevo mensaje de bienvenida configurado. + + + Anuncio de bienvenida desactivado. + + + Anuncio de bienvenida activado en este canal. + + + No puedes usar este comando con usuarios que tienen un rol más alto o igual al tuyo. + + + ¡Imágenes cargadas después de {0} segundos! + + + Formato de entrada no válido. + + + Parámetros no válidos. + + + {0} ha entrado {1} + + + Has sido expulsado del servidor {0}. +Razón: {1} + + + Usuario expulsado: + + + Lista de lenguajes + + + El lenguaje local del servidor ahora es {0} - {1} + + + Lenguaje local por defecto del Bot ahora es {0} - {1} + + + Lenguaje del Bot configurado a {0} - {1} + + + No pude configurar el lenguaje local. Revisa la ayuda. + + + El lenguaje del servidor fue configurado a {0} - {1} + + + {0} ha salido {1} + + + Servidor abandonado {0} + + + Registrando los eventos de {0} en este canal. + + + Registrando todos los eventos en este canal. + + + Registro deshabilitado. + + + Registro de eventos a los que te puedes suscribir: + + + El registro ignorará {0}. + + + El registro no ignorará {0}. + + + El registro de los eventos de {0} fue detenido. + + + {0} ha pedido mención de los siguientes roles: + + + Mensaje de {0} `[Administrador del Bot]`: + + + Mensaje enviado. + + + {0} movido de {1} a {2} + + + Mensaje eliminado en #{0} + + + Mensaje actualizado en #{0} + + + Silenciados. + PLURAL (users have been muted) + + + Silenciado. + singular "User muted." + + + No tengo los permisos necesarios. + + + Nuevo rol de Silenciar definido. + + + Necesito permisos de **administrador** para hacer eso. + + + Nuevo mensaje. + + + Nuevo apodo. + + + Nuevo tema. + + + Apodo cambiado. + + + No se puede encontrar ese servidor. + + + No encontré un fragmento con esa ID. + + + Mensaje anterior + Creo que "anterior" suena más acorde. + + + Apodo anterior + + + Tema anterior + + + Error. Creo que no tengo suficientes permisos. + + + Los permisos de este servidor han sido reiniciados. + + + Protecciones activas + + + {0} ha sido **desactivado** en este servidor. + + + {0} activado + + + Error. Necesito permisos para administrar roles. + + + Sin protección activada. + + + La entrada del usuario debe ser entre {0} y {1}. + + + Si {0} o más usuarios entran entre {1} segundos, los voy a {2} + + + El tiempo debe ser entre {0} y {1} segundos. + + + He removido todos los roles del usuario {0} + + + No pude remover los roles. No tengo suficientes permisos. + + + El color del rol {0} ha sido cambiado. + + + Ese rol no existe. + + + Los parámetros especificados no son válidos. + + + Error debido a un color no válido o insuficiencia de permisos. + + + He removido satisfactoriamente el rol {0} del usuario {1}. + + + No pude remover el rol. Insuficientes permisos. + + + Rol renombrado. + + + No pude renombrar el rol. No tengo suficientes permisos. + + + No puedes editar roles con más poder que el tuyo. + + + Removido el mensaje de estado: {0} + + + El rol {0} ha sido añadido a la lista. + + + No encontré {0}. + Fuzzy + + + El rol {0} ya está en la lista. + + + Añadido. + + + Rotación de estados desactivada. + + + Rotación de estado activada. + + + Aquí está la lista de rotaciones de estado: {0} + + + No hay rotaciones de estado configuradas. + + + Ya tienes el rol {0}. + + + Ya tienes el rol autoasignable exclusivo {0}. + + + Ahora los roles autoasignables son exclusivos. + + + Hay {0} roles autoasignables. + + + Ese rol no es autoasignable. + + + No tienes el rol {0}. + + + Los roles autoasignables ya no son exclusivos. + + + No puedo añadirte ese rol. No puedo añadirle roles a administradores u otros roles con rangos más altos. + + + {0} ha sido removido de la lista de roles autoasignables. + + + Ya no tienes el rol {0}. + + + Ahora tienes el rol {0}. + + + Añadido satisfactoriamente el rol {0} al usuario {1}. + + + No pude añadir el rol. Insuficientes permisos. + + + Nuevo avatar configurado. + + + Nuevo nombre del canal configurado. + + + Nuevo juego configurado. + + + Nueva transmisión configurada. + + + Nuevo tema del canal configurado. + + + Fragmento {0} reconectado. + + + Reconectando fragmento {0}. + + + Apagando + + + Los usuarios no pueden enviar más de {0} mensajes cada {1} segundos. + + + Modo lento desactivado. + + + Modo lento iniciado + + + advertido (expulsado) + PLURAL + + + {0} ignorará este canal. + + + {0} no ignorará este canal. + + + Si un usuario publica {0} el mismo mensaje rápidamente, voy a {1}. +__CanalesIgnorados__: {2} + + + Canal de texto creado. + + + Canal de texto removido. + + + Ensordecimiento removido. + + + Desilenciado + singular + + + Nombre de usuario + + + Nombre de usuario cambiado + + + Usuarios + + + Usuario bloqueado + + + {0} ha sido **silenciado** del chat. + + + {0} ha sido **desilenciado** del chat. + + + Usuario se unió. + + + Usuario se fue. + + + {0} ha sido **silenciado** de chat y voz. + + + Rol del usuario añadido + + + Rol del usuario removido + + + {0} ahora está {1} + + + {0} ha sido **desilenciado** de chat y voz. + + + {0} ha entrado al canal de voz {1}. + + + {0} ha salido del canal de voz {1}. + + + {0} movido del canal de voz {1} a {2}. + + + {0} ha sido **silenciado de voz** + + + {0} ha sido **desilenciado de voz**. + + + Canal de voz creado + + + Canal de voz destruido + + + Desactivada la opción de voz + texto. + + + Activada la opción de voz + texto. + + + No tengo los permisos para **administrar roles** y/o **administrar canales**, así que no puedo ejecutar `voz+texto` en el servidor {0}. + + + Estás activando o desactivando esto y **no poseo permisos de ADMINISTRADOR**. Esto puede causar problemas y tendrás que arreglar los canales tú mismo después. + + + Necesito permisos para **administrar roles** y **administrar canales** para hacer esto. De preferencia permisos de Administración. + + + Usuario {0} de chat. + + + Usuario {0} de chat y voz. + + + Usuario {0} del chat de voz + + + Has sido advertido en el servidor {0}. +Razón: {1} + + + Usuario desbloqueado: + + + ¡Migración terminada! + + + Error al migrar, revisa la consola para más información. + + + Actualizaciones de presencia + + + Usuario advertido + + + le ha regalado {0} a {1} + + + Suerte la próxima. + + + ¡Felicitaciones! Ganaste {0} por sacar sobre {1}. + + + Mazo reconstruido. + + + lanzó {0} + User flipped tails. + + + ¡Adivinaste! Ganas {0} + + + Número especificado no es válido. Puedes lanzar de 1 a {0} monedas. + + + Añade la reacción {0} a este mensaje para obtener {1} + + + Este evento estará activo por {0} horas. + + + ¡Inicia el evento de reacción! + + + le ha regalado {0} a {1} + X has gifted 15 flowers to Y + + + {0} tiene {1} + X has Y flowers + + + Cara + + + Marcador + + + Enviados {0} a {1} usuarios en el rol {2}. + + + No puedes apostar más de {0} + + + No puedes apostar menos de {0} + + + No tienes suficientes {0} + + + No hay más cartas en el mazo. + + + Usuario escogido: + + + Sacaste {0}. + + + Apostó + + + ¡Cielos! ¡Felicitaciones! x{0} + + + Solo una {0}, x{1} + + + ¡Guau! ¡Suertudo! ¡Tres iguales! x{0} + + + ¡Buen trabajo! Dos {0} - Apostado x{1} + + + Ganó + + + Los usuarios deben escribir un código secreto para obtener {0}. Quedan {1} segundos. No le digas a nadie. + + + El evento de EstadoEscurridizo ha terminado. {0} recibieron el premio. + + + Evento de EstadoEscurridizo iniciado + + + Cruz + + + le quitó {0} a {1} + + + no pudo quitarle {0} a {1} porque el usuario no tiene tal cantidad de {2}. + + + Regresar a la tabla de contenidos + + + Solo el dueño del Bot. + + + Requiere {0} permisos del canal. + + + Puedes apoyar el proyecto en Patreon: <{0}> o PayPal: <{1}> + + + Comandos y alias + + + Lista de comandos regenerada. + + + Escribe `{0}h NombreDelComando` para recibir ayuda específica. Ej: `{0}h >8ball` + + + No puedo encontrar ese comando. Por favor verifica que el comando exista antes de tratar de nuevo. + + + Descripción + + + Puedes apoyar el proyecto de NadekoBot en +Patreon <{0}> o +PayPal <{1}> +No olvides dejar tu usuario de Discord o ID en el mensaje. + +*Gracias** ♥ + + + **Lista de comandos**. <{0}> +**Las guías para albergar y documentos pueden ser encontrados aquí**: <{1}> + + + Lista de comandos + + + Lista de módulos + + + Escribe `{0}cmds NombreDelMódulo` para obtener una lista de comandos en ese módulo. Ej: `{0}cmds games` + + + Ese módulo no existe. + + + Requiere {0} permisos del servidor + + + Tabla de contenidos + + + Uso + + + Hentai automático iniciado. Publicando cada {0}s con los siguientes tags: +{1} + + + Tag + + + Carrera de animales + + + No pude iniciar la carrera porque no hay suficientes participantes. + + + ¡Todo listo! ¡Allá vamos! + + + {0} entró como un {1} + + + {0} entró como un {1} y apostó {2}. + + + Escribe {0}jr para entrar en la carrera. + + + Empezaremos en 20 segundos o cuando ya no haya lugar. + + + Empezando con {0} participantes. + + + {0} como un {1} ganó la carrera. + + + {0} como un {1} ganó la carrera y {2}. + + + Número especificado no válido. Puedes lanzar {0}-{1} dados a la vez. + + + sacaste {0} + Someone rolled 35 + + + Dado lanzado: {0} + Dice Rolled: 5 + + + No pude iniciar la carrera. Probablemente otra está en curso. + + + No hay carrera en este servidor. + + + El segundo número debe ser más largo que el primero. + + + Cambios de opinión + + + Reclamado por + + + Divorcios + + + Le gusta + + + Precio + + + Ninguna waifu ha sido reclamada aún. + + + Top de waifus + + + tu afinidad ya ha sido configurada hacia esa waifu o intentas remover tu afinidad sin tenerla. + + + cambió su afinidad de {0} a {1}. + +*Esto es moralmente cuestionable.* 🤔 + Make sure to get the formatting right, and leave the thinking emoji + + + Debes esperar {0} horas y {1} minutos para cambair tu afinidad otra vez. + + + Tu afinidad ha sido reiniciada. Ya no tienes una persona que te guste. + + + quiere ser la waifu de {0}. Aww <3 + + + reclamó a {0} como su waifu por {1} + + + Te has divorciado de una waifu que te quería. Monstruo sin corazón. {0} recibió {1} como compensación. + + + no puedes configurar tu afinidad hacia ti mismo, ególatra. + + + 🎉 ¡Su amor es correspondido! 🎉 +¡El nuevo valor de {0} es {1}! + + + Ninguna waifu es tan barata. Debes pagar al menos {0} para obtener una waifu, aunque su valor actual sea menor. + + + ¡Debes pagar {0} o más para reclamar esa waifu! + + + Esa waifu no es tuya. + + + No puedes reclamarte a ti mismo. + + + Te divorciaste recientemente. Debes esperar {0} horas y {1} minutos para divorciarte otra vez. + + + Nadie + + + Te has divorciado de una waifu que no te quería. Recibes {0} de regreso. + + + Bola 8 + + + Acrofobia + + + El juego terminó sin oraciones. + + + Nadie votó. El juego ha terminado sin ganador. + + + El acrónimo era {0}. + + + Acrofobia ya se está ejecutando en este canal. + + + Inicia el juego. Crea una oración con el siguiente acrónimo: {0}. + + + Tienes {0} segundos para enviar tu oración. + + + {0} enviaron sus oraciones. ({1} en total) + + + Vota escribiendo el número correspondiente. + + + ¡{0} votó! + + + El ganador es {0} con {1} puntos. + + + ¡{0} gana por ser el único que envió una oración! + + + Pregunta + + + ¡Empate! Ambos eligieron {0} + + + ¡{0} gana! {1} vence {2} + + + Envíos cerrados + + + La carrera de animales ya está en ejecución. + + + Total: {0} Promedio: {1} + + + Categoría + + + Cleverbot desactivado en este servidor. + + + Cleverbot activado en este servidor. + + + La generación de moneda ha sido desactivada en este canal. + + + La generación de moneda ha sido activada en este canal. + + + {0} {1} aparecieron. + plural + + + ¡Una {0} apareció! + + + No pude cargar la pregunta. + + + Juego iniciado + + + Juego del ahorcado iniciado + + + Un juego del ahorcado ya se está ejecutando en este canal. + + + Error iniciando el ahorcado. + + + Lista de "{0}hangman" términos: + + + Marcador + + + No tienes suficientes {0} + + + Sin resultados + + + recogió {0} + Kwoth picked 5* + + + {0} plantó {1} + Kwoth planted 5* + + + Ya se está ejecutando una trivia en este servidor. + + + Trivia + + + ¡{0} adivinó! La respuesta era: {1} + + + No se está ejecutando ninguna trivia en este servidor. + + + {0} tiene {1} puntos + + + La trivia se detendrá luego de esta pregunta. + + + ¡Tiempo! La respuesta correcta era {0} + + + ¡{0} adivinó y ganó el juego! La respuesta era: {1} + + + No puedes jugar contra ti mismo. + + + El juego de Tres en raya ya se ha iniciado en este canal. + + + ¡Empate! + + + ha creado un juego de Tres en raya. + + + ¡{0} gana! + + + Hizo coincidir tres + + + ¡No quedan más movimientos! + + + ¡Tiempo! + + + Movimiento de {0} + + + {0} vs {1} + + + Intentando añadir a la cola {0} canciones... + + + Reproducción automática desactivada. + + + Reproducción automática activada. + + + El volumen por defecto configurado es {0}% + + + Directorio completo + + + Juego limpio + + + Canción finalizada + + + Juego limpio desactivado. + + + Juego limpio activado. + + + De la posición + + + ID + + + Entrada no válida. + + + Tiempo de reproducción sin límite. + + + Tiempo de reproducción máximo configurado en {0} segundo(s). + + + Tamaño máximo de la cola configurada en ilimitado. + + + Tamaño máximo de la cola configurado en {0} canción(es). + + + Tienes que estar en un canal de voz. + + + Nombre + + + Reproduciendo + + + No hay reproducción activa. + + + Sin resultados. + + + Música pausada. + + + Cola - Página {0}/{1} + + + Reproduciendo + + + `#{0}` - **{1}** por *{2}* ({3} canciones) + + + Página {0} de listas de reproducción guardadas. + + + Lista de reproducción eliminada. + + + No pude eliminar esa lista. O no existe, o no eres el autor. + + + No existe una lista con tal ID. + + + Cola de lista de reproducción completa. + + + Lista de reproducción guardada + + + Límite de {0} + + + Cola. + + + Canción en cola. + + + Se eliminó la cola de música. + + + La cola está llena con {0}/{0}. + + + Canción eliminada + context: "removed song #5" + + + Repitiendo la canción actual + + + Repitiendo lista de reproducción + + + Repitiendo canción + + + Repetición de la canción actual detenida. + + + Reproducción resumida + + + Repetición de listas de reproducción desactivada. + + + Repetición de listas de reproducción activada. + + + Desde ahora publicaré la reproducción, finalización, pausa y eliminación de canciones en este canal. + + + Saltado a `{0}:{1}` + + + Canciones reorganizadas. + + + Canción movida + + + {0}h {1}m {2}s + + + A la posición + + + ilimitada + + + El volumen debe ser entre 0 y 100. + + + Volumen definido en {0}% + + + Desactivado el uso de todos los módulos en el canal {0}. + + + Activado el uso de todos los módulos en el canal {0}. + + + Permitido + + + Desactivado el uso de todos los módulos para el rol {0}. + + + Activado el uso de todos los módulos para el rol {0}. + + + Desactivado el uso de todos los módulos en este servidor. + + + Activado el uso de todo los módulos en este servidor. + + + Desactivado el uso de todos los módulos para el usuario {0}. + + + Activado el uso de todos los módulos para el usuario {0}. + + + Enviado a la lista negra a: {0} con el ID: {1} + + + El comando {0} ahora tiene {1} de enfriamiento. + + + El comando {0} ya no tiene enfriamiento y todos los tiempos de enfriamiento han sido reiniciados. + + + No se ha configurado tiempo de enfriamiento. + + + Costo del comando + + + Desactivado el uso de {0} {1} en el canal {2}. + + + Activado el uso de {0} {1} en el canal {2}. + + + Prohibido + + + Se ha añadido la palabra {0} a la lista de palabras filtradas. + + + Lista de palabras filtradas + + + Removida la palabra {0} de la lista de palabras filtradas. + + + Segundo parámetro no válido. (Debe ser un número entre {0} y {1}) + + + Filtro de invitaciones desactivado en este canal. + + + Filtro de invitaciones activado en este canal. + + + Filtro de invitaciones desactivado en este servidor. + + + Filtro de invitaciones activado en este servidor. + + + Permiso {0} movido de #{1} a #{2} + + + No puedo encontrar el permiso en #{0} + + + No hay costo configurado. + + + comando + Gen (of command) + + + módulo + Gen. (of module) + + + Página de permisos {0} + + + El rol de permisos actual es {0} + + + Los usuarios ahora requieren el rol {0} para editar permisos. + + + No se encontraron permisos. + + + permisos removidos #{0} - {1} + + + Desactivado el uso de {0} {1} para el rol {2}. + + + Activado el uso de {0} {1} para el rol {2}. + + + seg. + Short of seconds. + + + Desactivado el uso de {0} {1} en este servidor. + + + Activado el uso de {0} {1} en este servidor. + + + Removido de la lista negra a: {0} con el ID: {1} + + + ineditable + + + Desactivado el uso de {0} {1} para el usuario {2}. + + + Activado el uso de {0} {1} para el usuario {2}. + + + No mostraré más advertencias de permisos. + + + Desde ahora mostraré las advertencias de permisos. + + + Filtro de groserías desactivado en este canal. + + + Filtro de groserías activado en este canal. + + + Filtro de groserías desactivado en este servidor. + + + Filtro de groserías activado en este servidor. + + + Habilidades + + + No tiene anime favorito aún + + + Iniciada la traducción automática de mensajes en este canal. Los mensajes del usuario serán eliminados automáticamente. + + + tu lenguaje de traducción automática ha sido removido. + + + Tu lenguaje de traducción automática ha sido configurado a {0}>{1} + + + Iniciada la traducción automática de mensajes en este canal. + + + Detenida la traducción automática de mensajes en este canal. + + + Mal formato o algo salió mal. + + + No encontré esa carta. + + + hecho + + + Capítulos + + + Cómic # + + + Pérdidas en competitivo + + + Juegos en competitivo + + + Rango en competitivo + + + Victorias en competitivo + + + Completadas + + + Condición + + + Costo + + + Fecha + + + Defininir: + + + Dejadas de ver + + + Episodios + + + Ocurrió un error. + + + Ejemplo + + + No encontré ese anime. + + + No encontré ese manga. + + + Géneros + + + No encontré una definición para ese tag. + + + Altura/Peso + + + {0}m/{1}kg + + + Humedad + + + Búsqueda de imagen para: + + + No encontré esa película. + + + Fuente o lenguaje no válido. + + + No se cargaron las bromas. + + + Lat/Long + + + Nivel + + + Lista de tags en {0}place + Don't translate {0}place + + + Locación + + + Objetos mágicos no cargados. + + + Perfil de MAL de {0} + + + El dueño del Bot no especificó una MashapeApiKey. No puedes usar esto. + + + Mín/Máx + + + No encontré ese canal. + + + Sin resultados. + + + En espera + + + Enlace original + + + Se requiere una clave de API de osu! + + + No pude encontrar esa firma de osu! + + + Encontré alrededor de {0} imágenes. Mostrando {0} aleatorias. + + + ¡Usuario no encontrado! Por favor revisa la región y BattleTag antes de intentar de nuevo. + + + Planeadas ver + + + Plataforma + + + No encontré tal habilidad. + + + No encontré ese Pokémon. + + + Enlace al perfil: + + + Atributo: + + + Reproducción rápida: + + + Victorias rápidas + + + Rating + + + Puntuación: + + + Búsqueda para: + + + No pude acortar ese enlace. + + + Enlace acortado + + + Algo salió mal. + + + Por favor especifica parámetros de búsqueda. + + + Estado + + + Guardar enlace + + + El usuario {0} está desconectado. + + + El usuario {0} está en línea con {1} espectadores. + + + Estás siguiendo {0} transmisiones en este servidor. + + + No estás siguiendo ninguna transmisión en este servidor. + + + No existe esa transmisión. + + + La transmisión probablemente no existe. + + + Removida la transmisión de {0} ({1}) de las notificaciones. + + + Notificaré en este canal cuando el estado cambie. + + + Salida del sol + + + Puesta del sol + + + Temperatura + + + Título: + + + Top 3 de anime favoritos: + + + Traducción: + + + Tipos: + + + No pude encontrar una definición para ese término. + + + Enlace + + + Espectadores + + + Mirando + + + No pude encontrar ese término en la Wikia especificada. + + + Por favor ingresa la Wikia seguido por el término de búsqueda. + + + Página no encontrada. + + + Velocidad del viento + + + Los {0} campeones más bloqueados + + + No pude yodificar tu oración + + + Entró + + + `{0}.` {1} [{2:F2}/s] - {3} en total + /s and total need to be localized to fit the context - +`1.` + + + Página de actividad #{0} + + + {0} usuarios en total. + + + Autor + + + ID del Bot + + + Lista de funciones en el comando {0}calc + + + {0} de este canal es {1} + + + Tema del canal + + + Comandos ejecutados + + + {0} {1} es igual a {2} {3} + + + Unidades que pueden ser usadas por el conversor + + + No pude convertir {0} a {1}: Unidades no encontradas + + + No pude convertir {0} a {1}: el tipo de unidad no es igual + + + Creada el + + + Entró al canal del cruce de servidor. + + + Salió del canal del cruce de servidor. + + + Este es tu token CSC + + + Emoticones personales + + + Error + + + Características + + + ID + + + Entrada fuera de rango + + + Lista de usuarios en el rol {0} + + + No tienes permitido usar este comando en roles con muchos usuarios para prevenir abuso. + + + Valor en {0} no válido. + Invalid months value/ Invalid hours value + + + Ingresó a Discord + + + Ingresó al servidor + + + ID: {0} +Miembros: {1} +IDs de dueños: {2} + + + No encontré servidores en esa página. + + + Lista de repetidores + + + Miembros + + + Memoria + + + Mensajes + + + Repetidor de mensajes + + + Nombre + + + Apodo + + + Nadie está jugando eso. + + + No hay repeticiones activas + + + No hay roles en esta página. + + + No hay fragmentos en esta página. + + + No hay tema configurado. + + + Dueño + + + ID del dueño + + + Presencia + + + {0} servidores +{2} canales de texto +{2} canales de voz + + + Eliminadas todas las citas con la palabra clave {0} + + + Página {0} de citas + + + No hay citas en esta página + + + No hay citas que puedas remover + + + Cita añadida + + + Cita #{0} eliminada. + + + Región + + + Registrado el + + + Le recordaré a {0} que {1} en {2} `({3:d.M.yyyy.} a las {4:HH:mm})` + + + Formato de tiempo no válido. Revisa la lista de comandos. + + + Nueva plantilla de recordatorio configurada. + + + Repitiendo {0} cada {1} día(s), {2} hora(s) y {3} minuto(s). + + + Lista de repeticiones + + + No hay repetidores ejecutándose. + + + #{0} detenido. + + + No hay repeticiones de mensajes en este servidor. + + + Resultado + + + Roles + + + Página #{0} de todos los roles en este servidor. + + + Página #{0} de roles para {1} + + + Los colores no están en el formato correcto. Usa `#00ff00` por ejemplo. + + + Iniciada la rotación de colores para el rol {0}. + + + Detenida la rotación de colores para el rol {0} + + + {0} de este servidor es {1} + + + Información del servidor + + + Fragmento. + + + Estadísticas del fragmento. + + + Fragmento **#{0}** está en estado {1} con {2} servidores. + + + **Nombre:** {0} **Enlace:** {1} + + + No encontré emoticones especiales. + + + Reproduciendo {0} canciones, {1} en cola. + + + Canales de texto + + + Aquí está el enlace a tu cuarto: + + + Tiempo en línea + + + {0} del usuario {1} es {2} + Id of the user kwoth#1234 is 123123123123 + + + Usuarios + + + Canales de voz + + + ¡Ya entraste a esta carrera! + + + Resultados de la encuesta + + + Sin votos. + + + Ya hay una encuesta en ejecución. + + + 📃 {0} ha creado una encuesta que requiere de tu atención. + + + `{0}.` {1} con {2} votos. + + + {0} votó. + Kwoth voted. + + + Envíame un mensaje privado con el número correspondiente a la respuesta. + + + Envía un mensaje aquí con el número correspondiente a la respuesta. + + + Gracias por votar, {0} + + + {0} votos totales. + + + Tómalas escribiendo `{0}pick` + + + Tómala escribiendo `{0}pick` + + + No encontré ese usuario. + + + página {0} + + + debes estar en un canal de voz. + + + No hay roles para el canal de voz. + + + {0} ha sido **silenciado** de chat y voz por {1} minutos. + + + Los usuarios que entren al canal de voz {0} obtendrán el rol {1}. + + + Los usuarios que entren al canal de voz {0} ya no obtendrán un rol. + + + Roles para el canal de voz + + + El mensaje de ejecución del comando personalizado con la ID {0} no será eliminado automáticamente. + + + El mensaje de ejecución del comando personalizado con la ID {0} será eliminado automáticamente. + + + Respuesta del mensaje para el comando personalizado con la ID {0} no será enviada como MP. + + + Respuesta del mensaje para el comando personalizado con la ID {0} será enviada como MP. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.fr-FR.resx b/src/NadekoBot/Resources/ResponseStrings.fr-FR.resx index ac95afb6..ee351ef0 100644 --- a/src/NadekoBot/Resources/ResponseStrings.fr-FR.resx +++ b/src/NadekoBot/Resources/ResponseStrings.fr-FR.resx @@ -140,6 +140,7 @@ La demande de la part de @{0} pour une guerre contre {1} a expiré. + Fuzzy Ennemi @@ -152,9 +153,11 @@ La taille de la guerre n'est pas valide. + Fuzzy Liste des guerres en cours + Fuzzy non réclamé @@ -167,6 +170,7 @@ Aucune guerre en cours. + Fuzzy Taille @@ -206,6 +210,7 @@ Aucune réaction personnalisée trouvée. + Fuzzy Aucune réaction personnalisée ne correspond à cet ID. @@ -315,7 +320,7 @@ Raison: {1} - banni + bannis PLURAL @@ -334,7 +339,7 @@ Raison: {1} Les annonces de départ seront supprimées après {0} secondes. - Annonce de départ actuelle : {0} + Annonce de départ actuelle: {0} Activez les annonces de départ en entrant {0} @@ -464,14 +469,15 @@ Raison: {1} Vous avez été expulsé du serveur {0}. -Raison : {1} +Raison: {1} Utilisateur expulsé + Fuzzy - Listes des langues -{0} + Listes des langues + Fuzzy La langue du serveur est désormais {0} - {1} @@ -504,7 +510,7 @@ Raison : {1} Enregistrement désactivé. - Événements enregistrés que vous pouvez suivre : + Événements enregistrés que vous pouvez suivre: L'enregistrement ignorera désormais {0} @@ -519,7 +525,7 @@ Raison : {1} {0} a émis une notification pour les rôles suivants - Message de {0} `[Bot Owner]` : + Message de {0} `[Propriétaire du bot]`: Message envoyé. @@ -530,9 +536,11 @@ Raison : {1} Message supprimé dans #{0} + Fuzzy Mise à jour du message dans #{0} + Fuzzy Tous les utilisateurs sont maintenant muets. @@ -549,19 +557,23 @@ Raison : {1} Nouveau rôle muet créé. - J'ai besoin de la permission d'**Administrateur** pour effectuer cela. + Je nécessite la permission **Administrateur** pour effectuer cela. Nouveau message + Fuzzy Nouveau pseudonyme + Fuzzy Nouveau sujet + Fuzzy Pseudonyme changé + Fuzzy Impossible de trouver ce serveur @@ -572,12 +584,15 @@ Raison : {1} Ancien message + Fuzzy Ancien pseudonyme + Fuzzy Ancien sujet + Fuzzy Erreur. Je ne dois sûrement pas posséder les permissions suffisantes. @@ -587,6 +602,7 @@ Raison : {1} Protections actives + Fuzzy {0} a été **désactivé** sur ce serveur. @@ -599,6 +615,7 @@ Raison : {1} Aucune protection activée. + Fuzzy Le seuil d'utilisateurs doit être entre {0} et {1}. @@ -628,7 +645,7 @@ Raison : {1} Erreur due à un manque de permissions ou à une couleur invalide. - L'utilisateur {1} n'appartient plus au rôle {0}. + L'utilisateur {1} n'a plus le rôle {0}. Impossible de supprimer ce rôle. Je ne possède pas les permissions suffisantes. @@ -655,20 +672,20 @@ Raison : {1} Le rôle {0} est déjà présent dans la liste. - Ajouté. + Ajouté - Rotation du statut de jeu désactivée. + Alternance du statut de jeu désactivé. - Rotation du statut de jeu activée. + Alternance du statut de jeu activé. - Voici une liste des rotations de statuts : + Liste des statuts alternants: {0} - Aucune rotation de statuts en place. + Aucun statut alternant défini. Vous avez déjà le rôle {0}. @@ -705,7 +722,7 @@ Raison : {1} Vous avez désormais le rôle {0}. - L'ajout du rôle {0} pour l'utilisateur {1} a été réalisé avec succès. + L'utilisateur {1} a désormais le rôle {0}. Impossible d'ajouter un rôle. Je ne possède pas les permissions suffisantes. @@ -727,7 +744,7 @@ Raison : {1} Nouveau sujet du salon défini. - Shard {0} reconnectée. + Shard {0} reconnecté. Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. @@ -758,13 +775,15 @@ Raison : {1} Si un utilisateur poste {0} le même message à la suite, je le {1}. - __SalonsIgnorés__: {2} + __SalonsIgnorés__: {2} - Salon textuel crée. + Salon textuel créé. + Fuzzy - Salon textuel détruit. + Salon textuel supprimé. + Fuzzy Son activé avec succès. @@ -774,16 +793,18 @@ Raison : {1} singular - Nom d'utilisateur. + Nom d'utilisateur Nom d'utilisateur modifié. + Fuzzy Utilisateurs Utilisateur banni + Fuzzy {0} est maintenant **muet** sur le chat. @@ -793,18 +814,22 @@ Raison : {1} L'utilisateur a rejoint + Fuzzy L'utilisateur a quitté + Fuzzy - {0} est maintenant **muet** à la fois sur le salon textuel et vocal. + {0} est maintenant **muet** à la fois sur les salons textuels et vocaux. Rôle ajouté à l'utilisateur + Fuzzy Rôle retiré de l'utilisateur + Fuzzy {0} est maintenant {1} @@ -819,7 +844,7 @@ Raison : {1} {0} a quitté le salon vocal {1}. - {0} est allé du salon vocal {1} au {2}. + {0} est allé du salon vocal {1} à {2}. {0} est maintenant **muet**. @@ -828,10 +853,12 @@ Raison : {1} {0} n'est maintenant **plus muet**. - Salon vocal crée. + Salon vocal créé. + Fuzzy - Salon vocal détruit. + Salon vocal supprimé. + Fuzzy Fonctionnalités vocales et textuelles désactivées. @@ -843,10 +870,10 @@ Raison : {1} Je n'ai pas la permission **Gérer les rôles** et/ou **Gérer les salons**, je ne peux donc pas utiliser `voice+text` sur le serveur {0}. - Vous activez/désactivez cette fonctionnalité et **je n'ai pas les permissions ADMINISTRATEURS**. Cela pourrait causer des dysfonctionnements, et vous devrez nettoyer les salons textuels vous-même après ça. + Vous activez/désactivez cette fonctionnalité et **je n'ai pas la permission ADMINISTRATEUR**. Cela pourrait causer des dysfonctionnements, et vous devrez nettoyer les salons textuels vous-même après ça. - Je nécessite au moins les permissions **Gérer les rôles** et **Gérer les salons** pour activer cette fonctionnalité. (permissions administateurs préférées) + Je nécessite au minimum les rôles **Gérer les rôles** et **Gérer les salons** pour activer cette fonctionnalité. (Permission Administrateur de préférence) Utilisateur {0} depuis un salon textuel. @@ -863,6 +890,7 @@ Raison: {1} Utilisateur débanni + Fuzzy Migration effectuée! @@ -872,18 +900,21 @@ Raison: {1} Présences mises à jour. + Fuzzy Utilisateur expulsé. + Fuzzy a récompensé {0} à {1} - Meilleure chance la prochaine fois ^_^ + Plus de chance la prochaine fois ^_^ + C'est vraiment québecois ca.. On ne le dit pas comme ca ici xD - Félicitations! Vous avez gagné {0} pour avoir lancé au dessus de {1} + Félicitations! Vous avez gagné {0} pour avoir lancé au dessus de {1}. Deck remélangé. @@ -893,7 +924,7 @@ Raison: {1} User flipped tails. - Vous l'avez deviné! Vous avez gagné {0} + Vous avez deviné! Vous avez gagné {0} Nombre spécifié invalide. Vous pouvez lancer 1 à {0} pièces. @@ -917,6 +948,7 @@ Raison: {1} Face + Fuzzy Classement @@ -938,6 +970,7 @@ Raison: {1} Utilisateur tiré au sort + Fuzzy Vous avez roulé un {0}. @@ -961,7 +994,8 @@ Raison: {1} Gagné - Les utilisateurs doivent écrire un code secret pour avoir {0}. Dure {1} secondes. Ne le dite à personne. Shhh. + Les utilisateurs doivent écrire un code secret pour avoir {0}. Dure {1} secondes. Ne le dites à personne. Shhh. + "Ne le dis à personne" ou "Ne le dites à personne". Je vous laisse faire le choix L’événement "jeu sournois" s'est fini. {0} utilisateurs ont reçu la récompense. @@ -971,6 +1005,8 @@ Raison: {1} Pile + C'est pas plutôt face ca ? +Fuzzy Vous avez pris {0} de {1} avec succès @@ -983,6 +1019,7 @@ Raison: {1} Propriétaire du Bot seulement + Fuzzy Nécessite {0} permissions du salon. @@ -992,9 +1029,11 @@ Raison: {1} Commandes et alias + Fuzzy Liste des commandes rafraîchie. + Fuzzy Écrivez `{0}h NomDeLaCommande` pour voir l'aide spécifique à cette commande. Ex: `{0}h >8ball` @@ -1016,12 +1055,15 @@ N'oubliez pas de mettre votre nom discord ou ID dans le message. **Liste des Commandes**: <{0}> **La liste des guides et tous les documents peuvent être trouvés ici**: <{1}> + Fuzzy Liste des commandes + Fuzzy Liste des modules + Fuzzy Entrez `{0}cmds NomDuModule` pour avoir la liste des commandes de ce module. ex `{0}cmds games` @@ -1034,12 +1076,13 @@ N'oubliez pas de mettre votre nom discord ou ID dans le message. Table des matières + Fuzzy Usage - Autohentai commencé. Publie toutes les {0}s avec l'un des tags suivants : + Autohentai commencé. Publie toutes les {0}s avec l'un des tags suivants: {1} @@ -1047,6 +1090,7 @@ N'oubliez pas de mettre votre nom discord ou ID dans le message. Course d'animaux + Fuzzy Pas assez de participants pour commencer. @@ -1083,7 +1127,7 @@ N'oubliez pas de mettre votre nom discord ou ID dans le message. Someone rolled 35 - Dé tiré au sort: {0} + Dés lancés: {0} Dice Rolled: 5 @@ -1096,10 +1140,13 @@ N'oubliez pas de mettre votre nom discord ou ID dans le message. Le deuxième nombre doit être plus grand que le premier. - Changements de Coeur + Changements d'avis + La plus proche traduction pour cette expression serait "Changement d'avis" +Fuzzy Revendiquée par + Fuzzy Divorces @@ -1117,7 +1164,7 @@ N'oubliez pas de mettre votre nom discord ou ID dans le message. Top Waifus - votre affinité est déjà liée à cette waifu ou vous êtes en train de retirer votre affinité avec quelqu'un alors que vous n'en possédez pas. + Votre affinité est déjà liée à cette waifu ou vous êtes en train de retirer votre affinité avec quelqu'un alors que vous n'en possédez pas. Affinités changées de de {0} à {1}. @@ -1129,16 +1176,16 @@ N'oubliez pas de mettre votre nom discord ou ID dans le message. Vous devez attendre {0} heures et {1} minutes avant de pouvoir changer de nouveau votre affinité. - Votre affinité a été réinitialisée. Vous n'avez désormais plus la personne que vous aimez. + Votre affinité a été réinitialisée. Vous n'aimez plus personne désormais. veut être la waifu de {0}. Aww <3 - a revendiqué {0} comme sa waifu pour {1} + a revendiqué {0} comme sa waifu pour {1}! - Vous avez divorcé avec une waifu qui vous aimais. Monstre sans cœur. {0} a reçu {1} en guise de compensation. + Vous avez divorcé d'une waifu qui vous aimait. Monstre sans cœur. {0} a reçu {1} en guise de compensation. vous ne pouvez pas vous lier d'affinité avec vous-même, espèce d'égocentrique. @@ -1217,13 +1264,14 @@ La nouvelle valeur de {0} est {1} ! {0} a gagné ! {1} bat {2}. - Inscriptions terminées. + Soumissions fermées. + Fuzzy Une course d'animaux est déjà en cours. - Total : {0} Moyenne : {1} + Total: {0} Moyenne: {1} Catégorie @@ -1242,29 +1290,32 @@ La nouvelle valeur de {0} est {1} ! La génération monétaire a été désactivée sur ce salon. - {0} {1} aléatoires sont apparus ! Attrapez-les en entrant `{2}pick` - plural + {0} {1} aléatoires sont apparus! + plural +Fuzzy - Un {0} aléatoire est apparu ! Attrapez-le en entrant `{1}pick` + Un {0} aléatoire est apparu! + Fuzzy Impossible de charger une question. La jeu a commencé. + Fuzzy Partie de pendu commencée. - Une partie de pendu est déjà en cours sur ce canal. + Une partie de pendu est déjà en cours sur ce salon. Initialisation du pendu erronée. - Liste des "{0}hangman" types de termes : + Liste des types de termes pour "{0}hangman": Classement @@ -1276,7 +1327,7 @@ La nouvelle valeur de {0} est {1} ! Pas de résultat - a cueilli {0} + a ramassé {0} Kwoth picked 5* @@ -1317,19 +1368,22 @@ La nouvelle valeur de {0} est {1} ! Égalité! - a crée une partie de Morpion. + a créé une partie de Morpion. - {0} a gagné ! + {0} a gagné! + Fuzzy Trois alignés. + Fuzzy Aucun mouvement restant ! - Le temps a expiré ! + Le temps a expiré! + Fuzzy Tour de {0}. @@ -1338,7 +1392,7 @@ La nouvelle valeur de {0} est {1} ! {0} contre {1} - Tentative d'ajouter {0} à la file d'attente... + Tentative d'ajouter {0} pistes à la file d'attente... Lecture automatique désactivée. @@ -1347,7 +1401,7 @@ La nouvelle valeur de {0} est {1} ! Lecture automatique activée. - Volume de base défini à {0}% + Volume par défaut défini à {0}% File d'attente complète. @@ -1357,6 +1411,7 @@ La nouvelle valeur de {0} est {1} ! Lecture terminée + Fuzzy Système de tour de rôle désactivé. @@ -1374,10 +1429,10 @@ La nouvelle valeur de {0} est {1} ! Entrée invalide. - Le temps maximum de lecture n'a désormais plus de limite. + Le temps maximum de lecture est désormais illimité. - Le temps de lecture maximum a été mis à {0} seconde(s). + Temps maximum de lecture défini à {0} seconde(s). La taille de la file d'attente est désormais illmitée. @@ -1393,6 +1448,7 @@ La nouvelle valeur de {0} est {1} ! Vous écoutez + Fuzzy Aucun lecteur de musique actif. @@ -1401,19 +1457,22 @@ La nouvelle valeur de {0} est {1} ! Pas de résultat. - Lecteur mis sur pause. + Lecture mise en pause. - Liste d'attente - Page {0}/{1} + File d'attente - Page {0}/{1} + Fuzzy - Lecture en cours: + Lecture en cours + Fuzzy - `#{0}` - **{1}** par *{2}* ({3} morceaux) + `#{0}` - **{1}** par *{2}* ({3} pistes) Page {0} des listes de lecture sauvegardées + Fuzzy Liste de lecture supprimée. @@ -1429,34 +1488,39 @@ La nouvelle valeur de {0} est {1} ! Liste de lecture sauvegardée + Fuzzy Limite à {0}s - Liste d'attente + File d'attente - Son ajouté à la file d'attente + Piste ajoutée à la file d'attente + Fuzzy - Liste d'attente effacée. + File d'attente effacée. - Liste d'attente complète ({0}/{0}). + File d'attente complète ({0}/{0}). - Son retiré + Piste retirée context: "removed song #5" - Répétition de la musique en cours + Répétition de la piste actuelle + Fuzzy Liste de lecture en boucle + Fuzzy Piste en boucle + Fuzzy La piste ne sera lue qu'une fois. @@ -1471,22 +1535,24 @@ La nouvelle valeur de {0} est {1} ! Lecture en boucle activée. - Je vais désormais afficher les musiques en cours, en pause, terminées et supprimées sur ce salon. + Je vais désormais afficher les pistes en cours, en pause, terminées et supprimées dans ce salon. Saut à `{0}:{1}` - Lecture aléatoire activée. + Pistes mélangées. + Fuzzy - Musique déplacée + Piste déplacée + Fuzzy {0}h {1}m {2}s - En position + À la position Illimité @@ -1498,31 +1564,37 @@ La nouvelle valeur de {0} est {1} ! Volume réglé sur {0}% - Désactivation de l'usage de TOUS LES MODULES pour le salon {0}. + Désactivation de TOUS LES MODULES pour le salon {0}. + Fuzzy - Activation de l'usage de TOUS LES MODULES pour le salon {0}. + Activation de TOUS LES MODULES pour le salon {0}. + Fuzzy Permis - Désactivation de l'usage de TOUS LES MODULES pour le rôle {0}. + Désactivation de TOUS LES MODULES pour le rôle {0}. + Fuzzy - Activation de l'usage de TOUS LES MODULES pour le rôle {0}. + Activation de TOUS LES MODULES pour le rôle {0}. + Fuzzy - Désactivation de l'usage de TOUS LES MODULES sur ce serveur. + Désactivation de TOUS LES MODULES sur ce serveur. - Activation de l'usage de TOUS LES MODULES sur ce serveur. + Activation de TOUS LES MODULES sur ce serveur. - Désactivation de l'usage de TOUS LES MODULES pour l'utilisateur {0}. + Désactivation de TOUS LES MODULES pour l'utilisateur {0}. + Fuzzy - Activation de l'usage de TOUS LES MODULES pour l'utilisateur {0}. + Activation de TOUS LES MODULES pour l'utilisateur {0}. + Fuzzy {0} sur liste noire avec l'ID {1} @@ -1533,18 +1605,22 @@ La nouvelle valeur de {0} est {1} ! La commande {0} n'a pas de temps de recharge et tous les temps de recharge ont été réinitialisés. + Fuzzy Aucune commande n'a de temps de recharge. Coût de la commande : + Fuzzy - Usage de {0} {1} désactivé sur le salon {2}. + Désactivation: {1} {0} sur le salon {2}. + Fuzzy - Usage de {0} {1} activé sur le salon {2}. + Activation: {1} {0} sur le salon {2}. + Fuzzy Refusé @@ -1554,6 +1630,7 @@ La nouvelle valeur de {0} est {1} ! Liste Des Mots Filtrés + Fuzzy Suppression du mot {0} de la liste des mots filtrés. @@ -1606,20 +1683,20 @@ La nouvelle valeur de {0} est {1} ! Supression des permissions #{0} - {1} - Usage de {0} {1} désactivé pour le rôle {2}. + Désactivation: {1} {0} pour le rôle {2}. - Usage de {0} {1} activé pour le rôle {2}. + Activation: {1} {0} pour le rôle {2}. sec. Short of seconds. - Usage de {0} {1} désactivé pour le serveur. + Désactivation: {1} {0} sur tout le serveur. - Usage de {0} {1} activé pour le serveur. + Activation: {1} {0} sur tout le serveur. Débanni {0} avec l'ID {1} @@ -1628,10 +1705,10 @@ La nouvelle valeur de {0} est {1} ! Non modifiable - Usage de {0} {1} désactivé pour l'utilisateur {2}. + Désactivation: {1} {0} pour l'utilisateur {2}. - Usage de {0} {1} activé pour l'utilisateur {2}. + Activation: {1} {0} pour l'utilisateur {2}. Je n'afficherai plus les avertissements des permissions. @@ -1665,7 +1742,6 @@ La nouvelle valeur de {0} est {1} ! Votre langue de traduction a été changée de {0} à {1} - Fuzzy Traduction automatique des messages commencée sur ce salon. @@ -1690,12 +1766,15 @@ La nouvelle valeur de {0} est {1} ! Parties compétitives perdues + Fuzzy Parties compétitives jouées + Fuzzy Rang en compétitif + Fuzzy Parties compétitives gagnées @@ -1751,6 +1830,7 @@ La nouvelle valeur de {0} est {1} ! Recherche d'images pour: + Fuzzy Impossible de trouver ce film. @@ -1794,9 +1874,11 @@ La nouvelle valeur de {0} est {1} ! En attente + Fuzzy - Url originale + Url d'origine + Fuzzy Une clé d'API osu! est nécessaire. @@ -1825,15 +1907,18 @@ La nouvelle valeur de {0} est {1} ! Lien du profil : + Fuzzy Qualité - Durée en Jeux Rapides + Temps en parties rapides + Fuzzy - Victoires Rapides + Parties rapides gagnées + Fuzzy Évaluation @@ -1843,13 +1928,15 @@ La nouvelle valeur de {0} est {1} ! Chercher pour: - recherche plutôt non ? + recherche plutôt non ? +Fuzzy Impossible de réduire cette Url. Url réduite + Fuzzy Une erreur s'est produite. @@ -1862,6 +1949,7 @@ La nouvelle valeur de {0} est {1} ! Url stockée + Fuzzy Le streamer {0} est hors ligne. @@ -1931,6 +2019,7 @@ La nouvelle valeur de {0} est {1} ! Vitesse du vent + Fuzzy Les {0} champions les plus bannis @@ -1948,6 +2037,7 @@ La nouvelle valeur de {0} est {1} ! Page d'activité #{0} + Fuzzy {0} utilisateurs en total. @@ -1966,9 +2056,11 @@ La nouvelle valeur de {0} est {1} ! Sujet du salon + Fuzzy Commandes exécutées + Fuzzy {0} {1} est équivalent à {2} {3} @@ -1984,6 +2076,7 @@ La nouvelle valeur de {0} est {1} ! Créé le + Fuzzy Salon inter-serveur rejoint. @@ -1996,6 +2089,7 @@ La nouvelle valeur de {0} est {1} ! Emojis personnalisées + Fuzzy Erreur @@ -2010,10 +2104,12 @@ La nouvelle valeur de {0} est {1} ! Index hors limites. - Voici une liste des utilisateurs dans ces rôles : + Liste des utilisateurs ayant le rôle {0}: + Fuzzy - Vous ne pouvez pas utiliser cette commande sur un rôle incluant beaucoup d'utilisateurs afin d'éviter les abus. + Vous ne pouvez pas utiliser cette commande sur les rôles associés à beaucoup d'utilisateurs afin d'éviter les abus. + Fuzzy Valeur {0} invalide. @@ -2024,17 +2120,20 @@ La nouvelle valeur de {0} est {1} ! Serveur rejoint + Fuzzy ID: {0} Membres: {1} -OwnerID: {2} +ID du propriétaire: {2} + Fuzzy Aucun serveur trouvée sur cette page. Liste des messages répétés + Fuzzy Membres @@ -2047,6 +2146,7 @@ OwnerID: {2} Répéteur de messages + Fuzzy Nom @@ -2068,7 +2168,7 @@ OwnerID: {2} Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. - Aucun sujet choisi. + Aucun sujet défini. Propriétaire @@ -2100,16 +2200,18 @@ OwnerID: {2} Citation ajoutée - Une citation aléatoire a été supprimée. + Citation #{0} supprimée. + Fuzzy Région Inscrit sur + Fuzzy - Je vais vous rappeler {0} pour {1} dans {2} `({3:d.M.yyyy} à {4:HH:mm})` + Je vais rappeler {0} de {1} dans {2} `({3:d.M.yyyy} à {4:HH:mm})` Format de date non valide. Vérifiez la liste des commandes. @@ -2122,6 +2224,7 @@ OwnerID: {2} Liste des répétitions + Fuzzy Aucune répétition active sur ce serveur. @@ -2139,25 +2242,26 @@ OwnerID: {2} Rôles - Page #{0} de tout les rôles sur ce serveur. + Page #{0} de tous les rôles de ce serveur: Page #{0} des rôles pour {1} - Aucunes couleurs ne sont dans le format correct. Utilisez `#00ff00` par exemple. + Aucune couleur n'est dans le bon format. Utilisez `#00ff00` par exemple. - Couleurs alternées pour le rôle {0} activées. + Alternance de couleurs pour le rôle {0} activée. - Couleurs alternées pour le rôle {0} arrêtées + Alternance de couleurs pour le rôle {0} désactivée. {0} de ce serveur est {1} Info du serveur + Fuzzy Shard @@ -2165,7 +2269,8 @@ OwnerID: {2} Statistique des shards - Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. + Ne pas confondre Shard et Shared ;) Dans discord, le mot shard n'a pas d'équivalent francophone. +Fuzzy Le shard **#{0}** est en état {1} avec {2} serveurs. @@ -2178,10 +2283,11 @@ OwnerID: {2} Pas d'emojis spéciaux trouvés. - Joue actuellement {0} musiques, {1} en attente. + Joue actuellement {0} piste(s), {1} en attente. Salons textuels + Fuzzy Voici le lien pour votre salon: @@ -2190,7 +2296,7 @@ OwnerID: {2} Durée de fonctionnement - {0} de l'utilisateur {1} est {2} + {0} de l'utilisateur {1}: {2} Id of the user kwoth#1234 is 123123123123 @@ -2198,6 +2304,101 @@ OwnerID: {2} Salons vocaux + Fuzzy + + + Vous avez déjà rejoint cette course! + + + Résultats du sondage actuel + + + Aucun vote enregistré. + + + Un sondage est déjà en cours sur ce serveur. + + + 📃 {0} a créé un sondage qui requiert votre attention: + + + `{0}.` {1} avec {2} votes. + + + {0} a voté. + Kwoth voted. + + + Envoyez moi un message privé avec le numéro correspondant à la réponse. + + + Envoyez un Message ici avec le numéro correspondant à la réponse. + + + Merci d'avoir voté, {0} + + + {0} votes enregistrés au total. + + + Ramassez-les en écrivant `{0}pick` + + + Ramassez-le en écrivant `{0}pick` + + + Aucun utilisateur trouvé. + + + page {0} + + + Vous devez être sur un salon vocal sur ce serveur. + + + Il n'y a pas de rôle de salon vocal. + + + {0} est désormais **muet** du chat textuel et vocal pour {1} minutes. + + + Les utilisateurs rejoignant le salon vocal {0} obtiendront le rôle {1}. + + + Les utilisateurs rejoignant le salon vocal {0} n’obtiendront plus de rôle. + + + Rôles du salon vocal + + + Le message déclenchant la réaction personnalisée avec l'ID {0} ne sera pas automatiquement effacé. + + + Le message déclenchant la réaction personnalisée avec l'ID {0} sera automatiquement effacé. + + + Le message de réponse pour la réaction personnalisée avec l'ID {0} ne sera pas envoyé en MP. + + + Le message de réponse pour la réaction personnalisée avec l'ID {0} sera envoyé en MP. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/CommandStrings.ja-JP.resx b/src/NadekoBot/Resources/ResponseStrings.ja-JP.resx similarity index 65% rename from src/NadekoBot/Resources/CommandStrings.ja-JP.resx rename to src/NadekoBot/Resources/ResponseStrings.ja-JP.resx index 76de6cb2..6e52fbe0 100644 --- a/src/NadekoBot/Resources/CommandStrings.ja-JP.resx +++ b/src/NadekoBot/Resources/ResponseStrings.ja-JP.resx @@ -118,1016 +118,1274 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - その基盤はすでに主張されている。または破壊されました。 - + そのベースはもう要求・破壊されました。 - ベースが破壊されました - + そのベースはもう破壊されました。 - その基地は主張されていない。 - + そのベースは要求されていません。 - {1}との戦争中の整数{0}を破壊しました + {1}との対戦でベース#{0}を**破壊**しました。 - + {0}は{2}との戦いで、未請求の塩基番号{1}を持っています + + Fuzzy - + {0}は{2}との戦いで塩基番号{1}を主張しました + - + @ {0}あなたはすでに基本番号{1}を主張しています。あなたは新しいものを請求することはできません。 + - + {1}との戦争で@ {0}からの申し立てが終了しました。 + + The English wording is wrong. - + - + {0} との戦争に関する情報 - + 無効な城の番号 + - + 有効な戦争サイズではありません。 + - + アクティブな戦争を一覧表示する。 + - + 請求されていない + - + あなたはこの戦争の参加者ではありません。 + - + @{0} +あなたはその戦争に参加していないか、その基地はすでに破壊されています。 - + 活動的な戦争はない サイズ - + {0}に対する大戦が既に始まった。 - + 戦争{0}が作成されました。 + - + {0}に対する戦争は終わった。 + - + その戦争は存在しない。 + - + 戦争{0}が始まった! + - + すべてのカスタム反応がクリアされました。 + - + カスタム反応が削除されました。 + - + 権限が不十分です。グローバルカスタム反応のために必要なボットの所有権、サーバーカスタム反応の管理者。 + - + すべてのカスタム反応をリストします。 + - + カスタム反応。 + - + 新しいカスタム反応。 + - + カスタムリアクションが見つかりませんでした。 + + Fuzzy - + その識別情報でカスタム反応が見つかりませんでした。 + 反応 - + カスタム反応の統計 + - + {0}カスタム反応の統計がクリアされました。 + - + そのトリガーの統計は見つかりませんでした。 + - トリガー + 引き金 - + NSFWが停止しました + - + 結果が見つかりません + - + {0}は既に気絶しています。 + - + {0}健康は既に最大です + - + あなたはすでに{0}です + - - Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + {4}ダメージのために{2} {3}に{0} {1}を使用しました。 + + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. +Fuzzy - + あなたは報復せずに再び攻撃することはできません! + - + あなた自身を攻撃することはできません。 + - + {0}が気絶しました! + - + 1つの{1}で{0}を回復しました + - + {0}は{1} HPが残っています。 + - + {0}を使用することはできません。 `{1} ml`と入力すると、使用できる移動のリストが表示されます。 + - + {0}タイプの攻撃リスト + - + それは効果的ではありません。 + - + あなたに十分な{0}がありません。 + - + 1つの{1}で復活{0} + - + 1つの{0}のために癒された + - + あなたのタイプは{1}のために{0}に変更されました + - + それはやや有効です。 + - + それは超効果的です! + - + あなたは連続してあまりにも多くの動きを使用したので、移動することはできません! + - + タイプ{0}は{1}です。 + - + ユーザーが見つかりません。 + - + あなたが気絶したので、動かすことはできません。 + - + **ユーザー割り当ての**役割を自動割り当て**が無効**になりました。 + - + **ユーザー割り当ての**役割を自動割り当て**が現在有効になっています**。 + 接続 - + 画像が変更されました。 + - + あなたは{0}サーバーから追放されました。 +理由:{1} - BANNED + 亡命 PLURAL ユーザーはBANNED + Fuzzy - + ボット名が{0}に変更されました + - + ボットのステータスが{0}に変更されました + - + byeメッセージの自動削除が無効になっています。 + - + Byeメッセージは{0}秒後に削除されます。 + - + 現在の離脱メッセージ:{0} + - + {0}と入力して休暇メッセージを有効にする + - + 新しい出発メッセージセット。 + - + 出発アナウンスが無効になりました。 + - + このチャンネルで有効になっている出発発言。 + - + チャンネル名が変更されました。 + 古称 - + チャネルトピックが変更されました + - + クリーンアップ + コンテント - + 正常に作成されたロール - + 正常に作成されたロール - + 音声チャネル{0}が作成されました。 - + 聴覚障害者は成功です。 - + 削除されたサーバー{0} + - + 成功したコマンド呼び出しの自動削除を停止しました。 + + Invocations* not invokations - + これで正常に実行されたコマンド呼び出しが自動的に削除されます。 + - + テキストチャネル{0}が削除されました。 + - + 音声チャネル{0}が削除されました。 + タイレクトメッセージガ - + 新しい寄付者を追加しました。このユーザーから寄付された金額:{0} + - + このプロジェクトを実現するために、下記の人々に感謝します! + - + 私はDMをすべての所有者に転送します。 - + 私は最初の所有者にDMを転送します。 - + 私は今からDMを転送します。 + - + 私は今からDMを転送するのをやめます。 + - + 挨拶メッセージの自動削除が無効になっています。 + - + {0}秒後にメッセージが削除されます。 + - + 現在のDM挨拶メッセージ:{0} + - + {0}を入力してDM greetメッセージを有効にする + - + 新しいDMはメッセージセットを迎える。 + - + DMのお知らせを無効にする - + DMのお知らせを有効にしました。 - + 現在の挨拶メッセージ:{0} + - + {0}と入力してgreetメッセージを有効にする + - + 新しい挨拶メッセージセット。 - + お知らせを無効にしました。 - + このチャンネルでアナウンスを有効にします。 - + このコマンドは、役割階層内の役割以上のユーザーに対しては使用できません。 - + {0}秒後に画像が読み込まれました! - + 入力フォーマットが無効です。 - + パラメータが無効です。 - + {0}は{1}に参加しました - + あなたは{0}サーバーから蹴られました。 +理由:{1} - + ユーザーが蹴った + Fuzzy - + 言語一覧 +{0} + Fuzzy - + サーバーのロケールが{0} - {1}になりました + - + Botのデフォルトのロケールは{0} - {1}になりました + - + Botの言語は{0} - {1}に設定されています + - + ロケールの設定に失敗しました。このコマンドのヘルプに戻ってください。 - + このサーバーの言語は{0}〜{1}に設定されています + - + {0}さんが{1}を去りました - + {0}サーバーを去った - + このチャネルに{0}イベントを記録します。 - + このチャンネルのすべてのイベントを記録します。 - + ロギングが無効です - + 購読可能なイベントを記録する: - + ロギングは{0}を無視します {0} - + ロギングは{0}を無視しません {0} - + ログに記録された{0}イベントが停止しました。 + - + {0}は次の役割についての言及を呼び出しました + - + {0} `[Bot Owner]`からのメッセージ: + - + メッセージが送信されました。 + - + {0}は{1}から{2}に移動しました + - + #{0}でメッセージが削除されました + - + #{0}で更新されたメッセージ + Fuzzy - ミュート - PLURAL (users have been muted) -Fuzzy + ミュート中 + PLURAL (users have been muted) - ミュート + ミュート + singular "User muted." - + 私はそれに必要な許可を持っていません。 + - + 新しいミュートロールセット。 + - + 管理の権利が必要となります。 - + 新しいメッセージ + Is this: make a new message or、 there is a new message? +Fuzzy - + 新しいニックネーム + Fuzzy - + 新しいトピック + Fuzzy - + ニックネームが変更されました + Fuzzy - + そのサーバーを見つけることができません + - + そのIDのシャードは見つかりませんでした。 + - + 古いメッセージ + Fuzzy - + 古いニックネーム + Fuzzy - + 古いトピック + Fuzzy - + エラー。ほとんどの場合、十分な権限がありません。 + - + このサーバーのアクセス許可はリセットされます。 + - + アクティブな保護 + - + このサーバーで{0}は**無効**になっています。 + - + {0}を有効にしました + - + エラー。管理権限が必要です。 - + 保護は有効になっていません。 + - + ユーザーのしきい値は{0}から{1}の間でなければなりません。 + - + {0}以上のユーザーが{1}秒以内に参加する場合は、{2}それらを行います。 + - + 時刻は{0}〜{1}秒の間でなければなりません。 + - + ユーザー{0}からすべてのロールを削除しました + - + ロールを削除できませんでした。私には十分な権限がありません。 + - + {0}ロールの色が変更されました。 + - + その役割は存在しません。 + - + 指定されたパラメータは無効です。 + - + 無効な色または権限が不十分なためにエラーが発生しました。 + + TYPO, "Occured" should be 'Occurred' - + ユーザー{1}からロール{0}を削除しました + - + 役割を削除できませんでした。私には十分な権限がありません。 + - + 役割名を変更しました - + 役割の名前を変更できませんでした。私には十分な権限がありません。 + - + 最高のロールよりも上位のロールは編集できません。 + - + 再生メッセージを削除しました:{0} + - + ロール{0}がリストに追加されました。 + + TYPO. "as" should be 'has' - + {0}は見つかりませんでした。 + - + ロール{0}はすでにリストにあります。 + - + 追加されました。 + - + 回転再生状態が無効になっています。 + - + 回転再生状態が有効になっています。 + - + +回転状態の一覧は次のとおりです: +{0} + - + 回転再生状態は設定されません。 + - + あなたはすでに{0}ロールがあります。 + - + {0}はすでに自己割り当てロールを持っています。 + - + 自己割り当ての役割は今排他的です! + - + 自分に割り当てられるロールが{0}個あります。 - + そのロールは自分に割り当てられません。 - + あなたは{0}ロールを持っていません。 + - + 自己割り当ての役割は現在無制限です + - + 私はあなたにその役割を追加することができません。 `私は役割階層に私の役割よりも高い所有者または他の役割に役割を追加することはできません。 + - + 自己割り当て可能なロールのリストから{0}が削除されました。 + - + あなたはもはや{0}ロールを持っていません。 + - + あなたは今{0}の役割を持っています。 + - + ユーザー{1}にロール{0}を追加しました + + Typo- "Sucessfully" should be 'Successfully' - + ロールの追加に失敗しました。アクセス権が足りません。 - + 新しいアバターセット! + - + 新しいチャンネル名が設定されました。 + - + 新しいゲームセット! + - + 新しいストリームセット! + - + 新しいチャンネルのトピックセット。 + - + シャード{0}が再接続されました。 + - + シャード{0}再接続中です。 + - + シャットダウン + - + ユーザーは{1}秒ごとに{0}以上のメッセージを送信することはできません。 + - + 低速モードは無効です。 - + 低速モードが初期化しました。 - + ソフトバン(キック) PLURAL - + {0}はこのチャンネルを無視します。 - + {0}はこのチャンネルを無視しなくなりました。 - + ユーザーが同じメッセージを{0}行に投稿した場合は、{1}それらを送信します。 + - + テキストチャンネルが作成されました。 - + テキストチャネルが破棄されました。 + - + 逆の聴覚障害を成功させる。 + - + ミュート解除 singular - + ユーザー名 + - + ユーザー名が変更されました + - + ユーザーズ - + 追放されたユーザー + - + {0}はチャットから**ミュートされています**。 + - + {0}は、チャットから**ミュートされていません**。 + - + ユーザーが参加しました + - + 利用者が去った - + {0}はテキストチャットとボイスチャットから**ミュート**されています。 + - + 利用者にロールを追加した - + 利用者のロールを削除した - + {0}さんは今{1}になった - + {0}はテキストとボイスチャットから**ミュートされていません**。 - + {0}は{1}音声チャンネルに参加しました - + {0}は音声チャネルを残しました{1} - + {0}は{1}から{2}音声チャネルに移動しました。 + - + {0}は**音声ミュートされました**。 + - + {0}は**音声ミュートされていません**。 - + 音声チャネルが作成されました + - + 音声チャネルが破壊されました + - + 音声+テキスト機能が無効になっています。 + - + 音声+テキスト機能を有効にしました。 + - + **私は役割を管理していません**そして/または**チャンネルを管理しています**許可。だから{0}サーバーで音声+テキストを実行できません。 + - + あなたはこの機能を有効/無効にしています。**私は管理者権限を持っていません**。これによりいくつかの問題が発生する可能性があります。その後、自分でテキストチャネルをクリーンアップする必要があります。 + - + この機能を有効にするには、少なくとも**役割を管理する**と**チャネルを管理する**権限が必要です。 (管理権限が必要です) + + TYPO > "atleast" isn't a word. It's 'At least' - + テキストチャットのユーザー{0} + - + テキストとボイスチャットのユーザー{0} + - + ボイスチャットからのユーザー{0} + - + あなたは{0}サーバーからソフト禁止されました。 +理由:{1} - + Since I'm using "exiled" for banned. need to rethink a new word.. so just leave this one alone + + Fuzzy - + 移行が完了しました! + - + 移行中にエラーが発生しました。詳細については、ボットのコンソールを確認してください。 + - + 存在の更新 - + ユーザはソフトバン + Fuzzy - + {0}から{1}に授与されました + - + 次回より良い運がいいよ^ _ ^ + - + おめでとう!あなたは{1}以上で転がって{0}勝った - + デッキが再編されました。 + - + 反転した{0}。 User flipped tails. - + ご想像の通り!あなたは{0}を獲得しました + - + 無効な番号が指定されました。 1を{0}コインにすることができます。 + - + このメッセージに{0}反応を加えて{1}を得る␣ + - + このイベントは最大{0}時間有効です。 + - + 花の反応が始まった! + - + は{0}から{1}に才能を与えました + X has gifted 15 flowers to Y - + {0}には{1}があります + X has Y flowers - + 頭 + - + リーダーボード + - + {2}から{0}人の{1}人のユーザーを獲得しました。 + - + {0}以上の賭けはできません + - + あなたは{0}未満に賭けることはできません + - + あなたに十分な{0}がありません。 + - + デッキにはもうカードがありません。 + - + 抽選でユーザーを入力しました。 + - + あなたは{0}をロールした。 + - + 賭ける - + 素晴らしい!おめでとう! x {0} - + 単一の{0}、x {1} - + うわー!幸運な! 3種類の! x {0} + - + よくやった! 2つの{0} - ベットx {1} + - + ウォン - + ユーザーは{0}を取得するために秘密のコードを入力する必要があります。 +{1}秒続く。誰にも言わないでください。 :ウィンク: - + 卑劣なゲームイベントが終了しました。 {0}ユーザーは報酬を受け取った。 - + 卑劣なゲームステータスイベントが開始されました - + テイル - + {1}から{0}を正常に受け取りました + - + ユーザーが{2}をあまり持っていないので{1}から{0}を取ることができませんでした! + - + ToCに戻る + - + ボットの所有者のみ + - + {0}チャンネル許可が必要です。 + - + パトロンでプロジェクトをサポートすることができます:<{0}>またはpaypal:<{1}> + - + コマンドとエイリアス + - + コマンドリストが再生成されました。 + - + `{0} h コマンド名`と入力すると、指定されたコマンドのヘルプが表示されます。 + - + 私はそのコマンドを見つけることができません。再試行する前にコマンドが存在することを確認してください。 + - + 形容 + - + あなたはNadekoBotプロジェクトを +パトリオン<{0}>または +Paypal <{1}> +あなたの不和の名前またはIDをメッセージに残すことを忘れないでください。 + +**ありがとうございました**♥<2ja> - + **コマンド一覧**:<{0}> +**ホスティングガイドとドキュメントはこちら**:<{1}> - + コマンド一覧 + - + +モジュール一覧 - + `{0} cmds ModuleName`と入力すると、そのモジュール内のコマンドのリストを取得できます + - + そのモジュールは存在しません。 + - + {0}サーバーのアクセス許可が必要です。 + + - + 目次 + - + 使用法 + - + Autohentaiが開始しました。すべての{0}を次のいずれかのタグで再転記してください: +{1} + - + 荷札 + - + アニマルレース - + 十分な参加者がいなかったのでスタートできませんでした。 - + レースは満員になりました。すぐにスタートします。 - + {0} は {1} として参加しました。 - + {0}は{1}と{2}に参加しました! - + レースに参加するには{0} jrと入力してください。 - + 部屋がいっぱいになるか、20秒後にスタートします。 - + {0} 人の参加者でスタートします。 - + {0}を{1}としてレースを獲得しました! + - + {0}を{1}に、レースを{2}獲得しました! + - + 数が正しくありません。一度に {0}-{1} のダイスを触れます。 - + ロール状{0} + Someone rolled 35 - + サイコロ振りました。: {0} Dice Rolled: 5 - + レーズが開始できませんでした。他のレースが行われているかもしれません。 - + このサーバーでは、どのレースも存在していません。 - + 最初の数よりも2番めの数が大きくなければなりません。 - + 「心」の変化 - + が主張する + - + 離婚 + - + 好き - + 価格 - + waifusはまだ主張されていません。 - + トップワイフス + - + あなたの親和性はすでにそのwaifuに設定されているか、親和性を持たずに削除しようとしています。 + - + {0}から{1}にアフィニティを変更しました。 + +*これは道徳的に疑問です。*🤔 Make sure to get the formatting right, and leave the thinking emoji - + アフィニティを再度変更するには、{0}時間と{1}分を待つ必要があります。 + - + 親和性がリセットされます。あなたはもはや好きな人がいません。 + - + {0}のwaifuになりたいAww <3 - + {1}のウェイフとして{0}が主張されています! + - + あなたが好きな人と離婚しました。あなたは無情な怪物です。 +{0}は補償として{1}を受け取りました。 - + あなたは自分自身に親和性を設定することはできません。 + - + +🎉彼らの愛が成就した! 🎉 +{0}の新しい値は{1}です! @@ -1151,7 +1409,7 @@ Fuzzy - + エイトボール @@ -1178,7 +1436,7 @@ Fuzzy - + 数字を入力して投票 @@ -1190,7 +1448,7 @@ Fuzzy - + 質問 @@ -1208,13 +1466,13 @@ Fuzzy - + カテゴリー - + このサーバーではCleverbotが有効です。 @@ -1227,22 +1485,22 @@ Fuzzy plural - + ランダム {0} が出現! - + 質問のロードに失敗しました。 - + ゲームが始まりました。 - + ハングマンゲームが始まりました。 - + ハングマンゲームはすでにこのチャンネルで開始されています。 - + ハングマンのスタート時にエラーが起きました。 @@ -1295,13 +1553,13 @@ Fuzzy - + 引き分け - + {0} の勝ち! @@ -1322,22 +1580,23 @@ Fuzzy - + オートプレイは無効です。 - + オートプレイは有効です。 - + デフォルトの音量を{0}% にしました。 - + ディレクトリのキューが完了しました。 - + 曲が終わった + Fuzzy @@ -1355,76 +1614,78 @@ Fuzzy - + 最大再生時間は制限ありません。 - + 最大再生時間を {0} 秒にセットしました。 - + 最大の音楽キューサイズを無制限にしました。 - + 最大の音楽キューサイズを {0} トラックに設定しました。 - + このサーバーのボイスチャンネルにいる必要があります。 - + 曲名 - + プレイ中 + Fuzzy - + アクティブな音楽再生がありません。 - + 検索結果なし - + 音楽の再生を一時停止します。 - + キュー Page {0}/{1} - + 音楽を再生しています。 - + `#{0}` - **{1}** by *{2}* ({3} 曲) - + 保存されたリストの {0} ページ目 - + プレイリストは削除されました。 - + プレイリストの削除に失敗しました。存在しないか、権限がありません。 - + そのIDのプレイリストは存在しません。 - + プレイリストのキューは完了しました。 - + プレイリストを保存しました。 - + {0} の上限です - + 次に聞く曲一覧 - + キューに追加した曲 + Does this mean "the song was added to the queue" ? - + キューの音楽はクリアされました。 - + キュー( {0}/{0} ) はいっぱいです。 @@ -1488,28 +1749,29 @@ Fuzzy - + 役割 {0} のすべてのモジュールの使用は無効になりました。 - + 役割 {0} のすべてのモジュールの使用は有効になりました。 - + このサーバーのすべてのモジュールの使用が無効になりました。 - + このサーバーのすべてのモジュールの使用が有効になりました。 - + ユーザー {0} へのすべてのモジュールの使用を無効にしました。 - + ユーザー {0} へのすべてのモジュールの使用を有効にしました。 - + {0} (ID {1})をブラックリストに登録しました。 + Cooldown? @@ -1592,7 +1854,7 @@ Fuzzy - + Short of seconds. @@ -1605,7 +1867,7 @@ Fuzzy - + 編集不可能 @@ -1762,7 +2024,7 @@ Fuzzy - + 最低/最高 @@ -1774,7 +2036,8 @@ Fuzzy - + 元のURL + Fuzzy @@ -1801,7 +2064,8 @@ Fuzzy - + プロファイルへのリンク + Fuzzy @@ -1816,10 +2080,11 @@ Fuzzy - + スコア: - + 検索: + Fuzzy @@ -2008,22 +2273,23 @@ Fuzzy - + 中継器一覧 + Fuzzy - + メンバー - + メッセージ - + 名前 @@ -2044,10 +2310,10 @@ Fuzzy - + オーナー - + オーナーのID @@ -2074,7 +2340,7 @@ Fuzzy - + 地域 @@ -2104,13 +2370,13 @@ Fuzzy - + 結果 - + 役割 - + このサーバーにある役割一覧のページ{0} @@ -2158,14 +2424,108 @@ Fuzzy - + {1}の{0}は{2} Id of the user kwoth#1234 is 123123123123 - + 利用者 + + + + + + + + + + + + + + + + + + + + + Kwoth voted. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.nb-NO.resx b/src/NadekoBot/Resources/ResponseStrings.nb-NO.resx new file mode 100644 index 00000000..f566494b --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.nb-NO.resx @@ -0,0 +1,2338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Den basen har allerede blitt tatt over eller ødelagt. + + + Den basen er allerede ødelagt. + + + Ingen har hevdet denne basen. + + + **ØDELAGT** base #{0} i en krig mot {1} + + + {0} har **hevdet** bare #{1} i en krig mot {2} + + + {0} har hevdet en base #{1} i en krig mot {2} + + + @{0} Du har allerede hevdet basen #{1}. Du kan ikke kreve en ny. + + + Krav fra @{0} for en krig mot {1} har utløpt. + Fuzzy + + + Fiende + + + Info om krigen mot {0} + + + Ugyldig basenummer + + + Ikke en gyldig krigstørrelse + Fuzzy + + + Liste over aktive kriger + Fuzzy + + + ikke hevdet + + + Du er ikke en deltager i den krigen. + + + @{0} Du deltar enten ikke i denne krigen, eller basen er allerede ødelagt. + + + Ingen aktive kriger. + Fuzzy + + + Størrelse + + + Krig mot {0} har allerede begynt. + + + Krig mot {0} opprettet. + + + Krig mot {0} avsluttet. + + + Den krigen eksisterer ikke. + + + Krig mot {0} startet! + + + Alle tilpassede reaksjons-statistikker fjernet. + + + Tilpasset reaksjon fjernet + + + Utilstrekkelig tilgang. Krever Bot-eierskap for globale tilpassede reaksjoner, og Administrator for server reaksjoner. + + + Liste av alle tilpassede reaksjoner. + + + Tilpassede reaksjoner. + + + Ny tilpasset reaksjon + + + Ingen tilpasset reaksjon funnet. + Fuzzy + + + Ingen tilpasset reaksjon funnet med den ID'en. + + + Respons + + + Tilpassede reaksjon statistikker. + + + Statistikk fjernet for {0} reaksjon + + + Ingen statistikk funnet for den utløseren, ingen handling utført + + + Utløser + + + Autohentai stoppet + + + Ingen resultater. + + + {0} har allerede besvimt + + + {0} har allerede full helse + + + Din type er allerede {0} + + + brukte {0}{1} på {2}{3} for {4} skade. + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + + + Du kan ikke angripe igjen uten motstanderens hevn. + Sjekk om Kwoth oppdaterer original setningen senere. Har sendt forslag om endring. + + + Du kan ikke angripe deg selv. + + + {0} har besvimt! + + + helbredet {0} med én {1} + + + {0} har {1} helse igjen + + + Du kan ikke bruke {0}. Skriv ´{1}ml` for å se en liste med angrep du kan bruke. + + + Angrep for {0} -type. + + + Det er ikke effektivt. + + + Du har ikke nok {0} + + + gjenopplivet {0} med én {1} + + + Du gjenopplivet deg selv med én {0} + + + Din type ble endret til {0} for èn {1} + + + Det er noe effektivt. + + + Det er super effektivt! + + + Du har gjort for mange angrep på rad, du kan nå ikke gjøre flere angrep! + + + {0} sin type er {1} + + + Bruker ikke funnet + + + Du besvimte, så du kan nå ikke bevege deg. + + + **Automatisk rollegivning** når brukere kommer inn er nå **deaktivert** + + + **Automatisk rollegivning** når brukere kommer inn er nå **aktivert** + + + Legg til filer + + + Profilbilde + + + Du har blitt utestengt fra {0} +Grunn: {1} + + + utestengt + PLURAL + + + Bruker ble utestengt + + + Bot navn endret til {0} + + + Bot status endret til {0} + + + Automatisk sletting av 'farvel'-meldinger er aktivert + + + Farvel-meldinger vil bli slettet etter {0} sekunder. + + + Nåværende 'farvel'-melding: {0} + + + Aktivér 'farvel'-meldinger ved å skrive {0} + + + Ny 'farvel'-melding satt. + + + 'farvel'-kunngjøringer deaktivert. + + + 'farvel'-kunngjøringer aktivert i denne kanalen. + + + Kanalnavn endret. + + + Gammelt navn + + + Kanalemne endret. + + + Ryddet opp. + + + Innhold + + + Rolle opprettet + + + Tekstkanal {0} laget. + + + Talekanal {0} laget. + + + Demping vellykket. + + + Slettet server {0} + + + Stoppet automatisk sletting av vellykkede kommando invokationer. + + + Sletter nå kommandomeldinger automatisk. + + + Tekstkanal {0} slettet. + + + Lydkanal {0} slettet. + + + DM fra + + + Vellykket i å legge til ny bidragsyter. Totalt bidratt av denne brukeren: {0} 👑 + + + Takk til folkene under som gjorde dette prosjektet mulig! + + + Jeg videresender de personlige meldingene til alle eierne. + + + Jeg vil bare vidresende de personlige meldingene til den første eieren. + + + Jeg vil videresende personlige meldinger fra nå. + + + Jeg slutter å videresende personlige meldinger fra nå. + + + Automatisk sletting av velkomstmeldinger har blitt deaktivert. + + + Velkomst meldinger blir slettet etter {0} sekunder. + + + Nåværende personlige velkomst melding: {0} + + + Aktiver personlig velkomstmelding ved å skrive {0} + + + Ny personlig velkomstmelding valgt. + + + Personlig velkomstmelding deaktivert. + + + Personlig velkomstmelding aktivert. + + + Nåværende velkomstmelding: {0} + + + Aktiver velkomstmeldinger ved å skrive {0} + + + Ny velkomstmelding satt. + + + Velkomst-kunngjøring deaktivert. + + + Velkomst-kunngjøring aktivert i denne kanalen. + + + Du kan ikke bruke denne kommandoen på brukere som har en rolle høyere eller på samme nivå som deg i hierarkiet. + + + Bilder lastet etter {0} sekunder! + + + Ugyldig tilførings format. + + + Ugyldige parametere + + + {0} ble med i {1} + + + Du har blitt sparket fra {0} +Grunn: {1} + + + Bruker sparket + Fuzzy + + + Liste over språk {0} + Fuzzy + + + Din servers' lokasjon er nå {0} - {1} + + + Bot'ens standard språk er satt til {1} - {1} + + + Bot'ens språk er satt til {0} - {1} + + + Kunne ikke sette språk. Vennligst sjekk denne kommandoens bruksinformasjon. + + + Denne serverens språk er satt til {0} - {1} + + + {0} har forlatt {1} + + + Forlot server {0} + + + Logger {0} hendelse på denne kanalen. + + + Logger alle hendelser i denne kanalen. + + + Logging deaktivert. + + + Logg hendelser du kan abonnere på: + + + Logging vil ignorere {0} + + + Logging vil ikke ignorere {0} + + + Sluttet å logge {0} hendelse. + + + {0} har påkalt en nevnelse av følgende roller + + + Melding fra {0} '[Bot Eier]': + + + Melding sendt. + + + {0} flyttet fra {1} til {2} + + + Melding slettet i #{0} + Fuzzy + + + Melding oppdatert i #{0} + Fuzzy + + + Dempet + PLURAL (users have been muted) + + + Dempet + singular "User muted." + + + Jeg har mest sannsynlig ikke de nødvendige tillatelsene til det. + + + Ny 'dempet'-rolle satt. + + + Jeg trenger **Administrasjon** tillatelse til å gjøre det. + + + Ny Melding + Fuzzy + + + Nytt kallenavn + Fuzzy + + + Nytt emne + Fuzzy + + + Kallenavn endret. + Fuzzy + + + Kan ikke finne den serveren + + + Ingen shard med den IDen funnet. + + + Gammel melding + Fuzzy + + + Gammelt kallenavn + Fuzzy + + + Gammelt emne + Fuzzy + + + Feil. Mest sansynlig har jeg ikke tilstrekkelige tillatelser. + + + Tillatelsene til denne serveren er nullstilt. + + + Aktive Beskyttelser + Fuzzy + + + {0} har blitt **deaktivert** på denne serveren. + + + {0} aktivert + + + Feil. Jeg trenger "Behandle roller" tillatelse. + + + Ingen beskyttelser aktivert + Fuzzy + + + Bruker terskelen må være mellom {0} og {1} + + + Hvis {0} eller flere brukere kommer inn i løpet av {1} sekunder, blir de {2} + + + Tiden må være mellom {1} og {1} sekunder. + + + Fjernet alle roller fra {0} + + + Kunne ikke fjerne roller. Jeg har ikke de rette tillatelsene. + + + Rollen {0} sin farge er blitt endret. + + + Den rollen eksisterer ikke. + + + Gitte parametere er ikke gyldige. + + + En feil oppstod, grunnet ugyldig fargekode, eller ikke tilstrekkelig med tillatelser. + + + Fjernet rollen {0} fra {1} + + + Kunne ikke fjerne rollen. Jeg har ikke tilstrekkelig med tillatelser + + + Endret navn på rolle. + + + Kunne ikke endre navn på rolle. Jeg har ikke tilstrekkelig med tillatelser. + + + Du kan ikke endre på roller som er høyere enn din i hierarkiet. + + + Fjernet 'Spiller'-melding: {0} + + + Roller {0} er lagt til i listen + + + {0} ikke funnet. Renset opp. + + + Rolle {0} er allerede i listen + + + Lagt til. + + + Roterende 'spiller'-status deaktivert. + + + Roterende 'spiller'-status aktivert. + + + Liste med roterende statuser: +{0} + + + Ingen roterende statuser er satt. + + + Du har allerede rollen {0} + + + Du har allerede en eksklusiv rolle: {0} + + + Selvsettende roller er nå eksklusive! + + + Det er nå {0} selvsettende roller. + + + Den rollen er ikke selvsettende. + + + Du har ikke rollen {0}. + + + Selvsettende roller er nå ikke eksklusive! + + + Jeg kan ikke gi deg den rollen. +`Jeg kan ikke gi roller til eiere eller brukere som har en rolle høyere enn min egen i hierarkiet` + + + {0} ble fjernet fra listen over selvsettende roller. + + + Du har ikke lenger rollen {0} + + + Du har nå rollen {0} + + + Gav rollen {0} til {1} + + + Kunne ikke legge til rolle. Jeg har ikke de rette tillatelsene. + + + Nytt profilbilde er satt! + + + Nytt kanalnavn satt. + + + Nytt spill satt. + + + Ny strøm satt. + + + Nytt kanalemne satt + + + Shard {0} gjentilkoblet. + + + Kobler til shard {0} på nytt + + + Avslutter + + + Brukere kan ikke sende flere enn {0} meldinger i løpet av {1} sekunder. + + + Sakte modus deaktivert + + + Sakte modus aktivert + + + soft-banned (sparket) + PLURAL + + + {0} vil nå ignorere denne kanalen. + + + {0} vil ikke lenger ignorere denne kanalen. + + + Hvis en bruker sender {0} like meldinger på rad, vil de bli {1}. +__IgnoredChannels__: {2} + + + Tekstkanal opprettet + Fuzzy + + + Tekstkanal fjernet + Fuzzy + + + Demping fjernet + + + Fjernet demping + singular + + + Brukernavn + + + Brukernavn endret + Fuzzy + + + Brukere + + + Bruker utestengt + Fuzzy + + + {0} har blit **dempet** fra å chatte. + + + Fjernet demping på {0} for chatting. + + + Bruker ble med i samtalen. + Fuzzy + + + Bruker Forlatt. + Fuzzy + + + {0} har blitt **dempet** fra tekst og talekanaler. + + + Brukerrolle lagt til + Fuzzy + + + Brukerrolle fjernet + Fuzzy + + + {0} er nå {1} + + + {0} er ikke lenger dempet fra tekst og tale. + + + {0} har blitt med i {1} + + + {0} har forlatt {1} + + + {0} flyttet fra {1} til {2} + + + {0} har blitt **tale dempet*** + + + {0} er ikke lenger **taledempet** + + + Talekanal laget + Fuzzy + + + Talekanal fjernet + Fuzzy + + + Deaktivert tale + tekst funksjon. + + + Aktivert lyd + tekst funksjon. + + + Jeg har ikke ** + + + Du aktiverer/deaktiverer denne funksjonen og **jeg ikke har administratorrettigheter**. Dette kan føre til noen problemer, og du blir nødt til å rydde opp i tekst kanaler selv etterpå. + + + Jeg trenger **Behandle roller** og **Administrer kanaler** tillatelser for å aktivere denne egenskapen. (Administrator er foretrukket) + + + Bruker {0} fra tekst-chat + + + Bruker {0} fra tekst og tale chat + + + Bruker {0} fra stemmechat + + + Du har blitt 'soft-banned' fra {0} server. +Grunn: {1} + + + Fjernet bruker fra utestenging + + + Migrering fullført! + + + Feil under migrering, sjekk botens konsoll for mer informasjon. + + + Oppdatering av tilstedeværelse + + + Bruker soft-banned + + + har tildelt {0} til {1} + + + Bedre hell neste gang :3 + + + Gratulerer! Du vant {0} for å rulle høyere enn {1} + + + Kortstokk stokket. + + + kastet {0}. + User flipped tails. + + + Du gjettet det! Du vant {0} + + + Ugyldig nummer spesifisert. Du kan kaste 1 til {0} mynter. + + + Legg {0} reaksjon på denne meldingen for å få {1} + + + Denne hendelsen er aktiv i opptil {0} timer. + + + Blomster reaksjonshendelse startet! + + + har gitt {0} til {1} + X has gifted 15 flowers to Y + + + {0} har {1} + X has Y flowers + + + Mynt + Fuzzy + + + Resultattavle + + + Tildelt {0} til {1} brukere fra {2} rollen. + + + Du kan ikke vedde mer enn {0} + + + Du kan ikke vedde mindre enn {0} + + + Du har ikke nok {0} + + + Ikke flere kort i kortstokken. + + + Trakk bruker + + + Du rullet {0}. + + + Vedde + + + WOAAHHHHHH!!! Gratulerer!!! x{0} + + + En enkel {0}, x{1} + + + Wow! Heldig! Tre like! x{0} + + + Godt jobbet! To {0} - veddemål x{1} + + + Vant + + + Brukere må skrive et hemmelig kodeord for å få {0}. +Varer i {1} sekunder. Ikke si det til noen. Shhh. + + + SneakyGame hendelse avsluttet. {0} brukere fikk belønning. + + + SneakyGameStatus hendelse startet + + + Kron + Fuzzy + + + vellykket i og ta {0} fra {1} + + + Kunne ikke ta {0} fra {1} fordi brukeren hadde ikke så mye {2}! + + + Tilbake til innholdsfortegnelsen + + + Kun boteier + Fuzzy + + + Krever {0} kanal tillatelse. + + + Du kan støtte prosjektet på Patreon: <{0}> eller paypal: <{1}> + + + Kommandoer og aliaser + + + Kommandoliste regenerert. + + + Skriv `{0}h Kommandonavn` å se hjelpen for den oppgitte kommandoen. f.eks `{0}h >8ball` + + + Jeg kan ikke finne den kommandoen. Kontroller at kommandoen finnes før du prøver igjen. + + + Beskrivelse + + + Du kan støtte NadekoBot prosjektet på +Patreon <{0}> eller +Paypal <{1}> +Ikke glem å skrive Discord navnet eller ID i meldingen. + +** Takk ** ♥ ️ + + + ** Liste over kommandoer **: <{0}> +** Hosting guider og dokumenter finner du her **: <{1}> + + + Liste av kommandoer + Fuzzy + + + Liste av moduler + Fuzzy + + + Skriv '{0}cmds ModulNavn' for og få en liste av kommandoer i den modulen. f.eks '{0}cmds spill' + + + Den modulen finnes ikke. + + + Krever {0} servertillatelse. + + + Innholdsfortegnelse + Fuzzy + + + Bruk + + + Autohentai startet. Poster hvert {0}s med følgende stikkord: {1} + + + Stikkord + + + Veddeløp med dyr + + + Kunne ikke starte siden det ikke var nok deltakere + + + Løpet er fullt. Starter nå. + + + {0} ble med som {1} + + + {0} ble med som {1} og veddet {2}! + + + Skriv {0}jr for og bli med i løpet. + + + Starter om 20 sekunder eller når rommet er fullt. + + + Starter med {0} deltakere. + + + {0} som {1} vant løpet! + + + {0} som {1} vant løpet og {2}! + + + Ugyldig nummer spesifisert. Du kan rulle {0}-{1} terninger på en gang. + + + rullet {0} + Someone rolled 35 + + + Terning rullet: {0} + Dice Rolled: 5 + + + Kunne ikke starte løpet. Et annet løp er sannsynligvis igang. + + + Ingen løp eksisterer på denne serveren + + + Det andre tallet må være større enn det første + + + Ombestemmelser + Fuzzy + + + Hevdet av + Fuzzy + + + Skilsmisser + + + Liker + + + Pris + + + Ingen waifus har blitt hevdet enda. + + + Topp Waifus + + + Din affinitet er allerede satt til den waifuen eller så prøver du å fjerne din egen affinitet uten å ha en. + + + byttet affinitet fra {0} til {1}. + +*Dette er moralsk tvilsomt.* + Make sure to get the formatting right, and leave the thinking emoji + + + Du må vente {0} timer og {1} minutt for å bytte affinitet igjen. + + + Affiniteten din er tilbakestillt. Du liker ingen. + + + ønsker å bli {0} sin waifu. Aww <3 + + + hevdet {0} som sin waifu for {1}! + + + Du har skillt deg fra en waifu som liker deg, ditt hjerteløse monster! +{0} fikk {1} som kompensation. + + + du kan ikke sette affiniteten din til deg selv, ditt egoistiske monster! + + + 🎉 Deres kjærlighet er oppfylt 🎉 +{0} sin nye verdi er {1}! + + + Ingen waifu er så billig. Du må betale minst {0} for å få en waifu, selv om deres verdi egentlig er lavere. + + + Du må betale {0} eller mer for å hevde den waifuen! + + + Den waifuen er ikke din. + + + Du kan ikke hevde deg selv. + + + Du er nylig skilt. Du må vente {0} timer og {1} minutter for å kunne skille deg igjen. + + + Ingen + + + Du har skilt deg fra en waifu som ikke liker deg. Du fikk {0} tilbake. + + + 8ball + + + Acrophobia + + + Spill avsluttet uten innleveringer. + + + Ingen stemmer telt. Spillet avsluttet med ingen vinnere. + + + Akronymet var {0}. + + + Acrophobia-spill er allerede i gang i denne kanalen. + + + Spill startet. Lag en setning med det følgende akronymet: {0}. + + + Du har {0} sekunder å levere inn på. + + + {0} leverte inn sin setning. ({1} total) + + + Stem ved å skrive nummer til innleveringen. + + + {0} avga sin stemme! + + + Vinneren er {0} med {1} poeng. + + + {0} er vinneren fordi han hadde den eneste innleveringen + + + Spørsmål + + + Det er uavgjort! Begge valgte {0} + + + {0} vant! {1} slår {2} + + + Innleveringer avluttet. + Fuzzy + + + Veddeløp med dyr er allerede igang. + + + Totalt: {0} Gjennomsnitt: {1} + + + Kategori + + + Deaktivert Cleverbot på denne serveren. + + + Aktivert Cleverbot på denne serveren. + + + Valuta generering har blitt deaktivert på denne kanalen. + + + Valuta generering har blitt aktivert på denne kanalen. + + + {0} tilfeldig {1} dukket opp! Plukk dem opp ved og skrive'{2}pick' + plural +Fuzzy + + + En tilfeldig {0} dukket opp! Plukk den opp ved og skrive '{1}pick' + Fuzzy + + + Kunne ikke laste inn spørsmål. + + + Spill startet + Fuzzy + + + Hangman spill startet + + + Hangman spill kjører allerede i denne kanalen. + + + Kunne ikke starte Hangman + + + Liste av "{0}hangman" begrepstyper: + + + Resultattavle + + + Du har ikke nok {0} + + + Ingen resultater + + + Plukket {0} + Kwoth picked 5* + + + {0} plantet {1} + Kwoth planted 5* + + + Trivia kjører allerede på denne serveren. + + + Trivia spill + + + {0} gjettet det! Svaret var: {1} + + + Ingen trivia-spill gående på serveren. + + + {0} har {1} poeng + + + Stopper etter dette spørsmålet + + + Tiden er ute! Det riktige svaret var {0} + + + {0} gjettet det og VANT spillet! Svaret var: {1} + + + Du kan ikke spille mot deg selv. + + + Bondesjakk kjører allerede i denne kanalen. + + + Uavgjort! + + + har startet et spill med bondesjakk + + + {0} har vunnet! + Fuzzy + + + Matchet tre + Fuzzy + + + Ingen bevegelser igjen! + + + Tiden er ute! + Fuzzy + + + {0} sin tur + + + {0} mot {1} + + + Forsøker å sette i kø {0} sanger... + + + Automatisk avspilling deaktivert + + + Automatisk avspilling aktivert. + + + Standard volum satt til {0}% + + + Mappelisting ferdig. + + + fairplay + + + Sang ferdig + Fuzzy + + + Rettferdig avspilling deaktivert + + + Rettferdig avspilling aktivert + + + Fra posisjon + + + Id + + + Ugyldig tilføring. + + + Max spilletid har ingen grenser nå. + + + Max spilletid satt til {0} sekund(er). + + + Max musikk-kø størrelse satt til uendelig. + + + Max musikk-kø størrelse satt til {0} sang(er). + + + Du må være i en talekanal på denne serveren. + + + Navn + + + Spiller + Fuzzy + + + Ingen aktive musikkspillere. + + + Ingen søkeresultater. + + + Musikkavspilling pauset + + + Spilleliste - Side {0}/{1} + Fuzzy + + + Spiller sang + Fuzzy + + + #{0}` - **{1}** av *{2}* ({3} sanger) + + + Side {0} av lagrede spillelister + Fuzzy + + + Spilleliste slettet. + + + Klarte ikke å slette spillelisten. Enten eksisterer den ikke, eller så var det ikke du som lagde den. + + + Spilleliste med den IDen eksisterer ikke. + + + Spilleliste-kø komplett. + + + Spilleliste lagret + Fuzzy + + + {0}s grense + + + + + + Sang i kø + Fuzzy + + + Musikk-kø tømt. + + + Køen er full {0}/{0}- + + + Fjernet sang + context: "removed song #5" + + + Repeterer nåværende sang + + + Repeterer spilleliste + + + Repeterer spor + + + Repetisjon av nåværende sang stoppet + + + Musikk-avspilling gjenopptatt. + + + Repetisjon av spilleliste stoppet. + + + Repetisjon av spilleliste startet. + + + Meldinger om sanger som spilles av, er ferdige, pauset og fjernet vil bli vist i denne kanalen. + + + Skippet til '{0}:{1}' + + + Sanger stokket + + + Sang flyttet + Fuzzy + + + {0}t {1}m {2}s + + + Til posisjon + + + Ubegrenset + + + Lyden må være mellom 0 og 100 + + + Volum satt til {0}% + + + Deaktivert bruk av ALLE MODULER i kanalen {0}. + Fuzzy + + + Aktivert bruk av ALLE MODULER i kanalen {0}. + Fuzzy + + + Tillatt + + + Deaktivert bruk av ALLE MODULER for {0} rollen. + + + Aktivert bruk av ALLE MODULER for {0} rollen. + + + Deaktivert bruk av ALLE MODULER på denne serveren. + + + Aktivert bruk av ALLE MODULER på denne serveren. + + + Deaktivert bruk av ALLE MODULER for bruker {0}. + + + Aktivert bruk av ALLE MODULER for bruker {0}. + + + Svartelistet {0} med ID {1} + + + Kommando {0} har nå en {1}s ventetid. + + + Kommando {0} har ingen ventetid og alle eksisterende ventetider har blitt fjernet. + + + Ingen kommando-ventetid satt. + + + Kommando kostnader + + + Deaktivert bruk av {0} {1} i kanal {2}. + + + Aktivert bruk av {0} {1} i kanal {2}. + + + Nektet + + + La til ordet {0} til listen av filtrerte ord. + + + Liste over filtrerte ord + + + Fjernet ord {0} fra listen over filtrerte ord. + + + Ugyldig andre parameter. (Må være et tall mellom {0} og {1}) + + + Invitasjons-filtrering deaktivert i denne kanalen. + + + Invitasjons-filtrering aktivert i denne kanalen. + + + Invitasjons-filtrering deaktivert på denne serveren. + + + Invitasjons-filtrering aktivert på denne serveren. + + + Flyttet tillatelse {0} fra #{1} til #{2} + + + Finner ikke tillatelse ved index #{0} + + + Ingen kostnader satt. + + + kommando + Gen (of command) + + + modul + Gen. (of module) + + + Tillatelser side {0} + + + Nåværende tillatelses-rolle er {0}. + + + Brukere må nå ha {0} rollen for å endre tillatelser. + + + Ingen tillatelse funnet på denne indeksen. + + + fjernet rettighet #{0} - {1} + + + Deaktivert bruk av {0} {1} for {2} rollen. + + + Aktivert bruk av {0} {1} for {2} rollen. + + + sek. + Short of seconds. + + + Deaktivert bruk av {0} {1} på denne serveren. + + + Aktivert bruk av {0} {1} på denne serveren. + + + Fjernet {0} med ID {1} fra svartelisten + + + uredigerbar + + + Deaktivert bruk av {0} {1} for {2} bruker. + + + Aktivert bruk av {0} {1} for {2} bruker. + + + Jeg vil ikke lenger vise tillatelses-advarsler. + + + Jeg vil nå vise tillatelses-advarsler. + + + Ord filtrering er deaktivert i denne kanalen. + + + Ord filtrering aktivert på denne kanalen. + + + Ord filtrering deaktivert på denne serveren. + + + Ord filtrering aktivert på denne serveren. + + + Ferdigheter + + + Ingen favoritt anime + + + Startet automatisk oversettelse av meldinger i denne kanalen. Bruker-meldinger vil bli slettet automatisk. + + + Ditt automatisk oversatte språk er fjernet + + + Ditt automatisk oversatte språk er satt til {0}>{1} + + + Startet automatisk oversettelse av meldinger i denne kanalen. + + + Stoppet automatisk oversettelse av meldinger i denne kanalen. + + + Feil tilførings format, eller noe gikk galt + + + Kunne ikke finne det kortet. + + + fakta + + + Kapittel + + + Tegneserie # + + + Konkurerende tap + + + Konkurranser spillt + + + Konkurrerende rangering + + + Konkurerende vinn + + + Fullført + + + Betingelse + + + Kostnader + + + Dato + + + Definer: + + + Droppet + + + Episoder + + + Feil oppsto. + + + Eksempel + + + Kunne ikke finne anime. + + + Kunne ikke finne manga + + + Sjangre + + + Fant ingen definisjon for det ordet + + + Høyde/vekt + + + {0}m/{1}kg + + + Luftfuktighet + + + Bildesøk for: + + + Kunne ikke finne den filmen. + + + Ugyldig kilde- eller målspråk. + + + Kunne ikke laste vitser. + + + Bred./Lengd. + + + Nivå + + + Liste over {0}place stikkord + Don't translate {0}place + + + Plassering + + + Magiske ting ble ikke lastet + + + {0} sin MAL profil + + + Bot eieren har ikke spesifiser MashapeApiKey. Du kan ikke bruke denne funksjonen. + + + Min/Max + + + Ingen kanal funnet. + + + Ingen resultater funnet. + + + På vent + + + Original url + + + En 'osu!' API-nøkkel er nødvendig. + + + Kunne ikke hente 'osu!' signatur. + + + Fant mer enn {0} bilder. Viser tilfeldig {0}. + + + Bruker ikke funnet! Vennligst sjekk regionen og BattleTag før du prøver igjen. + + + Planlegger å se + + + Plattform + + + Ingen evne funnet. + + + Ingen pokemon funnet. + + + Profil link: + + + Kvalitet: + + + Rask spilletid + + + Rask vinner + + + Vurdering + + + Resultat: + + + Søk etter: + + + Kunne forkorte den URLen. + + + Kort url + + + Noe gikk galt. + + + Vennligst oppgi søkeparametere. + + + Status + + + Butikk url + + + Streamer {0} er frakoblet. + + + Streamer {0} er online med {1} seere. + + + Du følger {0} strømmer på denne serveren. + + + Du følger ikke noen strømmer på denne serveren. + + + Ingen slik strøm. + + + Strømmen eksisterer sannsynligvis ikke. + + + Fjernet {0} sin strøm ({1}) fra varslinger. + + + Jeg vil varsle denne kanalen når statusen endres. + + + Soloppgang + + + Solnedgang + + + Temperatur + + + Tittel: + + + Topp 3 favoritt animer: + + + Oversettelse: + + + Typer + + + Kunne ikke finne definisjonen for dette ordet. + + + URL + + + Seere + + + Ser på + + + Kunne ikke finne det ordet på den angitte Wikia. + + + Vennligst skriv inn et mål-wikia, etterfulgt av søket. + + + Side ikke funnet. + + + Vindfart + + + De {0} mest forbydde 'champions' + + + Kunne ikke 'yodify' setningen din + + + Ble med + + + `{0}.` {1} [{2:F2}/s] - {3} totalt + /s and total need to be localized to fit the context - +`1.` + + + Aktivitet side #{0} + + + {0} brukere totalt. + + + Forfatter + + + BOT ID + + + Liste over funksjoner i {0}calc kommandoen + + + denne kanalens {0} er {1} + + + Kanal emne + + + Kommandoer kjørt + + + {0} {1} er lik {2} {3} + + + Enheter som kan brukes av omformeren + + + Kan ikke konvertere {0} til {1}: enheter ikke funnet + + + Kan ikke konvertere {0} til {1}: typer enheter er ikke lik + + + Laget på + + + Ble med i kanalen for snakk på tvers av servere + + + Forlot kanalen for snakk på tvers av servere + + + Dette er din CSC token + + + Spesiallagde emojier + + + Feil + + + Egenskaper + + + ID + + + Indeks utenfor rekkevidde. + + + Her er en liste over brukere i disse rollene: + Fuzzy + + + Du har ikke lov til å bruke denne kommandoen på roller med mange brukere i dem for å hindre misbruk. + + + Ugyldig {0} verdi. + Invalid months value/ Invalid hours value + + + Ble med Discord + + + Ble med serveren + + + ID: {0} +Medlemmer: {1} +Eier ID: {2} + + + Ingen servere funnet på denne siden. + + + Liste over gjentagende meldinger + + + Medlemmer + + + Minne + + + Meldinger + + + Meldingsgjentager + + + Navn + + + Kallenavn + + + Det er ingen som spiller det spillet. + + + Det er ingen aktive gjentagere. + + + Det er ingen roller på denne siden. + + + Det er ingen shards på denne siden. + + + Ingen emne er satt. + + + Eier + + + Eier IDer + + + Tilstedeværelse + + + {0} Servere +{1} Tekst kanaler +{2} Talekanaler + + + Slettet alle sitater med nøkkelordet `{0}`. + + + Side {0} med sitater + + + Det er ingen sitater på denne siden. + + + Ingen sitater funnet som du kan fjerne. + + + Sitat lagt til + + + Sitat #{0} slettet. + Fuzzy + + + Region + + + Registrert den + + + Jeg vil minne {0} på å {1} i {2} `({3:. d.M.yyyy} om {4:HH:mm})` + + + Ikke et gyldig format. Sjekk kommandolisten. + + + Ny påminnelses-mal satt + + + Gjentar {0} hver {1} dag(er), {2} time(r) og {3} minutt(er). + + + Liste over gjentagere + + + Ingen gjentagere kjører på denne serveren + + + #{0} stoppet. + + + Ingen gjentagende meldinger funnet på denne serveren. + + + Resultat + + + Roller + + + Side #{0} av alle roller på denne serveren: + + + Side #{0} av roller for {1} + + + Ingen farger er i riktig format. Bruk for eksempel `#00ff00`. + + + Startet rotering av {0} rollens farge. + + + Stoppet rotering av farger for {0} rollen + + + {0} av denne serveren er {1} + + + Server info + + + Shard + + + Shard status + + + Shard **#{0}** sin status: {1} med {2} servere + + + **Navn:** {0} **Link:** {1} + + + Ingen spesielle emojier funnet. + + + Spiller {0} sanger, {1} i kø. + + + Tekst kanaler + + + Her er linken til rommet ditt: + + + Oppetid + + + {0} til brukeren {1} er {2} + Id of the user kwoth#1234 is 123123123123 + + + Brukere + + + Tale kanaler + + + Du har allerede sluttet deg til dette løpet! + + + Foreløpige stemmeresultater + + + Ingen stemmer samlet + + + Det kjøres allerede en avstemming på serveren. + + + 📃 {0} har startet en avstemming som krever din oppmerksomhet: + + + `{0}.` {1} med {2} stemmer. + + + {0} stemte. + Kwoth voted. + + + Send meg en privat melding med korresponderende antall svar. + + + Send en melding her med tilsvarende nummer til ditt svar. + + + Takk for at du stemte, {0} + + + {0} totalt stemmer avgitt. + + + Plukk dem opp ved å skrive `{0}pick` + + + Plukk den opp ved å skrive `{0}pick` + + + Ingen bruker funnet + + + side {0} + + + Du må være i en talekanal på denne serveren + + + Det finnes ingen stemmekanal-roller + + + {0} har blitt **dempet** fra tekst og tale i {1} minutt(er) + + + Brukere som blir med i talekanalen {0} får rollen {1}. + + + Brukere som blir med i talekanalen {0} får ikke lenger noen rolle. + + + Stemmekanal-roller + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.nl-NL.resx b/src/NadekoBot/Resources/ResponseStrings.nl-NL.resx new file mode 100644 index 00000000..15bc2419 --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.nl-NL.resx @@ -0,0 +1,2330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Die basis is al veroverd of vernietigd. + + + Die basis is al vernietigd. + + + Die basis is nog niet veroverd. + + + **VERNIETIGD** basis #{0} in een oorlog tegen {1} + + + {0} heeft **ONOVERWONNEN** basis #{1} in een oorlog tegen {2} + + + {0} heeft basis #{1} overwonnen in een oorlog tegen {2} + + + @{0} Je hebt al basis #{1} overwonnen. Je kunt er niet nog een nemen. + + + De aanvraag van @{0} voor een oorlog tegen {1} is niet meer geldig. + Fuzzy + + + Vijand + + + Informatie over de oorlog tegen {0} + + + Ongeldige basis nummer + + + Ongeldig oorlogs +formaat. + Fuzzy + + + Lijst van voorlopende oorlogen. + Fuzzy + + + Niet veroverd. + + + Jij doet niet mee aan die oorlog. + + + @{0} Je doet niet mee aan die oorlog, of die basis is al vernietigd. + + + Geen voorlopende oorlogen. + Fuzzy + + + Grootte. + + + Oorlog tegen {0} is al begonnen. + + + Oorlog tegen {0} gecreëerd + + + De oorlog tegen {0} is beëindigd. + + + Die oorlog bestaat niet. + + + De oorlog tegen {0} is begonnen! + + + Alle speciale reactie statistieken zijn verwijderd. + + + Speciale Reactie verwijderdt. + + + Onvoldoende rechten. Bot Eigendom is nodig voor globale speciale reacties, en Administrator voor speciale server-reacties. + + + Lijst van alle zelf gemaakte reacties + + + Speciale Reacties + + + Nieuwe Speciale Reacties + + + Geen speciale reacties gevonden. + Fuzzy + + + Geen speciale reacties gevonden met die ID. + + + Antwoord + + + Speciale Reactie Statistieken + + + Statistieke verwijderd voor {0} speciale reactie. + + + Geen statistieken voor die trekker gevonden, geen actie genomen. + + + Trekker + + + Autohentai gestopt. + + + Geen resultaten gevonden + + + {0} is al flauw gevallen. + + + {0} heeft al vol HP. + + + Jouw element is al {0} + + + heeft {0}{1} op {2}{3} gebruikt voor {4} schade. + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + + + Jij zal niet winnen zonder tegenstand! + + + Je kunt je zelf niet aanvallen + + + {0} is verslagen! + + + heeft {0} genezen met een {1} + + + {0} heeft nog {1} HP over + + + Je kan {0} niet gebruiken. Typ `{1}ml` om een lijst te bekijken van de aanvallen die jij kunt gebruiken + + + Aanvallijst voor {0} element + + + Het heeft weinig effect. + + + Je hebt niet genoeg {0} + + + heeft {0} herstelt met een {1} + + + Je kunt jezelf herstellen met een {0} + + + Je element is veranderd van {0} naar {1} + + + Het is een beetje effectief. + + + Het is super effectief! + + + Je hebt te veel aanvallen achter elkaar gemaakt, je kan dus niet bewegen! + + + Element van {0} is {1} + + + Gebruiker niet gevonden. + + + Je bent flauw gevallen, dus je kunt niet bewegen! + + + **Auto aanwijzing van rollen** op gebruiker is nu **uitgeschakeld**. + + + **Auto aanwijzing van rollen** op gebruiker is nu **ingeschakeld**. + + + Bestanden + + + Avatar veranderd + + + Je bent verbannen van {0} server. Reden: {1} + + + Verbannen + PLURAL + + + Gebruiker verbannen + + + Bot naam is veranderd naar {0} + + + Bot status is veranderd naar {0} + + + Automatische verwijdering van de bye berichten is uitgeschakeld. + + + Bye berichten zullen worden verwijderd na {0} seconden. + + + Momenteel is de bye message: {0} + + + Schakel de bye berichten in door {0} te typen. + + + Nieuw bye bericht is geplaatst. + + + Dag aankondigingen uitgeschakeld. + + + Dag aankondigingen ingeschakeld op dit kanaal. + + + Kanaal naam is veranderd. + + + Oude naam + + + Kanaal onderwerp is veranderd + + + Opgeruimd + + + Inhoud + + + Met success een nieuwe rol gecreëerd. + + + Tekst kanaal {0} gecreëerd. + + + Stem kanaal {0} gecreëerd. + + + Dempen succesvol. + + + Server verwijderd {0} + + + Stopt van automatische verwijdering van succesvolle reacties aanroepingen commando. + + + Verwijdert nu automatisch succesvolle commando aanroepingen + + + Tekst kanaal {0} verwijdert. + + + Stem kanaal {0} verwijdert. + + + Privé bericht van + + + Met succes een nieuwe donateur toegevoegt. Totaal gedoneerde bedrag van deze gebruiker {0} + + + Dank aan de mensen hieronder vernoemt voor het waarmaken van dit project! + + + Ik zal alle eigenaren een privé bericht sturen. + + + Ik zal een privé bericht sturen naar de eerste eigenaar + + + Ik zal privé berichten sturen vanaf nu. + + + Ik stop vanaf nu met het sturen van privé berichten. + + + Automatisch verwijderen van groet berichten is uitgeschakeld. + + + Groet berichten zullen worden verwijderd na {0} seconden. + + + Momenteen is het privé groet bericht: {0} + + + Schakel DM begroetings bericht in door {0} in te typen + + + Nieuwe DM begroetings bericht vastgesteld. + + + DM begroetings aankondiging uitgeschakeld. + + + DM begroetingen aankondiging ingeschakeld. + + + Momentele begroetings bericht: {0} + + + Schakel begroetings bericht in door {0} in te typen + + + Nieuwe begroetings message vastgesteld. + + + Begroetings aankondiging uitgeschakeld. + + + Begroetings aankondiging uitschakeld op dit kanaal. + + + Jij kunt geen commando gebruiken op gebruikers met hogere of dezelfde rol als die van jouw in de rollen hiërarchie. + + + Afbeeldingen geplaatst na {0} seconden! + + + Ongelde invoer formaat. + + + Ongeldige parameters. + + + {0} heeft {1} toegetreden + + + Je bent weggeschopt van de {0} server. +Reden: {1} + + + Gebruiker weggeschopt + Fuzzy + + + Lijst van talen +{0} + Fuzzy + + + Jouw server's locale is nu {0} - {1} + + + Bot's standaard locale is nu {0} - {1} + + + Taal van de bot is gezet naar {0} - {1} + + + Instellen van locale mislukt. Ga naar de hulp voor dit commando. + + + De taal van de server is gezet naar {0} - {1} + + + {0} heeft {1} verlaten + + + Server {0} verlaten + + + Gebeurtenis {0} wordt bijgehouden in dit kanaal. + + + Alle gebeurtenissen worden bijgehouden in dit kanaal. + + + Logging uitgeschakeld. + + + Log gebeurtenissen waar je op kan abonneren: + + + Logging zal {0} negeren + + + Logging zal {0} niet negeren + + + Gestopt met het loggen van {0}. + + + {0} heeft een melding geplaatst op de volgende rollen + + + Bericht van {0} `[Bot Eigenaar]`: + + + Bericht verstuurd. + + + {0} verplaats van {1} naar {2} + + + Bericht in #{0} verwijdert + Fuzzy + + + Bericht in #{0} bijgewerkt + Fuzzy + + + Gebruikers zijn gedempt + PLURAL (users have been muted) + + + gemute + singular "User muted." + + + Ik heb de benodigde rechten daar voor waarschijnlijk niet. + + + Nieuwe demp rol geplaatst. + + + Ik heb **administrator** rechten daar voor nodig. + + + nieuw bericht + Fuzzy + + + nieuwe bijnaam + Fuzzy + + + Nieuw onderwerp + Fuzzy + + + Bijnaam veranderd + Fuzzy + + + Kan de server niet vinden + + + Geen shard gevonden met dat ID. + + + Oud bericht + Fuzzy + + + Oude bijnaam + Fuzzy + + + Oude onderwerp + Fuzzy + + + Fout. Hoogst waarschijnlijk heb ik geen voldoende rechten. + + + De rechten op deze server zijn gereset. + + + Actieve Beschermingen. + Fuzzy + + + {0} is nu ** uitgeschakeld** op deze server. + + + {0} Ingeschakeld + + + Fout. ik heb Beheer Rollen rechten nodig + + + Geen bescherming aangezet. + Fuzzy + + + Gebruiker's drempel moet tussen {0} en {1} zijn. + + + Als {0} of meerdere gebruikers binnen {1} seconden, zal ik hun {2}. + + + Aangegeven tijd hoort binnen {0} en {1} seconden te vallen. + + + Met succes alle roles van de gebruiker {0} verwijderd + + + Het verwijderen van de rollen is mislukt. Ik heb onvoldoende rechten. + + + De kleur van de rol {0} is veranderd + + + Die rol bestaat niet. + + + De aangegeven parameters zijn ongeldig. + + + Error opgekomen vanwege ongeldige kleur, of onvoldoende rechten. + + + Met sucess rol {0} verwijderd van gebruiker {1}. + + + Mislukt om rol te verwijderen. Ik heb onvoldoende rechten. + + + Rol naam veranderd. + + + Rol naam veranderen mislukt. Ik heb onvoldoende rechten. + + + je kan geen rollen bijwerken die hoger zijn dan je eigen rol. + + + Speel bericht verwijderd: {0} + + + Rol {0} is toegevoegd aan de lijst. + + + {0} niet gevonden. Klaar met opruimen. + + + Rol {0} staat al in de lijst. + + + Toegevoegd. + + + Routerende speelstatus uitgeschakeld. + + + Routerende speelstatus ingeschakeld. + + + Hier is een lijst met routerende statussen: +{0} + + + Nog geen routerende speelstatussen ingesteld. + + + Je hebt al {0} rol. + + + Je hebt {0} exclusieve zelf toegewezen rol al. + + + Zelf toegewezen rollen zijn nu exclusief! + + + Er zijn {0} zelf toewijsbare rollen + + + Deze rol is niet zelf toewijsbaar. + + + Je hebt niet {0} rol. + + + Zelf toegewezen rollen zijn nu niet exclusief! + + + Ik kan deze rol niet aan je toevoegen. `Ik kan niet rollen toevoegen aan eigenaren of andere rollen die boven mij staan in de rol hiërarchie.` + + + {0} is verwijderd van de lijst met zelf toewijsbare rollen. + + + Je hebt {0} rol niet meer. + + + je hebt nu {0} rol. + + + Succesvol de rol {0} toegevoegd aan gebruiker {1} + + + Fout bij het toevoegen van de rol. Ik heb onvoldoende rechten. + + + Nieuwe avatar ingesteld! + + + Nieuwe kanaal naam ingesteld. + + + Nieuwe game ingesteld! + + + Nieuwe stream ingesteld! + + + Nieuwe kanaal onderwerp ingesteld. + + + Shard {0} opnieuw verbonden. + + + Shard {0} is opnieuw aan het verbinden. + + + Afsluiten + + + Gebruikers kunnen niet meer dan {0} berichten sturen per {1} seconden. + + + langzame mode uitgezet + + + langzame mode gestart + + + zacht-verbannen (kicked) + PLURAL + + + {0} zal dit kanaal negeren. + + + {0} zal dit kanaal niet meer negeren. + + + Als een gebruiker {0} de zelfde berichten plaatst, zal ik ze {1}. +__IgnoredChannels__: {2} + + + Tekst kanaal aangemaakt. + + + Tekst kanaal verwijderd. + + + Ontdempen succesvol + + + Ongedempt + singular + + + Gebruikersnaam + + + Gebruikersnaam veranderd + Fuzzy + + + Gebruikers + + + Gebruiker verbannen + Fuzzy + + + {0} is **gedempt** van chatten. + Fuzzy + + + {0} is **ongedempt** van chatten. + Fuzzy + + + Gebruiker toegetreden + Fuzzy + + + Gebruiker verlaten + Fuzzy + + + {0} is **gedempt** van het tekst en stem kanaal. + + + Rol van gebruiker toegevoegd + Fuzzy + + + Rol van gebruiker verwijderd + Fuzzy + + + {0} is nu {1} + + + {0} is **ongedempt** van het tekst en stem kanaal. + + + {0} is {1} spraakkanaal toegetreden. + + + {0} heeft {1} spraakkanaal verlaten. + + + {0} heeft {1} naar {2} spraakkanaal verplaatst. + + + {0} is **spraak gedempt** + + + {0} is **spraak ongedempt** + + + Spraakkanaal gemaakt + Fuzzy + + + Spraakkanaal vernietigd + Fuzzy + + + Spraak + tekst mogelijkheid uitgezet. + + + Spraak + tekst mogelijkheid aangezet. + + + Ik heb geen **Rol Beheering** en/of **Kanaal Beheering** toestemmingen, dus ik kan geen `stem+text` gebruiken op de {0} server. + + + Deze eigenschap wordt door jou ingeschakelt/uitgeschakelt maar **Ik heb geen ADMINISTRATIEVE toestemmingen**. Hierdoor kunnen er mogelijk problemen ontstaan, en je zal daarna de tekst kanalen zelf moeten opruimen. + + + Ik heb tenminste **Rol Beheering** en **Kanaal Beheering** toestemmingen nodig om deze eigenschap in te schakelen. (Geliefe adminstratieve rechten) + + + Gebruiker {0} van tekstkanaal + + + Gebruiker {0} van tekst- en spraakkanaal + + + Gebruiker {0} van spraakkanaal + + + Je bent zacht-verbannen van {0} server. +Reden: {1} + + + Gebruiker niet meer verbannen + + + Migratie gelukt! + + + Fout tijdens het migreren, kijk in de bot's console voor meer informatie. + + + Aanwezigheid Updates + Fuzzy + + + Gebruiker zacht-verbannen + Fuzzy + + + heeft {0} aan {1} gegeven + + + Volgende keer beter ^_^ + + + Gefeliciteerd! Je hebt {0} gewonnen voor het rollen boven de {1} + + + Dek geschud. + + + heeft de munt op {0} gegooid + User flipped tails. + + + Je hebt het goed gegokt! Je hebt {0} gewonnen + + + Ongeldig nummer opgegeven. Je kan 1 tot {0} munten opgooien + + + Voeg een {0} reactie toe aan dit bericht om {0} te krijgen + + + Dit evenement blijft actief voor {0} uur. + + + Bloemen reactie evenement gestart! + + + heeft {0} aan {1} cadeau gegeven + X has gifted 15 flowers to Y + + + {0} heeft {1} + X has Y flowers + + + Kop + + + Scoreboard + + + {0} heeft {1} gebruikers beloont met {2} rol. + + + Je kan niet meer dan {0} gokken + + + Je kan niet minder dan {0} gokken + + + Je hebt niet genoeg {0} + + + Geen kaarten meer in het dek + + + Verloten gebruiker + + + Je hebt {0} gerold + + + Inzet + + + WOAAHHHHHH!!! Gefeliciteerd!!! x{0} + + + Een enkele {0}, x{1} + + + Wow! Gelukkig! Drie van dezelfde! x{0} + + + Goed gedaan! Twee {0} - wed x{1} + + + Gewonnen + + + Gebruikers moeten een geheime code in typen om {0} te krijgen. +Duurt {1} seconden. Vertel het aan niemand. Shhh. + + + SneakyGame evenement geeindigt. {0} gebruikers hebben een beloning ontvangen. + + + SneakyGameStatus evenement gestart. + + + Munt + + + succesvol {0} van {1} genomen + + + kon niet {0} van {1} nemen omdat de gebruiker niet zoveel {2} heeft! + + + Terug naar de inhoudsopgave + + + Alleen Voor Bot Eigenaren + Fuzzy + + + Heeft {0} kanaal rechten nodig. + + + Je kan het project steunen op patreon: <{0}> of paypal: <{1}> + + + Command en aliassen. + Fuzzy + + + Commandolijst Geregenereerd. + Fuzzy + + + Typ `{0}h CommandoNaam` om de hulp te zien voor die specifieke commando. b.v `{0}h >8bal` + + + Ik kan die commando niet vinden. Verifiëren of die commando echt bestaat voor dat je het opnieuw probeert. + + + Beschrijving + + + Je kan het NadekoBot project steunen op +Patreon <{0}> of +Paypal <{1}> +Vergeet niet je discord naam en id in het bericht te zetten. + +**Hartelijk bedankt** ♥️ + + + **Lijst met commando's**: <{0}> +**Hosting gidsen en documenten kunnen hier gevonden worden**: <{1}> + Fuzzy + + + Lijst Met Commando's + Fuzzy + + + Lijst Met Modules + Fuzzy + + + Typ `{0}cmds ModuleNaam` om een lijst van commando's te krijgen voor die module. bv `{0}cmds games` + + + Deze module bestaat niet + + + Heeft {0} server rechten nodig. + + + Inhoudsopgave + Fuzzy + + + Gebruik + + + Autohentai gestart. Elke {0}s word een foto geplaatst met de volgende labels: +{1} + Fuzzy + + + Label + + + Dieren race + + + Gefaalt om te starten omdat er niet genoeg deelnemers zijn. + + + De race is vol! De race wordt onmiddelijk gestart. + + + {0} doet mee als een {1} + + + {0} doet mee als een {1} en wed {2}! + + + Typ {0}jr om mee te doen met de race. + + + De race zal beginnen in 20 seconden of wanneer de kamer is vol. + + + De race zal beginnen met {0} deelnemers. + + + {0} heeft de race gewonnen als {1}! + + + {0} heeft de race gewonnen als {1} en {2}! + + + Ongeldig nummer ingevoerd. Je kan de dobbelsteen van {0}-{1} rollen. + + + {0} gerold. + Someone rolled 35 + + + Dobbelsteen gerold: {0} + Dice Rolled: 5 + + + Gefaalt om de race te starten. Een andere race is waarschijnlijk bezig. + + + Geen enkele race bestaat op deze server. + + + Het tweede nummer moet groter zijn dan het eerste nummer. + + + Verandering van het hart + + + Opgeëist door + + + Scheidingen + + + Leuk + + + Prijs + + + Nog geen waifus zijn overwonnen. + + + Top Waifus + + + Jouw affiniteit is al ingesteld op een waifu, of je probeert om je affiniteit weg te halen terwijl je geen hebt. + + + Affiniteit verandert van {0} naar {1} + +Dit is moreel twijfelachtig🤔 + Make sure to get the formatting right, and leave the thinking emoji + + + Je moet {0} uren en {1} minuten wachten om je affiniteit weer te veranderen. + + + Jouw affiniteit is gereset. Je hebt geen persoon meer die je leuk vindt. + + + wil {0}'s waifu zijn. Aww <3 + + + heeft {0} genomen als hun waifu voor {1}! + + + Je bent gescheiden met een waifu die jou leuk vindt. Jij harteloze monster. +{0} ontvangen {1} als compensatie. + + + Je kunt geen affiniteit zelf opzetten, jij opgeblazen egoist. + + + 🎉Hun liefde overvloeit! 🎉 +{0} nieuwe waarde is {1}! + + + Geen enkele waifu is zo goedkoop. Je moet tenminste {0} betalen om een waifu te krijgen, ook al is hun echte waarde lager. + + + Je moet tenminste {0} betalen om die waifu te nemen! + + + Die waifu is niet van jouw. + + + Je kunt jezelf niet als waifu nemen. + + + Je bent kort geleden gescheiden. Je moet {0} uren en {1} minuten wachten om weer te scheiden. + + + Niemand + + + Je bent gescheiden met een waifu die jou niet leuk vindt. Je krijgt {0} terug. + + + 8bal + + + Acrophobie + + + Spel afgelopen zonder inzendingen. + + + Geen stemmen ingestuurdt. Spel geëindigd zonder winnaar. + + + Afkorting was {0} + + + Acrophobie spel is al bezig in dit kanaal. + + + Game is gestart: maak een zin met de volgende afkorting: {0}. + + + Je hebt {0} seconden om een inzending te maken. + + + {0} heeft een zin ingezonden. ({1} in totaal) + + + Stem door het nummer van een inzending te typen + + + {0} heeft gestemd! + + + De winnaar is {0} met {1} punten. + + + {0} is de winnaar doordat deze als enige een inzending heeft gemaakt! + + + Vraag + + + Het is gelijkspel! Beiden hebben {0} gekozen + + + {0} heeft gewonnen! {1} verslaat {2} + + + Inzendingen gesloten. + + + Dieren Race is al bezig. + + + Totaal: {0} Gemiddelde: {1} + + + Categorie + + + Cleverbot is uitgeschakeld op deze server. + + + Cleverbot is ingeschakeld op deze server. + + + Valuta generatie is uitgeschakeld op dit kanaal. + + + Valuta generatie is ingeschakeld op dit kanaal. + + + {0} willekeurige {1} zijn verschenen! Pak ze op door `{2}pick` in te typen. + plural +Fuzzy + + + Een willekeurige {0} is verschenen! Pak ze op door `{1}pick` in te typen. + Fuzzy + + + Het laden van de vraag is gefaalt. + + + Spel gestart. + + + Hangman + + + Er is al een spel galgje aan de gang in dit kanaal. + + + Galgje kon niet opstarten vanwege een fout. + + + lijst van {0}Galgje term types: + + + Scoreboard + + + Je hebt niet genoeg {0} + + + Geen resultaten + + + {0} geplukt + Kwoth picked 5* + + + {0} heeft {1} geplant + Kwoth planted 5* + + + Trivia spel is al bezig in deze server. + + + Trivia spel + + + {0} heeft 'm geraden! Het antwoord was: {1} + + + Trivia is niet bezig in deze server. + + + {0} heeft {1} punten + + + Stopt na deze vraag. + + + Tijd is op! Het goede antwoord was {0} + + + {0} heeft het antwoord geraden en wint het spel! Het antwoord was: {1} + + + Je kan niet tegen jezelf spelen. + + + BoterKaasenEieren spel is al bezig in dit kannal. + + + Gelijkspel! + + + heeft een Boter, Kaas en eieren sessie aangemaakt. + + + {0} heeft gewonnen! + + + Drie op een rij + + + Geen zetten over! + + + Tijd voorbij! + + + {0}'s beurt + + + {0} tegen {1} + + + Aan het proberen om {0} liedjes in de wachtrij te zetten... + + + Autoplay uitgezet. + + + Autoplay aangezet. + + + Standaard volume op {0}% gezet + + + Map afspeellijst geladen/compleet. + + + Eerlijk spel. + + + Liedje afgelopen + + + Eerlijk spel uitgeschakeld. + + + Eerlijk spel ingeschakeld. + + + van positie + + + ID + + + ongeldige invoer. + + + Maximale speeltijd heeft geen limiet meer. + + + Maximale speeltijd op {0} seconden gezet. + + + Maximale muziek wachtrij heeft geen limiet meer. + + + Maximale muziek wachtrij is nu {0} liedjes. + + + Je moet in het spraakkanaal van de server zijn. + + + Naam + + + Nu aan het spelen + Fuzzy + + + Geen actieve muziek speler. + + + Geen zoekresultaten. + + + Muziek gepauzeerd. + + + Speler afspeellijst - Pagina {0}/{1} + + + Liedje aan het spelen + + + `#{0}` - **{1}** van *{2}* ({3} liedjes) + + + Pagina {0} van opgeslagen afspeellijsten + + + + Afspeellijst verwijderd + + + Fout bij het verwijderen van de afspeellijst. Of het bestaat niet of U bent niet de auteur. + + + Afspeellijst met dat ID bestaat niet. + + + Speler afspeellijst afgerond. + + + Afspeellijst opgeslagen + + + {0}s limiet + + + Wachtrij + + + Gekozen nummer + + + + Muziek wachtrij leeggemaakt. + + + Wachtrij is vol op {0}/{0}. + + + Liedje verwijderd + context: "removed song #5" + + + Huidig liedje word herhaald + + + Huidige afspeellijst word herhaald + + + Herhaal nummer + + + Huidig nummer herhaling gestopt. + + + Nummer word hervat. + + + Herhaal afspeellijst uitgeschakeld. + + + Herhaal afspeellijst ingeschakeld. + + + Muziek dat wordt gespeeld, afloopt, gepauzeerd en wordt verwijder laat ik in dit kanaal zien. + + + Overslaan naar `{0}:{1}` + + + Liedjes geschud + + + Liedje verzet + + + {0}u {1}m {2}s + + + Naar positie + + + ongelimiteerd + + + Volume moet tussen 0 en 100 zijn + + + Volume op {0}% gezet + + + Uitgeschakelde gebruik op alle moddelen in dit kanaal {0}. + + + Ingeschakelde gebruik op alle moddelen in dit kanaal {0}. + + + Toegestaan + + + Uitgeschakelde gebruik op alle moddelen voor deze rol {0}. + + + Ingeschakelde gebruik op alle moddelen voor deze rol{0}. + + + Uitgeschakelde gebruik op alle moddelen in deze server. + + + ingeschakelde gebruik op alle moddelen in deze server. + + + Uitgeschakelde gebruik op alle moddelen voor deze gebruiker{0}. + + + Ingeschakelde gebruik op alle moddelen voor deze gebruiker{0}. + + + Blacklisted {0} met ID {1} + + + Commando {0} heeft nu een {1}s afkoel tijd. + + + Commando {0} heeft geen afkoel tijd meer, en alle bestaande afkoeltijden zijn weggehaald. + + + Geen commando afkoeltijden ingesteld. + + + Command kosten + + + Uitgeschakelde gebruik van {0} {1} in kanaal {2}. + + + Ingeschakelde gebruik van {0} {1} in kanaal {2}. + + + Geweigerd + + + Woord {0} tegevoegd aan de lijst met foute woorden. + + + Lijst van gefilterde worden + + + Woord {0} verwijderd van de lijst met foute woorden. + + + Ongeldige tweede parameter.(Moet een number zijn tussen {0} en {1}) + + + Uitnodiging filter uitgeschakeld in dit kanaal. + + + Uitnodiging filter ingeschakeld in dit kanaal. + + + Uitnodiging filter uitgeschakeld in deze server. + + + Uitnodiging filter ingeschakeld in deze server. + + + Verplaat toestemming {0} voor #{1} naar #{2} + + + Kan geen toestemming vinden in inhoudsopgave #{0} + + + Geen kosten ingesteld. + + + Commando + Gen (of command) + + + Module + Gen. (of module) + + + Rechten pagina {0} + + + Actueel toestemming rol is {0}. + + + Gebruiker heeft nu {0} rol om toestemmingen te veranderen. + + + Geen toestemming gevonden in de inhoudsopgave. + + + Verwijderd toestemming #{0} - {1} + + + Uitgeschakelde gebruik van {0} {1} voor rol {2}. + + + Ingeschakelde gebruik van {0} {1} voor rol {2}. + + + Seconden + Short of seconds. + + + Uitgeschakelde gebruik van {0} {1} op deze server. + + + Ingeschakelde gebruik van {0} {1} op deze server. + + + Unblacklisted {0} met ID {1} + + + Niet veranderbaar + + + Uitgeschakelde gebruik van {0} {1} voor gebruiker {2}. + + + Ingeschakelde gebruik van {0} {1} voor gebruiker {2}. + + + Ik zal geen permissie waarschuwingen meer weergeven. + + + Ik zal permissie waarschuwingen weergeven. + + + Woord filter gedeactiveerd in dit kanaal. + + + Woord filter geactiveerd in dit kanaal. + + + Woord filter gedeactiveerd in deze server. + + + Woord filter geactiveerd in deze server. + + + Talenten + + + Nog geen favoriete anime + + + Gestart met het automatisch vertalen van berichten op dit kanaal. Gebruiker berichten worden automatisch verwijderd. + + + Jouw automatisch translatie taal is verwijderd. + + + Jouw automatisch translatie taal is aangepast naar {0}>{1} + + + Gestart met het automatisch vertalen van berichten op dit kanaal. + + + Gestopt met het automatisch vertalen van berichten op dit kanaal. + + + Verkeerde invoer formaat, of ging er iets mis. + + + Gekozen kaart is niet gevonden. + + + feit + + + hoofdstukken + + + Stripboek # + + + Competitief verloren + + + Competitief gespeeld + + + Competitief rang + + + Competitief Gewonnen + + + Voltooid + + + Conditie + + + Kost + + + Datum + + + Definiëren: + + + Laten vallen + + + Afleveringen + + + Fout opgedaagd. + + + Voorbeeld + + + Mislukt in het vinden van die chinese tekenfilm + Fuzzy + + + Mislukt in het vinden van die + Fuzzy + + + Genres + + + Definitie vinden voor de label is mislukt. + + + Lengte/Gewicht + + + {0}m/{1}kg + + + Vochtigheid + + + Afbeelding zoekopdracht voor: + + + Mislukt in het vinden van die film. + + + Invalide taal -bron of -doel. + + + Grapjes niet geladen. + + + Lengte- en breedtegraad + + + Niveau + + + Lijst van {0}plaats labels + Don't translate {0}place + + + Lokatie + + + Magische Items niet geladen. + + + {0}'s MAL profiel + + + Je kunt deze functie niet gebruiken. Bot eigenaar heeft MashapeApiKey niet gedefinieërd. + + + Minimaal/Maximaal + + + Geen kanaal gevonden. + + + Geen resultaten gevonden. + + + On-hold + + + Originele URL + + + Een osu! API sleutel is vereist. + + + Kon het osu! handtekening niet ontvangen. + + + Meer dan {0} afbeeldingen gevonden. Willekeurig Resultaat {0}. + + + Gebruiker niet gevonden! Check de Regio en de BattleTag voordat je het opnieuw probeert. + + + Van plan om te bekijken. + + + Platform + + + Geen talent gevonden. + + + Geen Pokémon gevonden. + + + Profiel link: + + + Kwaliteit: + + + Snel kijktijd + + + Snelle overwinningen. + + + Beoordeling + + + Score: + + + Zoekopdracht voor: + + + Fout bij het inkorten van de URL. + + + Korte URL + + + Er is iets mis gegaan. + + + Specificeer zoek parameters alsjeblieft. + + + Status + + + Winkel URL + + + Streamer {0} is offline. + + + Streamer {0} is online met {1} kijkers. + + + Je volgt {0} streams op deze server. + + + Je volgt geen streams op deze server. + + + Stream niet gevonden. + + + Stream bestaat mogelijk niet. + + + Verwijderd {0}'s stream ({1}) van notificaties. + + + Ik zal dit kanaal op de hoogte houden wanneer de status verandert. + + + Zon's opgang + + + Zon's ondergang + + + Temperatuur + + + Titel: + + + Top 3 favoriete anime: + + + Vertaling: + + + Types + + + Fout bij het opzoeken van definitie voor die term. + + + Url + + + Kijkers + + + Kijken/Bekijken <-- ga even na welke correct is.!!! + + + Mislukt met het vinden van de term op de gespecificeerde Wikia. + + + Vul een Wikia doel in alsjeblieft, gevolgd door een zoek query. + + + Pagina niet gevonden + + + Wind snelheid + + + De {0} meest verbannen kampioenen. + + + Het yodifying van jou zin is mislukt. + + + Aangesloten + + + `{0}.` {1} [{2:F2}/s] - {3} totaal + /s and total need to be localized to fit the context - +`1.` + + + Activiteit pagina #{0} + + + {0} gebruikers totaal. + + + Auteur + + + Bot ID + + + Lijst van functies in {0}calc commando + + + {0} van dit kanaal is {1} + + + Kanaal onderwerp + + + Commando's uitgevoerd + + + {0} {1} is gelijk aan {2} {3} + + + Eenheden die gebruikt kunnen worden door de omvormer + + + Kan {0} niet naar {1} omvormen: Eenheden niet gevonden + + + Kan {0} niet naar {1} omvormen: Type eenheden zijn niet gelijk + + + Gemaakt op + + + Aangesloten cross server kanaal. + + + Verbroken cross server kanaal. + + + Dit is je CSC token + + + Speciale emojis + + + Fout + + + Kenmerken + + + ID + + + Index buiten bereik. + + + Hier is de lijst met gebruikers in die rollen: + Fuzzy + + + Om misbruik te voorkomen ben je niet gemachtigd om dit commando te gebruiken op rollen met veel gebruikers. + + + Ongeldige {0} waarde. + Invalid months value/ Invalid hours value + + + Bij Discord aangesloten + + + Bij server aangesloten + + + ID: {0} +Leden: {1} +Eigenaar ID: {2} + + + Geen servers gevonden op die pagina. + + + Lijst van de repeater + + + Leden + + + Geheugen + + + Berichten + + + Bericht repeater + + + Naam + + + Roepnaam + + + Niemand speelt dat spel. + + + Geen actieve herhaling + + + Geen rollen op deze pagina. + + + Geen shards op deze pagina. + + + Geen onderwerp ingesteld. + + + Eigenaar + + + Eigenaar IDs + + + Aanwezigheid + + + {0} Servers +{1} Tekst Kanalen +{2} Spraak Kanalen + + + Verwijder alle citaten met het trefwoord {0} + + + Pagina {0} met citaten + + + Geen citaten op deze pagina. + + + Geen verwijderbare citaten gevonden + + + Citaat toegevoegd + + + Een willekeurig citaat verwijderd + Fuzzy + + + Regio + + + Geregistreerd op + + + Ik zal {0} herinneren om {1} in {2} `({3:d.M.yyyy.} op {4:HH:mm})` + + + Incorrecte tijd formaat. Controleer de commandolijst. + + + Nieuwe herinnering sjabloon. + + + Herhalen van {0} elke {1} dagen, {2} uren en {3} minuten. + + + Lijst van repeaters + + + Geen repeaters actief op deze server. + + + #{0} gestopt. + + + Geen herhalende berichten gevonden op deze server. + + + Resultaat + + + Rollen + + + Pagina #{0} van alle rollen op deze server: + + + Pagina #{0} van kleuren voor {1} + + + Kleuren staan niet in de correcte format. Gebruik #00ff00` als voorbeeld. + + + Begonnen met het routeren van kleuren voor de rol {0} + + + Gestopt met het routeren van kleuren voor de rol {0} + + + {0} van deze server is {1} + + + Server Informatie + + + Shard + + + Shard Statestieken + + + Shard **#{0}** is in {1} status met {2} servers + + + *Naam:** {0} **Link:** {1} + + + Geen speciale emojis gevonden. + + + {0} liedjes aan het spelen, {1} in de wachtrij + + + Tekst Kanalen + + + Hier is de link naar je sessie: + + + Uptime + + + {0} van de gebruker {1} is {2} + Id of the user kwoth#1234 is 123123123123 + + + Gebruikers + + + Spraak Kanalen + + + Je maakt al deel uit van deze race! + + + Huidige poll resultaten + + + Geen stemmen ingediend. + + + Poll is al actief op deze server. + + + 📃 {0} heeft een poll gecreëerd dat vraagt om uw aandacht: + + + `{0}.` {1} met {2} stemmen. + + + {0} gestemd. + Kwoth voted. + + + Stuur mij een privé bericht met het overeenkomende nummer van het antwoord. + + + Stuur een bericht hier met de overeenkomende nummer van het antwoord. + + + Bedankt voor het stemmen, {0} + + + Totaal aantal stemmen: {0}. + + + Raap hun op door te typen `{0}pick` + + + Raap het op door te typen `{0}pick` + + + Geen gebruiker gevonden. + + + pagina {0} + + + U moet zich in een spreekkanaal bevinden op deze server. + + + Er zijn geen spreekkanaal rollen. + + + {0} is **gedempt** van text en spreek chat voor {1} minuten. + + + Gebruikers die aansluiten op {0} geluid kanaal krijgen {1} rol. + + + Gebruiker dat aansloot {0} geluid kanaal krijgt niet langer meer een rol. + + + Spreekkanaal rollen + + + Bericht triggering met aangepaste reactie id {0} wordt niet automatisch gedeletet. + + + Bericht triggering met aangepaste reactie id {0} wordt automatisch gedeletet. + + + Response-bericht van aangepaste reactie met id {0} wordt niet privé verstuurd. + + + Response-bericht van aangepaste reactie met id {0} wordt verstuurd als privé bericht. + + + Geen alias gevonden. + + + Trigger {0} heeft nu de alias {1}. + + + Lijst van aliassen + + + Trigger {0} heeft geen alias meer. + + + Trigger {0} had geen alias + + + Competitieve speeltijd + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/CommandStrings.nl-NL.resx b/src/NadekoBot/Resources/ResponseStrings.pl-PL.resx similarity index 63% rename from src/NadekoBot/Resources/CommandStrings.nl-NL.resx rename to src/NadekoBot/Resources/ResponseStrings.pl-PL.resx index d3b70713..6517d703 100644 --- a/src/NadekoBot/Resources/CommandStrings.nl-NL.resx +++ b/src/NadekoBot/Resources/ResponseStrings.pl-PL.resx @@ -118,389 +118,396 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Die basis is al veroverd of vernietigd. + Ta baza została już zdobyta lub zniszczona. - Die basis is al vernietigd. + Ta baza została już zniszczona. - Die basis is nog niet veroverd. + Ta baza nie jest zdobyta. - **VERNIETIGD**basis #{0} in een oorlog tegen {1} + **ZNISZCZONO** bazę #{1} w wojnie przeciwko {1} - {0} heeft **ONOVERWONNEN** basis #{1} in een oorlog tegen {2} + {0} **POZBYŁ SIĘ** bazy #{1} w wojnie przeciwko {2} - {0} heeft basis #{1} overwonnen in een oorlog tegen {2} + {0} zdobył bazę #{1} w wojnie przeciwko {2} - @{0} Jij hebt al een basis overwonnen #{1}. Je kunt niet nog een nemen. + @{0} Już zdobyłeś bazę #{1}. Nie możesz zdobyć nowej. - De aanvraag van @{0} voor een oorlog tegen {1} is niet meer geldig. + Wypowiedzenie wojny od @{0} przeciwko {1} wygasło. + Fuzzy - Vijand + Wróg - Informatie over oorlog tegen {0} + Informacje o wojnie przeciwko {0} - Ongeldige basis nummer + Nieprawidłowy numer bazy. - Ongeldige oorlogs formaat. + Nieprawidłowy rozmiar wojny. + Fuzzy - Lijst van voorlopende oorlogen. + Lista aktualnych wojen + Fuzzy - Niet veroverd. + niezdobyta - Jij doet niet mee aan die oorlog. + Nie uczestniczysz w tej wojnie. - @{0} Jij doet niet mee aan die oorlog, or die basis is al vernietigd. + @{0} nie uczestniczysz w tej wojnie albo ta baza została już zniszczona. - Geen voorlopende oorlogen. + Brak aktywnych wojen. + Fuzzy - Grootte. + Rozmiar - Oorlog tegen {0} is al begonnen. + Wojna przeciwko {0} już się zaczęła. - Oorlog tegen {0} gecreëerd + Wojna przeciwko {0} stworzona. - De oorlog tegen {0} is beëindigd. + Wojna przeciwko {0} zakończyła się. - Die oorlog bestaat niet. + Ta wojna nie istnieje. - De oorlog tegen {0} is begonnen! + Wojna przeciwko {o} zaczęła się! - Alle speciale reactie statistieken zijn verwijderd. + Wszystkie statystyki niestandardowych reakcji zostały wyczyszczone. - Speciale Reactie verwijderdt. + Własne reakcje zostały usunięte - Onvoldoende rechten. Bot Eigendom is nodig voor globale speciale reacties, en Administrator voor speciale server-reacties. + Niewystarczające uprawnienia. Wymagane są uprawnienia właściciela dla globalnych niestandardowych reakcji oraz uprawnienia administratora dla niestandardowych reakcji na serwerze. - Lijst van alle zelf gemaakte reacties + Lista własnych reakcji - Speciale Reacties + Własne reakcje - Nieuwe Speciale Reacties + Nowe własne reakcje - Geen speciale reacties gevonden. + Własne reakcje nie zostały znalezione. - Geen speciale reacties gevonden met die ID. + Własne reakcje z tym ID nie zostały znalezione. - Antwoord + Odpowiedź - Speciale Reactie Statistieken + Statystyki niestandardowych reakcji - Statistieke verwijderd voor {0} speciale reactie. + - Geen statistieken voor die trekker gevonden, geen actie genomen. + - Trekker + - Autohentai gestopt. + Zatrzymano autohentai. - Geen resultaten gevonden + Brak rezultatów. - {0} is al flauw gevallen. + {0} już zemdlał. - {0} heeft al vol HP. + {0} ma już pełne HP. - Jouw element is al {0} + Twoim typem jest już {0} - heeft {0}{1} op {2}{3} gebruikt voor {4} schade. + użyto {0}{1} na {2}{3} zadając {4} obrażeń. Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. - Jij zal niet winnen zonder tegenstand! + Nie możesz znowu zaatakować bez odwetu! - Je kunt je zelf niet aanvallen + Nie możesz zaatakować sam siebie. - {0} is verslagen! + {0} zemdlał! - heeft {0} genezen met een {1} + wyleczono {0} używając {1} - {0} heeft nog {1} HP over + {0} zostało {1} HP. - Je kan {0} niet gebruiken. Typ `{1}ml` om een lijst te bekijken van de aanvallen die jij kunt gebruiken + Nie możesz użyć {0}. Napisz `{1}ml` by zobaczyć listę wszystkich ruchów które możesz użyć. - Aanvallijst voor {0} element + Lista ruchów dla typu {0} - Het heeft weinig effect. + To nie jest efektywne. - Je hebt niet genoeg {0} + Nie masz wystarczająco {0} - heeft {0} herstelt met een {1} + Ożywiono {0}, używając {1} - Je kunt jezelf herstellen met een {0} + Ożywiłeś siebie, używając {0} - Je element is veranderd van {0} naar {1} + Twój typ został zmieniony z {0} na {1} - Het is een beetje effectief. + To trochę efektywne. - Het is super effectief! + To bardzo efektywne! - Je hebt te veel aanvallen achter elkaar gemaakt, je kan dus niet bewegen! + Użyłeś za dużo ruchów, więc nie możesz się ruszyć! - Element van {0} is {1} + Typem {0} jest {1} - Gebruiker niet gevonden. + Nie znaleziono użytkownika. - Je bent flauw gevallen, dus je kunt niet bewegen! + Zemdlałeś, więc nie jesteś w stanie się ruszyć! - **Auto aanwijzing van rollen** op gebruiker is nu **uitgeschakeld**. + **Automatyczne przydzielanie ról** dla nowych użytkowników jest teraz **wyłączone**. - **Auto aanwijzing van rollen** op gebruiker is nu **ingeschakeld**. + **Automatycznie przydzielanie ról** dla nowych użytkowników jest teraz **włączone*. - Bestanden + Załączniki - Avatar veranderd + Awatar został zmieniony - Je bent verbannen van {0} server. Reden: {1} + Zostałeś zbanowany z serwera {0}. +Powód: {1} - Verbannen + zbanowany PLURAL - Gebruiker verbannen + Użytkownik zabanowany - Bot naam is veranderd naar {0} + Nazwa bota została zmieniona na: {0} - Bot status is veranderd naar {0} + Status bota został zmieniony na: {0} - Automatische verwijdering van de bye berichten is uitgeschakeld. + Automatyczne usuwanie wiadomości pożegnalnych zostało wyłączone. - Bye berichten zullen worden verwijderd na {0} seconden. + Wiadomości pożegnalne będą usuwane po {0} sekundach. - Momenteel is de bye message: {0} + Obecna wiadomość pożegnalna: {0} - Schakel de bye berichten in door {0} te typen. + Włącz wiadomości pożegnalne, pisząc {0} - Nieuw bye bericht is geplaatst. + Nowa wiadomość pożegnalna ustawiona. - Dag aankondigingen uitgeschakeld. + Powiadomienia pożegnalne wyłączone. - Dag aankondigingen ingeschakeld op dit kanaal. + Powiadomienia pożegnalne są włączone na tym kanale. - Kanaal naam is veranderd. + Nazwa kanału została zmieniona. - Oude naam + Stara nazwa - Kanaal onderwerp is veranderd + Temat kanału zmieniony - Opgeruimd + Wyczyszczono. - Inhoud + Zawartość - Met success een nieuwe rol gecreëerd. + Stworzono rolę {0} - Tekst kanaal {0} gecreëerd. + Kanał tekstowy {0} został stworzony. - Stem kanaal {0} gecreëerd. + Kanał głosowy {0} został stworzony. - Dempen succesvol. + Wyciszono pomyślnie. - Server verwijderd {0} + Usunięto serwer {0} - Stopt van automatische verwijdering van succesvolle reacties aanroepingen commando. + Zatrzymano automatyczne usuwanie potwierdzeń o udanych użyciach komend. - Verwijdert nu automatisch succesvolle commando aanroepingen + Rozpoczęto usuwanie potwierdzeń o udanych użyciach komend. - Tekst kanaal {0} verwijdert. + Kanał tekstowy {0} został usunięty. - Stem kanaal {0} verwijdert. + Kanał głosowy {0} został usunięty. - Privé bericht van + Prywatna wiadomość od - Met succes een nieuwe donateur toegevoegt. Totaal gedoneerde bedrag van deze gebruiker {0} + Z powodzeniem dodano nowego darczyńcę. Łączna darowizna przekazana przez tego użytkownika wynosi: {0} 👑 - Dank aan de mensen hieronder vernoemt voor het waarmaken van dit project! + Dziękuję ludziom wypisanym na dole za pomoc w realizacji tego projektu! - Ik zal alle eigenaren een privé bericht sturen. + Wyślę prywatne wiadomości do wszystkich właścicieli. - Ik zal een privé bericht sturen naar de eerste eigenaar + Wyślę prywatną wiadomość tylko do pierwszego właściciela. - Ik zal privé berichten sturen vanaf nu. + Od teraz będę wysyłać prywatne wiadomości. - Ik stop vanaf nu met het sturen van privé berichten. + Od teraz nie będę wysyłać prywatnych wiadomości. - Automatisch verwijderen van groet berichten is uitgeschakeld. + Automatyczne usuwanie wiadomości powitalnych zostało wyłączone. + - Groet berichten zullen worden verwijderd na {0} seconden. + Wiadomości powitalne będą usuwane po {0} sekundach. - Momenteen is het privé groet bericht: {0} + Aktualna prywatna wiadomość powitalna: {0} - Schakel DM begroetings bericht in door {0} in te typen. + Aby włączyć prywatną wiadomość powitalną, wpisz {0} - Nieuwe DM begroetings bericht vastgesteld. + Nowa prywatna wiadomość powitalna została ustawiona. - DM begroetings aankondiging uitgeschakeld. + Prywatne ogłoszenie powitalne zostało włączone - DM begroetings aankondiging ingeschakeld. + Prywatne ogłoszenie powitalne zostało wyłączone - Momentele begroetings bericht: {0} + Aktualna wiadomość powitalna: {0} - Schakel begroetings bericht in door {0} in te typen + Włącz wiadomości powitalne wpisując {0} - Nieuwe begroetings message vastgesteld. + Nowa wiadomość powitalna ustawiona. - Begroetings aankondiging uitgeschakeld. + Ogłoszenie powitalne wyłączone. - Begroetings aankondiging uitschakeld op dit kanaal. + Ogłoszenie powitalne włączone na tym kanale. - Jij kunt geen commando gebruiken op gebruikers met hogere of dezelfde rol als die van jouw in de rollen hiërarchie. + Nie możesz użyć tej komendy na użytkowniku z rolą wyższą lub równą twojej. - Afbeeldingen geplaatst na {0} seconden! + Obrazki załadowane po {0} sekundach. - Ongelde invoer formaat. + Niepoprawny format zmiennej. - Ongeldige parameters. + Niepoprawne parametry. - {0} heeft {1} toegetreden. + {0} dołączył do {1} - Je bent weggeschopt van de {0} server. -Reden: {1} + Zostałeś wyrzucony z serwera {0}. +Powód: {1} - Gebruiker weggeschopt. + Użytkownik wyrzucony + Fuzzy - Lijst van talen -{0} + Lista języków + Fuzzy - Jouw server's plaats van handeling is nu {0} - {1} + - Bot's standaard plaats van handeling is nu {0} - {1} + - Bot's taal is vastgesteld van {0} - {1} + - deze server taal is gezet naar: + Język serwera został zmieniony na {0} - {1} - heeft verlaten + {0} opuścił {1} - Heeft de server verlaten + Opuścił serwer {0} - + Logowanie wszystkich wydarzeń na tym kanale. - Logging uitgeschakeld + Logowanie wyłączone. @@ -509,7 +516,7 @@ Reden: {1} - + Logowanie nie będzie ignorowało {0} @@ -518,141 +525,148 @@ Reden: {1} - + Wiadomość od {0} `[Właściciel bota]`: - Bericht verstuurd + Wiadomość została wysłana. - verplaats van ... naar ... + {0} przeniesiono z {1} do {2} - bericht verwijdert in + Wiadomość usunięta w #{0} - bericht bijgewerkt in + Wiadomość zaktualizowana w #{0} - gemute + Wyciszony PLURAL (users have been muted) - gemute + Wyciszony singular "User muted." - + Nie mam wystarczających uprawnień aby to zrobić. - nieuwe demp group gezet + Nowa wyciszająca rola ustawiona. - Ik heb **administrator** rechten nodig voor dat + Potrzebuję uprawnień **administratora* żeby to zrobić. - nieuw bericht + Nowa wiadomość + Fuzzy - nieuwe bijnaam + Nowy pseudonim + Fuzzy - Nieuw onderwerp + Nowy temat + Fuzzy - Bijnaam veranderd + Pseudonim zmieniony + Fuzzy - Kan de server niet vinden + Serwer nie został znaleziony. - + Żaden shard z tym ID nie został znaleziony. - Oud bericht + Stara wiadomość + Fuzzy - Oude bijnaam + Stary pseudonim + Fuzzy - Oude onderwerp + Stary temat + Fuzzy - error hoogst waarschijnlijk niet voldoende permissie + Wystąpił błąd. Najwyraźniej nie mam wystarczających uprawnień. - de rechten op deze server zijn gereset + Uprawnienia tego serwera zostały zresetowane. - actieve bescherming + Aktywne zabezpieczenia - is ** uitgeschakeld** op deze server + {0} został **wyłączony** na tym serwerze. - aangezet + {0} włączone - fout. ik heb managergroup rechten nodig + Wystąpił błąd. Potrzebuję uprawnień zarządzania rolami - geen bescherming aangezet + Żadne zabezpieczenie nie jest aktywne. - + Jeśli {0} lub więcej użytkowników dołączy w ciągu {1} sekund, {2} ich. - + Czas musi być pomiędzy {0} a {1} sekundą. - + Z powodzeniem usunięto wszystkie role użytkownika {0} - + Nie udało się usunąć ról. Nie mam wystarczających uprawnień. - + Kolor roli {0} został zmieniony. - + Ta rola nie istnieje. - + Wyszczególnione parametry są błędne - + Wystąpił błąd w związku z błędnym kolorem albo niewystarczającymi uprawnieniami. - + Z powodzeniem usunięto rolę {0} użytkownikowi {1} - + Wystąpił błąd przy usunięciu roli. Masz niewystarczające uprawnienia. - group naam veranderd + Nazwa roli została zmieniona. - group naam veranderen mislukt. ik heb niet genoeg rechten + Nie udało się zmienić nazwy roli. Nie mam wystarczających uprawnień. - je kan geen groupen bijwerken die hoger zijn dan jou eigen group + Nie możesz edytować ról wyższych od twojej. - Verwijderd van speel bericht + - group... is toegevoegd aan de lijst + Rola {0} została dodana do listy. - niet gevonden. aan het opruimen + - group is al in de lijst + Rola {0} jest już na liście. - toegevoegd + Dodano. @@ -667,195 +681,202 @@ Reden: {1} - je hebt al .. group + Masz już rolę {0}. - + Role, które można nadawać sobie samemu, są teraz ekskluzywne. - + Istnieje {0} ról, które możesz sam sobie nadać. - deze group is niet zelf + Tej roli nie możesz nadać sobie sam. - + Nie posiadasz roli {0} - + Role, które można nadawać sobie samemu, nie są już ekskluzywne. - + Nie jestem w stanie nadać ci tej roli. `Nie mogę nadawać ról wyższych niż moja.` - + Rola {0} została usunięta z listy ról, które użytkownik może sobie nadać sam. - je heb niet lang meer de {0} group + Nie masz więcej roli {0} - je hebt nu {0} group + Masz teraz rolę {0}. - met sucess een group {0) toegevoegd aan gebruiker {1} + Z powodzeniem nadano rolę {0} użytkownikowi {1} - fout bij het toevoegen van een group. je heb onvoldoende rechten + Nadanie roli nie powiodło się. Nie mam wystarczających uprawnień. - Nieuwe avatar gezet! + Nowy awatar został ustawiony! - Nieuwe kanaal naam gezet. + Nowa nazwa kanału została ustawiona! - Nieuwe game gezet! + Nowa gra ustawiona! - Nieuwe stream gezet! + Nowy stream ustawiony! - Nieuwe kanaal onderwerp gezet + Nowy temat kanału ustawiony. - + Shard {0} połączony ponownie. - + Shard {0} łączy się ponownie. - afsluiten + Wyłączanie. - + Użytkownik nie może wysłać więcej niż {1} wiadomości na {1} sekund. - langzame mode uitgezet + Slow mode wyłączony. - langzame mode gestart + Slow mode włączony - zacht-verbannen(kicked) + lekko zbanowany (wyrzucony) PLURAL - {0} wil deze kanaal dempen + {0} będzie ignorował ten kanał. - + {0} nie będzie więcej ignorował tego kanału. - + Jeśli użytkownik napisze {0} takich samych wiadomości pod rząd, {0} go. + __IgnorowaneKanały__: {2} - + Kanał tekstowy został stworzony. - + Kanał tekstowy został usunięty. - + wyciszenie wyłączone - + Odciszony singular - + Nazwa użytkownika - + Nazwa użytkownika została zmieniona + Fuzzy - + Użytkownicy - + Użytkownik zbanowany + Fuzzy - + {0} został **wyciszony** z chatowania. - + {0} został **odciszony** z chatowania. - + Użytkownik dołączył - + Użytkownik wyszedł - + {0} został **wyciszony** z chatu głosowego i pisanego. - + Rola użytkownika dodana - + Rola użytkownika usunięta - + {0} jest teraz {1} - + {0} został **odciszony** z chatu głosowego i pisanego. - + {0} dołączył do kanału {1}. - + {0} opuścił kanał {1}. - + {0} przeniesiony z kanału {1} na {2} - + {0} został **wyciszony z chatu głosowego**. - + {0} został **odciszony z chatu głosowego**. - + Kanał głosowy został stworzony + Fuzzy - + Kanał głosowy został usunięty + Fuzzy - + Wyłączono funkcję głos + tekst. - + Włączono funkcję głos + tekst. - + Nie mam uprawnień: **zarządzanie rolami** i **zarządzanie kanałami**, więc nie mogę uruchomić funkcji `głos+tekst` na serwerze {0}. - + Włączasz/Wyłączasz tą funkcję i **Nie mam uprawnień ADMINISTRATORA**. Może to spowodować problemy i będziesz musiał czyścić kanały tekstowe sam. - + By włączyć tą funkcję, muszę posiadać uprawnienia: **zarządzanie rolami** i **zarządzanie kanałami**. (Preferowane uprawnienia administratora) - + Użytkownik {0} z tekstowego czatu - + Użytkownik {0} z tekstowego i głosowego czatu - + Użytkownik {0} z czatu głosowego - + Zostałeś tymczasowo zablokowany na serwerze {0} +Powód: {1} - + Użytkownik został odbanowany + Fuzzy - + Migracja zakończona! @@ -864,94 +885,97 @@ Reden: {1} - + Użytkownik tymczasowo zablokowany + Fuzzy - + nagrodził {0} {1} - + Powodzenia następnym razem! ^_^ - + Gratulacje! Wygrałeś {0} za wyrzucenie ponad {1} - + Talia została przetasowana. - + wyrzucono {0}. User flipped tails. - + Zgadłeś! Wygrałeś {0} - + Użyty numer jest niepoprawny. Możesz rzucić 1 do {0} monet - + Dodaj reakcję {0} do tej wiadomości, aby dostać {1} - + To wydarzenie jest aktywne {0} godziny. - + Wydarzenie reagowania kwiatkami rozpoczęło się! - + dał (0} dla {1} X has gifted 15 flowers to Y - + {0} ma {1} X has Y flowers - + Orzeł + Fuzzy - + Ranking - + Nagrodził {0} dla {1} użytkowników z roli {2} - + Nie możesz założyć się o więcej niż {0} - + Nie możesz założyć się o mniej niż {0} - + Nie masz wystarczająco {0} - + W talii nie ma więcej kart. - + Wylosowano użytkownika - + Wyrzucono {0} - + Zakład - + ŁAAAAAAAAAAAAŁ!!! Gratulacje!!! x{0} - + Pojedyńczy {0}, x{1} - + Wow! Szczęściarz! Trójka! x{0} - + Nieźle! Dwójka {0} - stawka x{1} - + Wygrana - + Użytkownicy muszą wpisać tajny kod aby dostać {0}. +Trwa {0} sekund. Nie nikomu. Ciiii. @@ -960,25 +984,26 @@ Reden: {1} - + Reszka + Fuzzy - + z powodzeniem wziął {0} od {1} - + nie był w stanie wziąć {0} od {1}, ponieważ użytkownik nie ma tylu {2}! - + Powrót do ToC - + Tylko właściciel bota - + Wymagane {0} uprawnienie kanału. - + Możesz wspierać ten projekt na patreonie: <{0}> albo poprzez paypala: <{1}> @@ -990,136 +1015,149 @@ Reden: {1} - + Nie mogę znaleźć komendy. Proszę sprawdź czy komenda istnieje, zanim jej użyjesz. - + Opis - + Możesz wspierać projekt NadekoBot na +Patreonie <{0}> albo +Paypalu <{1}> +Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomości. + +**Dziękujemy** ♥️ - + **Lista komend**:<{0}> +**Poradniki hostowania i dokumenty znajdziesz tutaj**:<{1}> + Fuzzy - + Lista komend + Fuzzy - + Lista modułów - + Ten moduł nie istnieje. - + Spis treści - + Użycie - + Autohentai uaktywnione. Obrazki z jednym z tagów: {1} będą zamieszczane co {0} sekund. - + Tag - + Wyścig zwierzaków + Fuzzy - + Nie udało się zacząć wyścigu, ponieważ nie wzięła w nim udziału wystarczająca ilość osób. - + Wszystkie miejsca są zajęte! Wyścig zacznie się natychmiastowo. - + {0} dołączył jako {1} - + {0} dołączył jako {1} i założył się o {2}! - + Wpisz {0}jr aby wciąć udział w wyścigu. - + Zacznie się za 20 sekund albo gdy wszystkie miejsca będą zajęte. - + Zaczyna z {0} uczestnikami. - + {1} czyli {0} wygrał wyścig! - + {1} czyli {0} wygrał wyścig i {2}! - + Użyty numer jest nie poprawny. Możesz rzucić {0}-{1} kośćmi na raz - + wyrzucono {0} Someone rolled 35 - + Wyrzucone kostki: {0} Dice Rolled: 5 - + Nie można zacząć wyścigu. Prawdopodobnie inny wyścig jest już aktywny. - + Żaden wyścig nie jest aktywny na tym serwerze. - + Drugi numer musi być większy od pierwszego. - + Zmiany serca + Fuzzy - + Zdobyta przez - + Rozwody - + Lubi - + Cena - + Nie zdobyłeś jeszcze żadnej waifu. - + Ranking - + lubi teraz {0} zamiast {1}. + +*Czy to aby na pewno moralne?* Make sure to get the formatting right, and leave the thinking emoji - + Musisz poczekać {0} godzin i {1} minut aby zmienić swój obiekt westchnień. - + chce być zdobyta przez {0}. Aww <3 - + zdobył waifu {0} za {1}! - + Rozwiodłeś się z waifu, która cię lubi. Ty bezduszny potworze! +{0} odtrzymał {1} jako rekompensatę. @@ -1128,28 +1166,28 @@ Reden: {1} - + Żadna waifu nie jest taka tania. Musisz zapłacić co najmniej {0} aby zdobyć waifu, nawet jeśli nie jest tyle warta. - + Musisz zapłacić {0} albo więcej aby zdobyć tą waifu. - + Ta waifu nie jest twoja. - + Nie możesz zdobyć siebie. - + Rozwiodłeś się ostatnio. Musisz poczekać {0} ny i {1} minuty aby rozwieść się ponownie. - + Nikt - + Rozwiodłeś się z waifu, która cię nie lubi. W zamian dostałeś {0}. - + Magiczna kula nr 8 @@ -1158,10 +1196,10 @@ Reden: {1} - + Brak głosów. Gra zakończyła się bez zwycięzcy. - + Akronim to {0}. @@ -1182,362 +1220,363 @@ Reden: {1} - + Zwycięzcą jest {0} z {1} punktami. - + Użytkownik {0} wygrywa, ponieważ jako jedyny coś zgłosił! - + Pytanie - + Remis! Dwie osoby wybrały {0} - + {0} wygrał! {1} pokonuje {2} - + Zgłoszenia zakończone - + Wyścig zwierzaków właśnie się odbywa. - + Łącznie: {0} Średnia: {1} - + Kategoria - + Wyłączono cleverbota na tym serwerze. - + Włączono cleverbota na tym serwerze. - + Generowanie przychodów zostało wyłączone na tym kanale. - + Generowanie przychodów zostało włączone na tym kanale. plural - + {0} się pojawiły! + Fuzzy - + Nie udało się załadować pytania. - + Gra rozpoczęta. - + Gra w wisielca rozpoczęta - + Gra w wisielca już trwa na tym kanale. - + Rozpoczynanie gry w wisielca nie powiodło się. - + Ranking - + Nie masz wystarczająco {0} - + Brak rezultatów - + podniósł {0} Kwoth picked 5* - + {0} zasadził {1] Kwoth planted 5* - + Trivia jest aktywna na tym serwerze - + Trivia - + {0} zgadł! Odpowiedź to: {1} - + Trivia nie jest aktywna na tym serwerze - + {0} posiada {1} punktów - + Koniec po tym pytaniu - + Koniec czasu! Prawidłowa odpowiedź to {0} - + {0} zgadł i wygrał grę! Odpowiedź to: {1} - + Nie możesz grać przeciwko sobie. - + Remis! - + stworzył grę w kółko i krzyżyk. - + {0} wygrał! - + Brak ruchów! - + Koniec czasu! - + Kolej {0} - + {0} kontra {1} - + Próba dołączenia {0} piosenek do kolejki... - + Automatyczne odtwarzanie wyłączone. - + Automatyczne odtwarzanie włączone. - + Domyślna głośność ustawiona na {0}% - + fairplay - + Zakończono odtwarzanie piosenki - + Fair play wyłączony. - + Fair play włączony. - + ID - + Niepoprawna zmienna. - + Maksymalny czas grania ustawiony na: bez limitu. - + Maksymalny czas grania ustawiony na: {0} sekund. - + Maksymalna długość kolejki ustawiona na: bez limitu. - + Maksymalna długość kolejki ustawiona na {5} utworów. - + Musisz być na kanale głosowym na tym serwerze. - + Imię - + Teraz gra - + Brak wyników - + Odtwarzanie muzyki wstrzymane. - + Gra utwór - + Strona {0} zapisanych playlist - + Playlista usunięta. - + Nie możesz usunąć tej playlisty. Albo nie istnieje albo nie jesteś jej autorem. - + Playlista z takim ID nie istnieje. - + Kolejka do playlisty zakończona - + Playlista zapisana - + Kolejka - + Zakolejkowany utwór - + Kolejka wyczyszczona. - + Zapełnienie kolejki: {0}/{0} - + Usunięto utwór context: "removed song #5" - + Powtarzanie aktualnego utworu - + Powtarzenie playlisty - + Powtarzanie utworu - + Powtarzanie aktualnego utworu zatrzymane. - + Odtwarzanie muzyki wznowione. - + Powtarzanie playlisty wyłączone. - + Powtarzanie playlisty włączone. - + Przewinięto do `{0}:{1}` - + Utwory pomieszane - + Utwór przeniesiony - + {0}g {1}m {2}s - + bez limitu - + Głośność musi być pomiędzy 0 a 100. - + Głośność ustawiona na {0}% - + Wyłączono użycie WSZYSTKICH MODÓŁÓW na kanale {0}. - + Włączono użycie WSZYSTKICH MODÓŁÓW na kanale {0}. - + Dozwolone - + Wyłączono użycie WSZYSTKICH MODÓŁÓW dla roli {0}. - + Włączono użycie WSZYSTKICH MODÓŁÓW dla roli {0}. - + Wyłączono użycie WSZYSTKICH MODÓŁÓW na tym serwerze. - + Włączono użycie WSZYSTKICH MODÓŁÓW na tym serwerze. - + Wyłączono użycie WSZYSTKICH MODÓŁÓW dla użytkownika {0}. - + Włączono użycie WSZYSTKICH MODÓŁÓW dla użytkownika {0}. - + Na czarną listę wpisano użytkownika {0} z ID {1} - + Komenda {0} ma teraz {1}-sekundowy cooldown. - + Komenda {0} nie ma teraz cooldown'a. Wszystkie aktywne cooldown'y zostały zresetowane. - + Żadna komenda nie ma cooldown'a. - + Komenda kosztuje - + Wyłączono użycie {0} {1} na kanale {2}. - + Włączono użycie {0} {1} na kanale {2}. - + Odmówiono - + Dodano słowo {0} do listy odfiltrowanych słów. - + Lista odfiltrowanych słów - + Usunięto słowo {0} z listy odfiltrowanych słów. - + Błędny drugi parametr. (Musi być to liczba od {0} do {1}) @@ -1552,227 +1591,227 @@ Reden: {1} - + Przeniesiono uprawnienia {0} z #{1} to #{2} - + Nie znaleziono uprawnień w indeksie #{0} - + komenda Gen (of command) - + moduł Gen. (of module) - + Strona uprawnień {0} - + Użytkownicy wymagają roli {0}, by móc edytować uprawnienia. - + Żadne uprawnienia nie zostały znalezione w tym indeksie. - + przeniesiono uprawnienia #{0} - {1} - + Wyłączono użycie {0} {1} dla roli {2}. - + Włączono użycie {0} {1} dla roli {2}. - + sek. Short of seconds. - + Wyłączono użycie {0} {1} na tym serwerze. - + Włączono użycie {0} {1} na tym serwerze. - + Z czarnej listy usunięto użytkownika {0} z ID {1} - + nie do edytowania - + Wyłączono użycie {0} {1} dla użytkownika {2}. - + Włączono użycie {0} {1} dla użytkownika {2}. - + Nie będę więcej pokazywać ostrzeżeń dotyczących uprawnień. - + Będę pokazywać ostrzeżenia dotyczące uprawnień. - + Filtrowanie słów wyłączone na tym kanale. - + Filtrowanie słów włączone na tym kanale. - + Filtrowanie słów wyłączone na tym serwerze. - + Filtrowanie słów włączone na tym serwerze. - + Zdolności - + Brak ulubionego anime - + Zaczęto automatyczne tłumaczenie wiadomości na tym kanale. Wiadomości użytkowników będą automatycznie usuwane. - + twój auto-tłumaczący język został usunięty. - + twój auto-tłumaczący język został ustawiony {0}>{1} - + Zaczęto automatyczne tłumaczenie wiadomości na tym kanale. - + Zakończono automatyczne tłumaczenie wiadomości na tym kanale. - + Złe dane wejściowe albo coś poszło nie tak. - + Nieznaleziono tej karty. - + fakt - + Rozdziały - + Komiks # - + Przegrane rywalizacje - + Grane rywalizacje - + Ranking rywalizacji - + Wygrane rywalizacje - + Zakończony - + Warunek - + Koszt - + Data - + Zdefiniuj: - + Odcinki - + Wystąpił błąd. - + Przykład - + Wyszukiwanie tego animu nie powiodło się. - + Wyszukiwanie mango nie powiodło się. - + Gatunki - + Nie udało się znaleźć definicji dla tego tagu. - + Wysokość/szerokość - + {0}m/{1}kg - + Wilgotność - + Szukanie obrazka dla: - + Wyszukiwanie tego filmu nie powiodło się. - + Żarty nie zostały załadowane. - + Poziom Don't translate {0}place - + Lokalizacja - + Magiczne przedmioty nie zostały załadowane. - + MAL użytkownika {0} - + Właściciel bota nie sprecyzował MashapeApiKey. Nie możesz użyć tej funkcji. - + Min/Max - + Nie znaleziono kanału. - + Brak rezultatów. - + Oryginalny URL @@ -1781,7 +1820,7 @@ Reden: {1} - + Znaleziono {0} obrazków. Pokazuję przypadkowe {0} @@ -1790,16 +1829,16 @@ Reden: {1} - + Platforma - + Pokemon nieznaleziony - + Link profilowy: @@ -1811,28 +1850,28 @@ Reden: {1} - + Ocena - + Wynik: - + Szukaj: - + Skracanie tego url'u nie powiodło się - + Skróć url - + Coś poszło nie tak. - + Status @@ -1862,22 +1901,22 @@ Reden: {1} - + Wschód słońca - + Zachód słońca - + Temperatura - + Tytuł: - + 3 ulubione anime: - + Tłumaczenie: @@ -1886,10 +1925,10 @@ Reden: {1} - + Url - + Widzowie: @@ -1901,19 +1940,19 @@ Reden: {1} - + Strona nie została znaleziona. - + Szybkość wiatru - + Problem z napisaniem Twojego zdania w stylu Yody - + Dołączył @@ -1927,10 +1966,10 @@ Reden: {1} - + Autor - + ID bota @@ -1939,7 +1978,7 @@ Reden: {1} - + Temat kanału @@ -1957,7 +1996,7 @@ Reden: {1} - + Stworzono w @@ -1969,16 +2008,16 @@ Reden: {1} - + Niestandardowe emotikony - + Błąd - + Funkcje - + ID @@ -1994,40 +2033,42 @@ Reden: {1} Invalid months value/ Invalid hours value - + Dołączył do Discorda - + Dołączył do serwera - + ID: {0} +Członkowie: {1} +ID właściciela: {2} - + Nie znaleziono serwerów na tej stronie. - + Członkowie - + Pamięć - + Wiadomości - + Imię - + Pseudonim - + Nikt nie gra w tą grę. @@ -2042,16 +2083,18 @@ Reden: {1} - + Właściciel - + ID właściciela - + {0} serwerów +{1} kanałów głosowych +{2} kanałów tekstowych @@ -2072,7 +2115,7 @@ Reden: {1} - + Region @@ -2087,7 +2130,7 @@ Reden: {1} - + Powtarzanie {0} co {1} dni, {2} godzin i {3} minut. @@ -2096,16 +2139,16 @@ Reden: {1} - + #{0} zatrzymany. - + Wynik - + Role @@ -2114,19 +2157,19 @@ Reden: {1} - + Kolory zostały podane w niepoprawnej formie. Użyj np. `#00ff00` - + Zaczęto zmienianie kolorów dla roli {0} - + Zakończono zmienianie kolorów dla roli {0} - + Informacje o serwerze @@ -2141,13 +2184,13 @@ Reden: {1} - + Nie znaleziono żadnych specjalnych emotikon - + Kanały głosowe @@ -2160,9 +2203,103 @@ Reden: {1} Id of the user kwoth#1234 is 123123123123 - + Użytkownicy + Kanały głosowe + + + Już dołączyłeś do tego wyścigu! + + + + + + + + + + + + + + + `{0}.` {1} z {2} głosami. + + + {0} głosów. + Kwoth voted. + + + + + + + + + + + + + + + + + + + + + + + + + + + Musisz znajdować się w kanale głosowym na tym serwerze. + + + + + + {0} został **wyciszony** w kanałach tekstowych oraz głosowych na {1} minut. + + + Użytkownicy którzy dołączą do kanału głosowego {0} , otrzymają rolę {1}. + + + + + + Uprawnienia kanału głosowego + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/NadekoBot/Resources/ResponseStrings.pt-BR.resx b/src/NadekoBot/Resources/ResponseStrings.pt-BR.resx index bac83942..1fa1070b 100644 --- a/src/NadekoBot/Resources/ResponseStrings.pt-BR.resx +++ b/src/NadekoBot/Resources/ResponseStrings.pt-BR.resx @@ -140,6 +140,7 @@ O pedido de guerra de @{0} contra {1} expirou. + Fuzzy Inimigo @@ -153,9 +154,11 @@ Não é um tamanho de guerra válido. + Fuzzy Lista de guerras ativas + Fuzzy não reivindicado @@ -168,6 +171,7 @@ Nenhuma guerra ativa. + Fuzzy Tamanho @@ -207,6 +211,7 @@ Nenhuma reação personalizada encontrada. + Fuzzy Nenhuma reação personalizada encontrada com este id. @@ -279,7 +284,7 @@ Você reviveu a si mesmo com uma {0} - Seu tipo foi mudado de {0} para {1} + Seu tipo foi mudado para {0} por uma {1} É mais ou menos efetivo. @@ -469,10 +474,12 @@ Razão: {1} Usuário Kickado + Fuzzy Lista de Linguagens {0} + Fuzzy A região do seu servidor agora é {0} - {1} @@ -530,9 +537,11 @@ Razão: {1} Mensagem deletada em #{0} + Fuzzy Mensagem atualizada em #{0} + Fuzzy Mutados @@ -553,15 +562,19 @@ Razão: {1} Nova mensagem + Fuzzy Novo Apelido + Fuzzy Novo Tópico + Fuzzy Apelido Alterado + Fuzzy Não posso encontrar esse servidor @@ -571,12 +584,15 @@ Razão: {1} Mensagem Antiga + Fuzzy Apelido Antigo + Fuzzy Tópico Antigo + Fuzzy Erro. Não tenho permissões suficientes. @@ -586,6 +602,7 @@ Razão: {1} Proteções ativadas + Fuzzy {0} foi **desativado** neste servidor. @@ -598,6 +615,7 @@ Razão: {1} Nenhuma proteção ativa. + Fuzzy O limite de usuários deve ser entre {0} e {1}. @@ -758,9 +776,11 @@ __Canais Ignorados__: {2} Canal de Texto Criado + Fuzzy Canal de Texto Destruído + Fuzzy Desensurdecido com sucesso. @@ -774,12 +794,14 @@ __Canais Ignorados__: {2} Nome de usuário alterado + Fuzzy Usuários Usuário Banido + Fuzzy {0} foi **mutado** @@ -789,18 +811,22 @@ __Canais Ignorados__: {2} Usuário juntou-se + Fuzzy Usuário saiu + Fuzzy {0} foi **mutado** nos chats de voz e texto. Cargo do usuário adicionado + Fuzzy Cargo do usuário removido + Fuzzy {0} agora está {1} @@ -825,9 +851,11 @@ __Canais Ignorados__: {2} Canal de voz criado + Fuzzy Canal de voz destruído + Fuzzy Atributo voz + texto desabilitado. @@ -859,6 +887,7 @@ Motivo: {1} Usuário desbanido + Fuzzy Migração concluída! @@ -868,9 +897,11 @@ Motivo: {1} Atualizações de Presença + Fuzzy Usuário Banido Temporariamente + Fuzzy concedeu {0} para {1} @@ -889,7 +920,7 @@ Motivo: {1} User flipped tails. - Você Adivinhou! Você ganhou {0} + Você adivinhou! Você ganhou {0} O número especificado é inválido. Você pode girar de 1 a {0} moedas. @@ -913,6 +944,7 @@ Motivo: {1} Cara + Fuzzy Placar de Líderes @@ -934,6 +966,7 @@ Motivo: {1} Usuário sorteado + Fuzzy Você rolou {0}. @@ -968,6 +1001,7 @@ Dura {1} segundos. Não diga a ninguém. Shhh. Coroa + Fuzzy Tomou {0} de {1} com sucesso @@ -980,6 +1014,7 @@ Dura {1} segundos. Não diga a ninguém. Shhh. Proprietário do bot apenas. + Fuzzy Requer a permissão {0} do canal. @@ -989,9 +1024,11 @@ Dura {1} segundos. Não diga a ninguém. Shhh. Comandos e abreviações + Fuzzy Lista de Comandos Regenerada. + Fuzzy Digite `{0}h NomeDoComando` para ver a ajuda para o comando especificado. Ex: `{0}h >8ball` @@ -1012,12 +1049,15 @@ Não esqueça de deixar seu nome ou id do discord na mensagem. **Lista de Comandos**. <{0}> **Guias de hosteamento e documentos podem ser encontrados aqui**. <{1}> + Fuzzy Lista de Comandos + Fuzzy Lista de Módulos + Fuzzy Digite `{0}cmds NomeDoMódulo` para receber uma lista de comandos deste módulo. Ex: `{0}cmds games` @@ -1030,6 +1070,7 @@ Não esqueça de deixar seu nome ou id do discord na mensagem. Tabela de Conteúdo + Fuzzy Modo de uso @@ -1043,6 +1084,7 @@ Não esqueça de deixar seu nome ou id do discord na mensagem. Corrida de Animais + Fuzzy Falha ao iniciar, não houve participantes suficientes. @@ -1093,9 +1135,11 @@ Não esqueça de deixar seu nome ou id do discord na mensagem. Mudanças no Coração + Fuzzy Reivindicado por + Fuzzy Divórcios @@ -1215,6 +1259,7 @@ O novo valor de {0} é {1}! Submissões Encerradas + Fuzzy A Corrida de Animais já está em andamento @@ -1239,16 +1284,19 @@ O novo valor de {0} é {1}! {0} {1} aleatórios aparecem! Capture-os digitando `{2}pick` - plural + plural +Fuzzy Um {0} aleatório apareceu! Capture-o digitando `{1}pick` + Fuzzy Falha ao carregar a questão. Jogo Iniciado + Fuzzy Jogo da Forca iniciado @@ -1317,15 +1365,18 @@ O novo valor de {0} é {1}! {0} venceu! + Fuzzy Combinou três + Fuzzy Nenhum movimento restante! Tempo Esgotado! + Fuzzy É a vez de {0} @@ -1353,6 +1404,7 @@ O novo valor de {0} é {1}! Música concluída. + Fuzzy Fair play desativado. @@ -1389,6 +1441,7 @@ O novo valor de {0} é {1}! Tocando agora + Fuzzy Nenhum player de música ativo. @@ -1401,15 +1454,18 @@ O novo valor de {0} é {1}! Fila de Músicas - Página {0}/{1} + Fuzzy Tocando Musica + Fuzzy `#{0}` - **{1}** by *{2}* ({3} músicas) Página {0} de Playlists Salvas + Fuzzy Playlist deletada. @@ -1425,6 +1481,7 @@ O novo valor de {0} é {1}! Playlist Salva + Fuzzy Limite de {0}s @@ -1434,6 +1491,7 @@ O novo valor de {0} é {1}! Músicas em fila + Fuzzy Fila de músicas limpa. @@ -1447,12 +1505,15 @@ O novo valor de {0} é {1}! Repetindo a Música Atual + Fuzzy Repetindo Playlist + Fuzzy Repetindo Faixa + Fuzzy A repetição da faixa atual parou. @@ -1474,9 +1535,11 @@ O novo valor de {0} é {1}! Músicas embaralhadas. + Fuzzy Música movida + Fuzzy {0}h {1}m {2}s @@ -1495,18 +1558,22 @@ O novo valor de {0} é {1}! O uso de TODOS OS MÓDULOS foi desabilitado no canal {0}. + Fuzzy O uso de TODOS OS MÓDULOS foi habilitado no canal {0}. + Fuzzy Permitido O uso de TODOS OS MÓDULOS foi desabilitado para o cargo {0}. + Fuzzy O uso de TODOS OS MÓDULOS foi habilitado para o cargo {0}. + Fuzzy O uso de TODOS OS MÓDULOS foi desabilitado neste servidor. @@ -1516,9 +1583,11 @@ O novo valor de {0} é {1}! O uso de TODOS OS MÓDULOS foi desabilitado para o usuário {0}. + Fuzzy O uso de TODOS OS MÓDULOS foi habilitado para o usuário {0}. + Fuzzy {0} entrou na Lista Negra com o ID {1} @@ -1528,18 +1597,22 @@ O novo valor de {0} é {1}! O comando {0} não possui nenhum cooldown agora e todos os cooldowns existentes foram limpos. + Fuzzy Nenhum cooldown de comando definido. Custos de Comando + Fuzzy Desabilitado o uso de {0} {1} no canal {2}. + Fuzzy Habilitado o uso de {0} {1} no canal {2}. + Fuzzy Negado @@ -1549,6 +1622,7 @@ O novo valor de {0} é {1}! Lista de Palavras Filtradas + Fuzzy A palavra {0} foi removida da lista de palavras filtradas. @@ -1685,12 +1759,15 @@ O novo valor de {0} é {1}! Derrotas Competitivas + Fuzzy Partidas Competitivas jogadas + Fuzzy Rank Competitivo + Fuzzy Vitórias Competitivas @@ -1744,7 +1821,8 @@ O novo valor de {0} é {1}! Humidade - Busca de Imagens para: + Busca de imagem para: + Fuzzy Falha ao encontrar este filme. @@ -1788,9 +1866,11 @@ O novo valor de {0} é {1}! Em espera + Fuzzy Url Original + Fuzzy Requer uma API key de osu! @@ -1818,15 +1898,18 @@ O novo valor de {0} é {1}! Link do Perfil: + Fuzzy Qualidade: Tempo em Partida Rápida + Fuzzy Vitórias em Partida Rápida + Fuzzy Avaliação @@ -1836,12 +1919,14 @@ O novo valor de {0} é {1}! Busca Por: + Fuzzy Falha ao encurtar esse url. Url Curta + Fuzzy Alguma coisa deu errado. @@ -1854,6 +1939,7 @@ O novo valor de {0} é {1}! Url da Loja + Fuzzy Streamer {0} está offline. @@ -1923,6 +2009,7 @@ O novo valor de {0} é {1}! Velocidade do Vento + Fuzzy Os {0} campeões mais banidos @@ -1940,6 +2027,7 @@ O novo valor de {0} é {1}! Página de Atividade #{0} + Fuzzy {0} usuários no total. @@ -1958,9 +2046,11 @@ O novo valor de {0} é {1}! Tópico do Canal + Fuzzy Comandos Utilizados + Fuzzy {0} {1} é igual a {2} {3} @@ -1976,6 +2066,7 @@ O novo valor de {0} é {1}! Criado em + Fuzzy Juntou-se ao canal de servidor cruzado. @@ -1988,6 +2079,7 @@ O novo valor de {0} é {1}! Emojis Personalizados + Fuzzy Erro @@ -2003,9 +2095,11 @@ O novo valor de {0} é {1}! Aqui está uma lista de usuários nestes cargos: + Fuzzy você não tem permissão de usar esse comando em cargos com muitos usuários para prevenir abuso. + Fuzzy Valor {0} inválido. @@ -2016,17 +2110,20 @@ O novo valor de {0} é {1}! Juntou-se ao Servidor + Fuzzy ID: {0} Membros: {1} OwnerID: {2} + Fuzzy Nenhum servidor encontrado nessa página. Lista de Repetidores + Fuzzy Membros @@ -2039,6 +2136,7 @@ OwnerID: {2} Repetidor de Mensagem + Fuzzy Nome @@ -2092,12 +2190,14 @@ OwnerID: {2} Uma citação aleatória foi removida. + Fuzzy Região Registrado em + Fuzzy Eu lembrarei {0} de {1} em {2} `({3:d.M.yyyy.} at {4:HH:mm})` @@ -2113,6 +2213,7 @@ OwnerID: {2} Lista de Repetidores + Fuzzy Nenhum repetidor neste servidor. @@ -2149,12 +2250,14 @@ OwnerID: {2} Informações do Servidor + Fuzzy Shard Status do Shard + Fuzzy Shard **#{0}** está no estado {1} com {2} servidores @@ -2170,6 +2273,7 @@ OwnerID: {2} Canais de Texto + Fuzzy Aqui está o link da sala: @@ -2186,6 +2290,101 @@ OwnerID: {2} Canais de Voz + Fuzzy + + + Você já entrou nesta corrida! + + + Resultado atual da votação + + + Nenhum voto proferido. + + + Uma votação já está ocorrendo neste servidor. + + + 📃 {0} criou uma votação que requer sua atenção: + + + `{0}.` {1} com {2} votos. + + + {0} votou. + Kwoth voted. + + + Mande uma Mensagem Direta para mim com o número que corresponde à resposta. + + + Mande uma Mensagem aqui com o número que corresponde à resposta. + + + Obrigado por votar, {0} + + + Total de {0} votos proferidos. + + + Pegue digitando `{0}pick` + + + Pegue digitando `{0}pick` + + + Nenhum usuário encontrado. + + + Página {0} + + + Você deve estar em um canal de voz neste servidor. + + + Não há cargos de canais de voz. + + + {0} foi **mutado** nos chats de texto e voz por {1} minutos. + + + Usuários que entrarem no canal de voz {0} receberão o cargo {1}. + + + Usuários que entrarem no canal de voz {0} não irão mais receber um cargo. + + + Cargos de canais de voz + + + A mensagem que ativa a reação personalizada com id {0} não será deletada automaticamente. + + + A mensagem que ativa a reação personalizada com id {0} será deletada automaticamente. + + + A resposta para a reação personalizada com o id {0} não será enviada como mensagem direta. + + + A resposta para a reação personalizada com o id {0} será enviada como mensagem direta. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.resx b/src/NadekoBot/Resources/ResponseStrings.resx index c89a5084..56ada3ed 100644 --- a/src/NadekoBot/Resources/ResponseStrings.resx +++ b/src/NadekoBot/Resources/ResponseStrings.resx @@ -139,7 +139,7 @@ @{0} You already claimed base #{1}. You can't claim a new one. - Claim from @{0} for a war against {1} has expired. + Claim from @{0} in a war against {1} has expired. Enemy @@ -151,10 +151,10 @@ Invalid base number. - Not a Valid war size. + Not a valid war size. - List Of Active Wars + List of active wars not claimed @@ -166,7 +166,7 @@ @{0} You are either not participating in that war, or that base is already destroyed. - No active wars. + No active war. Size @@ -205,7 +205,7 @@ New Custom Reaction - No custom reactions found. + No custom reaction found. No custom reaction found with that id. @@ -467,11 +467,10 @@ Reason: {1} Reason: {1} - User Kicked + User kicked - List Of Languages -{0} + List of languages Your server's locale is now {0} - {1} @@ -528,10 +527,10 @@ Reason: {1} {0} moved from {1} to {2} - Message Deleted in #{0} + Message deleted in #{0} - Message Updated in #{0} + Message updated in #{0} Muted @@ -551,16 +550,16 @@ Reason: {1} I need **Administration** permission to do that. - New Message + New message - New Nickname + New nickname - New Topic + New topic - Nickname Changed + Nickname changed Can't find that server @@ -569,13 +568,13 @@ Reason: {1} No shard with that ID found. - Old Message + Old message - Old Nickname + Old nickname - Old Topic + Old topic Error. Most likely I don't have sufficient permissions. @@ -584,7 +583,7 @@ Reason: {1} Permissions for this server are reset. - Active Protections + Active protections {0} has been **disabled** on this server. @@ -596,7 +595,7 @@ Reason: {1} Error. I need ManageRoles permission - No protections enabled. + No protection enabled. User threshold must be between {0} and {1}. @@ -755,10 +754,10 @@ Reason: {1} __IgnoredChannels__: {2} - Text Channel Created + Text channel created. - Text Channel Destroyed + Text channel destroyed. Undeafen successful. @@ -771,13 +770,13 @@ Reason: {1} Username - Username Changed + Username changed Users - User Banned + User banned {0} has been **muted** from chatting. @@ -786,19 +785,19 @@ Reason: {1} {0} has been **unmuted** from chatting. - User Joined + User joined - User Left + User left {0} has been **muted** from text and voice chat. - User's Role Added + User's role added - User's Role Removed + User's role removed {0} is now {1} @@ -822,10 +821,10 @@ Reason: {1} {0} has been **voice unmuted**. - Voice Channel Created + Voice channel created - Voice Channel Destroyed + Voice channel destroyed Disabled voice + text feature. @@ -856,7 +855,7 @@ Reason: {1} Reason: {1} - User Unbanned + User unbanned Migration done! @@ -865,10 +864,10 @@ Reason: {1} Error while migrating, check bot's console for more information. - Presence Updates + Presence updates - User Soft-Banned + User soft-banned has awarded {0} to {1} @@ -910,7 +909,7 @@ Reason: {1} X has Y flowers - Heads + Head Leaderboard @@ -931,7 +930,7 @@ Reason: {1} No more cards in the deck. - Raffled User + Raffled user You rolled {0}. @@ -965,7 +964,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. SneakyGameStatus event started - Tails + Tail successfully took {0} from {1} @@ -977,7 +976,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Back to ToC - Bot Owner Only + Bot owner only Requires {0} channel permission. @@ -986,10 +985,10 @@ Lasts {1} seconds. Don't tell anyone. Shhh. You can support the project on patreon: <{0}> or paypal: <{1}> - Command and aliases + Commands and aliases - Commandlist Regenerated. + Commandlist regenerated. Type `{0}h CommandName` to see the help for that specified command. e.g. `{0}h >8ball` @@ -1009,14 +1008,14 @@ Don't forget to leave your discord name or id in the message. **Thank you** ♥️ - **List of Commands**: <{0}> -**Hosting Guides and docs can be found here**: <{1}> + **List of commands**: <{0}> +**Hosting guides and docs can be found here**: <{1}> - List Of Commands + List of commands - List Of Modules + List of modules Type `{0}cmds ModuleName` to get a list of commands in that module. eg `{0}cmds games` @@ -1028,7 +1027,7 @@ Don't forget to leave your discord name or id in the message. Requires {0} server permission. - Table Of Contents + Table of contents Usage @@ -1041,7 +1040,7 @@ Don't forget to leave your discord name or id in the message. Tag - Animal Race + Animal race Failed to start since there was not enough participants. @@ -1091,10 +1090,10 @@ Don't forget to leave your discord name or id in the message. Second number must be larger than the first one. - Changes Of Heart + Changes of heart - Claimed By + Claimed by Divorces @@ -1213,11 +1212,14 @@ Don't forget to leave your discord name or id in the message. {0} won! {1} beats {2} - Submissions Closed + Submissions closed Animal Race is already running. + + You've already joined this race! + Total: {0} Average: {1} @@ -1237,17 +1239,17 @@ Don't forget to leave your discord name or id in the message. Currency generation has been enabled on this channel. - {0} random {1} appeared! Pick them up by typing `{2}pick` + {0} random {1} appeared! plural - A random {0} appeared! Pick it up by typing `{1}pick` + A random {0} appeared! Failed loading a question. - Game Started + Game started Hangman game started @@ -1315,16 +1317,16 @@ Don't forget to leave your discord name or id in the message. has created a game of TicTacToe. - {0} has Won! + {0} has won! - Matched Three + Matched three No moves left! - Time Expired! + Time expired! {0}'s move @@ -1351,7 +1353,7 @@ Don't forget to leave your discord name or id in the message. fairplay - Finished Song + Finished song Fair play disabled. @@ -1387,7 +1389,7 @@ Don't forget to leave your discord name or id in the message. Name - Now Playing + Now playing No active music player. @@ -1399,16 +1401,16 @@ Don't forget to leave your discord name or id in the message. Music playback paused. - Player Queue - Page {0}/{1} + Player queue - Page {0}/{1} - Playing Song + Playing song `#{0}` - **{1}** by *{2}* ({3} songs) - Page {0} of Saved Playlists + Page {0} of saved playlists Playlist deleted. @@ -1423,7 +1425,7 @@ Don't forget to leave your discord name or id in the message. Playlist queue complete. - Playlist Saved + Playlist saved {0}s limit @@ -1432,7 +1434,7 @@ Don't forget to leave your discord name or id in the message. Queue - Queued Song + Queued song Music queue cleared. @@ -1445,13 +1447,13 @@ Don't forget to leave your discord name or id in the message. context: "removed song #5" - Repeating Current Song + Repeating current song - Repeating Playlist + Repeating playlist - Repeating Track + Repeating track Current track repeat stopped. @@ -1472,10 +1474,10 @@ Don't forget to leave your discord name or id in the message. Skipped to `{0}:{1}` - Songs shuffled. + Songs shuffled - Song Moved + Song moved {0}h {1}m {2}s @@ -1493,19 +1495,19 @@ Don't forget to leave your discord name or id in the message. Volume set to {0}% - Disabled usage of ALL MODULES on {0} channel. + Disabled usage of ALL MODULES on channel {0}. - Enabled usage of ALL MODULES on {0} channel. + Enabled usage of ALL MODULES on channel {0}. Allowed - Disabled usage of ALL MODULES for {0} role. + Disabled usage of ALL MODULES for role {0}. - Enabled usage of ALL MODULES for {0} role. + Enabled usage of ALL MODULES for role {0}. Disabled usage of ALL MODULES on this server. @@ -1514,10 +1516,10 @@ Don't forget to leave your discord name or id in the message. Enabled usage of ALL MODULES on this server. - Disabled usage of ALL MODULES for {0} user. + Disabled usage of ALL MODULES for user {0}. - Enabled usage of ALL MODULES for {0} user. + Enabled usage of ALL MODULES for user {0}. Blacklisted {0} with ID {1} @@ -1526,19 +1528,19 @@ Don't forget to leave your discord name or id in the message. Command {0} now has a {1}s cooldown. - Command {0} has no coooldown now and all existing cooldowns have been cleared. + Command {0} has no cooldown now and all existing cooldowns have been cleared. No command cooldowns set. - Command Costs + Command costs - Disabled usage of {0} {1} on {2} channel. + Disabled usage of {0} {1} on channel {2}. - Enabled usage of {0} {1} on {2} channel. + Enabled usage of {0} {1} on channel {2}. Denied @@ -1547,7 +1549,7 @@ Don't forget to leave your discord name or id in the message. Added word {0} to the list of filtered words. - List Of Filtered Words + List of filtered words Removed word {0} from the list of filtered words. @@ -1578,7 +1580,7 @@ Don't forget to leave your discord name or id in the message. command - Gen (of command) + Gen. (of command) module @@ -1682,13 +1684,13 @@ Don't forget to leave your discord name or id in the message. Comic # - Competitive Loses + Competitive losses - Competitive Played + Competitive played - Competitive Rank + Competitive rank Competitive Wins @@ -1742,7 +1744,7 @@ Don't forget to leave your discord name or id in the message. Humidity - Image Search For: + Image search for: Failed to find that movie. @@ -1785,10 +1787,10 @@ Don't forget to leave your discord name or id in the message. No results found. - On-Hold + On-hold - Original Url + Original url An osu! API key is required. @@ -1815,16 +1817,16 @@ Don't forget to leave your discord name or id in the message. No pokemon found. - Profile Link: + Profile link: Quality: - Quick Playtime + Quick playtime - Quick Wins + Quick wins Rating @@ -1833,13 +1835,13 @@ Don't forget to leave your discord name or id in the message. Score: - Search For: + Search for: Failed to shorten that url. - Short Url + Short url Something went wrong. @@ -1851,7 +1853,7 @@ Don't forget to leave your discord name or id in the message. Status - Store Url + Store url Streamer {0} is offline. @@ -1920,7 +1922,7 @@ Don't forget to leave your discord name or id in the message. Page not found. - Wind Speed + Wind speed The {0} most banned champions @@ -1937,7 +1939,7 @@ Don't forget to leave your discord name or id in the message. `1.` - Activity Page #{0} + Activity page #{0} {0} users total. @@ -1955,10 +1957,10 @@ Don't forget to leave your discord name or id in the message. {0} of this channel is {1} - Channel Topic + Channel topic - Commands Ran + Commands ran {0} {1} is equal to {2} {3} @@ -1973,7 +1975,7 @@ Don't forget to leave your discord name or id in the message. Cannot convert {0} to {1}: types of unit are not equal - Created At + Created at Joined cross server channel. @@ -1985,7 +1987,7 @@ Don't forget to leave your discord name or id in the message. This is your CSC token - Custom Emojis + Custom emojis Error @@ -2000,10 +2002,10 @@ Don't forget to leave your discord name or id in the message. Index out of range. - Here is a list of users in those roles: + List of users in {0} role - you are not allowed to use this command on roles with a lot of users in them to prevent abuse. + You are not allowed to use this command on roles with a lot of users in them to prevent abuse. Invalid {0} value. @@ -2013,18 +2015,18 @@ Don't forget to leave your discord name or id in the message. Joined Discord - Joined Server + Joined server ID: {0} Members: {1} -OwnerID: {2} +Owner ID: {2} No servers found on that page. - List of Repeaters + List of repeater Members @@ -2036,7 +2038,7 @@ OwnerID: {2} Messages - Message Repeater + Message repeater Name @@ -2089,13 +2091,13 @@ OwnerID: {2} Quote Added - Deleted a random quote. + Quote #{0} deleted. Region - Registered On + Registered on I will remind {0} to {1} in {2} `({3:d.M.yyyy.} at {4:HH:mm})` @@ -2110,7 +2112,7 @@ OwnerID: {2} Repeating {0} every {1} day(s), {2} hour(s) and {3} minute(s). - List Of Repeaters + List of repeaters No repeaters running on this server. @@ -2146,13 +2148,13 @@ OwnerID: {2} {0} of this server is {1} - Server Info + Server info Shard - Shard Stats + Shard stats Shard **#{0}** is in {1} state with {2} servers @@ -2167,7 +2169,7 @@ OwnerID: {2} Playing {0} songs, {1} queued. - Text Channels + Text channels Here is your room link: @@ -2183,6 +2185,97 @@ OwnerID: {2} Users - Voice Channels + Voice channels + + + Current poll results + + + No votes cast. + + + Poll is already running on this server. + + + 📃 {0} has created a poll which requires your attention: + + + `{0}.` {1} with {2} votes. + + + {0} voted. + Kwoth voted. + + + Private Message me with the corresponding number of the answer. + + + Send a Message here with the corresponding number of the answer. + + + Thank you for voting, {0} + + + {0} total votes cast. + + + Pick them up by typing `{0}pick` + + + Pick it up by typing `{0}pick` + + + No user found. + + + page {0} + + + You must be in a voice channel on this server. + + + There are no voice channel roles. + + + {0} has been **muted** from text and voice chat for {1} minutes. + + + Users who join {0} voice channel will get {1} role. + + + Users who join {0} voice channel will no longer get a role. + + + Voice channel roles + + + Message triggering the custom reaction with id {0} won't get automatically deleted. + + + Message triggering the custom reaction with id {0} will get automatically deleted. + + + Response message for the custom reaction with id {0} won't be sent as a DM. + + + Response message for the custom reaction with id {0} will be sent as a DM. + + + No alias found + + + Typing {0} will now be an alias of {1}. + + + List of aliases + + + Trigger {0} no longer has an alias. + + + Trigger {0} didn't have an alias. + + + Competitive playtime \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.ru-RU.resx b/src/NadekoBot/Resources/ResponseStrings.ru-RU.resx index 12a8b4d2..250cb254 100644 --- a/src/NadekoBot/Resources/ResponseStrings.ru-RU.resx +++ b/src/NadekoBot/Resources/ResponseStrings.ru-RU.resx @@ -139,7 +139,7 @@ @{0} Вы уже захватили базу #{1}. Вы не можете захватить новую базу. - Время действия запроса от @{0} на войну против {1} истёкло. + Время действия запроса от @{0} на войну против {1} истекло. Враг @@ -163,7 +163,7 @@ Вы не участвуете в этой войне. - @{0} Вы либо не участвуете в этой войне, либо эта база разрушена. + @{0} Вы либо не участвуете в этой войне, либо эта база уже разрушена. Нет активных войн. @@ -175,13 +175,13 @@ Война против {0} уже началась. - Война против {0} была начата. + Война против {0} начата. - Закончилась война против {0}. + Война против {0} закончилась. - Эта война не существует. + Этой войны не существует. Война против {0} началась! @@ -193,7 +193,7 @@ Настраиваемая реакция удалена - Недостаточно прав. Необходимо владеть Бот-ом для глобальных настраиваемых реакций или быть Администратором для реакций по серверу. + Недостаточно прав. Необходимо иметь права владельца бота для глобальных настраиваемых реакций, и права Администратора для реакций по серверу. Список всех настраиваемых реакций @@ -217,7 +217,7 @@ Статистика настраеваемых реакций - Статистика удалена для настраеваемой реакции {0}. + Статистика для настраиваемой реакции {0} очищена. Не найдено статистики для этого активатора, никаких действий не применено. @@ -226,10 +226,10 @@ Активатор - Авто-хентай остановлен :( + Авто-хентай остановлен. - Запрос не найден. + Результатов не найдено. {0} уже потерял сознание. @@ -245,10 +245,10 @@ Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. - Нельзя атаковать два раза подряд. + Вы не можете атаковать два раза подряд. - Нельзя атаковать самого себя. + Вы не можете атаковать самого себя. {0} потерял сознание! @@ -266,10 +266,10 @@ Список приёмов {0} типа - Эта атака не эффективна. + Эта атака неэффективна. - У вас не достаточно {0} + У вас недостаточно {0} воскресил {0}, использовав один {1} @@ -287,7 +287,7 @@ Эта атака очень эффективна! - Вы использовали слишком много приёмов подряд и не можете двигаться! + Вы использовали слишком много приёмов подряд, поэтому вы не можете двигаться! Тип {0} — {1} @@ -296,7 +296,7 @@ Пользователь не найден. - Вы не можете использовать приёмы потому-что ваш покемон потерял сознание! + Вы потеряли сознание, поэтому вы не можете двигаться! ***Авто выдача роли*** каждому новому пользователю **отключена** @@ -305,13 +305,13 @@ ***Авто выдача роли*** каждому новому пользователю **включена** - Приложения + Вложения Аватар изменён - Вас забанили с сервера {0}. Причина бана: {1}. + Вы были забанены на сервере {0}. Причина бана: {1}. забанены @@ -321,10 +321,10 @@ Пользователь забанен. - Имя Бот-а сменено на {0} + Имя бота изменено на {0} - Статус Бот-а сменён на {0} + Статус бота изменен на {0} Автоматическое удаление прощальных сообщений отключено. @@ -339,7 +339,7 @@ Чтобы включить прощальные сообщения введите {0} - Установлено новое прощальное сообщение. + Новое прощальное сообщение было установлено. Прощальные сообщения выключены. @@ -348,13 +348,13 @@ Прощальные сообщения включены на этом канале. - Имя канал изменено. + Имя канала изменено Старое имя. - Тема канала сменена. + Тема канала изменена Чат очищен. @@ -363,13 +363,13 @@ Содержание - Успешно создана роль {0}. + Роль {0} создана успешно - Создан текстовый канал {0}. + Текстовый канал {0} создан. - Создан голосовой канал {0}. + Голосовой канал {0} создан. Успешное оглушение. @@ -381,22 +381,22 @@ Отключено автоматическое удаление успешно выполненных команд. - Включено автоматическое удаление успешно выполненных команд. + Включено автоматическое удаление сообщений для успешно выполненных команд. - Удалён текстовый канал {0}. + Текстовый канал {0} удален. - Удален голосовой канал {0}. + Голосовой канал {0} удален. - ПМ от + ЛС от Успешно добавлен новый донатор. Общее количество пожертвований от этого пользователя: {0} 👑 - Спасибо всем, указанным ниже, что помогли этому проекту! + Спасибо ниже перечисленным людям за помощь в развитии этого проекта! Я буду перенаправлять личные сообщения всем владельцам. @@ -405,10 +405,10 @@ Я буду перенаправлять личные сообщения только первому владельцу. - Я буду перенаправлять личные сообщения. + Теперь я буду перенаправлять ЛС. - Я прекращаю перенаправление личных сообщений. + Теперь я прекращу перенаправлять ЛС. Автоматическое удаление приветственных сообщений выключено. @@ -417,10 +417,10 @@ Приветственные сообщения будут удаляться через {0} секунд. - Приветственное ЛС, используемое в настоящий момент: {0} + Текущее приветственное ЛС: {0} - Чтобы включить приветственное ЛС, напишите {0} + Включите приветственные ЛС, написав {0} Новое приветственное ЛС установлено. @@ -432,19 +432,19 @@ Приветственные ЛС включены. - Текущее привественное сообщение: {0} + Текущее приветственное сообщение: {0} - Чтобы включить привественные сообщения введите {0} + Чтобы включить приветственные сообщения введите {0} - Установлено новое приветствие. + Новое приветственное сообщение установлено. - Привественные сообщения выключены. + Приветственные сообщения выключены. - Привественные сообщения включены на этом канале. + Приветственные сообщения включены на этом канале. Вы не можете использовать эту команду на пользователях равным или более высоким в иерархии ролей. @@ -463,29 +463,28 @@ Вы были выгнаны с сервера {0}. -По причине: {1} +Причина: {1} Пользователь выгнан - Список языков -{0} + Список языков Язык вашего сервера теперь {0} - {1} - Язык Бот-а по умолчанию теперь {0} - {1} + Язык бота по умолчанию теперь {0} - {1} - Язык Бот-а теперь установлен как {0} - {1} + Язык бота установлен как {0} - {1} Не удалось выставить язык. Проверьте справку к этой команде. - Язык этого сервера теперь установлен как {00} - {1} + Язык этого сервера установлен как {0} - {1} {0} покинул {1} @@ -506,10 +505,10 @@ Регистрируйте события, на которые Вы можете подписаться: - Регистрация будет пропускать {0}. + Регистрация будет игнорировать {0}. - Регистрация не будет пропускать {0}. + Регистрация не будет игнорировать {0}. Прекращена регистрация события {0}. @@ -541,7 +540,7 @@ singular "User muted." - Скорее всего, у меня нет необходимых прав. + Похоже, у меня нет необходимых прав. Новая роль заглушения установлена. @@ -562,7 +561,7 @@ Имя изменено - Сервер не найден + Не могу найти этот сервер Не найдено Shard-а с таким ID. @@ -580,7 +579,7 @@ Ошибка. Скорее всего мне не хватает прав. - Права для этого сервера + Права для этого сервера были сброшены. Активные защиты от рейдов @@ -589,13 +588,13 @@ {0} был **отключён** на этом сервере. - {0} влючён + {0} включен Ошибка. Требуется право на управление ролями. - Нет защит от рейдов + Защита от рейдов отключена. Порог пользователей должен лежать между {0} и {1}. @@ -607,7 +606,8 @@ Время должно быть между {0} и {1} секунд. - Успешно убраны все роли пользователя {0}. + Все роли пользователя {0} были успешно убраны с него + Fuzzy Не удалось убрать роли. Отсутвуют требуемые разрешения. @@ -641,12 +641,13 @@ Удалено повторяющееся сообщение: {0} + Fuzzy Роль {0} добавлена в лист. - {0} не найдена. Чат очищен. + Роль {0} не найдена. Чат очищен. Роль {0} уже есть в списке. @@ -655,10 +656,10 @@ Добавлено. - Отключены чередующиеся статусы. + Чередующиеся статусы отключены. - Чередующиеся статусы отключены. + Чередующиеся статусы включены. Список чередующихся статусов: @@ -671,7 +672,8 @@ У вас уже есть роль {0} - У Вас уже есть исключающая самоназначенная роль {0}. + У Вас уже есть исключенная самоназначенная роль {0}. + Я не понял что значит "исключающая", заменил на "исключенная". Самоназначенные роли теперь взаимоисключающие! @@ -692,10 +694,10 @@ Не удалось добавить Вам эту роль. 'Нельзя добавлять роли владельцам или другим ролям, находящимся выше моей роли в ролевой иерархии' - {0} убрана из списка самоназначенных ролей. + Роль {0} убрана из списка самоназначаемых ролей. - У вас больше нету роли {0} + У вас больше нет роли {0} Теперь у вас есть роль {0} @@ -704,7 +706,7 @@ Успешно добавлена роль {0} пользователю {1} - Не удалось добавить роль. Нет достаточных разрешений. + Не удалось добавить роль. Недостаточно прав. Новый аватар установлен! @@ -716,7 +718,7 @@ Новая игра установлена! - Новый стрим установлен! + Новая трансляция установлена! Новая тема канала установлена. @@ -731,13 +733,13 @@ Выключение - Пользователи не могут посылать более {0} сообщений в {1} секунд. + Пользователи не могут писать более {0} сообщений в {1} секунд. Медленный режим выключен. - Медленный режим включен. + Медленный режим включен выгнаны @@ -753,7 +755,7 @@ Если пользователь пишет {0} одинаковых сообщений подряд, я {} их. __Игнорируемые каналы__: {2} - Создан текстовый канал + Создан текстовый канал. Уничтожен текстовый канал. @@ -763,8 +765,7 @@ Вернут звук - singular -Fuzzy + singular Имя @@ -791,7 +792,7 @@ Fuzzy Пользователь вышел - {0} получил **запрет** на разговор в текстовых и голосовых каналах + {0} получил **запрет** на разговор в текстовых и голосовых каналах. Добавлена роль пользователя @@ -812,7 +813,8 @@ Fuzzy {0} покинул голосовой канал {1}. - {0} переместил из голосового канала {1} в {2}. + {0} переместился из голосового канала {1} в {2}. + Забыли "ся" в "переместил" **Выключен микрофон** у {0}. @@ -833,10 +835,10 @@ Fuzzy Включены голосовые + текстовые функции. - Нет разрешений **Управление ролями** и/или **Управление каналами**, поэтому нельзя использовать команду 'voice+text' на сервере {0}. + Нет разрешения на **Управление ролями** и/или **Управление каналами**, поэтому нельзя использовать команду 'voice+text' на сервере {0}. - Вы пытаетесь включить/отключить это свойство и **отсутвует разрешение АДМИНИСТРАТОР**. Это может вызвать ошибки, и Вам придётся удалять текст в текстовых каналах самостоятельно. + Вы пытаетесь включить/отключить это свойство и **отсутствует разрешение АДМИНИСТРАТОР**. Это может вызвать ошибки, и вам придётся удалять текст в текстовых каналах самостоятельно. Для этого свойства требуются как минимум разрешения **управление ролями** и **управление каналами**. (Рекомендуется разрешение Администратор) @@ -908,7 +910,7 @@ Fuzzy X has Y flowers - Орёл + Решка Таблица рекордов @@ -930,6 +932,7 @@ Fuzzy Победитель лотереи + Fuzzy Вам выпало {0}. @@ -962,7 +965,7 @@ Fuzzy Началось событие SneakyGameStatus - Решка + Орёл успешно забрал {0} у {1} @@ -984,6 +987,7 @@ Fuzzy Команды и альтернативные имена команд + Fuzzy Список команд создан. @@ -1089,10 +1093,10 @@ Paypal <{1}> Смены чувств + Fuzzy Является мужем - Fuzzy Разводы @@ -1115,7 +1119,7 @@ Paypal <{1}> сменил свою предрасположенность с {0} на {1}. -*Это сомнительно с точки зрения морали* :thinking: +*Это сомнительно с моральной точки зрения* :thinking: Make sure to get the formatting right, and leave the thinking emoji @@ -1234,11 +1238,11 @@ Paypal <{1}> В этом канале включено появление валюты. - {0} случайных {1} появились! Напишите '{2}pick', чтобы собрать их. + {0} случайных {1} появились! plural - Случайный {0} появился! Напишите '{1}pick', чтобы собрать его. + Случайный {0} появился! Не удалось загрузить вопрос. @@ -1352,7 +1356,8 @@ Paypal <{1}> Отключено справедливое воспроизведение. - Fuzzy + "Честное воспроизведение" не подойдет? +Fuzzy Включено справедливое воспроизведение. @@ -1447,10 +1452,10 @@ Paypal <{1}> Повторяется текущая песня. - Повторяется плейлист. + Повторяется плейлист - Повторяется песня. + Повторяется песня Повтор текущей песни приостановлен. @@ -1471,10 +1476,10 @@ Paypal <{1}> Пропускаю до '{0}:{1}' - Песни перемешаны. + Песни перемешаны - Песня перемещена. + Песня перемещена {0}ч {1}м {2}с @@ -1526,18 +1531,19 @@ Paypal <{1}> У команды {0} больше нет времени перезарядки и все существующие времена перезадки были сброшены. + Fuzzy У команды не установлено время перезарядки. - Стоимость команды + Стоимость команд - Отключено использование {0} {1} в канале {2} + Отключено использование {0} {1} в канале {2}. - Включено использование {0} {1} в канале {2} + Включено использование {0} {1} в канале {2}. Отказано @@ -1681,10 +1687,10 @@ Paypal <{1}> Комикс # - Поражения в соревновательном режиме + Поражений в соревновательном режиме - Матчи в соревновательном режиме + Матчей в соревновательном режиме Соревновательный ранг @@ -1820,7 +1826,7 @@ Paypal <{1}> Качество: - Время игры в Быстрой Игре + Время в Быстрой игре Is this supposed to be Overwatch Quick Play stats? @@ -1851,7 +1857,7 @@ Paypal <{1}> Состояние - Url Магазина + URL Магазина Стример {0} в оффлане. @@ -1920,7 +1926,7 @@ Paypal <{1}> Страница не найдена. - Скорость ветра. + Скорость ветра {0} наиболее часто забаненных чемпионов. @@ -2000,10 +2006,10 @@ Paypal <{1}> Указатель вышел за пределы диапазона. - Список пользователей с этими ролями: + Список пользователей с ролью {0}: - Вам запрещено использовать эту комманду в отношении ролей с большим числом пользователей для предотвращения + Вам запрещено использовать эту комманду в отношении ролей с большим числом пользователей для предотвращения чрезмерного использования. Неправильное значение {0}. @@ -2036,7 +2042,7 @@ IDВладельца: {2} Сообщения - Повторяемое сообщения + Повторяемые сообщения Имя @@ -2089,7 +2095,7 @@ IDВладельца: {2} Цитата добавлена - Случайно выбранная цитата удалена. + Цитата #{0} удалена. Регион @@ -2152,7 +2158,7 @@ IDВладельца: {2} Shard - Статискика Shard-а + Статистика Shard-а Shard **#{0}** находится в состоянии {1} с {2} серверами. @@ -2185,5 +2191,105 @@ IDВладельца: {2} Голосовые каналы + + Вы уже участвуете в этой гонке! + + + Результаты опроса + + + Не получено ни одного ответа. + + + На данном сервере уже идёт опрос. + + + {0} создал опрос, требующий Вашего внимания: + + + '{0}.' У {1} {2} голосов. + + + {0} проголосовал. + Kwoth voted. + + + Отправьте сообщение в этом текстовом канале с номером, соответствующему Вашему ответу. + + + Отправьте сообщение в этом текстовом канале с номером, соответствующему Вашему ответу. + + + Спасибо за Ваш ответ, {0}. + + + Всего получено {0} ответов. + + + Напишите '{0}pick', чтобы собрать их + + + Напишите '{0}pick', чтобы собрать его + + + Пользователи не найдены. + + + Страница {0} + + + Вы должны быть в голосовом канале на этом сервере. + + + Нет ролей для голосовых каналов. + + + {0} получил **запрет** на разговор в текстовых и голосовых каналах на {1} минут. + + + Пользователи, присоединяющиеся к голосовому каналу {0}, получат роль {1}. + + + Пользователи, присоединяющиеся к голосовому каналу {0}, больше не будут получать роль. + + + Роли голосовых каналов + + + Сообщение, инициирующее настраеваемую реакцию с ИД {0}, не будет автоматически удалено. + Fuzzy + + + Сообщение, инициирующее настраеваемую реакцию с ИД {0}, будет автоматически удалено. + + + Ответное сообщение для настраеваемой реакцией с ИД {0} не будет отправлено в ЛС. + + + Ответное сообщение для настраиваемой реакцией с ИД {0} будет отправлено в ЛС. + + + Альтернативная команда не найдена + Fuzzy + + + {0} будет теперь альтернативной командой для {1}. + Fuzzy + + + Список альтернативных команд + Fuzzy + + + У триггера {0} больше нет альтернативных команд. + Fuzzy + + + У триггера {0} не было альтернативных команд. + Fuzzy + + + Время в игре + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx b/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx index ea90f4b6..8fe7d18e 100644 --- a/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx +++ b/src/NadekoBot/Resources/ResponseStrings.sr-cyrl-rs.resx @@ -127,7 +127,7 @@ Та база није под захтевом. - **DESTROYED** base #{0} in a war against {1} + **УНИШТЕНА** база #{0} у рату против {1} {0} је **ПОНИШТИО ЗАХТЕВ** за базу #{1} у рату против {2} @@ -139,7 +139,7 @@ @{0} Ти већ захтеваш базу #{1}. Не можеш захтевати још једну. - Захтев од @{0} за рат против {1} је истекао. + Захтев од @{0} у рату против {1} је истекао. Противник @@ -154,7 +154,7 @@ Величина рата није валидна. - Листа Ратова У Току + Листа ратова у току нема захтева @@ -467,11 +467,13 @@ Reason: {1} Reason: {1} - User Kicked + Кикован корисник + Fuzzy List Of Languages {0} + Fuzzy Your server's locale is now {0} - {1} @@ -531,9 +533,11 @@ Reason: {1} Message Deleted in #{0} + Fuzzy Message Updated in #{0} + Fuzzy Muted @@ -554,15 +558,19 @@ Reason: {1} New Message + Fuzzy New Nickname + Fuzzy New Topic + Fuzzy Nickname Changed + Fuzzy Can't find that server @@ -571,13 +579,13 @@ Reason: {1} No shard with that ID found. - Old Message + Стара порука - Old Nickname + Стари надимак - Old Topic + Стара тема Error. Most likely I don't have sufficient permissions. @@ -586,7 +594,7 @@ Reason: {1} Permissions for this server are reset. - Active Protections + Активне заштите {0} has been **disabled** on this server. @@ -598,7 +606,7 @@ Reason: {1} Error. I need ManageRoles permission - No protections enabled. + Нема активних заштита. User threshold must be between {0} and {1}. @@ -757,10 +765,11 @@ Reason: {1} __IgnoredChannels__: {2} - Text Channel Destroyed + Уништен текстуелни канал Text Channel Destroyed + Fuzzy Undeafen successful. @@ -774,12 +783,14 @@ Reason: {1} Username Changed + Fuzzy Users User Banned + Fuzzy {0} has been **muted** from chatting. @@ -789,18 +800,22 @@ Reason: {1} User Joined + Fuzzy User Left + Fuzzy {0} has been **muted** from text and voice chat. User's Role Added + Fuzzy User's Role Removed + Fuzzy {0} is now {1} @@ -825,9 +840,11 @@ Reason: {1} Voice Channel Destroyed + Fuzzy Voice Channel Destroyed + Fuzzy Disabled voice + text feature. @@ -859,6 +876,7 @@ Reason: {1} User Unbanned + Fuzzy Migration done! @@ -868,9 +886,11 @@ Reason: {1} Presence Updates + Fuzzy User Soft-Banned + Fuzzy has awarded {0} to {1} @@ -913,6 +933,7 @@ Reason: {1} Heads + Fuzzy Leaderboard @@ -934,6 +955,7 @@ Reason: {1} Raffled User + Fuzzy You rolled {0}. @@ -968,6 +990,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Tails + Fuzzy successfully took {0} from {1} @@ -980,6 +1003,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Само Власник Бота + Fuzzy Захтева {0} дозволу на каналу. @@ -989,9 +1013,11 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Команде и псеудоними + Fuzzy Листа команди је обновљена. + Fuzzy Укуцај `{0}h ИмеКоманде` да видиш помоћ за ту команду. нпр. `{0}h >8ball` @@ -1013,12 +1039,15 @@ Lasts {1} seconds. Don't tell anyone. Shhh. **List of Commands**: <{0}> **Hosting Guides and docs can be found here**: <{1}> + Fuzzy Листа Команди + Fuzzy Листа Модула + Fuzzy Укуцај `{0}cmds ИмеМодула` да видиш листу свих команди у том модулу. нпр `{0}cmds games` @@ -1031,6 +1060,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Садржај + Fuzzy Упутство @@ -1044,6 +1074,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Трка Животиња + Fuzzy Започињање трке није успело јер нема довољно учесника. @@ -1095,9 +1126,11 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Промена Осећања + Fuzzy Присвојена од стране + Fuzzy Развода @@ -1118,147 +1151,147 @@ Lasts {1} seconds. Don't tell anyone. Shhh. твој афинитет је већ постављен на ту waifu или покушаваш да обришеш афинитет који не постоји. - + променили су афинитет са {0} на {1}. Make sure to get the formatting right, and leave the thinking emoji - + Морате сачекати {0} сати и {1} минута да поново промените афинитет. - + Твој афинитет је ресетован, Више немаш особу која ти се свиђа. - + хоће да буде waifu од {0} - + је присвојио {0} као своју waifu за {1}! - + Развео си waifu којој се свиђаш. Душмане! {0} је добио {1} као компензацију. - + не можеш ставити афинитет на себе, егоманијаче. - + 🎉 Њихова љубав је испуњена! 🎉 - + Ни једна waifu није тако јефтина. Мораш да платиш бар {0} да би имао waifu, чак иако је њена вредност мања. - + Мораш да платиш {0} или више да би присвојио ту waifu. - + Та waifu није твоја. - + Не можеш присвојити себе. - + Скоро сте се развели. Морате сачекати {0} сати и {1} минута да се разведете поново. - + Нико - + Развео си waifu којој се не свиђаш. Добио си {0} назад. - + 8кугла - + Акрофобија - + Игра је се завршила без уноса. - + Нема гласова. Игра је се завршила без победника. - + Акроним је био {0}. - + Игра акрофобије већ постоји у овом каналу. - + Игра је почела. Направи реченицу са овим акронимом: {0} - + Имате {0} секунди за унос. - + {0} су доставили своју реченицу. ({1} укупно) - + Гласај тако што укуцаш број уноса. - + {0} је гласао! - + Победник је {0} са {1} поена. - + {0} је победник зато што је једини корисник са уносом. - + Питање - + Нерешено! Обоје сте изабрали {0} - + {0} је победио! {1} је јаче од {2} - + Уноси затворени - + Трка животиња већ постоји. - + Укупно: {0} Просечно: {1} - + Категорија - + Клевербот је угашен на овом серверу. - + Клевербот је упаљен на овом серверу. - + Генерација валуте је угашена на овом каналу. - + Генерација валуте је упаљена на овом каналу. - + {0} случајних {1} се појавило! plural - + Случајан {0} се појавио! - + Није успело учитавање питања. - + Игра је почела - + Игра вешалица је почела - + Игра вешалица већ постоји на овом каналу. - + Игра вешалица није успешно почела. - + Листа "{0}hangman" типова термина: Ранг листа @@ -1268,724 +1301,725 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Немаш довољно {0} - + Нема резултата. - + је убрао {0} Kwoth picked 5* - + {0} је засадио {1} Kwoth planted 5* - + Игра тривије већ постоји на овом серверу. - + Игра тривије - + {0} је погодио! Одговор је био: {1} - + Нема тривије у току на овом серверу. - + {0} има {1} поена - + Игра се зауставља после овог питања. - + Време је истекло! Тачан одговор је {0} - + {0} је погодио и ПОБЕДИО игру! Одговор је био: {1} - + Не можеш играти против себе. - + Игра икс-окс већ постоји на овом каналу. - + Нерешено! - + је направио игру икс-окса. - + {0} је победио! - + Три спојене - + Нема више потеза! - + Време је истекло! - + {0}-ов потез. - + {0} против {1} - + Покушавам да учитам {0} песама... - + Аутопуштање је угашено. - + Аутопуштање је упаљено. - + Стална вредност јачине је понедешена на {0}% - + Директоријум успешно стављен у плејлисту. - + ферплеј - + Песма је завршена - + Ферплеј је угашен. - + Ферплеј је упаљен. - + Са позиције - + ИД - + Нисправан унос. - + Максимални плејтајм више нема лимит. - + Максимално време пуштања је сада {0} секунди. - + Максимална величина реда је неограничена. - + Максимална величина реда подешена на {0} песама. - + Требаш бити у говорном каналу на овом серверу. - + Име - + Сада се пушта - + Нема активног музичког плејера. - + Нема резултата претраге. - + Музика је паузирана. - + Ред пуштања - Страна {0}/{1} - + Пушта се песма - + `#{0}` - **{1}** by *{2}* ({3} песама) - + Страна {0} сачуваних плејлисти - + Плејлиста обрисана. - + Није успело брисање те плејлисте. Или не постоји, или ниси ти ниси њен аутор. - + Плејлиста са тим ИДем не постоји. - + Успешно учитавање плејлисте. - + Плејлиста је сачувана. - + {0}s лимит - + Ред - + Песма је учитана - + Музички ред је очишћен. - + Ред је пун на {0}/{0}. - + Песма је обрисана context: "removed song #5" - + Понављам тренутну песму - + Понављам плејлисту - + Понављам нумеру - + Понављање нумбере стопирано. - + Музика је пуштена. - + Понављање плејлисте је угашено. - + Понављање плејлисте је упаљено. - + Исписиваћу поруке за почетак, крај, паузу и брисање песме у овом каналу. - + Прескочено на `{0}:{1}` - + Песме су измешане - + Песме су померене - + {0}х {1}м {2}с - + На позицију - + неограничено - + Јачина звука мора бити између 0 и 100 - + Јачина звука подешена на {0}% - + Искључено коришћење СВИХ МОДУЛА на каналу {0}. - + Укључено коришћење СВИХ МОДУЛА на каналу {0}. - + Дозвољено - + Искључено коришћење СВИХ МОДУЛА за ролу {0}. - + Укључено коришћење СВИХ МОДУЛА за ролу {0}. - + Искључено коришћење СВИХ МОДУЛА на овом серверу. - + Укључено коришћење СВИХ МОДУЛА на овом серверу. - + Искључено коришћење СВИХ МОДУЛА за корисника {0}. - + Укључено коришћење СВИХ МОДУЛА за корисника {0}. - + {0} сa ИДем {1} је стављен на црну листу. - + Команда {0} сада има {1}с кулдаун. - + Команда{0} сада нема кулдаун и сви постојећи кулдаунови су обрисани. - + Нема кулдауна за команде. - + Цене команди - + Искључено коришћење {0} {1} на каналу {2}. - + Укључено коришћење {0} {1} на каналу {2}. - + Забрањено - + Додата реч {0} у листу филтрираних речи. - + Листа филтрираних речи - + Уклоњена реч {0} из листе филтрираних речи. - + Неисправан други параметар. (Мора бити број између {0} и {1}) - + Филтрирање позивница је угашено на овом каналу. - + Филтрирање позивница је упаљено на овом каналу. - + Филтрирање позивница је угашено на овом серверу. - + Филтрирање позивница је упаљено на овом серверу. - + Померена дозвола {0} са #{1} на #{2} - + Не могу да пронађем дозволу са индексом #{0} - + Нема постављених цена. - + команде Gen (of command) - + модула Gen. (of module) - + Страна са дозволама {0} - + Тренутна рола за дозволе је {0}. - + Корисници сада захтевају {0} ролу да би мењали дозволе. - + Не постоји дозвола са тим индексом. - + уклоњена дозвола #{0} - {1} - + Искључено коришћење {0} {1} за {2} ролу. - + Укључено коришћење {0} {1} за {2} ролу. - + сек. Short of seconds. - + Искључено коришћење {0} {1} на овом серверу. - + Укључено коришћење {0} {1} на овом серверу. - + {0} сa ИДем {1} је скинут са црне листе. - + неизмењиво - + Искључено коришћење {0} {1} за {2} корисника. - + Укључено коришћење {0} {1} за {2} корисника. - + Више нећу приказивати упозорења за дозволе. - + Од сада ћу приказивати упозорења за дозволе. - + Филтрирање речи је угашено на овом каналу. - + Филтрирање речи је упаљено на овом каналу. - + Филтрирање речи је угашено на овом серверу. - + Филтрирање речи је упаљено на овом серверу. - + Моћи - + Нема омиљених анимеа. - + Започето аутоматско превођење порука у овом каналу. Поруке корисника ће бити аутоматски обрисане. - + твој језик ауто-превођења је обрисан. - + Ваш језик за превођење је постављен од {0}>{1} - + Започето аутоматско превођење порука на овом каналу - + Стопирано аутоматско превођење порука на овом каналу - + Није добар формат уноса, или нешто друго. - + Не могу да нађем ту карту. - + чињеница - + Поглавља - + Стрип # - + Такмичарских партија изгубљено - + Такмичарских партија играно - + Такмичарски ранг - + Такмичних победа - + Завршено - + Услови - + Цена - + Датум - + Дефиниши: - + Испуштене - + Епизода - + Дошло је до грешке. - + Пример - + Није нађен тај аниму. - + Није нађен тај манго. - + Жанрови - + Није успешно проналажење дефиниције за тај таг. - + Висина/Ширина - + {0}м/{1}кг - + Влажност Ваздуха - + Претрага слика за: - + Филм није нађен. - + Неисправан почетни или крајњи језик. - + Вицеви нису учитани - + Лат/Лонг - + Ниво - + Листа {0}place тагова Don't translate {0}place - + Место - + Магични предмети нису учитани. - + {0}'s МАЛ профил - + Власник бота није унео MashapeApiKey. Не можете да користите ову функционалност. - + Мин/Макс - + Канал није пронађен. - + Нема резултата. - + Паузирано - + Оригинални линк - + Захтева се osu! API кључ. - + Неуспешно учитавање osu! потписа. - + Пронађено преко {0} слика. Насумично учитавам {0}. - + Корисник није пронађен. Проверите регион и BattleTag пре него што покушате поново. - + Планира да гледа - + Платформа - + Није пронађена моћ. - + Није пронађен покемон. - + Линк ка профилу: - + Квалитет: - + Време игре у квик моду - + Победа у квик моду - + Рејтинг - + Скор: - + Тражи за: - + Није успешно скраћивање тог линка. - + Кратак линк - + Дошло је до грешке. - + Унеси параметре за претрагу. - + Статус - + Линк Продавнице - + Стример {0} није на мрежи. - + Стример {0} је на мрежи са {1} прегледа. - + Пратите стримера {0} на овом серверу. - + Не пратиш ниједан стрим ан овом серверу. - + Нема тог стрима. - + Стрим вероватно не постоји. - + Уклоњен {0} стрим ({1}) из обавештења. - + Обавестићу овај канал када се статус промени. - + Излазак сунца - + Залазак сунца - + Температура - + Наслов: - + 3 омиљене аниме: - + Превод: - + Типови - + Неуспешно проналажење дефиниције за тај термин - + Линк - + Гледаоци - + Гледа - + Није успешно проналажење термина на тој викији. - + Унеси име викије, а затим термин за претрагу. - + Страница није нађена. - + Брзина ветра - + {0} највише банованих хероја - + Јодификовање реченице није успешно. - + Ушао - + `{0}.` {1} [{2:F2}/s] - {3} укупно /s and total need to be localized to fit the context - `1.` - + Страна активности #{0} - + {0} укупно корисника. - + Аутор - + Бот ИД - + Листа функција у {0}calc команди - + {0} овог канала је {1} - + Тема канала - + Извршених команди - + {0} {1} је једнако {2} {3} - + Мере које могу бити коришћене у конвертеру - + Неуспешно конвертовање {0} у {1}: мера није пронађена - + Неуспешно конвертовање {0} у {1}: типови мера нису једнаки - + Направљен - + Прикључен у међусерверни канал. - + Међусерверни канал напуштен. - + Ово је твој CSC токен Емотикони по Мери + Fuzzy Грешка @@ -2001,9 +2035,11 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Ево је листа корисника у тим ролама: + Fuzzy није ти дозвољено да користиш ову команду на ролама са пуно корисника да би се спречила злоупотреба. + Fuzzy Нетачна вредност {0}. @@ -2014,17 +2050,20 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Ушао на сервер + Fuzzy ИД: {0} Чланова; {1} Ид Власника; {2} + Fuzzy Нема сервера на овој страници. Листа Понављача + Fuzzy Чланова @@ -2037,6 +2076,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Понављач Порука + Fuzzy Име @@ -2090,15 +2130,17 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Обрисана насумишна + Fuzzy Регион Регистрован + Fuzzy - + Подсетићу {0} да {1} у {2} `({3:d.M.yyyy.} at {4:HH:mm})` Није исправан формат времена. Проверите листу команди. @@ -2107,16 +2149,17 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Нови темплејт за подсетник је постаљен. - + Понављање {0} сваких {1} дан(а), {2} сат(а) и {3} минута(а). Листа понављача + Fuzzy Нема понављача на овом серверу. - + #{0} прекинуто. Нису пронађене понављајуће поруке на овом серверу. @@ -2128,46 +2171,49 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Роле - + Страна #{0} свих рола на овом серверу: - + Страна #{0} рола за {1} - + Боје нису у исправном формату. Користите `#00ff00` као пример. - + Започето ротирање боје {0} роле. - + Стопирано ротираење боја за {0} ролу. - + {0} овог сервера је {1} Инфо Сервера + Fuzzy Шард Статови Шардова + Fuzzy - + Шард **#{0}** је у {1} стању са {2} сервера. - + **Име:** {0} **Линк:** {1} Нема специјалних емотикона. - + Пуштено {0} песама, {1} на чекању. Текст Канали + Fuzzy Ево га твој линк ка соби: @@ -2176,7 +2222,7 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Време Рада - + {0} од корисника {1} је {2} Id of the user kwoth#1234 is 123123123123 @@ -2184,6 +2230,101 @@ Lasts {1} seconds. Don't tell anyone. Shhh. Говорни канал + Fuzzy + + + Већ си у овој трци! + + + Тренутни резултати анкете + + + Нема гласова. + + + Анкета већ постоји на овом серверу. + + + 📃 {0} је направио анкету која захтева вашу пажњу. + + + `{0}.` {1} са {2} гласова. + + + {0} је гласао + Kwoth voted. + + + Пошаљите ми број одговора у приватној поруци. + + + Пошаљите број одговора у овом каналу. + + + Хвала што сте гласали. + + + {0} укупан број гласова. + + + Покупите их куцајући `{0}pick` + + + Покупи тако што укуцаш `{0}pick` + + + Нема корисника. + + + страница {0} + + + Мораш бити у гласовном каналу на овом серверу. + + + Нема рола за говорне канале. + + + {0} је **занемљен** из текстовних и гласовних канала на {1} минута. + + + Корисници који уђу у говорни канал {0} ће добити ролу {1}. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.sv-SE.resx b/src/NadekoBot/Resources/ResponseStrings.sv-SE.resx new file mode 100644 index 00000000..f5297053 --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.sv-SE.resx @@ -0,0 +1,2369 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Denna bas är redan tagen eller förstörd. + + + Denna bas är redan förstörd. + + + Denna bas är inte tagen. + + + **FÖRSTÖRD** bas #{0} i krig mot {1} + + + {0} har **TAGIT BORT SITT ANSPRÅK PÅ** bas #{1} i krig mot {2} + + + {0} har gjort anspråk på en bas #{1} i ett krig mot {2} + + + @{0} Du har redan gjort anspråk på bas #{1}. Du kan inte göra ett anspråk på en ny bas. + + + Anspråk från @{0} för ett krig mot {1} har gått ut. + Fuzzy + + + Fiende + + + Information om krig mot {0} + + + Ogiltigt basnummer. + + + Ogiltig krigsstorlek. + Fuzzy + + + Lista Över Aktiva Krig + Fuzzy + + + Inte gjort anspråk på + + + Du är inte med i det kriget. + + + @{0} Du är antingen inte med i det kriget eller så är basen redan förstörd. + + + Inga aktiva krig. + Fuzzy + + + Storlek + + + Krig mot {0} har redan börjat. + + + Krig mot {0} skapat. + + + Krig mot {0} har tagit slut. + + + Det kriget existerar inte. + + + Krig mot {0} har börjat! + + + Alla anpassade emojis uppgifter borttagna. + + + Anpassad emoji har blivit raderad + + + Otillräckliga behörigheter. Kräver Bot ägande för globala anpassade reaktioner, och administratör för server anpassade reaktioner. + + + Lista av alla egengjorda reaktioner + + + Egengjorda Reaktioner + + + Nya egengjorda Reaktioner + + + Inga egnagjorde reaktioner hittades. + Fuzzy + + + Ingen egengjord reaktion funnen med det id. + + + Svar + + + Egengjord reaktion statistiker + + + Statistiker rensade för {0} egengjorda reaktioner. + + + Inga statistik för den triggern funnen, inget återgärd gjord. + + + Trigger + + + Automatisk hentai stoppad. + + + Inga resultat hittades. + + + {0} har redan svimmat. + + + {0} har redan full hälsa. + + + din typ är redan {0} + + + har använt {0}{1} på {2}{3} för {4} skada. + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + + + Du kan inte attackera igen utan motståndarens drag! + + + du kan inte attackera dig själv + + + +{0} har svimmat! + + + helade {0} med en {1} + + + + {0} har {1} hälsa kvar + + + Du kan inte använda {0}. Skriv `{1}ml` för att se en lista av attacker du kan använda. + + + Attacker för {0} typer + + + Detta var inte så effektivt. + + + Du har inte nog {0} + + + återupplivade {0} med en {1} + + + Du återupplivade dig själv med en {0} + + + Din typ har blivit ändrad till {0} för en {1} + + + Det är någorlunda effektivt. + + + Det är super effektivt! + + + Du använde för många attacker på raken, så du kan inte attackera! + + + Typ av {0} är {1} + + + Användaren hittades inte. + + + Du svimmade, så du kan inte attackera! + + + **Auto tilldela roll** på användare som ansluter sig är nu **inaktiverad**. + + + **Auto tildela roll** på användare som ansluter sig är nu **aktiverad**. + + + Tillbehör + + + Avatar byttes + + + Du har blivit bannad från {0} server. anledning: {1} + + + bannad + PLURAL + + + Användare bannad + + + Bot namn byttes till {0} + + + Bot status byttes till {0} + + + Automastisk radering av avskeds meddelanden har blivit avaktiverat. + + + Avskeds meddelanden kommer bli raderade efter {0} sekunder. + + + Nuvarande avskeds meddelande: {0} + + + Aktivera avskeds meddelanden genom att skriva {0} + + + Nytt avskeds meddelande satt. + + + Avskeds meddelande inaktiverat. + + + Avskeds meddelanden aktiverad på denna kanal. + + + Kanal namn har byts. + + + Gammalt Namn + + + Kanal ämne har byts. + + + Städats upp. + + + Innehåll + + + Lyckats skapa roll {0} + + + Text kanal {0} skapad. + + + Röstkanal {0} skapad. + + + Dövning lyckats. + + + Raderad server {0} + + + Stoppad automatisk borttagning av lyckade kommando åkallanden. + + + Raderar nu lyckade kommando åkallanden. + + + Text kanal {0} raderad. + + + Röstkanal {0} raderad. + + + Meddelande från + + + Lyckats lägga till en ny donator. Totalt donerat från denna användare: {0} 👑 + + + Tack alla personer listade som har hjälpt oss skapa detta projekt! + + + Jag kommer skicka vidare meddelanden till alla ägare. + + + Jag kommer bara skicka vidare meddelanden till den första ägaren. + + + Jag kommer skicka vidare meddelanden från och med nu. + + + Jag kommer sluta skicka vidare meddelande från och med nu. + + + Automatisk radering av hälsnings meddelanden har blivit avaktiverat. + + + hälsnings meddelanden kommer bli raderade efter {0} sekunder + + + Nuvarande direkt meddelande hälsning: {0} + + + Aktivera hälsnings direkt meddelande genom att skriva {0} + + + Ny direkt meddenlande vid hälsning har gjorts. + + + Direkt meddelande för hälsning har avaktiverats. + + + Direkt meddelande för hälsning har aktiverats. + + + Nuvarande hälsning: {0} + + + Aktivera hälsning genom att skriva {0} + + + Ny hälsning skapad. + + + Hälsningar har blivit avaktiverade. + + + Hälsningar har blivit aktiverade på denna kanal. + + + Du kan inte använda detta kommando på användare med högre eller likastående rank till din egna enligt rankerna. + + + Bilder laddade efter {0} sekunder! + + + Ogiltig inmatnings format. + + + Ogiltiga parametrar. + + + {0} har gått med {1} + + + Du har blivit kickad från {0} server. +Anledning: {1} + + + Användare sparkad + Fuzzy + + + Lista av språk +{0} + Fuzzy + + + Din servers lokal är nu {0} -{ 1} + + + Bottens standard lokal är nu {0} - {1} + + + Bottens språk är nu gjord till {0} - {1} + + + Misslyckades att ställa lokal. Se över kommandots hjälp. + + + Denna servers språk är nu gjord till {0} - {1} + + + {0} har lämnat {1} + + + Lämnat server {0} + + + Loggar {0} händelser i denna kanal. + + + Loggar alla händelser i denna kanal. + + + Loggning avaktiverad. + + + Loggade event du kan prenumerera till: + + + Loggning kommer ignorera {0} + + + Loggning kommer inte ignorera {0} + + + Stoppade loggning {0} händelser. + + + {0} har åkallat ett omnämnande på följande roller + + + Meddelande från {0} `[Bot Ägare]`: + + + Meddelande skickat. + + + {0} flyttad från {1] till {2} + + + Meddelande Raderat i #{0} + Fuzzy + + + Meddelande Uppdaterat i #{0} + Fuzzy + + + Mutade + PLURAL (users have been muted) + + + Mutad + singular "User muted." + + + Jag har sannolikt inte de flesta tillstånd för detta. + + + Ny mute roll gjord. + + + Jag behöver **Administration** tillåtelse för att göra det där. + + + Nytt Meddelande + Fuzzy + + + Nytt Smeknamn + Fuzzy + + + Nytt Ämne + Fuzzy + + + Smeknamn Ändrat + Fuzzy + + + Kan inte hitta den servern + + + Ingen shard med den ID funnen + + + Gammalt Meddelande + Fuzzy + + + Gammalt Smeknamn + Fuzzy + + + Gammalt Ämne + Fuzzy + + + Fel. Troligtvis så har jag inte tillräcklig behörighet. + + + Tillstånd för denna server har blivit återställt. + + + Aktiva Skydd + Fuzzy + + + {0} har blivit **avaktiverat** på denna server. + + + {0} Aktiverad + + + Fel. Jag behöver tillstånd att hantera roller. + + + + + Inga skydd är aktiverade. + Fuzzy + + + Användar + + + Om {0} eller mer användare går med inom {1} sekunder, kommer jag {2} dom. + + + Tiden måste vara inom {0} och {1} sekunder. + + + Lyckats ta bort alla roller från användare {0} + + + Misslyckades att ta bort roller. Jag har inte nog med behörighet. + + + Färger av {0} roll har blivit ändrad. + + + Den rollen existerar inte. + + + Dom angivna parametrarna är ogiltiga. + + + Ett fel uppstod på grund av ogiltig färg eller otillräckliga behörigheter. + + + Lyckats ta bort roll {0} från användare {1} + + + Misslyckades att ta bort roll. Jag har inte tillräckligt med behörighet. + + + Roll omdöpt. + + + Det gick inte att byta namn på roll. Jag har inte tillräckligt behörighet. + + + Du kan inte redigera roller högre än din högsta roll. + + + Tog bort spelande meddelande: {0} + + + Roll {0} har blivit tillagd till listan. + + + {0} inte funnen. Städar upp. + + + Roll {0} finns redan i listan. + + + Tillagd. + + + Rotering av spelar status avaktiverad. + + + Rotering av spelar status aktiverad. + + + Här är en lista av roterande statusar: +{0} + + + Inga roterande spel statusar aktiverade. + + + Du har redan {0} roll. + + + Du har redan {0} exklusiv egentilldelad roll + + + Egentilldelade roller är nu exklusiva! + + + Det finns {0} egentilldelade roller + + + Den rollen är inte möjlig att egentilldela. + + + Du har inte {0} roll. + + + Egentilldelade roller är nu inte exklusiva! + + + Jag är oförmögen att lägga den rollen för dig. 'Jag kan inte lägga till roller till ägare eller andra roller högre än min roll i roll hierarkin.` + + + + + {0} har tagits bort från listan av egentilldelade roller. + + + Du har inte längre {0} roll. + + + Du har nu {0} roll. + + + Lyckats lägga till roll {0} till användare {1} + + + Misslyckades att lägga till roll. Jag har inte nog behörighet. + + + Ny avatar satt! + + + Nytt kanal namn satt. + + + Nytt spel satt! + + + Nytt stream satt! + + + Nytt kanal ämne satt! + + + Shard {0} har återansluts. + + + Shard {0} håller på att återansluta. + + + Stänger ner. + + + Användare kan inte skicka mer än {0} meddelanden varje {1} sekunder. + + + Långsamt läge avaktiverat. + + + Långsamt läge initierad + + + mjukt-bannad (kickad) + PLURAL + + + {0} kommer ignorera denna kanal. + + + {0} kommer inte längre att ignorera denna kanal. + + + Om en användare skriver {0} samma meddelanden på en gång so kommer jag {1} dom. +__IgnoreradeKannaler_: {2} + + + Text kanal skapad. + Fuzzy + + + Text kanal förstörd. + Fuzzy + + + Borttagning av dövning lyckats. + + + Omutad + singular + + + Användarnamn + + + Användarnamn ändrats + Fuzzy + + + Användare + + + Användare Bannad + Fuzzy + + + {0} har blivit **mutad** från att chatta. + + + {0} har blivit **omutad** från att chatta. + + + Användare har gått med. + Fuzzy + + + Användare har lämnat. + Fuzzy + + + {0} har blivit **mutad** från text och röst kanal. + + + Användarens roll har blivit tillagd. + Fuzzy + + + Användarens roll har blivit borttagen. + Fuzzy + + + {0} är nu {1} + + + {0} har nu blivit **omutad** från text och röst kanal. + + + {0} har gått med {1} röst kanal. + + + {0} har lämnat {1} röst kanal. + + + {0} flyttade från {1} till {2} röst kanal. + + + {0} har blivit **röst mutad**. + + + {0} har blivit **röst omutad**- + + + Röstkanal Skapad + Fuzzy + + + Röstkanal Förstörd + Fuzzy + + + Avaktiverat röst + text funktion. + + + Aktiverat röst + text funktion. + + + Jag har inte **hantera roller** och / eller **hantera kanaler** tillstånd, så jag kan inte köra `röst + text` på {0} server. + + + Du aktiverar / inaktiverar funktionen och **Jag har inte administratörsbehörighet**. Detta kan orsaka vissa problem, och du kommer själv att behöva städa upp textkanaler efteråt. + + + Jag behöver minst **hantera roller** och **hantera kanaler** behörighet att aktivera den här funktionen. (Föredrar Administration tillåtelse) + + + Användare {0} från text chat + + + Användare {0} från text och röst chat. + + + Användare {0} från röst kanal + + + Du har blivit mjuk-bannad från {0} server. +Anledning: {1} + + + Användare inte längre bannad. + Fuzzy + + + Migration gjort! + + + Fel vid migrering, kontrollera botens konsol för mer information. + + + Närvaro Uppdateringar. + Fuzzy + + + Användare mjuk-bannad. + Fuzzy + + + har tilldelat {0} till {1} + + + Bättre lycka nästa gång ^_^ + + + Grattis! Du vann {0} för att ha rullat över {1} + + + Kortlek omblandat. + + + Vänt {0}. + User flipped tails. + + + Du gissade rätt! Du vann {0} + + + Ogiltigt nummer anged. Du kan vända 1 till {0} mynt. + + + Lägg till {0} reaktion till detta meddelande för att få {1}␣ + + + Denna händelse är aktiv upptill {0} timmar. + + + Blomm reaktions händelse igång! + + + har begåvat {0} till {1} + X has gifted 15 flowers to Y + + + {0} har {1} + X has Y flowers + + + Krona + Fuzzy + + + Topplista + + + Tilldelat {0} till {1} ​​användare från {2} roll. + + + Du kan inte satsa mer än {0} + + + Du kan inte satsa mindre än {0} + + + Du har inte nog med {0} + + + Inga fler kort i kortleken. + + + Lotto användare + Fuzzy + + + Du rullade {0} + + + Satsa + + + WOAAHHHHHH!!! Grattis!!! x{0} + + + En enda {0}, x {1} + + + Wow! Tur! Tre av en sort! x {0} + + + Bra jobbat! Två {0} - insats x {1} + + + Vann + + + Användare måste ange en hemlig kod för att få {0}. +Varar {1} sekunder. Berätta inte för någon. Shhh. + + + Hemlig spel händelse har tagit slut. {0} användare fick belöningen. + + + Hemlig spel status händelse har börjat + + + Klave + Fuzzy + + + Lyckats ta {0} från {1} + + + Lyckades inte ta {0} från {1} för att användaren inte har så mycket {2}! + + + Tillback till ToC + + + Bara Bot ägare + Fuzzy + + + Kräver {0} kanal tillstånd. + + + Du kan stödja projektet på patreon: <{0}> eööer paypal: <{1}> + + + Kommando och alias + Fuzzy + + + Kommando lista regenereras. + + + Skriv `{0}h CommandName` för att se hjälp för det specifika kommandot. t.ex. `{0}h >8ball` + + + Jag kan inte hitta det kommandot. Var snäll och verifiera om det kommandot existerar innan du provar igen. + + + Beskrivning + + + Du kan stödja NadekoBot projektet på +Patreon <{0}> eller +Paypal <{1}> +Glömm inte att lämna ditt discord namn eller id i meddelandet. + +**Tack så mycket** ♥️ + + + **Lista av kommandon**. <{0}> +**Värd guider och dokument kan bli hittade här*': <{1}> + Fuzzy + + + Kommandolista + Fuzzy + + + Modullista + Fuzzy + + + Skriv `{0}cmds ModuleName` för att få en lista av kommandon i den modulen. t.ex. `{0}cmds games` + + + Modulen existerar inte. + + + Kräver {0} server tillåtelse. + + + Innehållsförteckning + Fuzzy + + + Användning + + + Auto hentai startad. Svarar varje {0}s med en av följande taggar: +{1} + + + Tagg + + + Djur Lopp + Fuzzy + + + Det gick inte att starta eftersom det inte fanns tillräckligt många deltagare. + + + Loppet är full! Startar omedelbart. + + + {0} gick med som en {1} + + + {0} gick med som en {1} och satsa {2}! + + + Skriv {0}jr för att ansluta dig till loppet. + + + Börjar från inom 20 sekunder eller när rummet är fullt. + + + Startar från och med {0} deltagare. + + + {0} som {1} Vann loppet! + + + {0} som {1} Vann loppet och {2}! + + + Ogiltigt nummer specificerat. Du kan rulla {0}-{1} tärningar på en gång. + + + rullade {0} + Someone rolled 35 + + + Tärningar rullade: {0} + Dice Rolled: 5 + + + Misslyckades att starta loppet. Ett annat lopp är förmodligen igång. + + + Inget lopp finns på denna server + + + Andra numret måste vara större än den första. + + + Ändring av hjärta + Fuzzy + + + Anspråk av + Fuzzy + + + Skilsmässor + + + Gillar + + + Pris + + + Inga waifus har blivit tagna hittls. + + + Top Waifus + + + din affinitet är redan inställd på den waifun eller så försöker du att ta bort din affinitet utan att ha en. + + + ändrat sin affinitet från {0} till {1}. + +* Detta är moraliskt tveksamt. * 🤔 + Make sure to get the formatting right, and leave the thinking emoji + + + Du måste vänta {0} timmar och {1} minuter för att byta affinitet igen. + + + Din affinitet återställs. Du har inte en person som du gillar längre. + + + vill vara {0}s waifu. Aww <3 + + + har tagit {0} som deras waifu för {1}! + + + Du har skilt dig från en waifu som gillar dig. Ditt hjärtlösa monster. +{0} har fått {1} som kompensation. + + + du kan inte ställa affinitet till dig själv, din egoist. + + + 🎉 Deras kärlek är uppfyllt! 🎉 +{0} s nya värdet är {1}! + + + Ingen waifu är så billig. Du måste betala minst {0} för att få en waifu, även om deras riktiga värde är lägre. + + + Du måste betala {0} eller mer för att ta den waifun! + + + Denna waifun är inte din. + + + Du kan inte göra anspråk på sig själv. + + + Du blev frånskild nyligen. Du måste vänta {0} timmar och {1} minuter att skilja sig igen. + + + Ingen + + + Du har frånskild en waifu som inte gillar dig. Du har fått {0} tillbaka. + + + 8boll + + + Acrophobia + + + Spelet slutade utan några synpunkter. + + + Inga röster. Spelet slutade med ingen vinnare. + + + Acronym var {0}. + + + Acrophobia spel är redan igång i denna kanal. + + + Spelet började. Skapa en mening med följande akronym: {0}. + + + Du har {0} sekunder för att göra en inlaga. + + + {0} lämnat sitt straff. ({1} totalt) + + + Rösta genom att skriva ett number av det du inlämnar + + + {0} lägger sin röst! + + + Vinnaren är {0} med {1} poäng. + + + {0} är vinnaren för att vara den enda användaren som gjorde ett förslag! + + + Fråga + + + Det är lika! Båda valde {0} + + + {0} vann! {1} slår {2} + + + Förslag Stängda + Fuzzy + + + Djur lopp körs redan. + + + Totalt: {0} Genomsnitt: {1} + + + Kategori + + + Avaktiverade cleverbot på denna server. + + + Aktiverat cleverbot på denna server. + + + Valuta skapande har inaktiverats på denna kanal. + + + Valuta skapande har aktiverats på denna kanal. + + + {0} slumpmässig {1} dök up! Plocka upp genom att skriva `{2} pick` + plural +Fuzzy + + + En slumpmässig {0} dök upp! Plocka upp genom att skriva `{1} pick` + Fuzzy + + + Misslyckades ladda en fråga. + + + Spel börjat + Fuzzy + + + Hänga gubbe har börjat + + + Hänga gubbe spelas redan i denna kanal. + + + Startar hänga gubbe errored. + + + Lista över "{0} hängagubbe" term typer: + + + Ledartavla + + + Du har inte nog med {0} + + + Inga resultat + + + plockade {0} + Kwoth picked 5* + + + {0} planterade {1} + Kwoth planted 5* + + + Trivia spel pågår redan i denna server. + + + Trivia spel + + + {0} gissade rätt! Svaret var: {1} + + + Inget trivia spel pågår just nu. + + + {0} har {1} poäng + + + Stoppar efter denna fråga. + + + Tiden är slut! Det korrekta svaret var {0} + + + {0} gissade rätt och VANN spelet! Svaret var: {1} + + + Du kan inte spela mot dig själv. + + + Tre I Rad spelet pågår redan i denna kanal. + + + Oavgjort! + + + har skapat ett spel av Tre I Rad. + + + {0} har Vunnit! + Fuzzy + + + Matchade Tre + Fuzzy + + + Inga drag kvar! + + + Tiden är Slut! + Fuzzy + + + {0}s drag + + + {0} mot {1} + + + Försöker köa {0} låtar... + + + Auto spelning avaktiverad. + + + Auto spelning aktiverad. + + + Standard volym satt till {0}% + + + Katalog kö komplett. + + + rent spel + + + Sång Avslutad + Fuzzy + + + Rent spel avaktiverat + + + Rent spel aktiverat + + + Från position + + + Id + + + Ogiltig inmatning. + + + Max speltid har ingen gräns nu. + + + Max speltid satt till {0} sekund(er). + + + Max musik köns storleken inställd på obegränsad. + + + Max musik köns storleken inställd på {0} spår. + + + Du måste vara i röst kanalen på den här servern. + + + Namn + + + Nu Spelas + Fuzzy + + + Ingen aktiv musikspelare. + + + Inga sök resultat. + + + Musikuppspelning pausas. + + + Spelar Kö - Sida {0}/{1} + Fuzzy + + + Spelar låt + Fuzzy + + + `#{0}` - **{1}** by *{2}* ({3} låtar) + + + Sida {0} av Sparade Spellistor + Fuzzy + + + Spelllista borttagen. + + + Kunde ej ta bort den låtlistan. Antingen finns den ej eller så är det inte du som skapat den. + + + Spellista med det ID existerar inte. + + + Spellista komplett. + + + Spellista Sparad + Fuzzy + + + {0}s gräns + + + + + + Köad sång + Fuzzy + + + Musik kön rensad. + + + Kön är full på {0}/{0}. + + + Tog bort låt + context: "removed song #5" + + + Repeterar Nuvarande Låt + Fuzzy + + + Repeterar Spellistan + Fuzzy + + + Repeterar Låt + Fuzzy + + + Nuvarande låt repetering stoppad. + + + Musikuppspelning återupptas. + + + Upprepning av spellista inaktiverad. + + + Upprepning av spellista aktiverad. + + + Jag kommer nu att utgångs spela, färdig pausad och borttagna låtar i denna kanal. + + + Skippat till `{0}:{1}` + + + Sånger blandade. + Fuzzy + + + Sång flyttad + Fuzzy + + + {0}h {1}m {2}s + + + Till position + + + obegränsad + + + Volym måste vara mellan 0 och 100 + + + Volym satt till {0}% + + + Avaktiverat användning av alla MODULER på kanalen {0}. + + + Aktiverat användning av alla MODULER på kanalen {0}. + + + Tillåtet + + + Avaktiverat användning av alla MODULER för roll {0}. + + + Aktiverat användning av alla MODULER för roll {0}. + + + Avaktiverat användning av alla MODULER på denna server. + + + Aktiverat användning av alla MODULER på denna server. + + + Avaktiverat användning av alla MODULER för användare {0}. + + + Aktiverat användning av alla MODULER för användare {0}. + + + Svartlistat {0} med ID {1} + + + Kommando {0} har nu {1}s väntetid. + + + Kommando {0} har nu ingen väntetid och alla existerande väntetider har blivit rensade. + + + Inga kommando väntetider satta. + + + Kommando kostar + + + Avaktiverade användning av {0} {1} på kanal {2}. + + + Aktiverade användning av {0} {1} på kanal {2}. + + + Nekad + + + La till ordet {0} till listan över filtrerade ord. + + + Lista av filtrerade ord + + + Tog bort ord {0} från listan av filtrerade ord. + + + Ogiltig andra parameter.(Måste vara ett nummer mellan {0} och {1}) + + + Inbjuds filtrering avaktiverad på denna kanal. + + + Inbjuds filtrering aktiverad på denna kanal. + + + Inbjuds filtrering avaktiverad på denna server. + + + Inbjuds filtrering aktiverad på denna server. + + + Flyttade behörighet {0} från #{1} till #{2} + + + Kan inte kitta behörighet på index #{0} + + + Inga kostnader satta. + + + kommando + Gen (of command) + + + modul + Gen. (of module) + + + Behörighets sida {0} + + + Nuvarade behörighets roll är {0} + + + Användare behöver nu {0} rollen för att kunna ändra behörigheter. + + + Inga behörigheter funna i den indexen. + + + Tog bort behörighet #{0} - {1} + + + Avaktiverat användning av {0} {1} för {2} rollen. + + + Aktiverat användning av {0} {1} för {2} rollen. + + + sek. + Short of seconds. + + + Avaktiverat användning av {0} {1} på denna server. + + + Aktiverat användning av {0} {1} på denna server. + + + Togbort {0} från svartlistan med ID {1} + + + oredigerbar + + + Avaktiverat användning av {0} {1} för {2} användare. + + + Aktiverat användning av {0} {1} för {2} användare. + + + Jag kommer inte länga visa behörighets varningar. + + + Jag kommer nu visa behörighets varningar. + + + Ord filtrering avaktiverat i denna kanal. + + + Ord filtrering aktiverat i denna kanal. + + + Ord filtrering avaktiverat på denna server. + + + Ord filtrering aktiverat på denna server. + + + Förmågor + + + Ingen favoritanime än + + + Började automatisk översättning av meddelanden på denna kanal. Användarmeddelanden kommer att automatiskt tas bort. + + + ditt automatiska översätta-språk har tagits bort. + + + ditt automatiska översätta-språk har blivit satt till {0}>{1} + + + Började automatisk översättning av meddelanden på denna kanal. + + + Stoppat automatisk översättning av meddelanden på denna kanal. + + + Dålig inmatnings format, eller så gick något fel. + + + Kunde ej hitta det kortet. + + + fakta + + + Kapitel + + + Serie # + + + Kompetitiva Förluster + Fuzzy + + + Kompetitiva Spelade + Enbart kompetitiva eller kompetitiva matcher? :thinking: +Fuzzy + + + Kompetitiv Rank + Fuzzy + + + Kompetitiva Vinster + + + Avslutade + + + Kondition + + + Kostnad + + + Datum + + + Definera: + + + Övergivna + Fuzzy + + + Avsnitt + + + Ett fel inträffade. + + + Exempel + + + Kunde ej hitta den animun. + + + Kunde ej hitta den mangon. + Fuzzy + + + Genres + + + Misslyckades att hitta en definition för den taggen. + + + Längd/Vikt + + + {0}m/{1}kg + + + Fuktighet + + + Bild sökning för: + Fuzzy + + + Kunde ej hitta den filmen. + + + Ogiltig källa eller mål språk. + + + Skämt ej laddade. + + + Lat/Long + + + Nivå + + + Lista av {0} plats taggar + Don't translate {0}place + + + Plats + + + Magiska föremål inte laddade. + + + {0}:s MAL profil + Fuzzy + + + Bot ägare specificerade inte MashapeApiKey. Du kan inte använda den här funktionen. + + + Min/Max + + + Inga kanaler hittades. + + + Inga resultat hittades. + + + Placerad i kö + + + Original url + + + En osu! API nyckel krävs. + + + Misslyckades att hämta osu! signatur. + + + Hittade över {0} bilder. Visar slumpmässig {0}. + + + Användare inte funnen! Snälla kolla Regionen och BattleTag innan du försöker igen. + + + Planerar att kolla + + + Plattform + + + Ingen förmåga hittad. + + + Ingen pokemon funnen. + + + Profil link: + + + Kvalitet: + + + Snabb speltid + + + Snabba vinster + Fuzzy + + + Betyg + + + Poäng: + + + Leta efter: + Fuzzy + + + Misslyckades att förkorta den url. + + + Kort utl + + + Något gick fel. + + + Var snäll och specificera sök parametrar. + + + Status + + + Butik url + + + Streamer {0} är offline. + + + Streamer {0} är online med {1} tittare. + + + Du följer {0} streams på denna server. + + + Du följer inga streams på denna server. + + + Finns ingen sådan stream. + + + Stream existerar förmodligen inte. + + + Tog bort {0}'s stream från notifikationer. + + + Jag kommer notifikera denna kanal när status ändras. + + + Soluppgång + + + Solnedgång + + + Temperatur + + + Titel: + + + Top 3 favorit anime: + + + Översättning: + + + Typer + + + Misslyckades att hitta definitionen för den termen. + + + Url + + + Tittare + + + Tittar + + + Misslyckades att hitta term på den specificerade wikia. + + + Snälla skriv en wikia, följd av sökfråga. + + + Sidan kunde ej hittas. + + + vindhastighet + + + De {0} mest bannade mästare + + + Misslyckades att yodifiera din mening. + + + Gick med + + + `{0}.` {1} [{2:F2}/s] - {3} total + /s and total need to be localized to fit the context - +`1.` + + + Aktivitets sida #{0} + + + {0} användare totalt. + + + Författare + + + Bot ID + + + Lista av funktioner i {0}calc kommando + + + Kanalens {0} är {1} + + + Kanal ämne + + + Kommandon Körda + Fuzzy + + + {0} {1} är samma som {2} {3} + + + Enheter som kan användas av konverteraren + + + Kan inte konvertera {0} till {1}: enheter inte funna. + + + Kan inte konvertera {0} till {1}: typer av enheter är inte lika värda. + + + Skapad vid + + + Gå med kanal för att prata över servrar. + + + Lämnade kanal för att prata över servrar. + + + Detta är din CSC token + + + Egengjorda emojis + + + Fel + + + Funktioner + + + ID + + + Index utom räckhåll + + + Här är en lista av användare i dom rollerna: + Fuzzy + + + Du är inte tillåten att använda detta kommando på roller med många användare i dem för att förhindra missbruk. + + + Ogiltigt {0} värde. + Invalid months value/ Invalid hours value + + + Gick med Discord + + + Gick med Server + Fuzzy + + + ID: {0} +Medlemmar: {1} +ÄgarID: {2} + Fuzzy + + + Inga servrar funna på den sidan. + + + List över repeterare + + + Medlemmar + + + Minne + + + Meddelanden + + + Meddelande repeterare + + + Namn + + + Smeknamn + + + Ingen spelar det spelet. + + + Inga aktiva repeterare. + + + Inga roller på denna sida. + + + Inga shards på denna sida. + + + Inget ämne satt + + + Ägare + + + Ägar IDs + + + Närvaro + + + {0} Servrar +{1} Textkanaler +{2} Röstkanaler + + + Tog bort alla citat med nyckelordet {0}. + + + Sida {0} av citat + + + Inga citat på denna sida. + + + Inga citat hittades som du kan ta bort. + + + Citat tillagt + + + Tog bort ett slumpvalt citat. + Fuzzy + + + Region + + + Registrerad på + + + Jag kommer påminna {0} att {1} om {2} `({3:d.M.yyyy.} klockan {4:HH:mm})` + + + Inte en giltig tids format. Kolla kommandolistan. + + + Ny påminnelse mall satt. + + + Repeterar {0} varje {1} dag(ar), {2} timme(ar) and {3} minut(er). + + + Lista av repeterare + + + Ingen repeterare körs på denna server. + + + #{0} slutade. + + + Inga repeterande medelanden funna på denna server. + + + Resultat + + + Roller + + + Sida #{0} av roller på denna server: + + + Sida #{0} av roller för {1} + + + Inga färger använder rätt format. Använd `#00ff00` som exempel. + + + Började rotera {0} rollens färger. + + + Slutade rotera färger för {0} rollen + + + Denna servers {0} är {1} + + + Server Information + Fuzzy + + + Shard + + + Shard status + + + Shard **#{0}** är i {1} status med {2} servers + + + **Namn:** {0} **Länk:** {1} + + + Inga special emojis funna. + + + Spelar {0} låtar, {1} köad. + + + Textkanaler + Fuzzy + + + Här är länken till ditt rum: + + + Upptid + + + {0} av användare {1} är {2} + Id of the user kwoth#1234 is 123123123123 + + + Användare + + + Röstkanaler + Fuzzy + + + Du har redan gått med detta lopp! + + + Nuvarande röstningsresultat + + + Inga röster gjorda. + + + Rösten är redan igång på denna server. + + + 📃 {0} har skapat en röst som kräver din uppmärksamhet: + + + `{0}.` {1} med {2} röster. + + + {0} röstade. + Kwoth voted. + + + Privat Meddela mig det nummer som stämmer överens med svaret. + Fuzzy + + + Skicka ett Meddelande här med det nummer som stämmer överens med svaret. + + + Tack för att du röstade, {0} + + + {0} antal röster gjorda. + + + Plocka upp de genom att skriva `{0}pick` + + + Plocka upp den genom att skriva `{0}pick` + + + Inga användare funna. + + + sida {0} + + + Du måste vara i en röstkanal på denna server. + + + Det finns inga röstkanalsroller. + + + {0} har blivit **mutad** från text och röstchatt i {1} minuter. + + + Användare som går in i röstkanalen {0} får rollen {1}. + + + Användare som går + + + Röstkanalsroller + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.tr-TR.resx b/src/NadekoBot/Resources/ResponseStrings.tr-TR.resx new file mode 100644 index 00000000..b63550e8 --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.tr-TR.resx @@ -0,0 +1,2285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bu köy daha önceden alınmış veya yok edilmiş. + + + Bu köy önceden yok edilmiş. + + + Bu köy alınmamış. + + + {1}'ye karşı savaşta köy #{0} **BERTARAF EDİLDİ** + + + {0},{2} karşı savaşta #{1} üssünü alamadı. + + + {0}, {2} ile savaşan bir #{1} temel hak iddia etti. + + + @{0} zaten #{1} aldın. Yeni bir tane daha alamazsın. + + + {1}'a karşı savaşta @{0} tarafından yapılan hak talebinin süresi dolmuştur. + + + Düşman + + + {0} ile savaşa ilişkin bilgi + + + Hatalı köy numarası. + + + Savaş büyüklüğü geçerli değil. + + + Aktif olan savaşlar + + + Alınmamış + + + Bu savaşa katılmadınız. + + + @{0} Bu savaşa katılmadınız veya köyünüz yok edildi. + + + Aktif olan savaş yok. + + + Büyüklük + + + {0} ile olan savaş başladı. + + + {0} ile şavaş çıkardın. + + + {0} ile olan savaş sona erdi. + + + Böyle bir savaş bulunamadı. + + + {0} ile olan savaş başladı. + + + Tüm özel reaksiyon istatistikleri temizlendi. + + + Özel reaksiyon silindi + + + Yetersiz yetki.Global özel reaksiyonlar için bot sahibi yetkisi gerkirken, server tabanlı özel reaksiyonlar için Administrator yetkisi gerekir. + + + Tüm özel reaksiyonların listesi + + + Özel reaksiyonlar + + + Yeni özel reaksiyon + + + Hiç özel reaksiyon bulunamadı. + + + Bu kimliğe sahip bir özel reaksiyon bulunamadı. + + + Cevap + + + Özel reaksiyon istatistikleri + + + {0} özel reaksiyonun istatistikleri temizlendi. + + + Bu tetikleyici için herhangi bir istatistik bulunamadı, herhangi bir işlem yapılmadı. + + + Tetikleyen + + + Autohentai durduruldu. + + + Sonuç bulunamadı. + + + {0} zaten bayılmış. + + + {0} zaten canı dolu. + + + Senin türün zaten {0} + + + {2}{3}'de {4} hasar için {0}{1} kullandı + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + + + İntikam almadan bir daha saldıramazsın. + + + Kendine saldıramazsın. + + + {0} bayıldı! + + + Bir {1} kullanılarak {0} iyileştirildi + + + {0} canı {1} kaldı. + + + {0}'ı kullanamazsın. Kullanabileceğiniz hamle listesini görmek için `{1}ml` yazın. + + + {0} tipi için hareklerin listesi + + + Efektif değil. + + + Sende yeteri kadar {0} yok + + + {0} {1} ile canlandırıldı + + + {0} ile kendinizi yeniden canlandırdınız. + + + {1} için türünüz {0} olarak değiştirildi. + + + Biraz etkili. + + + Süper etkili! + + + Çok fazla hamle yaptınız, bu nedenle hareket edemezsiniz! + + + {0} türü {1} + + + Kullanıcı bulunamadı. + + + Bayıldın,yani hareket edemiyiceksin. + + + Kullanıcı girişinde **Otomatik Rol Tanımlaması** **Devre Dışı**. + + + Kullanıcı girişinde **Otomatik Rol Tanımlaması** **Devrede**. + + + Eklentiler + + + Profil fotoğrafı değiştirildi + + + {0} sunucusundan uzaklaştırıldınız. +Sebep: {1} + + + Uzaklaştırıldı. + PLURAL + + + Kullanıcı Uzaklaştırıldı + + + Bot ismi {0} olarak değiştirildi. + + + Bot durum mesajı {0} olarak değiştirildi. + + + Çıkış mesajlarının otomatik silinmesi devre dışı bırakıldı. + + + Çıkış mesajları {0} saniye sonra silinecektir. + + + Şu anki çıkış mesajı: {0} + + + {0} yazarak çıkış mesajlarını etkinleştirin. + + + Yeni çıkış mesajı tanımlandı. + + + Çıkış duyuruları devre dışı. + + + Çıkış duyuruları bu kanalda devreye sokuldu. + + + Kanal İsmi Değişti + + + Eski İsim + + + Kanal Konusu Değişti + + + Temizlendi. + + + İçerik + + + {0} rolü başarıyla oluşturuldu. + + + {0} yazı kanalı oluşturuldu. + + + {0} ses kanalı oluşturuldu. + + + Sağırlaştırma başarılı. + + + {0} sunucusu silindi. + + + Komut bildirimlerinin otomatik silinmesi başarıyla durduruldu. + + + Artık komut bildirimleri başarıyla siliniyor. + + + {0} yazı kanalı silindi. + + + {0} ses kanalı silindi. + + + Bu kullanıcıdan özel mesaj geldi: + + + Başarıyla yeni bağışçı eklendi. Bu kullanıcının bağışladığı toplam miktar: {0} 👑 + + + Aşağıda ismi bulunan kişilerin bu projeyi gerçekleşmesini sağladıkları için teşekkürler! + + + Özel mesajları tüm sahiplerine ileteceğim. + + + Özel mesajları sadece ilk sahibine ileteceğim. + + + Özel mesajları iletmeye başlayacağım. + + + Özel mesajları iletmeyi bırakacağım. + + + Karşılama mesajlarının otomatik silinmesi devre dışı bırakıldı. + + + Karşılama mesajları {0} saniye sonra silinecektir. + + + Şu anki özelden karşılama mesajı: {0} + + + {0} yazarak özelden karşılama mesajlarını aktif edebilirsiniz. + + + Yeni özelden karşılama mesajı tanımlandı. + + + Özel mesajdan karşılama duyuruları devre dışı. + + + Özel mesajdan karşılama duyuruları devrede. + + + Şu anki karşılama mesajı: {0} + + + {0} yazarak karşılama mesajlarını aktif et. + + + Yeni karşılama mesajı tanımlandı. + + + Karşılama duyuruları devre dışı. + + + Karşılama duyuruları bu kanalda aktif edildi. + + + Bu komutu, rol hiyerarşisinde sizinle aynı veya daha yüksek bir rolü olan kullanıcılar üzerinde kullanamazsınız. + + + Resimler {0} saniye sonra yüklendi! + + + Geçersiz giriş biçimi. + + + Geçersiz parametreler. + + + {0} {1}'e katıldı. + + + {0} sunucusundan atıldınız. +Sebep: {1} + + + Kullanıcı atıldı + + + Dil Listesi + + + Sunucunuzun dili değiştirildi: {0} - {1} + + + Bot varsayılan dili değiştirildi: {0} - {1} + + + Bot dili değiştirildi: {0} - {1} + + + Dil ayarları değiştirilemedi. Komutun kılavuzuna bakın. + + + Sunucunun dili değiştirildi: {0} - {1} + + + {0} {1}'den ayrıldı. + + + {0} sunucudan ayrıldı. + + + Bu kanaldaki {0} olayları kayıt ediliyor. + + + Bu kanaldaki bütün olaylar kayıt ediliyor. + + + Kayıtlar devre dışı. + + + Abone olabileceğiniz olaylar: + + + {0} günlük kayıtlarını yok sayar. + + + {0} günlüğe yazmayı yok saymaz. + + + {0} olayını günlüğe kaydetme işlemi durduruldu. + + + {0}, aşağıdaki rollerde bir söz atadı. + + + {0} gönderdiği mesaj `[Bot Sahibi]`: + + + Mesaj yollandı. + + + {0} {1}'den {2}'ye taşındı. + + + {0} içindeki mesajlar silinicek. + + + Mesaj {0} da güncellendi + + + Susturuldular! + PLURAL (users have been muted) + + + Susturuldu! + singular "User muted." + + + Bunun için gerekli iznim yok. + + + Yeni sessiz rolü atandı. + + + Bunu yapmak için **Yönetici** iznine ihtiyacım var. + + + Yeni Mesaj + + + Yeni takma ad + + + Yeni Konu + + + Takma Ad değiştirildi. + + + Sunucu bulunamadı. + + + Kimlik numarası bulunamadı. + + + Eski mesaj + + + Eski takma ad + + + Eski konu + + + Hata.Yüksek ihtimalle yeterli yetki'ye sahip değilim. + + + Bu server için yetkiler sıfırlandı. + + + Koruma Aktif + + + {0} Bu sunucudaki {0} **Devre Dışı**. + + + {0} Etkin + + + Hata. Rolleri Yönet iznine ihtiyacım var + + + Hiçbir koruma etkin değil. + + + Kullanıcı eşiği {0} ile {1} arasında olmalıdır. + + + {0} veya daha fazla kullanıcı {1} saniye içinde katılırsa, onlara {2} uygulayacağım. + + + Zaman {0} ile {1} saniye arasında olmalıdır. + + + {0} kullanıcısından tüm roller başarıyla kaldırdı. + + + Yetkileri almada hata. Yüksek ihtimalle yeteri kadar yetkim yok. + + + {0} rolünün rengi değiştirildi. + + + Bu rol bulunmamakta. + + + Belirtilen parametreler geçersiz. + + + Renk geçersiz veya yetersiz izinler nedeniyle hata oluştu. + + + {1} kullanıcısının sahip olduğu {0} rolü başarı ile alındı. + + + Yetkiyi almada hata. Yüksek ihtimalle yeteri kadar yetkim yok. + + + Rol yeniden adlandırıldı. + + + Rol yeniden adladırılmasında hata. Yüksek ihtimalle yeteri kadar yetkim yok. + + + Kendi rolunüzden daha yüksek rolleri değiştiremezsiniz. + + + {0} oynatılan mesaj kaldırıldı. + + + Rol {0}, listeye eklendi. + + + {0} bulunamadı. Temizlendi. + + + Rol {0} zaten listede. + + + Eklendi. + + + Döndürme işlemi durdu. + + + Döndürme işlemi etkinleştirildi. + + + Döndürülen durumların bir listesi: +{0} + + + Dönen durumlar ayarlanmadı. + + + Zaten {0} role sahip. + + + {0} özel otomatik atanmış role zaten sahibidir. + + + Otomatik atanmış roller artık özel! + + + {0} otomatik atanabilir rolü var + + + Bu rol otomatik atanabilir değil. + + + {0} rolünüz yok. + + + Otomatik atanabilir roller artık özel değil! + + + Bu rolü ekleyemem. `Rol hiyerarşisinde rolümden daha yüksek olan sahiplere veya diğer rollere rol ekleyemem. ' + + + {0}, otomatik atanabilir roller listesinden kaldırıldı. + + + Artık {0} rolü yok. + + + Şimdi {0} rolünüz var. + + + {1} kullanıcısına {0} rolü başarıyla eklendi + + + Rol eklenemedi. İzinlerim yetersiz. + + + Yeni profil resmi belirlendi! + + + Yeni kanal adı belirlendi. + + + Yeni oyun belirlendi! + + + Yeni yayıncı belirlendi! + + + Yeni kanal konusu belirlendi. + + + Shard {0} yeniden bağlandı. + + + Shard {0} yeniden bağlanıyor. + + + Kapatılıyor. + + + Kullanıcılar, {1} saniyede bir {0}'den fazla mesaj gönderemez. + + + Yavaşlatılmış mod devre dışı. + + + Yavaşlatılmış mod başlatıldı + + + Hafif bir şekilde yasaklandılar (atıldılar) + PLURAL + + + {0} bu kanalı yoksayacak. + + + {0} artık bu kanalı yoksaymayacak. + + + Bir kullanıcı {0} aynı mesajı aynı sırada gönderirse, bunları {1} yapacağım. +__Yok Sayılan Kanallar__: {2} + + + Metin kanalı oluşturuldu. + + + Metin kanalı yok edildi. + + + Sağırlaştırmayı kaldırma başarılı. + + + Sesi açıldı + singular + + + Kullanıcı adı + + + Kullanıcı adı değişti + + + Kullanıcılar + + + Kullanıcı yasaklandı + + + {0} sohbet **edemiyor**. + + + {0} sohbet **edebiliyor**. + + + Kullanıcı katıldı + + + Kullanıcı ayrıldı + + + {0}, metin ve sesli sohbetde **sessiz durumda**. + + + Kullanıcının rolü eklendi + + + Kullanıcının rolü kaldırıldı + + + {0} artık {1} + + + {0}, metin ve sesli sohbetde **sessiz durumda değil**. + + + {0}, {1} sesli kanalına katıldı. + + + {0}, {1} sesli kanalından ayrıldı. + + + {0}, {1} kanalından {2} sesli kanalına taşındı. + + + {0} **susturuldu**. + + + {0} **susturulması kaldırıldı**. + + + Ses kanalı oluşturuldu + + + Ses kanalı yok edildi + + + Ses + metin özelliği devre dışı. + + + Ses + metin özelliği etkin. + + + **Rolleri yönetme** ve/veya **Kanalları yönetme** iznim yok, Bu yüzden {0} sunucusunda 'ses + metin' çalıştıramıyorum. + + + Bu özelliği etkinleştiriyorsun/devre dışı bırakıyorsun ve **YÖNETİCİ izinlerine sahip değilim**. Bu bazı sorunlara neden olabilir ve daha sonra kendiniz metin kanallarını temizlemeklisiniz. + + + Bu özelliği etkinleştirmek için en azından **rolleri yönetmek** ve **kanal izinlerini yönetmek** zorundayım.(Tercih edilen Yönetim izni) + + + Metin sohbetinde {0} kullanıcı + + + Metin ve sesli sohbetinde {0} kullanıcı + + + Sesli sohbetten {0} kullanıcı + + + {0} sunucusundan hafif bir şekilde yasaklandınız. +Sebep: {1} + + + Kullanıcı yasağı kaldırıldı + + + Eski kayıtlar taşındı! + + + Taşıma işlemi sırasında hata oluştu, daha fazla bilgi için bot konsolunu kontrol edin. + + + Durum güncellemeleri + + + Kullanıcı hafif bir şekilde yasaklandı. + + + {1} 'e {0} ödül vermiş + + + Bir dahaki sefere artık ^_^ + + + Tebrik ederiz! {1} çevirdi ve {0} kazandı + + + Deste yeniden düzenlendi. + + + {0} çevirdi. + User flipped tails. + + + Tahmin ettin! {0} kazandın + + + Geçersiz numara belirtildi. 1 tanesini {0} madeni paraya çevirebilirsiniz. + + + {1} almak için bu mesaja {0} reaksiyon ekleyin. + + + Bu etkinlik {0} saat boyunca aktiftir. + + + Çiçek reaksiyonu olayı başladı! + + + {0}'dan {1}'e hediye verdi + X has gifted 15 flowers to Y + + + {0}'da {1} var + X has Y flowers + + + Kafa + + + Lider listesi + + + {2} rolünden {1} kullanıcıya {0} kazandı. + + + {0}'dan fazla bahse giremezsiniz. + + + {0}'dan daha az bahis oynayamazsınız + + + Yeterli düzeyde {0} yok + + + Destede artık kart yok. + + + Kullanıcı piyango çekti + + + {0} çevrildi. + + + Bahis + + + Vay canına!!! Tebrik ederiz!!! x{0} + + + Tek bir {0}, x{1} + + + Vaov! Şanslı! Üç çeşit! x{0} + + + Aferin! İki {0} - bahis x{1} + + + Kazandı + + + Kullanıcılar {0} almak için gizli bir kod yazmalıdır. +{1} saniye sürer. Kimseye söyleme. Shhh. + + + GizliOyun etkinliği sona erdi. {0} kullanıcılar ödüllerini aldı. + + + GizliOyunDurumu etkinliği başlatıldı + + + Kuyruk + + + Başarıyla {1}'den {0} aldı + + + Kullanıcı {2} sayısına sahip olmadığından {1}'ten {0} alamadı! + + + Listenin başına dön + + + Sadece bot sahibi + + + {0} kanal izni gerektiriyor. + + + Projeyi patreonda destekleyebilirsin:<{0}> ya da paypalde:<{1}> + + + Komutlar ve takma adlar + + + Komut listesi yeniden oluşturuldu. + + + Belirli bir komut hakkinda yardim icin, {0}h "Komut Adı" bu şekilde kullanınız. (Örneğin: {0}h >8ball). + + + Bu komutu bulamıyorum. Lütfen tekrar denemeden önce komutun var olduğunu doğrulayın. + + + Tanıtım + + + NadekoBot projesini destekleyebilirsiniz + Patreon <{0}> yada + Paypal <{1}> + Mesajda discord adınızı veya kimliğini bırakmayı unutma. + +**Teşekkür ederim** ♥️ + + + **Komutların listesi**: <{0}> +**Rehber ve dokümanlar barındırma sayfasında bulunabilir**: <{1}> + + + Komutların listesi + + + Modüllerin listesi + + + Modül komutlarının bir listesini görmek için "{0}cmds Modül İsmi" (Örneğin: {0}cmds Administration) şeklinde kullanmalısınız. + + + Bu modül mevcut değil. + + + {0} sunucu izni gerektirir. + + + İçindekiler + + + Kullanım + + + Otomatik hentai başladı. Her {0} saniyede bir aşağıdaki etiketlerden biriyle yeniden yayınlanıyor: +{1} + + + Etiket + + + Hayvan yarışı + + + Yeterli katılımcı olmadığından başlatılamadı. + + + Yarış doldu! Derhal başlıyoruz. + + + {0} bir {1} olarak katıldı + + + {0} bir {1} olarak ve {2} bahisleriyle katıldı! + + + Yarışa katılmak için {0}jr yazın. + + + 20 saniye içinde veya oda dolu olduğunda başlayarak. + + + {0} katılımcı ile başlıyor. + + + {0} {1}. olarak yarışı kazandı! + + + {0} {1}. olarak yarışı kazandı ve {2} aldı! + + + Geçersiz numara belirtildi. Bir kerede {0} - {1} zar atabilirsiniz. + + + {0} çevirdi + Someone rolled 35 + + + Zar atıldı: {0} + Dice Rolled: 5 + + + Yarış başlatılamadı. Muhtemelen başka bir yarış çalışıyor. + + + Bu sunucuda yarış yok + + + İkinci numara birinciden büyük olmalıdır. + + + Aşkı değişti + + + tarafından talip talep etti. + + + Boşandı + is that plural? + + + Beğendi + + + Fiyat + + + Henüz hiçbir talep de bulunulmadı. + + + En İyi Talipler + + + Çekiminiz zaten o talip ayarlıyken veya çekim yapmadığınız halde çekimliliğinizi kaldırmaya çalışıyorsunuz. + + + Bağlılıkları {0}'dan {1}'e değiştirildi. + +*Bu ahlaki açıdan sorgulanabilir.*🤔 + Make sure to get the formatting right, and leave the thinking emoji + + + Benzeşimini tekrar değiştirmek için {0} saat ve {1} dakika beklemelisiniz. + + + Benzeşim sıfırlandı. Artık sevdiğin bir insana sahip değilsin. + + + {0} 'ın talip olmasını istiyor. Aww <3 + + + {1} için kendi talibi olarak {0} iddiasında bulundu! + + + Seni seven bir talipden boşandın. Seni kalpsiz canavar. +{0} tazminat olarak {1} aldı. + + + Kendinize yakınlık kuramazsınız, sizi egomanyak. + + + 🎉 Aşkları yerine getirildi! 🎉 +{0}'un yeni durumu {1}! + + + Hiçbir talip bu kadar ucuz değil. Gerçek değeriniz düşük olsa dahi, en azından {0} ödemek zorundasınız. + + + Talip talebinde bulunmak için {0} veya daha fazla ödeme yapmalısınız! + + + Bu talip senin değil. + + + Kendinize talip edemezsiniz. + + + Son zamanlarda boşandın. Boşanmak için {0} saat ve {1} dakika beklemelisiniz. + + + Kimse + + + Senden hoşlanmayan bir talib den boşandın. {0} geri aldınız. + + + 8Top + + + Akrofobi + + + Oyun hiç sonuç vermeden sona erdi. + + + Oy yok. Oyun kazanan olmadan sona erdi. + + + Kısaltma {0} idi. + + + Akrofobi oyunu zaten bu kanalda çalışıyor. + + + Oyun başladı. Aşağıdaki kısaltma ile bir cümle oluşturun: {0}. + + + Gönderi yapmak için {0} saniye kaldı. + + + {0} cezalarını gönderdiler. ({1} toplam) + + + Gönderi sayısını yazarak oy verin + + + {0} oy kullandı! + + + Kazanan {0}, {1} puanla. + + + {0} kazanan!, gönderim yapan tek kullanıcı olmakla birlikte. + + + Soru + + + Beraberlik! Her ikisi de {0} + + + {0} kazandı! {1} atıyor {2} + + + Gönderilenler kapalı + + + Hayvan yarışı zaten çalışıyor. + + + Toplam: {0} Ortalama: {1} + + + Kategori + + + Bu sunucudaki cleverbot devre dışı bırakıldı. + + + Bu sunucudaki cleverbot etkinleştirildi. + + + Bu kanalda para birimi oluşturma devre dışı. + + + Para birimi oluşturma, bu kanalda etkinleştirildi. + + + {0} rastgele {1} ortaya çıktı! + plural +Fuzzy + + + Rastgele bir {0} ortaya çıktı! + Fuzzy + + + Bir soru yüklenemedi. + + + Oyun başladı + + + Adam asmaca oyunu başladı + + + Adam asmaca oyunu zaten bu kanalda çalışıyor. + + + Adam asmaca başlatılırken hata verdi. + + + "{0}hangman" terim türlerinin listesi: + + + Lider listesi + + + Yeterli düzeyde {0} yok + + + Sonuç yok + + + {0} adet topladı + Kwoth picked 5* + + + {0},{1} dikti. + Kwoth planted 5* + + + Oyuncak oyunu zaten bu sunucuda çalışıyor. + + + Oyuncak oyunu + + + {0} tahmin etti! Cevap şuydu: {1} + + + Bu sunucuda hiçbir oyuncak çalışmıyor. + + + {0}'da {1} puan var + + + Bu sorunun ardından bitiriyorum. + + + Süre doldu! Doğru cevap {0} idi + + + {0} tahmin etti ve oyunu kazandı! Cevap şuydu: {1} + + + Kendinize karşı oynayamazsınız. + + + TicTacToe Oyunu zaten bu kanalda çalışıyor. + + + Bir çizim! + + + TicTacToe bir oyun oluşturdu. + + + {0} kazandı! + + + Eşleşen üç + + + Hareket yok! + + + Zaman doldu! + + + {0}'un hareketi + + + {0} ile {1} karşılaşıyor + + + Sıraya {0} şarkı ekleniyor... + + + Otomatik Oynatıcı devre dışı. + + + Otomatik Oynatıcı etkin. + + + Varsayılan müzik sesi {0}% + + + Dizin kuyruğu tamamlandı. + + + adil oynatıcı + + + Şarkı bitti + + + Adil oynatıcı devre dışı. + + + Adil oynatıcı etkin. + + + Konumdan + + + Kimlik + + + Geçersiz giriş. + + + Şu anda maksimum oynatıcı zaman limiti yok. + + + Maksimum oynatıcı zaman limiti {0} saniye(ler) olarak ayarlandı. + + + Maksimum müzik sıra limiti, limitsiz olarak ayarlandı. + + + Maksimum şarkı sıra limiti {0} şarkı(lar) olarak ayarlandı. + + + Bu sunucunun bir ses kanalına ihtiyacın var. + + + İsim + + + Şu anda yürütülüyor + + + Şu anda aktif bir müzik oynatıcısı yok. + + + Aranılan sonuç bulunamadı. + + + Müzik oynatıcısı duraklatıldı. + + + Oynatıcı Sıra Listesi - Sayfa {0}/{1} + + + Şarkı oynatılıyor + + + `#{0}` - **{1}** *{2}* tarafından ({3} müzik) + + + Kayıtlı çalma listelerinin {0}. sayfası. + + + Çalma listesi silindi. + + + Bu çalma listesini silmek başarısız oldu.Ya mevcut değil yada oluşturan siz değilsiniz. + + + Bu id'ye sahip oynatma listesi mevcut değil. + + + Oynatma listesi tamamlandı. + + + Oynatma listesi kayıt edildi. + + + Limit {0} + + + Sıra + + + Şarkı sıraya eklendi. + + + Müzik sırası temizlendi. + + + Sıra {0}/{0} dolu. + + + Şu numaradaki şarkı kaldırıldı. + context: "removed song #5" + + + Geçerli şarkı tekrarlanıyor + + + Oynatma listesi tekrarlanıyor + + + Müzik parçası tekrarlanıyor + + + Geçerli müzik parçası tekrarı durduruldu. + + + Müzik oynatıcısı yürütülüyor. + + + Çalma listesi tekrarı devre dışı + + + Çalma listesi tekrarı etkin. + + + Şimdi bu kanaldaki şarkıların çalınması, bitmesi, duraklatılması ve çıkarılmasını yapacağım. + + + `{0}:{1}` atlandı + + + Şarkılar karıştırıldı + + + Şarkı taşındı + + + {0} saat {1} dakika {2} saniye + + + Konumlandır + + + limitsiz + + + Ses düzeyi 0 ile 100 arasında olmalıdır. + + + Ses düzeyi {0}% olarak ayarlandı. + + + {0} kanalı için TÜM MODÜLLERİN kullanımı devre dışı bırakıldı. + + + {0} kanalı için TÜM MODÜLLERİN kullanımı etkinleştirdi. + + + İzin verildi + + + {0} rolü için TÜM MODÜLLERİN kullanımı devre dışı bırakıldı. + + + {0} rolü için TÜM MODÜLLERİN kullanımı etkinleştirdi. + + + Bu sunucudaki TÜM MODÜLLERİN kullanımı devre dışı bırakıldı. + + + Bu sunucudaki TÜM MODÜLLERİN kullanımı etkinleştirdi. + + + {0} kullanıcısı için TÜM MODÜLLERİN kullanımı devre dışı bırakıldı. + + + {0} kullanıcısı için TÜM MODÜLLERİN kullanımı etkinleştirdi. + + + {0} adlı ve {1} id'li kullanıcı karalisteye alındı. + + + Komut {0} şimdi {1}'lik bir bekleme süresine sahip. + + + {0} komutunun şimdi bir bekleme süresi yok ve mevcut tüm bekleme süreleri temizlendi. + + + Komut çağırma süresi yok. + + + Komut maliyetleri + + + {2} kanalında {0} {1} kullanımı devre dışı bırakıldı. + + + {2} kanalında {0} {1} kullanımı etkinleştirildi. + + + Reddedildi + + + Filtrelenmiş kelimeler listesine {0} kelimesi eklendi. + + + Filtrelenmiş sözler listesi + + + Filtrelenmiş kelimeler listesinden {0} kelimesi kaldırıldı. + + + Geçersiz ikinci parametre. ({0} ile {1} arasındaki bir sayı olmalı) + + + Davet filtreleme bu kanal üzerinde devre dışı. + + + Davet filtreleme bu kanal üzerinde etkin. + + + Davet filtreleme bu sunucu üzerinde devre dışı. + + + Davet filtreleme bu sunucu üzerinde etkin. + + + {0}, #{1}'den #{2}'ye taşındı + + + {0} dizininde izin bulamıyor. + + + Maliyet ayarlanmadı. + + + komut + Gen (of command) + + + modül + Gen. (of module) + + + İzinler sayfası {0} + + + Geçerli izin rolü {0}. + + + Kullanıcılar artık izinleri düzenlemek için {0} rolü talep ediyor. + + + Bu dizinde izin bulunamadı. + + + Izin kaldırıldı #{0} - {1} + + + {2} rolü için {0} {1} kullanımını devre dışı bırakıldı. + + + {2} rolü için {0} {1} kullanımını etkinleştirildi. + + + sn. + Short of seconds. + + + Bu sunucuda {0} {1} kullanımını devre dışı bırakıldı. + + + Bu sunucuda {0} {1} kullanımı etkinleştirildi. + + + {0} Kimliği {1} ile kara listeden kaldırıldı + + + düzenlenemez + + + {2} kullanıcısı için {0} {1} kullanımı devre dışı bırakıldı. + + + {2} kullanıcısı için {0} {1} kullanımı etkinleştirildi. + + + Artık izin uyarıları göstermeyeceğim. + + + Şimdi izin uyarılarını göstereceğim. + + + Bu kanalda kelime filtreleme devre dışı. + + + Bu kanalda kelime filtreleme etkin. + + + Bu sunucuda kelime filtreleme özelliği devre dışı. + + + Bu sunucuda kelime filtreleme özelliği etkin. + + + Yetenekler + + + Henüz favori anime yok + + + Bu kanaldaki mesajların otomatik çevirisi başlatıldı. Kullanıcı mesajları otomatik olarak silinecek. + + + Otomatik-çeviri diliniz kaldırıldı. + + + Otomatik çevir diliniz {0}>{1} olarak ayarlandı. + + + Bu kanaldaki mesajların otomatik çevirisi başlatıldı. + + + Bu kanaldaki mesajların otomatik çevirisini durduruldu. + + + Bozuk giriş biçimi veya bir şeyler ters gitti. + + + Kartı bulamadım. + + + gerçek + + + Bölümler + + + Komik # + + + Rekabetçi kayıpları + + + Rekabetçi oynadı + + + Rekabetçi sıralaması + + + Rekabetçi Kazançları + + + Tamamlandı + + + Şart + + + Maliyet + + + Tarih + + + Tanımla: + + + Bırakıldı + + + Bölümler + + + Hata oluştu. + + + Örnek + + + Animu bulunamadı. + + + Mango bulunamadı. + + + Türler + + + Bu etiket için bir tanım bulunamadı. + + + Boy/Kilo + + + {0}m/{1}kg + + + Nem + + + Resim araması: + + + Bu filmi bulamadım. + + + Geçersiz kaynak veya hedef dili. + + + Şakalar yüklenmedi. + + + Enlem/Boylam + + + Seviye + + + {0}place etiketlerinin listesi + Don't translate {0}place + + + Lokasyon + + + Büyülü eşyalar yüklenmedi. + + + {0} adlı kişinin MAL profili + + + Bot sahibi MashapeApiKey belirtmedi. Bu işlevi kullanamazsınız. + + + Min/Maks + + + Kanal bulunamadı. + + + Sonuç bulunamadı. + + + Beklemede + + + Orjinal url + + + Bir osu! API anahtarı gerekiyor. + + + Başarısız osu! imza. + + + {0} resimler üzerinde bulundu. Rastgele {0} gösteriliyor. + + + Kullanıcı bulunamadı! Lütfen tekrar denemeden önce Bölge ve Savaşçı etiketini kontrol edin. + + + İzlemeyi planla + + + Platform + + + Hiçbir yetenek bulunamadı. + + + Pokemon bulunamadı. + + + Profil adresi: + + + Kalite: + + + Normal maç oynama süresi + + + Normal maç kazanma + + + Değerlendirme + + + Skor: + + + Arama: + + + URL kısaltılamadı.. + + + Kısa URL + + + Bir şeyler yanlış gitti. + + + Lütfen arama parametrelerini belirtin. + + + Durum + + + Mağaza url + + + Yayıncı {0} çevrimdışı. + + + Yayıncı {0}, {1} izleyici ile çevrimiçi. + + + Bu sunucudaki {0} yayıncısını takip ediyorsunuz. + + + Bu sunucuda herhangi bir yayıncıyı takip etmiyorsunuz. + + + Böyle bir yayın yok. + + + Yayın muhtemelen mevcut değil. + + + {0} yayıncısının ({1}) bildirimlerden kaldırdı. + + + Durum değiştiğinde bu kanalı bilgilendireceğim. + + + Gün doğumu + + + Gün batımı + + + Sıcaklık + + + Başlık: + + + En çok sevilen 3 anime: + + + Çeviri: + + + Tipler + + + Bu terim için tanım bulma başarısız. + + + Url + + + İzleyici + + + Seyret + + + Belirtilen wikia da terimi bulamadım. + + + Lütfen bir hedef wikia girip ardından arama sorgusu yapın. + + + Sayfa bulunamadı. + + + Rüzgar hızı + + + En çok yasaklanan {0} şampiyon + + + Cümleyi yozlaştırma başarısız oldu. + + + Katıldı + + + `{0}.` {1} [her saniye/{2:F2}] - toplam {3} + /s and total need to be localized to fit the context - +`1.` + + + Aktivite sayfası #{0} + + + {0} toplam kullanıcı. + + + Yapımcı + + + Bot Kimliği + + + {0}calc komutundaki fonksiyonların listesi + + + Bu kanalın {0} değeri {1} + + + Kanal konusu + + + Yürütülen komut + + + {0} {1}, {2} {3} e eşit. + + + Dönüştürücü tarafından kullanılabilen üniteler + + + {0} 'ı {1}' e dönüştüremem: birimleri bulunamadım + + + {0} 'ı {1}' e dönüştüremiyorum: birim türleri eşit değil. + + + Tarihinde oluşturuldu + + + Çapraz sunucu kanalına katıldı. + + + Çapraz sunucu kanalından ayrıldı. + + + Bu,senin CSC anahtarın + + + Özel emojiler + + + Hata + + + Özellikler + + + Kimlik + + + Dizin aralık dışında. + + + {0} rolüne sahip kullanıcı listesi + + + Kötüye kullanımını önlemek için bu komutlar, çok sayıda kullanıcısı olan rollerde kullanmanıza izin verilmez. + + + Geçersiz {0} değer. + Invalid months value/ Invalid hours value + + + Discord'a katıldı + + + Sunucuya katıldı + + + Kimlik: {0} +Üyeler: {1} +Kurucu Kimliği: {2} + + + Bu sayfada hiçbir sunucu bulunamadı. + + + Tekrarlayıcı Listesi + + + Üyeler + + + Bellek + + + Mesajlar + + + Mesaj tekrarlayıcısı + + + İsim + + + Takma ad + + + Kimse o oyunu oynamıyor. + + + Etkin tekrarlayıcı yok. + + + Bu sayfada rol yok. + + + Bu sayfada kırık yok. + + + Konu ayarlanmadı. + + + Sahip + + + Sahip kimlikleri + + + Durum + + + {0} Sunucu +{1} Metin kanalı +{2} Ses kanalı + + + Tüm teklifleri {0} anahtar kelime ile silindi. + + + Alıntılar Sayfa {0} + + + Bu sayfada alıntı yok. + + + Kaldırabileceğiniz alıntı bulunamadı. + + + Alıntı Eklendi + + + {0} numaralı alıntı silindi. + + + Bölge + + + Tarihinden beri kayıtlı + + + ({4:HH:mm} de {3:d.M.yyyy.}) {0}'ı {2}`de {1}'e hatırlatacağım + + + Geçerli zaman biçimi değil. Komut listesine bakın. + + + Yeni hatırlatma şablonu ayarlandı. + + + {0} her {1} gün(de) {2} saat(te) {3} dakika(da) bir tekrarlanıyor. + + + Tekrarlayıcıların listesi + + + Bu sunucuda çalışan tekrarlayıcı yok. + + + #{0} durduruldu. + + + Bu sunucuda tekrarlanan mesaj bulunamadı. + + + Sonuç + + + Roller + + + Bu sunucudaki tüm rollerin sayfası #{0}: + + + Page #{0} of roles for {1} + + + Renk doğru biçimde değil. Mesela `#00ff00` şekilde kullanın. + + + {0} rolü için renkler döndürmeye başlandı. + + + {0} rolü için renkleri döndürme durduruldu + + + Bu sunucunun {0} {1} + + + Sunucu bilgisi + + + Shard + + + Shard istatistikleri + + + Shard **#{0}** {2} sunucularıyla {1} durumundadır + + + **İsim:** {0} **Adres:** {1} + + + Özel emoji bulunamadı. + + + Şu anda {0} müzik yürütülüyor, {1} sırada. + + + Metin odası + + + İşte odanızın bağlantısı: + + + Çalışma süresi + + + {1} kullanıcısının {0} numarası {2} + Id of the user kwoth#1234 is 123123123123 + + + Kullanıcı + + + Ses kanalı + + + Zaten bu yarışa katıldınız! + + + Geçerli anket sonuçları + + + Oy yok. + + + Anket, bu sunucuda zaten çalışıyor. + + + 📃 {0} dikkatinizi gerektiren bir anket hazırladı: + + + `{0}.'{1} ile {2} oy aldı. + + + {0} oyladı. + Kwoth voted. + + + Özel cevap numarasına karşılık bana mesaj atın. + + + Yanıtın ilgili numarasını içeren bir Mesaj gönderin. + + + Oylama için teşekkür ederiz, {0} + + + {0} toplam oynanan oy. + + + `{0}pick` yazarak onları topla + + + `{0}pick` yazarak topla + + + Kullanıcı bulunamadı. + + + sayfa {0} + + + Bu sunucudaki bir ses kanalda olmalısınız. + + + Sesli kanal rolü yok. + + + {0} metin ve sesli sohbetten {1} dakika **sessiz** hale getirildi. + + + {0} sesli kanalına katılan kullanıcılar {1} rolünü alacaktır. + + + {0} sesli kanalına katılan kullanıcılar artık bir rol almaz. + + + Sesli kanal rolleri + + + {0} kimliğiyle özel reaksiyonu tetikleyen mesaj otomatik olarak silinmeyecek. + + + {0} kimliğiyle özel reaksiyonu tetikleyen mesaj otomatik olarak silinecek. + + + {0} kimliğine sahip özel reaksiyon için verilen yanıt mesajı DM olarak gönderilmeyecek. + + + {0} kimliğine sahip özel reaksiyon için verilen yanıt mesajı bir DM olarak gönderilecek. + + + Takma ad bulunamadı + + + Yazma {0} şimdi {1} 'in bir takma adı olacak. + + + Takma ad listesi + + + Tetikleyici {0} artık bir takma ada sahip değil. + + + Tetikleyici {0} 'nin takma adı yoktu. + + + Rekabetçi oyun süresi + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.zh-CN.resx b/src/NadekoBot/Resources/ResponseStrings.zh-CN.resx new file mode 100644 index 00000000..57e2e91c --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.zh-CN.resx @@ -0,0 +1,2387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 此基地已被认领或毁坏。 + + + 此基地已被毁坏 + + + + 此基地还未被认领 + + + 在与{1} 对战时**毁坏**基地 #{0} + + + {0} 在与 {2} 对战时 **取消认领** 基地 #{1} + + + {0} 在与 {2} 对战时 **认领** 基地 #{1} + + + @{0} 您已认领基地 #{1}。您不能认领一个新的。 + + + @{0} 在与 {1} 对战后认领的基地已过期。 + Fuzzy + + + 敌人 + + + 与{0} 对战的信息 + + + 此基地号码无效。 + + + 此战争大小无效 + Fuzzy + + + 现进行的战争列表 + Fuzzy + + + 未被认领 + + + 您并未参与此战争。 + + + @{0} 您并未参与此战争或此基地已被毁坏。 + + + 现无战争进行。 + Fuzzy + + + 大小 + + + 与{0}的战争已开始。 + + + 与{0}的战争已创建。 + + + 与{0}的战争已结束。 + + + 此战争不存在。 + + + 与{0}的对战已开始! + + + 所有定制反应数据清除。 + + + 定制反应删除 + + + 权限不足。通用定制反应需要机器人主人之权限而服务器定制反应需要管理员之权限。 + + + 列出所有定制反应 + + + 定制反应 + + + 新定制反应 + + + 没有找到定制反应。 + Fuzzy + + + 于此用户标识相联系的定制反应并未找到。 + + + 回应 + + + 定制反应数据 + + + {0} 定制反应数据清除。 + + + 此触发器并无数据, 因此无行动。 + + + 触发器 + + + autohentai停止。 + + + 没有结果。 + + + {0} 已昏厥。 + + + {0} 气血已满。 + + + 您的属性已是 {0} + + + 对 {2}{3} 使出{0}{1} 而造成 {4}伤害。 + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + + + 您不能在对方未反击之前再次攻击! + + + 您不能攻击自己。 + + + {0} 已昏厥! + + + 用 {1} 医好 {0} + + + {0} 还剩余 {1} 生命值。 + + + 您不能使用{0}. 输入`{1}ml` 观看您能用的招式。 + + + {0} 属性的招式列表 + + + 没有效果。 + + + 你并没有足够的 {0} + + + 使用 {1} 复活 {0} + + + 您使用 {0} 复活自己 + + + 您的属性已从 {0} 改成了 {1} + + + 效果不理想。 + + + 效果绝佳! + + + 您已一连使用太多招式,所以您不能行动! + + + {0} 的属性是 {1} + + + 该用户不存在。 + + + 您已昏厥所以不能移动! + + + **已解除**.为刚加入的用户 **自动指派身份** 的功能。 + + + **已启动**.为刚加入的用户 **自动指派身份** 的功能。 + + + 附件 + + + 头像更换成功。 + + + 你已经被{0}服务器封号。 +原因: {1} + + + 已被禁止了 + PLURAL + + + 用户禁止 + + + 机器人名改成{0} + + + 机器人状态换成{0} + + + 自动删除告别消息关闭。 + + + 告别消息将在{0}秒钟内删除。 + + + 现在告别消息: {0} + + + 输入{0}以启用告别消息 + + + 新告别消息设定。 + + + 告别公告被关掉。 + + + 此频道启用告别公告。 + + + 频道名字已改 + + + 旧名 + + + 频道主题已改 + + + 清理完毕。 + + + 内容 + + + 身份 {0} 成功创立 + + + 文字频道 {0} 成功创立 + + + 语音频道 {0} 成功创立 + + + 静音成功 + + + 服务器 {0} 已被删除 + + + 自动删除已处理指令已被停止 + + + 自动删除已处理指令已被启动 + + + 文字频道 {0} 成功删除 + + + 语音频道 {0} 成功删除 + + + 私人信息来自 + + + 成功添加新的捐赠者. 此用户总共捐赠了: {0} 👑 + + + 感谢下面列出的人们使这个项目发生! + + + 我会将DM转发给所有业主。 + + + 我会将DM转发给第一个业主。 + + + 我将从现在起转发DMs。 + + + 从现在开始我将停止转发DMs。 + + + 已关闭自动删除欢迎消息。 + + + 欢迎消息将在{0}秒后删除。 + + + 现DM欢迎消息:{0} + + + 输入{0}启用DM欢迎消息 + + + 新DM欢迎消息设定成功。 + + + DM欢迎公告关闭。 + + + DM欢迎公告启用。 + + + 当前欢迎消息是:{0} + + + 输入{0}来启用欢迎消息 + + + 新欢迎消息设定成功。 + + + 欢迎公告关闭。 + + + 欢迎公告在此频道开启。 + + + 您不能对身份层次结构中身份高于或等于您的身份的用户使用此命令。 + + + {0}秒后加载图片! + + + 输入格式不正确。 + + + 参数不正确。 + + + {0} 加入了 {1} + + + 你被踢出{0}的服务器。 +理由:{1} + + + 用户已被踢出 + Fuzzy + + + 语言列表 +{0} + Fuzzy + + + 您的服务器的语言设置现在为{0} - {1} + + + 机器人的默认语言环境现在是{0} - {1} + + + 机器人的语言设置为{0} - {1} + + + 设置语言设置失败。 重新访问此命令帮助。 + + + 此服务器的语言设置为{0} - {1} + + + {0}已离开{1} + + + 离开服务器{0} + + + 在此频道中记录{0}事件。 + + + 记录频道中所有事件 + + + 记录功能取消 + + + 您可以设定的记录项目: + + + 记录会忽略{0} + + + 记录不会忽略{0} + + + 已停止记录{0}事件。 + + + {0}已经提到了以下身份 + + + 来自{0}`[机器人主人]’的消息: + + + 消息已发. + + + {0}被移动由{1}到{2} + + + 在#{0}中删除讯息 + + + 讯息在#{0}中被更新 + + + 已静音 + PLURAL (users have been muted) + + + 已静音 + singular "User muted." + + + 权限不够执行此命令 + + + 新的静音角色设定成功。 + + + 我需要**管理**权限才能做那个。 + + + 新消息 + Fuzzy + + + 新昵称 + Fuzzy + + + 新主题 + Fuzzy + + + 昵称成功更换 + Fuzzy + + + 找不到该服务器 + + + 找不到具有该ID的分片。 + + + 旧信息 + Fuzzy + + + 旧昵称 + Fuzzy + + + 旧题目 + Fuzzy + + + 失败。很可能我没有足够的权限。 + + + 重置此服务器的权限。 + + + 主动保护 + Fuzzy + + + {0}已在此服务器禁用。 + + + {0}已启用。 + + + 失败。 我需要 ManageRoles 权限 + + + 未启用保护项目。 + Fuzzy + + + 用户阈值必须介于{0}和{1}之间。 + + + 如果{0}或更多用户在{1}秒内加入,我将{2}他们。 + + + 时间必须在{0}和{1}秒之间。 + + + 已成功从用户{0}中移除所有身份 + + + 无法移除身份。 我没有足够的权限。 + + + {0}身份的颜色已更改。 + + + 那个身份不存在。 + + + 指定的参数错误。 + + + 由于颜色无效或权限不足而发生错误。 + + + 已成功从用户{1}中删除身份{0} + + + 无法移除身份。 我没有足够的权限。 + + + 身份名已改 + + + 身份重命名失败。我的权限不足。 + + + 您不能编辑比你 + + + 已移除游玩消息:{0} + + + 身份{0}已添加到列表中。 + + + {0}未找到。已清理。 + + + 身份{0}已在列表中。 + + + 添加成功. + + + 旋转游玩状态关闭。 + + + 旋转游玩状态开启。 + + + 以下是旋转状态列表: +{0} + + + 未设置旋转游戏状态。 + + + 您已经拥有{0}身份。 + + + 您已拥有{0}独占的自行分配。 + + + 自行分配身份现在是独家! + + + 有{0}个可自行分配身份 + + + 这个身份是不可自行分配的。 + + + 您没有{0}身份。 + + + 自我分配的身份现在不是独家的! + + + 我无法向您添加该身份。 ‘我不能向身份层次结构中我身份以外的所有者或其他身份添加身份。’ + + + {0}已从可自我分配身份列表中删除。 + + + 您不再拥有{0}身份。 + + + 您现在拥有{0}身份。 + + + 已成功将身份{0}添加到用户{1} + + + 无法添加身份。 我没有足够的权限。 + + + 新头像集! + + + 新频道名称设定。 + + + 新游戏设定! + + + 新直播设定! + + + 新频道主题集。 + + + 分段{0}已重新连接。 + + + 分段{0}重新连接中。 + + + 关闭中 + + + 用户不能在{1}秒内发送超过{0}条消息。 + + + 慢速模式关闭。 + + + 慢速模式启动 + + + 软禁(踢出) + PLURAL + + + {0}将忽略此通道。 + + + 0}将不再忽略此通道。 + + + 如果用户发布{0}个相同的消息,我会{1}他们。 +     __IgnoredChannels__:{2} + + + 新文字频道成立 + Fuzzy + + + 文字频道已删除 + Fuzzy + + + Undeafen成功。 + + + 已取消静音 + singular + + + 用户名 + + + 用户名已更改 + Fuzzy + + + 用户 + + + 用户被禁止 + Fuzzy + + + {0}已从聊天内被静音**。 + + + {0}已从聊天内**取消静音**。 + + + 用户已加入 + Fuzzy + + + 用户离开了 + Fuzzy + + + {0} 已被文字与语音静音了 + + + 用户身份添加成功 + Fuzzy + + + 用户身份移除了 + Fuzzy + + + {0} 改成了 {1} + + + {0}已从文字和语音频道中取消静音**。 + + + {0}已加入{1}语音通道。 + + + {0}已离开{1}语音通道。 + + + {0}已从{1}移至{2}语音通道。 + + + {0}已被**静音**。 + + + {0}已被**取消静音**。 + + + 语音频道已创建 + Fuzzy + + + 语音通道已被毁 + Fuzzy + + + 已停用语音+文字功能。 + + + 启用语音+文字功能。 + + + 我没有**管理身份**和/或**管理频道**权限,所以我不能在{0}服务器上运行`语音+文字`。 + + + 您正在启用/禁用此功能,并且**我没有ADMINISTRATOR权限**。 这可能会导致一些问题,您必须自己清理文本频道。 + + + 我需要至少**管理身份**和**管理频道**权限,以启用此功能。 (优先管理权限) + + + 用户{0}来自文字频道 + + + 用户{0}来自文字和语音频道 + + + 用户{0}来自语音频道 + + + 您已从{0}服务器软禁止。 +原因:{1} + + + 用户已取消禁止 + Fuzzy + + + 迁移完成! + + + 在迁移时出错,请检查机器人的控制台以获取更多信息。 + + + 在线状态更新 + Fuzzy + + + 用户被软禁用 + Fuzzy + + + 已将{0}奖励给{1} + + + 下一次好运^ _ ^ + + + 恭喜! 您赢得{0}因为您滚{1}或以上 + + + 卡牌改组。 + + + 抛了{0}。 + User flipped tails. + + + 你猜到了! 您赢得了{0} + + + 指定的数字无效。 你可以抛1到{0}钱币。 + + + 将{0}反应添加到此消息以获取{1} + + + 此活动在{0}小时内有效。 + + + 花反应活动开始了! + + + 给了{1}{0} + X has gifted 15 flowers to Y + + + {0}拥有{1} + X has Y flowers + + + + Fuzzy + + + 排行榜 + + + 从{2}身份授予{0}至{1}名用户。 + + + 您赌注不能超过{0} + + + 您赌注不能低于{0} + + + 您没有足够的{0} + + + 卡牌组中没有更多的牌。 + + + 抽奖用户 + Fuzzy + + + 您抛了{0}。 + + + 赌注 + + + 哇啊啊啊啊啊啊! 恭喜! x {0} + + + 单个{0},x {1} + + + 哇!好运! 三个相同! x {0} + + + 做得好! 两个{0} - 投注x {1} + + + 胜利 + + + 用户必须键入密码才能获取{0}。 +持续{1}秒。 嘘~别跟任何人说。 + + + SneakyGame事件结束。 {0}个用户收到了奖励。 + + + SneakyGameStatus事件已启动 + + + + Fuzzy + + + 已成功从{1}取得{0} + + + 无法从{1}取得{0},因为用户没有那么多{2}! + + + 返回ToC + + + 仅限Bot Owner + Fuzzy + + + 需要{0}频道权限。 + + + 您可以在patreon上支持项目:<{0}>或paypal:<{1}> + + + 命令和别名 + Fuzzy + + + 命令列表已重新生成。 + Fuzzy + + + 输入`{0} h CommandName`可查看该指定命令的帮助。 例如 `{0} h> 8ball` + + + 我找不到该命令。 请再次尝试之前验证该命令是否存在。 + + + 描述 + + + 您可以在: +Patreon <{0}>或 +Paypal <{1}> +上支持NadekoBot +不要忘记在邮件中留下您的不和名字或ID。 + +**谢谢**♥️ + + + **命令列表**:<{0}> +**主机指南和文档可以在这里找到**:<{1}> + Fuzzy + + + 命令列表 + Fuzzy + + + 组件列表 + Fuzzy + + + 输入“{0} cmds ModuleName”以获取该组件中的命令列表。 例如`{0} cmds games` + + + 该组件不存在。 + + + 需要{0}服务器权限。 + + + 目录 + Fuzzy + + + 用法 + + + 自动hentai启动。 使用以下标记之一重新排列每个{0}: +{1} + + + 标签 + + + 动物竞赛 + Fuzzy + + + 启动失败,因为没有足够的参与者。 + + + 竞赛已满! 立即开始。 + + + {0}加入为{1} + + + {0}加入为{1},赌注{2}! + + + 输入{0} jr 以加入竞赛。 + + + 在20内秒或当房间满后开始。 + + + {0}个参与者开始。 + + + {0}为{1}赢得竞赛! + + + 0}为{1}赢得竞赛,和赢得{2}! + + + 指定的数字无效。 您可以一次滚动{0} - {1}骰子。 + + + 掷了{0} + Someone rolled 35 + + + 掷骰子:{0} + Dice Rolled: 5 + + + 竞赛启动失败。 另一个比赛可能正在运行。 + + + 此服务器上不存在竞赛 + + + 第二个数字必须大于第一个数字。 + + + 爱被改变 + Fuzzy + + + 声称 + Fuzzy + + + 离婚 + + + 喜欢 + + + 价钱 + + + 没有waifus被要求。 + + + 最佳Waifus + + + 您的兴趣已设置为该waifu,或者您尝试在没有兴趣的情况下删除您的兴趣。 + + + 将把兴趣从{0}更改为{1}。 + +*这在道德上是有问题的*🤔 + Make sure to get the formatting right, and leave the thinking emoji + + + 您必须等待{0}小时和{1}分钟才能再次更改您的兴趣。 + + + 您的兴趣已重置。 你不再有你喜欢的人。 + + + 想成为{0}的waifu。哇非常可爱<3 + + + 声明{0}为他的waifu,花了{1}! + + + 你已经离婚了一个喜欢你的waifu。 你无情的怪物。 +{0}收到了{1}作为补偿。 + + + 你不能设置兴趣自己,你好自卑。 + + + 🎉他的爱实现! 🎉 +{0}的新值为{1}! + + + 没有waifu那么便宜。 您必须至少支付{0}才能获得waifu,即使他们的实际价值较低。 + + + 您必须支付{0}或更多才能认领那个waifu! + + + 那waifu不是你的。 + + + 你不能认领自己。 + + + 你最近离婚了。 您必须等待{0}小时和{1}分钟再次离婚。 + + + 没人 + + + 你离婚了一个不喜欢你的waifu。 您收到了{0}。 + + + 8ball + + + 恐惧症游戏 + + + 游戏结束,没人提交。 + + + 没人投票。 游戏结束,没有赢家。 + + + 首字母缩写是{0}。 + + + 恐惧症游戏已经在这个频道中运行。 + + + 游戏开始。 创建具有以下首字母缩写的句子:{0}。 + + + 您有{0}秒的时间提交。 + + + {0}提交了他的判决。 (总{1}个) + + + 通过输入提交数字投票 + + + {0}投了票! + + + 获胜者{0}获得{1}分。 + + + {0}赢了因为是唯一的提交用户! + + + + + + 平局! 两个都挑了{0} + + + {0}赢了! {1} 打赢了 {2} + + + 提交关闭 + Fuzzy + + + 动物竞赛已经运行。 + + + 总计:{0} 平均:{1} + + + 类别 + + + 在此服务器上禁用cleverbot。 + + + 在此服务器上启用cleverbot。 + + + 在此频道上停用的货币生成功能。 + + + 在此频道上启用的货币生成功能。 + + + {0} 个 {1}出现了! 通过输入`{2} pick'来拾取 + plural +Fuzzy + + + 一个{0}出现了! 通过输入`{1} pick`来拾取 + Fuzzy + + + 加载问题失败。 + + + 游戏开始 + Fuzzy + + + Hangman游戏开始了 + + + Hangman游戏已在此频道上打开。 + + + 启动hangman错误。 + + + “{0} hangman”字词类型列表: + + + 排行榜 + + + 您没有足够的{0} + + + 没有结果 + + + 采了{0} + Kwoth picked 5* + + + {0}种了{1} + Kwoth planted 5* + + + 琐事游戏已经在这个服务器上运行。 + + + 琐事游戏 + + + {0}猜对了! 答案是:{1} + + + 此服务器上没有运行琐事游戏。 + + + {0}有{1}分 + + + 这个问题后停止。 + + + 时间到! 正确的答案是{0} + + + {0}猜到了,赢得了游戏! 答案是:{1} + + + 你不能对自己玩。 + + + TicTacToe游戏已在此频道中运行。 + + + 平局! + + + 开始了一局TicTacToe游戏。 + + + {0}赢了! + Fuzzy + + + 相配了三个 + Fuzzy + + + 没有地方动了! + + + 时间已过! + Fuzzy + + + 轮到{0}了 + + + {0}对{1} + + + 正在排{0}首歌... + + + 已停用自动播放。 + + + 已启用自动播放。 + + + 默认音量设置为{0}% + + + 目录队列完成。 + + + 公平播放 + + + 完成歌曲 + Fuzzy + + + 停用公平播放。 + + + 启用公平播放。 + + + 从位置 + + + ID + + + 输入错误。 + + + 最大播放时间没有限制移除。 + + + 最大播放时间设置为{0}秒。 + + + 最大音乐队列大小设置为无限。 + + + 最大音乐队列大小设置为{0}首。 + + + 您需要在此服务器上加入语音频道。 + + + + + + 现在播放 + Fuzzy + + + 没有活动音乐播放器。 + + + + 没有搜索结果。 + + + 音乐播放暂停。 + + + 播放器队列 - {0} / {1}页 + Fuzzy + + + 正在播放 + Fuzzy + + + `#{0}` - ** {1} ** by * {2} *({3}首歌) + + + 有保存{0}页的播放列表 + Fuzzy + + + 播放列表已删除。 + + + 无法删除该播放列表。 它不存在,或者你不是它的作者。 + + + 具有该ID的播放列表不存在。 + + + 播放列表队列完成。 + + + 播放列表已保存 + Fuzzy + + + {0}秒限制 + + + 队列 + + + 歌加入队列 + Fuzzy + + + 音乐队列已清除。 + + + 队列已满{0} / {0}。 + + + 歌被移除 + context: "removed song #5" + + + 重复播放当前歌曲 + Fuzzy + + + 重复播放列表 + Fuzzy + + + 重复曲目 + Fuzzy + + + 当前曲目停止重复。 + + + 音乐播放已恢复。 + + + 禁用重复播放列表 + + + 重复播放列表已启用。 + + + 我现在将在此频道里输出播放,完成,暂停和删除歌曲。 + + + 跳到‘{0}:{1}’ + + + 歌播放列表曲被随机。 + Fuzzy + + + 歌曲被移动 + Fuzzy + + + {0}小时 {1}分钟 {2}秒 + + + 到位置 + + + 无限 + + + 音量必须介于0和100之间 + + + 音量设置为{0}% + + + 在{0}频道上禁止所有组件的使用。 + Fuzzy + + + 在{0}频道上允许启用所有组件。 + Fuzzy + + + 允许 + + + {0}身份的所有组件被禁止使用。 + Fuzzy + + + {0}身份的所有组件被允许使用。 + Fuzzy + + + 在此服务器上禁止所有组件的使用。 + + + 在此服务器上允许所有组件的使用。 + + + {0}用户的所有模块被禁止使用。 + Fuzzy + + + {0}用户的所有模块被允许使用。 + Fuzzy + + + ID为{1}被加入黑名单{0} + + + 命令{0}冷却时间现有{1}秒。 + + + 命令{0}没有冷却时间了,现有所有的冷却时间已被清除。 + Fuzzy + + + 没有设置命令冷却时间。 + + + 命令成本 + Fuzzy + + + {2}频道上已停用{0} {1}。 + Fuzzy + + + 已在{2}频道上启用{0} {1}的使用。 + Fuzzy + + + 被拒绝 + + + 以巴{0}添加到已过滤字词列表中。 + + + 被过滤的词列表 + Fuzzy + + + 已从过滤字词列表中删除{0}。 + + + 第二个参数无效(必须是{0}和{1}之间的数字) + + + 在此频道上停用邀请过滤功能。 + + + 在此频道上启用邀请过滤。 + + + 在此服务器上停用邀请过滤功能。 + + + 在此服务器上启用邀请过滤功能。 + + + 已将权限{0}从#{1}移至#{2} + + + 在索引#{0}找不到权限 + + + 未设置费用。 + + + 命令 + Gen (of command) + + + 组件 + Gen. (of module) + + + 权限页面第{0}页 + + + 当前权限身份为{0}。 + + + 用户现在需要{0}身份才能编辑权限。 + + + 在该索引中找不到权限。 + + + 已删除权限#{0} - {1} + + + 禁止{2}身份使用{0} {1}。 + + + 允许{2}身份使用{0} {1}。 + + + + Short of seconds. + + + 此服务器上的{0} {1}已被禁止使用。 + + + 此服务器上的{0} {1}已被允许使用。 + + + ID为{1}的{0}从黑名单上移除 + + + 不可编辑 + + + {2}用户的{0} {1}已被禁止使用。 + + + {2}用户的{0} {1}已允许使用。 + + + 我将不再显示权限警告。 + + + 我现在将显示权限警告。 + + + 此频道上的字过滤已停用。 + + + 此频道上的字过滤已启用。 + + + 此服务器上的字过滤已停用。 + + + 此服务器上的字过滤已启用。 + + + 能力 + + + 没有最喜爱的动漫 + + + 开始自动翻译此频道上的消息。 用户消息将被自动删除。 + + + 您的自动翻译语言已删除。 + + + 您的自动翻译语言已设置为{0}> {1} + + + 开始自动翻译此频道上的消息。 + + + 停止自动翻译此频道上的消息。 + + + 错误格式或出现错误。 + + + 找不到该卡。 + + + + + + + + + 漫画# + + + 竞争模式失败次数 + Fuzzy + + + 竞争模式玩次数 + Fuzzy + + + 竞争模式排名 + Fuzzy + + + 竞争模式胜利次数 + + + 完成 + + + 条件 + + + 花费 + + + 日期 + + + 定义: + + + 放掉 + + + 剧集 + + + 发生了错误。 + + + 例子 + + + 找不到那个动画。 + + + 找不到漫画。 + + + 类型 + + + 未能找到该标记的定义。 + + + 身高/体重 + + + {0} m / {1} kg + + + 湿度 + + + 图片搜索: + Fuzzy + + + 找不到该电影。 + + + 来源或目标语言错误。 + + + 笑话没加载。 + + + 纬度/经度 + + + 等级 + + + {0}地方标记列表 + Don't translate {0}place + + + 地点 + + + 未加载魔术项目。 + + + {0}的MAL个人资料 + + + 机器人的业主没有指定MashapeApiKey。 您不能使用此功能。 + + + 最小/最大 + + + 找不到频道。 + + + 没找到结果。 + + + 等候接听 + Fuzzy + + + 原始网址 + Fuzzy + + + 需要osu!API密钥。 + + + 无法检索osu! 线索。 + + + 找到{0}张图片。 显示随机{0}。 + + + 找不到用户! 请再次前检查区域和BattleTag。 + + + 计划看 + + + 平台 + + + 找不到能力。 + + + 找不到宠物小精灵。 + + + 个人资料链接: + Fuzzy + + + 质量: + + + 快速游戏时间 + Fuzzy + + + 快赢 + Fuzzy + + + 评分 + + + 得分: + + + 搜索: + Fuzzy + + + 无法缩短该链接。 + + + 短链接 + Fuzzy + + + 出了些问题。 + + + 请指定搜索参数。 + + + 状态 + + + 储存链接 + Fuzzy + + + 直播台{0}已离线。 + + + 直播台{0}在线有{1}个观众。 + + + 您在此服务器上关注{0}个直播台 + + + 您未在此服务器上关注任何直播台。 + + + 没有这个直播台。 + + + 直播台可能不存在。 + + + 已从({1})的通知中移除{0}的直播台 + + + 状态更改时,我会通知此频道。 + + + 日出 + + + 日落 + + + 温度 + + + 标题: + + + 3个最喜欢的动画: + + + 翻译: + + + 类型 + + + 未能找到该字词的定义。 + + + 链接 + + + 观众 + + + 观看 + + + 无法在指定的维基上找到该字词。 + + + 请输入目标维基,然后搜索查询。 + + + 找不到该页面。 + + + 风速 + Fuzzy + + + {0}个被封号最多的英雄 + + + 无法yodify您的句子。 + + + 加入 + + + `{0}.` {1} [{2:F2}/秒] - {3} 总计 + /s and total need to be localized to fit the context - +`1.` + + + 活动页面#{0} + + + {0}个用户。 + + + 作者 + + + 机器ID + + + {0} 计算器命令列表 + + + 此频道的{0}是{1} + + + 频道主题 + Fuzzy + + + 执行的命令 + Fuzzy + + + {0} {1}等于{2} {3} + + + 转换器可以使用的单位 + + + 无法将{0}转换为{1}:找不到单位 + + + 无法将{0}转换为{1}:单位类型不属于一类 + + + 创建于 + Fuzzy + + + 加入跨服务器频道。 + + + 离开跨服务器频道。 + + + 这是您的CSC令牌 + + + 自定义Emojis + Fuzzy + + + 错误 + + + 功能 + + + ID + + + 索引超出范围。 + + + 以下是这个身份的用户列表: + Fuzzy + + + 为防止滥用,您不能对有过多用户的身份使用此命令。 + Fuzzy + + + {0}值错误。 + Invalid months value/ Invalid hours value + + + 加入Discord + + + 加入服务器 + Fuzzy + + + ID:{0} +会员数:{1} +业主ID:{2} + Fuzzy + + + 在该网页上找不到服务器。 + + + 重复列表 + Fuzzy + + + 会员 + + + 存储 + + + 讯息 + + + 消息重复功能 + Fuzzy + + + 名字 + + + 昵称 + + + 没有人在玩那个游戏 + + + 没有正在重复的消息。 + + + 此页面上没有身份。 + + + 此页面上没有分片。 + + + 没有主题设置。 + + + 业主 + + + 业主IDs + + + 状态 + + + {0}个服务器 +{1}个文字频道 +{2}个语音频道 + + + 已删除所有使用{0}关键字的引用。 + + + 引用的第{0}页 + + + 此页面上没有引用。 + + + 没有您可以删除的引用。 + + + 引用被添加 + + + 引用#{0}删除。 + + + 区域 + + + 注册日 + Fuzzy + + + 我将在{2}`({3:d.M.yyyy。}的{4:HH:mm})提醒{0}关于{1} + + + 无效时间格式。 检查命令列表。 + + + 新的提醒模板被设定。 + + + 会每{1}天{2}小时{3}分钟重复{0}。 + + + 重复消息列表 + Fuzzy + + + 此服务器上没有运行重复消息。 + + + #{0}已停止。 + + + 此服务器上没有找到被重复的消息。 + + + 结果 + + + 身份 + + + 此服务器上所有身份第{0}页: + + + {1}身份的第{0}页 + + + 颜色的格式不正确。 例如,使用 “#00ff00”。 + + + 开始轮流{0}身份的颜色。 + + + 停止{0}身份颜色轮流 + + + 此服务器的{0}是{1} + + + 服务器信息 + Fuzzy + + + 分片 + + + 分片统计 + Fuzzy + + + 分片**#{0} **与{2}台服务器处于{1}状态 + + + **名称:** {0} **链接:** {1} + + + 没有找到特殊的emojis。 + + + 正在播放{0}首歌,{1}首等待播放。 + + + 文字频道 + Fuzzy + + + 这是你的房间链接: + + + 正常运行时间 + + + 用户 {1} 的{0} 是 {2} + Id of the user kwoth#1234 is 123123123123 + + + 用户 + + + 语音频道 + Fuzzy + + + 你已经参加这场比赛! + + + 当前投票结果 + + + 没有票投。 + + + 此服务器上已运行投票。 + + + 📃{0}创建一个需要您注意的投票: + + + '{0}'。{1} 有 {2}票。 + + + {0}投了票。 + Kwoth voted. + + + 私人消息我相应答案的数字。 + + + 在这里发送消息相应答案的数字。 + + + 谢谢投票,{0} + + + {0}投票总数。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Resources/ResponseStrings.zh-TW.resx b/src/NadekoBot/Resources/ResponseStrings.zh-TW.resx new file mode 100644 index 00000000..d42f47bc --- /dev/null +++ b/src/NadekoBot/Resources/ResponseStrings.zh-TW.resx @@ -0,0 +1,2288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 該基地已被佔領或摧毀。 + + + 該基地已摧毀。 + + + 該基地尚未佔領 + + + 在與 {1} 對戰時 **摧毀** 了基地 #{0} + + + {0} 在與 {2} 對戰時 **解放** 基地 #{1} + + + {0} 在與 {2} 對戰時 **佔領** 基地 #{1} + + + @{0} 您已佔領基地 #{1}。您不能再佔領一個新的。 + + + 在 @{0} 與 {1} 對戰後佔領的基地已失效。 + + + 敵人 + + + 與 {0} 對戰的信息 + + + 無效的基地編號。 + + + 無效的戰爭大小。 + + + 目前正在進行的戰爭 + + + 未佔領 + + + 您並未参與此戰爭。 + + + @{0} 您並未参與此戰爭或此基地已被毁壞。 + + + 目前尚無戰爭進行中。 + + + 大小 + + + 與 {0} 的戰爭已經開始了。 + + + 與 {0} 的戰爭已創建。 + + + 與 {0} 的戰爭已結束。 + + + 此戰爭不存在。 + + + 與 {0} 的戰爭已開始! + + + 所有自訂回應統計已刪除。 + To simplified chinese crew: You guys forgot about the "stats" + + + 自訂回應已刪除 + + + 權限不足。伺服器自訂回應需要管理員權限,而只有 Bot 擁有者才能設定全域自訂回應。 + + + 列出所有自訂回應 + + + 自訂回應 + + + 新自訂回應 + + + 沒有找到自訂回應 。 + + + 找不到輸入的自訂回應編號。 + + + 回應 + + + 自訂回應統計 + + + 清除了 {0} 自訂回應的統計。 + + + 尚未觸發此回應,故無結果。 + + + 觸發 + + + Autohentai 指令效果停止。 + Keep in mind Autohentai is the actual command name, avoid translating it. + + + 沒有结果。 + + + {0} 已昏厥。 + + + {0} HP已滿。 + + + 您的屬性已是 {0} + + + 對 {2}{3} 使出 {0}{1} 而造成 {4} 點傷害。 + Kwoth used punch:type_icon: on Sanity:type_icon: for 50 damage. + + + 對方反擊前無法對他再次攻擊! + + + 您不能攻擊自己。 + + + {0} 已昏厥! + + + 用了一個 {1} 醫好 {0} + + + {0} 還剩餘 {1} 生命值。 + + + 您不能使用 {0} 。請輸入 `{1}ml` 來查閱您能用的招式。 + + + {0} 屬性的招式列表 + + + 沒有效果。 + + + 你沒有足夠的 {0} + + + 使用了一個 {1} 復活 {0} + + + 您使用了一個 {0} 復活了自己 + + + 您的屬性已從 {0} 變更成 {1} + + + 效果一般。 + + + 效果絕佳! + + + 您已連續使用太多招式,所以您無法行動! + + + {0} 的屬性是 {1} + + + 該成員不存在。 + + + 您已昏厥所以不能移動! + + + **自動指派身分組**給新加入的成員**已停用**。 + + + **自動指派身分組**給新加入的成員**已啟用**。 + + + 附件 + + + 頭像更換成功。 + + + 你已被 {0} 伺服器封鎖。 +原因:{1} + + + 用戶已封鎖 + PLURAL + + + 成員已封鎖 + + + Bot 暱稱已改為 {0} + + + Bot 狀態已改為 {0} + + + 自動刪除告別訊息功能已停用。 + + + 告別訊息將於 {0} 秒後刪除。 + + + 目前的告別訊息: {0} + + + 輸入 {0} 來啟用告別通知 + + + 新的告別訊息已設定。 + + + 告別通知已停用。 + + + 在這個頻道啟用告別通知。 + + + 頻道名稱已更改 + + + 舊頻道名稱 + + + 頻道主題已更改 + + + 清理完畢。 + + + 内容 + + + 成功創建身分組 {0} + + + 成功創建文字頻道 {0} + + + 成功創建語音頻道 {0} + + + 成功禁音 + + + 已刪除伺服器 {0} + + + 自動刪除已處理指令已停用 + + + 自動刪除已處理指令已啟用 + + + 成功刪除文字頻道 {0} + + + 成功刪除語音頻道 {0} + + + 私人訊息來自 + + + 成功新增了新的捐贈者。此成員總共捐贈了:{0} + + + 感謝下列的人使這個項目繼續運作! + + + 我會將私人訊息轉發給所有擁有者。 + + + 我會將私人訊息轉發給第一個擁有者。 + + + 我將開始轉發私人訊息。 + + + 我將停止轉發私人訊息。 + + + 自動刪除歡迎訊息已停用。 + + + 歡迎訊息將於 {0} 秒後刪除。 + + + 目前的歡迎私訊:{0} + + + 輸入 {0} 來啟用歡迎私訊 + + + 新的歡迎私訊已設定。 + + + 私訊歡迎公告已停用。 + + + 私訊歡迎公告已啟用。 + + + 目前的歡迎訊息: {0} + + + 輸入 {0} 來啟用歡迎訊息 + + + 新的歡迎訊息已設定。 + + + 歡迎通知已關閉。 + + + 在這個頻道啟用歡迎通知。 + + + 您不能對身分組與您一樣或更高的成員使用此指令。 + + + 圖片共花了 {0} 秒載入! + + + 無效的輸入格式。 + + + 無效的參數。 + + + {0} 已加入 {1} + + + 你已被 {0} 伺服器踢出。 +原因:{1} + + + 成員已被踢出 + + + 可用的語言清單 +{0} + + + 您的伺服器語言現在為 {0} - {1} + + + Bot 的預設語言為 {0} - {1} + + + Bot 的語言已被設定為 {0} - {1} + + + 語言設定失敗,請重新檢閱本指令說明。 + + + 本伺服器的語言現在為 {0} - {1} + + + {0} 已離開 {1} + + + 已離開伺服器 {0} + + + 在此頻道中紀錄 {0} 事件。 + + + 在此頻道中記錄所有事件。 + + + 紀錄功能已停用。 + + + 您可以記錄的事件: + + + 紀錄將會忽略 {0} + + + 紀錄將不會忽略 {0} + + + 已停止紀錄 {0} 事件。 + + + {0} 提到了下列身分組 + + + 来自 {0} '[Bot所有者]’ 的消息: + + + 訊息已傳送。 + + + {0} 已從 {1} 移動至 {2} + + + #{0} 中删除了讯息 + + + #{0} 中更新了訊息 + + + 已静音 + PLURAL (users have been muted) + + + 已静音 + singular "User muted." + + + 我並沒有足夠的權限來執行此指令。 + + + 新的禁言身分已設定。 + + + 我需要此伺服器的**管理**權限才能執行此指令。 + + + 新訊息 + + + 新暱稱 + + + 新主題 + + + 暱稱已變更 + + + 找不到那個伺服器 + + + 找不到有著那個ID的Shard。 + + + 原始訊息 + + + 原始暱稱 + + + 原始主題 + + + 錯誤: 很可能我並沒有足夠的權限。 + + + 此伺服器的權限已重設。 + + + 生效中的保護機制 + + + {0} 已在此伺服器 **停用**。 + + + {0} 已啟用。 + + + 錯誤。我需要此伺服器的 管理身分組 權限 + + + 沒有生效中的保護機制 + + + 成員緩衝數應介於 {0} 和 {1} 之間。 + + + 如果 {1} 秒內進入了 {0} 或更多位成員,我則會將他們 {2} 。 + + + 時間必須在於 {0} 和 {1} 秒之間。 + + + 成功的移除了 {0} 所有的身分組。 + + + 無法移除身分組。我的權限不夠。 + + + {0} 身份組的顏色已變更。 + + + 那個身分組並不存在。 + + + 指定的參數錯誤。 + + + 無效的色碼或是權限不足引起錯誤。 + + + 成功的移除了 {1} 的 {0} 身分組。 + + + 無法移除身分組。我沒有足夠的權限。 + + + 已更改身分組名稱。 + + + 身分組名稱變更失敗。我沒有足夠的權限。 + + + 您不能編輯比你最高身分組還高的身分組。 + + + 已移除遊玩訊息: {0} + + + 身分組 {0} 已新增至清單。 + + + {0} 未找到。已清理。 + + + 身分組 {0} 已在清單中。 + + + 新增成功。 + + + 輪播遊玩狀態已停用。 + + + 輪播遊玩狀態已啟用。 + + + 輪播遊玩狀態清單: +{0} + + + 尚未設定輪播遊玩狀態。 + + + 您已經是 {0} 身分組了。 + + + 您已經是 {0} 身分組的成員,您一次只能加入一個自入身分群組。 + + + 自入身分群組現在為擇一模式。 + + + 有 {0} 個可以自入的身分群組 + + + 此身分組並不能自行加入。 + + + 您並不是 {0} 身份組的成員。 + + + 自入身分群組不再為擇一模式! + + + 我無法新增身分組比我還高的身分組給您。 + + + {0} 已從自入身分組清單中移除。 + + + 您不再是 {0} 身分組的成員了。 + + + 您現在是 {0} 身份組的成員了。 + + + 成功將 {0} 身分組指派給 {1} + + + 無法指派身分組。我沒有足夠的權限。 + + + 新的大頭貼已設定! + + + 新的頻道名稱已設定。 + + + 新的遊戲名稱已設定! + + + 已設定新的實況台! + + + 新的頻道主題已設定! + + + Shard {0} 已重新連線。 + + + Shard {0} 重新連線中。 + + + 關閉中 + + + 成員無法在 {1} 秒發送超過 {0} 條訊息。 + + + 慢速模式已停用。 + + + 慢速模式已啟用 + + + 軟禁 (踢出) + PLURAL + + + {0} 將會忽略此頻道。 + + + {0} 將會注意此頻道。 + + + 如果成員連續貼出 {0} 個相同的訊息,我將會把他們 {1}。 +     __忽略的頻道__: {2} + + + 文字頻道已建立 + + + 文字頻道已刪除 + + + 成功解除靜音。 + + + 解除靜音 + singular + + + 成員名稱 + + + 成員名稱已更改 + + + 成員 + + + 成員已封鎖 + + + 已**禁止** {0} 的__文字聊天__。 + + + 已**開啟** {0} 的__文字聊天__。 + + + 成員已加入 + + + 成員已離開 + + + 已**禁止** {0} 的__文字和語音聊天__。 + + + 成員身分組已新增 + + + 成員身分組已移除 + + + {0} 現在 {1} + + + 已**開放** {0} 的__文字和語音聊天__。 + + + {0} 加入了 {1} 語音頻道。 + + + {0} 離開了 {1} 語音頻道。 + + + {0} 已從 {1} 移至 {2} 語音頻道。 + + + 已**禁止** {0} 的__語音聊天__。 + + + 已**開放** {0} 的__語音聊天__。 + + + 已建立語音頻道 + + + 已刪除語音頻道 + + + 已停用語音+文字功能。 + + + 已啟用語音+文字功能。 + + + 我沒有**管理身分組**和/或**管理頻道**權限,所以我無法在 {0} 伺服器上執行`語音+文字`功能。 + + + 您正在啟用/停用此功能,但我**__没有__管理員權限**。這可能會造成一些問題,而事後您必須自行處理這些文字頻道。 + + + 我至少需要**管理身份組**和**管理頻道**權限才能使用此功能。(建議給我管理員權限) + + + 使用者被 {0} 文字聊天 + + + 使用者被 {0} 文字及語音聊天 + + + 使用者被 {0} 語音聊天 + + + 您已被伺服器 {0} 軟禁。 +理由: {1} + + + 成員已解禁 + + + 合併完成! + + + 在合併時發生問題,請查閱命令視窗來取得更多資訊。 + + + 在線狀態更新 + + + 成員被軟禁 + + + 賜予了 {1} 給 {0} + + + 再接再厲,下次會更好 ^_^ + + + 恭喜! 您因骰出高於 {1} 以上獲得了 {0} + + + 重新洗牌。 + + + 丟出了 {0}。 + User flipped tails. + + + 您猜對了! 您赢得了 {0} + + + 指定的數字無效。你可以丟 1 至 {0} 個硬幣。 + + + 點選此訊息的 {0} 回應來獲得 {1}␣ + + + 此活動只在 {0} 小時內有效。 + + + 花幣大放送開始了! + + + 送了 {1} 給 {0} + X has gifted 15 flowers to Y + + + {0} 擁有 {1} + X has Y flowers + + + 正面 + + + 排行榜 + + + 賜予了 {0} 給 {1} 名 {2} 身分組成員。 + + + 你的賭注不能大於 {0} + + + 你的賭注不能少於 {0} + + + 你沒有足夠的 {0} + + + 卡堆中没有更多的牌。 + + + 得獎用戶 + + + 您骰了 {0}。 + + + 下注 + + + 哇啊啊啊啊啊啊!!! 恭喜!!! - 投注 x{0} + + + 一個 {0} - 投注 x{1} + + + 哇! 真幸運! 三個一樣! - 投注 x{0} + + + 不錯喔! 兩個{0} - 投注 x{1} + + + 獲得 + + + 成員必須要輸入一個暗號來獲得 {0}。 +持續 {1} 秒。嘘~别跟任何人说。 + + + 秘密活動结束。 {0}個成員獲得獎勵。 + + + 秘密活動開始 + + + 反面 + + + 成功從 {1} 獲得 {0} + + + 無法從 {1} 獲得 {0},因為成員並沒有那麼多 {2}! + + + 回目錄 + + + 只限Bot擁有者 + + + 需要 {0} 頻道權限。 + + + 您可以透過 Patreon: <{0}> 或 Paypal: <{1}> 來贊助此專案 + + + 指令和快捷 + + + 已重建指令清單。 + + + 輸入`{0}h 指令名稱`來查閱該指令的詳細說明。 例如 `{0}h >8ball` + + + 我找不到该指令。請再次查詢前確定該指令是否存在。 + + + 說明 + + + 您可以透過: +Patreon <{0}> 或 +Paypal <{1}> +來贊助NadekoBot專案 +請不要忘記在訊息中留下您的ID。 + +**感謝您**♥️ + + + **指令清單**: <{0}> +**自己架設的教學和文件可參考**: <{1}> + + + 指令清單 + + + 模組清單 + + + + 輸入`{0}cmds 模組名稱`來查閱該模組的詳細說明。 例如 `{0}cmds games` + + + 該模組不存在。 + + + 需要 {0} 伺服器權限。 + + + 目錄 + + + 使用方式 + + + 啟動 Autohentai。每 {0} 秒發送一張含有以下標籤的圖片: +{1} + + + 標籤 + + + 動物賽跑 + + + 參賽者不足,無法開始比賽。 + + + 參賽者已滿! 立即開始比賽。 + + + {0} 扮演為 {1} + + + {0} 扮演為 {1} 並下注了 {2}! + + + 輸入 {0}jr 來加入比賽。 + + + 比賽將於20秒後或參賽人數人滿時開始。 + + + 比賽開始,共有 {0} 位參賽者。 + + + 身為 {1} 的 {0} 贏得比賽! + + + 身為 {1} 的 {0} 贏得比賽並獲得 {2}! + + + 指定的數量無效。您可以一次骰 {0} ~ {1} 個骰子。 + + + 骰出了 {0} + Someone rolled 35 + + + 骰子數量: {0} + Dice Rolled: 5 + + + 無法開始比賽。另一個比賽可能正在進行中。 + + + 此伺服器上沒有競賽 + + + 第二個數字必須大於前者。 + + + 變心次數 + + + 契身約者 + + + 離婚次數 + + + 暗戀著 + + + 贖身價格 + + + 還沒有任何人擄獲任何對象。 + + + 最佳對象 + + + 您的暗戀目標已經是該對象,或是您在沒有暗戀對象下嘗試取消暗戀對象。 + + + 已將暗戀者 {0} 變更為 {1}。 + +*這是一個值得沈思的道德問題*🤔 + Make sure to get the formatting right, and leave the thinking emoji + + + 您必须等待 {0} 小時 {1} 分鐘才能再次變更您的暗戀者。 + + + 你已經不再暗戀任何人。 + + + 想要成為 {0} 的後宮。 嗚挖~ <3 + + + 花了 {1} 將 {0} 收為後宮! + + + 你已經甩掉了一位喜歡你的對象,你這無情的怪物。 +作為補償,{0} 獲得了{1}。 + + + 你不能設定自己為暗戀對象,你這自戀狂。 + + + 🎉他們的愛情終於開花結果 🎉 +{0} 的新值為 {1}! + + + 後宮才沒有那麼便宜。您必須至少支付 {0} 以上才能買下對方,即使對方的所需金額比這個還低。 + + + 您必須支付 {0} 或更多才能收納對方入你後宮! + + + 那個後宮不是你的。 + + + 你不能將自己收入後宮。 + + + 您最近才剛離過婚。您必須再等待 {0} 小時和 {1} 分鐘才能再次離婚。 + + + 沒人 + + + 您已經與一位不愛您的人離婚了。您回收了{0}。 + + + 8ball + + + 藏頭詩 + + + 遊戲結束,沒人發表答案。 + + + 沒人投票。遊戲已沒有勝利者結束。 + + + 開頭字母為 {0}。 + + + 藏頭詩遊戲已在此頻道中運行中。 + + + 遊戲開始,請造一個句子使用以下字首: {0}。 + + + 您有 {0} 秒的時間作答。 + + + {0} 送出了他的句子。(共{1}個) + + + 請輸入您喜歡的句子編號。 + + + {0} 投下了他寶貴的一票! + + + 優勝者為獲得 {1} 分的 {0}。 + + + 優勝者為唯一一個送出答案的 {0}! + + + 題目 + + + 平手! 雙方都選擇了 {0} + + + {0} 赢了! {1} 打敗了 {2} + + + 結束收件 + + + 動物賽跑已經在運行中了。 + + + 總共: {0} 平均: {1} + + + 分類 + + + 已在此伺服器上停用Cleverbot。 + + + 已在此伺服器上啟用Cleverbot。 + + + 停止在此頻道上生產貨幣。 + + + 開始在此頻道上生產貨幣。 + + + 發現了 {0} 個野生的 {1}! + plural + + + 發現了一個野生的 {0}! + + + 載入問題失敗。 + + + 遊戲開始 + + + Hangman遊戲開始了 + + + Hangman遊戲已經在此頻道上執行中。 + + + Hangman啟動失敗。 + + + “{0}hangman” 單詞類型: + + + 排行榜 + + + 您沒有足夠的 {0} + + + 沒有結果 + + + 獲得了 {0} + Kwoth picked 5* + + + {0} 種了 {1} + Kwoth planted 5* + + + 知識小學堂已經在此伺服器上運行中。 + + + 知識小學堂 + + + {0} 答對了! 答案是: {1} + + + 此伺服器上沒有運行中的知識小學堂。 + + + {0} 有 {1} 分 + + + 於此問題後結束。 + + + 時間到! 正確答案為: {0} + + + {0} 答對並贏得遊戲! 答案是: {1} + + + 你不能對自己玩。 + + + 圈圈叉叉遊戲已經在此頻道上運行中。 + + + 平手! + + + 開始了一場圈圈叉叉遊戲。 + + + {0} 赢了! + + + 配對了三個 + + + 沒有可動的步! + + + 時間已到! + + + 輪到 {0} 了 + + + {0} 對 {1} + + + 正在排 {0} 首歌... + + + 已停用自動播放。 + + + 已啟用自動播放。 + + + 預設音量設定為 {0}% + + + 目錄載入完成。 + + + 公平播放 + + + 完成播放 + + + 停用公平播放。 + + + 啟用公平播放。 + + + 從位置 + + + 代號 + + + 輸入錯誤。 + + + 音樂長度現在沒有限制了。 + + + 每首音樂最長長度設定為{0}秒。 + + + 播放清單大小現在沒有限制了。 + + + 播放清單最多可以點播 {0} 首。 + + + 你必須要進入在此伺服器上的語音頻道。 + + + 名稱 + + + 正在播放 + + + 沒有正在運行中的播放器。 + + + 沒有搜尋結果。 + + + 暫停播放音樂。 + + + 播放清單 - 第 {0} / {1} 頁 + + + 正在播放 + + + `#{0}` - **{1}** by *{2}* ({3}首歌) + + + 已儲存的播放清單第 {0} 頁 + + + 播放清單已刪除。 + + + 刪除清單失敗。清單要不是不存在,或你不是該清單的作者。 + + + 此播放清單代號並不存在。 + + + 播放清單載入完成。 + + + 播放清單已儲存 + + + {0} 秒限制 + + + 排序清單 + + + 加入排序 + + + 排序清單已清除 + + + 排序已滿於 {0} / {0}。 + + + 已移除歌曲 + context: "removed song #5" + + + 重複播放目前歌曲 + + + 重複播放目前清單 + + + 重複曲目 + + + 停止重複播放目前歌曲。 + + + 繼續播放音樂。 + + + 停用重複播放清單 + + + 啟用重複播放清單。 + + + 我將在此頻道輸出播放、暫停、結束和移除歌曲的訊息。 + + + 跳至 ‘{0}:{1}’ + + + 隨機播放 + + + 歌曲移至 + + + {0}小時{1}分鐘{2}秒 + + + 到位置 + + + 無限 + + + 音量必須介於0至100之間 + + + 音量調整為 {0}% + + + 在{0}頻道上禁用執行所有模組指令。 + + + 在{0}頻道上開放執行所有模組指令。 + + + 允許 + + + 在{0}身份組上禁用執行所有模組指令。 + + + 在{0}身份組上開放執行所有模組指令。 + + + 在此伺服器上禁用執行所有模組指令。 + + + 在此伺服器上開放執行所有模組指令。 + + + {0}成員禁用執行所有模組指令。 + + + {0}成員開放執行所有模組指令。 + + + ID {1} 被加入 {0} 黑名单 + + + 指令 {0} 現在有 {1}秒 冷卻時間。 + + + 指令 {0} 現在沒有冷卻時間,且目前正在冷卻的也一並移除。 + + + 尚未設定任何指令冷卻時間。 + + + 指令成本 + + + 在 {2} 頻道上禁用 {0} {1}。 + + + 在 {2} 頻道上開放 {0} {1}。 + + + 拒絕 + + + 新增 {0} 至過濾文字清單。 + + + 過濾文字清單 + + + 從過濾文字清單中移除 {0}。 + + + 第二個參數無效 (必須為一個在 {0} 和 {1} 之間的數字) + + + 在此頻道上停用邀請連結過濾。 + + + 在此頻道上啟用邀請連結過濾。 + + + 在此伺服器上停用邀請連結過濾。 + + + 在此伺服器上啟用邀請連結過濾。 + + + 已將權限 {0} 從 #{1} 移至 #{2} + + + 在索引 #{0} 找不到權限 + + + 尚未設置價格。 + + + 指令 + Gen (of command) + + + 模組 + Gen. (of module) + + + 權限頁面第 {0} 頁 + + + 目前管理身分組為 {0}。 + + + 成員現在需要 {0} 身份組才能編輯權限。 + + + 該索引找不到權限。 + + + 已刪除權限 #{0} - {1} + + + 禁止{2}身份組執行{0} {1}。 + + + 開放{2}身份組執行{0} {1}。 + + + + Short of seconds. + + + 禁止在此服务器上執行{0} {1}。 + + + 開放在此服务器上執行{0} {1}。 + + + 從 {0} 黑名單上移除 ID {1} + + + 不可編輯 + + + 禁止 {2} 成員執行 {0} {1}。 + + + 開放 {2} 成員執行 {0} {1}。 + + + 我不再顯示權限警告。 + + + 我將會顯示權限警告。 + + + 停用過濾此頻道文字。 + + + 啟用過濾此頻道文字。 + + + 停用過濾此伺服器文字。 + + + 啟用過濾此伺服器文字。 + + + 能力 + + + 還沒有最喜歡的動畫 + + + 開始自動翻譯此頻道上的訊息。成員訊息將會被刪除。 + + + 自動翻譯設定已移除。 + + + 自動翻譯語言設定為 {0} > {1} + + + 開始自動翻譯此頻道上的訊息。 + + + 停止自動翻譯此頻道上的訊息。 + + + 輸入格式錯誤,或是系統出問題了。 + + + 找不到該卡片 + + + 小知識 + + + 章節數 + + + 漫畫編號 + + + 競技敗場數 + + + 競技次數 + + + 競技排行 + + + 競技勝場數 + + + 全部看完 + + + 天氣情況 + + + 消耗 + + + 日期 + + + 定義: + + + 放棄 + + + 集數 + + + 錯誤發生。 + + + 範例 + + + 找不到該動畫。 + + + 找不到該漫畫。 + Because I ate that mango. + + + 類型 + + + 找不到標籤定義 + + + 身高/體重 + + + {0}m/{1}kg + + + 濕度 + + + 搜尋圖片: + + + 找不到該電影 + + + 來源或目標語言錯誤 + + + 沒有載入笑話。 + + + 緯度/經度 + + + 等級 + + + {0}place 可使用參數 + Don't translate {0}place + + + 地區 + + + 沒有載入魔法道具。 + + + {0} 的 MAL 個人檔案 + + + 您無法使用此功能,因為Bot擁有者並沒有設定Mashape API代碼。 + + + 低溫/高溫 + + + 找不到頻道。 + + + 沒有結果。 + + + 暫停 + + + 原始連結 + + + 需要 osu! API 代碼。 + + + 讀取 osu! 簽名檔失敗。 + + + 找到超過 {0} 張圖。 顯示隨機 {0}。 + + + 找不到該玩家! 請再次檢查BattleTag及區域是否正確。 + + + 預計觀看 + + + 平台 + + + 找不到技能 + + + 找不到寶可夢 + + + 個人首頁: + + + 品質: + + + 快速對戰時間 + + + 快速對戰勝場數 + + + 評分 + + + 分數: + + + 搜尋: + + + 縮短網址失敗。 + + + 短網址 + + + 出了些問題。 + + + 請註明要搜尋的項目。 + + + 狀態 + + + 商店網址 + + + 實況主 {0} 目前離線中。 + + + 實況主 {0} 目前直播中,有 {1} 名觀眾。 + + + 此伺服器目前正在追蹤 {0} 位實況主。 + + + 此伺服器目前沒有追蹤任何實況主。 + + + 找不到實況台。 + + + 實況台大概不存在。 + + + 移除了追蹤清單上 {0}實況主 ({1}) 的實況台 + + + 我將會在此頻道通知實況主狀態。 + + + 日出時間 + + + 日落時間 + + + 氣溫 + + + 標題: + + + 前三喜歡的動畫: + + + 翻譯: + + + 類型 + + + 找不到該詞的定義。 + + + 連結 + + + 觀眾 + + + 正在看 + + + 無法在指定的維基上找到該詞。 + + + 請輸入要搜尋的維基,然後才是搜尋單詞。 + + + 找不到該頁面。 + + + 風速 + + + {0} 個最常被禁的英雄 + + + 無法尤達化你的句子。 + + + 已加入 + + + `{0}.` {1} [{2:F2}/秒] - 共 {3} + /s and total need to be localized to fit the context - +`1.` + + + 活動頁面 #{0} + + + 共 {0} 個使用者。 + + + 作者 + + + Bot ID + + + 可在 {0}calc 使用的函式 + + + 這個頻道的 {0} 是 {1} + + + 頻道主題 + + + 執行指令 + + + {0} {1} 等於 {2} {3} + + + 轉換器可以使用的單位 + + + 無法將 {0} 轉換成 {1}: 找不到單位 + + + 無法將 {0} 轉換成 {1}: 單位類型並不相同 + + + 建立於 + + + 加入了跨服頻道 + + + 離開了跨服頻道 + + + 這個是你的跨服頻道代碼 + + + 自訂表情符號 + + + 錯誤 + + + 特色 + + + ID + + + 索引超過範圍 + + + {0} 身分組中的成員 + + + 您無法在有很多成員的身分組執行此指令來預防濫用。 + + + 無效的 {0} 數值 + Invalid months value/ Invalid hours value + + + 加入了 Discord + + + 加入了伺服器 + + + 伺服器 ID: {0} +成員數: {1} +擁有者 ID: {2} + + + 在那個頁面找不到伺服器。 + + + 重複清單 + + + 成員 + + + 記憶體 + + + 訊息 + + + 訊息重複器 + + + 名字 + + + 暱稱 + + + 沒有人正在玩那款遊戲。 + + + 沒有運行中的重複器 + + + 此頁面上沒有身分組 + + + 此頁面上沒有Shard + + + 沒有設定主題 + + + 擁有者 + + + 擁有者ID + + + 狀態 + + + {0} 伺服器 +{1} 文字頻道 +{2} 語音頻道 + + + 刪除了所有包含了 {0} 關鍵字的引句。 + + + 引句第{0}頁 + + + 此頁沒有引句 + + + 找不到您可以刪除的引句 + + + 新增引句 + + + 引句#{0}已刪除 + + + 地區 + + + 註冊於 + + + 我將會在 {2} 後提醒 {0} 說 {1} `({3:d.M.yyyy.} 於 {4:HH:mm})` + + + 無效的時間格式。請檢查指令說明。 + + + 新的提醒範本已設定。 + + + 每 {1} 天 {2} 小時又 {3} 分鐘後重複 {0}。 + + + 重複器清單 + + + 此伺服器沒有運行中的重複器。 + + + #{0} 已停止 + + + 此伺服器上找不到重複中的訊息。 + + + 結果 + + + 身分組 + + + 此伺服器上所有身分組 - 第 #{0} 頁 + + + 身分組 {1} 的第 #{0} 頁 + + + 顏色的格式錯誤。正確的格式例如`#00ff00`。 + + + 開始循環變更 {0} 身分組的顏色。 + + + 停止循環變更 {0} 身分組的顏色。 + + + 這個伺服器的 {0} 是 {1} + + + 伺服器資訊 + + + Shard + + + Shard狀態 + + + Shard **#{0}** 的狀態與 {2} 伺服器為 {1} + + + **名稱:** {0} **連結:** {1} + + + 找不到特殊的表情符號。 + + + 正在播放 {0} 首歌,{1} 首已點播。 + + + 文字頻道 + + + 這是您的房間連結: + + + 上線時間 + + + {1} 成員的 {0} 是 {2} + Id of the user kwoth#1234 is 123123123123 + + + 成員 + + + 語音頻道 + + + 您已經加入了這場比賽! + + + 目前投票結果 + + + 沒有人投票。 + + + 此伺服器正在投票中。 + + + 📃 {0} 建立了一個需要您的注意的投票: + + + `{0}.` {1} 有 {2} 票。 + + + {0} 投下了神聖的一票。 + Kwoth voted. + + + 請私訊我您要投票的號碼。 + + + 請在此打出要投票的號碼。 + + + 感謝您神聖的一票,{0} + + + 總票數為 {0} + + + 輸入 `{0}pick` 來拾取。 + + + 輸入 `{0}pick` 來拾取。 + + + 找不到成員 + + + 第 {0} 頁 + + + 您必須要在此伺服器上的語音頻道。 + + + 沒有語音頻道身分組。 + + + {0} 已被 **禁止** __文字和語音聊天__,持續 {1} 分鐘。 + + + 進入 {0} 頻道的成員將會獲得 {1} 身分組。 + + + 進入 {0} 頻道的成員將不再獲得身分組。 + + + 語音頻道身分組 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NadekoBot/Services/CommandHandler.cs b/src/NadekoBot/Services/CommandHandler.cs index 0f4cf950..17521cab 100644 --- a/src/NadekoBot/Services/CommandHandler.cs +++ b/src/NadekoBot/Services/CommandHandler.cs @@ -16,6 +16,7 @@ using NadekoBot.Modules.CustomReactions; using NadekoBot.Modules.Games; using System.Collections.Concurrent; using System.Threading; +using Microsoft.EntityFrameworkCore; using NadekoBot.DataStructures; namespace NadekoBot.Services @@ -28,11 +29,7 @@ namespace NadekoBot.Services } public class CommandHandler { -#if GLOBAL_NADEKO - public const int GlobalCommandsCooldown = 1500; -#else public const int GlobalCommandsCooldown = 750; -#endif private readonly DiscordShardedClient _client; private readonly CommandService _commandService; @@ -273,13 +270,76 @@ namespace NadekoBot.Services // maybe this message is a custom reaction // todo log custom reaction executions. return struct with info - var crExecuted = await Task.Run(() => CustomReactions.TryExecuteCustomReaction(usrMsg)).ConfigureAwait(false); - if (crExecuted) //if it was, don't execute the command + var cr = await Task.Run(() => CustomReactions.TryGetCustomReaction(usrMsg)).ConfigureAwait(false); + if (cr != null) //if it was, don't execute the command + { + try + { + if (guild != null) + { + PermissionCache pc; + if (!Permissions.Cache.TryGetValue(guild.Id, out pc)) + { + using (var uow = DbHandler.UnitOfWork()) + { + var config = uow.GuildConfigs.For(guild.Id, + set => set.Include(x => x.Permissions)); + Permissions.UpdateCache(config); + } + Permissions.Cache.TryGetValue(guild.Id, out pc); + if (pc == null) + throw new Exception("Cache is null."); + } + int index; + if ( + !pc.Permissions.CheckPermissions(usrMsg, cr.Trigger, "ActualCustomReactions", + out index)) + { + //todo print in guild actually + var returnMsg = + $"Permission number #{index + 1} **{pc.Permissions[index].GetCommand(guild)}** is preventing this action."; + _log.Info(returnMsg); + return; + } + } + await cr.Send(usrMsg).ConfigureAwait(false); + + if (cr.AutoDeleteTrigger) + { + try { await msg.DeleteAsync().ConfigureAwait(false); } catch { } + } + } + catch (Exception ex) + { + _log.Warn("Sending CREmbed failed"); + _log.Warn(ex); + } return; + } var exec3 = Environment.TickCount - execTime; string messageContent = usrMsg.Content; + if (guild != null) + { + ConcurrentDictionary maps; + if (Modules.Utility.Utility.CommandMapCommands.AliasMaps.TryGetValue(guild.Id, out maps)) + { + string newMessageContent; + if (maps.TryGetValue(messageContent.Trim().ToLowerInvariant(), out newMessageContent)) + { + _log.Info(@"--Mapping Command-- + GuildId: {0} + Trigger: {1} + Mapping: {2}", guild.Id, messageContent, newMessageContent); + var oldMessageContent = messageContent; + messageContent = newMessageContent; + + try { await usrMsg.Channel.SendConfirmAsync($"{oldMessageContent} => {newMessageContent}").ConfigureAwait(false); } catch { } + } + } + } + // execute the command and measure the time it took var exec = await Task.Run(() => ExecuteCommand(new CommandContext(_client, usrMsg), messageContent, DependencyMap.Empty, MultiMatchHandling.Best)).ConfigureAwait(false); @@ -378,28 +438,27 @@ namespace NadekoBot.Services } var cmd = commands[i].Command; - bool resetCommand = cmd.Name == "resetperms"; + var resetCommand = cmd.Name == "resetperms"; var module = cmd.Module.GetTopLevelModule(); PermissionCache pc; if (context.Guild != null) { - pc = Permissions.Cache.GetOrAdd(context.Guild.Id, (id) => + //todo move to permissions module? + if (!Permissions.Cache.TryGetValue(context.Guild.Id, out pc)) { using (var uow = DbHandler.UnitOfWork()) { - var config = uow.GuildConfigs.PermissionsFor(context.Guild.Id); - return new PermissionCache() - { - Verbose = config.VerbosePermissions, - RootPermission = config.RootPermission, - PermRole = config.PermissionRole.Trim().ToLowerInvariant(), - }; + var config = uow.GuildConfigs.GcWithPermissionsv2For(context.Guild.Id); + Permissions.UpdateCache(config); } - }); + Permissions.Cache.TryGetValue(context.Guild.Id, out pc); + if(pc == null) + throw new Exception("Cache is null."); + } int index; - if (!resetCommand && !pc.RootPermission.AsEnumerable().CheckPermissions(context.Message, cmd.Aliases.First(), module.Name, out index)) + if (!resetCommand && !pc.Permissions.CheckPermissions(context.Message, cmd.Aliases.First(), module.Name, out index)) { - var returnMsg = $"Permission number #{index + 1} **{pc.RootPermission.GetAt(index).GetCommand((SocketGuild)context.Guild)}** is preventing this action."; + var returnMsg = $"Permission number #{index + 1} **{pc.Permissions[index].GetCommand((SocketGuild)context.Guild)}** is preventing this action."; return new ExecuteCommandResult(cmd, pc, SearchResult.FromError(CommandError.Exception, returnMsg)); } diff --git a/src/NadekoBot/Services/Database/Models/CustomReaction.cs b/src/NadekoBot/Services/Database/Models/CustomReaction.cs index 394e5084..25bb34fb 100644 --- a/src/NadekoBot/Services/Database/Models/CustomReaction.cs +++ b/src/NadekoBot/Services/Database/Models/CustomReaction.cs @@ -10,8 +10,13 @@ namespace NadekoBot.Services.Database.Models 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 bool AutoDeleteTrigger { get; set; } + public bool DmResponse { get; set; } + + public bool IsGlobal => !GuildId.HasValue; } public class ReactionResponse : DbEntity diff --git a/src/NadekoBot/Services/Database/Models/GuildConfig.cs b/src/NadekoBot/Services/Database/Models/GuildConfig.cs index 9bf945cd..00693f16 100644 --- a/src/NadekoBot/Services/Database/Models/GuildConfig.cs +++ b/src/NadekoBot/Services/Database/Models/GuildConfig.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using static NadekoBot.Modules.Administration.Administration; namespace NadekoBot.Services.Database.Models @@ -41,7 +42,8 @@ namespace NadekoBot.Services.Database.Models public HashSet GenerateCurrencyChannelIds { get; set; } = new HashSet(); //permissions - public Permission RootPermission { get; set; } + public Permission RootPermission { get; set; } = null; + public List Permissions { get; set; } public bool VerbosePermissions { get; set; } = true; public string PermissionRole { get; set; } = "Nadeko"; @@ -67,9 +69,59 @@ namespace NadekoBot.Services.Database.Models public string Locale { get; set; } = null; public string TimeZoneId { get; set; } = null; + public HashSet UnmuteTimers { get; set; } = new HashSet(); + public HashSet VcRoleInfos { get; set; } + public HashSet CommandAliases { get; set; } = new HashSet(); + //public List ProtectionIgnoredChannels { get; set; } = new List(); } + public class CommandAlias : DbEntity + { + public string Trigger { get; set; } + public string Mapping { get; set; } + + //// override object.Equals + //public override bool Equals(object obj) + //{ + // if (obj == null || GetType() != obj.GetType()) + // { + // return false; + // } + + // return ((CommandAlias)obj).Trigger.Trim().ToLowerInvariant() == Trigger.Trim().ToLowerInvariant(); + //} + + //// override object.GetHashCode + //public override int GetHashCode() + //{ + // return Trigger.Trim().ToLowerInvariant().GetHashCode(); + //} + } + + public class VcRoleInfo : DbEntity + { + public ulong VoiceChannelId { get; set; } + public ulong RoleId { get; set; } + } + + public class UnmuteTimer : DbEntity + { + public ulong UserId { get; set; } + public DateTime UnmuteAt { get; set; } + + public override int GetHashCode() => + UserId.GetHashCode(); + + public override bool Equals(object obj) + { + var ut = obj as UnmuteTimer; + if (ut == null) + return false; + return ut.UserId == UserId; + } + } + public class FilterChannelId : DbEntity { public ulong ChannelId { get; set; } diff --git a/src/NadekoBot/Services/Database/Models/Permission.cs b/src/NadekoBot/Services/Database/Models/Permission.cs index e12d6d5c..fe692221 100644 --- a/src/NadekoBot/Services/Database/Models/Permission.cs +++ b/src/NadekoBot/Services/Database/Models/Permission.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations.Schema; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; using System.Diagnostics; namespace NadekoBot.Services.Database.Models @@ -17,46 +18,101 @@ namespace NadekoBot.Services.Database.Models public bool State { get; set; } + public Permissionv2 Tov2() => + new Permissionv2() + { + PrimaryTarget = PrimaryTarget, + PrimaryTargetId = PrimaryTargetId, + SecondaryTarget = SecondaryTarget, + SecondaryTargetName = SecondaryTargetName, + State = State, + }; + + //[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 Permission Clone() => new Permission() + //{ + // PrimaryTarget = PrimaryTarget, + // SecondaryTarget = SecondaryTarget, + // PrimaryTargetId = PrimaryTargetId, + // SecondaryTargetName = SecondaryTargetName, + // State = State, + //}; + } + + public interface IIndexed + { + int Index { get; set; } + } + + [DebuggerDisplay("{PrimaryTarget}{SecondaryTarget} {SecondaryTargetName} {State} {PrimaryTargetId}")] + public class Permissionv2 : DbEntity, IIndexed + { + public int? GuildConfigId { get; set; } + public int Index { get; set; } + + 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() + public static Permissionv2 AllowAllPerm => new Permissionv2() { PrimaryTarget = PrimaryPermissionType.Server, PrimaryTargetId = 0, SecondaryTarget = SecondaryPermissionType.AllModules, SecondaryTargetName = "*", State = true, + Index = 0, }; [NotMapped] - private static Permission BlockNsfwPerm => new Permission() + private static Permissionv2 BlockNsfwPerm => new Permissionv2() { PrimaryTarget = PrimaryPermissionType.Server, PrimaryTargetId = 0, SecondaryTarget = SecondaryPermissionType.Module, SecondaryTargetName = "nsfw", State = false, + Index = 1 }; - public static Permission GetDefaultRoot() - { - var root = AllowAllPerm; - var blockNsfw = BlockNsfwPerm; + public static List GetDefaultPermlist => + new List + { + BlockNsfwPerm, + AllowAllPerm + }; - root.Previous = blockNsfw; - blockNsfw.Next = root; - - return blockNsfw; - } - - public Permission Clone() => new Permission() - { - PrimaryTarget = PrimaryTarget, - SecondaryTarget = SecondaryTarget, - PrimaryTargetId = PrimaryTargetId, - SecondaryTargetName = SecondaryTargetName, - State = State, - }; + //public Permission Clone() => new Permission() + //{ + // PrimaryTarget = PrimaryTarget, + // SecondaryTarget = SecondaryTarget, + // PrimaryTargetId = PrimaryTargetId, + // SecondaryTargetName = SecondaryTargetName, + // State = State, + //}; } - public enum PrimaryPermissionType { User, diff --git a/src/NadekoBot/Services/Database/Repositories/ICurrencyRepository.cs b/src/NadekoBot/Services/Database/Repositories/ICurrencyRepository.cs index 1658a16a..a59d8233 100644 --- a/src/NadekoBot/Services/Database/Repositories/ICurrencyRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/ICurrencyRepository.cs @@ -8,6 +8,6 @@ namespace NadekoBot.Services.Database.Repositories Currency GetOrCreate(ulong userId); long GetUserCurrency(ulong userId); bool TryUpdateState(ulong userId, long change); - IEnumerable GetTopRichest(int count); + IEnumerable GetTopRichest(int count, int skip); } } diff --git a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs index 34f3f564..cca54609 100644 --- a/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/IGuildConfigRepository.cs @@ -10,11 +10,11 @@ namespace NadekoBot.Services.Database.Repositories { GuildConfig For(ulong guildId, Func, IQueryable> includes = null); GuildConfig LogSettingsFor(ulong guildId); - GuildConfig PermissionsFor(ulong guildId); - IEnumerable PermissionsForAll(); + IEnumerable OldPermissionsForAll(); IEnumerable GetAllGuildConfigs(); - GuildConfig SetNewRootPermission(ulong guildId, Permission p); IEnumerable GetAllFollowedStreams(); void SetCleverbotEnabled(ulong id, bool cleverbotEnabled); + IEnumerable Permissionsv2ForAll(); + GuildConfig GcWithPermissionsv2For(ulong guildId); } } diff --git a/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs b/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs index 080783ab..2cd1cdbe 100644 --- a/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/IQuoteRepository.cs @@ -10,5 +10,6 @@ namespace NadekoBot.Services.Database.Repositories Task GetRandomQuoteByKeywordAsync(ulong guildId, string keyword); Task SearchQuoteKeywordTextAsync(ulong guildId, string keyword, string text); IEnumerable GetGroup(ulong guildId, int skip, int take); + void RemoveAllByKeyword(ulong guildId, string keyword); } } diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/CurrencyRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/CurrencyRepository.cs index aac59172..6f397789 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/CurrencyRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/CurrencyRepository.cs @@ -27,8 +27,8 @@ namespace NadekoBot.Services.Database.Repositories.Impl return cur; } - public IEnumerable GetTopRichest(int count) => - _set.OrderByDescending(c => c.Amount).Take(count).ToList(); + public IEnumerable GetTopRichest(int count, int skip = 0) => + _set.OrderByDescending(c => c.Amount).Skip(skip).Take(count).ToList(); public long GetUserCurrency(ulong userId) => GetOrCreate(userId).Amount; diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs index 89c59419..7098888d 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/GuildConfigRepository.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; -using NadekoBot.Modules.Permissions; using System; namespace NadekoBot.Services.Database.Repositories.Impl @@ -16,11 +15,10 @@ namespace NadekoBot.Services.Database.Repositories.Impl public IEnumerable GetAllGuildConfigs() => _set.Include(gc => gc.LogSetting) .ThenInclude(ls => ls.IgnoredChannels) - .Include(gc => gc.RootPermission) - .ThenInclude(gc => gc.Previous) - .Include(gc => gc.RootPermission) - .ThenInclude(gc => gc.Next) .Include(gc => gc.MutedUsers) + .Include(gc => gc.CommandAliases) + .Include(gc => gc.UnmuteTimers) + .Include(gc => gc.VcRoleInfos) .Include(gc => gc.GenerateCurrencyChannelIds) .Include(gc => gc.FilterInvitesChannelIds) .Include(gc => gc.FilterWordsChannelIds) @@ -35,8 +33,9 @@ namespace NadekoBot.Services.Database.Repositories.Impl /// /// Gets and creates if it doesn't exist a config for a guild. /// - /// - /// + /// For which guild + /// Use to manipulate the set however you want + /// Config for the guild public GuildConfig For(ulong guildId, Func, IQueryable> includes = null) { GuildConfig config; @@ -44,15 +43,15 @@ namespace NadekoBot.Services.Database.Repositories.Impl if (includes == null) { config = _set - .Include(gc => gc.FollowedStreams) - .Include(gc => gc.LogSetting) - .ThenInclude(ls => ls.IgnoredChannels) - .Include(gc => gc.FilterInvitesChannelIds) - .Include(gc => gc.FilterWordsChannelIds) - .Include(gc => gc.FilteredWords) - .Include(gc => gc.GenerateCurrencyChannelIds) - .Include(gc => gc.CommandCooldowns) - .FirstOrDefault(c => c.GuildId == guildId); + .Include(gc => gc.FollowedStreams) + .Include(gc => gc.LogSetting) + .ThenInclude(ls => ls.IgnoredChannels) + .Include(gc => gc.FilterInvitesChannelIds) + .Include(gc => gc.FilterWordsChannelIds) + .Include(gc => gc.FilteredWords) + .Include(gc => gc.GenerateCurrencyChannelIds) + .Include(gc => gc.CommandCooldowns) + .FirstOrDefault(c => c.GuildId == guildId); } else { @@ -65,7 +64,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl _set.Add((config = new GuildConfig { GuildId = guildId, - RootPermission = Permission.GetDefaultRoot(), + Permissions = Permissionv2.GetDefaultPermlist })); _context.SaveChanges(); } @@ -74,41 +73,27 @@ namespace NadekoBot.Services.Database.Repositories.Impl public GuildConfig LogSettingsFor(ulong guildId) { - return _set.Include(gc => gc.LogSetting) + var config = _set.Include(gc => gc.LogSetting) .ThenInclude(gc => gc.IgnoredChannels) .FirstOrDefault(); - } - - 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(), + Permissions = Permissionv2.GetDefaultPermlist })); _context.SaveChanges(); } return config; } - public IEnumerable PermissionsForAll() + public IEnumerable OldPermissionsForAll() { - var query = _set.Include(gc => gc.RootPermission); + var query = _set + .Where(gc => gc.RootPermission != null) + .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 @@ -122,20 +107,44 @@ namespace NadekoBot.Services.Database.Repositories.Impl return query.ToList(); } + public IEnumerable Permissionsv2ForAll() + { + var query = _set + .Include(gc => gc.Permissions); + + return query.ToList(); + } + + public GuildConfig GcWithPermissionsv2For(ulong guildId) + { + var config = _set + .Where(gc => gc.GuildId == guildId) + .Include(gc => gc.Permissions) + .FirstOrDefault(); + + if (config == null) // if there is no guildconfig, create new one + { + _set.Add((config = new GuildConfig + { + GuildId = guildId, + Permissions = Permissionv2.GetDefaultPermlist + })); + _context.SaveChanges(); + } + else if (config.Permissions == null || !config.Permissions.Any()) // if no perms, add default ones + { + config.Permissions = Permissionv2.GetDefaultPermlist; + _context.SaveChanges(); + } + + return config; + } + public IEnumerable GetAllFollowedStreams() => _set.Include(gc => gc.FollowedStreams) .SelectMany(gc => gc.FollowedStreams) .ToList(); - public GuildConfig SetNewRootPermission(ulong guildId, Permission p) - { - var data = PermissionsFor(guildId); - - data.RootPermission.Prepend(p); - data.RootPermission = p; - return data; - } - public void SetCleverbotEnabled(ulong id, bool cleverbotEnabled) { var conf = _set.FirstOrDefault(gc => gc.GuildId == id); diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs index 898f0efd..76002d1c 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/QuoteRepository.cs @@ -1,4 +1,6 @@ -using NadekoBot.Services.Database.Models; +using NadekoBot.Services.Database.Models; +using NadekoBot.Extensions; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -26,7 +28,11 @@ namespace NadekoBot.Services.Database.Repositories.Impl public Task SearchQuoteKeywordTextAsync(ulong guildId, string keyword, string text) { var rngk = new NadekoRandom(); - return _set.Where(q => q.Text.Contains(text) && q.GuildId == guildId && q.Keyword == keyword).OrderBy(q => rngk.Next()).FirstOrDefaultAsync(); - } + return _set.Where(q => q.Text.ContainsNoCase(text, StringComparison.OrdinalIgnoreCase) && q.GuildId == guildId && q.Keyword == keyword).OrderBy(q => rngk.Next()).FirstOrDefaultAsync(); + } + + public void RemoveAllByKeyword(ulong guildId, string keyword) => + _set.RemoveRange(_set.Where(x => x.GuildId == guildId && x.Keyword.ToUpper() == keyword)); + } } diff --git a/src/NadekoBot/Services/Database/Repositories/Impl/SelfAssignedRolesRepository.cs b/src/NadekoBot/Services/Database/Repositories/Impl/SelfAssignedRolesRepository.cs index 77926648..d17dac7d 100644 --- a/src/NadekoBot/Services/Database/Repositories/Impl/SelfAssignedRolesRepository.cs +++ b/src/NadekoBot/Services/Database/Repositories/Impl/SelfAssignedRolesRepository.cs @@ -13,7 +13,7 @@ namespace NadekoBot.Services.Database.Repositories.Impl public bool DeleteByGuildAndRoleId(ulong guildId, ulong roleId) { - var role = _set.Where(s => s.GuildId == guildId && s.RoleId == roleId).FirstOrDefault(); + var role = _set.FirstOrDefault(s => s.GuildId == guildId && s.RoleId == roleId); if (role == null) return false; diff --git a/src/NadekoBot/Services/IBotCredentials.cs b/src/NadekoBot/Services/IBotCredentials.cs index a03c6db3..63bea8b8 100644 --- a/src/NadekoBot/Services/IBotCredentials.cs +++ b/src/NadekoBot/Services/IBotCredentials.cs @@ -7,13 +7,13 @@ namespace NadekoBot.Services public interface IBotCredentials { ulong ClientId { get; } - ulong BotId { get; } string Token { get; } string GoogleApiKey { get; } ImmutableHashSet OwnerIds { get; } string MashapeKey { get; } string LoLApiKey { get; } + string PatreonAccessToken { get; } DBConfig Db { get; } diff --git a/src/NadekoBot/Services/Impl/BotCredentials.cs b/src/NadekoBot/Services/Impl/BotCredentials.cs index 56851762..a0220778 100644 --- a/src/NadekoBot/Services/Impl/BotCredentials.cs +++ b/src/NadekoBot/Services/Impl/BotCredentials.cs @@ -5,7 +5,6 @@ using Discord; using System.Linq; using NLog; using Microsoft.Extensions.Configuration; -using System.Collections.Generic; using System.Collections.Immutable; namespace NadekoBot.Services.Impl @@ -15,7 +14,6 @@ namespace NadekoBot.Services.Impl private Logger _log; public ulong ClientId { get; } - public ulong BotId { get; } public string GoogleApiKey { get; } @@ -44,6 +42,7 @@ namespace NadekoBot.Services.Impl public string CarbonKey { get; } public string credsFileName { get; } = Path.Combine(Directory.GetCurrentDirectory(), "credentials.json"); + public string PatreonAccessToken { get; } public BotCredentials() { @@ -68,6 +67,7 @@ namespace NadekoBot.Services.Impl GoogleApiKey = data[nameof(GoogleApiKey)]; MashapeKey = data[nameof(MashapeKey)]; OsuApiKey = data[nameof(OsuApiKey)]; + PatreonAccessToken = data[nameof(PatreonAccessToken)]; int ts = 1; int.TryParse(data[nameof(TotalShards)], out ts); @@ -109,6 +109,7 @@ namespace NadekoBot.Services.Impl public string CarbonKey { get; set; } = ""; public DBConfig Db { get; set; } = new DBConfig("sqlite", "Filename=./data/NadekoBot.db"); public int TotalShards { get; set; } = 1; + public string PatreonAccessToken { get; set; } = ""; } private class DbModel diff --git a/src/NadekoBot/Services/Impl/Localization.cs b/src/NadekoBot/Services/Impl/Localization.cs index e9d792ca..53718ebf 100644 --- a/src/NadekoBot/Services/Impl/Localization.cs +++ b/src/NadekoBot/Services/Impl/Localization.cs @@ -42,6 +42,8 @@ namespace NadekoBot.Services CultureInfo cultureInfo = null; try { + if (x.Value == null) + return null; cultureInfo = new CultureInfo(x.Value); } catch { } diff --git a/src/NadekoBot/Services/Impl/StatsService.cs b/src/NadekoBot/Services/Impl/StatsService.cs index 0390cbda..72996002 100644 --- a/src/NadekoBot/Services/Impl/StatsService.cs +++ b/src/NadekoBot/Services/Impl/StatsService.cs @@ -16,7 +16,7 @@ namespace NadekoBot.Services.Impl private readonly DiscordShardedClient _client; private readonly DateTime _started; - public const string BotVersion = "1.2"; + public const string BotVersion = "1.25"; public string Author => "Kwoth#2560"; public string Library => "Discord.Net"; diff --git a/src/NadekoBot/TypeReaders/BotCommandTypeReader.cs b/src/NadekoBot/TypeReaders/BotCommandTypeReader.cs index 9b4e06c2..0699ae43 100644 --- a/src/NadekoBot/TypeReaders/BotCommandTypeReader.cs +++ b/src/NadekoBot/TypeReaders/BotCommandTypeReader.cs @@ -1,6 +1,8 @@ using Discord.Commands; using System.Linq; using System.Threading.Tasks; +using NadekoBot.Modules.CustomReactions; +using NadekoBot.Services.Database.Models; namespace NadekoBot.TypeReaders { @@ -17,4 +19,46 @@ namespace NadekoBot.TypeReaders return Task.FromResult(TypeReaderResult.FromSuccess(cmd)); } } + + public class CommandOrCrTypeReader : CommandTypeReader + { + public override async Task Read(ICommandContext context, string input) + { + input = input.ToUpperInvariant(); + + if (CustomReactions.GlobalReactions.Any(x => x.Trigger.ToUpperInvariant() == input)) + { + return TypeReaderResult.FromSuccess(new CommandOrCrInfo(input)); + } + var guild = context.Guild; + if (guild != null) + { + CustomReaction[] crs; + if (CustomReactions.GuildReactions.TryGetValue(guild.Id, out crs)) + { + if (crs.Any(x => x.Trigger.ToUpperInvariant() == input)) + { + return TypeReaderResult.FromSuccess(new CommandOrCrInfo(input)); + } + } + } + + var cmd = await base.Read(context, input); + if (cmd.IsSuccess) + { + return TypeReaderResult.FromSuccess(new CommandOrCrInfo(((CommandInfo)cmd.Values.First().Value).Aliases.First())); + } + return TypeReaderResult.FromError(CommandError.ParseFailed, "No such command or cr found."); + } + } + + public class CommandOrCrInfo + { + public string Name { get; set; } + + public CommandOrCrInfo(string input) + { + this.Name = input; + } + } } diff --git a/src/NadekoBot/_Extensions/Extensions.cs b/src/NadekoBot/_Extensions/Extensions.cs index 8dbdf02b..b880944c 100644 --- a/src/NadekoBot/_Extensions/Extensions.cs +++ b/src/NadekoBot/_Extensions/Extensions.cs @@ -21,6 +21,12 @@ namespace NadekoBot.Extensions private const string arrow_left = "⬅"; private const string arrow_right = "➡"; + public static string ToBase64(this string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return Convert.ToBase64String(plainTextBytes); + } + public static Stream ToStream(this IEnumerable bytes, bool canWrite = false) { var ms = new MemoryStream(bytes as byte[] ?? bytes.ToArray(), canWrite); @@ -87,9 +93,9 @@ namespace NadekoBot.Extensions private static EmbedBuilder AddPaginatedFooter(this EmbedBuilder embed, int curPage, int? lastPage) { if (lastPage != null) - return embed.WithFooter(efb => efb.WithText($"page {curPage} / {lastPage}")); + return embed.WithFooter(efb => efb.WithText($"{curPage} / {lastPage}")); else - return embed.WithFooter(efb => efb.WithText($"page {curPage}")); + return embed.WithFooter(efb => efb.WithText(curPage.ToString())); } public static ReactionEventWrapper OnReaction(this IUserMessage msg, Action reactionAdded, Action reactionRemoved = null) @@ -278,6 +284,15 @@ namespace NadekoBot.Extensions return list; } } + + /// + /// Easy use of fast, efficient case-insensitive Contains check with StringComparison Member Types + /// CurrentCulture, CurrentCultureIgnoreCase, InvariantCulture, InvariantCultureIgnoreCase, Ordinal, OrdinalIgnoreCase + /// + public static bool ContainsNoCase(this string str, string contains, StringComparison compare) + { + return str.IndexOf(contains, compare) >= 0; + } public static string TrimTo(this string str, int maxLength, bool hideDots = false) { @@ -436,4 +451,4 @@ namespace NadekoBot.Extensions : usr.AvatarUrl; } } -} \ No newline at end of file +} diff --git a/src/NadekoBot/credentials_example.json b/src/NadekoBot/credentials_example.json index 240f9029..912b452a 100644 --- a/src/NadekoBot/credentials_example.json +++ b/src/NadekoBot/credentials_example.json @@ -14,5 +14,6 @@ "Type": "sqlite", "ConnectionString": "Filename=./data/NadekoBot.db" }, - "TotalShards": 1 + "TotalShards": 1, + "PatreonAccessToken": "" } \ No newline at end of file diff --git a/src/NadekoBot/project.json b/src/NadekoBot/project.json index cd69d074..fe93d0d3 100644 --- a/src/NadekoBot/project.json +++ b/src/NadekoBot/project.json @@ -23,12 +23,8 @@ "Google.Apis.Urlshortener.v1": "1.19.0.138", "Google.Apis.YouTube.v3": "1.20.0.701", "Google.Apis.Customsearch.v1": "1.20.0.466", - "ImageSharp": "1.0.0-alpha2-*", - "ImageSharp.Processing": "1.0.0-alpha2-*", - "ImageSharp.Formats.Png": "1.0.0-alpha2-*", - "ImageSharp.Formats.Jpeg": "1.0.0-alpha2-*", - "ImageSharp.Drawing": "1.0.0-alpha2-*", - "ImageSharp.Drawing.Paths": "1.0.0-alpha2-*", + "ImageSharp": "1.0.0-alpha4-00031", + "ImageSharp.Drawing": "1.0.0-alpha4-00031", "Microsoft.EntityFrameworkCore": "1.1.0", "Microsoft.EntityFrameworkCore.Design": "1.1.0", "Microsoft.EntityFrameworkCore.Sqlite": "1.1.0",