Merge pull request #1185 from Kwoth/dev

1.3
This commit is contained in:
Master Kwoth 2017-04-19 06:40:14 +02:00 committed by GitHub
commit ffb7226cb8
112 changed files with 23532 additions and 2443 deletions

View File

@ -19,16 +19,15 @@ You can support the project on patreon: <https://patreon.com/nadekobot> or paypa
Commands and aliases | Description | Usage Commands and aliases | Description | Usage
----------------|--------------|------- ----------------|--------------|-------
`.resetperms` | Resets the bot's permissions module on this server to the default value. **Requires Administrator server permission.** | `.resetperms` `.resetperms` | Resets the bot's permissions module on this server to the default value. **Requires Administrator server permission.** | `.resetperms`
`.resetglobalperms` | Resets global permissions set by bot owner. **Bot owner only** | `.resetglobalperms`
`.delmsgoncmd` | Toggles the automatic deletion of the user's successful command message to prevent chat flood. **Requires Administrator server permission.** | `.delmsgoncmd` `.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` `.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` `.removerole` `.rr` | Removes a role from a given user. **Requires ManageRoles server permission.** | `.rr @User Admin`
`.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` `.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` `.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` `.createrole` `.cr` | Creates a role with a given name. **Requires ManageRoles server permission.** | `.cr Awesome Role`
`.rolehoist` `.rh` | Toggles if this role is displayed in the sidebar or not **Requires ManageRoles server permission.** | `.rh Guests true` or `.rh "Space Wizards" true
`.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` `.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`
`.ban` `.b` | Bans a user by ID or name with an optional message. **Requires BanMembers server permission.** | `.b "@some Guy" Your behaviour is toxic.`
`.softban` `.sb` | Bans and then unbans a user by ID or name with an optional message. **Requires KickMembers server permission.** **Requires ManageMessages server permission.** | `.sb "@some Guy" Your behaviour is toxic.`
`.kick` `.k` | Kicks a mentioned user. **Requires KickMembers server permission.** | `.k "@some Guy" Your behaviour is toxic.`
`.deafen` `.deaf` | Deafens mentioned user or users. **Requires DeafenMembers server permission.** | `.deaf "@Someguy"` or `.deaf "@Someguy" "@Someguy"` `.deafen` `.deaf` | Deafens mentioned user or users. **Requires DeafenMembers server permission.** | `.deaf "@Someguy"` or `.deaf "@Someguy" "@Someguy"`
`.undeafen` `.undef` | Undeafens mentioned user or users. **Requires DeafenMembers server permission.** | `.undef "@Someguy"` or `.undef "@Someguy" "@Someguy"` `.undeafen` `.undef` | Undeafens mentioned user or users. **Requires DeafenMembers server permission.** | `.undef "@Someguy"` or `.undef "@Someguy" "@Someguy"`
`.delvoichanl` `.dvch` | Deletes a voice channel with a given name. **Requires ManageChannels server permission.** | `.dvch VoiceChannelName` `.delvoichanl` `.dvch` | Deletes a voice channel with a given name. **Requires ManageChannels server permission.** | `.dvch VoiceChannelName`
@ -38,10 +37,11 @@ Commands and aliases | Description | Usage
`.settopic` `.st` | Sets a topic on the current channel. **Requires ManageChannels server permission.** | `.st My new topic` `.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` `.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` 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` `.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` `.mentionrole` `.menro` | Mentions every person from the provided role or roles (separated by a ',') on this server. **Requires MentionEveryone server permission.** | `.menro RoleName`
`.donators` | List of the lovely people who donated to keep this project alive. | `.donators` `.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` `.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 `.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
`.gvc` | Toggles game voice channel feature in the voice channel you're currently in. Users who join the game voice channel will get automatically redirected to the voice channel with the name of their current game, if it exists. Can't move users to channels that the bot has no connect permission for. One per server. **Requires Administrator server permission.** | `.gvc`
`.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` `.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` `.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` `.languageslist` `.langli` | List of languages for which translation (or part of it) exist atm. | `.langli`
@ -66,6 +66,7 @@ Commands and aliases | Description | Usage
`.antispamignore` | Toggles whether antispam ignores current channel. Antispam must be enabled. | `.antispamignore` `.antispamignore` | Toggles whether antispam ignores current channel. Antispam must be enabled. | `.antispamignore`
`.antilist` `.antilst` | Shows currently enabled protection features. | `.antilist` `.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` `.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`
`.slowmodewl` | Ignores a role or a user from the slowmode feature. **Requires ManageMessages server permission.** | `.slowmodewl SomeRole` or `.slowmodewl AdminDude`
`.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` `.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` `.rsar` | Removes a specified role from the list of self-assignable roles. **Requires ManageRoles server permission.** | `.rsar`
@ -73,6 +74,11 @@ Commands and aliases | Description | Usage
`.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` `.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` `.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` `.iamnot` `.iamn` | Removes a role to you that you choose. Role must be on a list of self-assignable roles. | `.iamn Gamer`
`.scadd` | Adds a command to the list of commands which will be executed automatically in the current channel, in the order they were added in, by the bot when it startups up. **Bot owner only** | `.scadd .stats`
`.sclist` | Lists all startup commands in the order they will be executed in. **Bot owner only** | `.sclist`
`.wait` | Used only as a startup command. Waits a certain number of miliseconds before continuing the execution of the following startup commands. **Bot owner only** | `.wait 3000`
`.scrm` | Removes a startup command with the provided command text. **Bot owner only** | `.scrm .stats`
`.scclr` | Removes all startup commands. **Bot owner only** | `.scclr`
`.fwmsgs` | Toggles forwarding of non-command messages sent to bot's DM to the bot owners **Bot owner only** | `.fwmsgs` `.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` `.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` `.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`
@ -94,6 +100,15 @@ Commands and aliases | Description | Usage
`.bye` | Toggles anouncements on the current channel when someone leaves the server. **Requires ManageServer server permission.** | `.bye` `.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. You can use embed json from <http://nadekobot.xyz/embedbuilder/> instead of a regular text, if you want the message to be embedded. **Requires ManageServer server permission.** | `.byemsg %user% has left.` `.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. **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` `.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`
`.warn` | Warns a user. **Requires BanMembers server permission.** | `.warn @b1nzy Very rude person`
`.warnlog` | See a list of warnings of a certain user. **Requires BanMembers server permission.** | `.warnlog @b1nzy`
`.warnclear` `.warnc` | Clears all warnings from a certain user. **Requires BanMembers server permission.** | `.warnclear @PoorDude`
`.warnpunish` `.warnp` | Sets a punishment for a certain number of warnings. Provide no punishment to remove. **Requires BanMembers server permission.** | `.warnpunish 5 Ban` or `.warnpunish 3`
`.warnpunishlist` `.warnpl` | Lists punishments for warnings. | `.warnpunishlist`
`.ban` `.b` | Bans a user by ID or name with an optional message. **Requires BanMembers server permission.** | `.b "@some Guy" Your behaviour is toxic.`
`.unban` | Unbans a user with the provided user#discrim or id. **Requires BanMembers server permission.** | `.unban kwoth#1234` or `.unban 123123123`
`.softban` `.sb` | Bans and then unbans a user by ID or name with an optional message. **Requires KickMembers server permission.** **Requires ManageMessages server permission.** | `.sb "@some Guy" Your behaviour is toxic.`
`.kick` `.k` | Kicks a mentioned user. **Requires KickMembers server permission.** | `.k "@some Guy" Your behaviour is toxic.`
`.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. **Requires ManageRoles server permission.** **Requires ManageChannels server permission.** | `.vcrole SomeRole` or `.vcrole` `.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. **Requires ManageRoles server permission.** **Requires ManageChannels server permission.** | `.vcrole SomeRole` or `.vcrole`
`.vcrolelist` | Shows a list of currently set voice channel roles. | `.vcrolelist` `.vcrolelist` | Shows a list of currently set voice channel roles. | `.vcrolelist`
`.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` `.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`
@ -124,7 +139,7 @@ Commands and aliases | Description | Usage
`.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` `.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` `.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 privileges and removes server custom reaction. | `.dcr 5` `.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`
`.crdm` | Toggles whether the response message of the custom reaction will be sent as a direct message. | `.crad 44` `.crdm` | Toggles whether the response message of the custom reaction will be sent as a direct message. | `.crdm 44`
`.crad` | Toggles whether the message triggering the custom reaction will be automatically deleted. | `.crad 59` `.crad` | Toggles whether the message triggering the custom reaction will be automatically deleted. | `.crad 59`
`.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` `.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` `.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`
@ -151,9 +166,14 @@ Commands and aliases | Description | Usage
`$shuffle` `$sh` | Reshuffles all cards back into the deck. | `$sh` `$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` `$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` `$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`
`$shop` | Lists this server's administrators' shop. Paginated. | `$shop` or `$shop 2`
`$buy` | Buys an item from the shop on a given index. If buying items, make sure that the bot can DM you. | `$buy 2`
`$shopadd` | Adds an item to the shop by specifying type price and name. Available types are role and list. **Requires Administrator server permission.** | `$shopadd role 1000 Rich`
`$shoplistadd` | Adds an item to the list of items for sale in the shop entry given the index. You usually want to run this command in the secret channel, so that the unique items are not leaked. **Requires Administrator server permission.** | `$shoplistadd 1 Uni-que-Steam-Key`
`$shoprem` `$shoprm` | Removes an item from the shop by its color. **Requires Administrator server permission.** | `$shoprm 1`
`$slotstats` | Shows the total stats of the slot command for this bot's session. **Bot owner only** | `$slotstats` `$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` `$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` `$slot` | Play Nadeko slots. Max bet is 9999. 1.5 second cooldown per user. | `$slot 5`
`$claimwaifu` `$claim` | Claim a waifu for yourself by spending currency. You must spend at least 10% more than her current value unless she set `$affinity` towards you. | `$claim 50 @Himesama` `$claimwaifu` `$claim` | Claim a waifu for yourself by spending currency. You must spend at least 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` `$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`
`$affinity` | Sets your affinity towards someone you want to be claimed by. Setting affinity will reduce their `$claim` on you by 20%. You can leave second argument empty to clear your affinity. 30 minutes cooldown. | `$affinity @MyHusband` or `$affinity` `$affinity` | Sets your affinity towards someone you want to be claimed by. Setting affinity will reduce their `$claim` on you by 20%. You can leave second argument empty to clear your affinity. 30 minutes cooldown. | `$affinity @MyHusband` or `$affinity`
@ -291,6 +311,9 @@ Commands and aliases | Description | Usage
`;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` `;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` `;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` `;lstfilterwords` `;lfw` | Shows a list of filtered words. | `;lfw`
`;listglobalperms` `;lgp` | Lists global permissions set by the bot owner. **Bot owner only** | `;lgp`
`;globalmodule` `;gmod` | Enable or disable a module from use on all servers. **Bot owner only** | `;gmod nsfw disable`
`;globalcommand` `;gcmd` | Enables or disables a command from use on all servers. **Bot owner only** | `;gcmd `
###### [Back to ToC](#table-of-contents) ###### [Back to ToC](#table-of-contents)
@ -309,6 +332,7 @@ Commands and aliases | Description | Usage
Commands and aliases | Description | Usage Commands and aliases | Description | Usage
----------------|--------------|------- ----------------|--------------|-------
`~weather` `~we` | Shows weather data for a specified city. You can also specify a country after a comma. | `~we Moscow, RU` `~weather` `~we` | Shows weather data for a specified city. You can also specify a country after a comma. | `~we Moscow, RU`
`~time` | Shows the current time and timezone in the specified location. | `~time London, UK`
`~youtube` `~yt` | Searches youtubes and shows the first result | `~yt query` `~youtube` `~yt` | Searches youtubes and shows the first result | `~yt query`
`~imdb` `~omdb` | Queries omdb for movies or series, show first result. | `~imdb Batman vs Superman` `~imdb` `~omdb` | Queries omdb for movies or series, show first result. | `~imdb Batman vs Superman`
`~randomcat` `~meow` | Shows a random cat image. | `~meow` `~randomcat` `~meow` | Shows a random cat image. | `~meow`
@ -386,6 +410,7 @@ Commands and aliases | Description | Usage
`.showemojis` `.se` | Shows a name and a link to every SPECIAL emoji in the message. | `.se A message full of SPECIAL emojis` `.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` `.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` `.savechat` | Saves a number of messages to a text file and sends it to you. **Bot owner only** | `.savechat 150`
`.ping` | Ping the bot to see if there are latency issues. | `.ping`
`.activity` | Checks for spammers. **Bot owner only** | `.activity` `.activity` | Checks for spammers. **Bot owner only** | `.activity`
`.calculate` `.calc` | Evaluate a mathematical expression. | `.calc 1+1` `.calculate` `.calc` | Evaluate a mathematical expression. | `.calc 1+1`
`.calcops` | Shows all available operations in the `.calc` command | `.calcops` `.calcops` | Shows all available operations in the `.calc` command | `.calcops`
@ -401,9 +426,12 @@ Commands and aliases | Description | Usage
`.repeatremove` `.reprm` | Removes a repeating message on a specified index. Use `.repeatlist` to see indexes. **Requires ManageMessages server permission.** | `.reprm 2` `.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` `.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. `.parewrel` | Forces the update of the list of patrons who are eligible for the reward. **Bot owner only** | `.parewrel`
`.clparew` | Claim patreon rewards. If you're subscribed to bot owner's patreon you can use this command to claim your rewards - assuming bot owner did setup has their patreon key. | `.clparew`
`.listquotes` `.liqu` | Lists all quotes on the server ordered alphabetically. 15 Per page. | `.liqu` or `.liqu 3`
`...` | Shows a random quote with a specified name. | `... abc` `...` | 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` `.qsearch` | Shows a random quote for a keyword that contains any text specified in the search. | `.qsearch keyword text`
`.quoteid` `.qid` | Displays the quote with the specified ID number. Quote ID numbers can be found by typing `.liqu [num]` where `[num]` is a number of a page which contains 15 quotes. | `.qid 123456`
`..` | Adds a new quote with the specified name and message. | `.. sayhi Hi` `..` | Adds a new quote with the specified name and message. | `.. sayhi Hi`
`.deletequote` `.delq` | Deletes a quote with the specified ID. You have to be either server Administrator or the creator of the quote to delete it. | `.delq 123456` `.deletequote` `.delq` | Deletes a quote with the specified ID. You have to be either server Administrator or the creator of the quote to delete it. | `.delq 123456`
`.delallq` `.daq` | Deletes all quotes on a specified keyword. **Requires Administrator server permission.** | `.delallq kek` `.delallq` `.daq` | Deletes all quotes on a specified keyword. **Requires Administrator server permission.** | `.delallq kek`

View File

@ -1,5 +1,5 @@
________________________________________________________________________________ ________________________________________________________________________________
*Thanks to @Flatbread and Mirai for making this guide* *Thanks to @Flatbread and @Mirai for making this guide*
________________________________________________________________________________ ________________________________________________________________________________
## Setting Up NadekoBot on Windows ## Setting Up NadekoBot on Windows
@ -106,7 +106,8 @@ In order to have a functioning music module, you need to install ffmpeg and setu
- Follow these steps on how to setup Google API keys: - Follow these steps on how to setup Google API keys:
- Go to [Google Console][Google Console] and log in. - Go to [Google Console][Google Console] and log in.
- Create a new project (name does not matter). Once the project is created, go into "Enable and manage APIs." - Create a new project (name does not matter). Once the project is created, go into "Enable and manage APIs."
- Under the "Other Popular APIs" section, enable `URL Shortener API` and `Custom Search Api`. Under the `YouTube APIs` section, enable `YouTube Data API`. - Under the "Other Popular APIs" section, enable `URL Shortener API` and `Custom Search API`. Under the `YouTube APIs` section, enable `YouTube Data API`.
- Under the "Google Maps APIs" section, enable `Google Maps Geocoding API` and `Google Maps Time Zone API`.
- On the left tab, access `Credentials`. Click `Create Credentials` button. Click on `API Key`. A new window will appear with your `Google API key`. - On the left tab, access `Credentials`. Click `Create Credentials` button. Click on `API Key`. A new window will appear with your `Google API key`.
- Copy the key. - Copy the key.
- Open up `credentials.json`. - Open up `credentials.json`.
@ -120,6 +121,8 @@ In order to have a functioning music module, you need to install ffmpeg and setu
[.NET Core SDK]: https://github.com/dotnet/core/blob/master/release-notes/download-archives/1.1-preview2.1-download.md [.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 [Git]: https://git-scm.com/download/win
[7zip]: http://www.7-zip.org/download.html [7zip]: http://www.7-zip.org/download.html

View File

@ -162,5 +162,5 @@ GOTO end
ECHO. ECHO.
ECHO Installation complete! ECHO Installation complete!
ECHO. ECHO.
PAUSE timeout /t 5
del Latest.bat del Latest.bat

View File

@ -162,5 +162,5 @@ GOTO end
ECHO. ECHO.
ECHO Installation complete! ECHO Installation complete!
ECHO. ECHO.
PAUSE timeout /t 5
del Stable.bat del Stable.bat

View File

@ -6,6 +6,6 @@ namespace NadekoBot.Attributes
public class OwnerOnlyAttribute : PreconditionAttribute public class OwnerOnlyAttribute : PreconditionAttribute
{ {
public override Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo executingCommand,IDependencyMap depMap) => public override Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo executingCommand,IDependencyMap depMap) =>
Task.FromResult((NadekoBot.Credentials.IsOwner(context.User) ? PreconditionResult.FromSuccess() : PreconditionResult.FromError("Not owner"))); Task.FromResult((NadekoBot.Credentials.IsOwner(context.User) || NadekoBot.Client.CurrentUser.Id == context.User.Id ? PreconditionResult.FromSuccess() : PreconditionResult.FromError("Not owner")));
} }
} }

View File

@ -0,0 +1,128 @@
using NadekoBot.Services.Database.Models;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace NadekoBot.DataStructures
{
public class IndexedCollection<T> : IList<T> where T : IIndexed
{
public List<T> Source { get; }
private readonly object _locker = new object();
public IndexedCollection(IEnumerable<T> 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<T>(IndexedCollection<T> x) =>
x.Source;
public IEnumerator<T> GetEnumerator() =>
Source.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() =>
Source.GetEnumerator();
public void Add(T item)
{
lock (_locker)
{
item.Index = Source.Count;
Source.Add(item);
}
}
public virtual void Clear()
{
lock (_locker)
{
Source.Clear();
}
}
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 virtual bool Remove(T item)
{
bool removed;
lock (_locker)
{
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 virtual void Insert(int index, T item)
{
lock (_locker)
{
Source.Insert(index, item);
for (int i = index; i < Source.Count; i++)
{
Source[i].Index = i;
}
}
}
public virtual void RemoveAt(int index)
{
lock (_locker)
{
Source.RemoveAt(index);
for (int i = index; i < Source.Count; i++)
{
Source[i].Index = i;
}
}
}
public virtual T this[int index] {
get { return Source[index]; }
set {
lock (_locker)
{
value.Index = index;
Source[index] = value;
}
}
}
}
}

View File

@ -6,132 +6,67 @@ using NadekoBot.Services.Database.Models;
namespace NadekoBot.DataStructures namespace NadekoBot.DataStructures
{ {
public class PermissionsCollection<T> : IList<T> where T : IIndexed public class PermissionsCollection<T> : IndexedCollection<T> where T : IIndexed
{ {
public List<T> Source { get; } private readonly object _localLocker = new object();
private readonly object _locker = new object(); public PermissionsCollection(IEnumerable<T> source) : base(source)
public PermissionsCollection(IEnumerable<T> 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<T>(PermissionsCollection<T> x) => public static implicit operator List<T>(PermissionsCollection<T> x) =>
x.Source; x.Source;
public IEnumerator<T> GetEnumerator() => public override void Clear()
Source.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() =>
Source.GetEnumerator();
public void Add(T item)
{ {
lock (_locker) lock (_localLocker)
{
item.Index = Source.Count;
Source.Add(item);
}
}
public void Clear()
{
lock (_locker)
{ {
var first = Source[0]; var first = Source[0];
Source.Clear(); base.Clear();
Source[0] = first; Source[0] = first;
} }
} }
public bool Contains(T item) public override bool Remove(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; bool removed;
lock (_locker) lock (_localLocker)
{ {
if(Source.IndexOf(item) == 0) if(Source.IndexOf(item) == 0)
throw new ArgumentException("You can't remove first permsission (allow all)"); throw new ArgumentException("You can't remove first permsission (allow all)");
if (removed = Source.Remove(item)) removed = base.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; return removed;
} }
public int Count => Source.Count; public override void Insert(int index, T item)
public bool IsReadOnly => false;
public int IndexOf(T item) => item.Index;
public void Insert(int index, T item)
{ {
lock (_locker) lock (_localLocker)
{ {
if(index == 0) // can't insert on first place. Last item is always allow all. if(index == 0) // can't insert on first place. Last item is always allow all.
throw new IndexOutOfRangeException(nameof(index)); throw new IndexOutOfRangeException(nameof(index));
Source.Insert(index, item); base.Insert(index, item);
for (int i = index; i < Source.Count; i++)
{
Source[i].Index = i;
}
} }
} }
public void RemoveAt(int index) public override void RemoveAt(int index)
{ {
lock (_locker) lock (_localLocker)
{ {
if(index == 0) // you can't remove first permission (allow all) if(index == 0) // you can't remove first permission (allow all)
throw new IndexOutOfRangeException(nameof(index)); throw new IndexOutOfRangeException(nameof(index));
Source.RemoveAt(index); base.RemoveAt(index);
for (int i = index; i < Source.Count; i++)
{
Source[i].Index = i;
}
} }
} }
public T this[int index] { public override T this[int index] {
get { return Source[index]; } get { return Source[index]; }
set { set {
lock (_locker) lock (_localLocker)
{ {
if(index == 0) // can't set first element. It's always allow all if(index == 0) // can't set first element. It's always allow all
throw new IndexOutOfRangeException(nameof(index)); throw new IndexOutOfRangeException(nameof(index));
value.Index = index; base[index] = value;
Source[index] = value;
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class warningcommands : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "WarningsInitialized",
table: "GuildConfigs",
nullable: false,
defaultValue: false);
migrationBuilder.CreateTable(
name: "Warnings",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
DateAdded = table.Column<DateTime>(nullable: true),
Forgiven = table.Column<bool>(nullable: false),
ForgivenBy = table.Column<string>(nullable: true),
GuildId = table.Column<ulong>(nullable: false),
Moderator = table.Column<string>(nullable: true),
Reason = table.Column<string>(nullable: true),
UserId = table.Column<ulong>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Warnings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "WarningPunishment",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Count = table.Column<int>(nullable: false),
DateAdded = table.Column<DateTime>(nullable: true),
GuildConfigId = table.Column<int>(nullable: true),
Punishment = table.Column<int>(nullable: false),
Time = table.Column<int>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WarningPunishment", x => x.Id);
table.ForeignKey(
name: "FK_WarningPunishment_GuildConfigs_GuildConfigId",
column: x => x.GuildConfigId,
principalTable: "GuildConfigs",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_WarningPunishment_GuildConfigId",
table: "WarningPunishment",
column: "GuildConfigId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Warnings");
migrationBuilder.DropTable(
name: "WarningPunishment");
migrationBuilder.DropColumn(
name: "WarningsInitialized",
table: "GuildConfigs");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class startupcommands : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "StartupCommand",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
BotConfigId = table.Column<int>(nullable: true),
ChannelId = table.Column<ulong>(nullable: false),
ChannelName = table.Column<string>(nullable: true),
CommandText = table.Column<string>(nullable: true),
DateAdded = table.Column<DateTime>(nullable: true),
GuildId = table.Column<ulong>(nullable: true),
GuildName = table.Column<string>(nullable: true),
Index = table.Column<int>(nullable: false),
VoiceChannelId = table.Column<ulong>(nullable: true),
VoiceChannelName = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_StartupCommand", x => x.Id);
table.ForeignKey(
name: "FK_StartupCommand_BotConfig_BotConfigId",
column: x => x.BotConfigId,
principalTable: "BotConfig",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_StartupCommand_BotConfigId",
table: "StartupCommand",
column: "BotConfigId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "StartupCommand");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class slowmodewhitelist : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "SlowmodeIgnoredRole",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
DateAdded = table.Column<DateTime>(nullable: true),
GuildConfigId = table.Column<int>(nullable: true),
RoleId = table.Column<ulong>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SlowmodeIgnoredRole", x => x.Id);
table.ForeignKey(
name: "FK_SlowmodeIgnoredRole_GuildConfigs_GuildConfigId",
column: x => x.GuildConfigId,
principalTable: "GuildConfigs",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateTable(
name: "SlowmodeIgnoredUser",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
DateAdded = table.Column<DateTime>(nullable: true),
GuildConfigId = table.Column<int>(nullable: true),
UserId = table.Column<ulong>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SlowmodeIgnoredUser", x => x.Id);
table.ForeignKey(
name: "FK_SlowmodeIgnoredUser_GuildConfigs_GuildConfigId",
column: x => x.GuildConfigId,
principalTable: "GuildConfigs",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_SlowmodeIgnoredRole_GuildConfigId",
table: "SlowmodeIgnoredRole",
column: "GuildConfigId");
migrationBuilder.CreateIndex(
name: "IX_SlowmodeIgnoredUser_GuildConfigId",
table: "SlowmodeIgnoredUser",
column: "GuildConfigId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "SlowmodeIgnoredRole");
migrationBuilder.DropTable(
name: "SlowmodeIgnoredUser");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class patreonrewards : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "RewardedUsers",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
AmountRewardedThisMonth = table.Column<int>(nullable: false),
DateAdded = table.Column<DateTime>(nullable: true),
LastReward = table.Column<DateTime>(nullable: false),
UserId = table.Column<ulong>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_RewardedUsers", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_RewardedUsers_UserId",
table: "RewardedUsers",
column: "UserId",
unique: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "RewardedUsers");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class flowershop : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ShopEntry",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
AuthorId = table.Column<ulong>(nullable: false),
DateAdded = table.Column<DateTime>(nullable: true),
GuildConfigId = table.Column<int>(nullable: true),
Index = table.Column<int>(nullable: false),
Name = table.Column<string>(nullable: true),
Price = table.Column<int>(nullable: false),
RoleId = table.Column<ulong>(nullable: false),
RoleName = table.Column<string>(nullable: true),
Type = table.Column<int>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ShopEntry", x => x.Id);
table.ForeignKey(
name: "FK_ShopEntry_GuildConfigs_GuildConfigId",
column: x => x.GuildConfigId,
principalTable: "GuildConfigs",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateTable(
name: "ShopEntryItem",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
DateAdded = table.Column<DateTime>(nullable: true),
ShopEntryId = table.Column<int>(nullable: true),
Text = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_ShopEntryItem", x => x.Id);
table.ForeignKey(
name: "FK_ShopEntryItem_ShopEntry_ShopEntryId",
column: x => x.ShopEntryId,
principalTable: "ShopEntry",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_ShopEntry_GuildConfigId",
table: "ShopEntry",
column: "GuildConfigId");
migrationBuilder.CreateIndex(
name: "IX_ShopEntryItem_ShopEntryId",
table: "ShopEntryItem",
column: "ShopEntryId");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ShopEntryItem");
migrationBuilder.DropTable(
name: "ShopEntry");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class gamevoicechannel : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<ulong>(
name: "GameVoiceChannel",
table: "GuildConfigs",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "GameVoiceChannel",
table: "GuildConfigs");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace NadekoBot.Migrations
{
public partial class gmodandcmod : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "BlockedCmdOrMdl",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
BotConfigId = table.Column<int>(nullable: true),
BotConfigId1 = table.Column<int>(nullable: true),
DateAdded = table.Column<DateTime>(nullable: true),
Name = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_BlockedCmdOrMdl", x => x.Id);
table.ForeignKey(
name: "FK_BlockedCmdOrMdl_BotConfig_BotConfigId",
column: x => x.BotConfigId,
principalTable: "BotConfig",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_BlockedCmdOrMdl_BotConfig_BotConfigId1",
column: x => x.BotConfigId1,
principalTable: "BotConfig",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_BlockedCmdOrMdl_BotConfigId",
table: "BlockedCmdOrMdl",
column: "BotConfigId");
migrationBuilder.CreateIndex(
name: "IX_BlockedCmdOrMdl_BotConfigId1",
table: "BlockedCmdOrMdl",
column: "BotConfigId1");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "BlockedCmdOrMdl");
}
}
}

View File

@ -99,6 +99,28 @@ namespace NadekoBot.Migrations
b.ToTable("BlacklistItem"); b.ToTable("BlacklistItem");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.BlockedCmdOrMdl", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId");
b.Property<int?>("BotConfigId1");
b.Property<DateTime?>("DateAdded");
b.Property<string>("Name");
b.HasKey("Id");
b.HasIndex("BotConfigId");
b.HasIndex("BotConfigId1");
b.ToTable("BlockedCmdOrMdl");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.BotConfig", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -533,6 +555,8 @@ namespace NadekoBot.Migrations
b.Property<bool>("FilterWords"); b.Property<bool>("FilterWords");
b.Property<ulong?>("GameVoiceChannel");
b.Property<ulong>("GreetMessageChannelId"); b.Property<ulong>("GreetMessageChannelId");
b.Property<ulong>("GuildId"); b.Property<ulong>("GuildId");
@ -559,6 +583,8 @@ namespace NadekoBot.Migrations
b.Property<bool>("VoicePlusTextEnabled"); b.Property<bool>("VoicePlusTextEnabled");
b.Property<bool>("WarningsInitialized");
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("GuildId") b.HasIndex("GuildId")
@ -929,6 +955,27 @@ namespace NadekoBot.Migrations
b.ToTable("Reminders"); b.ToTable("Reminders");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.RewardedUser", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int>("AmountRewardedThisMonth");
b.Property<DateTime?>("DateAdded");
b.Property<DateTime>("LastReward");
b.Property<ulong>("UserId");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("RewardedUsers");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.SelfAssignedRole", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -948,6 +995,122 @@ namespace NadekoBot.Migrations
b.ToTable("SelfAssignableRoles"); b.ToTable("SelfAssignableRoles");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<ulong>("AuthorId");
b.Property<DateTime?>("DateAdded");
b.Property<int?>("GuildConfigId");
b.Property<int>("Index");
b.Property<string>("Name");
b.Property<int>("Price");
b.Property<ulong>("RoleId");
b.Property<string>("RoleName");
b.Property<int>("Type");
b.HasKey("Id");
b.HasIndex("GuildConfigId");
b.ToTable("ShopEntry");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntryItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<DateTime?>("DateAdded");
b.Property<int?>("ShopEntryId");
b.Property<string>("Text");
b.HasKey("Id");
b.HasIndex("ShopEntryId");
b.ToTable("ShopEntryItem");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredRole", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<DateTime?>("DateAdded");
b.Property<int?>("GuildConfigId");
b.Property<ulong>("RoleId");
b.HasKey("Id");
b.HasIndex("GuildConfigId");
b.ToTable("SlowmodeIgnoredRole");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredUser", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<DateTime?>("DateAdded");
b.Property<int?>("GuildConfigId");
b.Property<ulong>("UserId");
b.HasKey("Id");
b.HasIndex("GuildConfigId");
b.ToTable("SlowmodeIgnoredUser");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.StartupCommand", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int?>("BotConfigId");
b.Property<ulong>("ChannelId");
b.Property<string>("ChannelName");
b.Property<string>("CommandText");
b.Property<DateTime?>("DateAdded");
b.Property<ulong?>("GuildId");
b.Property<string>("GuildName");
b.Property<int>("Index");
b.Property<ulong?>("VoiceChannelId");
b.Property<string>("VoiceChannelName");
b.HasKey("Id");
b.HasIndex("BotConfigId");
b.ToTable("StartupCommand");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -1060,6 +1223,52 @@ namespace NadekoBot.Migrations
b.ToTable("WaifuUpdates"); b.ToTable("WaifuUpdates");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.Warning", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<DateTime?>("DateAdded");
b.Property<bool>("Forgiven");
b.Property<string>("ForgivenBy");
b.Property<ulong>("GuildId");
b.Property<string>("Moderator");
b.Property<string>("Reason");
b.Property<ulong>("UserId");
b.HasKey("Id");
b.ToTable("Warnings");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.WarningPunishment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int>("Count");
b.Property<DateTime?>("DateAdded");
b.Property<int?>("GuildConfigId");
b.Property<int>("Punishment");
b.Property<int>("Time");
b.HasKey("Id");
b.HasIndex("GuildConfigId");
b.ToTable("WarningPunishment");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.AntiRaidSetting", b =>
{ {
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig") b.HasOne("NadekoBot.Services.Database.Models.GuildConfig", "GuildConfig")
@ -1090,6 +1299,17 @@ namespace NadekoBot.Migrations
.HasForeignKey("BotConfigId"); .HasForeignKey("BotConfigId");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.BlockedCmdOrMdl", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
.WithMany("BlockedCommands")
.HasForeignKey("BotConfigId");
b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
.WithMany("BlockedModules")
.HasForeignKey("BotConfigId1");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.ClashCaller", b =>
{ {
b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar") b.HasOne("NadekoBot.Services.Database.Models.ClashWar", "ClashWar")
@ -1240,6 +1460,41 @@ namespace NadekoBot.Migrations
.HasForeignKey("BotConfigId"); .HasForeignKey("BotConfigId");
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntry", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
.WithMany("ShopEntries")
.HasForeignKey("GuildConfigId");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.ShopEntryItem", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.ShopEntry")
.WithMany("Items")
.HasForeignKey("ShopEntryId");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredRole", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
.WithMany("SlowmodeIgnoredRoles")
.HasForeignKey("GuildConfigId");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.SlowmodeIgnoredUser", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
.WithMany("SlowmodeIgnoredUsers")
.HasForeignKey("GuildConfigId");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.StartupCommand", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.BotConfig")
.WithMany("StartupCommands")
.HasForeignKey("BotConfigId");
});
modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b => modelBuilder.Entity("NadekoBot.Services.Database.Models.UnmuteTimer", b =>
{ {
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig") b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
@ -1285,6 +1540,13 @@ namespace NadekoBot.Migrations
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade);
}); });
modelBuilder.Entity("NadekoBot.Services.Database.Models.WarningPunishment", b =>
{
b.HasOne("NadekoBot.Services.Database.Models.GuildConfig")
.WithMany("WarnPunishments")
.HasForeignKey("GuildConfigId");
});
} }
} }
} }

View File

@ -11,8 +11,8 @@ using Discord.WebSocket;
using NadekoBot.Services.Database.Models; using NadekoBot.Services.Database.Models;
using static NadekoBot.Modules.Permissions.Permissions; using static NadekoBot.Modules.Permissions.Permissions;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using Microsoft.EntityFrameworkCore;
using NLog; using NLog;
using NadekoBot.Modules.Permissions;
namespace NadekoBot.Modules.Administration namespace NadekoBot.Modules.Administration
{ {
@ -32,7 +32,7 @@ namespace NadekoBot.Modules.Administration
} }
private static Task DelMsgOnCmd_Handler(SocketUserMessage msg, CommandInfo cmd) private static Task DelMsgOnCmd_Handler(IUserMessage msg, CommandInfo cmd)
{ {
var _ = Task.Run(async () => var _ = Task.Run(async () =>
{ {
@ -67,6 +67,23 @@ namespace NadekoBot.Modules.Administration
await ReplyConfirmLocalized("perms_reset").ConfigureAwait(false); await ReplyConfirmLocalized("perms_reset").ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
public async Task ResetGlobalPermissions()
{
using (var uow = DbHandler.UnitOfWork())
{
var gc = uow.BotConfig.GetOrCreate();
gc.BlockedCommands.Clear();
gc.BlockedModules.Clear();
GlobalPermissionCommands.BlockedCommands.Clear();
GlobalPermissionCommands.BlockedModules.Clear();
await uow.CompleteAsync();
}
await ReplyConfirmLocalized("global_perms_reset").ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.Administrator)] [RequireUserPermission(GuildPermission.Administrator)]
@ -99,6 +116,10 @@ namespace NadekoBot.Modules.Administration
[RequireBotPermission(GuildPermission.ManageRoles)] [RequireBotPermission(GuildPermission.ManageRoles)]
public async Task Setrole(IGuildUser usr, [Remainder] IRole role) public async Task Setrole(IGuildUser usr, [Remainder] IRole role)
{ {
var guser = (IGuildUser)Context.User;
var maxRole = guser.GetRoles().Max(x => x.Position);
if (maxRole < role.Position || maxRole <= usr.GetRoles().Max(x => x.Position))
return;
try try
{ {
await usr.AddRolesAsync(role).ConfigureAwait(false); await usr.AddRolesAsync(role).ConfigureAwait(false);
@ -118,6 +139,9 @@ namespace NadekoBot.Modules.Administration
[RequireBotPermission(GuildPermission.ManageRoles)] [RequireBotPermission(GuildPermission.ManageRoles)]
public async Task Removerole(IGuildUser usr, [Remainder] IRole role) public async Task Removerole(IGuildUser usr, [Remainder] IRole role)
{ {
var guser = (IGuildUser)Context.User;
if (Context.User.Id != guser.Guild.OwnerId && guser.GetRoles().Max(x => x.Position) <= usr.GetRoles().Max(x => x.Position))
return;
try try
{ {
await usr.RemoveRolesAsync(role).ConfigureAwait(false); await usr.RemoveRolesAsync(role).ConfigureAwait(false);
@ -135,6 +159,9 @@ namespace NadekoBot.Modules.Administration
[RequireBotPermission(GuildPermission.ManageRoles)] [RequireBotPermission(GuildPermission.ManageRoles)]
public async Task RenameRole(IRole roleToEdit, string newname) public async Task RenameRole(IRole roleToEdit, string newname)
{ {
var guser = (IGuildUser)Context.User;
if (Context.User.Id != guser.Guild.OwnerId && guser.GetRoles().Max(x => x.Position) <= roleToEdit.Position)
return;
try try
{ {
if (roleToEdit.Position > (await Context.Guild.GetCurrentUserAsync().ConfigureAwait(false)).GetRoles().Max(r => r.Position)) if (roleToEdit.Position > (await Context.Guild.GetCurrentUserAsync().ConfigureAwait(false)).GetRoles().Max(r => r.Position))
@ -157,9 +184,15 @@ namespace NadekoBot.Modules.Administration
[RequireBotPermission(GuildPermission.ManageRoles)] [RequireBotPermission(GuildPermission.ManageRoles)]
public async Task RemoveAllRoles([Remainder] IGuildUser user) public async Task RemoveAllRoles([Remainder] IGuildUser user)
{ {
var guser = (IGuildUser)Context.User;
var userRoles = user.GetRoles();
if (guser.Id != Context.Guild.OwnerId &&
(user.Id == Context.Guild.OwnerId || guser.GetRoles().Max(x => x.Position) <= userRoles.Max(x => x.Position)))
return;
try try
{ {
await user.RemoveRolesAsync(user.GetRoles()).ConfigureAwait(false); await user.RemoveRolesAsync(userRoles).ConfigureAwait(false);
await ReplyConfirmLocalized("rar", Format.Bold(user.ToString())).ConfigureAwait(false); await ReplyConfirmLocalized("rar", Format.Bold(user.ToString())).ConfigureAwait(false);
} }
catch catch
@ -181,6 +214,19 @@ namespace NadekoBot.Modules.Administration
await ReplyConfirmLocalized("cr", Format.Bold(r.Name)).ConfigureAwait(false); await ReplyConfirmLocalized("cr", Format.Bold(r.Name)).ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageRoles)]
[RequireBotPermission(GuildPermission.ManageRoles)]
public async Task RoleHoist(string roleSearchName, PermissionAction targetState)
{
var roleName = roleSearchName.ToUpperInvariant();
var role = Context.Guild.Roles.FirstOrDefault(r => r.Name.ToUpperInvariant() == roleName);
await role.ModifyAsync(r => r.Hoist = targetState.Value).ConfigureAwait(false);
await ReplyConfirmLocalized("rh", Format.Bold(role.Name), Format.Bold(targetState.Value.ToString())).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.ManageRoles)]
@ -218,101 +264,6 @@ namespace NadekoBot.Modules.Administration
} }
} }
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
[RequireBotPermission(GuildPermission.BanMembers)]
public async Task Ban(IGuildUser user, [Remainder] string msg = null)
{
if (Context.User.Id != user.Guild.OwnerId && (user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max()))
{
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
return;
}
if (!string.IsNullOrWhiteSpace(msg))
{
try
{
await user.SendErrorAsync(GetText("bandm", Format.Bold(Context.Guild.Name), msg));
}
catch
{
// ignored
}
}
await Context.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle("⛔️ " + GetText("banned_user"))
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
.ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.KickMembers)]
[RequireUserPermission(GuildPermission.ManageMessages)]
[RequireBotPermission(GuildPermission.BanMembers)]
public async Task Softban(IGuildUser user, [Remainder] string msg = null)
{
if (Context.User.Id != user.Guild.OwnerId && user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max())
{
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
return;
}
if (!string.IsNullOrWhiteSpace(msg))
{
try
{
await user.SendErrorAsync(GetText("sbdm", Format.Bold(Context.Guild.Name), msg));
}
catch
{
// ignored
}
}
await Context.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
try { await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false); }
catch { await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false); }
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle("☣ " + GetText("sb_user"))
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
.ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.KickMembers)]
[RequireBotPermission(GuildPermission.KickMembers)]
public async Task Kick(IGuildUser user, [Remainder] string msg = null)
{
if (Context.Message.Author.Id != user.Guild.OwnerId && user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max())
{
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
return;
}
if (!string.IsNullOrWhiteSpace(msg))
{
try
{
await user.SendErrorAsync(GetText("kickdm", Format.Bold(Context.Guild.Name), msg));
}
catch { }
}
await user.KickAsync().ConfigureAwait(false);
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle(GetText("kicked_user"))
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
.ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.DeafenMembers)] [RequireUserPermission(GuildPermission.DeafenMembers)]
@ -441,13 +392,18 @@ namespace NadekoBot.Modules.Administration
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(ChannelPermission.ManageMessages)] [RequireUserPermission(ChannelPermission.ManageMessages)]
[RequireBotPermission(GuildPermission.ManageMessages)] [RequireBotPermission(GuildPermission.ManageMessages)]
[Priority(0)]
public async Task Prune(int count) public async Task Prune(int count)
{ {
if (count < 1) if (count < 1)
return; return;
await Context.Message.DeleteAsync().ConfigureAwait(false); await Context.Message.DeleteAsync().ConfigureAwait(false);
int limit = (count < 100) ? count : 100; int limit = (count < 100) ? count + 1 : 100;
var enumerable = (await Context.Channel.GetMessagesAsync(limit: limit).Flatten().ConfigureAwait(false)); var enumerable = (await Context.Channel.GetMessagesAsync(limit: limit).Flatten().ConfigureAwait(false));
if (enumerable.FirstOrDefault()?.Id == Context.Message.Id)
enumerable = enumerable.Skip(1).ToArray();
else
enumerable = enumerable.Take(count);
await Context.Channel.DeleteMessagesAsync(enumerable).ConfigureAwait(false); await Context.Channel.DeleteMessagesAsync(enumerable).ConfigureAwait(false);
} }
@ -456,6 +412,7 @@ namespace NadekoBot.Modules.Administration
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(ChannelPermission.ManageMessages)] [RequireUserPermission(ChannelPermission.ManageMessages)]
[RequireBotPermission(GuildPermission.ManageMessages)] [RequireBotPermission(GuildPermission.ManageMessages)]
[Priority(1)]
public async Task Prune(IGuildUser user, int count = 100) public async Task Prune(IGuildUser user, int count = 100)
{ {
if (count < 1) if (count < 1)

View File

@ -1,6 +1,7 @@
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Extensions;
using NadekoBot.Services; using NadekoBot.Services;
using NLog; using NLog;
using System; using System;
@ -48,6 +49,11 @@ namespace NadekoBot.Modules.Administration
[RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.ManageRoles)]
public async Task AutoAssignRole([Remainder] IRole role = null) public async Task AutoAssignRole([Remainder] IRole role = null)
{ {
var guser = (IGuildUser)Context.User;
if (role != null)
if (Context.User.Id != guser.Guild.OwnerId && guser.GetRoles().Max(x => x.Position) <= role.Position)
return;
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
{ {
var conf = uow.GuildConfigs.For(Context.Guild.Id, set => set); var conf = uow.GuildConfigs.For(Context.Guild.Id, set => set);

View File

@ -0,0 +1,131 @@
using Discord;
using Discord.Commands;
using Microsoft.EntityFrameworkCore;
using NadekoBot.Attributes;
using NadekoBot.Services;
using NadekoBot.Services.Database;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Discord.WebSocket;
using NLog;
using NadekoBot.Extensions;
namespace NadekoBot.Modules.Administration
{
public partial class Administration
{
[Group]
public class GameChannelCommands : NadekoSubmodule
{
//private static readonly Timer _t;
private static readonly ConcurrentHashSet<ulong> gameVoiceChannels = new ConcurrentHashSet<ulong>();
private static new readonly Logger _log;
static GameChannelCommands()
{
//_t = new Timer(_ => {
//}, null, );
_log = LogManager.GetCurrentClassLogger();
gameVoiceChannels = new ConcurrentHashSet<ulong>(
NadekoBot.AllGuildConfigs.Where(gc => gc.GameVoiceChannel != null)
.Select(gc => gc.GameVoiceChannel.Value));
NadekoBot.Client.UserVoiceStateUpdated += Client_UserVoiceStateUpdated;
}
private static Task Client_UserVoiceStateUpdated(SocketUser usr, SocketVoiceState oldState, SocketVoiceState newState)
{
var _ = Task.Run(async () =>
{
try
{
var gUser = usr as SocketGuildUser;
if (gUser == null)
return;
var game = gUser.Game?.Name.TrimTo(50).ToLowerInvariant();
if (oldState.VoiceChannel == newState.VoiceChannel ||
newState.VoiceChannel == null)
return;
if (!gameVoiceChannels.Contains(newState.VoiceChannel.Id) ||
string.IsNullOrWhiteSpace(game))
return;
var vch = gUser.Guild.VoiceChannels
.FirstOrDefault(x => x.Name.ToLowerInvariant() == game);
if (vch == null)
return;
await Task.Delay(1000).ConfigureAwait(false);
await gUser.ModifyAsync(gu => gu.Channel = vch).ConfigureAwait(false);
}
catch (Exception ex)
{
_log.Warn(ex);
}
});
return Task.CompletedTask;
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.Administrator)]
[RequireBotPermission(GuildPermission.MoveMembers)]
public async Task GameVoiceChannel()
{
var vch = ((IGuildUser)Context.User).VoiceChannel;
if (vch == null)
{
await ReplyErrorLocalized("not_in_voice").ConfigureAwait(false);
return;
}
ulong? id;
using (var uow = DbHandler.UnitOfWork())
{
var gc = uow.GuildConfigs.For(Context.Guild.Id, set => set);
if (gc.GameVoiceChannel == vch.Id)
{
gameVoiceChannels.TryRemove(vch.Id);
id = gc.GameVoiceChannel = null;
}
else
{
if(gc.GameVoiceChannel != null)
gameVoiceChannels.TryRemove(gc.GameVoiceChannel.Value);
gameVoiceChannels.Add(vch.Id);
id = gc.GameVoiceChannel = vch.Id;
}
uow.Complete();
}
if (id == null)
{
await ReplyConfirmLocalized("gvc_disabled").ConfigureAwait(false);
}
else
{
gameVoiceChannels.Add(vch.Id);
await ReplyConfirmLocalized("gvc_enabled", Format.Bold(vch.Name)).ConfigureAwait(false);
}
}
}
}
}

View File

@ -16,26 +16,30 @@ namespace NadekoBot.Modules.Administration
[Group] [Group]
public class LocalizationCommands : NadekoSubmodule public class LocalizationCommands : NadekoSubmodule
{ {
//Română, România
//Bahasa Indonesia, Indonesia
private ImmutableDictionary<string, string> supportedLocales { get; } = new Dictionary<string, string>() private ImmutableDictionary<string, string> supportedLocales { get; } = new Dictionary<string, string>()
{ {
{"zh-TW", "Chinese (Traditional), China" }, //{"ar", "العربية" },
{"zh-CN", "Chinese (Simplified), China"}, {"zh-TW", "繁體中文, 台灣" },
{"nl-NL", "Dutch, Netherlands"}, {"zh-CN", "简体中文, 中华人民共和国"},
{"nl-NL", "Nederlands, Nederland"},
{"en-US", "English, United States"}, {"en-US", "English, United States"},
{"fr-FR", "French, France"}, {"fr-FR", "Français, France"},
{"de-DE", "German, Germany"}, {"de-DE", "Deutsch, Deutschland"},
{"he-IL", "Hebrew, Israel" }, {"he-IL", "עברית, ישראל"},
{"it-IT", "Italian, Italy" }, {"id-ID", "Bahasa Indonesia, Indonesia" },
//{"ja-JP", "Japanese, Japan"}, {"it-IT", "Italiano, Italia" },
{"ko-KR", "Korean, Korea" }, //{"ja-JP", "日本語, 日本"},
{"nb-NO", "Norwegian (bokmål), Norway"}, {"ko-KR", "한국어, 대한민국" },
{"pl-PL", "Polish, Poland" }, {"nb-NO", "Norsk, Norge"},
{"pt-BR", "Portuguese, Brazil"}, {"pl-PL", "Polski, Polska" },
{"ru-RU", "Russian, Russia"}, {"pt-BR", "Português Brasileiro, Brasil"},
{"sr-Cyrl-RS", "Serbian, Serbia - Cyrillic"}, {"ru-RU", "Русский, Россия"},
{"es-ES", "Spanish, Spain"}, {"sr-Cyrl-RS", "Српски, Србија"},
{"sv-SE", "Swedish, Sweden"}, {"es-ES", "Español, España"},
{"tr-TR", "Turkish, Turkey" } {"sv-SE", "Svenska, Sverige"},
{"tr-TR", "Türkçe, Türkiye"}
}.ToImmutableDictionary(); }.ToImmutableDictionary();
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]

View File

@ -307,6 +307,9 @@ namespace NadekoBot.Modules.Administration
punishment = "🔇 " + logChannel.Guild.GetLogText("muted_pl").ToUpperInvariant(); punishment = "🔇 " + logChannel.Guild.GetLogText("muted_pl").ToUpperInvariant();
break; break;
case PunishmentAction.Kick: case PunishmentAction.Kick:
punishment = "👢 " + logChannel.Guild.GetLogText("kicked_pl").ToUpperInvariant();
break;
case PunishmentAction.Softban:
punishment = "☣ " + logChannel.Guild.GetLogText("soft_banned_pl").ToUpperInvariant(); punishment = "☣ " + logChannel.Guild.GetLogText("soft_banned_pl").ToUpperInvariant();
break; break;
case PunishmentAction.Ban: case PunishmentAction.Ban:

View File

@ -1,5 +1,6 @@
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Services; using NadekoBot.Services;
@ -32,6 +33,9 @@ namespace NadekoBot.Modules.Administration
Chat, Chat,
All All
} }
private static readonly OverwritePermissions denyOverwrite = new OverwritePermissions(sendMessages: PermValue.Deny, attachFiles: PermValue.Deny);
private static readonly new Logger _log = LogManager.GetCurrentClassLogger();
static MuteCommands() static MuteCommands()
{ {
@ -152,21 +156,26 @@ namespace NadekoBot.Modules.Administration
muteRole = guild.Roles.FirstOrDefault(r => r.Name == muteRoleName) ?? muteRole = guild.Roles.FirstOrDefault(r => r.Name == muteRoleName) ??
await guild.CreateRoleAsync(defaultMuteRoleName, GuildPermissions.None).ConfigureAwait(false); await guild.CreateRoleAsync(defaultMuteRoleName, GuildPermissions.None).ConfigureAwait(false);
} }
}
foreach (var toOverwrite in (await guild.GetTextChannelsAsync())) foreach (var toOverwrite in (await guild.GetTextChannelsAsync()))
{ {
try try
{ {
await toOverwrite.AddPermissionOverwriteAsync(muteRole, new OverwritePermissions(sendMessages: PermValue.Deny, attachFiles: PermValue.Deny)) if (!toOverwrite.PermissionOverwrites.Select(x => x.Permissions).Contains(denyOverwrite))
{
await toOverwrite.AddPermissionOverwriteAsync(muteRole, denyOverwrite)
.ConfigureAwait(false); .ConfigureAwait(false);
await Task.Delay(200).ConfigureAwait(false);
}
} }
catch catch
{ {
// ignored // ignored
} }
await Task.Delay(200).ConfigureAwait(false);
}
} }
return muteRole; return muteRole;
} }

View File

@ -188,6 +188,13 @@ namespace NadekoBot.Modules.Administration
catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); } catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); }
break; break;
case PunishmentAction.Kick: case PunishmentAction.Kick:
try
{
await gu.KickAsync().ConfigureAwait(false);
}
catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); }
break;
case PunishmentAction.Softban:
try try
{ {
await gu.Guild.AddBanAsync(gu, 7).ConfigureAwait(false); await gu.Guild.AddBanAsync(gu, 7).ConfigureAwait(false);

View File

@ -1,10 +1,16 @@
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket;
using Microsoft.EntityFrameworkCore;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Extensions; using NadekoBot.Extensions;
using NadekoBot.Services;
using NadekoBot.Services.Database.Models;
using NLog; using NLog;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -13,9 +19,12 @@ namespace NadekoBot.Modules.Administration
public partial class Administration public partial class Administration
{ {
[Group] [Group]
public class RatelimitCommand : NadekoSubmodule public class RatelimitCommands : NadekoSubmodule
{ {
public static ConcurrentDictionary<ulong, Ratelimiter> RatelimitingChannels = new ConcurrentDictionary<ulong, Ratelimiter>(); public static ConcurrentDictionary<ulong, Ratelimiter> RatelimitingChannels = new ConcurrentDictionary<ulong, Ratelimiter>();
public static ConcurrentDictionary<ulong, HashSet<ulong>> IgnoredRoles = new ConcurrentDictionary<ulong, HashSet<ulong>>();
public static ConcurrentDictionary<ulong, HashSet<ulong>> IgnoredUsers = new ConcurrentDictionary<ulong, HashSet<ulong>>();
private new static readonly Logger _log; private new static readonly Logger _log;
public class Ratelimiter public class Ratelimiter
@ -35,10 +44,17 @@ namespace NadekoBot.Modules.Administration
public ConcurrentDictionary<ulong, RatelimitedUser> Users { get; set; } = new ConcurrentDictionary<ulong, RatelimitedUser>(); public ConcurrentDictionary<ulong, RatelimitedUser> Users { get; set; } = new ConcurrentDictionary<ulong, RatelimitedUser>();
public bool CheckUserRatelimit(ulong id) public bool CheckUserRatelimit(ulong id, ulong guildId, SocketGuildUser optUser)
{ {
HashSet<ulong> ignoreUsers;
HashSet<ulong> ignoreRoles;
if ((IgnoredUsers.TryGetValue(guildId, out ignoreUsers) && ignoreUsers.Contains(id)) ||
(optUser != null && IgnoredRoles.TryGetValue(guildId, out ignoreRoles) && optUser.RoleIds.Any(x => ignoreRoles.Contains(x))))
return false;
var usr = Users.GetOrAdd(id, (key) => new RatelimitedUser() { UserId = id }); var usr = Users.GetOrAdd(id, (key) => new RatelimitedUser() { UserId = id });
if (usr.MessageCount == MaxMessages) if (usr.MessageCount >= MaxMessages)
{ {
return true; return true;
} }
@ -56,16 +72,26 @@ namespace NadekoBot.Modules.Administration
} }
} }
static RatelimitCommand() static RatelimitCommands()
{ {
_log = LogManager.GetCurrentClassLogger(); _log = LogManager.GetCurrentClassLogger();
IgnoredRoles = new ConcurrentDictionary<ulong, HashSet<ulong>>(
NadekoBot.AllGuildConfigs
.ToDictionary(x => x.GuildId,
x => new HashSet<ulong>(x.SlowmodeIgnoredRoles.Select(y => y.RoleId))));
IgnoredUsers = new ConcurrentDictionary<ulong, HashSet<ulong>>(
NadekoBot.AllGuildConfigs
.ToDictionary(x => x.GuildId,
x => new HashSet<ulong>(x.SlowmodeIgnoredUsers.Select(y => y.UserId))));
NadekoBot.Client.MessageReceived += async (umsg) => NadekoBot.Client.MessageReceived += async (umsg) =>
{ {
try try
{ {
var usrMsg = umsg as IUserMessage; var usrMsg = umsg as SocketUserMessage;
var channel = usrMsg?.Channel as ITextChannel; var channel = usrMsg?.Channel as SocketTextChannel;
if (channel == null || usrMsg.IsAuthor()) if (channel == null || usrMsg.IsAuthor())
return; return;
@ -73,7 +99,7 @@ namespace NadekoBot.Modules.Administration
if (!RatelimitingChannels.TryGetValue(channel.Id, out limiter)) if (!RatelimitingChannels.TryGetValue(channel.Id, out limiter))
return; return;
if (limiter.CheckUserRatelimit(usrMsg.Author.Id)) if (limiter.CheckUserRatelimit(usrMsg.Author.Id, channel.Guild.Id, usrMsg.Author as SocketGuildUser))
await usrMsg.DeleteAsync(); await usrMsg.DeleteAsync();
} }
catch (Exception ex) { _log.Warn(ex); } catch (Exception ex) { _log.Warn(ex); }
@ -118,6 +144,70 @@ namespace NadekoBot.Modules.Administration
.ConfigureAwait(false); .ConfigureAwait(false);
} }
} }
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageMessages)]
[Priority(1)]
public async Task SlowmodeWhitelist(IUser user)
{
var siu = new SlowmodeIgnoredUser
{
UserId = user.Id
};
HashSet<SlowmodeIgnoredUser> usrs;
bool removed;
using (var uow = DbHandler.UnitOfWork())
{
usrs = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.SlowmodeIgnoredUsers))
.SlowmodeIgnoredUsers;
if (!(removed = usrs.Remove(siu)))
usrs.Add(siu);
await uow.CompleteAsync().ConfigureAwait(false);
}
IgnoredUsers.AddOrUpdate(Context.Guild.Id, new HashSet<ulong>(usrs.Select(x => x.UserId)), (key, old) => new HashSet<ulong>(usrs.Select(x => x.UserId)));
if(removed)
await ReplyConfirmLocalized("slowmodewl_user_stop", Format.Bold(user.ToString())).ConfigureAwait(false);
else
await ReplyConfirmLocalized("slowmodewl_user_start", Format.Bold(user.ToString())).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageMessages)]
[Priority(0)]
public async Task SlowmodeWhitelist(IRole role)
{
var sir = new SlowmodeIgnoredRole
{
RoleId = role.Id
};
HashSet<SlowmodeIgnoredRole> roles;
bool removed;
using (var uow = DbHandler.UnitOfWork())
{
roles = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.SlowmodeIgnoredRoles))
.SlowmodeIgnoredRoles;
if (!(removed = roles.Remove(sir)))
roles.Add(sir);
await uow.CompleteAsync().ConfigureAwait(false);
}
IgnoredRoles.AddOrUpdate(Context.Guild.Id, new HashSet<ulong>(roles.Select(x => x.RoleId)), (key, old) => new HashSet<ulong>(roles.Select(x => x.RoleId)));
if (removed)
await ReplyConfirmLocalized("slowmodewl_role_stop", Format.Bold(role.ToString())).ConfigureAwait(false);
else
await ReplyConfirmLocalized("slowmodewl_role_start", Format.Bold(role.ToString())).ConfigureAwait(false);
}
} }
} }
} }

View File

@ -43,6 +43,10 @@ namespace NadekoBot.Modules.Administration
{ {
IEnumerable<SelfAssignedRole> roles; IEnumerable<SelfAssignedRole> roles;
var guser = (IGuildUser)Context.User;
if (Context.User.Id != guser.Guild.OwnerId && guser.GetRoles().Max(x => x.Position) <= role.Position)
return;
string msg; string msg;
var error = false; var error = false;
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
@ -75,6 +79,10 @@ namespace NadekoBot.Modules.Administration
[RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.ManageRoles)]
public async Task Rsar([Remainder] IRole role) public async Task Rsar([Remainder] IRole role)
{ {
var guser = (IGuildUser)Context.User;
if (Context.User.Id != guser.Guild.OwnerId && guser.GetRoles().Max(x => x.Position) <= role.Position)
return;
bool success; bool success;
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
{ {

View File

@ -10,6 +10,8 @@ using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Discord.WebSocket; using Discord.WebSocket;
using NadekoBot.Services; using NadekoBot.Services;
using NadekoBot.Services.Database.Models;
using Microsoft.EntityFrameworkCore;
namespace NadekoBot.Modules.Administration namespace NadekoBot.Modules.Administration
{ {
@ -31,6 +33,166 @@ namespace NadekoBot.Modules.Administration
_forwardDMs = config.ForwardMessages; _forwardDMs = config.ForwardMessages;
_forwardDMsToAllOwners = config.ForwardToAllOwners; _forwardDMsToAllOwners = config.ForwardToAllOwners;
} }
var _ = Task.Run(async () =>
{
while(!NadekoBot.Ready)
await Task.Delay(1000);
foreach (var cmd in NadekoBot.BotConfig.StartupCommands)
{
if (cmd.GuildId != null)
{
var guild = NadekoBot.Client.GetGuild(cmd.GuildId.Value);
var channel = guild?.GetChannel(cmd.ChannelId) as SocketTextChannel;
if (channel == null)
continue;
try
{
IUserMessage msg = await channel.SendMessageAsync(cmd.CommandText).ConfigureAwait(false);
msg = (IUserMessage)await channel.GetMessageAsync(msg.Id).ConfigureAwait(false);
await NadekoBot.CommandHandler.TryRunCommand(guild, channel, msg).ConfigureAwait(false);
//msg.DeleteAfter(5);
}
catch { }
}
await Task.Delay(400).ConfigureAwait(false);
}
});
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[OwnerOnly]
public async Task StartupCommandAdd([Remainder] string cmdText)
{
var guser = ((IGuildUser)Context.User);
var cmd = new StartupCommand()
{
CommandText = cmdText,
ChannelId = Context.Channel.Id,
ChannelName = Context.Channel.Name,
GuildId = Context.Guild?.Id,
GuildName = Context.Guild?.Name,
VoiceChannelId = guser.VoiceChannel?.Id,
VoiceChannelName = guser.VoiceChannel?.Name,
};
using (var uow = DbHandler.UnitOfWork())
{
uow.BotConfig
.GetOrCreate(set => set.Include(x => x.StartupCommands))
.StartupCommands.Add(cmd);
await uow.CompleteAsync().ConfigureAwait(false);
}
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle(GetText("scadd"))
.AddField(efb => efb.WithName(GetText("server"))
.WithValue(cmd.GuildId == null ? $"-" : $"{cmd.GuildName}/{cmd.GuildId}").WithIsInline(true))
.AddField(efb => efb.WithName(GetText("channel"))
.WithValue($"{cmd.ChannelName}/{cmd.ChannelId}").WithIsInline(true))
.AddField(efb => efb.WithName(GetText("command_text"))
.WithValue(cmdText).WithIsInline(false)));
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[OwnerOnly]
public async Task StartupCommands(int page = 1)
{
if (page < 1)
return;
page -= 1;
IEnumerable<StartupCommand> scmds;
using (var uow = DbHandler.UnitOfWork())
{
scmds = uow.BotConfig
.GetOrCreate(set => set.Include(x => x.StartupCommands))
.StartupCommands
.OrderBy(x => x.Id)
.ToArray();
}
scmds = scmds.Skip(page * 5).Take(5);
if (!scmds.Any())
{
await ReplyErrorLocalized("startcmdlist_none").ConfigureAwait(false);
}
else
{
await Context.Channel.SendConfirmAsync("", string.Join("\n--\n", scmds.Select(x =>
{
string str = Format.Code(GetText("server")) + ": " + (x.GuildId == null ? "-" : x.GuildName + "/" + x.GuildId);
str += $@"
{Format.Code(GetText("channel"))}: {x.ChannelName}/{x.ChannelId}
{Format.Code(GetText("command_text"))}: {x.CommandText}";
return str;
})),footer: GetText("page", page + 1))
.ConfigureAwait(false);
}
}
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
public async Task Wait(int miliseconds)
{
if (miliseconds <= 0)
return;
Context.Message.DeleteAfter(0);
try
{
var msg = await Context.Channel.SendConfirmAsync($"⏲ {miliseconds}ms")
.ConfigureAwait(false);
msg.DeleteAfter(miliseconds / 1000);
}
catch { }
await Task.Delay(miliseconds);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[OwnerOnly]
public async Task StartupCommandRemove([Remainder] string cmdText)
{
StartupCommand cmd;
using (var uow = DbHandler.UnitOfWork())
{
var cmds = uow.BotConfig
.GetOrCreate(set => set.Include(x => x.StartupCommands))
.StartupCommands;
cmd = cmds
.FirstOrDefault(x => x.CommandText.ToLowerInvariant() == cmdText.ToLowerInvariant());
if (cmd != null)
{
cmds.Remove(cmd);
await uow.CompleteAsync().ConfigureAwait(false);
}
}
if(cmd == null)
await ReplyErrorLocalized("scrm_fail").ConfigureAwait(false);
else
await ReplyConfirmLocalized("scrm").ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[OwnerOnly]
public async Task StartupCommandsClear()
{
using (var uow = DbHandler.UnitOfWork())
{
uow.BotConfig
.GetOrCreate(set => set.Include(x => x.StartupCommands))
.StartupCommands
.Clear();
uow.Complete();
}
await ReplyConfirmLocalized("startcmds_cleared").ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
@ -68,7 +230,7 @@ namespace NadekoBot.Modules.Administration
} }
public static async Task HandleDmForwarding(SocketMessage msg, List<IDMChannel> ownerChannels) public static async Task HandleDmForwarding(IUserMessage msg, List<IDMChannel> ownerChannels)
{ {
if (_forwardDMs && ownerChannels.Any()) if (_forwardDMs && ownerChannels.Any())
{ {
@ -157,7 +319,7 @@ namespace NadekoBot.Modules.Administration
else else
{ {
await server.DeleteAsync().ConfigureAwait(false); await server.DeleteAsync().ConfigureAwait(false);
await ReplyConfirmLocalized("deleted_server",Format.Bold(server.Name)).ConfigureAwait(false); await ReplyConfirmLocalized("deleted_server", Format.Bold(server.Name)).ConfigureAwait(false);
} }
} }

View File

@ -0,0 +1,436 @@
using Discord;
using Discord.Commands;
using Discord.WebSocket;
using Microsoft.EntityFrameworkCore;
using NadekoBot.Attributes;
using NadekoBot.Extensions;
using NadekoBot.Services;
using NadekoBot.Services.Database.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace NadekoBot.Modules.Administration
{
public partial class Administration
{
[Group]
public class UserPunishCommands : NadekoSubmodule
{
private async Task<PunishmentAction?> InternalWarn(IGuild guild, ulong userId, string modName, string reason)
{
if (string.IsNullOrWhiteSpace(reason))
reason = "-";
var guildId = guild.Id;
var warn = new Warning()
{
UserId = userId,
GuildId = guildId,
Forgiven = false,
Reason = reason,
Moderator = modName,
};
int warnings = 1;
List<WarningPunishment> ps;
using (var uow = DbHandler.UnitOfWork())
{
ps = uow.GuildConfigs.For(guildId, set => set.Include(x => x.WarnPunishments))
.WarnPunishments;
warnings += uow.Warnings
.For(guildId, userId)
.Where(w => !w.Forgiven && w.UserId == userId)
.Count();
uow.Warnings.Add(warn);
uow.Complete();
}
var p = ps.FirstOrDefault(x => x.Count == warnings);
if (p != null)
{
var user = await guild.GetUserAsync(userId);
if (user == null)
return null;
switch (p.Punishment)
{
case PunishmentAction.Mute:
if (p.Time == 0)
await MuteCommands.MuteUser(user).ConfigureAwait(false);
else
await MuteCommands.TimedMute(user, TimeSpan.FromMinutes(p.Time)).ConfigureAwait(false);
break;
case PunishmentAction.Kick:
await user.KickAsync().ConfigureAwait(false);
break;
case PunishmentAction.Ban:
await guild.AddBanAsync(user).ConfigureAwait(false);
break;
case PunishmentAction.Softban:
await guild.AddBanAsync(user).ConfigureAwait(false);
try
{
await guild.RemoveBanAsync(user).ConfigureAwait(false);
}
catch
{
await guild.RemoveBanAsync(user).ConfigureAwait(false);
}
break;
default:
break;
}
return p.Punishment;
}
return null;
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public async Task Warn(IGuildUser user, [Remainder] string reason = null)
{
try
{
await (await user.CreateDMChannelAsync()).EmbedAsync(new EmbedBuilder().WithErrorColor()
.WithDescription(GetText("warned_on", Context.Guild.ToString()))
.AddField(efb => efb.WithName(GetText("moderator")).WithValue(Context.User.ToString()))
.AddField(efb => efb.WithName(GetText("reason")).WithValue(reason ?? "-")))
.ConfigureAwait(false);
}
catch { }
var punishment = await InternalWarn(Context.Guild, user.Id, Context.User.ToString(), reason).ConfigureAwait(false);
if (punishment == null)
{
await ReplyConfirmLocalized("user_warned", Format.Bold(user.ToString())).ConfigureAwait(false);
}
else
{
await ReplyConfirmLocalized("user_warned_and_punished", Format.Bold(user.ToString()), Format.Bold(punishment.ToString())).ConfigureAwait(false);
}
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public Task Warnlog(int page, IGuildUser user)
=> Warnlog(page, user.Id);
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public Task Warnlog(IGuildUser user)
=> Warnlog(user.Id);
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public Task Warnlog(int page, ulong userId)
=> InternalWarnlog(userId, page - 1);
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public Task Warnlog(ulong userId)
=> InternalWarnlog(userId, 0);
private async Task InternalWarnlog(ulong userId, int page)
{
if (page < 0)
return;
Warning[] warnings;
using (var uow = DbHandler.UnitOfWork())
{
warnings = uow.Warnings.For(Context.Guild.Id, userId);
}
warnings = warnings.Skip(page * 9)
.Take(9)
.ToArray();
var embed = new EmbedBuilder().WithOkColor()
.WithTitle(GetText("warnlog_for", (Context.Guild as SocketGuild)?.GetUser(userId)?.ToString() ?? userId.ToString()))
.WithFooter(efb => efb.WithText(GetText("page", page + 1)));
if (!warnings.Any())
{
embed.WithDescription(GetText("warnings_none"));
}
else
{
foreach (var w in warnings)
{
var name = GetText("warned_on_by", w.DateAdded.Value.ToString("dd.MM.yyy"), w.DateAdded.Value.ToString("HH:mm"), w.Moderator);
if (w.Forgiven)
name = Format.Strikethrough(name) + " " + GetText("warn_cleared_by", w.ForgivenBy);
embed.AddField(x => x
.WithName(name)
.WithValue(w.Reason));
}
}
await Context.Channel.EmbedAsync(embed);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public Task Warnclear(IGuildUser user)
=> Warnclear(user.Id);
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public async Task Warnclear(ulong userId)
{
using (var uow = DbHandler.UnitOfWork())
{
await uow.Warnings.ForgiveAll(Context.Guild.Id, userId, Context.User.ToString()).ConfigureAwait(false);
uow.Complete();
}
await ReplyConfirmLocalized("warnings_cleared",
Format.Bold((Context.Guild as SocketGuild)?.GetUser(userId)?.ToString() ?? userId.ToString())).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public async Task WarnPunish(int number, PunishmentAction punish, int time = 0)
{
if (punish != PunishmentAction.Mute && time != 0)
return;
if (number <= 0)
return;
using (var uow = DbHandler.UnitOfWork())
{
var ps = uow.GuildConfigs.For(Context.Guild.Id).WarnPunishments;
var p = ps.FirstOrDefault(x => x.Count == number);
if (p == null)
{
ps.Add(new WarningPunishment()
{
Count = number,
Punishment = punish,
Time = time,
});
}
else
{
p.Count = number;
p.Punishment = punish;
p.Time = time;
uow._context.Update(p);
}
uow.Complete();
}
await ReplyConfirmLocalized("warn_punish_set",
Format.Bold(punish.ToString()),
Format.Bold(number.ToString())).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
public async Task WarnPunish(int number)
{
if (number <= 0)
return;
using (var uow = DbHandler.UnitOfWork())
{
var ps = uow.GuildConfigs.For(Context.Guild.Id, set => set.Include(x => x.WarnPunishments)).WarnPunishments;
var p = ps.FirstOrDefault(x => x.Count == number);
if (p != null)
{
uow._context.Remove(p);
uow.Complete();
}
}
await ReplyConfirmLocalized("warn_punish_rem",
Format.Bold(number.ToString())).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task WarnPunishList()
{
WarningPunishment[] ps;
using (var uow = DbHandler.UnitOfWork())
{
ps = uow.GuildConfigs.For(Context.Guild.Id, gc => gc.Include(x => x.WarnPunishments))
.WarnPunishments
.OrderBy(x => x.Count)
.ToArray();
}
string list;
if (ps.Any())
{
list = string.Join("\n", ps.Select(x => $"{x.Count} -> {x.Punishment}"));
}
else
{
list = GetText("warnpl_none");
}
await Context.Channel.SendConfirmAsync(
GetText("warn_punish_list"),
list).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
[RequireBotPermission(GuildPermission.BanMembers)]
public async Task Ban(IGuildUser user, [Remainder] string msg = null)
{
if (Context.User.Id != user.Guild.OwnerId && (user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max()))
{
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
return;
}
if (!string.IsNullOrWhiteSpace(msg))
{
try
{
await user.SendErrorAsync(GetText("bandm", Format.Bold(Context.Guild.Name), msg));
}
catch
{
// ignored
}
}
await Context.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle("⛔️ " + GetText("banned_user"))
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
.ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
[RequireBotPermission(GuildPermission.BanMembers)]
public async Task Unban([Remainder]string user)
{
var bans = await Context.Guild.GetBansAsync();
var bun = bans.FirstOrDefault(x => x.User.ToString().ToLowerInvariant() == user.ToLowerInvariant());
if (bun == null)
{
await ReplyErrorLocalized("user_not_found").ConfigureAwait(false);
return;
}
await UnbanInternal(bun.User).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.BanMembers)]
[RequireBotPermission(GuildPermission.BanMembers)]
public async Task Unban(ulong userId)
{
var bans = await Context.Guild.GetBansAsync();
var bun = bans.FirstOrDefault(x => x.User.Id == userId);
if (bun == null)
{
await ReplyErrorLocalized("user_not_found").ConfigureAwait(false);
return;
}
await UnbanInternal(bun.User).ConfigureAwait(false);
}
private async Task UnbanInternal(IUser user)
{
await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false);
await ReplyConfirmLocalized("unbanned_user", Format.Bold(user.ToString())).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.KickMembers)]
[RequireUserPermission(GuildPermission.ManageMessages)]
[RequireBotPermission(GuildPermission.BanMembers)]
public async Task Softban(IGuildUser user, [Remainder] string msg = null)
{
if (Context.User.Id != user.Guild.OwnerId && user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max())
{
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
return;
}
if (!string.IsNullOrWhiteSpace(msg))
{
try
{
await user.SendErrorAsync(GetText("sbdm", Format.Bold(Context.Guild.Name), msg));
}
catch
{
// ignored
}
}
await Context.Guild.AddBanAsync(user, 7).ConfigureAwait(false);
try { await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false); }
catch { await Context.Guild.RemoveBanAsync(user).ConfigureAwait(false); }
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle("☣ " + GetText("sb_user"))
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
.ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.KickMembers)]
[RequireBotPermission(GuildPermission.KickMembers)]
public async Task Kick(IGuildUser user, [Remainder] string msg = null)
{
if (Context.Message.Author.Id != user.Guild.OwnerId && user.GetRoles().Select(r => r.Position).Max() >= ((IGuildUser)Context.User).GetRoles().Select(r => r.Position).Max())
{
await ReplyErrorLocalized("hierarchy").ConfigureAwait(false);
return;
}
if (!string.IsNullOrWhiteSpace(msg))
{
try
{
await user.SendErrorAsync(GetText("kickdm", Format.Bold(Context.Guild.Name), msg));
}
catch { }
}
await user.KickAsync().ConfigureAwait(false);
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle(GetText("kicked_user"))
.AddField(efb => efb.WithName(GetText("username")).WithValue(user.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName("ID").WithValue(user.Id.ToString()).WithIsInline(true)))
.ConfigureAwait(false);
}
}
}
}

View File

@ -28,7 +28,7 @@ namespace NadekoBot.Modules.CustomReactions
{ {
return await channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? ""); return await channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? "");
} }
return await channel.SendMessageAsync(cr.ResponseWithContext(context)); return await channel.SendMessageAsync(cr.ResponseWithContext(context).SanitizeMentions());
} }
} }
@ -59,7 +59,7 @@ namespace NadekoBot.Modules.CustomReactions
public void ClearStats() => ReactionStats.Clear(); public void ClearStats() => ReactionStats.Clear();
public static CustomReaction TryGetCustomReaction(SocketUserMessage umsg) public static CustomReaction TryGetCustomReaction(IUserMessage umsg)
{ {
var channel = umsg.Channel as SocketTextChannel; var channel = umsg.Channel as SocketTextChannel;
if (channel == null) if (channel == null)

View File

@ -15,7 +15,7 @@ namespace NadekoBot.Modules.CustomReactions
{ {
public static Dictionary<string, Func<IUserMessage, string, string>> responsePlaceholders = new Dictionary<string, Func<IUserMessage, string, string>>() public static Dictionary<string, Func<IUserMessage, string, string>> responsePlaceholders = new Dictionary<string, Func<IUserMessage, string, string>>()
{ {
{"%target%", (ctx, trigger) => { return ctx.Content.Substring(trigger.Length).Trim(); } } {"%target%", (ctx, trigger) => { return ctx.Content.Substring(trigger.Length).Trim().SanitizeMentions(); } }
}; };
public static Dictionary<string, Func<IUserMessage, string>> placeholders = new Dictionary<string, Func<IUserMessage, string>>() public static Dictionary<string, Func<IUserMessage, string>> placeholders = new Dictionary<string, Func<IUserMessage, string>>()

View File

@ -0,0 +1,349 @@
using Discord;
using Discord.Commands;
using Microsoft.EntityFrameworkCore;
using NadekoBot.Attributes;
using NadekoBot.DataStructures;
using NadekoBot.Extensions;
using NadekoBot.Services;
using NadekoBot.Services.Database;
using NadekoBot.Services.Database.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace NadekoBot.Modules.Gambling
{
public partial class Gambling
{
[Group]
public class FlowerShop : NadekoSubmodule
{
public enum Role
{
Role
}
public enum List
{
List
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Shop(int page = 1)
{
if (page <= 0)
return;
page -= 1;
List<ShopEntry> entries;
using (var uow = DbHandler.UnitOfWork())
{
entries = new IndexedCollection<ShopEntry>(uow.GuildConfigs.For(Context.Guild.Id,
set => set.Include(x => x.ShopEntries)
.ThenInclude(x => x.Items)).ShopEntries);
}
await Context.Channel.SendPaginatedConfirmAsync(page + 1, (curPage) =>
{
var theseEntries = entries.Skip((curPage - 1) * 9).Take(9);
if (!theseEntries.Any())
return new EmbedBuilder().WithErrorColor()
.WithDescription(GetText("shop_none"));
var embed = new EmbedBuilder().WithOkColor()
.WithTitle(GetText("shop", CurrencySign));
for (int i = 0; i < entries.Count; i++)
{
var entry = entries[i];
embed.AddField(efb => efb.WithName($"#{i + 1} - {entry.Price}{CurrencySign}").WithValue(EntryToString(entry)).WithIsInline(true));
}
return embed;
}, entries.Count / 9, true);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Buy(int index, [Remainder]string message = null)
{
index -= 1;
if (index < 0)
return;
ShopEntry entry;
using (var uow = DbHandler.UnitOfWork())
{
var config = uow.GuildConfigs.For(Context.Guild.Id, set => set
.Include(x => x.ShopEntries)
.ThenInclude(x => x.Items));
var entries = new IndexedCollection<ShopEntry>(config.ShopEntries);
entry = entries.ElementAtOrDefault(index);
uow.Complete();
}
if (entry == null)
{
await ReplyErrorLocalized("shop_item_not_found").ConfigureAwait(false);
return;
}
if (entry.Type == ShopEntryType.Role)
{
var guser = (IGuildUser)Context.User;
var role = Context.Guild.GetRole(entry.RoleId);
if (role == null)
{
await ReplyErrorLocalized("shop_role_not_found").ConfigureAwait(false);
return;
}
if (await CurrencyHandler.RemoveCurrencyAsync(Context.User.Id, $"Shop purchase - {entry.Type}", entry.Price))
{
try
{
await guser.AddRolesAsync(role).ConfigureAwait(false);
}
catch (Exception ex)
{
_log.Warn(ex);
await CurrencyHandler.AddCurrencyAsync(Context.User.Id, $"Shop error refund", entry.Price);
await ReplyErrorLocalized("shop_role_purchase_error").ConfigureAwait(false);
return;
}
await CurrencyHandler.AddCurrencyAsync(entry.AuthorId, $"Shop sell item - {entry.Type}", GetProfitAmount(entry.Price));
await ReplyConfirmLocalized("shop_role_purchase", Format.Bold(role.Name)).ConfigureAwait(false);
return;
}
else
{
await ReplyErrorLocalized("not_enough", CurrencySign).ConfigureAwait(false);
return;
}
}
else if (entry.Type == ShopEntryType.List)
{
if (entry.Items.Count == 0)
{
await ReplyErrorLocalized("out_of_stock").ConfigureAwait(false);
return;
}
var item = entry.Items.ToArray()[new NadekoRandom().Next(0, entry.Items.Count)];
if (await CurrencyHandler.RemoveCurrencyAsync(Context.User.Id, $"Shop purchase - {entry.Type}", entry.Price))
{
int removed;
using (var uow = DbHandler.UnitOfWork())
{
var x = uow._context.Set<ShopEntryItem>().Remove(item);
removed = uow.Complete();
}
try
{
await (await Context.User.CreateDMChannelAsync())
.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithTitle(GetText("shop_purchase", Context.Guild.Name))
.AddField(efb => efb.WithName(GetText("item")).WithValue(item.Text).WithIsInline(false))
.AddField(efb => efb.WithName(GetText("price")).WithValue(entry.Price.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName(GetText("name")).WithValue(entry.Name).WithIsInline(true)))
.ConfigureAwait(false);
await CurrencyHandler.AddCurrencyAsync(entry.AuthorId,
$"Shop sell item - {entry.Name}",
GetProfitAmount(entry.Price)).ConfigureAwait(false);
}
catch
{
using (var uow = DbHandler.UnitOfWork())
{
uow._context.Set<ShopEntryItem>().Add(item);
uow.Complete();
await CurrencyHandler.AddCurrencyAsync(Context.User.Id,
$"Shop error refund - {entry.Name}",
entry.Price,
uow).ConfigureAwait(false);
}
await ReplyErrorLocalized("shop_buy_error").ConfigureAwait(false);
return;
}
await ReplyConfirmLocalized("shop_item_purchase").ConfigureAwait(false);
}
else
{
await ReplyErrorLocalized("not_enough", CurrencySign).ConfigureAwait(false);
return;
}
}
}
private long GetProfitAmount(int price) =>
(int)(Math.Ceiling(0.90 * price));
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.Administrator)]
[RequireBotPermission(GuildPermission.ManageRoles)]
public async Task ShopAdd(Role _, int price, [Remainder] IRole role)
{
var entry = new ShopEntry()
{
Name = "-",
Price = price,
Type = ShopEntryType.Role,
AuthorId = Context.User.Id,
RoleId = role.Id,
RoleName = role.Name
};
using (var uow = DbHandler.UnitOfWork())
{
var entries = new IndexedCollection<ShopEntry>(uow.GuildConfigs.For(Context.Guild.Id,
set => set.Include(x => x.ShopEntries)
.ThenInclude(x => x.Items)).ShopEntries);
entries.Add(entry);
uow.GuildConfigs.For(Context.Guild.Id, set => set).ShopEntries = entries;
uow.Complete();
}
await Context.Channel.EmbedAsync(EntryToEmbed(entry)
.WithTitle(GetText("shop_item_add")));
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.Administrator)]
public async Task ShopAdd(List _, int price, [Remainder]string name)
{
var entry = new ShopEntry()
{
Name = name.TrimTo(100),
Price = price,
Type = ShopEntryType.List,
AuthorId = Context.User.Id,
Items = new HashSet<ShopEntryItem>(),
};
using (var uow = DbHandler.UnitOfWork())
{
var entries = new IndexedCollection<ShopEntry>(uow.GuildConfigs.For(Context.Guild.Id,
set => set.Include(x => x.ShopEntries)
.ThenInclude(x => x.Items)).ShopEntries);
entries.Add(entry);
uow.GuildConfigs.For(Context.Guild.Id, set => set).ShopEntries = entries;
uow.Complete();
}
await Context.Channel.EmbedAsync(EntryToEmbed(entry)
.WithTitle(GetText("shop_item_add")));
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.Administrator)]
public async Task ShopListAdd(int index, [Remainder] string itemText)
{
index -= 1;
if (index < 0)
return;
var item = new ShopEntryItem()
{
Text = itemText
};
ShopEntry entry;
bool rightType = false;
bool added = false;
using (var uow = DbHandler.UnitOfWork())
{
var entries = new IndexedCollection<ShopEntry>(uow.GuildConfigs.For(Context.Guild.Id,
set => set.Include(x => x.ShopEntries)
.ThenInclude(x => x.Items)).ShopEntries);
entry = entries.ElementAtOrDefault(index);
if (entry != null && (rightType = (entry.Type == ShopEntryType.List)))
{
if (added = entry.Items.Add(item))
{
uow.Complete();
}
}
}
if (entry == null)
await ReplyErrorLocalized("shop_item_not_found").ConfigureAwait(false);
else if (!rightType)
await ReplyErrorLocalized("shop_item_wrong_type").ConfigureAwait(false);
else if (added == false)
await ReplyErrorLocalized("shop_list_item_not_unique").ConfigureAwait(false);
else
await ReplyConfirmLocalized("shop_list_item_added").ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.Administrator)]
public async Task ShopRemove(int index)
{
index -= 1;
if (index < 0)
return;
ShopEntry removed;
using (var uow = DbHandler.UnitOfWork())
{
var config = uow.GuildConfigs.For(Context.Guild.Id, set => set
.Include(x => x.ShopEntries)
.ThenInclude(x => x.Items));
var entries = new IndexedCollection<ShopEntry>(config.ShopEntries);
removed = entries.ElementAtOrDefault(index);
if (removed != null)
{
entries.Remove(removed);
config.ShopEntries = entries;
uow.Complete();
}
}
if (removed == null)
await ReplyErrorLocalized("shop_item_not_found").ConfigureAwait(false);
else
await Context.Channel.EmbedAsync(EntryToEmbed(removed)
.WithTitle(GetText("shop_item_rm")));
}
public EmbedBuilder EntryToEmbed(ShopEntry entry)
{
var embed = new EmbedBuilder().WithOkColor();
if (entry.Type == ShopEntryType.Role)
return embed.AddField(efb => efb.WithName(GetText("name")).WithValue(GetText("shop_role", Format.Bold(entry.RoleName))).WithIsInline(true))
.AddField(efb => efb.WithName(GetText("price")).WithValue(entry.Price.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName(GetText("type")).WithValue(entry.Type.ToString()).WithIsInline(true));
else if (entry.Type == ShopEntryType.List)
return embed.AddField(efb => efb.WithName(GetText("name")).WithValue(entry.Name).WithIsInline(true))
.AddField(efb => efb.WithName(GetText("price")).WithValue(entry.Price.ToString()).WithIsInline(true))
.AddField(efb => efb.WithName(GetText("type")).WithValue(GetText("random_unique_item")).WithIsInline(true));
//else if (entry.Type == ShopEntryType.Infinite_List)
// return embed.AddField(efb => efb.WithName(GetText("name")).WithValue(GetText("shop_role", Format.Bold(entry.RoleName))).WithIsInline(true))
// .AddField(efb => efb.WithName(GetText("price")).WithValue(entry.Price.ToString()).WithIsInline(true))
// .AddField(efb => efb.WithName(GetText("type")).WithValue(entry.Type.ToString()).WithIsInline(true));
else return null;
}
public string EntryToString(ShopEntry entry)
{
if (entry.Type == ShopEntryType.Role)
{
return GetText("shop_role", Format.Bold(entry.RoleName));
}
else if (entry.Type == ShopEntryType.List)
{
return GetText("unique_items_left", entry.Items.Count) + "\n" + entry.Name;
}
//else if (entry.Type == ShopEntryType.Infinite_List)
//{
//}
return "";
}
}
}
}

View File

@ -246,6 +246,9 @@ namespace NadekoBot.Modules.Gambling
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
public async Task Leaderboard(int page = 1) public async Task Leaderboard(int page = 1)
{ {
if (page < 1)
return;
List<Currency> richest; List<Currency> richest;
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
{ {

View File

@ -1,11 +1,9 @@
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using Discord.WebSocket;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Extensions; using NadekoBot.Extensions;
using NadekoBot.Services; using NadekoBot.Services;
using NLog; using NLog;
//using Services.CleverBotApi;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Diagnostics; using System.Diagnostics;
@ -13,7 +11,6 @@ using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using Services.CleverBotApi;
namespace NadekoBot.Modules.Games namespace NadekoBot.Modules.Games
{ {
@ -40,16 +37,19 @@ namespace NadekoBot.Modules.Games
_log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s"); _log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s");
} }
public static async Task<bool> TryAsk(SocketUserMessage msg) public static string PrepareMessage(IUserMessage msg, out ChatterBotSession cleverbot)
{ {
var channel = msg.Channel as ITextChannel; var channel = msg.Channel as ITextChannel;
cleverbot = null;
if (channel == null) if (channel == null)
return false; return null;
Lazy<ChatterBotSession> cleverbot; Lazy<ChatterBotSession> lazyCleverbot;
if (!CleverbotGuilds.TryGetValue(channel.Guild.Id, out cleverbot)) if (!CleverbotGuilds.TryGetValue(channel.Guild.Id, out lazyCleverbot))
return false; return null;
cleverbot = lazyCleverbot.Value;
var nadekoId = NadekoBot.Client.CurrentUser.Id; var nadekoId = NadekoBot.Client.CurrentUser.Id;
var normalMention = $"<@{nadekoId}> "; var normalMention = $"<@{nadekoId}> ";
@ -65,19 +65,24 @@ namespace NadekoBot.Modules.Games
} }
else else
{ {
return false; return null;
} }
await msg.Channel.TriggerTypingAsync().ConfigureAwait(false); return message;
}
var response = await cleverbot.Value.Think(message).ConfigureAwait(false); public static async Task<bool> TryAsk(ChatterBotSession cleverbot, ITextChannel channel, string message)
{
await channel.TriggerTypingAsync().ConfigureAwait(false);
var response = await cleverbot.Think(message).ConfigureAwait(false);
try try
{ {
await msg.Channel.SendConfirmAsync(response.SanitizeMentions()).ConfigureAwait(false); await channel.SendConfirmAsync(response.SanitizeMentions()).ConfigureAwait(false);
} }
catch catch
{ {
await msg.Channel.SendConfirmAsync(response.SanitizeMentions()).ConfigureAwait(false); // try twice :\ await channel.SendConfirmAsync(response.SanitizeMentions()).ConfigureAwait(false); // try twice :\
} }
return true; return true;
} }

View File

@ -15,7 +15,7 @@ namespace NadekoBot.Modules.Games.Hangman
{ {
public class HangmanTermPool public class HangmanTermPool
{ {
const string termsPath = "data/hangman.json"; const string termsPath = "data/hangman2.json";
public static IReadOnlyDictionary<string, HangmanObject[]> data { get; } public static IReadOnlyDictionary<string, HangmanObject[]> data { get; }
static HangmanTermPool() static HangmanTermPool()
{ {

View File

@ -181,7 +181,7 @@ namespace NadekoBot.Modules.Games
return old; return old;
}); });
} }
#if !GLOBAL_NADEKO
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageMessages)] [RequireUserPermission(GuildPermission.ManageMessages)]
@ -218,6 +218,7 @@ namespace NadekoBot.Modules.Games
await ReplyConfirmLocalized("curgen_disabled").ConfigureAwait(false); await ReplyConfirmLocalized("curgen_disabled").ConfigureAwait(false);
} }
} }
#endif
private static KeyValuePair<string, ImmutableArray<byte>> GetRandomCurrencyImage() private static KeyValuePair<string, ImmutableArray<byte>> GetRandomCurrencyImage()
{ {

View File

@ -31,6 +31,7 @@ namespace NadekoBot.Modules.Help
.WithTitle(GetText("list_of_modules")) .WithTitle(GetText("list_of_modules"))
.WithDescription(string.Join("\n", .WithDescription(string.Join("\n",
NadekoBot.CommandService.Modules.GroupBy(m => m.GetTopLevelModule()) NadekoBot.CommandService.Modules.GroupBy(m => m.GetTopLevelModule())
.Where(m => !Permissions.Permissions.GlobalPermissionCommands.BlockedModules.Contains(m.Key.Name.ToLowerInvariant()))
.Select(m => "• " + m.Key.Name) .Select(m => "• " + m.Key.Name)
.OrderBy(s => s))); .OrderBy(s => s)));
await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); await Context.Channel.EmbedAsync(embed).ConfigureAwait(false);
@ -45,6 +46,7 @@ namespace NadekoBot.Modules.Help
if (string.IsNullOrWhiteSpace(module)) if (string.IsNullOrWhiteSpace(module))
return; return;
var cmds = NadekoBot.CommandService.Commands.Where(c => c.Module.GetTopLevelModule().Name.ToUpperInvariant().StartsWith(module)) var cmds = NadekoBot.CommandService.Commands.Where(c => c.Module.GetTopLevelModule().Name.ToUpperInvariant().StartsWith(module))
.Where(c => !Permissions.Permissions.GlobalPermissionCommands.BlockedCommands.Contains(c.Aliases.First().ToLowerInvariant()))
.OrderBy(c => c.Aliases.First()) .OrderBy(c => c.Aliases.First())
.Distinct(new CommandTextEqualityComparer()) .Distinct(new CommandTextEqualityComparer())
.AsEnumerable(); .AsEnumerable();
@ -55,8 +57,14 @@ namespace NadekoBot.Modules.Help
await ReplyErrorLocalized("module_not_found").ConfigureAwait(false); await ReplyErrorLocalized("module_not_found").ConfigureAwait(false);
return; return;
} }
var j = 0;
var groups = cmdsArray.GroupBy(x => j++ / 48).ToArray();
for (int i = 0; i < groups.Count(); i++)
{
await channel.SendTableAsync(i == 0 ? $"📃 **{GetText("list_of_commands")}**\n" : "", groups.ElementAt(i), el => $"{el.Aliases.First(),-15} {"[" + el.Aliases.Skip(1).FirstOrDefault() + "]",-8}").ConfigureAwait(false);
}
await channel.SendTableAsync($"📃 **{GetText("list_of_commands")}**\n", cmdsArray, el => $"{el.Aliases.First(),-15} {"["+el.Aliases.Skip(1).FirstOrDefault()+"]",-8}").ConfigureAwait(false);
await ConfirmLocalized("commands_instr", Prefix).ConfigureAwait(false); await ConfirmLocalized("commands_instr", Prefix).ConfigureAwait(false);
} }

View File

@ -69,7 +69,7 @@ namespace NadekoBot.Modules
LogManager.GetCurrentClassLogger().Warn(lowerModuleTypeName + "_" + key + " key is missing from " + cultureInfo + " response strings. PLEASE REPORT THIS."); LogManager.GetCurrentClassLogger().Warn(lowerModuleTypeName + "_" + key + " key is missing from " + cultureInfo + " response strings. PLEASE REPORT THIS.");
text = NadekoBot.ResponsesResourceManager.GetString(lowerModuleTypeName + "_" + key, _usCultureInfo) ?? $"Error: dkey {lowerModuleTypeName + "_" + key} not found!"; text = NadekoBot.ResponsesResourceManager.GetString(lowerModuleTypeName + "_" + key, _usCultureInfo) ?? $"Error: dkey {lowerModuleTypeName + "_" + key} not found!";
if (string.IsNullOrWhiteSpace(text)) if (string.IsNullOrWhiteSpace(text))
return "I can't tell you is the command executed, because there was an error printing out the response. Key '" + return "I can't tell you if the command is executed, because there was an error printing out the response. Key '" +
lowerModuleTypeName + "_" + key + "' " + "is missing from resources. Please report this."; lowerModuleTypeName + "_" + key + "' " + "is missing from resources. Please report this.";
} }
return text; return text;
@ -84,7 +84,7 @@ namespace NadekoBot.Modules
} }
catch (FormatException) catch (FormatException)
{ {
return "I cant tell if you command is executed, because there was an error printing out the response. Key '" + return "I can't tell you if the command is executed, because there was an error printing out the response. Key '" +
lowerModuleTypeName + "_" + key + "' " + "is not properly formatted. Please report this."; lowerModuleTypeName + "_" + key + "' " + "is not properly formatted. Please report this.";
} }
} }

View File

@ -0,0 +1,118 @@
using Discord;
using Discord.Commands;
using NadekoBot.Attributes;
using NadekoBot.DataStructures;
using NadekoBot.Extensions;
using NadekoBot.Services;
using NadekoBot.Services.Database;
using NadekoBot.TypeReaders;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NadekoBot.Modules.Permissions
{
public partial class Permissions
{
[Group]
public class GlobalPermissionCommands : NadekoSubmodule
{
public static readonly ConcurrentHashSet<string> BlockedModules;
public static readonly ConcurrentHashSet<string> BlockedCommands;
static GlobalPermissionCommands()
{
BlockedModules = new ConcurrentHashSet<string>(NadekoBot.BotConfig.BlockedModules.Select(x => x.Name));
BlockedCommands = new ConcurrentHashSet<string>(NadekoBot.BotConfig.BlockedCommands.Select(x => x.Name));
}
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
public async Task Lgp()
{
if (!BlockedModules.Any() && !BlockedCommands.Any())
{
await ReplyErrorLocalized("lgp_none").ConfigureAwait(false);
return;
}
var embed = new EmbedBuilder().WithOkColor();
if (BlockedModules.Any())
embed.AddField(efb => efb.WithName(GetText("blocked_modules")).WithValue(string.Join("\n", BlockedModules)).WithIsInline(false));
if (BlockedCommands.Any())
embed.AddField(efb => efb.WithName(GetText("blocked_commands")).WithValue(string.Join("\n", BlockedCommands)).WithIsInline(false));
await Context.Channel.EmbedAsync(embed).ConfigureAwait(false);
}
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
public async Task Gmod(ModuleOrCrInfo module)
{
var moduleName = module.Name.ToLowerInvariant();
if (BlockedModules.Add(moduleName))
{
using (var uow = DbHandler.UnitOfWork())
{
var bc = uow.BotConfig.GetOrCreate();
bc.BlockedModules.Add(new Services.Database.Models.BlockedCmdOrMdl
{
Name = moduleName,
});
uow.Complete();
}
await ReplyConfirmLocalized("gmod_add", Format.Bold(module.Name)).ConfigureAwait(false);
return;
}
else if (BlockedModules.TryRemove(moduleName))
{
using (var uow = DbHandler.UnitOfWork())
{
var bc = uow.BotConfig.GetOrCreate();
bc.BlockedModules.RemoveWhere(x => x.Name == moduleName);
uow.Complete();
}
await ReplyConfirmLocalized("gmod_remove", Format.Bold(module.Name)).ConfigureAwait(false);
return;
}
}
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
public async Task Gcmd(CommandOrCrInfo cmd)
{
var commandName = cmd.Name.ToLowerInvariant();
if (BlockedCommands.Add(commandName))
{
using (var uow = DbHandler.UnitOfWork())
{
var bc = uow.BotConfig.GetOrCreate();
bc.BlockedCommands.Add(new Services.Database.Models.BlockedCmdOrMdl
{
Name = commandName,
});
uow.Complete();
}
await ReplyConfirmLocalized("gcmd_add", Format.Bold(cmd.Name)).ConfigureAwait(false);
return;
}
else if (BlockedCommands.TryRemove(commandName))
{
using (var uow = DbHandler.UnitOfWork())
{
var bc = uow.BotConfig.GetOrCreate();
bc.BlockedCommands.RemoveWhere(x => x.Name == commandName);
uow.Complete();
}
await ReplyConfirmLocalized("gcmd_remove", Format.Bold(cmd.Name)).ConfigureAwait(false);
return;
}
}
}
}
}

View File

@ -106,7 +106,7 @@ namespace NadekoBot.Modules.Permissions
switch (perm.PrimaryTarget) switch (perm.PrimaryTarget)
{ {
case PrimaryPermissionType.User: case PrimaryPermissionType.User:
com += guild?.GetUser(perm.PrimaryTargetId).ToString() ?? $"<@{perm.PrimaryTargetId}>"; com += guild?.GetUser(perm.PrimaryTargetId)?.ToString() ?? $"<@{perm.PrimaryTargetId}>";
break; break;
case PrimaryPermissionType.Channel: case PrimaryPermissionType.Channel:
com += $"<#{perm.PrimaryTargetId}>"; com += $"<#{perm.PrimaryTargetId}>";

View File

@ -62,6 +62,24 @@ namespace NadekoBot.Modules.Permissions
log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s"); log.Debug($"Loaded in {sw.Elapsed.TotalSeconds:F2}s");
} }
public static PermissionCache GetCache(ulong guildId)
{
PermissionCache pc;
if (!Permissions.Cache.TryGetValue(guildId, out pc))
{
using (var uow = DbHandler.UnitOfWork())
{
var config = uow.GuildConfigs.For(guildId,
set => set.Include(x => x.Permissions));
Permissions.UpdateCache(config);
}
Permissions.Cache.TryGetValue(guildId, out pc);
if (pc == null)
throw new Exception("Cache is null.");
}
return pc;
}
private static void TryMigratePermissions() private static void TryMigratePermissions()
{ {
var log = LogManager.GetCurrentClassLogger(); var log = LogManager.GetCurrentClassLogger();
@ -345,7 +363,7 @@ namespace NadekoBot.Modules.Permissions
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task SrvrMdl(ModuleInfo module, PermissionAction action) public async Task SrvrMdl(ModuleOrCrInfo module, PermissionAction action)
{ {
await AddPermissions(Context.Guild.Id, new Permissionv2 await AddPermissions(Context.Guild.Id, new Permissionv2
{ {
@ -401,7 +419,7 @@ namespace NadekoBot.Modules.Permissions
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task UsrMdl(ModuleInfo module, PermissionAction action, [Remainder] IGuildUser user) public async Task UsrMdl(ModuleOrCrInfo module, PermissionAction action, [Remainder] IGuildUser user)
{ {
await AddPermissions(Context.Guild.Id, new Permissionv2 await AddPermissions(Context.Guild.Id, new Permissionv2
{ {
@ -462,7 +480,7 @@ namespace NadekoBot.Modules.Permissions
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task RoleMdl(ModuleInfo module, PermissionAction action, [Remainder] IRole role) public async Task RoleMdl(ModuleOrCrInfo module, PermissionAction action, [Remainder] IRole role)
{ {
if (role == role.Guild.EveryoneRole) if (role == role.Guild.EveryoneRole)
return; return;
@ -524,7 +542,7 @@ namespace NadekoBot.Modules.Permissions
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task ChnlMdl(ModuleInfo module, PermissionAction action, [Remainder] ITextChannel chnl) public async Task ChnlMdl(ModuleOrCrInfo module, PermissionAction action, [Remainder] ITextChannel chnl)
{ {
await AddPermissions(Context.Guild.Id, new Permissionv2 await AddPermissions(Context.Guild.Id, new Permissionv2
{ {

View File

@ -0,0 +1,42 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NadekoBot.Modules.Searches.Commands.Models
{
public class TimeZoneResult
{
public double DstOffset { get; set; }
public double RawOffset { get; set; }
//public string TimeZoneId { get; set; }
public string TimeZoneName { get; set; }
}
public class GeolocationResult
{
public class GeolocationModel
{
public class GeometryModel
{
public class LocationModel
{
public float Lat { get; set; }
public float Lng { get; set; }
}
public LocationModel Location { get; set; }
}
[JsonProperty("formatted_address")]
public string FormattedAddress { get; set; }
public GeometryModel Geometry { get; set; }
}
public GeolocationModel[] results;
}
}

View File

@ -56,6 +56,27 @@ namespace NadekoBot.Modules.Searches
await Context.Channel.EmbedAsync(embed).ConfigureAwait(false); await Context.Channel.EmbedAsync(embed).ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases]
public async Task Time([Remainder] string arg)
{
if (string.IsNullOrWhiteSpace(arg) || string.IsNullOrWhiteSpace(NadekoBot.Credentials.GoogleApiKey))
return;
using (var http = new HttpClient())
{
var res = await http.GetStringAsync($"https://maps.googleapis.com/maps/api/geocode/json?address={arg}&key={NadekoBot.Credentials.GoogleApiKey}").ConfigureAwait(false);
var obj = JsonConvert.DeserializeObject<GeolocationResult>(res);
var currentSeconds = DateTime.UtcNow.UnixTimestamp();
var timeRes = await http.GetStringAsync($"https://maps.googleapis.com/maps/api/timezone/json?location={obj.results[0].Geometry.Location.Lat},{obj.results[0].Geometry.Location.Lng}&timestamp={currentSeconds}&key={NadekoBot.Credentials.GoogleApiKey}").ConfigureAwait(false);
var timeObj = JsonConvert.DeserializeObject<TimeZoneResult>(timeRes);
var time = DateTime.UtcNow.AddSeconds(timeObj.DstOffset + timeObj.RawOffset);
await ReplyConfirmLocalized("time", Format.Bold(obj.results[0].FormattedAddress), Format.Code(time.ToString("HH:mm")), timeObj.TimeZoneName).ConfigureAwait(false);
}
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
public async Task Youtube([Remainder] string query = null) public async Task Youtube([Remainder] string query = null)
{ {
@ -564,7 +585,7 @@ namespace NadekoBot.Modules.Searches
{ {
if (usr == null) if (usr == null)
usr = Context.User; usr = Context.User;
await Context.Channel.SendConfirmAsync($"https://images.google.com/searchbyimage?image_url={usr.AvatarUrl}").ConfigureAwait(false); await Context.Channel.SendConfirmAsync($"https://images.google.com/searchbyimage?image_url={usr.RealAvatarUrl()}").ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]

View File

@ -16,7 +16,6 @@ namespace NadekoBot.Modules.Utility
{ {
public partial class Utility public partial class Utility
{ {
public class CommandAliasEqualityComparer : IEqualityComparer<CommandAlias> public class CommandAliasEqualityComparer : IEqualityComparer<CommandAlias>
{ {
public bool Equals(CommandAlias x, CommandAlias y) => x.Trigger == y.Trigger; public bool Equals(CommandAlias x, CommandAlias y) => x.Trigger == y.Trigger;
@ -41,6 +40,11 @@ namespace NadekoBot.Modules.Utility
.ToDictionary(ca => ca.Trigger, ca => ca.Mapping)))); .ToDictionary(ca => ca.Trigger, ca => ca.Mapping))));
} }
public static void Unload()
{
AliasMaps.Clear();
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireUserPermission(GuildPermission.Administrator)] [RequireUserPermission(GuildPermission.Administrator)]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]

View File

@ -3,6 +3,7 @@ using Discord.Commands;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Extensions; using NadekoBot.Extensions;
using NadekoBot.Services; using NadekoBot.Services;
using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -16,7 +17,15 @@ namespace NadekoBot.Modules.Utility
{ {
static CrossServerTextChannel() static CrossServerTextChannel()
{ {
NadekoBot.Client.MessageReceived += async imsg => NadekoBot.Client.MessageReceived += Client_MessageReceived;
}
public static void Unload()
{
NadekoBot.Client.MessageReceived -= Client_MessageReceived;
}
private static async Task Client_MessageReceived(Discord.WebSocket.SocketMessage imsg)
{ {
try try
{ {
@ -34,11 +43,11 @@ namespace NadekoBot.Modules.Utility
var set = subscriber.Value; var set = subscriber.Value;
if (!set.Contains(channel)) if (!set.Contains(channel))
continue; continue;
foreach (var chan in set.Except(new[] {channel})) foreach (var chan in set.Except(new[] { channel }))
{ {
try try
{ {
await chan.SendMessageAsync(GetMessage(channel, (IGuildUser) msg.Author, await chan.SendMessageAsync(GetMessage(channel, (IGuildUser)msg.Author,
msg)).ConfigureAwait(false); msg)).ConfigureAwait(false);
} }
catch catch
@ -52,7 +61,6 @@ namespace NadekoBot.Modules.Utility
{ {
// ignored // ignored
} }
};
} }
private static string GetMessage(ITextChannel channel, IGuildUser user, IUserMessage message) => private static string GetMessage(ITextChannel channel, IGuildUser user, IUserMessage message) =>

View File

@ -36,6 +36,7 @@ namespace NadekoBot.Modules.Utility
public Repeater Repeater { get; } public Repeater Repeater { get; }
public SocketGuild Guild { get; } public SocketGuild Guild { get; }
public ITextChannel Channel { get; private set; } public ITextChannel Channel { get; private set; }
private IUserMessage oldMsg = null;
public RepeatRunner(Repeater repeater, ITextChannel channel = null) public RepeatRunner(Repeater repeater, ITextChannel channel = null)
{ {
@ -48,19 +49,27 @@ namespace NadekoBot.Modules.Utility
Task.Run(Run); Task.Run(Run);
} }
private async Task Run() private async Task Run()
{ {
source = new CancellationTokenSource(); source = new CancellationTokenSource();
token = source.Token; token = source.Token;
IUserMessage oldMsg = null;
try try
{ {
while (!token.IsCancellationRequested) while (!token.IsCancellationRequested)
{ {
var toSend = "🔄 " + Repeater.Message;
await Task.Delay(Repeater.Interval, token).ConfigureAwait(false); await Task.Delay(Repeater.Interval, token).ConfigureAwait(false);
await Trigger().ConfigureAwait(false);
}
}
catch (OperationCanceledException)
{
}
}
public async Task Trigger()
{
var toSend = "🔄 " + Repeater.Message;
//var lastMsgInChannel = (await Channel.GetMessagesAsync(2)).FirstOrDefault(); //var lastMsgInChannel = (await Channel.GetMessagesAsync(2)).FirstOrDefault();
// if (lastMsgInChannel.Id == oldMsg?.Id) //don't send if it's the same message in the channel // if (lastMsgInChannel.Id == oldMsg?.Id) //don't send if it's the same message in the channel
// continue; // continue;
@ -80,7 +89,7 @@ namespace NadekoBot.Modules.Utility
Channel = Guild.GetTextChannel(Repeater.ChannelId); Channel = Guild.GetTextChannel(Repeater.ChannelId);
if (Channel != null) if (Channel != null)
oldMsg = await Channel.SendMessageAsync(toSend).ConfigureAwait(false); oldMsg = await Channel.SendMessageAsync(toSend.SanitizeMentions()).ConfigureAwait(false);
} }
catch (HttpException ex) when (ex.HttpCode == System.Net.HttpStatusCode.Forbidden) catch (HttpException ex) when (ex.HttpCode == System.Net.HttpStatusCode.Forbidden)
{ {
@ -97,11 +106,6 @@ namespace NadekoBot.Modules.Utility
_log.Warn(ex); _log.Warn(ex);
} }
} }
}
catch (OperationCanceledException)
{
}
}
public void Reset() public void Reset()
{ {
@ -124,7 +128,12 @@ namespace NadekoBot.Modules.Utility
{ {
var _ = Task.Run(async () => var _ = Task.Run(async () =>
{ {
#if !GLOBAL_NADEKO
await Task.Delay(5000).ConfigureAwait(false); await Task.Delay(5000).ConfigureAwait(false);
#else
await Task.Delay(30000).ConfigureAwait(false);
#endif
//todo this is pretty terrible
Repeaters = new ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>>(NadekoBot.AllGuildConfigs Repeaters = new ConcurrentDictionary<ulong, ConcurrentQueue<RepeatRunner>>(NadekoBot.AllGuildConfigs
.ToDictionary(gc => gc.GuildId, .ToDictionary(gc => gc.GuildId,
gc => new ConcurrentQueue<RepeatRunner>(gc.GuildRepeaters gc => new ConcurrentQueue<RepeatRunner>(gc.GuildRepeaters
@ -134,6 +143,21 @@ namespace NadekoBot.Modules.Utility
}); });
} }
public static void Unload()
{
_ready = false;
foreach (var kvp in Repeaters)
{
RepeatRunner r;
while (kvp.Value.TryDequeue(out r))
{
r.Stop();
}
}
Repeaters.Clear();
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageMessages)] [RequireUserPermission(GuildPermission.ManageMessages)]
@ -157,9 +181,10 @@ namespace NadekoBot.Modules.Utility
return; return;
} }
var repeater = repList[index].Repeater; var repeater = repList[index].Repeater;
repList[index].Reset(); repList[index].Reset();
await Context.Channel.SendMessageAsync("🔄 " + repeater.Message).ConfigureAwait(false); await repList[index].Trigger();
await Context.Channel.SendMessageAsync("🔄").ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]

View File

@ -1,110 +1,226 @@
//using System.Collections.Generic; using System.Collections.Generic;
//using System.Linq; using System.Linq;
//using System.Net.Http; using System.Net.Http;
//using System.Threading.Tasks; using System.Threading.Tasks;
//using Discord.Commands; using Discord.Commands;
//using NadekoBot.Attributes; using NadekoBot.Attributes;
//using NadekoBot.Modules.Utility.Models; using NadekoBot.Modules.Utility.Models;
//using Newtonsoft.Json; using Newtonsoft.Json;
//using System.Threading; using System.Threading;
//using System; using System;
//using System.Collections.Immutable; using System.Collections.Immutable;
using NadekoBot.Services;
using NadekoBot.Services.Database.Models;
using NadekoBot.Extensions;
using Discord;
using NLog;
//namespace NadekoBot.Modules.Utility namespace NadekoBot.Modules.Utility
//{ {
// public partial class Utility public partial class Utility
// { {
// [Group] [Group]
// public class PatreonCommands : NadekoSubmodule public class PatreonCommands : NadekoSubmodule
// { {
// [NadekoCommand, Usage, Description, Aliases] private static readonly PatreonThingy patreon;
// public async Task ClaimPatreonRewards()
// {
// var patreon = PatreonThingy.Instance;
// var pledges = (await patreon.GetPledges().ConfigureAwait(false)) static PatreonCommands()
// .OrderByDescending(x => x.Reward.attributes.amount_cents); {
patreon = PatreonThingy.Instance;
}
// if (pledges == null) public static void Unload()
// { {
// await ReplyErrorLocalized("pledges_loading").ConfigureAwait(false); patreon.Updater.Change(Timeout.Infinite, Timeout.Infinite);
// return; }
// }
// } [NadekoCommand, Usage, Description, Aliases]
// } [OwnerOnly]
public async Task PatreonRewardsReload()
{
await patreon.LoadPledges().ConfigureAwait(false);
// public class PatreonThingy await Context.Channel.SendConfirmAsync("👌").ConfigureAwait(false);
// { }
// public static PatreonThingy _instance = new PatreonThingy();
// public static PatreonThingy Instance => _instance;
// private readonly SemaphoreSlim getPledgesLocker = new SemaphoreSlim(1, 1); [NadekoCommand, Usage, Description, Aliases]
public async Task ClaimPatreonRewards()
{
if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.PatreonAccessToken))
return;
if (DateTime.UtcNow.Day < 5)
{
await ReplyErrorLocalized("clpa_too_early").ConfigureAwait(false);
return;
}
int amount = 0;
try
{
amount = await patreon.ClaimReward(Context.User.Id).ConfigureAwait(false);
}
catch (Exception ex)
{
_log.Warn(ex);
}
// private ImmutableArray<PatreonUserAndReward> pledges; if (amount > 0)
{
await ReplyConfirmLocalized("clpa_success", amount + NadekoBot.BotConfig.CurrencySign).ConfigureAwait(false);
return;
}
var rem = (patreon.Interval - (DateTime.UtcNow - patreon.LastUpdate));
var helpcmd = Format.Code(NadekoBot.ModulePrefixes[typeof(Help.Help).Name] + "donate");
await Context.Channel.EmbedAsync(new EmbedBuilder().WithOkColor()
.WithDescription(GetText("clpa_fail"))
.AddField(efb => efb.WithName(GetText("clpa_fail_already_title")).WithValue(GetText("clpa_fail_already")))
.AddField(efb => efb.WithName(GetText("clpa_fail_wait_title")).WithValue(GetText("clpa_fail_wait")))
.AddField(efb => efb.WithName(GetText("clpa_fail_conn_title")).WithValue(GetText("clpa_fail_conn")))
.AddField(efb => efb.WithName(GetText("clpa_fail_sup_title")).WithValue(GetText("clpa_fail_sup", helpcmd)))
.WithFooter(efb => efb.WithText(GetText("clpa_next_update", rem))))
.ConfigureAwait(false);
}
}
// static PatreonThingy() { } public class PatreonThingy
{
public static PatreonThingy _instance = new PatreonThingy();
public static PatreonThingy Instance => _instance;
// public async Task<ImmutableArray<PatreonUserAndReward>> GetPledges() private readonly SemaphoreSlim getPledgesLocker = new SemaphoreSlim(1, 1);
// {
// try
// {
// await LoadPledges().ConfigureAwait(false);
// return pledges;
// }
// catch (OperationCanceledException)
// {
// return pledges;
// }
// }
// public async Task LoadPledges() public ImmutableArray<PatreonUserAndReward> Pledges { get; private set; }
// { public DateTime LastUpdate { get; private set; } = DateTime.UtcNow;
// await getPledgesLocker.WaitAsync(1000).ConfigureAwait(false);
// try
// {
// var rewards = new List<PatreonPledge>();
// var users = new List<PatreonUser>();
// using (var http = new HttpClient())
// {
// http.DefaultRequestHeaders.Clear();
// http.DefaultRequestHeaders.Add("Authorization", "Bearer " + NadekoBot.Credentials.PatreonAccessToken);
// var data = new PatreonData()
// {
// Links = new PatreonDataLinks()
// {
// next = "https://api.patreon.com/oauth2/api/campaigns/334038/pledges"
// }
// };
// do
// {
// var res = await http.GetStringAsync(data.Links.next)
// .ConfigureAwait(false);
// data = JsonConvert.DeserializeObject<PatreonData>(res);
// var pledgers = data.Data.Where(x => x["type"].ToString() == "pledge");
// rewards.AddRange(pledgers.Select(x => JsonConvert.DeserializeObject<PatreonPledge>(x.ToString()))
// .Where(x => x.attributes.declined_since == null));
// users.AddRange(data.Included
// .Where(x => x["type"].ToString() == "user")
// .Select(x => JsonConvert.DeserializeObject<PatreonUser>(x.ToString())));
// } while (!string.IsNullOrWhiteSpace(data.Links.next));
// }
// pledges = rewards.Join(users, (r) => r.relationships?.patron?.data?.id, (u) => u.id, (x, y) => new PatreonUserAndReward()
// {
// User = y,
// Reward = x,
// }).ToImmutableArray();
// }
// finally
// {
// var _ = Task.Run(async () =>
// {
// await Task.Delay(TimeSpan.FromMinutes(5)).ConfigureAwait(false);
// getPledgesLocker.Release();
// });
// } public readonly Timer Updater;
// } private readonly SemaphoreSlim claimLockJustInCase = new SemaphoreSlim(1, 1);
// } private readonly Logger _log;
// }
//} public readonly TimeSpan Interval = TimeSpan.FromHours(1);
private PatreonThingy()
{
if (string.IsNullOrWhiteSpace(NadekoBot.Credentials.PatreonAccessToken))
return;
_log = LogManager.GetCurrentClassLogger();
Updater = new Timer(async (_) => await LoadPledges(), null, TimeSpan.Zero, Interval);
}
public async Task LoadPledges()
{
LastUpdate = DateTime.UtcNow;
await getPledgesLocker.WaitAsync(1000).ConfigureAwait(false);
try
{
var rewards = new List<PatreonPledge>();
var users = new List<PatreonUser>();
using (var http = new HttpClient())
{
http.DefaultRequestHeaders.Clear();
http.DefaultRequestHeaders.Add("Authorization", "Bearer " + NadekoBot.Credentials.PatreonAccessToken);
var data = new PatreonData()
{
Links = new PatreonDataLinks()
{
next = "https://api.patreon.com/oauth2/api/campaigns/334038/pledges"
}
};
do
{
var res = await http.GetStringAsync(data.Links.next)
.ConfigureAwait(false);
data = JsonConvert.DeserializeObject<PatreonData>(res);
var pledgers = data.Data.Where(x => x["type"].ToString() == "pledge");
rewards.AddRange(pledgers.Select(x => JsonConvert.DeserializeObject<PatreonPledge>(x.ToString()))
.Where(x => x.attributes.declined_since == null));
users.AddRange(data.Included
.Where(x => x["type"].ToString() == "user")
.Select(x => JsonConvert.DeserializeObject<PatreonUser>(x.ToString())));
} while (!string.IsNullOrWhiteSpace(data.Links.next));
}
Pledges = rewards.Join(users, (r) => r.relationships?.patron?.data?.id, (u) => u.id, (x, y) => new PatreonUserAndReward()
{
User = y,
Reward = x,
}).ToImmutableArray();
}
catch (Exception ex)
{
_log.Warn(ex);
}
finally
{
var _ = Task.Run(async () =>
{
await Task.Delay(TimeSpan.FromMinutes(5)).ConfigureAwait(false);
getPledgesLocker.Release();
});
}
}
public async Task<int> ClaimReward(ulong userId)
{
await claimLockJustInCase.WaitAsync();
var now = DateTime.UtcNow;
try
{
var data = Pledges.FirstOrDefault(x => x.User.attributes?.social_connections?.discord?.user_id == userId.ToString());
if (data == null)
return 0;
var amount = data.Reward.attributes.amount_cents;
using (var uow = DbHandler.UnitOfWork())
{
var users = uow._context.Set<RewardedUser>();
var usr = users.FirstOrDefault(x => x.UserId == userId);
if (usr == null)
{
users.Add(new RewardedUser()
{
UserId = userId,
LastReward = now,
AmountRewardedThisMonth = amount,
});
await CurrencyHandler.AddCurrencyAsync(userId, "Patreon reward - new", amount, uow).ConfigureAwait(false);
await uow.CompleteAsync().ConfigureAwait(false);
return amount;
}
if (usr.LastReward.Month != now.Month)
{
usr.LastReward = now;
usr.AmountRewardedThisMonth = amount;
await CurrencyHandler.AddCurrencyAsync(userId, "Patreon reward - recurring", amount, uow).ConfigureAwait(false);
await uow.CompleteAsync().ConfigureAwait(false);
return amount;
}
if ( usr.AmountRewardedThisMonth < amount)
{
var toAward = amount - usr.AmountRewardedThisMonth;
usr.LastReward = now;
usr.AmountRewardedThisMonth = amount;
await CurrencyHandler.AddCurrencyAsync(usr.UserId, "Patreon reward - update", toAward, uow).ConfigureAwait(false);
await uow.CompleteAsync().ConfigureAwait(false);
return toAward;
}
}
return 0;
}
finally
{
claimLockJustInCase.Release();
}
}
}
}
}

View File

@ -1,4 +1,4 @@
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
using NadekoBot.Attributes; using NadekoBot.Attributes;
using NadekoBot.Extensions; using NadekoBot.Extensions;
@ -34,7 +34,7 @@ namespace NadekoBot.Modules.Utility
if (quotes.Any()) if (quotes.Any())
await Context.Channel.SendConfirmAsync(GetText("quotes_page", page + 1), 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}"))) string.Join("\n", quotes.Select(q => $"`#{q.Id}` {Format.Bold(q.Keyword.SanitizeMentions()),-20} by {q.AuthorName.SanitizeMentions()}")))
.ConfigureAwait(false); .ConfigureAwait(false);
else else
await ReplyErrorLocalized("quotes_page_none").ConfigureAwait(false); await ReplyErrorLocalized("quotes_page_none").ConfigureAwait(false);
@ -101,6 +101,42 @@ namespace NadekoBot.Modules.Utility
keywordquote.Text.SanitizeMentions()); keywordquote.Text.SanitizeMentions());
} }
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task QuoteId(int id)
{
if (id < 0)
return;
using (var uow = DbHandler.UnitOfWork())
{
var qfromid = uow.Quotes.Get(id);
CREmbed crembed;
if (qfromid == null)
{
await Context.Channel.SendErrorAsync(GetText("quotes_notfound"));
}
else if (CREmbed.TryParse(qfromid.Text, out crembed))
{
try
{
await Context.Channel.EmbedAsync(crembed.ToEmbed(), crembed.PlainText ?? "")
.ConfigureAwait(false);
}
catch (Exception ex)
{
_log.Warn("Sending CREmbed failed");
_log.Warn(ex);
}
return;
}
else { await Context.Channel.SendMessageAsync($"`#{qfromid.Id}` 🗯️ " + qfromid.Keyword.ToLowerInvariant().SanitizeMentions() + ": " +
qfromid.Text.SanitizeMentions()); }
}
}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
public async Task AddQuote(string keyword, [Remainder] string text) public async Task AddQuote(string keyword, [Remainder] string text)
@ -131,7 +167,7 @@ namespace NadekoBot.Modules.Utility
{ {
var isAdmin = ((IGuildUser) Context.Message.Author).GuildPermissions.Administrator; var isAdmin = ((IGuildUser) Context.Message.Author).GuildPermissions.Administrator;
var sucess = false; var success = false;
string response; string response;
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
{ {
@ -145,11 +181,11 @@ namespace NadekoBot.Modules.Utility
{ {
uow.Quotes.Remove(q); uow.Quotes.Remove(q);
await uow.CompleteAsync().ConfigureAwait(false); await uow.CompleteAsync().ConfigureAwait(false);
sucess = true; success = true;
response = GetText("quote_deleted", id); response = GetText("quote_deleted", id);
} }
} }
if (sucess) if (success)
await Context.Channel.SendConfirmAsync(response); await Context.Channel.SendConfirmAsync(response);
else else
await Context.Channel.SendErrorAsync(response); await Context.Channel.SendErrorAsync(response);
@ -172,7 +208,7 @@ namespace NadekoBot.Modules.Utility
await uow.CompleteAsync(); await uow.CompleteAsync();
} }
await ReplyConfirmLocalized("quotes_deleted", Format.Bold(keyword)).ConfigureAwait(false); await ReplyConfirmLocalized("quotes_deleted", Format.Bold(keyword.SanitizeMentions())).ConfigureAwait(false);
} }
} }
} }

View File

@ -32,10 +32,15 @@ namespace NadekoBot.Modules.Utility
}; };
private new static readonly Logger _log; private new static readonly Logger _log;
private static readonly CancellationTokenSource cancelSource;
private static readonly CancellationToken cancelAllToken;
static RemindCommands() static RemindCommands()
{ {
_log = LogManager.GetCurrentClassLogger(); _log = LogManager.GetCurrentClassLogger();
cancelSource = new CancellationTokenSource();
cancelAllToken = cancelSource.Token;
List<Reminder> reminders; List<Reminder> reminders;
using (var uow = DbHandler.UnitOfWork()) using (var uow = DbHandler.UnitOfWork())
{ {
@ -45,11 +50,17 @@ namespace NadekoBot.Modules.Utility
foreach (var r in reminders) foreach (var r in reminders)
{ {
Task.Run(() => StartReminder(r)); Task.Run(() => StartReminder(r, cancelAllToken));
} }
} }
private static async Task StartReminder(Reminder r) public static void Unload()
{
if (!cancelSource.IsCancellationRequested)
cancelSource.Cancel();
}
private static async Task StartReminder(Reminder r, CancellationToken t)
{ {
var now = DateTime.Now; var now = DateTime.Now;
@ -58,7 +69,7 @@ namespace NadekoBot.Modules.Utility
if (time.TotalMilliseconds > int.MaxValue) if (time.TotalMilliseconds > int.MaxValue)
return; return;
await Task.Delay(time).ConfigureAwait(false); await Task.Delay(time, t).ConfigureAwait(false);
try try
{ {
IMessageChannel ch; IMessageChannel ch;
@ -188,7 +199,7 @@ namespace NadekoBot.Modules.Utility
{ {
// ignored // ignored
} }
await StartReminder(rem); await StartReminder(rem, cancelAllToken);
} }
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]

View File

@ -49,14 +49,19 @@ namespace NadekoBot.Modules.Utility
} }
Units = data.ToList(); Units = data.ToList();
} }
catch (Exception e) catch (Exception ex)
{ {
_log.Warn("Could not load units: " + e.Message); _log.Warn("Could not load units: " + ex.Message);
} }
_timer = new Timer(async (obj) => await UpdateCurrency(), null, _updateInterval, _updateInterval); _timer = new Timer(async (obj) => await UpdateCurrency(), null, _updateInterval, _updateInterval);
} }
public static void Unload()
{
_timer.Change(Timeout.Infinite, Timeout.Infinite);
}
public static async Task UpdateCurrency() public static async Task UpdateCurrency()
{ {
try try

View File

@ -16,6 +16,7 @@ using System.Collections.Generic;
using Newtonsoft.Json; using Newtonsoft.Json;
using Discord.WebSocket; using Discord.WebSocket;
using NadekoBot.Services; using NadekoBot.Services;
using System.Diagnostics;
namespace NadekoBot.Modules.Utility namespace NadekoBot.Modules.Utility
{ {
@ -24,6 +25,12 @@ namespace NadekoBot.Modules.Utility
{ {
private static ConcurrentDictionary<ulong, Timer> _rotatingRoleColors = new ConcurrentDictionary<ulong, Timer>(); private static ConcurrentDictionary<ulong, Timer> _rotatingRoleColors = new ConcurrentDictionary<ulong, Timer>();
public static void Unload()
{
_rotatingRoleColors.ForEach(x => x.Value?.Change(Timeout.Infinite, Timeout.Infinite));
_rotatingRoleColors.Clear();
}
//[NadekoCommand, Usage, Description, Aliases] //[NadekoCommand, Usage, Description, Aliases]
//[RequireContext(ContextType.Guild)] //[RequireContext(ContextType.Guild)]
//public async Task Midorina([Remainder] string arg) //public async Task Midorina([Remainder] string arg)
@ -100,6 +107,7 @@ namespace NadekoBot.Modules.Utility
// })); // }));
//} //}
[NadekoCommand, Usage, Description, Aliases] [NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)] [RequireContext(ContextType.Guild)]
[RequireUserPermission(GuildPermission.ManageRoles)] [RequireUserPermission(GuildPermission.ManageRoles)]
@ -494,5 +502,16 @@ namespace NadekoBot.Modules.Utility
await Context.User.SendFileAsync( await Context.User.SendFileAsync(
await JsonConvert.SerializeObject(grouping, Formatting.Indented).ToStream().ConfigureAwait(false), title, title).ConfigureAwait(false); await JsonConvert.SerializeObject(grouping, Formatting.Indented).ToStream().ConfigureAwait(false), title, title).ConfigureAwait(false);
} }
[NadekoCommand, Usage, Description, Aliases]
[RequireContext(ContextType.Guild)]
public async Task Ping()
{
var sw = Stopwatch.StartNew();
var msg = await Context.Channel.SendMessageAsync("🏓").ConfigureAwait(false);
sw.Stop();
msg.DeleteAfter(0);
await Context.Channel.SendConfirmAsync($"{Format.Bold(Context.User.ToString())} 🏓 {(int)sw.Elapsed.TotalMilliseconds}ms").ConfigureAwait(false);
}
} }
} }

View File

@ -112,6 +112,7 @@ namespace NadekoBot
CommandService.AddTypeReader<CommandInfo>(new CommandTypeReader()); CommandService.AddTypeReader<CommandInfo>(new CommandTypeReader());
CommandService.AddTypeReader<CommandOrCrInfo>(new CommandOrCrTypeReader()); CommandService.AddTypeReader<CommandOrCrInfo>(new CommandOrCrTypeReader());
CommandService.AddTypeReader<ModuleInfo>(new ModuleTypeReader()); CommandService.AddTypeReader<ModuleInfo>(new ModuleTypeReader());
CommandService.AddTypeReader<ModuleOrCrInfo>(new ModuleOrCrTypeReader());
CommandService.AddTypeReader<IGuild>(new GuildTypeReader()); CommandService.AddTypeReader<IGuild>(new GuildTypeReader());

View File

@ -1031,6 +1031,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to buy.
/// </summary>
public static string buy_cmd {
get {
return ResourceManager.GetString("buy_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Buys an item from the shop on a given index. If buying items, make sure that the bot can DM you..
/// </summary>
public static string buy_desc {
get {
return ResourceManager.GetString("buy_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}buy 2`.
/// </summary>
public static string buy_usage {
get {
return ResourceManager.GetString("buy_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to bye. /// Looks up a localized string similar to bye.
/// </summary> /// </summary>
@ -1706,6 +1733,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to clparew.
/// </summary>
public static string claimpatreonrewards_cmd {
get {
return ResourceManager.GetString("claimpatreonrewards_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Claim patreon rewards. If you&apos;re subscribed to bot owner&apos;s patreon you can use this command to claim your rewards - assuming bot owner did setup has their patreon key..
/// </summary>
public static string claimpatreonrewards_desc {
get {
return ResourceManager.GetString("claimpatreonrewards_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}clparew`.
/// </summary>
public static string claimpatreonrewards_usage {
get {
return ResourceManager.GetString("claimpatreonrewards_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to cleanup. /// Looks up a localized string similar to cleanup.
/// </summary> /// </summary>
@ -2076,7 +2130,7 @@ namespace NadekoBot.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to `{0}crad 44`. /// Looks up a localized string similar to `{0}crdm 44`.
/// </summary> /// </summary>
public static string crdm_usage { public static string crdm_usage {
get { get {
@ -2948,6 +3002,60 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to gvc.
/// </summary>
public static string gamevoicechannel_cmd {
get {
return ResourceManager.GetString("gamevoicechannel_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Toggles game voice channel feature in the voice channel you&apos;re currently in. Users who join the game voice channel will get automatically redirected to the voice channel with the name of their current game, if it exists. Can&apos;t move users to channels that the bot has no connect permission for. One per server..
/// </summary>
public static string gamevoicechannel_desc {
get {
return ResourceManager.GetString("gamevoicechannel_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}gvc`.
/// </summary>
public static string gamevoicechannel_usage {
get {
return ResourceManager.GetString("gamevoicechannel_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to globalcommand gcmd.
/// </summary>
public static string gcmd_cmd {
get {
return ResourceManager.GetString("gcmd_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Enables or disables a command from use on all servers..
/// </summary>
public static string gcmd_desc {
get {
return ResourceManager.GetString("gcmd_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}gcmd `.
/// </summary>
public static string gcmd_usage {
get {
return ResourceManager.GetString("gcmd_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to gelbooru. /// Looks up a localized string similar to gelbooru.
/// </summary> /// </summary>
@ -3029,6 +3137,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to globalmodule gmod.
/// </summary>
public static string gmod_cmd {
get {
return ResourceManager.GetString("gmod_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Enable or disable a module from use on all servers..
/// </summary>
public static string gmod_desc {
get {
return ResourceManager.GetString("gmod_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}gmod nsfw disable`.
/// </summary>
public static string gmod_usage {
get {
return ResourceManager.GetString("gmod_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to google g. /// Looks up a localized string similar to google g.
/// </summary> /// </summary>
@ -3974,6 +4109,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to listglobalperms lgp.
/// </summary>
public static string lgp_cmd {
get {
return ResourceManager.GetString("lgp_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lists global permissions set by the bot owner..
/// </summary>
public static string lgp_desc {
get {
return ResourceManager.GetString("lgp_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}lgp`.
/// </summary>
public static string lgp_usage {
get {
return ResourceManager.GetString("lgp_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to linux. /// Looks up a localized string similar to linux.
/// </summary> /// </summary>
@ -4146,7 +4308,7 @@ namespace NadekoBot.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to `{0}liqu` or `{0}liqu 3`. /// Looks up a localized string similar to Lists all quotes on the server ordered alphabetically. 15 Per page..
/// </summary> /// </summary>
public static string listquotes_desc { public static string listquotes_desc {
get { get {
@ -4155,7 +4317,7 @@ namespace NadekoBot.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Lists all quotes on the server ordered alphabetically. 15 Per page.. /// Looks up a localized string similar to `{0}liqu` or `{0}liqu 3`.
/// </summary> /// </summary>
public static string listquotes_usage { public static string listquotes_usage {
get { get {
@ -4875,7 +5037,7 @@ namespace NadekoBot.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Mentions every person from the provided role or roles (separated by a &apos;,&apos;) on this server. Requires you to have the mention everyone permission.. /// Looks up a localized string similar to Mentions every person from the provided role or roles (separated by a &apos;,&apos;) on this server..
/// </summary> /// </summary>
public static string mentionrole_desc { public static string mentionrole_desc {
get { get {
@ -5270,6 +5432,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to parewrel.
/// </summary>
public static string patreonrewardsreload_cmd {
get {
return ResourceManager.GetString("patreonrewardsreload_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Forces the update of the list of patrons who are eligible for the reward..
/// </summary>
public static string patreonrewardsreload_desc {
get {
return ResourceManager.GetString("patreonrewardsreload_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}parewrel`.
/// </summary>
public static string patreonrewardsreload_usage {
get {
return ResourceManager.GetString("patreonrewardsreload_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to pause p. /// Looks up a localized string similar to pause p.
/// </summary> /// </summary>
@ -5351,6 +5540,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to ping.
/// </summary>
public static string ping_cmd {
get {
return ResourceManager.GetString("ping_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Ping the bot to see if there are latency issues..
/// </summary>
public static string ping_desc {
get {
return ResourceManager.GetString("ping_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}ping`.
/// </summary>
public static string ping_usage {
get {
return ResourceManager.GetString("ping_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to place. /// Looks up a localized string similar to place.
/// </summary> /// </summary>
@ -5702,6 +5918,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to quoteid qid.
/// </summary>
public static string quoteid_cmd {
get {
return ResourceManager.GetString("quoteid_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Displays the quote with the specified ID number. Quote ID numbers can be found by typing `.liqu [num]` where `[num]` is a number of a page which contains 15 quotes..
/// </summary>
public static string quoteid_desc {
get {
return ResourceManager.GetString("quoteid_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}qid 123456`.
/// </summary>
public static string quoteid_usage {
get {
return ResourceManager.GetString("quoteid_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to race. /// Looks up a localized string similar to race.
/// </summary> /// </summary>
@ -6350,6 +6593,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to resetglobalperms.
/// </summary>
public static string resetglobalpermissions_cmd {
get {
return ResourceManager.GetString("resetglobalpermissions_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Resets global permissions set by bot owner..
/// </summary>
public static string resetglobalpermissions_desc {
get {
return ResourceManager.GetString("resetglobalpermissions_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}resetglobalperms`.
/// </summary>
public static string resetglobalpermissions_usage {
get {
return ResourceManager.GetString("resetglobalpermissions_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to resetperms. /// Looks up a localized string similar to resetperms.
/// </summary> /// </summary>
@ -6512,6 +6782,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to rolehoist rh.
/// </summary>
public static string rolehoist_cmd {
get {
return ResourceManager.GetString("rolehoist_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Toggles if this role is displayed in the sidebar or not.
/// </summary>
public static string rolehoist_desc {
get {
return ResourceManager.GetString("rolehoist_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}rh Guests true` or `{0}rh &quot;Space Wizards&quot; true.
/// </summary>
public static string rolehoist_usage {
get {
return ResourceManager.GetString("rolehoist_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to rolemdl rm. /// Looks up a localized string similar to rolemdl rm.
/// </summary> /// </summary>
@ -7403,6 +7700,114 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to shop.
/// </summary>
public static string shop_cmd {
get {
return ResourceManager.GetString("shop_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lists this server&apos;s administrators&apos; shop. Paginated..
/// </summary>
public static string shop_desc {
get {
return ResourceManager.GetString("shop_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}shop` or `{0}shop 2`.
/// </summary>
public static string shop_usage {
get {
return ResourceManager.GetString("shop_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to shopadd.
/// </summary>
public static string shopadd_cmd {
get {
return ResourceManager.GetString("shopadd_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Adds an item to the shop by specifying type price and name. Available types are role and list..
/// </summary>
public static string shopadd_desc {
get {
return ResourceManager.GetString("shopadd_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}shopadd role 1000 Rich`.
/// </summary>
public static string shopadd_usage {
get {
return ResourceManager.GetString("shopadd_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to shoplistadd.
/// </summary>
public static string shoplistadd_cmd {
get {
return ResourceManager.GetString("shoplistadd_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Adds an item to the list of items for sale in the shop entry given the index. You usually want to run this command in the secret channel, so that the unique items are not leaked..
/// </summary>
public static string shoplistadd_desc {
get {
return ResourceManager.GetString("shoplistadd_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}shoplistadd 1 Uni-que-Steam-Key`.
/// </summary>
public static string shoplistadd_usage {
get {
return ResourceManager.GetString("shoplistadd_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to shoprem shoprm.
/// </summary>
public static string shopremove_cmd {
get {
return ResourceManager.GetString("shopremove_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Removes an item from the shop by its color..
/// </summary>
public static string shopremove_desc {
get {
return ResourceManager.GetString("shopremove_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}shoprm 1`.
/// </summary>
public static string shopremove_usage {
get {
return ResourceManager.GetString("shopremove_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to shorten. /// Looks up a localized string similar to shorten.
/// </summary> /// </summary>
@ -7575,7 +7980,7 @@ namespace NadekoBot.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Play Nadeko slots. Max bet is 999. 3 seconds cooldown per user.. /// Looks up a localized string similar to Play Nadeko slots. Max bet is 9999. 1.5 second cooldown per user..
/// </summary> /// </summary>
public static string slot_desc { public static string slot_desc {
get { get {
@ -7673,6 +8078,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to slowmodewl.
/// </summary>
public static string slowmodewhitelist_cmd {
get {
return ResourceManager.GetString("slowmodewhitelist_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Ignores a role or a user from the slowmode feature..
/// </summary>
public static string slowmodewhitelist_desc {
get {
return ResourceManager.GetString("slowmodewhitelist_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}slowmodewl SomeRole` or `{0}slowmodewl AdminDude`.
/// </summary>
public static string slowmodewhitelist_usage {
get {
return ResourceManager.GetString("slowmodewhitelist_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to softban sb. /// Looks up a localized string similar to softban sb.
/// </summary> /// </summary>
@ -7889,6 +8321,114 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to scadd.
/// </summary>
public static string startupcommandadd_cmd {
get {
return ResourceManager.GetString("startupcommandadd_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Adds a command to the list of commands which will be executed automatically in the current channel, in the order they were added in, by the bot when it startups up..
/// </summary>
public static string startupcommandadd_desc {
get {
return ResourceManager.GetString("startupcommandadd_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}scadd .stats`.
/// </summary>
public static string startupcommandadd_usage {
get {
return ResourceManager.GetString("startupcommandadd_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to scrm.
/// </summary>
public static string startupcommandremove_cmd {
get {
return ResourceManager.GetString("startupcommandremove_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Removes a startup command with the provided command text..
/// </summary>
public static string startupcommandremove_desc {
get {
return ResourceManager.GetString("startupcommandremove_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}scrm .stats`.
/// </summary>
public static string startupcommandremove_usage {
get {
return ResourceManager.GetString("startupcommandremove_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to sclist.
/// </summary>
public static string startupcommands_cmd {
get {
return ResourceManager.GetString("startupcommands_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lists all startup commands in the order they will be executed in..
/// </summary>
public static string startupcommands_desc {
get {
return ResourceManager.GetString("startupcommands_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}sclist`.
/// </summary>
public static string startupcommands_usage {
get {
return ResourceManager.GetString("startupcommands_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to scclr.
/// </summary>
public static string startupcommandsclear_cmd {
get {
return ResourceManager.GetString("startupcommandsclear_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Removes all startup commands..
/// </summary>
public static string startupcommandsclear_desc {
get {
return ResourceManager.GetString("startupcommandsclear_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}scclr`.
/// </summary>
public static string startupcommandsclear_usage {
get {
return ResourceManager.GetString("startupcommandsclear_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to startwar sw. /// Looks up a localized string similar to startwar sw.
/// </summary> /// </summary>
@ -8051,6 +8591,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to time.
/// </summary>
public static string time_cmd {
get {
return ResourceManager.GetString("time_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Shows the current time and timezone in the specified location..
/// </summary>
public static string time_desc {
get {
return ResourceManager.GetString("time_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}time London, UK`.
/// </summary>
public static string time_usage {
get {
return ResourceManager.GetString("time_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to timezone. /// Looks up a localized string similar to timezone.
/// </summary> /// </summary>
@ -8456,6 +9023,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to unban.
/// </summary>
public static string unban_cmd {
get {
return ResourceManager.GetString("unban_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unbans a user with the provided user#discrim or id..
/// </summary>
public static string unban_desc {
get {
return ResourceManager.GetString("unban_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}unban kwoth#1234` or `{0}unban 123123123`.
/// </summary>
public static string unban_usage {
get {
return ResourceManager.GetString("unban_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to unclaim ucall uc. /// Looks up a localized string similar to unclaim ucall uc.
/// </summary> /// </summary>
@ -9104,6 +9698,168 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to wait.
/// </summary>
public static string wait_cmd {
get {
return ResourceManager.GetString("wait_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Used only as a startup command. Waits a certain number of miliseconds before continuing the execution of the following startup commands..
/// </summary>
public static string wait_desc {
get {
return ResourceManager.GetString("wait_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}wait 3000`.
/// </summary>
public static string wait_usage {
get {
return ResourceManager.GetString("wait_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to warn.
/// </summary>
public static string warn_cmd {
get {
return ResourceManager.GetString("warn_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Warns a user..
/// </summary>
public static string warn_desc {
get {
return ResourceManager.GetString("warn_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}warn @b1nzy Very rude person`.
/// </summary>
public static string warn_usage {
get {
return ResourceManager.GetString("warn_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to warnclear warnc.
/// </summary>
public static string warnclear_cmd {
get {
return ResourceManager.GetString("warnclear_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Clears all warnings from a certain user..
/// </summary>
public static string warnclear_desc {
get {
return ResourceManager.GetString("warnclear_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}warnclear @PoorDude`.
/// </summary>
public static string warnclear_usage {
get {
return ResourceManager.GetString("warnclear_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to warnlog.
/// </summary>
public static string warnlog_cmd {
get {
return ResourceManager.GetString("warnlog_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to See a list of warnings of a certain user..
/// </summary>
public static string warnlog_desc {
get {
return ResourceManager.GetString("warnlog_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}warnlog @b1nzy`.
/// </summary>
public static string warnlog_usage {
get {
return ResourceManager.GetString("warnlog_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to warnpunish warnp.
/// </summary>
public static string warnpunish_cmd {
get {
return ResourceManager.GetString("warnpunish_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Sets a punishment for a certain number of warnings. Provide no punishment to remove..
/// </summary>
public static string warnpunish_desc {
get {
return ResourceManager.GetString("warnpunish_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}warnpunish 5 Ban` or `{0}warnpunish 3`.
/// </summary>
public static string warnpunish_usage {
get {
return ResourceManager.GetString("warnpunish_usage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to warnpunishlist warnpl.
/// </summary>
public static string warnpunishlist_cmd {
get {
return ResourceManager.GetString("warnpunishlist_cmd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lists punishments for warnings..
/// </summary>
public static string warnpunishlist_desc {
get {
return ResourceManager.GetString("warnpunishlist_desc", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to `{0}warnpunishlist`.
/// </summary>
public static string warnpunishlist_usage {
get {
return ResourceManager.GetString("warnpunishlist_usage", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to weather we. /// Looks up a localized string similar to weather we.
/// </summary> /// </summary>

View File

@ -733,7 +733,7 @@
<value>mentionrole menro</value> <value>mentionrole menro</value>
</data> </data>
<data name="mentionrole_desc" xml:space="preserve"> <data name="mentionrole_desc" xml:space="preserve">
<value>Mentions every person from the provided role or roles (separated by a ',') on this server. Requires you to have the mention everyone permission.</value> <value>Mentions every person from the provided role or roles (separated by a ',') on this server.</value>
</data> </data>
<data name="mentionrole_usage" xml:space="preserve"> <data name="mentionrole_usage" xml:space="preserve">
<value>`{0}menro RoleName`</value> <value>`{0}menro RoleName`</value>
@ -1152,6 +1152,15 @@
<data name="searchquote_usage" xml:space="preserve"> <data name="searchquote_usage" xml:space="preserve">
<value>`{0}qsearch keyword text`</value> <value>`{0}qsearch keyword text`</value>
</data> </data>
<data name="quoteid_cmd" xml:space="preserve">
<value>quoteid qid</value>
</data>
<data name="quoteid_desc" xml:space="preserve">
<value>Displays the quote with the specified ID number. Quote ID numbers can be found by typing `.liqu [num]` where `[num]` is a number of a page which contains 15 quotes.</value>
</data>
<data name="quoteid_usage" xml:space="preserve">
<value>`{0}qid 123456`</value>
</data>
<data name="deletequote_cmd" xml:space="preserve"> <data name="deletequote_cmd" xml:space="preserve">
<value>deletequote delq</value> <value>deletequote delq</value>
</data> </data>
@ -2587,10 +2596,10 @@
<value>listquotes liqu</value> <value>listquotes liqu</value>
</data> </data>
<data name="listquotes_desc" xml:space="preserve"> <data name="listquotes_desc" xml:space="preserve">
<value>`{0}liqu` or `{0}liqu 3`</value> <value>Lists all quotes on the server ordered alphabetically. 15 Per page.</value>
</data> </data>
<data name="listquotes_usage" xml:space="preserve"> <data name="listquotes_usage" xml:space="preserve">
<value>Lists all quotes on the server ordered alphabetically. 15 Per page.</value> <value>`{0}liqu` or `{0}liqu 3`</value>
</data> </data>
<data name="typedel_cmd" xml:space="preserve"> <data name="typedel_cmd" xml:space="preserve">
<value>typedel</value> <value>typedel</value>
@ -2983,7 +2992,7 @@
<value>slot</value> <value>slot</value>
</data> </data>
<data name="slot_desc" xml:space="preserve"> <data name="slot_desc" xml:space="preserve">
<value>Play Nadeko slots. Max bet is 999. 3 seconds cooldown per user.</value> <value>Play Nadeko slots. Max bet is 9999. 1.5 second cooldown per user.</value>
</data> </data>
<data name="slot_usage" xml:space="preserve"> <data name="slot_usage" xml:space="preserve">
<value>`{0}slot 5`</value> <value>`{0}slot 5`</value>
@ -3202,7 +3211,7 @@
<value>Toggles whether the response message of the custom reaction will be sent as a direct message.</value> <value>Toggles whether the response message of the custom reaction will be sent as a direct message.</value>
</data> </data>
<data name="crdm_usage" xml:space="preserve"> <data name="crdm_usage" xml:space="preserve">
<value>`{0}crad 44`</value> <value>`{0}crdm 44`</value>
</data> </data>
<data name="aliaslist_cmd" xml:space="preserve"> <data name="aliaslist_cmd" xml:space="preserve">
<value>aliaslist cmdmaplist aliases</value> <value>aliaslist cmdmaplist aliases</value>
@ -3222,4 +3231,247 @@
<data name="alias_usage" xml:space="preserve"> <data name="alias_usage" xml:space="preserve">
<value>`{0}alias allin $bf 100 h` or `{0}alias "linux thingy" &gt;loonix Spyware Windows`</value> <value>`{0}alias allin $bf 100 h` or `{0}alias "linux thingy" &gt;loonix Spyware Windows`</value>
</data> </data>
<data name="warnlog_cmd" xml:space="preserve">
<value>warnlog</value>
</data>
<data name="warnlog_desc" xml:space="preserve">
<value>See a list of warnings of a certain user.</value>
</data>
<data name="warnlog_usage" xml:space="preserve">
<value>`{0}warnlog @b1nzy`</value>
</data>
<data name="warn_cmd" xml:space="preserve">
<value>warn</value>
</data>
<data name="warn_desc" xml:space="preserve">
<value>Warns a user.</value>
</data>
<data name="warn_usage" xml:space="preserve">
<value>`{0}warn @b1nzy Very rude person`</value>
</data>
<data name="startupcommandadd_cmd" xml:space="preserve">
<value>scadd</value>
</data>
<data name="startupcommandadd_desc" xml:space="preserve">
<value>Adds a command to the list of commands which will be executed automatically in the current channel, in the order they were added in, by the bot when it startups up.</value>
</data>
<data name="startupcommandadd_usage" xml:space="preserve">
<value>`{0}scadd .stats`</value>
</data>
<data name="startupcommandremove_cmd" xml:space="preserve">
<value>scrm</value>
</data>
<data name="startupcommandremove_desc" xml:space="preserve">
<value>Removes a startup command with the provided command text.</value>
</data>
<data name="startupcommandremove_usage" xml:space="preserve">
<value>`{0}scrm .stats`</value>
</data>
<data name="startupcommandsclear_cmd" xml:space="preserve">
<value>scclr</value>
</data>
<data name="startupcommandsclear_desc" xml:space="preserve">
<value>Removes all startup commands.</value>
</data>
<data name="startupcommandsclear_usage" xml:space="preserve">
<value>`{0}scclr`</value>
</data>
<data name="startupcommands_cmd" xml:space="preserve">
<value>sclist</value>
</data>
<data name="startupcommands_desc" xml:space="preserve">
<value>Lists all startup commands in the order they will be executed in.</value>
</data>
<data name="startupcommands_usage" xml:space="preserve">
<value>`{0}sclist`</value>
</data>
<data name="unban_cmd" xml:space="preserve">
<value>unban</value>
</data>
<data name="unban_desc" xml:space="preserve">
<value>Unbans a user with the provided user#discrim or id.</value>
</data>
<data name="unban_usage" xml:space="preserve">
<value>`{0}unban kwoth#1234` or `{0}unban 123123123`</value>
</data>
<data name="wait_cmd" xml:space="preserve">
<value>wait</value>
</data>
<data name="wait_desc" xml:space="preserve">
<value>Used only as a startup command. Waits a certain number of miliseconds before continuing the execution of the following startup commands.</value>
</data>
<data name="wait_usage" xml:space="preserve">
<value>`{0}wait 3000`</value>
</data>
<data name="warnclear_cmd" xml:space="preserve">
<value>warnclear warnc</value>
</data>
<data name="warnclear_desc" xml:space="preserve">
<value>Clears all warnings from a certain user.</value>
</data>
<data name="warnclear_usage" xml:space="preserve">
<value>`{0}warnclear @PoorDude`</value>
</data>
<data name="warnpunishlist_cmd" xml:space="preserve">
<value>warnpunishlist warnpl</value>
</data>
<data name="warnpunishlist_desc" xml:space="preserve">
<value>Lists punishments for warnings.</value>
</data>
<data name="warnpunishlist_usage" xml:space="preserve">
<value>`{0}warnpunishlist`</value>
</data>
<data name="warnpunish_cmd" xml:space="preserve">
<value>warnpunish warnp</value>
</data>
<data name="warnpunish_desc" xml:space="preserve">
<value>Sets a punishment for a certain number of warnings. Provide no punishment to remove.</value>
</data>
<data name="warnpunish_usage" xml:space="preserve">
<value>`{0}warnpunish 5 Ban` or `{0}warnpunish 3`</value>
</data>
<data name="claimpatreonrewards_cmd" xml:space="preserve">
<value>clparew</value>
</data>
<data name="claimpatreonrewards_desc" xml:space="preserve">
<value>Claim patreon rewards. If you're subscribed to bot owner's patreon you can use this command to claim your rewards - assuming bot owner did setup has their patreon key.</value>
</data>
<data name="claimpatreonrewards_usage" xml:space="preserve">
<value>`{0}clparew`</value>
</data>
<data name="ping_cmd" xml:space="preserve">
<value>ping</value>
</data>
<data name="ping_desc" xml:space="preserve">
<value>Ping the bot to see if there are latency issues.</value>
</data>
<data name="ping_usage" xml:space="preserve">
<value>`{0}ping`</value>
</data>
<data name="slowmodewhitelist_cmd" xml:space="preserve">
<value>slowmodewl</value>
</data>
<data name="slowmodewhitelist_desc" xml:space="preserve">
<value>Ignores a role or a user from the slowmode feature.</value>
</data>
<data name="slowmodewhitelist_usage" xml:space="preserve">
<value>`{0}slowmodewl SomeRole` or `{0}slowmodewl AdminDude`</value>
</data>
<data name="time_cmd" xml:space="preserve">
<value>time</value>
</data>
<data name="time_desc" xml:space="preserve">
<value>Shows the current time and timezone in the specified location.</value>
</data>
<data name="time_usage" xml:space="preserve">
<value>`{0}time London, UK`</value>
</data>
<data name="patreonrewardsreload_cmd" xml:space="preserve">
<value>parewrel</value>
</data>
<data name="patreonrewardsreload_desc" xml:space="preserve">
<value>Forces the update of the list of patrons who are eligible for the reward.</value>
</data>
<data name="patreonrewardsreload_usage" xml:space="preserve">
<value>`{0}parewrel`</value>
</data>
<data name="shopadd_cmd" xml:space="preserve">
<value>shopadd</value>
</data>
<data name="shopadd_desc" xml:space="preserve">
<value>Adds an item to the shop by specifying type price and name. Available types are role and list.</value>
</data>
<data name="shopadd_usage" xml:space="preserve">
<value>`{0}shopadd role 1000 Rich`</value>
</data>
<data name="shopremove_cmd" xml:space="preserve">
<value>shoprem shoprm</value>
</data>
<data name="shopremove_desc" xml:space="preserve">
<value>Removes an item from the shop by its color.</value>
</data>
<data name="shop_cmd" xml:space="preserve">
<value>shop</value>
</data>
<data name="shop_desc" xml:space="preserve">
<value>Lists this server's administrators' shop. Paginated.</value>
</data>
<data name="shop_usage" xml:space="preserve">
<value>`{0}shop` or `{0}shop 2`</value>
</data>
<data name="rolehoist_cmd" xml:space="preserve">
<value>rolehoist rh</value>
</data>
<data name="rolehoist_desc" xml:space="preserve">
<value>Toggles if this role is displayed in the sidebar or not</value>
</data>
<data name="rolehoist_usage" xml:space="preserve">
<value>`{0}rh Guests true` or `{0}rh "Space Wizards" true</value>
</data>
<data name="buy_cmd" xml:space="preserve">
<value>buy</value>
</data>
<data name="buy_desc" xml:space="preserve">
<value>Buys an item from the shop on a given index. If buying items, make sure that the bot can DM you.</value>
</data>
<data name="buy_usage" xml:space="preserve">
<value>`{0}buy 2`</value>
</data>
<data name="gamevoicechannel_cmd" xml:space="preserve">
<value>gvc</value>
</data>
<data name="gamevoicechannel_desc" xml:space="preserve">
<value>Toggles game voice channel feature in the voice channel you're currently in. Users who join the game voice channel will get automatically redirected to the voice channel with the name of their current game, if it exists. Can't move users to channels that the bot has no connect permission for. One per server.</value>
</data>
<data name="gamevoicechannel_usage" xml:space="preserve">
<value>`{0}gvc`</value>
</data>
<data name="shoplistadd_cmd" xml:space="preserve">
<value>shoplistadd</value>
</data>
<data name="shoplistadd_desc" xml:space="preserve">
<value>Adds an item to the list of items for sale in the shop entry given the index. You usually want to run this command in the secret channel, so that the unique items are not leaked.</value>
</data>
<data name="shoplistadd_usage" xml:space="preserve">
<value>`{0}shoplistadd 1 Uni-que-Steam-Key`</value>
</data>
<data name="shopremove_usage" xml:space="preserve">
<value>`{0}shoprm 1`</value>
</data>
<data name="gcmd_cmd" xml:space="preserve">
<value>globalcommand gcmd</value>
</data>
<data name="gcmd_desc" xml:space="preserve">
<value>Enables or disables a command from use on all servers.</value>
</data>
<data name="gcmd_usage" xml:space="preserve">
<value>`{0}gcmd `</value>
</data>
<data name="gmod_cmd" xml:space="preserve">
<value>globalmodule gmod</value>
</data>
<data name="gmod_desc" xml:space="preserve">
<value>Enable or disable a module from use on all servers.</value>
</data>
<data name="gmod_usage" xml:space="preserve">
<value>`{0}gmod nsfw disable`</value>
</data>
<data name="lgp_cmd" xml:space="preserve">
<value>listglobalperms lgp</value>
</data>
<data name="lgp_desc" xml:space="preserve">
<value>Lists global permissions set by the bot owner.</value>
</data>
<data name="lgp_usage" xml:space="preserve">
<value>`{0}lgp`</value>
</data>
<data name="resetglobalpermissions_cmd" xml:space="preserve">
<value>resetglobalperms</value>
</data>
<data name="resetglobalpermissions_desc" xml:space="preserve">
<value>Resets global permissions set by bot owner.</value>
</data>
<data name="resetglobalpermissions_usage" xml:space="preserve">
<value>`{0}resetglobalperms`</value>
</data>
</root> </root>

View File

@ -231,6 +231,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Channel.
/// </summary>
public static string administration_channel {
get {
return ResourceManager.GetString("administration_channel", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Cleaned up.. /// Looks up a localized string similar to Cleaned up..
/// </summary> /// </summary>
@ -240,6 +249,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Command Text.
/// </summary>
public static string administration_command_text {
get {
return ResourceManager.GetString("administration_command_text", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Content. /// Looks up a localized string similar to Content.
/// </summary> /// </summary>
@ -393,6 +411,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Global permissions have been reset..
/// </summary>
public static string administration_global_perms_reset {
get {
return ResourceManager.GetString("administration_global_perms_reset", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Greet announcements disabled.. /// Looks up a localized string similar to Greet announcements disabled..
/// </summary> /// </summary>
@ -501,6 +528,24 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Game Voice Channel feature has been disabled on this server..
/// </summary>
public static string administration_gvc_disabled {
get {
return ResourceManager.GetString("administration_gvc_disabled", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} is a Game Voice Channel now..
/// </summary>
public static string administration_gvc_enabled {
get {
return ResourceManager.GetString("administration_gvc_enabled", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to You can&apos;t use this command on users with a role higher or equal to yours in the role hierarchy.. /// Looks up a localized string similar to You can&apos;t use this command on users with a role higher or equal to yours in the role hierarchy..
/// </summary> /// </summary>
@ -556,6 +601,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Kicked.
/// </summary>
public static string administration_kicked_pl {
get {
return ResourceManager.GetString("administration_kicked_pl", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to User kicked. /// Looks up a localized string similar to User kicked.
/// </summary> /// </summary>
@ -736,6 +790,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Moderator.
/// </summary>
public static string administration_moderator {
get {
return ResourceManager.GetString("administration_moderator", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to {0} moved from {1} to {2}. /// Looks up a localized string similar to {0} moved from {1} to {2}.
/// </summary> /// </summary>
@ -880,6 +943,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to You are not in voice channel on this server..
/// </summary>
public static string administration_not_in_voice {
get {
return ResourceManager.GetString("administration_not_in_voice", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Old message. /// Looks up a localized string similar to Old message.
/// </summary> /// </summary>
@ -907,6 +979,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to page {0}.
/// </summary>
public static string administration_page {
get {
return ResourceManager.GetString("administration_page", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Error. Most likely I don&apos;t have sufficient permissions.. /// Looks up a localized string similar to Error. Most likely I don&apos;t have sufficient permissions..
/// </summary> /// </summary>
@ -1060,6 +1141,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Reason.
/// </summary>
public static string administration_reason {
get {
return ResourceManager.GetString("administration_reason", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Successfully removed role {0} from user {1}. /// Looks up a localized string similar to Successfully removed role {0} from user {1}.
/// </summary> /// </summary>
@ -1114,6 +1204,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Set the display of guild role {0} to {1}..
/// </summary>
public static string administration_rh {
get {
return ResourceManager.GetString("administration_rh", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Role {0} as been added to the list.. /// Looks up a localized string similar to Role {0} as been added to the list..
/// </summary> /// </summary>
@ -1206,6 +1305,33 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to New startup command added..
/// </summary>
public static string administration_scadd {
get {
return ResourceManager.GetString("administration_scadd", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Startup command successfully removed..
/// </summary>
public static string administration_scrm {
get {
return ResourceManager.GetString("administration_scrm", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Startup command not found..
/// </summary>
public static string administration_scrm_fail {
get {
return ResourceManager.GetString("administration_scrm_fail", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to You already have {0} role.. /// Looks up a localized string similar to You already have {0} role..
/// </summary> /// </summary>
@ -1305,6 +1431,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Server.
/// </summary>
public static string administration_server {
get {
return ResourceManager.GetString("administration_server", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to New avatar set!. /// Looks up a localized string similar to New avatar set!.
/// </summary> /// </summary>
@ -1423,7 +1558,43 @@ namespace NadekoBot.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to soft-banned (kicked). /// Looks up a localized string similar to Slowmode will now ignore {0} role..
/// </summary>
public static string administration_slowmodewl_role_start {
get {
return ResourceManager.GetString("administration_slowmodewl_role_start", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Slowmode will no longer ignore {0} role..
/// </summary>
public static string administration_slowmodewl_role_stop {
get {
return ResourceManager.GetString("administration_slowmodewl_role_stop", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Slowmode will now ignore user {0}..
/// </summary>
public static string administration_slowmodewl_user_start {
get {
return ResourceManager.GetString("administration_slowmodewl_user_start", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Slowmode will no longer ignore user {0}..
/// </summary>
public static string administration_slowmodewl_user_stop {
get {
return ResourceManager.GetString("administration_slowmodewl_user_stop", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to soft-banned.
/// </summary> /// </summary>
public static string administration_soft_banned_pl { public static string administration_soft_banned_pl {
get { get {
@ -1459,6 +1630,24 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to No startup commands on this page..
/// </summary>
public static string administration_startcmdlist_none {
get {
return ResourceManager.GetString("administration_startcmdlist_none", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cleared all startup commands..
/// </summary>
public static string administration_startcmds_cleared {
get {
return ResourceManager.GetString("administration_startcmds_cleared", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Text channel created.. /// Looks up a localized string similar to Text channel created..
/// </summary> /// </summary>
@ -1477,6 +1666,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to User {0} has been unbanned..
/// </summary>
public static string administration_unbanned_user {
get {
return ResourceManager.GetString("administration_unbanned_user", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Undeafen successful.. /// Looks up a localized string similar to Undeafen successful..
/// </summary> /// </summary>
@ -1558,6 +1756,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to User not found..
/// </summary>
public static string administration_user_not_found {
get {
return ResourceManager.GetString("administration_user_not_found", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to User&apos;s role added. /// Looks up a localized string similar to User&apos;s role added.
/// </summary> /// </summary>
@ -1648,6 +1855,24 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to User {0} has been warned..
/// </summary>
public static string administration_user_warned {
get {
return ResourceManager.GetString("administration_user_warned", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to User {0} has been warned and {1} punishment has been applied..
/// </summary>
public static string administration_user_warned_and_punished {
get {
return ResourceManager.GetString("administration_user_warned_and_punished", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Username. /// Looks up a localized string similar to Username.
/// </summary> /// </summary>
@ -1765,6 +1990,96 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to cleared by {0}.
/// </summary>
public static string administration_warn_cleared_by {
get {
return ResourceManager.GetString("administration_warn_cleared_by", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Warning punishment list.
/// </summary>
public static string administration_warn_punish_list {
get {
return ResourceManager.GetString("administration_warn_punish_list", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Having {0} warnings will no longer trigger a punishment..
/// </summary>
public static string administration_warn_punish_rem {
get {
return ResourceManager.GetString("administration_warn_punish_rem", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to I will apply {0} punishment to users with {1} warnings..
/// </summary>
public static string administration_warn_punish_set {
get {
return ResourceManager.GetString("administration_warn_punish_set", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Warned on {0} server.
/// </summary>
public static string administration_warned_on {
get {
return ResourceManager.GetString("administration_warned_on", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to On {0} at {1} by {2}.
/// </summary>
public static string administration_warned_on_by {
get {
return ResourceManager.GetString("administration_warned_on_by", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to All warnings have been cleared for {0}..
/// </summary>
public static string administration_warnings_cleared {
get {
return ResourceManager.GetString("administration_warnings_cleared", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No warning on this page..
/// </summary>
public static string administration_warnings_none {
get {
return ResourceManager.GetString("administration_warnings_none", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Warnlog for {0}.
/// </summary>
public static string administration_warnlog_for {
get {
return ResourceManager.GetString("administration_warnlog_for", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No punishments set..
/// </summary>
public static string administration_warnpl_none {
get {
return ResourceManager.GetString("administration_warnpl_none", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to User {0} from text chat. /// Looks up a localized string similar to User {0} from text chat.
/// </summary> /// </summary>
@ -2440,6 +2755,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Item.
/// </summary>
public static string gambling_item {
get {
return ResourceManager.GetString("gambling_item", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Leaderboard. /// Looks up a localized string similar to Leaderboard.
/// </summary> /// </summary>
@ -2485,6 +2809,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Name.
/// </summary>
public static string gambling_name {
get {
return ResourceManager.GetString("gambling_name", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to No more cards in the deck.. /// Looks up a localized string similar to No more cards in the deck..
/// </summary> /// </summary>
@ -2521,6 +2854,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Out of stock..
/// </summary>
public static string gambling_out_of_stock {
get {
return ResourceManager.GetString("gambling_out_of_stock", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to page {0}. /// Looks up a localized string similar to page {0}.
/// </summary> /// </summary>
@ -2566,6 +2908,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Random unique item..
/// </summary>
public static string gambling_random_unique_item {
get {
return ResourceManager.GetString("gambling_random_unique_item", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to You rolled {0}.. /// Looks up a localized string similar to You rolled {0}..
/// </summary> /// </summary>
@ -2584,6 +2935,141 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Shop.
/// </summary>
public static string gambling_shop {
get {
return ResourceManager.GetString("gambling_shop", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Error DMing item. You&apos;ve been refunded..
/// </summary>
public static string gambling_shop_buy_error {
get {
return ResourceManager.GetString("gambling_shop_buy_error", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Shop item added.
/// </summary>
public static string gambling_shop_item_add {
get {
return ResourceManager.GetString("gambling_shop_item_add", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No item on that index found..
/// </summary>
public static string gambling_shop_item_not_found {
get {
return ResourceManager.GetString("gambling_shop_item_not_found", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Item purchase successful..
/// </summary>
public static string gambling_shop_item_purchase {
get {
return ResourceManager.GetString("gambling_shop_item_purchase", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Shop item removed.
/// </summary>
public static string gambling_shop_item_rm {
get {
return ResourceManager.GetString("gambling_shop_item_rm", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to That shop entry does not support item adding..
/// </summary>
public static string gambling_shop_item_wrong_type {
get {
return ResourceManager.GetString("gambling_shop_item_wrong_type", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Item successfully added..
/// </summary>
public static string gambling_shop_list_item_added {
get {
return ResourceManager.GetString("gambling_shop_list_item_added", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to That item is already added..
/// </summary>
public static string gambling_shop_list_item_not_unique {
get {
return ResourceManager.GetString("gambling_shop_list_item_not_unique", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No shop items found on this page..
/// </summary>
public static string gambling_shop_none {
get {
return ResourceManager.GetString("gambling_shop_none", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Purchase on {0} server.
/// </summary>
public static string gambling_shop_purchase {
get {
return ResourceManager.GetString("gambling_shop_purchase", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You will get {0} role..
/// </summary>
public static string gambling_shop_role {
get {
return ResourceManager.GetString("gambling_shop_role", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Role which is being sold no longer exists..
/// </summary>
public static string gambling_shop_role_not_found {
get {
return ResourceManager.GetString("gambling_shop_role_not_found", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You&apos;ve successfully purchased {0} role..
/// </summary>
public static string gambling_shop_role_purchase {
get {
return ResourceManager.GetString("gambling_shop_role_purchase", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Error assigning role. Your purchase has been refunded..
/// </summary>
public static string gambling_shop_role_purchase_error {
get {
return ResourceManager.GetString("gambling_shop_role_purchase_error", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Bet. /// Looks up a localized string similar to Bet.
/// </summary> /// </summary>
@ -2702,6 +3188,24 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Type.
/// </summary>
public static string gambling_type {
get {
return ResourceManager.GetString("gambling_type", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} unique items left..
/// </summary>
public static string gambling_unique_items_left {
get {
return ResourceManager.GetString("gambling_unique_items_left", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to your affinity is already set to that waifu or you&apos;re trying to remove your affinity while not having one.. /// Looks up a localized string similar to your affinity is already set to that waifu or you&apos;re trying to remove your affinity while not having one..
/// </summary> /// </summary>
@ -4216,6 +4720,24 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Blocked Commands.
/// </summary>
public static string permissions_blocked_commands {
get {
return ResourceManager.GetString("permissions_blocked_commands", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Blocked Modules.
/// </summary>
public static string permissions_blocked_modules {
get {
return ResourceManager.GetString("permissions_blocked_modules", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Command {0} now has a {1}s cooldown.. /// Looks up a localized string similar to Command {0} now has a {1}s cooldown..
/// </summary> /// </summary>
@ -4306,6 +4828,42 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Command {0} has been disabled on all servers..
/// </summary>
public static string permissions_gcmd_add {
get {
return ResourceManager.GetString("permissions_gcmd_add", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Command {0} has been enabled on all servers..
/// </summary>
public static string permissions_gcmd_remove {
get {
return ResourceManager.GetString("permissions_gcmd_remove", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Module {0} has been disabled on all servers..
/// </summary>
public static string permissions_gmod_add {
get {
return ResourceManager.GetString("permissions_gmod_add", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Module {0} has been enabled on all servers..
/// </summary>
public static string permissions_gmod_remove {
get {
return ResourceManager.GetString("permissions_gmod_remove", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Invalid second parameter.(Must be a number between {0} and {1}). /// Looks up a localized string similar to Invalid second parameter.(Must be a number between {0} and {1}).
/// </summary> /// </summary>
@ -4351,6 +4909,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to No blocked commands or modules..
/// </summary>
public static string permissions_lgp_none {
get {
return ResourceManager.GetString("permissions_lgp_none", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Moved permission {0} from #{1} to #{2}. /// Looks up a localized string similar to Moved permission {0} from #{1} to #{2}.
/// </summary> /// </summary>
@ -5503,6 +6070,15 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Time in {0} is {1} - {2}.
/// </summary>
public static string searches_time {
get {
return ResourceManager.GetString("searches_time", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Title:. /// Looks up a localized string similar to Title:.
/// </summary> /// </summary>
@ -5755,6 +6331,114 @@ namespace NadekoBot.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Failed claiming rewards due to one of the following reasons:.
/// </summary>
public static string utility_clpa_fail {
get {
return ResourceManager.GetString("utility_clpa_fail", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Maybe you&apos;ve already received your reward for this month. You can receive rewards only once a month unless you increase your pledge..
/// </summary>
public static string utility_clpa_fail_already {
get {
return ResourceManager.GetString("utility_clpa_fail_already", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Already rewarded.
/// </summary>
public static string utility_clpa_fail_already_title {
get {
return ResourceManager.GetString("utility_clpa_fail_already_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Your discord account might not be connected to Patreon. If you are unsure what that means, or don&apos;t know how to connect it - you have to go to [Patreon account settings page](https://patreon.com/settings/account) and click &apos;Connect to discord&apos; button..
/// </summary>
public static string utility_clpa_fail_conn {
get {
return ResourceManager.GetString("utility_clpa_fail_conn", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Discord account not connected.
/// </summary>
public static string utility_clpa_fail_conn_title {
get {
return ResourceManager.GetString("utility_clpa_fail_conn_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to In order to be eligible for the reward, you must support the project on patreon. You can use {0} command to get the link..
/// </summary>
public static string utility_clpa_fail_sup {
get {
return ResourceManager.GetString("utility_clpa_fail_sup", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Not supporting.
/// </summary>
public static string utility_clpa_fail_sup_title {
get {
return ResourceManager.GetString("utility_clpa_fail_sup_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You have to wait a few hours after making your pledge, if you didn&apos;t, try again later..
/// </summary>
public static string utility_clpa_fail_wait {
get {
return ResourceManager.GetString("utility_clpa_fail_wait", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Wait some time.
/// </summary>
public static string utility_clpa_fail_wait_title {
get {
return ResourceManager.GetString("utility_clpa_fail_wait_title", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Next update in {0}.
/// </summary>
public static string utility_clpa_next_update {
get {
return ResourceManager.GetString("utility_clpa_next_update", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You&apos;ve received {0} Thanks for supporting the project!.
/// </summary>
public static string utility_clpa_success {
get {
return ResourceManager.GetString("utility_clpa_success", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Rewards can be claimed on or after 5th of each month..
/// </summary>
public static string utility_clpa_too_early {
get {
return ResourceManager.GetString("utility_clpa_too_early", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Commands ran. /// Looks up a localized string similar to Commands ran.
/// </summary> /// </summary>
@ -6129,7 +6813,7 @@ namespace NadekoBot.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to No quotes on this page.. /// Looks up a localized string similar to No quotes found matching the quote ID specified..
/// </summary> /// </summary>
public static string utility_quotes_page_none { public static string utility_quotes_page_none {
get { get {

File diff suppressed because it is too large Load Diff

View File

@ -760,7 +760,8 @@ Grund: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>soft-banned (gekickt)</value> <value>soft-banned (gekickt)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} wird diesen Kanal ignorieren.</value> <value>{0} wird diesen Kanal ignorieren.</value>
@ -2387,5 +2388,131 @@ ID des Besitzers: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Kompetetive Spielzeit</value> <value>Kompetetive Spielzeit</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Kanal</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Befehls Text</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Kicked</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderator</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>Seite {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Grund</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Neuer Startbefehl hinzugefügt.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Startbefehl wurde erfolgreich entfernt.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Startbefehl konnte nicht gefunden werden</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Server</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Keine Startbefehle auf dieser Seite</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Alle Startbefehle wurden entfernt.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>Benutzer {0} wurde entbannt.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Benutzer nicht gefunden.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>Benutzer {0} wurde gewarnt.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>Benutzer {0} wurde gewarnt und Strafe {1} wurde ausgeführt.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Gewarnt auf dem Server {0}</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>Am {0} um {1} von {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Alle Warnungen wurden bereinigt für {0}.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>Keine Warnungen auf dieser Seite.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Warnlog für {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Keine Bestrafungen gesetzt.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>Bereinigt bei {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Warnungs Straf Liste</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>{0} Warnungen werden nicht mehr eine Bestrafung auslösen.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>Ich werde die Bestrafung {0} an Benutzern mit {1} Warnungen ausführen.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Slow mode wird jetzt die Rolle {0} ignorieren.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Slow mode wird nicht mehr die Rolle {0} ignorieren.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Slow mod witrd jetzt den Benutzer {0} ignorieren.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Slow mod witrd nicht mehr Benutzer {0} ignorieren.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Belohnungen konnten nicht beansprucht werden wegen einer dieser Gründe:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Eventuell haben Sie ihre Belohnung für diesen Monat schon bekommen. Sie können Belohnungen nur einmal pro Monat beanspruchen, außer sie erhören ihre Unterstützung.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Belohnung schon beansprucht</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Ihr Discord Account ist eventuell nicht mit Patreon verbunden. Wenn Sie unsicher sind was dies bedeutet, oder nicht wissen wie man es verbinded - Sie müssen zu der [Patreon Account Einstellungs Seite](https://patreon.com/settings/account) gehen und den &apos;Zu Discord verbinden&apos; Knopf betätigen.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord Account nicht verbunden</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>Um berechtigt für die Belohnung zu sein, müssen Sie das Projekt auf Patreon unterstützen. Sie können den Befehl {0} benutzen um den Link zu kriegen.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Keine Unterstützung</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Sie müssen ein paar Stunden warten nachdem sie ihre Unterstützung zusagenl, falls Sie das nicht getan haben, versuchen Sie es später erneut.</value>
<comment>Fuzzy</comment>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Bitte warten Sie eine weile</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Sie haben {0} erhalten. Danke für das unterstützen des Projektes!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Belohnungen können am or nach dem fünften tag jedes Monats beansprucht werden.</value>
</data>
</root> </root>

View File

@ -740,7 +740,7 @@ Reason: {1}</value>
<value>Slow mode initiated</value> <value>Slow mode initiated</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>soft-banned (kicked)</value> <value>soft-banned</value>
<comment>PLURAL</comment> <comment>PLURAL</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
@ -2278,5 +2278,129 @@ Owner ID: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Competitive playtime</value> <value>Competitive playtime</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Channel</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Command Text</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Kicked</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderator</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>page {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Reason</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>New startup command added.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Startup command successfully removed.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Startup command not found.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Server</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>No startup commands on this page.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Cleared all startup commands.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>User {0} has been unbanned.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>User not found.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>User {0} has been warned.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>User {0} has been warned and {1} punishment has been applied.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Warned on {0} server</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>On {0} at {1} by {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>All warnings have been cleared for {0}.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>No warning on this page.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Warnlog for {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>No punishments set.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>cleared by {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Warning punishment list</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Having {0} warnings will no longer trigger a punishment.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>I will apply {0} punishment to users with {1} warnings.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Slowmode will now ignore {0} role.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Slowmode will no longer ignore {0} role.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Slowmode will now ignore user {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Slowmode will no longer ignore user {0}.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Failed claiming rewards due to one of the following reasons:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Maybe you&apos;ve already received your reward for this month. You can receive rewards only once a month unless you increase your pledge.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Already rewarded</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Your discord account might not be connected to Patreon. If you are unsure what that means, or don&apos;t know how to connect it - you have to go to [Patreon account settings page](https://patreon.com/settings/account) and click &apos;Connect to discord&apos; button.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord account not connected</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>In order to be eligible for the reward, you must support the project on patreon. You can use {0} command to get the link.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Not supporting</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>You have to wait a few hours after making your pledge, if you didn&apos;t, try again later.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Wait some time</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>You&apos;ve received {0} Thanks for supporting the project!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Rewards can be claimed on or after 5th of each month.</value>
</data>
</root> </root>

View File

@ -741,8 +741,9 @@ Razón: {1}</value>
<value>Modo lento iniciado</value> <value>Modo lento iniciado</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>advertido (expulsado)</value> <value>advertidos (expulsado)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} ignorará este canal.</value> <value>{0} ignorará este canal.</value>
@ -2277,5 +2278,129 @@ IDs de dueños: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Tiempo de juego en competitivo</value> <value>Tiempo de juego en competitivo</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Canal</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Comando de texto</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Expulsados</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderador</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>Página {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Razón</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Nuevo comando de inicio añadido.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Comando de inicio removido satisfactoriamente.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Comando de inicio no encontrado.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Servidor</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>No hay comandos de inicio en esta página.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Reiniciados todos los comandos de inicio.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>El usuario {0} ha sido desbloqueado.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>No encuentro tal usuario.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>El usuario {0} ha sido advertido.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>El usuario {0} ha sido advertido y el castigo {0} ha sido aplicado.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Advertido en el servidor {0}</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>El {0} a las {1} por {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Todas las advertencias han sido reiniciadas por {0}.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>No hay advertencias en esta página.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Registro de advertencias para {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>No hay castigos configurados.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>Reiniciados por {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Lista de castigos de advertencia</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Tener {0} advertencias ya no ejecutará un castigo.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>Aplicaré el castigo {0} a los usuarios con {1} advertecias.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>El modo lento ahora ignorará el rol {0}.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>El modo lento ya no ignorará el rol {0}.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>El modo lento ignorará al usuario {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>El modo lento ya no ignorará al usuario {0}.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Imposible reclamar recompensas debido a una de las siguientes razones:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Tal vez ya has recibido tu recompensa de este mes. Puedes recibir recompensa solo una vez cada mes a menos que incrementes el monto.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Ya recompensado</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Puede que tu cuenta de Discord no esté conectada a Patreon. Si no estás seguro de lo que significa, o no sabes cómo conectarla, tienes que ir a la página de configuración de Patreon (https://patreon.com/settings/account) y presionar el botón de &apos;conectar a Discord&apos;.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Cuenta de Discord no conectada.</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>Para elegir una recompensa, debes apoyar el proyecto en Patreon. Puedes usar el comando {0} para obtener el enlace.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>No apoyando</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Tienes que esperar algunas horas después de hacer tu colaboración, sino, trata otra vez más tarde.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Espera un tiempo</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Has recibido {0} ¡Gracias por apoyar el proyecto!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Las recompensas pueden ser reclamadas el día 5 de cada mes.</value>
</data>
</root> </root>

View File

@ -748,7 +748,8 @@ Raison: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>expulsés (kick)</value> <value>expulsés (kick)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} ignorera ce Salon.</value> <value>{0} ignorera ce Salon.</value>
@ -757,7 +758,7 @@ Raison: {1}</value>
<value>{0} n&apos;ignorera plus ce Salon.</value> <value>{0} n&apos;ignorera plus ce Salon.</value>
</data> </data>
<data name="administration_spam_stats" xml:space="preserve"> <data name="administration_spam_stats" xml:space="preserve">
<value>Si un utilisateur poste {0} le même message à la suite, je le {1}. <value>Si un utilisateur poste {0} fois le même message à la suite, je le {1}.
__SalonsIgnorés__: {2}</value> __SalonsIgnorés__: {2}</value>
</data> </data>
<data name="administration_text_chan_created" xml:space="preserve"> <data name="administration_text_chan_created" xml:space="preserve">
@ -1432,7 +1433,7 @@ La nouvelle valeur de {0} est {1} !</value>
<value>Aucune liste de lecture ne correspond a cet ID.</value> <value>Aucune liste de lecture ne correspond a cet ID.</value>
</data> </data>
<data name="music_playlist_queue_complete" xml:space="preserve"> <data name="music_playlist_queue_complete" xml:space="preserve">
<value>File d&apos;attente de la liste complétée.</value> <value>Liste de lecture ajoutée à la file d&apos;attente.</value>
</data> </data>
<data name="music_playlist_saved" xml:space="preserve"> <data name="music_playlist_saved" xml:space="preserve">
<value>Liste de lecture sauvegardée</value> <value>Liste de lecture sauvegardée</value>
@ -2291,7 +2292,7 @@ ID du propriétaire: {2}</value>
<value>{0} sera maintenant l&apos;alias de {1}.</value> <value>{0} sera maintenant l&apos;alias de {1}.</value>
</data> </data>
<data name="utility_alias_list" xml:space="preserve"> <data name="utility_alias_list" xml:space="preserve">
<value>Liste des alias.</value> <value>Liste des alias</value>
</data> </data>
<data name="utility_alias_removed" xml:space="preserve"> <data name="utility_alias_removed" xml:space="preserve">
<value>{0} n&apos;a plus d&apos;alias.</value> <value>{0} n&apos;a plus d&apos;alias.</value>
@ -2302,5 +2303,130 @@ ID du propriétaire: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Temps en jeu compétitif.</value> <value>Temps en jeu compétitif.</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Salon</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Texte de la commande.</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Expulsés</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Modérateur</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>Page {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Raison</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Nouvelle commande au démarrage ajoutée.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Commande au démarrage retirée.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Commande au démarrage introuvable.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Serveur</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Aucune commande de démarrage sur cette page.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Toutes les commandes au démarrage ont été retirées.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>L&apos;utilisateur {0} a été débanni.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Utilisateur introuvable.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>L&apos;utilisateur {0} a été averti.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>L&apos;utilisateur {0} a été averti et la punition {1} a été appliquée.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Averti sur le serveur {0}</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>Le {0} à {1} par {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Tous les avertissements ont été effacés pour {0}.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>Pas d&apos;avertissement sur cette page.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Log d&apos;avertissement pour {0}</value>
<comment>Log ou historique ?</comment>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Pas de punition définie.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>Effacé par {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Liste des avertissements de punitions.</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Avoir {0} avertissements ne déclenche plus de punition.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>J&apos;appliquerai seulement la punition {0} aux utilisateurs ayant {1} avertissements.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Le mode lent ignorera le rôle {0}.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Le mode lent n&apos;ignorera plus le rôle {0}.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Le mode lent ignorera l&apos;utilisateur {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Le mode lent n&apos;ignorera plus l&apos;utilisateur {0}.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Échec de la réclamation des récompenses à cause d&apos;une des raisons suivantes:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Vous avez peut-être déjà reçu votre récompense mensuelle. Vous ne pouvez recevoir qu&apos;une récompense mensuelle sauf si vous augmentez votre engagement.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Déjà récompensé.</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Votre compte Discord n&apos;est peut-être pas connecté à Patreon. Si vous n&apos;êtes pas sur de ce que ça veut dire, ou ne savez pas comment le connecter, vous devez aller à la [Page de configuration du compte Patreon](https://patreon.com/settings/account) et cliquer sur &apos;Connect to discord&apos;.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Le compte Discord n&apos;est pas connecté</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>Pour être éligible à la récompense, vous devez supporter le projet sur Patreon. Vous pouvez utiliser la commande {0} afin d&apos;avoir le lien.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Ne supporte pas.</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Vous devez attendre quelques heures après avoir fait votre engagement, si ce n&apos;est pas le cas, réessayez plus tard.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Attendez quelque temps</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Vous avez reçu {0}. Merci de supporter le projet!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Les récompenses peuvent être réclamés le 5e du mois ou après.</value>
</data>
</root> </root>

View File

@ -130,13 +130,13 @@
<value>הבסיס #{0} **הושמד** במלחמה נגד {1}</value> <value>הבסיס #{0} **הושמד** במלחמה נגד {1}</value>
</data> </data>
<data name="clashofclans_base_unclaimed" xml:space="preserve"> <data name="clashofclans_base_unclaimed" xml:space="preserve">
<value></value> <value>{0} **שיחרר** את בסיס #{0} במלחמה נגד {2}</value>
</data> </data>
<data name="clashofclans_claimed_base" xml:space="preserve"> <data name="clashofclans_claimed_base" xml:space="preserve">
<value></value> <value>{0} תפס את בסיס #{1} במלחמה נגד {2}</value>
</data> </data>
<data name="clashofclans_claimed_other" xml:space="preserve"> <data name="clashofclans_claimed_other" xml:space="preserve">
<value></value> <value>@{0} אתה כבר תפסת את בסיס #{1}. אינך יכול לתפוס אחד חדש</value>
</data> </data>
<data name="clashofclans_claim_expired" xml:space="preserve"> <data name="clashofclans_claim_expired" xml:space="preserve">
<value></value> <value></value>
@ -214,7 +214,7 @@
<value>תגובה</value> <value>תגובה</value>
</data> </data>
<data name="customreactions_stats" xml:space="preserve"> <data name="customreactions_stats" xml:space="preserve">
<value></value> <value>נתוני תגובות מותאמות</value>
</data> </data>
<data name="customreactions_stats_cleared" xml:space="preserve"> <data name="customreactions_stats_cleared" xml:space="preserve">
<value></value> <value></value>
@ -226,7 +226,7 @@
<value></value> <value></value>
</data> </data>
<data name="nsfw_autohentai_stopped" xml:space="preserve"> <data name="nsfw_autohentai_stopped" xml:space="preserve">
<value></value> <value>אוטוהנטאי הפסיק</value>
</data> </data>
<data name="nsfw_not_found" xml:space="preserve"> <data name="nsfw_not_found" xml:space="preserve">
<value>לא נמצאו תוצאות.</value> <value>לא נמצאו תוצאות.</value>
@ -299,10 +299,10 @@
<value>את\ה התעלפת אז את\ה לא יכול לזוז.</value> <value>את\ה התעלפת אז את\ה לא יכול לזוז.</value>
</data> </data>
<data name="administration_aar_disabled" xml:space="preserve"> <data name="administration_aar_disabled" xml:space="preserve">
<value></value> <value>**נתינת תפקיד אוטומטי** כאשר משתמש מתווסף **הופסקה** כעת.</value>
</data> </data>
<data name="administration_aar_enabled" xml:space="preserve"> <data name="administration_aar_enabled" xml:space="preserve">
<value></value> <value>**נתינת תפקיד אוטומטי** כאשר משתמש מתווסף **התחילה** כעת.</value>
</data> </data>
<data name="administration_attachments" xml:space="preserve"> <data name="administration_attachments" xml:space="preserve">
<value>קבצים מצורפים </value> <value>קבצים מצורפים </value>
@ -412,10 +412,10 @@
<value>אני אפסיק להעביר את ההודאות הפרטיות מעכשיו.</value> <value>אני אפסיק להעביר את ההודאות הפרטיות מעכשיו.</value>
</data> </data>
<data name="administration_greetdel_off" xml:space="preserve"> <data name="administration_greetdel_off" xml:space="preserve">
<value></value> <value>מחיקה אוטומטית של הודאות ברכה הופסקה.</value>
</data> </data>
<data name="administration_greetdel_on" xml:space="preserve"> <data name="administration_greetdel_on" xml:space="preserve">
<value></value> <value>הודאות </value>
</data> </data>
<data name="administration_greetdmmsg_cur" xml:space="preserve"> <data name="administration_greetdmmsg_cur" xml:space="preserve">
<value>הודאה פרטית נוכחית: {0}</value> <value>הודאה פרטית נוכחית: {0}</value>
@ -442,10 +442,10 @@
<value></value> <value></value>
</data> </data>
<data name="administration_greet_off" xml:space="preserve"> <data name="administration_greet_off" xml:space="preserve">
<value></value> <value>הודאות ברכה בוטלו.</value>
</data> </data>
<data name="administration_greet_on" xml:space="preserve"> <data name="administration_greet_on" xml:space="preserve">
<value></value> <value>הודאות ברכה הופעלו עבור ערוץ זה.</value>
</data> </data>
<data name="administration_hierarchy" xml:space="preserve"> <data name="administration_hierarchy" xml:space="preserve">
<value>אתה לא יכול להשתמש בפקודה זו על משתמשים עם תפקיד שווה או גבוהה ממך בדירוג.</value> <value>אתה לא יכול להשתמש בפקודה זו על משתמשים עם תפקיד שווה או גבוהה ממך בדירוג.</value>
@ -740,7 +740,8 @@
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>הסרה קלה (גורש)</value> <value>הסרה קלה (גורש)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} יתעלם מערוץ זה.</value> <value>{0} יתעלם מערוץ זה.</value>
@ -2272,5 +2273,129 @@
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value></value> <value></value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value></value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value></value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value></value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value></value>
</data>
<data name="administration_page" xml:space="preserve">
<value></value>
</data>
<data name="administration_reason" xml:space="preserve">
<value></value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value></value>
</data>
<data name="administration_server" xml:space="preserve">
<value></value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value></value>
</data>
</root> </root>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -905,7 +905,8 @@ Fuzzy</comment>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>ソフトバン(キック)</value> <value>ソフトバン(キック)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0}はこのチャンネルを無視します。</value> <value>{0}はこのチャンネルを無視します。</value>
@ -1388,97 +1389,113 @@ Paypal &lt;{1}&gt;
{0}の新しい値は{1}です!</value> {0}の新しい値は{1}です!</value>
</data> </data>
<data name="gambling_waifu_isnt_cheap" xml:space="preserve"> <data name="gambling_waifu_isnt_cheap" xml:space="preserve">
<value></value> <value>waifuは安いです。実際の値がより低い場合でも、waifuを取得するには少なくとも{0}を支払う必要があります。</value>
</data> </data>
<data name="gambling_waifu_not_enough" xml:space="preserve"> <data name="gambling_waifu_not_enough" xml:space="preserve">
<value></value> <value>あなたはwaifuを主張するために{0}以上支払う必要があります!
</value>
</data> </data>
<data name="gambling_waifu_not_yours" xml:space="preserve"> <data name="gambling_waifu_not_yours" xml:space="preserve">
<value></value> <value>そのwaifuはあなたのものではありません。
</value>
</data> </data>
<data name="gambling_waifu_not_yourself" xml:space="preserve"> <data name="gambling_waifu_not_yourself" xml:space="preserve">
<value></value> <value>あなたは自分自身を主張することはできません。
</value>
</data> </data>
<data name="gambling_waifu_recent_divorce" xml:space="preserve"> <data name="gambling_waifu_recent_divorce" xml:space="preserve">
<value></value> <value>あなたは最近離婚した。もう離婚するには{0}時間と{1}分待つ必要があります。
</value>
</data> </data>
<data name="gambling_nobody" xml:space="preserve"> <data name="gambling_nobody" xml:space="preserve">
<value></value> <value>誰も
</value>
</data> </data>
<data name="gambling_waifu_divorced_notlike" xml:space="preserve"> <data name="gambling_waifu_divorced_notlike" xml:space="preserve">
<value></value> <value>あなたはあなたを好きではない妖精と離婚しました。あなたは{0}戻ってきました。
</value>
</data> </data>
<data name="games_8ball" xml:space="preserve"> <data name="games_8ball" xml:space="preserve">
<value>エイトボール</value> <value>エイトボール</value>
</data> </data>
<data name="games_acrophobia" xml:space="preserve"> <data name="games_acrophobia" xml:space="preserve">
<value></value> <value>Acrophobia
</value>
</data> </data>
<data name="games_acro_ended_no_sub" xml:space="preserve"> <data name="games_acro_ended_no_sub" xml:space="preserve">
<value></value> <value>ゲームは提出なしで終了しました。</value>
</data> </data>
<data name="games_acro_no_votes_cast" xml:space="preserve"> <data name="games_acro_no_votes_cast" xml:space="preserve">
<value></value> <value>投票は行われません。ゲームは勝者なしで終了しました。
</value>
</data> </data>
<data name="games_acro_nym_was" xml:space="preserve"> <data name="games_acro_nym_was" xml:space="preserve">
<value></value> <value>頭字語は{0}でした。</value>
</data> </data>
<data name="games_acro_running" xml:space="preserve"> <data name="games_acro_running" xml:space="preserve">
<value></value> <value>Acrophobiaゲームは既にこのチャンネルで実行されています。
</value>
</data> </data>
<data name="games_acro_started" xml:space="preserve"> <data name="games_acro_started" xml:space="preserve">
<value></value> <value>ゲームが始まった。次の頭文字で{0}の文章を作成します。</value>
</data> </data>
<data name="games_acro_started_footer" xml:space="preserve"> <data name="games_acro_started_footer" xml:space="preserve">
<value></value> <value>投稿には{0}秒かかります。
</value>
</data> </data>
<data name="games_acro_submit" xml:space="preserve"> <data name="games_acro_submit" xml:space="preserve">
<value></value> <value>{0}はその文を提出しました。 {1}合計)
</value>
</data> </data>
<data name="games_acro_vote" xml:space="preserve"> <data name="games_acro_vote" xml:space="preserve">
<value>数字を入力して投票</value> <value>数字を入力して投票</value>
</data> </data>
<data name="games_acro_vote_cast" xml:space="preserve"> <data name="games_acro_vote_cast" xml:space="preserve">
<value></value> <value>{0}は投票をしました!
</value>
</data> </data>
<data name="games_acro_winner" xml:space="preserve"> <data name="games_acro_winner" xml:space="preserve">
<value></value> <value>勝者は{1}点で{0}です。
</value>
</data> </data>
<data name="games_acro_winner_only" xml:space="preserve"> <data name="games_acro_winner_only" xml:space="preserve">
<value></value> <value>{0}は投稿した唯一のユーザーであるための勝者です!</value>
</data> </data>
<data name="games_question" xml:space="preserve"> <data name="games_question" xml:space="preserve">
<value>質問</value> <value>質問</value>
</data> </data>
<data name="games_rps_draw" xml:space="preserve"> <data name="games_rps_draw" xml:space="preserve">
<value></value> <value>それはドローです!どちらも{0}</value>
</data> </data>
<data name="games_rps_win" xml:space="preserve"> <data name="games_rps_win" xml:space="preserve">
<value></value> <value>{0}が勝った! {1}が{2}を打つ</value>
</data> </data>
<data name="games_submissions_closed" xml:space="preserve"> <data name="games_submissions_closed" xml:space="preserve">
<value></value> <value>投稿が閉じられました
</value>
</data> </data>
<data name="gambling_animal_race_already_started" xml:space="preserve"> <data name="gambling_animal_race_already_started" xml:space="preserve">
<value></value> <value>動物レースはすでに実行中です。
</value>
</data> </data>
<data name="gambling_total_average" xml:space="preserve"> <data name="gambling_total_average" xml:space="preserve">
<value></value> <value>合計:{0}平均:{1}
</value>
</data> </data>
<data name="games_category" xml:space="preserve"> <data name="games_category" xml:space="preserve">
<value>カテゴリー</value> <value>カテゴリー</value>
</data> </data>
<data name="games_cleverbot_disabled" xml:space="preserve"> <data name="games_cleverbot_disabled" xml:space="preserve">
<value></value> <value>このサーバーではCleverbotは使えません。</value>
</data> </data>
<data name="games_cleverbot_enabled" xml:space="preserve"> <data name="games_cleverbot_enabled" xml:space="preserve">
<value>このサーバーではCleverbotが有効です。</value> <value>このサーバーではCleverbotが有効です。</value>
</data> </data>
<data name="games_curgen_disabled" xml:space="preserve"> <data name="games_curgen_disabled" xml:space="preserve">
<value></value> <value>このチャンネルでは現在の世代は使えなくなりました。</value>
</data> </data>
<data name="games_curgen_enabled" xml:space="preserve"> <data name="games_curgen_enabled" xml:space="preserve">
<value></value> <value>このチャンネルでは現在の世代は使えるようになりました。</value>
</data> </data>
<data name="games_curgen_pl" xml:space="preserve"> <data name="games_curgen_pl" xml:space="preserve">
<value></value> <value></value>
@ -1506,16 +1523,16 @@ Paypal &lt;{1}&gt;
<value></value> <value></value>
</data> </data>
<data name="games_leaderboard" xml:space="preserve"> <data name="games_leaderboard" xml:space="preserve">
<value></value> <value>リーダーボード</value>
</data> </data>
<data name="games_not_enough" xml:space="preserve"> <data name="games_not_enough" xml:space="preserve">
<value></value> <value>十分な {0} を持っていません。</value>
</data> </data>
<data name="games_no_results" xml:space="preserve"> <data name="games_no_results" xml:space="preserve">
<value></value> <value>結果はありません。</value>
</data> </data>
<data name="games_picked" xml:space="preserve"> <data name="games_picked" xml:space="preserve">
<value></value> <value> {0} をひろった。</value>
<comment>Kwoth picked 5*</comment> <comment>Kwoth picked 5*</comment>
</data> </data>
<data name="games_planted" xml:space="preserve"> <data name="games_planted" xml:space="preserve">
@ -1523,10 +1540,10 @@ Paypal &lt;{1}&gt;
<comment>Kwoth planted 5*</comment> <comment>Kwoth planted 5*</comment>
</data> </data>
<data name="games_trivia_already_running" xml:space="preserve"> <data name="games_trivia_already_running" xml:space="preserve">
<value></value> <value>Trivia gameはすでにこのサーバーで動いています。</value>
</data> </data>
<data name="games_trivia_game" xml:space="preserve"> <data name="games_trivia_game" xml:space="preserve">
<value></value> <value>Trivia game</value>
</data> </data>
<data name="games_trivia_guess" xml:space="preserve"> <data name="games_trivia_guess" xml:space="preserve">
<value></value> <value></value>
@ -1535,22 +1552,22 @@ Paypal &lt;{1}&gt;
<value></value> <value></value>
</data> </data>
<data name="games_trivia_points" xml:space="preserve"> <data name="games_trivia_points" xml:space="preserve">
<value></value> <value>{0} は {1} ポイント持っています。</value>
</data> </data>
<data name="games_trivia_stopping" xml:space="preserve"> <data name="games_trivia_stopping" xml:space="preserve">
<value></value> <value>この質問のあと停止します。</value>
</data> </data>
<data name="games_trivia_times_up" xml:space="preserve"> <data name="games_trivia_times_up" xml:space="preserve">
<value></value> <value>時間切れです。正解は {0} です。</value>
</data> </data>
<data name="games_trivia_win" xml:space="preserve"> <data name="games_trivia_win" xml:space="preserve">
<value></value> <value></value>
</data> </data>
<data name="games_ttt_against_yourself" xml:space="preserve"> <data name="games_ttt_against_yourself" xml:space="preserve">
<value></value> <value>あなた自身とはゲームできません。</value>
</data> </data>
<data name="games_ttt_already_running" xml:space="preserve"> <data name="games_ttt_already_running" xml:space="preserve">
<value></value> <value>TicTacToe ゲームはすでにこのサーバで動いています。</value>
</data> </data>
<data name="games_ttt_a_draw" xml:space="preserve"> <data name="games_ttt_a_draw" xml:space="preserve">
<value>引き分け</value> <value>引き分け</value>
@ -1562,7 +1579,7 @@ Paypal &lt;{1}&gt;
<value>{0} の勝ち!</value> <value>{0} の勝ち!</value>
</data> </data>
<data name="games_ttt_matched_three" xml:space="preserve"> <data name="games_ttt_matched_three" xml:space="preserve">
<value></value> <value>三回戦</value>
</data> </data>
<data name="games_ttt_no_moves" xml:space="preserve"> <data name="games_ttt_no_moves" xml:space="preserve">
<value></value> <value></value>
@ -1577,7 +1594,7 @@ Paypal &lt;{1}&gt;
<value></value> <value></value>
</data> </data>
<data name="music_attempting_to_queue" xml:space="preserve"> <data name="music_attempting_to_queue" xml:space="preserve">
<value></value> <value>キューに {0} 曲を適用しています。</value>
</data> </data>
<data name="music_autoplay_disabled" xml:space="preserve"> <data name="music_autoplay_disabled" xml:space="preserve">
<value>オートプレイは無効です。</value> <value>オートプレイは無効です。</value>
@ -1592,26 +1609,26 @@ Paypal &lt;{1}&gt;
<value>ディレクトリのキューが完了しました。</value> <value>ディレクトリのキューが完了しました。</value>
</data> </data>
<data name="music_fairplay" xml:space="preserve"> <data name="music_fairplay" xml:space="preserve">
<value></value> <value>フェアプレイ</value>
</data> </data>
<data name="music_finished_song" xml:space="preserve"> <data name="music_finished_song" xml:space="preserve">
<value>曲が終わった</value> <value>曲が終わった</value>
<comment>Fuzzy</comment> <comment>Fuzzy</comment>
</data> </data>
<data name="music_fp_disabled" xml:space="preserve"> <data name="music_fp_disabled" xml:space="preserve">
<value></value> <value>フェアプレイは無効です。</value>
</data> </data>
<data name="music_fp_enabled" xml:space="preserve"> <data name="music_fp_enabled" xml:space="preserve">
<value></value> <value>フェアプレイは有効です。</value>
</data> </data>
<data name="music_from_position" xml:space="preserve"> <data name="music_from_position" xml:space="preserve">
<value></value> <value>ポジションから</value>
</data> </data>
<data name="music_id" xml:space="preserve"> <data name="music_id" xml:space="preserve">
<value></value> <value>ID</value>
</data> </data>
<data name="music_invalid_input" xml:space="preserve"> <data name="music_invalid_input" xml:space="preserve">
<value></value> <value>不適切な入力。</value>
</data> </data>
<data name="music_max_playtime_none" xml:space="preserve"> <data name="music_max_playtime_none" xml:space="preserve">
<value>最大再生時間は制限ありません。</value> <value>最大再生時間は制限ありません。</value>
@ -1688,56 +1705,56 @@ Paypal &lt;{1}&gt;
<value>キュー( {0}/{0} ) はいっぱいです。</value> <value>キュー( {0}/{0} ) はいっぱいです。</value>
</data> </data>
<data name="music_removed_song" xml:space="preserve"> <data name="music_removed_song" xml:space="preserve">
<value></value> <value>削除された曲</value>
<comment>context: &quot;removed song #5&quot;</comment> <comment>context: &quot;removed song #5&quot;</comment>
</data> </data>
<data name="music_repeating_cur_song" xml:space="preserve"> <data name="music_repeating_cur_song" xml:space="preserve">
<value></value> <value>繰り返し現在の曲</value>
</data> </data>
<data name="music_repeating_playlist" xml:space="preserve"> <data name="music_repeating_playlist" xml:space="preserve">
<value></value> <value>繰り返しプレイリスト</value>
</data> </data>
<data name="music_repeating_track" xml:space="preserve"> <data name="music_repeating_track" xml:space="preserve">
<value></value> <value>繰り返しトラック</value>
</data> </data>
<data name="music_repeating_track_stopped" xml:space="preserve"> <data name="music_repeating_track_stopped" xml:space="preserve">
<value></value> <value>現在のトラックの繰り返しを中止しました。</value>
</data> </data>
<data name="music_resumed" xml:space="preserve"> <data name="music_resumed" xml:space="preserve">
<value></value> <value>曲の再生を再開しました。</value>
</data> </data>
<data name="music_rpl_disabled" xml:space="preserve"> <data name="music_rpl_disabled" xml:space="preserve">
<value></value> <value>プレイリストの繰り返しは無効です。</value>
</data> </data>
<data name="music_rpl_enabled" xml:space="preserve"> <data name="music_rpl_enabled" xml:space="preserve">
<value></value> <value>プレイリストの繰り返しは有効です。</value>
</data> </data>
<data name="music_set_music_channel" xml:space="preserve"> <data name="music_set_music_channel" xml:space="preserve">
<value></value> <value>このチャンネルでは、再生、終了、一時停止、曲の削除ができます。</value>
</data> </data>
<data name="music_skipped_to" xml:space="preserve"> <data name="music_skipped_to" xml:space="preserve">
<value></value> <value>スキップしました。 {0}:{1} </value>
</data> </data>
<data name="music_songs_shuffled" xml:space="preserve"> <data name="music_songs_shuffled" xml:space="preserve">
<value></value> <value>シャッフルした曲</value>
</data> </data>
<data name="music_song_moved" xml:space="preserve"> <data name="music_song_moved" xml:space="preserve">
<value></value> <value>削除した曲</value>
</data> </data>
<data name="music_time_format" xml:space="preserve"> <data name="music_time_format" xml:space="preserve">
<value></value> <value>{0}時 {1}分 {2}秒 </value>
</data> </data>
<data name="music_to_position" xml:space="preserve"> <data name="music_to_position" xml:space="preserve">
<value></value> <value>位置に</value>
</data> </data>
<data name="music_unlimited" xml:space="preserve"> <data name="music_unlimited" xml:space="preserve">
<value></value> <value>無制限</value>
</data> </data>
<data name="music_volume_input_invalid" xml:space="preserve"> <data name="music_volume_input_invalid" xml:space="preserve">
<value></value> <value>音量は0から100の間でなければなりません。</value>
</data> </data>
<data name="music_volume_set" xml:space="preserve"> <data name="music_volume_set" xml:space="preserve">
<value></value> <value>音量を {0}% にセット</value>
</data> </data>
<data name="permissions_acm_disable" xml:space="preserve"> <data name="permissions_acm_disable" xml:space="preserve">
<value></value> <value></value>
@ -2527,5 +2544,129 @@ Paypal &lt;{1}&gt;
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value></value> <value></value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value></value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value></value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value></value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value></value>
</data>
<data name="administration_page" xml:space="preserve">
<value></value>
</data>
<data name="administration_reason" xml:space="preserve">
<value></value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value></value>
</data>
<data name="administration_server" xml:space="preserve">
<value></value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value></value>
</data>
</root> </root>

File diff suppressed because it is too large Load Diff

View File

@ -761,7 +761,8 @@ Grunn: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>soft-banned (sparket)</value> <value>soft-banned (sparket)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} vil nå ignorere denne kanalen.</value> <value>{0} vil nå ignorere denne kanalen.</value>
@ -2334,5 +2335,130 @@ Eier ID: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Kompetitiv spilltid</value> <value>Kompetitiv spilltid</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Kanal</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Kommando tekst</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Sparket</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderator</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>side {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Grunn</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Ny oppstartskommando lagt til.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Oppstartskommando fjernet.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Fant ikke oppstartskommando</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Server</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Ingen oppstartskommandoer på denne siden.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Fjernet alle oppstartskommandoer</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>Bruker {0} er ikke lenger utestengt</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Fant ikke bruker.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>Advarte bruker {0}</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>Bruker {0} ble advart og straffet med {0}</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Advart på server {0}</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>Den {0} kl. {1} av {2}</value>
<comment>On 02.04.2017 at 16:03 by Kwoth</comment>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Alle advarsler fjernet for {0}</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>Ingen advarsler på denne siden.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Advarselslogg for {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Ingen straff satt.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>fjernet av {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Straffliste</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Å ha {0} advarsler vil ikke lenger gi noen straff.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>Brukere med {1} advarsler vil bli straffet med {0}</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Slowmode vil nå ignorere rollen {0}.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Slowmode ignorerer ikke lenger rollen {0}.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Slowmode vil nå ignorere brukeren {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Slowmode vil ikke lenger ignorere brukeren {0}</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Kunne ikke hevde premie p.g.a. én av følgende grunner:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Det er mulig du allerede har mottatt premien din for denne måneden. Du kan bare hevde premien én gang i måneden med mindre du øker summen.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Allerede belønnet.</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Din Discord konto er ikke tilkoblet Patreon. Om du er usikker på hva dette betyr, eller ikke er sikker på hvordan du gjør det, kan du gå til [Patreon kontoinnstillinger](https://patreon.com/settings/account) og klikk på &apos;Connect to Discord&apos;-knappen.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord kontoen er ikke tilknyttet.</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>For å være kvalifisert for belønning, må du støtte prosjektet på Patreon. Du kan bruke {0} kommandoen for å få link.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Støttes ikke</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Du må vente noen timer etter du har gitt ditt løfte. Prøv igjen om litt.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Vent litt.</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Du har mottatt {0}. Takk for at du støtter prosjektet!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Belønninger kan bare hevdes fra og med den 5. dagen i måneden.</value>
</data>
</root> </root>

View File

@ -140,7 +140,6 @@
</data> </data>
<data name="clashofclans_claim_expired" xml:space="preserve"> <data name="clashofclans_claim_expired" xml:space="preserve">
<value>De aanvraag van @{0} voor een oorlog tegen {1} is niet meer geldig.</value> <value>De aanvraag van @{0} voor een oorlog tegen {1} is niet meer geldig.</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="clashofclans_enemy" xml:space="preserve"> <data name="clashofclans_enemy" xml:space="preserve">
<value>Vijand</value> <value>Vijand</value>
@ -153,11 +152,9 @@
</data> </data>
<data name="clashofclans_invalid_size" xml:space="preserve"> <data name="clashofclans_invalid_size" xml:space="preserve">
<value>Ongeldig oorlogsformaat.</value> <value>Ongeldig oorlogsformaat.</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="clashofclans_list_active_wars" xml:space="preserve"> <data name="clashofclans_list_active_wars" xml:space="preserve">
<value>Lijst van voorlopende oorlogen.</value> <value>Lijst van actieve oorlogen</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="clashofclans_not_claimed" xml:space="preserve"> <data name="clashofclans_not_claimed" xml:space="preserve">
<value>Niet veroverd.</value> <value>Niet veroverd.</value>
@ -169,8 +166,7 @@
<value>@{0} Je doet niet mee aan die oorlog, of die basis is al vernietigd.</value> <value>@{0} Je doet niet mee aan die oorlog, of die basis is al vernietigd.</value>
</data> </data>
<data name="clashofclans_no_active_wars" xml:space="preserve"> <data name="clashofclans_no_active_wars" xml:space="preserve">
<value>Geen voorlopende oorlogen.</value> <value>Geen actieve oorlogen</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="clashofclans_size" xml:space="preserve"> <data name="clashofclans_size" xml:space="preserve">
<value>Grootte.</value> <value>Grootte.</value>
@ -209,8 +205,7 @@
<value>Nieuwe Speciale Reacties</value> <value>Nieuwe Speciale Reacties</value>
</data> </data>
<data name="customreactions_no_found" xml:space="preserve"> <data name="customreactions_no_found" xml:space="preserve">
<value>Geen speciale reacties gevonden.</value> <value>Geen aangepaste reacties gevonden.</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="customreactions_no_found_id" xml:space="preserve"> <data name="customreactions_no_found_id" xml:space="preserve">
<value>Geen speciale reacties gevonden met dat ID.</value> <value>Geen speciale reacties gevonden met dat ID.</value>
@ -476,7 +471,6 @@ Reden: {1}</value>
<data name="administration_lang_list" xml:space="preserve"> <data name="administration_lang_list" xml:space="preserve">
<value>Lijst van talen <value>Lijst van talen
{0}</value> {0}</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="administration_lang_set" xml:space="preserve"> <data name="administration_lang_set" xml:space="preserve">
<value>Je server&apos;s landinstelling is nu {0} - {1}</value> <value>Je server&apos;s landinstelling is nu {0} - {1}</value>
@ -533,12 +527,10 @@ Reden: {1}</value>
<value>{0} verplaats van {1} naar {2}</value> <value>{0} verplaats van {1} naar {2}</value>
</data> </data>
<data name="administration_msg_del" xml:space="preserve"> <data name="administration_msg_del" xml:space="preserve">
<value>Bericht in #{0} verwijdert</value> <value>Bericht in #{0} verwijderd</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="administration_msg_update" xml:space="preserve"> <data name="administration_msg_update" xml:space="preserve">
<value>Bericht in #{0} bijgewerkt</value> <value>Bericht in #{0} bijgewerkt</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="administration_muted_pl" xml:space="preserve"> <data name="administration_muted_pl" xml:space="preserve">
<value>gemute</value> <value>gemute</value>
@ -749,7 +741,8 @@ Reden: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>soft-verbannen (gekickt)</value> <value>soft-verbannen (gekickt)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} zal dit kanaal negeren.</value> <value>{0} zal dit kanaal negeren.</value>
@ -1395,7 +1388,6 @@ Vergeet niet je discord naam en id in het bericht te zetten.
</data> </data>
<data name="music_now_playing" xml:space="preserve"> <data name="music_now_playing" xml:space="preserve">
<value>Nu aan het spelen</value> <value>Nu aan het spelen</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="music_no_player" xml:space="preserve"> <data name="music_no_player" xml:space="preserve">
<value>Geen actieve muziek speler.</value> <value>Geen actieve muziek speler.</value>
@ -1731,12 +1723,10 @@ Vergeet niet je discord naam en id in het bericht te zetten.
<value>Voorbeeld</value> <value>Voorbeeld</value>
</data> </data>
<data name="searches_failed_finding_anime" xml:space="preserve"> <data name="searches_failed_finding_anime" xml:space="preserve">
<value>Mislukt in het vinden van die chinese tekenfilm</value> <value>Kon die animu niet vinden.</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="searches_failed_finding_manga" xml:space="preserve"> <data name="searches_failed_finding_manga" xml:space="preserve">
<value>Mislukt in het vinden van die </value> <value>Kon die mango niet vinden.</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="searches_genres" xml:space="preserve"> <data name="searches_genres" xml:space="preserve">
<value>Genres</value> <value>Genres</value>
@ -2012,8 +2002,7 @@ Vergeet niet je discord naam en id in het bericht te zetten.
<value>Index buiten bereik.</value> <value>Index buiten bereik.</value>
</data> </data>
<data name="utility_inrole_list" xml:space="preserve"> <data name="utility_inrole_list" xml:space="preserve">
<value>Hier is de lijst met gebruikers in die rollen:</value> <value>Lijst van gebruikers met rol {0}</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="utility_inrole_not_allowed" xml:space="preserve"> <data name="utility_inrole_not_allowed" xml:space="preserve">
<value>Om misbruik te voorkomen ben je niet gemachtigd om dit commando te gebruiken op rollen met veel gebruikers.</value> <value>Om misbruik te voorkomen ben je niet gemachtigd om dit commando te gebruiken op rollen met veel gebruikers.</value>
@ -2102,8 +2091,7 @@ Eigenaar ID: {2}</value>
<value>Citaat toegevoegd</value> <value>Citaat toegevoegd</value>
</data> </data>
<data name="utility_quote_deleted" xml:space="preserve"> <data name="utility_quote_deleted" xml:space="preserve">
<value>Een willekeurig citaat verwijderd</value> <value>Citaat #{0} verwijderd.</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="utility_region" xml:space="preserve"> <data name="utility_region" xml:space="preserve">
<value>Regio</value> <value>Regio</value>
@ -2293,5 +2281,129 @@ Eigenaar ID: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Competitieve speeltijd</value> <value>Competitieve speeltijd</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Kanaal</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Tekst commando</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Geschopt</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Toezichthouder</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>Pagina {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Reden</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Nieuw startup commando toegevoegd.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Startup commando succesvol toegevoegd.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Startup commando niet gevonden.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Server</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Geen startup commando&apos;s op deze pagina.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Verwijder alle startup commando&apos;s.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>Gebruiker {0} is unbanned.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Gebruiker niet gevonden.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>Gebruiker {0} is gewaarschuwd.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>Gebruiker {0} is gewaarschuwd en {1) straf is uitgevoerd.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Gewaarschuwd op {0} server</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>op {0} tussen {1} bij (2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Alle waarschuwingen zijn verwijdert van {0}.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>Geen waarschuwingen op deze pagina.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Waarschuwings logboek van {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Geen straffen geconfigureerd.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>Verwijdert door {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>waarschuwing straffen lijst</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Bij {0} waarschuwingen treed niet langer meer een straf.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>Ik pas {0} straf toe aan de gebruikers met {1} waarschuwingen.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Slowmotion modus word genegeerd voor {0} rol.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Slowmotion wordt niet langer genegeerd door {0} rol.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Slowmotion modus wordt genegeerd door gebruiker {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Slowmotion modus wordt niet langer genegeerd door genegeerde gebruiker {0}.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Mislukt om beloningen te claimen door een van de volgende redenen:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Misschien heb je al je beloningen gekregen deze maand. Je krijgt beloningen maar een keer per maand tenzij je je </value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Al beloond</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Jouw discord account is nog niet verbonden met Patreon. Als je onzeker bent wat dit betekend, of niet weet hoe je dit moet doen - ga dan naar [Patreon account settings page](https://patreon.com/settings/account) en click dan op &apos;Verbind met discord&apos;.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord account nog niet verbonden</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>Om in aanmerking te komen voor de beloning, moet je eerst een donatie doen voor het project bij patreon. Je kunt (0} commando gebruiken om de link te krijgen.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Niet ondersteund</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Je moet een aantal uren wachten na het plaatsen van je donatie, als je het nog niet hebt gedaan, probeer later dan opnieuw.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Wacht nog even</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Je ontvangt {0} Hartelijk bedankt voor het steunen van het project!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Beloningen kunnen worden geclaimd op of na elke 5de van de maand.</value>
</data>
</root> </root>

View File

@ -203,16 +203,16 @@
<value>Lista własnych reakcji</value> <value>Lista własnych reakcji</value>
</data> </data>
<data name="customreactions_name" xml:space="preserve"> <data name="customreactions_name" xml:space="preserve">
<value>Własne reakcje</value> <value>Niestandardowe reakcje</value>
</data> </data>
<data name="customreactions_new_cust_react" xml:space="preserve"> <data name="customreactions_new_cust_react" xml:space="preserve">
<value>Nowe własne reakcje</value> <value>Nowe niestandardowe reakcje</value>
</data> </data>
<data name="customreactions_no_found" xml:space="preserve"> <data name="customreactions_no_found" xml:space="preserve">
<value>Własne reakcje nie zostały znalezione.</value> <value>Niestandardowe reakcje nie zostały znalezione.</value>
</data> </data>
<data name="customreactions_no_found_id" xml:space="preserve"> <data name="customreactions_no_found_id" xml:space="preserve">
<value>Własne reakcje z tym ID nie zostały znalezione.</value> <value>Niestandardowe reakcje z tym ID nie zostały znalezione.</value>
</data> </data>
<data name="customreactions_response" xml:space="preserve"> <data name="customreactions_response" xml:space="preserve">
<value>Odpowiedź</value> <value>Odpowiedź</value>
@ -221,7 +221,7 @@
<value>Statystyki niestandardowych reakcji</value> <value>Statystyki niestandardowych reakcji</value>
</data> </data>
<data name="customreactions_stats_cleared" xml:space="preserve"> <data name="customreactions_stats_cleared" xml:space="preserve">
<value></value> <value>Statystyki wyczyszczone dla {0} niestandardowych reakcji.</value>
</data> </data>
<data name="customreactions_stats_not_found" xml:space="preserve"> <data name="customreactions_stats_not_found" xml:space="preserve">
<value></value> <value></value>
@ -480,7 +480,7 @@ Powód: {1}</value>
<comment>Fuzzy</comment> <comment>Fuzzy</comment>
</data> </data>
<data name="administration_lang_set" xml:space="preserve"> <data name="administration_lang_set" xml:space="preserve">
<value></value> <value>Twojego servra lokal jest teraz {0} - {1}</value>
</data> </data>
<data name="administration_lang_set_bot" xml:space="preserve"> <data name="administration_lang_set_bot" xml:space="preserve">
<value></value> <value></value>
@ -520,7 +520,7 @@ Powód: {1}</value>
<value>Logowanie nie będzie ignorowało {0}</value> <value>Logowanie nie będzie ignorowało {0}</value>
</data> </data>
<data name="administration_log_stop" xml:space="preserve"> <data name="administration_log_stop" xml:space="preserve">
<value></value> <value>Logowanie wydarzenia {1} zatrzymane.</value>
</data> </data>
<data name="administration_menrole" xml:space="preserve"> <data name="administration_menrole" xml:space="preserve">
<value></value> <value></value>
@ -755,7 +755,8 @@ Powód: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>lekko zbanowany (wyrzucony)</value> <value>lekko zbanowany (wyrzucony)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} będzie ignorował ten kanał.</value> <value>{0} będzie ignorował ten kanał.</value>
@ -880,7 +881,7 @@ Powód: {1}</value>
<value>Migracja zakończona!</value> <value>Migracja zakończona!</value>
</data> </data>
<data name="adminsitration_migration_error" xml:space="preserve"> <data name="adminsitration_migration_error" xml:space="preserve">
<value></value> <value>Błąd podczas migracji, sprawdz konsole bota po więcej informacji.</value>
</data> </data>
<data name="administration_presence_updates" xml:space="preserve"> <data name="administration_presence_updates" xml:space="preserve">
<value></value> <value></value>
@ -921,7 +922,7 @@ Powód: {1}</value>
<value>Wydarzenie reagowania kwiatkami rozpoczęło się!</value> <value>Wydarzenie reagowania kwiatkami rozpoczęło się!</value>
</data> </data>
<data name="gambling_gifted" xml:space="preserve"> <data name="gambling_gifted" xml:space="preserve">
<value>dał (0} dla {1}</value> <value>dał {0} dla {1}</value>
<comment>X has gifted 15 flowers to Y</comment> <comment>X has gifted 15 flowers to Y</comment>
</data> </data>
<data name="gambling_has" xml:space="preserve"> <data name="gambling_has" xml:space="preserve">
@ -979,10 +980,10 @@ Powód: {1}</value>
Trwa {0} sekund. Nie nikomu. Ciiii.</value> Trwa {0} sekund. Nie nikomu. Ciiii.</value>
</data> </data>
<data name="gambling_sneakygamestatus_end" xml:space="preserve"> <data name="gambling_sneakygamestatus_end" xml:space="preserve">
<value></value> <value>Wydarzenie SneakyGame zakończyło się. {0} użytkowników otrzymało nagrodę.</value>
</data> </data>
<data name="gambling_sneakygamestatus_title" xml:space="preserve"> <data name="gambling_sneakygamestatus_title" xml:space="preserve">
<value></value> <value>Wydarzenie SneakyGameStatus rozpoczęło się.</value>
</data> </data>
<data name="gambling_tails" xml:space="preserve"> <data name="gambling_tails" xml:space="preserve">
<value>Reszka</value> <value>Reszka</value>
@ -1010,10 +1011,10 @@ Trwa {0} sekund. Nie nikomu. Ciiii.</value>
<value>Komendy i aliasy</value> <value>Komendy i aliasy</value>
</data> </data>
<data name="help_commandlist_regen" xml:space="preserve"> <data name="help_commandlist_regen" xml:space="preserve">
<value></value> <value>Lista komend została wygenerowana na nowo.</value>
</data> </data>
<data name="help_commands_instr" xml:space="preserve"> <data name="help_commands_instr" xml:space="preserve">
<value></value> <value>Wpisz `{0}h NazwaKomendy` aby otrzymać pomoc dla danej komendy, np. `{0}h &gt;8ball` </value>
</data> </data>
<data name="help_command_not_found" xml:space="preserve"> <data name="help_command_not_found" xml:space="preserve">
<value>Nie mogę znaleźć komendy. Proszę sprawdź czy komenda istnieje, zanim jej użyjesz.</value> <value>Nie mogę znaleźć komendy. Proszę sprawdź czy komenda istnieje, zanim jej użyjesz.</value>
@ -1048,7 +1049,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Ten moduł nie istnieje.</value> <value>Ten moduł nie istnieje.</value>
</data> </data>
<data name="help_server_permission" xml:space="preserve"> <data name="help_server_permission" xml:space="preserve">
<value></value> <value>Wymaga {0} uprawnień na serwerze.</value>
</data> </data>
<data name="help_table_of_contents" xml:space="preserve"> <data name="help_table_of_contents" xml:space="preserve">
<value>Spis treści</value> <value>Spis treści</value>
@ -1094,7 +1095,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>{1} czyli {0} wygrał wyścig i {2}!</value> <value>{1} czyli {0} wygrał wyścig i {2}!</value>
</data> </data>
<data name="gambling_dice_invalid_number" xml:space="preserve"> <data name="gambling_dice_invalid_number" xml:space="preserve">
<value>Użyty numer jest nie poprawny. Możesz rzucić {0}-{1} kośćmi na raz</value> <value>Użyty numer jest niepoprawny. Możesz rzucić {0}-{1} kośćmi na raz</value>
</data> </data>
<data name="gambling_dice_rolled" xml:space="preserve"> <data name="gambling_dice_rolled" xml:space="preserve">
<value>wyrzucono {0}</value> <value>wyrzucono {0}</value>
@ -1164,7 +1165,8 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value></value> <value></value>
</data> </data>
<data name="gambling_waifu_fulfilled" xml:space="preserve"> <data name="gambling_waifu_fulfilled" xml:space="preserve">
<value></value> <value>🎉 To prawdziwa miłość! 🎉
Nowa wartość {0} to {1}!</value>
</data> </data>
<data name="gambling_waifu_isnt_cheap" xml:space="preserve"> <data name="gambling_waifu_isnt_cheap" xml:space="preserve">
<value>Żadna waifu nie jest taka tania. Musisz zapłacić co najmniej {0} aby zdobyć waifu, nawet jeśli nie jest tyle warta.</value> <value>Żadna waifu nie jest taka tania. Musisz zapłacić co najmniej {0} aby zdobyć waifu, nawet jeśli nie jest tyle warta.</value>
@ -1188,13 +1190,13 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Rozwiodłeś się z waifu, która cię nie lubi. W zamian dostałeś {0}.</value> <value>Rozwiodłeś się z waifu, która cię nie lubi. W zamian dostałeś {0}.</value>
</data> </data>
<data name="games_8ball" xml:space="preserve"> <data name="games_8ball" xml:space="preserve">
<value>Magiczna kula nr 8</value> <value>Kula nr. 8</value>
</data> </data>
<data name="games_acrophobia" xml:space="preserve"> <data name="games_acrophobia" xml:space="preserve">
<value></value> <value></value>
</data> </data>
<data name="games_acro_ended_no_sub" xml:space="preserve"> <data name="games_acro_ended_no_sub" xml:space="preserve">
<value></value> <value>Gra zakończona bez żadnych zgłoszeń.</value>
<comment>Jakies pomysły jak przetlumaczyć Submission by miało sens?</comment> <comment>Jakies pomysły jak przetlumaczyć Submission by miało sens?</comment>
</data> </data>
<data name="games_acro_no_votes_cast" xml:space="preserve"> <data name="games_acro_no_votes_cast" xml:space="preserve">
@ -1207,19 +1209,19 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value></value> <value></value>
</data> </data>
<data name="games_acro_started" xml:space="preserve"> <data name="games_acro_started" xml:space="preserve">
<value></value> <value>Gra rozpoczęta. Stwórz zdanie z podanym akronimem: {0}.</value>
</data> </data>
<data name="games_acro_started_footer" xml:space="preserve"> <data name="games_acro_started_footer" xml:space="preserve">
<value></value> <value>Masz {0} sekund aby coś zgłosić.</value>
</data> </data>
<data name="games_acro_submit" xml:space="preserve"> <data name="games_acro_submit" xml:space="preserve">
<value></value> <value>{0} zgłosił swoje zdanie. (łącznie {1})</value>
</data> </data>
<data name="games_acro_vote" xml:space="preserve"> <data name="games_acro_vote" xml:space="preserve">
<value></value> <value>Głosuj, wpisując numer zgłoszenia.</value>
</data> </data>
<data name="games_acro_vote_cast" xml:space="preserve"> <data name="games_acro_vote_cast" xml:space="preserve">
<value></value> <value>{0} dał swój głos!</value>
</data> </data>
<data name="games_acro_winner" xml:space="preserve"> <data name="games_acro_winner" xml:space="preserve">
<value>Zwycięzcą jest {0} z {1} punktami.</value> <value>Zwycięzcą jest {0} z {1} punktami.</value>
@ -1266,7 +1268,6 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
</data> </data>
<data name="games_curgen_sn" xml:space="preserve"> <data name="games_curgen_sn" xml:space="preserve">
<value>{0} się pojawiły!</value> <value>{0} się pojawiły!</value>
<comment>Fuzzy</comment>
</data> </data>
<data name="games_failed_loading_question" xml:space="preserve"> <data name="games_failed_loading_question" xml:space="preserve">
<value>Nie udało się załadować pytania.</value> <value>Nie udało się załadować pytania.</value>
@ -1293,7 +1294,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Nie masz wystarczająco {0}</value> <value>Nie masz wystarczająco {0}</value>
</data> </data>
<data name="games_no_results" xml:space="preserve"> <data name="games_no_results" xml:space="preserve">
<value>Brak rezultatów</value> <value>Brak wyników</value>
</data> </data>
<data name="games_picked" xml:space="preserve"> <data name="games_picked" xml:space="preserve">
<value>podniósł {0}</value> <value>podniósł {0}</value>
@ -1304,7 +1305,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<comment>Kwoth planted 5*</comment> <comment>Kwoth planted 5*</comment>
</data> </data>
<data name="games_trivia_already_running" xml:space="preserve"> <data name="games_trivia_already_running" xml:space="preserve">
<value>Trivia jest aktywna na tym serwerze</value> <value>Trivia jest aktywna na tym serwerze.</value>
</data> </data>
<data name="games_trivia_game" xml:space="preserve"> <data name="games_trivia_game" xml:space="preserve">
<value>Trivia</value> <value>Trivia</value>
@ -1313,13 +1314,13 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>{0} zgadł! Odpowiedź to: {1}</value> <value>{0} zgadł! Odpowiedź to: {1}</value>
</data> </data>
<data name="games_trivia_none" xml:space="preserve"> <data name="games_trivia_none" xml:space="preserve">
<value>Trivia nie jest aktywna na tym serwerze</value> <value>Trivia nie jest aktywna na tym serwerze.</value>
</data> </data>
<data name="games_trivia_points" xml:space="preserve"> <data name="games_trivia_points" xml:space="preserve">
<value>{0} posiada {1} punktów</value> <value>{0} posiada {1} punktów</value>
</data> </data>
<data name="games_trivia_stopping" xml:space="preserve"> <data name="games_trivia_stopping" xml:space="preserve">
<value>Koniec po tym pytaniu</value> <value>Koniec po tym pytaniu.</value>
</data> </data>
<data name="games_trivia_times_up" xml:space="preserve"> <data name="games_trivia_times_up" xml:space="preserve">
<value>Koniec czasu! Prawidłowa odpowiedź to {0}</value> <value>Koniec czasu! Prawidłowa odpowiedź to {0}</value>
@ -1331,7 +1332,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Nie możesz grać przeciwko sobie.</value> <value>Nie możesz grać przeciwko sobie.</value>
</data> </data>
<data name="games_ttt_already_running" xml:space="preserve"> <data name="games_ttt_already_running" xml:space="preserve">
<value></value> <value>Gra kółko i krzyżyk jest aktywna na tym serwerze.</value>
</data> </data>
<data name="games_ttt_a_draw" xml:space="preserve"> <data name="games_ttt_a_draw" xml:space="preserve">
<value>Remis!</value> <value>Remis!</value>
@ -1385,7 +1386,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Fair play włączony.</value> <value>Fair play włączony.</value>
</data> </data>
<data name="music_from_position" xml:space="preserve"> <data name="music_from_position" xml:space="preserve">
<value></value> <value>Z pozycji</value>
</data> </data>
<data name="music_id" xml:space="preserve"> <data name="music_id" xml:space="preserve">
<value>ID</value> <value>ID</value>
@ -1415,7 +1416,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Teraz gra</value> <value>Teraz gra</value>
</data> </data>
<data name="music_no_player" xml:space="preserve"> <data name="music_no_player" xml:space="preserve">
<value></value> <value>Brak aktywnego odtwarzacza muzyki.</value>
</data> </data>
<data name="music_no_search_results" xml:space="preserve"> <data name="music_no_search_results" xml:space="preserve">
<value>Brak wyników</value> <value>Brak wyników</value>
@ -1430,7 +1431,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Gra utwór</value> <value>Gra utwór</value>
</data> </data>
<data name="music_playlists" xml:space="preserve"> <data name="music_playlists" xml:space="preserve">
<value></value> <value>`#{0}` - **{1}** przez *{2}* ({3} piosenek)</value>
</data> </data>
<data name="music_playlists_page" xml:space="preserve"> <data name="music_playlists_page" xml:space="preserve">
<value>Strona {0} zapisanych playlist</value> <value>Strona {0} zapisanych playlist</value>
@ -1451,7 +1452,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Playlista zapisana</value> <value>Playlista zapisana</value>
</data> </data>
<data name="music_play_limit" xml:space="preserve"> <data name="music_play_limit" xml:space="preserve">
<value></value> <value>Limit {0}</value>
</data> </data>
<data name="music_queue" xml:space="preserve"> <data name="music_queue" xml:space="preserve">
<value>Kolejka</value> <value>Kolejka</value>
@ -1506,7 +1507,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>{0}g {1}m {2}s</value> <value>{0}g {1}m {2}s</value>
</data> </data>
<data name="music_to_position" xml:space="preserve"> <data name="music_to_position" xml:space="preserve">
<value></value> <value>Do pozycji</value>
</data> </data>
<data name="music_unlimited" xml:space="preserve"> <data name="music_unlimited" xml:space="preserve">
<value>bez limitu</value> <value>bez limitu</value>
@ -1613,7 +1614,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Strona uprawnień {0}</value> <value>Strona uprawnień {0}</value>
</data> </data>
<data name="permissions_permrole" xml:space="preserve"> <data name="permissions_permrole" xml:space="preserve">
<value></value> <value>Aktualna rola z uprawnieniami to {0}.</value>
</data> </data>
<data name="permissions_permrole_changed" xml:space="preserve"> <data name="permissions_permrole_changed" xml:space="preserve">
<value>Użytkownicy wymagają roli {0}, by móc edytować uprawnienia.</value> <value>Użytkownicy wymagają roli {0}, by móc edytować uprawnienia.</value>
@ -1811,7 +1812,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Brak rezultatów.</value> <value>Brak rezultatów.</value>
</data> </data>
<data name="searches_on_hold" xml:space="preserve"> <data name="searches_on_hold" xml:space="preserve">
<value></value> <value>Wstrzymane</value>
</data> </data>
<data name="searches_original_url" xml:space="preserve"> <data name="searches_original_url" xml:space="preserve">
<value>Oryginalny URL</value> <value>Oryginalny URL</value>
@ -1820,7 +1821,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Klucz osu! API jest wymagany.</value> <value>Klucz osu! API jest wymagany.</value>
</data> </data>
<data name="searches_osu_failed" xml:space="preserve"> <data name="searches_osu_failed" xml:space="preserve">
<value></value> <value>Nie udało się wywołać sygnatury osu!.</value>
</data> </data>
<data name="searches_over_x" xml:space="preserve"> <data name="searches_over_x" xml:space="preserve">
<value>Znaleziono {0} obrazków. Pokazuję przypadkowe {0}</value> <value>Znaleziono {0} obrazków. Pokazuję przypadkowe {0}</value>
@ -1835,7 +1836,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Platforma</value> <value>Platforma</value>
</data> </data>
<data name="searches_pokemon_ability_none" xml:space="preserve"> <data name="searches_pokemon_ability_none" xml:space="preserve">
<value></value> <value>Nie znaleziono umięjętności.</value>
</data> </data>
<data name="searches_pokemon_none" xml:space="preserve"> <data name="searches_pokemon_none" xml:space="preserve">
<value>Pokemon nieznaleziony</value> <value>Pokemon nieznaleziony</value>
@ -1844,13 +1845,13 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Link profilowy:</value> <value>Link profilowy:</value>
</data> </data>
<data name="searches_quality" xml:space="preserve"> <data name="searches_quality" xml:space="preserve">
<value></value> <value>Jakość:</value>
</data> </data>
<data name="searches_quick_playtime" xml:space="preserve"> <data name="searches_quick_playtime" xml:space="preserve">
<value></value> <value></value>
</data> </data>
<data name="searches_quick_wins" xml:space="preserve"> <data name="searches_quick_wins" xml:space="preserve">
<value></value> <value>Szybkie wygrane</value>
</data> </data>
<data name="searches_rating" xml:space="preserve"> <data name="searches_rating" xml:space="preserve">
<value>Ocena</value> <value>Ocena</value>
@ -1871,7 +1872,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Coś poszło nie tak.</value> <value>Coś poszło nie tak.</value>
</data> </data>
<data name="searches_specify_search_params" xml:space="preserve"> <data name="searches_specify_search_params" xml:space="preserve">
<value></value> <value>Proszę o sprecyzowanie kryteriów wyszukiwania.</value>
</data> </data>
<data name="searches_status" xml:space="preserve"> <data name="searches_status" xml:space="preserve">
<value>Status</value> <value>Status</value>
@ -1902,7 +1903,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Usunięto stream użytkownika {0} ({1}) z powiadomień.</value> <value>Usunięto stream użytkownika {0} ({1}) z powiadomień.</value>
</data> </data>
<data name="searches_stream_tracked" xml:space="preserve"> <data name="searches_stream_tracked" xml:space="preserve">
<value></value> <value>Powiadomię ten kanał kiedy status się zmieni.</value>
</data> </data>
<data name="searches_sunrise" xml:space="preserve"> <data name="searches_sunrise" xml:space="preserve">
<value>Wschód słońca</value> <value>Wschód słońca</value>
@ -1926,7 +1927,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Typy</value> <value>Typy</value>
</data> </data>
<data name="searches_ud_error" xml:space="preserve"> <data name="searches_ud_error" xml:space="preserve">
<value></value> <value>Nie znaleziono definicji dla tego terminu.</value>
</data> </data>
<data name="searches_url" xml:space="preserve"> <data name="searches_url" xml:space="preserve">
<value>Url</value> <value>Url</value>
@ -1938,7 +1939,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value>Oglądane</value> <value>Oglądane</value>
</data> </data>
<data name="searches_wikia_error" xml:space="preserve"> <data name="searches_wikia_error" xml:space="preserve">
<value></value> <value>Nie znaleziono tego terminu na konkretnej wikii.</value>
</data> </data>
<data name="searches_wikia_input_error" xml:space="preserve"> <data name="searches_wikia_input_error" xml:space="preserve">
<value></value> <value></value>
@ -1964,7 +1965,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
`1.`</comment> `1.`</comment>
</data> </data>
<data name="utility_activity_page" xml:space="preserve"> <data name="utility_activity_page" xml:space="preserve">
<value></value> <value>Strona aktywności #{0}</value>
</data> </data>
<data name="utility_activity_users_total" xml:space="preserve"> <data name="utility_activity_users_total" xml:space="preserve">
<value>Łącznie {0} użytkowników.</value> <value>Łącznie {0} użytkowników.</value>
@ -1979,7 +1980,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value></value> <value></value>
</data> </data>
<data name="utility_channelid" xml:space="preserve"> <data name="utility_channelid" xml:space="preserve">
<value></value> <value>{0} tego kanału to {1}</value>
</data> </data>
<data name="utility_channel_topic" xml:space="preserve"> <data name="utility_channel_topic" xml:space="preserve">
<value>Temat kanału</value> <value>Temat kanału</value>
@ -2009,7 +2010,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value></value> <value></value>
</data> </data>
<data name="utility_csc_token" xml:space="preserve"> <data name="utility_csc_token" xml:space="preserve">
<value></value> <value>To jest twój token CSC</value>
</data> </data>
<data name="utility_custom_emojis" xml:space="preserve"> <data name="utility_custom_emojis" xml:space="preserve">
<value>Niestandardowe emotikony</value> <value>Niestandardowe emotikony</value>
@ -2027,7 +2028,7 @@ Nie zapomnij zostawić swojej discordowej nazwy użytkownika albo ID w wiadomoś
<value></value> <value></value>
</data> </data>
<data name="utility_inrole_list" xml:space="preserve"> <data name="utility_inrole_list" xml:space="preserve">
<value></value> <value>Lista użytkowników w roli {0}</value>
</data> </data>
<data name="utility_inrole_not_allowed" xml:space="preserve"> <data name="utility_inrole_not_allowed" xml:space="preserve">
<value></value> <value></value>
@ -2081,7 +2082,7 @@ ID właściciela: {2}</value>
<value>Brak roli na tej stronie.</value> <value>Brak roli na tej stronie.</value>
</data> </data>
<data name="utility_no_shards_on_page" xml:space="preserve"> <data name="utility_no_shards_on_page" xml:space="preserve">
<value></value> <value>Brak shard&apos;ów na tej stronie.</value>
</data> </data>
<data name="utility_no_topic_set" xml:space="preserve"> <data name="utility_no_topic_set" xml:space="preserve">
<value>Brak tematu.</value> <value>Brak tematu.</value>
@ -2093,7 +2094,7 @@ ID właściciela: {2}</value>
<value>ID właściciela</value> <value>ID właściciela</value>
</data> </data>
<data name="utility_presence" xml:space="preserve"> <data name="utility_presence" xml:space="preserve">
<value></value> <value>Obecność</value>
</data> </data>
<data name="utility_presence_txt" xml:space="preserve"> <data name="utility_presence_txt" xml:space="preserve">
<value>{0} serwerów <value>{0} serwerów
@ -2107,10 +2108,10 @@ ID właściciela: {2}</value>
<value>{0} strona cytatów</value> <value>{0} strona cytatów</value>
</data> </data>
<data name="utility_quotes_page_none" xml:space="preserve"> <data name="utility_quotes_page_none" xml:space="preserve">
<value></value> <value>Brak cytatów ona tej stronie.</value>
</data> </data>
<data name="utility_quotes_remove_none" xml:space="preserve"> <data name="utility_quotes_remove_none" xml:space="preserve">
<value></value> <value>Nie znaleziono żadnych cytatów które możesz usunąć.</value>
</data> </data>
<data name="utility_quote_added" xml:space="preserve"> <data name="utility_quote_added" xml:space="preserve">
<value>Dodano cytat</value> <value>Dodano cytat</value>
@ -2122,10 +2123,10 @@ ID właściciela: {2}</value>
<value>Region</value> <value>Region</value>
</data> </data>
<data name="utility_registered_on" xml:space="preserve"> <data name="utility_registered_on" xml:space="preserve">
<value></value> <value>Zarejestrowany</value>
</data> </data>
<data name="utility_remind" xml:space="preserve"> <data name="utility_remind" xml:space="preserve">
<value></value> <value>Przypomnę {0} dla {2} `({3:d.M.yyyy.} o {4:HH:mm})`</value>
</data> </data>
<data name="utility_remind_invalid_format" xml:space="preserve"> <data name="utility_remind_invalid_format" xml:space="preserve">
<value></value> <value></value>
@ -2155,10 +2156,10 @@ ID właściciela: {2}</value>
<value>Role</value> <value>Role</value>
</data> </data>
<data name="utility_roles_all_page" xml:space="preserve"> <data name="utility_roles_all_page" xml:space="preserve">
<value></value> <value>Strona #{} wszystkich ról na tym serwerze:</value>
</data> </data>
<data name="utility_roles_page" xml:space="preserve"> <data name="utility_roles_page" xml:space="preserve">
<value></value> <value>Strona #{0} ról {1}</value>
</data> </data>
<data name="utility_rrc_no_colors" xml:space="preserve"> <data name="utility_rrc_no_colors" xml:space="preserve">
<value>Kolory zostały podane w niepoprawnej formie. Użyj np. `#00ff00`</value> <value>Kolory zostały podane w niepoprawnej formie. Użyj np. `#00ff00`</value>
@ -2170,16 +2171,16 @@ ID właściciela: {2}</value>
<value>Zakończono zmienianie kolorów dla roli {0}</value> <value>Zakończono zmienianie kolorów dla roli {0}</value>
</data> </data>
<data name="utility_serverid" xml:space="preserve"> <data name="utility_serverid" xml:space="preserve">
<value></value> <value>{0} tego serwera to {1}</value>
</data> </data>
<data name="utility_server_info" xml:space="preserve"> <data name="utility_server_info" xml:space="preserve">
<value>Informacje o serwerze</value> <value>Informacje o serwerze</value>
</data> </data>
<data name="utility_shard" xml:space="preserve"> <data name="utility_shard" xml:space="preserve">
<value></value> <value>Shard</value>
</data> </data>
<data name="utility_shard_stats" xml:space="preserve"> <data name="utility_shard_stats" xml:space="preserve">
<value></value> <value>Statystyki odłamka</value>
</data> </data>
<data name="utility_shard_stats_txt" xml:space="preserve"> <data name="utility_shard_stats_txt" xml:space="preserve">
<value></value> <value></value>
@ -2191,7 +2192,7 @@ ID właściciela: {2}</value>
<value>Nie znaleziono żadnych specjalnych emotikon</value> <value>Nie znaleziono żadnych specjalnych emotikon</value>
</data> </data>
<data name="utility_stats_songs" xml:space="preserve"> <data name="utility_stats_songs" xml:space="preserve">
<value></value> <value>Teraz leci {0} piosenek; {1} w kolejce</value>
</data> </data>
<data name="utility_text_channels" xml:space="preserve"> <data name="utility_text_channels" xml:space="preserve">
<value>Kanały głosowe</value> <value>Kanały głosowe</value>
@ -2200,7 +2201,7 @@ ID właściciela: {2}</value>
<value>Twój link do pokoju:</value> <value>Twój link do pokoju:</value>
</data> </data>
<data name="utility_uptime" xml:space="preserve"> <data name="utility_uptime" xml:space="preserve">
<value></value> <value>Czas działania</value>
</data> </data>
<data name="utility_userid" xml:space="preserve"> <data name="utility_userid" xml:space="preserve">
<value></value> <value></value>
@ -2219,13 +2220,13 @@ ID właściciela: {2}</value>
<value></value> <value></value>
</data> </data>
<data name="games_no_votes_cast" xml:space="preserve"> <data name="games_no_votes_cast" xml:space="preserve">
<value></value> <value>Nie ma oddanych głosów.</value>
</data> </data>
<data name="games_poll_already_running" xml:space="preserve"> <data name="games_poll_already_running" xml:space="preserve">
<value></value> <value>Ankieta już istnieje na tym serwerze.</value>
</data> </data>
<data name="games_poll_created" xml:space="preserve"> <data name="games_poll_created" xml:space="preserve">
<value></value> <value>📃 {0} stworzył ankietę, która wymaga twojej uwagi:</value>
</data> </data>
<data name="games_poll_result" xml:space="preserve"> <data name="games_poll_result" xml:space="preserve">
<value>`{0}.` {1} z {2} głosami.</value> <value>`{0}.` {1} z {2} głosami.</value>
@ -2244,25 +2245,25 @@ ID właściciela: {2}</value>
<value>Dziękuję za oddany głos, {0}</value> <value>Dziękuję za oddany głos, {0}</value>
</data> </data>
<data name="games_x_votes_cast" xml:space="preserve"> <data name="games_x_votes_cast" xml:space="preserve">
<value></value> <value>{0} oddanych głosów.</value>
</data> </data>
<data name="games_pick_pl" xml:space="preserve"> <data name="games_pick_pl" xml:space="preserve">
<value></value> <value>Podnieś je przez napisanie `{0}pick`</value>
</data> </data>
<data name="games_pick_sn" xml:space="preserve"> <data name="games_pick_sn" xml:space="preserve">
<value></value> <value>Podnieś to przez napisanie `{0}pick`</value>
</data> </data>
<data name="gambling_no_users_found" xml:space="preserve"> <data name="gambling_no_users_found" xml:space="preserve">
<value></value> <value>Nie znaleziono użytkownika.</value>
</data> </data>
<data name="gambling_page" xml:space="preserve"> <data name="gambling_page" xml:space="preserve">
<value></value> <value>Strona {0}</value>
</data> </data>
<data name="administration_must_be_in_voice" xml:space="preserve"> <data name="administration_must_be_in_voice" xml:space="preserve">
<value>Musisz znajdować się w kanale głosowym na tym serwerze.</value> <value>Musisz znajdować się na kanale głosowym na tym serwerze.</value>
</data> </data>
<data name="administration_no_vcroles" xml:space="preserve"> <data name="administration_no_vcroles" xml:space="preserve">
<value></value> <value>Niema żadnych ról w kanałach głosowych. </value>
</data> </data>
<data name="administration_user_muted_time" xml:space="preserve"> <data name="administration_user_muted_time" xml:space="preserve">
<value>{0} został **wyciszony** w kanałach tekstowych oraz głosowych na {1} minut.</value> <value>{0} został **wyciszony** w kanałach tekstowych oraz głosowych na {1} minut.</value>
@ -2271,7 +2272,7 @@ ID właściciela: {2}</value>
<value>Użytkownicy którzy dołączą do kanału głosowego {0} , otrzymają rolę {1}.</value> <value>Użytkownicy którzy dołączą do kanału głosowego {0} , otrzymają rolę {1}.</value>
</data> </data>
<data name="administration_vcrole_removed" xml:space="preserve"> <data name="administration_vcrole_removed" xml:space="preserve">
<value></value> <value>Użytkownicy którzy dołączą do kanału głosowego {0} już nie dostaną roli.</value>
</data> </data>
<data name="administration_vc_role_list" xml:space="preserve"> <data name="administration_vc_role_list" xml:space="preserve">
<value>Uprawnienia kanału głosowego</value> <value>Uprawnienia kanału głosowego</value>
@ -2283,10 +2284,10 @@ ID właściciela: {2}</value>
<value></value> <value></value>
</data> </data>
<data name="customreactions_crdm_disabled" xml:space="preserve"> <data name="customreactions_crdm_disabled" xml:space="preserve">
<value></value> <value>Odpowiedź na niestandardową reakcję z id {0} będzie wysłana jako wiadomość prywatna.</value>
</data> </data>
<data name="customreactions_crdm_enabled" xml:space="preserve"> <data name="customreactions_crdm_enabled" xml:space="preserve">
<value></value> <value>Odpowiedź na niestandardową reakcję z id {0} będzie wysłana jako wiadomość prywatna.</value>
</data> </data>
<data name="utility_aliases_none" xml:space="preserve"> <data name="utility_aliases_none" xml:space="preserve">
<value></value> <value></value>
@ -2295,7 +2296,7 @@ ID właściciela: {2}</value>
<value></value> <value></value>
</data> </data>
<data name="utility_alias_list" xml:space="preserve"> <data name="utility_alias_list" xml:space="preserve">
<value></value> <value>Lista pseudonimów</value>
</data> </data>
<data name="utility_alias_removed" xml:space="preserve"> <data name="utility_alias_removed" xml:space="preserve">
<value></value> <value></value>
@ -2306,5 +2307,129 @@ ID właściciela: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value></value> <value></value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Kanał</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value></value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Wyrzucony</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderator</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>strona {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Powód</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value></value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Serwer</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>Użytkownik {0} został odbanowany.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Użytkownik nieznaleziony.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>Użytkownik {0} został ostrzeżony.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>Dnia {0} o godzinie {1} przez {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Otrzymałeś {0}. Dziękujemy, że wspierasz projekt!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value></value>
</data>
</root> </root>

View File

@ -762,7 +762,8 @@ Razão: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>Banidos temporariamente (kickados)</value> <value>Banidos temporariamente (kickados)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} irá ignorar esse canal.</value> <value>{0} irá ignorar esse canal.</value>
@ -2383,5 +2384,129 @@ OwnerID: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Tempo de jogo competitivo</value> <value>Tempo de jogo competitivo</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Canal</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Comando de Texto</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Kickados</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderador</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>página {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Motivo</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Novo comando de inicialização adicionado.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Comando de inicialização removido com sucesso.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Comando de inicialização não encontrado.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Servidor</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Não há comandos de inicialização nesta página.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Todos os comandos de inicialização foram removidos.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>Usuário {0} foi desbanido.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Usuário não encontrado.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>Usuário {0} foi advertido.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>Usuário {0} foi advertido e {1} punição foi aplicada.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Advertiu no server {0}</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>Em {0} às {1} por {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Todas as advertências foram removidas para {0}</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>Não há advertências nessa página.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Log de advertências para {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Nenhuma punição definida.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>Limpado por {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Lista de punições por advertência</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Possuir {0} advertências não irá mais resultar em punição.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>Eu irei aplicar punição {0} para usuários com {1} advertências.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Modo lento agora irá ignorar o cargo {0}.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Modo lento não ira mais ignorar o cargo {0}.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Modo lento irá ignorar o usuário {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Modo lento não irá mais ignorar o usuário {0}.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Falha em reivindicar recompensas devido a uma das seguintes razões:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Talvez você já tenha recebido sua recompensa esse mês. Você pode receber recompensas apenas uma vez por mês a não ser que você aumente o seu pagamento.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Já recompensado</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Sua conta do discord pode não estar conectada ao Patreon. Se você não tem certeza do que isso significa, ou não sabe como conectá-la - Você deve ir para [Página de configurações de conta do Patreon](https://patreon.com/settings/account) e clicar no botão &apos;Connect to discord&apos;.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Conta do discord não conectada</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>Para poder receber recompensas, você deve dar suporte ao projeto no patreon. Você pode usar o comando {0} para receber o link.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Não suportando</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Você deve esperar algumas horas depois de realizar seu pagamento. Se não o fez, tente novamente mais tarde.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Espere um momento</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Você recebeu {0} Obrigado por dar suporte ao projeto!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Recompensas podem ser reivindicadas no ou a partir do 5° dia de cada mês</value>
</data>
</root> </root>

View File

@ -740,7 +740,7 @@ Reason: {1}</value>
<value>Slow mode initiated</value> <value>Slow mode initiated</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>soft-banned (kicked)</value> <value>soft-banned</value>
<comment>PLURAL</comment> <comment>PLURAL</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
@ -2082,7 +2082,7 @@ Owner ID: {2}</value>
<value>Page {0} of quotes</value> <value>Page {0} of quotes</value>
</data> </data>
<data name="utility_quotes_page_none" xml:space="preserve"> <data name="utility_quotes_page_none" xml:space="preserve">
<value>No quotes on this page.</value> <value>No quotes found matching the quote ID specified.</value>
</data> </data>
<data name="utility_quotes_remove_none" xml:space="preserve"> <data name="utility_quotes_remove_none" xml:space="preserve">
<value>No quotes found which you can remove.</value> <value>No quotes found which you can remove.</value>
@ -2278,4 +2278,235 @@ Owner ID: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Competitive playtime</value> <value>Competitive playtime</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Channel</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Command Text</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Kicked</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderator</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>page {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Reason</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>New startup command added.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Startup command successfully removed.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Startup command not found.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Server</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>No startup commands on this page.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Cleared all startup commands.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>User {0} has been unbanned.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>User not found.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>User {0} has been warned.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>User {0} has been warned and {1} punishment has been applied.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Warned on {0} server</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>On {0} at {1} by {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>All warnings have been cleared for {0}.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>No warning on this page.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Warnlog for {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>No punishments set.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>cleared by {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Warning punishment list</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Having {0} warnings will no longer trigger a punishment.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>I will apply {0} punishment to users with {1} warnings.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Slowmode will now ignore {0} role.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Slowmode will no longer ignore {0} role.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Slowmode will now ignore user {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Slowmode will no longer ignore user {0}.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Failed claiming rewards due to one of the following reasons:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Maybe you've already received your reward for this month. You can receive rewards only once a month unless you increase your pledge.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Already rewarded</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Your discord account might not be connected to Patreon. If you are unsure what that means, or don't know how to connect it - you have to go to [Patreon account settings page](https://patreon.com/settings/account) and click 'Connect to discord' button.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord account not connected</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>In order to be eligible for the reward, you must support the project on patreon. You can use {0} command to get the link.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Not supporting</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>You have to wait a few hours after making your pledge, if you didn't, try again later.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Wait some time</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>You've received {0} Thanks for supporting the project!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Rewards can be claimed on or after 5th of each month.</value>
</data>
<data name="searches_time" xml:space="preserve">
<value>Time in {0} is {1} - {2}</value>
<comment>Time in London, UK is 15:30 - Time Zone Name</comment>
</data>
<data name="administration_rh" xml:space="preserve">
<value>Set the display of guild role {0} to {1}.</value>
</data>
<data name="gambling_name" xml:space="preserve">
<value>Name</value>
</data>
<data name="gambling_shop" xml:space="preserve">
<value>Shop</value>
</data>
<data name="gambling_shop_item_add" xml:space="preserve">
<value>Shop item added</value>
</data>
<data name="gambling_shop_none" xml:space="preserve">
<value>No shop items found on this page.</value>
</data>
<data name="gambling_shop_role" xml:space="preserve">
<value>You will get {0} role.</value>
</data>
<data name="gambling_type" xml:space="preserve">
<value>Type</value>
</data>
<data name="utility_clpa_next_update" xml:space="preserve">
<value>Next update in {0}</value>
<comment>Next update in 05:30</comment>
</data>
<data name="administration_global_perms_reset" xml:space="preserve">
<value>Global permissions have been reset.</value>
</data>
<data name="administration_gvc_disabled" xml:space="preserve">
<value>Game Voice Channel feature has been disabled on this server.</value>
</data>
<data name="administration_gvc_enabled" xml:space="preserve">
<value>{0} is a Game Voice Channel now.</value>
</data>
<data name="administration_not_in_voice" xml:space="preserve">
<value>You are not in voice channel on this server.</value>
</data>
<data name="gambling_item" xml:space="preserve">
<value>Item</value>
</data>
<data name="gambling_out_of_stock" xml:space="preserve">
<value>Out of stock.</value>
</data>
<data name="gambling_random_unique_item" xml:space="preserve">
<value>Random unique item.</value>
</data>
<data name="gambling_shop_buy_error" xml:space="preserve">
<value>Error DMing item. You've been refunded.</value>
</data>
<data name="gambling_shop_item_not_found" xml:space="preserve">
<value>No item on that index found.</value>
</data>
<data name="gambling_shop_item_purchase" xml:space="preserve">
<value>Item purchase successful.</value>
</data>
<data name="gambling_shop_item_rm" xml:space="preserve">
<value>Shop item removed</value>
</data>
<data name="gambling_shop_item_wrong_type" xml:space="preserve">
<value>That shop entry does not support item adding.</value>
</data>
<data name="gambling_shop_list_item_added" xml:space="preserve">
<value>Item successfully added.</value>
</data>
<data name="gambling_shop_list_item_not_unique" xml:space="preserve">
<value>That item is already added.</value>
</data>
<data name="gambling_shop_purchase" xml:space="preserve">
<value>Purchase on {0} server</value>
</data>
<data name="gambling_shop_role_not_found" xml:space="preserve">
<value>Role which is being sold no longer exists.</value>
</data>
<data name="gambling_shop_role_purchase" xml:space="preserve">
<value>You've successfully purchased {0} role.</value>
</data>
<data name="gambling_shop_role_purchase_error" xml:space="preserve">
<value>Error assigning role. Your purchase has been refunded.</value>
</data>
<data name="gambling_unique_items_left" xml:space="preserve">
<value>{0} unique items left.</value>
</data>
<data name="permissions_blocked_commands" xml:space="preserve">
<value>Blocked Commands</value>
</data>
<data name="permissions_blocked_modules" xml:space="preserve">
<value>Blocked Modules</value>
</data>
<data name="permissions_gcmd_add" xml:space="preserve">
<value>Command {0} has been disabled on all servers.</value>
</data>
<data name="permissions_gcmd_remove" xml:space="preserve">
<value>Command {0} has been enabled on all servers.</value>
</data>
<data name="permissions_gmod_add" xml:space="preserve">
<value>Module {0} has been disabled on all servers.</value>
</data>
<data name="permissions_gmod_remove" xml:space="preserve">
<value>Module {0} has been enabled on all servers.</value>
</data>
<data name="permissions_lgp_none" xml:space="preserve">
<value>No blocked commands or modules.</value>
</data>
</root> </root>

View File

@ -743,7 +743,8 @@ Fuzzy</comment>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>выгнаны</value> <value>выгнаны</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} будет игнорировать данный канал.</value> <value>{0} будет игнорировать данный канал.</value>
@ -1119,7 +1120,7 @@ Paypal &lt;{1}&gt;
<data name="gambling_waifu_affinity_changed" xml:space="preserve"> <data name="gambling_waifu_affinity_changed" xml:space="preserve">
<value>сменил свою предрасположенность с {0} на {1}. <value>сменил свою предрасположенность с {0} на {1}.
*Это сомнительно с моральной точки зрения* :thinking:</value> *Это сомнительно с моральной точки зрения.*🤔</value>
<comment>Make sure to get the formatting right, and leave the thinking emoji</comment> <comment>Make sure to get the formatting right, and leave the thinking emoji</comment>
</data> </data>
<data name="gambling_waifu_affinity_cooldown" xml:space="preserve"> <data name="gambling_waifu_affinity_cooldown" xml:space="preserve">
@ -2261,11 +2262,11 @@ ID Владельца: {2}</value>
Fuzzy</comment> Fuzzy</comment>
</data> </data>
<data name="customreactions_crad_enabled" xml:space="preserve"> <data name="customreactions_crad_enabled" xml:space="preserve">
<value>Сообщение, инициирующее настраеваемую реакцию с номером {0}, будет автоматически удалено.</value> <value>Сообщение, инициирующее настраиваемую реакцию с номером {0}, будет автоматически удалено.</value>
<comment>Fuzzy</comment> <comment>Fuzzy</comment>
</data> </data>
<data name="customreactions_crdm_disabled" xml:space="preserve"> <data name="customreactions_crdm_disabled" xml:space="preserve">
<value>Ответное сообщение для настраеваемой реакции с номером {0} не будет отправлено в ЛС.</value> <value>Ответное сообщение для настраиваемой реакции с номером {0} не будет отправлено в ЛС.</value>
<comment>Fuzzy</comment> <comment>Fuzzy</comment>
</data> </data>
<data name="customreactions_crdm_enabled" xml:space="preserve"> <data name="customreactions_crdm_enabled" xml:space="preserve">
@ -2295,5 +2296,142 @@ Fuzzy</comment>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Время в игре</value> <value>Время в игре</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Канал</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Текст команды</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Выгнаны</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Модератор</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>страница {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Причина</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Новая команда автозапуска добавлена.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Новая команда автозапуска успешно удалена.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Команда автозапуска не найдена.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_server" xml:space="preserve">
<value>Сервер</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Не найдено команд автозапуска на этой странице.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Удалены все команды автозапуска.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>Пользователь {0} был разбанен.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Пользователь не найден.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>Пользователь {0} получил предупреждение.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>Пользователь {0} получил предупреждение и наказание {1} было применено.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Предупреждение было вынесено на сервере {0}</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>{0} в {1} пользователем {2}</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Все предупреждения были удалены для пользователя {0}.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>На этой странице нет предупреждений.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Регистрация предупреждений для пользователя {0}</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Наказания не выставлены.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>очищен пользователем {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Список наказаний для предупреждений</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Наказание больше не будет применено после {0} предупреждений.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>Для пользователей с {1} предупреждениями будет применено наказание {0}.</value>
<comment>Fuzzy</comment>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Медленный режим больше не распространяется на роль {0}.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Медленный режим теперь распространяется на роль {0}.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Медленный режим больше не распространяется на пользователя {0}.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Медленный режим теперь распространяется на пользователя {0}.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Не удалось получить награды по одной из следующих причин:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Возможно, Вы уже получили Ваши награды за этот месяц. Вы можете получать награды только раз в месяц, если Вы не увеличивали Ваше пожертвование.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Уже были получены</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Ваш аккаунт в Discord, скорее всего, не подключён к Patreon. Если Вы не уверены, что это значит или не знаете, как его подключить, то Вам необходимо перейти на [Страницу настроек аккаунта в Patreon](https://patreon.com/settings/account) и нажать кнопку &quot;Connect to discord.&quot;</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Аккаунт Discord не подключён</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>Для получения наград Вам необходимо поддерживать проект в Patreon. Вы можете воспользоваться командой {0}, чтобы получить ссылку.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Вы не поддерживаете проект</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Вам необходимо подождать несколько часов после Вашего пожертвования, если Вы не делали этого, попробуйте позже.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Подождите немного</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Вы получили {0}. Спасибо за поддержку проекта!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Награды могут быть получены только начиная с 5-го числа месяца.</value>
</data>
</root> </root>

View File

@ -1,260 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace NadekoBot.Resources {
using System;
using System.Reflection;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class ResponseStrings_sr_SP {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
internal ResponseStrings_sr_SP() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NadekoBot.Resources.ResponseStrings-sr-SP", typeof(ResponseStrings_sr_SP).GetTypeInfo().Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to {0} has already fainted..
/// </summary>
public static string pokemon_already_fainted {
get {
return ResourceManager.GetString("pokemon_already_fainted", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} already has full HP..
/// </summary>
public static string pokemon_already_full {
get {
return ResourceManager.GetString("pokemon_already_full", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Your type is already {0}.
/// </summary>
public static string pokemon_already_that_type {
get {
return ResourceManager.GetString("pokemon_already_that_type", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to used {0}{1} on {2}{3} for {4} damage..
/// </summary>
public static string pokemon_attack {
get {
return ResourceManager.GetString("pokemon_attack", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You can&apos;t attack again without retaliation!.
/// </summary>
public static string pokemon_cant_attack_again {
get {
return ResourceManager.GetString("pokemon_cant_attack_again", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You can&apos;t attack yourself..
/// </summary>
public static string pokemon_cant_attack_yourself {
get {
return ResourceManager.GetString("pokemon_cant_attack_yourself", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} has fainted!.
/// </summary>
public static string pokemon_fainted {
get {
return ResourceManager.GetString("pokemon_fainted", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to healed {0} with one {1}.
/// </summary>
public static string pokemon_healed {
get {
return ResourceManager.GetString("pokemon_healed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} has {1} HP remaining..
/// </summary>
public static string pokemon_hp_remaining {
get {
return ResourceManager.GetString("pokemon_hp_remaining", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You can&apos;t use {0}. Type `{1}ml` to see a list of moves you can use..
/// </summary>
public static string pokemon_invalid_move {
get {
return ResourceManager.GetString("pokemon_invalid_move", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Movelist for {0} type.
/// </summary>
public static string pokemon_moves {
get {
return ResourceManager.GetString("pokemon_moves", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You don&apos;t have enough {0}.
/// </summary>
public static string pokemon_no_currency {
get {
return ResourceManager.GetString("pokemon_no_currency", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to It&apos;s not effective..
/// </summary>
public static string pokemon_not_effective {
get {
return ResourceManager.GetString("pokemon_not_effective", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to revived {0} with one {1}.
/// </summary>
public static string pokemon_revive_other {
get {
return ResourceManager.GetString("pokemon_revive_other", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You revived yourself with one {0}.
/// </summary>
public static string pokemon_revive_yourself {
get {
return ResourceManager.GetString("pokemon_revive_yourself", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Your type has been changed to {0} for a {1}.
/// </summary>
public static string pokemon_settype_success {
get {
return ResourceManager.GetString("pokemon_settype_success", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to It&apos;s somewhat effective..
/// </summary>
public static string pokemon_somewhat_effective {
get {
return ResourceManager.GetString("pokemon_somewhat_effective", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to It&apos;s super effective!.
/// </summary>
public static string pokemon_super_effective {
get {
return ResourceManager.GetString("pokemon_super_effective", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You used too many moves in a row, so you can&apos;t move!.
/// </summary>
public static string pokemon_too_many_moves {
get {
return ResourceManager.GetString("pokemon_too_many_moves", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Type of {0} is {1}.
/// </summary>
public static string pokemon_type_of_user {
get {
return ResourceManager.GetString("pokemon_type_of_user", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to User not found..
/// </summary>
public static string pokemon_user_not_found {
get {
return ResourceManager.GetString("pokemon_user_not_found", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You fainted, so you are not able to move!.
/// </summary>
public static string pokemon_you_fainted {
get {
return ResourceManager.GetString("pokemon_you_fainted", resourceCulture);
}
}
}
}

View File

@ -752,7 +752,8 @@ Reason: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>soft-banned (kicked)</value> <value>soft-banned (kicked)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} will ignore this channel.</value> <value>{0} will ignore this channel.</value>
@ -2326,5 +2327,129 @@ Lasts {1} seconds. Don&apos;t tell anyone. Shhh.</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value></value> <value></value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value></value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value></value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value></value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value></value>
</data>
<data name="administration_page" xml:space="preserve">
<value></value>
</data>
<data name="administration_reason" xml:space="preserve">
<value></value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value></value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value></value>
</data>
<data name="administration_server" xml:space="preserve">
<value></value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value></value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value></value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value></value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value></value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value></value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value></value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value></value>
</data>
</root> </root>

View File

@ -256,8 +256,7 @@
<value>du kan inte attackera dig själv</value> <value>du kan inte attackera dig själv</value>
</data> </data>
<data name="pokemon_fainted" xml:space="preserve"> <data name="pokemon_fainted" xml:space="preserve">
<value> <value>{0} har svimmat!</value>
{0} har svimmat!</value>
</data> </data>
<data name="pokemon_healed" xml:space="preserve"> <data name="pokemon_healed" xml:space="preserve">
<value>helade {0} med en {1} <value>helade {0} med en {1}
@ -765,7 +764,8 @@ Anledning: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>mjukt-bannad (kickad)</value> <value>mjukt-bannad (kickad)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} kommer ignorera denna kanal.</value> <value>{0} kommer ignorera denna kanal.</value>
@ -2330,7 +2330,7 @@ Medlemmar: {1}
<value>Användare som går in i röstkanalen {0} får rollen {1}.</value> <value>Användare som går in i röstkanalen {0} får rollen {1}.</value>
</data> </data>
<data name="administration_vcrole_removed" xml:space="preserve"> <data name="administration_vcrole_removed" xml:space="preserve">
<value>Användare som går</value> <value>Användare som går med {0} röstkanalen kommer inte längre få en roll.</value>
</data> </data>
<data name="administration_vc_role_list" xml:space="preserve"> <data name="administration_vc_role_list" xml:space="preserve">
<value>Röstkanalsroller</value> <value>Röstkanalsroller</value>
@ -2342,11 +2342,10 @@ Medlemmar: {1}
<value>Meddelandet som triggrar den egengjorda reaktion med id {0} kommer bli</value> <value>Meddelandet som triggrar den egengjorda reaktion med id {0} kommer bli</value>
</data> </data>
<data name="customreactions_crdm_disabled" xml:space="preserve"> <data name="customreactions_crdm_disabled" xml:space="preserve">
<value>Svar meddelande för custom reaktion med id {0} kommer inte att skickas som ett DM.</value> <value>Svar meddelande för den egengjorda reaktion med id {0} kommer inte att skickas som ett DM.</value>
</data> </data>
<data name="customreactions_crdm_enabled" xml:space="preserve"> <data name="customreactions_crdm_enabled" xml:space="preserve">
<value> <value>Svar meddelande för den egengjoda reaktion med id {0} kommer att skickas som ett DM.</value>
</value>
</data> </data>
<data name="utility_aliases_none" xml:space="preserve"> <data name="utility_aliases_none" xml:space="preserve">
<value>Ingen alias hittad</value> <value>Ingen alias hittad</value>
@ -2366,5 +2365,130 @@ Medlemmar: {1}
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Kompetitiv speltid</value> <value>Kompetitiv speltid</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Kanal</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Kommando Text</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Sparkad</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderator</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>Sida {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Anledning</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Ny uppstart kommando tillagd.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Uppstart kommando har blivit avtagen.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Uppstart kommando hittas inte.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Server</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Ingen uppstart kommando har hittats på denna sidan.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Rensat alla uppstart kommando.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>Användaren {0} har blivit icke avstängd.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Användaren hittades inte. </value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>Användaren {0} har blivit varnad.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>Användaren {0} har blivit varnad och {1} straff har blivit tillämpat.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>Varning på {0} server</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>På {0} i {1} av {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>Alla varningar har blivit rensad.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>Inga varningar på denna sidan.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>Varning log för {0}</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Ingen straff ställt.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>rensad av {0}</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Varning straff lista</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>Har {0} varningar kommer inte längre aktivera ett straff.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>Jag kommer att tillägga {0} straff till användare med {1} varningar.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Långsam läge kommer nu att bli ignorerad {0} roll.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Långsam läge kommer inte längre att bli ignorerad {0} roll.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Långsam läge kommer nu ignorera användaren {0}</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Långsam läge kommer inte längre ignorera användaren {0}</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Misslyckad anpråk av pris på grund av följande anledningar:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Du har kanske redan mottagit din pris för denna månaden. Du kan bara motta priser en gång per månad om inte du ökar din pledge.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Redan belönat</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Din discord konto är kanske inte ansluten till Patreon. Om du inte är säker om vad det betyder, eller inte vet hur du skall ansluta det - du måse då gå till [Patreon account settings page]
(https://patreon.com/settings/account) och klicka på &apos;Connect to discord&apos; knappen.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord konto är icke ansluten.</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>För att vara berättigad till priset så måste du stödja projektet på patreon. Du kan använda {0} kommandot för att få länken.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Ingen stöd</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Du måste vänta några timmer efter din pledge, om du inte har gjort det, prova igen senare.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Vänta en stund</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>Du har mottagit {0} Tack för att du har stödjat projektet! </value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Pris kan bli hävdad på eller efter femte av varje månad.</value>
</data>
</root> </root>

View File

@ -741,7 +741,8 @@ Sebep: {1}</value>
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>Hafif bir şekilde yasaklandılar (atıldılar)</value> <value>Hafif bir şekilde yasaklandılar (atıldılar)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0} bu kanalı yoksayacak.</value> <value>{0} bu kanalı yoksayacak.</value>
@ -2281,5 +2282,129 @@ Kurucu Kimliği: {2}</value>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>Rekabetçi oyun süresi</value> <value>Rekabetçi oyun süresi</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>Kanal</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>Kanal Mesajı</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>Atıldı</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>Moderatör</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>sayfa {0}</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>Sebep</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>Yeni başlangıç komutu eklendi.</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>Başlangıç komutu başarıyla kaldırıldı.</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>Başlangıç komutu bulunamadı.</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>Sunucu</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>Bu sayfada başlangıç komutları bulunmuyor.</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>Tüm başlangıç komutları temizlendi.</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>{0} kullanıcısının yasağı kaldırıldı.</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>Kullanıcı bulunamadı.</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>{0} kullanıcısı uyarıldı.</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>{0} kullanıcısı uyarıldı ve {1} cezası uygulandı.</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>{0} sunucusunda uyarıldı.</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>{0} - {1} tarihinde {2} tarafından</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>{0} için tüm uyarılar silindi.</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>Bu sayfada uyarı bulunamadı.</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>{0} için Uyarı Kayıtları</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>Hiç ceza belirlenmedi.</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>{0} tarafından temizlendi.</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>Uyarı ceza listesi</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>{0} uyarılarına sahip olmak artık cezayı tetiklemeyecektir.</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>{1} uyarılarıyla {0} cezasını kullanıcılara uygulayacağım.</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Yavaş mod, artık {0} rolünü görmezden gelecektir.</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Yavaş mod, artık {0} rolünü görmezden gelmeyecek.</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Yavaş mod, artık {0} kullanıcısını yoksayacak.</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Yavaş mod, {0} kullanıcısını artık görmezden gelmeyecek.</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>Aşağıdaki nedenlerden biriyle ödül talebinde bulunamadı:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>Belki de bu ay için ödülünüzü zaten almışsınızdır. Bağış miktarınızı artırmadıkça, yalnızca ayda bir kez ödül alabilirsiniz.</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>Zaten ödüllendirildi</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>Discord hesabınız Patreon&apos;a bağlı olmayabilir. Bunun ne anlama geldiğinden emin değilseniz veya nasıl bağlanacağınızı bilmiyorsanız - [Patreon hesap ayarları sayfasına] (https://patreon.com/settings/account) adresine gidin ve &apos;Bağlantı&apos; butonuna tıklayın.</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord hesabı bağlı değil</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>Ödül için uygun olabilmeniz için, projeyi patreon&apos;da bağış yapmanız gerek. Bağlantıyı almak için {0} komutunu kullanabilirsiniz.</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>Desteklemiyor</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>Bağış yaptıktan sonra birkaç saat beklemek zorundasınız, yapmadıysanız, daha sonra tekrar deneyin.</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>Biraz bekleyin</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>{0} Projeyi desteklediğiniz için teşekkürlerimizi aldınız!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>Ödüller, her ayın 5&apos;inde veya sonrasında talep edilebilir.</value>
</data>
</root> </root>

View File

@ -759,7 +759,8 @@
</data> </data>
<data name="administration_soft_banned_pl" xml:space="preserve"> <data name="administration_soft_banned_pl" xml:space="preserve">
<value>软禁(踢出)</value> <value>软禁(踢出)</value>
<comment>PLURAL</comment> <comment>PLURAL
Fuzzy</comment>
</data> </data>
<data name="administration_spam_ignore" xml:space="preserve"> <data name="administration_spam_ignore" xml:space="preserve">
<value>{0}将忽略此通道。</value> <value>{0}将忽略此通道。</value>
@ -2383,5 +2384,129 @@ Fuzzy</comment>
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>竞争比赛游戏时间。</value> <value>竞争比赛游戏时间。</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>频道</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>指令</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>已被踢出</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>群管</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>第{0}页</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>原因</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>新启动执行命令已加</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>启动执行命令已删</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>启动执行命令未找到</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>服务器</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>该页并无启动执行命令</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>清除所有启动执行命令</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>用户 {0} 已被解禁</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>该用户未找到</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>用户{0}已被警告</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>用户 {0} 已被警告,惩罚已执行。</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>在 {0} 服务器上被警告</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>在 {0} {1} 被 {2} </value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>{0} 的所有警告已清除。</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>该页并无警告。</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>{0} 的警告记录。</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>没有设定任何惩罚</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>被{0} 清除</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>警告惩罚记录</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>拥有{0} 个警告已不会触动惩罚。</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>我会给拥有 {1} 个警告的用户执行{0} 惩罚。</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Slowmode 现在会无视 {0} 身份组。</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Slowmode不会无视 {0} 身份组。</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Slowmode 现在会无视用户 {0} 。</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Slowmode 现在不会无视用户 {0} 。</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>因下列原因无法领取奖励:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>你可能已领取这个月的奖励。除非你的赞助金额增加,你只能领取奖励一个月一次。</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>已被奖励</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>你的discord账户可能未与Patreon连接。如果你并不明白或不知如何连接 - 你需要去 [Patreon account settings page] (https://patreon.com/settings/account) 然后点击&apos;Connect to discord&apos; 的按钮。 </value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>Discord账号没有连接</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>你必须要在patreon赞助该项目才有资格领取奖励。你可以使用命令 {0} 取得网址。</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>无法支援</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>你需要在赞助了之后等几个小时。如果你没有,请稍后再试。</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>稍等片刻</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>您已领取 {0} 。感谢您支持该项目!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>奖励只能在每月五号或五号后才能领取。</value>
</data>
</root> </root>

View File

@ -317,7 +317,7 @@
原因:{1}</value> 原因:{1}</value>
</data> </data>
<data name="administration_banned_pl" xml:space="preserve"> <data name="administration_banned_pl" xml:space="preserve">
<value>用戶已封鎖</value> <value>成員已封鎖</value>
<comment>PLURAL</comment> <comment>PLURAL</comment>
</data> </data>
<data name="administration_banned_user" xml:space="preserve"> <data name="administration_banned_user" xml:space="preserve">
@ -530,7 +530,7 @@
<value>{0} 已從 {1} 移動至 {2}</value> <value>{0} 已從 {1} 移動至 {2}</value>
</data> </data>
<data name="administration_msg_del" xml:space="preserve"> <data name="administration_msg_del" xml:space="preserve">
<value>#{0} 中删除了息</value> <value>#{0} 中删除了息</value>
</data> </data>
<data name="administration_msg_update" xml:space="preserve"> <data name="administration_msg_update" xml:space="preserve">
<value>#{0} 中更新了訊息</value> <value>#{0} 中更新了訊息</value>
@ -904,7 +904,7 @@
<value>花幣大放送開始了!</value> <value>花幣大放送開始了!</value>
</data> </data>
<data name="gambling_gifted" xml:space="preserve"> <data name="gambling_gifted" xml:space="preserve">
<value>送了 {1} 給 {0}</value> <value>送了 {0} 給 {1}</value>
<comment>X has gifted 15 flowers to Y</comment> <comment>X has gifted 15 flowers to Y</comment>
</data> </data>
<data name="gambling_has" xml:space="preserve"> <data name="gambling_has" xml:space="preserve">
@ -933,7 +933,7 @@
<value>卡堆中没有更多的牌。</value> <value>卡堆中没有更多的牌。</value>
</data> </data>
<data name="gambling_raffled_user" xml:space="preserve"> <data name="gambling_raffled_user" xml:space="preserve">
<value>得獎用戶</value> <value>得獎成員</value>
</data> </data>
<data name="gambling_roll" xml:space="preserve"> <data name="gambling_roll" xml:space="preserve">
<value>您骰了 {0}。</value> <value>您骰了 {0}。</value>
@ -1473,7 +1473,7 @@ Paypal &lt;{1}&gt;
<value>我將在此頻道輸出播放、暫停、結束和移除歌曲的訊息。</value> <value>我將在此頻道輸出播放、暫停、結束和移除歌曲的訊息。</value>
</data> </data>
<data name="music_skipped_to" xml:space="preserve"> <data name="music_skipped_to" xml:space="preserve">
<value>跳至 {0}:{1}</value> <value>跳至 `{0}:{1}`</value>
</data> </data>
<data name="music_songs_shuffled" xml:space="preserve"> <data name="music_songs_shuffled" xml:space="preserve">
<value>隨機播放</value> <value>隨機播放</value>
@ -2284,5 +2284,129 @@ Paypal &lt;{1}&gt;
<data name="searches_compet_playtime" xml:space="preserve"> <data name="searches_compet_playtime" xml:space="preserve">
<value>競技時數</value> <value>競技時數</value>
</data> </data>
<data name="administration_channel" xml:space="preserve">
<value>頻道</value>
</data>
<data name="administration_command_text" xml:space="preserve">
<value>指令</value>
</data>
<data name="administration_kicked_pl" xml:space="preserve">
<value>踢除</value>
<comment>PLURAL</comment>
</data>
<data name="administration_moderator" xml:space="preserve">
<value>群管</value>
</data>
<data name="administration_page" xml:space="preserve">
<value>第 {0} 頁</value>
</data>
<data name="administration_reason" xml:space="preserve">
<value>理由</value>
</data>
<data name="administration_scadd" xml:space="preserve">
<value>已新增新的啟動執行命令。</value>
</data>
<data name="administration_scrm" xml:space="preserve">
<value>啟動執行命令已移除。</value>
</data>
<data name="administration_scrm_fail" xml:space="preserve">
<value>找不到啟動執行命令。</value>
</data>
<data name="administration_server" xml:space="preserve">
<value>伺服器</value>
</data>
<data name="administration_startcmdlist_none" xml:space="preserve">
<value>此頁沒有啟動執行命令。</value>
</data>
<data name="administration_startcmds_cleared" xml:space="preserve">
<value>已清除所有啟動執行命令。</value>
</data>
<data name="administration_unbanned_user" xml:space="preserve">
<value>成員 {0} 已解除封鎖。</value>
</data>
<data name="administration_user_not_found" xml:space="preserve">
<value>找不到成員。</value>
</data>
<data name="administration_user_warned" xml:space="preserve">
<value>已警告成員 {0} 。</value>
</data>
<data name="administration_user_warned_and_punished" xml:space="preserve">
<value>成員 {0} 因警告多次故以 {0} 作為懲罰。</value>
</data>
<data name="administration_warned_on" xml:space="preserve">
<value>在 {0} 伺服器上警告</value>
</data>
<data name="administration_warned_on_by" xml:space="preserve">
<value>於 {0} {1},由 {2}</value>
</data>
<data name="administration_warnings_cleared" xml:space="preserve">
<value>已清除成員 {0} 上的所有警告。</value>
</data>
<data name="administration_warnings_none" xml:space="preserve">
<value>此頁沒有警告。</value>
</data>
<data name="administration_warnlog_for" xml:space="preserve">
<value>{0} 的警告紀錄</value>
</data>
<data name="administration_warnpl_none" xml:space="preserve">
<value>沒有設定懲處罰則。</value>
</data>
<data name="administration_warn_cleared_by" xml:space="preserve">
<value>由 {0} 清除</value>
</data>
<data name="administration_warn_punish_list" xml:space="preserve">
<value>警告懲處清單</value>
</data>
<data name="administration_warn_punish_rem" xml:space="preserve">
<value>擁有 {0} 支警告不再觸發懲處。</value>
</data>
<data name="administration_warn_punish_set" xml:space="preserve">
<value>我將會用 {0} 懲處擁有 {0} 支警告的成員。</value>
</data>
<data name="administration_slowmodewl_role_start" xml:space="preserve">
<value>Slowmode 將不再套用於 {0} 身分組。</value>
</data>
<data name="administration_slowmodewl_role_stop" xml:space="preserve">
<value>Slowmode 將套用於 {0} 身分組。</value>
</data>
<data name="administration_slowmodewl_user_start" xml:space="preserve">
<value>Slowmode 將不再套用於 {0} 成員。</value>
</data>
<data name="administration_slowmodewl_user_stop" xml:space="preserve">
<value>Slowmode 將套用於 {0} 成員。</value>
</data>
<data name="utility_clpa_fail" xml:space="preserve">
<value>因下列因素而無法領獎:</value>
</data>
<data name="utility_clpa_fail_already" xml:space="preserve">
<value>您一個月只能領一次獎勵,除非您的贊助金額有提升。</value>
</data>
<data name="utility_clpa_fail_already_title" xml:space="preserve">
<value>獎勵已發送</value>
</data>
<data name="utility_clpa_fail_conn" xml:space="preserve">
<value>您的Discord帳號可能未與Patreon帳戶連結。若您不確定或不知道如何連結的話請至您的[Patreon帳戶設定](https://patreon.com/settings/account)並點選&apos;連節至Discord&apos;按鈕。</value>
</data>
<data name="utility_clpa_fail_conn_title" xml:space="preserve">
<value>尚未連接Discord帳號</value>
</data>
<data name="utility_clpa_fail_sup" xml:space="preserve">
<value>您必須要與Patreon連結您的Discord帳戶才符合領獎資格。您可以使用 {0} 指令來取得連結。</value>
</data>
<data name="utility_clpa_fail_sup_title" xml:space="preserve">
<value>無法支援</value>
</data>
<data name="utility_clpa_fail_wait" xml:space="preserve">
<value>贊助完畢後需要等待數小時等資訊入系統,還請稍後再嘗試。</value>
</data>
<data name="utility_clpa_fail_wait_title" xml:space="preserve">
<value>請稍等</value>
</data>
<data name="utility_clpa_success" xml:space="preserve">
<value>您因贊助了此專案而獲得了{0}!</value>
</data>
<data name="utility_clpa_too_early" xml:space="preserve">
<value>獎勵可於每月5日之後領取。</value>
</data>
</root> </root>

View File

@ -1,25 +0,0 @@
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Services.CleverBotApi
{
public interface ChatterBot
{
ChatterBotSession CreateSession();
}
}

View File

@ -1,51 +0,0 @@
using System;
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Services.CleverBotApi
{
public class ChatterBotFactory
{
public static ChatterBot Create(ChatterBotType type)
{
return Create(type, null);
}
public static ChatterBot Create(ChatterBotType type, object arg)
{
#if GLOBAL_NADEKO
var url = "http://www.cleverbot.com/webservicemin?uc=777&botapi=nadekobot";
#else
var url = "http://www.cleverbot.com/webservicemin?uc=777&botapi=chatterbotapi";
#endif
switch (type)
{
case ChatterBotType.CLEVERBOT:
return new Cleverbot("http://www.cleverbot.com/", url, 26);
case ChatterBotType.JABBERWACKY:
return new Cleverbot("http://jabberwacky.com", "http://jabberwacky.com/webservicemin", 20);
case ChatterBotType.PANDORABOTS:
if (arg == null) throw new ArgumentException("PANDORABOTS needs a botid arg", nameof(arg));
return new Pandorabots(arg.ToString());
}
return null;
}
}
}

View File

@ -1,28 +0,0 @@
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System.Threading.Tasks;
namespace Services.CleverBotApi
{
public interface ChatterBotSession
{
Task<ChatterBotThought> Think(ChatterBotThought thought);
Task<string> Think(string text);
}
}

View File

@ -1,26 +0,0 @@
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Services.CleverBotApi
{
public class ChatterBotThought
{
public string[] Emotions { get; set; }
public string Text { get; set; }
}
}

View File

@ -1,27 +0,0 @@
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Services.CleverBotApi
{
public enum ChatterBotType
{
CLEVERBOT,
JABBERWACKY,
PANDORABOTS
}
}

View File

@ -1,116 +0,0 @@
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Services.CleverBotApi
{
public class Cleverbot : ChatterBot
{
private readonly int endIndex;
private readonly string baseUrl;
private readonly string url;
public Cleverbot(string baseUrl, string url, int endIndex)
{
this.baseUrl = baseUrl;
this.url = url;
this.endIndex = endIndex;
}
public ChatterBotSession CreateSession()
{
return new CleverbotSession(baseUrl, url, endIndex);
}
}
public class CleverbotSession : ChatterBotSession
{
private readonly int endIndex;
private readonly string url;
private readonly IDictionary<string, string> vars;
private readonly CookieCollection cookies;
public CleverbotSession(string baseUrl, string url, int endIndex)
{
this.url = url;
this.endIndex = endIndex;
vars = new Dictionary<string, string>();
//vars["start"] = "y";
vars["stimulus"] = "";
vars["islearning"] = "1";
vars["icognoid"] = "wsf";
//vars["fno"] = "0";
//vars["sub"] = "Say";
//vars["cleanslate"] = "false";
cookies = Utils.GetCookies(baseUrl);
}
public async Task<ChatterBotThought> Think(ChatterBotThought thought)
{
vars["stimulus"] = thought.Text;
var formData = Utils.ParametersToWWWFormURLEncoded(vars);
var formDataToDigest = formData.Substring(9, endIndex);
var formDataDigest = Utils.MD5(formDataToDigest);
vars["icognocheck"] = formDataDigest;
var response = await Utils.Post(url, vars, cookies).ConfigureAwait(false);
var responseValues = response.Split('\r');
//vars[""] = Utils.StringAtIndex(responseValues, 0); ??
vars["sessionid"] = Utils.StringAtIndex(responseValues, 1);
vars["logurl"] = Utils.StringAtIndex(responseValues, 2);
vars["vText8"] = Utils.StringAtIndex(responseValues, 3);
vars["vText7"] = Utils.StringAtIndex(responseValues, 4);
vars["vText6"] = Utils.StringAtIndex(responseValues, 5);
vars["vText5"] = Utils.StringAtIndex(responseValues, 6);
vars["vText4"] = Utils.StringAtIndex(responseValues, 7);
vars["vText3"] = Utils.StringAtIndex(responseValues, 8);
vars["vText2"] = Utils.StringAtIndex(responseValues, 9);
vars["prevref"] = Utils.StringAtIndex(responseValues, 10);
//vars[""] = Utils.StringAtIndex(responseValues, 11); ??
// vars["emotionalhistory"] = Utils.StringAtIndex(responseValues, 12);
// vars["ttsLocMP3"] = Utils.StringAtIndex(responseValues, 13);
// vars["ttsLocTXT"] = Utils.StringAtIndex(responseValues, 14);
// vars["ttsLocTXT3"] = Utils.StringAtIndex(responseValues, 15);
// vars["ttsText"] = Utils.StringAtIndex(responseValues, 16);
// vars["lineRef"] = Utils.StringAtIndex(responseValues, 17);
// vars["lineURL"] = Utils.StringAtIndex(responseValues, 18);
// vars["linePOST"] = Utils.StringAtIndex(responseValues, 19);
// vars["lineChoices"] = Utils.StringAtIndex(responseValues, 20);
// vars["lineChoicesAbbrev"] = Utils.StringAtIndex(responseValues, 21);
// vars["typingData"] = Utils.StringAtIndex(responseValues, 22);
// vars["divert"] = Utils.StringAtIndex(responseValues, 23);
var responseThought = new ChatterBotThought();
responseThought.Text = Utils.StringAtIndex(responseValues, 0);
return responseThought;
}
public async Task<string> Think(string text)
{
return (await Think(new ChatterBotThought {Text = text}).ConfigureAwait(false)).Text;
}
}
}

View File

@ -1,68 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Services.CleverBotApi
{
public class Pandorabots : ChatterBot
{
private readonly string botid;
public Pandorabots(string botid)
{
this.botid = botid;
}
public ChatterBotSession CreateSession()
{
return new PandorabotsSession(botid);
}
}
public class PandorabotsSession : ChatterBotSession
{
private readonly IDictionary<string, string> vars;
public PandorabotsSession(string botid)
{
vars = new Dictionary<string, string>();
vars["botid"] = botid;
vars["custid"] = Guid.NewGuid().ToString();
}
public async Task<ChatterBotThought> Think(ChatterBotThought thought)
{
vars["input"] = thought.Text;
var response = await Utils.Post("http://www.pandorabots.com/pandora/talk-xml", vars, null).ConfigureAwait(false);
var responseThought = new ChatterBotThought();
responseThought.Text = Utils.XPathSearch(response, "//result/that/text()");
return responseThought;
}
public async Task<string> Think(string text)
{
return (await Think(new ChatterBotThought {Text = text}).ConfigureAwait(false)).Text;
}
}
}

View File

@ -1,148 +0,0 @@
using NadekoBot.Extensions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Xml.XPath;
/*
ChatterBotAPI
Copyright (C) 2011 pierredavidbelanger@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Services.CleverBotApi
{
public static class Utils
{
public static string ParametersToWWWFormURLEncoded(IDictionary<string, string> parameters)
{
string wwwFormUrlEncoded = null;
foreach (var parameterKey in parameters.Keys)
{
var parameterValue = parameters[parameterKey];
var parameter = string.Format("{0}={1}", System.Uri.EscapeDataString(parameterKey), System.Uri.EscapeDataString(parameterValue));
if (wwwFormUrlEncoded == null)
{
wwwFormUrlEncoded = parameter;
}
else
{
wwwFormUrlEncoded = string.Format("{0}&{1}", wwwFormUrlEncoded, parameter);
}
}
return wwwFormUrlEncoded;
}
public static string MD5(string input)
{
// step 1, calculate MD5 hash from input
var md5 = System.Security.Cryptography.MD5.Create();
var inputBytes = Encoding.ASCII.GetBytes(input);
var hash = md5.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
var sb = new StringBuilder();
for (var i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString();
}
public static CookieCollection GetCookies(string url)
{
CookieContainer container = new CookieContainer();
HttpResponseMessage res;
using (var handler = new HttpClientHandler() { CookieContainer = container })
using (var http = new HttpClient(handler))
{
http.AddFakeHeaders();
http.DefaultRequestHeaders.Add("ContentType", "text/html");
res = http.GetAsync(url).GetAwaiter().GetResult();
}
var response = res.Content.ReadAsStringAsync().GetAwaiter().GetResult();
return container.GetCookies(res.RequestMessage.RequestUri);
}
public static async Task<string> Post(string url, IDictionary<string, string> parameters, CookieCollection cookies)
{
var postData = ParametersToWWWFormURLEncoded(parameters);
var postDataBytes = Encoding.ASCII.GetBytes(postData);
var request = (HttpWebRequest)WebRequest.Create(url);
if (cookies != null)
{
var container = new CookieContainer();
container.Add(new Uri(url), cookies);
request.CookieContainer = container;
}
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
using (var outputStream = await request.GetRequestStreamAsync())
{
outputStream.Write(postDataBytes, 0, postDataBytes.Length);
outputStream.Flush();
var response = (HttpWebResponse)await request.GetResponseAsync();
using (var responseStreamReader = new StreamReader(response.GetResponseStream()))
{
return responseStreamReader.ReadToEnd().Trim();
}
}
//HttpClientHandler handler;
//var uri = new Uri(url);
//if (cookies == null)
// handler = new HttpClientHandler();
//else
//{
// var cookieContainer = new CookieContainer();
// cookieContainer.Add(uri, cookies);
// handler = new HttpClientHandler() { CookieContainer = cookieContainer };
//}
//using (handler)
//using (var http = new HttpClient(handler))
//{
// var res = await http.PostAsync(url, new FormUrlEncodedContent(parameters)).ConfigureAwait(false);
// return await res.Content.ReadAsStringAsync().ConfigureAwait(false);
//}
}
public static string XPathSearch(string input, string expression)
{
var document = new XPathDocument(new MemoryStream(Encoding.ASCII.GetBytes(input)));
var navigator = document.CreateNavigator();
return navigator.SelectSingleNode(expression).Value.Trim();
}
public static string StringAtIndex(string[] strings, int index)
{
if (index >= strings.Length) return "";
return strings[index];
}
}
}

View File

@ -16,7 +16,6 @@ using NadekoBot.Modules.CustomReactions;
using NadekoBot.Modules.Games; using NadekoBot.Modules.Games;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Threading; using System.Threading;
using Microsoft.EntityFrameworkCore;
using NadekoBot.DataStructures; using NadekoBot.DataStructures;
namespace NadekoBot.Services namespace NadekoBot.Services
@ -37,7 +36,7 @@ namespace NadekoBot.Services
private List<IDMChannel> ownerChannels { get; set; } = new List<IDMChannel>(); private List<IDMChannel> ownerChannels { get; set; } = new List<IDMChannel>();
public event Func<SocketUserMessage, CommandInfo, Task> CommandExecuted = delegate { return Task.CompletedTask; }; public event Func<IUserMessage, CommandInfo, Task> CommandExecuted = delegate { return Task.CompletedTask; };
//userid/msg count //userid/msg count
public ConcurrentDictionary<ulong, uint> UserMessagesSent { get; } = new ConcurrentDictionary<ulong, uint>(); public ConcurrentDictionary<ulong, uint> UserMessagesSent { get; } = new ConcurrentDictionary<ulong, uint>();
@ -76,12 +75,13 @@ namespace NadekoBot.Services
} }
}))) })))
.Where(ch => ch != null) .Where(ch => ch != null)
.OrderBy(x => NadekoBot.Credentials.OwnerIds.IndexOf(x.Id))
.ToList(); .ToList();
if (!ownerChannels.Any()) if (!ownerChannels.Any())
_log.Warn("No owner channels created! Make sure you've specified correct OwnerId in the credentials.json file."); _log.Warn("No owner channels created! Make sure you've specified correct OwnerId in the credentials.json file.");
else else
_log.Info($"Created {ownerChannels.Count} out of {NadekoBot.Credentials.OwnerIds.Count} owner message channels."); _log.Info($"Created {ownerChannels.Count} out of {NadekoBot.Credentials.OwnerIds.Length} owner message channels.");
}); });
_client.MessageReceived += MessageReceivedHandler; _client.MessageReceived += MessageReceivedHandler;
@ -109,13 +109,33 @@ namespace NadekoBot.Services
return Task.CompletedTask; return Task.CompletedTask;
} }
private async Task<bool> TryRunCleverbot(SocketUserMessage usrMsg, IGuild guild) private async Task<bool> TryRunCleverbot(IUserMessage usrMsg, SocketGuild guild)
{ {
if (guild == null) if (guild == null)
return false; return false;
try try
{ {
var cleverbotExecuted = await Games.CleverBotCommands.TryAsk(usrMsg).ConfigureAwait(false); Games.ChatterBotSession cbs;
var message = Games.CleverBotCommands.PrepareMessage(usrMsg, out cbs);
if(message == null || cbs == null)
return false;
PermissionCache pc = Permissions.GetCache(guild.Id);
int index;
if (
!pc.Permissions.CheckPermissions(usrMsg,
NadekoBot.ModulePrefixes[typeof(Games).Name] + "cleverbot",
typeof(Games).Name,
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 true;
}
var cleverbotExecuted = await Games.CleverBotCommands.TryAsk(cbs, (ITextChannel)usrMsg.Channel, message).ConfigureAwait(false);
if (cleverbotExecuted) if (cleverbotExecuted)
{ {
_log.Info($@"CleverBot Executed _log.Info($@"CleverBot Executed
@ -130,14 +150,13 @@ namespace NadekoBot.Services
return false; return false;
} }
private bool IsBlacklisted(IGuild guild, SocketUserMessage usrMsg) => private bool IsBlacklisted(IGuild guild, IUserMessage usrMsg) =>
usrMsg.Author?.Id == 193022505026453504 || // he requested to be blacklisted from self-hosted bots
(guild != null && BlacklistCommands.BlacklistedGuilds.Contains(guild.Id)) || (guild != null && BlacklistCommands.BlacklistedGuilds.Contains(guild.Id)) ||
BlacklistCommands.BlacklistedChannels.Contains(usrMsg.Channel.Id) || BlacklistCommands.BlacklistedChannels.Contains(usrMsg.Channel.Id) ||
BlacklistCommands.BlacklistedUsers.Contains(usrMsg.Author.Id); BlacklistCommands.BlacklistedUsers.Contains(usrMsg.Author.Id);
private const float _oneThousandth = 1.0f / 1000; private const float _oneThousandth = 1.0f / 1000;
private Task LogSuccessfulExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, int exec1, int exec2, int exec3, int total) private Task LogSuccessfulExecution(IUserMessage usrMsg, ExecuteCommandResult exec, ITextChannel channel, int exec1, int exec2, int exec3, int total)
{ {
_log.Info("Command Executed after {4}/{5}/{6}/{7}s\n\t" + _log.Info("Command Executed after {4}/{5}/{6}/{7}s\n\t" +
"User: {0}\n\t" + "User: {0}\n\t" +
@ -156,7 +175,7 @@ namespace NadekoBot.Services
return Task.CompletedTask; return Task.CompletedTask;
} }
private void LogErroredExecution(SocketUserMessage usrMsg, ExecuteCommandResult exec, SocketTextChannel channel, int exec1, int exec2, int exec3, int total) private void LogErroredExecution(IUserMessage usrMsg, ExecuteCommandResult exec, ITextChannel channel, int exec1, int exec2, int exec3, int total)
{ {
_log.Warn("Command Errored after {5}/{6}/{7}/{8}s\n\t" + _log.Warn("Command Errored after {5}/{6}/{7}/{8}s\n\t" +
"User: {0}\n\t" + "User: {0}\n\t" +
@ -176,7 +195,7 @@ namespace NadekoBot.Services
); );
} }
private async Task<bool> InviteFiltered(IGuild guild, SocketUserMessage usrMsg) private async Task<bool> InviteFiltered(IGuild guild, IUserMessage usrMsg)
{ {
if ((Permissions.FilterCommands.InviteFilteringChannels.Contains(usrMsg.Channel.Id) || if ((Permissions.FilterCommands.InviteFilteringChannels.Contains(usrMsg.Channel.Id) ||
Permissions.FilterCommands.InviteFilteringServers.Contains(guild.Id)) && Permissions.FilterCommands.InviteFilteringServers.Contains(guild.Id)) &&
@ -196,7 +215,7 @@ namespace NadekoBot.Services
return false; return false;
} }
private async Task<bool> WordFiltered(IGuild guild, SocketUserMessage usrMsg) private async Task<bool> WordFiltered(IGuild guild, IUserMessage usrMsg)
{ {
var filteredChannelWords = Permissions.FilterCommands.FilteredWordsForChannel(usrMsg.Channel.Id, guild.Id) ?? new ConcurrentHashSet<string>(); var filteredChannelWords = Permissions.FilterCommands.FilteredWordsForChannel(usrMsg.Channel.Id, guild.Id) ?? new ConcurrentHashSet<string>();
var filteredServerWords = Permissions.FilterCommands.FilteredWordsForServer(guild.Id) ?? new ConcurrentHashSet<string>(); var filteredServerWords = Permissions.FilterCommands.FilteredWordsForServer(guild.Id) ?? new ConcurrentHashSet<string>();
@ -232,8 +251,6 @@ namespace NadekoBot.Services
if (msg.Author.IsBot || !NadekoBot.Ready) //no bots, wait until bot connected and initialized if (msg.Author.IsBot || !NadekoBot.Ready) //no bots, wait until bot connected and initialized
return; return;
var execTime = Environment.TickCount;
var usrMsg = msg as SocketUserMessage; var usrMsg = msg as SocketUserMessage;
if (usrMsg == null) //has to be an user message, not system/other messages. if (usrMsg == null) //has to be an user message, not system/other messages.
return; return;
@ -248,7 +265,27 @@ namespace NadekoBot.Services
var channel = msg.Channel as SocketTextChannel; var channel = msg.Channel as SocketTextChannel;
var guild = channel?.Guild; var guild = channel?.Guild;
if (guild != null && guild.OwnerId != msg.Author.Id) await TryRunCommand(guild, channel, usrMsg);
}
catch (Exception ex)
{
_log.Warn("Error in CommandHandler");
_log.Warn(ex);
if (ex.InnerException != null)
{
_log.Warn("Inner Exception of the error in CommandHandler");
_log.Warn(ex.InnerException);
}
}
});
return Task.CompletedTask;
}
public async Task TryRunCommand(SocketGuild guild, ITextChannel channel, IUserMessage usrMsg)
{
var execTime = Environment.TickCount;
if (guild != null && guild.OwnerId != usrMsg.Author.Id)
{ {
if (await InviteFiltered(guild, usrMsg).ConfigureAwait(false)) if (await InviteFiltered(guild, usrMsg).ConfigureAwait(false))
return; return;
@ -262,6 +299,7 @@ namespace NadekoBot.Services
var exec1 = Environment.TickCount - execTime; var exec1 = Environment.TickCount - execTime;
var cleverBotRan = await Task.Run(() => TryRunCleverbot(usrMsg, guild)).ConfigureAwait(false); var cleverBotRan = await Task.Run(() => TryRunCleverbot(usrMsg, guild)).ConfigureAwait(false);
if (cleverBotRan) if (cleverBotRan)
return; return;
@ -277,19 +315,8 @@ namespace NadekoBot.Services
{ {
if (guild != null) if (guild != null)
{ {
PermissionCache pc; PermissionCache pc = Permissions.GetCache(guild.Id);
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; int index;
if ( if (
!pc.Permissions.CheckPermissions(usrMsg, cr.Trigger, "ActualCustomReactions", !pc.Permissions.CheckPermissions(usrMsg, cr.Trigger, "ActualCustomReactions",
@ -306,7 +333,7 @@ namespace NadekoBot.Services
if (cr.AutoDeleteTrigger) if (cr.AutoDeleteTrigger)
{ {
try { await msg.DeleteAsync().ConfigureAwait(false); } catch { } try { await usrMsg.DeleteAsync().ConfigureAwait(false); } catch { }
} }
} }
catch (Exception ex) catch (Exception ex)
@ -325,9 +352,21 @@ namespace NadekoBot.Services
ConcurrentDictionary<string, string> maps; ConcurrentDictionary<string, string> maps;
if (Modules.Utility.Utility.CommandMapCommands.AliasMaps.TryGetValue(guild.Id, out maps)) if (Modules.Utility.Utility.CommandMapCommands.AliasMaps.TryGetValue(guild.Id, out maps))
{ {
string newMessageContent;
if (maps.TryGetValue(messageContent.Trim().ToLowerInvariant(), out newMessageContent)) var keys = maps.Keys
.OrderByDescending(x => x.Length);
var lowerMessageContent = messageContent.ToLowerInvariant();
foreach (var k in keys)
{ {
string newMessageContent;
if (lowerMessageContent.StartsWith(k + " "))
newMessageContent = maps[k] + messageContent.Substring(k.Length, messageContent.Length - k.Length);
else if (lowerMessageContent == k)
newMessageContent = maps[k];
else
continue;
_log.Info(@"--Mapping Command-- _log.Info(@"--Mapping Command--
GuildId: {0} GuildId: {0}
Trigger: {1} Trigger: {1}
@ -336,6 +375,7 @@ namespace NadekoBot.Services
messageContent = newMessageContent; messageContent = newMessageContent;
try { await usrMsg.Channel.SendConfirmAsync($"{oldMessageContent} => {newMessageContent}").ConfigureAwait(false); } catch { } try { await usrMsg.Channel.SendConfirmAsync($"{oldMessageContent} => {newMessageContent}").ConfigureAwait(false); } catch { }
break;
} }
} }
} }
@ -356,37 +396,24 @@ namespace NadekoBot.Services
if (guild != null && exec.CommandInfo != null && exec.Result.Error == CommandError.Exception) if (guild != null && exec.CommandInfo != null && exec.Result.Error == CommandError.Exception)
{ {
if (exec.PermissionCache != null && exec.PermissionCache.Verbose) if (exec.PermissionCache != null && exec.PermissionCache.Verbose)
try { await msg.Channel.SendMessageAsync("⚠️ " + exec.Result.ErrorReason).ConfigureAwait(false); } catch { } try { await usrMsg.Channel.SendMessageAsync("⚠️ " + exec.Result.ErrorReason).ConfigureAwait(false); } catch { }
} }
} }
else else
{ {
if (msg.Channel is IPrivateChannel) if (usrMsg.Channel is IPrivateChannel)
{ {
// rofl, gotta do this to prevent dm help message being sent to // rofl, gotta do this to prevent dm help message being sent to
// users who are voting on private polls (sending a number in a DM) // users who are voting on private polls (sending a number in a DM)
int vote; int vote;
if (int.TryParse(msg.Content, out vote)) return; if (int.TryParse(usrMsg.Content, out vote)) return;
await msg.Channel.SendMessageAsync(Help.DMHelpString).ConfigureAwait(false); await usrMsg.Channel.SendMessageAsync(Help.DMHelpString).ConfigureAwait(false);
await SelfCommands.HandleDmForwarding(msg, ownerChannels).ConfigureAwait(false); await SelfCommands.HandleDmForwarding(usrMsg, ownerChannels).ConfigureAwait(false);
} }
} }
} }
catch (Exception ex)
{
_log.Warn("Error in CommandHandler");
_log.Warn(ex);
if (ex.InnerException != null)
{
_log.Warn("Inner Exception of the error in CommandHandler");
_log.Warn(ex.InnerException);
}
}
});
return Task.CompletedTask;
}
public Task<ExecuteCommandResult> ExecuteCommandAsync(CommandContext context, int argPos, IDependencyMap dependencyMap = null, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception) public Task<ExecuteCommandResult> ExecuteCommandAsync(CommandContext context, int argPos, IDependencyMap dependencyMap = null, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception)
=> ExecuteCommand(context, context.Message.Content.Substring(argPos), dependencyMap, multiMatchHandling); => ExecuteCommand(context, context.Message.Content.Substring(argPos), dependencyMap, multiMatchHandling);
@ -440,21 +467,9 @@ namespace NadekoBot.Services
var cmd = commands[i].Command; var cmd = commands[i].Command;
var resetCommand = cmd.Name == "resetperms"; var resetCommand = cmd.Name == "resetperms";
var module = cmd.Module.GetTopLevelModule(); var module = cmd.Module.GetTopLevelModule();
PermissionCache pc;
if (context.Guild != null) if (context.Guild != null)
{ {
//todo move to permissions module? PermissionCache pc = Permissions.GetCache(context.Guild.Id);
if (!Permissions.Cache.TryGetValue(context.Guild.Id, out pc))
{
using (var uow = DbHandler.UnitOfWork())
{
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; int index;
if (!resetCommand && !pc.Permissions.CheckPermissions(context.Message, cmd.Aliases.First(), module.Name, out index)) if (!resetCommand && !pc.Permissions.CheckPermissions(context.Message, cmd.Aliases.First(), module.Name, out index))
{ {
@ -472,15 +487,22 @@ namespace NadekoBot.Services
} }
} }
int price; //int price;
if (Permissions.CommandCostCommands.CommandCosts.TryGetValue(cmd.Aliases.First().Trim().ToLowerInvariant(), out price) && price > 0) //if (Permissions.CommandCostCommands.CommandCosts.TryGetValue(cmd.Aliases.First().Trim().ToLowerInvariant(), out price) && price > 0)
{ //{
var success = await CurrencyHandler.RemoveCurrencyAsync(context.User.Id, $"Running {cmd.Name} command.", price).ConfigureAwait(false); // var success = await CurrencyHandler.RemoveCurrencyAsync(context.User.Id, $"Running {cmd.Name} command.", price).ConfigureAwait(false);
if (!success) // if (!success)
{ // {
return new ExecuteCommandResult(cmd, pc, SearchResult.FromError(CommandError.Exception, $"Insufficient funds. You need {price}{NadekoBot.BotConfig.CurrencySign} to run this command.")); // return new ExecuteCommandResult(cmd, pc, SearchResult.FromError(CommandError.Exception, $"Insufficient funds. You need {price}{NadekoBot.BotConfig.CurrencySign} to run this command."));
} // }
//}
} }
if (cmd.Name != "resetglobalperms" &&
(GlobalPermissionCommands.BlockedCommands.Contains(cmd.Aliases.First().ToLowerInvariant()) ||
GlobalPermissionCommands.BlockedModules.Contains(module.Name.ToLowerInvariant())))
{
return new ExecuteCommandResult(cmd, null, SearchResult.FromError(CommandError.Exception, $"Command or module is blocked globally by the bot owner."));
} }
// Bot will ignore commands which are ran more often than what specified by // Bot will ignore commands which are ran more often than what specified by

View File

@ -23,6 +23,7 @@ namespace NadekoBot.Services.Database
IPokeGameRepository PokeGame { get; } IPokeGameRepository PokeGame { get; }
IWaifuRepository Waifus { get; } IWaifuRepository Waifus { get; }
IDiscordUserRepository DiscordUsers { get; } IDiscordUserRepository DiscordUsers { get; }
IWarningsRepository Warnings { get; }
int Complete(); int Complete();
Task<int> CompleteAsync(); Task<int> CompleteAsync();

View File

@ -31,6 +31,7 @@ namespace NadekoBot.Services.Database.Models
Mute, Mute,
Kick, Kick,
Ban, Ban,
Softban
} }
public class AntiSpamIgnore : DbEntity public class AntiSpamIgnore : DbEntity

View File

@ -61,6 +61,38 @@ Nadeko Support Server: https://discord.gg/nadekobot";
public string OkColor { get; set; } = "71cd40"; public string OkColor { get; set; } = "71cd40";
public string ErrorColor { get; set; } = "ee281f"; public string ErrorColor { get; set; } = "ee281f";
public string Locale { get; set; } = null; public string Locale { get; set; } = null;
public List<StartupCommand> StartupCommands { get; set; }
public HashSet<BlockedCmdOrMdl> BlockedCommands { get; set; }
public HashSet<BlockedCmdOrMdl> BlockedModules { get; set; }
}
public class BlockedCmdOrMdl : DbEntity
{
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
return ((BlockedCmdOrMdl)obj).Name.ToLowerInvariant() == Name.ToLowerInvariant();
}
public override int GetHashCode() => Name.GetHashCode();
}
public class StartupCommand : DbEntity, IIndexed
{
public int Index { get; set; }
public string CommandText { get; set; }
public ulong ChannelId { get; set; }
public string ChannelName { get; set; }
public ulong? GuildId { get; set; }
public string GuildName { get; set; }
public ulong? VoiceChannelId { get; set; }
public string VoiceChannelName { get; set; }
} }
public class PlayingStatus :DbEntity public class PlayingStatus :DbEntity

View File

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using static NadekoBot.Modules.Administration.Administration;
namespace NadekoBot.Services.Database.Models namespace NadekoBot.Services.Database.Models
{ {
@ -72,10 +71,68 @@ namespace NadekoBot.Services.Database.Models
public HashSet<UnmuteTimer> UnmuteTimers { get; set; } = new HashSet<UnmuteTimer>(); public HashSet<UnmuteTimer> UnmuteTimers { get; set; } = new HashSet<UnmuteTimer>();
public HashSet<VcRoleInfo> VcRoleInfos { get; set; } public HashSet<VcRoleInfo> VcRoleInfos { get; set; }
public HashSet<CommandAlias> CommandAliases { get; set; } = new HashSet<CommandAlias>(); public HashSet<CommandAlias> CommandAliases { get; set; } = new HashSet<CommandAlias>();
public List<WarningPunishment> WarnPunishments { get; set; } = new List<WarningPunishment>();
public bool WarningsInitialized { get; set; }
public HashSet<SlowmodeIgnoredUser> SlowmodeIgnoredUsers { get; set; }
public HashSet<SlowmodeIgnoredRole> SlowmodeIgnoredRoles { get; set; }
public List<ShopEntry> ShopEntries { get; set; }
public ulong? GameVoiceChannel { get; set; } = null;
//public List<ProtectionIgnoredChannel> ProtectionIgnoredChannels { get; set; } = new List<ProtectionIgnoredChannel>(); //public List<ProtectionIgnoredChannel> ProtectionIgnoredChannels { get; set; } = new List<ProtectionIgnoredChannel>();
} }
public class SlowmodeIgnoredUser : DbEntity
{
public ulong UserId { get; set; }
// override object.Equals
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
return ((SlowmodeIgnoredUser)obj).UserId == UserId;
}
// override object.GetHashCode
public override int GetHashCode()
{
return UserId.GetHashCode();
}
}
public class SlowmodeIgnoredRole : DbEntity
{
public ulong RoleId { get; set; }
// override object.Equals
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
return ((SlowmodeIgnoredRole)obj).RoleId == RoleId;
}
// override object.GetHashCode
public override int GetHashCode()
{
return RoleId.GetHashCode();
}
}
public class WarningPunishment : DbEntity
{
public int Count { get; set; }
public PunishmentAction Punishment { get; set; }
public int Time { get; set; }
}
public class CommandAlias : DbEntity public class CommandAlias : DbEntity
{ {
public string Trigger { get; set; } public string Trigger { get; set; }

View File

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NadekoBot.Services.Database.Models
{
public class PatreonRewards : DbEntity
{
public ulong UserId { get; set; }
public ulong PledgeCents { get; set; }
public ulong Awarded { get; set; }
}
}

View File

@ -0,0 +1,11 @@
using System;
namespace NadekoBot.Services.Database.Models
{
public class RewardedUser : DbEntity
{
public ulong UserId { get; set; }
public int AmountRewardedThisMonth { get; set; }
public DateTime LastReward { get; set; }
}
}

View File

@ -0,0 +1,45 @@
using System.Collections.Generic;
namespace NadekoBot.Services.Database.Models
{
public enum ShopEntryType
{
Role,
List,
//Infinite_List,
}
public class ShopEntry : DbEntity, IIndexed
{
public int Index { get; set; }
public int Price { get; set; }
public string Name { get; set; }
public ulong AuthorId { get; set; }
public ShopEntryType Type { get; set; }
//role
public string RoleName { get; set; }
public ulong RoleId { get; set; }
//list
public HashSet<ShopEntryItem> Items { get; set; } = new HashSet<ShopEntryItem>();
}
public class ShopEntryItem : DbEntity
{
public string Text { get; set; }
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
return ((ShopEntryItem)obj).Text == Text;
}
public override int GetHashCode() =>
Text.GetHashCode();
}
}

View File

@ -0,0 +1,12 @@
namespace NadekoBot.Services.Database.Models
{
public class Warning : DbEntity
{
public ulong GuildId { get; set; }
public ulong UserId { get; set; }
public string Reason { get; set; }
public bool Forgiven { get; set; }
public string ForgivenBy { get; set; }
public string Moderator { get; set; }
}
}

View File

@ -40,6 +40,7 @@ namespace NadekoBot.Services.Database
public DbSet<CurrencyTransaction> CurrencyTransactions { get; set; } public DbSet<CurrencyTransaction> CurrencyTransactions { get; set; }
public DbSet<UserPokeTypes> PokeGame { get; set; } public DbSet<UserPokeTypes> PokeGame { get; set; }
public DbSet<WaifuUpdate> WaifuUpdates { get; set; } public DbSet<WaifuUpdate> WaifuUpdates { get; set; }
public DbSet<Warning> Warnings { get; set; }
//logging //logging
public DbSet<LogSetting> LogSettings { get; set; } public DbSet<LogSetting> LogSettings { get; set; }
@ -50,6 +51,7 @@ namespace NadekoBot.Services.Database
public DbSet<EightBallResponse> EightBallResponses { get; set; } public DbSet<EightBallResponse> EightBallResponses { get; set; }
public DbSet<RaceAnimal> RaceAnimals { get; set; } public DbSet<RaceAnimal> RaceAnimals { get; set; }
public DbSet<ModulePrefix> ModulePrefixes { get; set; } public DbSet<ModulePrefix> ModulePrefixes { get; set; }
public DbSet<RewardedUser> RewardedUsers { get; set; }
public NadekoContext() : base() public NadekoContext() : base()
{ {
@ -272,6 +274,16 @@ namespace NadekoBot.Services.Database
du.HasAlternateKey(w => w.UserId); du.HasAlternateKey(w => w.UserId);
#endregion #endregion
#region Warnings
var warn = modelBuilder.Entity<Warning>();
#endregion
#region PatreonRewards
var pr = modelBuilder.Entity<RewardedUser>();
pr.HasIndex(x => x.UserId)
.IsUnique();
#endregion
} }
} }
} }

View File

@ -1,9 +1,12 @@
using NadekoBot.Services.Database.Models; using Microsoft.EntityFrameworkCore;
using NadekoBot.Services.Database.Models;
using System;
using System.Linq;
namespace NadekoBot.Services.Database.Repositories namespace NadekoBot.Services.Database.Repositories
{ {
public interface IBotConfigRepository : IRepository<BotConfig> public interface IBotConfigRepository : IRepository<BotConfig>
{ {
BotConfig GetOrCreate(); BotConfig GetOrCreate(Func<DbSet<BotConfig>, IQueryable<BotConfig>> includes = null);
} }
} }

Some files were not shown because too many files have changed in this diff Show More