mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-12-06 17:32:31 -05:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f4a7f7623 | ||
|
|
10012c1e16 | ||
|
|
d65f8856f4 | ||
|
|
d79d8fbbea | ||
|
|
772590c41c | ||
|
|
d9c71bddb8 | ||
|
|
29ce2401ca | ||
|
|
720ef38886 | ||
|
|
728ab6c8c1 | ||
|
|
935028addc | ||
|
|
e70e22d557 | ||
|
|
f3db4b5cb0 | ||
|
|
d60fc06379 | ||
|
|
a813260717 | ||
|
|
10d01df7dd | ||
|
|
8eb075fa86 | ||
|
|
c2e7bfa641 | ||
|
|
2f23244937 | ||
|
|
9ecea9e1d5 | ||
|
|
61b34e835e | ||
|
|
4e2b83c052 | ||
|
|
45ee4755a6 | ||
|
|
59281afe90 | ||
|
|
cf5a63a5d5 | ||
|
|
96869074c3 | ||
|
|
c107d5fa7f | ||
|
|
bed56e8891 |
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -21,6 +21,7 @@ redbot/core/rpc.py @tekulvw
|
||||
redbot/core/sentry_setup.py @Kowlin @tekulvw
|
||||
redbot/core/utils/chat_formatting.py @tekulvw
|
||||
redbot/core/utils/mod.py @palmtree5
|
||||
redbot/core/utils/data_converter.py @mikeshardmind
|
||||
|
||||
# Cogs
|
||||
redbot/cogs/admin/* @tekulvw
|
||||
@@ -38,6 +39,7 @@ redbot/cogs/mod/* @palmtree5
|
||||
redbot/cogs/modlog/* @palmtree5
|
||||
redbot/cogs/streams/* @Twentysix26 @palmtree5
|
||||
redbot/cogs/trivia/* @Tobotimus
|
||||
redbot/cogs/dataconverter/* @mikeshardmind
|
||||
|
||||
# Docs
|
||||
docs/* @tekulvw @palmtree5
|
||||
|
||||
14
.readthedocs.yml
Normal file
14
.readthedocs.yml
Normal 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
|
||||
62
docs/cog_dataconverter.rst
Normal file
62
docs/cog_dataconverter.rst
Normal 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'
|
||||
@@ -55,7 +55,7 @@ master_doc = 'index'
|
||||
|
||||
# General information about the project.
|
||||
project = 'Red - Discord Bot'
|
||||
copyright = '2017, Cog Creators'
|
||||
copyright = '2018, Cog Creators'
|
||||
author = 'Cog Creators'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
@@ -63,9 +63,9 @@ author = 'Cog Creators'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '3.0.0a1'
|
||||
version = '3.0.0b11'
|
||||
# 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
|
||||
# for a list of supported languages.
|
||||
|
||||
19
docs/framework_bot.rst
Normal file
19
docs/framework_bot.rst
Normal 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
8
docs/framework_rpc.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
.. rpc docs
|
||||
|
||||
===
|
||||
RPC
|
||||
===
|
||||
|
||||
.. automodule:: redbot.core.rpc
|
||||
:members:
|
||||
@@ -10,8 +10,20 @@ Chat Formatting
|
||||
.. automodule:: redbot.core.utils.chat_formatting
|
||||
:members:
|
||||
|
||||
Embed Helpers
|
||||
=============
|
||||
|
||||
.. automodule:: redbot.core.utils.embed
|
||||
:members:
|
||||
|
||||
Mod Helpers
|
||||
===========
|
||||
|
||||
.. automodule:: redbot.core.utils.mod
|
||||
:members:
|
||||
|
||||
V2 Data Conversion
|
||||
==================
|
||||
|
||||
.. automodule:: redbot.core.utils.data_converter
|
||||
:members: DataConverter
|
||||
154
docs/guide_data_conversion.rst
Normal file
154
docs/guide_data_conversion.rst
Normal 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`
|
||||
@@ -16,6 +16,7 @@ Welcome to Red - Discord Bot's documentation!
|
||||
install_debian
|
||||
install_centos
|
||||
install_raspbian
|
||||
cog_dataconverter
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
@@ -29,14 +30,18 @@ Welcome to Red - Discord Bot's documentation!
|
||||
|
||||
guide_migration
|
||||
guide_cog_creation
|
||||
guide_data_conversion
|
||||
framework_bank
|
||||
framework_bot
|
||||
framework_cogmanager
|
||||
framework_datamanager
|
||||
framework_config
|
||||
framework_context
|
||||
framework_datamanager
|
||||
framework_downloader
|
||||
framework_events
|
||||
framework_i18n
|
||||
framework_modlog
|
||||
framework_context
|
||||
framework_rpc
|
||||
framework_utils
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
sphinx==1.6.3
|
||||
sphinx==1.6.5
|
||||
sphinxcontrib-asyncio
|
||||
sphinx_rtd_theme
|
||||
git+https://github.com/Rapptz/discord.py@rewrite#egg=discord.py[voice]
|
||||
|
||||
@@ -96,15 +96,18 @@ def list_instances():
|
||||
|
||||
|
||||
def main():
|
||||
description = "Red - Version {}".format(__version__)
|
||||
cli_flags = parse_cli_flags(sys.argv[1:])
|
||||
if cli_flags.list_instances:
|
||||
list_instances()
|
||||
elif cli_flags.version:
|
||||
print(description)
|
||||
sys.exit(0)
|
||||
elif not cli_flags.instance_name:
|
||||
print("Error: No instance name was provided!")
|
||||
sys.exit(1)
|
||||
load_basic_configuration(cli_flags.instance_name)
|
||||
log, sentry_log = init_loggers(cli_flags)
|
||||
description = "Red - Version {}".format(__version__)
|
||||
red = Red(cli_flags, description=description, pm_help=None)
|
||||
init_global_checks(red)
|
||||
init_events(red, cli_flags)
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -22,15 +22,15 @@ msgstr "Arrr, no prefix found capt'n!"
|
||||
|
||||
#: ../alias.py:198
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
msgid "A new global alias with the trigger `{}` has been created."
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -22,15 +22,15 @@ msgstr "Awalan tidak ditemukan."
|
||||
|
||||
#: ../alias.py:198
|
||||
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
|
||||
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
|
||||
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
|
||||
msgid "A new alias with the trigger `{}` has been created."
|
||||
@@ -38,15 +38,15 @@ msgstr "Alias baru dengan pemicu '{}' telah dibuat."
|
||||
|
||||
#: ../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."
|
||||
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
|
||||
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
|
||||
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
|
||||
msgid "A new global alias with the trigger `{}` has been created."
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,73 +18,73 @@ msgstr ""
|
||||
|
||||
#: ../alias.py:129
|
||||
msgid "No prefix found."
|
||||
msgstr "접두사가 발견되지 않았습니다."
|
||||
msgstr "프리픽스를 찾을 수 없어요."
|
||||
|
||||
#: ../alias.py:198
|
||||
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
|
||||
msgid "You attempted to create a new alias with the name {} but that alias already exists on this server."
|
||||
msgstr ""
|
||||
msgstr "이름이 {} 인 바로가기를 만들려고 했지만, 해당 바로가기가 이미 이 서버에 등록되어 있어요."
|
||||
|
||||
#: ../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."
|
||||
msgstr ""
|
||||
msgstr "이름이 {} 인 바로가기를 만들려고 했지만, 잘못된 바로가기 이름에요. 바로가기 이름에는 공백이 포함될 수 없어요."
|
||||
|
||||
#: ../alias.py:224
|
||||
msgid "A new alias with the trigger `{}` has been created."
|
||||
msgstr "`{}`로 발동되는 바로가기가 생성되었습니다."
|
||||
msgstr "트리거 `{}` 이(가) 포함된 별칭이 등록됐어요."
|
||||
|
||||
#: ../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."
|
||||
msgstr ""
|
||||
msgstr "이름이 {} 인 글로벌 별칭을 만들려고 했지만, 이 봇의 커맨드와 중복돼요."
|
||||
|
||||
#: ../alias.py:243
|
||||
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
|
||||
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
|
||||
msgid "A new global alias with the trigger `{}` has been created."
|
||||
msgstr "`{}`로 발동되는 전역 바로가기가 생성 되었습니다."
|
||||
msgstr "트리거 `{}` 이(가) 포함된 글로벌 별칭이 등록됐어요."
|
||||
|
||||
#: ../alias.py:274
|
||||
msgid "No such alias exists."
|
||||
msgstr "해당 바로가기가 없습니다."
|
||||
msgstr "그런 별칭은 등록되어 있지 않아요."
|
||||
|
||||
#: ../alias.py:283
|
||||
msgid "The `{}` alias will execute the command `{}`"
|
||||
msgstr "바로가기 `{}`는 명령어 `{}` 를 실행 합니다."
|
||||
msgstr "`{}` 별칭이 `{}` 커맨드를 실행했어요."
|
||||
|
||||
#: ../alias.py:286
|
||||
msgid "There is no alias with the name `{}`"
|
||||
msgstr "`{}`로 지정된 바로가기가 없습니다."
|
||||
msgstr "`{}` 이란 이름으로 등록된 별칭이 없어요."
|
||||
|
||||
#: ../alias.py:298
|
||||
msgid "There are no aliases on this guild."
|
||||
msgstr "이 길드에는 바로가기가 없습니다."
|
||||
msgstr "이 길드에 등록된 별칭이 없어요."
|
||||
|
||||
#: ../alias.py:302 ../alias.py:320
|
||||
msgid "Alias with the name `{}` was successfully deleted."
|
||||
msgstr "바로가기 `{}` 가 성공적으로 삭제 되었습니다."
|
||||
msgstr "별칭 `{}` 이(가) 성공적으로 삭제됐어요."
|
||||
|
||||
#: ../alias.py:305 ../alias.py:323
|
||||
msgid "Alias with name `{}` was not found."
|
||||
msgstr "바로가기 `{}` 가 발견되지 않았습니다."
|
||||
msgstr "`{}` 바로가기가 등록되어 있지 않아요."
|
||||
|
||||
#: ../alias.py:316
|
||||
msgid "There are no aliases on this bot."
|
||||
msgstr "이 봇에는 바로가기가 없습니다."
|
||||
msgstr "이 봇에 등록된 별칭이 없어요."
|
||||
|
||||
#: ../alias.py:331 ../alias.py:342
|
||||
msgid "Aliases:"
|
||||
msgstr "바로가기 리스트:"
|
||||
msgstr "등록된 별칭 리스트 :"
|
||||
|
||||
#: ../alias.py:333 ../alias.py:344
|
||||
msgid "There are no aliases on this server."
|
||||
msgstr "이 서버에는 별칭이 없습니다."
|
||||
msgstr "이 서버에 등록된 별칭이 없어요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -22,15 +22,15 @@ msgstr "Префикс не найден."
|
||||
|
||||
#: ../alias.py:198
|
||||
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
|
||||
msgid "You attempted to create a new alias with the name {} but that alias already exists on this server."
|
||||
msgstr ""
|
||||
msgstr "Вы пытались создать новый псевдоним с именем {}, но это имя используется как команда на этом сервере."
|
||||
|
||||
#: ../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."
|
||||
msgstr ""
|
||||
msgstr "Вы пытались создать новый псевдоним с именем {}, но это имя является недопустимым псевдонимом. Имена псевдонимов не могут содержать пробелы."
|
||||
|
||||
#: ../alias.py:224
|
||||
msgid "A new alias with the trigger `{}` has been created."
|
||||
@@ -38,15 +38,15 @@ msgstr "Был создан новый псевдоним с триггером
|
||||
|
||||
#: ../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."
|
||||
msgstr ""
|
||||
msgstr "Вы пытались создать новый глобальный псевдоним с именем {}, но это имя уже используется как команда в этом боте."
|
||||
|
||||
#: ../alias.py:243
|
||||
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
|
||||
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
|
||||
msgid "A new global alias with the trigger `{}` has been created."
|
||||
@@ -86,5 +86,5 @@ msgstr "Алиасы:"
|
||||
|
||||
#: ../alias.py:333 ../alias.py:344
|
||||
msgid "There are no aliases on this server."
|
||||
msgstr "На этом сервере еще нет алиасов."
|
||||
msgstr "На этом сервере нет псевдонимов."
|
||||
|
||||
|
||||
@@ -50,7 +50,6 @@ async def setup(bot: commands.Bot):
|
||||
await start_lavalink_server(bot.loop)
|
||||
|
||||
async def _finish():
|
||||
await asyncio.sleep(10)
|
||||
await cog.init_config()
|
||||
bot.add_cog(cog)
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@ import heapq
|
||||
import lavalink
|
||||
import math
|
||||
from discord.ext import commands
|
||||
from redbot.core import Config, checks
|
||||
from redbot.core import Config, checks, bank
|
||||
|
||||
from .manager import shutdown_lavalink_server
|
||||
|
||||
__version__ = "0.0.3a"
|
||||
__version__ = "0.0.4"
|
||||
__author__ = ["aikaterna", "billy/bollo/ati"]
|
||||
|
||||
|
||||
@@ -28,14 +28,21 @@ class Audio:
|
||||
}
|
||||
|
||||
default_guild = {
|
||||
"dj_enabled": False,
|
||||
"dj_role": None,
|
||||
"jukebox": False,
|
||||
"jukebox_price": 0,
|
||||
"notify": False,
|
||||
"repeat": False,
|
||||
"shuffle": False,
|
||||
"volume": 100
|
||||
"volume": 100,
|
||||
"vote_enabled": False,
|
||||
"vote_percent": 0
|
||||
}
|
||||
|
||||
self.config.register_guild(**default_guild)
|
||||
self.config.register_global(**default_global)
|
||||
self.skip_votes = {}
|
||||
|
||||
async def init_config(self):
|
||||
host = await self.config.host()
|
||||
@@ -44,7 +51,7 @@ class Audio:
|
||||
ws_port = await self.config.ws_port()
|
||||
|
||||
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)
|
||||
|
||||
@@ -65,6 +72,7 @@ class Audio:
|
||||
player.store('prev_requester', requester)
|
||||
player.store('playing_song', player.current.uri)
|
||||
player.store('requester', player.current.requester)
|
||||
self.skip_votes[player.channel.guild] = []
|
||||
|
||||
if event_type == lavalink.LavalinkEvents.TRACK_START and notify:
|
||||
notify_channel = player.fetch('channel')
|
||||
@@ -108,48 +116,126 @@ class Audio:
|
||||
type=discord.ActivityType.playing))
|
||||
|
||||
@commands.group()
|
||||
@checks.is_owner()
|
||||
@commands.guild_only()
|
||||
async def audioset(self, ctx):
|
||||
"""Music configuration options."""
|
||||
if ctx.invoked_subcommand is None:
|
||||
await ctx.send_help()
|
||||
|
||||
@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):
|
||||
"""Toggle song announcement and other bot messages."""
|
||||
notify = await self.config.guild(ctx.guild).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(get_notify))
|
||||
await self._embed_msg(ctx, 'Verbose mode on: {}.'.format(not notify))
|
||||
|
||||
@audioset.command()
|
||||
async def settings(self, ctx):
|
||||
"""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()
|
||||
shuffle = await self.config.guild(ctx.guild).shuffle()
|
||||
repeat = await self.config.guild(ctx.guild).repeat()
|
||||
|
||||
msg = '```ini\n'
|
||||
msg += '----Guild Settings----\n'
|
||||
msg += 'audioset notify: [{}]\n'.format(notify)
|
||||
msg += 'audioset status: [{}]\n'.format(status)
|
||||
msg += 'Repeat: [{}]\n'.format(repeat)
|
||||
msg += 'Shuffle: [{}]\n'.format(shuffle)
|
||||
msg += '---Lavalink Settings---\n'
|
||||
msg += 'Cog version: {}\n```'.format(__version__)
|
||||
vote_percent = data['vote_percent']
|
||||
msg = ('```ini\n'
|
||||
'----Guild Settings----\n')
|
||||
if dj_enabled:
|
||||
msg += 'DJ Role: [{}]\n'.format(dj_role_obj.name)
|
||||
if jukebox:
|
||||
msg += 'Jukebox: [{0}]\n'.format(jukebox)
|
||||
msg += 'Command price: [{0}]\n'.format(jukebox_price)
|
||||
msg += ('Repeat: [{repeat}]\n'
|
||||
'Shuffle: [{shuffle}]\n'
|
||||
'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)
|
||||
return await ctx.send(embed=embed)
|
||||
|
||||
@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()
|
||||
@audioset.command()
|
||||
async def status(self, ctx):
|
||||
"""Enables/disables songs' titles as status."""
|
||||
status = await self.config.status()
|
||||
await self.config.status.set(not status)
|
||||
get_status = await self.config.status()
|
||||
await self._embed_msg(ctx, 'Song titles as status: {}.'.format(get_status))
|
||||
await self._embed_msg(ctx, 'Song titles as status: {}.'.format(not status))
|
||||
|
||||
@commands.command()
|
||||
async def audiostats(self, ctx):
|
||||
@@ -177,10 +263,16 @@ class Audio:
|
||||
@commands.command()
|
||||
async def bump(self, ctx, index: int):
|
||||
"""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):
|
||||
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 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:
|
||||
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'])
|
||||
async def disconnect(self, ctx):
|
||||
"""Disconnect from the voice channel."""
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
if self._player_check(ctx):
|
||||
if dj_enabled:
|
||||
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()
|
||||
await lavalink.get_player(ctx.guild.id).disconnect()
|
||||
return await lavalink.get_player(ctx.guild.id).disconnect()
|
||||
|
||||
@commands.command(aliases=['np', 'n', 'song'])
|
||||
async def now(self, ctx):
|
||||
"""Now playing."""
|
||||
if not self._player_check(ctx):
|
||||
return await self._embed_msg(ctx, 'Nothing playing.')
|
||||
expected = ['⏮', '⏹', '⏸', '⏭']
|
||||
expected = ('⏮', '⏹', '⏸', '⏭')
|
||||
emoji = {
|
||||
'prev': '⏮',
|
||||
'stop': '⏹',
|
||||
@@ -210,7 +309,6 @@ class Audio:
|
||||
'next': '⏭'
|
||||
}
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
song = 'Nothing'
|
||||
if player.current:
|
||||
arrow = await self._draw_time(ctx)
|
||||
pos = lavalink.utils.format_time(player.position)
|
||||
@@ -235,20 +333,24 @@ class Audio:
|
||||
message = await ctx.send(embed=embed)
|
||||
player.store('np_message', message)
|
||||
|
||||
def check(r, u):
|
||||
return r.message.id == message.id and u == ctx.message.author
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
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:
|
||||
for i in range(4):
|
||||
await message.add_reaction(expected[i])
|
||||
|
||||
def check(r, u):
|
||||
return r.message.id == message.id and u == ctx.message.author
|
||||
try:
|
||||
(r, u) = await self.bot.wait_for('reaction_add', check=check, timeout=10.0)
|
||||
except asyncio.TimeoutError:
|
||||
return await self._clear_react(message)
|
||||
|
||||
reacts = {v: k for k, v in emoji.items()}
|
||||
react = reacts[r.emoji]
|
||||
|
||||
if react == 'prev':
|
||||
await self._clear_react(message)
|
||||
await ctx.invoke(self.prev)
|
||||
@@ -265,13 +367,19 @@ class Audio:
|
||||
@commands.command(aliases=['resume'])
|
||||
async def pause(self, ctx):
|
||||
"""Pause and resume."""
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
if not self._player_check(ctx):
|
||||
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:
|
||||
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.')
|
||||
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()
|
||||
embed = discord.Embed(
|
||||
colour=ctx.guild.me.top_role.colour, title='Track Paused',
|
||||
@@ -282,7 +390,7 @@ class Audio:
|
||||
)
|
||||
return await ctx.send(embed=embed)
|
||||
|
||||
if player.paused:
|
||||
if player.paused and command == 'resume':
|
||||
await player.pause(False)
|
||||
embed = discord.Embed(
|
||||
colour=ctx.guild.me.top_role.colour,
|
||||
@@ -294,6 +402,10 @@ class Audio:
|
||||
)
|
||||
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.')
|
||||
|
||||
@commands.command()
|
||||
@@ -303,7 +415,6 @@ class Audio:
|
||||
return await self._embed_msg(ctx, 'Nothing playing.')
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
queue_tracks = player.queue
|
||||
queue_len = len(queue_tracks)
|
||||
requesters = {'total': 0, 'users': {}}
|
||||
|
||||
async def _usercount(req_username):
|
||||
@@ -340,17 +451,28 @@ class Audio:
|
||||
@commands.command(aliases=['p'])
|
||||
async def play(self, ctx, *, query):
|
||||
"""Play a URL or search for a song."""
|
||||
if not ctx.author.voice:
|
||||
return await self._embed_msg(ctx, 'You must be in the voice channel to use the play command.')
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
jukebox_price = await self.config.guild(ctx.guild).jukebox_price()
|
||||
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)
|
||||
shuffle = await self.config.guild(ctx.guild).shuffle()
|
||||
player.store('channel', ctx.channel.id)
|
||||
player.store('guild', ctx.guild.id)
|
||||
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('<>')
|
||||
if not query.startswith('http'):
|
||||
@@ -388,9 +510,14 @@ class Audio:
|
||||
"""Skips to the start of the previously played track."""
|
||||
if not self._player_check(ctx):
|
||||
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)
|
||||
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.')
|
||||
if shuffle:
|
||||
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,
|
||||
description=queue_list)
|
||||
|
||||
queue_duration = await self._queue_duration(ctx)
|
||||
queue_total_duration = lavalink.utils.format_time(queue_duration)
|
||||
text = 'Page {}/{} | {} tracks, {} remaining'.format(page, pages, len(player.queue) + 1, queue_total_duration)
|
||||
@@ -473,29 +599,36 @@ class Audio:
|
||||
@commands.command()
|
||||
async def repeat(self, ctx):
|
||||
"""Toggles repeat."""
|
||||
repeat_msg = 'You must be in the voice channel to toggle repeat.'
|
||||
if not ctx.author.voice:
|
||||
return await self._embed_msg(ctx, repeat_msg)
|
||||
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
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 toggle repeat.')
|
||||
repeat = await self.config.guild(ctx.guild).repeat()
|
||||
await self.config.guild(ctx.guild).repeat.set(not repeat)
|
||||
repeat = await self.config.guild(ctx.guild).repeat()
|
||||
await self._embed_msg(ctx, 'Repeat songs: {}.'.format(repeat))
|
||||
|
||||
if self._player_check(ctx):
|
||||
await self._data_check(ctx)
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
if ctx.author.voice.channel != player.channel:
|
||||
return await self._embed_msg(ctx, repeat_msg)
|
||||
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 toggle repeat.')
|
||||
await self._embed_msg(ctx, 'Repeat songs: {}.'.format(repeat))
|
||||
|
||||
@commands.command()
|
||||
async def remove(self, ctx, index: int):
|
||||
"""Remove a specific song number from the queue."""
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
if not self._player_check(ctx):
|
||||
return await self._embed_msg(ctx, 'Nothing playing.')
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
if not player.queue:
|
||||
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:
|
||||
return await self._embed_msg(ctx, 'Song number must be greater than 1 and within the queue limit.')
|
||||
index -= 1
|
||||
@@ -507,7 +640,7 @@ class Audio:
|
||||
"""Pick a song with a search.
|
||||
Use [p]search list <search term> to queue all songs.
|
||||
"""
|
||||
expected = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣"]
|
||||
expected = ("1⃣", "2⃣", "3⃣", "4⃣", "5⃣")
|
||||
emoji = {
|
||||
"one": "1⃣",
|
||||
"two": "2⃣",
|
||||
@@ -515,17 +648,19 @@ class Audio:
|
||||
"four": "4⃣",
|
||||
"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):
|
||||
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.')
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
shuffle = await self.config.guild(ctx.guild).shuffle()
|
||||
player.store('channel', ctx.channel.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.')
|
||||
|
||||
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.set_footer(text='Page {}/{} | {} search results'.format(page, pages, len(tracks)))
|
||||
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):
|
||||
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):
|
||||
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()
|
||||
await self._clear_react(message)
|
||||
if not await self._currency_check(ctx, jukebox_price):
|
||||
return
|
||||
search_choice = tracks[entry]
|
||||
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Track Enqueued',
|
||||
description='**[{}]({})**'.format(search_choice.title, search_choice.uri))
|
||||
@@ -601,11 +743,16 @@ class Audio:
|
||||
@commands.command()
|
||||
async def seek(self, ctx, seconds: int=30):
|
||||
"""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):
|
||||
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:
|
||||
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.')
|
||||
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.is_stream:
|
||||
return await self._embed_msg(ctx, 'Can\'t seek on a stream.')
|
||||
@@ -623,32 +770,105 @@ class Audio:
|
||||
@commands.command()
|
||||
async def shuffle(self, ctx):
|
||||
"""Toggles shuffle."""
|
||||
shuffle_msg = 'You must be in the voice channel to toggle shuffle.'
|
||||
if not ctx.author.voice:
|
||||
return await self._embed_msg(ctx, shuffle_msg)
|
||||
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
if dj_enabled:
|
||||
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()
|
||||
await self.config.guild(ctx.guild).shuffle.set(not shuffle)
|
||||
shuffle = await self.config.guild(ctx.guild).shuffle()
|
||||
await self._embed_msg(ctx, 'Shuffle songs: {}.'.format(shuffle))
|
||||
|
||||
if self._player_check(ctx):
|
||||
await self._data_check(ctx)
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
if ctx.author.voice.channel != player.channel:
|
||||
return await self._embed_msg(ctx, shuffle_msg)
|
||||
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 toggle shuffle.')
|
||||
await self._embed_msg(ctx, 'Shuffle songs: {}.'.format(shuffle))
|
||||
|
||||
@commands.command(aliases=['forceskip', 'fs'])
|
||||
async def skip(self, ctx):
|
||||
"""Skips to the next track."""
|
||||
if not self._player_check(ctx):
|
||||
return await self._embed_msg(ctx, 'Nothing playing.')
|
||||
else:
|
||||
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."
|
||||
|
||||
if not player.current:
|
||||
return await self._embed_msg(ctx, 'There\'s nothing in the queue.')
|
||||
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:
|
||||
return await self._skip_action(ctx)
|
||||
|
||||
async def _can_instaskip(self, ctx, member):
|
||||
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:
|
||||
pos, dur = player.position, player.current.length
|
||||
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))
|
||||
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(
|
||||
colour=ctx.guild.me.top_role.colour, title='Track Skipped',
|
||||
description='**[{}]({})**'.format(
|
||||
@@ -670,17 +887,25 @@ class Audio:
|
||||
)
|
||||
)
|
||||
await ctx.send(embed=embed)
|
||||
|
||||
await player.skip()
|
||||
|
||||
@commands.command(aliases=['s'])
|
||||
async def stop(self, ctx):
|
||||
"""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):
|
||||
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:
|
||||
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.')
|
||||
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:
|
||||
await self._embed_msg(ctx, 'Stopping...')
|
||||
await player.stop()
|
||||
@@ -692,6 +917,7 @@ class Audio:
|
||||
@commands.command()
|
||||
async def volume(self, ctx, vol: int=None):
|
||||
"""Sets the volume, 1% - 150%."""
|
||||
dj_enabled = await self.config.guild(ctx.guild).dj_enabled()
|
||||
if not vol:
|
||||
vol = await self.config.guild(ctx.guild).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):
|
||||
embed.set_footer(text='Nothing playing.')
|
||||
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:
|
||||
vol = 150
|
||||
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)
|
||||
else:
|
||||
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)
|
||||
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, title='Volume:',
|
||||
description=str(vol) + '%')
|
||||
@@ -725,36 +959,46 @@ class Audio:
|
||||
async def host(self, ctx, host):
|
||||
"""Set the lavalink server host."""
|
||||
await self.config.host.set(host)
|
||||
get_host = await self.config.host()
|
||||
await self._embed_msg(ctx, 'Host set to {}.'.format(get_host))
|
||||
await self._embed_msg(ctx, 'Host set to {}.'.format(host))
|
||||
|
||||
@llsetup.command()
|
||||
async def password(self, ctx, passw):
|
||||
"""Set the lavalink server password."""
|
||||
await self.config.passw.set(str(passw))
|
||||
get_passw = await self.config.passw()
|
||||
await self._embed_msg(ctx, 'Server password set to {}.'.format(get_passw))
|
||||
await self._embed_msg(ctx, 'Server password set to {}.'.format(passw))
|
||||
|
||||
@llsetup.command()
|
||||
async def restport(self, ctx, rest_port):
|
||||
"""Set the lavalink REST server 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(get_rest_port))
|
||||
await self._embed_msg(ctx, 'REST port set to {}.'.format(rest_port))
|
||||
|
||||
@llsetup.command()
|
||||
async def wsport(self, ctx, rest_port):
|
||||
"""Set the lavalink websocket server 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(get_ws_port))
|
||||
await self._embed_msg(ctx, 'Websocket port set to {}.'.format(ws_port))
|
||||
|
||||
async def _clear_react(self, message):
|
||||
@staticmethod
|
||||
async def _clear_react(message):
|
||||
try:
|
||||
await message.clear_reactions()
|
||||
except:
|
||||
except (discord.Forbidden, discord.HTTPException):
|
||||
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):
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
shuffle = await self.config.guild(ctx.guild).shuffle()
|
||||
@@ -787,7 +1031,8 @@ class Audio:
|
||||
msg += bar
|
||||
return msg
|
||||
|
||||
def _dynamic_time(self, time):
|
||||
@staticmethod
|
||||
def _dynamic_time(time):
|
||||
m, s = divmod(time, 60)
|
||||
h, m = divmod(m, 60)
|
||||
d, h = divmod(h, 24)
|
||||
@@ -800,9 +1045,12 @@ class Audio:
|
||||
msg = "{2}m {3}s"
|
||||
elif d == 0 and h == 0 and m == 0 and s > 0:
|
||||
msg = "{3}s"
|
||||
else:
|
||||
msg = ""
|
||||
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)
|
||||
await ctx.send(embed=embed)
|
||||
|
||||
@@ -813,14 +1061,15 @@ class Audio:
|
||||
else:
|
||||
return 0
|
||||
|
||||
async def _queue_duration(self, ctx):
|
||||
@staticmethod
|
||||
async def _queue_duration(ctx):
|
||||
player = lavalink.get_player(ctx.guild.id)
|
||||
duration = []
|
||||
for i in range(len(player.queue)):
|
||||
if not player.queue[i].is_stream:
|
||||
duration.append(player.queue[i].length)
|
||||
queue_duration = sum(duration)
|
||||
if player.queue == []:
|
||||
if not player.queue:
|
||||
queue_duration = 0
|
||||
try:
|
||||
if not player.current.is_stream:
|
||||
@@ -832,13 +1081,21 @@ class Audio:
|
||||
queue_total_duration = remain + queue_duration
|
||||
return queue_total_duration
|
||||
|
||||
def _player_check(self, ctx):
|
||||
@staticmethod
|
||||
def _player_check(ctx):
|
||||
try:
|
||||
lavalink.get_player(ctx.guild.id)
|
||||
return True
|
||||
except KeyError:
|
||||
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):
|
||||
lavalink.unregister_event_listener(self.event_handler)
|
||||
self.bot.loop.create_task(lavalink.close())
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,11 +18,11 @@ msgstr ""
|
||||
|
||||
#: ../audio.py:25 ../audio.py:45
|
||||
msgid "Join a voice channel first!"
|
||||
msgstr "Du musst zuerst einem Sprach Kanal beitreten!"
|
||||
msgstr "Tritt zuerst einem Sprachkanal bei!"
|
||||
|
||||
#: ../audio.py:33
|
||||
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
|
||||
msgid "{} is playing a song..."
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,7 +18,7 @@ msgstr ""
|
||||
|
||||
#: ../audio.py:25 ../audio.py:45
|
||||
msgid "Join a voice channel first!"
|
||||
msgstr ""
|
||||
msgstr "Aye! Ye need to sail y'ur ship first!"
|
||||
|
||||
#: ../audio.py:33
|
||||
msgid "Let's play a file that exists pls"
|
||||
@@ -26,17 +26,17 @@ msgstr ""
|
||||
|
||||
#: ../audio.py:38 ../audio.py:58
|
||||
msgid "{} is playing a song..."
|
||||
msgstr ""
|
||||
msgstr "{} be dancing to Shanty..."
|
||||
|
||||
#: ../audio.py:48
|
||||
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
|
||||
msgid "I'm not even connected to a voice channel!"
|
||||
msgstr ""
|
||||
msgstr "Aye! I never boarded ye ship!"
|
||||
|
||||
#: ../audio.py:95
|
||||
msgid "Volume set."
|
||||
msgstr ""
|
||||
msgstr "Aye, shouting voice changed."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,25 +18,25 @@ msgstr ""
|
||||
|
||||
#: ../audio.py:25 ../audio.py:45
|
||||
msgid "Join a voice channel first!"
|
||||
msgstr ""
|
||||
msgstr "Bergabung dengan channel suara dulu!"
|
||||
|
||||
#: ../audio.py:33
|
||||
msgid "Let's play a file that exists pls"
|
||||
msgstr ""
|
||||
msgstr "Tolong memutar file yang ada"
|
||||
|
||||
#: ../audio.py:38 ../audio.py:58
|
||||
msgid "{} is playing a song..."
|
||||
msgstr ""
|
||||
msgstr "{} sedang memainkan sebuah lagu..."
|
||||
|
||||
#: ../audio.py:48
|
||||
msgid "Youtube links pls"
|
||||
msgstr ""
|
||||
msgstr "Link YouTube"
|
||||
|
||||
#: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97
|
||||
msgid "I'm not even connected to a voice channel!"
|
||||
msgstr ""
|
||||
msgstr "Saya belum memasuki channel suara!"
|
||||
|
||||
#: ../audio.py:95
|
||||
msgid "Volume set."
|
||||
msgstr ""
|
||||
msgstr "Suara telah di atur."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,25 +18,25 @@ msgstr ""
|
||||
|
||||
#: ../audio.py:25 ../audio.py:45
|
||||
msgid "Join a voice channel first!"
|
||||
msgstr ""
|
||||
msgstr "커맨드를 사용하기 전에 음성 채널에 접속해야 해요!"
|
||||
|
||||
#: ../audio.py:33
|
||||
msgid "Let's play a file that exists pls"
|
||||
msgstr ""
|
||||
msgstr "파일을 재생해볼게요!"
|
||||
|
||||
#: ../audio.py:38 ../audio.py:58
|
||||
msgid "{} is playing a song..."
|
||||
msgstr ""
|
||||
msgstr "{}이(가) 음악을 재생하는 중..."
|
||||
|
||||
#: ../audio.py:48
|
||||
msgid "Youtube links pls"
|
||||
msgstr ""
|
||||
msgstr "유튜브 링크를 부탁해요!"
|
||||
|
||||
#: ../audio.py:67 ../audio.py:77 ../audio.py:87 ../audio.py:97
|
||||
msgid "I'm not even connected to a voice channel!"
|
||||
msgstr ""
|
||||
msgstr "제가 음성 채널에 접속할 수 없어요!"
|
||||
|
||||
#: ../audio.py:95
|
||||
msgid "Volume set."
|
||||
msgstr ""
|
||||
msgstr "음량이 변경됐어요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import discord
|
||||
from redbot.core.utils.chat_formatting import box
|
||||
|
||||
from redbot.core import checks, bank
|
||||
from redbot.core.i18n import CogI18n
|
||||
@@ -60,6 +61,26 @@ class Bank:
|
||||
async def bankset(self, ctx: commands.Context):
|
||||
"""Base command for bank settings"""
|
||||
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()
|
||||
|
||||
@bankset.command(name="toggleglobal")
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -22,17 +22,17 @@ msgstr "글로벌"
|
||||
|
||||
#: ../bank.py:68
|
||||
msgid "per-guild"
|
||||
msgstr "길드마다"
|
||||
msgstr "각 길드마다"
|
||||
|
||||
#: ../bank.py:70
|
||||
msgid "The bank is now {}."
|
||||
msgstr "은행 잔고는 `{}`입니다."
|
||||
msgstr "은행은 이제 {} 이에요."
|
||||
|
||||
#: ../bank.py:77
|
||||
msgid "Bank's name has been set to {}"
|
||||
msgstr "계좌 이름이 {} 로 설정 되었습니다."
|
||||
msgstr "은행 이름이 {} 으로 설정됐어요."
|
||||
|
||||
#: ../bank.py:84
|
||||
msgid "Currency name has been set to {}"
|
||||
msgstr "통화 이름이 {} 로 설정 되었습니다."
|
||||
msgstr "화폐 이름이 {} 으로 설정됐어요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,9 +18,9 @@ msgstr ""
|
||||
|
||||
#: ../cleanup.py:176
|
||||
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
|
||||
msgid "Message not found."
|
||||
msgstr ""
|
||||
msgstr "Pesan tidak ditemukan."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,9 +18,9 @@ msgstr ""
|
||||
|
||||
#: ../cleanup.py:176
|
||||
msgid "This command can only be used on bots with bot accounts."
|
||||
msgstr ""
|
||||
msgstr "이 커맨드는 봇 계정이 있는 봇만 사용할 수 있어요."
|
||||
|
||||
#: ../cleanup.py:183
|
||||
msgid "Message not found."
|
||||
msgstr ""
|
||||
msgstr "메세지를 찾을 수 없어요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -22,5 +22,5 @@ msgstr ""
|
||||
|
||||
#: ../cleanup.py:183
|
||||
msgid "Message not found."
|
||||
msgstr ""
|
||||
msgstr "Bericht niet gevonden."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -19,49 +19,50 @@ msgstr ""
|
||||
#: ../customcom.py:44
|
||||
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 `{}`"
|
||||
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
|
||||
msgid "Add a random response:"
|
||||
msgstr ""
|
||||
msgstr "Tambahkan tanggapan acak:"
|
||||
|
||||
#: ../customcom.py:119
|
||||
msgid "Do you want to create a 'randomized' cc? {}"
|
||||
msgstr ""
|
||||
msgstr "Apakah Anda ingin membuat cc 'acak'? {}"
|
||||
|
||||
#: ../customcom.py:126
|
||||
msgid "What response do you want?"
|
||||
msgstr ""
|
||||
msgstr "Tanggapan apa yang anda inginkan?"
|
||||
|
||||
#: ../customcom.py:205 ../customcom.py:235
|
||||
msgid "Custom command successfully added."
|
||||
msgstr ""
|
||||
msgstr "Perintah kustom berhasil ditambahkan."
|
||||
|
||||
#: ../customcom.py:207 ../customcom.py:237
|
||||
msgid "This command already exists. Use `{}` to edit it."
|
||||
msgstr ""
|
||||
msgstr "Perintah ini sudah ada. Gunakan '{}' untuk mengeditnya."
|
||||
|
||||
#: ../customcom.py:229
|
||||
msgid "That command is already a standard command."
|
||||
msgstr ""
|
||||
msgstr "Perintah ini sudah perintah standar."
|
||||
|
||||
#: ../customcom.py:261
|
||||
msgid "Custom command successfully edited."
|
||||
msgstr ""
|
||||
msgstr "Perintah kustom berhasil diubah."
|
||||
|
||||
#: ../customcom.py:263
|
||||
msgid "That command doesn't exist. Use `{}` to add it."
|
||||
msgstr ""
|
||||
msgstr "Perintah ini tidak tersedia. Gunakan '{}' untuk menambahkannya."
|
||||
|
||||
#: ../customcom.py:282
|
||||
msgid "Custom command successfully deleted."
|
||||
msgstr ""
|
||||
msgstr "Perintah kustom berhasil dihapus."
|
||||
|
||||
#: ../customcom.py:284
|
||||
msgid "That command doesn't exist."
|
||||
msgstr ""
|
||||
msgstr "Perintah tersebut tidak ada."
|
||||
|
||||
#: ../customcom.py:294
|
||||
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."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -19,49 +19,50 @@ msgstr ""
|
||||
#: ../customcom.py:44
|
||||
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 `{}`"
|
||||
msgstr ""
|
||||
msgstr "대화형 랜덤 {} 메이커에 오신 것을 환영해요!\n"
|
||||
"사용자님이 보내는 모든 메시지에 {} 이(가) 트리거 되면 선택할 임의의 대답 중 하나로 추가됍니다. 이 대화형 메뉴를 종료하려면 `{}` 을 입력해야 해요."
|
||||
|
||||
#: ../customcom.py:56
|
||||
msgid "Add a random response:"
|
||||
msgstr ""
|
||||
msgstr "등록된 랜덤 대답 리스트 :"
|
||||
|
||||
#: ../customcom.py:119
|
||||
msgid "Do you want to create a 'randomized' cc? {}"
|
||||
msgstr ""
|
||||
msgstr "'임의' CC를 생성할까요?"
|
||||
|
||||
#: ../customcom.py:126
|
||||
msgid "What response do you want?"
|
||||
msgstr ""
|
||||
msgstr "어떤 대답을 원해요?"
|
||||
|
||||
#: ../customcom.py:205 ../customcom.py:235
|
||||
msgid "Custom command successfully added."
|
||||
msgstr ""
|
||||
msgstr "커스텀 커맨드가 성공적으로 추가됐어요."
|
||||
|
||||
#: ../customcom.py:207 ../customcom.py:237
|
||||
msgid "This command already exists. Use `{}` to edit it."
|
||||
msgstr ""
|
||||
msgstr "이 커맨드는 이미 추가되어 있어요. 편집하려면 `{}` 을(를) 사용해보세요."
|
||||
|
||||
#: ../customcom.py:229
|
||||
msgid "That command is already a standard command."
|
||||
msgstr ""
|
||||
msgstr "해당 커맨드는 봇의 커맨드예요."
|
||||
|
||||
#: ../customcom.py:261
|
||||
msgid "Custom command successfully edited."
|
||||
msgstr ""
|
||||
msgstr "커스텀 커맨드가 성공적으로 수정됐어요."
|
||||
|
||||
#: ../customcom.py:263
|
||||
msgid "That command doesn't exist. Use `{}` to add it."
|
||||
msgstr ""
|
||||
msgstr "해당 커맨드는 추가되어 있지 않아요. 추가하려면 `{}` 을(를) 사용해보세요."
|
||||
|
||||
#: ../customcom.py:282
|
||||
msgid "Custom command successfully deleted."
|
||||
msgstr ""
|
||||
msgstr "커스텀 커맨드가 성공적으로 삭제됐어요."
|
||||
|
||||
#: ../customcom.py:284
|
||||
msgid "That command doesn't exist."
|
||||
msgstr ""
|
||||
msgstr "해당 커맨드는 추가되어 있지 않아요."
|
||||
|
||||
#: ../customcom.py:294
|
||||
msgid "There are no custom commands in this guild. Use `{}` to start adding some."
|
||||
msgstr ""
|
||||
msgstr "이 길드에 등록된 커스텀 커맨드가 없어요. 추가하려면 `{}` 을(를) 사용해보세요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
6
redbot/cogs/dataconverter/__init__.py
Normal file
6
redbot/cogs/dataconverter/__init__.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from redbot.core.bot import Red
|
||||
from .dataconverter import DataConverter
|
||||
|
||||
|
||||
def setup(bot: Red):
|
||||
bot.add_cog(DataConverter(bot))
|
||||
184
redbot/cogs/dataconverter/core_specs.py
Normal file
184
redbot/cogs/dataconverter/core_specs.py
Normal 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)
|
||||
82
redbot/cogs/dataconverter/dataconverter.py
Normal file
82
redbot/cogs/dataconverter/dataconverter.py
Normal 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.")
|
||||
)
|
||||
43
redbot/cogs/dataconverter/locales/messages.pot
Normal file
43
redbot/cogs/dataconverter/locales/messages.pot
Normal 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 ""
|
||||
|
||||
15
redbot/cogs/dataconverter/locales/regen_messages.py
Normal file
15
redbot/cogs/dataconverter/locales/regen_messages.py
Normal 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()
|
||||
@@ -5,6 +5,8 @@ from sys import path as syspath
|
||||
from typing import Tuple, Union
|
||||
|
||||
import discord
|
||||
import sys
|
||||
|
||||
from redbot.core import Config
|
||||
from redbot.core import checks
|
||||
from redbot.core.data_manager import cog_data_path
|
||||
@@ -220,7 +222,7 @@ class Downloader:
|
||||
"""
|
||||
try:
|
||||
# noinspection PyTypeChecker
|
||||
await self._repo_manager.add_repo(
|
||||
repo = await self._repo_manager.add_repo(
|
||||
name=name,
|
||||
url=repo_url,
|
||||
branch=branch
|
||||
@@ -232,6 +234,8 @@ class Downloader:
|
||||
log.exception(_("Something went wrong during the cloning process."))
|
||||
else:
|
||||
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")
|
||||
async def _repo_del(self, ctx, repo_name: Repo):
|
||||
@@ -268,11 +272,18 @@ class Downloader:
|
||||
"""
|
||||
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:
|
||||
await ctx.send(_("Error, there is no cog by the name of"
|
||||
" `{}` in the `{}` repo.").format(cog_name, repo_name.name))
|
||||
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):
|
||||
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 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")
|
||||
async def _cog_uninstall(self, ctx, cog_name: InstalledCog):
|
||||
|
||||
@@ -38,6 +38,9 @@ class Installable(RepoJSONMixin):
|
||||
bot_version : `tuple` of `int`
|
||||
The minimum bot version required for this installation. Right now
|
||||
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`
|
||||
Whether or not this cog will be hidden from the user when they use
|
||||
`Downloader`'s commands.
|
||||
@@ -70,6 +73,7 @@ class Installable(RepoJSONMixin):
|
||||
|
||||
self.author = ()
|
||||
self.bot_version = (3, 0, 0)
|
||||
self.min_python_version = (3, 5, 1)
|
||||
self.hidden = False
|
||||
self.required_cogs = {} # Cog name -> repo URL
|
||||
self.requirements = ()
|
||||
@@ -159,9 +163,15 @@ class Installable(RepoJSONMixin):
|
||||
try:
|
||||
bot_version = tuple(info.get("bot_version", [3, 0, 0]))
|
||||
except ValueError:
|
||||
bot_version = 2
|
||||
bot_version = self.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:
|
||||
hidden = bool(info.get("hidden", False))
|
||||
except ValueError:
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,47 +18,47 @@ msgstr ""
|
||||
|
||||
#: ../downloader.py:215
|
||||
msgid "That git repo has already been added under another name."
|
||||
msgstr "해당 git 저장소는 이미 다른 이름으로 저장 되어 있습니다."
|
||||
msgstr "해당 git 저장소는 이미 다른 이름으로 저장되어 있어요."
|
||||
|
||||
#: ../downloader.py:217 ../downloader.py:218
|
||||
msgid "Something went wrong during the cloning process."
|
||||
msgstr "복제 작업중 에러가 발생했습니다."
|
||||
msgstr "복제하는 과정에서 뭔가 잘못됐어요."
|
||||
|
||||
#: ../downloader.py:220
|
||||
msgid "Repo `{}` successfully added."
|
||||
msgstr "저장소 `{}` 가 성공적으로 추가 되었습니다."
|
||||
msgstr "저장소 `{}` 이(가) 성공적으로 추가됐어요."
|
||||
|
||||
#: ../downloader.py:229
|
||||
msgid "The repo `{}` has been deleted successfully."
|
||||
msgstr "저장소 `{}` 가 성공적으로 삭제 되었습니다."
|
||||
msgstr "저장소 `{}` 이(가) 성공적으로 삭제됐어요."
|
||||
|
||||
#: ../downloader.py:237
|
||||
msgid "Installed Repos:\n"
|
||||
msgstr "설치된 저장소 리스트:\n"
|
||||
msgstr "설치된 저장소 리스트 :"
|
||||
|
||||
#: ../downloader.py:258
|
||||
msgid "Error, there is no cog by the name of `{}` in the `{}` repo."
|
||||
msgstr "에러, `{}` 저장소에 `{}` 로 해당된 cog가 없습니다."
|
||||
msgstr "에러, `{}` 저장소에 `{}` 으로 해당된 cog가 없어요."
|
||||
|
||||
#: ../downloader.py:263
|
||||
msgid "Failed to install the required libraries for `{}`: `{}`"
|
||||
msgstr "`{}`에 필요한 라이브러리를 설치 실패 햇습니다: `{}`"
|
||||
msgstr "`{}` 에 필요한 라이브러리 설치를 실패했어요 : `{}`"
|
||||
|
||||
#: ../downloader.py:273
|
||||
msgid "`{}` cog successfully installed."
|
||||
msgstr "`{}` cog가 성공적으로 설치 되었습니다."
|
||||
msgstr "`{}` cog가 성공적으로 설치됐어요."
|
||||
|
||||
#: ../downloader.py:289
|
||||
msgid "`{}` was successfully removed."
|
||||
msgstr "`{}` 가 성공적으로 제거되었습니다."
|
||||
msgstr "`{}` 이(가) 성공적으로 제거됐어요."
|
||||
|
||||
#: ../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."
|
||||
msgstr "해당 cog가 설치되었지만 위치를 찾을수 없습니다. 만약 해당 cog가 사용 가능하다면 유저가 직접 파일들을 지워야 합니다."
|
||||
msgstr "해당 cog가 설치되었지만 더 이상 찾을 수 없어요. 그래도 사용할 수 있는 경우 수동으로 파일을 제거해야 해요."
|
||||
|
||||
#: ../downloader.py:323
|
||||
msgid "Cog update completed successfully."
|
||||
msgstr "Cog가 성공적으로 업데이트 되었습니다."
|
||||
msgstr "Cog가 성공적으로 업데이트됐어요."
|
||||
|
||||
#: ../downloader.py:331
|
||||
msgid "Available Cogs:\n"
|
||||
@@ -66,7 +66,7 @@ msgstr "사용가능한 Cogs:\n"
|
||||
|
||||
#: ../downloader.py:343
|
||||
msgid "There is no cog `{}` in the repo `{}`"
|
||||
msgstr "저장소 `{}` 에 `{}`로 된 Cog가 없습니다."
|
||||
msgstr "저장소 `{}` 에 `{}` 으로 된 Cog가 없어요."
|
||||
|
||||
#: ../downloader.py:348
|
||||
msgid "Information on {}:\n"
|
||||
@@ -76,19 +76,19 @@ msgstr "`{}`에 대한 정보:\n"
|
||||
|
||||
#: ../downloader.py:389
|
||||
msgid "Missing from info.json"
|
||||
msgstr "Info.json에 정보가 없습니다."
|
||||
msgstr "Info.json 파일에서 누락됐어요."
|
||||
|
||||
#: ../downloader.py:398
|
||||
msgid "Command: {}\n"
|
||||
"Made by: {}\n"
|
||||
"Repo: {}\n"
|
||||
"Cog name: {}"
|
||||
msgstr "명령어: {}\n"
|
||||
msgstr "커맨드 : {}\n"
|
||||
"작성자 : {}\n"
|
||||
"저장소 : {}\n"
|
||||
"Cog 이름 : {}"
|
||||
|
||||
#: ../downloader.py:430
|
||||
msgid "That command doesn't seem to exist."
|
||||
msgstr "해당 명령어가 존재하지 않습니다."
|
||||
msgstr "해당 커맨드가 등록되어 있지 않아요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -85,7 +85,8 @@ msgstr "{} setel akun {} ke {} {}."
|
||||
#: ../economy.py:212
|
||||
msgid "This will delete all bank accounts for {}.\n"
|
||||
"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
|
||||
msgid "All bank accounts of this guild have been deleted."
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,31 +18,31 @@ msgstr ""
|
||||
|
||||
#: ../economy.py:40
|
||||
msgid "JACKPOT! 226! Your bid has been multiplied * 2500!"
|
||||
msgstr ""
|
||||
msgstr "대박이야! 226! 사용자님의 입찰 가격이 2,500을 넘었어요!"
|
||||
|
||||
#: ../economy.py:44
|
||||
msgid "4LC! +1000!"
|
||||
msgstr ""
|
||||
msgstr "포 클로버! + 1000!"
|
||||
|
||||
#: ../economy.py:48
|
||||
msgid "Three cherries! +800!"
|
||||
msgstr ""
|
||||
msgstr "체리 셋! +800!"
|
||||
|
||||
#: ../economy.py:52
|
||||
msgid "2 6! Your bid has been multiplied * 4!"
|
||||
msgstr ""
|
||||
msgstr "2 6! 사용자님의 입찰 가격이 4배로 늘었어요!"
|
||||
|
||||
#: ../economy.py:56
|
||||
msgid "Two cherries! Your bid has been multiplied * 3!"
|
||||
msgstr ""
|
||||
msgstr "체리 두 개! 사용자님의 입찰 가격이 3배로 올랐어요!"
|
||||
|
||||
#: ../economy.py:60
|
||||
msgid "Three symbols! +500!"
|
||||
msgstr ""
|
||||
msgstr "3개의 심볼! +500!"
|
||||
|
||||
#: ../economy.py:64
|
||||
msgid "Two consecutive symbols! Your bid has been multiplied * 2!"
|
||||
msgstr ""
|
||||
msgstr "2연속 심볼! 당신의 입찰 가격이 2배로 늘었어요!"
|
||||
|
||||
#: ../economy.py:68
|
||||
msgid "Slot machine payouts:\n"
|
||||
@@ -53,74 +53,86 @@ msgid "Slot machine payouts:\n"
|
||||
"{cherries.value} {cherries.value} Bet * 3\n\n"
|
||||
"Three symbols: +500\n"
|
||||
"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
|
||||
msgid "{}'s balance is {} {}"
|
||||
msgstr ""
|
||||
msgstr "{}의 잔액은 {} {} 이에요."
|
||||
|
||||
#: ../economy.py:171
|
||||
msgid "{} transferred {} {} to {}"
|
||||
msgstr ""
|
||||
msgstr "{1} 이(가) {2} {3} {4} 으로 전송됐어요."
|
||||
|
||||
#: ../economy.py:191
|
||||
msgid "{} added {} {} to {}'s account."
|
||||
msgstr ""
|
||||
msgstr "{1} 이(가) {4}의 계정에 {2} {3} 을(를) 추가했어요."
|
||||
|
||||
#: ../economy.py:196
|
||||
msgid "{} removed {} {} from {}'s account."
|
||||
msgstr ""
|
||||
msgstr "{1} 이(가) {4}의 계정에서 {3} {4} 을(를) 제거했어요."
|
||||
|
||||
#: ../economy.py:201
|
||||
msgid "{} set {}'s account to {} {}."
|
||||
msgstr ""
|
||||
msgstr "{1} 이(가) {4}의 계정을 {2} {3} (으)로 설정했어요."
|
||||
|
||||
#: ../economy.py:212
|
||||
msgid "This will delete all bank accounts for {}.\n"
|
||||
"If you're sure, type `{}bank reset yes`"
|
||||
msgstr ""
|
||||
msgstr "{} 에 대한 모든 은행 계정이 삭제될 거예요.\n"
|
||||
"확실한 경우 `{}bank reset yes` 를 입력해야 해요."
|
||||
|
||||
#: ../economy.py:229
|
||||
msgid "All bank accounts of this guild have been deleted."
|
||||
msgstr ""
|
||||
msgstr "이 길드의 모든 은행 계정이 삭제됐어요."
|
||||
|
||||
#: ../economy.py:248 ../economy.py:268
|
||||
msgid "{} Here, take some {}. Enjoy! (+{} {}!)"
|
||||
msgstr ""
|
||||
msgstr "{} 여기요, 조금의 {} 을(를) 받아요. 즐겨요! (+{} {}!)"
|
||||
|
||||
#: ../economy.py:258 ../economy.py:276
|
||||
msgid "{} Too soon. For your next payday you have to wait {}."
|
||||
msgstr ""
|
||||
msgstr "{} 너무 일러요. 다음 월급날을 위해서 {} 을(를) 기다려야 해요."
|
||||
|
||||
#: ../economy.py:313
|
||||
msgid "There are no accounts in the bank."
|
||||
msgstr ""
|
||||
msgstr "은행에 등록된 계좌가 없어요."
|
||||
|
||||
#: ../economy.py:339
|
||||
msgid "You're on cooldown, try again in a bit."
|
||||
msgstr ""
|
||||
msgstr "사용자님은 지금 쿨타임이에요. 잠시 후에 다시 시도해보세요."
|
||||
|
||||
#: ../economy.py:342
|
||||
msgid "That's an invalid bid amount, sorry :/"
|
||||
msgstr ""
|
||||
msgstr "잘못된 입찰 금액이에요, 죄송해요. ;/"
|
||||
|
||||
#: ../economy.py:345
|
||||
msgid "You ain't got enough money, friend."
|
||||
msgstr ""
|
||||
msgstr "동작 그만, 밑장빼기냐? 돈이 없잖아."
|
||||
|
||||
#: ../economy.py:391
|
||||
msgid "{}\n"
|
||||
"{} {}\n\n"
|
||||
"Your bid: {}\n"
|
||||
"{} → {}!"
|
||||
msgstr ""
|
||||
msgstr "{}\n"
|
||||
"{} {}\n\n"
|
||||
"사용자님의 입찰 금액 : {}\n"
|
||||
"{} → {}!"
|
||||
|
||||
#: ../economy.py:398
|
||||
msgid "{}\n"
|
||||
"{} Nothing!\n"
|
||||
"Your bid: {}\n"
|
||||
"{} → {}!"
|
||||
msgstr ""
|
||||
msgstr "{}\n"
|
||||
"{} 읎어요!\n"
|
||||
"사용자님의 입찰 금액 : {}\n"
|
||||
"{} → {}!"
|
||||
|
||||
#: ../economy.py:423
|
||||
msgid "Minimum slot bid: {}\n"
|
||||
@@ -129,65 +141,70 @@ msgid "Minimum slot bid: {}\n"
|
||||
"Payday amount: {}\n"
|
||||
"Payday cooldown: {}\n"
|
||||
"Amount given at account registration: {}"
|
||||
msgstr ""
|
||||
msgstr "최소 슬롯 입찰 수 : {}\n"
|
||||
"최대 슬롯 입찰 수 : {}\n"
|
||||
"슬롯 쿨타임 : {}\n"
|
||||
"급여 금액 : {}\n"
|
||||
"급여의 재사용 가능 시간 : {}\n"
|
||||
"계좌 등록 시 지급된 금액 : {}"
|
||||
|
||||
#: ../economy.py:433
|
||||
msgid "Current Economy settings:"
|
||||
msgstr ""
|
||||
msgstr "현재 이코노미 설정 :"
|
||||
|
||||
#: ../economy.py:441
|
||||
msgid "Invalid min bid amount."
|
||||
msgstr ""
|
||||
msgstr "최소 입찰 금액이 잘못됐어요."
|
||||
|
||||
#: ../economy.py:449
|
||||
msgid "Minimum bid is now {} {}."
|
||||
msgstr ""
|
||||
msgstr "이제 최소 입찰가는 {} {} 이에요."
|
||||
|
||||
#: ../economy.py:456
|
||||
msgid "Invalid slotmax bid amount. Must be greater than slotmin."
|
||||
msgstr ""
|
||||
msgstr "슬롯 최대 입찰 금액이 잘못됐어요. 슬롯 최솟값보다 커야 해요."
|
||||
|
||||
#: ../economy.py:465
|
||||
msgid "Maximum bid is now {} {}."
|
||||
msgstr ""
|
||||
msgstr "이제 최대 입찰가는 {} {} 이에요."
|
||||
|
||||
#: ../economy.py:475
|
||||
msgid "Cooldown is now {} seconds."
|
||||
msgstr ""
|
||||
msgstr "이제 쿨타임은 {} 초예요."
|
||||
|
||||
#: ../economy.py:485
|
||||
msgid "Value modified. At least {} seconds must pass between each payday."
|
||||
msgstr ""
|
||||
msgstr "값이 수정됐어요. 각각의 월급날 사이에 적어도 {} 초가 지나야 해요."
|
||||
|
||||
#: ../economy.py:494
|
||||
msgid "Har har so funny."
|
||||
msgstr ""
|
||||
msgstr "ㅋㅋㅋ 개 재밌다."
|
||||
|
||||
#: ../economy.py:500
|
||||
msgid "Every payday will now give {} {}."
|
||||
msgstr ""
|
||||
msgstr "이제 월급날 때마다 {} {} 을(를) 줄 거예요."
|
||||
|
||||
#: ../economy.py:511
|
||||
msgid "Registering an account will now give {} {}."
|
||||
msgstr ""
|
||||
msgstr "이제 계정을 등록하면 {} {} 이(가) 지급돼요."
|
||||
|
||||
#: ../economy.py:517
|
||||
msgid "weeks"
|
||||
msgstr ""
|
||||
msgstr "주"
|
||||
|
||||
#: ../economy.py:518
|
||||
msgid "days"
|
||||
msgstr ""
|
||||
msgstr "날"
|
||||
|
||||
#: ../economy.py:519
|
||||
msgid "hours"
|
||||
msgstr ""
|
||||
msgstr "시간"
|
||||
|
||||
#: ../economy.py:520
|
||||
msgid "minutes"
|
||||
msgstr ""
|
||||
msgstr "분"
|
||||
|
||||
#: ../economy.py:521
|
||||
msgid "seconds"
|
||||
msgstr ""
|
||||
msgstr "초"
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -240,8 +240,8 @@ class Filter:
|
||||
pass
|
||||
else:
|
||||
await modlog.create_case(
|
||||
server, message.created_at, "filterban",
|
||||
author, server.me, reason
|
||||
self.bot, server, message.created_at,
|
||||
"filterban", author, server.me, reason
|
||||
)
|
||||
|
||||
async def on_message(self, message: discord.Message):
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,49 +18,49 @@ msgstr ""
|
||||
|
||||
#: ../filter.py:62
|
||||
msgid "Filtered in this server:"
|
||||
msgstr ""
|
||||
msgstr "Disaring pada server ini:"
|
||||
|
||||
#: ../filter.py:67
|
||||
msgid "I can't send direct messages to you."
|
||||
msgstr ""
|
||||
msgstr "Saya tidak dapat mengirim pesan langsung kepada Anda."
|
||||
|
||||
#: ../filter.py:96
|
||||
msgid "Words added to filter."
|
||||
msgstr ""
|
||||
msgstr "Kata-kata yang ditambahkan untuk disaring."
|
||||
|
||||
#: ../filter.py:98
|
||||
msgid "Words already in the filter."
|
||||
msgstr ""
|
||||
msgstr "Kata-kata yang sudah di disaring."
|
||||
|
||||
#: ../filter.py:127
|
||||
msgid "Words removed from filter."
|
||||
msgstr ""
|
||||
msgstr "Kata-kata dihapus dari penyaring."
|
||||
|
||||
#: ../filter.py:129
|
||||
msgid "Those words weren't in the filter."
|
||||
msgstr ""
|
||||
msgstr "Kata-kata tidak dalam penyaring."
|
||||
|
||||
#: ../filter.py:142
|
||||
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
|
||||
msgid "Names and nicknames will now be checked against the filter"
|
||||
msgstr ""
|
||||
msgstr "Nama dan julukan akan di periksa terhadap penyaring"
|
||||
|
||||
#: ../filter.py:160
|
||||
msgid "The name to use on filtered names has been set"
|
||||
msgstr ""
|
||||
msgstr "Nama yang digunakan untuk penyaring telah ditetapkan"
|
||||
|
||||
#: ../filter.py:171
|
||||
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
|
||||
msgid "Autoban disabled."
|
||||
msgstr ""
|
||||
msgstr "Autoban dimatikan."
|
||||
|
||||
#: ../filter.py:183
|
||||
msgid "Count and time have been set."
|
||||
msgstr ""
|
||||
msgstr "Jumlah dan waktu telah ditetapkan."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,49 +18,49 @@ msgstr ""
|
||||
|
||||
#: ../filter.py:62
|
||||
msgid "Filtered in this server:"
|
||||
msgstr ""
|
||||
msgstr "이 서버에서 필터링 된 항목 :"
|
||||
|
||||
#: ../filter.py:67
|
||||
msgid "I can't send direct messages to you."
|
||||
msgstr ""
|
||||
msgstr "사용자님에게 직접 메시지를 보낼 수 없어요."
|
||||
|
||||
#: ../filter.py:96
|
||||
msgid "Words added to filter."
|
||||
msgstr ""
|
||||
msgstr "필터링에 추가된 단어예요."
|
||||
|
||||
#: ../filter.py:98
|
||||
msgid "Words already in the filter."
|
||||
msgstr ""
|
||||
msgstr "필터에 이미 있는 단어예요."
|
||||
|
||||
#: ../filter.py:127
|
||||
msgid "Words removed from filter."
|
||||
msgstr ""
|
||||
msgstr "필터에서 제거된 단어예요."
|
||||
|
||||
#: ../filter.py:129
|
||||
msgid "Those words weren't in the filter."
|
||||
msgstr ""
|
||||
msgstr "해당 단어들은 필터에 들어 있지 않아요."
|
||||
|
||||
#: ../filter.py:142
|
||||
msgid "Names and nicknames will no longer be checked against the filter"
|
||||
msgstr ""
|
||||
msgstr "필터에 대한 이름 및 닉네임을 더 이상 확인할 수 없어요."
|
||||
|
||||
#: ../filter.py:147
|
||||
msgid "Names and nicknames will now be checked against the filter"
|
||||
msgstr ""
|
||||
msgstr "이제 이름과 닉네임을 필터에서 개별적으로 인식해요."
|
||||
|
||||
#: ../filter.py:160
|
||||
msgid "The name to use on filtered names has been set"
|
||||
msgstr ""
|
||||
msgstr "필터링 된 이름에 사용할 이름이 설정됐어요."
|
||||
|
||||
#: ../filter.py:171
|
||||
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
|
||||
msgid "Autoban disabled."
|
||||
msgstr ""
|
||||
msgstr "자동 밴이 중지됐어요."
|
||||
|
||||
#: ../filter.py:183
|
||||
msgid "Count and time have been set."
|
||||
msgstr ""
|
||||
msgstr "개수와 시간이 설정됐어요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -90,7 +90,7 @@ class General:
|
||||
msg = ""
|
||||
if user.id == ctx.bot.user.id:
|
||||
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")
|
||||
char = "abcdefghijklmnopqrstuvwxyz"
|
||||
tran = "ɐqɔpǝɟƃɥᴉɾʞlɯuodbɹsʇnʌʍxʎz"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -30,11 +30,11 @@ msgstr "Jelas begitu"
|
||||
|
||||
#: ../general.py:43
|
||||
msgid "Most likely"
|
||||
msgstr "Most likely"
|
||||
msgstr "Sewajarnya"
|
||||
|
||||
#: ../general.py:43
|
||||
msgid "Outlook good"
|
||||
msgstr "Melihat keluar bagus"
|
||||
msgstr "Pandangan bagus"
|
||||
|
||||
#: ../general.py:43
|
||||
msgid "Signs point to yes"
|
||||
@@ -50,7 +50,7 @@ msgstr "Ya"
|
||||
|
||||
#: ../general.py:44
|
||||
msgid "Yes – definitely"
|
||||
msgstr "Iya tentu saja"
|
||||
msgstr "Iya - tentu saja"
|
||||
|
||||
#: ../general.py:44
|
||||
msgid "You may rely on it"
|
||||
@@ -163,15 +163,15 @@ msgstr "Bermain {}"
|
||||
|
||||
#: ../general.py:225
|
||||
msgid "Streaming [{}]({})"
|
||||
msgstr ""
|
||||
msgstr "Streaming [{}]({})"
|
||||
|
||||
#: ../general.py:227
|
||||
msgid "Listening to {}"
|
||||
msgstr ""
|
||||
msgstr "Mendengarkan {}"
|
||||
|
||||
#: ../general.py:229
|
||||
msgid "Watching {}"
|
||||
msgstr ""
|
||||
msgstr "Menonton {}"
|
||||
|
||||
#: ../general.py:234
|
||||
msgid "None"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,222 +18,223 @@ msgstr ""
|
||||
|
||||
#: ../general.py:42
|
||||
msgid "As I see it, yes"
|
||||
msgstr ""
|
||||
msgstr "내가 보기엔 그렇지!"
|
||||
|
||||
#: ../general.py:42
|
||||
msgid "It is certain"
|
||||
msgstr ""
|
||||
msgstr "틀림없어요!"
|
||||
|
||||
#: ../general.py:42
|
||||
msgid "It is decidedly so"
|
||||
msgstr ""
|
||||
msgstr "그건 확실히 그렇지!"
|
||||
|
||||
#: ../general.py:43
|
||||
msgid "Most likely"
|
||||
msgstr ""
|
||||
msgstr "아마도 그럴걸?"
|
||||
|
||||
#: ../general.py:43
|
||||
msgid "Outlook good"
|
||||
msgstr ""
|
||||
msgstr "오늘은 전망이 좋네요."
|
||||
|
||||
#: ../general.py:43
|
||||
msgid "Signs point to yes"
|
||||
msgstr ""
|
||||
msgstr "소라고둥이 말씀하셨다! \"그래\""
|
||||
|
||||
#: ../general.py:44
|
||||
msgid "Without a doubt"
|
||||
msgstr ""
|
||||
msgstr "틀림없어!"
|
||||
|
||||
#: ../general.py:44
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
msgstr "그래요!"
|
||||
|
||||
#: ../general.py:44
|
||||
msgid "Yes – definitely"
|
||||
msgstr ""
|
||||
msgstr "그래요, 물론이죠!"
|
||||
|
||||
#: ../general.py:44
|
||||
msgid "You may rely on it"
|
||||
msgstr ""
|
||||
msgstr "그걸 믿어도 좋아요!"
|
||||
|
||||
#: ../general.py:45
|
||||
msgid "Ask again later"
|
||||
msgstr ""
|
||||
msgstr "나중에 다시 물어보세요!"
|
||||
|
||||
#: ../general.py:45
|
||||
msgid "Reply hazy, try again"
|
||||
msgstr ""
|
||||
msgstr "의미심장하네요, 다시 시도해보세요."
|
||||
|
||||
#: ../general.py:46
|
||||
msgid "Better not tell you now"
|
||||
msgstr ""
|
||||
msgstr "지금은 말해주지 않는게 좋겠어요."
|
||||
|
||||
#: ../general.py:46
|
||||
msgid "Cannot predict now"
|
||||
msgstr ""
|
||||
msgstr "지금은 예측할 수 없죠."
|
||||
|
||||
#: ../general.py:47
|
||||
msgid "Concentrate and ask again"
|
||||
msgstr ""
|
||||
msgstr "집중해서 다시 물어보세요."
|
||||
|
||||
#: ../general.py:47
|
||||
msgid "Don't count on it"
|
||||
msgstr ""
|
||||
msgstr "그렇지 않을거예요."
|
||||
|
||||
#: ../general.py:47
|
||||
msgid "My reply is no"
|
||||
msgstr ""
|
||||
msgstr "제 대답은 \"아뇨\"예요."
|
||||
|
||||
#: ../general.py:48
|
||||
msgid "My sources say no"
|
||||
msgstr ""
|
||||
msgstr "제 진심이 말하길 \"아뇨\""
|
||||
|
||||
#: ../general.py:48
|
||||
msgid "Outlook not so good"
|
||||
msgstr ""
|
||||
msgstr "오늘은 전망이 별로 좋지 않네요."
|
||||
|
||||
#: ../general.py:48
|
||||
msgid "Very doubtful"
|
||||
msgstr ""
|
||||
msgstr "동작 그만, 밑장빼기냐?"
|
||||
|
||||
#: ../general.py:64
|
||||
msgid "Not enough choices to pick from."
|
||||
msgstr ""
|
||||
msgstr "선택의 폭이 좁은걸?"
|
||||
|
||||
#: ../general.py:78
|
||||
msgid "{} :game_die: {} :game_die:"
|
||||
msgstr ""
|
||||
msgstr "{} :game_die: {} :game_die:"
|
||||
|
||||
#: ../general.py:81
|
||||
msgid "{} Maybe higher than 1? ;P"
|
||||
msgstr ""
|
||||
msgstr "{} 1보다 클수도 있죠? ;P"
|
||||
|
||||
#: ../general.py:93
|
||||
msgid "Nice try. You think this is funny?How about *this* instead:\n\n"
|
||||
msgstr ""
|
||||
msgstr "시도는 좋았어요, 재밌을 것 같아요? 대신 *이건* 어때요? :"
|
||||
|
||||
#: ../general.py:106
|
||||
msgid "*flips a coin and... "
|
||||
msgstr ""
|
||||
msgstr "*동전을 던지며..."
|
||||
|
||||
#: ../general.py:106
|
||||
msgid "HEADS!*"
|
||||
msgstr ""
|
||||
msgstr "앞면!*"
|
||||
|
||||
#: ../general.py:106
|
||||
msgid "TAILS!*"
|
||||
msgstr ""
|
||||
msgstr "뒷면!*"
|
||||
|
||||
#: ../general.py:130
|
||||
msgid "{} You win {}!"
|
||||
msgstr ""
|
||||
msgstr "{} {} 을(를) 획득했어요!"
|
||||
|
||||
#: ../general.py:134
|
||||
msgid "{} You lose {}!"
|
||||
msgstr ""
|
||||
msgstr "{} {} 을(를) 잃었어요!"
|
||||
|
||||
#: ../general.py:138
|
||||
msgid "{} We're square {}!"
|
||||
msgstr ""
|
||||
msgstr "{} 우리는 사각형이에요 {}!"
|
||||
|
||||
#: ../general.py:151
|
||||
msgid "That doesn't look like a question."
|
||||
msgstr ""
|
||||
msgstr "그건 질문으로 보이지 않아요."
|
||||
|
||||
#: ../general.py:159
|
||||
msgid " Stopwatch started!"
|
||||
msgstr ""
|
||||
msgstr "스톱워치가 시작됐어요!"
|
||||
|
||||
#: ../general.py:163
|
||||
msgid " Stopwatch stopped! Time: **"
|
||||
msgstr ""
|
||||
msgstr "스톱워치가 멈췄어요! 시간 : **"
|
||||
|
||||
#: ../general.py:216 ../general.py:217
|
||||
msgid "{}\n"
|
||||
"({} days ago)"
|
||||
msgstr ""
|
||||
msgstr "{}\n"
|
||||
"({} 일 전에)"
|
||||
|
||||
#: ../general.py:219
|
||||
msgid "Chilling in {} status"
|
||||
msgstr ""
|
||||
msgstr "{} 상태로 오싹해졌어요."
|
||||
|
||||
#: ../general.py:223
|
||||
msgid "Playing {}"
|
||||
msgstr ""
|
||||
msgstr "재생 중 {}"
|
||||
|
||||
#: ../general.py:225
|
||||
msgid "Streaming [{}]({})"
|
||||
msgstr ""
|
||||
msgstr "실시간 스트리밍 [{}]({})"
|
||||
|
||||
#: ../general.py:227
|
||||
msgid "Listening to {}"
|
||||
msgstr ""
|
||||
msgstr "듣는 중 {}"
|
||||
|
||||
#: ../general.py:229
|
||||
msgid "Watching {}"
|
||||
msgstr ""
|
||||
msgstr "보는 중 {}"
|
||||
|
||||
#: ../general.py:234
|
||||
msgid "None"
|
||||
msgstr ""
|
||||
msgstr "읎어요."
|
||||
|
||||
#: ../general.py:237
|
||||
msgid "Joined Discord on"
|
||||
msgstr ""
|
||||
msgstr "가입된 디스코드 켜짐"
|
||||
|
||||
#: ../general.py:238
|
||||
msgid "Joined this guild on"
|
||||
msgstr ""
|
||||
msgstr "이 길드에 가입된"
|
||||
|
||||
#: ../general.py:239 ../general.py:286
|
||||
msgid "Roles"
|
||||
msgstr ""
|
||||
msgstr "역할"
|
||||
|
||||
#: ../general.py:240
|
||||
msgid "Member #{} | User ID: {}"
|
||||
msgstr ""
|
||||
msgstr "멤버 # {} | 사용자 ID : {}"
|
||||
|
||||
#: ../general.py:257 ../general.py:299
|
||||
msgid "I need the `Embed links` permission to send this."
|
||||
msgstr ""
|
||||
msgstr "이걸 보내려면 'Embed links' 권한이 필요해요."
|
||||
|
||||
#: ../general.py:272
|
||||
msgid "Since {}. That's over {} days ago!"
|
||||
msgstr ""
|
||||
msgstr "{} 이후, 그건 {} 일 전의 일이에요!"
|
||||
|
||||
#: ../general.py:282
|
||||
msgid "Region"
|
||||
msgstr ""
|
||||
msgstr "지역"
|
||||
|
||||
#: ../general.py:283
|
||||
msgid "Users"
|
||||
msgstr ""
|
||||
msgstr "사용자"
|
||||
|
||||
#: ../general.py:284
|
||||
msgid "Text Channels"
|
||||
msgstr ""
|
||||
msgstr "텍스트 채널"
|
||||
|
||||
#: ../general.py:285
|
||||
msgid "Voice Channels"
|
||||
msgstr ""
|
||||
msgstr "음성 채널"
|
||||
|
||||
#: ../general.py:287
|
||||
msgid "Owner"
|
||||
msgstr ""
|
||||
msgstr "주인님"
|
||||
|
||||
#: ../general.py:288
|
||||
msgid "Guild ID: "
|
||||
msgstr ""
|
||||
msgstr "길드 ID :"
|
||||
|
||||
#: ../general.py:343
|
||||
msgid "Your search terms gave no results."
|
||||
msgstr ""
|
||||
msgstr "검색 조건에서 검색 결과가 없어요."
|
||||
|
||||
#: ../general.py:345
|
||||
msgid "There is no definition #{}"
|
||||
msgstr ""
|
||||
msgstr "정의 #{} 이(가) 없어요."
|
||||
|
||||
#: ../general.py:347
|
||||
msgid "Error."
|
||||
msgstr ""
|
||||
msgstr "에러."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -28,7 +28,6 @@ class Image:
|
||||
self.session.close()
|
||||
|
||||
@commands.group(name="imgur")
|
||||
@commands.guild_only()
|
||||
async def _imgur(self, ctx):
|
||||
"""Retrieves pictures from imgur
|
||||
|
||||
@@ -40,10 +39,16 @@ class Image:
|
||||
@_imgur.command(name="search")
|
||||
async def imgur_search(self, ctx, *, term: str):
|
||||
"""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}
|
||||
headers = {"Authorization": "Client-ID {}".format(await self.settings.imgur_client_id())}
|
||||
async with self.session.get(url, headers=headers, data=params) as search_get:
|
||||
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
|
||||
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()
|
||||
|
||||
if data["success"]:
|
||||
@@ -81,9 +86,16 @@ class Image:
|
||||
elif sort_type == "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 = []
|
||||
headers = {"Authorization": "Client-ID {}".format(await self.settings.imgur_client_id())}
|
||||
url = self.imgur_base_url + "r/{}/{}/{}/0".format(subreddit, sort, window)
|
||||
headers = {"Authorization": "Client-ID {}".format(imgur_client_id)}
|
||||
url = self.imgur_base_url + "gallery/r/{}/{}/{}/0".format(subreddit, sort, window)
|
||||
|
||||
async with self.session.get(url, headers=headers) as sub_get:
|
||||
data = await sub_get.json()
|
||||
@@ -111,6 +123,7 @@ class Image:
|
||||
You can get these by visiting https://api.imgur.com/oauth2/addclient
|
||||
and filling out the form. Enter a name for the application, select
|
||||
'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
|
||||
enter a description. Check the box for the captcha, then click Next.
|
||||
Your client ID will be on the page that loads"""
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,29 +18,29 @@ msgstr ""
|
||||
|
||||
#: ../image.py:49
|
||||
msgid "Your search returned no results"
|
||||
msgstr ""
|
||||
msgstr "검색 결과가 반환되지 않았어요."
|
||||
|
||||
#: ../image.py:52
|
||||
msgid "Search results...\n"
|
||||
msgstr ""
|
||||
msgstr "검색 중..."
|
||||
|
||||
#: ../image.py:58 ../image.py:100
|
||||
msgid "Something went wrong. Error code is {}"
|
||||
msgstr ""
|
||||
msgstr "뭔가 잘못됐어요, 오류 코드는 {} 이에요."
|
||||
|
||||
#: ../image.py:70
|
||||
msgid "Only 'new' and 'top' are a valid sort type."
|
||||
msgstr ""
|
||||
msgstr "'new' 와 'top' 만이 사용 가능한 타입이에요."
|
||||
|
||||
#: ../image.py:98 ../image.py:135 ../image.py:157
|
||||
msgid "No results found."
|
||||
msgstr ""
|
||||
msgstr "결과를 찾을 수 없어요."
|
||||
|
||||
#: ../image.py:115
|
||||
msgid "Set the imgur client id!"
|
||||
msgstr ""
|
||||
msgstr "imgur 클라이언트 ID를 설정해야 해요!"
|
||||
|
||||
#: ../image.py:137 ../image.py:159
|
||||
msgid "Error contacting the API"
|
||||
msgstr ""
|
||||
msgstr "API에 연결하는 동안 오류가 발생했어요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,266 +18,270 @@ msgstr ""
|
||||
|
||||
#: ../mod.py:209
|
||||
msgid "Role hierarchy will be checked when moderation commands are issued."
|
||||
msgstr ""
|
||||
msgstr "Peran hirarki akan diperiksa ketika mengeluarkan perintah moderasi."
|
||||
|
||||
#: ../mod.py:213
|
||||
msgid "Role hierarchy will be ignored when moderation commands are issued."
|
||||
msgstr ""
|
||||
msgstr "Peran hirarki akan diabaikan ketika mengeluarkan perintah moderasi."
|
||||
|
||||
#: ../mod.py:228
|
||||
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
|
||||
msgid "Autoban for mention spam disabled."
|
||||
msgstr ""
|
||||
msgstr "Autoban untuk penyebutan berulang dimatikan."
|
||||
|
||||
#: ../mod.py:249
|
||||
msgid "Messages repeated up to 3 times will be deleted."
|
||||
msgstr ""
|
||||
msgstr "Pesan yang diulang sampai 3 kali akan dihapus."
|
||||
|
||||
#: ../mod.py:253
|
||||
msgid "Repeated messages will be ignored."
|
||||
msgstr ""
|
||||
msgstr "Pesan yang diulang akan diabaikan."
|
||||
|
||||
#: ../mod.py:267
|
||||
msgid "Command deleting disabled."
|
||||
msgstr ""
|
||||
msgstr "Perintah menghapus dinonaktifkan."
|
||||
|
||||
#: ../mod.py:270
|
||||
msgid "Delete delay set to {} seconds."
|
||||
msgstr ""
|
||||
msgstr "Menghapus penundaan ditetapkan untuk {} detik."
|
||||
|
||||
#: ../mod.py:275
|
||||
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
|
||||
msgid "I will not delete command messages."
|
||||
msgstr ""
|
||||
msgstr "Saya tidak akan menghapus pesan perintah."
|
||||
|
||||
#: ../mod.py:292
|
||||
msgid "Users unbanned with {} will be reinvited."
|
||||
msgstr ""
|
||||
msgstr "Pengguna unbanned dengan {} akan diundang ulang."
|
||||
|
||||
#: ../mod.py:295
|
||||
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
|
||||
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
|
||||
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
|
||||
msgid "I'm not allowed to do that."
|
||||
msgstr ""
|
||||
msgstr "Saya tidak diizinkan untuk melakukan itu."
|
||||
|
||||
#: ../mod.py:327
|
||||
msgid "Done. That felt good."
|
||||
msgstr ""
|
||||
msgstr "Selesai. Itu terasa baik."
|
||||
|
||||
#: ../mod.py:369
|
||||
msgid "Invalid days. Must be between 0 and 7."
|
||||
msgstr ""
|
||||
msgstr "Hari-hari tidak sah. Harus antara 0 dan 7."
|
||||
|
||||
#: ../mod.py:384
|
||||
msgid "Done. It was about time."
|
||||
msgstr ""
|
||||
msgstr "Selesai. Itu hanya masalah waktu."
|
||||
|
||||
#: ../mod.py:413
|
||||
msgid "User is already banned."
|
||||
msgstr ""
|
||||
msgstr "Pengguna sudah dibanned."
|
||||
|
||||
#: ../mod.py:429
|
||||
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
|
||||
msgid "I lack the permissions to do this."
|
||||
msgstr ""
|
||||
msgstr "Saya tidak memiliki izin untuk melakukan ini."
|
||||
|
||||
#: ../mod.py:435
|
||||
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
|
||||
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
|
||||
msgid "I can't do that for some reason."
|
||||
msgstr ""
|
||||
msgstr "Saya tidak bisa melakukan itu untuk beberapa alasan."
|
||||
|
||||
#: ../mod.py:483
|
||||
msgid "Something went wrong while banning"
|
||||
msgstr ""
|
||||
msgstr "Terjadi suatu kesalahan saat banning"
|
||||
|
||||
#: ../mod.py:485
|
||||
msgid "Done. Enough chaos for now"
|
||||
msgstr ""
|
||||
msgstr "Selesai. Cukup kekacauan untuk sekarang"
|
||||
|
||||
#: ../mod.py:525
|
||||
msgid "You have been banned and then unbanned as a quick way to delete your messages.\n"
|
||||
"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
|
||||
msgid "My role is not high enough to softban that user."
|
||||
msgstr ""
|
||||
msgstr "Hirarki saya tidak cukup tinggi untuk softban pengguna."
|
||||
|
||||
#: ../mod.py:553
|
||||
msgid "Done. Enough chaos."
|
||||
msgstr ""
|
||||
msgstr "Selesai. Cukup kekacauan."
|
||||
|
||||
#: ../mod.py:587
|
||||
msgid "Couldn't find a user with that ID!"
|
||||
msgstr ""
|
||||
msgstr "Tidak dapat menemukan pengguna dengan ID tersebut!"
|
||||
|
||||
#: ../mod.py:593
|
||||
msgid "It seems that user isn't banned!"
|
||||
msgstr ""
|
||||
msgstr "Tampaknya bahwa pengguna tidak di banned!"
|
||||
|
||||
#: ../mod.py:601
|
||||
msgid "Something went wrong while attempting to unban that user"
|
||||
msgstr ""
|
||||
msgstr "Terjadi kesalahan saat mencoba untuk mengunban pengguna"
|
||||
|
||||
#: ../mod.py:604
|
||||
msgid "Unbanned that user from this guild"
|
||||
msgstr ""
|
||||
msgstr "Unbanned pengguna dari guild ini"
|
||||
|
||||
#: ../mod.py:619
|
||||
msgid "You've been unbanned from {}.\n"
|
||||
"Here is an invite for that guild: {}"
|
||||
msgstr ""
|
||||
msgstr "Anda telah di unbanned dari {}. Berikut adalah undangan untuk bergabung ke guild: {}"
|
||||
|
||||
#: ../mod.py:623
|
||||
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: {}"
|
||||
msgstr ""
|
||||
msgstr "Saya gagal untuk mengirim undangan ke pengguna. Mungkin anda dapat mengirimkannya untuk saya?\n"
|
||||
"Berikut adalah link mengundang: {}"
|
||||
|
||||
#: ../mod.py:629
|
||||
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
|
||||
msgid "No voice state for that user!"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada sasaran pengguna suara!"
|
||||
|
||||
#: ../mod.py:687
|
||||
msgid "That user is already muted and deafened guild-wide!"
|
||||
msgstr ""
|
||||
msgstr "Pengguna berhasil dibisukan dan ditulikan secara global!"
|
||||
|
||||
#: ../mod.py:690
|
||||
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
|
||||
msgid "That user isn't muted or deafened by the guild!"
|
||||
msgstr ""
|
||||
msgstr "Pengguna itu bisu atau tuli dari guild!"
|
||||
|
||||
#: ../mod.py:725
|
||||
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
|
||||
msgid "I cannot do that, I lack the '{}' permission."
|
||||
msgstr ""
|
||||
msgstr "Saya tidak dapat melakukan itu, saya tidak mempunyai izin '{}'."
|
||||
|
||||
#: ../mod.py:783
|
||||
msgid "Muted {}#{} in channel {}"
|
||||
msgstr ""
|
||||
msgstr "Tidak diizinkan bersuara {}#{} di channel {}"
|
||||
|
||||
#: ../mod.py:797
|
||||
msgid "That user is already muted in {}!"
|
||||
msgstr ""
|
||||
msgstr "Pengguna sudah dibisukan di {}!"
|
||||
|
||||
#: ../mod.py:800 ../mod.py:932
|
||||
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
|
||||
msgid "No voice state for the target!"
|
||||
msgstr ""
|
||||
msgstr "Tidak ada sasaran target suara!"
|
||||
|
||||
#: ../mod.py:822
|
||||
msgid "User has been muted in this channel."
|
||||
msgstr ""
|
||||
msgstr "Pengguna telah dibisukan di channel ini."
|
||||
|
||||
#: ../mod.py:858
|
||||
msgid "User has been muted in this guild."
|
||||
msgstr ""
|
||||
msgstr "Pengguna telah dibisukan di guild ini."
|
||||
|
||||
#: ../mod.py:919
|
||||
msgid "Unmuted {}#{} in channel {}"
|
||||
msgstr ""
|
||||
msgstr "Dizinkan bersuara {}#{} di channel {}"
|
||||
|
||||
#: ../mod.py:929
|
||||
msgid "That user is already unmuted in {}!"
|
||||
msgstr ""
|
||||
msgstr "Pengguna sudah tidak dibisukan di {}!"
|
||||
|
||||
#: ../mod.py:949
|
||||
msgid "User unmuted in this channel."
|
||||
msgstr ""
|
||||
msgstr "Pengguna diizinkan bersuara di channel ini."
|
||||
|
||||
#: ../mod.py:958
|
||||
msgid "Unmute failed. Reason: {}"
|
||||
msgstr ""
|
||||
msgstr "Menghidupkan suara gagal. Alasan: {}"
|
||||
|
||||
#: ../mod.py:981
|
||||
msgid "User has been unmuted in this guild."
|
||||
msgstr ""
|
||||
msgstr "Pengguna sudah diizinkan bersuara di guild ini."
|
||||
|
||||
#: ../mod.py:1045
|
||||
msgid "Channel added to ignore list."
|
||||
msgstr ""
|
||||
msgstr "Saluran ditambahkan ke daftar abaikan."
|
||||
|
||||
#: ../mod.py:1047
|
||||
msgid "Channel already in ignore list."
|
||||
msgstr ""
|
||||
msgstr "Saluran sudah ada didalam daftar abaikan."
|
||||
|
||||
#: ../mod.py:1055
|
||||
msgid "This guild has been added to the ignore list."
|
||||
msgstr ""
|
||||
msgstr "Guild ini sudah di tambahkan ke dalam daftar abaikan."
|
||||
|
||||
#: ../mod.py:1057
|
||||
msgid "This guild is already being ignored."
|
||||
msgstr ""
|
||||
msgstr "Guild ini sudah diabaikan."
|
||||
|
||||
#: ../mod.py:1078
|
||||
msgid "Channel removed from ignore list."
|
||||
msgstr ""
|
||||
msgstr "Saluran di hapus dari dalam daftar abaikan."
|
||||
|
||||
#: ../mod.py:1080
|
||||
msgid "That channel is not in the ignore list."
|
||||
msgstr ""
|
||||
msgstr "Saluran sedang tidak ada di dalam daftar abaikan."
|
||||
|
||||
#: ../mod.py:1088
|
||||
msgid "This guild has been removed from the ignore list."
|
||||
msgstr ""
|
||||
msgstr "Guild ini sudah di hapus dari dalam daftar abaikan."
|
||||
|
||||
#: ../mod.py:1090
|
||||
msgid "This guild is not in the ignore list."
|
||||
msgstr ""
|
||||
msgstr "Guild ini sedang tidak berada didalam daftar abaikan."
|
||||
|
||||
#: ../mod.py:1102
|
||||
msgid "Currently ignoring:\n"
|
||||
"{} channels\n"
|
||||
"{} guilds\n"
|
||||
msgstr ""
|
||||
msgstr "Saat ini mengabaikan:\n"
|
||||
"{} saluran\n"
|
||||
"{} guilds\n"
|
||||
|
||||
#: ../mod.py:1133
|
||||
msgid "**Past 20 names**:"
|
||||
msgstr ""
|
||||
msgstr "**20 nama terakhir**:"
|
||||
|
||||
#: ../mod.py:1140
|
||||
msgid "**Past 20 nicknames**:"
|
||||
msgstr ""
|
||||
msgstr "**20 julukan terakhir**:"
|
||||
|
||||
#: ../mod.py:1146
|
||||
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."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Korean\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,266 +18,270 @@ msgstr ""
|
||||
|
||||
#: ../mod.py:209
|
||||
msgid "Role hierarchy will be checked when moderation commands are issued."
|
||||
msgstr ""
|
||||
msgstr "절제 커맨드를 사용하면 역할 계층 구조가 검사돼요."
|
||||
|
||||
#: ../mod.py:213
|
||||
msgid "Role hierarchy will be ignored when moderation commands are issued."
|
||||
msgstr ""
|
||||
msgstr "절제 커맨드를 사용하면 역할 계층은 무시될 거예요."
|
||||
|
||||
#: ../mod.py:228
|
||||
msgid "Autoban for mention spam enabled. Anyone mentioning {} or more different people in a single message will be autobanned."
|
||||
msgstr ""
|
||||
msgstr "스팸 언급이 금지했어요. 한 메세지에서 {} 또는 그 이상의 다른 사용자를 언급하는 것이 금지됐어요."
|
||||
|
||||
#: ../mod.py:239
|
||||
msgid "Autoban for mention spam disabled."
|
||||
msgstr ""
|
||||
msgstr "스팸 언급 자동 밴 사용 안 함."
|
||||
|
||||
#: ../mod.py:249
|
||||
msgid "Messages repeated up to 3 times will be deleted."
|
||||
msgstr ""
|
||||
msgstr "최대 3번 반복된 메세지가 삭제됐어요."
|
||||
|
||||
#: ../mod.py:253
|
||||
msgid "Repeated messages will be ignored."
|
||||
msgstr ""
|
||||
msgstr "반복된 메세지는 무시됍니다."
|
||||
|
||||
#: ../mod.py:267
|
||||
msgid "Command deleting disabled."
|
||||
msgstr ""
|
||||
msgstr "커맨드 삭제 사용 안 함."
|
||||
|
||||
#: ../mod.py:270
|
||||
msgid "Delete delay set to {} seconds."
|
||||
msgstr ""
|
||||
msgstr "{} 초로 설정된 지연시간을 삭제했어요."
|
||||
|
||||
#: ../mod.py:275
|
||||
msgid "Bot will delete command messages after {} seconds. Set this value to -1 to stop deleting messages"
|
||||
msgstr ""
|
||||
msgstr "봇이 {} 초 후에 커맨드 메세지를 삭제해요. 메세지 삭제를 중지하려면 이 값을 -1로 설정해야 해요."
|
||||
|
||||
#: ../mod.py:279
|
||||
msgid "I will not delete command messages."
|
||||
msgstr ""
|
||||
msgstr "커맨드 메세지를 삭제하지 않을게요."
|
||||
|
||||
#: ../mod.py:292
|
||||
msgid "Users unbanned with {} will be reinvited."
|
||||
msgstr ""
|
||||
msgstr "{} 으로 밴 처리된 사용자가 다시 초대됐어요."
|
||||
|
||||
#: ../mod.py:295
|
||||
msgid "Users unbanned with {} will not be reinvited."
|
||||
msgstr ""
|
||||
msgstr "{} 으로 밴 처리된 사용자는 다시 초대되지 않아요."
|
||||
|
||||
#: ../mod.py:309 ../mod.py:349 ../mod.py:506
|
||||
msgid "I cannot let you do that. Self-harm is bad {}"
|
||||
msgstr ""
|
||||
msgstr "그렇게 하게 둘 수는 없어요. 자해는 나빠요. {}"
|
||||
|
||||
#: ../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."
|
||||
msgstr ""
|
||||
msgstr "그렇게 하게 둘 수는 없어요. 역할 계층의 사용자보다 높지 않아요."
|
||||
|
||||
#: ../mod.py:323 ../mod.py:379 ../mod.py:570
|
||||
msgid "I'm not allowed to do that."
|
||||
msgstr ""
|
||||
msgstr "그렇게 하는 건 허용하지 않아요."
|
||||
|
||||
#: ../mod.py:327
|
||||
msgid "Done. That felt good."
|
||||
msgstr ""
|
||||
msgstr "다 했어요. 앙 기분 좋아."
|
||||
|
||||
#: ../mod.py:369
|
||||
msgid "Invalid days. Must be between 0 and 7."
|
||||
msgstr ""
|
||||
msgstr "올바르지 않은 요일이에요. 0에서 7사이여야 해요."
|
||||
|
||||
#: ../mod.py:384
|
||||
msgid "Done. It was about time."
|
||||
msgstr ""
|
||||
msgstr "다 했어요. 마피아는 고개를 들어주세요."
|
||||
|
||||
#: ../mod.py:413
|
||||
msgid "User is already banned."
|
||||
msgstr ""
|
||||
msgstr "해당 사용자는 이미 밴 처리되어 있어요."
|
||||
|
||||
#: ../mod.py:429
|
||||
msgid "User not found. Have you provided the correct user ID?"
|
||||
msgstr ""
|
||||
msgstr "사용자를 찾을 수 없어요. 올바른 사용자 ID를 입력했나요?"
|
||||
|
||||
#: ../mod.py:433
|
||||
msgid "I lack the permissions to do this."
|
||||
msgstr ""
|
||||
msgstr "제게 행동할 수 있는 권한이 없어요."
|
||||
|
||||
#: ../mod.py:435
|
||||
msgid "Done. The user will not be able to join this guild."
|
||||
msgstr ""
|
||||
msgstr "다 했어요. 사용자는 이 길드에 가입할 수 없어요."
|
||||
|
||||
#: ../mod.py:472
|
||||
msgid "You have been temporarily banned from {} until {}. Here is an invite for when your ban expires: {}"
|
||||
msgstr ""
|
||||
msgstr "{} 부터 {} 까지 일시적으로 밴 처리됐어요. 다음은 사용자의 밴 처리가 만료되는 경우를 위한 초대예요 : {}"
|
||||
|
||||
#: ../mod.py:481
|
||||
msgid "I can't do that for some reason."
|
||||
msgstr ""
|
||||
msgstr "왠지 모르겠어요."
|
||||
|
||||
#: ../mod.py:483
|
||||
msgid "Something went wrong while banning"
|
||||
msgstr ""
|
||||
msgstr "밴 처리를 하는 동안 문제가 발생했어요."
|
||||
|
||||
#: ../mod.py:485
|
||||
msgid "Done. Enough chaos for now"
|
||||
msgstr ""
|
||||
msgstr "다 했어요. 지금으로서는 충분히 혼란스러울 거예요."
|
||||
|
||||
#: ../mod.py:525
|
||||
msgid "You have been banned and then unbanned as a quick way to delete your messages.\n"
|
||||
"You can now join the guild again. {}"
|
||||
msgstr ""
|
||||
msgstr "사용자님은 밴 처리됐어요, 하지만 사용자님의 밴 처리를 해제하려면 사용자님의 메세지를 빠르게 삭제해보세요. 이제 다시 길드에 가입할 수 있어요. {}"
|
||||
|
||||
#: ../mod.py:537
|
||||
msgid "My role is not high enough to softban that user."
|
||||
msgstr ""
|
||||
msgstr "제 역할이 그 사용자를 밴 할 만큼 충분하지 않습니다."
|
||||
|
||||
#: ../mod.py:553
|
||||
msgid "Done. Enough chaos."
|
||||
msgstr ""
|
||||
msgstr "다 했어요. 충분히 혼란스러워요."
|
||||
|
||||
#: ../mod.py:587
|
||||
msgid "Couldn't find a user with that ID!"
|
||||
msgstr ""
|
||||
msgstr "해당 ID를 가진 사용자를 찾을 수 없어요."
|
||||
|
||||
#: ../mod.py:593
|
||||
msgid "It seems that user isn't banned!"
|
||||
msgstr ""
|
||||
msgstr "사용자들이 밴 처리되지 않은 것 같아요!"
|
||||
|
||||
#: ../mod.py:601
|
||||
msgid "Something went wrong while attempting to unban that user"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자의 밴 처리를 해제하는 동안 문제가 발생했어요."
|
||||
|
||||
#: ../mod.py:604
|
||||
msgid "Unbanned that user from this guild"
|
||||
msgstr ""
|
||||
msgstr "이 길드에서 해당 사용자의 차단이 해제됐어요."
|
||||
|
||||
#: ../mod.py:619
|
||||
msgid "You've been unbanned from {}.\n"
|
||||
"Here is an invite for that guild: {}"
|
||||
msgstr ""
|
||||
msgstr "{} 에서의 차단이 해제됬어요.\n"
|
||||
"해당 길드 초대 링크 : {}"
|
||||
|
||||
#: ../mod.py:623
|
||||
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: {}"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자에게 초대를 보내지 못했어요. 혹시 저를 위해 보내 주실 수 있나요?\n"
|
||||
"여기 초대 링크예요 : {}"
|
||||
|
||||
#: ../mod.py:629
|
||||
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
|
||||
msgid "No voice state for that user!"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자에 대한 음성 상태가 없어요!"
|
||||
|
||||
#: ../mod.py:687
|
||||
msgid "That user is already muted and deafened guild-wide!"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자는 이미 음소거 상태이고 길드 전체가 음소거 돼서 아무것도 안 들려요!"
|
||||
|
||||
#: ../mod.py:690
|
||||
msgid "User has been banned from speaking or listening in voice channels"
|
||||
msgstr ""
|
||||
msgstr "사용자가 음성 채널에서 말하거나 듣는 것이 금지됐어요."
|
||||
|
||||
#: ../mod.py:722
|
||||
msgid "That user isn't muted or deafened by the guild!"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자는 길드에 의해 음소거 되지 않았어요."
|
||||
|
||||
#: ../mod.py:725
|
||||
msgid "User is now allowed to speak and listen in voice channels"
|
||||
msgstr ""
|
||||
msgstr "이제 사용자가 음성 채널에서 말하고 들을 수 있어요."
|
||||
|
||||
#: ../mod.py:754
|
||||
msgid "I cannot do that, I lack the '{}' permission."
|
||||
msgstr ""
|
||||
msgstr "제게 '{}' 권한이 없어서 그리 할 수 없어요."
|
||||
|
||||
#: ../mod.py:783
|
||||
msgid "Muted {}#{} in channel {}"
|
||||
msgstr ""
|
||||
msgstr "{}#{} 이(가) {} 채널에서 음소거 됐어요."
|
||||
|
||||
#: ../mod.py:797
|
||||
msgid "That user is already muted in {}!"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자가 {} 에서 이미 음소거된 상태예요!"
|
||||
|
||||
#: ../mod.py:800 ../mod.py:932
|
||||
msgid "That user is not in a voice channel right now!"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자는 지금 음성 채널에 있지 않아요!"
|
||||
|
||||
#: ../mod.py:802 ../mod.py:934
|
||||
msgid "No voice state for the target!"
|
||||
msgstr ""
|
||||
msgstr "대상에 대한 음성 상태가 없어요!"
|
||||
|
||||
#: ../mod.py:822
|
||||
msgid "User has been muted in this channel."
|
||||
msgstr ""
|
||||
msgstr "사용자가 이 채널에서 음소거 됐어요."
|
||||
|
||||
#: ../mod.py:858
|
||||
msgid "User has been muted in this guild."
|
||||
msgstr ""
|
||||
msgstr "이 길드에서 해당 사용자가 음소거 됐어요."
|
||||
|
||||
#: ../mod.py:919
|
||||
msgid "Unmuted {}#{} in channel {}"
|
||||
msgstr ""
|
||||
msgstr "{}#{} 이(가) {} 채널에서 음소거 해제됐어요."
|
||||
|
||||
#: ../mod.py:929
|
||||
msgid "That user is already unmuted in {}!"
|
||||
msgstr ""
|
||||
msgstr "해당 사용자가 {} 에서 이미 음소거가 해제되어 있어요!"
|
||||
|
||||
#: ../mod.py:949
|
||||
msgid "User unmuted in this channel."
|
||||
msgstr ""
|
||||
msgstr "사용자가 이 채널에서 음소거를 해제했어요."
|
||||
|
||||
#: ../mod.py:958
|
||||
msgid "Unmute failed. Reason: {}"
|
||||
msgstr ""
|
||||
msgstr "음소거 해제를 실패했어요. 이유 : {}"
|
||||
|
||||
#: ../mod.py:981
|
||||
msgid "User has been unmuted in this guild."
|
||||
msgstr ""
|
||||
msgstr "사용자가 이 길드에서 음소거 해제됐어요."
|
||||
|
||||
#: ../mod.py:1045
|
||||
msgid "Channel added to ignore list."
|
||||
msgstr ""
|
||||
msgstr "채널이 무시 목록에 추가됐어요."
|
||||
|
||||
#: ../mod.py:1047
|
||||
msgid "Channel already in ignore list."
|
||||
msgstr ""
|
||||
msgstr "채널이 이미 무시 목록에 포함되어 있어요."
|
||||
|
||||
#: ../mod.py:1055
|
||||
msgid "This guild has been added to the ignore list."
|
||||
msgstr ""
|
||||
msgstr "이 길드는 무시 목록에 추가됐어요."
|
||||
|
||||
#: ../mod.py:1057
|
||||
msgid "This guild is already being ignored."
|
||||
msgstr ""
|
||||
msgstr "이 길드는 이미 무시되고 있어요."
|
||||
|
||||
#: ../mod.py:1078
|
||||
msgid "Channel removed from ignore list."
|
||||
msgstr ""
|
||||
msgstr "채널이 무시 목록에서 제거됐어요."
|
||||
|
||||
#: ../mod.py:1080
|
||||
msgid "That channel is not in the ignore list."
|
||||
msgstr ""
|
||||
msgstr "해당 채널은 무시 목록에 없어요."
|
||||
|
||||
#: ../mod.py:1088
|
||||
msgid "This guild has been removed from the ignore list."
|
||||
msgstr ""
|
||||
msgstr "이 길드는 무시 목록에서 제거됐어요."
|
||||
|
||||
#: ../mod.py:1090
|
||||
msgid "This guild is not in the ignore list."
|
||||
msgstr ""
|
||||
msgstr "이 길드는 무시 목록에 포함되어 있지 않아요."
|
||||
|
||||
#: ../mod.py:1102
|
||||
msgid "Currently ignoring:\n"
|
||||
"{} channels\n"
|
||||
"{} guilds\n"
|
||||
msgstr ""
|
||||
msgstr "현재 무시 중 :\n"
|
||||
"{}개의 채널\n"
|
||||
"{} 길드"
|
||||
|
||||
#: ../mod.py:1133
|
||||
msgid "**Past 20 names**:"
|
||||
msgstr ""
|
||||
msgstr "**20개의 이름 초과** :"
|
||||
|
||||
#: ../mod.py:1140
|
||||
msgid "**Past 20 nicknames**:"
|
||||
msgstr ""
|
||||
msgstr "**20개의 닉네임을 초과** :"
|
||||
|
||||
#: ../mod.py:1146
|
||||
msgid "That user doesn't have any recorded name or nickname change."
|
||||
msgstr ""
|
||||
msgstr "해당 사용자에게 기록된 이름이나 닉네임이 없어요."
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Dutch\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Russian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -328,8 +328,8 @@ class Mod:
|
||||
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "kick", user, author,
|
||||
reason, until=None, channel=None
|
||||
self.bot, guild, ctx.message.created_at, "kick",
|
||||
user, author, reason, until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -389,8 +389,8 @@ class Mod:
|
||||
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "ban", user, author,
|
||||
reason, until=None, channel=None
|
||||
self.bot, guild, ctx.message.created_at, "ban",
|
||||
user, author, reason, until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -442,8 +442,8 @@ class Mod:
|
||||
user_info = await self.bot.get_user_info(user_id)
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "hackban", user_info, author,
|
||||
reason, until=None, channel=None
|
||||
self.bot, guild, ctx.message.created_at, "hackban",
|
||||
user_info, author, reason, until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -490,7 +490,7 @@ class Mod:
|
||||
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "tempban",
|
||||
self.bot, guild, ctx.message.created_at, "tempban",
|
||||
user, author, reason, unban_time
|
||||
)
|
||||
except RuntimeError as e:
|
||||
@@ -560,6 +560,7 @@ class Mod:
|
||||
user.name, user.id))
|
||||
try:
|
||||
await modlog.create_case(
|
||||
self.bot,
|
||||
guild,
|
||||
ctx.message.created_at,
|
||||
"softban",
|
||||
@@ -609,8 +610,8 @@ class Mod:
|
||||
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "unban", user, author,
|
||||
reason, until=None, channel=None
|
||||
self.bot, guild, ctx.message.created_at, "unban",
|
||||
user, author, reason, until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -697,8 +698,8 @@ class Mod:
|
||||
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "voiceban", user, author,
|
||||
reason, until=None, channel=None
|
||||
self.bot, guild, ctx.message.created_at, "voiceban",
|
||||
user, author, reason, until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -732,8 +733,8 @@ class Mod:
|
||||
author = ctx.author
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "voiceunban", user, author,
|
||||
reason, until=None, channel=None
|
||||
self.bot, guild, ctx.message.created_at, "voiceunban",
|
||||
user, author, reason, until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -791,8 +792,8 @@ class Mod:
|
||||
)
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "boicemute", user, author,
|
||||
reason, until=None, channel=channel
|
||||
self.bot, guild, ctx.message.created_at, "boicemute",
|
||||
user, author, reason, until=None, channel=channel
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -826,8 +827,8 @@ class Mod:
|
||||
await channel.send(_("User has been muted in this channel."))
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "cmute", user, author,
|
||||
reason, until=None, channel=channel
|
||||
self.bot, guild, ctx.message.created_at, "cmute",
|
||||
user, author, reason, until=None, channel=channel
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -862,8 +863,8 @@ class Mod:
|
||||
await ctx.send(_("User has been muted in this guild."))
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "smute", user, author,
|
||||
reason, until=None, channel=None
|
||||
self.bot, guild, ctx.message.created_at, "smute",
|
||||
user, author, reason, until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -924,8 +925,8 @@ class Mod:
|
||||
user.name, user.discriminator, channel.name))
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "voiceunmute", user, author,
|
||||
reason, until=None, channel=channel
|
||||
self.bot, guild, ctx.message.created_at, "voiceunmute",
|
||||
user, author, reason, until=None, channel=channel
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -953,8 +954,8 @@ class Mod:
|
||||
await ctx.send(_("User unmuted in this channel."))
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "cunmute", user, author,
|
||||
reason, until=None, channel=channel
|
||||
self.bot, guild, ctx.message.created_at, "cunmute",
|
||||
user, author, reason, until=None, channel=channel
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -985,8 +986,8 @@ class Mod:
|
||||
await ctx.send(_("User has been unmuted in this guild."))
|
||||
try:
|
||||
await modlog.create_case(
|
||||
guild, ctx.message.created_at, "sunmute", user, author,
|
||||
reason, until=None, channel=channel
|
||||
self.bot, guild, ctx.message.created_at, "sunmute",
|
||||
user, author, reason, until=None, channel=channel
|
||||
)
|
||||
except RuntimeError as e:
|
||||
await ctx.send(e)
|
||||
@@ -1209,8 +1210,8 @@ class Mod:
|
||||
else:
|
||||
try:
|
||||
case = await modlog.create_case(
|
||||
guild, message.created_at, "ban", author, guild.me,
|
||||
"Mention spam (Autoban)", until=None, channel=None
|
||||
self.bot, guild, message.created_at, "ban", author,
|
||||
guild.me, "Mention spam (Autoban)", until=None, channel=None
|
||||
)
|
||||
except RuntimeError as e:
|
||||
print(e)
|
||||
@@ -1269,7 +1270,7 @@ class Mod:
|
||||
if date is None:
|
||||
date = datetime.now()
|
||||
try:
|
||||
await modlog.create_case(guild, date,
|
||||
await modlog.create_case(self.bot, guild, date,
|
||||
"ban", member, mod,
|
||||
reason if reason else None)
|
||||
except RuntimeError as e:
|
||||
@@ -1288,7 +1289,7 @@ class Mod:
|
||||
if date is None:
|
||||
date = datetime.now()
|
||||
try:
|
||||
await modlog.create_case(guild, date, "unban",
|
||||
await modlog.create_case(self.bot, guild, date, "unban",
|
||||
user, mod, reason)
|
||||
except RuntimeError as e:
|
||||
print(e)
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Pirate English\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: red-discordbot\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"
|
||||
"Language-Team: Indonesian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -18,45 +18,45 @@ msgstr ""
|
||||
|
||||
#: ../modlog.py:36
|
||||
msgid "Mod events will be sent to {}"
|
||||
msgstr ""
|
||||
msgstr "Peristiwa mod akan dikirim ke {}"
|
||||
|
||||
#: ../modlog.py:42
|
||||
msgid "I do not have permissions to send messages in {}!"
|
||||
msgstr ""
|
||||
msgstr "Saya tidak memiliki izin untuk mengirim pesan di {}!"
|
||||
|
||||
#: ../modlog.py:52
|
||||
msgid "Mod log deactivated."
|
||||
msgstr ""
|
||||
msgstr "Mod log dinonaktifkan."
|
||||
|
||||
#: ../modlog.py:63
|
||||
msgid "Current settings:"
|
||||
msgstr ""
|
||||
msgstr "Pengaturan saat ini:"
|
||||
|
||||
#: ../modlog.py:75
|
||||
msgid "That action is not registered"
|
||||
msgstr ""
|
||||
msgstr "Tindakan tersebut tidak terdaftar"
|
||||
|
||||
#: ../modlog.py:82
|
||||
msgid "Case creation for {} actions is now {}."
|
||||
msgstr ""
|
||||
msgstr "Penciptaan kasus untuk {} tindakan sekarang {}."
|
||||
|
||||
#: ../modlog.py:94
|
||||
msgid "Cases have been reset."
|
||||
msgstr ""
|
||||
msgstr "Kasus telah di setel ulang."
|
||||
|
||||
#: ../modlog.py:103
|
||||
msgid "That case does not exist for that guild"
|
||||
msgstr ""
|
||||
msgstr "Kasus untuk guild tersebut tidak ada"
|
||||
|
||||
#: ../modlog.py:122
|
||||
msgid "That case does not exist!"
|
||||
msgstr ""
|
||||
msgstr "Kasus tersebut tidak ada!"
|
||||
|
||||
#: ../modlog.py:146
|
||||
msgid "You are not authorized to modify that case!"
|
||||
msgstr ""
|
||||
msgstr "Anda tidak diizinkan untuk mengubah kasus tersebut!"
|
||||
|
||||
#: ../modlog.py:155
|
||||
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
Reference in New Issue
Block a user