Compare commits

..

27 Commits

Author SHA1 Message Date
palmtree5
9f4a7f7623 [V3] Bump version to 3.0.0b11 (#1483) 2018-04-02 17:19:50 -08:00
retke
10012c1e16 [V3] added --version flag (#1479) 2018-04-02 17:17:19 -08:00
Michael H
d65f8856f4 [V3] Data Converter (#1293)
* More docstrings

* still not ready...

* push this untested pile of code.

* working, menu needs cleaning up though, modlog converter not here yet

* menu cleanup

* add note about the fact that values are overwritten

* add i18n

* User friendlier quitting

* Better naming of a function

* setup automodule for dataconverter

* More documentation

* use Config.MEMBER (etc) instead of 'MEMBER' (etc)
2018-04-02 21:14:37 -04:00
Will
d79d8fbbea [V3] Fix logic issue with [p]load (#1460) 2018-04-02 17:09:17 -08:00
palmtree5
772590c41c [V3] Add settings displays to [p]set and [p]bankset (#1475) 2018-04-02 21:01:43 -04:00
aikaterna
d9c71bddb8 [V3 Audio] Add voteskip and DJ role (#1473)
* [V3 Audio] Add voteskip and DJ role

* Fix connection time storage for audiostats

* Update pause command for more explicit handling

Partially fixes #1478. Users will need to use pause twice before resuming until issue no. 20 on the Red-Lavalink repo is addressed.

* Update pause command

* Update pause command

* Add jukebox mode

Adds a price option for enqueuing songs. If DJ mode is active when jukebox mode is active, no one is charged credits as mods are exempt and plebs can't queue songs without the DJ role.
2018-04-02 20:53:37 -04:00
Will
29ce2401ca [V3 Config] Fix unloading and implement singleton driver (#1458)
* Add the identifier as an initialization parameter

* Remove config object singleton and opt for a shared JSON datastore

* Fix bot unloading to deal with memory leaks

* Fix tests

* Fix clear all bug
2018-04-02 16:47:27 -08:00
Will
720ef38886 [V3 Help] Fix the two missing characters in help (#1456) 2018-04-02 16:29:44 -08:00
Will
728ab6c8c1 [V3 Downloader] Allow for requiring minimum python version (#1455) 2018-04-02 16:26:07 -08:00
Will
935028addc [V3 Downloader] Add install messages from info.json (#1453) 2018-04-02 16:23:55 -08:00
palmtree5
e70e22d557 [V3 Image] Actually check if a client ID is set before making request (#1485)
* [V3 Image] actually check if a client id is set before making request

* Clarify imgurcreds docstring + drop guild_only from [p]imgur

* Fix the actual problem (bad urls)

* needs to be params not data
2018-04-02 20:14:16 -04:00
palmtree5
f3db4b5cb0 [V3 Modlog] Fix TypeError related to 'until' (#1487) 2018-04-02 20:09:09 -04:00
palmtree5
d60fc06379 [V3] Update translations from Crowdin (#1490) 2018-04-02 19:39:07 -04:00
Wyn
a813260717 [V3 Audio] Bump timeout connecting to Lavalink (#1474)
* [V3 Audio] Bump timeout connecting to Lavalink

Lavalink server can take 20-35 seconds to start, bumped to 50 seconds for good measure.

* Update audio.py

Added proper timeout

* Update __init__.py

Removed old timeout
2018-04-02 19:36:26 -04:00
bobloy
10d01df7dd [V3 General] Text fix in flip command (#1489) 2018-04-02 12:43:11 -08:00
palmtree5
8eb075fa86 [V3 Core] Embed toggling support (#1467)
* [V3 CogManagerUI] implement text-only support in [p]cogs

* Change page length to 1800 + workaround for pages starting with delim

* [V3 Core] text mode support for [p]contact and [p]dm

* Implement text-only support in modlog and fix everything that broke because of it

* Fix modlog stuff in filter too

* Fix tests

* Implement optional embed support in [p]help

* move to .format
2018-03-28 20:15:51 -04:00
palmtree5
c2e7bfa641 [V3 Instance setup] Implement backup support for instances using Mongo (#1470)
* [V3 Instance setup] import backup support for instances using Mongo

* remove_instance is now a coroutine + remove NIE

* move Mongo import down

* move another import
2018-03-28 20:12:26 -04:00
palmtree5
2f23244937 [V3 Core] Add [p]backup (#1471)
* [V3 Core] add [p]backup

* move imports
2018-03-28 19:53:27 -04:00
palmtree5
9ecea9e1d5 [V3 instance setup] Warn and request confirmation if instance name already in use (#1469) 2018-03-28 19:13:34 -04:00
palmtree5
61b34e835e [V3] Drop an unnecessary if in embed_requested (#1468) 2018-03-28 19:10:02 -04:00
palmtree5
4e2b83c052 [V3 Docs] Add and update existing features (#1451)
* [V3 Docs] bump version

* Remove removed functions from __all__

* Update docstring format

* Update copyright year

* Add embed utils docs

* Document bot class

* Document RPC

* Update toctree
2018-03-24 17:27:04 -04:00
palmtree5
45ee4755a6 [V3 Core] Fix url sent when doing [p]invite (#1461) 2018-03-24 17:24:06 -04:00
palmtree5
59281afe90 [V3 Instance setup] cog identifiers are strings, not ints (#1448) 2018-03-22 19:11:27 -04:00
retke
cf5a63a5d5 [V3] Set token command fix (#1449)
* [V3] Add set token command

* DM check

* warning message + delete if token isn't send in DM

* Update string formatting

* fix condition invertion
2018-03-22 19:08:57 -04:00
Will
96869074c3 [V3 Docs] Third time's the charm (#1447)
* Get the right sphinx version

* Add mongo extra
2018-03-20 21:14:25 -04:00
Will
c107d5fa7f [V3 Docs] Really fix it this time (#1444) 2018-03-20 21:08:01 -04:00
Will
bed56e8891 [V3 Docs] Add new RTD yaml file (#1443) 2018-03-20 20:58:48 -04:00
140 changed files with 2337 additions and 936 deletions

2
.github/CODEOWNERS vendored
View File

@@ -21,6 +21,7 @@ redbot/core/rpc.py @tekulvw
redbot/core/sentry_setup.py @Kowlin @tekulvw redbot/core/sentry_setup.py @Kowlin @tekulvw
redbot/core/utils/chat_formatting.py @tekulvw redbot/core/utils/chat_formatting.py @tekulvw
redbot/core/utils/mod.py @palmtree5 redbot/core/utils/mod.py @palmtree5
redbot/core/utils/data_converter.py @mikeshardmind
# Cogs # Cogs
redbot/cogs/admin/* @tekulvw redbot/cogs/admin/* @tekulvw
@@ -38,6 +39,7 @@ redbot/cogs/mod/* @palmtree5
redbot/cogs/modlog/* @palmtree5 redbot/cogs/modlog/* @palmtree5
redbot/cogs/streams/* @Twentysix26 @palmtree5 redbot/cogs/streams/* @Twentysix26 @palmtree5
redbot/cogs/trivia/* @Tobotimus redbot/cogs/trivia/* @Tobotimus
redbot/cogs/dataconverter/* @mikeshardmind
# Docs # Docs
docs/* @tekulvw @palmtree5 docs/* @tekulvw @palmtree5

14
.readthedocs.yml Normal file
View File

@@ -0,0 +1,14 @@
formats:
- pdf
build:
image: latest
requirements_file: docs/requirements.txt
python:
version: 3.6
pip_install: true
extra_requirements:
- docs
- mongo

View File

@@ -0,0 +1,62 @@
.. Importing data from a V2 install
================================
Importing data from a V2 install
================================
----------------
What you'll need
----------------
1. A Running V3 bot
2. The path where your V2 bot is installed
--------------
Importing data
--------------
.. important::
Unless otherwise specified, the V2 data will take priority over V3 data for the same entires
.. important::
For the purposes of this guide, your prefix will be denoted as
[p]
You should swap whatever you made your prefix in for this.
All of the below are commands to be entered in discord where the bot can
see them.
The dataconverter cog is not loaded by default. To start, load it with
.. code-block:: none
[p]load dataconverter
Next, you'll need to give it the path where your V2 install is.
On linux and OSX, it may look something like:
.. code-block:: none
/home/username/Red-DiscordBot/
On Windows it will look something like:
.. code-block:: none
C:\Users\yourusername\Red-DiscordBot
Once you have that path, give it to the bot with the following command
(make sure to swap your own path in)
.. code-block:: none
[p]convertdata /home/username/Red-DiscordBot/
From here, if the path is correct, you will be prompted with an interactive menu asking you
what data you would like to import
You can select an entry by number, or quit with any of 'quit', 'exit', 'q', '-1', or 'cancel'

View File

@@ -55,7 +55,7 @@ master_doc = 'index'
# General information about the project. # General information about the project.
project = 'Red - Discord Bot' project = 'Red - Discord Bot'
copyright = '2017, Cog Creators' copyright = '2018, Cog Creators'
author = 'Cog Creators' author = 'Cog Creators'
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
@@ -63,9 +63,9 @@ author = 'Cog Creators'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '3.0.0a1' version = '3.0.0b11'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '3.0.0a1' release = '3.0.0b11'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

19
docs/framework_bot.rst Normal file
View File

@@ -0,0 +1,19 @@
.. bot module docs
===
Bot
===
.. automodule:: redbot.core.bot
RedBase
^^^^^^^
.. autoclass:: RedBase
:members:
Red
^^^
.. autoclass:: Red
:members:

8
docs/framework_rpc.rst Normal file
View File

@@ -0,0 +1,8 @@
.. rpc docs
===
RPC
===
.. automodule:: redbot.core.rpc
:members:

View File

@@ -10,8 +10,20 @@ Chat Formatting
.. automodule:: redbot.core.utils.chat_formatting .. automodule:: redbot.core.utils.chat_formatting
:members: :members:
Embed Helpers
=============
.. automodule:: redbot.core.utils.embed
:members:
Mod Helpers Mod Helpers
=========== ===========
.. automodule:: redbot.core.utils.mod .. automodule:: redbot.core.utils.mod
:members: :members:
V2 Data Conversion
==================
.. automodule:: redbot.core.utils.data_converter
:members: DataConverter

View File

@@ -0,0 +1,154 @@
.. Converting Data from a V2 cog
.. role:: python(code)
:language: python
============================
Importing Data From a V2 Cog
============================
This guide serves as a tutorial on using the DataConverter class
to import settings from a V2 cog.
------------------
Things you'll need
------------------
1. The path where each file holding related settings in v2 is
2. A conversion function to take the data and transform it to conform to Config
-----------------------
Getting your file paths
-----------------------
You should probably not try to find the files manually.
Asking the user for the base install path and using a relative path to where the
data should be, then testing that the file exists there is safer. This is especially
True if your cog has multiple settings files
Example
.. code-block:: python
from discord.ext import commands
from pathlib import Path
@commands.command(name="filefinder")
async def file_finding_command(self, ctx, filepath):
"""
this finds a file based on a user provided input and a known relative path
"""
base_path = Path(filepath)
fp = base_path / 'data' / 'mycog' / 'settings.json'
if not fp.is_file():
pass
# fail, prompting user
else:
pass
# do something with the file
---------------
Converting data
---------------
Once you've gotten your v2 settings file, you'll want to be able to import it
There are a couple options available depending on how you would like to convert
the data.
The first one takes a data path, and a conversion function and does the rest for you.
This is great for simple data that just needs to quickly be imported without much
modification.
Here's an example of that in use:
.. code-block:: python
from pathlib import Path
from discord.ext import commands
from redbot.core.utils.data_converter import DataConverter as dc
from redbot.core.config import Config
...
async def import_v2(self, file_path: Path):
"""
to be called from a command limited to owner
This should be a coroutine as the convert function will
need to be awaited
"""
# First we give the converter out cog's Config instance.
converter = dc(self.config)
# next we design a way to get all of the data into Config's internal
# format. This should be a generator, but you can also return a single
# list with identical results outside of memory usage
def conversion_spec(v2data):
for guild_id in v2.data.keys():
yield {(Config.GUILD, guild_id): {('blacklisted',): True}}
# This is yielding a dictionary that is designed for config's set_raw.
# The keys should be a tuple of Config scopes + the needed Identifiers. The
# values should be another dictionary whose keys are tuples representing
# config settings, the value should be the value to set for that.
# Then we pass the file and the conversion function
await converter.convert(file_path, conversion_spec)
# From here, our data should be imported
You can also choose to convert all of your data and pass it as a single dict
This can be useful if you want finer control over the dataconversion or want to
preserve any data from v3 that may share the same entry and set it aside to prompt
a user
.. code-block:: python
from pathlib import Path
from discord.ext import commands
from redbot.core.utils.data_converter import DataConverter as dc
from redbot.core.config import Config
...
await dc(config_instance).dict_import(some_processed_dict)
The format of the items of the dict is the same as in the above example
-----------------------------------
Config Scopes and their Identifiers
-----------------------------------
This section is provided as a quick reference for the identifiers for default
scopes available in Config. This does not cover usage of custom scopes, though the
data converter is compatible with those as well.
Global::
:code:`(Config.GLOBAL,)`
Guild::
:code:`(Config.GUILD, guild_id)`
Channel::
:code:`(Config.CHANNEL, channel_id)`
User::
:code:`(Config.USER, user_id)`
Member::
:code:`(Config.MEMBER, guild_id, user_id)`
Role::
:code:`(Config.ROLE, role_id)`
-----------------------------
More information and Examples
-----------------------------
For a more in depth look at how all of these commands function
You may want to take a look at how core data is being imported
:code:`redbot/cogs/dataconverter/core_specs.py`

View File

@@ -16,6 +16,7 @@ Welcome to Red - Discord Bot's documentation!
install_debian install_debian
install_centos install_centos
install_raspbian install_raspbian
cog_dataconverter
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
@@ -29,14 +30,18 @@ Welcome to Red - Discord Bot's documentation!
guide_migration guide_migration
guide_cog_creation guide_cog_creation
guide_data_conversion
framework_bank framework_bank
framework_bot
framework_cogmanager framework_cogmanager
framework_datamanager
framework_config framework_config
framework_context
framework_datamanager
framework_downloader framework_downloader
framework_events
framework_i18n framework_i18n
framework_modlog framework_modlog
framework_context framework_rpc
framework_utils framework_utils

View File

@@ -1,4 +1,4 @@
sphinx==1.6.3 sphinx==1.6.5
sphinxcontrib-asyncio sphinxcontrib-asyncio
sphinx_rtd_theme sphinx_rtd_theme
git+https://github.com/Rapptz/discord.py@rewrite#egg=discord.py[voice] git+https://github.com/Rapptz/discord.py@rewrite#egg=discord.py[voice]

View File

@@ -96,15 +96,18 @@ def list_instances():
def main(): def main():
description = "Red - Version {}".format(__version__)
cli_flags = parse_cli_flags(sys.argv[1:]) cli_flags = parse_cli_flags(sys.argv[1:])
if cli_flags.list_instances: if cli_flags.list_instances:
list_instances() list_instances()
elif cli_flags.version:
print(description)
sys.exit(0)
elif not cli_flags.instance_name: elif not cli_flags.instance_name:
print("Error: No instance name was provided!") print("Error: No instance name was provided!")
sys.exit(1) sys.exit(1)
load_basic_configuration(cli_flags.instance_name) load_basic_configuration(cli_flags.instance_name)
log, sentry_log = init_loggers(cli_flags) log, sentry_log = init_loggers(cli_flags)
description = "Red - Version {}".format(__version__)
red = Red(cli_flags, description=description, pm_help=None) red = Red(cli_flags, description=description, pm_help=None)
init_global_checks(red) init_global_checks(red)
init_events(red, cli_flags) init_events(red, cli_flags)

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -22,15 +22,15 @@ msgstr "Arrr, no prefix found capt'n!"
#: ../alias.py:198 #: ../alias.py:198
msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "Ye try and make a squeeky-clean alias with the name {} but 'she be taken by another order."
#: ../alias.py:205 #: ../alias.py:205
msgid "You attempted to create a new alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "Ye try and make a Squeeky-clean alias with the name {} but 'she already be on the island."
#: ../alias.py:212 #: ../alias.py:212
msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "Ye try and make a Squeeky-clean alias with the name {} but 'she walk the plank! Spaces in an alias must walk the plank."
#: ../alias.py:224 #: ../alias.py:224
msgid "A new alias with the trigger `{}` has been created." msgid "A new alias with the trigger `{}` has been created."
@@ -38,15 +38,15 @@ msgstr "Arrr! A new alias with thee trigger `{}` has been created."
#: ../alias.py:236 #: ../alias.py:236
msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "Ye try and make a squeeky-clean global alias with the name {} but 'she be taken by another order."
#: ../alias.py:243 #: ../alias.py:243
msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "Ye try and make a Squeeky-clean global alias with the name {} but 'she already be on the island."
#: ../alias.py:250 #: ../alias.py:250
msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "Ye try and make a Squeeky-clean global alias with the name {} but 'she walk the plank! Spaces in an alias must walk the plank."
#: ../alias.py:259 #: ../alias.py:259
msgid "A new global alias with the trigger `{}` has been created." msgid "A new global alias with the trigger `{}` has been created."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -22,15 +22,15 @@ msgstr "Awalan tidak ditemukan."
#: ../alias.py:198 #: ../alias.py:198
msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "Anda mencoba untuk membuat sebuah alias baru dengan nama {} tetapi nama itu sudah menjadi perintah pada bot ini."
#: ../alias.py:205 #: ../alias.py:205
msgid "You attempted to create a new alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "Anda mencoba untuk membuat sebuah alias baru dengan nama {} tetapi alias itu sudah ada pada server ini."
#: ../alias.py:212 #: ../alias.py:212
msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "Anda mencoba untuk membuat sebuah alias baru dengan nama {} tetapi nama itu adalah sebuah nama alias yang tidak berlaku. Nama alias tidak boleh berisi spasi."
#: ../alias.py:224 #: ../alias.py:224
msgid "A new alias with the trigger `{}` has been created." msgid "A new alias with the trigger `{}` has been created."
@@ -38,15 +38,15 @@ msgstr "Alias baru dengan pemicu '{}' telah dibuat."
#: ../alias.py:236 #: ../alias.py:236
msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "Anda mencoba untuk membuat sebuah alias global baru dengan nama {} tetapi nama itu sudah menjadi sebuah perintah pada bot ini."
#: ../alias.py:243 #: ../alias.py:243
msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "Anda mencoba untuk membuat sebuah alias global baru dengan nama {} tetapi alias itu sudah ada pada server ini."
#: ../alias.py:250 #: ../alias.py:250
msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "Anda mencoba untuk membuat sebuah alias global baru dengan nama {} tetapi nama itu adalah sebuah nama alias yang tidak berlaku. Nama alias tidak boleh berisi spasi."
#: ../alias.py:259 #: ../alias.py:259
msgid "A new global alias with the trigger `{}` has been created." msgid "A new global alias with the trigger `{}` has been created."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,73 +18,73 @@ msgstr ""
#: ../alias.py:129 #: ../alias.py:129
msgid "No prefix found." msgid "No prefix found."
msgstr "접두사가 발견되지 않았습니다." msgstr "프리픽스를 찾을 수 없어요."
#: ../alias.py:198 #: ../alias.py:198
msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "이름이 {} 인 바로가기를 만들려고 했지만, 이 봇의 커맨드와 중복돼요."
#: ../alias.py:205 #: ../alias.py:205
msgid "You attempted to create a new alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "이름이 {} 인 바로가기를 만들려고 했지만, 해당 바로가기가 이미 이 서버에 등록되어 있어요."
#: ../alias.py:212 #: ../alias.py:212
msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "이름이 {} 인 바로가기를 만들려고 했지만, 잘못된 바로가기 이름에요. 바로가기 이름에는 공백이 포함될 수 없어요."
#: ../alias.py:224 #: ../alias.py:224
msgid "A new alias with the trigger `{}` has been created." msgid "A new alias with the trigger `{}` has been created."
msgstr "`{}`로 발동되는 바로가기가 생성되었습니다." msgstr "트리거 `{}` 이(가) 포함된 별칭이 등록됐어요."
#: ../alias.py:236 #: ../alias.py:236
msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "이름이 {} 인 글로벌 별칭을 만들려고 했지만, 이 봇의 커맨드와 중복돼요."
#: ../alias.py:243 #: ../alias.py:243
msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "이름이 {} 인 글로벌 별칭을 만들려고 했지만, 해당 별칭이 이미 이 서버에 등록되어 있어요."
#: ../alias.py:250 #: ../alias.py:250
msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "이름이 {} 인 글로벌 별칭을 만들려고 했지만, 잘못된 별칭 이름에요. 별칭 이름에는 공백이 포함될 수 없어요."
#: ../alias.py:259 #: ../alias.py:259
msgid "A new global alias with the trigger `{}` has been created." msgid "A new global alias with the trigger `{}` has been created."
msgstr "`{}`로 발동되는 전역 바로가기가 생성 되었습니다." msgstr "트리거 `{}` 이(가) 포함된 글로벌 별칭이 등록됐어요."
#: ../alias.py:274 #: ../alias.py:274
msgid "No such alias exists." msgid "No such alias exists."
msgstr "해당 바로가기가 없습니다." msgstr "그런 별칭은 등록되어 있지 않아요."
#: ../alias.py:283 #: ../alias.py:283
msgid "The `{}` alias will execute the command `{}`" msgid "The `{}` alias will execute the command `{}`"
msgstr "바로가기 `{}`는 명령어 `{}` 를 실행 합니다." msgstr "`{}` 별칭이 `{}` 커맨드를 실행했어요."
#: ../alias.py:286 #: ../alias.py:286
msgid "There is no alias with the name `{}`" msgid "There is no alias with the name `{}`"
msgstr "`{}`로 지정된 바로가기가 없습니다." msgstr "`{}` 이란 이름으로 등록된 별칭이 없어요."
#: ../alias.py:298 #: ../alias.py:298
msgid "There are no aliases on this guild." msgid "There are no aliases on this guild."
msgstr "이 길드에는 바로가기가 없습니다." msgstr "이 길드에 등록된 별칭이 없어요."
#: ../alias.py:302 ../alias.py:320 #: ../alias.py:302 ../alias.py:320
msgid "Alias with the name `{}` was successfully deleted." msgid "Alias with the name `{}` was successfully deleted."
msgstr "바로가기 `{}` 성공적으로 삭제 되었습니다." msgstr "별칭 `{}` 이(가) 성공적으로 삭제됐어요."
#: ../alias.py:305 ../alias.py:323 #: ../alias.py:305 ../alias.py:323
msgid "Alias with name `{}` was not found." msgid "Alias with name `{}` was not found."
msgstr "바로가기 `{}` 가 발견되지 않았습니다." msgstr "`{}` 바로가기가 등록되어 있지 않아요."
#: ../alias.py:316 #: ../alias.py:316
msgid "There are no aliases on this bot." msgid "There are no aliases on this bot."
msgstr "이 봇에는 바로가기가 없습니다." msgstr "이 봇에 등록된 별칭이 없어요."
#: ../alias.py:331 ../alias.py:342 #: ../alias.py:331 ../alias.py:342
msgid "Aliases:" msgid "Aliases:"
msgstr "바로가기 리스트:" msgstr "등록된 별칭 리스트 :"
#: ../alias.py:333 ../alias.py:344 #: ../alias.py:333 ../alias.py:344
msgid "There are no aliases on this server." msgid "There are no aliases on this server."
msgstr "이 서버에 별칭이 없습니다." msgstr "이 서버에 등록된 별칭이 없어요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -22,15 +22,15 @@ msgstr "Префикс не найден."
#: ../alias.py:198 #: ../alias.py:198
msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "Вы пытались создать новый псевдоним с именем {}, но это имя используется как команда в этом боте."
#: ../alias.py:205 #: ../alias.py:205
msgid "You attempted to create a new alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "Вы пытались создать новый псевдоним с именем {}, но это имя используется как команда на этом сервере."
#: ../alias.py:212 #: ../alias.py:212
msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "Вы пытались создать новый псевдоним с именем {}, но это имя является недопустимым псевдонимом. Имена псевдонимов не могут содержать пробелы."
#: ../alias.py:224 #: ../alias.py:224
msgid "A new alias with the trigger `{}` has been created." msgid "A new alias with the trigger `{}` has been created."
@@ -38,15 +38,15 @@ msgstr "Был создан новый псевдоним с триггером
#: ../alias.py:236 #: ../alias.py:236
msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot." msgid "You attempted to create a new global alias with the name {} but that name is already a command on this bot."
msgstr "" msgstr "Вы пытались создать новый глобальный псевдоним с именем {}, но это имя уже используется как команда в этом боте."
#: ../alias.py:243 #: ../alias.py:243
msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server." msgid "You attempted to create a new global alias with the name {} but that alias already exists on this server."
msgstr "" msgstr "Вы пытались создать новый глобальный псевдоним с именем {}, но это имя уже существует на этом сервере."
#: ../alias.py:250 #: ../alias.py:250
msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces." msgid "You attempted to create a new global alias with the name {} but that name is an invalid alias name. Alias names may not contain spaces."
msgstr "" msgstr "Вы пытались создать новый псевдоним с именем {], но это имя явлется недопустимым именем для псевдонима. Псевдонимы не могут содержать пробелы."
#: ../alias.py:259 #: ../alias.py:259
msgid "A new global alias with the trigger `{}` has been created." msgid "A new global alias with the trigger `{}` has been created."
@@ -86,5 +86,5 @@ msgstr "Алиасы:"
#: ../alias.py:333 ../alias.py:344 #: ../alias.py:333 ../alias.py:344
msgid "There are no aliases on this server." msgid "There are no aliases on this server."
msgstr "На этом сервере еще нет алиасов." msgstr "На этом сервере нет псевдонимов."

View File

@@ -50,7 +50,6 @@ async def setup(bot: commands.Bot):
await start_lavalink_server(bot.loop) await start_lavalink_server(bot.loop)
async def _finish(): async def _finish():
await asyncio.sleep(10)
await cog.init_config() await cog.init_config()
bot.add_cog(cog) bot.add_cog(cog)

View File

@@ -5,11 +5,11 @@ import heapq
import lavalink import lavalink
import math import math
from discord.ext import commands from discord.ext import commands
from redbot.core import Config, checks from redbot.core import Config, checks, bank
from .manager import shutdown_lavalink_server from .manager import shutdown_lavalink_server
__version__ = "0.0.3a" __version__ = "0.0.4"
__author__ = ["aikaterna", "billy/bollo/ati"] __author__ = ["aikaterna", "billy/bollo/ati"]
@@ -28,14 +28,21 @@ class Audio:
} }
default_guild = { default_guild = {
"dj_enabled": False,
"dj_role": None,
"jukebox": False,
"jukebox_price": 0,
"notify": False, "notify": False,
"repeat": False, "repeat": False,
"shuffle": False, "shuffle": False,
"volume": 100 "volume": 100,
"vote_enabled": False,
"vote_percent": 0
} }
self.config.register_guild(**default_guild) self.config.register_guild(**default_guild)
self.config.register_global(**default_global) self.config.register_global(**default_global)
self.skip_votes = {}
async def init_config(self): async def init_config(self):
host = await self.config.host() host = await self.config.host()
@@ -44,7 +51,7 @@ class Audio:
ws_port = await self.config.ws_port() ws_port = await self.config.ws_port()
await lavalink.initialize( await lavalink.initialize(
bot=self.bot, host=host, password=password, rest_port=rest_port, ws_port=ws_port bot=self.bot, host=host, password=password, rest_port=rest_port, ws_port=ws_port, timeout=60
) )
lavalink.register_event_listener(self.event_handler) lavalink.register_event_listener(self.event_handler)
@@ -65,6 +72,7 @@ class Audio:
player.store('prev_requester', requester) player.store('prev_requester', requester)
player.store('playing_song', player.current.uri) player.store('playing_song', player.current.uri)
player.store('requester', player.current.requester) player.store('requester', player.current.requester)
self.skip_votes[player.channel.guild] = []
if event_type == lavalink.LavalinkEvents.TRACK_START and notify: if event_type == lavalink.LavalinkEvents.TRACK_START and notify:
notify_channel = player.fetch('channel') notify_channel = player.fetch('channel')
@@ -108,48 +116,126 @@ class Audio:
type=discord.ActivityType.playing)) type=discord.ActivityType.playing))
@commands.group() @commands.group()
@checks.is_owner() @commands.guild_only()
async def audioset(self, ctx): async def audioset(self, ctx):
"""Music configuration options.""" """Music configuration options."""
if ctx.invoked_subcommand is None: if ctx.invoked_subcommand is None:
await ctx.send_help() await ctx.send_help()
@audioset.command() @audioset.command()
@checks.admin_or_permissions(manage_roles=True)
async def dj(self, ctx):
"""Toggle DJ mode (users need a role to use audio commands)."""
dj_role_id = await self.config.guild(ctx.guild).dj_role()
if dj_role_id is None:
await self._embed_msg(ctx, 'Please set a role to use with DJ mode. Enter the role name now.')
def check(m):
return m.author == ctx.author
try:
dj_role = await ctx.bot.wait_for('message', timeout=15.0, check=check)
dj_role_obj = discord.utils.get(ctx.guild.roles, name=dj_role.content)
if dj_role_obj is None:
return await self._embed_msg(ctx, 'No role with that name.')
await ctx.invoke(self.role, dj_role_obj)
except asyncio.TimeoutError:
return await self._embed_msg(ctx, 'No role entered, try again later.')
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
await self.config.guild(ctx.guild).dj_enabled.set(not dj_enabled)
await self._embed_msg(ctx, 'DJ role enabled: {}.'.format(not dj_enabled))
@audioset.command()
@checks.admin_or_permissions(manage_roles=True)
async def role(self, ctx, role_name: discord.Role):
"""Sets the role to use for DJ mode."""
await self.config.guild(ctx.guild).dj_role.set(role_name.id)
dj_role_id = await self.config.guild(ctx.guild).dj_role()
dj_role_obj = discord.utils.get(ctx.guild.roles, id=dj_role_id)
await self._embed_msg(ctx, 'DJ role set to: {}.'.format(dj_role_obj.name))
@audioset.command()
@checks.mod_or_permissions(administrator=True)
async def jukebox(self, ctx, price: int):
"""Set a price for queueing songs for non-mods. 0 to disable."""
jukebox = await self.config.guild(ctx.guild).jukebox()
jukebox_price = await self.config.guild(ctx.guild).jukebox_price()
if price < 0:
return await self._embed_msg(ctx, 'Can\'t be less than zero.')
if price == 0:
jukebox = False
await self._embed_msg(ctx, 'Jukebox mode disabled.')
else:
jukebox = True
await self._embed_msg(ctx, 'Track queueing command price set to {} {}.'.format(
price, await bank.get_currency_name(ctx.guild)))
await self.config.guild(ctx.guild).jukebox_price.set(price)
await self.config.guild(ctx.guild).jukebox.set(jukebox)
@audioset.command()
@checks.mod_or_permissions(manage_messages=True)
async def notify(self, ctx): async def notify(self, ctx):
"""Toggle song announcement and other bot messages.""" """Toggle song announcement and other bot messages."""
notify = await self.config.guild(ctx.guild).notify() notify = await self.config.guild(ctx.guild).notify()
await self.config.guild(ctx.guild).notify.set(not notify) await self.config.guild(ctx.guild).notify.set(not notify)
get_notify = await self.config.guild(ctx.guild).notify() await self._embed_msg(ctx, 'Verbose mode on: {}.'.format(not notify))
await self._embed_msg(ctx, 'Verbose mode on: {}.'.format(get_notify))
@audioset.command() @audioset.command()
async def settings(self, ctx): async def settings(self, ctx):
"""Show the current settings.""" """Show the current settings."""
notify = await self.config.guild(ctx.guild).notify() data = await self.config.guild(ctx.guild).all()
dj_role_obj = discord.utils.get(ctx.guild.roles, id=data['dj_role'])
dj_enabled = data['dj_enabled']
jukebox = data['jukebox']
jukebox_price = data['jukebox_price']
status = await self.config.status() status = await self.config.status()
shuffle = await self.config.guild(ctx.guild).shuffle() vote_percent = data['vote_percent']
repeat = await self.config.guild(ctx.guild).repeat() msg = ('```ini\n'
'----Guild Settings----\n')
msg = '```ini\n' if dj_enabled:
msg += '----Guild Settings----\n' msg += 'DJ Role: [{}]\n'.format(dj_role_obj.name)
msg += 'audioset notify: [{}]\n'.format(notify) if jukebox:
msg += 'audioset status: [{}]\n'.format(status) msg += 'Jukebox: [{0}]\n'.format(jukebox)
msg += 'Repeat: [{}]\n'.format(repeat) msg += 'Command price: [{0}]\n'.format(jukebox_price)
msg += 'Shuffle: [{}]\n'.format(shuffle) msg += ('Repeat: [{repeat}]\n'
msg += '---Lavalink Settings---\n' 'Shuffle: [{shuffle}]\n'
msg += 'Cog version: {}\n```'.format(__version__) 'Song notify msgs: [{notify}]\n'
'Songs as status: [{0}]\n'.format(status, **data))
if vote_percent > 0:
msg += ('Vote skip: [{vote_enabled}]\n'
'Skip percentage: [{vote_percent}%]\n').format(**data)
msg += ('---Lavalink Settings---\n'
'Cog version: {}\n```'.format(__version__))
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, description=msg) embed = discord.Embed(colour=ctx.guild.me.top_role.colour, description=msg)
return await ctx.send(embed=embed) return await ctx.send(embed=embed)
@audioset.command() @audioset.command()
@checks.mod_or_permissions(administrator=True)
async def vote(self, ctx, percent: int):
"""Percentage needed for non-mods to skip songs. 0 to disable."""
if percent < 0:
return await self._embed_msg(ctx, 'Can\'t be less than zero.')
elif percent > 100:
percent = 100
if percent == 0:
enabled = False
await self._embed_msg(ctx, 'Voting disabled. All users can use queue management commands.')
else:
enabled = True
await self._embed_msg(ctx, 'Vote percentage set to {}%.'.format(percent))
await self.config.guild(ctx.guild).vote_percent.set(percent)
await self.config.guild(ctx.guild).vote_enabled.set(enabled)
@checks.is_owner() @checks.is_owner()
@audioset.command()
async def status(self, ctx): async def status(self, ctx):
"""Enables/disables songs' titles as status.""" """Enables/disables songs' titles as status."""
status = await self.config.status() status = await self.config.status()
await self.config.status.set(not status) await self.config.status.set(not status)
get_status = await self.config.status() await self._embed_msg(ctx, 'Song titles as status: {}.'.format(not status))
await self._embed_msg(ctx, 'Song titles as status: {}.'.format(get_status))
@commands.command() @commands.command()
async def audiostats(self, ctx): async def audiostats(self, ctx):
@@ -177,10 +263,16 @@ class Audio:
@commands.command() @commands.command()
async def bump(self, ctx, index: int): async def bump(self, ctx, index: int):
"""Bump a song number to the top of the queue.""" """Bump a song number to the top of the queue."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to bump a song.')
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to bump songs.')
if index > len(player.queue) or index < 1: if index > len(player.queue) or index < 1:
return await self._embed_msg(ctx, 'Song number must be greater than 1 and within the queue limit.') return await self._embed_msg(ctx, 'Song number must be greater than 1 and within the queue limit.')
@@ -193,16 +285,23 @@ class Audio:
@commands.command(aliases=['dc']) @commands.command(aliases=['dc'])
async def disconnect(self, ctx): async def disconnect(self, ctx):
"""Disconnect from the voice channel.""" """Disconnect from the voice channel."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if self._player_check(ctx): if self._player_check(ctx):
await lavalink.get_player(ctx.guild.id).stop() if dj_enabled:
await lavalink.get_player(ctx.guild.id).disconnect() if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to disconnect.')
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'There are other people listening to music.')
else:
await lavalink.get_player(ctx.guild.id).stop()
return await lavalink.get_player(ctx.guild.id).disconnect()
@commands.command(aliases=['np', 'n', 'song']) @commands.command(aliases=['np', 'n', 'song'])
async def now(self, ctx): async def now(self, ctx):
"""Now playing.""" """Now playing."""
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
expected = ['', '', '', ''] expected = ('', '', '', '')
emoji = { emoji = {
'prev': '', 'prev': '',
'stop': '', 'stop': '',
@@ -210,7 +309,6 @@ class Audio:
'next': '' 'next': ''
} }
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
song = 'Nothing'
if player.current: if player.current:
arrow = await self._draw_time(ctx) arrow = await self._draw_time(ctx)
pos = lavalink.utils.format_time(player.position) pos = lavalink.utils.format_time(player.position)
@@ -235,20 +333,24 @@ class Audio:
message = await ctx.send(embed=embed) message = await ctx.send(embed=embed)
player.store('np_message', message) player.store('np_message', message)
def check(r, u): dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
return r.message.id == message.id and u == ctx.message.author vote_enabled = await self.config.guild(ctx.guild).vote_enabled()
if dj_enabled or vote_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return
if player.current: if player.current:
for i in range(4): for i in range(4):
await message.add_reaction(expected[i]) await message.add_reaction(expected[i])
def check(r, u):
return r.message.id == message.id and u == ctx.message.author
try: try:
(r, u) = await self.bot.wait_for('reaction_add', check=check, timeout=10.0) (r, u) = await self.bot.wait_for('reaction_add', check=check, timeout=10.0)
except asyncio.TimeoutError: except asyncio.TimeoutError:
return await self._clear_react(message) return await self._clear_react(message)
reacts = {v: k for k, v in emoji.items()} reacts = {v: k for k, v in emoji.items()}
react = reacts[r.emoji] react = reacts[r.emoji]
if react == 'prev': if react == 'prev':
await self._clear_react(message) await self._clear_react(message)
await ctx.invoke(self.prev) await ctx.invoke(self.prev)
@@ -265,13 +367,19 @@ class Audio:
@commands.command(aliases=['resume']) @commands.command(aliases=['resume'])
async def pause(self, ctx): async def pause(self, ctx):
"""Pause and resume.""" """Pause and resume."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
if not ctx.author.voice or ctx.author.voice.channel != player.channel: if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to pause the music.') return await self._embed_msg(ctx, 'You must be in the voice channel to pause the music.')
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to pause songs.')
if player.current and not player.paused: command = ctx.invoked_with
if player.current and not player.paused and command == 'pause':
await player.pause() await player.pause()
embed = discord.Embed( embed = discord.Embed(
colour=ctx.guild.me.top_role.colour, title='Track Paused', colour=ctx.guild.me.top_role.colour, title='Track Paused',
@@ -282,7 +390,7 @@ class Audio:
) )
return await ctx.send(embed=embed) return await ctx.send(embed=embed)
if player.paused: if player.paused and command == 'resume':
await player.pause(False) await player.pause(False)
embed = discord.Embed( embed = discord.Embed(
colour=ctx.guild.me.top_role.colour, colour=ctx.guild.me.top_role.colour,
@@ -294,6 +402,10 @@ class Audio:
) )
return await ctx.send(embed=embed) return await ctx.send(embed=embed)
if player.paused and command == 'pause':
return await self._embed_msg(ctx, 'Track is paused.')
if player.current and command == 'resume':
return await self._embed_msg(ctx, 'Track is playing.')
await self._embed_msg(ctx, 'Nothing playing.') await self._embed_msg(ctx, 'Nothing playing.')
@commands.command() @commands.command()
@@ -303,7 +415,6 @@ class Audio:
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
queue_tracks = player.queue queue_tracks = player.queue
queue_len = len(queue_tracks)
requesters = {'total': 0, 'users': {}} requesters = {'total': 0, 'users': {}}
async def _usercount(req_username): async def _usercount(req_username):
@@ -340,17 +451,28 @@ class Audio:
@commands.command(aliases=['p']) @commands.command(aliases=['p'])
async def play(self, ctx, *, query): async def play(self, ctx, *, query):
"""Play a URL or search for a song.""" """Play a URL or search for a song."""
if not ctx.author.voice: dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
return await self._embed_msg(ctx, 'You must be in the voice channel to use the play command.') jukebox_price = await self.config.guild(ctx.guild).jukebox_price()
if not self._player_check(ctx):
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store('connect', datetime.datetime.utcnow())
player = lavalink.get_player(ctx.guild.id)
shuffle = await self.config.guild(ctx.guild).shuffle() shuffle = await self.config.guild(ctx.guild).shuffle()
if not self._player_check(ctx):
try:
await lavalink.connect(ctx.author.voice.channel)
player = lavalink.get_player(ctx.guild.id)
player.store('connect', datetime.datetime.utcnow())
except AttributeError:
return await self._embed_msg(ctx, 'Connect to a voice channel first.')
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to queue songs.')
if not await self._currency_check(ctx, jukebox_price):
return
player = lavalink.get_player(ctx.guild.id)
player.store('channel', ctx.channel.id) player.store('channel', ctx.channel.id)
player.store('guild', ctx.guild.id) player.store('guild', ctx.guild.id)
await self._data_check(ctx) await self._data_check(ctx)
if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to use the play command.')
query = query.strip('<>') query = query.strip('<>')
if not query.startswith('http'): if not query.startswith('http'):
@@ -388,9 +510,14 @@ class Audio:
"""Skips to the start of the previously played track.""" """Skips to the start of the previously played track."""
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
shuffle = await self.config.guild(ctx.guild).shuffle() shuffle = await self.config.guild(ctx.guild).shuffle()
if not ctx.author.voice or ctx.author.voice.channel != player.channel: if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to skip songs.')
if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to skip the music.') return await self._embed_msg(ctx, 'You must be in the voice channel to skip the music.')
if shuffle: if shuffle:
return await self._embed_msg(ctx, 'Turn shuffle off to use this command.') return await self._embed_msg(ctx, 'Turn shuffle off to use this command.')
@@ -459,7 +586,6 @@ class Audio:
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Queue for ' + ctx.guild.name, embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Queue for ' + ctx.guild.name,
description=queue_list) description=queue_list)
queue_duration = await self._queue_duration(ctx) queue_duration = await self._queue_duration(ctx)
queue_total_duration = lavalink.utils.format_time(queue_duration) queue_total_duration = lavalink.utils.format_time(queue_duration)
text = 'Page {}/{} | {} tracks, {} remaining'.format(page, pages, len(player.queue) + 1, queue_total_duration) text = 'Page {}/{} | {} tracks, {} remaining'.format(page, pages, len(player.queue) + 1, queue_total_duration)
@@ -473,29 +599,36 @@ class Audio:
@commands.command() @commands.command()
async def repeat(self, ctx): async def repeat(self, ctx):
"""Toggles repeat.""" """Toggles repeat."""
repeat_msg = 'You must be in the voice channel to toggle repeat.' dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not ctx.author.voice: if dj_enabled:
return await self._embed_msg(ctx, repeat_msg) if not await self._can_instaskip(ctx, ctx.author) and not await self._has_dj_role(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to toggle repeat.')
repeat = await self.config.guild(ctx.guild).repeat() repeat = await self.config.guild(ctx.guild).repeat()
await self.config.guild(ctx.guild).repeat.set(not repeat) await self.config.guild(ctx.guild).repeat.set(not repeat)
repeat = await self.config.guild(ctx.guild).repeat() repeat = await self.config.guild(ctx.guild).repeat()
await self._embed_msg(ctx, 'Repeat songs: {}.'.format(repeat))
if self._player_check(ctx): if self._player_check(ctx):
await self._data_check(ctx) await self._data_check(ctx)
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
if ctx.author.voice.channel != player.channel: if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
return await self._embed_msg(ctx, repeat_msg) await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to toggle repeat.')
await self._embed_msg(ctx, 'Repeat songs: {}.'.format(repeat))
@commands.command() @commands.command()
async def remove(self, ctx, index: int): async def remove(self, ctx, index: int):
"""Remove a specific song number from the queue.""" """Remove a specific song number from the queue."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
if not player.queue: if not player.queue:
return await self._embed_msg(ctx, 'Nothing queued.') return await self._embed_msg(ctx, 'Nothing queued.')
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to remove songs.')
if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to manage the queue.')
if index > len(player.queue) or index < 1: if index > len(player.queue) or index < 1:
return await self._embed_msg(ctx, 'Song number must be greater than 1 and within the queue limit.') return await self._embed_msg(ctx, 'Song number must be greater than 1 and within the queue limit.')
index -= 1 index -= 1
@@ -507,7 +640,7 @@ class Audio:
"""Pick a song with a search. """Pick a song with a search.
Use [p]search list <search term> to queue all songs. Use [p]search list <search term> to queue all songs.
""" """
expected = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣"] expected = ("1⃣", "2⃣", "3⃣", "4⃣", "5⃣")
emoji = { emoji = {
"one": "1⃣", "one": "1⃣",
"two": "2⃣", "two": "2⃣",
@@ -515,17 +648,19 @@ class Audio:
"four": "4⃣", "four": "4⃣",
"five": "5⃣" "five": "5⃣"
} }
if not ctx.author.voice:
return await self._embed_msg(ctx, 'You must be in the voice channel to enqueue songs.')
if not self._player_check(ctx): if not self._player_check(ctx):
await lavalink.connect(ctx.author.voice.channel) try:
player = lavalink.get_player(ctx.guild.id) await lavalink.connect(ctx.author.voice.channel)
player.store('connect', datetime.datetime.utcnow()) player = lavalink.get_player(ctx.guild.id)
player.store('connect', datetime.datetime.utcnow())
except AttributeError:
return await self._embed_msg(ctx, 'Connect to a voice channel first.')
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
shuffle = await self.config.guild(ctx.guild).shuffle() shuffle = await self.config.guild(ctx.guild).shuffle()
player.store('channel', ctx.channel.id) player.store('channel', ctx.channel.id)
player.store('guild', ctx.guild.id) player.store('guild', ctx.guild.id)
if ctx.author.voice.channel != player.channel: if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to enqueue songs.') return await self._embed_msg(ctx, 'You must be in the voice channel to enqueue songs.')
query = query.strip('<>') query = query.strip('<>')
@@ -552,6 +687,10 @@ class Audio:
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Tracks Found:', description=search_list) embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Tracks Found:', description=search_list)
embed.set_footer(text='Page {}/{} | {} search results'.format(page, pages, len(tracks))) embed.set_footer(text='Page {}/{} | {} search results'.format(page, pages, len(tracks)))
message = await ctx.send(embed=embed) message = await ctx.send(embed=embed)
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return
def check(r, u): def check(r, u):
return r.message.id == message.id and u == ctx.message.author return r.message.id == message.id and u == ctx.message.author
@@ -584,8 +723,11 @@ class Audio:
async def _search_button(self, ctx, message, tracks, entry: int): async def _search_button(self, ctx, message, tracks, entry: int):
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
jukebox_price = await self.config.guild(ctx.guild).jukebox_price()
shuffle = await self.config.guild(ctx.guild).shuffle() shuffle = await self.config.guild(ctx.guild).shuffle()
await self._clear_react(message) await self._clear_react(message)
if not await self._currency_check(ctx, jukebox_price):
return
search_choice = tracks[entry] search_choice = tracks[entry]
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Track Enqueued', embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Track Enqueued',
description='**[{}]({})**'.format(search_choice.title, search_choice.uri)) description='**[{}]({})**'.format(search_choice.title, search_choice.uri))
@@ -601,11 +743,16 @@ class Audio:
@commands.command() @commands.command()
async def seek(self, ctx, seconds: int=30): async def seek(self, ctx, seconds: int=30):
"""Seeks ahead or behind on a track by seconds.""" """Seeks ahead or behind on a track by seconds."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
if not ctx.author.voice or ctx.author.voice.channel != player.channel: if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to use seek.') return await self._embed_msg(ctx, 'You must be in the voice channel to use seek.')
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to use seek.')
if player.current: if player.current:
if player.current.is_stream: if player.current.is_stream:
return await self._embed_msg(ctx, 'Can\'t seek on a stream.') return await self._embed_msg(ctx, 'Can\'t seek on a stream.')
@@ -618,37 +765,110 @@ class Audio:
await self._embed_msg(ctx, 'Moved {}s to {}'.format(seconds, lavalink.utils.format_time(seek))) await self._embed_msg(ctx, 'Moved {}s to {}'.format(seconds, lavalink.utils.format_time(seek)))
return await player.seek(seek) return await player.seek(seek)
else: else:
await self._embed_msg(ctx, 'Nothing playing.') await self._embed_msg(ctx, 'Nothing playing.')
@commands.command() @commands.command()
async def shuffle(self, ctx): async def shuffle(self, ctx):
"""Toggles shuffle.""" """Toggles shuffle."""
shuffle_msg = 'You must be in the voice channel to toggle shuffle.' dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not ctx.author.voice: if dj_enabled:
return await self._embed_msg(ctx, shuffle_msg) if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to toggle shuffle.')
shuffle = await self.config.guild(ctx.guild).shuffle() shuffle = await self.config.guild(ctx.guild).shuffle()
await self.config.guild(ctx.guild).shuffle.set(not shuffle) await self.config.guild(ctx.guild).shuffle.set(not shuffle)
shuffle = await self.config.guild(ctx.guild).shuffle() shuffle = await self.config.guild(ctx.guild).shuffle()
await self._embed_msg(ctx, 'Shuffle songs: {}.'.format(shuffle))
if self._player_check(ctx): if self._player_check(ctx):
await self._data_check(ctx) await self._data_check(ctx)
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
if ctx.author.voice.channel != player.channel: if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
return await self._embed_msg(ctx, shuffle_msg) await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to toggle shuffle.')
await self._embed_msg(ctx, 'Shuffle songs: {}.'.format(shuffle))
@commands.command(aliases=['forceskip', 'fs']) @commands.command(aliases=['forceskip', 'fs'])
async def skip(self, ctx): async def skip(self, ctx):
"""Skips to the next track.""" """Skips to the next track."""
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
player = lavalink.get_player(ctx.guild.id)
if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to skip the music.')
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
vote_enabled = await self.config.guild(ctx.guild).vote_enabled()
if dj_enabled and not vote_enabled and not await self._can_instaskip(ctx, ctx.author):
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to skip songs.')
if vote_enabled:
if not await self._can_instaskip(ctx, ctx.author):
if ctx.author.id in self.skip_votes[ctx.message.guild]:
self.skip_votes[ctx.message.guild].remove(ctx.author.id)
reply = "I removed your vote to skip."
else:
self.skip_votes[ctx.message.guild].append(ctx.author.id)
reply = "You voted to skip."
num_votes = len(self.skip_votes[ctx.message.guild])
vote_mods = []
for member in player.channel.members:
can_skip = await self._can_instaskip(ctx, member)
if can_skip:
vote_mods.append(member)
num_members = len(player.channel.members) - len(vote_mods)
vote = int(100 * num_votes / num_members)
percent = await self.config.guild(ctx.guild).vote_percent()
if vote >= percent:
self.skip_votes[ctx.message.guild] = []
await self._embed_msg(ctx, "Vote threshold met.")
return await self._skip_action(ctx)
else:
reply += " Votes: %d/%d" % (num_votes, num_members)
reply += " (%d%% out of %d%% needed)" % (vote, percent)
return await self._embed_msg(ctx, reply)
else:
return await self._skip_action(ctx)
else: else:
player = lavalink.get_player(ctx.guild.id) return await self._skip_action(ctx)
if not player.current: async def _can_instaskip(self, ctx, member):
return await self._embed_msg(ctx, 'There\'s nothing in the queue.') mod_role = await ctx.bot.db.guild(ctx.guild).mod_role()
admin_role = await ctx.bot.db.guild(ctx.guild).admin_role()
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if dj_enabled:
is_active_dj = await self._has_dj_role(ctx, member)
else:
is_active_dj = False
is_owner = member.id == self.bot.owner_id
is_server_owner = member.id == ctx.guild.owner_id
is_coowner = any(x == member.id for x in self.bot._co_owners)
is_admin = discord.utils.get(ctx.guild.get_member(member.id).roles, id=admin_role) is not None
is_mod = discord.utils.get(ctx.guild.get_member(member.id).roles, id=mod_role) is not None
is_bot = member.bot is True
try:
nonbots = sum(not m.bot for m in ctx.guild.get_member(member.id).voice.channel.members)
except AttributeError:
if ctx.guild.get_member(self.bot.user.id).voice is not None:
nonbots = sum(not m.bot for m in ctx.guild.get_member(self.bot.user.id).voice.channel.members)
if nonbots == 1:
nonbots = 2
else:
nonbots = 2
alone = nonbots <= 1
return is_active_dj or is_owner or is_server_owner or is_coowner or is_admin or is_mod or is_bot or alone
async def _has_dj_role(self, ctx, member):
dj_role_id = await self.config.guild(ctx.guild).dj_role()
dj_role_obj = discord.utils.get(ctx.guild.roles, id=dj_role_id)
if dj_role_obj in ctx.guild.get_member(member.id).roles:
return True
else:
return False
@staticmethod
async def _skip_action(ctx):
player = lavalink.get_player(ctx.guild.id)
if not player.queue: if not player.queue:
pos, dur = player.position, player.current.length pos, dur = player.position, player.current.length
time_remain = lavalink.utils.format_time(dur - pos) time_remain = lavalink.utils.format_time(dur - pos)
@@ -660,9 +880,6 @@ class Audio:
embed.set_footer(text='{} left on {}'.format(time_remain, player.current.title)) embed.set_footer(text='{} left on {}'.format(time_remain, player.current.title))
return await ctx.send(embed=embed) return await ctx.send(embed=embed)
if not ctx.author.voice or ctx.author.voice.channel != player.channel:
return await self._embed_msg(ctx, 'You must be in the voice channel to skip the music.')
embed = discord.Embed( embed = discord.Embed(
colour=ctx.guild.me.top_role.colour, title='Track Skipped', colour=ctx.guild.me.top_role.colour, title='Track Skipped',
description='**[{}]({})**'.format( description='**[{}]({})**'.format(
@@ -670,17 +887,25 @@ class Audio:
) )
) )
await ctx.send(embed=embed) await ctx.send(embed=embed)
await player.skip() await player.skip()
@commands.command(aliases=['s']) @commands.command(aliases=['s'])
async def stop(self, ctx): async def stop(self, ctx):
"""Stops playback and clears the queue.""" """Stops playback and clears the queue."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
vote_enabled = await self.config.guild(ctx.guild).vote_enabled()
if not self._player_check(ctx): if not self._player_check(ctx):
return await self._embed_msg(ctx, 'Nothing playing.') return await self._embed_msg(ctx, 'Nothing playing.')
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
if not ctx.author.voice or ctx.author.voice.channel != player.channel: if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to stop the music.') return await self._embed_msg(ctx, 'You must be in the voice channel to stop the music.')
if vote_enabled or vote_enabled and dj_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'There are other people listening - vote to skip instead.')
if dj_enabled and not vote_enabled:
if not await self._can_instaskip(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to stop the music.')
if player.is_playing: if player.is_playing:
await self._embed_msg(ctx, 'Stopping...') await self._embed_msg(ctx, 'Stopping...')
await player.stop() await player.stop()
@@ -692,6 +917,7 @@ class Audio:
@commands.command() @commands.command()
async def volume(self, ctx, vol: int=None): async def volume(self, ctx, vol: int=None):
"""Sets the volume, 1% - 150%.""" """Sets the volume, 1% - 150%."""
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
if not vol: if not vol:
vol = await self.config.guild(ctx.guild).volume() vol = await self.config.guild(ctx.guild).volume()
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Current Volume:', embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Current Volume:',
@@ -699,14 +925,22 @@ class Audio:
if not self._player_check(ctx): if not self._player_check(ctx):
embed.set_footer(text='Nothing playing.') embed.set_footer(text='Nothing playing.')
return await ctx.send(embed=embed) return await ctx.send(embed=embed)
if self._player_check(ctx):
player = lavalink.get_player(ctx.guild.id)
if ((not ctx.author.voice or ctx.author.voice.channel != player.channel) and not
await self._can_instaskip(ctx, ctx.author)):
return await self._embed_msg(ctx, 'You must be in the voice channel to change the volume.')
if dj_enabled:
if not await self._can_instaskip(ctx, ctx.author) and not await self._has_dj_role(ctx, ctx.author):
return await self._embed_msg(ctx, 'You need the DJ role to change the volume.')
if vol > 150: if vol > 150:
vol = 150 vol = 150
await self.config.guild(ctx.guild).volume.set(vol) await self.config.guild(ctx.guild).volume.set(vol)
if self._player_check: if self._player_check(ctx):
await lavalink.get_player(ctx.guild.id).set_volume(vol) await lavalink.get_player(ctx.guild.id).set_volume(vol)
else: else:
await self.config.guild(ctx.guild).volume.set(vol) await self.config.guild(ctx.guild).volume.set(vol)
if self._player_check: if self._player_check(ctx):
await lavalink.get_player(ctx.guild.id).set_volume(vol) await lavalink.get_player(ctx.guild.id).set_volume(vol)
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Volume:', embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Volume:',
description=str(vol) + '%') description=str(vol) + '%')
@@ -725,36 +959,46 @@ class Audio:
async def host(self, ctx, host): async def host(self, ctx, host):
"""Set the lavalink server host.""" """Set the lavalink server host."""
await self.config.host.set(host) await self.config.host.set(host)
get_host = await self.config.host() await self._embed_msg(ctx, 'Host set to {}.'.format(host))
await self._embed_msg(ctx, 'Host set to {}.'.format(get_host))
@llsetup.command() @llsetup.command()
async def password(self, ctx, passw): async def password(self, ctx, passw):
"""Set the lavalink server password.""" """Set the lavalink server password."""
await self.config.passw.set(str(passw)) await self.config.passw.set(str(passw))
get_passw = await self.config.passw() await self._embed_msg(ctx, 'Server password set to {}.'.format(passw))
await self._embed_msg(ctx, 'Server password set to {}.'.format(get_passw))
@llsetup.command() @llsetup.command()
async def restport(self, ctx, rest_port): async def restport(self, ctx, rest_port):
"""Set the lavalink REST server port.""" """Set the lavalink REST server port."""
await self.config.rest_port.set(str(rest_port)) await self.config.rest_port.set(str(rest_port))
get_rest_port = await self.config.rest_port() await self._embed_msg(ctx, 'REST port set to {}.'.format(rest_port))
await self._embed_msg(ctx, 'REST port set to {}.'.format(get_rest_port))
@llsetup.command() @llsetup.command()
async def wsport(self, ctx, rest_port): async def wsport(self, ctx, rest_port):
"""Set the lavalink websocket server port.""" """Set the lavalink websocket server port."""
await self.config.ws_port.set(str(ws_port)) await self.config.ws_port.set(str(ws_port))
get_rest_port = await self.config.ws_port() await self._embed_msg(ctx, 'Websocket port set to {}.'.format(ws_port))
await self._embed_msg(ctx, 'Websocket port set to {}.'.format(get_ws_port))
async def _clear_react(self, message): @staticmethod
async def _clear_react(message):
try: try:
await message.clear_reactions() await message.clear_reactions()
except: except (discord.Forbidden, discord.HTTPException):
return return
async def _currency_check(self, ctx, jukebox_price: int):
jukebox = await self.config.guild(ctx.guild).jukebox()
if jukebox and not await self._can_instaskip(ctx, ctx.author):
try:
await bank.withdraw_credits(ctx.author, jukebox_price)
return True
except ValueError:
credits_name = await bank.get_currency_name(ctx.guild)
await self._embed_msg(ctx, 'Not enough {} ({} required).'.format(credits_name, jukebox_price))
return False
else:
return True
async def _data_check(self, ctx): async def _data_check(self, ctx):
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
shuffle = await self.config.guild(ctx.guild).shuffle() shuffle = await self.config.guild(ctx.guild).shuffle()
@@ -787,7 +1031,8 @@ class Audio:
msg += bar msg += bar
return msg return msg
def _dynamic_time(self, time): @staticmethod
def _dynamic_time(time):
m, s = divmod(time, 60) m, s = divmod(time, 60)
h, m = divmod(m, 60) h, m = divmod(m, 60)
d, h = divmod(h, 24) d, h = divmod(h, 24)
@@ -800,9 +1045,12 @@ class Audio:
msg = "{2}m {3}s" msg = "{2}m {3}s"
elif d == 0 and h == 0 and m == 0 and s > 0: elif d == 0 and h == 0 and m == 0 and s > 0:
msg = "{3}s" msg = "{3}s"
else:
msg = ""
return msg.format(d, h, m, s) return msg.format(d, h, m, s)
async def _embed_msg(self, ctx, title): @staticmethod
async def _embed_msg(ctx, title):
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title=title) embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title=title)
await ctx.send(embed=embed) await ctx.send(embed=embed)
@@ -813,14 +1061,15 @@ class Audio:
else: else:
return 0 return 0
async def _queue_duration(self, ctx): @staticmethod
async def _queue_duration(ctx):
player = lavalink.get_player(ctx.guild.id) player = lavalink.get_player(ctx.guild.id)
duration = [] duration = []
for i in range(len(player.queue)): for i in range(len(player.queue)):
if not player.queue[i].is_stream: if not player.queue[i].is_stream:
duration.append(player.queue[i].length) duration.append(player.queue[i].length)
queue_duration = sum(duration) queue_duration = sum(duration)
if player.queue == []: if not player.queue:
queue_duration = 0 queue_duration = 0
try: try:
if not player.current.is_stream: if not player.current.is_stream:
@@ -832,13 +1081,21 @@ class Audio:
queue_total_duration = remain + queue_duration queue_total_duration = remain + queue_duration
return queue_total_duration return queue_total_duration
def _player_check(self, ctx): @staticmethod
def _player_check(ctx):
try: try:
lavalink.get_player(ctx.guild.id) lavalink.get_player(ctx.guild.id)
return True return True
except KeyError: except KeyError:
return False return False
async def on_voice_state_update(self, member, before, after):
if after.channel != before.channel:
try:
self.skip_votes[before.channel.guild].remove(member.id)
except (ValueError, KeyError, AttributeError):
pass
def __unload(self): def __unload(self):
lavalink.unregister_event_listener(self.event_handler) lavalink.unregister_event_listener(self.event_handler)
self.bot.loop.create_task(lavalink.close()) self.bot.loop.create_task(lavalink.close())

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,11 +18,11 @@ msgstr ""
#: ../audio.py:25 ../audio.py:45 #: ../audio.py:25 ../audio.py:45
msgid "Join a voice channel first!" msgid "Join a voice channel first!"
msgstr "Du musst zuerst einem Sprach Kanal beitreten!" msgstr "Tritt zuerst einem Sprachkanal bei!"
#: ../audio.py:33 #: ../audio.py:33
msgid "Let's play a file that exists pls" msgid "Let's play a file that exists pls"
msgstr "Lassen Sie uns eine Datei spielen, die es gibt" msgstr "Lass uns eine Datei abspielen, die vorhanden ist"
#: ../audio.py:38 ../audio.py:58 #: ../audio.py:38 ../audio.py:58
msgid "{} is playing a song..." msgid "{} is playing a song..."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
#: ../audio.py:25 ../audio.py:45 #: ../audio.py:25 ../audio.py:45
msgid "Join a voice channel first!" msgid "Join a voice channel first!"
msgstr "" msgstr "Aye! Ye need to sail y'ur ship first!"
#: ../audio.py:33 #: ../audio.py:33
msgid "Let's play a file that exists pls" msgid "Let's play a file that exists pls"
@@ -26,17 +26,17 @@ msgstr ""
#: ../audio.py:38 ../audio.py:58 #: ../audio.py:38 ../audio.py:58
msgid "{} is playing a song..." msgid "{} is playing a song..."
msgstr "" msgstr "{} be dancing to Shanty..."
#: ../audio.py:48 #: ../audio.py:48
msgid "Youtube links pls" msgid "Youtube links pls"
msgstr "" msgstr "Aye! A rope to youtube is required!"
#: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97 #: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97
msgid "I'm not even connected to a voice channel!" msgid "I'm not even connected to a voice channel!"
msgstr "" msgstr "Aye! I never boarded ye ship!"
#: ../audio.py:95 #: ../audio.py:95
msgid "Volume set." msgid "Volume set."
msgstr "" msgstr "Aye, shouting voice changed."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,25 +18,25 @@ msgstr ""
#: ../audio.py:25 ../audio.py:45 #: ../audio.py:25 ../audio.py:45
msgid "Join a voice channel first!" msgid "Join a voice channel first!"
msgstr "" msgstr "Bergabung dengan channel suara dulu!"
#: ../audio.py:33 #: ../audio.py:33
msgid "Let's play a file that exists pls" msgid "Let's play a file that exists pls"
msgstr "" msgstr "Tolong memutar file yang ada"
#: ../audio.py:38 ../audio.py:58 #: ../audio.py:38 ../audio.py:58
msgid "{} is playing a song..." msgid "{} is playing a song..."
msgstr "" msgstr "{} sedang memainkan sebuah lagu..."
#: ../audio.py:48 #: ../audio.py:48
msgid "Youtube links pls" msgid "Youtube links pls"
msgstr "" msgstr "Link YouTube"
#: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97 #: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97
msgid "I'm not even connected to a voice channel!" msgid "I'm not even connected to a voice channel!"
msgstr "" msgstr "Saya belum memasuki channel suara!"
#: ../audio.py:95 #: ../audio.py:95
msgid "Volume set." msgid "Volume set."
msgstr "" msgstr "Suara telah di atur."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,25 +18,25 @@ msgstr ""
#: ../audio.py:25 ../audio.py:45 #: ../audio.py:25 ../audio.py:45
msgid "Join a voice channel first!" msgid "Join a voice channel first!"
msgstr "" msgstr "커맨드를 사용하기 전에 음성 채널에 접속해야 해요!"
#: ../audio.py:33 #: ../audio.py:33
msgid "Let's play a file that exists pls" msgid "Let's play a file that exists pls"
msgstr "" msgstr "파일을 재생해볼게요!"
#: ../audio.py:38 ../audio.py:58 #: ../audio.py:38 ../audio.py:58
msgid "{} is playing a song..." msgid "{} is playing a song..."
msgstr "" msgstr "{}이(가) 음악을 재생하는 중..."
#: ../audio.py:48 #: ../audio.py:48
msgid "Youtube links pls" msgid "Youtube links pls"
msgstr "" msgstr "유튜브 링크를 부탁해요!"
#: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97 #: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97
msgid "I'm not even connected to a voice channel!" msgid "I'm not even connected to a voice channel!"
msgstr "" msgstr "제가 음성 채널에 접속할 수 없어요!"
#: ../audio.py:95 #: ../audio.py:95
msgid "Volume set." msgid "Volume set."
msgstr "" msgstr "음량이 변경됐어요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -1,4 +1,5 @@
import discord import discord
from redbot.core.utils.chat_formatting import box
from redbot.core import checks, bank from redbot.core import checks, bank
from redbot.core.i18n import CogI18n from redbot.core.i18n import CogI18n
@@ -60,6 +61,26 @@ class Bank:
async def bankset(self, ctx: commands.Context): async def bankset(self, ctx: commands.Context):
"""Base command for bank settings""" """Base command for bank settings"""
if ctx.invoked_subcommand is None: if ctx.invoked_subcommand is None:
if await bank.is_global():
bank_name = await bank._conf.bank_name()
currency_name = await bank._conf.currency()
default_balance = await bank._conf.default_balance()
else:
if not ctx.guild:
await ctx.send_help()
return
bank_name = await bank._conf.guild(ctx.guild).bank_name()
currency_name = await bank._conf.guild(ctx.guild).currency()
default_balance = await bank._conf.guild(ctx.guild).default_balance()
settings = (_(
"Bank settings:\n\n"
"Bank name: {}\n"
"Currency: {}\n"
"Default balance: {}"
"").format(bank_name, currency_name, default_balance)
)
await ctx.send(box(settings))
await ctx.send_help() await ctx.send_help()
@bankset.command(name="toggleglobal") @bankset.command(name="toggleglobal")

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -22,17 +22,17 @@ msgstr "글로벌"
#: ../bank.py:68 #: ../bank.py:68
msgid "per-guild" msgid "per-guild"
msgstr "길드마다" msgstr "길드마다"
#: ../bank.py:70 #: ../bank.py:70
msgid "The bank is now {}." msgid "The bank is now {}."
msgstr "은행 잔고는 `{}`입니다." msgstr "은행은 이제 {} 이에요."
#: ../bank.py:77 #: ../bank.py:77
msgid "Bank's name has been set to {}" msgid "Bank's name has been set to {}"
msgstr "계좌 이름이 {} 로 설정 되었습니다." msgstr "은행 이름이 {} 로 설정됐어요."
#: ../bank.py:84 #: ../bank.py:84
msgid "Currency name has been set to {}" msgid "Currency name has been set to {}"
msgstr "화 이름이 {} 로 설정 되었습니다." msgstr "화 이름이 {} 로 설정됐어요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,9 +18,9 @@ msgstr ""
#: ../cleanup.py:176 #: ../cleanup.py:176
msgid "This command can only be used on bots with bot accounts." msgid "This command can only be used on bots with bot accounts."
msgstr "" msgstr "Perintah ini hanya bisa di gunakan kepada bot dengan akun bot."
#: ../cleanup.py:183 #: ../cleanup.py:183
msgid "Message not found." msgid "Message not found."
msgstr "" msgstr "Pesan tidak ditemukan."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,9 +18,9 @@ msgstr ""
#: ../cleanup.py:176 #: ../cleanup.py:176
msgid "This command can only be used on bots with bot accounts." msgid "This command can only be used on bots with bot accounts."
msgstr "" msgstr "이 커맨드는 봇 계정이 있는 봇만 사용할 수 있어요."
#: ../cleanup.py:183 #: ../cleanup.py:183
msgid "Message not found." msgid "Message not found."
msgstr "" msgstr "메세지를 찾을 수 없어요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -22,5 +22,5 @@ msgstr ""
#: ../cleanup.py:183 #: ../cleanup.py:183
msgid "Message not found." msgid "Message not found."
msgstr "" msgstr "Bericht niet gevonden."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -19,49 +19,50 @@ msgstr ""
#: ../customcom.py:44 #: ../customcom.py:44
msgid "Welcome to the interactive random {} maker!\n" msgid "Welcome to the interactive random {} maker!\n"
"Every message you send will be added as one of the random response to choose from once this {} is triggered. To exit this interactive menu, type `{}`" "Every message you send will be added as one of the random response to choose from once this {} is triggered. To exit this interactive menu, type `{}`"
msgstr "" msgstr "Selamat datang di pembuat interaktif {} acak!\n"
"Setiap pesan yang anda kirim akan ditambahkan sebagai salah satu respon acak untuk dipilih setelah ini {} dipicu. Untuk keluar dari menu interaktif ini, ketik `{}`"
#: ../customcom.py:56 #: ../customcom.py:56
msgid "Add a random response:" msgid "Add a random response:"
msgstr "" msgstr "Tambahkan tanggapan acak:"
#: ../customcom.py:119 #: ../customcom.py:119
msgid "Do you want to create a 'randomized' cc? {}" msgid "Do you want to create a 'randomized' cc? {}"
msgstr "" msgstr "Apakah Anda ingin membuat cc 'acak'? {}"
#: ../customcom.py:126 #: ../customcom.py:126
msgid "What response do you want?" msgid "What response do you want?"
msgstr "" msgstr "Tanggapan apa yang anda inginkan?"
#: ../customcom.py:205 ../customcom.py:235 #: ../customcom.py:205 ../customcom.py:235
msgid "Custom command successfully added." msgid "Custom command successfully added."
msgstr "" msgstr "Perintah kustom berhasil ditambahkan."
#: ../customcom.py:207 ../customcom.py:237 #: ../customcom.py:207 ../customcom.py:237
msgid "This command already exists. Use `{}` to edit it." msgid "This command already exists. Use `{}` to edit it."
msgstr "" msgstr "Perintah ini sudah ada. Gunakan '{}' untuk mengeditnya."
#: ../customcom.py:229 #: ../customcom.py:229
msgid "That command is already a standard command." msgid "That command is already a standard command."
msgstr "" msgstr "Perintah ini sudah perintah standar."
#: ../customcom.py:261 #: ../customcom.py:261
msgid "Custom command successfully edited." msgid "Custom command successfully edited."
msgstr "" msgstr "Perintah kustom berhasil diubah."
#: ../customcom.py:263 #: ../customcom.py:263
msgid "That command doesn't exist. Use `{}` to add it." msgid "That command doesn't exist. Use `{}` to add it."
msgstr "" msgstr "Perintah ini tidak tersedia. Gunakan '{}' untuk menambahkannya."
#: ../customcom.py:282 #: ../customcom.py:282
msgid "Custom command successfully deleted." msgid "Custom command successfully deleted."
msgstr "" msgstr "Perintah kustom berhasil dihapus."
#: ../customcom.py:284 #: ../customcom.py:284
msgid "That command doesn't exist." msgid "That command doesn't exist."
msgstr "" msgstr "Perintah tersebut tidak ada."
#: ../customcom.py:294 #: ../customcom.py:294
msgid "There are no custom commands in this guild. Use `{}` to start adding some." msgid "There are no custom commands in this guild. Use `{}` to start adding some."
msgstr "" msgstr "Tidak ada perintah kustom dalam server ini. Gunakan '{}' untuk mulai menambahkannya."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -19,49 +19,50 @@ msgstr ""
#: ../customcom.py:44 #: ../customcom.py:44
msgid "Welcome to the interactive random {} maker!\n" msgid "Welcome to the interactive random {} maker!\n"
"Every message you send will be added as one of the random response to choose from once this {} is triggered. To exit this interactive menu, type `{}`" "Every message you send will be added as one of the random response to choose from once this {} is triggered. To exit this interactive menu, type `{}`"
msgstr "" msgstr "대화형 랜덤 {} 메이커에 오신 것을 환영해요!\n"
"사용자님이 보내는 모든 메시지에 {} 이(가) 트리거 되면 선택할 임의의 대답 중 하나로 추가됍니다. 이 대화형 메뉴를 종료하려면 `{}` 을 입력해야 해요."
#: ../customcom.py:56 #: ../customcom.py:56
msgid "Add a random response:" msgid "Add a random response:"
msgstr "" msgstr "등록된 랜덤 대답 리스트 :"
#: ../customcom.py:119 #: ../customcom.py:119
msgid "Do you want to create a 'randomized' cc? {}" msgid "Do you want to create a 'randomized' cc? {}"
msgstr "" msgstr "'임의' CC를 생성할까요?"
#: ../customcom.py:126 #: ../customcom.py:126
msgid "What response do you want?" msgid "What response do you want?"
msgstr "" msgstr "어떤 대답을 원해요?"
#: ../customcom.py:205 ../customcom.py:235 #: ../customcom.py:205 ../customcom.py:235
msgid "Custom command successfully added." msgid "Custom command successfully added."
msgstr "" msgstr "커스텀 커맨드가 성공적으로 추가됐어요."
#: ../customcom.py:207 ../customcom.py:237 #: ../customcom.py:207 ../customcom.py:237
msgid "This command already exists. Use `{}` to edit it." msgid "This command already exists. Use `{}` to edit it."
msgstr "" msgstr "이 커맨드는 이미 추가되어 있어요. 편집하려면 `{}` 을(를) 사용해보세요."
#: ../customcom.py:229 #: ../customcom.py:229
msgid "That command is already a standard command." msgid "That command is already a standard command."
msgstr "" msgstr "해당 커맨드는 봇의 커맨드예요."
#: ../customcom.py:261 #: ../customcom.py:261
msgid "Custom command successfully edited." msgid "Custom command successfully edited."
msgstr "" msgstr "커스텀 커맨드가 성공적으로 수정됐어요."
#: ../customcom.py:263 #: ../customcom.py:263
msgid "That command doesn't exist. Use `{}` to add it." msgid "That command doesn't exist. Use `{}` to add it."
msgstr "" msgstr "해당 커맨드는 추가되어 있지 않아요. 추가하려면 `{}` 을(를) 사용해보세요."
#: ../customcom.py:282 #: ../customcom.py:282
msgid "Custom command successfully deleted." msgid "Custom command successfully deleted."
msgstr "" msgstr "커스텀 커맨드가 성공적으로 삭제됐어요."
#: ../customcom.py:284 #: ../customcom.py:284
msgid "That command doesn't exist." msgid "That command doesn't exist."
msgstr "" msgstr "해당 커맨드는 추가되어 있지 않아요."
#: ../customcom.py:294 #: ../customcom.py:294
msgid "There are no custom commands in this guild. Use `{}` to start adding some." msgid "There are no custom commands in this guild. Use `{}` to start adding some."
msgstr "" msgstr "이 길드에 등록된 커스텀 커맨드가 없어요. 추가하려면 `{}` 을(를) 사용해보세요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -0,0 +1,6 @@
from redbot.core.bot import Red
from .dataconverter import DataConverter
def setup(bot: Red):
bot.add_cog(DataConverter(bot))

View File

@@ -0,0 +1,184 @@
from itertools import chain, starmap
from pathlib import Path
from datetime import datetime
from redbot.core.bot import Red
from redbot.core.utils.data_converter import DataConverter as dc
from redbot.core.config import Config
class SpecResolver(object):
"""
Resolves Certain things for DataConverter
"""
def __init__(self, path: Path):
self.v2path = path
self.resolved = set()
self.available_core_conversions = {
'Bank Accounts': {
'cfg': ('Bank', None, 384734293238749),
'file': self.v2path / 'data' / 'economy' / 'bank.json',
'converter': self.bank_accounts_conv_spec
},
'Economy Settings': {
'cfg': ('Economy', 'config', 1256844281),
'file': self.v2path / 'data' / 'economy' / 'settings.json',
'converter': self.economy_conv_spec
},
'Mod Log Cases': {
'cfg': ('ModLog', None, 1354799444),
'file': self.v2path / 'data' / 'mod' / 'modlog.json',
'converter': None # prevents from showing as available
},
'Filter': {
'cfg': ('Filter', 'settings', 4766951341),
'file': self.v2path / 'data' / 'mod' / 'filter.json',
'converter': self.filter_conv_spec
},
'Past Names': {
'cfg': ('Mod', 'settings', 4961522000),
'file': self.v2path / 'data' / 'mod' / 'past_names.json',
'converter': self.past_names_conv_spec
},
'Past Nicknames': {
'cfg': ('Mod', 'settings', 4961522000),
'file': self.v2path / 'data' / 'mod' / 'past_nicknames.json',
'converter': self.past_nicknames_conv_spec
},
'Custom Commands': {
'cfg': ('CustomCommands', 'config', 414589031223512),
'file': self.v2path / 'data' / 'customcom' / 'commands.json',
'converter': self.customcom_conv_spec
}
}
@property
def available(self):
return sorted(
k for k, v in self.available_core_conversions.items()
if v['file'].is_file() and v['converter'] is not None
and k not in self.resolved
)
def unpack(self, parent_key, parent_value):
"""Unpack one level of nesting in a dictionary"""
try:
items = parent_value.items()
except AttributeError:
yield (parent_key, parent_value)
else:
for key, value in items:
yield (parent_key + (key,), value)
def flatten_dict(self, dictionary: dict):
"""Flatten a nested dictionary structure"""
dictionary = {(key,): value for key, value in dictionary.items()}
while True:
dictionary = dict(
chain.from_iterable(
starmap(self.unpack, dictionary.items())
)
)
if not any(
isinstance(value, dict)
for value in dictionary.values()
):
break
return dictionary
def apply_scope(self, scope: str, data: dict):
return {(scope,) + k: v for k, v in data.items()}
def bank_accounts_conv_spec(self, data: dict):
flatscoped = self.apply_scope(Config.MEMBER, self.flatten_dict(data))
ret = {}
for k, v in flatscoped.items():
outerkey, innerkey = tuple(k[:-1]), (k[-1],)
if outerkey not in ret:
ret[outerkey] = {}
if innerkey[0] == 'created_at':
x = int(
datetime.strptime(
v, "%Y-%m-%d %H:%M:%S").timestamp()
)
ret[outerkey].update({innerkey: x})
else:
ret[outerkey].update({innerkey: v})
return ret
def economy_conv_spec(self, data: dict):
flatscoped = self.apply_scope(Config.GUILD, self.flatten_dict(data))
ret = {}
for k, v in flatscoped.items():
outerkey, innerkey = (*k[:-1],), (k[-1],)
if outerkey not in ret:
ret[outerkey] = {}
ret[outerkey].update({innerkey: v})
return ret
def mod_log_cases(self, data: dict):
raise NotImplementedError("This one isn't ready yet")
def filter_conv_spec(self, data: dict):
return {
(Config.GUILD, k): {('filter',): v}
for k, v in data.items()
}
def past_names_conv_spec(self, data: dict):
return {
(Config.USER, k): {('past_names',): v}
for k, v in data.items()
}
def past_nicknames_conv_spec(self, data: dict):
flatscoped = self.apply_scope(Config.MEMBER, self.flatten_dict(data))
ret = {}
for k, v in flatscoped.items():
outerkey, innerkey = (*k[:-1],), (k[-1],)
if outerkey not in ret:
ret[outerkey] = {}
ret[outerkey].update({innerkey: v})
return ret
def customcom_conv_spec(self, data: dict):
flatscoped = self.apply_scope(Config.GUILD, self.flatten_dict(data))
ret = {}
for k, v in flatscoped.items():
outerkey, innerkey = (*k[:-1],), ('commands', k[-1])
if outerkey not in ret:
ret[outerkey] = {}
ccinfo = {
'author': {
'id': 42,
'name': 'Converted from a v2 instance'
},
'command': k[-1],
'created_at': '{:%d/%m/%Y %H:%M:%S}'.format(datetime.utcnow()),
'editors': [],
'response': v
}
ret[outerkey].update({innerkey: ccinfo})
return ret
async def convert(self, bot: Red, prettyname: str):
if prettyname not in self.available:
raise NotImplementedError("No Conversion Specs for this")
info = self.available_core_conversions[prettyname]
filepath, converter = info['file'], info['converter']
(cogname, attr, _id) = info['cfg']
try:
config = getattr(bot.get_cog(cogname), attr)
except (TypeError, AttributeError):
config = Config.get_conf(cogname, _id)
try:
items = converter(dc.json_load(filepath))
await dc(config).dict_import(items)
except Exception:
raise
else:
self.resolved.add(prettyname)

View File

@@ -0,0 +1,82 @@
from pathlib import Path
import asyncio
from discord.ext import commands
from redbot.core import checks, RedContext
from redbot.core.bot import Red
from redbot.core.i18n import CogI18n
from redbot.cogs.dataconverter.core_specs import SpecResolver
from redbot.core.utils.chat_formatting import box
_ = CogI18n('DataConverter', __file__)
class DataConverter:
"""
Cog for importing Red v2 Data
"""
def __init__(self, bot: Red):
self.bot = bot
@checks.is_owner()
@commands.command(name="convertdata")
async def dataconversioncommand(self, ctx: RedContext, v2path: str):
"""
Interactive prompt for importing data from Red v2
Takes the path where the v2 install is
Overwrites values which have entries in both v2 and v3,
use with caution.
"""
resolver = SpecResolver(Path(v2path.strip()))
if not resolver.available:
return await ctx.send(
_("There don't seem to be any data files I know how to "
"handle here. Are you sure you gave me the base "
"installation path?")
)
while resolver.available:
menu = _("Please select a set of data to import by number"
", or 'exit' to exit")
for index, entry in enumerate(resolver.available, 1):
menu += "\n{}. {}".format(index, entry)
menu_message = await ctx.send(box(menu))
def pred(m):
return m.channel == ctx.channel and m.author == ctx.author
try:
message = await self.bot.wait_for(
'message', check=pred, timeout=60
)
except asyncio.TimeoutError:
return await ctx.send(
_('Try this again when you are more ready'))
else:
if message.content.strip().lower() in [
'quit', 'exit', '-1', 'q', 'cancel'
]:
return await ctx.tick()
try:
message = int(message.content.strip())
to_conv = resolver.available[message - 1]
except (ValueError, IndexError):
await ctx.send(
_("That wasn't a valid choice.")
)
continue
else:
async with ctx.typing():
await resolver.convert(self.bot, to_conv)
await ctx.send(_("{} converted.").format(to_conv))
await menu_message.delete()
else:
return await ctx.send(
_("There isn't anything else I know how to convert here."
"\nThere might be more things I can convert in the future.")
)

View File

@@ -0,0 +1,43 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2018-03-12 04:35+EDT\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
#: ../dataconverter.py:38
msgid "There don't seem to be any data files I know how to handle here. Are you sure you gave me the base installation path?"
msgstr ""
#: ../dataconverter.py:43
msgid "Please select a set of data to import by number, or 'exit' to exit"
msgstr ""
#: ../dataconverter.py:59
msgid "Try this again when you are more ready"
msgstr ""
#: ../dataconverter.py:70
msgid "That wasn't a valid choice."
msgstr ""
#: ../dataconverter.py:76
msgid "{} converted."
msgstr ""
#: ../dataconverter.py:80
msgid ""
"There isn't anything else I know how to convert here.\n"
"There might be more things I can convert in the future."
msgstr ""

View File

@@ -0,0 +1,15 @@
import subprocess
TO_TRANSLATE = [
'../dataconverter.py'
]
def regen_messages():
subprocess.run(
['pygettext', '-n'] + TO_TRANSLATE
)
if __name__ == "__main__":
regen_messages()

View File

@@ -5,6 +5,8 @@ from sys import path as syspath
from typing import Tuple, Union from typing import Tuple, Union
import discord import discord
import sys
from redbot.core import Config from redbot.core import Config
from redbot.core import checks from redbot.core import checks
from redbot.core.data_manager import cog_data_path from redbot.core.data_manager import cog_data_path
@@ -220,7 +222,7 @@ class Downloader:
""" """
try: try:
# noinspection PyTypeChecker # noinspection PyTypeChecker
await self._repo_manager.add_repo( repo = await self._repo_manager.add_repo(
name=name, name=name,
url=repo_url, url=repo_url,
branch=branch branch=branch
@@ -232,6 +234,8 @@ class Downloader:
log.exception(_("Something went wrong during the cloning process.")) log.exception(_("Something went wrong during the cloning process."))
else: else:
await ctx.send(_("Repo `{}` successfully added.").format(name)) await ctx.send(_("Repo `{}` successfully added.").format(name))
if repo.install_msg is not None:
await ctx.send(repo.install_msg)
@repo.command(name="delete") @repo.command(name="delete")
async def _repo_del(self, ctx, repo_name: Repo): async def _repo_del(self, ctx, repo_name: Repo):
@@ -268,11 +272,18 @@ class Downloader:
""" """
Installs a cog from the given repo. Installs a cog from the given repo.
""" """
cog = discord.utils.get(repo_name.available_cogs, name=cog_name) cog = discord.utils.get(repo_name.available_cogs, name=cog_name) # type: Installable
if cog is None: if cog is None:
await ctx.send(_("Error, there is no cog by the name of" await ctx.send(_("Error, there is no cog by the name of"
" `{}` in the `{}` repo.").format(cog_name, repo_name.name)) " `{}` in the `{}` repo.").format(cog_name, repo_name.name))
return return
elif cog.min_python_version > sys.version_info:
await ctx.send(_(
"This cog requires at least python version {}, aborting install.".format(
'.'.join([str(n) for n in cog.min_python_version])
)
))
return
if not await repo_name.install_requirements(cog, self.LIB_PATH): if not await repo_name.install_requirements(cog, self.LIB_PATH):
await ctx.send(_("Failed to install the required libraries for" await ctx.send(_("Failed to install the required libraries for"
@@ -286,6 +297,8 @@ class Downloader:
await repo_name.install_libraries(self.SHAREDLIB_PATH) await repo_name.install_libraries(self.SHAREDLIB_PATH)
await ctx.send(_("`{}` cog successfully installed.").format(cog_name)) await ctx.send(_("`{}` cog successfully installed.").format(cog_name))
if cog.install_msg is not None:
await ctx.send(cog.install_msg)
@cog.command(name="uninstall") @cog.command(name="uninstall")
async def _cog_uninstall(self, ctx, cog_name: InstalledCog): async def _cog_uninstall(self, ctx, cog_name: InstalledCog):

View File

@@ -38,6 +38,9 @@ class Installable(RepoJSONMixin):
bot_version : `tuple` of `int` bot_version : `tuple` of `int`
The minimum bot version required for this installation. Right now The minimum bot version required for this installation. Right now
this is always :code:`3.0.0`. this is always :code:`3.0.0`.
min_python_version : `tuple` of `int`
The minimum python version required for this cog. This field will not
apply to repo info.json's.
hidden : `bool` hidden : `bool`
Whether or not this cog will be hidden from the user when they use Whether or not this cog will be hidden from the user when they use
`Downloader`'s commands. `Downloader`'s commands.
@@ -70,6 +73,7 @@ class Installable(RepoJSONMixin):
self.author = () self.author = ()
self.bot_version = (3, 0, 0) self.bot_version = (3, 0, 0)
self.min_python_version = (3, 5, 1)
self.hidden = False self.hidden = False
self.required_cogs = {} # Cog name -> repo URL self.required_cogs = {} # Cog name -> repo URL
self.requirements = () self.requirements = ()
@@ -159,9 +163,15 @@ class Installable(RepoJSONMixin):
try: try:
bot_version = tuple(info.get("bot_version", [3, 0, 0])) bot_version = tuple(info.get("bot_version", [3, 0, 0]))
except ValueError: except ValueError:
bot_version = 2 bot_version = self.bot_version
self.bot_version = bot_version self.bot_version = bot_version
try:
min_python_version = tuple(info.get('min_python_version', [3, 5, 1]))
except ValueError:
min_python_version = self.min_python_version
self.min_python_version = min_python_version
try: try:
hidden = bool(info.get("hidden", False)) hidden = bool(info.get("hidden", False))
except ValueError: except ValueError:

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,77 +18,77 @@ msgstr ""
#: ../downloader.py:215 #: ../downloader.py:215
msgid "That git repo has already been added under another name." msgid "That git repo has already been added under another name."
msgstr "해당 git 저장소는 이미 다른 이름으로 저장 되어 있습니다." msgstr "해당 git 저장소는 이미 다른 이름으로 저장되어 있어요."
#: ../downloader.py:217 ../downloader.py:218 #: ../downloader.py:217 ../downloader.py:218
msgid "Something went wrong during the cloning process." msgid "Something went wrong during the cloning process."
msgstr "복제 작업중 에러가 발생했습니다." msgstr "복제하는 과정에서 뭔가 잘못됐어요."
#: ../downloader.py:220 #: ../downloader.py:220
msgid "Repo `{}` successfully added." msgid "Repo `{}` successfully added."
msgstr "저장소 `{}` 성공적으로 추가 되었습니다." msgstr "저장소 `{}` 이(가) 성공적으로 추가됐어요."
#: ../downloader.py:229 #: ../downloader.py:229
msgid "The repo `{}` has been deleted successfully." msgid "The repo `{}` has been deleted successfully."
msgstr "저장소 `{}` 성공적으로 삭제 되었습니다." msgstr "저장소 `{}` 이(가) 성공적으로 삭제됐어요."
#: ../downloader.py:237 #: ../downloader.py:237
msgid "Installed Repos:\n" msgid "Installed Repos:\n"
msgstr "설치된 저장소 리스트:\n" msgstr "설치된 저장소 리스트 :"
#: ../downloader.py:258 #: ../downloader.py:258
msgid "Error, there is no cog by the name of `{}` in the `{}` repo." msgid "Error, there is no cog by the name of `{}` in the `{}` repo."
msgstr "에러, `{}` 저장소에 `{}` 로 해당된 cog가 없습니다." msgstr "에러, `{}` 저장소에 `{}` 로 해당된 cog가 없어요."
#: ../downloader.py:263 #: ../downloader.py:263
msgid "Failed to install the required libraries for `{}`: `{}`" msgid "Failed to install the required libraries for `{}`: `{}`"
msgstr "`{}`에 필요한 라이브러리 설치 실패 햇습니다: `{}`" msgstr "`{}` 에 필요한 라이브러리 설치 실패했어요 : `{}`"
#: ../downloader.py:273 #: ../downloader.py:273
msgid "`{}` cog successfully installed." msgid "`{}` cog successfully installed."
msgstr "`{}` cog가 성공적으로 설치 되었습니다." msgstr "`{}` cog가 성공적으로 설치됐어요."
#: ../downloader.py:289 #: ../downloader.py:289
msgid "`{}` was successfully removed." msgid "`{}` was successfully removed."
msgstr "`{}` 성공적으로 제거되었습니다." msgstr "`{}` 이(가) 성공적으로 제거됐어요."
#: ../downloader.py:291 #: ../downloader.py:291
msgid "That cog was installed but can no longer be located. You may need to remove it's files manually if it is still usable." msgid "That cog was installed but can no longer be located. You may need to remove it's files manually if it is still usable."
msgstr "해당 cog가 설치되었지만 위치를 찾을수 없습니다. 만약 해당 cog가 사용 가능하다면 유저가 직접 파일지워야 합니다." msgstr "해당 cog가 설치되었지만 더 이상 찾을 수 없어요. 그래도 사용할 수 있는 경우 수동으로 파일을 제거해야 해요."
#: ../downloader.py:323 #: ../downloader.py:323
msgid "Cog update completed successfully." msgid "Cog update completed successfully."
msgstr "Cog가 성공적으로 업데이트 되었습니다." msgstr "Cog가 성공적으로 업데이트됐어요."
#: ../downloader.py:331 #: ../downloader.py:331
msgid "Available Cogs:\n" msgid "Available Cogs:\n"
msgstr "사용가능한 Cogs:\n" msgstr "사용 가능한 Cogs :\n"
#: ../downloader.py:343 #: ../downloader.py:343
msgid "There is no cog `{}` in the repo `{}`" msgid "There is no cog `{}` in the repo `{}`"
msgstr "저장소 `{}` 에 `{}`로 된 Cog가 없습니다." msgstr "저장소 `{}` 에 `{}`로 된 Cog가 없어요."
#: ../downloader.py:348 #: ../downloader.py:348
msgid "Information on {}:\n" msgid "Information on {}:\n"
"{}" "{}"
msgstr "`{}`에 대한 정보:\n" msgstr "`{}` 에 대한 정보 :\n"
"{}" "{}"
#: ../downloader.py:389 #: ../downloader.py:389
msgid "Missing from info.json" msgid "Missing from info.json"
msgstr "Info.json에 정보가 없습니다." msgstr "Info.json 파일에서 누락됐어요."
#: ../downloader.py:398 #: ../downloader.py:398
msgid "Command: {}\n" msgid "Command: {}\n"
"Made by: {}\n" "Made by: {}\n"
"Repo: {}\n" "Repo: {}\n"
"Cog name: {}" "Cog name: {}"
msgstr "명령어: {}\n" msgstr "커맨드 : {}\n"
"작성자: {}\n" "작성자 : {}\n"
"저장소: {}\n" "저장소 : {}\n"
"Cog 이름: {}" "Cog 이름 : {}"
#: ../downloader.py:430 #: ../downloader.py:430
msgid "That command doesn't seem to exist." msgid "That command doesn't seem to exist."
msgstr "해당 명령어가 존재하지 않습니다." msgstr "해당 커맨드가 등록되어 있지 않아요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-19 03:59+UTC\n" "POT-Creation-Date: 2018-02-19 03:59+UTC\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -85,7 +85,8 @@ msgstr "{} setel akun {} ke {} {}."
#: ../economy.py:212 #: ../economy.py:212
msgid "This will delete all bank accounts for {}.\n" msgid "This will delete all bank accounts for {}.\n"
"If you're sure, type `{}bank reset yes`" "If you're sure, type `{}bank reset yes`"
msgstr "" msgstr "Ini akan menghapus semua akunbank untuk {}.\n"
"Jika anda telah yakin, ketik {} reset bank ya`"
#: ../economy.py:229 #: ../economy.py:229
msgid "All bank accounts of this guild have been deleted." msgid "All bank accounts of this guild have been deleted."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,31 +18,31 @@ msgstr ""
#: ../economy.py:40 #: ../economy.py:40
msgid "JACKPOT! 226! Your bid has been multiplied * 2500!" msgid "JACKPOT! 226! Your bid has been multiplied * 2500!"
msgstr "" msgstr "대박이야! 226! 사용자님의 입찰 가격이 2,500을 넘었어요!"
#: ../economy.py:44 #: ../economy.py:44
msgid "4LC! +1000!" msgid "4LC! +1000!"
msgstr "" msgstr "포 클로버! + 1000!"
#: ../economy.py:48 #: ../economy.py:48
msgid "Three cherries! +800!" msgid "Three cherries! +800!"
msgstr "" msgstr "체리 셋! +800!"
#: ../economy.py:52 #: ../economy.py:52
msgid "2 6! Your bid has been multiplied * 4!" msgid "2 6! Your bid has been multiplied * 4!"
msgstr "" msgstr "2 6! 사용자님의 입찰 가격이 4배로 늘었어요!"
#: ../economy.py:56 #: ../economy.py:56
msgid "Two cherries! Your bid has been multiplied * 3!" msgid "Two cherries! Your bid has been multiplied * 3!"
msgstr "" msgstr "체리 두 개! 사용자님의 입찰 가격이 3배로 올랐어요!"
#: ../economy.py:60 #: ../economy.py:60
msgid "Three symbols! +500!" msgid "Three symbols! +500!"
msgstr "" msgstr "3개의 심볼! +500!"
#: ../economy.py:64 #: ../economy.py:64
msgid "Two consecutive symbols! Your bid has been multiplied * 2!" msgid "Two consecutive symbols! Your bid has been multiplied * 2!"
msgstr "" msgstr "2연속 심볼! 당신의 입찰 가격이 2배로 늘었어요!"
#: ../economy.py:68 #: ../economy.py:68
msgid "Slot machine payouts:\n" msgid "Slot machine payouts:\n"
@@ -53,74 +53,86 @@ msgid "Slot machine payouts:\n"
"{cherries.value} {cherries.value} Bet * 3\n\n" "{cherries.value} {cherries.value} Bet * 3\n\n"
"Three symbols: +500\n" "Three symbols: +500\n"
"Two symbols: Bet * 2" "Two symbols: Bet * 2"
msgstr "" msgstr "슬롯 머신 지불금 :\n"
"{two.value} {two.value} {six.value} 베팅 * 2500\n"
"{flc.value} {flc.value} {flc.value} +1000\n"
"{cherries.value} {cherries.value} {cherries.value} +800\n"
"{two.value} {six.value} 베팅 * 4\n"
"{cherries.value} {cherries.value} 베팅 * 3"
#: ../economy.py:157 #: ../economy.py:157
msgid "{}'s balance is {} {}" msgid "{}'s balance is {} {}"
msgstr "" msgstr "{}의 잔액은 {} {} 이에요."
#: ../economy.py:171 #: ../economy.py:171
msgid "{} transferred {} {} to {}" msgid "{} transferred {} {} to {}"
msgstr "" msgstr "{1} 이(가) {2} {3} {4} 으로 전송됐어요."
#: ../economy.py:191 #: ../economy.py:191
msgid "{} added {} {} to {}'s account." msgid "{} added {} {} to {}'s account."
msgstr "" msgstr "{1} 이(가) {4}의 계정에 {2} {3} 을(를) 추가했어요."
#: ../economy.py:196 #: ../economy.py:196
msgid "{} removed {} {} from {}'s account." msgid "{} removed {} {} from {}'s account."
msgstr "" msgstr "{1} 이(가) {4}의 계정에서 {3} {4} 을(를) 제거했어요."
#: ../economy.py:201 #: ../economy.py:201
msgid "{} set {}'s account to {} {}." msgid "{} set {}'s account to {} {}."
msgstr "" msgstr "{1} 이(가) {4}의 계정을 {2} {3} (으)로 설정했어요."
#: ../economy.py:212 #: ../economy.py:212
msgid "This will delete all bank accounts for {}.\n" msgid "This will delete all bank accounts for {}.\n"
"If you're sure, type `{}bank reset yes`" "If you're sure, type `{}bank reset yes`"
msgstr "" msgstr "{} 에 대한 모든 은행 계정이 삭제될 거예요.\n"
"확실한 경우 `{}bank reset yes` 를 입력해야 해요."
#: ../economy.py:229 #: ../economy.py:229
msgid "All bank accounts of this guild have been deleted." msgid "All bank accounts of this guild have been deleted."
msgstr "" msgstr "이 길드의 모든 은행 계정이 삭제됐어요."
#: ../economy.py:248 ../economy.py:268 #: ../economy.py:248 ../economy.py:268
msgid "{} Here, take some {}. Enjoy! (+{} {}!)" msgid "{} Here, take some {}. Enjoy! (+{} {}!)"
msgstr "" msgstr "{} 여기요, 조금의 {} 을(를) 받아요. 즐겨요! (+{} {}!)"
#: ../economy.py:258 ../economy.py:276 #: ../economy.py:258 ../economy.py:276
msgid "{} Too soon. For your next payday you have to wait {}." msgid "{} Too soon. For your next payday you have to wait {}."
msgstr "" msgstr "{} 너무 일러요. 다음 월급날을 위해서 {} 을(를) 기다려야 해요."
#: ../economy.py:313 #: ../economy.py:313
msgid "There are no accounts in the bank." msgid "There are no accounts in the bank."
msgstr "" msgstr "은행에 등록된 계좌가 없어요."
#: ../economy.py:339 #: ../economy.py:339
msgid "You're on cooldown, try again in a bit." msgid "You're on cooldown, try again in a bit."
msgstr "" msgstr "사용자님은 지금 쿨타임이에요. 잠시 후에 다시 시도해보세요."
#: ../economy.py:342 #: ../economy.py:342
msgid "That's an invalid bid amount, sorry :/" msgid "That's an invalid bid amount, sorry :/"
msgstr "" msgstr "잘못된 입찰 금액이에요, 죄송해요. ;/"
#: ../economy.py:345 #: ../economy.py:345
msgid "You ain't got enough money, friend." msgid "You ain't got enough money, friend."
msgstr "" msgstr "동작 그만, 밑장빼기냐? 돈이 없잖아."
#: ../economy.py:391 #: ../economy.py:391
msgid "{}\n" msgid "{}\n"
"{} {}\n\n" "{} {}\n\n"
"Your bid: {}\n" "Your bid: {}\n"
"{} → {}!" "{} → {}!"
msgstr "" msgstr "{}\n"
"{} {}\n\n"
"사용자님의 입찰 금액 : {}\n"
"{} → {}!"
#: ../economy.py:398 #: ../economy.py:398
msgid "{}\n" msgid "{}\n"
"{} Nothing!\n" "{} Nothing!\n"
"Your bid: {}\n" "Your bid: {}\n"
"{} → {}!" "{} → {}!"
msgstr "" msgstr "{}\n"
"{} 읎어요!\n"
"사용자님의 입찰 금액 : {}\n"
"{} → {}!"
#: ../economy.py:423 #: ../economy.py:423
msgid "Minimum slot bid: {}\n" msgid "Minimum slot bid: {}\n"
@@ -129,65 +141,70 @@ msgid "Minimum slot bid: {}\n"
"Payday amount: {}\n" "Payday amount: {}\n"
"Payday cooldown: {}\n" "Payday cooldown: {}\n"
"Amount given at account registration: {}" "Amount given at account registration: {}"
msgstr "" msgstr "최소 슬롯 입찰 수 : {}\n"
"최대 슬롯 입찰 수 : {}\n"
"슬롯 쿨타임 : {}\n"
"급여 금액 : {}\n"
"급여의 재사용 가능 시간 : {}\n"
"계좌 등록 시 지급된 금액 : {}"
#: ../economy.py:433 #: ../economy.py:433
msgid "Current Economy settings:" msgid "Current Economy settings:"
msgstr "" msgstr "현재 이코노미 설정 :"
#: ../economy.py:441 #: ../economy.py:441
msgid "Invalid min bid amount." msgid "Invalid min bid amount."
msgstr "" msgstr "최소 입찰 금액이 잘못됐어요."
#: ../economy.py:449 #: ../economy.py:449
msgid "Minimum bid is now {} {}." msgid "Minimum bid is now {} {}."
msgstr "" msgstr "이제 최소 입찰가는 {} {} 이에요."
#: ../economy.py:456 #: ../economy.py:456
msgid "Invalid slotmax bid amount. Must be greater than slotmin." msgid "Invalid slotmax bid amount. Must be greater than slotmin."
msgstr "" msgstr "슬롯 최대 입찰 금액이 잘못됐어요. 슬롯 최솟값보다 커야 해요."
#: ../economy.py:465 #: ../economy.py:465
msgid "Maximum bid is now {} {}." msgid "Maximum bid is now {} {}."
msgstr "" msgstr "이제 최대 입찰가는 {} {} 이에요."
#: ../economy.py:475 #: ../economy.py:475
msgid "Cooldown is now {} seconds." msgid "Cooldown is now {} seconds."
msgstr "" msgstr "이제 쿨타임은 {} 초예요."
#: ../economy.py:485 #: ../economy.py:485
msgid "Value modified. At least {} seconds must pass between each payday." msgid "Value modified. At least {} seconds must pass between each payday."
msgstr "" msgstr "값이 수정됐어요. 각각의 월급날 사이에 적어도 {} 초가 지나야 해요."
#: ../economy.py:494 #: ../economy.py:494
msgid "Har har so funny." msgid "Har har so funny."
msgstr "" msgstr "ㅋㅋㅋ 개 재밌다."
#: ../economy.py:500 #: ../economy.py:500
msgid "Every payday will now give {} {}." msgid "Every payday will now give {} {}."
msgstr "" msgstr "이제 월급날 때마다 {} {} 을(를) 줄 거예요."
#: ../economy.py:511 #: ../economy.py:511
msgid "Registering an account will now give {} {}." msgid "Registering an account will now give {} {}."
msgstr "" msgstr "이제 계정을 등록하면 {} {} 이(가) 지급돼요."
#: ../economy.py:517 #: ../economy.py:517
msgid "weeks" msgid "weeks"
msgstr "" msgstr ""
#: ../economy.py:518 #: ../economy.py:518
msgid "days" msgid "days"
msgstr "" msgstr ""
#: ../economy.py:519 #: ../economy.py:519
msgid "hours" msgid "hours"
msgstr "" msgstr "시간"
#: ../economy.py:520 #: ../economy.py:520
msgid "minutes" msgid "minutes"
msgstr "" msgstr ""
#: ../economy.py:521 #: ../economy.py:521
msgid "seconds" msgid "seconds"
msgstr "" msgstr ""

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -240,8 +240,8 @@ class Filter:
pass pass
else: else:
await modlog.create_case( await modlog.create_case(
server, message.created_at, "filterban", self.bot, server, message.created_at,
author, server.me, reason "filterban", author, server.me, reason
) )
async def on_message(self, message: discord.Message): async def on_message(self, message: discord.Message):

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,49 +18,49 @@ msgstr ""
#: ../filter.py:62 #: ../filter.py:62
msgid "Filtered in this server:" msgid "Filtered in this server:"
msgstr "" msgstr "Disaring pada server ini:"
#: ../filter.py:67 #: ../filter.py:67
msgid "I can't send direct messages to you." msgid "I can't send direct messages to you."
msgstr "" msgstr "Saya tidak dapat mengirim pesan langsung kepada Anda."
#: ../filter.py:96 #: ../filter.py:96
msgid "Words added to filter." msgid "Words added to filter."
msgstr "" msgstr "Kata-kata yang ditambahkan untuk disaring."
#: ../filter.py:98 #: ../filter.py:98
msgid "Words already in the filter." msgid "Words already in the filter."
msgstr "" msgstr "Kata-kata yang sudah di disaring."
#: ../filter.py:127 #: ../filter.py:127
msgid "Words removed from filter." msgid "Words removed from filter."
msgstr "" msgstr "Kata-kata dihapus dari penyaring."
#: ../filter.py:129 #: ../filter.py:129
msgid "Those words weren't in the filter." msgid "Those words weren't in the filter."
msgstr "" msgstr "Kata-kata tidak dalam penyaring."
#: ../filter.py:142 #: ../filter.py:142
msgid "Names and nicknames will no longer be checked against the filter" msgid "Names and nicknames will no longer be checked against the filter"
msgstr "" msgstr "Nama dan julukan tidak lagi dapat diperiksa terhadap penyaring"
#: ../filter.py:147 #: ../filter.py:147
msgid "Names and nicknames will now be checked against the filter" msgid "Names and nicknames will now be checked against the filter"
msgstr "" msgstr "Nama dan julukan akan di periksa terhadap penyaring"
#: ../filter.py:160 #: ../filter.py:160
msgid "The name to use on filtered names has been set" msgid "The name to use on filtered names has been set"
msgstr "" msgstr "Nama yang digunakan untuk penyaring telah ditetapkan"
#: ../filter.py:171 #: ../filter.py:171
msgid "Count and timeframe either both need to be 0 or both need to be greater than 0!" msgid "Count and timeframe either both need to be 0 or both need to be greater than 0!"
msgstr "" msgstr "Count dan jangka waktu keduanya harus 0 atau keduanya harus lebih besar dari 0!"
#: ../filter.py:179 #: ../filter.py:179
msgid "Autoban disabled." msgid "Autoban disabled."
msgstr "" msgstr "Autoban dimatikan."
#: ../filter.py:183 #: ../filter.py:183
msgid "Count and time have been set." msgid "Count and time have been set."
msgstr "" msgstr "Jumlah dan waktu telah ditetapkan."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,49 +18,49 @@ msgstr ""
#: ../filter.py:62 #: ../filter.py:62
msgid "Filtered in this server:" msgid "Filtered in this server:"
msgstr "" msgstr "이 서버에서 필터링 된 항목 :"
#: ../filter.py:67 #: ../filter.py:67
msgid "I can't send direct messages to you." msgid "I can't send direct messages to you."
msgstr "" msgstr "사용자님에게 직접 메시지를 보낼 수 없어요."
#: ../filter.py:96 #: ../filter.py:96
msgid "Words added to filter." msgid "Words added to filter."
msgstr "" msgstr "필터링에 추가된 단어예요."
#: ../filter.py:98 #: ../filter.py:98
msgid "Words already in the filter." msgid "Words already in the filter."
msgstr "" msgstr "필터에 이미 있는 단어예요."
#: ../filter.py:127 #: ../filter.py:127
msgid "Words removed from filter." msgid "Words removed from filter."
msgstr "" msgstr "필터에서 제거된 단어예요."
#: ../filter.py:129 #: ../filter.py:129
msgid "Those words weren't in the filter." msgid "Those words weren't in the filter."
msgstr "" msgstr "해당 단어들은 필터에 들어 있지 않아요."
#: ../filter.py:142 #: ../filter.py:142
msgid "Names and nicknames will no longer be checked against the filter" msgid "Names and nicknames will no longer be checked against the filter"
msgstr "" msgstr "필터에 대한 이름 및 닉네임을 더 이상 확인할 수 없어요."
#: ../filter.py:147 #: ../filter.py:147
msgid "Names and nicknames will now be checked against the filter" msgid "Names and nicknames will now be checked against the filter"
msgstr "" msgstr "이제 이름과 닉네임을 필터에서 개별적으로 인식해요."
#: ../filter.py:160 #: ../filter.py:160
msgid "The name to use on filtered names has been set" msgid "The name to use on filtered names has been set"
msgstr "" msgstr "필터링 된 이름에 사용할 이름이 설정됐어요."
#: ../filter.py:171 #: ../filter.py:171
msgid "Count and timeframe either both need to be 0 or both need to be greater than 0!" msgid "Count and timeframe either both need to be 0 or both need to be greater than 0!"
msgstr "" msgstr "개수와 시간은 모두 0이어야 하거나 0보다 커야 해요!"
#: ../filter.py:179 #: ../filter.py:179
msgid "Autoban disabled." msgid "Autoban disabled."
msgstr "" msgstr "자동 밴이 중지됐어요."
#: ../filter.py:183 #: ../filter.py:183
msgid "Count and time have been set." msgid "Count and time have been set."
msgstr "" msgstr "개수와 시간이 설정됐어요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -90,7 +90,7 @@ class General:
msg = "" msg = ""
if user.id == ctx.bot.user.id: if user.id == ctx.bot.user.id:
user = ctx.author user = ctx.author
msg = _("Nice try. You think this is funny?" msg = _("Nice try. You think this is funny?\n"
"How about *this* instead:\n\n") "How about *this* instead:\n\n")
char = "abcdefghijklmnopqrstuvwxyz" char = "abcdefghijklmnopqrstuvwxyz"
tran = "ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz" tran = "ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -30,11 +30,11 @@ msgstr "Jelas begitu"
#: ../general.py:43 #: ../general.py:43
msgid "Most likely" msgid "Most likely"
msgstr "Most likely" msgstr "Sewajarnya"
#: ../general.py:43 #: ../general.py:43
msgid "Outlook good" msgid "Outlook good"
msgstr "Melihat keluar bagus" msgstr "Pandangan bagus"
#: ../general.py:43 #: ../general.py:43
msgid "Signs point to yes" msgid "Signs point to yes"
@@ -50,7 +50,7 @@ msgstr "Ya"
#: ../general.py:44 #: ../general.py:44
msgid "Yes definitely" msgid "Yes definitely"
msgstr "Iya tentu saja" msgstr "Iya - tentu saja"
#: ../general.py:44 #: ../general.py:44
msgid "You may rely on it" msgid "You may rely on it"
@@ -163,15 +163,15 @@ msgstr "Bermain {}"
#: ../general.py:225 #: ../general.py:225
msgid "Streaming [{}]({})" msgid "Streaming [{}]({})"
msgstr "" msgstr "Streaming [{}]({})"
#: ../general.py:227 #: ../general.py:227
msgid "Listening to {}" msgid "Listening to {}"
msgstr "" msgstr "Mendengarkan {}"
#: ../general.py:229 #: ../general.py:229
msgid "Watching {}" msgid "Watching {}"
msgstr "" msgstr "Menonton {}"
#: ../general.py:234 #: ../general.py:234
msgid "None" msgid "None"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,222 +18,223 @@ msgstr ""
#: ../general.py:42 #: ../general.py:42
msgid "As I see it, yes" msgid "As I see it, yes"
msgstr "" msgstr "내가 보기엔 그렇지!"
#: ../general.py:42 #: ../general.py:42
msgid "It is certain" msgid "It is certain"
msgstr "" msgstr "틀림없어요!"
#: ../general.py:42 #: ../general.py:42
msgid "It is decidedly so" msgid "It is decidedly so"
msgstr "" msgstr "그건 확실히 그렇지!"
#: ../general.py:43 #: ../general.py:43
msgid "Most likely" msgid "Most likely"
msgstr "" msgstr "아마도 그럴걸?"
#: ../general.py:43 #: ../general.py:43
msgid "Outlook good" msgid "Outlook good"
msgstr "" msgstr "오늘은 전망이 좋네요."
#: ../general.py:43 #: ../general.py:43
msgid "Signs point to yes" msgid "Signs point to yes"
msgstr "" msgstr "소라고둥이 말씀하셨다! \"그래\""
#: ../general.py:44 #: ../general.py:44
msgid "Without a doubt" msgid "Without a doubt"
msgstr "" msgstr "틀림없어!"
#: ../general.py:44 #: ../general.py:44
msgid "Yes" msgid "Yes"
msgstr "" msgstr "그래요!"
#: ../general.py:44 #: ../general.py:44
msgid "Yes definitely" msgid "Yes definitely"
msgstr "" msgstr "그래요, 물론이죠!"
#: ../general.py:44 #: ../general.py:44
msgid "You may rely on it" msgid "You may rely on it"
msgstr "" msgstr "그걸 믿어도 좋아요!"
#: ../general.py:45 #: ../general.py:45
msgid "Ask again later" msgid "Ask again later"
msgstr "" msgstr "나중에 다시 물어보세요!"
#: ../general.py:45 #: ../general.py:45
msgid "Reply hazy, try again" msgid "Reply hazy, try again"
msgstr "" msgstr "의미심장하네요, 다시 시도해보세요."
#: ../general.py:46 #: ../general.py:46
msgid "Better not tell you now" msgid "Better not tell you now"
msgstr "" msgstr "지금은 말해주지 않는게 좋겠어요."
#: ../general.py:46 #: ../general.py:46
msgid "Cannot predict now" msgid "Cannot predict now"
msgstr "" msgstr "지금은 예측할 수 없죠."
#: ../general.py:47 #: ../general.py:47
msgid "Concentrate and ask again" msgid "Concentrate and ask again"
msgstr "" msgstr "집중해서 다시 물어보세요."
#: ../general.py:47 #: ../general.py:47
msgid "Don't count on it" msgid "Don't count on it"
msgstr "" msgstr "그렇지 않을거예요."
#: ../general.py:47 #: ../general.py:47
msgid "My reply is no" msgid "My reply is no"
msgstr "" msgstr "제 대답은 \"아뇨\"예요."
#: ../general.py:48 #: ../general.py:48
msgid "My sources say no" msgid "My sources say no"
msgstr "" msgstr "제 진심이 말하길 \"아뇨\""
#: ../general.py:48 #: ../general.py:48
msgid "Outlook not so good" msgid "Outlook not so good"
msgstr "" msgstr "오늘은 전망이 별로 좋지 않네요."
#: ../general.py:48 #: ../general.py:48
msgid "Very doubtful" msgid "Very doubtful"
msgstr "" msgstr "동작 그만, 밑장빼기냐?"
#: ../general.py:64 #: ../general.py:64
msgid "Not enough choices to pick from." msgid "Not enough choices to pick from."
msgstr "" msgstr "선택의 폭이 좁은걸?"
#: ../general.py:78 #: ../general.py:78
msgid "{} :game_die: {} :game_die:" msgid "{} :game_die: {} :game_die:"
msgstr "" msgstr "{} :game_die: {} :game_die:"
#: ../general.py:81 #: ../general.py:81
msgid "{} Maybe higher than 1? ;P" msgid "{} Maybe higher than 1? ;P"
msgstr "" msgstr "{} 1보다 클수도 있죠? ;P"
#: ../general.py:93 #: ../general.py:93
msgid "Nice try. You think this is funny?How about *this* instead:\n\n" msgid "Nice try. You think this is funny?How about *this* instead:\n\n"
msgstr "" msgstr "시도는 좋았어요, 재밌을 것 같아요? 대신 *이건* 어때요? :"
#: ../general.py:106 #: ../general.py:106
msgid "*flips a coin and... " msgid "*flips a coin and... "
msgstr "" msgstr "*동전을 던지며..."
#: ../general.py:106 #: ../general.py:106
msgid "HEADS!*" msgid "HEADS!*"
msgstr "" msgstr "앞면!*"
#: ../general.py:106 #: ../general.py:106
msgid "TAILS!*" msgid "TAILS!*"
msgstr "" msgstr "뒷면!*"
#: ../general.py:130 #: ../general.py:130
msgid "{} You win {}!" msgid "{} You win {}!"
msgstr "" msgstr "{} {} 을(를) 획득했어요!"
#: ../general.py:134 #: ../general.py:134
msgid "{} You lose {}!" msgid "{} You lose {}!"
msgstr "" msgstr "{} {} 을(를) 잃었어요!"
#: ../general.py:138 #: ../general.py:138
msgid "{} We're square {}!" msgid "{} We're square {}!"
msgstr "" msgstr "{} 우리는 사각형이에요 {}!"
#: ../general.py:151 #: ../general.py:151
msgid "That doesn't look like a question." msgid "That doesn't look like a question."
msgstr "" msgstr "그건 질문으로 보이지 않아요."
#: ../general.py:159 #: ../general.py:159
msgid " Stopwatch started!" msgid " Stopwatch started!"
msgstr "" msgstr "스톱워치가 시작됐어요!"
#: ../general.py:163 #: ../general.py:163
msgid " Stopwatch stopped! Time: **" msgid " Stopwatch stopped! Time: **"
msgstr "" msgstr "스톱워치가 멈췄어요! 시간 : **"
#: ../general.py:216 ../general.py:217 #: ../general.py:216 ../general.py:217
msgid "{}\n" msgid "{}\n"
"({} days ago)" "({} days ago)"
msgstr "" msgstr "{}\n"
"({} 일 전에)"
#: ../general.py:219 #: ../general.py:219
msgid "Chilling in {} status" msgid "Chilling in {} status"
msgstr "" msgstr "{} 상태로 오싹해졌어요."
#: ../general.py:223 #: ../general.py:223
msgid "Playing {}" msgid "Playing {}"
msgstr "" msgstr "재생 중 {}"
#: ../general.py:225 #: ../general.py:225
msgid "Streaming [{}]({})" msgid "Streaming [{}]({})"
msgstr "" msgstr "실시간 스트리밍 [{}]({})"
#: ../general.py:227 #: ../general.py:227
msgid "Listening to {}" msgid "Listening to {}"
msgstr "" msgstr "듣는 중 {}"
#: ../general.py:229 #: ../general.py:229
msgid "Watching {}" msgid "Watching {}"
msgstr "" msgstr "보는 중 {}"
#: ../general.py:234 #: ../general.py:234
msgid "None" msgid "None"
msgstr "" msgstr "읎어요."
#: ../general.py:237 #: ../general.py:237
msgid "Joined Discord on" msgid "Joined Discord on"
msgstr "" msgstr "가입된 디스코드 켜짐"
#: ../general.py:238 #: ../general.py:238
msgid "Joined this guild on" msgid "Joined this guild on"
msgstr "" msgstr "이 길드에 가입된"
#: ../general.py:239 ../general.py:286 #: ../general.py:239 ../general.py:286
msgid "Roles" msgid "Roles"
msgstr "" msgstr "역할"
#: ../general.py:240 #: ../general.py:240
msgid "Member #{} | User ID: {}" msgid "Member #{} | User ID: {}"
msgstr "" msgstr "멤버 # {} | 사용자 ID : {}"
#: ../general.py:257 ../general.py:299 #: ../general.py:257 ../general.py:299
msgid "I need the `Embed links` permission to send this." msgid "I need the `Embed links` permission to send this."
msgstr "" msgstr "이걸 보내려면 'Embed links' 권한이 필요해요."
#: ../general.py:272 #: ../general.py:272
msgid "Since {}. That's over {} days ago!" msgid "Since {}. That's over {} days ago!"
msgstr "" msgstr "{} 이후, 그건 {} 일 전의 일이에요!"
#: ../general.py:282 #: ../general.py:282
msgid "Region" msgid "Region"
msgstr "" msgstr "지역"
#: ../general.py:283 #: ../general.py:283
msgid "Users" msgid "Users"
msgstr "" msgstr "사용자"
#: ../general.py:284 #: ../general.py:284
msgid "Text Channels" msgid "Text Channels"
msgstr "" msgstr "텍스트 채널"
#: ../general.py:285 #: ../general.py:285
msgid "Voice Channels" msgid "Voice Channels"
msgstr "" msgstr "음성 채널"
#: ../general.py:287 #: ../general.py:287
msgid "Owner" msgid "Owner"
msgstr "" msgstr "주인님"
#: ../general.py:288 #: ../general.py:288
msgid "Guild ID: " msgid "Guild ID: "
msgstr "" msgstr "길드 ID :"
#: ../general.py:343 #: ../general.py:343
msgid "Your search terms gave no results." msgid "Your search terms gave no results."
msgstr "" msgstr "검색 조건에서 검색 결과가 없어요."
#: ../general.py:345 #: ../general.py:345
msgid "There is no definition #{}" msgid "There is no definition #{}"
msgstr "" msgstr "정의 #{} 이(가) 없어요."
#: ../general.py:347 #: ../general.py:347
msgid "Error." msgid "Error."
msgstr "" msgstr "에러."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -28,7 +28,6 @@ class Image:
self.session.close() self.session.close()
@commands.group(name="imgur") @commands.group(name="imgur")
@commands.guild_only()
async def _imgur(self, ctx): async def _imgur(self, ctx):
"""Retrieves pictures from imgur """Retrieves pictures from imgur
@@ -40,10 +39,16 @@ class Image:
@_imgur.command(name="search") @_imgur.command(name="search")
async def imgur_search(self, ctx, *, term: str): async def imgur_search(self, ctx, *, term: str):
"""Searches Imgur for the specified term and returns up to 3 results""" """Searches Imgur for the specified term and returns up to 3 results"""
url = self.imgur_base_url + "time/all/0" url = self.imgur_base_url + "gallery/search/time/all/0"
params = {"q": term} params = {"q": term}
headers = {"Authorization": "Client-ID {}".format(await self.settings.imgur_client_id())} imgur_client_id = await self.settings.imgur_client_id()
async with self.session.get(url, headers=headers, data=params) as search_get: if not imgur_client_id:
await ctx.send(
_("A client ID has not been set! Please set one with {}").format(
"`{}imgurcreds`".format(ctx.prefix)))
return
headers = {"Authorization": "Client-ID {}".format(imgur_client_id)}
async with self.session.get(url, headers=headers, params=params) as search_get:
data = await search_get.json() data = await search_get.json()
if data["success"]: if data["success"]:
@@ -81,9 +86,16 @@ class Image:
elif sort_type == "top": elif sort_type == "top":
sort = "top" sort = "top"
imgur_client_id = await self.settings.imgur_client_id()
if not imgur_client_id:
await ctx.send(
_("A client ID has not been set! Please set one with {}").format(
"`{}imgurcreds`".format(ctx.prefix)))
return
links = [] links = []
headers = {"Authorization": "Client-ID {}".format(await self.settings.imgur_client_id())} headers = {"Authorization": "Client-ID {}".format(imgur_client_id)}
url = self.imgur_base_url + "r/{}/{}/{}/0".format(subreddit, sort, window) url = self.imgur_base_url + "gallery/r/{}/{}/{}/0".format(subreddit, sort, window)
async with self.session.get(url, headers=headers) as sub_get: async with self.session.get(url, headers=headers) as sub_get:
data = await sub_get.json() data = await sub_get.json()
@@ -111,6 +123,7 @@ class Image:
You can get these by visiting https://api.imgur.com/oauth2/addclient You can get these by visiting https://api.imgur.com/oauth2/addclient
and filling out the form. Enter a name for the application, select and filling out the form. Enter a name for the application, select
'Anonymous usage without user authorization' for the auth type, 'Anonymous usage without user authorization' for the auth type,
set the authorization callback url to 'https://localhost'
leave the app website blank, enter a valid email address, and leave the app website blank, enter a valid email address, and
enter a description. Check the box for the captcha, then click Next. enter a description. Check the box for the captcha, then click Next.
Your client ID will be on the page that loads""" Your client ID will be on the page that loads"""

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,29 +18,29 @@ msgstr ""
#: ../image.py:49 #: ../image.py:49
msgid "Your search returned no results" msgid "Your search returned no results"
msgstr "" msgstr "검색 결과가 반환되지 않았어요."
#: ../image.py:52 #: ../image.py:52
msgid "Search results...\n" msgid "Search results...\n"
msgstr "" msgstr "검색 중..."
#: ../image.py:58 ../image.py:100 #: ../image.py:58 ../image.py:100
msgid "Something went wrong. Error code is {}" msgid "Something went wrong. Error code is {}"
msgstr "" msgstr "뭔가 잘못됐어요, 오류 코드는 {} 이에요."
#: ../image.py:70 #: ../image.py:70
msgid "Only 'new' and 'top' are a valid sort type." msgid "Only 'new' and 'top' are a valid sort type."
msgstr "" msgstr "'new' 와 'top' 만이 사용 가능한 타입이에요."
#: ../image.py:98 ../image.py:135 ../image.py:157 #: ../image.py:98 ../image.py:135 ../image.py:157
msgid "No results found." msgid "No results found."
msgstr "" msgstr "결과를 찾을 수 없어요."
#: ../image.py:115 #: ../image.py:115
msgid "Set the imgur client id!" msgid "Set the imgur client id!"
msgstr "" msgstr "imgur 클라이언트 ID를 설정해야 해요!"
#: ../image.py:137 ../image.py:159 #: ../image.py:137 ../image.py:159
msgid "Error contacting the API" msgid "Error contacting the API"
msgstr "" msgstr "API에 연결하는 동안 오류가 발생했어요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,266 +18,270 @@ msgstr ""
#: ../mod.py:209 #: ../mod.py:209
msgid "Role hierarchy will be checked when moderation commands are issued." msgid "Role hierarchy will be checked when moderation commands are issued."
msgstr "" msgstr "Peran hirarki akan diperiksa ketika mengeluarkan perintah moderasi."
#: ../mod.py:213 #: ../mod.py:213
msgid "Role hierarchy will be ignored when moderation commands are issued." msgid "Role hierarchy will be ignored when moderation commands are issued."
msgstr "" msgstr "Peran hirarki akan diabaikan ketika mengeluarkan perintah moderasi."
#: ../mod.py:228 #: ../mod.py:228
msgid "Autoban for mention spam enabled. Anyone mentioning {} or more different people in a single message will be autobanned." msgid "Autoban for mention spam enabled. Anyone mentioning {} or more different people in a single message will be autobanned."
msgstr "" msgstr "Autoban untuk penyebutan berulang diaktifkan. Siapa pun yang menyebutkan {} atau orang-orang yang lebih berbeda dalam satu pesan akan di autobanned."
#: ../mod.py:239 #: ../mod.py:239
msgid "Autoban for mention spam disabled." msgid "Autoban for mention spam disabled."
msgstr "" msgstr "Autoban untuk penyebutan berulang dimatikan."
#: ../mod.py:249 #: ../mod.py:249
msgid "Messages repeated up to 3 times will be deleted." msgid "Messages repeated up to 3 times will be deleted."
msgstr "" msgstr "Pesan yang diulang sampai 3 kali akan dihapus."
#: ../mod.py:253 #: ../mod.py:253
msgid "Repeated messages will be ignored." msgid "Repeated messages will be ignored."
msgstr "" msgstr "Pesan yang diulang akan diabaikan."
#: ../mod.py:267 #: ../mod.py:267
msgid "Command deleting disabled." msgid "Command deleting disabled."
msgstr "" msgstr "Perintah menghapus dinonaktifkan."
#: ../mod.py:270 #: ../mod.py:270
msgid "Delete delay set to {} seconds." msgid "Delete delay set to {} seconds."
msgstr "" msgstr "Menghapus penundaan ditetapkan untuk {} detik."
#: ../mod.py:275 #: ../mod.py:275
msgid "Bot will delete command messages after {} seconds. Set this value to -1 to stop deleting messages" msgid "Bot will delete command messages after {} seconds. Set this value to -1 to stop deleting messages"
msgstr "" msgstr "Bot akan menghapus pesan perintah setelah {} detik. Set nilai ini ke-1 untuk menghentikan menghapus pesan"
#: ../mod.py:279 #: ../mod.py:279
msgid "I will not delete command messages." msgid "I will not delete command messages."
msgstr "" msgstr "Saya tidak akan menghapus pesan perintah."
#: ../mod.py:292 #: ../mod.py:292
msgid "Users unbanned with {} will be reinvited." msgid "Users unbanned with {} will be reinvited."
msgstr "" msgstr "Pengguna unbanned dengan {} akan diundang ulang."
#: ../mod.py:295 #: ../mod.py:295
msgid "Users unbanned with {} will not be reinvited." msgid "Users unbanned with {} will not be reinvited."
msgstr "" msgstr "Pengguna unbanned dengan {} akan tidak diundang ulang."
#: ../mod.py:309 ../mod.py:349 ../mod.py:506 #: ../mod.py:309 ../mod.py:349 ../mod.py:506
msgid "I cannot let you do that. Self-harm is bad {}" msgid "I cannot let you do that. Self-harm is bad {}"
msgstr "" msgstr "Saya tidak dapat membiarkan Anda melakukan itu. Merugikan diri sendiri adalah buruk {}"
#: ../mod.py:313 ../mod.py:353 ../mod.py:510 #: ../mod.py:313 ../mod.py:353 ../mod.py:510
msgid "I cannot let you do that. You are not higher than the user in the role hierarchy." msgid "I cannot let you do that. You are not higher than the user in the role hierarchy."
msgstr "" msgstr "Saya tidak dapat membiarkan Anda melakukan itu. Anda tidak lebih tinggi daripada pengguna dalam peran hirarki."
#: ../mod.py:323 ../mod.py:379 ../mod.py:570 #: ../mod.py:323 ../mod.py:379 ../mod.py:570
msgid "I'm not allowed to do that." msgid "I'm not allowed to do that."
msgstr "" msgstr "Saya tidak diizinkan untuk melakukan itu."
#: ../mod.py:327 #: ../mod.py:327
msgid "Done. That felt good." msgid "Done. That felt good."
msgstr "" msgstr "Selesai. Itu terasa baik."
#: ../mod.py:369 #: ../mod.py:369
msgid "Invalid days. Must be between 0 and 7." msgid "Invalid days. Must be between 0 and 7."
msgstr "" msgstr "Hari-hari tidak sah. Harus antara 0 dan 7."
#: ../mod.py:384 #: ../mod.py:384
msgid "Done. It was about time." msgid "Done. It was about time."
msgstr "" msgstr "Selesai. Itu hanya masalah waktu."
#: ../mod.py:413 #: ../mod.py:413
msgid "User is already banned." msgid "User is already banned."
msgstr "" msgstr "Pengguna sudah dibanned."
#: ../mod.py:429 #: ../mod.py:429
msgid "User not found. Have you provided the correct user ID?" msgid "User not found. Have you provided the correct user ID?"
msgstr "" msgstr "Pengguna tidak ditemukan. Sudahkah kamu memberikan ID pengguna yang benar?"
#: ../mod.py:433 #: ../mod.py:433
msgid "I lack the permissions to do this." msgid "I lack the permissions to do this."
msgstr "" msgstr "Saya tidak memiliki izin untuk melakukan ini."
#: ../mod.py:435 #: ../mod.py:435
msgid "Done. The user will not be able to join this guild." msgid "Done. The user will not be able to join this guild."
msgstr "" msgstr "Selesai. Pengguna tidak akan dapat bergabung dengan guild ini."
#: ../mod.py:472 #: ../mod.py:472
msgid "You have been temporarily banned from {} until {}. Here is an invite for when your ban expires: {}" msgid "You have been temporarily banned from {} until {}. Here is an invite for when your ban expires: {}"
msgstr "" msgstr "Anda telah banned untuk sementara dari {} sampai {}. Berikut adalah undangan untuk ketika ban anda berakhir: {}"
#: ../mod.py:481 #: ../mod.py:481
msgid "I can't do that for some reason." msgid "I can't do that for some reason."
msgstr "" msgstr "Saya tidak bisa melakukan itu untuk beberapa alasan."
#: ../mod.py:483 #: ../mod.py:483
msgid "Something went wrong while banning" msgid "Something went wrong while banning"
msgstr "" msgstr "Terjadi suatu kesalahan saat banning"
#: ../mod.py:485 #: ../mod.py:485
msgid "Done. Enough chaos for now" msgid "Done. Enough chaos for now"
msgstr "" msgstr "Selesai. Cukup kekacauan untuk sekarang"
#: ../mod.py:525 #: ../mod.py:525
msgid "You have been banned and then unbanned as a quick way to delete your messages.\n" msgid "You have been banned and then unbanned as a quick way to delete your messages.\n"
"You can now join the guild again. {}" "You can now join the guild again. {}"
msgstr "" msgstr "Anda telah banned dan kemudian unbanned sebagai cara cepat untuk menghapus pesan anda.\n"
"Anda sekarang dapat bergabung dengan guild lagi. {}"
#: ../mod.py:537 #: ../mod.py:537
msgid "My role is not high enough to softban that user." msgid "My role is not high enough to softban that user."
msgstr "" msgstr "Hirarki saya tidak cukup tinggi untuk softban pengguna."
#: ../mod.py:553 #: ../mod.py:553
msgid "Done. Enough chaos." msgid "Done. Enough chaos."
msgstr "" msgstr "Selesai. Cukup kekacauan."
#: ../mod.py:587 #: ../mod.py:587
msgid "Couldn't find a user with that ID!" msgid "Couldn't find a user with that ID!"
msgstr "" msgstr "Tidak dapat menemukan pengguna dengan ID tersebut!"
#: ../mod.py:593 #: ../mod.py:593
msgid "It seems that user isn't banned!" msgid "It seems that user isn't banned!"
msgstr "" msgstr "Tampaknya bahwa pengguna tidak di banned!"
#: ../mod.py:601 #: ../mod.py:601
msgid "Something went wrong while attempting to unban that user" msgid "Something went wrong while attempting to unban that user"
msgstr "" msgstr "Terjadi kesalahan saat mencoba untuk mengunban pengguna"
#: ../mod.py:604 #: ../mod.py:604
msgid "Unbanned that user from this guild" msgid "Unbanned that user from this guild"
msgstr "" msgstr "Unbanned pengguna dari guild ini"
#: ../mod.py:619 #: ../mod.py:619
msgid "You've been unbanned from {}.\n" msgid "You've been unbanned from {}.\n"
"Here is an invite for that guild: {}" "Here is an invite for that guild: {}"
msgstr "" msgstr "Anda telah di unbanned dari {}. Berikut adalah undangan untuk bergabung ke guild: {}"
#: ../mod.py:623 #: ../mod.py:623
msgid "I failed to send an invite to that user. Perhaps you may be able to send it for me?\n" msgid "I failed to send an invite to that user. Perhaps you may be able to send it for me?\n"
"Here's the invite link: {}" "Here's the invite link: {}"
msgstr "" msgstr "Saya gagal untuk mengirim undangan ke pengguna. Mungkin anda dapat mengirimkannya untuk saya?\n"
"Berikut adalah link mengundang: {}"
#: ../mod.py:629 #: ../mod.py:629
msgid "Something went wrong when attempting to send that useran invite. Here's the link so you can try: {}" msgid "Something went wrong when attempting to send that useran invite. Here's the link so you can try: {}"
msgstr "" msgstr "Terjadi kesalah saat mencoba untuk mengirim udangan ke pengguna. Ini adalah link yang bisa anda coba: {}"
#: ../mod.py:673 ../mod.py:710 #: ../mod.py:673 ../mod.py:710
msgid "No voice state for that user!" msgid "No voice state for that user!"
msgstr "" msgstr "Tidak ada sasaran pengguna suara!"
#: ../mod.py:687 #: ../mod.py:687
msgid "That user is already muted and deafened guild-wide!" msgid "That user is already muted and deafened guild-wide!"
msgstr "" msgstr "Pengguna berhasil dibisukan dan ditulikan secara global!"
#: ../mod.py:690 #: ../mod.py:690
msgid "User has been banned from speaking or listening in voice channels" msgid "User has been banned from speaking or listening in voice channels"
msgstr "" msgstr "Pengguna telah di banned dari berbicara atau mendengarkan channel voice"
#: ../mod.py:722 #: ../mod.py:722
msgid "That user isn't muted or deafened by the guild!" msgid "That user isn't muted or deafened by the guild!"
msgstr "" msgstr "Pengguna itu bisu atau tuli dari guild!"
#: ../mod.py:725 #: ../mod.py:725
msgid "User is now allowed to speak and listen in voice channels" msgid "User is now allowed to speak and listen in voice channels"
msgstr "" msgstr "Pengguna diizinkan untuk berbicara dan mendengarkan di channel voice"
#: ../mod.py:754 #: ../mod.py:754
msgid "I cannot do that, I lack the '{}' permission." msgid "I cannot do that, I lack the '{}' permission."
msgstr "" msgstr "Saya tidak dapat melakukan itu, saya tidak mempunyai izin '{}'."
#: ../mod.py:783 #: ../mod.py:783
msgid "Muted {}#{} in channel {}" msgid "Muted {}#{} in channel {}"
msgstr "" msgstr "Tidak diizinkan bersuara {}#{} di channel {}"
#: ../mod.py:797 #: ../mod.py:797
msgid "That user is already muted in {}!" msgid "That user is already muted in {}!"
msgstr "" msgstr "Pengguna sudah dibisukan di {}!"
#: ../mod.py:800 ../mod.py:932 #: ../mod.py:800 ../mod.py:932
msgid "That user is not in a voice channel right now!" msgid "That user is not in a voice channel right now!"
msgstr "" msgstr "Pengguna sedang tidak di dalam channel voice!"
#: ../mod.py:802 ../mod.py:934 #: ../mod.py:802 ../mod.py:934
msgid "No voice state for the target!" msgid "No voice state for the target!"
msgstr "" msgstr "Tidak ada sasaran target suara!"
#: ../mod.py:822 #: ../mod.py:822
msgid "User has been muted in this channel." msgid "User has been muted in this channel."
msgstr "" msgstr "Pengguna telah dibisukan di channel ini."
#: ../mod.py:858 #: ../mod.py:858
msgid "User has been muted in this guild." msgid "User has been muted in this guild."
msgstr "" msgstr "Pengguna telah dibisukan di guild ini."
#: ../mod.py:919 #: ../mod.py:919
msgid "Unmuted {}#{} in channel {}" msgid "Unmuted {}#{} in channel {}"
msgstr "" msgstr "Dizinkan bersuara {}#{} di channel {}"
#: ../mod.py:929 #: ../mod.py:929
msgid "That user is already unmuted in {}!" msgid "That user is already unmuted in {}!"
msgstr "" msgstr "Pengguna sudah tidak dibisukan di {}!"
#: ../mod.py:949 #: ../mod.py:949
msgid "User unmuted in this channel." msgid "User unmuted in this channel."
msgstr "" msgstr "Pengguna diizinkan bersuara di channel ini."
#: ../mod.py:958 #: ../mod.py:958
msgid "Unmute failed. Reason: {}" msgid "Unmute failed. Reason: {}"
msgstr "" msgstr "Menghidupkan suara gagal. Alasan: {}"
#: ../mod.py:981 #: ../mod.py:981
msgid "User has been unmuted in this guild." msgid "User has been unmuted in this guild."
msgstr "" msgstr "Pengguna sudah diizinkan bersuara di guild ini."
#: ../mod.py:1045 #: ../mod.py:1045
msgid "Channel added to ignore list." msgid "Channel added to ignore list."
msgstr "" msgstr "Saluran ditambahkan ke daftar abaikan."
#: ../mod.py:1047 #: ../mod.py:1047
msgid "Channel already in ignore list." msgid "Channel already in ignore list."
msgstr "" msgstr "Saluran sudah ada didalam daftar abaikan."
#: ../mod.py:1055 #: ../mod.py:1055
msgid "This guild has been added to the ignore list." msgid "This guild has been added to the ignore list."
msgstr "" msgstr "Guild ini sudah di tambahkan ke dalam daftar abaikan."
#: ../mod.py:1057 #: ../mod.py:1057
msgid "This guild is already being ignored." msgid "This guild is already being ignored."
msgstr "" msgstr "Guild ini sudah diabaikan."
#: ../mod.py:1078 #: ../mod.py:1078
msgid "Channel removed from ignore list." msgid "Channel removed from ignore list."
msgstr "" msgstr "Saluran di hapus dari dalam daftar abaikan."
#: ../mod.py:1080 #: ../mod.py:1080
msgid "That channel is not in the ignore list." msgid "That channel is not in the ignore list."
msgstr "" msgstr "Saluran sedang tidak ada di dalam daftar abaikan."
#: ../mod.py:1088 #: ../mod.py:1088
msgid "This guild has been removed from the ignore list." msgid "This guild has been removed from the ignore list."
msgstr "" msgstr "Guild ini sudah di hapus dari dalam daftar abaikan."
#: ../mod.py:1090 #: ../mod.py:1090
msgid "This guild is not in the ignore list." msgid "This guild is not in the ignore list."
msgstr "" msgstr "Guild ini sedang tidak berada didalam daftar abaikan."
#: ../mod.py:1102 #: ../mod.py:1102
msgid "Currently ignoring:\n" msgid "Currently ignoring:\n"
"{} channels\n" "{} channels\n"
"{} guilds\n" "{} guilds\n"
msgstr "" msgstr "Saat ini mengabaikan:\n"
"{} saluran\n"
"{} guilds\n"
#: ../mod.py:1133 #: ../mod.py:1133
msgid "**Past 20 names**:" msgid "**Past 20 names**:"
msgstr "" msgstr "**20 nama terakhir**:"
#: ../mod.py:1140 #: ../mod.py:1140
msgid "**Past 20 nicknames**:" msgid "**Past 20 nicknames**:"
msgstr "" msgstr "**20 julukan terakhir**:"
#: ../mod.py:1146 #: ../mod.py:1146
msgid "That user doesn't have any recorded name or nickname change." msgid "That user doesn't have any recorded name or nickname change."
msgstr "" msgstr "Pengguna tidak memiliki nama yang tercatat atau nama panggilan yang berubah."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:26-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,266 +18,270 @@ msgstr ""
#: ../mod.py:209 #: ../mod.py:209
msgid "Role hierarchy will be checked when moderation commands are issued." msgid "Role hierarchy will be checked when moderation commands are issued."
msgstr "" msgstr "절제 커맨드를 사용하면 역할 계층 구조가 검사돼요."
#: ../mod.py:213 #: ../mod.py:213
msgid "Role hierarchy will be ignored when moderation commands are issued." msgid "Role hierarchy will be ignored when moderation commands are issued."
msgstr "" msgstr "절제 커맨드를 사용하면 역할 계층은 무시될 거예요."
#: ../mod.py:228 #: ../mod.py:228
msgid "Autoban for mention spam enabled. Anyone mentioning {} or more different people in a single message will be autobanned." msgid "Autoban for mention spam enabled. Anyone mentioning {} or more different people in a single message will be autobanned."
msgstr "" msgstr "스팸 언급이 금지했어요. 한 메세지에서 {} 또는 그 이상의 다른 사용자를 언급하는 것이 금지됐어요."
#: ../mod.py:239 #: ../mod.py:239
msgid "Autoban for mention spam disabled." msgid "Autoban for mention spam disabled."
msgstr "" msgstr "스팸 언급 자동 밴 사용 안 함."
#: ../mod.py:249 #: ../mod.py:249
msgid "Messages repeated up to 3 times will be deleted." msgid "Messages repeated up to 3 times will be deleted."
msgstr "" msgstr "최대 3번 반복된 메세지가 삭제됐어요."
#: ../mod.py:253 #: ../mod.py:253
msgid "Repeated messages will be ignored." msgid "Repeated messages will be ignored."
msgstr "" msgstr "반복된 메세지는 무시됍니다."
#: ../mod.py:267 #: ../mod.py:267
msgid "Command deleting disabled." msgid "Command deleting disabled."
msgstr "" msgstr "커맨드 삭제 사용 안 함."
#: ../mod.py:270 #: ../mod.py:270
msgid "Delete delay set to {} seconds." msgid "Delete delay set to {} seconds."
msgstr "" msgstr "{} 초로 설정된 지연시간을 삭제했어요."
#: ../mod.py:275 #: ../mod.py:275
msgid "Bot will delete command messages after {} seconds. Set this value to -1 to stop deleting messages" msgid "Bot will delete command messages after {} seconds. Set this value to -1 to stop deleting messages"
msgstr "" msgstr "봇이 {} 초 후에 커맨드 메세지를 삭제해요. 메세지 삭제를 중지하려면 이 값을 -1로 설정해야 해요."
#: ../mod.py:279 #: ../mod.py:279
msgid "I will not delete command messages." msgid "I will not delete command messages."
msgstr "" msgstr "커맨드 메세지를 삭제하지 않을게요."
#: ../mod.py:292 #: ../mod.py:292
msgid "Users unbanned with {} will be reinvited." msgid "Users unbanned with {} will be reinvited."
msgstr "" msgstr "{} 으로 밴 처리된 사용자가 다시 초대됐어요."
#: ../mod.py:295 #: ../mod.py:295
msgid "Users unbanned with {} will not be reinvited." msgid "Users unbanned with {} will not be reinvited."
msgstr "" msgstr "{} 으로 밴 처리된 사용자는 다시 초대되지 않아요."
#: ../mod.py:309 ../mod.py:349 ../mod.py:506 #: ../mod.py:309 ../mod.py:349 ../mod.py:506
msgid "I cannot let you do that. Self-harm is bad {}" msgid "I cannot let you do that. Self-harm is bad {}"
msgstr "" msgstr "그렇게 하게 둘 수는 없어요. 자해는 나빠요. {}"
#: ../mod.py:313 ../mod.py:353 ../mod.py:510 #: ../mod.py:313 ../mod.py:353 ../mod.py:510
msgid "I cannot let you do that. You are not higher than the user in the role hierarchy." msgid "I cannot let you do that. You are not higher than the user in the role hierarchy."
msgstr "" msgstr "그렇게 하게 둘 수는 없어요. 역할 계층의 사용자보다 높지 않아요."
#: ../mod.py:323 ../mod.py:379 ../mod.py:570 #: ../mod.py:323 ../mod.py:379 ../mod.py:570
msgid "I'm not allowed to do that." msgid "I'm not allowed to do that."
msgstr "" msgstr "그렇게 하는 건 허용하지 않아요."
#: ../mod.py:327 #: ../mod.py:327
msgid "Done. That felt good." msgid "Done. That felt good."
msgstr "" msgstr "다 했어요. 앙 기분 좋아."
#: ../mod.py:369 #: ../mod.py:369
msgid "Invalid days. Must be between 0 and 7." msgid "Invalid days. Must be between 0 and 7."
msgstr "" msgstr "올바르지 않은 요일이에요. 0에서 7사이여야 해요."
#: ../mod.py:384 #: ../mod.py:384
msgid "Done. It was about time." msgid "Done. It was about time."
msgstr "" msgstr "다 했어요. 마피아는 고개를 들어주세요."
#: ../mod.py:413 #: ../mod.py:413
msgid "User is already banned." msgid "User is already banned."
msgstr "" msgstr "해당 사용자는 이미 밴 처리되어 있어요."
#: ../mod.py:429 #: ../mod.py:429
msgid "User not found. Have you provided the correct user ID?" msgid "User not found. Have you provided the correct user ID?"
msgstr "" msgstr "사용자를 찾을 수 없어요. 올바른 사용자 ID를 입력했나요?"
#: ../mod.py:433 #: ../mod.py:433
msgid "I lack the permissions to do this." msgid "I lack the permissions to do this."
msgstr "" msgstr "제게 행동할 수 있는 권한이 없어요."
#: ../mod.py:435 #: ../mod.py:435
msgid "Done. The user will not be able to join this guild." msgid "Done. The user will not be able to join this guild."
msgstr "" msgstr "다 했어요. 사용자는 이 길드에 가입할 수 없어요."
#: ../mod.py:472 #: ../mod.py:472
msgid "You have been temporarily banned from {} until {}. Here is an invite for when your ban expires: {}" msgid "You have been temporarily banned from {} until {}. Here is an invite for when your ban expires: {}"
msgstr "" msgstr "{} 부터 {} 까지 일시적으로 밴 처리됐어요. 다음은 사용자의 밴 처리가 만료되는 경우를 위한 초대예요 : {}"
#: ../mod.py:481 #: ../mod.py:481
msgid "I can't do that for some reason." msgid "I can't do that for some reason."
msgstr "" msgstr "왠지 모르겠어요."
#: ../mod.py:483 #: ../mod.py:483
msgid "Something went wrong while banning" msgid "Something went wrong while banning"
msgstr "" msgstr "밴 처리를 하는 동안 문제가 발생했어요."
#: ../mod.py:485 #: ../mod.py:485
msgid "Done. Enough chaos for now" msgid "Done. Enough chaos for now"
msgstr "" msgstr "다 했어요. 지금으로서는 충분히 혼란스러울 거예요."
#: ../mod.py:525 #: ../mod.py:525
msgid "You have been banned and then unbanned as a quick way to delete your messages.\n" msgid "You have been banned and then unbanned as a quick way to delete your messages.\n"
"You can now join the guild again. {}" "You can now join the guild again. {}"
msgstr "" msgstr "사용자님은 밴 처리됐어요, 하지만 사용자님의 밴 처리를 해제하려면 사용자님의 메세지를 빠르게 삭제해보세요. 이제 다시 길드에 가입할 수 있어요. {}"
#: ../mod.py:537 #: ../mod.py:537
msgid "My role is not high enough to softban that user." msgid "My role is not high enough to softban that user."
msgstr "" msgstr "제 역할이 그 사용자를 밴 할 만큼 충분하지 않습니다."
#: ../mod.py:553 #: ../mod.py:553
msgid "Done. Enough chaos." msgid "Done. Enough chaos."
msgstr "" msgstr "다 했어요. 충분히 혼란스러워요."
#: ../mod.py:587 #: ../mod.py:587
msgid "Couldn't find a user with that ID!" msgid "Couldn't find a user with that ID!"
msgstr "" msgstr "해당 ID를 가진 사용자를 찾을 수 없어요."
#: ../mod.py:593 #: ../mod.py:593
msgid "It seems that user isn't banned!" msgid "It seems that user isn't banned!"
msgstr "" msgstr "사용자들이 밴 처리되지 않은 것 같아요!"
#: ../mod.py:601 #: ../mod.py:601
msgid "Something went wrong while attempting to unban that user" msgid "Something went wrong while attempting to unban that user"
msgstr "" msgstr "해당 사용자의 밴 처리를 해제하는 동안 문제가 발생했어요."
#: ../mod.py:604 #: ../mod.py:604
msgid "Unbanned that user from this guild" msgid "Unbanned that user from this guild"
msgstr "" msgstr "이 길드에서 해당 사용자의 차단이 해제됐어요."
#: ../mod.py:619 #: ../mod.py:619
msgid "You've been unbanned from {}.\n" msgid "You've been unbanned from {}.\n"
"Here is an invite for that guild: {}" "Here is an invite for that guild: {}"
msgstr "" msgstr "{} 에서의 차단이 해제됬어요.\n"
"해당 길드 초대 링크 : {}"
#: ../mod.py:623 #: ../mod.py:623
msgid "I failed to send an invite to that user. Perhaps you may be able to send it for me?\n" msgid "I failed to send an invite to that user. Perhaps you may be able to send it for me?\n"
"Here's the invite link: {}" "Here's the invite link: {}"
msgstr "" msgstr "해당 사용자에게 초대를 보내지 못했어요. 혹시 저를 위해 보내 주실 수 있나요?\n"
"여기 초대 링크예요 : {}"
#: ../mod.py:629 #: ../mod.py:629
msgid "Something went wrong when attempting to send that useran invite. Here's the link so you can try: {}" msgid "Something went wrong when attempting to send that useran invite. Here's the link so you can try: {}"
msgstr "" msgstr "사용자에게 초대를 보내려고 할 때 문제가 발생했어요. 여기 링크를 클릭하면 다시 시도할 수 있어요 : {}"
#: ../mod.py:673 ../mod.py:710 #: ../mod.py:673 ../mod.py:710
msgid "No voice state for that user!" msgid "No voice state for that user!"
msgstr "" msgstr "해당 사용자에 대한 음성 상태가 없어요!"
#: ../mod.py:687 #: ../mod.py:687
msgid "That user is already muted and deafened guild-wide!" msgid "That user is already muted and deafened guild-wide!"
msgstr "" msgstr "해당 사용자는 이미 음소거 상태이고 길드 전체가 음소거 돼서 아무것도 안 들려요!"
#: ../mod.py:690 #: ../mod.py:690
msgid "User has been banned from speaking or listening in voice channels" msgid "User has been banned from speaking or listening in voice channels"
msgstr "" msgstr "사용자가 음성 채널에서 말하거나 듣는 것이 금지됐어요."
#: ../mod.py:722 #: ../mod.py:722
msgid "That user isn't muted or deafened by the guild!" msgid "That user isn't muted or deafened by the guild!"
msgstr "" msgstr "해당 사용자는 길드에 의해 음소거 되지 않았어요."
#: ../mod.py:725 #: ../mod.py:725
msgid "User is now allowed to speak and listen in voice channels" msgid "User is now allowed to speak and listen in voice channels"
msgstr "" msgstr "이제 사용자가 음성 채널에서 말하고 들을 수 있어요."
#: ../mod.py:754 #: ../mod.py:754
msgid "I cannot do that, I lack the '{}' permission." msgid "I cannot do that, I lack the '{}' permission."
msgstr "" msgstr "제게 '{}' 권한이 없어서 그리 할 수 없어요."
#: ../mod.py:783 #: ../mod.py:783
msgid "Muted {}#{} in channel {}" msgid "Muted {}#{} in channel {}"
msgstr "" msgstr "{}#{} 이(가) {} 채널에서 음소거 됐어요."
#: ../mod.py:797 #: ../mod.py:797
msgid "That user is already muted in {}!" msgid "That user is already muted in {}!"
msgstr "" msgstr "해당 사용자가 {} 에서 이미 음소거된 상태예요!"
#: ../mod.py:800 ../mod.py:932 #: ../mod.py:800 ../mod.py:932
msgid "That user is not in a voice channel right now!" msgid "That user is not in a voice channel right now!"
msgstr "" msgstr "해당 사용자는 지금 음성 채널에 있지 않아요!"
#: ../mod.py:802 ../mod.py:934 #: ../mod.py:802 ../mod.py:934
msgid "No voice state for the target!" msgid "No voice state for the target!"
msgstr "" msgstr "대상에 대한 음성 상태가 없어요!"
#: ../mod.py:822 #: ../mod.py:822
msgid "User has been muted in this channel." msgid "User has been muted in this channel."
msgstr "" msgstr "사용자가 이 채널에서 음소거 됐어요."
#: ../mod.py:858 #: ../mod.py:858
msgid "User has been muted in this guild." msgid "User has been muted in this guild."
msgstr "" msgstr "이 길드에서 해당 사용자가 음소거 됐어요."
#: ../mod.py:919 #: ../mod.py:919
msgid "Unmuted {}#{} in channel {}" msgid "Unmuted {}#{} in channel {}"
msgstr "" msgstr "{}#{} 이(가) {} 채널에서 음소거 해제됐어요."
#: ../mod.py:929 #: ../mod.py:929
msgid "That user is already unmuted in {}!" msgid "That user is already unmuted in {}!"
msgstr "" msgstr "해당 사용자가 {} 에서 이미 음소거가 해제되어 있어요!"
#: ../mod.py:949 #: ../mod.py:949
msgid "User unmuted in this channel." msgid "User unmuted in this channel."
msgstr "" msgstr "사용자가 이 채널에서 음소거를 해제했어요."
#: ../mod.py:958 #: ../mod.py:958
msgid "Unmute failed. Reason: {}" msgid "Unmute failed. Reason: {}"
msgstr "" msgstr "음소거 해제를 실패했어요. 이유 : {}"
#: ../mod.py:981 #: ../mod.py:981
msgid "User has been unmuted in this guild." msgid "User has been unmuted in this guild."
msgstr "" msgstr "사용자가 이 길드에서 음소거 해제됐어요."
#: ../mod.py:1045 #: ../mod.py:1045
msgid "Channel added to ignore list." msgid "Channel added to ignore list."
msgstr "" msgstr "채널이 무시 목록에 추가됐어요."
#: ../mod.py:1047 #: ../mod.py:1047
msgid "Channel already in ignore list." msgid "Channel already in ignore list."
msgstr "" msgstr "채널이 이미 무시 목록에 포함되어 있어요."
#: ../mod.py:1055 #: ../mod.py:1055
msgid "This guild has been added to the ignore list." msgid "This guild has been added to the ignore list."
msgstr "" msgstr "이 길드는 무시 목록에 추가됐어요."
#: ../mod.py:1057 #: ../mod.py:1057
msgid "This guild is already being ignored." msgid "This guild is already being ignored."
msgstr "" msgstr "이 길드는 이미 무시되고 있어요."
#: ../mod.py:1078 #: ../mod.py:1078
msgid "Channel removed from ignore list." msgid "Channel removed from ignore list."
msgstr "" msgstr "채널이 무시 목록에서 제거됐어요."
#: ../mod.py:1080 #: ../mod.py:1080
msgid "That channel is not in the ignore list." msgid "That channel is not in the ignore list."
msgstr "" msgstr "해당 채널은 무시 목록에 없어요."
#: ../mod.py:1088 #: ../mod.py:1088
msgid "This guild has been removed from the ignore list." msgid "This guild has been removed from the ignore list."
msgstr "" msgstr "이 길드는 무시 목록에서 제거됐어요."
#: ../mod.py:1090 #: ../mod.py:1090
msgid "This guild is not in the ignore list." msgid "This guild is not in the ignore list."
msgstr "" msgstr "이 길드는 무시 목록에 포함되어 있지 않아요."
#: ../mod.py:1102 #: ../mod.py:1102
msgid "Currently ignoring:\n" msgid "Currently ignoring:\n"
"{} channels\n" "{} channels\n"
"{} guilds\n" "{} guilds\n"
msgstr "" msgstr "현재 무시 중 :\n"
"{}개의 채널\n"
"{} 길드"
#: ../mod.py:1133 #: ../mod.py:1133
msgid "**Past 20 names**:" msgid "**Past 20 names**:"
msgstr "" msgstr "**20개의 이름 초과** :"
#: ../mod.py:1140 #: ../mod.py:1140
msgid "**Past 20 nicknames**:" msgid "**Past 20 nicknames**:"
msgstr "" msgstr "**20개의 닉네임을 초과** :"
#: ../mod.py:1146 #: ../mod.py:1146
msgid "That user doesn't have any recorded name or nickname change." msgid "That user doesn't have any recorded name or nickname change."
msgstr "" msgstr "해당 사용자에게 기록된 이름이나 닉네임이 없어요."

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -328,8 +328,8 @@ class Mod:
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "kick", user, author, self.bot, guild, ctx.message.created_at, "kick",
reason, until=None, channel=None user, author, reason, until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -389,8 +389,8 @@ class Mod:
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "ban", user, author, self.bot, guild, ctx.message.created_at, "ban",
reason, until=None, channel=None user, author, reason, until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -442,8 +442,8 @@ class Mod:
user_info = await self.bot.get_user_info(user_id) user_info = await self.bot.get_user_info(user_id)
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "hackban", user_info, author, self.bot, guild, ctx.message.created_at, "hackban",
reason, until=None, channel=None user_info, author, reason, until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -490,7 +490,7 @@ class Mod:
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "tempban", self.bot, guild, ctx.message.created_at, "tempban",
user, author, reason, unban_time user, author, reason, unban_time
) )
except RuntimeError as e: except RuntimeError as e:
@@ -560,6 +560,7 @@ class Mod:
user.name, user.id)) user.name, user.id))
try: try:
await modlog.create_case( await modlog.create_case(
self.bot,
guild, guild,
ctx.message.created_at, ctx.message.created_at,
"softban", "softban",
@@ -609,8 +610,8 @@ class Mod:
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "unban", user, author, self.bot, guild, ctx.message.created_at, "unban",
reason, until=None, channel=None user, author, reason, until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -697,8 +698,8 @@ class Mod:
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "voiceban", user, author, self.bot, guild, ctx.message.created_at, "voiceban",
reason, until=None, channel=None user, author, reason, until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -732,8 +733,8 @@ class Mod:
author = ctx.author author = ctx.author
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "voiceunban", user, author, self.bot, guild, ctx.message.created_at, "voiceunban",
reason, until=None, channel=None user, author, reason, until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -791,8 +792,8 @@ class Mod:
) )
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "boicemute", user, author, self.bot, guild, ctx.message.created_at, "boicemute",
reason, until=None, channel=channel user, author, reason, until=None, channel=channel
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -826,8 +827,8 @@ class Mod:
await channel.send(_("User has been muted in this channel.")) await channel.send(_("User has been muted in this channel."))
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "cmute", user, author, self.bot, guild, ctx.message.created_at, "cmute",
reason, until=None, channel=channel user, author, reason, until=None, channel=channel
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -862,8 +863,8 @@ class Mod:
await ctx.send(_("User has been muted in this guild.")) await ctx.send(_("User has been muted in this guild."))
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "smute", user, author, self.bot, guild, ctx.message.created_at, "smute",
reason, until=None, channel=None user, author, reason, until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -924,8 +925,8 @@ class Mod:
user.name, user.discriminator, channel.name)) user.name, user.discriminator, channel.name))
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "voiceunmute", user, author, self.bot, guild, ctx.message.created_at, "voiceunmute",
reason, until=None, channel=channel user, author, reason, until=None, channel=channel
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -953,8 +954,8 @@ class Mod:
await ctx.send(_("User unmuted in this channel.")) await ctx.send(_("User unmuted in this channel."))
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "cunmute", user, author, self.bot, guild, ctx.message.created_at, "cunmute",
reason, until=None, channel=channel user, author, reason, until=None, channel=channel
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -985,8 +986,8 @@ class Mod:
await ctx.send(_("User has been unmuted in this guild.")) await ctx.send(_("User has been unmuted in this guild."))
try: try:
await modlog.create_case( await modlog.create_case(
guild, ctx.message.created_at, "sunmute", user, author, self.bot, guild, ctx.message.created_at, "sunmute",
reason, until=None, channel=channel user, author, reason, until=None, channel=channel
) )
except RuntimeError as e: except RuntimeError as e:
await ctx.send(e) await ctx.send(e)
@@ -1209,8 +1210,8 @@ class Mod:
else: else:
try: try:
case = await modlog.create_case( case = await modlog.create_case(
guild, message.created_at, "ban", author, guild.me, self.bot, guild, message.created_at, "ban", author,
"Mention spam (Autoban)", until=None, channel=None guild.me, "Mention spam (Autoban)", until=None, channel=None
) )
except RuntimeError as e: except RuntimeError as e:
print(e) print(e)
@@ -1269,7 +1270,7 @@ class Mod:
if date is None: if date is None:
date = datetime.now() date = datetime.now()
try: try:
await modlog.create_case(guild, date, await modlog.create_case(self.bot, guild, date,
"ban", member, mod, "ban", member, mod,
reason if reason else None) reason if reason else None)
except RuntimeError as e: except RuntimeError as e:
@@ -1288,7 +1289,7 @@ class Mod:
if date is None: if date is None:
date = datetime.now() date = datetime.now()
try: try:
await modlog.create_case(guild, date, "unban", await modlog.create_case(self.bot, guild, date, "unban",
user, mod, reason) user, mod, reason)
except RuntimeError as e: except RuntimeError as e:
print(e) print(e)

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:33-0500\n" "PO-Revision-Date: 2018-02-27 01:49-0500\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Pirate English\n" "Language-Team: Pirate English\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: red-discordbot\n" "Project-Id-Version: red-discordbot\n"
"POT-Creation-Date: 2018-02-18 14:42+AKST\n" "POT-Creation-Date: 2018-02-18 14:42+AKST\n"
"PO-Revision-Date: 2018-02-25 21:34-0500\n" "PO-Revision-Date: 2018-04-02 19:27-0400\n"
"Last-Translator: Kowlin <boxedpp@gmail.com>\n" "Last-Translator: Kowlin <boxedpp@gmail.com>\n"
"Language-Team: Indonesian\n" "Language-Team: Indonesian\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,45 +18,45 @@ msgstr ""
#: ../modlog.py:36 #: ../modlog.py:36
msgid "Mod events will be sent to {}" msgid "Mod events will be sent to {}"
msgstr "" msgstr "Peristiwa mod akan dikirim ke {}"
#: ../modlog.py:42 #: ../modlog.py:42
msgid "I do not have permissions to send messages in {}!" msgid "I do not have permissions to send messages in {}!"
msgstr "" msgstr "Saya tidak memiliki izin untuk mengirim pesan di {}!"
#: ../modlog.py:52 #: ../modlog.py:52
msgid "Mod log deactivated." msgid "Mod log deactivated."
msgstr "" msgstr "Mod log dinonaktifkan."
#: ../modlog.py:63 #: ../modlog.py:63
msgid "Current settings:" msgid "Current settings:"
msgstr "" msgstr "Pengaturan saat ini:"
#: ../modlog.py:75 #: ../modlog.py:75
msgid "That action is not registered" msgid "That action is not registered"
msgstr "" msgstr "Tindakan tersebut tidak terdaftar"
#: ../modlog.py:82 #: ../modlog.py:82
msgid "Case creation for {} actions is now {}." msgid "Case creation for {} actions is now {}."
msgstr "" msgstr "Penciptaan kasus untuk {} tindakan sekarang {}."
#: ../modlog.py:94 #: ../modlog.py:94
msgid "Cases have been reset." msgid "Cases have been reset."
msgstr "" msgstr "Kasus telah di setel ulang."
#: ../modlog.py:103 #: ../modlog.py:103
msgid "That case does not exist for that guild" msgid "That case does not exist for that guild"
msgstr "" msgstr "Kasus untuk guild tersebut tidak ada"
#: ../modlog.py:122 #: ../modlog.py:122
msgid "That case does not exist!" msgid "That case does not exist!"
msgstr "" msgstr "Kasus tersebut tidak ada!"
#: ../modlog.py:146 #: ../modlog.py:146
msgid "You are not authorized to modify that case!" msgid "You are not authorized to modify that case!"
msgstr "" msgstr "Anda tidak diizinkan untuk mengubah kasus tersebut!"
#: ../modlog.py:155 #: ../modlog.py:155
msgid "Reason has been updated." msgid "Reason has been updated."
msgstr "" msgstr "Alasan telah di perbarui."

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