Compare commits

...

154 Commits

Author SHA1 Message Date
aikaterna
7e93803c5b Merge pull request #4008 from Drapersniper/node-managing
Another tiny PR :awesome:
2020-06-23 10:09:53 -07:00
Drapersniper
9588b1fa8f more readable 2020-06-23 14:40:35 +01:00
Drapersniper
bed1202f06 missed this one 2020-06-23 14:39:35 +01:00
Drapersniper
c6fa5620f4 fix imports 2020-06-23 14:34:13 +01:00
Drapersniper
5692ab3228 Another tiny PR :awesome: 2020-06-23 13:44:00 +01:00
Drapersniper
8f5118d257 Another tiny PR :awesome: 2020-06-23 11:46:50 +01:00
aikaterna
5417d871c6 Merge pull request #4007 from Drapersniper/wavelink
[Audio RW] Add WL dep and WL overides
2020-06-22 13:51:53 -07:00
Drapersniper
930dbda631 Code Owners 2020-06-22 21:28:07 +01:00
Drapersniper
2e4fd67f87 Add WL dep and WL overides 2020-06-22 21:23:57 +01:00
aikaterna
7e5009345c Merge pull request #4003 from Drapersniper/finally
Git Yeeeted out of here you monster
2020-06-22 08:12:17 -07:00
Drapersniper
fdf7e4d2ab Jack is an official nightmare actually reviewing this PR 2020-06-22 15:16:16 +01:00
Drapersniper
ad503e3065 Git Yeeeted out of here you monster 2020-06-22 15:03:48 +01:00
jack1142
b49b53934d Update deprecation warnings (#3608)
* Make deprecation notice specify minor release based on soonest date

* Stop specifying a specific release in shared libs deprecation notice

* Add actual deprecation warning for `APIToken` (OMG, this is so cool)

* Add dates (2020-08-05 for all)

* address review

* improve consistency

* Add __dir__ and show APIToken in docs (or maybe I want to annoy Flame)

* fix module name when importing non-existent name from parent package

* Fix stack level used by depr warn in `redbot.core.commands`
2020-06-22 03:25:33 +02:00
Dav
df410529b0 [i18n/Streams] Change strings mentioning commands to use {command} variable (#3938)
* hopefully all strings in streams.py

* black streams.py

* don't touch docstrings

* uniformity is good

* thx draper

Co-authored-by: Draper <27962761+Drapersniper@users.noreply.github.com>

* aaaaaaaaaaaaaaaaaaaaaa

* translate more

* sure, joining some strings for jack

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* more strings to join

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* yup... I missed this

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaack blaaaaaaaaaaaaaaaaaaaaaack

Co-authored-by: Draper <27962761+Drapersniper@users.noreply.github.com>
Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-21 20:38:31 +02:00
Draper
477186d09d Add map(), find() and next() methods to AsyncIter (#3921)
* properly handle prefixes

* Docsss and typehinting

* aaaaaaaaaaa

* Apply suggestions from code review

* ffs

* docs

* docs

* Apply suggestions from code review

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* skip await if map is none

* implement `.next()`

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-21 19:47:48 +02:00
Draper
81f146a2ef [Mod] Only send the DM about migration if at least 1 scope entry has a non-default value (#3911)
* Only send notify_owners in mod migration if at least 1 scope entry has a non default value

* update string

* use asynciter on these potentially large loops

* check server settings too
2020-06-21 19:45:35 +02:00
Jamie
84d0282815 [Streams] Invalidate old bearer token when api key is updated. (#3990) 2020-06-21 18:44:38 +01:00
Vexed
d2de3c109a [Downloader] Differentiate core and local cogs in [p]findcog (#3969) 2020-06-21 17:59:52 +01:00
Draper
aad36c7430 Expose info about internally managed jar in [p]audioset info (#3915)
* since i have no clue when RW will be release ... lets add this as it helps out a lot

* update branch name regex

* recheck version after download since now we are showing it.
2020-06-20 01:07:39 +02:00
Vexed
4c62c67fd4 [redbot.setup] Ask for confirmation when passed instance name contains hyphens + allow to use dots (#3920)
* Change regex and the error message

* few changes see ^^^ GH comment

if it doesn't pass the RegEx `[a-zA-Z0-9_\.]*` then:
- if on Linux and contains a "-" anywhere, not allowed
- if it contains a space or starts with a "-", not allowed
- if the top two don't trigger, then `confirm()` with the user.

* black why

* 3.3.9

* fk

* ty aika

* review :aha:

* oopsie

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* this is just vexed tries and jack fixes

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* quite sad really

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-19 16:16:22 +02:00
Flame442
144b7b36d0 [Mod] Consistency periods & proper logging (#3895)
* Consistency periods & proper logging

* woooo jack

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* Update kickban.py

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-19 12:58:40 +02:00
Dav
802641ce6b Use timedelta converter for ban duration and add option to pass delete days to [p]tempban (#3958)
* add duration atribute

* sanity checks

* add days parameter

* maybe resolve conflicts?

* black and make linting happy

* right... I need to send this

* but I still need to return... oops
2020-06-19 01:51:06 +02:00
Vexed
2d63e3d6aa Print getting started guide on startup when bot is in no guilds (#3906)
* Link getting started guide

* 3.3.9

* fk
2020-06-19 01:13:01 +02:00
Vexed
728252ac87 Fix capitalisation in cog creation docs (dev version note) (#3968) 2020-06-19 01:05:48 +02:00
Draper
79d042ad29 [Streams] Only send message about missing client secret once (#3901)
* Send Notify owner messages only when a key has been invalidated since last notify_owner

* grammar

* welp im dumb

* Black and lower config call frequency

* Update redbot/cogs/streams/streams.py

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* dont use a generic name now to avoid a config migration later

* be even more explicit with var name

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-18 23:39:52 +02:00
Neuro Assassin
dd4095b15b [Permissions] Fix integer commands and empty dict rules (#3987) 2020-06-18 21:44:47 +01:00
Vexed
1cf8308d03 [Downloader] Embed version of findcog (#3965) 2020-06-18 21:37:46 +01:00
Jamie
4e890814ff [Filter] Add listing commands (#3973) 2020-06-18 21:23:16 +01:00
Draper
175fbebd73 Move logic for fetching latest Red version info to internal util (#3904)
* Only Send out of date message to Final builds available on PyPi

* Only Send out of date message to Final builds available on PyPi

* sorted the resulting list so that the newest build is first in the list

* forgot about this one

* well jack is a bitch but we love him.

* simplify logic

* Add the new function to `__all__`

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-18 22:21:59 +02:00
Jyu Viole Grace
879d21c528 [Trivia] addition of Lord of the Rings trivia (#3980) 2020-06-18 17:32:15 +01:00
Jyu Viole Grace
c7202b353d [Trivia] Minor correction in greekmyth trivia (#3970)
* [Trivia] Minor correction in greekmyth trivia

In greekmyth trivia, there is a question: `Who is the God of Medicine and the son of Apollo?` and the only answer written in the yaml file is `Asclepius` , however `Aesculapius` or `Hepius` can also be considered as a right answer. 

Source: https://en.wikipedia.org/wiki/Asclepius

* Lord of The Rings trivia

* Added AUTHOR key

* Revert "Added AUTHOR key"

This reverts commit d60e336771.

* Revert "Lord of The Rings trivia"

This reverts commit d7365e87b9.

Co-authored-by: Jyu Viole Grace <thisisjvgrace@users.noreply.github.com>
2020-06-18 17:05:12 +02:00
Vexed
3a0574eae8 [Core] Change [p]embedset user docstring and message to explicitly say DMs only (#3972)
* change docstring and message to explicitly say DMs

* didn't think i'd need to run black...

* wrong branch...

This reverts commit aa6aa5cf4b.

* wait its the right branch

* review - seperate enabled & disabled strings

* review

Co-authored-by: Draper <27962761+Drapersniper@users.noreply.github.com>

Co-authored-by: Draper <27962761+Drapersniper@users.noreply.github.com>
2020-06-18 16:00:08 +02:00
jack1142
70c733e146 Use a task instead of awaiting for delete delay (#3884) 2020-06-18 15:50:42 +02:00
jack1142
a64c28aa44 Fix unnecessary typing before running commands in Downloader (#3964) 2020-06-18 15:47:12 +02:00
aikaterna
35365a7154 [Downloader] Add command to list pinned cogs (#3974) 2020-06-18 15:43:59 +02:00
aikaterna
9594284f6c [Trivia] Fix whosthatpokemon urls (#3975) 2020-06-18 14:42:01 +02:00
github-actions[bot]
0358473af5 Automated Crowdin downstream (#3984)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-06-18 14:33:59 +02:00
jack1142
8d553a3fc6 Improve command error responses (#3951)
* Update settings.py

* Update modlog.py
2020-06-18 13:46:20 +02:00
Vexed
373dcded2c add the space (#3981) 2020-06-17 15:00:49 +02:00
jack1142
e59d52bae4 Dev bump (#3960) 2020-06-12 01:50:37 +02:00
jack1142
fa00314b77 Bump to 3.3.9 (#3959) 2020-06-12 01:24:06 +02:00
jack1142
7aad3ae3b5 Red 3.3.9 - Changelog (#3876)
* Add 3.3.9 or 3.4.0 section

* PR 3889

* PR 3890

* PR 3891

* PR 3781

* PR 3900

* PR 3899

* PR 3916

* PR 3892

* PR 3941 (issue 3940)

* PR 3907 (issue 3102)

* PR 3878 (issue 3877)

* PR 3880

* PR 3925

* PR 3923

* PR 3942

* PR 3935

* PR 3946

* PR 3954

* PR 3955 (issue 3107)

* Add "Read before updating" section

* PR 3957

* Update the changelog header with version number and date
2020-06-12 01:23:44 +02:00
jack1142
6c56e47083 An update to Windows docs structure for our beloved users! (#3894) 2020-06-12 01:23:06 +02:00
Michael H
6c048fad01 [Permissions] Prevent guild owner lockouts (#3955)
* [Permissions] Prevent guild owner lockouts

  - Guild owners will always be able to access the guild configuration
  commands in permissions
  - This includes `permissions explain` and `permissions canrun` as
  informational tools useful for ensuing a correct configuration

  resolves #3107

* minor nitpicking over ordering consistency

* a single new line for style compliance

* Fix a typo + alphabet went wrong

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-12 00:31:41 +02:00
Dav
593079dbbb [Mod] Make tempban more consistent with other ban commands. (#3957)
* add duration atribute

* sanity checks

* obviously that didn't work...

* insert facepalm here
2020-06-12 00:30:11 +02:00
aikaterna
2761244d2e [Bank] Display in settings if bank is global (#3954)
* [Bank] Display in settings if bank is global

* Address review

* Address review
2020-06-11 20:29:24 +02:00
Vexed
f58f6bb6d2 Update dm docstring for readability and grammar (+ period in contact) (#3946)
* update `dm` docstring

* few changes

* hmm

* cant make my mind up how to word it

* fk i forgot "and"

this is the last one, i promise

* add missing full stop in `contact` as im in this area of core_commands

* oh, see ^^^ review

* `click on` instead of `select`

Co-authored-by: Vexed01 <>
Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-11 19:31:49 +02:00
Draper
da83e02749 Show storage type in start up message (#3935)
* Lets show active storage on start up message

* Lets show active storage on start up message

* let's make it like in `[p]debuginfo`

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-06-11 19:05:32 +02:00
Draper
76efb16f96 [UX] Add "server" alias for commands that have "guild" in name (#3947) 2020-06-11 18:56:57 +02:00
Predeactor
d411873503 Only trigger cooldown when message is parsed in [p]contact (#3942) 2020-06-11 18:54:11 +02:00
Flame442
f0a4c1c252 [Core Commands] Fix [p]set custominfo error (#3923) 2020-06-11 18:46:30 +02:00
Flame442
1f845a4119 [Filter] Fix confusing behavior detecting quotes (#3925)
* Probably make filter better

* because I'm a stupid dumb idiot, *jack*
2020-06-11 17:00:55 +02:00
Draper
17496ff5cf [Audio] Fix DM Crash (#3880)
Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>
2020-06-11 16:50:23 +02:00
aikaterna
e3322af384 [Audio] Redefine max length with livestream exception (#3878)
* Redefine max length with livestream exception

* Address review

* is_track_too_long -> is_track_length_allowed for a more accurate description of what the function actually is doing
* we now rely on Track.is_stream for determining whether item is a livestream (or unseekable/non-known audio length like OGG files) for determining whether it can bypass the user-set max track length
* Removal of passing track length/an int to is_track_length_allowed - will always pass the full Track object now

* Address review
2020-06-11 16:38:43 +02:00
Draper
b1d394eac5 [Core] Add a text only version to [p]info (#3907)
* ...

* Finish implementation

* some people think an embedless world brings joy ... I agree to disagree.
2020-06-11 15:07:27 +02:00
jack1142
fd8ff7d7cf Add missing class docstrings in Downloader, Reports and Streams (#3892)
* add class docstring to downloader

idk what to say rly
um hi all nice to be back after about 6 months
pls no hate my PRs
apoligies if i get in the way
if you read this far then you deserve an achievement um i dunno what err how about the achievement of unboredness

* add class docstring to reports

* add class docstring to streams

* black formatting

oops lets not forget what tox checks for

* wording changes

* add cog board link

* hmm actually no (undo)

* wait grammar exists? who knew...

* remove admin only commands

* Review

* Remove always
  - and consequently reorganise the words
* Add "one or more"
* Fix spelling of creator
  - changed from creater
2020-06-11 15:01:06 +02:00
Dav
bc19b0d103 [Alias] Remove guild_only deco from main alias command group (#3941)
* Update alias.py

* alias help and show

* well... avoid the dumb
2020-06-11 15:00:38 +02:00
Vexed
aea6f68598 [Docs] Add Oracle to VPS Hosting, new specific links (#3916)
* Add the rst

* Add Oracle
* Add links to Always Free VPSes
* Add mention EC2 is 12 months only

* more description + update AWS link
2020-06-09 21:23:44 +02:00
Vexed01
332bcae24f Review
* Remove always
  - and consequently reorganise the words
* Add "one or more"
* Fix spelling of creator
  - changed from creater
2020-06-05 19:47:45 +01:00
github-actions[bot]
4335b3b2d4 Automated Crowdin downstream (#3913)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-06-04 14:22:16 +02:00
Draper
d6435eff85 make audioset autoplay guild-only (#3899) 2020-06-04 13:33:33 +02:00
Predeactor
2c313594da Typo Fix (#3900)
As always, a new typo is fixed forever.
2020-06-03 21:13:44 +02:00
Neuro Assassin
bc21f77976 Fix setting guild prefixes when the prefixes aren't in cache (#3897) 2020-06-02 03:02:35 +02:00
Dav
dbcb179523 Allow to hide moderator from warnings sent to the users + warn channel fix (#3781)
* add toggle to allow switching off sending the name of the person who uhhh used? the warning

* the Kowlin way of life

* reduced config calls to stay in line with #3766 and hopefully didn't break anything (as per Draper suggestion)

* more performance magic

* found an error + black

* forgot warning channel existed

* await... seriously... how long have you done async stuff now dav?

* unify (most) config calls in ``[p]warn``

* fix all the things
2020-06-01 02:58:36 +02:00
Vexed01
35e83855a8 remove admin only commands 2020-05-31 13:15:38 +01:00
Vexed01
6b086e3eb2 wait grammar exists? who knew... 2020-05-31 11:16:39 +01:00
Vexed01
049f23071c hmm actually no (undo) 2020-05-31 10:18:58 +01:00
Vexed01
e6c46bf4da add cog board link 2020-05-31 09:21:34 +01:00
Flame442
6984dca394 [Mod] Preemptive fix for the next dpy update (#3891) 2020-05-31 03:56:21 +02:00
Neuro Assassin
7a86cc4bf3 [Core] Add bot.set_prefixes() (#3890)
* Add bot.set_prefixes; change set serverprefix and set prefix to new method

* Address requested changes

* Apply suggestions from code review

* One more

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-05-31 00:57:49 +02:00
Vexed01
219586d55d wording changes 2020-05-30 19:57:34 +01:00
Vexed01
6a00c0ee7e black formatting
oops lets not forget what tox checks for
2020-05-30 19:42:33 +01:00
Vexed01
873c7be99e add class docstring to streams 2020-05-30 19:34:01 +01:00
Vexed01
c9cfa92b04 add class docstring to reports 2020-05-30 19:33:32 +01:00
Vexed01
ff46ca546d add class docstring to downloader
idk what to say rly
um hi all nice to be back after about 6 months
pls no hate my PRs
apoligies if i get in the way
if you read this far then you deserve an achievement um i dunno what err how about the achievement of unboredness
2020-05-30 17:19:54 +01:00
Draper
f1ba57b78b [Audio] Lyrics typo - p.s It feels dirty making a PR this small (#3889) 2020-05-30 15:39:50 +02:00
jack1142
4cf83b9ef4 Remove 26 from CODEOWNERS (#3886)
* Update the wildcard to Stonedestroyer

* Or maybe remove it
2020-05-30 02:54:35 +02:00
Kowlin
3702e2e998 Bump to 3.3.9.dev1 (#3875)
Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-05-29 01:27:40 +02:00
Kowlin
30c1adfe5b Bump to 3.3.8 (#3874) 2020-05-29 01:11:02 +02:00
jack1142
c75035bf6e Red 3.3.8 - Changelog (Bonus changelog for 3.3.7 included) (#3800)
* Add 3.3.7 changelog

* Add 3.3.8 or 3.4.0 section

* PR 3815 (issue 3814)

* PR 3822

* PR 3817, 3823, 3837

* PR 3816

* PR 3819

* PR 3829 (issue 3796)

* PR 3844 (issue 3834)

* PR 3851

* PR 3855 (issue 3854)

* PR 3857

* PR 3459 (issue 3353, 3459, 3467, 3471, 3485, 3501, 3506)

* PR 3861

* PR 3862

* PR 3744

* PR 3873

* PR 3847

* PR 3856

* PR 3867

* PR 3843

* PR 3826 (issue 3825)

* PR 3864

* PR 3849

* PR 3793

* PR 3805 (issue 3778)

* Update version in header and add release date
2020-05-29 01:10:28 +02:00
jack1142
59358e7bac Stop showing instance names in redbot-setup help's syntax (#3838) 2020-05-29 01:08:37 +02:00
Dav
19fa0b968f Mention the need of shutdown/startup in update docs (#3849)
* [Docs] Update docs now mention need to restart

Previously the update docs never mentioned that you have to restart yur bot for the update to take effect.

* That actually makes sense...

* Aaand those should probably be turned off as well

* jack and draper.... oi

* Update docs/update_red.rst

* Update docs/update_red.rst

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-05-29 00:14:41 +02:00
jack1142
f2d02a6f46 (again) Handle the ints for user objects in Modlog appropriately (#3805)
* Handle the ints for user objects in Modlog appropriately (#3784)

* God, this is stupid

* Add logging of unexpected exceptions

* Add more specific info for Forbidden error

* add i18n support
2020-05-29 00:09:37 +02:00
jack1142
05ec73266c Fix behavior of is_owner for team applications and put all owner IDs in one attribute (#3793)
* blah

* you idiot

* Me likey Danny's way

* Add a warning when bot has no owner set
2020-05-29 00:03:23 +02:00
jack1142
a9acb80132 Use bot.send_help_for in [p]alias help instead of "hacky way" (#3864)
* Use `bot.send_help_for` instead of this "hack" in `[p]alias help`

* This isn't needed here
2020-05-28 23:58:52 +02:00
jack1142
ed89f70f98 Fix uses of re.sub() (#3826)
* Fix uses of `re.sub()` (pt. 1)

* Fix uses of `re.sub()` (pt. 2)

* Fix uses of `re.sub()` (pt. 3)

* Fix uses of `re.sub()` (pt. 4)

* Revert commands.py
2020-05-28 23:51:53 +02:00
jack1142
45afaa8ec8 Make the checks in [p]alias global add and [p]alias add consistent (#3797) 2020-05-28 23:50:44 +02:00
jack1142
4757c2c945 Add get_babel_regional_format() to redbot.core.i18n.__all__ (#3827) 2020-05-28 23:44:57 +02:00
jack1142
65395185c3 Add lib folder to pkg_resources's working set (#3843) 2020-05-28 23:41:06 +02:00
Draper
f2f3ac7d42 Special case new RLL message (RLL 0.5.1 bump inside) (#3868)
* specialcase new RLL message

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Bump RLL to 0.5.1

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-05-28 23:33:43 +02:00
jack1142
cb999bda7b Stop being destructive on generic DownloaderException (#3867) 2020-05-28 23:33:20 +02:00
Draper
cd14bccdc8 Get fucked Java 8. Long live Java 11 (till we kill you for your big brother Java 13) (#3873)
* Get fucked Java 8. Long live Java 11 (Till we kill you for your big brother Java 13)

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* welp lets simplify this

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>
2020-05-28 23:02:23 +02:00
jack1142
cf6966058e Revise install instructions (+ install Java 11 everywhere, and update pyenv to use Python 3.8.3) (#3847)
* Use `openjdk-r` ppa for Ubuntu 16.04

* Don't add `deadsnakes` ppa for Ubuntu 20.04

* Use Java 11 for Arch Linux

* Update getting started guide to recommend Ubuntu 20.04 over 18

* Use Java 11 for Fedora Linux

* Use Java 11 for openSUSE Tumbleweed

* remove unneded `-u` for ubuntu 20.04 and 18.04

* use `openjdk-11-jre-headless` in all ubuntus

* use headless jre everywhere

* add non interactive flag to zypper calls

* Add emphasis on info about pyenv's warning

* reverse order of Ubuntu LTS versions

* Install Git 2.11+ with `yum replace` on CentOS/RHEL 7

* Add `--gpg-auto-import-keys` flag to non-interactive `zypper ar` usage

* update pyenv instructions to use Python 3.8.3

* Install git after installing everything else in CentOS 7 instructions

* use zypper flags properly

* improve the sentence a little

* I like consistency

* add missing `sudo`s in CentOS instructions

* add tk-devel to CentOS instructions per pyenv's recommendations

* Install gcc 8 from SCL in CentOS 7

* use git222 instead of git2u on CentOS 7

* Add missing `source ~/.bashrc` line

* use git224 instead of git222 on CentOS 7

* use yum swap over yum-plugin-replace in CentOS 7
2020-05-28 22:59:25 +02:00
jack1142
74b209bcc8 Add a TOC tree for version sections + emphasise venv removal in older versions (#3856)
* Add a TOC tree for version sections

* Add emphasis on virtual environment removal
2020-05-28 22:51:30 +02:00
jack1142
4a97020b78 Remove the docstring remains of regex in [p]cleanup self (#3871) 2020-05-28 22:51:04 +02:00
github-actions[bot]
e0d8942741 Automated Crowdin downstream (#3872)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-05-28 22:44:32 +02:00
Draper
4f25e6c1ad Add information on how to update to out of date message (#3744)
* add a more detailed update help

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* ...

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* a bit more clarity

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* sure thing Jack

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* add a disclaimer to the update command saying if the user faces any difficulties to check the system appropriate docs and/or support server

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* add translation support

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* better translation support for these

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Update redbot/core/events.py

Co-Authored-By: Flame442 <34169552+Flame442@users.noreply.github.com>

* Apply suggestions from code review

Co-Authored-By: Flame442 <34169552+Flame442@users.noreply.github.com>

* review

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Revert black fuckery

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* aaaaaaaaaaaaaaaaaaaaaaaaaaa

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* address jacks review

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* black

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* Update redbot/core/events.py

* Update redbot/core/events.py

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* Update redbot/core/utils/_internal_utils.py

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

Co-authored-by: Flame442 <34169552+Flame442@users.noreply.github.com>
Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-05-27 08:39:53 +02:00
jack1142
81b4a1978b Update CODEOWNERS for subpackages in Audio cog (#3869) 2020-05-26 21:08:50 +02:00
Neuro Assassin
87d828a1b0 [Docs] Add information about provisional status of RPC (#3862) 2020-05-25 21:26:46 +02:00
github-actions[bot]
e52ff98cad Automated Crowdin downstream (#3860)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-05-25 00:09:55 +02:00
Predeactor
7cabc876f5 [Audio] Typo fix (#3861) 2020-05-22 17:54:40 +02:00
Draper
8fa47cb789 Merge V3/feature/audio into V3/develop (a.k.a. audio refactor) (#3459) 2020-05-20 22:30:06 +02:00
Neuro Assassin
ef76affd77 Fix local blacklist and whitelist commands (#3857) 2020-05-19 02:22:05 +02:00
Sean
38a034e59b Don't allow to warn other bots (#3855) 2020-05-17 17:03:51 +02:00
Predeactor
fb26ecf577 Fix casing and add missing dot in two commands (#3851) 2020-05-15 15:55:28 +02:00
github-actions[bot]
de99aac3ad Automated Crowdin downstream (#3850)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-05-14 22:07:36 +02:00
Darius St. Clair
4d9d224917 Add pagination to [p]alias list and [p]alias global list (#3844) 2020-05-14 17:05:35 +02:00
Kowlin
ac46b51d41 Update the issue templates (#3842)
* Create config.yml

* How do I typo things sometimes...

* Update .github/ISSUE_TEMPLATE/config.yml

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-05-10 03:32:54 +02:00
Toby Harradine
7aff7962f0 Fix creation of IdentifierData in config raw methods (#3829)
* Fix creation of IdentifierData in config

Also adds some new tests regarding partial primary keys.

Resolves #3796.

Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-05-09 15:11:23 +10:00
Flame442
1a96f276f8 Fix typo in [p]customcom show (#3837) 2020-05-08 16:48:35 +02:00
github-actions[bot]
480c3129bd Automated Crowdin downstream (#3830)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-05-07 16:37:33 +02:00
Michael H
981661ea68 Simplify the inheritance of the bot (#3822) 2020-05-07 03:08:20 +02:00
PredaaA
51f7d6cea2 Show default avatars in [p]userinfo when no avatar is set (#3819) 2020-05-07 02:37:06 +02:00
Qais Patankar
7d28581915 Fix 'authentification' typo (#3823) 2020-05-06 20:20:52 +02:00
Neuro Assassin
4a0f23b0ea Stop allowing spaces in custom commands names (#3816) 2020-05-01 18:32:22 +02:00
Flame442
aaee2d9294 Fix incorrect docstring in [p]helpset maxpages (#3817) 2020-05-01 18:30:58 +02:00
Michael H
d5c960096e Modify CustomCommands to use on_message_without_command (#3811) 2020-05-01 18:30:32 +02:00
jack1142
0c94ce6cc3 Make server lock work again (#3815) 2020-05-01 18:29:57 +02:00
jack1142
f280eea788 Dev bump (#3804) 2020-04-28 03:15:06 +02:00
Kowlin
af7b0e4e1f Update to 3.3.7 (#3803) 2020-04-28 02:07:39 +02:00
Kowlin
ef35fc0c5f Revert "Handle the ints for user objects in Modlog appropriately (#3784)" (#3802)
This reverts commit e595f1859a.
2020-04-28 02:03:22 +02:00
Kowlin
ca1f39a260 Update __init__.py (#3799) 2020-04-27 20:21:25 +02:00
Kowlin
b92d61e154 Update version to 3.3.6 (#3798) 2020-04-27 20:06:42 +02:00
jack1142
70ff884ebb Red 3.3.6 - Changelog (#3738)
* Add 3.3.6 section

* PR 3746

* commit b8ac70e

* PR 3747

* PR 3759 (issue 3758)

* PR 3764

* PR 3766

* PR 3767

* PR 3776

* PR 3757

* PR 3773 (issue 3772)

* PR 3740

* PR 3774

* PR 3784 (issue 3778)

* PR 3782

* PR 3783

* PR 3783

* PR 3718

* PR 3742

* PR 3791

* PR 3792

* PR 3794

* PR 3780

* PR 3790

* PR 3795

* PR 3714 (issue 3115)

* PR 3788

* Add release date
2020-04-27 19:58:41 +02:00
TrustyJAID
6f6c536236 [Alias] Create caching to call config less frequently (#3788) 2020-04-27 02:25:41 +02:00
jack1142
a1095285e4 Fix migrations from JSON driver (#3714) 2020-04-27 01:32:52 +02:00
Neuro Assassin
00d20f14b9 Add [p]cc raw command giving raw (escaped) response (#3795) 2020-04-27 01:31:43 +02:00
jack1142
560e0f7334 Add docs for updating Red (#3790)
* wip

* Add 3.0.2 or older instructions

* rephrase

* emphasis

* another rephrase

* Add 3.2.0+ instructions for Linux & Mac

* change indents
2020-04-26 19:35:59 +02:00
Draper
fc2dce6882 [Driver] Ensure JSON driver has a singular lock per cog name (#3780) 2020-04-26 18:21:48 +02:00
Draper
bd3d0dd64d Show current driver in [p]debuginfo (#3794)
Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-04-26 16:07:57 +02:00
jack1142
f824d09ed3 Update install docs to include Ubuntu 20.04 (#3792) 2020-04-25 01:54:07 +02:00
aikaterna
d7c5f86ce7 [Audio] Update Lavalink.jar version (#3791) 2020-04-24 19:15:19 +02:00
PredaaA
c760b43e5a Allow to disable escaping in chat formatting utils (#3742)
Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-04-24 18:17:19 +02:00
jack1142
b1fe807b47 Don't run command checks on each message starting with a prefix (#3718) 2020-04-24 18:12:25 +02:00
jack1142
0d6a7eb797 Stop fetching bans when checking for tempban expiration (#3783) 2020-04-24 18:11:41 +02:00
Kowlin
bf6390d72e Fix Owner ID failsafe (#3782)
* Fix Owner ID failsafe

* Update redbot/core/bot.py

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* Let's go with a different approach (first commit)

* Let's go with a different approach (last commit)

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-04-24 18:03:58 +02:00
jack1142
e595f1859a Handle the ints for user objects in Modlog appropriately (#3784) 2020-04-24 04:08:08 +02:00
jack1142
06930ebe2c Patched the Patch where the Patch patched too much 2020-04-24 03:33:12 +02:00
jack1142
08c96a6794 Change pyenv instructions to update pyenv when it's already installed (#3740)
* Change pyenv instructions to update pyenv when it's already installed

* Use latest Python version
2020-04-24 03:30:11 +02:00
github-actions[bot]
61db89e89d Automated Crowdin downstream (#3785)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-04-23 14:44:20 +02:00
Draper
a2c0e4ca2e Fix sleeping and improve documentation for AsyncIter (#3776)
* welp

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* moar docs

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* moar docs

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Remove unnecessary items in `:exclude-members:`

* Make whitespace in docstrings consistent

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-04-21 13:45:03 +02:00
jack1142
b08a950c37 Stop using localised display name in stream url (#3773) 2020-04-20 20:03:34 +02:00
Draper
ad979180e5 Make the largest loops lazier and async to avoid blocking (#3767)
* lets reduce config calls here

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Lets normalize how we name config attributes across the bot.

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* ....

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Just a tiny PR improving config call in a lot of places (Specially events and Help)

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* stop using `bot.guilds` in `on_command_add`

* Just a tiny PR improving config call in a lot of places (Specially events and Help)

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* missed this one

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* nothing to see here

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* lets reduce config calls here

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Just a tiny PR improving config call in a lot of places (Specially events and Help)

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* stop using `bot.guilds` in `on_command_add`

* missed this one

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* welp

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* welp

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* welp

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* jack

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Update redbot/cogs/mod/kickban.py

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* Update redbot/cogs/filter/filter.py

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* jack

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* make all large loops async to avoid blocking larger bots

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* ...

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* okay now working AsyncGen

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* may or may not have forgotten black

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Apply suggestions from code review

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* jack's review

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* DOCS

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* DOCS

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Apply suggestions from code review

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* jack

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Apply suggestions from code review

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* Update redbot/core/utils/__init__.py

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* Update redbot/core/utils/__init__.py

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* avoid loop if possible and if not only iterate once

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-04-20 19:56:28 +02:00
jack1142
465812b673 Add a command to remove bot's avatar (#3757)
* Add a command to remove bot's avatar

* blah
2020-04-20 19:40:14 +02:00
Draper
f59e77002b Optimize config calls in few places (#3766)
* Just a tiny PR improving config call in a lot of places (Specially events and Help)

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* missed this one

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* welp

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* welp

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* welp

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* jack

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* Update redbot/cogs/mod/kickban.py

Co-Authored-By: jack1142 <6032823+jack1142@users.noreply.github.com>

* jack

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-04-20 19:29:36 +02:00
Draper
e4018ec677 Normalize names of attributes with Config instances (#3765)
* Lets normalize how we name config attributes across the bot.

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* ....

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* nothing to see here

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>
2020-04-20 19:12:57 +02:00
Draper
df7ca65108 Reduce calls to config in the on_command_add event (#3764)
* lets reduce config calls here

Signed-off-by: Drapersniper <27962761+drapersniper@users.noreply.github.com>

* stop using `bot.guilds` in `on_command_add`

Co-authored-by: jack1142 <6032823+jack1142@users.noreply.github.com>
2020-04-20 19:10:58 +02:00
github-actions[bot]
d12fcac9af Automated Crowdin downstream (#3761)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-04-18 17:16:57 +02:00
Ryan
66fc28ec1b [Trivia] Correct spelling of compact disc in games.yaml (#3759) 2020-04-15 00:08:17 +02:00
Kowlin
10ad2a559a [Core] Support setting avatar via attachment (#3747)
* [Core] Support avatars via attachments

* Fix the thing I was actually annoyed about.

* Updated error texts

* English is a damn annoying language.
2020-04-13 02:27:55 +02:00
MiniJennJenn
b8ac70e59a Update leagueoflegends.yaml 2020-04-12 17:41:42 -04:00
jack1142
7492636818 Fix ignored channels list in [p]ignore (#3746)
* Fix ignored channels list

* Update settings_caches.py

* Update core_commands.py
2020-04-12 00:09:05 +02:00
github-actions[bot]
36a0eabf4a Automated Crowdin downstream (#3739)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2020-04-09 21:27:35 +02:00
jack1142
cf4fdbbab1 dev bump (#3736) 2020-04-09 00:39:48 +02:00
950 changed files with 51092 additions and 134328 deletions

6
.github/CODEOWNERS vendored
View File

@@ -1,7 +1,5 @@
# Default
* @Twentysix26
# Core
redbot/core/apis/audio/** @aikaterna @Drapersniper
redbot/core/bank.py @palmtree5
redbot/core/checks.py @tekulvw
redbot/core/cli.py @tekulvw
@@ -30,7 +28,7 @@ redbot/core/utils/dbtools.py @mikeshardmind
# Cogs
redbot/cogs/admin/* @tekulvw
redbot/cogs/alias/* @tekulvw
redbot/cogs/audio/* @aikaterna @Drapersniper
redbot/cogs/audio/** @aikaterna @Drapersniper
redbot/cogs/bank/* @tekulvw
redbot/cogs/cleanup/* @palmtree5
redbot/cogs/customcom/* @palmtree5

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Support question
url: https://discord.gg/red
about: For any questions regarding on how to operate and run Red.

View File

@@ -1,5 +1,303 @@
.. 3.3.x Changelogs
Redbot 3.3.9 (2020-06-12)
=========================
| Thanks to all these amazing people that contributed to this release:
| :ghuser:`aikaterna`, :ghuser:`Dav-Git`, :ghuser:`Drapersniper`, :ghuser:`Flame442`, :ghuser:`mikeshardmind`, :ghuser:`NeuroAssassin`, :ghuser:`Predeactor`, :ghuser:`Vexed01`
|
| **Read before updating**:
| 1. Bot owners can no longer restrict access to some commands in Permissions cog using global permissions rules. Look at `Permissions changelog <important-339-2>` for full details.
| 2. There's been a change in behavior of warning messages. Look at `Warnings changelog <important-339-1>` for full details.
End-user changelog
------------------
Security
********
**NOTE**: If you can't update immediately, we recommend disabling the affected command until you can.
- **Mod** - ``[p]tempban`` now properly respects Discord's hierarchy rules (:issue:`3957`)
Core Bot
********
- ``[p]info`` command can now be used when bot doesn't have Embed Links permission (:issue:`3907`, :issue:`3102`)
- Fixed ungraceful error that happened in ``[p]set custominfo`` when provided text was too long (:issue:`3923`)
- Red's start up message now shows storage type (:issue:`3935`)
Audio
*****
- Audio now properly ignores streams when max length is enabled (:issue:`3878`, :issue:`3877`)
- Commands that should work in DMs no longer error (:issue:`3880`)
Filter
******
- Fixed behavior of detecting quotes in commands for adding/removing filtered words (:issue:`3925`)
.. _important-339-2:
Permissions
***********
- **Both global and server rules** can no longer prevent guild owners from accessing commands for changing server rules. Bot owners can still use ``[p]command disable`` if they wish to completely disable any command in Permissions cog (:issue:`3955`, :issue:`3107`)
Full list of affected commands:
- ``[p]permissions acl getserver``
- ``[p]permissions acl setserver``
- ``[p]permissions acl updateserver``
- ``[p]permissions addserverrule``
- ``[p]permissions removeserverrule``
- ``[p]permissions setdefaultserverrule``
- ``[p]permissions clearserverrules``
- ``[p]permissions canrun``
- ``[p]permissions explain``
.. _important-339-1:
Warnings
********
- Warnings sent to users don't show the moderator who warned the user by default now. Newly added ``[p]warningset showmoderators`` command can be used to switch this behaviour (:issue:`3781`)
- Warn channel functionality has been fixed (:issue:`3781`)
Developer changelog
-------------------
Core Bot
********
- Added `bot.set_prefixes() <RedBase.set_prefixes()>` method that allows developers to set global/server prefixes (:issue:`3890`)
Documentation changes
---------------------
- Added Oracle Cloud to free hosting section in :ref:`host-list` (:issue:`3916`)
Miscellaneous
-------------
- Added missing help message for Downloader, Reports and Streams cogs (:issue:`3892`)
- **Core Bot** - cooldown in ``[p]contact`` no longer applies when it's used without any arguments (:issue:`3942`)
- **Core Bot** - improved instructions on obtaining user ID in help of ``[p]dm`` command (:issue:`3946`)
- **Alias** - ``[p]alias global`` group, ``[p]alias help``, and ``[p]alias show`` commands can now be used in DMs (:issue:`3941`, :issue:`3940`)
- **Audio** - Typo fix (:issue:`3889`, :issue:`3900`)
- **Audio** - Fixed ``[p]audioset autoplay`` being available in DMs (:issue:`3899`)
- **Bank** - ``[p]bankset`` now displays bank's scope (:issue:`3954`)
- **Mod** - Preemptive fix for d.py 1.4 (:issue:`3891`)
Redbot 3.3.8 (2020-05-29)
==================================
| Thanks to all these amazing people that contributed to this release:
| :ghuser:`aikaterna`, :ghuser:`Bakersbakebread`, :ghuser:`DariusStClair`, :ghuser:`Dav-Git`, :ghuser:`Drapersniper`, :ghuser:`Flame442`, :ghuser:`jack1142`, :ghuser:`mikeshardmind`, :ghuser:`NeuroAssassin`, :ghuser:`PredaaA`, :ghuser:`Predeactor`, :ghuser:`qaisjp`, :ghuser:`Tobotimus`
End-user changelog
------------------
Core Bot
********
- Important fixes to how PostgreSQL data backend saves data in bulks (:issue:`3829`)
- Fixed ``[p]localwhitelist`` and ``[p]localblacklist`` commands (:issue:`3857`)
- Red now includes information on how to update when sending information about being out of date (:issue:`3744`)
- Using backslashes in bot's username/nickname no longer causes issues (:issue:`3826`, :issue:`3825`)
Admin
*****
- Fixed server lock (:issue:`3815`, :issue:`3814`)
Alias
*****
- Added pagination to ``[p]alias list`` and ``[p]alias global list`` to avoid errors for users with a lot of aliases (:issue:`3844`, :issue:`3834`)
- ``[p]alias help`` should now work more reliably (:issue:`3864`)
Audio
*****
- Twitch playback is functional once again (:issue:`3873`)
- Recent errors with YouTube playback should be resolved (:issue:`3873`)
- Added new option (settable with ``[p]audioset lyrics``) that makes Audio cog prefer (prioritize) tracks with lyrics (:issue:`3519`)
- Added global daily (historical) queues (:issue:`3518`)
- Added ``[p]audioset countrycode`` that allows to set the country code for spotify searches (:issue:`3528`)
- Fixed ``[p]local search`` (:issue:`3528`, :issue:`3501`)
- Local folders with special characters should work properly now (:issue:`3528`, :issue:`3467`)
- Audio no longer fails to take the last spot in the voice channel with user limit (:issue:`3528`)
- ``[p]local play`` no longer enqueues tracks from nested folders (:issue:`3528`)
- Fixed ``[p]playlist dedupe`` not removing tracks (:issue:`3518`)
- ``[p]disconnect`` now allows to disconnect if both DJ mode and voteskip aren't enabled (:issue:`3502`, :issue:`3485`)
- Many UX improvements and fixes, including, among other things:
- Creating playlists without explicitly passing ``-scope`` no longer causes errors (:issue:`3500`)
- ``[p]playlist list`` now shows all accessible playlists if ``--scope`` flag isn't used (:issue:`3518`)
- ``[p]remove`` now also accepts a track URL in addition to queue index (:issue:`3201`)
- ``[p]playlist upload`` now accepts a playlist file uploaded in the message with a command (:issue:`3251`)
- Commands now send friendly error messages for common errors like lost Lavalink connection or bot not connected to voice channel (:issue:`3503`, :issue:`3528`, :issue:`3353`, :issue:`3712`)
CustomCommands
**************
- ``[p]customcom create`` no longer allows spaces in custom command names (:issue:`3816`)
Mod
***
- ``[p]userinfo`` now shows default avatar when no avatar is set (:issue:`3819`)
Modlog
******
- Fixed (again) ``AttributeError`` for cases whose moderator doesn't share the server with the bot (:issue:`3805`, :issue:`3784`, :issue:`3778`)
Permissions
***********
- Commands for settings ACL using yaml files now properly works on PostgreSQL data backend (:issue:`3829`, :issue:`3796`)
Warnings
********
- Warnings cog no longer allows to warn bot users (:issue:`3855`, :issue:`3854`)
Developer changelog
-------------------
| **Important:**
| If you're using RPC, please see the full annoucement about current state of RPC in main Red server
`by clicking here <https://discord.com/channels/133049272517001216/411381123101491200/714560168465137694>`_.
Core Bot
********
- Red now inherits from `discord.ext.commands.AutoShardedBot` for better compatibility with code expecting d.py bot (:issue:`3822`)
- Libraries using ``pkg_resources`` (like ``humanize`` or ``google-api-python-client``) that were installed through Downloader should now work properly (:issue:`3843`)
- All bot owner IDs can now be found under ``bot.owner_ids`` attribute (:issue:`3793`)
- Note: If you want to use this on bot startup (e.g. in cog's initialisation), you need to await ``bot.wait_until_red_ready()`` first
Documentation changes
---------------------
- Added information about provisional status of RPC (:issue:`3862`)
- Revised install instructions (:issue:`3847`)
- Improved navigation in `document about updating Red <update_red>` (:issue:`3856`, :issue:`3849`)
Miscellaneous
-------------
- Few clarifications and typo fixes in few command help docstrings (:issue:`3817`, :issue:`3823`, :issue:`3837`, :issue:`3851`, :issue:`3861`)
- **Downloader** - Downloader no longer removes the repo when it fails to load it (:issue:`3867`)
Redbot 3.3.7 (2020-04-28)
=========================
This is a hotfix release fixing issue with generating messages for new cases in Modlog.
Redbot 3.3.6 (2020-04-27)
=========================
| Thanks to all these amazing people that contributed to this release:
| :ghuser:`aikaterna`, :ghuser:`Drapersniper`, :ghuser:`jack1142`, :ghuser:`Kowlin`, :ghuser:`MiniJennJenn`, :ghuser:`NeuroAssassin`, :ghuser:`PredaaA`, :ghuser:`TrustyJAID`, :ghuser:`yamikaitou`
End-user changelog
------------------
Core Bot
********
- Converting from and to Postgres driver with ``redbot-setup convert`` have been fixed (:issue:`3714`, :issue:`3115`)
- Fixed big delays in commands that happened when the bot was owner-less (or if it only used co-owners feature) and command caller wasn't the owner (:issue:`3782`)
- Various optimizations
- Reduced calls to data backend when loading bot's commands (:issue:`3764`)
- Reduced calls to data backend when showing help for cogs/commands (:issue:`3766`)
- Improved performance for bots with big amount of guilds (:issue:`3767`)
- Mod cog no longer fetches guild's bans every 60 seconds when handling unbanning for tempbans (:issue:`3783`)
- Reduced the bot load for messages starting with a prefix when fuzzy search is disabled (:issue:`3718`)
- Aliases in Alias cog are now cached for better performance (:issue:`3788`)
Core Commands
*************
- ``[p]set avatar`` now supports setting avatar using attachment (:issue:`3747`)
- Added ``[p]set avatar remove`` subcommand for removing bot's avatar (:issue:`3757`)
- Fixed list of ignored channels that is shown in ``[p]ignore``/``[p]unignore`` (:issue:`3746`)
Audio
*****
- Age-restricted tracks, live streams, and mix playlists from YouTube should work in Audio again (:issue:`3791`)
- Soundcloud's sets and playlists with more than 50 tracks should work in Audio again (:issue:`3791`)
CustomCommands
**************
- Added ``[p]cc raw`` command that gives you the raw response of a custom command for ease of copy pasting (:issue:`3795`)
Modlog
******
- Fixed ``AttributeError`` for cases whose moderator doesn't share the server with the bot (:issue:`3784`, :issue:`3778`)
Streams
*******
- Fixed incorrect stream URLs for Twitch channels that have localised display name (:issue:`3773`, :issue:`3772`)
Trivia
******
- Fixed the error in ``[p]trivia stop`` that happened when there was no ongoing trivia session in the channel (:issue:`3774`)
Trivia Lists
************
- Updated ``leagueoflegends`` list with new changes to League of Legends (`b8ac70e <https://github.com/Cog-Creators/Red-DiscordBot/commit/b8ac70e59aa1328f246784f14f992d6ffe00d778>`_)
Developer changelog
-------------------
Utility Functions
*****************
- Added `redbot.core.utils.AsyncIter` utility class which allows you to wrap regular iterable into async iterator yielding items and sleeping for ``delay`` seconds every ``steps`` items (:issue:`3767`, :issue:`3776`)
- `bold()`, `italics()`, `strikethrough()`, and `underline()` now accept ``escape_formatting`` argument that can be used to disable escaping of markdown formatting in passed text (:issue:`3742`)
Documentation changes
---------------------
- Added `document about updating Red <update_red>` (:issue:`3790`)
- ``pyenv`` instructions will now update ``pyenv`` if it's already installed (:issue:`3740`)
- Updated Python version in ``pyenv`` instructions (:issue:`3740`)
- Updated install docs to include Ubuntu 20.04 (:issue:`3792`)
Miscellaneous
-------------
- **Config** - JSON driver will now properly have only one lock per cog name (:issue:`3780`)
- **Core Commands** - ``[p]debuginfo`` now shows used storage type (:issue:`3794`)
- **Trivia** - Corrected spelling of Compact Disc in ``games`` list (:issue:`3759`, :issue:`3758`)
Redbot 3.3.5 (2020-04-09)
=========================

View File

@@ -34,3 +34,5 @@ extend functionalities used throughout the bot, as outlined below.
:members:
:exclude-members: convert
:no-undoc-members:
.. autoclass:: APIToken

View File

@@ -202,15 +202,15 @@ the built-in Economy credits::
class Pets:
def __init__(self):
self.conf = Config.get_conf(self, 1234567890)
self.config = Config.get_conf(self, 1234567890)
# Here we'll assign some default costs for the pets
self.conf.register_global(
self.config.register_global(
dog=100,
cat=100,
bird=50
)
self.conf.register_user(
self.config.register_user(
pets={}
)
@@ -229,7 +229,7 @@ And now that the cog is set up we'll need to create some commands that allow use
# We will need to use "get_raw"
try:
cost = await self.conf.get_raw(pet_type)
cost = await self.config.get_raw(pet_type)
except KeyError:
# KeyError is thrown whenever the data you try to access does not
# exist in the registered defaults or in the saved data.
@@ -241,15 +241,15 @@ assign a new pet to the user. This is very easily done using the V3 bank API and
# continued
if await bank.can_spend(ctx.author, cost):
await self.conf.user(ctx.author).pets.set_raw(
await self.config.user(ctx.author).pets.set_raw(
pet_name, value={'cost': cost, 'hunger': 0}
)
# this is equivalent to doing the following
pets = await self.conf.user(ctx.author).pets()
pets = await self.config.user(ctx.author).pets()
pets[pet_name] = {'cost': cost, 'hunger': 0}
await self.conf.user(ctx.author).pets.set(pets)
await self.config.user(ctx.author).pets.set(pets)
Since the pets can get hungry we're gonna need a command that let's pet owners check how hungry their pets are::
@@ -257,7 +257,7 @@ Since the pets can get hungry we're gonna need a command that let's pet owners c
@commands.command()
async def hunger(self, ctx, pet_name: str):
try:
hunger = await self.conf.user(ctx.author).pets.get_raw(pet_name, 'hunger')
hunger = await self.config.user(ctx.author).pets.get_raw(pet_name, 'hunger')
except KeyError:
# Remember, this is thrown if something in the provided identifiers
# is not found in the saved data or the defaults.
@@ -274,7 +274,7 @@ We're responsible pet owners here, so we've also got to have a way to feed our p
# This is a bit more complicated because we need to check if the pet is
# owned first.
try:
pet = await self.conf.user(ctx.author).pets.get_raw(pet_name)
pet = await self.config.user(ctx.author).pets.get_raw(pet_name)
except KeyError:
# If the given pet name doesn't exist in our data
await ctx.send("You don't own that pet!")
@@ -285,12 +285,12 @@ We're responsible pet owners here, so we've also got to have a way to feed our p
# Determine the new hunger and make sure it doesn't go negative
new_hunger = max(hunger - food, 0)
await self.conf.user(ctx.author).pets.set_raw(
await self.config.user(ctx.author).pets.set_raw(
pet_name, 'hunger', value=new_hunger
)
# We could accomplish the same thing a slightly different way
await self.conf.user(ctx.author).pets.get_attr(pet_name).hunger.set(new_hunger)
await self.config.user(ctx.author).pets.get_attr(pet_name).hunger.set(new_hunger)
await ctx.send("Your pet is now at {}/100 hunger!".format(new_hunger)
@@ -300,7 +300,7 @@ Of course, if we're less than responsible pet owners, there are consequences::
@commands.command()
async def adopt(self, ctx, pet_name: str, *, member: discord.Member):
try:
pet = await self.conf.user(member).pets.get_raw(pet_name)
pet = await self.config.user(member).pets.get_raw(pet_name)
except KeyError:
await ctx.send("That person doesn't own that pet!")
return
@@ -310,15 +310,15 @@ Of course, if we're less than responsible pet owners, there are consequences::
await ctx.send("That pet is too well taken care of to be adopted.")
return
await self.conf.user(member).pets.clear_raw(pet_name)
await self.config.user(member).pets.clear_raw(pet_name)
# this is equivalent to doing the following
pets = await self.conf.user(member).pets()
pets = await self.config.user(member).pets()
del pets[pet_name]
await self.conf.user(member).pets.set(pets)
await self.config.user(member).pets.set(pets)
await self.conf.user(ctx.author).pets.set_raw(pet_name, value=pet)
await self.config.user(ctx.author).pets.set_raw(pet_name, value=pet)
await ctx.send(
"Your request to adopt this pet has been granted due to "
"how poorly it was taken care of."
@@ -351,15 +351,15 @@ much the same way they would in V2. The following examples will demonstrate how
class ExampleCog:
def __init__(self):
self.conf = Config.get_conf(self, 1234567890)
self.config = Config.get_conf(self, 1234567890)
self.data = {}
async def load_data(self):
self.data = await self.conf.custom("V2", "V2").all()
self.data = await self.config.custom("V2", "V2").all()
async def save_data(self):
await self.conf.custom("V2", "V2").set(self.data)
await self.config.custom("V2", "V2").set(self.data)
async def setup(bot):
@@ -407,13 +407,13 @@ API Reference
includes keys within a `dict` when one is being set, as well as keys in nested dictionaries
within that `dict`. For example::
>>> conf = Config.get_conf(self, identifier=999)
>>> conf.register_global(foo={})
>>> await conf.foo.set_raw(123, value=True)
>>> await conf.foo()
>>> config = Config.get_conf(self, identifier=999)
>>> config.register_global(foo={})
>>> await config.foo.set_raw(123, value=True)
>>> await config.foo()
{'123': True}
>>> await conf.foo.set({123: True, 456: {789: False}}
>>> await conf.foo()
>>> await config.foo.set({123: True, 456: {789: False}}
>>> await config.foo()
{'123': True, '456': {'789': False}}
.. automodule:: redbot.core.config

View File

@@ -4,6 +4,10 @@
RPC
===
.. important::
RPC support is included in Red on a provisional basis. Backwards incompatible changes (up to and including removal of the RPC) may occur if deemed necessary.
V3 comes default with an internal RPC server that may be used to remotely control the bot in various ways.
Cogs must register functions to be exposed to RPC clients.
Each of those functions must only take JSON serializable parameters and must return JSON serializable objects.

View File

@@ -10,6 +10,18 @@ General Utility
.. automodule:: redbot.core.utils
:members: deduplicate_iterables, bounded_gather, bounded_gather_iter
.. autoclass:: AsyncIter
:members:
:special-members: __await__
:exclude-members: enumerate, filter
.. automethod:: enumerate
:async-for:
.. automethod:: filter
:async-for:
Chat Formatting
===============

View File

@@ -270,7 +270,7 @@ If you want to do it, follow these steps.
2. **Install Linux**
Most of the VPS providers have tools for installing Linux automatically. If
you're a beginner, we recommend **Ubuntu 18**.
you're a beginner, we recommend **Ubuntu 20.04 LTS**.
For Raspberry Pi users, just install `Raspbian
<https://www.raspberrypi.org/downloads/raspbian/>`_ on a micro-SD card.

View File

@@ -35,8 +35,8 @@ Open a terminal or command prompt and type one of the following
intended for normal users.** We will not support anyone using the development version in any
support channels. Using the development version may break third party cogs and not all core
commands may work. Downgrading to stable after installing the development version may cause
data loss, crashes or worse. Please keep this in mind when using the Development version
While working on cog creation.
data loss, crashes or worse. Please keep this in mind when using the development version
while working on cog creation.
.. code-block:: none

View File

@@ -59,6 +59,9 @@ Others
|`Microsoft Azure |Same as AWS, but it's Microsoft. |
|<https://azure.microsoft.com>`_ | |
+-------------------------------------+-----------------------------------------------------+
|`Oracle Cloud |Same as AWS, but it's Oracle. |
|<https://oracle.com/cloud/>`_ | |
+-------------------------------------+-----------------------------------------------------+
|`LowEndBox <http://lowendbox.com/>`_ |A curator for lower specced servers. |
+-------------------------------------+-----------------------------------------------------+
@@ -76,7 +79,10 @@ server. Any modern hardware should work 100% fine.
Free hosting
------------
Google Cloud and AWS both have free tier VPS suitable for small bots.
`Google Cloud Compute Free Tier <https://cloud.google.com/free/docs/gcp-free-tier>`_,
`Oracle Cloud Compute Always Free <https://oracle.com/cloud/free/#always-free>`_ and
`AWS EC2 Free Tier <https://aws.amazon.com/free/>`_ have free tier VPSes suitable for small bots.
AWS EC2 is not *always* free—it's a 12 month free trial.
Additionally, new Google Cloud customers get a $300 credit which is valid
for 12 months.

View File

@@ -14,6 +14,7 @@ Welcome to Red - Discord Bot's documentation!
install_windows
install_linux_mac
update_red
about_venv
autostart_systemd
autostart_pm2

View File

@@ -43,14 +43,14 @@ Arch Linux
.. code-block:: none
sudo pacman -Syu python python-pip git jre-openjdk-headless base-devel
sudo pacman -Syu python python-pip git jre11-openjdk-headless base-devel
Continue by `creating-venv-linux`.
----
.. _install-centos:
.. _install-rhel:
.. _install-centos7:
.. _install-rhel7:
~~~~~~~~~~~~~~~~~
CentOS and RHEL 7
@@ -58,17 +58,27 @@ CentOS and RHEL 7
.. code-block:: none
yum -y groupinstall development
yum -y install https://centos7.iuscommunity.org/ius-release.rpm
sudo yum -y groupinstall development
sudo yum -y install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel \
openssl-devel xz xz-devel libffi-devel findutils git2u java-11-openjdk
openssl-devel xz xz-devel tk-devel libffi-devel findutils java-11-openjdk-headless
sudo yum -y install centos-release-scl
sudo yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++
echo "source scl_source enable devtoolset-8" >> ~/.bashrc
source ~/.bashrc
In order to install Git 2.11 or greater, we recommend adding the IUS repository:
.. code-block:: none
sudo yum -y install https://repo.ius.io/ius-release-el7.rpm
sudo yum -y swap git git224
Complete the rest of the installation by `installing Python 3.8 with pyenv <install-python-pyenv>`.
----
.. _install-centos8:
.. _install-rhel8:
.. _install-centos:
.. _install-rhel:
~~~~~~~~~~~~~~~~~
CentOS and RHEL 8
@@ -76,11 +86,11 @@ CentOS and RHEL 8
.. code-block:: none
yum -y install epel-release
yum update -y
yum -y groupinstall development
yum -y install git zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel findutils java-11-openjdk
sudo yum -y install epel-release
sudo yum -y update
sudo yum -y groupinstall development
sudo yum -y install git zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel \
openssl-devel xz xz-devel tk-devel libffi-devel findutils java-11-openjdk-headless
Complete the rest of the installation by `installing Python 3.8 with pyenv <install-python-pyenv>`.
@@ -105,8 +115,8 @@ Debian Stretch. This guide will tell you how. First, run the following commands:
sudo echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/red-sources.list
sudo apt update
sudo apt -y install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev \
libxmlsec1-dev libffi-dev liblzma-dev libgdbm-dev uuid-dev python3-openssl git openjdk-11-jre
libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
libffi-dev liblzma-dev libgdbm-dev uuid-dev python3-openssl git openjdk-11-jre-headless
CXX=/usr/bin/g++
Complete the rest of the installation by `installing Python 3.8 with pyenv <install-python-pyenv>`.
@@ -127,8 +137,8 @@ Debian/Raspbian Buster. This guide will tell you how. First, run the following c
sudo apt update
sudo apt -y install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev \
libxmlsec1-dev libffi-dev liblzma-dev libgdbm-dev uuid-dev python3-openssl git openjdk-11-jre
libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
libffi-dev liblzma-dev libgdbm-dev uuid-dev python3-openssl git openjdk-11-jre-headless
CXX=/usr/bin/g++
Complete the rest of the installation by `installing Python 3.8 with pyenv <install-python-pyenv>`.
@@ -146,7 +156,7 @@ them with dnf:
.. code-block:: none
sudo dnf -y install python38 git java-latest-openjdk-headless @development-tools
sudo dnf -y install python38 git java-11-openjdk-headless @development-tools
Continue by `creating-venv-linux`.
@@ -197,14 +207,17 @@ First, add the Opt-Python community repository:
.. code-block:: none
source /etc/os-release
sudo zypper ar -f https://download.opensuse.org/repositories/home:/Rotkraut:/Opt-Python/openSUSE_Leap_${VERSION_ID}/ Opt-Python
sudo zypper -n ar -f \
https://download.opensuse.org/repositories/home:/Rotkraut:/Opt-Python/openSUSE_Leap_${VERSION_ID}/ \
Opt-Python
sudo zypper -n --gpg-auto-import-keys ref
Now install the pre-requirements with zypper:
.. code-block:: none
sudo zypper install opt-python38 opt-python38-setuptools git-core java-11-openjdk-headless
sudo zypper install -t pattern devel_basis
sudo zypper -n install opt-python38 opt-python38-setuptools git-core java-11-openjdk-headless
sudo zypper -n install -t pattern devel_basis
Since Python is now installed to ``/opt/python``, we should add it to PATH. You can add a file in
``/etc/profile.d/`` to do this:
@@ -230,25 +243,31 @@ with zypper:
.. code-block:: none
sudo zypper install python3-base python3-pip git-core java-12-openjdk-headless
sudo zypper install -t pattern devel_basis
sudo zypper -n install python3-base python3-pip git-core java-11-openjdk-headless
sudo zypper -n install -t pattern devel_basis
Continue by `creating-venv-linux`.
----
.. _install-ubuntu:
.. _install-ubuntu-1604:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ubuntu LTS versions (18.04 and 16.04)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~
Ubuntu 16.04 LTS
~~~~~~~~~~~~~~~~
We recommend adding the ``git-core`` ppa to install Git 2.11 or greater:
We recommend adding the ``openjdk-r`` ppa to install Java 11:
.. code-block:: none
sudo apt update
sudo apt -y install software-properties-common
sudo add-apt-repository -yu ppa:openjdk-r/ppa
We recommend adding the ``git-core`` ppa to install Git 2.11 or greater:
.. code-block:: none
sudo add-apt-repository -yu ppa:git-core/ppa
We recommend adding the ``deadsnakes`` ppa to install Python 3.8.1 or greater:
@@ -261,7 +280,63 @@ Now install the pre-requirements with apt:
.. code-block:: none
sudo apt -y install python3.8 python3.8-dev python3.8-venv python3-pip git default-jre-headless \
sudo apt -y install python3.8 python3.8-dev python3.8-venv python3-pip git openjdk-11-jre-headless \
build-essential
Continue by `creating-venv-linux`.
----
.. _install-ubuntu-1804:
~~~~~~~~~~~~~~~~
Ubuntu 18.04 LTS
~~~~~~~~~~~~~~~~
We recommend adding the ``git-core`` ppa to install Git 2.11 or greater:
.. code-block:: none
sudo apt update
sudo apt -y install software-properties-common
sudo add-apt-repository -y ppa:git-core/ppa
We recommend adding the ``deadsnakes`` ppa to install Python 3.8.1 or greater:
.. code-block:: none
sudo add-apt-repository -y ppa:deadsnakes/ppa
Now install the pre-requirements with apt:
.. code-block:: none
sudo apt -y install python3.8 python3.8-dev python3.8-venv python3-pip git openjdk-11-jre-headless \
build-essential
Continue by `creating-venv-linux`.
----
.. _install-ubuntu:
~~~~~~~~~~~~~~~~
Ubuntu 20.04 LTS
~~~~~~~~~~~~~~~~
We recommend adding the ``git-core`` ppa to install Git 2.11 or greater:
.. code-block:: none
sudo apt update
sudo apt -y install software-properties-common
sudo add-apt-repository -y ppa:git-core/ppa
Now install the pre-requirements with apt:
.. code-block:: none
sudo apt -y install python3.8 python3.8-dev python3.8-venv python3-pip git openjdk-11-jre-headless \
build-essential
Continue by `creating-venv-linux`.
@@ -289,7 +364,7 @@ installing pyenv. To do this, first run the following commands:
sudo apt -y install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev \
libxmlsec1-dev libffi-dev liblzma-dev libgdbm-dev uuid-dev python3-openssl git openjdk-11-jre
libxmlsec1-dev libffi-dev liblzma-dev libgdbm-dev uuid-dev python3-openssl git openjdk-11-jre-headless
CXX=/usr/bin/g++
And then complete the rest of the installation by `installing Python 3.8 with pyenv <install-python-pyenv>`.
@@ -313,16 +388,16 @@ virtual environment.
.. code-block:: none
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
command -v pyenv && pyenv update || curl https://pyenv.run | bash
After this command, you may see a warning about 'pyenv' not being in the load path. Follow the
instructions given to fix that, then close and reopen your shell.
**After this command, you may see a warning about 'pyenv' not being in the load path. Follow the
instructions given to fix that, then close and reopen your shell.**
Then run the following command:
.. code-block:: none
CONFIGURE_OPTS=--enable-optimizations pyenv install 3.8.1 -v
CONFIGURE_OPTS=--enable-optimizations pyenv install 3.8.3 -v
This may take a long time to complete, depending on your hardware. For some machines (such as
Raspberry Pis and micro-tier VPSes), it may take over an hour; in this case, you may wish to remove
@@ -334,7 +409,7 @@ After that is finished, run:
.. code-block:: none
pyenv global 3.8.1
pyenv global 3.8.3
Pyenv is now installed and your system should be configured to run Python 3.8.

View File

@@ -4,18 +4,29 @@
Installing Red on Windows
=========================
---------------
Needed Software
---------------
-------------------------------
Installing the pre-requirements
-------------------------------
The following software dependencies can all be installed quickly and easily through PowerShell,
using a trusted package manager for Windows called `Chocolatey <https://chocolatey.org>`_
Please install the pre-requirements by following instructions from one of the following subsections.
We also provide instructions for manually installing all of the dependencies.
The pre-requirements are:
- Python 3.8.1 or greater
- Pip 18.1 or greater
- Git 2.11+
- Java Runtime Environment 11 (for audio support)
******************************************
Installing using powershell and chocolatey
******************************************
We also recommend installing some basic compiler tools, in case our dependencies don't provide
pre-built "wheels" for your architecture.
.. contents:: Choose a method of installing pre-requirements:
:local:
----
*********************************************
Using PowerShell and Chocolatey (recommended)
*********************************************
To install via PowerShell, search "powershell" in the Windows start menu,
right-click on it and then click "Run as administrator"
@@ -39,6 +50,8 @@ For Audio support, you should also run the following command before exiting:
From here, exit the prompt then continue onto `creating-venv-windows`.
----
********************************
Manually installing dependencies
********************************
@@ -61,6 +74,9 @@ Manually installing dependencies
* `Java 11 <https://adoptopenjdk.net/?variant=openjdk11&jvmVariant=hotspot>`_ - needed for Audio
From here, continue onto `creating-venv-windows`.
----
.. _creating-venv-windows:

135
docs/update_red.rst Normal file
View File

@@ -0,0 +1,135 @@
============
Updating Red
============
Updating to the latest version of Red has several benefits:
- New features and improvements are added.
- Bugs are fixed.
- Your bot is safe from security vulnerabilities that have been found.
Here are some things to consider to help make your upgrade as smooth as possible.
.. note::
If you're developing for Red, you should also look for "Breaking changes" sections in release notes for each minor (X.Y.0) version that's been released since you last updated Red.
Updating differs depending on the version you currently have. Next sections will explain how to upgrade to latest version of Red (|version|) from the version that is in the header of the section.
.. contents:: Choose the version you're currently on from the list below:
:local:
:depth: 1
Red 3.2.0 or newer
******************
Windows
-------
If you have Red 3.2.0 or newer, you can upgrade by following these 4 easy steps:
1. Shut your bot down.
2. Activate your venv with the following command:
.. code:: none
"%userprofile%\redenv\Scripts\activate.bat"
3. Update Red with this command:
.. code:: none
python -m pip install -U Red-DiscordBot
.. attention::
If you're using PostgreSQL data backend, replace ``Red-DiscordBot`` in the second command with ``Red-DiscordBot[postgres]``
4. Start your bot.
Linux & Mac
-----------
If you have Red 3.2.0 or newer, you can upgrade by following these 4 easy steps:
1. Shut your bot down.
2. Activate your virtual environment.
If you used ``venv`` for your virtual environment, use:
.. code:: none
source ~/redenv/bin/activate
If you used ``pyenv`` for your virtual environment, use:
.. code:: none
pyenv shell <name>
3. Update Red with this command:
.. code:: none
python -m pip install -U Red-DiscordBot
.. attention::
If you're using PostgreSQL data backend, replace ``Red-DiscordBot`` in the second command with ``Red-DiscordBot[postgres]``
4. Start your bot.
Red 3.1.X
*********
If you have Red 3.1.X, you will need to follow the install instructions for your operating system. Make sure that you turn your bot off first.
- `Windows <install_windows>`
- `Linux & Mac <install_linux_mac>`
Follow every step to ensure you have all dependencies up-to-date and only skip ``redbot-setup`` step as you already have a bot instance.
**If you already have Red installed in a virtual environment, you will need to delete it before starting this process.**
.. attention::
Red 3.2 dropped support for the MongoDB driver
- If you were not using the MongoDB driver, this does not affect you.
- If you were using a 3rd party cog which required MongoDB, it probably still does.
- If you were using the MongoDB driver, **prior to launching your instance after update**,
you will need to run the following commands to convert:
.. code::
python -m pip install dnspython~=1.16.0 motor~=2.0.0 pymongo~=3.8.0
redbot-setup convert [instancename] json
Red 3.0.2 and older
*******************
.. important::
Red 3.2 dropped support for the MongoDB driver
- If you were not using the MongoDB driver, this does not affect you.
- If you were using a 3rd party cog which required MongoDB, it probably still does.
- If you were using the MongoDB driver, **prior to updating**, you will need to convert your data to JSON backend,
using following command:
.. code::
redbot-setup --edit
If you have Red 3.0.2 or older, you will need to follow the install instructions for your operating system. Make sure that you turn your bot off first.
- `Windows <install_windows>`
- `Linux & Mac <install_linux_mac>`
Follow every step to ensure you have all dependencies up-to-date and only skip ``redbot-setup`` step as you already have a bot instance.
**If you already have Red installed in a virtual environment, you will need to delete it before starting this process.**

View File

@@ -20,6 +20,8 @@ which is not private (even if not documented) should not break without notice.
Anything in the ``redbot.cogs`` module or any of it's submodules is specifically
excluded from being guaranteed.
Any RPC method exposed by Red may break without notice.
If you would like something in here to be guaranteed,
open an issue making a case for it to be moved.

View File

@@ -191,7 +191,7 @@ def _update_event_loop_policy():
_asyncio.set_event_loop_policy(_uvloop.EventLoopPolicy())
__version__ = "3.3.5"
__version__ = "3.3.10.dev1"
version_info = VersionInfo.from_str(__version__)
# Filter fuzzywuzzy slow sequence matcher warning

View File

@@ -7,6 +7,7 @@ import json
import logging
import os
import pip
import pkg_resources
import platform
import shutil
import signal
@@ -346,6 +347,14 @@ async def run_bot(red: Red, cli_flags: Namespace) -> None:
LIB_PATH.mkdir(parents=True, exist_ok=True)
if str(LIB_PATH) not in sys.path:
sys.path.append(str(LIB_PATH))
# "It's important to note that the global `working_set` object is initialized from
# `sys.path` when `pkg_resources` is first imported, but is only updated if you do
# all future `sys.path` manipulation via `pkg_resources` APIs. If you manually modify
# `sys.path`, you must invoke the appropriate methods on the `working_set` instance
# to keep it in sync."
# Source: https://setuptools.readthedocs.io/en/latest/pkg_resources.html#workingset-objects
pkg_resources.working_set.add_entry(str(LIB_PATH))
sys.meta_path.insert(0, SharedLibImportWarner())
if cli_flags.token:

View File

@@ -70,11 +70,11 @@ class Admin(commands.Cog):
"""A collection of server administration utilities."""
def __init__(self):
self.conf = Config.get_conf(self, 8237492837454039, force_registration=True)
self.config = Config.get_conf(self, 8237492837454039, force_registration=True)
self.conf.register_global(serverlocked=False)
self.config.register_global(serverlocked=False)
self.conf.register_guild(
self.config.register_guild(
announce_ignore=False,
announce_channel=None, # Integer ID
selfroles=[], # List of integer ID's
@@ -290,7 +290,7 @@ class Admin(commands.Cog):
async def announce(self, ctx: commands.Context, *, message: str):
"""Announce a message to all servers the bot is in."""
if not self.is_announcing():
announcer = Announcer(ctx, message, config=self.conf)
announcer = Announcer(ctx, message, config=self.config)
announcer.start()
self.__current_announcer = announcer
@@ -325,7 +325,7 @@ class Admin(commands.Cog):
"""
if channel is None:
channel = ctx.channel
await self.conf.guild(ctx.guild).announce_channel.set(channel.id)
await self.config.guild(ctx.guild).announce_channel.set(channel.id)
await ctx.send(
_("The announcement channel has been set to {channel.mention}").format(channel=channel)
)
@@ -333,8 +333,8 @@ class Admin(commands.Cog):
@announceset.command(name="ignore")
async def announceset_ignore(self, ctx):
"""Toggle announcements being enabled this server."""
ignored = await self.conf.guild(ctx.guild).announce_ignore()
await self.conf.guild(ctx.guild).announce_ignore.set(not ignored)
ignored = await self.config.guild(ctx.guild).announce_ignore()
await self.config.guild(ctx.guild).announce_ignore.set(not ignored)
if ignored:
await ctx.send(
_("The server {guild.name} will receive announcements.").format(guild=ctx.guild)
@@ -352,14 +352,14 @@ class Admin(commands.Cog):
:param guild:
:return:
"""
selfrole_ids = set(await self.conf.guild(guild).selfroles())
selfrole_ids = set(await self.config.guild(guild).selfroles())
guild_roles = guild.roles
valid_roles = tuple(r for r in guild_roles if r.id in selfrole_ids)
valid_role_ids = set(r.id for r in valid_roles)
if selfrole_ids != valid_role_ids:
await self.conf.guild(guild).selfroles.set(list(valid_role_ids))
await self.config.guild(guild).selfroles.set(list(valid_role_ids))
# noinspection PyTypeChecker
return valid_roles
@@ -427,7 +427,7 @@ class Admin(commands.Cog):
).format(role=role)
)
return
async with self.conf.guild(ctx.guild).selfroles() as curr_selfroles:
async with self.config.guild(ctx.guild).selfroles() as curr_selfroles:
if role.id not in curr_selfroles:
curr_selfroles.append(role.id)
await ctx.send(_("Added."))
@@ -449,7 +449,7 @@ class Admin(commands.Cog):
).format(role=role)
)
return
async with self.conf.guild(ctx.guild).selfroles() as curr_selfroles:
async with self.config.guild(ctx.guild).selfroles() as curr_selfroles:
curr_selfroles.remove(role.id)
await ctx.send(_("Removed."))
@@ -458,8 +458,8 @@ class Admin(commands.Cog):
@checks.is_owner()
async def serverlock(self, ctx: commands.Context):
"""Lock a bot to its current servers only."""
serverlocked = await self.conf.serverlocked()
await self.conf.serverlocked.set(not serverlocked)
serverlocked = await self.config.serverlocked()
await self.config.serverlocked.set(not serverlocked)
if serverlocked:
await ctx.send(_("The bot is no longer serverlocked."))
@@ -467,8 +467,9 @@ class Admin(commands.Cog):
await ctx.send(_("The bot is now serverlocked."))
# region Event Handlers
@commands.Cog.listener()
async def on_guild_join(self, guild: discord.Guild):
if await self.conf.serverlocked():
if await self.config.serverlocked():
await guild.leave()

View File

@@ -3,6 +3,7 @@ import asyncio
import discord
from redbot.core import commands
from redbot.core.i18n import Translator
from redbot.core.utils import AsyncIter
from redbot.core.utils.chat_formatting import humanize_list, inline
_ = Translator("Announcer", __file__)
@@ -55,7 +56,7 @@ class Announcer:
async def announcer(self):
guild_list = self.ctx.bot.guilds
failed = []
for g in guild_list:
async for g in AsyncIter(guild_list, delay=0.5):
if not self.active:
return
@@ -68,7 +69,6 @@ class Announcer:
await channel.send(self.message)
except discord.Forbidden:
failed.append(str(g.id))
await asyncio.sleep(0.5)
if failed:
msg = (

View File

@@ -14,8 +14,7 @@ class SelfRole(commands.Converter):
role_converter = commands.RoleConverter()
role = await role_converter.convert(ctx, arg)
conf = admin.conf
selfroles = await conf.guild(ctx.guild).selfroles()
selfroles = await admin.config.guild(ctx.guild).selfroles()
if role.id not in selfroles:
raise commands.BadArgument(_("The provided role is not a valid selfrole."))

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Afrikaans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: af\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: af_ZA\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: ar_SA\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr "لم يتم تحميل وحدة الأدمن cog."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "الرتبة المذكورة ليست على قائمة الرتب الذاتية."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Bulgarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: bg_BG\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: ca_ES\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-03-05 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: cs_CZ\n"
#: redbot/cogs/admin/admin.py:17
@@ -158,7 +158,7 @@ msgstr "Aplikovat self-role."
#: redbot/cogs/admin/admin.py:375
#, docstring
msgid "\\n Add a selfrole to yourself.\\n\\n Server admins must have configured the role as user settable.\\n NOTE: The role is case sensitive!\\n "
msgstr "\\n Odstraní vám self-roli.\\n\\n Administrátoři serveru musí mít nastavenou roli podle nastaveného uživatele.\\n POZNÁMKA: Role je citlivá na malá a velká písmena!\\n "
msgstr "\\n Přidá vám self-roli.\\n\\n Administrátoři serveru musí mít nastavenou roli podle nastaveného uživatele.\\n POZNÁMKA: Role je citlivá na malá a velká písmena!\\n "
#: redbot/cogs/admin/admin.py:386
#, docstring
@@ -234,7 +234,7 @@ msgstr "Nemohu oznámit následujícím serverům: "
msgid "The Admin cog is not loaded."
msgstr "Admin cog není načten."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "Daná role není platná self-role."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: da_DK\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: de_DE\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr "Ich konnte die Ankündigung auf diesen Servern nicht ausführen: "
msgid "The Admin cog is not loaded."
msgstr "Das Admin-Cog ist nicht geladen."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "Die angegebene Rolle ist keine gültige selbst auswählbare Rolle."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: el_GR\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:16\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: es_ES\n"
#: redbot/cogs/admin/admin.py:17
@@ -21,31 +21,31 @@ msgstr "Intenté hacer algo que Discord me ha negado el permiso. Su comando no s
#: redbot/cogs/admin/admin.py:22
msgid "I can not give {role.name} to {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo dar el rol{role.name} a {member.display_name} porque ese rol es mayor o igual a mi rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:28
msgid "I can not remove {role.name} from {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo eliminar el rol {role.name} de {member.display_name} porque ese rol es mayor o igual que mi rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:34
msgid "I can not edit {role.name} because that role is higher than my or equal to highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo editar el rol {role.name} porque ese rol es mayor que el mío o igual al rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:40
msgid "I can not let you give {role.name} to {member.display_name} because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo dejar que le des el rol {role.name} a {member.display_name} porque ese rol es mayor o igual a tu rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:46
msgid "I can not let you remove {role.name} from {member.display_name} because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo dejar que elimines el rol {role.name} de {member.display_name} porque ese rol es mayor o igual a tu rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:52
msgid "I can not let you edit {role.name} because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo permitir que edites el rol{role.name} porque ese rol es mayor o igual a tu rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:58
msgid "I need manage roles permission to do that."
msgstr ""
msgstr "Necesito el permiso gestionar roles para hacerlo."
#: redbot/cogs/admin/admin.py:60
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
@@ -58,7 +58,7 @@ msgstr "Una colección de utilidades de administración de servidores."
#: redbot/cogs/admin/admin.py:126
msgid "{member.display_name} already has the role {role.name}."
msgstr ""
msgstr "{member.display_name} ya tiene el rol {role.name}."
#: redbot/cogs/admin/admin.py:146
msgid "I successfully added {role.name} to {member.display_name}"
@@ -66,7 +66,7 @@ msgstr "He añadido con éxito {role.name} a {member.display_name}"
#: redbot/cogs/admin/admin.py:156
msgid "{member.display_name} does not have the role {role.name}."
msgstr ""
msgstr "{member.display_name} no tiene el rol {role.name}."
#: redbot/cogs/admin/admin.py:176
msgid "I successfully removed {role.name} from {member.display_name}"
@@ -75,12 +75,12 @@ msgstr "He retirado con éxito {role.name} de {member.display_name}"
#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "\\n Add a role to a user.\\n\\n Use double quotes if the role contains spaces.\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
msgstr "\\n Añadir un rol a un usuario.\\n\\n Usar comillas dobles si el rol contiene espacios.\\n Si el usuario se deja en blanco el valor por defecto es el autor del comando.\\n "
#: redbot/cogs/admin/admin.py:203
#, docstring
msgid "\\n Remove a role from a user.\\n\\n Use double quotes if the role contains spaces.\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
msgstr "\\n Elimina un rol de un usuario.\\n\\n Usar comillas dobles si el rol contiene espacios.\\n Si el usuario se deja en blanco el valor por defecto es el autor del comando.\\n "
#: redbot/cogs/admin/admin.py:217
#, docstring
@@ -90,7 +90,7 @@ msgstr "Editar configuración de rol."
#: redbot/cogs/admin/admin.py:224
#, docstring
msgid "\\n Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
msgstr "\\n Edita el color de un rol.\\n\\n Usar comillas dobles si el rol contiene espacios.\\n El color debe estar en formato hexadecimal.\\n [Selector de color en línea](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Ejemplos:\\n `[p]color editrole \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
#: redbot/cogs/admin/admin.py:253 redbot/cogs/admin/admin.py:286
msgid "Done."
@@ -99,7 +99,7 @@ msgstr "Listo."
#: redbot/cogs/admin/admin.py:257
#, docstring
msgid "\\n Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Example:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
msgstr "\\n Edita el nombre de un rol.\\n\\n Utilice comillas dobles si el rol o el nombre contiene espacios.\\n\\n Ejemplo:\\n `[p]nombre editrole \\\"The Transistor\\\" Test`\\n "
#: redbot/cogs/admin/admin.py:291
#, docstring
@@ -108,115 +108,115 @@ msgstr "Anunciar un mensaje a todos los servidores en que el bot está."
#: redbot/cogs/admin/admin.py:298
msgid "The announcement has begun."
msgstr ""
msgstr "El anuncio ha comenzado."
#: redbot/cogs/admin/admin.py:305
#, docstring
msgid "Cancel a running announce."
msgstr ""
msgstr "Cancela un anuncio en ejecución."
#: redbot/cogs/admin/admin.py:307
msgid "There is no currently running announcement."
msgstr ""
msgstr "No hay ningún anuncio en ejecución."
#: redbot/cogs/admin/admin.py:310
msgid "The current announcement has been cancelled."
msgstr ""
msgstr "El anuncio actual ha sido cancelado."
#: redbot/cogs/admin/admin.py:316
#, docstring
msgid "Change how announcements are sent in this guild."
msgstr ""
msgstr "Cambia cómo son enviados los anuncios en este servidor."
#: redbot/cogs/admin/admin.py:321
#, docstring
msgid "\\n Change the channel where the bot will send announcements.\\n \\n If channel is left blank it defaults to the current channel.\\n "
msgstr ""
msgstr "\\n Cambia el canal donde el bot enviará anuncios.\\n \\n Si se deja en blanco el canal por defecto es el canal actual.\\n "
#: redbot/cogs/admin/admin.py:330
msgid "The announcement channel has been set to {channel.mention}"
msgstr ""
msgstr "El canal de anuncios se ha establecido en {channel.mention}"
#: redbot/cogs/admin/admin.py:335
#, docstring
msgid "Toggle announcements being enabled this server."
msgstr ""
msgstr "Alternar la activación de los anuncios en este servidor."
#: redbot/cogs/admin/admin.py:340
msgid "The server {guild.name} will receive announcements."
msgstr ""
msgstr "El servidor {guild.name} recibirá anuncios."
#: redbot/cogs/admin/admin.py:344
msgid "The server {guild.name} will not receive announcements."
msgstr ""
msgstr "El servidor {guild.name} no recibirá anuncios."
#: redbot/cogs/admin/admin.py:370
#, docstring
msgid "Apply selfroles."
msgstr ""
msgstr "Aplicar selfroles."
#: redbot/cogs/admin/admin.py:375
#, docstring
msgid "\\n Add a selfrole to yourself.\\n\\n Server admins must have configured the role as user settable.\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "\\n Añade un rol a ti mismo.\\n\\n Los administradores del servidor deben haber configurado el rol como usuario configurable.\\n NOTA: El rol es sensible a mayúsculas!\\n "
#: redbot/cogs/admin/admin.py:386
#, docstring
msgid "\\n Remove a selfrole from yourself.\\n\\n Server admins must have configured the role as user settable.\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "\\n Elimina un rol de ti mismo.\\n\\n Los administradores del servidor deben haber configurado el rol como usuario configurable.\\n NOTA: El rol es sensible a mayúsculas!\\n "
#: redbot/cogs/admin/admin.py:397
#, docstring
msgid "\\n Lists all available selfroles.\\n "
msgstr ""
msgstr "\\n Lista de todos los selfroles disponibles.\\n "
#: redbot/cogs/admin/admin.py:407
msgid "Available Selfroles:\\n{selfroles}"
msgstr ""
msgstr "Selfroles disponibles:\\n{selfroles}"
#: redbot/cogs/admin/admin.py:413
#, docstring
msgid "Manage selfroles."
msgstr ""
msgstr "Gestionar selfroles."
#: redbot/cogs/admin/admin.py:418
#, docstring
msgid "\\n Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "\\n Añade un rol a la lista de selfroles disponibles.\\n\\n NOTA: ¡El rol es sensible a mayúsculas\\n "
#: redbot/cogs/admin/admin.py:425
msgid "I cannot let you add {role.name} as a selfrole because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo permitir que añadas {role.name} como selfrole porque ese rol es mayor o igual a tu rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:433
msgid "Added."
msgstr ""
msgstr "Añadido."
#: redbot/cogs/admin/admin.py:436
msgid "That role is already a selfrole."
msgstr ""
msgstr "Ese rol ya es un selfrole."
#: redbot/cogs/admin/admin.py:440
#, docstring
msgid "\\n Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "\\n Quita un rol de la lista de selfroles disponibles.\\n\\n NOTA: El rol es sensible a mayúsculas\\n "
#: redbot/cogs/admin/admin.py:447
msgid "I cannot let you remove {role.name} from being a selfrole because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "No puedo permitir que elimines a {role.name} de ser un selfrole porque ese rol es mayor o igual a tu rol más alto en la jerarquía de Discord."
#: redbot/cogs/admin/admin.py:455
msgid "Removed."
msgstr ""
msgstr "Eliminado."
#: redbot/cogs/admin/admin.py:460
#, docstring
msgid "Lock a bot to its current servers only."
msgstr ""
msgstr "Bloquea el bot sólo a sus servidores actuales."
#: redbot/cogs/admin/admin.py:465
msgid "The bot is no longer serverlocked."
msgstr ""
msgstr "El bot ya no está bloqueado por el servidor."
#: redbot/cogs/admin/admin.py:467
msgid "The bot is now serverlocked."
@@ -224,17 +224,17 @@ msgstr "El bot está bloqueado por el servidor."
#: redbot/cogs/admin/announcer.py:75
msgid "I could not announce to the following server: "
msgstr ""
msgstr "No pude anunciar en el siguiente servidor: "
#: redbot/cogs/admin/announcer.py:77
msgid "I could not announce to the following servers: "
msgstr ""
msgstr "No pude anunciar en los siguientes servidores: "
#: redbot/cogs/admin/converters.py:12
msgid "The Admin cog is not loaded."
msgstr "El cog Admin no está cargado."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "El rol proporcionado no es un selfrole válido."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: fi_FI\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-03-12 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: French\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: fr_FR\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr "Je n'ai pas pu annoncer aux serveurs suivants : "
msgid "The Admin cog is not loaded."
msgstr "Le cog Admin n'est pas chargé."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "Le rôle fourni n'est pas un auto-rôle valide."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: he_IL\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: hu_HU\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:14\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Indonesian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: id_ID\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:14\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: it_IT\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr "Il cog Admin non è caricato."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "Il ruolo fornito non è un ruolo autoassegnabile valido."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:14\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: ja_JP\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:14\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: ko_KR\n"
#: redbot/cogs/admin/admin.py:17
@@ -85,7 +85,7 @@ msgstr ""
#: redbot/cogs/admin/admin.py:217
#, docstring
msgid "Edit role settings."
msgstr ""
msgstr "역할 설정을 변경했어요."
#: redbot/cogs/admin/admin.py:224
#, docstring
@@ -113,7 +113,7 @@ msgstr ""
#: redbot/cogs/admin/admin.py:305
#, docstring
msgid "Cancel a running announce."
msgstr ""
msgstr "실행 중인 공지사항을 취소했어요."
#: redbot/cogs/admin/admin.py:307
msgid "There is no currently running announcement."
@@ -190,7 +190,7 @@ msgstr ""
#: redbot/cogs/admin/admin.py:433
msgid "Added."
msgstr ""
msgstr "추가됐어요."
#: redbot/cogs/admin/admin.py:436
msgid "That role is already a selfrole."
@@ -207,7 +207,7 @@ msgstr ""
#: redbot/cogs/admin/admin.py:455
msgid "Removed."
msgstr ""
msgstr "제거됐어요."
#: redbot/cogs/admin/admin.py:460
#, docstring
@@ -228,13 +228,13 @@ msgstr ""
#: redbot/cogs/admin/announcer.py:77
msgid "I could not announce to the following servers: "
msgstr ""
msgstr "다음과 같은 서버에 알릴 수 없어요. : "
#: redbot/cogs/admin/converters.py:12
msgid "The Admin cog is not loaded."
msgstr ""
msgstr "관리자 cog가 로드되지 않았어요."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: nl_NL\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr "Ik kon de volgende servers niet aankondigen: "
msgid "The Admin cog is not loaded."
msgstr "De admin cog is niet geladen."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "De ingevulde rol is geen beschikbare selfrole."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:14\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: no\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: no_NO\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:14\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: pl_PL\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr "Moduł Admin nie jest załadowany."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-03-26 12:56\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: pt_BR\n"
#: redbot/cogs/admin/admin.py:17
@@ -232,9 +232,9 @@ msgstr "Não pude anunciar nos seguintes servidores: "
#: redbot/cogs/admin/converters.py:12
msgid "The Admin cog is not loaded."
msgstr "A engrenagem Admin não está carregada."
msgstr "O cog 'Admin' não está carregado."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "O cargo fornecido não é um cargo autoatribuível válido."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:15\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: pt_PT\n"
#: redbot/cogs/admin/admin.py:17
@@ -21,11 +21,11 @@ msgstr "Tentei fazer uma coisa que o Discord negou permissão para fazer. O coma
#: redbot/cogs/admin/admin.py:22
msgid "I can not give {role.name} to {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
msgstr ""
msgstr "Eu não posso dar {role.name} a {member.display_name} porque esse cargo é igual ou maior a meu cargo na hierarquia do Discord."
#: redbot/cogs/admin/admin.py:28
msgid "I can not remove {role.name} from {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
msgstr ""
msgstr "Não posso remover {role.name} de {member.display_name} porque esse cargo é igual ou maior a meu cargo na hierarquia do Discord."
#: redbot/cogs/admin/admin.py:34
msgid "I can not edit {role.name} because that role is higher than my or equal to highest role in the Discord hierarchy."
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr "O cog 'Admin' não está carregado."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "O cargo indicado não é um cargo definível válido."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:15\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: ro_RO\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-03-05 12:14\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: ru_RU\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr "Я не могу сделать объявление на следующ
msgid "The Admin cog is not loaded."
msgstr "Модуль Admin не загружен."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "Предоставленная роль не является допустимой ролью."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:16\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Slovak\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,17 +10,18 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: sk_SK\n"
#: redbot/cogs/admin/admin.py:17
msgid "I attempted to do something that Discord denied me permissions for. Your command failed to successfully complete."
msgstr ""
msgstr "Pokúsil som sa urobiť niečo, pre čo mi Discord odoprel povolenie. Váš príkaz sa nepodarilo úspešne dokončiť."
#: redbot/cogs/admin/admin.py:22
msgid "I can not give {role.name} to {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
msgstr ""
msgstr "Nemôžem dať {role.name} na {member.display_name} pretože táto rola je vyššia alebo rovná mojej najvyššej rolí v Discord hierarchií."
#: redbot/cogs/admin/admin.py:28
msgid "I can not remove {role.name} from {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
@@ -49,20 +49,22 @@ msgstr ""
#: redbot/cogs/admin/admin.py:60
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
msgstr ""
msgstr "Už niečo oznamujem. Ak by ste chceli urobiť iné oznámenie, prosím, najskôr použite `{prefix} oznámiť zrušenie`."
#: redbot/cogs/admin/admin.py:70
#, docstring
msgid "A collection of server administration utilities."
msgstr ""
msgstr "\n"
"Zbierka obslužných programov pre správu servera."
#: redbot/cogs/admin/admin.py:126
msgid "{member.display_name} already has the role {role.name}."
msgstr ""
msgstr "{member.display_name} už má rolu {role.name}."
#: redbot/cogs/admin/admin.py:146
msgid "I successfully added {role.name} to {member.display_name}"
msgstr ""
msgstr "\n"
"Úspešne som pridal {role.name} do {member.display_name}"
#: redbot/cogs/admin/admin.py:156
msgid "{member.display_name} does not have the role {role.name}."
@@ -234,7 +236,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:15\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Serbian (Cyrillic)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: sr_SP\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:16\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: sv_SE\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr "Admin cog är inte laddad."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "Den angivna rollen är inte en giltig självroll."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:16\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: tr_TR\n"
#: redbot/cogs/admin/admin.py:17
@@ -21,31 +21,31 @@ msgstr "Bir şey denemeye çalıştım ancak Discord izinlerim yeterli olmadı.
#: redbot/cogs/admin/admin.py:22
msgid "I can not give {role.name} to {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
msgstr ""
msgstr "{member.display_name} kullanıcısına {role.name} veremiyorum çünkü bu rol kendi rolümden daha yüksek bir pozisyonda."
#: redbot/cogs/admin/admin.py:28
msgid "I can not remove {role.name} from {member.display_name} because that role is higher than or equal to my highest role in the Discord hierarchy."
msgstr ""
msgstr "{member.display_name} kullanıcısından {role.name} rolünü kaldıramıyorum çünkü bu rolümden daha yüksek pozisyonda."
#: redbot/cogs/admin/admin.py:34
msgid "I can not edit {role.name} because that role is higher than my or equal to highest role in the Discord hierarchy."
msgstr ""
msgstr "{role.name} kullanıcısının rolünü düzenleyemiyorum, çünkü bu rolümden daha yüksek pozisyonda."
#: redbot/cogs/admin/admin.py:40
msgid "I can not let you give {role.name} to {member.display_name} because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "{member.display_name} kullanıcısına {role.name} rolünü vermene müsaade edemem çünkü bu rol senin mevcut rolünden daha yüksek durumda."
#: redbot/cogs/admin/admin.py:46
msgid "I can not let you remove {role.name} from {member.display_name} because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "{member.display_name} kullanıcısının {role.name} rolünü silmene müsaade edemem çünkü bu rol mevcut rolünden daha yüksek durumda."
#: redbot/cogs/admin/admin.py:52
msgid "I can not let you edit {role.name} because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "{role.name} rolünü düzenlemene müsaade edemem çünkü bu rol mevcut rolünden daha yüksek durumda."
#: redbot/cogs/admin/admin.py:58
msgid "I need manage roles permission to do that."
msgstr ""
msgstr "Bunu yapabilmem için \"rolleri yönet\" iznine ihtiyacım var."
#: redbot/cogs/admin/admin.py:60
msgid "I am already announcing something. If you would like to make a different announcement please use `{prefix}announce cancel` first."
@@ -54,52 +54,52 @@ msgstr "Zaten şuan da bir duyuru yapmaktayım. Başka bir duyuru yapmak istiyor
#: redbot/cogs/admin/admin.py:70
#, docstring
msgid "A collection of server administration utilities."
msgstr "Sunucu yönetimiyle ilgili ayarlar"
msgstr "Sunucu yönetimiyle ilgili ayarlar."
#: redbot/cogs/admin/admin.py:126
msgid "{member.display_name} already has the role {role.name}."
msgstr ""
msgstr "{member.display_name} kullanıcısı {role.name} rolüne zaten sahip."
#: redbot/cogs/admin/admin.py:146
msgid "I successfully added {role.name} to {member.display_name}"
msgstr "{role.name} rolünü {member.display_name} kişisine başarılı bir şekilde ekledim"
msgstr "{role.name} rolünü {member.display_name} kullanıcısına başarılı bir şekilde ekledim."
#: redbot/cogs/admin/admin.py:156
msgid "{member.display_name} does not have the role {role.name}."
msgstr ""
msgstr "{member.display_name} kullanıcısı {role.name} rolüne sahip değil."
#: redbot/cogs/admin/admin.py:176
msgid "I successfully removed {role.name} from {member.display_name}"
msgstr "{role.name} rolünü {member.display_name} kişisine başarılı bir şekilde kaldırdım."
msgstr "{role.name} rolünü {member.display_name} kullanıcısından başarılı bir şekilde kaldırdım"
#: redbot/cogs/admin/admin.py:187
#, docstring
msgid "\\n Add a role to a user.\\n\\n Use double quotes if the role contains spaces.\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
msgstr "\\n Kullanıcıya rol ekle.\\n\\n Rol boşluk içeriyorsa çift tırnak işareti kullanın.\\n Kullanıcı boş bırakılırsa, varsayılan olarak komutun yazarıdır.\\n "
#: redbot/cogs/admin/admin.py:203
#, docstring
msgid "\\n Remove a role from a user.\\n\\n Use double quotes if the role contains spaces.\\n If user is left blank it defaults to the author of the command.\\n "
msgstr ""
msgstr "\\n Kullanıcıdan rol sil.\\n\\n Rol boşluk içeriyorsa çift tırnak işareti kullanın.\\n Kullanıcı boş bırakılırsa, varsayılan olarak komutun yazarıdır.\\n "
#: redbot/cogs/admin/admin.py:217
#, docstring
msgid "Edit role settings."
msgstr "Rol ayarlarını düzenle"
msgstr "Rol ayarlarını düzenle."
#: redbot/cogs/admin/admin.py:224
#, docstring
msgid "\\n Edit a role's colour.\\n\\n Use double quotes if the role contains spaces.\\n Colour must be in hexadecimal format.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Examples:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
msgstr ""
msgstr "Rol rengini düzenler.\\n\\n Rol boşluk içeriyorsa çift tırnak kulanın.\\n Renk hexadecimal formatında olmalıdır.\\n [Online colour picker](http://www.w3schools.com/colors/colors_picker.asp)\\n\\n Örneğin:\\n `[p]editrole colour \\\"The Transistor\\\" #ff0000`\\n `[p]editrole colour Test #ff9900`\\n "
#: redbot/cogs/admin/admin.py:253 redbot/cogs/admin/admin.py:286
msgid "Done."
msgstr "Tamamdır."
msgstr "Tamamlandı."
#: redbot/cogs/admin/admin.py:257
#, docstring
msgid "\\n Edit a role's name.\\n\\n Use double quotes if the role or the name contain spaces.\\n\\n Example:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
msgstr ""
msgstr "Rolün ismini düzenler.\\n\\n Rol boşluk içeriyorsa çift tırnak kulanın.\\n\\n Örneğin:\\n `[p]editrole name \\\"The Transistor\\\" Test`\\n "
#: redbot/cogs/admin/admin.py:291
#, docstring
@@ -117,7 +117,7 @@ msgstr "Şuan yapılan duyuruyu iptal eder."
#: redbot/cogs/admin/admin.py:307
msgid "There is no currently running announcement."
msgstr ""
msgstr "Şu anda yapılan bir duyuru mevcut değil."
#: redbot/cogs/admin/admin.py:310
msgid "The current announcement has been cancelled."
@@ -126,12 +126,12 @@ msgstr "Şuan yapılan duyuru iptal edildi."
#: redbot/cogs/admin/admin.py:316
#, docstring
msgid "Change how announcements are sent in this guild."
msgstr ""
msgstr "Anonsların sunucuya nasıl gönderileceğini belirleyin."
#: redbot/cogs/admin/admin.py:321
#, docstring
msgid "\\n Change the channel where the bot will send announcements.\\n \\n If channel is left blank it defaults to the current channel.\\n "
msgstr ""
msgstr "\\n Botun anonsları hangi kanalda yapacağını belirleyin.\\n \\n Boş bırakırsanız bot anonsları mevcut kanala yapacaktır.\\n "
#: redbot/cogs/admin/admin.py:330
msgid "The announcement channel has been set to {channel.mention}"
@@ -144,70 +144,70 @@ msgstr "Duyuru sistemi bu sunucu için aktif edildi."
#: redbot/cogs/admin/admin.py:340
msgid "The server {guild.name} will receive announcements."
msgstr "{guild.name} sunucusu duyuruları alacak."
msgstr "{guild.name} sunucusu artık duyuruları alacak."
#: redbot/cogs/admin/admin.py:344
msgid "The server {guild.name} will not receive announcements."
msgstr "{guild.name} sunucusu duyuruları almayacak."
msgstr "{guild.name} sunucusu artık duyuruları almayacak."
#: redbot/cogs/admin/admin.py:370
#, docstring
msgid "Apply selfroles."
msgstr ""
msgstr "Kişisel rol ekle."
#: redbot/cogs/admin/admin.py:375
#, docstring
msgid "\\n Add a selfrole to yourself.\\n\\n Server admins must have configured the role as user settable.\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "Kişisel rol ekler.\\n\\n Sunucu yöneticileri kullanıcının kullanabileceği şekilde ayarlamalıdır.\\n\\n NOT: Rol büyük küçük harf duyarlıdır!\\n "
#: redbot/cogs/admin/admin.py:386
#, docstring
msgid "\\n Remove a selfrole from yourself.\\n\\n Server admins must have configured the role as user settable.\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "Kişisel rol siler.\\n\\n Sunucu yöneticileri kullanıcının kullanabileceği şekilde ayarlamalıdır.\\n\\n NOT: Rol büyük küçük harf duyarlıdır!\\n "
#: redbot/cogs/admin/admin.py:397
#, docstring
msgid "\\n Lists all available selfroles.\\n "
msgstr "\\n Kullanılabilir selfrol'leri listeler.\\n "
msgstr "\\n Kullanılabilir kişisel rolleri listeler.\\n "
#: redbot/cogs/admin/admin.py:407
msgid "Available Selfroles:\\n{selfroles}"
msgstr "Kullanılabilir Selfrol'ler:\\n{selfroles}"
msgstr "Kullanılabilir kişisel roller:\\n{selfroles}"
#: redbot/cogs/admin/admin.py:413
#, docstring
msgid "Manage selfroles."
msgstr ""
msgstr "Kişisel rolleri düzenle."
#: redbot/cogs/admin/admin.py:418
#, docstring
msgid "\\n Add a role to the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "\\n Kullanılabilir kişisel roller listesine rol ekler.\\n\\n NOT: Rol büyük küçük harf duyarlıdır!\\n "
#: redbot/cogs/admin/admin.py:425
msgid "I cannot let you add {role.name} as a selfrole because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "{role.name} kullanıcısına belirttiğin rolü vermene müsaade edemem çünkü bu rol mevcut rolünden daha yüksek."
#: redbot/cogs/admin/admin.py:433
msgid "Added."
msgstr ""
msgstr "Eklendi."
#: redbot/cogs/admin/admin.py:436
msgid "That role is already a selfrole."
msgstr ""
msgstr "Bu rol zaten bir kişisel rol."
#: redbot/cogs/admin/admin.py:440
#, docstring
msgid "\\n Remove a role from the list of available selfroles.\\n\\n NOTE: The role is case sensitive!\\n "
msgstr ""
msgstr "\\n Kullanılabilir kişisel roller listesinden rol siler.\\n\\n NOT: Rol büyük küçük harf duyarlıdır!\\n "
#: redbot/cogs/admin/admin.py:447
msgid "I cannot let you remove {role.name} from being a selfrole because that role is higher than or equal to your highest role in the Discord hierarchy."
msgstr ""
msgstr "{role.name} kullanıcısından belirttiğin rolü silmene müsaade edemem çünkü bu rol mevcut rolünden daha yüksek."
#: redbot/cogs/admin/admin.py:455
msgid "Removed."
msgstr ""
msgstr "Kaldırıldı."
#: redbot/cogs/admin/admin.py:460
#, docstring
@@ -216,25 +216,25 @@ msgstr "Botu şuan bulunduğu sunucularda kilitler."
#: redbot/cogs/admin/admin.py:465
msgid "The bot is no longer serverlocked."
msgstr "Bot artık sunucular da kilitli değil"
msgstr "Botun sunucu kilidi aktif değil."
#: redbot/cogs/admin/admin.py:467
msgid "The bot is now serverlocked."
msgstr "Bot şuan sunucularda kilitli."
msgstr "Botun sunucu kilidi aktif."
#: redbot/cogs/admin/announcer.py:75
msgid "I could not announce to the following server: "
msgstr ""
msgstr "Bu sunucuya duyuru yapamıyorum: "
#: redbot/cogs/admin/announcer.py:77
msgid "I could not announce to the following servers: "
msgstr ""
msgstr "Bu sunuculara duyuru yapamıyorum: "
#: redbot/cogs/admin/converters.py:12
msgid "The Admin cog is not loaded."
msgstr "The Admin eklentisi yüklenmedi."
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr "Girilen selfrol geçerli değil."
msgstr "Girilen kişisel rol geçerli bir kişisel rol değil."

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:16\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Ukrainian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: uk_UA\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:16\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: vi_VN\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: zh_CN\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional, Hong Kong\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: zh_HK\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-02-08 18:08+0000\n"
"PO-Revision-Date: 2020-02-13 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-04-23 12:07+0000\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,8 +10,9 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /cogs/admin/locales/messages.pot\n"
"X-Crowdin-File-ID: 42\n"
"Language: zh_TW\n"
#: redbot/cogs/admin/admin.py:17
@@ -234,7 +234,7 @@ msgstr ""
msgid "The Admin cog is not loaded."
msgstr ""
#: redbot/cogs/admin/converters.py:21
#: redbot/cogs/admin/converters.py:20
msgid "The provided role is not a valid selfrole."
msgstr ""

View File

@@ -2,5 +2,7 @@ from .alias import Alias
from redbot.core.bot import Red
def setup(bot: Red):
bot.add_cog(Alias(bot))
async def setup(bot: Red):
cog = Alias(bot)
await cog.initialize()
bot.add_cog(cog)

View File

@@ -1,16 +1,16 @@
from copy import copy
from re import findall, search
from re import search
from string import Formatter
from typing import Generator, Tuple, Iterable, Optional
from typing import Dict, List
import discord
from discord.ext.commands.view import StringView
from redbot.core import Config, commands, checks
from redbot.core.i18n import Translator, cog_i18n
from redbot.core.utils.chat_formatting import box
from redbot.core.utils.chat_formatting import box, pagify
from redbot.core.utils.menus import menu, DEFAULT_CONTROLS
from redbot.core.bot import Red
from .alias_entry import AliasEntry
from .alias_entry import AliasEntry, AliasCache, ArgParseError
_ = Translator("Alias", __file__)
@@ -26,10 +26,6 @@ class _TrackingFormatter(Formatter):
return super().get_value(key, args, kwargs)
class ArgParseError(Exception):
pass
@cog_i18n(_)
class Alias(commands.Cog):
"""Create aliases for commands.
@@ -42,51 +38,23 @@ class Alias(commands.Cog):
and append them to the stored alias.
"""
default_global_settings = {"entries": []}
default_global_settings: Dict[str, list] = {"entries": []}
default_guild_settings = {"enabled": False, "entries": []} # Going to be a list of dicts
default_guild_settings: Dict[str, list] = {"entries": []} # Going to be a list of dicts
def __init__(self, bot: Red):
super().__init__()
self.bot = bot
self._aliases = Config.get_conf(self, 8927348724)
self.config = Config.get_conf(self, 8927348724)
self._aliases.register_global(**self.default_global_settings)
self._aliases.register_guild(**self.default_guild_settings)
self.config.register_global(**self.default_global_settings)
self.config.register_guild(**self.default_guild_settings)
self._aliases: AliasCache = AliasCache(config=self.config, cache_enabled=True)
async def unloaded_aliases(self, guild: discord.Guild) -> Generator[AliasEntry, None, None]:
return (AliasEntry.from_json(d) for d in (await self._aliases.guild(guild).entries()))
async def unloaded_global_aliases(self) -> Generator[AliasEntry, None, None]:
return (AliasEntry.from_json(d) for d in (await self._aliases.entries()))
async def loaded_aliases(self, guild: discord.Guild) -> Generator[AliasEntry, None, None]:
return (
AliasEntry.from_json(d, bot=self.bot)
for d in (await self._aliases.guild(guild).entries())
)
async def loaded_global_aliases(self) -> Generator[AliasEntry, None, None]:
return (AliasEntry.from_json(d, bot=self.bot) for d in (await self._aliases.entries()))
async def is_alias(
self,
guild: Optional[discord.Guild],
alias_name: str,
server_aliases: Iterable[AliasEntry] = (),
) -> Tuple[bool, Optional[AliasEntry]]:
if not server_aliases and guild is not None:
server_aliases = await self.unloaded_aliases(guild)
global_aliases = await self.unloaded_global_aliases()
for aliases in (server_aliases, global_aliases):
for alias in aliases:
if alias.name == alias_name:
return True, alias
return False, None
async def initialize(self):
# This can be where we set the cache_enabled attribute later
if not self._aliases._loaded:
await self._aliases.load_aliases()
def is_command(self, alias_name: str) -> bool:
"""
@@ -100,56 +68,6 @@ class Alias(commands.Cog):
def is_valid_alias_name(alias_name: str) -> bool:
return not bool(search(r"\s", alias_name)) and alias_name.isprintable()
async def add_alias(
self, ctx: commands.Context, alias_name: str, command: str, global_: bool = False
) -> AliasEntry:
indices = findall(r"{(\d*)}", command)
if indices:
try:
indices = [int(a[0]) for a in indices]
except IndexError:
raise ArgParseError(_("Arguments must be specified with a number."))
low = min(indices)
indices = [a - low for a in indices]
high = max(indices)
gaps = set(indices).symmetric_difference(range(high + 1))
if gaps:
raise ArgParseError(
_("Arguments must be sequential. Missing arguments: ")
+ ", ".join(str(i + low) for i in gaps)
)
command = command.format(*(f"{{{i}}}" for i in range(-low, high + low + 1)))
alias = AliasEntry(alias_name, command, ctx.author, global_=global_)
if global_:
settings = self._aliases
else:
settings = self._aliases.guild(ctx.guild)
await settings.enabled.set(True)
async with settings.entries() as curr_aliases:
curr_aliases.append(alias.to_json())
return alias
async def delete_alias(
self, ctx: commands.Context, alias_name: str, global_: bool = False
) -> bool:
if global_:
settings = self._aliases
else:
settings = self._aliases.guild(ctx.guild)
async with settings.entries() as aliases:
for alias in aliases:
alias_obj = AliasEntry.from_json(alias)
if alias_obj.name == alias_name:
aliases.remove(alias)
return True
return False
async def get_prefix(self, message: discord.Message) -> str:
"""
Tries to determine what prefix is used in a message object.
@@ -167,57 +85,11 @@ class Alias(commands.Cog):
return p
raise ValueError(_("No prefix found."))
def get_extra_args_from_alias(
self, message: discord.Message, prefix: str, alias: AliasEntry
) -> str:
"""
When an alias is executed by a user in chat this function tries
to get any extra arguments passed in with the call.
Whitespace will be trimmed from both ends.
:param message:
:param prefix:
:param alias:
:return:
"""
known_content_length = len(prefix) + len(alias.name)
extra = message.content[known_content_length:]
view = StringView(extra)
view.skip_ws()
extra = []
while not view.eof:
prev = view.index
word = view.get_quoted_word()
if len(word) < view.index - prev:
word = "".join((view.buffer[prev], word, view.buffer[view.index - 1]))
extra.append(word)
view.skip_ws()
return extra
async def maybe_call_alias(
self, message: discord.Message, aliases: Iterable[AliasEntry] = None
):
try:
prefix = await self.get_prefix(message)
except ValueError:
return
try:
potential_alias = message.content[len(prefix) :].split(" ")[0]
except IndexError:
return False
is_alias, alias = await self.is_alias(
message.guild, potential_alias, server_aliases=aliases
)
if is_alias:
await self.call_alias(message, prefix, alias)
async def call_alias(self, message: discord.Message, prefix: str, alias: AliasEntry):
new_message = copy(message)
try:
args = self.get_extra_args_from_alias(message, prefix, alias)
except commands.BadArgument as bae:
args = alias.get_extra_args_from_alias(message, prefix)
except commands.BadArgument:
return
trackform = _TrackingFormatter()
@@ -229,8 +101,29 @@ class Alias(commands.Cog):
)
await self.bot.process_commands(new_message)
async def paginate_alias_list(
self, ctx: commands.Context, alias_list: List[AliasEntry]
) -> None:
names = sorted(["+ " + a.name for a in alias_list])
message = "\n".join(names)
temp = list(pagify(message, delims=["\n"], page_length=1850))
alias_list = []
count = 0
for page in temp:
count += 1
page = page.lstrip("\n")
page = (
_("Aliases:\n")
+ page
+ _("\n\nPage {page}/{total}").format(page=count, total=len(temp))
)
alias_list.append(box("".join(page), "diff"))
if len(alias_list) == 1:
await ctx.send(alias_list[0])
return
await menu(ctx, alias_list, DEFAULT_CONTROLS)
@commands.group()
@commands.guild_only()
async def alias(self, ctx: commands.Context):
"""Manage command aliases."""
pass
@@ -257,13 +150,13 @@ class Alias(commands.Cog):
)
return
is_alias, something_useless = await self.is_alias(ctx.guild, alias_name)
if is_alias:
alias = await self._aliases.get_alias(ctx.guild, alias_name)
if alias:
await ctx.send(
_(
"You attempted to create a new alias"
" with the name {name} but that"
" alias already exists on this server."
" alias already exists."
).format(name=alias_name)
)
return
@@ -292,7 +185,7 @@ class Alias(commands.Cog):
# and that the alias name is valid.
try:
await self.add_alias(ctx, alias_name, command)
await self._aliases.add_alias(ctx, alias_name, command)
except ArgParseError as e:
return await ctx.send(" ".join(e.args))
@@ -316,13 +209,13 @@ class Alias(commands.Cog):
)
return
is_alias, something_useless = await self.is_alias(ctx.guild, alias_name)
if is_alias:
alias = await self._aliases.get_alias(None, alias_name)
if alias:
await ctx.send(
_(
"You attempted to create a new global alias"
" with the name {name} but that"
" alias already exists on this server."
" alias already exists."
).format(name=alias_name)
)
return
@@ -338,10 +231,17 @@ class Alias(commands.Cog):
).format(name=alias_name)
)
return
given_command_exists = self.bot.get_command(command.split(maxsplit=1)[0]) is not None
if not given_command_exists:
await ctx.send(
_("You attempted to create a new alias for a command that doesn't exist.")
)
return
# endregion
try:
await self.add_alias(ctx, alias_name, command, global_=True)
await self._aliases.add_alias(ctx, alias_name, command, global_=True)
except ArgParseError as e:
return await ctx.send(" ".join(e.args))
@@ -352,29 +252,20 @@ class Alias(commands.Cog):
)
@alias.command(name="help")
@commands.guild_only()
async def _help_alias(self, ctx: commands.Context, alias_name: str):
"""Try to execute help for the base command of the alias."""
is_alias, alias = await self.is_alias(ctx.guild, alias_name=alias_name)
if is_alias:
if self.is_command(alias.command):
base_cmd = alias.command
else:
base_cmd = alias.command.rsplit(" ", 1)[0]
new_msg = copy(ctx.message)
new_msg.content = f"{ctx.prefix}help {base_cmd}"
await self.bot.process_commands(new_msg)
alias = await self._aliases.get_alias(ctx.guild, alias_name=alias_name)
if alias:
await self.bot.send_help_for(ctx, alias.command)
else:
await ctx.send(_("No such alias exists."))
@alias.command(name="show")
@commands.guild_only()
async def _show_alias(self, ctx: commands.Context, alias_name: str):
"""Show what command the alias executes."""
is_alias, alias = await self.is_alias(ctx.guild, alias_name)
alias = await self._aliases.get_alias(ctx.guild, alias_name)
if is_alias:
if alias:
await ctx.send(
_("The `{alias_name}` alias will execute the command `{command}`").format(
alias_name=alias_name, command=alias.command
@@ -388,14 +279,11 @@ class Alias(commands.Cog):
@commands.guild_only()
async def _del_alias(self, ctx: commands.Context, alias_name: str):
"""Delete an existing alias on this server."""
aliases = await self.unloaded_aliases(ctx.guild)
try:
next(aliases)
except StopIteration:
if not await self._aliases.get_guild_aliases(ctx.guild):
await ctx.send(_("There are no aliases on this server."))
return
if await self.delete_alias(ctx, alias_name):
if await self._aliases.delete_alias(ctx, alias_name):
await ctx.send(
_("Alias with the name `{name}` was successfully deleted.").format(name=alias_name)
)
@@ -406,14 +294,11 @@ class Alias(commands.Cog):
@global_.command(name="delete", aliases=["del", "remove"])
async def _del_global_alias(self, ctx: commands.Context, alias_name: str):
"""Delete an existing global alias."""
aliases = await self.unloaded_global_aliases()
try:
next(aliases)
except StopIteration:
await ctx.send(_("There are no aliases on this bot."))
if not await self._aliases.get_global_aliases():
await ctx.send(_("There are no global aliases on this bot."))
return
if await self.delete_alias(ctx, alias_name, global_=True):
if await self._aliases.delete_alias(ctx, alias_name, global_=True):
await ctx.send(
_("Alias with the name `{name}` was successfully deleted.").format(name=alias_name)
)
@@ -422,34 +307,36 @@ class Alias(commands.Cog):
@alias.command(name="list")
@commands.guild_only()
@checks.bot_has_permissions(add_reactions=True)
async def _list_alias(self, ctx: commands.Context):
"""List the available aliases on this server."""
names = [_("Aliases:")] + sorted(
["+ " + a.name for a in (await self.unloaded_aliases(ctx.guild))]
)
if len(names) == 0:
await ctx.send(_("There are no aliases on this server."))
else:
await ctx.send(box("\n".join(names), "diff"))
guild_aliases = await self._aliases.get_guild_aliases(ctx.guild)
if not guild_aliases:
return await ctx.send(_("There are no aliases on this server."))
await self.paginate_alias_list(ctx, guild_aliases)
@global_.command(name="list")
@checks.bot_has_permissions(add_reactions=True)
async def _list_global_alias(self, ctx: commands.Context):
"""List the available global aliases on this bot."""
names = [_("Aliases:")] + sorted(
["+ " + a.name for a in await self.unloaded_global_aliases()]
)
if len(names) == 0:
await ctx.send(_("There are no aliases on this server."))
else:
await ctx.send(box("\n".join(names), "diff"))
global_aliases = await self._aliases.get_global_aliases()
if not global_aliases:
return await ctx.send(_("There are no global aliases."))
await self.paginate_alias_list(ctx, global_aliases)
@commands.Cog.listener()
async def on_message(self, message: discord.Message):
aliases = list(await self.unloaded_global_aliases())
if message.guild is not None:
aliases = aliases + list(await self.unloaded_aliases(message.guild))
if len(aliases) == 0:
async def on_message_without_command(self, message: discord.Message):
try:
prefix = await self.get_prefix(message)
except ValueError:
return
await self.maybe_call_alias(message, aliases=aliases)
try:
potential_alias = message.content[len(prefix) :].split(" ")[0]
except IndexError:
return
alias = await self._aliases.get_alias(message.guild, potential_alias)
if alias:
await self.call_alias(message, prefix, alias)

View File

@@ -1,25 +1,37 @@
from typing import Tuple
from typing import Tuple, Dict, Optional, List, Union
from re import findall
import discord
from redbot.core import commands
from discord.ext.commands.view import StringView
from redbot.core import commands, Config
from redbot.core.i18n import Translator
from redbot.core.utils import AsyncIter
_ = Translator("Alias", __file__)
class ArgParseError(Exception):
pass
class AliasEntry:
"""An object containing all required information about an alias"""
name: str
command: Union[Tuple[str], str]
creator: int
guild: Optional[int]
uses: int
def __init__(
self, name: str, command: Tuple[str], creator: discord.Member, global_: bool = False
self, name: str, command: Union[Tuple[str], str], creator: int, guild: Optional[int],
):
super().__init__()
self.has_real_data = False
self.name = name
self.command = command
self.creator = creator
self.global_ = global_
self.guild = None
if hasattr(creator, "guild"):
self.guild = creator.guild
self.guild = guild
self.uses = 0
def inc(self):
@@ -30,34 +42,182 @@ class AliasEntry:
self.uses += 1
return self.uses
def get_extra_args_from_alias(self, message: discord.Message, prefix: str) -> str:
"""
When an alias is executed by a user in chat this function tries
to get any extra arguments passed in with the call.
Whitespace will be trimmed from both ends.
:param message:
:param prefix:
:param alias:
:return:
"""
known_content_length = len(prefix) + len(self.name)
extra = message.content[known_content_length:]
view = StringView(extra)
view.skip_ws()
extra = []
while not view.eof:
prev = view.index
word = view.get_quoted_word()
if len(word) < view.index - prev:
word = "".join((view.buffer[prev], word, view.buffer[view.index - 1]))
extra.append(word)
view.skip_ws()
return extra
def to_json(self) -> dict:
try:
creator = str(self.creator.id)
guild = str(self.guild.id)
except AttributeError:
creator = self.creator
guild = self.guild
return {
"name": self.name,
"command": self.command,
"creator": creator,
"guild": guild,
"global": self.global_,
"creator": self.creator,
"guild": self.guild,
"uses": self.uses,
}
@classmethod
def from_json(cls, data: dict, bot: commands.Bot = None):
ret = cls(data["name"], data["command"], data["creator"], global_=data["global"])
if bot:
ret.has_real_data = True
ret.creator = bot.get_user(int(data["creator"]))
guild = bot.get_guild(int(data["guild"]))
ret.guild = guild
else:
ret.guild = data["guild"]
def from_json(cls, data: dict):
ret = cls(data["name"], data["command"], data["creator"], data["guild"])
ret.uses = data.get("uses", 0)
return ret
class AliasCache:
def __init__(self, config: Config, cache_enabled: bool = True):
self.config = config
self._cache_enabled = cache_enabled
self._loaded = False
self._aliases: Dict[Optional[int], Dict[str, AliasEntry]] = {None: {}}
async def load_aliases(self):
if not self._cache_enabled:
self._loaded = True
return
for alias in await self.config.entries():
self._aliases[None][alias["name"]] = AliasEntry.from_json(alias)
all_guilds = await self.config.all_guilds()
async for guild_id, guild_data in AsyncIter(all_guilds.items(), steps=100):
if guild_id not in self._aliases:
self._aliases[guild_id] = {}
for alias in guild_data["entries"]:
self._aliases[guild_id][alias["name"]] = AliasEntry.from_json(alias)
self._loaded = True
async def get_aliases(self, ctx: commands.Context) -> List[AliasEntry]:
"""Returns all possible aliases with the given context"""
global_aliases: List[AliasEntry] = []
server_aliases: List[AliasEntry] = []
global_aliases = await self.get_global_aliases()
if ctx.guild and ctx.guild.id in self._aliases:
server_aliases = await self.get_guild_aliases(ctx.guild)
return global_aliases + server_aliases
async def get_guild_aliases(self, guild: discord.Guild) -> List[AliasEntry]:
"""Returns all guild specific aliases"""
aliases: List[AliasEntry] = []
if self._cache_enabled:
if guild.id in self._aliases:
for _, alias in self._aliases[guild.id].items():
aliases.append(alias)
else:
aliases = [AliasEntry.from_json(d) for d in await self.config.guild(guild).entries()]
return aliases
async def get_global_aliases(self) -> List[AliasEntry]:
"""Returns all global specific aliases"""
aliases: List[AliasEntry] = []
if self._cache_enabled:
for _, alias in self._aliases[None].items():
aliases.append(alias)
else:
aliases = [AliasEntry.from_json(d) for d in await self.config.entries()]
return aliases
async def get_alias(
self, guild: Optional[discord.Guild], alias_name: str,
) -> Optional[AliasEntry]:
"""Returns an AliasEntry object if the provided alias_name is a registered alias"""
server_aliases: List[AliasEntry] = []
if self._cache_enabled:
if alias_name in self._aliases[None]:
return self._aliases[None][alias_name]
if guild is not None:
if guild.id in self._aliases:
if alias_name in self._aliases[guild.id]:
return self._aliases[guild.id][alias_name]
else:
if guild:
server_aliases = [
AliasEntry.from_json(d) for d in await self.config.guild(guild.id).entries()
]
global_aliases = [AliasEntry.from_json(d) for d in await self.config.entries()]
all_aliases = global_aliases + server_aliases
for alias in all_aliases:
if alias.name == alias_name:
return alias
return None
async def add_alias(
self, ctx: commands.Context, alias_name: str, command: str, global_: bool = False
) -> AliasEntry:
indices = findall(r"{(\d*)}", command)
if indices:
try:
indices = [int(a[0]) for a in indices]
except IndexError:
raise ArgParseError(_("Arguments must be specified with a number."))
low = min(indices)
indices = [a - low for a in indices]
high = max(indices)
gaps = set(indices).symmetric_difference(range(high + 1))
if gaps:
raise ArgParseError(
_("Arguments must be sequential. Missing arguments: ")
+ ", ".join(str(i + low) for i in gaps)
)
command = command.format(*(f"{{{i}}}" for i in range(-low, high + low + 1)))
if global_:
alias = AliasEntry(alias_name, command, ctx.author.id, None)
settings = self.config
if self._cache_enabled:
self._aliases[None][alias.name] = alias
else:
alias = AliasEntry(alias_name, command, ctx.author.id, ctx.guild.id)
settings = self.config.guild(ctx.guild)
if self._cache_enabled:
if ctx.guild.id not in self._aliases:
self._aliases[ctx.guild.id] = {}
self._aliases[ctx.guild.id][alias.name] = alias
async with settings.entries() as curr_aliases:
curr_aliases.append(alias.to_json())
return alias
async def delete_alias(
self, ctx: commands.Context, alias_name: str, global_: bool = False
) -> bool:
if global_:
settings = self.config
else:
settings = self.config.guild(ctx.guild)
async with settings.entries() as aliases:
for alias in aliases:
if alias["name"] == alias_name:
aliases.remove(alias)
if self._cache_enabled:
if global_:
del self._aliases[None][alias_name]
else:
del self._aliases[ctx.guild.id][alias_name]
return True
return False

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:10\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Afrikaans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: af\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: af_ZA\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:10\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: ar_SA\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:10\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Bulgarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: bg_BG\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Няма намерен префикс."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Този псевдоним не съществува."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Няма използвани псевдоними на този сървър."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Няма псевдоними положени към този бот."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Псевдоними:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:10\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: ca_ES\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: cs_CZ\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr "Vytvořit aliasy pro příkazy n n Aliasy jsou alternativní zkratky pro příkazy. Mohou působit jako lambda (ukládání argumentů pro opakované použití) n nebo jednoduše jako zkratka pro vyslovení \"xyz\" n n Při spuštění budou aliasy přijímat další argumenty a připojovat je k uložený alias. \\ t "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Argumenty musí být zadány s číslem."
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Argumenty musí být sekvenční. Chybějící argumenty: "
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Nebyl nalezen žádný prefix."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr "Aliasy:\\n"
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr "\\n\\nStrana {page}/{total}"
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Spravovat aliasy příkazů."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Správa globálních aliasů."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Přidat alias pro příkaz."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Pokusili jste se vytvořit nový globální alias s názvem {name}, ale toto jméno je již příkazem tohoto bota."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
msgstr "Pokusili jste se vytvořit nový alias s názvem {name}, ale toto jméno je neplatným názvem aliasu. Jména aliasů nesmí obsahovat mezery."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
msgstr "Pokusili jste se vytvořit nový alias pro příkaz, který neexistuje."
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
msgstr "Byl vytvořen nový alias se spouštěcím mechanismem `{name}."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Přidat globální alias pro příkaz."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Pokusili jste se vytvořit nový globální alias s názvem {name}, ale toto jméno je již příkazem tohoto bota."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
msgstr "Pokusili jste se vytvořit nový globální alias s názvem {name}, ale toto jméno je neplatným názvem aliasu. Jména aliasů nesmí obsahovat mezery."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
msgstr "Byl vytvořen nový globální alias se spouštěcím mechanismem `{name}."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
msgstr "Zkuste spustit nápovědu pro základní příkaz aliasů."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Žádný takový alias neexistuje."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr "Zobrazit příkaz ke spustitelnému aliasu."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "Alias `{alias_name} provede příkaz `{command}"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "Neexistuje žádný alias s názvem `{name}`"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Odstraní existující alias na tomto serveru."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Na tomto serveru nejsou žádné aliasy."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "Alias s názvem{name}` byl úspěšně smazán."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
msgstr "Alias s názvem `{name}` nebyl nalezen."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Odstranit existující globální alias."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr "Pro tohoto bota neexistují žádné globální aliasy."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr "Seznam dostupných aliasů na tomto serveru."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Aliasy:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
msgstr "Seznam dostupných globálních aliasů pro tohoto bota."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr "Neexistují žádné globální aliasy."
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Argumenty musí být zadány s číslem."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Argumenty musí být sekvenční. Chybějící argumenty: "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: da_DK\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: de_DE\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr "Erstelle einen Alias für einen Befehl.\\n\\n Aliases sind alternative Namen für Befehle.\\n können als Lambda (Speicherung von Argumenten für wiederholte Verwendung)\\n oder als einfache Verknüpfung zur Angabe von \\\"x y z\\\" fungieren.\\n\\n Wenn Sie ausgeführt werden, werden Alias zusätzliche Argumente annehmen\\n und sie an die gespeicherten Alias anhängen.\\n \\n "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Die Argumente müssen mit einer Nummer angegeben werden."
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Argumente müssen sequentiell sein. Fehlende Argumente: "
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Es wurde kein Prefix gefunden."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr "Aliase:\\n"
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr "\\n\\nSeite {page}/{total}"
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Verwalte die Alias Befehle."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Verwalte die globalen Aliasse."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Füge einen Alias für einen Befehl hinzu."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Du hast versucht, einen neuen Alias mit dem Namen {name} zu erstellen, aber dieser Name wird bereits für einen Befehl des Bots genutzt."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Du hast versucht einen neuen Alias mit dem Namen {name} zu erstellen, aber dieser Alias existiert bereits auf dem Server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr "Du hast versucht, einen neuen Alias mit dem Namen {name} zu erstellen, aber dieser Alias existiert bereits."
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du hast versucht einen neuen Alias mit dem Namen {name} zu erstellen, aber dieser Name ist ein ungültiger Alias-Name. Alias-Namen dürfen keine Leerzeichen enthalten."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
msgstr "Du hast versucht einen Alias für einen Befehl zu erstellen, der nicht existiert."
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Ein neuer Alias mit dem Namen`{name}` wurde erstellt."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Füge einen globalen Alias für einen Befehl hinzu."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Du hast versucht, einen neuen globalen Alias mit dem Namen „{name}“ zu erstellen, aber dieser Name ist bereits ein Befehl für diesen Bot."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Du hast versucht, einen neuen globalen Alias mit dem Namen {name} zu erstellen, dieser ist jedoch bereits auf diesem Server vorhanden."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr "Du hast versucht, einen neuen globalen Alias mit dem Namen {name} zu erstellen, aber dieser Alias existiert bereits."
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du hast versucht, einen neuen globalen Alias mit dem Namen „{name}“ zu erstellen, dieser Name ist jedoch ein ungültiger Alias-Name. Alias-Namen dürfen keine Leerzeichen enthalten."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Ein neuer globaler Alias mit dem Trigger `{name}` wurde erstellt."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Versuche die Hilfe für den Basisbefehl des Alias auszuführen."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "So ein Alias ist nicht vorhanden."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr "Zeige den Befehl, welchen der Alias ausführt."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "Der Alias '{alias_name}' führt den Befehl '{command}' aus"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "Kein Alias mit dem Namen '{name}' gefunden"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Lösche einen bereits existierenden Alias auf diesem Server."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Es gibt keine Aliasse auf diesem Server."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "Der Alias mit dem Namen '{name}' wurde erfolgreich gelöscht."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr "Kein Alias mit dem Namen '{name}' gefunden."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Lösche einen bereits existierenden globalen Alias."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Es gibt keine Aliasse in diesem Bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr "Ich habe keinen globalen Alias gespeichert."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr "Zeige die auf diesem Server verfügbaren Alias."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Aliasse:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Zeige die verfügbaren globalen Alias von diesem Bot."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr "Es gibt keine globalen Aliasse."
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Die Argumente müssen mit einer Nummer angegeben werden."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Argumente müssen sequentiell sein. Fehlende Argumente: "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: el_GR\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Δεν βρέθηκε πρόθεμα."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: es_ES\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
msgstr "Crear alias para comandos.\\n\\n Los alias son accesos directos de nombres alternativos para comandos.\\n pueden actuar como un lambda (almacenando argumentos para uso repetido)\\n o simplemente como un atajo para decir \\\"x y z\\\".\\n\\n Cuando se ejecuta, los alias aceptarán cualquier argumento adicional\\n y los agregarán al alias almacenado.\\n "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Prefijo no encontrado."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
msgstr "Administra los alias de los comandos."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
msgstr "Administra los alias globales."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
msgstr "Agregar un alias para un comando."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Intentaste crear un nuevo alias con el nombre {name} pero ese nombre ya es un comando en este bot."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
msgstr "Intentaste crear un nuevo alias con el nombre {name} pero ese nombre es un alias inválido. Los alias no deben contener espacios."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
msgstr "Intentaste crear un nuevo alias para un comando que no existe."
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
msgstr "Un nuevo alias con el trigger {name} ha sido creado."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
msgstr "Agrega un alias global para un comando."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Intentaste crear un nuevo alias global con el nombre {name} pero ese nombre ya es un comando en este bot."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
msgstr "Intentaste crear un nuevo alias global con el nombre {name}, pero ese nombre es un nombre de alias inválido. Los nombres de alias no pueden contener espacios."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
msgstr "Un nuevo alias global con el trigger `{name}` ha sido creado."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
msgstr "Intenta ejecutar help para el comando base del alias."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Un alias no existe."
msgstr "El alias no existe."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
msgstr "Muestra qué comando ejecuta el alias."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
msgstr "El alias `{alias_name}` ejecutará el comando `{command}`"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
msgstr "No hay alias con el nombre `{name}`"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
msgstr "Elimina un alias existente en este servidor."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "No hay los aliases en este servidor."
msgstr "No hay alias en este servidor."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
msgstr "El alias con el nombre `{name}` ha eliminado correctamente."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
msgstr "El alias con nombre `{name}` no fue encontrado."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Elimina un alias global existente."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "No hay el los alias dentro de este bot."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
msgstr "Lista de los alias disponibles en este servidor."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Alias:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Lista de los alias globales disponibles en este bot."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Los argumentos deben especificarse con un número."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Los argumentos deben ser secuenciales. Faltan argumentos: "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: fi_FI\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: French\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: fr_FR\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr "Créée des alias pour les commandes\\n\\n Les alias sont des raccourcis de noms alternatifs pour les commandes. Ils\\n peuvent agir comme un lambda (stocker des arguments pour un usage répété)\\n ou comme simplement un raccourci pour dire \\\"x y z\\\".\\n\\n Lors de leur exécution, les alias accepteront tous les arguments supplémentaires\\n et seront exécutés en plus des arguments stockés dans l'alias.\\n "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Les arguments doivent être spécifiés avec un nombre."
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Les arguments doivent être séquentiels. Arguments manquants : "
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Aucun préfixe trouvé."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr "Alias :\\n"
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr "\\n\\nPage {page}/{total}"
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Gérer les alias de commandes."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Gérer les alias globaux."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Ajouter un alias à une commande."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Tu as tenté de créer un nouvel alias nommé {name}, mais une commande existe déjà avec ce nom sur ce bot."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Tu as tenté de créer un nouvel alias nom {name}, mais cet alias existe déjà sur ce serveur."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr "Vous avez tenté de créer un nouvel alias avec le nom {name} mais cette alias existe déjà."
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Tu as tenté de créer un nouvel alias nommé {name}, mais ce nom d'alias est invalide. Les noms d'alias ne peuvent pas contenir d'espaces."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
msgstr "Vous avez essayé de créer un nouvel alias pour une commande qui n'existe pas."
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Un nouvel alias avec le déclencheur `{name}` a bien été créé."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Ajouter un alias global à une commande."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Tu as tenté de créer un nouvel alias global nommé {name}, mais une commande existe déjà avec ce nom sur ce bot."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Tu as tenté de créer un nouvel alias global nom {name}, mais cet alias existe déjà sur ce serveur."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr "Vous avez tenté de créer un nouvel alias global avec le nom {name} mais cette alias existe déjà."
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Tu as tenté de créer un nouvel alias global nommé {name}, mais ce nom d'alias est invalide. Les noms d'alias ne peuvent pas contenir d'espaces."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Un nouvel alias global avec le déclencheur `{name}` a bien été créé."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Tente d'exécuter l'aide pour la commande de base de l'alias."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Cet alias n'existe pas."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr "Affiche la commande que l'alias exécute."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "L'alias `{alias_name}` exécute la commande `{command}`"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "Il n'y a pas d'alias nommé `{name}`"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Supprime un alias de ce serveur."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Il n'y a pas d'alias sur ce serveur."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "L'alias nommé `{name}` a bien été supprimé."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr "L'alias nommé `{name}` n'a pas été trouvé."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Supprime un alias global existant."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Il n'y a pas d'alias sur ce bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr "Il n'y a aucun alias global sur ce bot."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr "Liste les alias disponibles sur ce serveur."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Alias:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Liste les alias globaux disponibles sur ce bot."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr "Il n'y a aucun alias global."
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Les arguments doivent être spécifiés avec un nombre."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Les arguments doivent être séquentiels. Arguments manquants : "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: he_IL\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: hu_HU\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Nem találtható prefix."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr "Aliasok:\\n"
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr "\\n\\nOldal {page}/{total}"
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
msgstr "Parancs aliasok kezelése."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
msgstr "Globális aliasok kezelése."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
msgstr "Alias hozzáadása egy parancshoz."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Nem létezik ilyen rövidítés."
msgstr "Nem létezik ilyen alias."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Nincsenek rövidítések ezen a szerveren."
msgstr "Nincsenek aliasok ezen a szerveren."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
msgstr "Létező globális alias törlése."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Nincsenek rövidítések ennél a botnál."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr "Nincsenek globális aliasok ezen a boton."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
msgstr "A szerveren elérhető aliasok listázása."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Rövidítések:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "A boton elérhető globális aliasok listázása."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr "Nincsenek globális aliasok."
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Indonesian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: id_ID\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Awalan tidak ditemukan."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Alias tersebut tidak ditemukan."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Tidak ada alias pada server ini."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Tidak ada alias pada bot ini."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Alias:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: it_IT\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Gli argomenti devono essere specificati con un numero."
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Nessun prefisso trovato."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Gestisci gli alias dei comandi."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Gestisci alias globali."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Aggiungi un alias per un comando."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Hai cercato di creare un nuovo alias con il nome {name}, ma questo nome corrisponde già a un comando su questo bot."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Hai cercato di creare un nuovo alias con il nome {name}, ma questo alias già esiste su questo bot."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Hai cercato di creare un nuovo alias con il nome {name}, ma questo nome non è un nome alias valido. I nomi alias non possono contenere spazi."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr "È stato creato un nuovo alias con il comando '{name}'."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Aggiungi un alias globale per un comando."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Hai cercato di creare un nuovo alias globale con il nome {name}, ma questo nome corrisponde già a un comando su questo bot."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Hai cercato di creare un nuovo alias globale con il nome {name}, ma questo alias già esiste su questo server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Hai cercato di creare un nuovo alias globale con il nome {name}, ma questo nome non è un nome alias valido. I nomi alias non possono contenere spazi."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "È stato creato un nuovo alias globale con il comando '{name}'."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Prova a eseguire l'aiuto per il comando di base dell'alias."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Non esiste nessun alias con questo nome."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr "Mostra quale comando viene eseguito dall'alias."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "L'alias `{alias_name}` eseguirà il comando `{command}`"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "Non c'è nessun alias con il nome `{name}`"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Elimina un alias esistente su questo server."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Non ci sono alias su questo server."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "L'alias con il nome `{name}` è stato eliminato con successo."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr "L'alias con il nome `{name}` non è stato trovato."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Elimina un alias globale esistente."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Non ci sono alias su questo bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr "Elenca gli alias disponibili su questo server."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Alias:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Elenca gli alias globali disponibili su questo server."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Gli argomenti devono essere specificati con un numero."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: ja_JP\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "プレフィックスが見つかりません。"
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "そのようなエイリアスはありません。"
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "このサーバにエイリアスはありません。"
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "このボットにはエイリアスはありません。"
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "アリアス:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: ko_KR\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
msgstr "명령어에 대한 별칭을 만들어주세요.\\n\\n 별칭들은 해당 명령어들을 바로 실행할 수 있는 대체적인 이름들이에요. 그것들은\\n 람다(반복되어 사용되는 인수를 저장)\\n 또는 단순히 \\\"x y z\\\"라고 말하는 바로가기 역할을 할 수 있어요.\\n\\n 실행할 시, 별칭들은 추가된 인수들을 승인할거예요.\\n 그리고 저장된 별칭들에 추가할거예요. "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "접두사가 발견되지 않았습니다."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
msgstr "명령어 별칭들을 관리하세요."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
msgstr "글로벌 별칭들을 관리하세요."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
msgstr "명령어에 대한 별칭을 등록해주세요."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
msgstr "이름이 {name}인 새 별칭을 생성하려고 했지만, 해당 이름은 이 봇의 명령어와 중복돼요."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr "이름이 {name} 인 새 별칭을 생성하려고 했지만, 해당 별칭은 이미 이 서버에 등록되어 있어요."
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
msgstr "이름이 {name}인 새 별칭을 생성하려고 했지만, 해당 이름은 사용할 수 없는 별칭 이름이에요. 별칭은 공백을 포함할 수 없어요."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
msgstr "존재하지 않는 명령어에 대한 새 별칭을 생성하려고 시도하셨어요."
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
msgstr "`{name}`을 실행하는 새 별칭이 등록됐어요."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
msgstr "명령어에 대한 글로벌 별칭을 등록해주세요."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
msgstr "이름이 {name}인 새 글로벌 별칭을 생성하려고 했지만, 해당 이름은 커맨드와 중복돼요."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr "이름이 {name} 인 새 별칭을 생성하려고 했지만, 해당 별칭은 이미 이 서버에 등록되어 있어요."
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
msgstr "이름이 {name}인 새 글로벌 별칭을 생성하려고 했지만, 해당 별칭은 사용할 수 없는 별칭 이름이에요. 별칭 이름에는 공백을 포함할 수 없어요."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
msgstr "`{name}`을 실행하는 새로운 글로벌 별칭이 등록됐어요."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
msgstr "별칭의 기본 명령어에 대한 도움말을 실행해 보세요."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "그런 별칭은 등록되어 있지 않아요."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
msgstr "별칭이 실행하는 명령어를 표시해주세요."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
msgstr "`{alias_name}` 별칭은 `{command}` 명령을 실행해요."
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
msgstr "이름이 `{name}`인 별칭이 없어요."
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
msgstr "이 서버에 있는 기존 별칭을 삭제해주세요."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "이 서버에 등록된 별칭이 없어요."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
msgstr "이름이 `{name}`인 별칭이 성공적으로 삭제됐어요."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
msgstr "이름이 `{name}`인 별칭을 찾을 수 없어요."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
msgstr "기존 글로벌 별칭들을 삭제해주세요."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr "이 봇에 등록된 별칭이 없어요."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
msgstr "이 서버에서 사용할 수 있는 별칭들을 나열해주세요."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "등록된 별칭 리스트 :"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "이 봇에서 사용할 수 있는 글로벌 별칭들을 나열해주세요."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "인수는 숫자로 지정해줘야해요."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "인수는 순차적이어야해요. 미확인된 인수: "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: nl_NL\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr "Maak aliassen voor commando's.\\n\\n Aliassen zijn alternatieve namen of snelkoppelingen voor commando's. Ze\\n kunnen fungeren als een lambda (argumenten opslaan voor herhaald gebruik)\\n of als een snelkoppeling om \\\"x y z\\\" te zeggen.\\n\\n Aliassen accepteren extra argumenten wanneer ze zijn gebruikt\\n en voegen deze toe aan de opgeslagen alias.\\n "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Argumenten moeten worden gespecificeerd met een getal."
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Argumenten moeten sequentieel zijn. Ontbrekende argumenten: "
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Geen prefix gevonden."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Beheer commandaliassen."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Beheer globale aliassen."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Voeg een alias toe voor een opdracht."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Je hebt geprobeerd een nieuwe alias te maken met de naam {name}, maar die naam is al een opdracht voor deze bot."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Je hebt geprobeerd een nieuwe alias te maken met de naam {name}, maar die alias bestaat al op deze server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Je hebt geprobeerd een nieuwe alias te maken met de naam {name}, maar die naam is een ongeldige aliasnaam. Aliasnamen mogen geen spaties bevatten."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Er is een nieuwe alias gemaakt met de trigger `{name}`."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Voeg een globale alias toe voor een opdracht."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Je hebt geprobeerd om een nieuwe globale alias te maken met de naam {name}, maar die naam is al een opdracht op deze bot."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Je hebt geprobeerd een nieuwe globale alias te maken met de naam {name}, maar die alias bestaat al op deze server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Je hebt geprobeerd een nieuwe algemene alias te maken met de naam {name}, maar die naam is een ongeldige aliasnaam. Aliasnamen mogen geen spaties bevatten."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Er is een nieuwe globale alias gemaakt met de trigger `{name}`."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Probeer hulp uit te voeren voor de basisopdracht van de alias."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Deze alias bestaat niet."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr "Laat zien welk commando de alias uitvoert."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "De `{alias_name}` alias voert het commando `{command}` uit"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "Er is geen alias met de naam'{name}'"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Verwijder een bestaande alias op deze server."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Er zijn geen aliases in deze server."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "Alias met de naam `{name}` is succesvol verwijderd."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr "Alias met naam `{name}` is niet gevonden."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Een bestaande globale alias verwijderen."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Er zijn geen aliases op deze bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr "Maak een lijst van de beschikbare aliassen op deze server."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Aliassen:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Maak een lijst van de beschikbare globale aliassen op deze bot."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Argumenten moeten worden gespecificeerd met een getal."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Argumenten moeten sequentieel zijn. Ontbrekende argumenten: "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: no\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: no_NO\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Argumenter må spesifiseres med et nummer."
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Ingen prefiks funnet."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Administrer kommando aliaser."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Administrer globale aliaser."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Legg til et alias for en kommando."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Du forsøkte å opprette et nytt alias med navnet {name} men navnet er allerede en kommando på denne boten."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Du forsøkte å opprette et nytt alias med navnet {name} men aliaset finnes allerede på denne serveren."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du forsøkte å opprette et nytt alias med navnet {name} men navnet er et ugyldig aliasnavn. Aliasnavn kan ikke inneholde mellomrom."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Et nytt alias med utløseren \"{name}\" har blitt opprettet."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Legg til et globalt alias for en kommando."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Du forsøkte å opprette et nytt globalt alias med navnet {name} men navnet er allerede en kommando på denne boten."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Du forsøkte å opprette et nytt alias med navnet {name} men aliaset finnes allerede på denne serveren."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Du forsøkte å opprette et nytt globalt alias med navnet {name} men navnet er et ugyldig aliasnavn. Aliasnavn kan ikke inneholde mellomrom."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Et nytt globalt alias med utløseren '{name}' har blitt opprettet."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Ingen slike alias finnes."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Det er ingen aliaser på denne serveren."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Det er ingen aliaser på denne boten."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Aliaser:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Argumenter må spesifiseres med et nummer."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: pl_PL\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Nie znaleziono prefiksu."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Taki alias nie istnieje."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Nie ma aliasów na tym serwerze."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Nie ma żadnych aliasów dla tego bota."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Aliasy:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: pt_BR\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Nenhum prefixo encontrado."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Alias inexistente."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Não há nenhum alias neste servidor."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Não há nenhum alias nesse bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Alias:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: pt_PT\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: ro_RO\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: ru_RU\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr "Создать псевдонимы для команд.\\n\\n Псевдонимы - это альтернативные сокращения имен для команд.\\n Они могут действовать как лямбда (хранение аргументов для\\n многократного использования) или просто как сокращение \\\"а б в\\\".\\n\\n При запуске псевдонимы принимают любые дополнительные\\n аргументы и добавляют их к сохраненному псевдониму.\\n "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Аргументы должны быть указаны с числом."
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Аргументы должны быть последовательными. Отсутствующие аргументы: "
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Префикс не найден."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr "\\n\\nСтраница {page}/{total}"
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Управление псевдонимами команд."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Управление глобальными псевдонимами."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Добавить псевдоним для команды."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Вы попытались создать новый псевдоним {name}, но это имя уже является командой для этого бота."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Вы пытались создать новый псевдоним {name}, но этот псевдоним уже существует на этом сервере."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Вы попытались создать новый псевдоним {name}, но это имя является недопустимым псевдонимом. Имена псевдонимов не могут содержать пробелов."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
msgstr "Вы попытались создать новый псевдоним для не существующей команды."
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Новый псевдоним с триггером `{name}` был создан."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Добавить глобальный псевдоним для команды."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Вы попытались создать новый глобальный псевдоним {name}, но это имя уже является командой для этого бота."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Вы попытались создать новый глобальный псевдоним {name}, но этот псевдоним уже существует на этом сервере."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Вы попытались создать новый глобальный псевдоним {name}, но это имя является недопустимым псевдонимом. Имена псевдонимов не могут содержать пробелов."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Новый глобальный псевдоним с триггером `{name}` был создан."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Попробуйте вызвать справку для базовой команды псевдонима."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Псевдоним не существует."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr "Показать, какую команду выполняет псевдоним."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "Псевдоним `{alias_name}` будет выполнять команду `{command}`"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "Нет псевдонима с именем `{name}`"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Удалить существующий псевдоним на этом сервере."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "На этом сервере нет псевдонимов."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "Псевдоним с именем `{name}` был успешно удален."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr "Псевдоним с именем `{name}` не найден."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Удалить существующий глобальный псевдоним."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "У этого бота нет псевдонимов."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr "У этого бота нет глобальных псевдонимов."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr "Список доступных псевдонимов на этом сервере."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Псевдонимы:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Список доступных глобальных псевдонимов для этого бота."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr "Нет глобальных псевдонимов."
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Аргументы должны быть указаны с числом."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Аргументы должны быть последовательными. Отсутствующие аргументы: "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Slovak\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: sk_SK\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:12\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Serbian (Cyrillic)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: sr_SP\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: sv_SE\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Inget prefix hittat."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Detta alias existerar inte."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Det finns inga alias på denna server."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Det finns inga alias för denna bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Alias:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: tr_TR\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr "Komutlar için kısaltma yaratır.\\n\\n Kısaltmalar, komutlar için alternatiftir. Hem\\n kısaltma hem de komut bir arada kullanılabilir\\n Sadece kısaltmalar da kullanılabilir \\\"x y z\\\".\\n\\n Çalıştırıldığında, diğer adlar ek bağımsız değişkenleri\\n kabul eder ve bunları depolanan diğer ada ekler.\\n "
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr "Girdiler numara ile özelleştirilmiş olmalıdır."
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "Prefix yani komut başlangıcı bulunamadı."
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr "Takma adlar"
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Girdiler sırayla olmalıdır. Eksik girdiler:"
msgid "\\n\\nPage {page}/{total}"
msgstr "Sayfa"
#: redbot/cogs/alias/alias.py:168
msgid "No prefix found."
msgstr "Öneki bulundu."
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr "Komut diğer adları yönetmek."
msgstr "Komut kısaltmalarını yönet."
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr "Küresel diğer adları yönetmek."
msgstr "Global kısaltmaları yönet."
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr "Bir komut için bir diğer ad ekleyin."
msgstr "Bir komut için kısaltma ekleyin."
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı, ancak bu adı zaten bu bot bir komutudur."
msgstr "{name} adı ile yeni bir kısaltma oluşturmaya çalıştınız, ancak botta bu ad ile mevcut bir komut bulunuyor."
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı, ancak bu diğer adı bu sunucuda zaten vardır."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr "{name} adıyla yeni bir diğer ad oluşturmaya çalıştınız, ancak bu diğer ad zaten var."
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı ama o ismi geçersiz diğer ad. Diğer ad ad adlar boşluk içeremez."
msgstr "{name} adı ile yeni bir kısaltma oluşturmaya çalıştınız, ancak belirttiğiniz geçersiz bir kısaltmadır. Kısaltmalar boşluk içermemelidir."
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
msgstr "Mevcut olmayan bir komut için kısayol oluşturmaya çalıştınız."
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr "Yeni bir takma ad tetikleyici '{name}' ile oluşturuldu."
msgstr "Yeni bir kısaltma '{name}' ismi ile oluşturuldu."
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr "Bir komut için küresel bir diğer ad ekleyin."
msgstr "Bir komut için global bir kısaltma ekleyin."
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr "Yeni bir küresel diğer adı ile ad {name} oluşturmak çalıştı, ancak bu adı zaten bu bot bir komutudur."
msgstr "{name} adı ile global bir kısaltma yaratmaya çalıştınız, ancak botta bu isimde bir komut mevcut."
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "Adı {name} ile yeni bir diğer ad oluşturmak çalıştı, ancak bu adı zaten bu bot bir komutudur."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr "{name} adıyla yeni bir genel diğer ad oluşturmaya çalıştınız, ancak bu diğer ad zaten var."
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "Yeni bir küresel diğer adı ile ad {name} oluşturmaya çalıştı ama o ismi geçersiz diğer ad. Diğer ad ad adlar boşluk içeremez."
msgstr "{name} ile yeni bir global kısaltma oluşturmaya çalıştınız ancak bu kısaltma geçerli değil. Kısaltmalar boşluk içeremez."
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "Yeni bir küresel diğer ad tetikleyici '{name}' ile oluşturuldu."
msgstr "Yeni bir global kısaltma '{name}' ismi ile oluşturuldu."
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr "Diğer temel komutunun yardımını yürütmek deneyin."
msgstr "Kısaltma komutlarını detaylıca öğrenmek için yardım komutunu kullanmayı deneyiniz."
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "Böyle bir takma var yok."
msgstr "Böyle bir kısaltma mevcut değil."
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr "Takma adın çalıştırıldığı komutu gösterin."
msgstr "Kısaltmanın hangi komutu uyguladığını gösterir."
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "'{alias_name}' diğer ad komut '{command} ' idam edecek"
msgstr "'{alias_name}' kısaltması '{command} ' komutunu uygulayacak"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "Hiç diğer ad ad '{name} ' ile olduğunu"
msgstr "{name} adında bir kısaltma mevcut değil"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr "Bu sunucuda varolan bir diğer adı silin."
msgstr "Bu sunucuda mevcut bir kısaltmayı silin."
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "Bu sunucuda hiçbir diğer adları vardır."
msgstr "Bu sunucuda herhangi bir kısaltma mevcut değil."
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "`{name}`adlı takma ad başarıyla silindi."
msgstr "`{name}`adlı kısaltma başarıyla silindi."
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr "{Name} `adlı takma ad bulunamadı."
msgstr "{name} adlı kısaltma bulunamadı."
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr "Mevcut bir global takma adı silin."
msgstr "Mevcut bir global kısaltmayı silin."
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "Bu botta takma adlar yok."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr "Bu botta herhangi bir global kısaltma bulunmuyor."
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr "Bu sunucudaki kullanılabilir diğer adları listeleyin."
msgstr "Bu sunucudaki kullanılabilir kısaltmaları listeleyin."
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "Takma adlar:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr "Bu botta mevcut küresel takma adları listeleyiniz."
msgstr "Bot üzerindeki global kullanılabilir kısaltmaları listeleyin."
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr "Herhangi bir global kısaltma mevcut değil."
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr "Değişkenler numara içermelidir."
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr "Değişkenler sıralı olmalıdır. Eksik değişkenler: "

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Ukrainian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: uk_UA\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:13\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: vi_VN\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:10\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: zh_CN\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr "找不到前缀"
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
msgstr "您尝试使用名称{name}创建新的全局别名,但该别名已经存在于此服务器上。"
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "您试图使用名称{name}创建新的全局别名,但该名称是无效的别名。别名不能包含空格。"
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr "已经创建一个包含触发器`{name}`的全局别名。"
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr "不存在该别名。"
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr "`{alias_name}`别要名将执行命令`{command}`"
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr "没有名为`{name}`的别名"
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr "在这个服务器上没有别名。"
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr "已经成功删除名为`{name}`的别名。"
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr "找不到名为`{name}`的别名。"
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
msgstr "这个机器人上没有别名。"
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr "别名:"
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:11\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional, Hong Kong\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: zh_HK\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,9 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2020-04-02 12:07+0000\n"
"PO-Revision-Date: 2020-04-02 12:10\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2020-06-18 12:13+0000\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -11,143 +10,151 @@ msgstr ""
"Generated-By: redgettext 3.1\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: red-discordbot\n"
"X-Crowdin-Project-ID: 289505\n"
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /cogs/alias/locales/messages.pot\n"
"X-Crowdin-File-ID: 8\n"
"Language: zh_TW\n"
#: redbot/cogs/alias/alias.py:35
#: redbot/cogs/alias/alias.py:31
#, docstring
msgid "Create aliases for commands.\\n\\n Aliases are alternative names shortcuts for commands. They\\n can act as both a lambda (storing arguments for repeated use)\\n or as simply a shortcut to saying \\\"x y z\\\".\\n\\n When run, aliases will accept any additional arguments\\n and append them to the stored alias.\\n "
msgstr ""
#: redbot/cogs/alias/alias.py:111
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""
#: redbot/cogs/alias/alias.py:168
#: redbot/cogs/alias/alias.py:86
msgid "No prefix found."
msgstr ""
#: redbot/cogs/alias/alias.py:235
#: redbot/cogs/alias/alias.py:116
msgid "Aliases:\\n"
msgstr ""
#: redbot/cogs/alias/alias.py:118
msgid "\\n\\nPage {page}/{total}"
msgstr ""
#: redbot/cogs/alias/alias.py:128
#, docstring
msgid "Manage command aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:240
#: redbot/cogs/alias/alias.py:133
#, docstring
msgid "Manage global aliases."
msgstr ""
#: redbot/cogs/alias/alias.py:247
#: redbot/cogs/alias/alias.py:140
#, docstring
msgid "Add an alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:252
#: redbot/cogs/alias/alias.py:145
msgid "You attempted to create a new alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:263
msgid "You attempted to create a new alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:156
msgid "You attempted to create a new alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:274
#: redbot/cogs/alias/alias.py:167
msgid "You attempted to create a new alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:286
#: redbot/cogs/alias/alias.py:179 redbot/cogs/alias/alias.py:238
msgid "You attempted to create a new alias for a command that doesn't exist."
msgstr ""
#: redbot/cogs/alias/alias.py:300
#: redbot/cogs/alias/alias.py:193
msgid "A new alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:306
#: redbot/cogs/alias/alias.py:199
#, docstring
msgid "Add a global alias for a command."
msgstr ""
#: redbot/cogs/alias/alias.py:311
#: redbot/cogs/alias/alias.py:204
msgid "You attempted to create a new global alias with the name {name} but that name is already a command on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:322
msgid "You attempted to create a new global alias with the name {name} but that alias already exists on this server."
#: redbot/cogs/alias/alias.py:215
msgid "You attempted to create a new global alias with the name {name} but that alias already exists."
msgstr ""
#: redbot/cogs/alias/alias.py:333
#: redbot/cogs/alias/alias.py:226
msgid "You attempted to create a new global alias with the name {name} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr ""
#: redbot/cogs/alias/alias.py:349
#: redbot/cogs/alias/alias.py:249
msgid "A new global alias with the trigger `{name}` has been created."
msgstr ""
#: redbot/cogs/alias/alias.py:357
#: redbot/cogs/alias/alias.py:256
#, docstring
msgid "Try to execute help for the base command of the alias."
msgstr ""
#: redbot/cogs/alias/alias.py:369
#: redbot/cogs/alias/alias.py:261
msgid "No such alias exists."
msgstr ""
#: redbot/cogs/alias/alias.py:374
#: redbot/cogs/alias/alias.py:265
#, docstring
msgid "Show what command the alias executes."
msgstr ""
#: redbot/cogs/alias/alias.py:379
#: redbot/cogs/alias/alias.py:270
msgid "The `{alias_name}` alias will execute the command `{command}`"
msgstr ""
#: redbot/cogs/alias/alias.py:384
#: redbot/cogs/alias/alias.py:275
msgid "There is no alias with the name `{name}`"
msgstr ""
#: redbot/cogs/alias/alias.py:390
#: redbot/cogs/alias/alias.py:281
#, docstring
msgid "Delete an existing alias on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:395 redbot/cogs/alias/alias.py:431
#: redbot/cogs/alias/alias.py:442
#: redbot/cogs/alias/alias.py:283 redbot/cogs/alias/alias.py:315
msgid "There are no aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:400 redbot/cogs/alias/alias.py:418
#: redbot/cogs/alias/alias.py:288 redbot/cogs/alias/alias.py:303
msgid "Alias with the name `{name}` was successfully deleted."
msgstr ""
#: redbot/cogs/alias/alias.py:403 redbot/cogs/alias/alias.py:421
#: redbot/cogs/alias/alias.py:291 redbot/cogs/alias/alias.py:306
msgid "Alias with name `{name}` was not found."
msgstr ""
#: redbot/cogs/alias/alias.py:408
#: redbot/cogs/alias/alias.py:296
#, docstring
msgid "Delete an existing global alias."
msgstr ""
#: redbot/cogs/alias/alias.py:413
msgid "There are no aliases on this bot."
#: redbot/cogs/alias/alias.py:298
msgid "There are no global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:426
#: redbot/cogs/alias/alias.py:312
#, docstring
msgid "List the available aliases on this server."
msgstr ""
#: redbot/cogs/alias/alias.py:427 redbot/cogs/alias/alias.py:438
msgid "Aliases:"
msgstr ""
#: redbot/cogs/alias/alias.py:437
#: redbot/cogs/alias/alias.py:321
#, docstring
msgid "List the available global aliases on this bot."
msgstr ""
#: redbot/cogs/alias/alias.py:324
msgid "There are no global aliases."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:174
msgid "Arguments must be specified with a number."
msgstr ""
#: redbot/cogs/alias/alias_entry.py:181
msgid "Arguments must be sequential. Missing arguments: "
msgstr ""

View File

@@ -1,8 +0,0 @@
from redbot.core import commands
from .audio import Audio
def setup(bot: commands.Bot):
cog = Audio(bot)
bot.add_cog(cog)

View File

@@ -1,942 +0,0 @@
import asyncio
import base64
import contextlib
import datetime
import json
import logging
import random
import time
from collections import namedtuple
from typing import Callable, List, MutableMapping, Optional, TYPE_CHECKING, Tuple, Union, NoReturn
import aiohttp
import discord
import lavalink
from lavalink.rest_api import LoadResult
from redbot.core import Config, commands
from redbot.core.bot import Red
from redbot.core.i18n import Translator, cog_i18n
from . import audio_dataclasses
from .databases import CacheInterface, SQLError
from .errors import DatabaseError, SpotifyFetchError, YouTubeApiError, TrackEnqueueError
from .playlists import get_playlist
from .utils import CacheLevel, Notifier, is_allowed, queue_duration, track_limit
log = logging.getLogger("red.audio.cache")
_ = Translator("Audio", __file__)
_TOP_100_GLOBALS = "https://www.youtube.com/playlist?list=PL4fGSI1pDJn6puJdseH2Rt9sMvt9E2M4i"
_TOP_100_US = "https://www.youtube.com/playlist?list=PL4fGSI1pDJn5rWitrRWFKdm-ulaFiIyoK"
if TYPE_CHECKING:
_database: CacheInterface
_bot: Red
_config: Config
else:
_database = None
_bot = None
_config = None
def _pass_config_to_apis(config: Config, bot: Red):
global _database, _config, _bot
if _config is None:
_config = config
if _bot is None:
_bot = bot
if _database is None:
_database = CacheInterface()
class SpotifyAPI:
"""Wrapper for the Spotify API."""
def __init__(self, bot: Red, session: aiohttp.ClientSession):
self.bot = bot
self.session = session
self.spotify_token: Optional[MutableMapping[str, Union[str, int]]] = None
self.client_id = None
self.client_secret = None
@staticmethod
async def _check_token(token: MutableMapping):
now = int(time.time())
return token["expires_at"] - now < 60
@staticmethod
def _make_token_auth(
client_id: Optional[str], client_secret: Optional[str]
) -> MutableMapping[str, Union[str, int]]:
if client_id is None:
client_id = ""
if client_secret is None:
client_secret = ""
auth_header = base64.b64encode((client_id + ":" + client_secret).encode("ascii"))
return {"Authorization": "Basic %s" % auth_header.decode("ascii")}
async def _make_get(
self, url: str, headers: MutableMapping = None, params: MutableMapping = None
) -> MutableMapping[str, str]:
if params is None:
params = {}
async with self.session.request("GET", url, params=params, headers=headers) as r:
if r.status != 200:
log.debug(
"Issue making GET request to {0}: [{1.status}] {2}".format(
url, r, await r.json()
)
)
return await r.json()
async def _get_auth(self) -> NoReturn:
tokens = await self.bot.get_shared_api_tokens("spotify")
self.client_id = tokens.get("client_id", "")
self.client_secret = tokens.get("client_secret", "")
async def _request_token(self) -> MutableMapping[str, Union[str, int]]:
await self._get_auth()
payload = {"grant_type": "client_credentials"}
headers = self._make_token_auth(self.client_id, self.client_secret)
r = await self.post_call(
"https://accounts.spotify.com/api/token", payload=payload, headers=headers
)
return r
async def _get_spotify_token(self) -> Optional[str]:
if self.spotify_token and not await self._check_token(self.spotify_token):
return self.spotify_token["access_token"]
token = await self._request_token()
if token is None:
log.debug("Requested a token from Spotify, did not end up getting one.")
try:
token["expires_at"] = int(time.time()) + token["expires_in"]
except KeyError:
return
self.spotify_token = token
log.debug("Created a new access token for Spotify: {0}".format(token))
return self.spotify_token["access_token"]
async def post_call(
self, url: str, payload: MutableMapping, headers: MutableMapping = None
) -> MutableMapping[str, Union[str, int]]:
async with self.session.post(url, data=payload, headers=headers) as r:
if r.status != 200:
log.debug(
"Issue making POST request to {0}: [{1.status}] {2}".format(
url, r, await r.json()
)
)
return await r.json()
async def get_call(
self, url: str, params: MutableMapping
) -> MutableMapping[str, Union[str, int]]:
token = await self._get_spotify_token()
return await self._make_get(
url, params=params, headers={"Authorization": "Bearer {0}".format(token)}
)
async def get_categories(self) -> List[MutableMapping]:
url = "https://api.spotify.com/v1/browse/categories"
params = {}
result = await self.get_call(url, params=params)
with contextlib.suppress(KeyError):
if result["error"]["status"] == 401:
raise SpotifyFetchError(
message=(
"The Spotify API key or client secret has not been set properly. "
"\nUse `{prefix}audioset spotifyapi` for instructions."
)
)
categories = result.get("categories", {}).get("items", [])
return [{c["name"]: c["id"]} for c in categories]
async def get_playlist_from_category(self, category: str):
url = f"https://api.spotify.com/v1/browse/categories/{category}/playlists"
params = {}
result = await self.get_call(url, params=params)
playlists = result.get("playlists", {}).get("items", [])
return [
{
"name": c["name"],
"uri": c["uri"],
"url": c.get("external_urls", {}).get("spotify"),
"tracks": c.get("tracks", {}).get("total", "Unknown"),
}
for c in playlists
]
class YouTubeAPI:
"""Wrapper for the YouTube Data API."""
def __init__(self, bot: Red, session: aiohttp.ClientSession):
self.bot = bot
self.session = session
self.api_key = None
async def _get_api_key(self,) -> str:
tokens = await self.bot.get_shared_api_tokens("youtube")
self.api_key = tokens.get("api_key", "")
return self.api_key
async def get_call(self, query: str) -> Optional[str]:
params = {
"q": query,
"part": "id",
"key": await self._get_api_key(),
"maxResults": 1,
"type": "video",
}
yt_url = "https://www.googleapis.com/youtube/v3/search"
async with self.session.request("GET", yt_url, params=params) as r:
if r.status in [400, 404]:
return None
elif r.status in [403, 429]:
if r.reason == "quotaExceeded":
raise YouTubeApiError("Your YouTube Data API quota has been reached.")
return None
else:
search_response = await r.json()
for search_result in search_response.get("items", []):
if search_result["id"]["kind"] == "youtube#video":
return f"https://www.youtube.com/watch?v={search_result['id']['videoId']}"
@cog_i18n(_)
class MusicCache:
"""Handles music queries to the Spotify and Youtube Data API.
Always tries the Cache first.
"""
def __init__(self, bot: Red, session: aiohttp.ClientSession):
self.bot = bot
self.spotify_api: SpotifyAPI = SpotifyAPI(bot, session)
self.youtube_api: YouTubeAPI = YouTubeAPI(bot, session)
self._session: aiohttp.ClientSession = session
self.database = _database
self._tasks: MutableMapping = {}
self._lock: asyncio.Lock = asyncio.Lock()
self.config: Optional[Config] = None
async def initialize(self, config: Config):
self.config = config
await _database.init()
@staticmethod
def _spotify_format_call(qtype: str, key: str) -> Tuple[str, MutableMapping]:
params = {}
if qtype == "album":
query = f"https://api.spotify.com/v1/albums/{key}/tracks"
elif qtype == "track":
query = f"https://api.spotify.com/v1/tracks/{key}"
else:
query = f"https://api.spotify.com/v1/playlists/{key}/tracks"
return query, params
@staticmethod
def _get_spotify_track_info(track_data: MutableMapping) -> Tuple[str, ...]:
artist_name = track_data["artists"][0]["name"]
track_name = track_data["name"]
track_info = f"{track_name} {artist_name}"
song_url = track_data.get("external_urls", {}).get("spotify")
uri = track_data["uri"]
_id = track_data["id"]
_type = track_data["type"]
return song_url, track_info, uri, artist_name, track_name, _id, _type
async def _spotify_first_time_query(
self,
ctx: commands.Context,
query_type: str,
uri: str,
notifier: Notifier,
skip_youtube: bool = False,
current_cache_level: CacheLevel = CacheLevel.none(),
) -> List[str]:
youtube_urls = []
tracks = await self._spotify_fetch_tracks(query_type, uri, params=None, notifier=notifier)
total_tracks = len(tracks)
database_entries = []
track_count = 0
time_now = int(datetime.datetime.now(datetime.timezone.utc).timestamp())
youtube_cache = CacheLevel.set_youtube().is_subset(current_cache_level)
for track in tracks:
if track.get("error", {}).get("message") == "invalid id":
continue
(
song_url,
track_info,
uri,
artist_name,
track_name,
_id,
_type,
) = self._get_spotify_track_info(track)
database_entries.append(
{
"id": _id,
"type": _type,
"uri": uri,
"track_name": track_name,
"artist_name": artist_name,
"song_url": song_url,
"track_info": track_info,
"last_updated": time_now,
"last_fetched": time_now,
}
)
if skip_youtube is False:
val = None
if youtube_cache:
update = True
with contextlib.suppress(SQLError):
(val, update) = await self.database.fetch_one(
"youtube", "youtube_url", {"track": track_info}
)
if update:
val = None
if val is None:
val = await self._youtube_first_time_query(
ctx, track_info, current_cache_level=current_cache_level
)
if youtube_cache and val:
task = ("update", ("youtube", {"track": track_info}))
self.append_task(ctx, *task)
if val:
youtube_urls.append(val)
else:
youtube_urls.append(track_info)
await asyncio.sleep(0)
track_count += 1
if notifier and ((track_count % 2 == 0) or (track_count == total_tracks)):
await notifier.notify_user(current=track_count, total=total_tracks, key="youtube")
if CacheLevel.set_spotify().is_subset(current_cache_level):
task = ("insert", ("spotify", database_entries))
self.append_task(ctx, *task)
return youtube_urls
async def _youtube_first_time_query(
self,
ctx: commands.Context,
track_info: str,
current_cache_level: CacheLevel = CacheLevel.none(),
) -> str:
track_url = await self.youtube_api.get_call(track_info)
if CacheLevel.set_youtube().is_subset(current_cache_level) and track_url:
time_now = int(datetime.datetime.now(datetime.timezone.utc).timestamp())
task = (
"insert",
(
"youtube",
[
{
"track_info": track_info,
"track_url": track_url,
"last_updated": time_now,
"last_fetched": time_now,
}
],
),
)
self.append_task(ctx, *task)
return track_url
async def _spotify_fetch_tracks(
self,
query_type: str,
uri: str,
recursive: Union[str, bool] = False,
params: MutableMapping = None,
notifier: Optional[Notifier] = None,
) -> Union[MutableMapping, List[str]]:
if recursive is False:
(call, params) = self._spotify_format_call(query_type, uri)
results = await self.spotify_api.get_call(call, params)
else:
results = await self.spotify_api.get_call(recursive, params)
try:
if results["error"]["status"] == 401 and not recursive:
raise SpotifyFetchError(
(
"The Spotify API key or client secret has not been set properly. "
"\nUse `{prefix}audioset spotifyapi` for instructions."
)
)
elif recursive:
return {"next": None}
except KeyError:
pass
if recursive:
return results
tracks = []
track_count = 0
total_tracks = results.get("tracks", results).get("total", 1)
while True:
new_tracks = []
if query_type == "track":
new_tracks = results
tracks.append(new_tracks)
elif query_type == "album":
tracks_raw = results.get("tracks", results).get("items", [])
if tracks_raw:
new_tracks = tracks_raw
tracks.extend(new_tracks)
else:
tracks_raw = results.get("tracks", results).get("items", [])
if tracks_raw:
new_tracks = [k["track"] for k in tracks_raw if k.get("track")]
tracks.extend(new_tracks)
track_count += len(new_tracks)
if notifier:
await notifier.notify_user(current=track_count, total=total_tracks, key="spotify")
try:
if results.get("next") is not None:
results = await self._spotify_fetch_tracks(
query_type, uri, results["next"], params, notifier=notifier
)
continue
else:
break
except KeyError:
raise SpotifyFetchError(
"This doesn't seem to be a valid Spotify playlist/album URL or code."
)
return tracks
async def spotify_query(
self,
ctx: commands.Context,
query_type: str,
uri: str,
skip_youtube: bool = False,
notifier: Optional[Notifier] = None,
) -> List[str]:
"""Queries the Database then falls back to Spotify and YouTube APIs.
Parameters
----------
ctx: commands.Context
The context this method is being called under.
query_type : str
Type of query to perform (Pl
uri: str
Spotify URL ID .
skip_youtube:bool
Whether or not to skip YouTube API Calls.
notifier: Notifier
A Notifier object to handle the user UI notifications while tracks are loaded.
Returns
-------
List[str]
List of Youtube URLs.
"""
current_cache_level = CacheLevel(await self.config.cache_level())
cache_enabled = CacheLevel.set_spotify().is_subset(current_cache_level)
if query_type == "track" and cache_enabled:
update = True
with contextlib.suppress(SQLError):
(val, update) = await self.database.fetch_one(
"spotify", "track_info", {"uri": f"spotify:track:{uri}"}
)
if update:
val = None
else:
val = None
youtube_urls = []
if val is None:
urls = await self._spotify_first_time_query(
ctx,
query_type,
uri,
notifier,
skip_youtube,
current_cache_level=current_cache_level,
)
youtube_urls.extend(urls)
else:
if query_type == "track" and cache_enabled:
task = ("update", ("spotify", {"uri": f"spotify:track:{uri}"}))
self.append_task(ctx, *task)
youtube_urls.append(val)
return youtube_urls
async def spotify_enqueue(
self,
ctx: commands.Context,
query_type: str,
uri: str,
enqueue: bool,
player: lavalink.Player,
lock: Callable,
notifier: Optional[Notifier] = None,
) -> List[lavalink.Track]:
track_list = []
has_not_allowed = False
try:
current_cache_level = CacheLevel(await self.config.cache_level())
guild_data = await self.config.guild(ctx.guild).all()
# now = int(time.time())
enqueued_tracks = 0
consecutive_fails = 0
queue_dur = await queue_duration(ctx)
queue_total_duration = lavalink.utils.format_time(queue_dur)
before_queue_length = len(player.queue)
tracks_from_spotify = await self._spotify_fetch_tracks(
query_type, uri, params=None, notifier=notifier
)
total_tracks = len(tracks_from_spotify)
if total_tracks < 1:
lock(ctx, False)
embed3 = discord.Embed(
colour=await ctx.embed_colour(),
title=_("This doesn't seem to be a supported Spotify URL or code."),
)
await notifier.update_embed(embed3)
return track_list
database_entries = []
time_now = int(datetime.datetime.now(datetime.timezone.utc).timestamp())
youtube_cache = CacheLevel.set_youtube().is_subset(current_cache_level)
spotify_cache = CacheLevel.set_spotify().is_subset(current_cache_level)
for track_count, track in enumerate(tracks_from_spotify):
(
song_url,
track_info,
uri,
artist_name,
track_name,
_id,
_type,
) = self._get_spotify_track_info(track)
database_entries.append(
{
"id": _id,
"type": _type,
"uri": uri,
"track_name": track_name,
"artist_name": artist_name,
"song_url": song_url,
"track_info": track_info,
"last_updated": time_now,
"last_fetched": time_now,
}
)
val = None
if youtube_cache:
update = True
with contextlib.suppress(SQLError):
(val, update) = await self.database.fetch_one(
"youtube", "youtube_url", {"track": track_info}
)
if update:
val = None
if val is None:
val = await self._youtube_first_time_query(
ctx, track_info, current_cache_level=current_cache_level
)
if youtube_cache and val:
task = ("update", ("youtube", {"track": track_info}))
self.append_task(ctx, *task)
if val:
try:
(result, called_api) = await self.lavalink_query(
ctx, player, audio_dataclasses.Query.process_input(val)
)
except (RuntimeError, aiohttp.ServerDisconnectedError):
lock(ctx, False)
error_embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("The connection was reset while loading the playlist."),
)
await notifier.update_embed(error_embed)
break
except asyncio.TimeoutError:
lock(ctx, False)
error_embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("Player timeout, skipping remaining tracks."),
)
await notifier.update_embed(error_embed)
break
track_object = result.tracks
else:
track_object = []
if (track_count % 2 == 0) or (track_count == total_tracks):
key = "lavalink"
seconds = "???"
second_key = None
await notifier.notify_user(
current=track_count,
total=total_tracks,
key=key,
seconds_key=second_key,
seconds=seconds,
)
if consecutive_fails >= 10:
error_embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("Failing to get tracks, skipping remaining."),
)
await notifier.update_embed(error_embed)
break
if not track_object:
consecutive_fails += 1
continue
consecutive_fails = 0
single_track = track_object[0]
if not await is_allowed(
ctx.guild,
(
f"{single_track.title} {single_track.author} {single_track.uri} "
f"{str(audio_dataclasses.Query.process_input(single_track))}"
),
):
has_not_allowed = True
log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})")
continue
track_list.append(single_track)
if enqueue:
if len(player.queue) >= 10000:
continue
if guild_data["maxlength"] > 0:
if track_limit(single_track, guild_data["maxlength"]):
enqueued_tracks += 1
player.add(ctx.author, single_track)
self.bot.dispatch(
"red_audio_track_enqueue",
player.channel.guild,
single_track,
ctx.author,
)
else:
enqueued_tracks += 1
player.add(ctx.author, single_track)
self.bot.dispatch(
"red_audio_track_enqueue",
player.channel.guild,
single_track,
ctx.author,
)
if not player.current:
await player.play()
if len(track_list) == 0:
if not has_not_allowed:
raise SpotifyFetchError(
message=_(
"Nothing found.\nThe YouTube API key may be invalid "
"or you may be rate limited on YouTube's search service.\n"
"Check the YouTube API key again and follow the instructions "
"at `{prefix}audioset youtubeapi`."
).format(prefix=ctx.prefix)
)
player.maybe_shuffle()
if enqueue and tracks_from_spotify:
if total_tracks > enqueued_tracks:
maxlength_msg = " {bad_tracks} tracks cannot be queued.".format(
bad_tracks=(total_tracks - enqueued_tracks)
)
else:
maxlength_msg = ""
embed = discord.Embed(
colour=await ctx.embed_colour(),
title=_("Playlist Enqueued"),
description=_("Added {num} tracks to the queue.{maxlength_msg}").format(
num=enqueued_tracks, maxlength_msg=maxlength_msg
),
)
if not guild_data["shuffle"] and queue_dur > 0:
embed.set_footer(
text=_(
"{time} until start of playlist"
" playback: starts at #{position} in queue"
).format(time=queue_total_duration, position=before_queue_length + 1)
)
await notifier.update_embed(embed)
lock(ctx, False)
if spotify_cache:
task = ("insert", ("spotify", database_entries))
self.append_task(ctx, *task)
except Exception as e:
lock(ctx, False)
raise e
finally:
lock(ctx, False)
return track_list
async def youtube_query(self, ctx: commands.Context, track_info: str) -> str:
current_cache_level = CacheLevel(await self.config.cache_level())
cache_enabled = CacheLevel.set_youtube().is_subset(current_cache_level)
val = None
if cache_enabled:
update = True
with contextlib.suppress(SQLError):
(val, update) = await self.database.fetch_one(
"youtube", "youtube_url", {"track": track_info}
)
if update:
val = None
if val is None:
youtube_url = await self._youtube_first_time_query(
ctx, track_info, current_cache_level=current_cache_level
)
else:
if cache_enabled:
task = ("update", ("youtube", {"track": track_info}))
self.append_task(ctx, *task)
youtube_url = val
return youtube_url
async def lavalink_query(
self,
ctx: commands.Context,
player: lavalink.Player,
query: audio_dataclasses.Query,
forced: bool = False,
) -> Tuple[LoadResult, bool]:
"""A replacement for :code:`lavalink.Player.load_tracks`. This will try to get a valid
cached entry first if not found or if in valid it will then call the lavalink API.
Parameters
----------
ctx: commands.Context
The context this method is being called under.
player : lavalink.Player
The player who's requesting the query.
query: audio_dataclasses.Query
The Query object for the query in question.
forced:bool
Whether or not to skip cache and call API first..
Returns
-------
Tuple[lavalink.LoadResult, bool]
Tuple with the Load result and whether or not the API was called.
"""
current_cache_level = CacheLevel(await self.config.cache_level())
cache_enabled = CacheLevel.set_lavalink().is_subset(current_cache_level)
val = None
_raw_query = audio_dataclasses.Query.process_input(query)
query = str(_raw_query)
if cache_enabled and not forced and not _raw_query.is_local:
update = True
with contextlib.suppress(SQLError):
(val, update) = await self.database.fetch_one("lavalink", "data", {"query": query})
if update:
val = None
if val and isinstance(val, dict):
log.debug(f"Querying Local Database for {query}")
task = ("update", ("lavalink", {"query": query}))
self.append_task(ctx, *task)
else:
val = None
if val and not forced and isinstance(val, dict):
data = val
data["query"] = query
if data.get("loadType") == "V2_COMPACT":
data["loadType"] = "V2_COMPAT"
results = LoadResult(data)
called_api = False
if results.has_error:
# If cached value has an invalid entry make a new call so that it gets updated
return await self.lavalink_query(ctx, player, _raw_query, forced=True)
else:
called_api = True
results = None
try:
results = await player.load_tracks(query)
except KeyError:
results = None
except RuntimeError:
raise TrackEnqueueError
if results is None:
results = LoadResult({"loadType": "LOAD_FAILED", "playlistInfo": {}, "tracks": []})
if (
cache_enabled
and results.load_type
and not results.has_error
and not _raw_query.is_local
and results.tracks
):
with contextlib.suppress(SQLError):
time_now = int(datetime.datetime.now(datetime.timezone.utc).timestamp())
data = json.dumps(results._raw)
if all(
k in data for k in ["loadType", "playlistInfo", "isSeekable", "isStream"]
):
task = (
"insert",
(
"lavalink",
[
{
"query": query,
"data": data,
"last_updated": time_now,
"last_fetched": time_now,
}
],
),
)
self.append_task(ctx, *task)
return results, called_api
async def run_tasks(self, ctx: Optional[commands.Context] = None, _id=None):
lock_id = _id or ctx.message.id
lock_author = ctx.author if ctx else None
async with self._lock:
if lock_id in self._tasks:
log.debug(f"Running database writes for {lock_id} ({lock_author})")
with contextlib.suppress(Exception):
tasks = self._tasks[ctx.message.id]
del self._tasks[ctx.message.id]
await asyncio.gather(
*[self.database.insert(*a) for a in tasks["insert"]],
return_exceptions=True,
)
await asyncio.gather(
*[self.database.update(*a) for a in tasks["update"]],
return_exceptions=True,
)
log.debug(f"Completed database writes for {lock_id} " f"({lock_author})")
async def run_all_pending_tasks(self):
async with self._lock:
log.debug("Running pending writes to database")
with contextlib.suppress(Exception):
tasks = {"update": [], "insert": []}
for (k, task) in self._tasks.items():
for t, args in task.items():
tasks[t].append(args)
self._tasks = {}
await asyncio.gather(
*[self.database.insert(*a) for a in tasks["insert"]], return_exceptions=True
)
await asyncio.gather(
*[self.database.update(*a) for a in tasks["update"]], return_exceptions=True
)
log.debug("Completed pending writes to database have finished")
def append_task(self, ctx: commands.Context, event: str, task: tuple, _id=None):
lock_id = _id or ctx.message.id
if lock_id not in self._tasks:
self._tasks[lock_id] = {"update": [], "insert": []}
self._tasks[lock_id][event].append(task)
async def get_random_from_db(self):
tracks = []
try:
query_data = {}
date = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=7)
date = int(date.timestamp())
query_data["day"] = date
max_age = await self.config.cache_age()
maxage = datetime.datetime.now(tz=datetime.timezone.utc) - datetime.timedelta(
days=max_age
)
maxage_int = int(time.mktime(maxage.timetuple()))
query_data["maxage"] = maxage_int
vals = await self.database.fetch_all("lavalink", "data", query_data)
recently_played = [r.tracks for r in vals if r if isinstance(tracks, dict)]
if recently_played:
track = random.choice(recently_played)
if track.get("loadType") == "V2_COMPACT":
track["loadType"] = "V2_COMPAT"
results = LoadResult(track)
tracks = list(results.tracks)
except Exception:
tracks = []
return tracks
async def autoplay(self, player: lavalink.Player):
autoplaylist = await self.config.guild(player.channel.guild).autoplaylist()
current_cache_level = CacheLevel(await self.config.cache_level())
cache_enabled = CacheLevel.set_lavalink().is_subset(current_cache_level)
playlist = None
tracks = None
if autoplaylist["enabled"]:
with contextlib.suppress(Exception):
playlist = await get_playlist(
autoplaylist["id"],
autoplaylist["scope"],
self.bot,
player.channel.guild,
player.channel.guild.me,
)
tracks = playlist.tracks_obj
if not tracks or not getattr(playlist, "tracks", None):
if cache_enabled:
tracks = await self.get_random_from_db()
if not tracks:
ctx = namedtuple("Context", "message")
(results, called_api) = await self.lavalink_query(
ctx(player.channel.guild),
player,
audio_dataclasses.Query.process_input(_TOP_100_US),
)
tracks = list(results.tracks)
if tracks:
multiple = len(tracks) > 1
track = tracks[0]
valid = not multiple
tries = len(tracks)
while valid is False and multiple:
tries -= 1
if tries <= 0:
raise DatabaseError("No valid entry found")
track = random.choice(tracks)
query = audio_dataclasses.Query.process_input(track)
await asyncio.sleep(0.001)
if not query.valid:
continue
if query.is_local and not query.track.exists():
continue
if not await is_allowed(
player.channel.guild,
(
f"{track.title} {track.author} {track.uri} "
f"{str(audio_dataclasses.Query.process_input(track))}"
),
):
log.debug(
"Query is not allowed in "
f"{player.channel.guild} ({player.channel.guild.id})"
)
continue
valid = True
track.extras["autoplay"] = True
player.add(player.channel.guild.me, track)
self.bot.dispatch(
"red_audio_track_auto_play", player.channel.guild, track, player.channel.guild.me
)
if not player.current:
await player.play()

File diff suppressed because it is too large Load Diff

View File

@@ -1,675 +0,0 @@
import asyncio
import contextlib
import glob
import ntpath
import os
import posixpath
import re
from pathlib import Path, PosixPath, WindowsPath
from typing import List, Optional, Union, MutableMapping, Iterator, AsyncIterator
from urllib.parse import urlparse
import lavalink
from redbot.core import Config
from redbot.core.bot import Red
from redbot.core.i18n import Translator
_config: Optional[Config] = None
_bot: Optional[Red] = None
_localtrack_folder: Optional[str] = None
_ = Translator("Audio", __file__)
_RE_REMOVE_START = re.compile(r"^(sc|list) ")
_RE_YOUTUBE_TIMESTAMP = re.compile(r"&t=(\d+)s?")
_RE_YOUTUBE_INDEX = re.compile(r"&index=(\d+)")
_RE_SPOTIFY_URL = re.compile(r"(http[s]?://)?(open.spotify.com)/")
_RE_SPOTIFY_TIMESTAMP = re.compile(r"#(\d+):(\d+)")
_RE_SOUNDCLOUD_TIMESTAMP = re.compile(r"#t=(\d+):(\d+)s?")
_RE_TWITCH_TIMESTAMP = re.compile(r"\?t=(\d+)h(\d+)m(\d+)s")
_PATH_SEPS = [posixpath.sep, ntpath.sep]
_FULLY_SUPPORTED_MUSIC_EXT = (".mp3", ".flac", ".ogg")
_PARTIALLY_SUPPORTED_MUSIC_EXT = (
".m3u",
".m4a",
".aac",
".ra",
".wav",
".opus",
".wma",
".ts",
".au",
# These do not work
# ".mid",
# ".mka",
# ".amr",
# ".aiff",
# ".ac3",
# ".voc",
# ".dsf",
)
_PARTIALLY_SUPPORTED_VIDEO_EXT = (
".mp4",
".mov",
".flv",
".webm",
".mkv",
".wmv",
".3gp",
".m4v",
".mk3d", # https://github.com/Devoxin/lavaplayer
".mka", # https://github.com/Devoxin/lavaplayer
".mks", # https://github.com/Devoxin/lavaplayer
# These do not work
# ".vob",
# ".mts",
# ".avi",
# ".mpg",
# ".mpeg",
# ".swf",
)
_PARTIALLY_SUPPORTED_MUSIC_EXT += _PARTIALLY_SUPPORTED_VIDEO_EXT
def _pass_config_to_dataclasses(config: Config, bot: Red, folder: str):
global _config, _bot, _localtrack_folder
if _config is None:
_config = config
if _bot is None:
_bot = bot
_localtrack_folder = folder
class LocalPath:
"""Local tracks class.
Used to handle system dir trees in a cross system manner. The only use of this class is for
`localtracks`.
"""
_all_music_ext = _FULLY_SUPPORTED_MUSIC_EXT + _PARTIALLY_SUPPORTED_MUSIC_EXT
def __init__(self, path, **kwargs):
self._path = path
if isinstance(path, (Path, WindowsPath, PosixPath, LocalPath)):
path = str(path.absolute())
elif path is not None:
path = str(path)
self.cwd = Path.cwd()
_lt_folder = Path(_localtrack_folder) if _localtrack_folder else self.cwd
_path = Path(path) if path else self.cwd
if _lt_folder.parts[-1].lower() == "localtracks" and not kwargs.get("forced"):
self.localtrack_folder = _lt_folder
elif kwargs.get("forced"):
if _path.parts[-1].lower() == "localtracks":
self.localtrack_folder = _path
else:
self.localtrack_folder = _path / "localtracks"
else:
self.localtrack_folder = _lt_folder / "localtracks"
try:
_path = Path(path)
_path.relative_to(self.localtrack_folder)
self.path = _path
except (ValueError, TypeError):
for sep in _PATH_SEPS:
if path and path.startswith(f"localtracks{sep}{sep}"):
path = path.replace(f"localtracks{sep}{sep}", "", 1)
elif path and path.startswith(f"localtracks{sep}"):
path = path.replace(f"localtracks{sep}", "", 1)
self.path = self.localtrack_folder.joinpath(path) if path else self.localtrack_folder
try:
if self.path.is_file():
parent = self.path.parent
else:
parent = self.path
self.parent = Path(parent)
except OSError:
self.parent = None
@property
def name(self):
return str(self.path.name)
@property
def suffix(self):
return str(self.path.suffix)
def is_dir(self):
try:
return self.path.is_dir()
except OSError:
return False
def exists(self):
try:
return self.path.exists()
except OSError:
return False
def is_file(self):
try:
return self.path.is_file()
except OSError:
return False
def absolute(self):
try:
return self.path.absolute()
except OSError:
return self._path
@classmethod
def joinpath(cls, *args):
modified = cls(None)
modified.path = modified.path.joinpath(*args)
return modified
def rglob(self, pattern, folder=False) -> Iterator[str]:
if folder:
return glob.iglob(f"{self.path}{os.sep}**{os.sep}", recursive=True)
else:
return glob.iglob(f"{self.path}{os.sep}**{os.sep}{pattern}", recursive=True)
def glob(self, pattern, folder=False) -> Iterator[str]:
if folder:
return glob.iglob(f"{self.path}{os.sep}*{os.sep}", recursive=False)
else:
return glob.iglob(f"{self.path}{os.sep}*{pattern}", recursive=False)
async def multiglob(self, *patterns, folder=False) -> AsyncIterator["LocalPath"]:
for p in patterns:
for rp in self.glob(p):
rp = LocalPath(rp)
if folder and rp.is_dir() and rp.exists():
yield rp
await asyncio.sleep(0)
else:
if rp.suffix in self._all_music_ext and rp.is_file() and rp.exists():
yield rp
await asyncio.sleep(0)
async def multirglob(self, *patterns, folder=False) -> AsyncIterator["LocalPath"]:
for p in patterns:
for rp in self.rglob(p):
rp = LocalPath(rp)
if folder and rp.is_dir() and rp.exists():
yield rp
await asyncio.sleep(0)
else:
if rp.suffix in self._all_music_ext and rp.is_file() and rp.exists():
yield rp
await asyncio.sleep(0)
def __str__(self):
return self.to_string()
def __repr__(self):
return str(self)
def to_string(self):
try:
return str(self.path.absolute())
except OSError:
return str(self._path)
def to_string_user(self, arg: str = None):
string = str(self.absolute()).replace(
(str(self.localtrack_folder.absolute()) + os.sep) if arg is None else arg, ""
)
chunked = False
while len(string) > 145 and os.sep in string:
string = string.split(os.sep, 1)[-1]
chunked = True
if chunked:
string = f"...{os.sep}{string}"
return string
async def tracks_in_tree(self):
tracks = []
async for track in self.multirglob(*[f"{ext}" for ext in self._all_music_ext]):
with contextlib.suppress(ValueError):
if track.path.parent != self.localtrack_folder and track.path.relative_to(
self.path
):
tracks.append(Query.process_input(track))
return sorted(tracks, key=lambda x: x.to_string_user().lower())
async def subfolders_in_tree(self):
return_folders = []
async for f in self.multirglob("", folder=True):
with contextlib.suppress(ValueError):
if (
f not in return_folders
and f.path != self.localtrack_folder
and f.path.relative_to(self.path)
):
return_folders.append(f)
return sorted(return_folders, key=lambda x: x.to_string_user().lower())
async def tracks_in_folder(self):
tracks = []
async for track in self.multiglob(*[f"{ext}" for ext in self._all_music_ext]):
with contextlib.suppress(ValueError):
if track.path.parent != self.localtrack_folder and track.path.relative_to(
self.path
):
tracks.append(Query.process_input(track))
return sorted(tracks, key=lambda x: x.to_string_user().lower())
async def subfolders(self):
return_folders = []
async for f in self.multiglob("", folder=True):
with contextlib.suppress(ValueError):
if (
f not in return_folders
and f.path != self.localtrack_folder
and f.path.relative_to(self.path)
):
return_folders.append(f)
return sorted(return_folders, key=lambda x: x.to_string_user().lower())
def __eq__(self, other):
if isinstance(other, LocalPath):
return self.path._cparts == other.path._cparts
elif isinstance(other, Path):
return self.path._cparts == other._cpart
return NotImplemented
def __hash__(self):
try:
return self._hash
except AttributeError:
self._hash = hash(tuple(self.path._cparts))
return self._hash
def __lt__(self, other):
if isinstance(other, LocalPath):
return self.path._cparts < other.path._cparts
elif isinstance(other, Path):
return self.path._cparts < other._cpart
return NotImplemented
def __le__(self, other):
if isinstance(other, LocalPath):
return self.path._cparts <= other.path._cparts
elif isinstance(other, Path):
return self.path._cparts <= other._cpart
return NotImplemented
def __gt__(self, other):
if isinstance(other, LocalPath):
return self.path._cparts > other.path._cparts
elif isinstance(other, Path):
return self.path._cparts > other._cpart
return NotImplemented
def __ge__(self, other):
if isinstance(other, LocalPath):
return self.path._cparts >= other.path._cparts
elif isinstance(other, Path):
return self.path._cparts >= other._cpart
return NotImplemented
class Query:
"""Query data class.
Use: Query.process_input(query) to generate the Query object.
"""
def __init__(self, query: Union[LocalPath, str], **kwargs):
query = kwargs.get("queryforced", query)
self._raw: Union[LocalPath, str] = query
_localtrack: LocalPath = LocalPath(query)
self.track: Union[LocalPath, str] = _localtrack if (
(_localtrack.is_file() or _localtrack.is_dir()) and _localtrack.exists()
) else query
self.valid: bool = query != "InvalidQueryPlaceHolderName"
self.is_local: bool = kwargs.get("local", False)
self.is_spotify: bool = kwargs.get("spotify", False)
self.is_youtube: bool = kwargs.get("youtube", False)
self.is_soundcloud: bool = kwargs.get("soundcloud", False)
self.is_bandcamp: bool = kwargs.get("bandcamp", False)
self.is_vimeo: bool = kwargs.get("vimeo", False)
self.is_mixer: bool = kwargs.get("mixer", False)
self.is_twitch: bool = kwargs.get("twitch", False)
self.is_other: bool = kwargs.get("other", False)
self.is_playlist: bool = kwargs.get("playlist", False)
self.is_album: bool = kwargs.get("album", False)
self.is_search: bool = kwargs.get("search", False)
self.is_stream: bool = kwargs.get("stream", False)
self.single_track: bool = kwargs.get("single", False)
self.id: Optional[str] = kwargs.get("id", None)
self.invoked_from: Optional[str] = kwargs.get("invoked_from", None)
self.local_name: Optional[str] = kwargs.get("name", None)
self.search_subfolders: bool = kwargs.get("search_subfolders", False)
self.spotify_uri: Optional[str] = kwargs.get("uri", None)
self.uri: Optional[str] = kwargs.get("url", None)
self.is_url: bool = kwargs.get("is_url", False)
self.start_time: int = kwargs.get("start_time", 0)
self.track_index: Optional[int] = kwargs.get("track_index", None)
if self.invoked_from == "sc search":
self.is_youtube = False
self.is_soundcloud = True
self.lavalink_query: str = self._get_query()
if self.is_playlist or self.is_album:
self.single_track = False
self._hash = hash(
(
self.valid,
self.is_local,
self.is_spotify,
self.is_youtube,
self.is_soundcloud,
self.is_bandcamp,
self.is_vimeo,
self.is_mixer,
self.is_twitch,
self.is_other,
self.is_playlist,
self.is_album,
self.is_search,
self.is_stream,
self.single_track,
self.id,
self.spotify_uri,
self.start_time,
self.track_index,
self.uri,
)
)
def __str__(self):
return str(self.lavalink_query)
@classmethod
def process_input(cls, query: Union[LocalPath, lavalink.Track, "Query", str], **kwargs):
"""A replacement for :code:`lavalink.Player.load_tracks`. This will try to get a valid
cached entry first if not found or if in valid it will then call the lavalink API.
Parameters
----------
query : Union[Query, LocalPath, lavalink.Track, str]
The query string or LocalPath object.
Returns
-------
Query
Returns a parsed Query object.
"""
if not query:
query = "InvalidQueryPlaceHolderName"
possible_values = {}
if isinstance(query, str):
query = query.strip("<>")
while "ytsearch:" in query:
query = query.replace("ytsearch:", "")
while "scsearch:" in query:
query = query.replace("scsearch:", "")
elif isinstance(query, Query):
for key, val in kwargs.items():
setattr(query, key, val)
return query
elif isinstance(query, lavalink.Track):
possible_values["stream"] = query.is_stream
query = query.uri
possible_values.update(dict(**kwargs))
possible_values.update(cls._parse(query, **kwargs))
return cls(query, **possible_values)
@staticmethod
def _parse(track, **kwargs) -> MutableMapping:
returning = {}
if (
type(track) == type(LocalPath)
and (track.is_file() or track.is_dir())
and track.exists()
):
returning["local"] = True
returning["name"] = track.name
if track.is_file():
returning["single"] = True
elif track.is_dir():
returning["album"] = True
else:
track = str(track)
if track.startswith("spotify:"):
returning["spotify"] = True
if ":playlist:" in track:
returning["playlist"] = True
elif ":album:" in track:
returning["album"] = True
elif ":track:" in track:
returning["single"] = True
_id = track.split(":", 2)[-1]
_id = _id.split("?")[0]
returning["id"] = _id
if "#" in _id:
match = re.search(_RE_SPOTIFY_TIMESTAMP, track)
if match:
returning["start_time"] = (int(match.group(1)) * 60) + int(match.group(2))
returning["uri"] = track
return returning
if track.startswith("sc ") or track.startswith("list "):
if track.startswith("sc "):
returning["invoked_from"] = "sc search"
returning["soundcloud"] = True
elif track.startswith("list "):
returning["invoked_from"] = "search list"
track = _RE_REMOVE_START.sub("", track, 1)
returning["queryforced"] = track
_localtrack = LocalPath(track)
if _localtrack.exists():
if _localtrack.is_file():
returning["local"] = True
returning["single"] = True
returning["name"] = _localtrack.name
return returning
elif _localtrack.is_dir():
returning["album"] = True
returning["local"] = True
returning["name"] = _localtrack.name
return returning
try:
query_url = urlparse(track)
if all([query_url.scheme, query_url.netloc, query_url.path]):
returning["url"] = track
returning["is_url"] = True
url_domain = ".".join(query_url.netloc.split(".")[-2:])
if not query_url.netloc:
url_domain = ".".join(query_url.path.split("/")[0].split(".")[-2:])
if url_domain in ["youtube.com", "youtu.be"]:
returning["youtube"] = True
_has_index = "&index=" in track
if "&t=" in track:
match = re.search(_RE_YOUTUBE_TIMESTAMP, track)
if match:
returning["start_time"] = int(match.group(1))
if _has_index:
match = re.search(_RE_YOUTUBE_INDEX, track)
if match:
returning["track_index"] = int(match.group(1)) - 1
if all(k in track for k in ["&list=", "watch?"]):
returning["track_index"] = 0
returning["playlist"] = True
returning["single"] = False
elif all(x in track for x in ["playlist?"]):
returning["playlist"] = not _has_index
returning["single"] = _has_index
elif any(k in track for k in ["list="]):
returning["track_index"] = 0
returning["playlist"] = True
returning["single"] = False
else:
returning["single"] = True
elif url_domain == "spotify.com":
returning["spotify"] = True
if "/playlist/" in track:
returning["playlist"] = True
elif "/album/" in track:
returning["album"] = True
elif "/track/" in track:
returning["single"] = True
val = re.sub(_RE_SPOTIFY_URL, "", track).replace("/", ":")
if "user:" in val:
val = val.split(":", 2)[-1]
_id = val.split(":", 1)[-1]
_id = _id.split("?")[0]
if "#" in _id:
_id = _id.split("#")[0]
match = re.search(_RE_SPOTIFY_TIMESTAMP, track)
if match:
returning["start_time"] = (int(match.group(1)) * 60) + int(
match.group(2)
)
returning["id"] = _id
returning["uri"] = f"spotify:{val}"
elif url_domain == "soundcloud.com":
returning["soundcloud"] = True
if "#t=" in track:
match = re.search(_RE_SOUNDCLOUD_TIMESTAMP, track)
if match:
returning["start_time"] = (int(match.group(1)) * 60) + int(
match.group(2)
)
if "/sets/" in track:
if "?in=" in track:
returning["single"] = True
else:
returning["playlist"] = True
else:
returning["single"] = True
elif url_domain == "bandcamp.com":
returning["bandcamp"] = True
if "/album/" in track:
returning["album"] = True
else:
returning["single"] = True
elif url_domain == "vimeo.com":
returning["vimeo"] = True
elif url_domain in ["mixer.com", "beam.pro"]:
returning["mixer"] = True
elif url_domain == "twitch.tv":
returning["twitch"] = True
if "?t=" in track:
match = re.search(_RE_TWITCH_TIMESTAMP, track)
if match:
returning["start_time"] = (
(int(match.group(1)) * 60 * 60)
+ (int(match.group(2)) * 60)
+ int(match.group(3))
)
if not any(x in track for x in ["/clip/", "/videos/"]):
returning["stream"] = True
else:
returning["other"] = True
returning["single"] = True
else:
if kwargs.get("soundcloud", False):
returning["soundcloud"] = True
else:
returning["youtube"] = True
returning["search"] = True
returning["single"] = True
except Exception:
returning["search"] = True
returning["youtube"] = True
returning["single"] = True
return returning
def _get_query(self):
if self.is_local:
return self.track.to_string()
elif self.is_spotify:
return self.spotify_uri
elif self.is_search and self.is_youtube:
return f"ytsearch:{self.track}"
elif self.is_search and self.is_soundcloud:
return f"scsearch:{self.track}"
return self.track
def to_string_user(self):
if self.is_local:
return str(self.track.to_string_user())
return str(self._raw)
@property
def suffix(self):
if self.is_local:
return self.track.suffix
return None
def __eq__(self, other):
if not isinstance(other, Query):
return NotImplemented
return self.to_string_user() == other.to_string_user()
def __hash__(self):
try:
return self._hash
except AttributeError:
self._hash = hash(
(
self.valid,
self.is_local,
self.is_spotify,
self.is_youtube,
self.is_soundcloud,
self.is_bandcamp,
self.is_vimeo,
self.is_mixer,
self.is_twitch,
self.is_other,
self.is_playlist,
self.is_album,
self.is_search,
self.is_stream,
self.single_track,
self.id,
self.spotify_uri,
self.start_time,
self.track_index,
self.uri,
)
)
return self._hash
def __lt__(self, other):
if not isinstance(other, Query):
return NotImplemented
return self.to_string_user() < other.to_string_user()
def __le__(self, other):
if not isinstance(other, Query):
return NotImplemented
return self.to_string_user() <= other.to_string_user()
def __gt__(self, other):
if not isinstance(other, Query):
return NotImplemented
return self.to_string_user() > other.to_string_user()
def __ge__(self, other):
if not isinstance(other, Query):
return NotImplemented
return self.to_string_user() >= other.to_string_user()

View File

@@ -1,31 +0,0 @@
from typing import TYPE_CHECKING
from redbot.core import Config, commands
if TYPE_CHECKING:
_config: Config
else:
_config = None
def _pass_config_to_checks(config: Config):
global _config
if _config is None:
_config = config
def roomlocked():
"""Deny the command if the bot has been room locked."""
async def predicate(ctx: commands.Context):
if ctx.guild is None:
return False
if await ctx.bot.is_mod(member=ctx.author):
return True
room_id = await _config.guild(ctx.guild).room_lock()
if room_id is None or ctx.channel.id == room_id:
return True
return False
return commands.check(predicate)

View File

@@ -1,18 +0,0 @@
from redbot.core import Config
from redbot.core.bot import Red
from .apis import _pass_config_to_apis
from .audio_dataclasses import _pass_config_to_dataclasses
from .converters import _pass_config_to_converters
from .databases import _pass_config_to_databases
from .playlists import _pass_config_to_playlist
from .utils import _pass_config_to_utils
def pass_config_to_dependencies(config: Config, bot: Red, localtracks_folder: str):
_pass_config_to_databases(config, bot)
_pass_config_to_utils(config, bot)
_pass_config_to_dataclasses(config, bot, localtracks_folder)
_pass_config_to_apis(config, bot)
_pass_config_to_playlist(config, bot)
_pass_config_to_converters(config, bot)

View File

@@ -1,515 +0,0 @@
import argparse
import functools
import re
from typing import Optional, Tuple, Union, MutableMapping, TYPE_CHECKING
import discord
from redbot.core import Config, commands
from redbot.core.bot import Red
from redbot.core.i18n import Translator
from .errors import NoMatchesFound, TooManyMatches
from .playlists import get_all_playlist_converter, standardize_scope
from .utils import PlaylistScope
_ = Translator("Audio", __file__)
__all__ = [
"ComplexScopeParser",
"PlaylistConverter",
"ScopeParser",
"LazyGreedyConverter",
"standardize_scope",
"get_lazy_converter",
"get_playlist_converter",
]
if TYPE_CHECKING:
_bot: Red
_config: Config
else:
_bot = None
_config = None
_SCOPE_HELP = """
Scope must be a valid version of one of the following:
Global
Guild
User
"""
_USER_HELP = """
Author must be a valid version of one of the following:
User ID
User Mention
User Name#123
"""
_GUILD_HELP = """
Guild must be a valid version of one of the following:
Guild ID
Exact guild name
"""
MENTION_RE = re.compile(r"^<?(?:(?:@[!&]?)?|#)(\d{15,21})>?$")
def _pass_config_to_converters(config: Config, bot: Red):
global _config, _bot
if _config is None:
_config = config
if _bot is None:
_bot = bot
def _match_id(arg: str) -> Optional[int]:
m = MENTION_RE.match(arg)
if m:
return int(m.group(1))
async def global_unique_guild_finder(ctx: commands.Context, arg: str) -> discord.Guild:
bot: commands.Bot = ctx.bot
_id = _match_id(arg)
if _id is not None:
guild: discord.Guild = bot.get_guild(_id)
if guild is not None:
return guild
maybe_matches = []
for obj in bot.guilds:
if obj.name == arg or str(obj) == arg:
maybe_matches.append(obj)
if not maybe_matches:
raise NoMatchesFound(
_(
'"{arg}" was not found. It must be the ID or '
"complete name of a server which the bot can see."
).format(arg=arg)
)
elif len(maybe_matches) == 1:
return maybe_matches[0]
else:
raise TooManyMatches(
_(
'"{arg}" does not refer to a unique server. '
"Please use the ID for the server you're trying to specify."
).format(arg=arg)
)
async def global_unique_user_finder(
ctx: commands.Context, arg: str, guild: discord.guild = None
) -> discord.abc.User:
bot: commands.Bot = ctx.bot
guild = guild or ctx.guild
_id = _match_id(arg)
if _id is not None:
user: discord.User = bot.get_user(_id)
if user is not None:
return user
objects = bot.users
maybe_matches = []
for obj in objects:
if obj.name == arg or str(obj) == arg:
maybe_matches.append(obj)
if guild is not None:
for member in guild.members:
if member.nick == arg and not any(obj.id == member.id for obj in maybe_matches):
maybe_matches.append(member)
if not maybe_matches:
raise NoMatchesFound(
_(
'"{arg}" was not found. It must be the ID or name or '
"mention a user which the bot can see."
).format(arg=arg)
)
elif len(maybe_matches) == 1:
return maybe_matches[0]
else:
raise TooManyMatches(
_(
'"{arg}" does not refer to a unique server. '
"Please use the ID for the server you're trying to specify."
).format(arg=arg)
)
class PlaylistConverter(commands.Converter):
async def convert(self, ctx: commands.Context, arg: str) -> MutableMapping:
global_matches = await get_all_playlist_converter(
PlaylistScope.GLOBAL.value, _bot, arg, guild=ctx.guild, author=ctx.author
)
guild_matches = await get_all_playlist_converter(
PlaylistScope.GUILD.value, _bot, arg, guild=ctx.guild, author=ctx.author
)
user_matches = await get_all_playlist_converter(
PlaylistScope.USER.value, _bot, arg, guild=ctx.guild, author=ctx.author
)
if not user_matches and not guild_matches and not global_matches:
raise commands.BadArgument(_("Could not match '{}' to a playlist.").format(arg))
return {
PlaylistScope.GLOBAL.value: global_matches,
PlaylistScope.GUILD.value: guild_matches,
PlaylistScope.USER.value: user_matches,
"all": [*global_matches, *guild_matches, *user_matches],
"arg": arg,
}
class NoExitParser(argparse.ArgumentParser):
def error(self, message):
raise commands.BadArgument()
class ScopeParser(commands.Converter):
async def convert(
self, ctx: commands.Context, argument: str
) -> Tuple[Optional[str], discord.User, Optional[discord.Guild], bool]:
target_scope: Optional[str] = None
target_user: Optional[Union[discord.Member, discord.User]] = None
target_guild: Optional[discord.Guild] = None
specified_user = False
argument = argument.replace("", "--")
command, *arguments = argument.split(" -- ")
if arguments:
argument = " -- ".join(arguments)
else:
command = None
parser = NoExitParser(description="Playlist Scope Parsing.", add_help=False)
parser.add_argument("--scope", nargs="*", dest="scope", default=[])
parser.add_argument("--guild", nargs="*", dest="guild", default=[])
parser.add_argument("--server", nargs="*", dest="guild", default=[])
parser.add_argument("--author", nargs="*", dest="author", default=[])
parser.add_argument("--user", nargs="*", dest="author", default=[])
parser.add_argument("--member", nargs="*", dest="author", default=[])
if not command:
parser.add_argument("command", nargs="*")
try:
vals = vars(parser.parse_args(argument.split()))
except Exception as exc:
raise commands.BadArgument() from exc
if vals["scope"]:
scope_raw = " ".join(vals["scope"]).strip()
scope = scope_raw.upper().strip()
valid_scopes = PlaylistScope.list() + [
"GLOBAL",
"GUILD",
"AUTHOR",
"USER",
"SERVER",
"MEMBER",
"BOT",
]
if scope not in valid_scopes:
raise commands.ArgParserFailure("--scope", scope_raw, custom_help=_SCOPE_HELP)
target_scope = standardize_scope(scope)
elif "--scope" in argument and not vals["scope"]:
raise commands.ArgParserFailure("--scope", "Nothing", custom_help=_SCOPE_HELP)
is_owner = await ctx.bot.is_owner(ctx.author)
guild = vals.get("guild", None) or vals.get("server", None)
if is_owner and guild:
server_error = ""
target_guild = None
guild_raw = " ".join(guild).strip()
try:
target_guild = await global_unique_guild_finder(ctx, guild_raw)
except TooManyMatches as err:
server_error = f"{err}\n"
except NoMatchesFound as err:
server_error = f"{err}\n"
if target_guild is None:
raise commands.ArgParserFailure(
"--guild", guild_raw, custom_help=f"{server_error}{_GUILD_HELP}"
)
elif not is_owner and (guild or any(x in argument for x in ["--guild", "--server"])):
raise commands.BadArgument("You cannot use `--guild`")
elif any(x in argument for x in ["--guild", "--server"]):
raise commands.ArgParserFailure("--guild", "Nothing", custom_help=_GUILD_HELP)
author = vals.get("author", None) or vals.get("user", None) or vals.get("member", None)
if author:
user_error = ""
target_user = None
user_raw = " ".join(author).strip()
try:
target_user = await global_unique_user_finder(ctx, user_raw, guild=target_guild)
specified_user = True
except TooManyMatches as err:
user_error = f"{err}\n"
except NoMatchesFound as err:
user_error = f"{err}\n"
if target_user is None:
raise commands.ArgParserFailure(
"--author", user_raw, custom_help=f"{user_error}{_USER_HELP}"
)
elif any(x in argument for x in ["--author", "--user", "--member"]):
raise commands.ArgParserFailure("--scope", "Nothing", custom_help=_USER_HELP)
target_scope: str = target_scope or None
target_user: Union[discord.Member, discord.User] = target_user or ctx.author
target_guild: discord.Guild = target_guild or ctx.guild
return target_scope, target_user, target_guild, specified_user
class ComplexScopeParser(commands.Converter):
async def convert(
self, ctx: commands.Context, argument: str
) -> Tuple[
str,
discord.User,
Optional[discord.Guild],
bool,
str,
discord.User,
Optional[discord.Guild],
bool,
]:
target_scope: Optional[str] = None
target_user: Optional[Union[discord.Member, discord.User]] = None
target_guild: Optional[discord.Guild] = None
specified_target_user = False
source_scope: Optional[str] = None
source_user: Optional[Union[discord.Member, discord.User]] = None
source_guild: Optional[discord.Guild] = None
specified_source_user = False
argument = argument.replace("", "--")
command, *arguments = argument.split(" -- ")
if arguments:
argument = " -- ".join(arguments)
else:
command = None
parser = NoExitParser(description="Playlist Scope Parsing.", add_help=False)
parser.add_argument("--to-scope", nargs="*", dest="to_scope", default=[])
parser.add_argument("--to-guild", nargs="*", dest="to_guild", default=[])
parser.add_argument("--to-server", nargs="*", dest="to_server", default=[])
parser.add_argument("--to-author", nargs="*", dest="to_author", default=[])
parser.add_argument("--to-user", nargs="*", dest="to_user", default=[])
parser.add_argument("--to-member", nargs="*", dest="to_member", default=[])
parser.add_argument("--from-scope", nargs="*", dest="from_scope", default=[])
parser.add_argument("--from-guild", nargs="*", dest="from_guild", default=[])
parser.add_argument("--from-server", nargs="*", dest="from_server", default=[])
parser.add_argument("--from-author", nargs="*", dest="from_author", default=[])
parser.add_argument("--from-user", nargs="*", dest="from_user", default=[])
parser.add_argument("--from-member", nargs="*", dest="from_member", default=[])
if not command:
parser.add_argument("command", nargs="*")
try:
vals = vars(parser.parse_args(argument.split()))
except Exception as exc:
raise commands.BadArgument() from exc
is_owner = await ctx.bot.is_owner(ctx.author)
valid_scopes = PlaylistScope.list() + [
"GLOBAL",
"GUILD",
"AUTHOR",
"USER",
"SERVER",
"MEMBER",
"BOT",
]
if vals["to_scope"]:
to_scope_raw = " ".join(vals["to_scope"]).strip()
to_scope = to_scope_raw.upper().strip()
if to_scope not in valid_scopes:
raise commands.ArgParserFailure(
"--to-scope", to_scope_raw, custom_help=_SCOPE_HELP
)
target_scope = standardize_scope(to_scope)
elif "--to-scope" in argument and not vals["to_scope"]:
raise commands.ArgParserFailure("--to-scope", "Nothing", custom_help=_SCOPE_HELP)
if vals["from_scope"]:
from_scope_raw = " ".join(vals["from_scope"]).strip()
from_scope = from_scope_raw.upper().strip()
if from_scope not in valid_scopes:
raise commands.ArgParserFailure(
"--from-scope", from_scope_raw, custom_help=_SCOPE_HELP
)
source_scope = standardize_scope(from_scope)
elif "--from-scope" in argument and not vals["to_scope"]:
raise commands.ArgParserFailure("--to-scope", "Nothing", custom_help=_SCOPE_HELP)
to_guild = vals.get("to_guild", None) or vals.get("to_server", None)
if is_owner and to_guild:
target_server_error = ""
target_guild = None
to_guild_raw = " ".join(to_guild).strip()
try:
target_guild = await global_unique_guild_finder(ctx, to_guild_raw)
except TooManyMatches as err:
target_server_error = f"{err}\n"
except NoMatchesFound as err:
target_server_error = f"{err}\n"
if target_guild is None:
raise commands.ArgParserFailure(
"--to-guild", to_guild_raw, custom_help=f"{target_server_error}{_GUILD_HELP}"
)
elif not is_owner and (
to_guild or any(x in argument for x in ["--to-guild", "--to-server"])
):
raise commands.BadArgument("You cannot use `--to-server`")
elif any(x in argument for x in ["--to-guild", "--to-server"]):
raise commands.ArgParserFailure("--to-server", "Nothing", custom_help=_GUILD_HELP)
from_guild = vals.get("from_guild", None) or vals.get("from_server", None)
if is_owner and from_guild:
source_server_error = ""
source_guild = None
from_guild_raw = " ".join(to_guild).strip()
try:
source_guild = await global_unique_guild_finder(ctx, from_guild_raw)
except TooManyMatches as err:
source_server_error = f"{err}\n"
except NoMatchesFound as err:
source_server_error = f"{err}\n"
if source_guild is None:
raise commands.ArgParserFailure(
"--from-guild",
from_guild_raw,
custom_help=f"{source_server_error}{_GUILD_HELP}",
)
elif not is_owner and (
from_guild or any(x in argument for x in ["--from-guild", "--from-server"])
):
raise commands.BadArgument("You cannot use `--from-server`")
elif any(x in argument for x in ["--from-guild", "--from-server"]):
raise commands.ArgParserFailure("--from-server", "Nothing", custom_help=_GUILD_HELP)
to_author = (
vals.get("to_author", None) or vals.get("to_user", None) or vals.get("to_member", None)
)
if to_author:
target_user_error = ""
target_user = None
to_user_raw = " ".join(to_author).strip()
try:
target_user = await global_unique_user_finder(ctx, to_user_raw, guild=target_guild)
specified_target_user = True
except TooManyMatches as err:
target_user_error = f"{err}\n"
except NoMatchesFound as err:
target_user_error = f"{err}\n"
if target_user is None:
raise commands.ArgParserFailure(
"--to-author", to_user_raw, custom_help=f"{target_user_error}{_USER_HELP}"
)
elif any(x in argument for x in ["--to-author", "--to-user", "--to-member"]):
raise commands.ArgParserFailure("--to-user", "Nothing", custom_help=_USER_HELP)
from_author = (
vals.get("from_author", None)
or vals.get("from_user", None)
or vals.get("from_member", None)
)
if from_author:
source_user_error = ""
source_user = None
from_user_raw = " ".join(to_author).strip()
try:
source_user = await global_unique_user_finder(
ctx, from_user_raw, guild=target_guild
)
specified_target_user = True
except TooManyMatches as err:
source_user_error = f"{err}\n"
except NoMatchesFound as err:
source_user_error = f"{err}\n"
if source_user is None:
raise commands.ArgParserFailure(
"--from-author", from_user_raw, custom_help=f"{source_user_error}{_USER_HELP}"
)
elif any(x in argument for x in ["--from-author", "--from-user", "--from-member"]):
raise commands.ArgParserFailure("--from-user", "Nothing", custom_help=_USER_HELP)
target_scope: str = target_scope or PlaylistScope.GUILD.value
target_user: Union[discord.Member, discord.User] = target_user or ctx.author
target_guild: discord.Guild = target_guild or ctx.guild
source_scope: str = source_scope or PlaylistScope.GUILD.value
source_user: Union[discord.Member, discord.User] = source_user or ctx.author
source_guild: discord.Guild = source_guild or ctx.guild
return (
source_scope,
source_user,
source_guild,
specified_source_user,
target_scope,
target_user,
target_guild,
specified_target_user,
)
class LazyGreedyConverter(commands.Converter):
def __init__(self, splitter: str):
self.splitter_Value = splitter
async def convert(self, ctx: commands.Context, argument: str) -> str:
full_message = ctx.message.content.partition(f" {argument} ")
if len(full_message) == 1:
full_message = (
(argument if argument not in full_message else "") + " " + full_message[0]
)
elif len(full_message) > 1:
full_message = (
(argument if argument not in full_message else "") + " " + full_message[-1]
)
greedy_output = (" " + full_message.replace("", "--")).partition(
f" {self.splitter_Value}"
)[0]
return f"{greedy_output}".strip()
def get_lazy_converter(splitter: str) -> type:
"""Returns a typechecking safe `LazyGreedyConverter` suitable for use with discord.py."""
class PartialMeta(type(LazyGreedyConverter)):
__call__ = functools.partialmethod(type(LazyGreedyConverter).__call__, splitter)
class ValidatedConverter(LazyGreedyConverter, metaclass=PartialMeta):
pass
return ValidatedConverter
def get_playlist_converter() -> type:
"""Returns a typechecking safe `PlaylistConverter` suitable for use with discord.py."""
class PartialMeta(type(PlaylistConverter)):
__call__ = functools.partialmethod(type(PlaylistConverter).__call__)
class ValidatedConverter(PlaylistConverter, metaclass=PartialMeta):
pass
return ValidatedConverter

View File

@@ -1,26 +0,0 @@
server:
host: "localhost"
port: 2333 # REST server
lavalink:
server:
password: "youshallnotpass"
sources:
youtube: true
bandcamp: true
soundcloud: true
twitch: true
vimeo: true
mixer: true
http: true
local: true
sentryDsn: ""
bufferDurationMs: 400
youtubePlaylistLoadLimit: 10000
logging:
file:
max-history: 30
max-size: 1GB
path: ./logs/
level:
root: INFO
lavalink: INFO

View File

@@ -1,372 +0,0 @@
import asyncio
import concurrent.futures
import contextlib
import datetime
import json
import logging
import time
from dataclasses import dataclass, field
from typing import Dict, List, Optional, TYPE_CHECKING, Tuple, Union, MutableMapping, Mapping
import apsw
from redbot.core import Config
from redbot.core.bot import Red
from redbot.core.data_manager import cog_data_path
from .errors import InvalidTableError
from .sql_statements import *
from .utils import PlaylistScope
log = logging.getLogger("red.audio.database")
if TYPE_CHECKING:
database_connection: apsw.Connection
_bot: Red
_config: Config
else:
_config = None
_bot = None
database_connection = None
SCHEMA_VERSION = 3
SQLError = apsw.ExecutionCompleteError
_PARSER: Mapping = {
"youtube": {
"insert": YOUTUBE_UPSERT,
"youtube_url": {"query": YOUTUBE_QUERY},
"update": YOUTUBE_UPDATE,
},
"spotify": {
"insert": SPOTIFY_UPSERT,
"track_info": {"query": SPOTIFY_QUERY},
"update": SPOTIFY_UPDATE,
},
"lavalink": {
"insert": LAVALINK_UPSERT,
"data": {"query": LAVALINK_QUERY, "played": LAVALINK_QUERY_LAST_FETCHED_RANDOM},
"update": LAVALINK_UPDATE,
},
}
def _pass_config_to_databases(config: Config, bot: Red):
global _config, _bot, database_connection
if _config is None:
_config = config
if _bot is None:
_bot = bot
if database_connection is None:
database_connection = apsw.Connection(
str(cog_data_path(_bot.get_cog("Audio")) / "Audio.db")
)
@dataclass
class PlaylistFetchResult:
playlist_id: int
playlist_name: str
scope_id: int
author_id: int
playlist_url: Optional[str] = None
tracks: List[MutableMapping] = field(default_factory=lambda: [])
def __post_init__(self):
if isinstance(self.tracks, str):
self.tracks = json.loads(self.tracks)
@dataclass
class CacheFetchResult:
query: Optional[Union[str, MutableMapping]]
last_updated: int
def __post_init__(self):
if isinstance(self.last_updated, int):
self.updated_on: datetime.datetime = datetime.datetime.fromtimestamp(self.last_updated)
if isinstance(self.query, str) and all(
k in self.query for k in ["loadType", "playlistInfo", "isSeekable", "isStream"]
):
self.query = json.loads(self.query)
@dataclass
class CacheLastFetchResult:
tracks: List[MutableMapping] = field(default_factory=lambda: [])
def __post_init__(self):
if isinstance(self.tracks, str):
self.tracks = json.loads(self.tracks)
@dataclass
class CacheGetAllLavalink:
query: str
data: List[MutableMapping] = field(default_factory=lambda: [])
def __post_init__(self):
if isinstance(self.data, str):
self.data = json.loads(self.data)
class CacheInterface:
def __init__(self):
self.database = database_connection.cursor()
@staticmethod
def close():
with contextlib.suppress(Exception):
database_connection.close()
async def init(self):
self.database.execute(PRAGMA_SET_temp_store)
self.database.execute(PRAGMA_SET_journal_mode)
self.database.execute(PRAGMA_SET_read_uncommitted)
self.maybe_migrate()
self.database.execute(LAVALINK_CREATE_TABLE)
self.database.execute(LAVALINK_CREATE_INDEX)
self.database.execute(YOUTUBE_CREATE_TABLE)
self.database.execute(YOUTUBE_CREATE_INDEX)
self.database.execute(SPOTIFY_CREATE_TABLE)
self.database.execute(SPOTIFY_CREATE_INDEX)
await self.clean_up_old_entries()
async def clean_up_old_entries(self):
max_age = await _config.cache_age()
maxage = datetime.datetime.now(tz=datetime.timezone.utc) - datetime.timedelta(days=max_age)
maxage_int = int(time.mktime(maxage.timetuple()))
values = {"maxage": maxage_int}
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
executor.submit(self.database.execute, LAVALINK_DELETE_OLD_ENTRIES, values)
executor.submit(self.database.execute, YOUTUBE_DELETE_OLD_ENTRIES, values)
executor.submit(self.database.execute, SPOTIFY_DELETE_OLD_ENTRIES, values)
def maybe_migrate(self):
current_version = self.database.execute(PRAGMA_FETCH_user_version).fetchone()
if isinstance(current_version, tuple):
current_version = current_version[0]
if current_version == SCHEMA_VERSION:
return
self.database.execute(PRAGMA_SET_user_version, {"version": SCHEMA_VERSION})
async def insert(self, table: str, values: List[MutableMapping]):
try:
query = _PARSER.get(table, {}).get("insert")
if query is None:
raise InvalidTableError(f"{table} is not a valid table in the database.")
self.database.execute("BEGIN;")
self.database.executemany(query, values)
self.database.execute("COMMIT;")
except Exception as err:
log.debug("Error during audio db insert", exc_info=err)
async def update(self, table: str, values: Dict[str, Union[str, int]]):
try:
table = _PARSER.get(table, {})
sql_query = table.get("update")
time_now = int(datetime.datetime.now(datetime.timezone.utc).timestamp())
values["last_fetched"] = time_now
if not table:
raise InvalidTableError(f"{table} is not a valid table in the database.")
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
executor.submit(self.database.execute, sql_query, values)
except Exception as err:
log.debug("Error during audio db update", exc_info=err)
async def fetch_one(
self, table: str, query: str, values: Dict[str, Union[str, int]]
) -> Tuple[Optional[str], bool]:
table = _PARSER.get(table, {})
sql_query = table.get(query, {}).get("query")
if not table:
raise InvalidTableError(f"{table} is not a valid table in the database.")
max_age = await _config.cache_age()
maxage = datetime.datetime.now(tz=datetime.timezone.utc) - datetime.timedelta(days=max_age)
maxage_int = int(time.mktime(maxage.timetuple()))
values.update({"maxage": maxage_int})
output = self.database.execute(sql_query, values).fetchone() or (None, 0)
result = CacheFetchResult(*output)
return result.query, False
async def fetch_all(
self, table: str, query: str, values: Dict[str, Union[str, int]]
) -> List[CacheLastFetchResult]:
table = _PARSER.get(table, {})
sql_query = table.get(query, {}).get("played")
if not table:
raise InvalidTableError(f"{table} is not a valid table in the database.")
output = []
for index, row in enumerate(self.database.execute(sql_query, values), start=1):
if index % 50 == 0:
await asyncio.sleep(0.01)
output.append(CacheLastFetchResult(*row))
return output
async def fetch_random(
self, table: str, query: str, values: Dict[str, Union[str, int]]
) -> CacheLastFetchResult:
table = _PARSER.get(table, {})
sql_query = table.get(query, {}).get("played")
if not table:
raise InvalidTableError(f"{table} is not a valid table in the database.")
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
for future in concurrent.futures.as_completed(
[executor.submit(self.database.execute, sql_query, values)]
):
try:
row = future.result()
row = row.fetchone()
except Exception as exc:
log.debug(f"Failed to completed random fetch from database", exc_info=exc)
return CacheLastFetchResult(*row)
class PlaylistInterface:
def __init__(self):
self.cursor = database_connection.cursor()
self.cursor.execute(PRAGMA_SET_temp_store)
self.cursor.execute(PRAGMA_SET_journal_mode)
self.cursor.execute(PRAGMA_SET_read_uncommitted)
self.cursor.execute(PLAYLIST_CREATE_TABLE)
self.cursor.execute(PLAYLIST_CREATE_INDEX)
@staticmethod
def close():
with contextlib.suppress(Exception):
database_connection.close()
@staticmethod
def get_scope_type(scope: str) -> int:
if scope == PlaylistScope.GLOBAL.value:
table = 1
elif scope == PlaylistScope.USER.value:
table = 3
else:
table = 2
return table
def fetch(self, scope: str, playlist_id: int, scope_id: int) -> PlaylistFetchResult:
scope_type = self.get_scope_type(scope)
row = (
self.cursor.execute(
PLAYLIST_FETCH,
({"playlist_id": playlist_id, "scope_id": scope_id, "scope_type": scope_type}),
).fetchone()
or []
)
return PlaylistFetchResult(*row) if row else None
async def fetch_all(
self, scope: str, scope_id: int, author_id=None
) -> List[PlaylistFetchResult]:
scope_type = self.get_scope_type(scope)
if author_id is not None:
output = []
for index, row in enumerate(
self.cursor.execute(
PLAYLIST_FETCH_ALL_WITH_FILTER,
({"scope_type": scope_type, "scope_id": scope_id, "author_id": author_id}),
),
start=1,
):
if index % 50 == 0:
await asyncio.sleep(0.01)
output.append(row)
else:
output = []
for index, row in enumerate(
self.cursor.execute(
PLAYLIST_FETCH_ALL, ({"scope_type": scope_type, "scope_id": scope_id})
),
start=1,
):
if index % 50 == 0:
await asyncio.sleep(0.01)
output.append(row)
return [PlaylistFetchResult(*row) for row in output] if output else []
async def fetch_all_converter(
self, scope: str, playlist_name, playlist_id
) -> List[PlaylistFetchResult]:
scope_type = self.get_scope_type(scope)
try:
playlist_id = int(playlist_id)
except Exception:
playlist_id = -1
output = []
for index, row in enumerate(
self.cursor.execute(
PLAYLIST_FETCH_ALL_CONVERTER,
(
{
"scope_type": scope_type,
"playlist_name": playlist_name,
"playlist_id": playlist_id,
}
),
),
start=1,
):
if index % 50 == 0:
await asyncio.sleep(0.01)
output.append(row)
return [PlaylistFetchResult(*row) for row in output] if output else []
def delete(self, scope: str, playlist_id: int, scope_id: int):
scope_type = self.get_scope_type(scope)
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
executor.submit(
self.cursor.execute,
PLAYLIST_DELETE,
({"playlist_id": playlist_id, "scope_id": scope_id, "scope_type": scope_type}),
)
def delete_scheduled(self):
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
executor.submit(self.cursor.execute, PLAYLIST_DELETE_SCHEDULED)
def drop(self, scope: str):
scope_type = self.get_scope_type(scope)
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
executor.submit(
self.cursor.execute, PLAYLIST_DELETE_SCOPE, ({"scope_type": scope_type})
)
def create_table(self, scope: str):
scope_type = self.get_scope_type(scope)
return self.cursor.execute(PLAYLIST_CREATE_TABLE, ({"scope_type": scope_type}))
def upsert(
self,
scope: str,
playlist_id: int,
playlist_name: str,
scope_id: int,
author_id: int,
playlist_url: Optional[str],
tracks: List[MutableMapping],
):
scope_type = self.get_scope_type(scope)
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
executor.submit(
self.cursor.execute,
PLAYLIST_UPSERT,
{
"scope_type": str(scope_type),
"playlist_id": int(playlist_id),
"playlist_name": str(playlist_name),
"scope_id": int(scope_id),
"author_id": int(author_id),
"playlist_url": playlist_url,
"tracks": json.dumps(tracks),
},
)

View File

@@ -1,47 +0,0 @@
# The equalizer class and some audio eq functions are derived from
# 180093157554388993's work, with his permission
class Equalizer:
def __init__(self):
self._band_count = 15
self.bands = [0.0 for _loop_counter in range(self._band_count)]
def set_gain(self, band: int, gain: float):
if band < 0 or band >= self._band_count:
raise IndexError(f"Band {band} does not exist!")
gain = min(max(gain, -0.25), 1.0)
self.bands[band] = gain
def get_gain(self, band: int):
if band < 0 or band >= self._band_count:
raise IndexError(f"Band {band} does not exist!")
return self.bands[band]
def visualise(self):
block = ""
bands = [str(band + 1).zfill(2) for band in range(self._band_count)]
bottom = (" " * 8) + " ".join(bands)
gains = [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0, -0.1, -0.2, -0.25]
for gain in gains:
prefix = ""
if gain > 0:
prefix = "+"
elif gain == 0:
prefix = " "
block += f"{prefix}{gain:.2f} | "
for value in self.bands:
if value >= gain:
block += "[] "
else:
block += " "
block += "\n"
block += bottom
return block

View File

@@ -1,112 +0,0 @@
import aiohttp
class AudioError(Exception):
"""Base exception for errors in the Audio cog."""
class LavalinkDownloadFailed(AudioError, RuntimeError):
"""Downloading the Lavalink jar failed.
Attributes
----------
response : aiohttp.ClientResponse
The response from the server to the failed GET request.
should_retry : bool
Whether or not the Audio cog should retry downloading the jar.
"""
def __init__(self, *args, response: aiohttp.ClientResponse, should_retry: bool = False):
super().__init__(*args)
self.response = response
self.should_retry = should_retry
def __repr__(self) -> str:
str_args = [*map(str, self.args), self._response_repr()]
return f"LavalinkDownloadFailed({', '.join(str_args)}"
def __str__(self) -> str:
return f"{super().__str__()} {self._response_repr()}"
def _response_repr(self) -> str:
return f"[{self.response.status} {self.response.reason}]"
class QueryUnauthorized(AudioError):
"""Provided an unauthorized query to audio."""
def __init__(self, message, *args):
self.message = message
super().__init__(*args)
class TrackEnqueueError(AudioError):
"""Unable to play track."""
class PlayListError(AudioError):
"""Base exception for errors related to playlists."""
class InvalidPlaylistScope(PlayListError):
"""Provided playlist scope is not valid."""
class MissingGuild(PlayListError):
"""Trying to access the Guild scope without a guild."""
class MissingAuthor(PlayListError):
"""Trying to access the User scope without an user id."""
class TooManyMatches(PlayListError):
"""Too many playlist match user input."""
class NoMatchesFound(PlayListError):
"""No entries found for this input."""
class NotAllowed(PlayListError):
"""Too many playlist match user input."""
class ApiError(AudioError):
"""Base exception for API errors in the Audio cog."""
class SpotifyApiError(ApiError):
"""Base exception for Spotify API errors."""
class SpotifyFetchError(SpotifyApiError):
"""Fetching Spotify data failed."""
def __init__(self, message, *args):
self.message = message
super().__init__(*args)
class YouTubeApiError(ApiError):
"""Base exception for YouTube Data API errors."""
class DatabaseError(AudioError):
"""Base exception for database errors in the Audio cog."""
class InvalidTableError(DatabaseError):
"""Provided table to query is not a valid table."""
class LocalTrackError(AudioError):
"""Base exception for local track errors."""
class InvalidLocalTrack(LocalTrackError):
"""Base exception for local track errors."""
class InvalidLocalTrackFolder(LocalTrackError):
"""Base exception for local track errors."""

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